/*
Copyright (c) 2009 Kevin Porter & Advanced Web Construction Ltd (http://webutils.co.uk, http://coding.tinternet.info)

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
var awc_image_rotater=Class.create({id:null,img:null,_hConfig:null,_canvas:null,_context:null,_canvas_width:null,_canvas_height:null,_canvas_rotation:0,_image_width:null,_image_height:null,_img_copy:null,_img_data_url:null,_orig_src:null,_hStyles:{},_overflow_x:0,_overflow_y:0,_log_textarea:null,_animating:false,_stop_animating:false,_animateConfig:null,_mouseover:false,_prev_imageX:null,_prev_imageY:null,_empty_image_data:null,_enabled:true,initialize:function(a){if(!awc_image_rotater.supported){return false}if($("awc_image_rotater__log")){this._log_textarea=$("awc_image_rotater__log")}if(this._log_textarea){$("awc_image_rotater__log").setValue("")}var c=$H({img:null,id:null,replace_image:true});this._hConfig=c.merge(a);this.img=$(this._hConfig.get("img"));if(!this.img){return false}this.id=this._hConfig.get("id")||"awc_image_rotater__"+this.img.identify();this._canvas=new Element("canvas");var b=new Image();b.observe("load",this._initialize_step2.bind(this));b.src=this.img.src},_initialize_step2:function(){this._image_width=parseInt(this.img.getStyle("width"));this._image_height=parseInt(this.img.getStyle("height"));if(!this._duplicate_image()){return false}this._create_empty_image_data();["Top","Right","Bottom","Left"].each(function(b){this._hStyles["border"+b+"Width"]=this.img.getStyle("border"+b+"Width");this._hStyles["border"+b+"Color"]=this.img.getStyle("border"+b+"Color");this._hStyles["border"+b+"Style"]=this.img.getStyle("border"+b+"Style");this._hStyles["padding"+b]=this.img.getStyle("padding"+b);this._hStyles["margin"+b]=this.img.getStyle("margin"+b)}.bind(this));this._canvas_width=this._canvas_height=Math.sqrt(Math.pow(this._image_width,2)+Math.pow(this._image_height,2));this._canvas.writeAttribute({width:this._canvas_width,height:this._canvas_height});this._overflow_x=parseInt((this._canvas_width-this._image_width)/2+0.5);this._overflow_y=parseInt((this._canvas_height-this._image_height)/2+0.5);this._hide_canvas();document.body.insert(this._canvas);var a=this._canvas_position();this._set_canvas_position(a.left,a.top);if(this._hConfig.get("zIndex")){this.set_zIndex(this._hConfig.get("zIndex"))}this._context=this._canvas.getContext("2d");this._context.drawImage(this.img,this._overflow_x,this._overflow_y,this._image_width,this._image_height);this._orig_src=this.img.src;if(this._hConfig.get("replace_image")){this._hide_image();this._show_canvas()}var a=this._canvas_position();this._set_canvas_position(a.left,a.top);Event.observe(window,"resize",function(c){var b=this._canvas_position();this._set_canvas_position(b.left,b.top)}.bindAsEventListener(this));this._canvas.observe("mouseover",awc_image_rotater._handle_mouseover.bindAsEventListener(this));this._canvas.observe("click",awc_image_rotater._handle_other_mouse_events.bindAsEventListener(this));this._canvas.observe("mousedown",awc_image_rotater._handle_other_mouse_events.bindAsEventListener(this));this._canvas.observe("mouseup",awc_image_rotater._handle_other_mouse_events.bindAsEventListener(this));this._canvas.observe("dblclick",awc_image_rotater._handle_other_mouse_events.bindAsEventListener(this));this.observe("awc_image_rotater:image_mouseover",this._image_mouseover.bindAsEventListener(this));this.observe("awc_image_rotater:image_mouseout",this._image_mouseout.bindAsEventListener(this));this.observe("awc_image_rotater:image_mousemove",this._image_mousemove.bindAsEventListener(this));this.observe("awc_image_rotater:image_mousechange",this._image_mousechange.bindAsEventListener(this));this.observe("awc_image_rotater:image_click",this._image_click.bindAsEventListener(this));this.observe("awc_image_rotater:image_mousedown",this._image_mousedown.bindAsEventListener(this));this.observe("awc_image_rotater:image_mouseup",this._image_mouseup.bindAsEventListener(this));this.observe("awc_image_rotater:image_dblclick",this._image_dblclick.bindAsEventListener(this));awc_image_rotater.rotaters[this.img.identify()]=this;awc_image_rotater.rotaters[this.id]=this;setTimeout(this._initialize_step3.bind(this),awc_image_rotater._initiliased_delay)},_initialize_step3:function(){this.fire("awc_image_rotater:initialised")},set_zIndex:function(a){this._canvas.setStyle({zIndex:a})},get_zIndex:function(){return parseInt(this._canvas.getStyle("zIndex"))},get_canvas_dimensions:function(){var a=parseInt(this._canvas_width+0.5);var b=parseInt(this._canvas_height+0.5);return{width:this._canvas_width,height:this._canvas_height,iWidth:a,iHeight:b}},_canvas_position:function(){var c=this.img.cumulativeOffset();var a=c[0];var e=c[1];var b=a-this._overflow_x+parseInt(this._hStyles.paddingLeft)+parseInt(this._hStyles.borderLeftWidth);var d=e-this._overflow_y+parseInt(this._hStyles.paddingTop)+parseInt(this._hStyles.borderTopWidth);return{left:b,top:d}},_set_canvas_position:function(a,b){this._canvas.setStyle({position:"absolute",left:a+"px",top:b+"px"})},_log:function(a){if(this._log_textarea){this._log_textarea.setValue(this.id+": "+a+"\n"+this._log_textarea.getValue())}},_image_mouseout:function(a){this._log("event: image_mouseout (ev.memo: "+$H(a.memo).inspect()+")")},_image_mouseover:function(a){this._log("event: image_mouseover (ev.memo: "+$H(a.memo).inspect()+")")},_image_mousemove:function(a){this._log("event: image_mousemove (ev.memo: "+$H(a.memo).inspect()+")")},_image_mousechange:function(a){this._log("event: image_mousechange (ev.memo: "+$H(a.memo).inspect()+")")},_image_click:function(a){this._log("event: image_click (ev.memo: "+$H(a.memo).inspect()+")")},_image_mousedown:function(a){this._log("event: image_mousedown (ev.memo: "+$H(a.memo).inspect()+")")},_image_mouseup:function(a){this._log("event: image_mouseup (ev.memo: "+$H(a.memo).inspect()+")")},_image_dblclick:function(a){this._log("event: image_dblclick (ev.memo: "+$H(a.memo).inspect()+")")},mouse_within_image:function(k,j,h){var d=this._canvas_position();var f=k-d.left;var c=j-d.top;var d=this._canvas_position();var b=this._canvas_centre();var i=this._rotate_point(-this._canvas_rotation,[f,c]);var m=this._overflow_x;var l=this._overflow_y;var e=parseInt(this._canvas_width-this._overflow_x+0.5);var a=parseInt(this._canvas_height-this._overflow_y+0.5);var g=(i[0]>=m&&i[0]<=e&&i[1]>=l&&i[1]<=a);if(h){h.imageX=parseInt(i[0]-this._overflow_x+0.5);h.imageY=parseInt(i[1]-this._overflow_y+0.5)}return g},mouse_within_canvas:function(b,g,f){var a=this._canvas_position();var e=a.left,c=a.top;var d=(b>=e&&b<=(e+this._canvas_width)&&g>=c&&g<=(c+this._canvas_height));if(f){f.x=b-e;f.y=g-c}return d},_rotate_point:function(a,e){var g=parseInt((this._image_width/2)+this._overflow_x+0.5);var f=parseInt((this._image_height/2)+this._overflow_y+0.5);var h=this._translate_point(e,[-g,-f]);var i=this.deg2rad(a);var c=Math.cos(i)*h[0]-Math.sin(i)*h[1];var b=Math.sin(i)*h[0]+Math.cos(i)*h[1];var d=this._translate_point([c,b],[g,f]);return d},_translate_point:function(c,b){var a=[c[0]+b[0],c[1]+b[1]];return a},_canvas_centre:function(){var b=parseInt((this._image_width/2)+this._overflow_x+0.5);var a=parseInt((this._image_height/2)+this._overflow_y+0.5);return[b,a]},observe:function(b,a){if(!awc_image_rotater.supported){return false}this._canvas.observe(b,a)},stopObserving:function(b,a){if(!awc_image_rotater.supported){return false}this._canvas.stopObserving(b,a)},fire:function(b,a){if(!awc_image_rotater.supported){return false}this._canvas.fire(b,a)},_duplicate_image:function(){this._img_copy=new Image();var a=new Element("canvas");a.width=this._image_width;a.height=this._image_height;var b=a.getContext("2d");b.drawImage(this.img,this._overflow_x,this._overflow_y,this._image_width,this._image_height);try{this.img_data_url=a.toDataURL()}catch(c){this._enabled=false}if(this._enabled){this._img_copy.width=this._image_width;this._img_copy.height=this._image_height;this._img_copy.src=this.img_data_url}return this._enabled},_create_empty_image_data:function(){var a=new Element("canvas");a.width=this._image_width;a.height=this._image_height;var b=a.getContext("2d");this._empty_image_data=a.toDataURL()},rotate:function(d){if(!awc_image_rotater.supported){return false}if(!this._enabled){return false}this._context.clearRect(0,0,this._canvas.width,this._canvas.height);var c=parseInt((this._image_width/2)+this._overflow_x+0.5);var b=parseInt((this._image_height/2)+this._overflow_y+0.5);this._rotate_canvas(d,[c,b]);this._context.drawImage(this._img_copy,this._overflow_x,this._overflow_y,this._image_width,this._image_height);this._canvas.style.display="none";var a=this._canvas.offsetHeight;this._canvas.style.display="block";this._canvas_rotation=(this._canvas_rotation+d)%360},_rotate_canvas:function(a,b){this._context.translate(b[0],b[1]);this._context.rotate(this.deg2rad(a));this._context.translate(-b[0],-b[1])},animate:function(a){if(!awc_image_rotater.supported){return false}if(!this._enabled){return false}if(this._animating){return false}if(a.steps<1){return false}this._stop_animating=false;this._animateConfig=a;this._animating=true;this.steps=a.steps;this.degrees_per_step=a.degrees/a.steps;if(!this._hConfig.get("replace_image")){this._show_canvas()}this._hide_image();this._animation_step(this.degrees_per_step);new PeriodicalExecuter(this._animation_step.bind(this),a.interval)},_animation_step:function(a){this.rotate(this.degrees_per_step);var b=false;if((--this.steps<=0)){b=this._stop_animating;if(!b){if(!this._animateConfig.loop){b=true}else{this.steps=this._animateConfig.steps}}}if(b){if(!this._hConfig.get("replace_image")){this._show_image();this._hide_canvas()}this._animating=false;this._stop_animating=false;a.stop()}},stop_animating:function(){this._stop_animating=true},_hide_image:function(){this.img.src=this._empty_image_data},_show_image:function(){this.img.src=this._orig_src},_hide_canvas:function(){this._canvas.setStyle({visibility:"hidden"})},_show_canvas:function(){this._canvas.setStyle({visibility:"visible"})},deg2rad:function(a){return(a*(Math.PI/180))},is_animating:function(){return this._animating},get_canvas_rotation:function(){return this._canvas_rotation}});awc_image_rotater.supported=false;awc_image_rotater._handling_mouseover=false;awc_image_rotater._mouseX=0;awc_image_rotater._mouseY=0;awc_image_rotater._mouseX_prev=0;awc_image_rotater._mouseY_prev=0;awc_image_rotater._mouse_tracking_interval=0.1;awc_image_rotater._initiliased_delay=100;awc_image_rotater.rotaters={};awc_image_rotater.get=function(a){};awc_image_rotater.check_browser_support=function(){var a=new Element("canvas");if(window.HTMLCanvasElement){awc_image_rotater.supported=true}};awc_image_rotater.init_image_events=function(a){if(!awc_image_rotater.supported){return false}$$(a.which).each(function(b){var c=b.identify();awc_image_rotater.rotaters[c]=new awc_image_rotater({img:b,replace_image:false});b.observe(a.when,function(d){awc_image_rotater.rotaters[c]._show_canvas();awc_image_rotater.rotaters[c].animate(a.animateConfig)}.bindAsEventListener(this,a))})};awc_image_rotater.init_events=function(a){if(!awc_image_rotater.supported){return false}$$(a.which).each(function(c){var b=new awc_image_rotater({img:c});var d=c.identify();awc_image_rotater.rotaters[b.id].observe(a.when,function(e){awc_image_rotater.rotaters[b.id].animate(a.animateConfig)}.bindAsEventListener(this,a))})};awc_image_rotater._handle_mouseover=function(j){if(awc_image_rotater._handling_mouseover){return false}var m=j.pointerX(),i=j.pointerY();var n=awc_image_rotater.within_canvas(m,i);if(!n){awc_image_rotater._handling_mouseover=false}else{awc_image_rotater._handling_mouseover=true;var f=awc_image_rotater.check_mouse_event_coords(m,i);if(f.rotater){var c={};var h=this.mouse_within_canvas(m,i,c);var l={id:f.rotater.id,imageX:f.imageXY.imageX,imageY:f.imageXY.imageY,canvasX:c.x,canvasY:c.y,mouseX:m,mouseY:i};f.rotater.fire("awc_image_rotater:image_mouseover",l);f.rotater._mouseover=true;for(var b in awc_image_rotater.rotaters){var a=awc_image_rotater.rotaters[b];if(a._mouseover){var d={};var g=a.mouse_within_image(m,i,d);l.imageX=d.imageX;l.imageY=d.imageY;f.rotater.fire("awc_image_rotater:image_mouseout",l);a._mouseover=false}}}document.observe("mousemove",awc_image_rotater._update_mouse_coords);awc_image_rotater._mouseX_prev=awc_image_rotater._mouseX;awc_image_rotater._mouseY_prev=awc_image_rotater._mouseY;var e=new PeriodicalExecuter(function(u){var B=awc_image_rotater._mouseX,z=awc_image_rotater._mouseY;var D=(awc_image_rotater._mouseX!=awc_image_rotater._mouseX_prev||awc_image_rotater._mouseY!=awc_image_rotater._mouseY_prev);awc_image_rotater._mouseX_prev=awc_image_rotater._mouseX;awc_image_rotater._mouseY_prev=awc_image_rotater._mouseY;var C=awc_image_rotater.within_canvas(B,z);var t=awc_image_rotater.check_mouse_event_coords(B,z);for(var p in awc_image_rotater.rotaters){var o=awc_image_rotater.rotaters[p];var r={};var w=o.mouse_within_canvas(B,z,r);var A={id:o.id,imageX:t.imageXY.imageX,imageY:t.imageXY.imageY,canvasX:r.x,canvasY:r.y,mouseX:B,mouseY:z};if(o._mouseover&&(t.rotater&&(t.rotater.id===o.id))){if(D){o.fire("awc_image_rotater:image_mousemove",A)}}if(!o._mouseover){if(t.rotater&&(t.rotater.id===o.id)){o._mouseover=true;o.fire("awc_image_rotater:image_mouseover",A)}}else{if(!(t.rotater&&(t.rotater.id===o.id))){o._mouseover=false;var s={};var v=o.mouse_within_image(B,z,s);A={id:o.id,imageX:s.imageX,imageY:s.imageY};o.fire("awc_image_rotater:image_mouseout",A)}else{var q=(A.imageX!==o._prev_imageX||A.imageY!==o._prev_imageY);o._prev_imageX=A.imageX;o._prev_imageY=A.imageY;if(q){o.fire("awc_image_rotater:image_mousechange",A)}}}}if(!C){u.stop();document.stopObserving("mousemove",awc_image_rotater._update_mouse_coords);awc_image_rotater._handling_mouseover=false}},awc_image_rotater._mouse_tracking_interval)}};awc_image_rotater._handle_other_mouse_events=function(g){var e=g.pointerX(),c=g.pointerY();var d=awc_image_rotater.check_mouse_event_coords(e,c);if(d.rotater){var f={};var b=d.rotater.mouse_within_canvas(e,c,f);var a={id:d.rotater.id,imageX:d.imageXY.imageX,imageY:d.imageXY.imageY,canvasX:f.x,canvasY:f.y,mouseX:e,mouseY:c};d.rotater.fire("awc_image_rotater:image_"+g.type,a)}};awc_image_rotater.check_mouse_event_coords=function(i,h){var d=null;var f={};for(var e in awc_image_rotater.rotaters){var b=awc_image_rotater.rotaters[e];var c=(b._canvas.getStyle("visibility")==="visible");var a={};if(c&&b.mouse_within_image(i,h,a)){var g=b.get_zIndex();if(d===null||(g>d.get_zIndex())){d=b;f=a}}}return{rotater:d,imageXY:f}};awc_image_rotater.within_canvas=function(a,f){var e=false;for(var d in awc_image_rotater.rotaters){var b=awc_image_rotater.rotaters[d];var c=(b._canvas.getStyle("visibility")==="visible");e|=(c&&b.mouse_within_canvas(a,f));if(e){break}}return e};awc_image_rotater._update_mouse_coords=function(b){var a=b.pointerX(),c=b.pointerY();awc_image_rotater._mouseX=a;awc_image_rotater._mouseY=c};awc_image_rotater.log=function(b){var a=$("awc_image_rotater__log");if(a){a.setValue(b+"\n"+a.getValue())}};awc_image_rotater.check_browser_support();
