/**********************************************************
 Very minorly modified from the example by Tim Taylor
 http://tool-man.org/examples/sorting.html
 
 Added Coordinate.prototype.inside( northwest, southeast );

Extended by Bernd Rudolf:
08.08.2007 Added northwestOffset(..., addsubScrollOffset) to
	determine the position within scrolled divs absolute to the document
	addsubScrollOffset can be -1, 0 or 1

24.10.2008 changed northwestOffset to use offsetParent and determine the scrollOffset seperately 
 **********************************************************/
var Coordinates={ORIGIN:new Coordinate(0,0),center:function(element){return Coordinates.northwestOffset(element,true).plus(new Coordinate(Math.round(element.offsetWidth/2),Math.round(element.offsetHeight/2)));},scrollOffset:function(element){return new Coordinate(element.scrollTop,element.scrollLeft);},northwestPosition:function(element){var x=parseInt(element.style.left);var y=parseInt(element.style.top);return new Coordinate(isNaN(x)?0:x,isNaN(y)?0:y);},southeastPosition:function(element){return Coordinates.northwestPosition(element).plus(new Coordinate(element.offsetWidth,element.offsetHeight));},northwestOffset:function(element,isRecursive,addsubScrollOffset){var offset=new Coordinate(element.offsetLeft,element.offsetTop);addsubScrollOffset=addsubScrollOffset?addsubScrollOffset:0;if(!isRecursive){return offset;}var parent=element.offsetParent;while(parent){if(parent.nodeName!="BODY"){offset=offset.plus(new Coordinate(parent.offsetLeft,parent.offsetTop));}else{offset=offset.plus(new Coordinate(parent.offsetLeft,parent.offsetTop));}parent=parent.offsetParent;}if(addsubScrollOffset!=0){var parent=element.parentNode;while(parent){if(parent.nodeName!="BODY"){offset=offset.plus(new Coordinate(addsubScrollOffset*parent.scrollLeft,addsubScrollOffset*parent.scrollTop));}else{break;}parent=parent.parentNode;}}return offset;},southeastOffset:function(element,isRecursive){return Coordinates.northwestOffset(element,isRecursive).plus(new Coordinate(element.offsetWidth,element.offsetHeight));},fixEvent:function(event){event.windowCoordinate=new Coordinate(event.clientX,event.clientY);}};function Coordinate(x,y){this.x=x;this.y=y;}Coordinate.prototype.toString=function(){return"("+this.x+","+this.y+")";};Coordinate.prototype.plus=function(that){return new Coordinate(this.x+that.x,this.y+that.y);};Coordinate.prototype.minus=function(that){return new Coordinate(this.x-that.x,this.y-that.y);};Coordinate.prototype.distance=function(that){var deltaX=this.x-that.x;var deltaY=this.y-that.y;return Math.sqrt(Math.pow(deltaX,2)+Math.pow(deltaY,2));};Coordinate.prototype.myDistance=function(that){var deltaX=this.x-that.x;var deltaY=this.y-that.y;return new Coordinate(deltaX,deltaY);};Coordinate.prototype.max=function(that){var x=Math.max(this.x,that.x);var y=Math.max(this.y,that.y);return new Coordinate(x,y);};Coordinate.prototype.constrain=function(min,max){if(min.x>max.x||min.y>max.y){return this;}var x=this.x;var y=this.y;if(min.x!=null){x=Math.max(x,min.x);}if(max.x!=null){x=Math.min(x,max.x);}if(min.y!=null){y=Math.max(y,min.y);}if(max.y!=null){y=Math.min(y,max.y);}return new Coordinate(x,y);};Coordinate.prototype.reposition=function(element){element.style["top"]=this.y+"px";element.style["left"]=this.x+"px";};Coordinate.prototype.equals=function(that){if(this==that){return true;}if(!that||that==null){return false;}return this.x==that.x&&this.y==that.y;};Coordinate.prototype.inside=function(northwest,southeast){if((this.x>=northwest.x)&&(this.x<=southeast.x)&&(this.y>=northwest.y)&&(this.y<=southeast.y)){return true;}return false;};
