/*
 * iviewer Plugin for jQuery JavaScript Library
 * https://github.com/can3p/iviewer
 *
 * Copyright (c) 2009 - 2011 Dmitry Petrov
 * Dual licensed under the MIT and GPL licenses.
 *  - http://www.opensource.org/licenses/mit-license.php
 *  - http://www.gnu.org/copyleft/gpl.html
 *
 * Author: Dmitry Petrov
 * Version: 0.5.1dev
 */
/**
 * Convert a touch event to a mouse-like
 */
(function(c){function i(a){var b=a.originalEvent.changedTouches[0];return c.extend(a,{type:m[a.type],which:1,pageX:b.pageX,pageY:b.pageY,screenX:b.screenX,screenY:b.screenY,clientX:b.clientX,clientY:b.clientY,isTouchEvent:true})}var m={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"},n=c.ui.mouse.prototype._mouseInit;c.ui.mouse.prototype._mouseInit=function(){var a=this;a._touchActive=false;this.element.bind("touchstart."+this.widgetName,function(b){a._touchActive=true;return a._mouseDown(i(b))});
a=this;this._mouseMoveDelegate=function(b){if(a._touchActive)return a._mouseMove(i(b))};this._mouseUpDelegate=function(b){if(a._touchActive){a._touchActive=false;return a._mouseUp(i(b))}};c(document).bind("touchmove."+this.widgetName,this._mouseMoveDelegate).bind("touchend."+this.widgetName,this._mouseUpDelegate);n.apply(this)};c.widget("ui.iviewer",c.ui.mouse,{widgetEventPrefix:"iviewer",options:{zoom:"fit",zoom_base:100,zoom_max:800,zoom_min:25,zoom_delta:1.4,ui_disabled:false,update_on_resize:true,
onZoom:null,onStartDrag:null,onDrag:null,onMouseMove:null,onClick:null,onStartLoad:null,onFinishLoad:null},_create:function(){var a=this;this.dy=this.dx=0;this.dragged=false;this.img_object={};this.zoom_object={};this.image_loaded=false;this.current_zoom=this.options.zoom;if(this.options.src!==null){this.container=this.element;this._updateContainerInfo();this.container.css("overflow","hidden");this.options.update_on_resize==true&&c(window).resize(function(){a._updateContainerInfo()});this.img_object.x=
0;this.img_object.y=0;this.img_object.object=c("<img>").css({position:"absolute",top:"0px",left:"0px"}).click(function(b){return a.click(b)}).mousewheel(function(b,e){a.zoom_by(e>0?1:-1);return false});this.img_object.object.prependTo(a.container);this.loadImage(this.options.src);this.options.ui_disabled||this.createui();this._mouseInit()}},destroy:function(){this._mouseDestroy()},_updateContainerInfo:function(){this.options.height=this.container.height();this.options.width=this.container.width()},
loadImage:function(a){this.current_zoom=this.options.zoom;this.image_loaded=false;var b=this;this.options.onStartLoad&&this.options.onStartLoad.call(this);this.img_object.object.unbind("load").removeAttr("src").removeAttr("width").removeAttr("height").css({top:0,left:0,width:"",height:""}).load(function(){b.image_loaded=true;b.img_object.display_width=b.img_object.orig_width=this.width;b.img_object.display_height=b.img_object.orig_height=this.height;b.container.hasClass("iviewer_cursor")||b.container.addClass("iviewer_cursor");
b.options.zoom=="fit"?b.fit():b.set_zoom(b.options.zoom);b.options.onFinishLoad&&b.options.onFinishLoad.call(b)}).attr("src",a)},fit:function(){var a=0;a=this.img_object.orig_width/this.img_object.orig_height>this.options.width/this.options.height?this.options.width/this.img_object.orig_width*100:this.options.height/this.img_object.orig_height*100;this.set_zoom(a)},center:function(){this.setCoords(-Math.round((this.img_object.display_height-this.options.height)/2),-Math.round((this.img_object.display_width-
this.options.width)/2))},moveTo:function(a,b){this.setCoords(this.img_object.x-(a-Math.round(this.options.width/2)),this.img_object.y-(b-Math.round(this.options.height/2)))},getContainerOffset:function(){return jQuery.extend({},this.container.offset())},setCoords:function(a,b){if(this.image_loaded){c.extend(this.img_object,this._correctCoords(a,b));this.img_object.object.css("top",this.img_object.y+"px").css("left",this.img_object.x+"px")}},_correctCoords:function(a,b){a=parseInt(a,10);b=parseInt(b,
10);if(b>0)b=0;if(a>0)a=0;if(b+this.img_object.display_height<this.options.height)b=this.options.height-this.img_object.display_height;if(a+this.img_object.display_width<this.options.width)a=this.options.width-this.img_object.display_width;if(this.img_object.display_width<=this.options.width)a=-(this.img_object.display_width-this.options.width)/2;if(this.img_object.display_height<=this.options.height)b=-(this.img_object.display_height-this.options.height)/2;return{x:a,y:b}},containerToImage:function(a,
b){if(a<this.img_object.x||b<this.img_object.y||a>this.img_object.x+this.img_object.display_width||b>this.img_object.y+this.img_object.display_height)return false;return{x:d.descaleValue(a-this.img_object.x,this.current_zoom),y:d.descaleValue(b-this.img_object.y,this.current_zoom)}},imageToContainer:function(a,b){if(a>this.img_object.orig_width||b>this.img_object.orig_height)return false;return{x:this.img_object.x+d.scaleValue(a,this.current_zoom),y:this.img_object.y+d.scaleValue(b,this.current_zoom)}},
getMouseCoords:function(a){var b=this.img_object.object.offset();return{x:d.descaleValue(a.pageX-b.left,this.current_zoom),y:d.descaleValue(a.pageY-b.top,this.current_zoom)}},set_zoom:function(a){if(!(this.options.onZoom&&this.options.onZoom.call(this,a)==false))if(this.image_loaded){if(a<this.options.zoom_min)a=this.options.zoom_min;else if(a>this.options.zoom_max)a=this.options.zoom_max;if(this.current_zoom=="fit"){var b=Math.round(this.options.width/2+this.img_object.orig_width/2),e=Math.round(this.options.height/
2+this.img_object.orig_height/2);this.current_zoom=100}else{b=-parseInt(this.img_object.object.css("left"),10)+Math.round(this.options.width/2);e=-parseInt(this.img_object.object.css("top"),10)+Math.round(this.options.height/2)}var f=d.scaleValue(this.img_object.orig_width,a),g=d.scaleValue(this.img_object.orig_height,a);b=d.scaleValue(d.descaleValue(b,this.current_zoom),a);e=d.scaleValue(d.descaleValue(e,this.current_zoom),a);b=this.options.width/2-b;e=this.options.height/2-e;this.img_object.display_width=
f;this.img_object.display_height=g;c.extend(this.img_object,this._correctCoords(b,e));this.img_object.object.animate({width:f,height:g,top:this.img_object.y,left:this.img_object.x},200);this.current_zoom=a;c.isFunction(this.options.onAfterZoom)&&this.options.onAfterZoom.call(this,a);this.update_status()}},zoom_by:function(a){var b=this.find_closest_zoom_rate(this.current_zoom)+a;b=this.options.zoom_base*Math.pow(this.options.zoom_delta,b);if(a>0&&b<this.current_zoom)b*=this.options.zoom_delta;if(a<
0&&b>this.current_zoom)b/=this.options.zoom_delta;this.set_zoom(b)},find_closest_zoom_rate:function(a){function b(j,k){return j/k}function e(j,k){return j*k}if(a==this.options.zoom_base)return 0;for(var f=a>this.options.zoom_base?e:b,g=a>this.options.zoom_base?1:-1,l=this.options.zoom_delta,h=1;Math.abs(f(this.options.zoom_base,Math.pow(l,h))-a)>Math.abs(f(this.options.zoom_base,Math.pow(l,h+1))-a);)h++;return g*h},update_status:function(){if(!this.options.ui_disabled){var a=Math.round(100*this.img_object.display_height/
this.img_object.orig_height);a&&this.zoom_object.html(a+"%")}},_mouseStart:function(a){if(this.options.onStartDrag&&this.options.onStartDrag.call(this,this.getMouseCoords(a))==false)return false;this.dragged=true;this.container.addClass("iviewer_drag_cursor");this.dx=a.pageX-this.img_object.x;this.dy=a.pageY-this.img_object.y;return true},_mouseCapture:function(){return true},_mouseDrag:function(a){this.options.onMouseMove&&this.options.onMouseMove.call(this,this.getMouseCoords(a));if(this.dragged){this.options.onDrag&&
this.options.onDrag.call(this,this.getMouseCoords(a));this.setCoords(a.pageX-this.dx,a.pageY-this.dy);return false}},_mouseStop:function(){this.container.removeClass("iviewer_drag_cursor");this.dragged=false},click:function(a){this.options.onClick&&this.options.onClick.call(this,this.getMouseCoords(a))},createui:function(){var a=this;c("<div>").addClass("iviewer_zoom_in").addClass("iviewer_common").addClass("iviewer_button").bind("mousedown touchstart",function(){a.zoom_by(1);return false}).appendTo(this.container);
c("<div>").addClass("iviewer_zoom_out").addClass("iviewer_common").addClass("iviewer_button").bind("mousedown touchstart",function(){a.zoom_by(-1);return false}).appendTo(this.container);c("<div>").addClass("iviewer_zoom_zero").addClass("iviewer_common").addClass("iviewer_button").bind("mousedown touchstart",function(){a.set_zoom(100);return false}).appendTo(this.container);c("<div>").addClass("iviewer_zoom_fit").addClass("iviewer_common").addClass("iviewer_button").bind("mousedown touchstart",function(){a.fit(this);
return false}).appendTo(this.container);this.zoom_object=c("<div>").addClass("iviewer_zoom_status").addClass("iviewer_common").appendTo(this.container);this.update_status()}});var d={scaleValue:function(a,b){return a*b/100},descaleValue:function(a,b){return a*100/b}}})(jQuery,undefined);

