-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathobjectBuilder.min.js
More file actions
4 lines (4 loc) · 8.19 KB
/
objectBuilder.min.js
File metadata and controls
4 lines (4 loc) · 8.19 KB
1
2
3
4
// Object Builder 0.6 (https://github.com/weldstudio/object-builder)
// Copyright The Weld Studio 2012 (http://www.theweldstudio.com)
// This work is licenced under a Creative Commons License http://creativecommons.org/licenses/by-nc-sa/3.0/
function ObjectBuilder(e,t,n,r,i){this.div=e,this.input=t,i&&(this.full=!0),e&&(this._create(),n&&(r||(r=!1),this.rebuild(n,r)))}ObjectBuilder.prototype={_create:function(){div.appendChild(this.pad=document.createElement("div")),this.pad.className="pad",this.pad.innerHTML="",this.store=document.createElement("div"),this.store.className="store",this.full||(this.store.style.display="none",document.body.addEventListener("click",this)),div.appendChild(this.store)},showHide:function(e){e.eStore.style.display=="none"?(e.eStore.style.display="",showHide.innerHTML="Hide"):(showHide.innerHTML="Show",e.eStore.style.display="none")},rebuild:function(e,t){try{this.config=e,this.pad.innerHTML="",this.store.innerHTML="",e.type&&this.pad.setAttribute("data-limit-types",e.type);var n,r=e.elements;for(n in r){var i=!1;r[n].className&&(i=r[n].className),r[n].label&&(this.store.appendChild(r[n].title=document.createElement("div")),r[n].title.innerHTML=r[n].label,r[n].title.className="title");if(r[n].elements){var s=r[n].elements;this.store.appendChild(eStore=document.createElement("div")),eStore.className="elementStore",r[n].eStore=eStore;var u;for(u in s){var a;eStore.appendChild(a=this._createItem(i)),s[u].item=a,a.setAttribute("data-type",n),s[u].value&&a.setAttribute("data-value",s[u].value),s[u].editable&&a.setAttribute("data-editable",1);if(s[u].builder)s[u].builder(a,s[u]);else if(s[u].objects){a.setAttribute("data-has-objects",1);var f=s[u].label,l=[],c={},h={"null":[]},p,d=!1,v=s[u].objects;for(o in v){var m=this._createItem("object");m.innerHTML="",m.setAttribute("data-has-objects",1),v[o].type&&m.setAttribute("data-limit-types",v[o].type),v[o].many&&m.setAttribute("data-many",1),(p=f.indexOf("%{"+o+"}"))!=-1?(l.push(p),c[p]=o,h[p]={name:o,object:m}):h[null].push(m)}(p=f.indexOf("%{}"))!=-1&&(d=!0,l.push(p),h[p]={name:""}),l.sort(function(e,t){return e-t});var g;for(g in l){f=f.split("%{"+h[l[g]].name+"}"),a.appendChild(labelDiv=document.createElement("div")),labelDiv.className="label",labelDiv.innerHTML=f[0],f.length>2?(f.shift(),f=f.join("%{"+h[l[g]].name+"}")):f=f[1];if(!h[l[g]].object)for(o in h[null])a.appendChild(h[null][o]);else a.appendChild(h[l[g]].object)}f&&(a.appendChild(labelDiv=document.createElement("div")),labelDiv.className="label",labelDiv.innerHTML=f);if(!d&&h[null].length){a.appendChild(f=document.createElement("div")),f.className="label",f.innerHTML="(";for(o in h[null])a.appendChild(h[null][o]);a.appendChild(f=document.createElement("div")),f.className="label",f.innerHTML=")"}}else s[u].label&&(a.appendChild(f=document.createElement("div")),f.className="label",f.innerHTML=s[u].label)}}if(r[n].label){var y=this;r[n].title.appendChild(showHide=document.createElement("a")),showHide.innerHTML="",showHide.style.marginLeft="10px",showHide.onclick=function(e){return function(){y.showHide(e)}}(r[n]),r[n].hide?(r[n].eStore.style.display="none",showHide.innerHTML="Show"):showHide.innerHTML="Hide"}}this.current=[],t&&this._rebuildPad()}catch(n){}},_rebuildPad:function(e){try{e=unserialize(e)}catch(t){}},_createItem:function(e){var t=document.createElement("div");return t.setAttribute("data-builder",1),t.className="element",e&&(t.className+=" "+e),t.addEventListener("mousedown",this,!0),t},changeValue:function(e){var t=prompt("Please choose a value",e.getAttribute("data-value"));e.setAttribute("data-value",t),e.innerHTML='<div class="label">'+t+"</div>"},deleteItem:function(e){e.parentNode.removeChild(e)},_parse:function(){return this._parseRecurse(this.pad)},_parseRecurse:function(e){var t=e.childNodes,n,r=[];for(n=0;n<t.length;n++)if(t[n].hasAttribute("data-builder")){var i={};t[n].hasAttribute("data-type")?(i.type=t[n].getAttribute("data-type"),t[n].hasAttribute("data-value")&&(i.value=t[n].getAttribute("data-value")),t[n].hasAttribute("data-has-objects")&&(i.children=this._parseRecurse(t[n]))):t[n].hasAttribute("data-has-objects")&&(i=this._parseRecurse(t[n])),r.push(i)}return r},_findProposal:function(){if(!this.drag||!Mouse.isOver(this.pad))return!1;var e=this._findPropRecurse(this.pad);return e?e:!1},_findPropRecurse:function(e){var t=e.childNodes,n,r=!1,i=!1,s=!0,o=0;if(e.hasAttribute("data-limit-types")){var u=e.getAttribute("data-limit-types").split(",");if(u.indexOf(this.drag.getAttribute("data-type"))==-1||u.indexOf(this.drag.getAttribute("data-type")+"!"+this.drag.getAttribute("data-value"))!=-1)s=!1}for(n=0;n<t.length;n++){if(this.proposed&&t[n]==this.proposed){i=!0;continue}if(t[n].hasAttribute("data-builder")){if(t[n].hasAttribute("data-has-objects")){var a=!0;if(t[n].hasAttribute("data-limit-types")){var u=t[n].getAttribute("data-limit-types").split(",");if(u.indexOf(this.drag.getAttribute("data-type"))==-1||u.indexOf(this.drag.getAttribute("data-type")+"!"+this.drag.getAttribute("data-value"))!=-1)a=!1}if(a&&Mouse.isInXRange(t[n])){var f=this._findPropRecurse(t[n]);if(f)return f;o=$(t[n]).offset().left+t[n].clientWidth/2}else o=$(t[n]).offset().left}else o=$(t[n]).offset().left+t[n].clientWidth/2;if(!e.hasAttribute("data-value")&&!e.hasAttribute("data-many"))return!1;if(Mouse.before(o,null)){if(i)return!0;r=t[n];break}}i=!1}return s&&!e.hasAttribute("data-value")?i?!0:{proposed:e,before:r}:!1},alertObject:function(){alert(serialize(this._parse()))},handleEvent:function(e){e.type=="click"&&e.button==0&&(this.store.style.display=="none"?Mouse.isOver(this.pad)&&(this.store.style.display=""):!Mouse.isOver(this.pad)&&!Mouse.isOver(this.store)&&(this.store.style.display="none")),e.type=="mousedown"&&e.button==0&&(e.preventDefault(),e.stopPropagation(),inArray(e.currentTarget,this.current)&&(this.proposed=e.currentTarget,this.proposed.style.opacity="0.6"),this.drag=e.currentTarget.cloneNode(!0),this.drag.style.position="absolute",this.drag.style.zIndex=200,this.drag.style.opacity=.6,document.body.addEventListener("mousemove",this,!0),document.body.addEventListener("mouseup",this,!0),this.offset=$(e.currentTarget).offset(),document.body.appendChild(this.drag),this.drag.style.top=Math.round(this.offset.top)+"px",this.drag.style.left=Math.round(this.offset.left)+"px",this.offset.left=e.clientX+document.body.scrollLeft-this.offset.left,this.offset.top=e.clientY+document.body.scrollTop-this.offset.top);if(this.drag){if(e.type=="mousemove"){var t=Math.round(e.clientX+document.body.scrollLeft-this.offset.left),n=Math.round(e.clientY+document.body.scrollTop-this.offset.top);this.drag.style.top=n+"px",this.drag.style.left=t+"px";var r=this._findProposal();r?(this.proposed&&this.proposeRemove&&(this.proposed.style.display="",this.drag.style.backgroundColor="",this.proposed.style.backgroundColor="",this.proposeRemove=!1),r!==!0&&(this.proposed?this.proposed.parentNode.removeChild(this.proposed):(this.proposed=this.drag.cloneNode(!0),this.proposed.style.position="relative",this.proposed.style.top=0,this.proposed.style.left=0,this.proposed.style.zindex="auto"),r.before?r.proposed.insertBefore(this.proposed,r.before):r.proposed.appendChild(this.proposed))):(Mouse.isOver(this.pad)?(this.drag.style.backgroundColor="#fcc",this.proposeRemove=!0):this.drag.style.backgroundColor="",this.proposed&&(this.proposed.style.display="none",this.proposeRemove=!0,this.drag.style.backgroundColor="#fcc"))}else if(e.type=="mouseup"&&e.button==0){if(this.proposed){if(this.proposed.style.display=="none")this.proposed.parentNode.removeChild(this.proposed),inArray(e.currentTarget,this.current)&&deleteElement(this.current,e.currentTarget);else{this.proposed.style.opacity="";var i=this;inArray(e.currentTarget,this.current)||this.current.push(this.proposed),this.proposed.hasAttribute("data-editable")&&(this.proposed.onclick=function(e){i.changeValue(this),e.preventDefault(),e.stopPropagation()}),this.proposed.ondblclick=function(e){i.deleteItem(this),e.preventDefault(),e.stopPropagation()}}delete this.proposed}this.proposeRemove&&delete this.proposeRemove,document.body.removeChild(this.drag),delete this.drag,document.body.removeEventListener("mousemove",this,!0),document.body.removeEventListener("mouseup",this,!0),this.input&&(this.input.value=serialize(this._parse()))}window.getSelection().removeAllRanges()}return!1}};