/************************************************************************
Hexagora Generic Drag Engine
/////////////////////////////////////////////////////////////////////////
Created by Lorenzi Davide (http://www.hexagora.com) for Dynamic HTML Editor 5.x
Needs prototype 1.6
You cannot use this library in a project not made by Dynamic HTML Editor
*************************************************************************/

if((typeof Prototype=="undefined")||(typeof Element=="undefined")||(typeof Element.Methods=="undefined")){alert("DragEngine requires the prototype extension on your page!")}function DragEngine(){this.dragTypeEnum={move:0,copy:1};this.dropTargets=[];this.makeDraggable=function(a,e,c){if(this.mouseDownId){alert("You already setup a Draggable element, use another instance of this class to manage multiple elements");return}this.mouseDownId=a;this.mouseMoveId=e;if(!this.mouseMoveId){this.mouseMoveId=a}this.dragType=c;var b=$(this.mouseDownId);if(!b){alert("The element '"+this.mouseDownId+"' cannot be dragged, use absolute positioning");return false}var d=$(this.mouseMoveId);if(!d){alert("The element '"+this.mouseMoveId+"' cannot be dragged, use absolute positioning");return false}Event.observe(b,"mousedown",this._dragMouseDown.bindAsEventListener(this))};this.addDropTarget=function(b,a){var c=$(b);if(!c){alert("The element '"+b+"' cannot be used as Drop Target, use absolute positioning");return false}if(typeof(a)=="string"){a=window[a]}this.dropTargets.push({id:b,cb:a})};this._dragMouseDown=function(a){this.mousedown=true;var e=Event.pointerX(a);var d=Event.pointerY(a);var b=Event.element(a);this.dragging=false;this.dragpointer=null;this.dragsource=$(this.mouseMoveId);this.diffx=0;this.diffy=0;if(this.dragsource){var c=this.dragsource.cumulativeOffset();this.diffx=e-c.left;this.diffy=d-c.top}this._stopObservingOnDoc();this._dragMouseMove_b=this._dragMouseMove.bindAsEventListener(this);this._dragMouseUp_b=this._dragMouseUp.bindAsEventListener(this);Event.observe(document,"mousemove",this._dragMouseMove_b);Event.observe(document,"mouseup",this._dragMouseUp_b);Event.stop(a);return false};this._dragMouseMove=function(a){if(!this.mousedown){return}var d=Event.pointerX(a);var c=Event.pointerY(a);var b=Event.element(a);if(this.dragsource){if(this.dragType==this.dragTypeEnum.copy){this.dragpointer=$(document.body.appendChild(document.createElement("DIV")));this.dragpointer.className="DragEngineMouseMove";this.dragpointer.style.width=this.dragsource.getWidth();this.dragpointer.style.height=this.dragsource.getHeight();this.dragpointer.innerHTML=this.dragsource.innerHTML}else{if(this.dragType==this.dragTypeEnum.move){this.dragsource=this.dragsource.parentNode.removeChild(this.dragsource);this.dragsource=$(document.body.appendChild(this.dragsource));this.dragpointer=this.dragsource;this.dragpointer.addClassName("DragEngineMouseMove")}}this.dragging=true;this.dragsource=null}if(this.dragging&&this.dragpointer){this.dragpointer.style.left=d-this.diffx;this.dragpointer.style.top=c-this.diffy;this.dragpointer.focus();Event.stop(a);return false}};this._getDropIndex=function(b,g){for(var d=0;d<this.dropTargets.length;d++){var f=this.dropTargets[d].id;var a=this.dropTargets[d].cb;var e=$(f);if(e){var c=e.cumulativeOffset();if((b>=c.left&&b<=c.left+e.offsetWidth)&&(g>=c.top&&g<=c.top+e.offsetHeight)){return d}}}return -1};this._dragMouseUp=function(b){this.mousedown=false;if(!this.dragpointer){return}var g=Event.pointerX(b);var d=Event.pointerY(b);var c=Event.element(b);this._stopObservingOnDoc();if(this.dragType==this.dragTypeEnum.copy){if(this.dragpointer){this.dragpointer.parentNode.removeChild(this.dragpointer);this.dragpointer=null}}else{if(this.dragType==this.dragTypeEnum.move){this.dragpointer.removeClassName("DragEngineMouseMove")}}this.dragging=false;if(this.dropTargets.length>0){var f=this._getDropIndex(g,d);if(f!=-1){var i=this.dropTargets[f].id;var a=this.dropTargets[f].cb;if(a){try{a({src:this.mouseMoveId,dst:i})}catch(h){alert("Error "+h.name+" "+h.description)}}}}Event.stop(b);return false};this._stopObservingOnDoc=function(){if(this._dragMouseMove_b){Event.stopObserving(document,"mousemove",this._dragMouseMove_b);this._dragMouseMove_b=null}if(this._dragMouseUp_b){Event.stopObserving(document,"mouseup",this._dragMouseUp_b);this._dragMouseUp_b=null}};this.dispose=function(){this._stopObservingOnDoc();var a=$(this.mouseDownId);if(a){Event.stopObserving(a)}}};