/* Copyright (c) 1995-2008 Choice Hotels International, Inc. All Rights Reserved. */
var Dragable=$Class.create({_ctor:function(dragees,options){this.init=null;if(dragees instanceof Array)this.elems=$A(dragees);else this.elems=[dragees];if(!options)options={};var dragers=this.elems;if(options.dragers){if(options.dragers=="none")dragers=null;else {if(options.dragers instanceof Array)dragers=$A(options.dragers);else dragers=[options.dragers]}}if(dragers){var constraint=options.constraint||Dragable.noConstraint;var cfunc=options.vconstraint||function(elem,init){return constraint};var cursor=options.cursor||"move";if(cursor=="none")cursor=null;for(var i=dragers.length-1;i>=0;i--){if(cursor)dragers[i].style.cursor=cursor;this.addMouseDownHandler(dragers[i],cfunc);Event.addEventHandler(dragers[i],"mouseup",Dragable._endDrag)}}},addElement:function(elem){this.elems.push(elem)},addMouseDownHandler:function(elem,cfunc){Event.addEventHandler(elem,"mousedown",Event.handler(this._mouseDownEvent.bind(this,elem,cfunc)),false);elem.onmousedown=function(){return false}},_mouseDownEvent:function(elem,cfunc,event,target){Event.cancelBubble(event);Event.preventDefault(event);var initp=new Point(event.clientX,event.clientY);this.beginDrag(initp,cfunc(elem,initp),true);return false},beginDrag:function(init,func,endup){Dragable._beginDrag(this,init,func,endup)},okToMove:function(offset){return true},moved:function(offset){},okToDrag:function(){return true},draggingStarted:function(initial){},draggingEnded:function(initial,terminal){},_offset:function(offset){if(this.okToMove(offset)){for(var i=this.elems.length-1;i>=0;i--)Dragable._offsetElem(this.elems[i],offset);this.moved(offset)}}});Dragable._offsetElem=function(elem,offset){elem.style.left=elem.offsetLeft+offset.getX();elem.style.top=elem.offsetTop+offset.getY()};Dragable._beginDrag=function(dragable,init,func,endup){if(dragable.okToDrag()){Dragable._endDrag();Dragable.current=dragable;Dragable.offsetfunc=(func!=null)?func:Dragable.noConstraint;Dragable.initial=init;Dragable.position=init;Event.addEventHandler(document,endup?"mouseup":"mousedown",Dragable._endDrag,true);Event.addEventHandler(document,"mousemove",Dragable._moveHandler,true);document.onmousemove=function(event){return false};dragable.draggingStarted(init)}};Dragable._moveHandler=function(event){event=event||window.event;var pos=new Point(event.clientX,event.clientY);var prev=Dragable.position;Dragable.position=pos;Event.cancelBubble(event);Event.preventDefault(event);Dragable.current._offset(Dragable.offsetfunc(Dragable.current,prev,pos));return false};Dragable._endDrag=function(){if(Dragable.current){Dragable.current.draggingEnded(Dragable.initial,Dragable.position);Dragable.current=null}Event.removeEventHandler(document,"mousemove",Dragable._moveHandler,true);Event.removeEventHandler(document,"mouseup",Dragable._endDrag,true);Event.removeEventHandler(document,"mousedown",Dragable._endDrag,true);document.onmousemove=null};Dragable.noConstraint=function(dragable,init,term){return init.getDelta(term)};Dragable.horizontal=function(dragable,init,term){return new Point(term.getX()-init.getX(),0)};Dragable.vertical=function(dragable,init,term){return new Point(0,term.getY()-init.getY())};var DropTarget=$Class.create({_ctor:function(elem){DropTarget.targets.push(this);this.target=elem}});DropTarget.targets=new Array;var Point=$Class.create({_ctor:function(x,y){this.x=x;this.y=y},getX:function(){return this.x},getY:function(){return this.y},offset:function(x,y){this.x+=x;this.y+=y},add:function(p){this.x+=p.x;this.y+=p.y},getDelta:function(p){return new Point(p.x-this.x,p.y-this.y)},toString:function(){return "("+this.x+","+this.y+")"}});