var MooCrop=new Class({calculateHandles:true,current:{},options:{maskColor:"black",maskOpacity:".4",handleColor:"blue",handleWidth:"8px",handleHeight:"8px",cropBorder:"1px dashed blue",min:{width:50,height:50},showMask:true,showHandles:false,constrainRatio:true},initialize:function(B,A){this.setOptions(A);this.img=$(B);if(this.img.get("tag")!="img"){return false}this.resizeFunc=this.refresh.bindWithEvent(this);this.removeFunc=this.removeListener.bind(this);this.buildOverlay();this.setup()},setup:function(){$(this.cropArea).setStyles({width:this.options.min.width,height:this.options.min.height,top:(this.imgsize.height-this.options.min.height)/2,left:(this.imgsize.width-this.options.min.width)/2});this.current.crop=this.crop=this.getCropArea();this.handleWidthOffset=this.options.handleWidth.toInt()/2;this.handleHeightOffset=this.options.handleHeight.toInt()/2;this.fixBoxModel();this.drawMasks();this.positionHandles()},getCropArea:function(){var A=this.cropArea.getCoordinates();A.left-=this.offsets.x;A.right-=this.offsets.x;A.top-=this.offsets.y;A.bottom-=this.offsets.y;return A},fixBoxModel:function(){var B=this.boxDiff=(this.crop.width-this.options.min.width)/2;var A=this.bounds={top:B,left:B,right:this.imgsize.width+(B*2),bottom:this.imgsize.height+(B*2),width:this.options.min.width+(B*2),height:this.options.min.height+(B*2)};this.wrapper.setStyles({width:A.right,height:A.bottom,background:"url("+this.img.src+") no-repeat "+B+"px "+B+"px"});this.north.setStyle("width",A.right);this.south.setStyle("width",A.right)},activate:function(A,B){A.stop();this.current={x:A.page.x,y:A.page.y,handle:B,crop:this.current.crop};if(this.current.handle=="NESW"&&!this.options.showHandles){this.hideHandles()}this.fireEvent("onBegin",[this.img.src,this.getCropInfo(),this.bounds,B]);document.addListener("mousemove",this.resizeFunc);document.addListener("mouseup",this.removeFunc)},removeListener:function(){if(this.current.handle=="NESW"&&!this.options.showHandles){this.showHandles()}document.removeListener("mousemove",this.resizeFunc);document.removeListener("mouseup",this.removeFunc);this.crop=this.current.crop;this.fireEvent("onComplete",[this.img.src,this.getCropInfo(),this.bounds,this.current.handle])},refresh:function(A){var D=A.clientX+$(document.body).getScroll().x;var C=A.clientY+$(document.body).getScroll().y;var E=this.current.x-D;var B=this.current.y-C;var I=this.bounds;var H=this.crop;var F=this.current.handle;var K={};var J=(F.length>2)?true:false;if(J){if(H.bottom-B>I.bottom){B=H.bottom-I.bottom}if(H.top-B<I.top){B=H.top}if(H.right-E>I.right){E=H.right-I.right}if(H.left-E<I.left){E=H.left}K.top=H.top-B;K.left=H.left-E}else{if(F.contains("S")&&!F.contains("W")&&!F.contains("E")){if(H.bottom-B>I.bottom){B=H.bottom-I.bottom}if((H.height-B)<I.height){B=H.height-I.height}if(this.options.constrainRatio){if(H.right-B>I.right){B=H.right-I.right;E=B;K.width=H.width-E;K.height=H.height-B}else{K.width=H.width-B;K.height=H.height-B}}else{K.height=H.height-B}}else{if(F.contains("N")&&!F.contains("W")&&!F.contains("E")){if(H.top-B<I.top){B=H.top}if((H.height+B)<I.height){B=I.height-H.height}if(this.options.constrainRatio){if(H.right+B>I.right){E=I.right-H.right;B=E;K.width=H.width+E;K.height=H.height+B}else{K.width=H.width+B;K.height=H.height+B}}else{K.height=H.height+B}K.top=H.top-B}else{if(F.contains("E")&&!F.contains("S")&&!F.contains("N")){if(H.right-E>I.right){E=H.right-I.right}if((H.width-E)<I.width){E=H.width-I.width}if(this.options.constrainRatio){if(H.bottom-E>I.bottom){E=H.bottom-I.bottom;B=E;K.width=H.width-E;K.height=H.height-B}else{K.width=H.width-E;K.height=H.height-E}}else{K.width=H.width-E}}else{if(F.contains("W")&&!F.contains("S")&&!F.contains("N")){if(H.left-E<I.left){E=H.left}if((H.width+E)<I.width){E=I.width-H.width}if(this.options.constrainRatio){if(H.bottom+E>I.bottom){E=I.bottom-H.bottom;B=E;K.width=H.width+E;K.height=H.height+B}else{K.width=H.width+E;K.height=H.height+E}}else{K.width=H.width+E}K.left=H.left-E}else{if(F.contains("S")&&F.contains("E")){if(H.right-E>I.right){E=H.right-I.right}if(this.options.constrainRatio){if(H.bottom-E>I.bottom){E=H.bottom-I.bottom}}else{if(H.bottom-B>I.bottom){B=H.bottom-I.bottom}}if((H.width-E)<I.width){E=H.width-I.width}if((H.height-B)<I.height){B=H.height-I.height}if(this.options.constrainRatio){K.width=H.width-E;K.height=H.height-E}else{K.width=H.width-E;K.height=H.height-B}}else{if(F.contains("N")&&F.contains("E")){if(H.right-E>I.right){E=H.right-I.right}if(this.options.constrainRatio){if(H.top+E<I.top){E=I.top-H.top}}else{if(H.top-B<I.top){B=H.top-I.top}}if((H.width-E)<I.width){E=H.width-I.width}if((H.height+B)<I.height){B=I.height-H.height}if(this.options.constrainRatio){K.width=H.width-E;K.height=H.height-E;K.top=H.top+E}else{K.width=H.width-E;K.height=H.height+B;K.top=H.top-B}}else{if(F.contains("S")&&F.contains("W")){if(H.left-E<I.left){E=H.left-I.left}if(this.options.constrainRatio){if(H.bottom+E>I.bottom){E=I.bottom-H.bottom}}else{if(H.bottom-B>I.bottom){B=H.bottom-I.bottom}}if((H.height-B)<I.height){B=H.height-I.height}if((H.width+E)<I.width){E=I.width-H.width}if(this.options.constrainRatio){K.width=H.width+E;K.height=H.height+E;K.left=H.left-E}else{K.width=H.width+E;K.height=H.height-B;K.left=H.left-E}}else{if(F.contains("N")&&F.contains("W")){if(H.left-E<I.left){E=H.left-I.left}if(this.options.constrainRatio){if(H.top-E<I.top){E=H.top-I.top}}else{if(H.top-B<I.top){B=H.top-I.top}}if((H.height+B)<I.height){B=I.height-H.height}if((H.width+E)<I.width){E=I.width-H.width}if(this.options.constrainRatio){K.width=H.width+E;K.height=H.height+E;K.left=H.left-E;K.top=H.top-E}else{K.width=H.width+E;K.height=H.height+B;K.left=H.left-E;K.top=H.top-B}}}}}}}}}}var G=$merge(K);if($defined(K.width)){K.width-=this.boxDiff*2}if($defined(K.height)){K.height-=this.boxDiff*2}this.cropArea.setStyles(K);this.getCurrentCoords(G);this.drawMasks();this.positionHandles();this.fireEvent("onCrop",[this.img.src,this.getCropInfo(),I,F])},getCurrentCoords:function(B){var A=$merge(this.crop);if($defined(B.left)){A.left=B.left;if($defined(B.width)){A.width=B.width}else{A.right=A.left+A.width}}if($defined(B.top)){A.top=B.top;if($defined(B.height)){A.height=B.height}else{A.bottom=A.top+A.height}}if($defined(B.width)&&!$defined(B.left)){A.width=B.width;A.right=A.left+A.width}if($defined(B.height)&&!$defined(B.top)){A.height=B.height;A.bottom=A.top+A.height}this.current.crop=A},drawMasks:function(){if(!this.options.showMask){return }var A=this.bounds;var C=this.current.crop;var B=this.current.handle;this.north.setStyle("height",C.top+"px");this.south.setStyle("height",A.bottom-C.bottom+"px");this.east.setStyles({height:C.height+"px",width:A.right-C.right+"px",top:C.top+"px",left:C.right+"px"});this.west.setStyles({height:C.height+"px",width:C.left+"px",top:C.top+"px"})},positionHandles:function(){if(!this.calculateHandles){return }var C=this.current.crop;var A=this.handleWidthOffset;var B=this.handleHeightOffset;this.handles.get("N").setStyles({left:C.width/2-A+"px",top:-B+"px"});this.handles.get("NE").setStyles({left:C.width-A+"px",top:-B+"px"});this.handles.get("E").setStyles({left:C.width-A+"px",top:C.height/2-B+"px"});this.handles.get("SE").setStyles({left:C.width-A+"px",top:C.height-B+"px"});this.handles.get("S").setStyles({left:C.width/2-A+"px",top:C.height-B+"px"});this.handles.get("SW").setStyles({left:-A+"px",top:C.height-B+"px"});this.handles.get("W").setStyles({left:-A+"px",top:C.height/2-B+"px"});this.handles.get("NW").setStyles({left:-A+"px",top:-B+"px"})},hideHandles:function(){this.calculateHandles=false;this.handles.each(function(A){A.setStyle("display","none")})},showHandles:function(){this.calculateHandles=true;this.positionHandles();this.handles.each(function(A){A.setStyle("display","block")})},buildOverlay:function(){var B=this.options;this.img.setStyle("padding","0");this.wrapper=new Element("div",{styles:{position:"relative",width:this.img.width,height:this.img.height,background:"url("+this.img.src+") no-repeat","float":this.img.getStyle("float")}}).inject(this.img,"before");this.imgsize={width:this.img.width,height:this.img.height};this.img.setStyle("display","none");this.offsets={x:this.wrapper.getCoordinates().left,y:this.wrapper.getCoordinates().top};if(this.options.showMask){var A={position:"absolute",overflow:"hidden","background-color":B.maskColor,opacity:B.maskOpacity};this.north=new Element("div",{styles:A}).inject(this.wrapper);this.south=new Element("div",{styles:$merge(A,{bottom:"0px"})}).inject(this.wrapper);this.east=new Element("div",{styles:A}).inject(this.wrapper);this.west=new Element("div",{styles:A}).inject(this.wrapper)}this.cropArea=new Element("div",{styles:{position:"absolute",top:"0px",left:"0px",border:B.cropBorder,cursor:"move"},events:{dblclick:function(){this.fireEvent("onDblClk",[this.img.src,this.getCropInfo(),this.bounds])}.bind(this),mousedown:this.activate.bindWithEvent(this,"NESW")}}).inject(this.wrapper,"bottom");this.handles=new Hash();["N","NE","E","SE","S","SW","W","NW"].each(function(C){this.handles.set(C,new Element("div",{styles:{position:"absolute","background-color":B.handleColor,width:B.handleWidth,height:B.handleHeight,overflow:"hidden",cursor:(C.toLowerCase()+"-resize")},events:{mousedown:this.activate.bindWithEvent(this,C)}}).inject(this.cropArea,"bottom"))},this)},getCropInfo:function(){var A=$merge(this.current.crop);A.width-=this.boxDiff*2;A.height-=this.boxDiff*2;return A},removeOverlay:function(){this.wrapper.remove();this.img.setStyle("display","block")}});MooCrop.implement(new Events,new Options);