/***
Code to support http://markmail.org.
Copyright 2007-2009 Mark Logic Corporation.  All Rights Reserved.
Version: 1267492188
***/

MochiKit.Base._deps('DragAndDrop',['Base','Iter','DOM','Signal','Visual','Position']);MochiKit.DragAndDrop.NAME='MochiKit.DragAndDrop';MochiKit.DragAndDrop.VERSION='1.4';MochiKit.DragAndDrop.__repr__=function(){return'['+this.NAME+' '+this.VERSION+']';};MochiKit.DragAndDrop.toString=function(){return this.__repr__();};MochiKit.DragAndDrop.EXPORT=["Droppable","Draggable"];MochiKit.DragAndDrop.EXPORT_OK=["Droppables","Draggables"];MochiKit.DragAndDrop.Droppables={drops:[],remove:function(element){this.drops=MochiKit.Base.filter(function(d){return d.element!=MochiKit.DOM.getElement(element);},this.drops);},register:function(drop){this.drops.push(drop);},unregister:function(drop){this.drops=MochiKit.Base.filter(function(d){return d!=drop;},this.drops);},prepare:function(element){MochiKit.Base.map(function(drop){if(drop.isAccepted(element)){if(drop.options.activeclass){MochiKit.DOM.addElementClass(drop.element,drop.options.activeclass);}
drop.options.onactive(drop.element,element);}},this.drops);},findDeepestChild:function(drops){deepest=drops[0];for(i=1;i<drops.length;++i){if(MochiKit.DOM.isParent(drops[i].element,deepest.element)){deepest=drops[i];}}
return deepest;},show:function(point,element){if(!this.drops.length){return;}
var affected=[];if(this.last_active){this.last_active.deactivate();}
MochiKit.Iter.forEach(this.drops,function(drop){if(drop.isAffected(point,element)){affected.push(drop);}});if(affected.length>0){drop=this.findDeepestChild(affected);MochiKit.Position.within(drop.element,point.page.x,point.page.y);drop.options.onhover(element,drop.element,MochiKit.Position.overlap(drop.options.overlap,drop.element));drop.activate();}},fire:function(event,element){if(!this.last_active){return;}
MochiKit.Position.prepare();if(this.last_active.isAffected(event.mouse(),element)){this.last_active.options.ondrop(element,this.last_active.element,event);}},reset:function(element){MochiKit.Base.map(function(drop){if(drop.options.activeclass){MochiKit.DOM.removeElementClass(drop.element,drop.options.activeclass);}
drop.options.ondesactive(drop.element,element);},this.drops);if(this.last_active){this.last_active.deactivate();}}};MochiKit.DragAndDrop.Droppable=function(element,options){var cls=arguments.callee;if(!(this instanceof cls)){return new cls(element,options);}
this.__init__(element,options);};MochiKit.DragAndDrop.Droppable.prototype={__class__:MochiKit.DragAndDrop.Droppable,__init__:function(element,options){var d=MochiKit.DOM;var b=MochiKit.Base;this.element=d.getElement(element);this.options=b.update({greedy:true,hoverclass:null,activeclass:null,hoverfunc:b.noop,accept:null,onactive:b.noop,ondesactive:b.noop,onhover:b.noop,ondrop:b.noop,containment:[],tree:false},options);this.options._containers=[];b.map(MochiKit.Base.bind(function(c){this.options._containers.push(d.getElement(c));},this),this.options.containment);d.makePositioned(this.element);MochiKit.DragAndDrop.Droppables.register(this);},isContained:function(element){if(this.options._containers.length){var containmentNode;if(this.options.tree){containmentNode=element.treeNode;}else{containmentNode=element.parentNode;}
return MochiKit.Iter.some(this.options._containers,function(c){return containmentNode==c;});}else{return true;}},isAccepted:function(element){return((!this.options.accept)||MochiKit.Iter.some(this.options.accept,function(c){return MochiKit.DOM.hasElementClass(element,c);}));},isAffected:function(point,element){return((this.element!=element)&&this.isContained(element)&&this.isAccepted(element)&&MochiKit.Position.within(this.element,point.page.x,point.page.y));},deactivate:function(){if(this.options.hoverclass){MochiKit.DOM.removeElementClass(this.element,this.options.hoverclass);}
this.options.hoverfunc(this.element,false);MochiKit.DragAndDrop.Droppables.last_active=null;},activate:function(){if(this.options.hoverclass){MochiKit.DOM.addElementClass(this.element,this.options.hoverclass);}
this.options.hoverfunc(this.element,true);MochiKit.DragAndDrop.Droppables.last_active=this;},destroy:function(){MochiKit.DragAndDrop.Droppables.unregister(this);},repr:function(){return'['+this.__class__.NAME+", options:"+MochiKit.Base.repr(this.options)+"]";}};MochiKit.DragAndDrop.Draggables={drags:[],register:function(draggable){if(this.drags.length===0){var conn=MochiKit.Signal.connect;this.eventMouseUp=conn(document,'onmouseup',this,this.endDrag);this.eventMouseMove=conn(document,'onmousemove',this,this.updateDrag);this.eventKeypress=conn(document,'onkeypress',this,this.keyPress);}
this.drags.push(draggable);},unregister:function(draggable){this.drags=MochiKit.Base.filter(function(d){return d!=draggable;},this.drags);if(this.drags.length===0){var disc=MochiKit.Signal.disconnect;disc(this.eventMouseUp);disc(this.eventMouseMove);disc(this.eventKeypress);}},activate:function(draggable){window.focus();this.activeDraggable=draggable;},deactivate:function(){this.activeDraggable=null;},updateDrag:function(event){if(!this.activeDraggable){return;}
var pointer=event.mouse();if(this._lastPointer&&(MochiKit.Base.repr(this._lastPointer.page)==MochiKit.Base.repr(pointer.page))){return;}
this._lastPointer=pointer;this.activeDraggable.updateDrag(event,pointer);},endDrag:function(event){if(!this.activeDraggable){return;}
this._lastPointer=null;this.activeDraggable.endDrag(event);this.activeDraggable=null;},keyPress:function(event){if(this.activeDraggable){this.activeDraggable.keyPress(event);}},notify:function(eventName,draggable,event){MochiKit.Signal.signal(this,eventName,draggable,event);}};MochiKit.DragAndDrop.Draggable=function(element,options){var cls=arguments.callee;if(!(this instanceof cls)){return new cls(element,options);}
this.__init__(element,options);};MochiKit.DragAndDrop.Draggable.prototype={__class__:MochiKit.DragAndDrop.Draggable,__init__:function(element,options){var v=MochiKit.Visual;var b=MochiKit.Base;options=b.update({handle:false,starteffect:function(innerelement){this._savedOpacity=MochiKit.Style.getStyle(innerelement,'opacity')||1.0;new v.Opacity(innerelement,{duration:0.2,from:this._savedOpacity,to:0.7});},reverteffect:function(innerelement,top_offset,left_offset){var dur=Math.sqrt(Math.abs(top_offset^2)+
Math.abs(left_offset^2))*0.02;return new v.Move(innerelement,{x:-left_offset,y:-top_offset,duration:dur});},endeffect:function(innerelement){new v.Opacity(innerelement,{duration:0.2,from:0.7,to:this._savedOpacity});},onchange:b.noop,zindex:1000,revert:false,scroll:false,scrollSensitivity:20,scrollSpeed:15,snap:false},options);var d=MochiKit.DOM;this.element=d.getElement(element);if(options.handle&&(typeof(options.handle)=='string')){this.handle=d.getFirstElementByTagAndClassName(null,options.handle,this.element);}
if(!this.handle){this.handle=d.getElement(options.handle);}
if(!this.handle){this.handle=this.element;}
if(options.scroll&&!options.scroll.scrollTo&&!options.scroll.outerHTML){options.scroll=d.getElement(options.scroll);this._isScrollChild=MochiKit.DOM.isChildNode(this.element,options.scroll);}
d.makePositioned(this.element);this.delta=this.currentDelta();this.options=options;this.dragging=false;this.eventMouseDown=MochiKit.Signal.connect(this.handle,'onmousedown',this,this.initDrag);MochiKit.DragAndDrop.Draggables.register(this);},destroy:function(){MochiKit.Signal.disconnect(this.eventMouseDown);MochiKit.DragAndDrop.Draggables.unregister(this);},currentDelta:function(){var s=MochiKit.Style.getStyle;return[parseInt(s(this.element,'left')||'0'),parseInt(s(this.element,'top')||'0')];},initDrag:function(event){if(!event.mouse().button.left){return;}
var src=event.target();var tagName=(src.tagName||'').toUpperCase();if(tagName==='INPUT'||tagName==='SELECT'||tagName==='OPTION'||tagName==='BUTTON'||tagName==='TEXTAREA'){return;}
if(this._revert){this._revert.cancel();this._revert=null;}
var pointer=event.mouse();var pos=MochiKit.Position.cumulativeOffset(this.element);this.offset=[pointer.page.x-pos.x,pointer.page.y-pos.y];MochiKit.DragAndDrop.Draggables.activate(this);event.stop();},startDrag:function(event){this.dragging=true;if(this.options.selectclass){MochiKit.DOM.addElementClass(this.element,this.options.selectclass);}
if(this.options.zindex){this.originalZ=parseInt(MochiKit.Style.getStyle(this.element,'z-index')||'0');this.element.style.zIndex=this.options.zindex;}
if(this.options.ghosting){this._clone=this.element.cloneNode(true);this.ghostPosition=MochiKit.Position.absolutize(this.element);this.element.parentNode.insertBefore(this._clone,this.element);}
if(this.options.scroll){if(this.options.scroll==window){var where=this._getWindowScroll(this.options.scroll);this.originalScrollLeft=where.left;this.originalScrollTop=where.top;}else{this.originalScrollLeft=this.options.scroll.scrollLeft;this.originalScrollTop=this.options.scroll.scrollTop;}}
MochiKit.DragAndDrop.Droppables.prepare(this.element);MochiKit.DragAndDrop.Draggables.notify('start',this,event);if(this.options.starteffect){this.options.starteffect(this.element);}},updateDrag:function(event,pointer){if(!this.dragging){this.startDrag(event);}
MochiKit.Position.prepare();MochiKit.DragAndDrop.Droppables.show(pointer,this.element);MochiKit.DragAndDrop.Draggables.notify('drag',this,event);this.draw(pointer);this.options.onchange(this);if(this.options.scroll){this.stopScrolling();var p,q;if(this.options.scroll==window){var s=this._getWindowScroll(this.options.scroll);p=new MochiKit.Style.Coordinates(s.left,s.top);q=new MochiKit.Style.Coordinates(s.left+s.width,s.top+s.height);}else{p=MochiKit.Position.page(this.options.scroll);p.x+=this.options.scroll.scrollLeft;p.y+=this.options.scroll.scrollTop;p.x+=(window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0);p.y+=(window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0);q=new MochiKit.Style.Coordinates(p.x+this.options.scroll.offsetWidth,p.y+this.options.scroll.offsetHeight);}
var speed=[0,0];if(pointer.page.x>(q.x-this.options.scrollSensitivity)){speed[0]=pointer.page.x-(q.x-this.options.scrollSensitivity);}else if(pointer.page.x<(p.x+this.options.scrollSensitivity)){speed[0]=pointer.page.x-(p.x+this.options.scrollSensitivity);}
if(pointer.page.y>(q.y-this.options.scrollSensitivity)){speed[1]=pointer.page.y-(q.y-this.options.scrollSensitivity);}else if(pointer.page.y<(p.y+this.options.scrollSensitivity)){speed[1]=pointer.page.y-(p.y+this.options.scrollSensitivity);}
this.startScrolling(speed);}
if(/AppleWebKit/.test(navigator.appVersion)){window.scrollBy(0,0);}
event.stop();},finishDrag:function(event,success){var dr=MochiKit.DragAndDrop;this.dragging=false;if(this.options.selectclass){MochiKit.DOM.removeElementClass(this.element,this.options.selectclass);}
if(this.options.ghosting){MochiKit.Position.relativize(this.element,this.ghostPosition);MochiKit.DOM.removeElement(this._clone);this._clone=null;}
if(success){dr.Droppables.fire(event,this.element);}
dr.Draggables.notify('end',this,event);var revert=this.options.revert;if(revert&&typeof(revert)=='function'){revert=revert(this.element);}
var d=this.currentDelta();if(revert&&this.options.reverteffect){this._revert=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);}
dr.Draggables.deactivate();dr.Droppables.reset(this.element);},keyPress:function(event){if(event.key().string!="KEY_ESCAPE"){return;}
this.finishDrag(event,false);event.stop();},endDrag:function(event){if(!this.dragging){return;}
this.stopScrolling();this.finishDrag(event,true);event.stop();},draw:function(point){var pos=MochiKit.Position.cumulativeOffset(this.element);var d=this.currentDelta();pos.x-=d[0];pos.y-=d[1];if(this.options.scroll&&(this.options.scroll!=window&&this._isScrollChild)){pos.x-=this.options.scroll.scrollLeft-this.originalScrollLeft;pos.y-=this.options.scroll.scrollTop-this.originalScrollTop;}
var p=[point.page.x-pos.x-this.offset[0],point.page.y-pos.y-this.offset[1]];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){var i=-1;p=MochiKit.Base.map(MochiKit.Base.bind(function(v){i+=1;return Math.round(v/this.options.snap[i])*this.options.snap[i];},this),p);}else{p=MochiKit.Base.map(MochiKit.Base.bind(function(v){return Math.round(v/this.options.snap)*this.options.snap;},this),p);}}}
var style=this.element.style;if((!this.options.constraint)||(this.options.constraint=='horizontal')){style.left=p[0]+'px';}
if((!this.options.constraint)||(this.options.constraint=='vertical')){style.top=p[1]+'px';}
if(style.visibility=='hidden'){style.visibility='';}},stopScrolling:function(){if(this.scrollInterval){clearInterval(this.scrollInterval);this.scrollInterval=null;MochiKit.DragAndDrop.Draggables._lastScrollPointer=null;}},startScrolling:function(speed){if(!speed[0]&&!speed[1]){return;}
this.scrollSpeed=[speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];this.lastScrolled=new Date();this.scrollInterval=setInterval(MochiKit.Base.bind(this.scroll,this),10);},scroll:function(){var current=new Date();var delta=current-this.lastScrolled;this.lastScrolled=current;if(this.options.scroll==window){var s=this._getWindowScroll(this.options.scroll);if(this.scrollSpeed[0]||this.scrollSpeed[1]){var dm=delta/1000;this.options.scroll.scrollTo(s.left+dm*this.scrollSpeed[0],s.top+dm*this.scrollSpeed[1]);}}else{this.options.scroll.scrollLeft+=this.scrollSpeed[0]*delta/1000;this.options.scroll.scrollTop+=this.scrollSpeed[1]*delta/1000;}
var d=MochiKit.DragAndDrop;MochiKit.Position.prepare();d.Droppables.show(d.Draggables._lastPointer,this.element);d.Draggables.notify('drag',this);if(this._isScrollChild){d.Draggables._lastScrollPointer=d.Draggables._lastScrollPointer||d.Draggables._lastPointer;d.Draggables._lastScrollPointer.x+=this.scrollSpeed[0]*delta/1000;d.Draggables._lastScrollPointer.y+=this.scrollSpeed[1]*delta/1000;if(d.Draggables._lastScrollPointer.x<0){d.Draggables._lastScrollPointer.x=0;}
if(d.Draggables._lastScrollPointer.y<0){d.Draggables._lastScrollPointer.y=0;}
this.draw(d.Draggables._lastScrollPointer);}
this.options.onchange(this);},_getWindowScroll:function(win){var vp,w,h;MochiKit.DOM.withWindow(win,function(){vp=MochiKit.Style.getViewportPosition(win.document);});if(win.innerWidth){w=win.innerWidth;h=win.innerHeight;}else if(win.document.documentElement&&win.document.documentElement.clientWidth){w=win.document.documentElement.clientWidth;h=win.document.documentElement.clientHeight;}else{w=win.document.body.offsetWidth;h=win.document.body.offsetHeight;}
return{top:vp.y,left:vp.x,width:w,height:h};},repr:function(){return'['+this.__class__.NAME+", options:"+MochiKit.Base.repr(this.options)+"]";}};MochiKit.DragAndDrop.__new__=function(){MochiKit.Base.nameFunctions(this);this.EXPORT_TAGS={":common":this.EXPORT,":all":MochiKit.Base.concat(this.EXPORT,this.EXPORT_OK)};};MochiKit.DragAndDrop.__new__();MochiKit.Base._exportSymbols(this,MochiKit.DragAndDrop);