blob: b27cd3b58fce017a9d906ba9024b91b5268595e3 [file] [log] [blame]
// Form plugin for Xinha
// Distributed under the same terms as HTMLArea itself.
// This notice MUST stay intact for use (see license.txt).
function Forms(editor) {
this.editor = editor;
var cfg = editor.config;
var bl = Forms.btnList;
var self = this;
// register the toolbar buttons provided by this plugin
var toolbar = ["linebreak"];
for (var i = 0; i < bl.length; ++i) {
var btn = bl[i];
if (!btn) {
toolbar.push("separator");
} else {
var id = btn[0];
if (i<3)
cfg.registerButton(id, this._lc(btn[1]), editor.imgURL("ed_" + btn[0] + ".gif", "Forms"), false,
function(editor, id) {
// dispatch button press event
self.buttonPress(editor, id);
});
else
cfg.registerButton(id, this._lc(btn[1]), editor.imgURL("ed_" + btn[0] + ".gif", "Forms"), false,
function(editor, id) {
// dispatch button press event
self.buttonPress(editor, id);
},"form");
toolbar.push(id);
}
}
// add a new line in the toolbar
cfg.toolbar.push(toolbar);
}
Forms._pluginInfo = {
name : "Forms",
origin : "version: 1.0, by Nelson Bright, BrightWork, Inc., http://www.brightworkweb.com",
version : "2.0",
developer : "Udo Schmal",
developer_url : "",
sponsor : "L.N.Schaffrath NeueMedien",
sponsor_url : "http://www.schaffrath-neuemedien.de/",
c_owner : "Udo Schmal & Schaffrath-NeueMedien",
license : "htmlArea"
};
// the list of buttons added by this plugin
Forms.btnList = [
// form properties button
null, // separator
["form", "Form"],
null, // separator
// form elements
["textarea", "Textarea"],
["select", "Selection Field"],
["checkbox", "Checkbox"],
["radio", "Radio Button"],
["text", "Text Field"],
["password", "Password Field"],
["file", "File Field"],
["button", "Button"],
["submit", "Submit Button"],
["reset", "Reset Button"],
["image", "Image Button"],
["hidden", "Hidden Field"],
["label", "Label"],
["fieldset", "Field Set"]
];
Forms.prototype._lc = function(string) {
return Xinha._lc(string, 'Forms');
};
Forms.prototype.onGenerate = function() {
this.editor.addEditorStylesheet(Xinha.getPluginDir("Forms") + '/forms.css');
};
Forms.prototype.buttonPress = function(editor,button_id, node) {
function optionValues(text,value) {
this.text = text;
this.value = value;
}
var outparam = new Object();
var type = button_id;
var sel = editor._getSelection();
var range = editor._createRange(sel);
if (button_id=="form") { //Form
// see if selection is inside an existing 'form' tag
var pe = editor.getParentElement();
var frm = null;
while (pe && (pe.nodeType == 1) && (pe.tagName.toLowerCase() != 'body')) {
if(pe.tagName.toLowerCase() == "form") {
frm = pe;
break;
} else
pe = pe.parentNode;
}
if (frm) {
outparam.f_name = frm.name;
outparam.f_action = frm.action;
outparam.f_method = frm.method;
outparam.f_enctype = frm.enctype;
outparam.f_target = frm.target;
} else {;
outparam.f_name = "";
outparam.f_action = "";
outparam.f_method = "";
outparam.f_enctype = "";
outparam.f_target = "";
}
editor._popupDialog("plugin://Forms/form", function(param) {
if (param) {
if(frm) {
frm.name = param["f_name"];
frm.setAttribute("action", param["f_action"]);
frm.setAttribute("method", param["f_method"]);
frm.setAttribute("enctype",param["f_enctype"]);
frm.setAttribute("target", param["f_target"]);
} else {
frm = '<form name="' + param["f_name"] + '"';
if (param["f_action"] != "") frm += ' action="' + param["f_action"] + '"';
if (param["f_method"] != "") frm += ' method="' + param["f_method"] + '"';
if (param["f_enctype"] != "") frm += ' enctype="' + param["f_enctype"] + '"';
if (param["f_target"] != "") frm += ' target="' + param["f_target"] + '"';
frm += '>';
editor.surroundHTML(frm, '&nbsp;</form>');
}
}
}, outparam);
} else { // form element (checkbox, radio, text, password, textarea, select, button, submit, reset, image, hidden)
var tagName = "";
// see if selection is an form element
if (typeof node == "undefined") {
node = editor.getParentElement();
var tag = node.tagName.toLowerCase()
if (node && (tag == "legend")) {
node = node.parentElement;
tag = node.tagName.toLowerCase();
}
if (node && !(tag == "textarea" || tag == "select" || tag == "input" || tag == "label" || tag == "fieldset"))
node = null;
}
if(node) {
type = node.tagName.toLowerCase();
outparam.f_name = node.name;
tagName = node.tagName;
if (type == "input") {
outparam.f_type = node.type;
type = node.type;
}
switch (type) {
case "textarea":
outparam.f_cols = node.cols;
outparam.f_rows = node.rows;
outparam.f_text = node.innerHTML;
outparam.f_wrap = node.getAttribute("wrap");
outparam.f_readOnly = node.getAttribute("readOnly");
outparam.f_disabled = node.getAttribute("disabled");
outparam.f_tabindex = node.getAttribute("tabindex");
outparam.f_accesskey = node.getAttribute("accesskey");
break;
case "select":
outparam.f_size = parseInt(node.size);
outparam.f_multiple = node.getAttribute("multiple");
outparam.f_disabled = node.getAttribute("disabled");
outparam.f_tabindex = node.getAttribute("tabindex");
var a_options = new Array();
for (var i=0; i<=node.options.length-1; i++) {
a_options[i] = new optionValues(node.options[i].text, node.options[i].value);
}
outparam.f_options = a_options;
break;
case "text":
case "password":
outparam.f_value = node.value;
outparam.f_size = node.size;
outparam.f_maxLength = node.maxLength;
outparam.f_readOnly = node.getAttribute("readOnly");
outparam.f_disabled = node.getAttribute("disabled");
outparam.f_tabindex = node.getAttribute("tabindex");
outparam.f_accesskey = node.getAttribute("accesskey");
break;
case "hidden":
outparam.f_value = node.value;
break;
case "submit":
case "reset":
outparam.f_value = node.value;
outparam.f_disabled = node.getAttribute("disabled");
outparam.f_tabindex = node.getAttribute("tabindex");
outparam.f_accesskey = node.getAttribute("accesskey");
break;
case "checkbox":
case "radio":
outparam.f_value = node.value;
outparam.f_checked = node.checked;
outparam.f_disabled = node.getAttribute("disabled");
outparam.f_tabindex = node.getAttribute("tabindex");
outparam.f_accesskey = node.getAttribute("accesskey");
break;
case "button":
outparam.f_value = node.value;
outparam.f_onclick = node.getAttribute("onclick");
outparam.f_disabled = node.getAttribute("disabled");
outparam.f_tabindex = node.getAttribute("tabindex");
outparam.f_accesskey = node.getAttribute("accesskey");
break;
case "image":
outparam.f_value = node.value;
outparam.f_src = node.src;
outparam.f_disabled = node.getAttribute("disabled");
outparam.f_tabindex = node.getAttribute("tabindex");
outparam.f_accesskey = node.getAttribute("accesskey");
break;
case "file":
outparam.f_disabled = node.getAttribute("disabled");
outparam.f_tabindex = node.getAttribute("tabindex");
outparam.f_accesskey = node.getAttribute("accesskey");
break;
case "label":
outparam.f_text = node.innerHTML;
outparam.f_for = node.getAttribute("for");
outparam.f_accesskey = node.getAttribute("accesskey");
break;
case "fieldset":
if(node.firstChild.tagName.toLowerCase()=="legend")
outparam.f_text = node.firstChild.innerHTML;
else
outparam.f_text = "";
break;
}
} else {
outparam.f_name = "";
switch (button_id) {
case "textarea":
case "select":
case "label":
case "fieldset":
tagName = button_id;
break;
default:
tagName = "input";
outparam.f_type = button_id;
break;
}
outparam.f_options = "";
outparam.f_cols = "20";
outparam.f_rows = "4";
outparam.f_multiple = "false";
outparam.f_value = "";
outparam.f_size = "";
outparam.f_maxLength = "";
outparam.f_checked = "";
outparam.f_src = "";
outparam.f_onclick = "";
outparam.f_wrap = "";
outparam.f_readOnly = "false";
outparam.f_disabled = "false";
outparam.f_tabindex = "";
outparam.f_accesskey = "";
outparam.f_for = "";
outparam.f_text = "";
outparam.f_legend = "";
}
editor._popupDialog("plugin://Forms/" + tagName + ".html", function(param) {
if (param) {
if(param["f_cols"])
if (isNaN(parseInt(param["f_cols"],10)) || parseInt(param["f_cols"],10) <= 0)
param["f_cols"] = "";
if(param["f_rows"])
if(isNaN(parseInt(param["f_rows"],10)) || parseInt(param["f_rows"],10) <= 0)
param["f_rows"] = "";
if(param["f_size"])
if(isNaN(parseInt(param["f_size"],10)) || parseInt(param["f_size"],10) <= 0)
param["f_size"] = "";
if(param["f_maxlength"])
if(isNaN(parseInt(param["f_maxLength"],10)) || parseInt(param["f_maxLength"],10) <= 0)
param["f_maxLength"] = "";
if(node) {
//prepare existing Element
for (field in param) {
//alert(field.substring(2,20) + '=' + param[field]); //to be silent! by htanaka
if ((field=="f_text") || (field=="f_options") || (field=="f_onclick") || (field=="f_checked"))continue;
if (param[field] != "")
node.setAttribute(field.substring(2,20), param[field]);
else
node.removeAttribute(field.substring(2,20));
}
if (type == "textarea") {
node.innerHTML = param["f_text"];
} else if(type == "select") {
node.options.length = 0;
var optionsList = param["f_options"];
for (i=0; i<= optionsList.length-1; i++) {
node.options[i] = new Option(optionsList[i].text, optionsList[i].value)
}
} else if(type == "label") {
node.innerHTML = param["f_text"];
} else if(type == "fieldset") {
if(outparam.f_text != "") {
if(node.firstChild.tagName.toLowerCase()=="legend")
node.firstChild.innerHTML = param["f_text"];
} else {}// not implemented jet
} else if((type == "checkbox") || (type == "radio")) { //input
if(param["f_checked"]!="")
node.checked = true;
else
node.checked = false;
} else {
if(param["f_onclick"]){
node.onclick = "";
if(param["f_onclick"]!="")
node.onclick = param["f_onclick"];
}
}
} else {
//create Element
var text = "";
for (field in param) {
if (!param[field]) continue;
if ((param[field]=="") || (field=="f_text")|| (field=="f_options"))continue;
text += " " + field.substring(2,20) + '="' + param[field] + '"';
}
if(type == "textarea") {
text = '<textarea' + text + '>' + param["f_text"] + '</textarea>';
} else if(type == "select") {
text = '<select' + text + '>';
var optionsList = param["f_options"];
for (i=0; i<= optionsList.length-1; i++) {
// v-- Avoid lc_parse_strings.php
text += '<'+'option value="'+optionsList[i].value+'">'+optionsList[i].text+'</option>';
}
text += '</select>';
} else if(type == "label") {
text = '<label' + text + '>' + param["f_text"] + '</label>';
} else if(type == "fieldset") {
text = '<fieldset' + text + '>';
if (param["f_legend"] != "") text += '<legend>' + param["f_text"] + '</legend>';
text += '</fieldset>';
} else {
text = '<input type="'+type+'"' + text + '>';
}
editor.insertHTML(text);
}
}
}, outparam);
}
};