git-svn-id: svn://euphorik.ch/pompage@45 02bbb61a-6d21-0410-aba0-cb053bdfd66a
[pompage.git] / doc / webdeveloper / forms.js
diff --git a/doc/webdeveloper/forms.js b/doc/webdeveloper/forms.js
new file mode 100644 (file)
index 0000000..1cc56c4
--- /dev/null
@@ -0,0 +1,1176 @@
+// Clears all radio buttons
+function webdeveloper_clearRadioButtons()
+{
+    var clearedRadioButtons = 0;
+    var documentList        = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength      = documentList.length;
+    var inputElement        = null;
+    var inputElementList    = null;
+    var inputElementsLength = null;
+    var pageDocument        = null;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        pageDocument        = documentList[i];
+        inputElementList    = pageDocument.getElementsByTagName("input");
+        inputElementsLength = inputElementList.length;
+
+        // Loop through all the input tags
+        for(var j = 0; j < inputElementsLength; j++)
+        {
+            inputElement = inputElementList[j];
+
+            // If the element is a radio button
+            if(inputElement.hasAttribute("type") && inputElement.getAttribute("type").toLowerCase() == "radio")
+            {
+                inputElement.checked = false;
+
+                clearedRadioButtons++;
+            }
+            else
+            {
+                // This stops the fields reordering
+                inputElement.setAttribute("type", inputElement.getAttribute("type"));
+            }
+        }
+    }
+
+    // If the hide informational dialogs preference is not set
+    if(!webdeveloper_getBooleanPreference("webdeveloper.informational.dialogs.hide", true))
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+        var title        = stringBundle.getString("webdeveloper_clearRadioButtons");
+
+        // If one radio button was cleared
+        if(clearedRadioButtons == 1)
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_clearRadioButtonsSingleResult"));
+        }
+        else
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_clearRadioButtonsMultipleResult", [clearedRadioButtons]));
+        }
+    }
+}
+
+// Converts form methods
+function webdeveloper_convertFormMethods(method)
+{
+    var convertedForms         = 0;
+    var displayFormDetailsMenu = document.getElementById("webdeveloper-display-form-details-menu");
+    var documentList           = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength         = documentList.length;
+    var form                   = null;
+    var formLength             = null;
+    var formList               = null;
+    var pageDocument           = null;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        pageDocument = documentList[i];
+        formList     = pageDocument.forms;
+        formLength   = formList.length;
+
+        // Loop through all the forms
+        for(var j = 0; j < formLength; j++)
+        {
+            form = formList[j];
+
+            // If this form is not already the right method
+            if((!form.hasAttribute("method") && method == "post") || (form.hasAttribute("method") && form.getAttribute("method").toLowerCase() != method))
+            {
+                form.setAttribute("method", method);
+                convertedForms++;
+            }
+        }
+    }
+
+    // Reapply the display form details style sheet if it is currently on - fixes bug with form method not updating
+    if(displayFormDetailsMenu.getAttribute("checked"))
+    {
+        webdeveloper_removeStyleSheet("webdeveloper-display-form-details", false);
+        webdeveloper_displayFormDetails(displayFormDetailsMenu, false);
+    }
+
+    // If the hide informational dialogs preference is not set
+    if(!webdeveloper_getBooleanPreference("webdeveloper.informational.dialogs.hide", true))
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+        var title        = stringBundle.getString("webdeveloper_convertFormMethods");
+
+        // If one form was converted
+        if(convertedForms == 1)
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_convertFormMethodsSingleResult", [method.toUpperCase()]));
+        }
+        else
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_convertFormMethodsMultipleResult", [convertedForms, method.toUpperCase()]));
+        }
+    }
+}
+
+// Converts select elements to text inputs
+function webdeveloper_convertSelectElementsToTextInputs()
+{
+    var convertedSelectElements = 0;
+    var displayFormDetailsMenu  = document.getElementById("webdeveloper-display-form-details-menu");
+    var documentList            = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength          = documentList.length;
+    var inputElement            = null;
+    var pageDocument            = null;
+    var parentNode              = null;
+    var selectElement           = null;
+    var selectElements          = null;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        pageDocument         = documentList[i];
+        selectElements       = pageDocument.getElementsByTagName("select");
+
+        // While there are select elements
+        while(selectElements.length > 0)
+        {
+            inputElement  = pageDocument.createElement("input");
+            selectElement = selectElements[0];
+            parentNode    = selectElement.parentNode;
+
+            inputElement.value = selectElement.value;
+
+            // If the select element has an id attribute
+            if(selectElement.hasAttribute("id"))
+            {
+                inputElement.setAttribute("id", selectElement.getAttribute("id"));
+            }
+
+            // If the select element has a name attribute
+            if(selectElement.hasAttribute("name"))
+            {
+                inputElement.setAttribute("name", selectElement.getAttribute("name"));
+            }
+
+            inputElement.setAttribute("type", "text");
+
+            parentNode.insertBefore(inputElement, selectElement);
+            webdeveloper_removeElement(selectElement);
+            convertedSelectElements++;
+        }
+    }
+
+    // Reapply the display form details style sheet if it is currently on - fixes bug with form method not updating
+    if(displayFormDetailsMenu.getAttribute("checked"))
+    {
+        webdeveloper_removeStyleSheet("webdeveloper-display-form-details", false);
+        webdeveloper_displayFormDetails(displayFormDetailsMenu, false);
+    }
+
+    // If the hide informational dialogs preference is not set
+    if(!webdeveloper_getBooleanPreference("webdeveloper.informational.dialogs.hide", true))
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+        var title        = stringBundle.getString("webdeveloper_convertSelectElementsToTextInputs");
+
+        // If one select element was converted
+        if(convertedSelectElements == 1)
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getString("webdeveloper_convertSelectElementsToTextInputsSingleResult"));
+        }
+        else
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_convertSelectElementsToTextInputsMultipleResult", [convertedSelectElements]));
+        }
+    }
+}
+
+// Displays/hides the form details for the page
+function webdeveloper_displayFormDetails(element)
+{
+    var buttonElement          = null;
+    var buttonElementList      = null;
+    var buttonElementsLength   = null;
+    var display                = element.getAttribute("checked");
+    var documentList           = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength         = documentList.length;
+    var inputElement           = null;
+    var inputElementList       = null;
+    var inputElementsLength    = null;
+    var pageDocument           = null;
+    var selectElement          = null;
+    var selectElementList      = null;
+    var selectElementsLength   = null;
+    var spanElement            = null;
+    var text                   = null;
+    var textAreaElement        = null;
+    var textAreaElementList    = null;
+    var textAreaElementsLength = null;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        pageDocument        = documentList[i];
+        inputElementList    = pageDocument.getElementsByTagName("input");
+        inputElementsLength = inputElementList.length;
+
+        // Need to do this to stop the feature running twice
+        webdeveloper_removeAllElementsByXPath(pageDocument, "//span[@class='webdeveloper-display-form-details']");
+
+        // Loop through all the input tags
+        for(var j = 0; j < inputElementsLength; j++)
+        {
+            inputElement = inputElementList[j];
+
+            // If the input element is unhidden - need to do this to stop it running twice
+            if(inputElement.className.indexOf("webdeveloper-unhidden") != -1)
+            {
+                inputElement.className = webdeveloper_removeSubstring(inputElement.className, "webdeveloper-unhidden");
+
+                inputElement.setAttribute("type", "hidden");
+            }
+
+            // If displaying
+            if(display)
+            {
+                spanElement = pageDocument.createElement("span");
+                text        = "<input";
+
+                // If the element is hidden
+                if(inputElement.hasAttribute("type") && inputElement.getAttribute("type").toLowerCase() == "hidden")
+                {
+                    inputElement.className += " webdeveloper-unhidden";
+
+                    inputElement.setAttribute("type", "text");
+                }
+
+                // This stops the fields reordering
+                inputElement.setAttribute("type", inputElement.getAttribute("type"));
+
+                // If the element has an id attribute
+                if(inputElement.hasAttribute("id"))
+                {
+                    text += ' id="' + inputElement.getAttribute("id") + '"';
+                }
+
+                // If the element has an name attribute
+                if(inputElement.hasAttribute("name"))
+                {
+                    text += ' name="' + inputElement.getAttribute("name") + '"';
+                }
+
+                // If the element is a checkbox or radio button
+                if(inputElement.hasAttribute("type") && (inputElement.getAttribute("type").toLowerCase() == "checkbox" || inputElement.getAttribute("type").toLowerCase() == "radio"))
+                {
+                    text += ' value="' + inputElement.value + '"';
+                }
+
+                // If the element has a size attribute
+                if(inputElement.hasAttribute("size"))
+                {
+                    text += ' size="' + inputElement.getAttribute("size") + '"';
+                }
+
+                // If the element has a maxlength attribute
+                if(inputElement.hasAttribute("maxlength"))
+                {
+                    text += ' maxlength="' + inputElement.getAttribute("maxlength") + '"';
+                }
+
+                text += ">";
+
+                spanElement.setAttribute("class", "webdeveloper-display-form-details");
+                spanElement.setAttribute("title", text);
+                spanElement.appendChild(pageDocument.createTextNode(text));
+                inputElement.parentNode.insertBefore(spanElement, inputElement);
+            }
+        }
+
+        // If displaying
+        if(display)
+        {
+            buttonElementList      = pageDocument.getElementsByTagName("button");
+            buttonElementsLength   = buttonElementList.length;
+            selectElementList      = pageDocument.getElementsByTagName("select");
+            selectElementsLength   = selectElementList.length;
+            textAreaElementList    = pageDocument.getElementsByTagName("textarea");
+            textAreaElementsLength = textAreaElementList.length;
+
+            // Loop through all the button tags
+            for(j = 0; j < buttonElementsLength; j++)
+            {
+                buttonElement = buttonElementList[j];
+                spanElement   = pageDocument.createElement("span");
+                text          = "<button";
+
+                // If the element has an id attribute
+                if(buttonElement.hasAttribute("id"))
+                {
+                    text += ' id="' + buttonElement.getAttribute("id") + '"';
+                }
+
+                // If the element has an name attribute
+                if(buttonElement.hasAttribute("name"))
+                {
+                    text += ' name="' + buttonElement.getAttribute("name") + '"';
+                }
+
+                text += ">";
+
+                spanElement.setAttribute("class", "webdeveloper-display-form-details");
+                spanElement.setAttribute("title", text);
+                spanElement.appendChild(pageDocument.createTextNode(text));
+                buttonElement.parentNode.insertBefore(spanElement, buttonElement);
+            }
+
+            // Loop through all the select tags
+            for(j = 0; j < selectElementsLength; j++)
+            {
+                selectElement = selectElementList[j];
+                spanElement   = pageDocument.createElement("span");
+                text          = "<select";
+
+                // If the element has an id attribute
+                if(selectElement.hasAttribute("id"))
+                {
+                    text += ' id="' + selectElement.getAttribute("id") + '"';
+                }
+
+                // If the element has an name attribute
+                if(selectElement.hasAttribute("name"))
+                {
+                    text += ' name="' + selectElement.getAttribute("name") + '"';
+                }
+
+                text += ">";
+
+                spanElement.setAttribute("class", "webdeveloper-display-form-details");
+                spanElement.setAttribute("title", text);
+                spanElement.appendChild(pageDocument.createTextNode(text));
+                selectElement.parentNode.insertBefore(spanElement, selectElement);
+            }
+
+            // Loop through all the textarea tags
+            for(j = 0; j < textAreaElementsLength; j++)
+            {
+                textAreaElement = textAreaElementList[j];
+                spanElement     = pageDocument.createElement("span");
+                text            = "<textarea";
+
+                // If the element has an id attribute
+                if(textAreaElement.hasAttribute("id"))
+                {
+                    text += ' id="' + textAreaElement.getAttribute("id") + '"';
+                }
+
+                // If the element has an name attribute
+                if(textAreaElement.hasAttribute("name"))
+                {
+                    text += ' name="' + textAreaElement.getAttribute("name") + '"';
+                }
+
+                text += ">";
+
+                spanElement.setAttribute("class", "webdeveloper-display-form-details");
+                spanElement.setAttribute("title", text);
+                spanElement.appendChild(pageDocument.createTextNode(text));
+                textAreaElement.parentNode.insertBefore(spanElement, textAreaElement);
+            }
+        }
+    }
+
+    webdeveloper_toggleStyleSheet(element, "chrome://webdeveloper/content/stylesheets/display_form_details.css", "webdeveloper-display-form-details");
+    webdeveloper_toggleFeatureTooltipStyles(element, "webdeveloper-display-form-details-tooltips", "*:before, span.webdeveloper-display-form-details");
+}
+
+// Enables form auto completion
+function webdeveloper_enableFormAutoCompletion()
+{
+    var autoCompleteElements       = null;
+    var autoCompleteElementsLength = null;
+    var documentList               = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength             = documentList.length;
+    var enabledElements            = 0;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        autoCompleteElements       = webdeveloper_evaluateXPath(documentList[i], "//*[@autocomplete]");
+        autoCompleteElementsLength = autoCompleteElements.length;
+
+        // Loop through the auto complete elements
+        for(var j = 0; j < autoCompleteElementsLength; j++)
+        {
+            autoCompleteElements[j].removeAttribute("autocomplete");
+            enabledElements++;
+        }
+    }
+
+    // If the hide informational dialogs preference is not set
+    if(!webdeveloper_getBooleanPreference("webdeveloper.informational.dialogs.hide", true))
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+        var title        = stringBundle.getString("webdeveloper_enableAutoCompletion");
+
+        // If one element was enabled
+        if(enabledElements == 1)
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getString("webdeveloper_enableAutoCompletionSingleResult"));
+        }
+        else
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_enableAutoCompletionMultipleResult", [enabledElements]));
+        }
+    }
+}
+
+// Enables all the form fields
+function webdeveloper_enableFormFields()
+{
+    var documentList             = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength           = documentList.length;
+    var enabledFields            = 0;
+    var form                     = null;
+    var formElement              = null;
+    var formElementList          = null;
+    var formElements             = null;
+    var formElementsLength       = null;
+    var formLength               = null;
+    var formList                 = null;
+    var imageInputElement        = null;
+    var imageInputElements       = null;
+    var imageInputElementsLength = null;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        formList     = documentList[i].forms;
+        formLength   = formList.length;
+
+        // Loop through the forms
+        for(var j = 0; j < formLength; j++)
+        {
+            form                     = formList[j];
+            formElementList          = new Array();
+            formElements             = form.elements;
+            formElementsLength       = formElements.length;
+            imageInputElements       = webdeveloper_evaluateXPath(form, "//input[@type='image']");
+            imageInputElementsLength = imageInputElements.length;
+
+            // Loop through the form elements
+            for(var k = 0; k < formElementsLength; k++)
+            {
+                formElementList.push(formElements[k]);
+            }
+
+            // Loop through the image input elements
+            for(k = 0; k < imageInputElementsLength; k++)
+            {
+                formElementList.push(imageInputElements[k]);
+            }
+
+            formElementsLength = formElementList.length;
+
+            // Loop through the form elements
+            for(k = 0; k < formElementsLength; k++)
+            {
+                formElement = formElementList[k];
+
+                // If the form element is disabled
+                if(formElement.disabled)
+                {
+                    formElement.disabled = false;
+                    enabledFields++;
+                }
+            }
+        }
+    }
+
+    // If the hide informational dialogs preference is not set
+    if(!webdeveloper_getBooleanPreference("webdeveloper.informational.dialogs.hide", true))
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+        var title        = stringBundle.getString("webdeveloper_enableFormFields");
+
+        // If one field was enabled
+        if(enabledFields == 1)
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getString("webdeveloper_enableFormFieldsSingleResult"));
+        }
+        else
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_enableFormFieldsMultipleResult", [enabledFields]));
+        }
+    }
+}
+
+// Makes all the form fields writable
+function webdeveloper_makeFormFieldsWritable()
+{
+    var documentList           = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength         = documentList.length;
+    var readOnlyElements       = null;
+    var readOnlyElementsLength = null;
+    var writableFields         = 0;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        readOnlyElements       = webdeveloper_evaluateXPath(documentList[i], "//*[@readonly]");
+        readOnlyElementsLength = readOnlyElements.length;
+
+        // Loop through all the input tags
+        for(var j = 0; j < readOnlyElementsLength; j++)
+        {
+            readOnlyElements[j].removeAttribute("readonly");
+            writableFields++;
+        }
+    }
+
+    // If the hide informational dialogs preference is not set
+    if(!webdeveloper_getBooleanPreference("webdeveloper.informational.dialogs.hide", true))
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+        var title        = stringBundle.getString("webdeveloper_makeFormFieldsWritable");
+
+        // If one field was made writable
+        if(writableFields == 1)
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getString("webdeveloper_makeFormFieldsWritableSingleResult"));
+        }
+        else
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_makeFormFieldsWritableMultipleResult", [writableFields]));
+        }
+    }
+}
+
+// Populates the form fields on the page
+function webdeveloper_populateFormFields()
+{
+    var documentList           = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength         = documentList.length;
+    var inputElement           = null;
+    var inputElementList       = null;
+    var inputElementName       = null;
+    var inputElementsLength    = null;
+    var inputElementType       = null;
+    var option                 = null;
+    var options                = null;
+    var optionsLength          = null;
+    var pageDocument           = null;
+    var selectElement          = null;
+    var selectElementList      = null;
+    var selectElementsLength   = null;
+    var textAreaElement        = null;
+    var textAreaElementList    = null;
+    var textAreaElementsLength = null;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        pageDocument           = documentList[i];
+        inputElementList       = pageDocument.getElementsByTagName("input");
+        inputElementsLength    = inputElementList.length;
+        selectElementList      = pageDocument.getElementsByTagName("select");
+        selectElementsLength   = selectElementList.length;
+        textAreaElementList    = pageDocument.getElementsByTagName("textarea");
+        textAreaElementsLength = textAreaElementList.length;
+
+        // Loop through all the input tags
+        for(var j = 0; j < inputElementsLength; j++)
+        {
+            inputElement      = inputElementList[j];
+            inputElementType  = inputElement.getAttribute("type");
+
+            // If the input element is not disabled
+            if(!inputElement.disabled)
+            {
+                // If the input element value is not set and the type is not set or is password or text
+                if(inputElement.value.trim() == "" && (!inputElementType || inputElementType == "password" || inputElementType == "text"))
+                {
+                    inputElementName = inputElement.getAttribute("name");
+
+                    // If the input element type is text, the name contains email and the populate form fields email preference is set
+                    if(inputElementType == "text" && inputElementName.toLowerCase().indexOf("email") != -1 && webdeveloper_isPreferenceSet("webdeveloper.populate.form.fields.email"))
+                    {
+                        inputElement.value = webdeveloper_getStringPreference("webdeveloper.populate.form.fields.email", true);
+                    }
+                    else if(inputElementType == "password")
+                    {
+                        inputElement.value = "password";
+                    }
+                    else
+                    {
+                        inputElement.value = inputElementName;
+                    }
+                }
+                else if(inputElementType == "checkbox" || inputElementType == "radio")
+                {
+                    inputElement.checked = true;
+                }
+            }
+        }
+
+        // Loop through all the select tags
+        for(j = 0; j < selectElementsLength; j++)
+        {
+            selectElement = selectElementList[j];
+
+            // If the select element is not disabled and the value is not set
+            if(!selectElement.disabled && selectElement.value.trim() == "")
+            {
+                options       = selectElement.options;
+                optionsLength = options.length;
+
+                // Loop through the options
+                for(var k = 0; k < optionsLength; k++)
+                {
+                    option = options.item(k);
+
+                    // If the optionis set and the option text and option value are not empty
+                    if(option && option.text.trim() != "" && option.value.trim() != "")
+                    {
+                        selectElement.selectedIndex = k;
+
+                        break;
+                    }
+                }
+            }
+        }
+
+        // Loop through all the text area tags
+        for(j = 0; j < textAreaElementsLength; j++)
+        {
+            textAreaElement = textAreaElementList[j];
+
+            // If the text area element is not disabled and the value is not set
+            if(!textAreaElement.disabled && textAreaElement.value.trim() == "")
+            {
+                textAreaElement.value = textAreaElement.getAttribute("name");
+            }
+        }
+    }
+}
+
+// Removes all maximum lengths on form elements
+function webdeveloper_removeMaximumLengths()
+{
+    var documentList                = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength              = documentList.length;
+    var maximumLengthElements       = null;
+    var maximumLengthElementsLength = null;
+    var removed                     = 0;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        maximumLengthElements       = webdeveloper_evaluateXPath(documentList[i], "//input[@maxlength]");
+        maximumLengthElementsLength = maximumLengthElements.length;
+
+        // Loop through all the input tags
+        for(var j = 0; j < maximumLengthElementsLength; j++)
+        {
+            maximumLengthElements[j].removeAttribute("maxlength");
+            removed++;
+        }
+    }
+
+    // If the hide informational dialogs preference is not set
+    if(!webdeveloper_getBooleanPreference("webdeveloper.informational.dialogs.hide", true))
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+        var title        = stringBundle.getString("webdeveloper_removeMaximumLengths");
+
+        // If one maxlength was removed
+        if(removed == 1)
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getString("webdeveloper_removeMaximumLengthsSingleResult"));
+        }
+        else
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_removeMaximumLengthsMultipleResult", [removed]));
+        }
+    }
+}
+
+// Shows all passwords on a form
+function webdeveloper_showPasswords()
+{
+    var documentList        = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength      = documentList.length;
+    var inputElement        = null;
+    var inputElementList    = null;
+    var inputElementsLength = null;
+    var pageDocument        = null;
+    var shownPasswords      = 0;
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        pageDocument        = documentList[i];
+        inputElementList    = pageDocument.getElementsByTagName("input");
+        inputElementsLength = inputElementList.length;
+
+        // Loop through all the input tags
+        for(var j = 0; j < inputElementsLength; j++)
+        {
+            inputElement = inputElementList[j];
+
+            // If the element is password
+            if(inputElement.hasAttribute("type") && inputElement.getAttribute("type").toLowerCase() == "password")
+            {
+                inputElement.setAttribute("type", "text");
+                shownPasswords++;
+            }
+            else
+            {
+                // This stops the fields reordering
+                inputElement.setAttribute("type", inputElement.getAttribute("type"));
+            }
+        }
+    }
+
+    // If the hide informational dialogs preference is not set
+    if(!webdeveloper_getBooleanPreference("webdeveloper.informational.dialogs.hide", true))
+    {
+        var stringBundle = document.getElementById("webdeveloper-string-bundle");
+        var title        = stringBundle.getString("webdeveloper_showPasswords");
+
+        // If one password was shown
+        if(shownPasswords == 1)
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getString("webdeveloper_showPasswordsSingleResult"));
+        }
+        else
+        {
+            webdeveloper_informationalDialog(title, stringBundle.getFormattedString("webdeveloper_showPasswordsMultipleResult", [shownPasswords]));
+        }
+    }
+}
+
+// Updates the forms menu
+function webdeveloper_updateFormsMenu(suffix)
+{
+    webdeveloper_configureElementByAppliedStyle(document.getElementById("webdeveloper-display-form-details-" + suffix), "checked", "webdeveloper-display-form-details");
+}
+
+// Displays all the forms for the page
+function webdeveloper_viewFormInformation()
+{
+    var cellDataElement          = null;
+    var cellHeaderElement        = null;
+    var divElement               = null;
+    var documentList             = webdeveloper_getDocuments(webdeveloper_getContentWindow());
+    var documentLength           = documentList.length;
+    var documentURL              = null;
+    var elementStates            = null;
+    var elementStatesLength      = null;
+    var elementType              = null;
+    var elementValue             = null;
+    var form                     = null;
+    var formElement              = null;
+    var formElementId            = null;
+    var formElementList          = null;
+    var formElements             = null;
+    var formElementsLength       = null;
+    var formLength               = null;
+    var formList                 = null;
+    var imageInputElements       = null;
+    var imageInputElementsLength = null;
+    var labelElement             = null;
+    var labelLength              = null;
+    var labelList                = null;
+    var labelValue               = null;
+    var linkElement              = null;
+    var oldTab                   = getBrowser().selectedTab;
+    var oldURL                   = getBrowser().currentURI.spec;
+    var generatedDocument        = webdeveloper_generateDocument("");
+    var bodyElement              = webdeveloper_getDocumentBodyElement(generatedDocument);
+    var headElement              = webdeveloper_getDocumentHeadElement(generatedDocument);
+    var headerElement            = generatedDocument.createElement("h1");
+    var pageDocument             = null;
+    var pElement                 = null;
+    var preElement               = null;
+    var scriptElement            = generatedDocument.createElement("script");
+    var spanElement              = null;
+    var stringBundle             = document.getElementById("webdeveloper-string-bundle");
+    var tableElement             = null;
+    var tableRowElement          = null;
+    var title                    = stringBundle.getFormattedString("webdeveloper_viewFormInformationTitle", [oldURL]);
+
+    generatedDocument.title = title;
+
+    webdeveloper_addGeneratedStyles(generatedDocument);
+
+    headerElement.appendChild(generatedDocument.createTextNode(title));
+    bodyElement.appendChild(headerElement);
+
+    webdeveloper_addGeneratedTools(generatedDocument);
+
+    // Loop through the documents
+    for(var i = 0; i < documentLength; i++)
+    {
+        divElement    = generatedDocument.createElement("div");
+        headerElement = generatedDocument.createElement("h2");
+        linkElement   = generatedDocument.createElement("a");
+        pageDocument  = documentList[i];
+        documentURL   = pageDocument.documentURI;
+        formList      = pageDocument.forms;
+        formLength    = formList.length;
+        labelList     = pageDocument.getElementsByTagName("label");
+        labelLength   = labelList.length;
+        spanElement   = generatedDocument.createElement("span");
+
+        linkElement.setAttribute("href", documentURL);
+        linkElement.appendChild(generatedDocument.createTextNode(documentURL));
+        headerElement.appendChild(linkElement);
+        bodyElement.appendChild(headerElement);
+
+        headerElement = generatedDocument.createElement("h3");
+
+        spanElement.setAttribute("class", "expanded pivot");
+        headerElement.appendChild(spanElement);
+
+        // If there is one form
+        if(formLength == 1)
+        {
+            headerElement.appendChild(generatedDocument.createTextNode(formLength + " " + stringBundle.getString("webdeveloper_form").toLowerCase()));
+        }
+        else
+        {
+            headerElement.appendChild(generatedDocument.createTextNode(formLength + " " + stringBundle.getString("webdeveloper_forms").toLowerCase()));
+        }
+
+        bodyElement.appendChild(headerElement);
+
+        // Loop through the forms
+        for(var j = 0; j < formLength; j++)
+        {
+            form                     = formList[j];
+            formElementList          = new Array();
+            formElements             = form.elements;
+            formElementsLength       = formElements.length;
+            headerElement            = generatedDocument.createElement("h3");
+            imageInputElements       = webdeveloper_evaluateXPath(form, "//input[@type='image']");
+            imageInputElementsLength = imageInputElements.length;
+            tableElement             = generatedDocument.createElement("table");
+            tableRowElement          = generatedDocument.createElement("tr");
+
+            // Loop through the form elements
+            for(var k = 0; k < formElementsLength; k++)
+            {
+                formElementList.push(formElements[k]);
+            }
+
+            // Loop through the image input elements
+            for(k = 0; k < imageInputElementsLength; k++)
+            {
+                formElementList.push(imageInputElements[k]);
+            }
+
+            formElementsLength = formElementList.length;
+
+            headerElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_form")));
+            divElement.appendChild(headerElement);
+
+            //  Form id heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_id")));
+            tableRowElement.appendChild(cellHeaderElement);
+
+            //  Form name heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_name")));
+            tableRowElement.appendChild(cellHeaderElement);
+
+            //  Form method heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_method")));
+            tableRowElement.appendChild(cellHeaderElement);
+
+            //  Form action heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_action")));
+            tableRowElement.appendChild(cellHeaderElement);
+            tableElement.appendChild(tableRowElement);
+
+            tableRowElement = generatedDocument.createElement("tr");
+
+            //  Form id
+            cellDataElement = generatedDocument.createElement("td");
+
+            cellDataElement.appendChild(generatedDocument.createTextNode(form.getAttribute("id")));
+            tableRowElement.appendChild(cellDataElement);
+
+            //  Form name
+            cellDataElement = generatedDocument.createElement("td");
+
+            cellDataElement.appendChild(generatedDocument.createTextNode(form.getAttribute("name")));
+            tableRowElement.appendChild(cellDataElement);
+
+            //  Form method
+            cellDataElement = generatedDocument.createElement("td");
+
+            cellDataElement.appendChild(generatedDocument.createTextNode(form.getAttribute("method")));
+            tableRowElement.appendChild(cellDataElement);
+
+            //  Form action
+            cellDataElement = generatedDocument.createElement("td");
+
+            cellDataElement.appendChild(generatedDocument.createTextNode(form.getAttribute("action")));
+            tableRowElement.appendChild(cellDataElement);
+            tableElement.appendChild(tableRowElement);
+            divElement.appendChild(tableElement);
+
+            pElement = generatedDocument.createElement("p");
+
+            divElement.appendChild(pElement);
+
+            headerElement   = generatedDocument.createElement("h3");
+            tableElement    = generatedDocument.createElement("table");
+            tableRowElement = generatedDocument.createElement("tr");
+
+            headerElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_elements")));
+            divElement.appendChild(headerElement);
+
+            //  Element index heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_index")));
+            tableRowElement.appendChild(cellHeaderElement);
+
+            //  Element id heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_id")));
+            tableRowElement.appendChild(cellHeaderElement);
+
+            //  Element name heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_name")));
+            tableRowElement.appendChild(cellHeaderElement);
+            tableElement.appendChild(tableRowElement);
+
+            //  Element type heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_type")));
+            tableRowElement.appendChild(cellHeaderElement);
+            tableElement.appendChild(tableRowElement);
+
+            //  Element value heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_value")));
+            tableRowElement.appendChild(cellHeaderElement);
+            tableElement.appendChild(tableRowElement);
+
+            //  Element label heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_label")));
+            tableRowElement.appendChild(cellHeaderElement);
+
+            //  Element size heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_size")));
+            tableRowElement.appendChild(cellHeaderElement);
+            tableElement.appendChild(tableRowElement);
+
+            //  Element maximum length heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_maximumLength")));
+            tableRowElement.appendChild(cellHeaderElement);
+            tableElement.appendChild(tableRowElement);
+
+            //  Element state heading
+            cellHeaderElement = generatedDocument.createElement("th");
+
+            cellHeaderElement.appendChild(generatedDocument.createTextNode(stringBundle.getString("webdeveloper_state")));
+            tableRowElement.appendChild(cellHeaderElement);
+            tableElement.appendChild(tableRowElement);
+
+            // Loop through the form elements
+            for(k = 0; k < formElementsLength; k++)
+            {
+                elementStates   = new Array();
+                elementValue    = "";
+                formElement     = formElementList[k];
+                formElementId   = formElement.getAttribute("id");
+                elementType     = formElement.tagName.toLowerCase();
+                labelElement    = "";
+                labelValue      = "";
+                tableRowElement = generatedDocument.createElement("tr");
+
+                // If this is an even row
+                if(k % 2 != 0)
+                {
+                    tableRowElement.setAttribute("class", "shaded");
+                }
+
+                // If the element has an id
+                if(formElementId)
+                {
+                    // Loop through the labels
+                    for(var l = 0; l < labelLength; l++)
+                    {
+                        labelElement = labelList[l];
+
+                        // If this is the label for the element
+                        if(labelElement.hasAttribute("for") && labelElement.getAttribute("for") == formElementId)
+                        {
+                            labelValue = labelElement.innerHTML;
+                        }
+                    }
+                }
+
+                // If this is an input element
+                if(elementType == "input")
+                {
+                    elementType  = formElement.getAttribute("type");
+                    elementValue = formElement.value;
+                }
+                else if(elementType == "textarea")
+                {
+                    elementValue = formElement.value;
+                }
+
+                // If the element is checked
+                if(formElement.checked)
+                {
+                    elementStates.push("Checked");
+                }
+
+                // If the element is disabled
+                if(formElement.disabled)
+                {
+                    elementStates.push("Disabled");
+                }
+
+                // If the element is read only
+                if(formElement.readOnly)
+                {
+                    elementStates.push("Readonly");
+                }
+
+                elementStatesLength = elementStates.length;
+
+                //  Element index
+                cellDataElement = generatedDocument.createElement("td");
+
+                cellDataElement.appendChild(generatedDocument.createTextNode(k));
+                tableRowElement.appendChild(cellDataElement);
+                tableElement.appendChild(tableRowElement);
+
+                //  Element id
+                cellDataElement = generatedDocument.createElement("td");
+
+                cellDataElement.appendChild(generatedDocument.createTextNode(formElementId));
+                tableRowElement.appendChild(cellDataElement);
+
+                //  Element name
+                cellDataElement = generatedDocument.createElement("td");
+
+                cellDataElement.appendChild(generatedDocument.createTextNode(formElement.getAttribute("name")));
+                tableRowElement.appendChild(cellDataElement);
+                tableElement.appendChild(tableRowElement);
+
+                //  Element type
+                cellDataElement = generatedDocument.createElement("td");
+
+                cellDataElement.appendChild(generatedDocument.createTextNode(elementType));
+                tableRowElement.appendChild(cellDataElement);
+                tableElement.appendChild(tableRowElement);
+
+                //  Element value
+                cellDataElement = generatedDocument.createElement("td");
+
+                cellDataElement.appendChild(generatedDocument.createTextNode(elementValue));
+                tableRowElement.appendChild(cellDataElement);
+                tableElement.appendChild(tableRowElement);
+
+                //  Element label
+                cellDataElement = generatedDocument.createElement("td");
+
+                cellDataElement.appendChild(generatedDocument.createTextNode(labelValue));
+                tableRowElement.appendChild(cellDataElement);
+                tableElement.appendChild(tableRowElement);
+
+                //  Element size
+                cellDataElement = generatedDocument.createElement("td");
+
+                cellDataElement.appendChild(generatedDocument.createTextNode(formElement.getAttribute("size")));
+                tableRowElement.appendChild(cellDataElement);
+                tableElement.appendChild(tableRowElement);
+
+                //  Element maximum length
+                cellDataElement = generatedDocument.createElement("td");
+
+                cellDataElement.appendChild(generatedDocument.createTextNode(formElement.getAttribute("maxlength")));
+                tableRowElement.appendChild(cellDataElement);
+                tableElement.appendChild(tableRowElement);
+
+                //  Element state
+                cellDataElement = generatedDocument.createElement("td");
+
+                // Loop through the element states
+                for(l = 0; l < elementStatesLength; l++)
+                {
+                    pElement = generatedDocument.createElement("p");
+
+                    pElement.appendChild(generatedDocument.createTextNode(elementStates[l]));
+                    cellDataElement.appendChild(pElement);
+                }
+
+                tableRowElement.appendChild(cellDataElement);
+                tableElement.appendChild(tableRowElement);
+            }
+
+            tableElement.setAttribute("class", "sortable");
+            divElement.setAttribute("class", "output");
+            divElement.appendChild(tableElement);
+            divElement.appendChild(generatedDocument.createElement("hr"));
+            bodyElement.appendChild(divElement);
+        }
+    }
+
+    scriptElement.setAttribute("defer", "defer");
+    scriptElement.setAttribute("src", "chrome://webdeveloper/content/common/dom.js");
+    scriptElement.setAttribute("type", "text/javascript");
+    headElement.appendChild(scriptElement);
+
+    scriptElement = generatedDocument.createElement("script");
+
+    scriptElement.setAttribute("defer", "defer");
+    scriptElement.setAttribute("src", "chrome://webdeveloper/content/common/xpath.js");
+    scriptElement.setAttribute("type", "text/javascript");
+    headElement.appendChild(scriptElement);
+
+    scriptElement = generatedDocument.createElement("script");
+
+    scriptElement.setAttribute("defer", "defer");
+    scriptElement.setAttribute("src", "chrome://webdeveloper/content/generated/output_pivot.js");
+    scriptElement.setAttribute("type", "text/javascript");
+    headElement.appendChild(scriptElement);
+
+    scriptElement = generatedDocument.createElement("script");
+
+    scriptElement.setAttribute("defer", "defer");
+    scriptElement.setAttribute("src", "chrome://webdeveloper/content/generated/table_sort.js");
+    scriptElement.setAttribute("type", "text/javascript");
+    headElement.appendChild(scriptElement);
+
+    // If the open tabs in background preference is set to true
+    if(webdeveloper_getBooleanPreference("webdeveloper.open.tabs.background", true))
+    {
+        getBrowser().selectedTab = oldTab;
+    }
+}