var MooCrop=new Class({calculateHandles:true,current:{},options:{maskColor:"#fff",maskOpacity:".6",handleColor:"#000",handleWidth:"5px",handleHeight:"5px",cropBorder:"1px dashed #000",min:{width:100,height:100},showMask:true,showHandles:true,constrainRatio:false},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 c=this.boxDiff=(this.crop.width-this.options.min.width)/2;var a=this.bounds={top:c,left:c,right:this.imgsize.width+(c*2),bottom:this.imgsize.height+(c*2),width:this.options.min.width+(c*2),height:this.options.min.height+(c*2)};this.wrapper.setStyles({width:a.right,height:a.bottom,background:"url("+this.img.src+") no-repeat "+c+"px "+c+"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 f=a.clientX+$(document.body).getScroll().x;var e=a.clientY+$(document.body).getScroll().y;var g=this.current.x-f;var d=this.current.y-e;var k=this.bounds;var j=this.crop;var h=this.current.handle;var m={};var l=(h.length>2)?true:false;if(l){if(j.bottom-d>k.bottom){d=j.bottom-k.bottom}if(j.top-d<k.top){d=j.top}if(j.right-g>k.right){g=j.right-k.right}if(j.left-g<k.left){g=j.left}m.top=j.top-d;m.left=j.left-g}else{if(h.contains("S")&&!h.contains("W")&&!h.contains("E")){if(j.bottom-d>k.bottom){d=j.bottom-k.bottom}if((j.height-d)<k.height){d=j.height-k.height}if(this.options.constrainRatio){if(j.right-d>k.right){d=j.right-k.right;g=d;m.width=j.width-g;m.height=j.height-d}else{m.width=j.width-d;m.height=j.height-d}}else{m.height=j.height-d}}else{if(h.contains("N")&&!h.contains("W")&&!h.contains("E")){if(j.top-d<k.top){d=j.top}if((j.height+d)<k.height){d=k.height-j.height}if(this.options.constrainRatio){if(j.right+d>k.right){g=k.right-j.right;d=g;m.width=j.width+g;m.height=j.height+d}else{m.width=j.width+d;m.height=j.height+d}}else{m.height=j.height+d}m.top=j.top-d}else{if(h.contains("E")&&!h.contains("S")&&!h.contains("N")){if(j.right-g>k.right){g=j.right-k.right}if((j.width-g)<k.width){g=j.width-k.width}if(this.options.constrainRatio){if(j.bottom-g>k.bottom){g=j.bottom-k.bottom;d=g;m.width=j.width-g;m.height=j.height-d}else{m.width=j.width-g;m.height=j.height-g}}else{m.width=j.width-g}}else{if(h.contains("W")&&!h.contains("S")&&!h.contains("N")){if(j.left-g<k.left){g=j.left}if((j.width+g)<k.width){g=k.width-j.width}if(this.options.constrainRatio){if(j.bottom+g>k.bottom){g=k.bottom-j.bottom;d=g;m.width=j.width+g;m.height=j.height+d}else{m.width=j.width+g;m.height=j.height+g}}else{m.width=j.width+g}m.left=j.left-g}else{if(h.contains("S")&&h.contains("E")){if(j.right-g>k.right){g=j.right-k.right}if(this.options.constrainRatio){if(j.bottom-g>k.bottom){g=j.bottom-k.bottom}}else{if(j.bottom-d>k.bottom){d=j.bottom-k.bottom}}if((j.width-g)<k.width){g=j.width-k.width}if((j.height-d)<k.height){d=j.height-k.height}if(this.options.constrainRatio){m.width=j.width-g;m.height=j.height-g}else{m.width=j.width-g;m.height=j.height-d}}else{if(h.contains("N")&&h.contains("E")){if(j.right-g>k.right){g=j.right-k.right}if(this.options.constrainRatio){if(j.top+g<k.top){g=k.top-j.top}}else{if(j.top-d<k.top){d=j.top-k.top}}if((j.width-g)<k.width){g=j.width-k.width}if((j.height+d)<k.height){d=k.height-j.height}if(this.options.constrainRatio){m.width=j.width-g;m.height=j.height-g;m.top=j.top+g}else{m.width=j.width-g;m.height=j.height+d;m.top=j.top-d}}else{if(h.contains("S")&&h.contains("W")){if(j.left-g<k.left){g=j.left-k.left}if(this.options.constrainRatio){if(j.bottom+g>k.bottom){g=k.bottom-j.bottom}}else{if(j.bottom-d>k.bottom){d=j.bottom-k.bottom}}if((j.height-d)<k.height){d=j.height-k.height}if((j.width+g)<k.width){g=k.width-j.width}if(this.options.constrainRatio){m.width=j.width+g;m.height=j.height+g;m.left=j.left-g}else{m.width=j.width+g;m.height=j.height-d;m.left=j.left-g}}else{if(h.contains("N")&&h.contains("W")){if(j.left-g<k.left){g=j.left-k.left}if(this.options.constrainRatio){if(j.top-g<k.top){g=j.top-k.top}}else{if(j.top-d<k.top){d=j.top-k.top}}if((j.height+d)<k.height){d=k.height-j.height}if((j.width+g)<k.width){g=k.width-j.width}if(this.options.constrainRatio){m.width=j.width+g;m.height=j.height+g;m.left=j.left-g;m.top=j.top-g}else{m.width=j.width+g;m.height=j.height+d;m.left=j.left-g;m.top=j.top-d}}}}}}}}}}var i=$merge(m);if($defined(m.width)){m.width-=this.boxDiff*2}if($defined(m.height)){m.height-=this.boxDiff*2}this.cropArea.setStyles(m);this.getCurrentCoords(i);this.drawMasks();this.positionHandles();this.fireEvent("onCrop",[this.img.src,this.getCropInfo(),k,h])},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 e=this.current.crop;var d=this.current.handle;this.north.setStyle("height",e.top+"px");this.south.setStyle("height",a.bottom-e.bottom+"px");this.east.setStyles({height:e.height+"px",width:a.right-e.right+"px",top:e.top+"px",left:e.right+"px"});this.west.setStyles({height:e.height+"px",width:e.left+"px",top:e.top+"px"})},positionHandles:function(){if(!this.calculateHandles){return}var d=this.current.crop;var a=this.handleWidthOffset;var b=this.handleHeightOffset;this.handles.get("N").setStyles({left:d.width/2-a+"px",top:-b+"px"});this.handles.get("NE").setStyles({left:d.width-a+"px",top:-b+"px"});this.handles.get("E").setStyles({left:d.width-a+"px",top:d.height/2-b+"px"});this.handles.get("SE").setStyles({left:d.width-a+"px",top:d.height-b+"px"});this.handles.get("S").setStyles({left:d.width/2-a+"px",top:d.height-b+"px"});this.handles.get("SW").setStyles({left:-a+"px",top:d.height-b+"px"});this.handles.get("W").setStyles({left:-a+"px",top:d.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);