// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// 
// See scriptaculous.js for full license.
var Droppables={drops:[],remove:function(_1){
this.drops=this.drops.reject(function(d){
return d.element==$(_1);
});
},add:function(_3){
_3=$(_3);
var _4=Object.extend({greedy:true,hoverclass:null},arguments[1]||{});
if(_4.containment){
_4._containers=[];
var _5=_4.containment;
if((typeof _5=="object")&&(_5.constructor==Array)){
_5.each(function(c){
_4._containers.push($(c));
});
}else{
_4._containers.push($(_5));
}
}
if(_4.accept){
_4.accept=[_4.accept].flatten();
}
Element.makePositioned(_3);
_4.element=_3;
this.drops.push(_4);
},isContained:function(_7,_8){
var _9=_7.parentNode;
return _8._containers.detect(function(c){
return _9==c;
});
},isAffected:function(_b,_c,_d){
return ((_d.element!=_c)&&((!_d._containers)||this.isContained(_c,_d))&&((!_d.accept)||(Element.classNames(_c).detect(function(v){
return _d.accept.include(v);
})))&&Position.within(_d.element,_b[0],_b[1]));
},deactivate:function(_f){
if(_f.hoverclass){
Element.removeClassName(_f.element,_f.hoverclass);
}
this.last_active=null;
},activate:function(_10){
if(_10.hoverclass){
Element.addClassName(_10.element,_10.hoverclass);
}
this.last_active=_10;
},show:function(_11,_12){
if(!this.drops.length){
return;
}
if(this.last_active){
this.deactivate(this.last_active);
}
this.drops.each(function(_13){
if(Droppables.isAffected(_11,_12,_13)){
if(_13.onHover){
_13.onHover(_12,_13.element,Position.overlap(_13.overlap,_13.element));
}
if(_13.greedy){
Droppables.activate(_13);
throw $break;
}
}
});
},fire:function(_14,_15){
if(!this.last_active){
return;
}
Position.prepare();
if(this.isAffected([Event.pointerX(_14),Event.pointerY(_14)],_15,this.last_active)){
if(this.last_active.onDrop){
this.last_active.onDrop(_15,this.last_active.element,_14);
}
}
},reset:function(){
if(this.last_active){
this.deactivate(this.last_active);
}
}};
var Draggables={drags:[],observers:[],register:function(_16){
if(this.drags.length==0){
this.eventMouseUp=this.endDrag.bindAsEventListener(this);
this.eventMouseMove=this.updateDrag.bindAsEventListener(this);
this.eventKeypress=this.keyPress.bindAsEventListener(this);
Event.observe(document,"mouseup",this.eventMouseUp);
Event.observe(document,"mousemove",this.eventMouseMove);
Event.observe(document,"keypress",this.eventKeypress);
}
this.drags.push(_16);
},unregister:function(_17){
this.drags=this.drags.reject(function(d){
return d==_17;
});
if(this.drags.length==0){
Event.stopObserving(document,"mouseup",this.eventMouseUp);
Event.stopObserving(document,"mousemove",this.eventMouseMove);
Event.stopObserving(document,"keypress",this.eventKeypress);
}
},activate:function(_19){
window.focus();
this.activeDraggable=_19;
},deactivate:function(){
this.activeDraggable=null;
},updateDrag:function(_1a){
if(!this.activeDraggable){
return;
}
var _1b=[Event.pointerX(_1a),Event.pointerY(_1a)];
if(this._lastPointer&&(this._lastPointer.inspect()==_1b.inspect())){
return;
}
this._lastPointer=_1b;
this.activeDraggable.updateDrag(_1a,_1b);
},endDrag:function(_1c){
if(!this.activeDraggable){
return;
}
this._lastPointer=null;
this.activeDraggable.endDrag(_1c);
this.activeDraggable=null;
},keyPress:function(_1d){
if(this.activeDraggable){
this.activeDraggable.keyPress(_1d);
}
},addObserver:function(_1e){
this.observers.push(_1e);
this._cacheObserverCallbacks();
},removeObserver:function(_1f){
this.observers=this.observers.reject(function(o){
return o.element==_1f;
});
this._cacheObserverCallbacks();
},notify:function(_21,_22,_23){
if(this[_21+"Count"]>0){
this.observers.each(function(o){
if(o[_21]){
o[_21](_21,_22,_23);
}
});
}
},_cacheObserverCallbacks:function(){
["onStart","onEnd","onDrag"].each(function(_25){
Draggables[_25+"Count"]=Draggables.observers.select(function(o){
return o[_25];
}).length;
});
}};
var Draggable=Class.create();
Draggable.prototype={initialize:function(_27){
var _28=Object.extend({handle:false,starteffect:function(_29){
new Effect.Opacity(_29,{duration:0.2,from:1,to:0.7});
},reverteffect:function(_2a,_2b,_2c){
var dur=Math.sqrt(Math.abs(_2b^2)+Math.abs(_2c^2))*0.02;
_2a._revert=new Effect.Move(_2a,{x:-_2c,y:-_2b,duration:dur});
},endeffect:function(_2e){
new Effect.Opacity(_2e,{duration:0.2,from:0.7,to:1});
},zindex:1000,revert:false,scroll:false,scrollSensitivity:20,scrollSpeed:15,snap:false},arguments[1]||{});
this.element=$(_27);
if(_28.handle&&(typeof _28.handle=="string")){
this.handle=Element.childrenWithClassName(this.element,_28.handle)[0];
}
if(!this.handle){
this.handle=$(_28.handle);
}
if(!this.handle){
this.handle=this.element;
}
if(_28.scroll){
_28.scroll=$(_28.scroll);
}
Element.makePositioned(this.element);
this.delta=this.currentDelta();
this.options=_28;
this.dragging=false;
this.eventMouseDown=this.initDrag.bindAsEventListener(this);
Event.observe(this.handle,"mousedown",this.eventMouseDown);
Draggables.register(this);
},destroy:function(){
Event.stopObserving(this.handle,"mousedown",this.eventMouseDown);
Draggables.unregister(this);
},currentDelta:function(){
return ([parseInt(Element.getStyle(this.element,"left")||"0"),parseInt(Element.getStyle(this.element,"top")||"0")]);
},initDrag:function(_2f){
if(Event.isLeftClick(_2f)){
var src=Event.element(_2f);
if(src.tagName&&(src.tagName=="INPUT"||src.tagName=="SELECT"||src.tagName=="OPTION"||src.tagName=="BUTTON"||src.tagName=="TEXTAREA")){
return;
}
if(this.element._revert){
this.element._revert.cancel();
this.element._revert=null;
}
var _31=[Event.pointerX(_2f),Event.pointerY(_2f)];
var pos=Position.cumulativeOffset(this.element);
this.offset=[0,1].map(function(i){
return (_31[i]-pos[i]);
});
Draggables.activate(this);
Event.stop(_2f);
}
},startDrag:function(_34){
this.dragging=true;
if(this.options.zindex){
this.originalZ=parseInt(Element.getStyle(this.element,"z-index")||0);
this.element.style.zIndex=this.options.zindex;
}
if(this.options.ghosting){
this._clone=this.element.cloneNode(true);
Position.absolutize(this.element);
this.element.parentNode.insertBefore(this._clone,this.element);
}
if(this.options.scroll){
this.originalScrollLeft=this.options.scroll.scrollLeft;
this.originalScrollTop=this.options.scroll.scrollTop;
}
Draggables.notify("onStart",this,_34);
if(this.options.starteffect){
this.options.starteffect(this.element);
}
},updateDrag:function(_35,_36){
if(!this.dragging){
this.startDrag(_35);
}
Position.prepare();
Droppables.show(_36,this.element);
Draggables.notify("onDrag",this,_35);
this.draw(_36);
if(this.options.change){
this.options.change(this);
}
if(this.options.scroll){
this.stopScrolling();
var p=Position.page(this.options.scroll);
p[0]+=this.options.scroll.scrollLeft;
p[1]+=this.options.scroll.scrollTop;
p.push(p[0]+this.options.scroll.offsetWidth);
p.push(p[1]+this.options.scroll.offsetHeight);
var _38=[0,0];
if(_36[0]<(p[0]+this.options.scrollSensitivity)){
_38[0]=_36[0]-(p[0]+this.options.scrollSensitivity);
}
if(_36[1]<(p[1]+this.options.scrollSensitivity)){
_38[1]=_36[1]-(p[1]+this.options.scrollSensitivity);
}
if(_36[0]>(p[2]-this.options.scrollSensitivity)){
_38[0]=_36[0]-(p[2]-this.options.scrollSensitivity);
}
if(_36[1]>(p[3]-this.options.scrollSensitivity)){
_38[1]=_36[1]-(p[3]-this.options.scrollSensitivity);
}
this.startScrolling(_38);
}
if(navigator.appVersion.indexOf("AppleWebKit")>0){
window.scrollBy(0,0);
}
Event.stop(_35);
},finishDrag:function(_39,_3a){
this.dragging=false;
if(this.options.ghosting){
Position.relativize(this.element);
Element.remove(this._clone);
this._clone=null;
}
if(_3a){
Droppables.fire(_39,this.element);
}
Draggables.notify("onEnd",this,_39);
var _3b=this.options.revert;
if(_3b&&typeof _3b=="function"){
_3b=_3b(this.element);
}
var d=this.currentDelta();
if(_3b&&this.options.reverteffect){
this.options.reverteffect(this.element,d[1]-this.delta[1],d[0]-this.delta[0]);
}else{
this.delta=d;
}
if(this.options.zindex){
this.element.style.zIndex=this.originalZ;
}
if(this.options.endeffect){
this.options.endeffect(this.element);
}
Draggables.deactivate(this);
Droppables.reset();
},keyPress:function(_3d){
if(_3d.keyCode!=Event.KEY_ESC){
return;
}
this.finishDrag(_3d,false);
Event.stop(_3d);
},endDrag:function(_3e){
if(!this.dragging){
return;
}
this.stopScrolling();
this.finishDrag(_3e,true);
Event.stop(_3e);
},draw:function(_3f){
var pos=Position.cumulativeOffset(this.element);
var d=this.currentDelta();
pos[0]-=d[0];
pos[1]-=d[1];
if(this.options.scroll){
pos[0]-=this.options.scroll.scrollLeft-this.originalScrollLeft;
pos[1]-=this.options.scroll.scrollTop-this.originalScrollTop;
}
var p=[0,1].map(function(i){
return (_3f[i]-pos[i]-this.offset[i]);
}.bind(this));
if(this.options.snap){
if(typeof this.options.snap=="function"){
p=this.options.snap(p[0],p[1]);
}else{
if(this.options.snap instanceof Array){
p=p.map(function(v,i){
return Math.round(v/this.options.snap[i])*this.options.snap[i];
}.bind(this));
}else{
p=p.map(function(v){
return Math.round(v/this.options.snap)*this.options.snap;
}.bind(this));
}
}
}
var _47=this.element.style;
if((!this.options.constraint)||(this.options.constraint=="horizontal")){
_47.left=p[0]+"px";
}
if((!this.options.constraint)||(this.options.constraint=="vertical")){
_47.top=p[1]+"px";
}
if(_47.visibility=="hidden"){
_47.visibility="";
}
},stopScrolling:function(){
if(this.scrollInterval){
clearInterval(this.scrollInterval);
this.scrollInterval=null;
}
},startScrolling:function(_48){
this.scrollSpeed=[_48[0]*this.options.scrollSpeed,_48[1]*this.options.scrollSpeed];
this.lastScrolled=new Date();
this.scrollInterval=setInterval(this.scroll.bind(this),10);
},scroll:function(){
var _49=new Date();
var _4a=_49-this.lastScrolled;
this.lastScrolled=_49;
this.options.scroll.scrollLeft+=this.scrollSpeed[0]*_4a/1000;
this.options.scroll.scrollTop+=this.scrollSpeed[1]*_4a/1000;
Position.prepare();
Droppables.show(Draggables._lastPointer,this.element);
Draggables.notify("onDrag",this);
this.draw(Draggables._lastPointer);
if(this.options.change){
this.options.change(this);
}
}};
var SortableObserver=Class.create();
SortableObserver.prototype={initialize:function(_4b,_4c){
this.element=$(_4b);
this.observer=_4c;
this.lastValue=Sortable.serialize(this.element);
},onStart:function(){
this.lastValue=Sortable.serialize(this.element);
},onEnd:function(){
Sortable.unmark();
if(this.lastValue!=Sortable.serialize(this.element)){
this.observer(this.element);
}
}};
var Sortable={sortables:new Array(),options:function(_4d){
_4d=$(_4d);
return this.sortables.detect(function(s){
return s.element==_4d;
});
},destroy:function(_4f){
_4f=$(_4f);
this.sortables.findAll(function(s){
return s.element==_4f;
}).each(function(s){
Draggables.removeObserver(s.element);
s.droppables.each(function(d){
Droppables.remove(d);
});
s.draggables.invoke("destroy");
});
this.sortables=this.sortables.reject(function(s){
return s.element==_4f;
});
},create:function(_54){
_54=$(_54);
var _55=Object.extend({element:_54,tag:"li",dropOnEmpty:false,tree:false,overlap:"vertical",constraint:"vertical",containment:_54,handle:false,only:false,hoverclass:null,ghosting:false,scroll:false,format:/^[^_]*_(.*)$/,onChange:Prototype.emptyFunction,onUpdate:Prototype.emptyFunction},arguments[1]||{});
this.destroy(_54);
var _56={revert:true,scroll:_55.scroll,ghosting:_55.ghosting,constraint:_55.constraint,handle:_55.handle};
if(_55.starteffect){
_56.starteffect=_55.starteffect;
}
if(_55.reverteffect){
_56.reverteffect=_55.reverteffect;
}else{
if(_55.ghosting){
_56.reverteffect=function(_57){
_57.style.top=0;
_57.style.left=0;
};
}
}
if(_55.endeffect){
_56.endeffect=_55.endeffect;
}
if(_55.zindex){
_56.zindex=_55.zindex;
}
var _58={overlap:_55.overlap,containment:_55.containment,hoverclass:_55.hoverclass,onHover:Sortable.onHover,greedy:!_55.dropOnEmpty};
Element.cleanWhitespace(_54);
_55.draggables=[];
_55.droppables=[];
if(_55.dropOnEmpty){
Droppables.add(_54,{containment:_55.containment,onHover:Sortable.onEmptyHover,greedy:false});
_55.droppables.push(_54);
}
(this.findElements(_54,_55)||[]).each(function(e){
var _5a=_55.handle?Element.childrenWithClassName(e,_55.handle)[0]:e;
_55.draggables.push(new Draggable(e,Object.extend(_56,{handle:_5a})));
Droppables.add(e,_58);
_55.droppables.push(e);
});
this.sortables.push(_55);
Draggables.addObserver(new SortableObserver(_54,_55.onUpdate));
},findElements:function(_5b,_5c){
if(!_5b.hasChildNodes()){
return null;
}
var _5d=[];
$A(_5b.childNodes).each(function(e){
if(e.tagName&&e.tagName.toUpperCase()==_5c.tag.toUpperCase()&&(!_5c.only||(Element.hasClassName(e,_5c.only)))){
_5d.push(e);
}
if(_5c.tree){
var _5f=this.findElements(e,_5c);
if(_5f){
_5d.push(_5f);
}
}
});
return (_5d.length>0?_5d.flatten():null);
},onHover:function(_60,_61,_62){
if(_62>0.5){
Sortable.mark(_61,"before");
if(_61.previousSibling!=_60){
var _63=_60.parentNode;
_60.style.visibility="hidden";
_61.parentNode.insertBefore(_60,_61);
if(_61.parentNode!=_63){
Sortable.options(_63).onChange(_60);
}
Sortable.options(_61.parentNode).onChange(_60);
}
}else{
Sortable.mark(_61,"after");
var _64=_61.nextSibling||null;
if(_64!=_60){
var _63=_60.parentNode;
_60.style.visibility="hidden";
_61.parentNode.insertBefore(_60,_64);
if(_61.parentNode!=_63){
Sortable.options(_63).onChange(_60);
}
Sortable.options(_61.parentNode).onChange(_60);
}
}
},onEmptyHover:function(_65,_66){
if(_65.parentNode!=_66){
var _67=_65.parentNode;
_66.appendChild(_65);
Sortable.options(_67).onChange(_65);
Sortable.options(_66).onChange(_65);
}
},unmark:function(){
if(Sortable._marker){
Element.hide(Sortable._marker);
}
},mark:function(_68,_69){
var _6a=Sortable.options(_68.parentNode);
if(_6a&&!_6a.ghosting){
return;
}
if(!Sortable._marker){
Sortable._marker=$("dropmarker")||document.createElement("DIV");
Element.hide(Sortable._marker);
Element.addClassName(Sortable._marker,"dropmarker");
Sortable._marker.style.position="absolute";
document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
}
var _6b=Position.cumulativeOffset(_68);
Sortable._marker.style.left=_6b[0]+"px";
Sortable._marker.style.top=_6b[1]+"px";
if(_69=="after"){
if(_6a.overlap=="horizontal"){
Sortable._marker.style.left=(_6b[0]+_68.clientWidth)+"px";
}else{
Sortable._marker.style.top=(_6b[1]+_68.clientHeight)+"px";
}
}
Element.show(Sortable._marker);
},sequence:function(_6c){
_6c=$(_6c);
var _6d=Object.extend(this.options(_6c),arguments[1]||{});
return $(this.findElements(_6c,_6d)||[]).map(function(_6e){
return _6e.id.match(_6d.format)?_6e.id.match(_6d.format)[1]:"";
});
},setSequence:function(_6f,_70){
_6f=$(_6f);
var _71=Object.extend(this.options(_6f),arguments[2]||{});
var _72={};
this.findElements(_6f,_71).each(function(n){
if(n.id.match(_71.format)){
_72[n.id.match(_71.format)[1]]=[n,n.parentNode];
}
n.parentNode.removeChild(n);
});
_70.each(function(_74){
var n=_72[_74];
if(n){
n[1].appendChild(n[0]);
delete _72[_74];
}
});
},serialize:function(_76){
_76=$(_76);
var _77=encodeURIComponent((arguments[1]&&arguments[1].name)?arguments[1].name:_76.id);
return Sortable.sequence(_76,arguments[1]).map(function(_78){
return _77+"[]="+encodeURIComponent(_78);
}).join("&");
}};