From da2cb313ee49eb2cdb7efe5127be71472eb3f495 Mon Sep 17 00:00:00 2001 From: damegane Date: Wed, 23 Jul 2008 13:03:44 +0000 Subject: Initial release git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@16140 d0d07461-0603-4401-acd4-de1884942a52 --- param_editor.js | 242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 242 insertions(+) create mode 100644 param_editor.js (limited to 'param_editor.js') diff --git a/param_editor.js b/param_editor.js new file mode 100644 index 0000000..3a3fe13 --- /dev/null +++ b/param_editor.js @@ -0,0 +1,242 @@ +// Vimperator Plugin: Param Editor +// Version: 0.1 + +(function (){ + var doc = null; + + var xpath = function(query, node){ + var snap = doc.evaluate(query, node, null, + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var res = []; + for(var i = 0; i < snap.snapshotLength; i++){ + res.push(snap.snapshotItem(i)); + } + return res; + }; + + var Form = function(form, i){ + this.uid = i; + this.method = (form.method.length) ? form.method.toUpperCase() : "GET"; + this.action = form.action; + this.name = (form.name.length) ? form.name : this.uid; + this.e = form; + this.member = []; + + //var elems = xpath("descendant::*[@name]", form); + var elems = Array.slice(form.elements); + var count = 0; + elems.forEach(function(e, i){ + if(!e.type) return; + var type = e.type.toLowerCase(); + if(type == "radio" || type == "checkbox"){ + var mg = null; + for(var i = 0; i < this.member.length; i++){ + if(this.member[i].constructor == FormMemberGroup && + this.member[i].name == e.name){ + mg = this.member[i]; + break; + } + } + if(!mg){ + mg = new FormMemberGroup(e, count++); + this.member.push(mg); + } + mg.add_elem(e); + }else{ + this.member.push(new FormMember(e, count++)); + } + }, this); + + this.html = form2html(this); + }; + + var FormMember = function(elem, i){ + this.uid = i; + this.elem = elem; + }; + + ["name", "value", "type"].forEach(function(n){ + FormMember.prototype.__defineGetter__(n, function(){ + return this.elem[n]; + }); + + FormMember.prototype.__defineSetter__(n, function(v){ + this.elem[n] = v; + }); + }); + + var FormMemberGroup = function(e, i){ + this.uid = i; + this.type = e.type.toLowerCase(); + this.name = e.name; + this.elems = []; + }; + + FormMemberGroup.prototype.__defineGetter__("value", function(){ + var v = []; + this.elems.forEach(function(e){ + var _v = e.value; + if(e.checked){ + _v = "[" + _v + "]"; + } + v.push(_v); + }); + return v.join(" "); + }); + + FormMemberGroup.prototype.__defineSetter__("value", function(v){ + var check = function(n){ + if(this.type == "radio"){ + this.elems[n].checked = true; + }else if(this.type == "checkbox"){ + this.elems[n].checked = (this.elems[n].checked) ? false : true; + } + }; + + for(var i = 0; i < this.elems.length; i++){ + if(this.elems[i].value == v){ + check.call(this, i); + return; + } + } + if(this.elems[v]){ + check.call(this, v); + } + }); + + FormMemberGroup.prototype.add_elem = function(e){ + this.elems.push(e); + } + + var form2html = function(form){ + var html = [ + '', + '
Name | Type | Value |
---|---|---|
'+ uid + ' ' + e.name + ' | | ' + e.type + ' | | ' + e.value + ' |