// Juice - Javascript User Interface Common Elements
// Copyright (C) 2007-2011 IP Labs GmbH <http://www.iplabs.de/>
// @require jade/HTMLUtils.js
function ItemManager(s){this.aY=ItemManager.instances.length;
ItemManager.instances.push(this);this.aX=s;this.bm=[];
this.dropTargetPositions=[];this.bn();}ItemManager.instances=[];
ItemManager.bo=ItemManager.prototype;ItemManager.bo.aY=null;
ItemManager.bo.bh=50;ItemManager.bo.useMinCanvasHeight=true;
ItemManager.bo.bj=100;ItemManager.bo.aX=null;ItemManager.bo.canvas=null;
ItemManager.bo.aZ=null;ItemManager.bo.a0=0;ItemManager.bo.disabledCount=0;
ItemManager.bo.onChange=null;ItemManager.bo.onCreateDragElement=null;
ItemManager.bo.onDragStart=null;ItemManager.bo.onDrag=null;
ItemManager.bo.onDragEnter=null;ItemManager.bo.onDrop=null;
ItemManager.bo.onDblClick=null;ItemManager.bo.onDragLeave=null;
ItemManager.bo.onDragStop=null;ItemManager.bo.onScan=null;
ItemManager.bo.a1=false;ItemManager.bo.a3=null;ItemManager.bo.a4=0;
ItemManager.bo.a5=0;ItemManager.bo.a6=0;ItemManager.bo.a7=0;
ItemManager.bo.a2=false;ItemManager.bo.a8=null;ItemManager.bo.a9=null;
ItemManager.bo.bi=false;ItemManager.bo.b_=0;ItemManager.bo.ba=0;
ItemManager.bo.bb=0;ItemManager.bo.bc=0;ItemManager.bo.bf=0;ItemManager.bo.bg=0;
ItemManager.bo.bk=false;ItemManager.bo.padding=0;ItemManager.bo.bl=0;
ItemManager.bo.multipleSelection=true;ItemManager.bo.bm=null;
ItemManager.bo.dropTargetPositions=null;ItemManager.bo.bn=function(){var _,a,b;
this.canvas=jade.HTMLUtils.getElementByClassName(this.aX,"canvas");
if(!this.canvas){throw new Error("No sub element with class 'canvas' found");
}this.a0=0;this.aZ=[];this.a9=document.createElement("div");
this.a9.className="rubberband";this.a9.style.display="none";
this.canvas.appendChild(this.a9);this.canvas.itemManager=this;
this.canvas.onmousedown=this.handleContainerMouseDown;
this.canvas.ondragstart=function(){return false;};
this.canvas.onselectstart=function(){return false;};
this.canvas.oncontextmenu=function(){return false;};
this.canvas.onkeypress=this.handleContainerKeyPress;};
ItemManager.bo.scanItems=function(){var _,a,e;this.aZ=[];this.a0=0;
this.registerItems(jade.HTMLUtils.getElementsByClassName(this.aX,"selectable"));
if(this.onScan){e=this.aZ;for(_=0,a=e.length;_<a;_++){this.onScan(this,e[_],_);
}}};ItemManager.bo.clearItems=function(){var _,a,e,b;e=this.aZ;
for(_=0,a=e.length;_<a;_++){b=e[_];b.parentNode.removeChild(b);}this.aZ=[];
this.a0=0;this.disabledCount=0;this.fixCanvasSize();};
ItemManager.bo.removeSelectedItems=function(){var _,e,b,m;e=this.aZ;m=[];
for(_=e.length-1;_>=0;_--){b=e[_];if(b.selected){b.parentNode.removeChild(b);
m.push(b);e.splice(_,1);}}this.a0=0;this.changed();this.fixCanvasSize();
return m;};
ItemManager.bo.isDisabled=function(b){if(b.disabledItem===undefined)return false;
return b.disabledItem;};
ItemManager.bo.disableItem=function(b){if(!this.isDisabled(b)){b.disabledItem=true;
this.disabledCount++;this.changed();}};
ItemManager.bo.enableItem=function(b){if(this.isDisabled(b)){b.disabledItem=false;
this.disabledCount--;this.changed();}};
ItemManager.bo.start=function(){this.scanItems();this.probePadding();
this.fixCanvasSize();this.changed();};
ItemManager.bo.probePadding=function(){var n;n=document.createElement("div");
n.style.width="1px";n.style.height="1px";n.style.cssFloat="left";
if(this.canvas.firstChild){this.canvas.insertBefore(n,this.canvas.firstChild);
}else{this.canvas.appendChild(n);}this.padding=n.offsetTop+1;
this.canvas.removeChild(n);};ItemManager.bo.registerItems=function(e){var _,a,b;
for(_=0,a=e.length;_<a;_++){b=e[_];this.registerItem(b);}};
ItemManager.bo.registerItem=function(b,_8){b.selected=jade.HTMLUtils.hasClassName(b,"selected");
if(b.selected){this.a0++;}b.itemManager=this;
b.oncontextmenu=function(){return false;};
b.onmousedown=this.handleItemMouseDown;b.onmouseup=this.handleItemMouseUp;
b.ondblclick=this.handleItemDblClick;b.onclick=function(){return false;};
b.onselectstart=function(){return false;};if(_8===undefined){this.aZ.push(b);
}else{this.aZ.splice(_8,0,b);}};ItemManager.bo.add=function(b){var r,s,t;
if(!this.aZ.length){s=this.canvas;t=s.firstChild;
}else{r=this.aZ[this.aZ.length-1];s=r.parentNode;t=r.nextSibling;
}if(t){s.insertBefore(b,t);}else{s.appendChild(b);}this.registerItem(b);};
ItemManager.bo.addItem=function(b){this.add(b);this.fixCanvasSize();};
ItemManager.bo.addItems=function(e){var _,a;for(_=0,a=e.length;_<a;
_++){this.add(e[_]);}this.fixCanvasSize();};
ItemManager.bo.insert=function(b,_8){var r,s,t;
if(!this.aZ.length){s=this.canvas;t=s.firstChild;
}else if(_8>=this.aZ.length){r=this.aZ[this.aZ.length-1];s=r.parentNode;
t=r.nextSibling;}else{t=this.aZ[_8];s=this.canvas;}if(t){s.insertBefore(b,t);
}else{s.appendChild(b);}this.registerItem(b,_8);this.fixCanvasSize();};
ItemManager.bo.insertItem=function(b,_8){this.insert(b,_8);this.fixCanvasSize();
};ItemManager.bo.insertItems=function(e,_8){var _;for(_=e.length-1;_>=0;
_--){this.insert(e[_],_8);}this.fixCanvasSize();};
ItemManager.bo.fixCanvasSize=function(){var b,e,_,D,E,F,G;e=this.aZ;
_=e.length-1;E=null;F=0;D=0;while(_>=0){b=e[_];F=b.offsetLeft;
if(E!==null&&F>E)break;G=b.offsetTop+b.offsetHeight;if(G>D)D=G;E=F;_--;
}if(this.useMinCanvasHeight){this.canvas.style.height=Math.max(this.aX.offsetHeight-this.padding*2,D)+"px";
}else{this.canvas.style.height=D+"px";}};
ItemManager.bo.createDragElement=function(b){if(this.onCreateDragElement){return this.onCreateDragElement(this,b);
}else{var H;H=document.createElement("div");H.style.border="1px solid black";
H.style.width="128px";H.style.height="96px";H.style.background="#fff";return b;
}};ItemManager.bo.handleWindowMouseMove=function(as){var F,G;var _,a;var b,N;
var O,P;
if(this.itemManagerControl){return this.itemManagerControl.handleWindowMouseMove(as?as:event);
}as.cancelBubble=true;if(as.stopPropagation)as.stopPropagation();
if(this.bi)this.updateRubberband(as);F=this.getAbsoluteMouseX(as);
G=this.getAbsoluteMouseY(as);
if(this.a1){if((Math.abs(F-this.a4)>5)||(Math.abs(G-this.a5)>5)){this.a1=false;
this.a2=true;this.dragElement=this.createDragElement(this.a3);
this.dragElement.style.position="absolute";
this.dragElement.style.left=(F-this.a6)+"px";
this.dragElement.style.top=(G-this.a7)+"px";
this.dragElement.className="enabled "+(this.a0==1?"single":"multiple");
document.body.appendChild(this.dragElement);this.updateDropTargetPositions();
if(this.onDragStart){this.onDragStart(this);
}}}if(this.a2){this.dragElement.style.left=(F-this.a6)+"px";
this.dragElement.style.top=(G-this.a7)+"px";
if(this.onDrag){this.onDrag(this,this.dragElement,F,G);}var Q=null;
for(_=0,a=this.bm.length;_<a;_++){var R=this.dropTargetPositions[_];
if(F>R.x&&F<R.x+R.width&&G>R.y&&G<R.y+R.height){Q=this.bm[_];
Q[2]={'x':F-R.x,'y':G-R.y};
}}if(this.dropTarget!=Q){if(this.dropTarget){if(this.onDragLeave){this.onDragLeave(this,this.dropTarget[0],this.dropTarget[1]);
}}if(Q){jade.HTMLUtils.addClassName(this.dragElement,"dropable");
if(this.onDragEnter){this.onDragEnter(this,Q[0],Q[1]);
}}else{jade.HTMLUtils.removeClassName(this.dragElement,"dropable");
}this.dropTarget=Q;}}};
ItemManager.bo.handleWindowMouseUp=function(as){if(this.itemManagerControl){return this.itemManagerControl.handleWindowMouseUp(as?as:event);
}as.cancelBubble=true;if(as.stopPropagation)as.stopPropagation();
if(this.bi)this.stopRubberband();if(this.a2){this.stopDragging();}return false;
};
ItemManager.bo.handleContainerMouseDown=function(as){if(this.itemManager){return this.itemManager.handleContainerMouseDown(as?as:event);
}as.cancelBubble=true;if(as.stopPropagation)as.stopPropagation();
if(!this.isCtrlPressed(as))this.deselectAll();this.startRubberband(as);
return false;};
ItemManager.bo.isCtrlPressed=function(as){return this.ctrlLock||as.ctrlKey||as.altKey;
};
ItemManager.bo.handleContainerKeyPress=function(as){if(this.itemManager){return this.itemManager.handleContainerKeyPress(as?as:event);
}if(as.keyCode==1||as.keyCode==65){as.cancelBubble=true;
if(as.stopPropagation)as.stopPropagation();this.selectAll();return false;
}return true;};ItemManager.bo.scroll=function(){var S,T;var F,G,W,X,Y,Z,__,_a;
var _b;S=this.bf/(1000/this.bh);T=this.bg/(1000/this.bh);
if(S||T){this.aX.scrollLeft+=S;this.aX.scrollTop+=T;_b=this.a9;
F=parseInt(_b.style.left);G=parseInt(_b.style.top);
F+=(F==this.b_)?parseInt(_b.style.width):0;
G+=(G==this.ba)?parseInt(_b.style.height):0;F+=S;G+=T;
this.setRubberbandEnd(F,G);}};
ItemManager.bo.setRubberbandEnd=function(F,G){var _c,_d,_e,_f;
F=Math.min(this.aX.clientWidth-2+this.aX.scrollLeft,F);
G=Math.min(this.aX.clientHeight-2+this.aX.scrollTop,G);_c=Math.abs(F-this.b_);
_d=Math.abs(G-this.ba);_e=Math.min(F,this.b_);_f=Math.min(G,this.ba);
this.a9.style.left=_e+"px";this.a9.style.top=_f+"px";
this.a9.style.width=_c+"px";this.a9.style.height=_d+"px";};
ItemManager.bo.startRubberband=function(as){var F,G;this.deselectAll();
if(!this.multipleSelection)return;if(this.bi)return;F=as.layerX?as.layerX:as.x;
G=as.layerY?as.layerY:as.y;this.bl++;this.b_=F;this.ba=G;
this.bb=as.screenX+this.aX.scrollLeft-F;this.bc=as.screenY+this.aX.scrollTop-G;
this.setRubberbandEnd(F,G);window.itemManagerControl=this;
window.onmousemove=this.handleWindowMouseMove;
window.onmouseup=this.handleWindowMouseUp;document.itemManagerControl=this;
document.onmousemove=this.handleWindowMouseMove;
document.onmouseup=this.handleWindowMouseUp;
document.body.onselectstart=function(){return false;};
this.bk=this.isCtrlPressed(as);this.bi=true;this.updateRubberbandSelection();};
ItemManager.bo.stopRubberband=function(){this.bi=false;window.onmousemove=null;
window.onmouseup=null;window.itemManagerControl=null;
document.body.onselectstart=null;document.onmousemove=null;
document.onmouseup=null;document.itemManagerControl=null;
this.a9.style.display="none";this.bf=0;this.bg=0;this.changed();};
ItemManager.bo.updateRubberband=function(as){var _e,_f,_c,_d;var F,G;var _o,_p;
F=as.screenX-this.bb+this.aX.scrollLeft;G=as.screenY-this.bc+this.aX.scrollTop;
if(G>this.aX.offsetHeight+this.aX.scrollTop){this.bg=(G-(this.aX.offsetHeight+this.aX.scrollTop))*10;
}else if(G<this.aX.scrollTop){this.bg=(G-this.aX.scrollTop)*10;}else{this.bg=0;
}this.setRubberbandEnd(F,G);this.a9.style.display="block";};
ItemManager.bo.updateRubberbandSelection=function(){if(this.bi&&this.a9.offsetWidth&&this.a9.offsetHeight){var W,X,Y,Z,_,a;
W=this.a9.offsetLeft;X=this.a9.offsetTop;Y=W+this.a9.offsetWidth;
Z=X+this.a9.offsetHeight;for(_=0,a=this.aZ.length;_<a;_++){var b;var F,G,__,_a;
var _B;b=this.aZ[_];F=b.offsetLeft;G=b.offsetTop;__=b.offsetWidth;
_a=b.offsetHeight;_B=!(F+__<W||F>Y||G+_a<X||G>Z);
if(this.bk){if(b.bl!=this.bl){b.origSelected=b.selected;b.bl=this.bl;
}if(b.origSelected^!_B){if(b.selected)this.deselectItem(b);
}else{if(!b.selected)this.selectItem(b);
}}else{if(_B){if(!b.selected)this.selectItem(b);
}else{if(b.selected)this.deselectItem(b);}}}}this.scroll();
if(this.bi){setTimeout("ItemManager.instances["+this.aY+"].updateRubberbandSelection()",this.bj);
}};
ItemManager.bo.handleItemMouseUp=function(as,b){if(this.itemManager){return this.itemManager.handleItemMouseUp(as?as:event,this);
}if(this.bi)return;document.body.onselectstart=null;
if(b.wasSelected){this.deselect(b);}this.stopDragging();return false;};
ItemManager.bo.handleItemMouseDown=function(as,b){if(this.itemManager){return this.itemManager.handleItemMouseDown(as?as:event,this);
}as.cancelBubble=true;if(as.stopPropagation)as.stopPropagation();
document.body.onselectstart=function(){return false;};
if(!this.multipleSelection){this.deselectAll();}b.wasSelected=b.selected;
this.select(b);if(this.a0)this.startDragging(as,b);return false;};
ItemManager.bo.handleItemDblClick=function(as,b){if(this.itemManager){return this.itemManager.handleItemDblClick(as?as:event,this);
}as.cancelBubble=true;if(as.stopPropagation)as.stopPropagation();
document.body.onselectstart=null;if(this.isDisabled(b))return;
if(this.onDblClick){this.onDblClick(this,b);this.deselect(b);}return false;};
ItemManager.bo.startDragging=function(as,b){this.a1=true;this.a3=b;
this.a4=this.getAbsoluteMouseX(as);this.a5=this.getAbsoluteMouseY(as);
this.a6=this.getMouseX(as)-((as.layerX&&b.style.marginLeft)?parseInt(b.style.marginLeft):0);
this.a7=this.getMouseY(as)-((as.layerY&&b.style.marginTop)?parseInt(b.style.marginTop):0);
window.itemManagerControl=this;window.onmousemove=this.handleWindowMouseMove;
window.onmouseup=this.handleWindowMouseUp;document.itemManagerControl=this;
document.onmousemove=this.handleWindowMouseMove;
document.onmouseup=this.handleWindowMouseUp;
document.body.onselectstart=function(){return false;};};
ItemManager.bo.stopDragging=function(){var _;window.onmousemove=null;
window.onmouseup=null;window.itemManagerControl=null;
document.body.onselectstart=null;document.onmousemove=null;
document.onmouseup=null;document.itemManagerControl=null;this.a1=false;
this.a2=false;
if(this.dragElement){if(this.dropTarget){if(this.onDragLeave){this.onDragLeave(this,this.dropTarget[0],this.dropTarget[1]);
}if(this.onDrop){this.onDrop(this,this.dropTarget[0],this.dropTarget[1],this.dropTarget[2]);
}this.dropTarget=null;}if(this.a0==1){this.deselectAll();
}this.dragElement.parentNode.removeChild(this.dragElement);
this.dragElement=null;if(this.onDragStop){this.onDragStop(this);}}};
ItemManager.bo.selectItem=function(b){if(!b.selected&&!this.isDisabled(b)){jade.HTMLUtils.addClassName(b,"selected");
b.selected=true;this.a0++;return true;}return false;};
ItemManager.bo.deselectItem=function(b){if(b.selected){jade.HTMLUtils.removeClassName(b,"selected");
b.selected=false;this.a0--;return true;}return false;};
ItemManager.bo.toggleItem=function(b){if(b.selected){this.deselectItem(b);
}else{this.selectItem(b);}};
ItemManager.bo.deselect=function(b){if(this.deselectItem(b))this.changed();};
ItemManager.bo.select=function(b){if(this.selectItem(b))this.changed();};
ItemManager.bo.toggle=function(b){this.toggleItem(b);this.changed();};
ItemManager.bo.selectAll=function(){var _,a,e;e=this.aZ;for(_=0,a=e.length;_<a;
_++){this.selectItem(e[_]);}this.changed();};
ItemManager.bo.selectRange=function(aP,aQ){var _G,_H,_I,_J;var W,X,Y,Z;var F,G;
var _,a;var b;var _T=false;_G=aP.offsetLeft;_H=aP.offsetTop;_I=aQ.offsetLeft;
_J=aQ.offsetTop;if(_G<_I){W=_G;Y=_I+aQ.offsetWidth;}else{W=_I;
Y=_G+aP.offsetWidth;}if(_H<_J){X=_H;Z=_J+aQ.offsetHeight;}else{X=_J;
Z=_H+aP.offsetHeight;}for(_=0,a=this.aZ.length;_<a;_++){b=this.aZ[_];
F=b.offsetLeft+(b.offsetWidth>>1);G=b.offsetTop+(b.offsetHeight>>1);
if((F<W)||(F>Y))continue;if((G<X)||(G>Z))continue;_T|=this.selectItem(b);
}if(_T)this.changed();};ItemManager.bo.deselectAll=function(){var _,a,e;
e=this.aZ;for(_=0,a=e.length;_<a;_++){this.deselectItem(e[_]);}this.changed();};
ItemManager.bo.deselectAllOther=function(b){var _,a,e;e=this.aZ;
for(_=0,a=e.length;_<a;_++){if(e[_]!=b)this.deselectItem(e[_]);}this.changed();
};
ItemManager.bo.toggleAll=function(){if(this.a0==this.aZ.length-this.disabledCount){this.deselectAll();
}else{this.selectAll();}};
ItemManager.bo.changed=function(){if(this.onChange){this.onChange(this);}};
ItemManager.bo.getSelection=function(){var _,a,_T,e;_T=[];e=this.aZ;
for(_=0,a=e.length;_<a;_++){var b=e[_];if(b.selected)_T.push(e[_]);}return _T;};
ItemManager.bo.getItems=function(){return this.aZ;};
ItemManager.bo.getCanvas=function(){return this.canvas;};
ItemManager.bo.getSelectionCount=function(){return this.a0;};
ItemManager.bo.getItemsCount=function(){return this.aZ.length-this.disabledCount;
};ItemManager.bo.setDropTargets=function(aS){this.bm=aS;
this.updateDropTargetPositions();};
ItemManager.bo.updateDropTargetPositions=function(){var _,a;var Q;var _8;
var _9,a_,aa;for(_=0;_<this.bm.length;_++){Q=this.bm[_];_9=Q[1].parentNode;a_=0;
aa=0;while(_9&&_9.tagName!="BODY"){if(_9.scrollLeft)a_+=_9.scrollLeft;
if(_9.scrollTop)aa+=_9.scrollTop;_9=_9.parentNode;
}_8=jade.HTMLUtils.getDocumentOffset(Q[1]);_8.x-=a_;_8.y-=aa;
_8.width=Q[1].offsetWidth;_8.height=Q[1].offsetHeight;
this.dropTargetPositions[_]=_8;}};
ItemManager.bo.getMouseX=function(H){return H.layerX||H.offsetX||0;};
ItemManager.bo.getMouseY=function(H){return H.layerY||H.offsetY||0;};
ItemManager.bo.getAbsoluteMouseX=function(H){if(H.pageX){return H.pageX;
}else if(H.clientX){return H.clientX+(document.documentElement.scrollLeft?document.documentElement.scrollLeft:document.body.scrollLeft);
}else{return 0;}};
ItemManager.bo.getAbsoluteMouseY=function(H){if(H.pageY){return H.pageY;
}else if(H.clientY){return H.clientY+(document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop);
}else{return 0;}};
