/*
 * 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: dev
 * Date:
 */
(function(f){f.fn.iviewer=function(a){return this.each(function(){f(this).data("viewer",new c(this,a))})};var l={zoom:"fit",zoom_base:100,zoom_max:800,zoom_min:25,zoom_delta:1.4,ui_disabled:false,update_on_resize:true,onZoom:null,initCallback:null,onStartDrag:null,onDrag:null,onMouseMove:null,onClick:null,onStartLoad:null,onFinishLoad:null};f.iviewer=function(a,b){var d=this;this.img_object={};this.zoom_object={};this.image_loaded=false;this.dy=this.dx=0;this.dragged=false;this.settings=f.extend({},
l,b||{});this.current_zoom=this.settings.zoom;if(this.settings.src!==null){this.container=f(a);this.update_container_info();this.container.css("overflow","hidden");this.settings.update_on_resize==true&&f(window).resize(function(){d.update_container_info()});this.img_object.x=0;this.img_object.y=0;this.img_object.object=f("<img>").css({position:"absolute",top:"0px",left:"0px"}).mousedown(function(e){return d.drag_start(e)}).mousemove(function(e){return d.drag(e)}).mouseup(function(e){return d.drag_end(e)}).click(function(e){return d.click(e)}).mouseleave(function(e){return d.drag_end(e)}).mousewheel(function(e,
g){d.zoom_by(g>0?1:-1);return false});this.img_object.object.prependTo(d.container);this.loadImage(this.settings.src);this.settings.ui_disabled||this.createui();this.settings.initCallback&&this.settings.initCallback.call(this)}};var c=f.iviewer;c.fn=c.prototype={iviewer:"dev"};c.fn.extend=c.extend=f.extend;c.fn.extend({loadImage:function(a){this.current_zoom=this.settings.zoom;this.image_loaded=false;var b=this;this.settings.onStartLoad&&this.settings.onStartLoad.call(this);this.img_object.object.unbind("load").removeAttr("src").removeAttr("width").removeAttr("height").css({top:0,
left:0}).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.settings.zoom=="fit"?b.fit():b.set_zoom(b.settings.zoom);b.settings.onFinishLoad&&b.settings.onFinishLoad.call(b)}).attr("src",a)},fit:function(){var a=0;a=this.img_object.orig_width/this.img_object.orig_height>this.settings.width/this.settings.height?
this.settings.width/this.img_object.orig_width*100:this.settings.height/this.img_object.orig_height*100;this.set_zoom(a)},center:function(){this.setCoords(-Math.round((this.img_object.display_height-this.settings.height)/2),-Math.round((this.img_object.display_width-this.settings.width)/2))},moveTo:function(){this.setCoords(this.img_object.x-this.dx,this.img_object.y-this.dy)},setCoords:function(a,b){if(this.image_loaded){if(b>0)b=0;if(a>0)a=0;if(b+this.img_object.display_height<this.settings.height)b=
this.settings.height-this.img_object.display_height;if(a+this.img_object.display_width<this.settings.width)a=this.settings.width-this.img_object.display_width;if(this.img_object.display_width<=this.settings.width)a=-(this.img_object.display_width-this.settings.width)/2;if(this.img_object.display_height<=this.settings.height)b=-(this.img_object.display_height-this.settings.height)/2;this.img_object.x=a;this.img_object.y=b;this.img_object.object.css("top",b+"px").css("left",a+"px")}},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:c.descaleValue(a-this.img_object.x,this.current_zoom),y:c.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+c.scaleValue(a,this.current_zoom),y:this.img_object.y+c.scaleValue(b,this.current_zoom)}},
getMouseCoords:function(a){var b=this.img_object.object.offset();return{x:c.descaleValue(a.pageX-b.left,this.current_zoom),y:c.descaleValue(a.pageY-b.top,this.current_zoom)}},set_zoom:function(a){if(!(this.settings.onZoom&&this.settings.onZoom.call(this,a)==false))if(this.image_loaded){if(a<this.settings.zoom_min)a=this.settings.zoom_min;else if(a>this.settings.zoom_max)a=this.settings.zoom_max;if(this.current_zoom=="fit"){var b=Math.round(this.settings.width/2+this.img_object.orig_width/2),d=Math.round(this.settings.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.settings.width/2);d=-parseInt(this.img_object.object.css("top"),10)+Math.round(this.settings.height/2)}var e=c.scaleValue(this.img_object.orig_width,a),g=c.scaleValue(this.img_object.orig_height,a);b=c.scaleValue(c.descaleValue(b,this.current_zoom),a);d=c.scaleValue(c.descaleValue(d,this.current_zoom),a);b=this.settings.width/2-b;d=this.settings.height/2-d;this.img_object.object.attr("width",
e).attr("height",g);this.img_object.display_width=e;this.img_object.display_height=g;this.setCoords(b,d);this.current_zoom=a;f.isFunction(this.settings.onAfterZoom)&&this.settings.onAfterZoom.call(this,a);this.update_status()}},zoom_by:function(a){var b=this.find_closest_zoom_rate(this.current_zoom)+a;b=this.settings.zoom_base*Math.pow(this.settings.zoom_delta,b);if(a>0&&b<this.current_zoom)b*=this.settings.zoom_delta;if(a<0&&b>this.current_zoom)b/=this.settings.zoom_delta;this.set_zoom(b)},find_closest_zoom_rate:function(a){function b(i,
j){return i/j}function d(i,j){return i*j}if(a==this.settings.zoom_base)return 0;for(var e=a>this.settings.zoom_base?d:b,g=a>this.settings.zoom_base?1:-1,k=this.settings.zoom_delta,h=1;Math.abs(e(this.settings.zoom_base,Math.pow(k,h))-a)>Math.abs(e(this.settings.zoom_base,Math.pow(k,h+1))-a);)h++;return g*h},update_status:function(){if(!this.settings.ui_disabled){var a=Math.round(100*this.img_object.display_height/this.img_object.orig_height);a&&this.zoom_object.html(a+"%")}},update_container_info:function(){this.settings.height=
this.container.height();this.settings.width=this.container.width()},drag_start:function(a){if(this.settings.onStartDrag&&this.settings.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 false},drag:function(a){this.settings.onMouseMove&&this.settings.onMouseMove.call(this,this.getMouseCoords(a));if(this.dragged){this.settings.onDrag&&this.settings.onDrag.call(this,
this.getMouseCoords(a));this.setCoords(a.pageX-this.dx,a.pageY-this.dy);return false}},drag_end:function(){this.container.removeClass("iviewer_drag_cursor");this.dragged=false},click:function(a){this.settings.onClick&&this.settings.onClick.call(this,this.getMouseCoords(a))},createui:function(){var a=this;f("<div>").addClass("iviewer_zoom_in").addClass("iviewer_common").addClass("iviewer_button").mousedown(function(){a.zoom_by(1);return false}).appendTo(this.container);f("<div>").addClass("iviewer_zoom_out").addClass("iviewer_common").addClass("iviewer_button").mousedown(function(){a.zoom_by(-1);
return false}).appendTo(this.container);f("<div>").addClass("iviewer_zoom_zero").addClass("iviewer_common").addClass("iviewer_button").mousedown(function(){a.set_zoom(100);return false}).appendTo(this.container);f("<div>").addClass("iviewer_zoom_fit").addClass("iviewer_common").addClass("iviewer_button").mousedown(function(){a.fit(this);return false}).appendTo(this.container);this.zoom_object=f("<div>").addClass("iviewer_zoom_status").addClass("iviewer_common").appendTo(this.container);this.update_status()}});
c.extend({scaleValue:function(a,b){return a*b/100},descaleValue:function(a,b){return a*100/b}})})(jQuery);

