--- /dev/null
+// 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;
+ }
+}