var Coordinates={ORIGIN:new Coordinate(0,0),coordinatesData:function(element,recurse){var data={};data.recurse=recurse;data.size=new Coordinate(element.offsetWidth,element.offsetHeight);data.nwOffset=Coordinates.northwestOffset(element,recurse);data.seOffset=data.nwOffset.plus(data.size);data.midPoint=data.nwOffset.plus(new Coordinate(Math.round(data.size.x/2),Math.round(data.size.y/2)));return data;},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){var offset=new Coordinate(element.offsetLeft,element.offsetTop);if(!isRecursive)return offset;var parent=element.offsetParent;while(parent){offset=offset.plus(new Coordinate(parent.offsetLeft,parent.offsetTop));parent=parent.offsetParent;}
return offset;},southeastOffset:function(element,isRecursive){return Coordinates.northwestOffset(element,isRecursive).plus(new Coordinate(element.offsetWidth,element.offsetHeight));}};function Coordinate(x,y){this.x=x||0;this.y=y||0;}
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.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;}
else{return false;}};Coordinate.prototype.insideObject=function(obj,recurse){var data=Coordinates.coordinatesData(obj);data.recurse=recurse;data.quadrant=this.insideObjectData(data);return data.quadrant?data:null;};Coordinate.prototype.insideObjectData=function(data){var nwOffset=data.nwOffset;var seOffset=data.seOffset;var rt=0;if(this.inside(nwOffset,seOffset)){var mid=data.midPoint;if(this.x<=mid.x&&this.y<=mid.y){rt=1;}
else if(this.x>=mid.x&&this.y<=mid.y){rt=2;}
else if(this.x>=mid.x&&this.y>=mid.y){rt=3;}
else if(this.x<=mid.x&&this.y>=mid.y){rt=4;}}
return rt;};function MousePos(){};MousePos.prototype=new Coordinate();MousePos.prototype.update=function(event){if(typeof event=='undefined'){event=window.event;}
var position=new Coordinate(event.clientX,event.clientY);var scrollOffset=Viewport.scroll();this.x=position.x+scrollOffset.x;this.y=position.y+scrollOffset.y;if(this.x<0)this.x=0;if(this.y<0)this.y=0;return event;};var mousePos=new MousePos(0,0);jQuery.each(["coordinatesData","northwestPosition","southeastPosition","northwestOffset","southeastOffset"],function(i,n){jQuery.fn[n]=function(h){return this.length>0?Coordinates[n](this[0],h):null;};});jQuery.fn.xySize=function(){return new Coordinate(this.width(),this.height());};