// 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(let i = 0, l = snap.snapshotLength; i < l; 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"){ let mg = null; for(let i = 0, l = this.member.length; i < l; 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(let i = 0, l = this.elems.length; i < l; 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 + ' |