Revision control

Copy as Markdown

Other Tools

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* import-globals-from ../../composer/content/editorUtilities.js */
/* import-globals-from EdDialogCommon.js */
var insertNew;
var inputElement;
// dialog initialization code
document.addEventListener("dialogaccept", onAccept);
document.addEventListener("dialogcancel", onCancel);
function Startup() {
var editor = GetCurrentEditor();
if (!editor) {
dump("Failed to get active editor!\n");
window.close();
return;
}
gDialog = {
accept: document.documentElement.getButton("accept"),
inputType: document.getElementById("InputType"),
inputNameDeck: document.getElementById("InputNameDeck"),
inputName: document.getElementById("InputName"),
inputValueDeck: document.getElementById("InputValueDeck"),
inputValue: document.getElementById("InputValue"),
inputDeck: document.getElementById("InputDeck"),
inputChecked: document.getElementById("InputChecked"),
inputSelected: document.getElementById("InputSelected"),
inputReadOnly: document.getElementById("InputReadOnly"),
inputDisabled: document.getElementById("InputDisabled"),
inputTabIndex: document.getElementById("InputTabIndex"),
inputAccessKey: document.getElementById("InputAccessKey"),
inputSize: document.getElementById("InputSize"),
inputMaxLength: document.getElementById("InputMaxLength"),
inputAccept: document.getElementById("InputAccept"),
MoreSection: document.getElementById("MoreSection"),
MoreFewerButton: document.getElementById("MoreFewerButton"),
AdvancedEditButton: document.getElementById("AdvancedEditButton"),
AdvancedEditDeck: document.getElementById("AdvancedEditDeck"),
};
// Get a single selected input element
const kTagName = "input";
try {
inputElement = editor.getSelectedElement(kTagName);
} catch (e) {}
if (inputElement) {
// We found an element and don't need to insert one
insertNew = false;
} else {
insertNew = true;
// We don't have an element selected,
// so create one with default attributes
try {
inputElement = editor.createElementWithDefaults(kTagName);
} catch (e) {}
if (!inputElement) {
dump("Failed to get selected element or create a new one!\n");
window.close();
return;
}
var imgElement = editor.getSelectedElement("img");
if (imgElement) {
// We found an image element, convert it to an input type="image"
inputElement.setAttribute("type", "image");
var attributes = [
"src",
"alt",
"width",
"height",
"hspace",
"vspace",
"border",
"align",
];
for (let i in attributes) {
inputElement.setAttribute(
attributes[i],
imgElement.getAttribute(attributes[i])
);
}
} else {
inputElement.setAttribute("value", GetSelectionAsText());
}
}
// Make a copy to use for AdvancedEdit
globalElement = inputElement.cloneNode(false);
InitDialog();
InitMoreFewer();
gDialog.inputType.focus();
SetWindowLocation();
}
function InitDialog() {
var type = globalElement.getAttribute("type");
var index = 0;
switch (type) {
case "button":
index = 9;
break;
case "checkbox":
index = 2;
break;
case "file":
index = 6;
break;
case "hidden":
index = 7;
break;
case "image":
index = 8;
break;
case "password":
index = 1;
break;
case "radio":
index = 3;
break;
case "reset":
index = 5;
break;
case "submit":
index = 4;
break;
}
gDialog.inputType.selectedIndex = index;
gDialog.inputName.value = globalElement.getAttribute("name");
gDialog.inputValue.value = globalElement.getAttribute("value");
gDialog.inputChecked.setAttribute(
"checked",
globalElement.hasAttribute("checked")
);
gDialog.inputSelected.setAttribute(
"checked",
globalElement.hasAttribute("checked")
);
gDialog.inputReadOnly.setAttribute(
"checked",
globalElement.hasAttribute("readonly")
);
gDialog.inputDisabled.setAttribute(
"checked",
globalElement.hasAttribute("disabled")
);
gDialog.inputTabIndex.value = globalElement.getAttribute("tabindex");
gDialog.inputAccessKey.value = globalElement.getAttribute("accesskey");
gDialog.inputSize.value = globalElement.getAttribute("size");
gDialog.inputMaxLength.value = globalElement.getAttribute("maxlength");
gDialog.inputAccept.value = globalElement.getAttribute("accept");
SelectInputType();
}
function SelectInputType() {
var index = gDialog.inputType.selectedIndex;
gDialog.AdvancedEditDeck.setAttribute("selectedIndex", 0);
gDialog.inputNameDeck.setAttribute("selectedIndex", 0);
gDialog.inputValueDeck.setAttribute("selectedIndex", 0);
gDialog.inputValue.disabled = false;
gDialog.inputChecked.disabled = index != 2;
gDialog.inputSelected.disabled = index != 3;
gDialog.inputReadOnly.disabled = index > 1;
gDialog.inputTabIndex.disabled = index == 7;
gDialog.inputAccessKey.disabled = index == 7;
gDialog.inputSize.disabled = index > 1;
gDialog.inputMaxLength.disabled = index > 1;
gDialog.inputAccept.disabled = index != 6;
switch (index) {
case 0:
case 1:
gDialog.inputValueDeck.setAttribute("selectedIndex", 1);
gDialog.inputDeck.setAttribute("selectedIndex", 2);
break;
case 2:
gDialog.inputDeck.setAttribute("selectedIndex", 0);
break;
case 3:
gDialog.inputDeck.setAttribute("selectedIndex", 1);
gDialog.inputNameDeck.setAttribute("selectedIndex", 1);
break;
case 6:
gDialog.inputValue.disabled = true;
gDialog.inputAccept.disabled = false;
break;
case 8:
gDialog.inputValue.disabled = true;
gDialog.AdvancedEditDeck.setAttribute("selectedIndex", 1);
gDialog.inputName.removeEventListener("input", onInput);
break;
case 7:
gDialog.inputValueDeck.setAttribute("selectedIndex", 1);
break;
}
onInput();
}
function onInput() {
var disabled = false;
switch (gDialog.inputType.selectedIndex) {
case 3:
disabled = disabled || !gDialog.inputValue.value;
break;
case 4:
case 5:
break;
case 8:
disabled = !globalElement.hasAttribute("src");
break;
default:
disabled = !gDialog.inputName.value;
break;
}
if (gDialog.accept.disabled != disabled) {
gDialog.accept.disabled = disabled;
gDialog.AdvancedEditButton.disabled = disabled;
}
}
function doImageProperties() {
window.openDialog(
"_blank",
"chrome,close,titlebar,modal",
globalElement
);
window.focus();
onInput();
}
function ValidateData() {
var attributes = {
type: "",
name: gDialog.inputName.value,
value: gDialog.inputValue.value,
tabindex: gDialog.inputTabIndex.value,
accesskey: "",
size: "",
maxlength: "",
accept: "",
};
var index = gDialog.inputType.selectedIndex;
var flags = {
checked: false,
readonly: false,
disabled: gDialog.inputDisabled.checked,
};
switch (index) {
case 1:
attributes.type = "password";
// Falls through
case 0:
flags.readonly = gDialog.inputReadOnly.checked;
attributes.size = gDialog.inputSize.value;
attributes.maxlength = gDialog.inputMaxLength.value;
break;
case 2:
attributes.type = "checkbox";
flags.checked = gDialog.inputChecked.checked;
break;
case 3:
attributes.type = "radio";
flags.checked = gDialog.inputSelected.checked;
break;
case 4:
attributes.type = "submit";
attributes.accesskey = gDialog.inputAccessKey.value;
break;
case 5:
attributes.type = "reset";
attributes.accesskey = gDialog.inputAccessKey.value;
break;
case 6:
attributes.type = "file";
attributes.accept = gDialog.inputAccept.value;
attributes.value = "";
break;
case 7:
attributes.type = "hidden";
attributes.tabindex = "";
break;
case 8:
attributes.type = "image";
attributes.value = "";
break;
case 9:
attributes.type = "button";
attributes.accesskey = gDialog.inputAccessKey.value;
break;
}
for (var a in attributes) {
if (attributes[a]) {
globalElement.setAttribute(a, attributes[a]);
} else {
globalElement.removeAttribute(a);
}
}
for (var f in flags) {
if (flags[f]) {
globalElement.setAttribute(f, "");
} else {
globalElement.removeAttribute(f);
}
}
return true;
}
function onAccept(event) {
if (ValidateData()) {
// All values are valid - copy to actual element in doc or
// element created to insert
var editor = GetCurrentEditor();
editor.cloneAttributes(inputElement, globalElement);
if (insertNew) {
try {
// 'true' means delete the selection before inserting
// in case were are converting an image to an input type="image"
editor.insertElementAtSelection(inputElement, true);
} catch (e) {
dump(e);
}
}
SaveWindowLocation();
return;
}
event.preventDefault();
}