git-svn-id: svn://euphorik.ch/pompage@45 02bbb61a-6d21-0410-aba0-cb053bdfd66a
[pompage.git] / doc / webdeveloper / webdeveloper.js
diff --git a/doc/webdeveloper/webdeveloper.js b/doc/webdeveloper/webdeveloper.js
new file mode 100644 (file)
index 0000000..43b1b33
--- /dev/null
@@ -0,0 +1,2099 @@
+var webdeveloper_appliedStyles          = new Array();
+var webdeveloper_javaScriptCurrentTime  = null;
+var webdeveloper_javaScriptPreviousTime = null;
+var webdeveloper_outlineElement         = null;
+var webdeveloper_outlinedElements       = new Array();
+var webdeveloper_selectedTab            = -1;
+
+window.addEventListener("load", webdeveloper_initialize, false);
+window.addEventListener("unload", webdeveloper_uninitialize, false);
+
+// Displays the about dialog
+function webdeveloper_about()
+{
+    window.openDialog("chrome://webdeveloper/content/about/about.xul", "webdeveloper-about-dialog", "centerscreen,chrome,modal");
+}
+
+// Add applied style
+function webdeveloper_addAppliedStyle(id)
+{
+    // If the id is not in the applied styles
+    if(!webdeveloper_contains(webdeveloper_appliedStyles, id))
+    {
+        webdeveloper_appliedStyles.push(id);
+        webdeveloper_configureElement(document.getElementById("webdeveloper-statusbar-panel"), "hidden", false);
+    }
+}
+
+// Add applied style if the element exists
+function webdeveloper_addAppliedStyleByElement(id)
+{
+    var currentDocument = webdeveloper_getContentDocument();
+
+    // If the element exists
+    if(currentDocument.getElementById(id))
+    {
+        webdeveloper_addAppliedStyle(id);
+    }
+}
+
+// Outlines the element in the event
+function webdeveloper_addElementOutline(event, currentElement)
+{
+    var element = event.target;
+
+    // If the element is set and is not the same as the current outline element
+    if(element && element != currentElement)
+    {
+        webdeveloper_removeElementOutline(currentElement);
+
+        element.style.MozOutline = "1px solid #ff0000";
+
+        return element;
+    }
+
+    return null;
+}
+
+// Adds the generated styles to a page
+function webdeveloper_addGeneratedStyles(generatedDocument)
+{
+    var headElement  = webdeveloper_getDocumentHeadElement(generatedDocument);
+    var linkElement  = generatedDocument.createElement("link");
+    var styleElement = generatedDocument.createElement("style");
+
+    linkElement.setAttribute("href", "chrome://webdeveloper/content/stylesheets/generated/generated_content.css");
+    linkElement.setAttribute("id", "webdeveloper-generated-content-stylesheet");
+    linkElement.setAttribute("rel", "stylesheet");
+    linkElement.setAttribute("type", "text/css");
+    headElement.appendChild(linkElement);
+
+    styleElement.setAttribute("type", "text/css");
+    styleElement.appendChild(generatedDocument.createTextNode("body, td, th { font-size: " + webdeveloper_getIntegerPreference("webdeveloper.generated.content.font.size", true) + "px !important; }"));
+    headElement.appendChild(styleElement);
+}
+
+// Adds the generated tools to a page
+function webdeveloper_addGeneratedTools(generatedDocument)
+{
+    var linkElement     = generatedDocument.createElement("a");
+    var listElement     = generatedDocument.createElement("ul");
+    var listItemElement = generatedDocument.createElement("li");
+    var stringBundle    = document.getElementById("webdeveloper-string-bundle");
+
+    linkElement.setAttribute("href", "#");
+    linkElement.setAttribute("id", "webdeveloper-generated-tool-collapse-all");
+    linkElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_collapseAll")));
+    listItemElement.appendChild(linkElement);
+    listElement.appendChild(listItemElement);
+
+    linkElement     = generatedDocument.createElement("a");
+    listItemElement = generatedDocument.createElement("li");
+
+    linkElement.setAttribute("href", "#");
+    linkElement.setAttribute("id", "webdeveloper-generated-tool-expand-all");
+    linkElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_expandAll")));
+    listItemElement.appendChild(linkElement);
+    listElement.appendChild(listItemElement);
+
+    listElement.setAttribute("id", "tools");
+    webdeveloper_getDocumentBodyElement(generatedDocument).appendChild(listElement);
+}
+
+// Adds a status menu item
+function webdeveloper_addStatusMenuItem(statusMenu, menuId)
+{
+    var originalMenuItem = document.getElementById(menuId + "-menu");
+    var statusMenuItem   = document.createElement("menuitem");
+
+    statusMenuItem.setAttribute("checked", true);
+    statusMenuItem.setAttribute("class", "webdeveloper-generated-menu");
+    statusMenuItem.setAttribute("label", originalMenuItem.getAttribute("label"));
+    statusMenuItem.setAttribute("oncommand", originalMenuItem.getAttribute("oncommand"));
+    statusMenuItem.setAttribute("type", "checkbox");
+
+    statusMenu.insertBefore(statusMenuItem, document.getElementById("webdeveloper-separator-statusbar"));
+}
+
+// Adds the style sheet at the given location with the given id
+function webdeveloper_addStyleSheet(location, id)
+{
+    var documentList   = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength = documentList.length;
+    var linkElement    = null;
+    var pageDocument   = null;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        pageDocument = documentList[i];
+        linkElement  = pageDocument.createElement("link");
+
+        linkElement.setAttribute("href", location);
+        linkElement.setAttribute("id", id);
+        linkElement.setAttribute("rel", "stylesheet");
+        linkElement.setAttribute("type", "text/css");
+
+        webdeveloper_getDocumentHeadElement(pageDocument).appendChild(linkElement);
+    }
+
+    webdeveloper_addAppliedStyle(id);
+}
+
+// Adjusts the position of the given element
+function webdeveloper_adjustElementPosition(element, xPosition, yPosition, offset)
+{
+    // If the element is set
+    if(element)
+    {
+        var clientHeight  = element.clientHeight;
+        var clientWidth   = element.clientWidth;
+        var contentWindow = webdeveloper_getContentWindow();
+        var innerHeight   = contentWindow.innerHeight;
+        var innerWidth    = contentWindow.innerWidth;
+        var offsetX       = contentWindow.pageXOffset;
+        var offsetY       = contentWindow.pageYOffset;
+
+        // If the x position is less than 0
+        if(xPosition < 0)
+        {
+            xPosition = 0;
+        }
+
+        // If the y position is less than 0
+        if(yPosition < 0)
+        {
+            yPosition = 0;
+        }
+
+        // If the element will fit at the x position
+        if((xPosition + clientWidth + offset + 5) < (innerWidth + offsetX))
+        {
+            element.style.left = xPosition + offset + "px";
+        }
+        else
+        {
+            element.style.left = (innerWidth + offsetX - clientWidth - offset) + "px";
+        }
+
+        // If the element will fit at the y position
+        if((yPosition + clientHeight + offset + 5) < (innerHeight + offsetY))
+        {
+            element.style.top = yPosition + offset + "px";
+        }
+        else
+        {
+            element.style.top = (innerHeight + offsetY - clientHeight - offset) + "px";
+        }
+    }
+}
+
+// Applies all selected style sheets
+function webdeveloper_applyStyleSheets(reset)
+{
+    var appliedStyle        = null;
+    var appliedStyles       = webdeveloper_appliedStyles.slice(0);
+    var appliedStylesLength = appliedStyles.length;
+    var element             = null;
+
+    // Loop through the duplicated applied styles
+    for(var i = 0; i < appliedStylesLength; i++)
+    {
+        appliedStyle = appliedStyles[i];
+
+        // Switch on the style
+        switch(appliedStyle)
+        {
+            case "webdeveloper-add-user-style-sheet":
+                element = document.getElementById("webdeveloper-add-user-style-sheet-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_addUserStyleSheet(element);
+                break;
+            case "webdeveloper-disable-all-styles":
+                element = document.getElementById("webdeveloper-disable-all-styles-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_toggleStyles(element);
+                break;
+            case "webdeveloper-disable-browser-default-styles":
+                element = document.getElementById("webdeveloper-disable-browser-default-styles-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_toggleBrowserDefaultStyles(element);
+                break;
+            case "webdeveloper-disable-embedded-styles":
+                element = document.getElementById("webdeveloper-disable-embedded-styles-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_toggleEmbeddedStyles(element);
+                break;
+            case "webdeveloper-disable-inline-styles":
+                element = document.getElementById("webdeveloper-disable-inline-styles-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_toggleInlineStyles(element);
+                break;
+            case "webdeveloper-disable-linked-styles":
+                element = document.getElementById("webdeveloper-disable-linked-styles-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_toggleLinkedStyles(element);
+                break;
+            case "webdeveloper-disable-print-styles":
+                element = document.getElementById("webdeveloper-disable-print-styles-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_togglePrintStyles(element);
+                break;
+            case "webdeveloper-display-abbreviations":
+                element = document.getElementById("webdeveloper-display-abbreviations-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayAbbreviations(element);
+                break;
+            case "webdeveloper-display-access-keys":
+                element = document.getElementById("webdeveloper-display-access-keys-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayAccessKeys(element);
+                break;
+            case "webdeveloper-display-alt-attributes":
+                element = document.getElementById("webdeveloper-display-alt-attributes-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayAltAttributes(element);
+                break;
+            case "webdeveloper-display-anchors":
+                element = document.getElementById("webdeveloper-display-anchors-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayAnchors(element);
+                break;
+            case "webdeveloper-display-block-size":
+                element = document.getElementById("webdeveloper-display-block-size-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayBlockSize(element);
+                break;
+            case "webdeveloper-display-div-order":
+                element = document.getElementById("webdeveloper-display-div-order-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayDivOrder(element);
+                break;
+            case "webdeveloper-display-element-information":
+                element = document.getElementById("webdeveloper-display-element-information-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayElementInformation(element);
+                break;
+            case "webdeveloper-display-current-size-title":
+                element = document.getElementById("webdeveloper-display-current-size-title-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayWindowSizeInTitle(element);
+                break;
+            case "webdeveloper-display-form-details":
+                element = document.getElementById("webdeveloper-display-form-details-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayFormDetails(element);
+                break;
+            case "webdeveloper-display-handheld-css":
+                element = document.getElementById("webdeveloper-display-handheld-css-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayHandheldCSS(element);
+                break;
+            case "webdeveloper-display-id-class-details":
+                element = document.getElementById("webdeveloper-display-id-class-details-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayIdClassDetails(element);
+                break;
+            case "webdeveloper-display-image-dimensions":
+                element = document.getElementById("webdeveloper-display-image-dimensions-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayImageDimensions(element);
+                break;
+            case "webdeveloper-display-image-file-sizes":
+                element = document.getElementById("webdeveloper-display-image-file-sizes-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayImageFileSizes(element);
+                break;
+            case "webdeveloper-display-image-paths":
+                element = document.getElementById("webdeveloper-display-image-paths-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayImagePaths(element);
+                break;
+            case "webdeveloper-display-line-guides":
+                element = document.getElementById("webdeveloper-display-line-guides-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayLineGuides(element);
+                break;
+            case "webdeveloper-display-link-details":
+                element = document.getElementById("webdeveloper-display-link-details-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayLinkDetails(element);
+                break;
+            case "webdeveloper-display-object-information":
+                element = document.getElementById("webdeveloper-display-object-information-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayObjectInformation(element);
+                break;
+            case "webdeveloper-display-print-css":
+                element = document.getElementById("webdeveloper-display-print-css-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayPrintCSS(element);
+                break;
+            case "webdeveloper-display-ruler":
+                element = document.getElementById("webdeveloper-display-ruler-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayRuler(element);
+                break;
+            case "webdeveloper-display-stack-levels":
+                element = document.getElementById("webdeveloper-display-stack-levels-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayStackLevels(element);
+                break;
+            case "webdeveloper-display-tab-index":
+                element = document.getElementById("webdeveloper-display-tab-index-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayTabIndex(element);
+                break;
+            case "webdeveloper-display-table-depth":
+                element = document.getElementById("webdeveloper-display-table-depth-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayTableDepth(element);
+                break;
+            case "webdeveloper-display-table-information":
+                element = document.getElementById("webdeveloper-display-table-information-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayTableInformation(element);
+                break;
+            case "webdeveloper-display-title-attributes":
+                element = document.getElementById("webdeveloper-display-title-attributes-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayTitleAttributes(element);
+                break;
+            case "webdeveloper-display-topographic-information":
+                element = document.getElementById("webdeveloper-display-topographic-information-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayTopographicInformation(element);
+                break;
+            case "webdeveloper-display-window-size-title":
+                element = document.getElementById("webdeveloper-display-window-size-title-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_displayWindowSizeInTitle(element);
+                break;
+            case "webdeveloper-hide-background-images":
+                element = document.getElementById("webdeveloper-hide-background-images-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_hideBackgroundImages(element);
+                break;
+            case "webdeveloper-hide-images":
+                element = document.getElementById("webdeveloper-hide-images-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_hideImages(element, "webdeveloper-hide-images");
+                break;
+            case "webdeveloper-linearize-page":
+                element = document.getElementById("webdeveloper-linearize-page-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_linearizePage(element);
+                break;
+            case "webdeveloper-make-images-invisible":
+                element = document.getElementById("webdeveloper-make-images-invisible-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_makeImagesInvisible(element, "webdeveloper-make-images-invisible");
+                break;
+            case "webdeveloper-outline-absolute-positioned-elements":
+                element = document.getElementById("webdeveloper-outline-absolute-positioned-elements-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlinePositionedElements("absolute", element);
+                break;
+            case "webdeveloper-outline-all-images":
+                element = document.getElementById("webdeveloper-outline-all-images-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineAllImages(element);
+                break;
+            case "webdeveloper-outline-all-tables":
+                element = document.getElementById("webdeveloper-outline-all-tables-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineTables(element);
+                break;
+            case "webdeveloper-outline-background-images":
+                element = document.getElementById("webdeveloper-outline-background-images-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineBackgroundImages(element, true);
+                break;
+            case "webdeveloper-outline-block-level-elements":
+                element = document.getElementById("webdeveloper-outline-block-level-elements-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineBlockLevelElements(element);
+                break;
+            case "webdeveloper-outline-current-element":
+                element = document.getElementById("webdeveloper-outline-current-element-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineCurrentElement(element);
+                break;
+            case "webdeveloper-outline-custom-elements":
+                element = document.getElementById("webdeveloper-outline-custom-elements-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineElements(element);
+                break;
+            case "webdeveloper-outline-deprecated-elements":
+                element = document.getElementById("webdeveloper-outline-deprecated-elements-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineDeprecatedElements(element);
+                break;
+            case "webdeveloper-outline-external-links":
+                element = document.getElementById("webdeveloper-outline-external-links-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineExternalLinks(element);
+                break;
+            case "webdeveloper-outline-fixed-positioned-elements":
+                element = document.getElementById("webdeveloper-outline-fixed-positioned-elements-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlinePositionedElements("fixed", element);
+                break;
+            case "webdeveloper-outline-floated-elements":
+                element = document.getElementById("webdeveloper-outline-floated-elements-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineFloatedElements(element);
+                break;
+            case "webdeveloper-outline-frames":
+                element = document.getElementById("webdeveloper-outline-frames-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineFrames(element);
+                break;
+            case "webdeveloper-outline-headings":
+                element = document.getElementById("webdeveloper-outline-headings-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineHeadings(element);
+                break;
+            case "webdeveloper-outline-images-with-adjusted-dimensions":
+                element = document.getElementById("webdeveloper-outline-images-with-adjusted-dimensions-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineImagesWithAdjustedDimensions(element);
+                break;
+            case "webdeveloper-outline-images-with-empty-alt-attributes":
+                element = document.getElementById("webdeveloper-outline-images-with-empty-alt-attributes-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineImagesWithEmptyAltAttributes(element);
+                break;
+            case "webdeveloper-outline-images-with-oversized-dimensions":
+                element = document.getElementById("webdeveloper-outline-images-with-oversized-dimensions-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineImagesWithOversizedDimensions(element);
+                break;
+            case "webdeveloper-outline-images-without-alt-attributes":
+                element = document.getElementById("webdeveloper-outline-images-without-alt-attributes-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineImagesWithoutAltAttributes(element);
+                break;
+            case "webdeveloper-outline-images-without-dimensions":
+                element = document.getElementById("webdeveloper-outline-images-without-dimensions-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineImagesWithoutDimensions(element);
+                break;
+            case "webdeveloper-outline-images-without-title-attributes":
+                element = document.getElementById("webdeveloper-outline-images-without-title-attributes-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineImagesWithoutTitleAttributes(element);
+                break;
+            case "webdeveloper-outline-links-with-ping-attributes":
+                element = document.getElementById("webdeveloper-outline-links-with-ping-attributes-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineLinksWithPingAttributes(element);
+                break;
+            case "webdeveloper-outline-links-without-title-attributes":
+                element = document.getElementById("webdeveloper-outline-links-without-title-attributes-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineLinksWithoutTitleAttributes(element);
+                break;
+            case "webdeveloper-outline-relative-positioned-elements":
+                element = document.getElementById("webdeveloper-outline-relative-positioned-elements-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlinePositionedElements("relative", element);
+                break;
+            case "webdeveloper-outline-table-cells":
+                element = document.getElementById("webdeveloper-outline-table-cells-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_outlineTableCells(element);
+                break;
+            case "webdeveloper-replace-images-with-alt-attributes":
+                element = document.getElementById("webdeveloper-replace-images-with-alt-attributes-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_replaceImagesWithAltAttributes(element);
+                break;
+            case "webdeveloper-show-comments":
+                element = document.getElementById("webdeveloper-show-comments-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_toggleComments(element);
+                break;
+            case "webdeveloper-small-screen-rendering":
+                element = document.getElementById("webdeveloper-small-screen-rendering-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_smallScreenRendering(element);
+                break;
+            case "webdeveloper-use-border-box-model":
+                element = document.getElementById("webdeveloper-use-border-box-model-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_toggleBorderBoxModel(element);
+                break;
+            case "webdeveloper-view-style-information":
+                element = document.getElementById("webdeveloper-view-style-information-menu");
+                webdeveloper_configureElement(element, "checked", !reset);
+                webdeveloper_viewStyleInformation(element);
+                break;
+        }
+    }
+}
+
+// Changes the options
+function webdeveloper_changeOptions()
+{
+    var element                   = null;
+    var hideContextMenuPreference = webdeveloper_getBooleanPreference("webdeveloper.context.hide", true);
+    var hideMenuPreference        = webdeveloper_getBooleanPreference("webdeveloper.menu.hide", true);
+    var toolbar                   = document.getElementById("webdeveloper-toolbar");
+
+    // If the toolbar exists
+    if(toolbar)
+    {
+        var toolbarVisible = window.toolbar.visible;
+
+        // If the toolbar is visible
+        if(toolbarVisible)
+        {
+            var toolbarButtons       = toolbar.getElementsByTagName("toolbarbutton");
+            var toolbarButtonsLength = toolbarButtons.length;
+            var toolbarPreference    = webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true);
+
+            toolbar.setAttribute("mode", toolbarPreference);
+
+            // If the toolbar preference is set to icons
+            if(toolbarPreference == "icons")
+            {
+                toolbarPreference = "pictures";
+            }
+
+            toolbar.setAttribute("buttonstyle", toolbarPreference);
+
+            // Loop through the toolbar buttons
+            for(var i = 0; i < toolbarButtonsLength; i++)
+            {
+                toolbarButtons[i].setAttribute("buttonstyle", toolbarPreference);
+            }
+
+            // If the toolbar preference is not set to text
+            if(toolbarPreference != "text")
+            {
+                element = document.getElementById("webdeveloper-javascript-statusbar");
+
+                // If the element exists
+                if(element)
+                {
+                    element.removeAttribute("label");
+                }
+
+                element = document.getElementById("webdeveloper-render-mode-statusbar");
+
+                // If the element exists
+                if(element)
+                {
+                    element.removeAttribute("label");
+                }
+            }
+        }
+    }
+
+    element = document.getElementById("webdeveloper-menu");
+
+    // If the element exists
+    if(element)
+    {
+        element.setAttribute("hidden", hideMenuPreference);
+    }
+
+    element = document.getElementById("webdeveloper-context");
+
+    // If the element exists
+    if(element)
+    {
+        element.setAttribute("hidden", hideContextMenuPreference);
+    }
+
+    element = document.getElementById("webdeveloper-context-separator1");
+
+    // If the element exists
+    if(element)
+    {
+        element.setAttribute("hidden", hideContextMenuPreference);
+    }
+}
+
+// Clears the applied styles
+function webdeveloper_clearAppliedStyles()
+{
+    webdeveloper_appliedStyles = new Array();
+
+    webdeveloper_configureElement(document.getElementById("webdeveloper-statusbar-panel"), "hidden", true);
+}
+
+// Configures the element with the given attribute and value
+function webdeveloper_configureElement(element, attribute, value)
+{
+    // If the element exists
+    if(element)
+    {
+        // If the value is set
+        if(value)
+        {
+            element.setAttribute(attribute, value);
+        }
+        else
+        {
+            element.removeAttribute(attribute);
+        }
+    }
+}
+
+// Configures the element based on whether the applied style exists
+function webdeveloper_configureElementByAppliedStyle(element, attribute, id)
+{
+    webdeveloper_configureElement(element, attribute, webdeveloper_contains(webdeveloper_appliedStyles, id));
+}
+
+// Configure the keyboard shortcuts
+function webdeveloper_configureKeyboardShortcuts(reset)
+{
+    var bookmarklet         = null;
+    var id                  = null;
+    var key                 = null;
+    var keyElement          = null;
+    var keyPreference       = null;
+    var keyPreferenceValue  = null;
+    var keys                = null;
+    var keySet              = null;
+    var keysLength          = null;
+    var mainDocument        = null;
+    var path                = null;
+    var success             = false;
+    var toolCount           = webdeveloper_getIntegerPreference("webdeveloper.tool.count", true);
+    var url                 = null;
+    var viewSourceWithCount = webdeveloper_getIntegerPreference("webdeveloper.view.source.with.count", true);
+    var windowEnumeration   = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getEnumerator("navigator:browser");
+
+    // Loop through the open windows
+    while(windowEnumeration.hasMoreElements())
+    {
+        mainDocument = windowEnumeration.getNext().document;
+
+        // If a main document was found
+        if(mainDocument)
+        {
+            keySet = mainDocument.getElementById("mainKeyset");
+
+            // If the key set was not found
+            if(!keySet)
+            {
+                keySet = mainDocument.getElementById("navKeys");
+            }
+
+            // If the key set was found
+            if(keySet)
+            {
+                keys       = keySet.childNodes;
+                keysLength = keys.length;
+
+                // Loop through the keys
+                for(var i = 0; i < keysLength; i++)
+                {
+                    key = keys.item(i);
+
+                    // If the key has an id starting with webdeveloper
+                    if(key.hasAttribute("id") && key.getAttribute("id").indexOf("webdeveloper-") == 0)
+                    {
+                        id = key.getAttribute("id").split("-").join(".");
+
+                        // If the key preference is set
+                        if(webdeveloper_isPreferenceSet(id))
+                        {
+                            keyPreferenceValue = webdeveloper_getStringPreference(id, true);
+
+                            key.setAttribute("key", keyPreferenceValue);
+
+                            // If the key preference value is set
+                            if(keyPreferenceValue)
+                            {
+                                key.setAttribute("disabled", false);
+                            }
+                            else
+                            {
+                                key.setAttribute("disabled", true);
+                            }
+                        }
+                        else if(!reset)
+                        {
+                            webdeveloper_setStringPreference(id, key.getAttribute("key"));
+                        }
+
+                        success = true;
+                    }
+                }
+
+                // Loop through the possible tools
+                for(i = 1; i <= toolCount; i++)
+                {
+                    bookmarklet   = "webdeveloper.tool." + i + ".bookmarklet";
+                    keyPreference = "webdeveloper.tool." + i + ".key";
+                    keyElement    = mainDocument.getElementById(keyPreference);
+                    path          = "webdeveloper.tool." + i + ".path";
+                    url           = "webdeveloper.tool." + i + ".url";
+
+                    // If the bookmarklet, path or URL preference and key preference is set
+                    if((webdeveloper_isPreferenceSet(bookmarklet) || webdeveloper_isPreferenceSet(path) || webdeveloper_isPreferenceSet(url)) && webdeveloper_isPreferenceSet(keyPreference))
+                    {
+                        keyPreferenceValue = webdeveloper_getStringPreference(keyPreference, true);
+
+                        // If the key preference value is set
+                        if(keyPreferenceValue)
+                        {
+                            key = mainDocument.createElement("key");
+
+                            key.setAttribute("id", keyPreference);
+                            key.setAttribute("key", keyPreferenceValue);
+                            key.setAttribute("modifiers", "accel,shift");
+
+                            // If the bookmarklet preference is set
+                            if(webdeveloper_getStringPreference(bookmarklet, true))
+                            {
+                                key.setAttribute("oncommand", "webdeveloper_runBookmarklet('" + encodeURIComponent(webdeveloper_getStringPreference(bookmarklet, true)).replace(new RegExp("'", "gi"), "\\'") + "')");
+                            }
+                            else if(webdeveloper_getStringPreference(path, true))
+                            {
+                                key.setAttribute("oncommand", "webdeveloper_loadApplicationWithURL('" + webdeveloper_getStringPreference(path, true).replace(/\\/gi, "\\\\") + "', getBrowser().currentURI.spec)");
+                            }
+                            else
+                            {
+                                key.setAttribute("oncommand", "webdeveloper_loadURL('" + webdeveloper_getStringPreference(url, true) + "' + encodeURIComponent(getBrowser().currentURI.spec))");
+                            }
+
+                            keySet.appendChild(key);
+                        }
+                    }
+                    else
+                    {
+                        webdeveloper_removeElement(keyElement);
+                    }
+                }
+
+                // Loop through the possible view source with options
+                for(i = 1; i <= viewSourceWithCount; i++)
+                {
+                    keyPreference = "webdeveloper.view.source.with." + i + ".key";
+                    keyElement    = mainDocument.getElementById(keyPreference);
+                    path          = "webdeveloper.view.source.with." + i + ".path";
+
+                    // If the path and key preferences are set
+                    if(webdeveloper_isPreferenceSet(path) && webdeveloper_isPreferenceSet(keyPreference))
+                    {
+                        keyPreferenceValue = webdeveloper_getStringPreference(keyPreference, true);
+
+                        // If the key preference value is set
+                        if(keyPreferenceValue)
+                        {
+                            key = mainDocument.createElement("key");
+
+                            key.setAttribute("id", keyPreference);
+                            key.setAttribute("key", keyPreferenceValue);
+                            key.setAttribute("modifiers", "accel,shift");
+                            key.setAttribute("oncommand", "webdeveloper_loadApplicationWithSource('" + webdeveloper_getStringPreference(path, true).replace(/\\/gi, "\\\\") + "')");
+                            keySet.appendChild(key);
+                        }
+                    }
+                    else
+                    {
+                        webdeveloper_removeElement(keyElement);
+                    }
+                }
+            }
+        }
+    }
+
+    return success;
+}
+
+// Copies the elements ancestors to the clipboard
+function webdeveloper_copyElementAncestors(event)
+{
+    var informationElement = document.getElementById("webdeveloper-information");
+    var keyCode            = event.charCode;
+
+    // If the information element is set and the key code is set and is 99
+    if(informationElement && keyCode && keyCode == 99)
+    {
+        Components.classes["@mozilla.org/widget/clipboardhelper;1"].getService(Components.interfaces.nsIClipboardHelper).copyString(informationElement.value);
+
+        event.preventDefault();
+    }
+}
+
+// Disables the given preference
+function webdeveloper_disablePreference(element, preference)
+{
+    // If the element and preference are set
+    if(element && preference)
+    {
+        webdeveloper_setBooleanPreference(preference, !element.getAttribute("checked"));
+    }
+}
+
+// Displays the elements ancestors in the information bar
+function webdeveloper_displayElementAncestors(event)
+{
+    var eventTarget        = event.target;
+    var informationElement = document.getElementById("webdeveloper-information");
+
+    // If there is a target and the information element is set
+    if(eventTarget && informationElement)
+    {
+        var tagName = eventTarget.tagName;
+
+        // If the tag name is set and does not equal scrollbar
+        if(tagName && tagName != "scrollbar")
+        {
+            var ancestorList   = webdeveloper_getElementAncestors(eventTarget);
+            var ancestorLength = ancestorList.length;
+            var ancestorText   = "";
+
+            // Loop through the ancestors
+            for(var i = 0; i < ancestorLength; i++)
+            {
+                ancestorText += webdeveloper_getElementDescription(ancestorList[i]) + " > ";
+            }
+
+            informationElement.value = ancestorText + webdeveloper_getElementDescription(eventTarget);
+
+            webdeveloper_configureElement(document.getElementById("webdeveloper-information-text-toolbar"), "hidden", false);
+
+            event.preventDefault();
+        }
+    }
+}
+
+// Enables the given preference
+function webdeveloper_enablePreference(element, preference)
+{
+    // If the element and preference are set
+    if(element && preference)
+    {
+        var checked = element.getAttribute("checked");
+
+        // If the element is checked (explicit check required)
+        if(checked)
+        {
+            webdeveloper_setBooleanPreference(preference, true);
+        }
+        else
+        {
+            webdeveloper_setBooleanPreference(preference, false);
+        }
+    }
+}
+
+// Formats a file size
+function webdeveloper_formatFileSize(fileSize)
+{
+    // If the file size is set
+    if(fileSize)
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+
+        // If the file size is greater than a kilobyte
+        if(fileSize > 1024)
+        {
+            return Math.round(fileSize / 1024) + " " + stringBundle.getString("webdeveloper_kilobytes");
+        }
+        else
+        {
+            return fileSize + " " + stringBundle.getString("webdeveloper_bytes");
+        }
+    }
+    else
+    {
+        return "";
+    }
+}
+
+// Generates a document in a new tab or window
+function webdeveloper_generateDocument(url)
+{
+    var generatedPage = null;
+    var request       = new XMLHttpRequest();
+
+    // If the open tabs preference is set to true
+    if(webdeveloper_getBooleanPreference("webdeveloper.open.tabs", true))
+    {
+        getBrowser().selectedTab = getBrowser().addTab(url);
+
+        generatedPage = window;
+    }
+    else
+    {
+        generatedPage = window.open(url);
+    }
+
+    // This must be done to make generated content render
+    request.open("get", "about:blank", false);
+    request.send(null);
+
+    return generatedPage.content.document;
+}
+
+// Returns a description for an element
+function webdeveloper_getElementDescription(element)
+{
+    var description = null;
+
+    // If the element and tag name are set
+    if(element && element.tagName)
+    {
+        description = element.tagName.toLowerCase();
+
+        // If the element has an id attribute
+        if(element.hasAttribute("id"))
+        {
+            description += " #" + element.getAttribute("id");
+        }
+
+        // If the element has a class attribute
+        if(element.hasAttribute("class"))
+        {
+            description += " ." + element.getAttribute("class");
+        }
+    }
+
+    return description;
+}
+
+// Opens the help
+function webdeveloper_help()
+{
+    webdeveloper_loadURL("http://chrispederick.com/work/web-developer/documentation/");
+}
+
+// Initializes the extension
+function webdeveloper_initialize(event)
+{
+    var windowContent = window.document.getElementById("content");
+
+    // If the window content is set
+    if(windowContent)
+    {
+        var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService);
+        var dashboard      = document.getElementById("webdeveloper-dashboard");
+        var tabBox         = windowContent.mTabBox;
+
+        webdeveloper_upgrade();
+        webdeveloper_setupDefaultOptions();
+        webdeveloper_setupLocalizedOptions();
+        webdeveloper_configureKeyboardShortcuts(false);
+        webdeveloper_changeOptions();
+
+        windowContent.addEventListener("load", webdeveloper_pageLoad, true);
+        windowContent.addEventListener("unload", webdeveloper_pageUnload, true);
+
+        // If the dashboard is set
+        if(dashboard)
+        {
+            webdeveloper_setupDashboardPosition(webdeveloper_getStringPreference("webdeveloper.dashboard.position", true));
+        }
+
+        // If the console service is set
+        if(consoleService)
+        {
+            consoleService.registerListener(WebDeveloperErrorConsoleListener);
+        }
+
+        // If the tab box is set
+        if(tabBox)
+        {
+            tabBox.addEventListener("select", webdeveloper_tabSelect, false);
+        }
+
+        // Try to remove the event listener
+        try
+        {
+            window.removeEventListener("load", webdeveloper_initialize, false);
+        }
+        catch(exception)
+        {
+            // Do nothing
+        }
+    }
+}
+
+// Returns true if the DOM Inspector is available
+function webdeveloper_isDOMInspectorAvailable()
+{
+    try
+    {
+        Components.classes["@mozilla.org/inspector/dom-utils;1"].getService(Components.interfaces.inIDOMUtils);
+
+        return true;
+    }
+    catch(exception)
+    {
+        return false;
+    }
+}
+
+// Returns true if the information text toolbar is in use
+function webdeveloper_isInformationTextToolbarInUse()
+{
+    // If one of the features that use the information text toolbar is enabled
+    if(webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-display-element-information") || webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-outline-current-element") || webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-view-style-information"))
+    {
+        return true;
+    }
+
+    return false;
+}
+
+// Loads the given URL
+function webdeveloper_loadURL(url)
+{
+    var oldTab = getBrowser().selectedTab;
+
+    webdeveloper_generateDocument(url);
+
+    // If the open tabs in background preference is set to true
+    if(webdeveloper_getBooleanPreference("webdeveloper.open.tabs.background", true))
+    {
+        getBrowser().selectedTab = oldTab;
+    }
+}
+
+// Logs a debug message to the error console
+function webdeveloper_logDebug(message)
+{
+    // If the debug preference is set
+    if(webdeveloper_getBooleanPreference("webdeveloper.debug", true))
+    {
+        Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService).logStringMessage("Web Developer: " + message);
+        webdeveloper_openErrorConsole(false);
+    }
+}
+
+// Opens the error console
+function webdeveloper_openErrorConsole(toggle)
+{
+    // If the open error console in dashboard preference is set to true
+    if(webdeveloper_getBooleanPreference("webdeveloper.error.console.dashboard", true))
+    {
+        var errorConsole = document.getElementById("webdeveloper-string-bundle").getString("webdeveloper_errorConsole");
+
+        // If the error console is already open in the dashboard
+        if(webdeveloper_isOpenInDashboard(errorConsole))
+        {
+            // If toggling the console
+            if(toggle)
+            {
+                webdeveloper_closeInDashboard(errorConsole);
+            }
+            else
+            {
+                webdeveloper_selectInDashboard(errorConsole);
+            }
+        }
+        else
+        {
+            webdeveloper_openInDashboard(errorConsole, "chrome://global/content/console.xul");
+        }
+    }
+    else
+    {
+        webdeveloper_javaScriptPreviousTime = webdeveloper_javaScriptCurrentTime;
+        webdeveloper_javaScriptCurrentTime  = new Date().getTime();
+
+        // If the previous time is not set or the current time is greater than a second different from the previous time
+        if(!webdeveloper_javaScriptPreviousTime || webdeveloper_javaScriptCurrentTime - webdeveloper_javaScriptPreviousTime > 1500)
+        {
+            toJavaScriptConsole();
+        }
+    }
+}
+
+// Opens a toolbar button automatically if another toolbar button is open on the toolbar
+function webdeveloper_openToolbarButton(currentToolbarButton)
+{
+    // If the toolbar button is set and is not open
+    if(currentToolbarButton && !currentToolbarButton.open)
+    {
+        var toolbarButton        = null;
+        var toolbarButtons       = currentToolbarButton.parentNode.getElementsByTagName("toolbarbutton");
+        var toolbarButtonsLength = toolbarButtons.length;
+
+        // Loop through the toolbar buttons
+        for(var i = 0; i < toolbarButtonsLength; i++)
+        {
+            toolbarButton = toolbarButtons.item(i);
+
+            // If the toolbar button is set, is not the same toolbar button and is open
+            if(toolbarButton && toolbarButton != currentToolbarButton && toolbarButton.open)
+            {
+                toolbarButton.open        = false;
+                currentToolbarButton.open = true;
+
+                break;
+            }
+        }
+    }
+}
+
+// Displays the options dialog
+function webdeveloper_options(openPage)
+{
+    // If an open page is set
+    if(openPage)
+    {
+        window.openDialog("chrome://webdeveloper/content/options/options.xul", "webdeveloper-options-dialog", "centerscreen,chrome,modal,resizable", openPage);
+    }
+    else
+    {
+        window.openDialog("chrome://webdeveloper/content/options/options.xul", "webdeveloper-options-dialog", "centerscreen,chrome,modal,resizable");
+    }
+
+    webdeveloper_changeOptions();
+}
+
+// Handles the page being loaded
+function webdeveloper_pageLoad(event)
+{
+    var eventTarget = event.target;
+
+    // If the browser is the target
+    if(eventTarget && eventTarget == getBrowser())
+    {
+        var contentDocument = eventTarget.contentDocument;
+
+        // If the content document is set
+        if(contentDocument)
+        {
+            // Try to get the original target
+            try
+            {
+                var loadedDocument = event.originalTarget;
+
+                // If the loaded document is set and has the same URI as the content document
+                if(loadedDocument && contentDocument.documentURI == loadedDocument.documentURI)
+                {
+                    // Reset the display line guides and display ruler features
+                    webdeveloper_configureElement(document.getElementById("webdeveloper-line-guides-toolbar"), "hidden", true);
+                    webdeveloper_configureElement(document.getElementById("webdeveloper-ruler-toolbar"), "hidden", true);
+                    webdeveloper_removeAppliedStyle("webdeveloper-display-line-guides");
+                    webdeveloper_removeAppliedStyle("webdeveloper-display-ruler");
+
+                    webdeveloper_updateMetaRedirects(eventTarget.selectedBrowser);
+                    webdeveloper_updateRenderMode(contentDocument);
+
+                    // If the persist features preference is set and is true
+                    if(webdeveloper_getBooleanPreference("webdeveloper.persist.features", true))
+                    {
+                        webdeveloper_applyStyleSheets(false);
+                    }
+                    else
+                    {
+                        // Reset the information text toolbar
+                        webdeveloper_configureElement(document.getElementById("webdeveloper-information-text-toolbar"), "hidden", true);
+
+                        webdeveloper_clearAppliedStyles();
+                    }
+                }
+            }
+            catch(exception)
+            {
+                // Do nothing
+            }
+        }
+    }
+}
+
+// Handles the page being unloaded
+function webdeveloper_pageUnload(event)
+{
+    var eventTarget = event.target;
+
+    // Try to get the original target
+    try
+    {
+        var originalTarget = event.originalTarget;
+
+        // If the page is the target and the URI matches
+        if(eventTarget && originalTarget && eventTarget.contentDocument && eventTarget == getBrowser() && eventTarget.contentDocument.documentURI == originalTarget.documentURI)
+        {
+            webdeveloper_updateCSSStatus();
+            webdeveloper_updateJavaScriptStatus();
+        }
+    }
+    catch(exception)
+    {
+        // Do nothing
+    }
+}
+
+// Remove applied style
+function webdeveloper_removeAppliedStyle(id)
+{
+    // If the id is in the applied styles
+    if(webdeveloper_contains(webdeveloper_appliedStyles, id))
+    {
+        var appliedStylesLength = webdeveloper_appliedStyles.length;
+
+        // Loop through the applied styles
+        for(var i = 0; i < appliedStylesLength; i++)
+        {
+            // If this style sheet is in the applied styles
+            if(webdeveloper_appliedStyles[i] == id)
+            {
+                webdeveloper_appliedStyles.splice(i, 1);
+                break;
+            }
+        }
+
+        // If the only applied style has been removed
+        if(webdeveloper_appliedStyles.length == 0)
+        {
+            webdeveloper_configureElement(document.getElementById("webdeveloper-statusbar-panel"), "hidden", true);
+        }
+    }
+}
+
+// Removes the outline from an element
+function webdeveloper_removeElementOutline(element)
+{
+    // If the element is set
+    if(element)
+    {
+        element.style.MozOutline = "";
+
+        // If the element has an empty style attribute
+        if(element.hasAttribute("style") && element.getAttribute("style") == "")
+        {
+            element.removeAttribute("style");
+        }
+    }
+}
+
+// Removes all the generated menu items from the menu
+function webdeveloper_removeGeneratedMenuItems(menu)
+{
+    var generatedMenuItems = new Array();
+    var menuItem           = null;
+    var menuItems          = menu.childNodes;
+    var menuItemsLength    = menuItems.length;
+
+    // Loop through the menu items
+    for(var i = 0; i < menuItemsLength; i++)
+    {
+        menuItem = menuItems.item(i);
+
+        // If this is a generated menu item
+        if(menuItem && menuItem.hasAttribute("class") && menuItem.getAttribute("class") == "webdeveloper-generated-menu")
+        {
+            generatedMenuItems.push(menuItem);
+        }
+    }
+
+    menuItemsLength = generatedMenuItems.length;
+
+    // Loop through the generated menu items
+    for(i = 0; i < menuItemsLength; i++)
+    {
+        menu.removeChild(generatedMenuItems[i]);
+    }
+}
+
+// Removes the style sheet with the given id
+function webdeveloper_removeStyleSheet(id)
+{
+    var documentList   = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength = documentList.length;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        webdeveloper_removeElement(documentList[i].getElementById(id));
+    }
+
+    webdeveloper_removeAppliedStyle(id);
+}
+
+// Resets the CSS status button
+function webdeveloper_resetCSSStatus()
+{
+    var cssButton = document.getElementById("webdeveloper-css-statusbar");
+
+    webdeveloper_javaScriptCurrentTime  = null;
+    webdeveloper_javaScriptPreviousTime = null;
+
+    // If the CSS button exists
+    if(cssButton)
+    {
+        // If the CSS button has a class attribute
+        if(cssButton.hasAttribute("class"))
+        {
+            cssButton.removeAttribute("class");
+        }
+
+        // If the CSS button has a tooltip text attribute
+        if(cssButton.hasAttribute("tooltiptext"))
+        {
+            cssButton.removeAttribute("tooltiptext");
+        }
+
+        // If the toolbar preference is set to text and the CSS button has a label attribute
+        if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text" && cssButton.hasAttribute("label"))
+        {
+            cssButton.removeAttribute("label");
+        }
+    }
+}
+
+// Resets the JavaScript status button
+function webdeveloper_resetJavaScriptStatus()
+{
+    var javaScriptButton = document.getElementById("webdeveloper-javascript-statusbar");
+
+    webdeveloper_javaScriptCurrentTime  = null;
+    webdeveloper_javaScriptPreviousTime = null;
+
+    // If the JavaScript button exists
+    if(javaScriptButton)
+    {
+        // If JavaScript is enabled
+        if(webdeveloper_getBooleanPreference("javascript.enabled", false))
+        {
+            // If the JavaScript button has a class attribute
+            if(javaScriptButton.hasAttribute("class"))
+            {
+                javaScriptButton.removeAttribute("class");
+            }
+
+            // If the JavaScript button has a tooltip text attribute
+            if(javaScriptButton.hasAttribute("tooltiptext"))
+            {
+                javaScriptButton.removeAttribute("tooltiptext");
+            }
+
+            // If the toolbar preference is set to text and the JavaScript button has a label attribute
+            if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text" && javaScriptButton.hasAttribute("label"))
+            {
+                javaScriptButton.removeAttribute("label");
+            }
+        }
+        else
+        {
+            var stringBundle = document.getElementById("webdeveloper-string-bundle");
+
+            // If the JavaScript button does not have a class attribute or it is not set to disabled
+            if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "disabled")
+            {
+                javaScriptButton.setAttribute("class", "disabled");
+                javaScriptButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptDisabledTooltip"));
+
+                // If the toolbar preference is set to text
+                if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
+                {
+                    javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptDisabledLabel"));
+                }
+            }
+        }
+    }
+}
+
+// Resets the page
+function webdeveloper_resetPage()
+{
+    webdeveloper_applyStyleSheets(true);
+    webdeveloper_clearAppliedStyles();
+
+    webdeveloper_outlinedElements = new Array();
+}
+
+// Runs the given bookmarklet
+function webdeveloper_runBookmarklet(bookmarklet)
+{
+    eval(decodeURIComponent(bookmarklet));
+}
+
+// Sets up the default options
+function webdeveloper_setupDefaultOptions()
+{
+    // Set default custom colors
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.1.color", "#ff0000");
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.2.color", "#33ff33");
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.3.color", "#3333ff");
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.4.color", "#ff0000");
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.custom.5.color", "#33ff33");
+
+    // Set default dashboard position
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.dashboard.position", "bottom");
+
+    // Set default edit CSS preferences
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.edit.color.background", "#ffffff");
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.edit.color.text", "#000000");
+    webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.edit.font.size", 12);
+    webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.edit.update.frequency", 2000);
+
+    // Set default feature tooltip colors
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.feature.tooltip.color.background", "#ffff99");
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.feature.tooltip.color.border", "#ffcc66");
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.feature.tooltip.color.text", "#000000");
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.feature.tooltip.opacity", "0.9");
+
+    // Set default generated content font size
+    webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.generated.content.font.size", 12);
+
+    // Set default information preference
+    webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.information.tidy", true);
+
+    // Set default line guides preference
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.line.guides.color", "#000000");
+
+    // Set default magnification preference
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.magnification.level", "2");
+
+    // Set default open tabs preference
+    webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.open.tabs", true);
+
+    // Set default populate form fields email
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.populate.form.fields.email", "example@example.com");
+
+    // Set default style information preference
+    webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.style.information.dashboard", true);
+
+    // Set default accessibility preferences
+    webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.validate.local.accessibility.section508", true);
+    webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.validate.local.accessibility.wai.priority1", true);
+
+    // Set default CSS profile preference
+    webdeveloper_setStringPreferenceIfNotSet("webdeveloper.validate.local.css.profile", "css21");
+}
+
+// Sets up the localized options
+function webdeveloper_setupLocalizedOptions()
+{
+    var stringBundle = document.getElementById("webdeveloper-string-bundle");
+
+    // If the string bundle is set
+    if(stringBundle)
+    {
+        // Set default resize count
+        webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.resize.count", 1);
+
+        // Set 800x600
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.resize.1.description", stringBundle.getString("webdeveloper_resize800x600"));
+        webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.resize.1.width", 800);
+        webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.resize.1.height", 600);
+
+        // Set default tool count
+        webdeveloper_setIntegerPreferenceIfNotSet("webdeveloper.tool.count", 8);
+
+        // Set CSS validator
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.1.description", stringBundle.getString("webdeveloper_validateCSS"));
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.1.url", "http://jigsaw.w3.org/css-validator/validator?profile=css21&warning=0&uri=");
+
+        // Set feed validator
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.2.description", stringBundle.getString("webdeveloper_validateFeed"));
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.2.url", "http://validator.w3.org/feed/check.cgi?url=");
+
+        // Set HTML validator
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.3.description", stringBundle.getString("webdeveloper_validateHTML"));
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.3.key", "H");
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.3.url", "http://validator.w3.org/check?verbose=1&uri=");
+
+        // Set links validator
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.4.description", stringBundle.getString("webdeveloper_validateLinks"));
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.4.url", "http://validator.w3.org/checklink?check=Check&hide_type=all&summary=on&uri=");
+
+        // Set section 508 validator
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.5.description", stringBundle.getString("webdeveloper_validateSection508"));
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.5.url", "http://www.cynthiasays.com/mynewtester/cynthia.exe?rptmode=-1&url1=");
+
+        // Set WAI validator
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.6.description", stringBundle.getString("webdeveloper_validateWAI"));
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.6.url", "http://www.cynthiasays.com/mynewtester/cynthia.exe?rptmode=2&url1=");
+
+        // Set separator
+        webdeveloper_setBooleanPreferenceIfNotSet("webdeveloper.tool.7.separator", true);
+
+        // Set speed report
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.8.description", stringBundle.getString("webdeveloper_viewSpeedReport"));
+        webdeveloper_setStringPreferenceIfNotSet("webdeveloper.tool.8.url", "http://www.websiteoptimization.com/cgi-bin/wso/wso.pl?url=");
+    }
+}
+
+// Sorts two images
+function webdeveloper_sortImages(imageOne, imageTwo)
+{
+    // If both images are set
+    if(imageOne && imageTwo)
+    {
+        var imageOneSrc = imageOne.src;
+        var imageTwoSrc = imageTwo.src;
+
+        // If the images are equal
+        if(imageOneSrc == imageTwoSrc)
+        {
+            return 0;
+        }
+        else if(imageOneSrc < imageTwoSrc)
+        {
+            return -1;
+        }
+    }
+
+    return 1;
+}
+
+// Handles a tab being selected
+function webdeveloper_tabSelect(event)
+{
+    var selectedTab = getBrowser().mTabBox.selectedIndex;
+
+    // If the selected tab is different
+    if(selectedTab != webdeveloper_selectedTab)
+    {
+        webdeveloper_selectedTab = selectedTab;
+
+        webdeveloper_resetCSSStatus();
+        webdeveloper_resetJavaScriptStatus();
+        webdeveloper_updateAppliedStyles();
+        webdeveloper_updateRenderMode(webdeveloper_getContentDocument());
+
+        // Reset the display line guides and display ruler toolbars
+        webdeveloper_configureElement(document.getElementById("webdeveloper-line-guides-toolbar"), "hidden", !webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-display-line-guides"));
+        webdeveloper_configureElement(document.getElementById("webdeveloper-ruler-toolbar"), "hidden", !webdeveloper_contains(webdeveloper_appliedStyles, "webdeveloper-display-ruler"));
+
+        // Reset the information text toolbar
+        webdeveloper_configureElement(document.getElementById("webdeveloper-information-text-toolbar"), "hidden", !webdeveloper_isInformationTextToolbarInUse());
+    }
+}
+
+// Tidies a list of images by removing duplicates and sorting
+function webdeveloper_tidyImages(imageList)
+{
+    var image              = null;
+    var imageListLength    = imageList.length;
+    var imageSrc           = null;
+    var newImageList       = new Array();
+    var newImageListLength = null;
+    var tidiedImageList    = new Array();
+
+    // Loop through the images
+    for(var i = 0; i < imageListLength; i++)
+    {
+        image    = imageList[i];
+        imageSrc = image.src;
+
+        // If the image src is set and does not end in '.xul'
+        if(imageSrc && !imageSrc.endsWith(".xul"))
+        {
+            newImageList.push(image);
+        }
+    }
+
+    newImageList.sort(webdeveloper_sortImages);
+
+    newImageListLength = newImageList.length;
+
+    // Loop through the images
+    for(i = 0; i < newImageListLength; i++)
+    {
+        image = newImageList[i];
+
+        // If this is not the last image and the image is the same as the next image
+        if(i + 1 < newImageListLength && image.src == newImageList[i + 1].src)
+        {
+            continue;
+        }
+
+        tidiedImageList.push(image);
+    }
+
+    return tidiedImageList;
+}
+
+// Toggles the applied style with the given id
+function webdeveloper_toggleAppliedStyle(element, id)
+{
+    webdeveloper_removeAppliedStyle(id);
+
+    // If the menu is checked
+    if(element && element.getAttribute("checked"))
+    {
+        webdeveloper_addAppliedStyle(id);
+    }
+}
+
+// Toggles the feature tooltip styles
+function webdeveloper_toggleFeatureTooltipStyles(element, styleSheetId, selectors)
+{
+    webdeveloper_removeStyleSheet(styleSheetId, false);
+
+    // If the menu is checked
+    if(element.getAttribute("checked"))
+    {
+        var colors         = " background-color: " + webdeveloper_getStringPreference("webdeveloper.feature.tooltip.color.background", true) + " !important; border-color: " + webdeveloper_getStringPreference("webdeveloper.feature.tooltip.color.border", true) + " !important; color: " + webdeveloper_getStringPreference("webdeveloper.feature.tooltip.color.text", true) + " !important; ";
+        var documentList   = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+        var documentLength = documentList.length;
+        var opacityValue   = webdeveloper_getStringPreference("webdeveloper.feature.tooltip.opacity", true);
+        var opacity        = " -moz-opacity: " + opacityValue + " !important;  opacity: " + opacityValue + " !important; ";
+        var pageDocument   = null;
+        var styleElement   = null;
+
+        // Loop through the documents
+        for(var i = 0; i < documentLength; i++)
+        {
+            pageDocument = documentList[i];
+            styleElement = pageDocument.createElement("style");
+
+            styleElement.appendChild(pageDocument.createTextNode(selectors + " {" + colors + opacity + "}"));
+            styleElement.setAttribute("id", styleSheetId);
+            styleElement.setAttribute("type", "text/css");
+
+            webdeveloper_getDocumentHeadElement(pageDocument).appendChild(styleElement);
+        }
+    }
+}
+
+// Toggles an individual style sheet
+function webdeveloper_toggleIndividualStyleSheet(selectedStyleSheetHref)
+{
+    var currentDocument  = webdeveloper_getContentDocument();
+    var styleSheet       = null;
+    var styleSheetHref   = null;
+    var styleSheetList   = currentDocument.styleSheets;
+    var styleSheetLength = styleSheetList.length;
+
+    // Loop through the style sheets
+    for(var i = 0; i < styleSheetLength; i++)
+    {
+        styleSheet     = styleSheetList[i];
+        styleSheetHref = styleSheet.href;
+
+        // If this is the selected style sheet
+        if(styleSheetHref == selectedStyleSheetHref)
+        {
+            styleSheet.disabled = !styleSheet.disabled;
+        }
+    }
+}
+
+// Toggles the style sheet with the given id
+function webdeveloper_toggleStyleSheet(element, location, id)
+{
+    webdeveloper_removeStyleSheet(id);
+
+    // If the menu is checked
+    if(element && element.getAttribute("checked"))
+    {
+        webdeveloper_addStyleSheet(location, id);
+    }
+}
+
+// Toggles the toolbar
+function webdeveloper_toggleToolbar()
+{
+    var toolbar = document.getElementById("webdeveloper-toolbar");
+
+    toolbar.collapsed = !toolbar.collapsed;
+
+    document.persist("webdeveloper-toolbar", "collapsed");
+}
+
+// Uninitializes the extension
+function webdeveloper_uninitialize(event)
+{
+    var windowContent = window.document.getElementById("content");
+
+    // If the window content is set
+    if(windowContent)
+    {
+        var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService().QueryInterface(Components.interfaces.nsIConsoleService);
+        var tabBox         = windowContent.mTabBox;
+
+        // Try to remove the event listener
+        try
+        {
+            windowContent.removeEventListener("load", webdeveloper_pageLoad, true);
+        }
+        catch(exception)
+        {
+            // Do nothing
+        }
+
+        // Try to remove the event listener
+        try
+        {
+            windowContent.removeEventListener("unload", webdeveloper_pageUnload, true);
+        }
+        catch(exception)
+        {
+            // Do nothing
+        }
+
+        // If the console service is set
+        if(consoleService)
+        {
+            // Try to remove the console listener
+            try
+            {
+                consoleService.unregisterListener(WebDeveloperErrorConsoleListener);
+            }
+            catch(exception)
+            {
+                // Do nothing
+            }
+        }
+
+        // If the tab box is set
+        if(tabBox)
+        {
+            // Try to remove the event listener
+            try
+            {
+                tabBox.removeEventListener("select", webdeveloper_tabSelect, false);
+            }
+            catch(exception)
+            {
+                // Do nothing
+            }
+        }
+
+        // Try to remove the event listener
+        try
+        {
+            window.removeEventListener("close", webdeveloper_uninitialize, false);
+        }
+        catch(exception)
+        {
+            // Do nothing
+        }
+    }
+}
+
+// Updates the applied styles
+function webdeveloper_updateAppliedStyles()
+{
+    webdeveloper_clearAppliedStyles();
+    webdeveloper_addAppliedStyleByElement("webdeveloper-add-user-style-sheet");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-disable-all-styles");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-disable-browser-default-styles");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-disable-all-styles");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-disable-embedded-styles");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-disable-inline-styles");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-disable-linked-styles");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-disable-print-styles");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-abbreviations");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-access-keys");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-alt-attributes");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-anchors");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-block-size");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-div-order");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-element-information");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-form-details");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-handheld-css");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-id-class-details");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-image-dimensions");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-image-file-sizes");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-image-paths");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-line-guides");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-link-details");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-object-information");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-print-css");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-ruler");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-stack-levels");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-tab-index");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-table-depth");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-table-information");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-title-attributes");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-topographic-information");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-display-window-size-title");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-hide-background-images");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-hide-images");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-linearize-page");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-make-images-invisible");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-absolute-positioned-elements");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-all-images");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-background-images");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-block-level-elements");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-current-element");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-custom-elements");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-deprecated-elements");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-external-links");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-fixed-positioned-elements");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-floated-elements");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-frames");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-headings");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-with-adjusted-dimensions");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-with-empty-alt-attributes");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-without-alt-attributes");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-without-dimensions");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-images-without-title-attributes");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-links-with-ping-attributes");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-links-without-title-attributes");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-relative-positioned-elements");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-table-captions");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-table-cells");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-outline-all-tables");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-replace-images-with-alt-attributes");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-show-comments");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-small-screen-rendering");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-use-border-box-model");
+    webdeveloper_addAppliedStyleByElement("webdeveloper-view-style-information");
+}
+
+// Updates the CSS status button
+function webdeveloper_updateCSSStatus(error)
+{
+    var cssButton = document.getElementById("webdeveloper-css-statusbar");
+
+    // If the CSS button is set
+    if(cssButton)
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+
+        // If the error is set
+        if(error)
+        {
+            var errorMessage = error.errorMessage;
+
+            cssButton.setAttribute("tooltiptext", stringBundle.getFormattedString("webdeveloper_cssErrorTooltip", [errorMessage]));
+
+            // If the CSS button does not have a class attribute or it is not set to error
+            if(!cssButton.hasAttribute("class") || cssButton.getAttribute("class") != "error")
+            {
+                cssButton.setAttribute("class", "error");
+
+                // If the toolbar preference is set to text
+                if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
+                {
+                    cssButton.setAttribute("label", stringBundle.getString("webdeveloper_cssErrorLabel"));
+                }
+            }
+
+            // If the open CSS console error preference is set
+            if(webdeveloper_getBooleanPreference("webdeveloper.open.css.console.error", true))
+            {
+                webdeveloper_openErrorConsole(false);
+            }
+        }
+        else if(!cssButton.hasAttribute("class") || cssButton.getAttribute("class") != "valid")
+        {
+            cssButton.setAttribute("class", "valid");
+            cssButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_cssNoErrorsTooltip"));
+
+            // If the toolbar preference is set to text
+            if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
+            {
+                cssButton.setAttribute("label", stringBundle.getString("webdeveloper_cssNoErrorsLabel"));
+            }
+        }
+    }
+}
+
+// Updates the JavaScript status button
+function webdeveloper_updateJavaScriptStatus(error)
+{
+    var javaScriptButton = document.getElementById("webdeveloper-javascript-statusbar");
+
+    // If the JavaScript button is set
+    if(javaScriptButton)
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+
+        // If the error is set
+        if(error)
+        {
+            var errorMessage = error.errorMessage;
+            var warning      = error.flags & error.warningFlag != 0;
+
+            // If this is a warning
+            if(warning)
+            {
+                javaScriptButton.setAttribute("tooltiptext", stringBundle.getFormattedString("webdeveloper_javaScriptWarningTooltip", [errorMessage]));
+
+                // If the JavaScript button does not have a class attribute or it is not set to warning
+                if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "warning")
+                {
+                    javaScriptButton.setAttribute("class", "warning");
+
+                    // If the toolbar preference is set to text
+                    if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
+                    {
+                        javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptWarningLabel"));
+                    }
+                }
+
+                // If the open JavaScript console warning preference is set
+                if(webdeveloper_getBooleanPreference("webdeveloper.open.javascript.console.warning", true))
+                {
+                    webdeveloper_openErrorConsole(false);
+                }
+            }
+            else
+            {
+                javaScriptButton.setAttribute("tooltiptext", stringBundle.getFormattedString("webdeveloper_javaScriptErrorTooltip", [errorMessage]));
+
+                // If the JavaScript button does not have a class attribute or it is not set to error
+                if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "error")
+                {
+                    javaScriptButton.setAttribute("class", "error");
+
+                    // If the toolbar preference is set to text
+                    if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
+                    {
+                        javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptErrorLabel"));
+                    }
+                }
+
+                // If the open JavaScript console error preference is set
+                if(webdeveloper_getBooleanPreference("webdeveloper.open.javascript.console.error", true))
+                {
+                    webdeveloper_openErrorConsole(false);
+                }
+            }
+        }
+        else if(!javaScriptButton.hasAttribute("class") || javaScriptButton.getAttribute("class") != "valid")
+        {
+            javaScriptButton.setAttribute("class", "valid");
+            javaScriptButton.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_javaScriptNoErrorsTooltip"));
+
+            // If the toolbar preference is set to text
+            if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
+            {
+                javaScriptButton.setAttribute("label", stringBundle.getString("webdeveloper_javaScriptNoErrorsLabel"));
+            }
+        }
+    }
+}
+
+// Updates the meta redirects status
+function webdeveloper_updateMetaRedirects(browser)
+{
+    browser.docShell.allowMetaRedirects = !webdeveloper_getBooleanPreference("webdeveloper.meta.redirects.disable", true);
+}
+
+// Updates the options menu
+function webdeveloper_updateOptionsMenu(suffix)
+{
+    var appliedStyles = true;
+
+    // If there are no applied styles
+    if(webdeveloper_appliedStyles.length == 0)
+    {
+        appliedStyles = false;
+    }
+
+    webdeveloper_configureElement(document.getElementById("webdeveloper-persist-features-" + suffix), "checked", webdeveloper_getBooleanPreference("webdeveloper.persist.features", true));
+    webdeveloper_configureElement(document.getElementById("webdeveloper-reset-page-" + suffix), "disabled", !appliedStyles);
+}
+
+// Updates the render mode status button
+function webdeveloper_updateRenderMode(currentDocument)
+{
+    var element = document.getElementById("webdeveloper-render-mode-statusbar");
+
+    // If the render mode button exists
+    if(element)
+    {
+        var renderMode   = currentDocument.compatMode;
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+        var textToolbar  = false;
+
+        // If the toolbar preference has a value and is set to text
+        if(webdeveloper_getStringPreference("webdeveloper.toolbar.icons", true) == "text")
+        {
+            textToolbar = true;
+        }
+
+        // If the render mode is quirks mode
+        if(renderMode == "BackCompat")
+        {
+            element.setAttribute("class", "quirks");
+            element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_quirksModeTooltip"));
+
+            // If the toolbar is in text mode
+            if(textToolbar)
+            {
+                element.setAttribute("label", stringBundle.getString("webdeveloper_quirksModeLabel"));
+            }
+        }
+        else
+        {
+            // If the render mode button has a class attribute
+            if(element.hasAttribute("class"))
+            {
+                element.removeAttribute("class");
+            }
+
+            element.setAttribute("tooltiptext", stringBundle.getString("webdeveloper_standardsComplianceModeTooltip"));
+
+            // If the toolbar is in text mode
+            if(textToolbar)
+            {
+                element.setAttribute("label", stringBundle.getString("webdeveloper_standardsComplianceModeLabel"));
+            }
+        }
+    }
+}
+
+// Updates the status menu
+function webdeveloper_updateStatusMenu(statusMenu)
+{
+    var appliedStylesLength = webdeveloper_appliedStyles.length;
+
+    webdeveloper_removeGeneratedMenuItems(statusMenu);
+
+    // Loop through the applied styles
+    for(var i = 0; i < appliedStylesLength; i++)
+    {
+        webdeveloper_addStatusMenuItem(statusMenu,webdeveloper_appliedStyles[i]);
+    }
+
+    // If the status menu has only two children
+    if(statusMenu.childNodes.length == 2)
+    {
+        return false;
+    }
+
+    return true;
+}
+
+// Error console listener
+var WebDeveloperErrorConsoleListener =
+{
+    // Observes changes in the console
+    observe: function(error)
+    {
+        // If the document and error are set
+        if(document && error)
+        {
+            // Try to convert the error to a script error
+            try
+            {
+                error = error.QueryInterface(Components.interfaces.nsIScriptError);
+
+                var errorCategory = error.category;
+                var sourceName    = error.sourceName;
+
+                // If the error category is set and is content javascript
+                if(errorCategory && errorCategory == "content javascript")
+                {
+                    webdeveloper_updateJavaScriptStatus(error);
+                }
+                else if(errorCategory && errorCategory == "CSS Parser")
+                {
+                    webdeveloper_updateCSSStatus(error);
+                }
+                else if(sourceName && sourceName.indexOf("chrome://webdeveloper/") != -1 && webdeveloper_getBooleanPreference("webdeveloper.debug", true))
+                {
+                    webdeveloper_openErrorConsole(false);
+                }
+            }
+            catch(exception)
+            {
+                // Do nothing
+            }
+        }
+
+        return false;
+    }
+}