/*
 * JQZoom Evolution 1.0.1 - Javascript Image magnifier
 *
 * Copyright (c) Engineer Renzi Marco(www.mind-projects.it)
 *
 * $Date: 12-12-2008
 *
 *	ChangeLog:
 *  
 * $License : GPL,so any change to the code you should copy and paste this section,and would be nice to report this to me(renzi.mrc@gmail.com).
 */
(function($) {
	$.fn.jqzoom = function(options) {
		var settings = {
			zoomType: 'standard', 	//standard/reverse/innerzoom
			zoomWidth: 200,		//zoomed width default width
			zoomHeight: 200,		//zoomed div default width
			xOffset: 10,		//zoomed div default offset
			yOffset: 0,
			position: "right",	//zoomed div default position,offset position is to the right of the image
			lens:true, 			//zooming lens over the image,by default is 1;
			lensReset : false,
			imageOpacity: 0.8,
			title : true,
			alwaysOn: false,
			showEffect: 'show',
			hideEffect: 'hide',
			fadeinSpeed: 'fast',
			fadeoutSpeed: 'slow',
			preloadImages :true,
			showPreload: true,
			preloadText : 'Loading zoom',
			preloadPosition : 'center',   //bycss
			CallbackBefore : null,
			CallbackAfter : null
		};

		//extending options
		options = options || {};
        	$.extend(settings, options);

		return this.each(function() {
			var largeimageloaded = false;
			var scale = {}; //rapporto tra immagine grande e piccola scale.x/scale.y
			var stage = null; // quadrato che mostra l'immagine ingrandita
			var running = false; // running = true quando si verifica l'evento che mostra lo zoom(adesso mouseover).
			var mousepos = {};
			var firstime = 0;
			var preloadshow = false;
			var isMouseDown = false;
			var dragstatus = false;

			var a = $(this);
			var aTitle = a.attr('title'); //variabile per memorizzare il titolo href
			$(a).removeAttr('title');
			$(a).css('outline-style','none');

			var img = $("img", this);
			var imageTitle = img.attr('title');
			img.removeAttr('title');	//variabile per memorizzare il titolo immagine

			var smallimagedata = { w: 0, h: 0, top:{ left:0, top:0 }};
			var smallimage = new Smallimage( img );
			//imageborder
			var btop = 0;
			var bleft = 0;

			var loader = null;     //variabile per memorizzare oggetto loader
			loader = new Loader();

			var ZoomTitle = (trim(aTitle).length > 0) ? aTitle : (trim(imageTitle).length > 0) ? imageTitle : null;  //setting zoomtitle
			var ZoomTitleObj = new zoomTitle();

			var largeimage = new Largeimage( a[0].href );

			var lens = new Lens();
			var lensdata = {};
			//lensborder

			//loading smallimagedata
			smallimage.loadimage();

			//ritorna false al click dell href
			$(this).click(function(){return false;});

			//se settato alwaysOn attivo lo Zoom e lo mostro.

			//attivo al mouseover
			$(this).hover(
				function(e) {
					mousepos.x = parseInt(e.pageX,10);
					mousepos.y	= parseInt(e.pageY,10);
					activate();
				},function() {
					deactivate();
				});

			//ALWAYS ON
			if(settings.alwaysOn) {
				setTimeout(function(){activate();},150);
			}

			function activate() {
				if ( !running ) {
					//finding border
					smallimage.findborder();
					running = true;

					//rimuovo il titolo al mouseover
					imageTitle = img.attr('title');
					img.removeAttr('title');
					aTitle = a.attr('title');
					$(a).removeAttr('title');

					//se non cè creo l'oggetto largeimage
					if (!largeimage || $.browser.safari) {
						largeimage = new Largeimage( a[0].href );
					}

					//se l'immagine grande non è stata caricata la carico
					if(!largeimageloaded || $.browser.safari) {
						largeimage.loadimage();
					} else {
						//after preload
						if(settings.zoomType !== 'innerzoom') {
							stage = new Stage();
							stage.activate();
						}
						lens = new Lens();
						lens.activate();
					}

					//hack per MAC
				/*	if($.browser.safari)
					{
						if(settings.zoomType != 'innerzoom') //se innerzoom non mostro la finestra dello zoom
						{
							stage = new Stage();
							stage.activate();
						}
						if($('div.jqZoomPup').length <= 0)
						{
						lens = new Lens();
						}
						//if(settings.zoomType == 'innerzoom'){lens = new Lens()};
						lens.activate();
						(settings.alwaysOn) ? lens.center() : lens.setposition(null);
					}
					*/
					a[0].blur();
					//alert($('div.jqZoomPup').length);
					return false;
				} else {
					return true;
				}
			}

			function deactivate() {
				if(settings.zoomType === 'reverse' &&  !settings.alwaysOn) {
					img.css({'opacity' : 1});
				}

				if(!settings.alwaysOn) {
					//resetting parameters
					running = false;
					largeimageloaded = false;
					$(lens.node).unbind('mousemove');
					lens.remove();
					if($('div.jqZoomWindow').length >0) {
						stage.remove();
					}
					if($('div.jqZoomTitle').length > 0)	{
						ZoomTitleObj.remove();
					}
					//resetting title
					img.attr('title',imageTitle);
					a.attr('title',aTitle);
					$().unbind();

					a.unbind('mousemove');
					//resetto il parametro che mi dice che è la prima volta che mostor lo zoom
					firstime = 0;
					//remove ieiframe
					if(jQuery('.zoom_ieframe').length > 0) {
						jQuery('.zoom_ieframe').remove();
					}
				} else {
					if(settings.lensReset) {
						switch(settings.zoomType) {
							case 'innerzoom':
								largeimage.setcenter();
								break;
							default:
								lens.center();
							break;
						}
					}
				}

				//non so se serve da provare
				if(settings.alwaysOn) {
					activate();
				}
			}

		//smallimage
		function Smallimage( image ) {
			this.node = image[0];

			this.loadimage = function() {
				this.node.src = image[0].src;
				};

			this.findborder = function() {
				var bordertop = '';
				bordertop = $(img).css('border-top-width');
				btop = '';
				var borderleft = '';
				borderleft = $(img).css('border-left-width');
				bleft = '';
				/*if($.browser.msie)
				{
					var temp = bordertop.split(' ');

					bordertop = temp[1];
					var temp = borderleft.split(' ');
					borderleft = temp[1];
				}*/
				if(bordertop) {
					for(i=0;i<3;i++) {
						var x = [];
						x = bordertop.substr(i,1);

						if(isNaN(x) === false) {
							btop = btop +''+ bordertop.substr(i,1);
						} else {
							break;
						}
					}
				}
				if(borderleft) {
					for(i=0;i<3;i++) {
						if(!isNaN(borderleft.substr(i,1))) {
							bleft = bleft + borderleft.substr(i,1);
						} else {
							break;
						}
					}
				}
				btop = (btop.length > 0) ? eval(btop) : 0;
				bleft = (bleft.length > 0) ? eval(bleft) : 0;
			};

			this.node.onload = function() {
				//setto il cursor e la posizione dell'href
				a.css({'cursor':'crosshair'});	// ,'display':'block'
				if(a.css('position')!== 'absolute' && a.parent().css('position')) {
					a.css({'cursor':'crosshair','position':'relative'});	// ,'display':'block'
				}
				if(a.parent().css('position') !== 'absolute') {
					a.parent().css('position','relative');
					//a.css('position','relative');
				} else {
				//a.css('position','relative');
				}
				if($.browser.safari || $.browser.opera) {
					$(img).css({position:'absolute',top:'0px',left:'0px'});
				}
				/*if(a.css('position')!= 'absolute' && a.parent().css('position'))
				{
					a.css({'cursor':'crosshair','position':'relative','display':'block'});
				}
				if(a.parent().css('position') != 'absolute')
				{
					alert('in');
					a.parent().css('position','relative');
					//a.css('position','relative');
				}
				else{
				//a.css('position','relative');
				}*/



				/*
				if(a.parent().css('position') != 'relative' && a.css('position') != 'absolute')
				{
				a.css({'cursor':'crosshair','position':'relative','display':'block'});
				}*/

				//al docuemnt ready viene caricato l'src quindi viene azionato l'onload e carico tutti i dati
				smallimagedata.w = $( this ).width();
				smallimagedata.h = $( this ).height();
/*				
alert('ici : '+' '+smallimagedata.w+' '+smallimagedata.h);				
alert('ici : '+' '+$(img).width()+' '+$(img).height());
*/				
				//non viene fatta assegnazione alla variabile globale
				//smallimagedata.h = $( this ).height();
				smallimagedata.pos = $( this ).offset();
				smallimagedata.pos.l = $( this ).offset().left;
				smallimagedata.pos.t = $( this ).offset().top;
				smallimagedata.pos.r = smallimagedata.w + smallimagedata.pos.l;
				smallimagedata.pos.b = smallimagedata.h + smallimagedata.pos.t;

				//per sicurezza setto l'altezza e la width dell'href
				a.height(smallimagedata.h);
				a.width(smallimagedata.w);

				//PRELOAD IMAGES
				if(settings.preloadImages) {
					largeimage.loadimage();
				}
			};
			return this;
		}

		//Lens
		function Lens() {
			//creating element and adding class
			this.node = document.createElement("div");
			$(this.node).addClass('jqZoomPup');

			this.node.onerror = function() {
				$( lens.node ).remove();
				lens = new Lens();
				lens.activate();
			};

			//funzione privata per il caricamento dello zoom
			this.loadlens = function()
			{
				switch(settings.zoomType)
				{
					case 'reverse':
						this.image = new Image();
						this.image.src = smallimage.node.src; // fires off async
						this.node.appendChild( this.image );
						$( this.node ).css({'opacity' : 1});
					break;
					case 'innerzoom':

						this.image = new Image();
						this.image.src = largeimage.node.src; // fires off async
						this.node.appendChild( this.image );
						$( this.node ).css({'opacity' : 1});
					break;
					default:
					break;
				}

				scale.x = $(largeimage.node).width() / smallimagedata.w; //$(smallimagedata.node).width();
				scale.y = $(largeimage.node).height() / smallimagedata.h; //$(smallimagedata.node).height();

				switch(settings.zoomType)
				{
					case 'innerzoom':
						lensdata.w = $(smallimagedata).width();
						lensdata.h = $(smallimagedata).height();
					break;
					default:
						/*
						lensdata.w = (settings.zoomWidth)/scale.x;
						lensdata.h = (settings.zoomHeight)/scale.y;
						*/
						if (scale.x != undefined && scale.x != 0 && !isNaN(scale.x)) {
							lensdata.w = (settings.zoomWidth / scale.x);
						} else {
							lensdata.w = (settings.zoomWidth);
						}
						if (scale.y != undefined && scale.y != 0 && !isNaN(scale.y)) {
							lensdata.h = (settings.zoomHeight / scale.y);
						} else {
							lensdata.h = (settings.zoomHeight);
						}
					break;
				}
				
				$( this.node ).css({
					width: parseInt(lensdata.w,10) + 'px',
					height: parseInt(lensdata.h,10) + 'px',
					position: 'absolute',
					/*cursor: 'crosshair',*/
					display: 'none',
					//border: '1px solid blue'
					borderWidth: '1px'
					});
				a.append(this.node);
			};
			return this;
		}

		Lens.prototype.activate = function() {
			//carico la lente
			this.loadlens();

			switch(settings.zoomType) {
				case 'reverse':
					img.css({'opacity' : settings.imageOpacity});

					if (settings.alwaysOn) {
						lens.center();
					} else {
						lens.setposition(null);
					}
					//lens.center();
					//bindo ad a il mousemove della lente
					a.bind( 'mousemove', function(e)
					{
						mousepos.x = e.pageX;
						mousepos.y = e.pageY;
						lens.setposition( e );
					});
					break;

				case 'innerzoom':
					//	lens = new Lens();
					//	lens.activate();

					$( this.node ).css({top : 0 ,left: 0});
				   	if(settings.title) {
						ZoomTitleObj.loadtitle();
					}

					largeimage.setcenter();

				   	a.bind( 'mousemove', function(e) {
						mousepos.x = e.pageX;
						mousepos.y = e.pageY;
						largeimage.setinner( e );

						/*
						if(settings.zoomType == 'innerzoom' && running)
						{
							$(a).mousemove(function(){
								if($('div.jqZoomPup').length <= 0)
								{
									lens = new Lens();
									lens.activate();
								}
							});
						}
						*/

						/*
						if($('div.jqZoomPup').length <= 0) {
								lens = new Lens();
								lens.activate();
						}
						*/
					});
					break;
				default:
					/*
					$(document).mousemove(function(e){
						if(isMouseDown && dragstatus != false){
							lens.setposition( e );
						}
					});
					lens.center()

					dragstatus = 'on'
					$(document).mouseup(function(e){
						if(isMouseDown && dragstatus != false){
							isMouseDown = false;
							dragstatus = false;
	
						}
					});

					$(this.node).mousedown(function(e){
					$('div.jqZoomPup').css("cursor", "move");
					$(this.node).css("position", "absolute");

					// set z-index
					$(this.node).css("z-index", parseInt( new Date().getTime()/1000 ));
					if($.browser.safari) {
						$(a).css("cursor", "move");
					}
					isMouseDown    = true;
					dragstatus = 'on';
					lens.setposition( e );
					});
					*/

					if (settings.alwaysOn) {
						lens.center();
					} else {
						lens.setposition(null);
					}

					//bindo ad a il mousemove della lente
					$(a).bind( 'mousemove', function(e) {
						mousepos.x = e.pageX;
						mousepos.y = e.pageY;
						lens.setposition( e );
					});
					break;
			}
			return this;
		};

		Lens.prototype.setposition = function(e) {
			if(e) {
				mousepos.x = e.pageX;
				mousepos.y	= e.pageY;
			}

		 	var lensleft = null;
		 	var lenstop = null;
			if(firstime === 0) {
			 	lensleft = (smallimagedata.w)/2 - (lensdata.w)/2 ;
			 	lenstop = (smallimagedata.h)/2 - (lensdata.h)/2 ;
				//ADDED
				$('div.jqZoomPup').show();
				if(settings.lens) {
					this.node.style.visibility = 'visible';
				} else {
					this.node.style.visibility = 'hidden';
					$('div.jqZoomPup').hide();
				}
				//ADDED
				firstime = 1;
			} else {
				lensleft = mousepos.x - smallimagedata.pos.l - (lensdata.w)/2 ;
				lenstop = mousepos.y - smallimagedata.pos.t -(lensdata.h)/2 ;
			}
				//a sinistra
			if(overleft()) {
				lensleft = 0  + bleft;
			} else 
				//a destra
				if(overright()) {
					if($.browser.msie) {
						lensleft = smallimagedata.w - lensdata.w  + bleft + 1  ;
					} else {
						lensleft = smallimagedata.w - lensdata.w  + bleft - 1  ;
					}
				}

				//in alto
				if(overtop()) {
					lenstop = 0 + btop ;
				} else if(overbottom()) {
					//sotto
					if($.browser.msie) {
						lenstop = smallimagedata.h - lensdata.h  + btop + 1 ;
					} else {
						lenstop = smallimagedata.h - lensdata.h - 1 + btop  ;
					}
				}
				lensleft = parseInt(lensleft,10);
				lenstop = parseInt(lenstop,10);

				//setto lo zoom ed un eventuale immagine al centro
				$('div.jqZoomPup',a).css({top: lenstop,left: lensleft });

				if(settings.zoomType === 'reverse') {
					$('div.jqZoomPup img',a).css({'position': 'absolute','top': -( lenstop - btop +1) ,'left': -(lensleft - bleft +1)  });
				}

				this.node.style.left = parseInt(lensleft,10) + 'px';
				this.node.style.top = parseInt(lenstop,10) + 'px';

				//setto l'immagine grande
				largeimage.setposition();

				function overleft() {
					return mousepos.x - (lensdata.w +2*1)/2  - bleft < smallimagedata.pos.l;
				}

				function overright() {
					return mousepos.x + (lensdata.w + 2* 1)/2  > smallimagedata.pos.r + bleft ;
				}

				function overtop() {
					return mousepos.y - (lensdata.h + 2* 1)/2  - btop < smallimagedata.pos.t;
				}

				function overbottom() {
					return mousepos.y + (lensdata.h + 2* 1)/2    > smallimagedata.pos.b + btop;
				}
			return this;
		};


		//mostra la lente al centro dell'immagine
		Lens.prototype.center = function() {
			$('div.jqZoomPup',a).css('display','none');
			var lensleft = (smallimagedata.w)/2 - (lensdata.w)/2 ;
			var lenstop = (smallimagedata.h)/2 - (lensdata.h)/2;
			this.node.style.left = parseInt(lensleft,10) + 'px';
			this.node.style.top = parseInt(lenstop,10) + 'px';
			$('div.jqZoomPup',a).css({top: parseInt(lenstop,10),left: parseInt(lensleft,10) });

			if(settings.zoomType === 'reverse') {
				/*if($.browser.safari){
					alert('safari');
					alert(2*bleft);
					$('div.jqZoomPup img',a).css({'position': 'absolute','top': -( lenstop - btop +1) ,'left': -(lensleft - 2*bleft)  });
				}else
				{*/
				$('div.jqZoomPup img',a).css({'position': 'absolute','top': -(lenstop - btop + 1) ,'left': -( lensleft  - bleft +1)});
				//}
			}

			largeimage.setposition();
			if($.browser.msie) {
				$('div.jqZoomPup',a).show();
			} else {
				setTimeout(function(){$('div.jqZoomPup').fadeIn('fast');},10);
			}
		};

		//ritorna l'offset
		Lens.prototype.getoffset = function() {			
			if($.browser.msie) {
				var o = $(this.node).offset();
			} else {			
				var o = {};
				o.left = parseInt(this.node.style.left,10) ;
				o.top =  parseInt(this.node.style.top,10) ;
			}
			return o;
		};

		//rimuove la lente
		Lens.prototype.remove = function()
		{
			if(settings.zoomType === 'innerzoom') {
				$('div.jqZoomPup',a).fadeOut('fast',function(){
					/*$('div.jqZoomPup img').remove();*/
					$(this).remove();
				});
			} else {
				//$('div.jqZoomPup img').remove();
				$('div.jqZoomPup',a).remove();
			}
		};

		Lens.prototype.findborder = function()
		{
			var bordertop = '';
			bordertop = $('div.jqZoomPup').css('borderTop');
			//alert(bordertop);
			lensbtop = '';
			var borderleft = '';
			borderleft = $('div.jqZoomPup').css('borderLeft');
			lensbleft = '';
			if($.browser.msie) {
				var temp;
				temp = bordertop.split(' ');
				bordertop = temp[1];
				temp = borderleft.split(' ');
				borderleft = temp[1];
			}

			if(bordertop) {
				for(i=0;i<3;i++) {
					var x = [];
					x = bordertop.substr(i,1);

					if(isNaN(x) === false) {
						lensbtop = lensbtop +''+ bordertop.substr(i,1);
					} else {
						break;
					}
				}
			}

			if(borderleft) {
				for(i=0;i<3;i++) {
					if(!isNaN(borderleft.substr(i,1))) {
						lensbleft = lensbleft + borderleft.substr(i,1);
					} else {
						break;
					}
				}
			}
			lensbtop = (lensbtop.length > 0) ? eval(lensbtop) : 0;
			lensbleft = (lensbleft.length > 0) ? eval(lensbleft) : 0;
		};

		//LARGEIMAGE
		function Largeimage( url ) {
			this.url = url;
			this.node = new Image();

			/*if(settings.preloadImages)
			{
			 	preload.push(new Image());
				preload.slice(-1).src = url ;
			}*/

			this.loadimage = function() {
				if(!this.node) {
					this.node = new Image();
				}
			
				this.node.style.position = 'absolute';
				this.node.style.display = 'none';
				this.node.style.left = '-5000px';
				this.node.style.top = '10px';
				
				loader = new Loader();

				if(settings.showPreload && !preloadshow) {
					loader.show();
					preloadshow = true;
				}
				this.node.src = this.url; // fires off async								
				document.body.appendChild( this.node );			
			};
//******
			this.node.onload = function() {

				this.style.display = 'block';
				var w = $(this).width();
				var h = $(this).height();

				this.style.display = 'none';
				
				//setting scale
				scale.x = (w / smallimagedata.w);
				scale.y = (h / smallimagedata.h);

				if($('div.preload').length > 0) {
					$('div.preload').remove();
				}

				largeimageloaded = true;

				if(settings.zoomType !== 'innerzoom' && running) {
					stage = new Stage();
					stage.activate();
				}

				if(running) {
					//alert('in');
					lens = new Lens();
					lens.activate() ;
				}
				//la attivo
				if($('div.preload').length > 0) {
					$('div.preload').remove();
				}
			};
			return this;
		}
		Largeimage.prototype.setWidth = function(e) {
			return this.node.style.width;
		}
		Largeimage.prototype.setheight = function(e) {
			return this.node.style.width;
		}
		Largeimage.prototype.setposition = function(e) {
			if($.browser.msie) {
				this.node.style.left = 0 + parseInt(bleft,10);
				this.node.style.top = 0 + parseInt(btop,10);
			} else {
				//this.node.style.left = Math.ceil( - scale.x * parseInt(lens.getoffset().left,10) + bleft) + 'px';
				//this.node.style.top = Math.ceil( - scale.y * parseInt(lens.getoffset().top,10) +btop) + 'px';
			
          			$(this.node).css("left", parseInt(Math.ceil( - scale.x * parseInt(lens.getoffset().left,10) + bleft),10) + 'px');
				$(this.node).css("top", parseInt(Math.ceil( - scale.y * parseInt(lens.getoffset().top,10) +btop),10) + 'px');
			}
		};

		//setto la posizione dell'immagine grande nel caso di innerzoom
		Largeimage.prototype.setinner = function(e) {
          		$(this.node).css("left", parseInt(Math.ceil( - scale.x * Math.abs(e.pageX - smallimagedata.pos.l)),10) + 'px');
			$(this.node).css("top", parseInt(Math.ceil( - scale.y * Math.abs(e.pageY - smallimagedata.pos.t)),10) + 'px');
			$('div.jqZoomPup img',a).css({'position': 'absolute','top': parseInt(this.node.style.top,10),'left': parseInt(this.node.style.left,10)});
		};

		Largeimage.prototype.setcenter = function() {
          		$(this.node).css("left", parseInt(Math.ceil(- scale.x * Math.abs((smallimagedata.w)/2)),10) + 'px');
			$(this.node).css("top", parseInt(Math.ceil( - scale.y * Math.abs((smallimagedata.h)/2)),10) + 'px');
			$('div.jqZoomPup img',a).css({'position': 'absolute','top': parseInt(this.node.style.top,10),'left': parseInt(this.node.style.left,10)});
		};

		//STAGE
		function Stage() {
			var leftpos = smallimagedata.pos.l;
			var toppos = smallimagedata.pos.t;
			//creating element and class
			$('.jqZoomWindow').remove();
			this.node = document.createElement("div");
			$(this.node).addClass('jqZoomWindow');

			$(this.node ).css({
					position: 'absolute',
					width: parseInt(Math.round(settings.zoomWidth),10) + 'px',
					height: parseInt(Math.round(settings.zoomHeight),10) + 'px',
					display: 'none',
					zIndex: 999,
					overflow: 'hidden'
				});

			//fa il positionamento
			switch(settings.position) {
				case "right":
					if (smallimagedata.pos.r + Math.abs(settings.xOffset) + settings.zoomWidth < screen.width) {
						leftpos = smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset);
					} else {
						leftpos = smallimagedata.pos.l - settings.zoomWidth - Math.abs(settings.xOffset);
					}
					topwindow = smallimagedata.pos.t + settings.yOffset + settings.zoomHeight;
					if (topwindow < screen.height && topwindow > 0) {
						toppos = smallimagedata.pos.t + settings.yOffset;
					} else {
						toppos = smallimagedata.pos.t;
					}
			    		break;

				case "left":
					if (smallimagedata.pos.l - Math.abs(settings.xOffset) - settings.zoomWidth > 0) {
						leftpos = smallimagedata.pos.l - Math.abs(settings.xOffset) - settings.zoomWidth;
					} else {
						leftpos = smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset);
					}
					topwindow = smallimagedata.pos.t + settings.yOffset + settings.zoomHeight;
					if (topwindow < screen.height && topwindow > 0) {
						toppos = smallimagedata.pos.t + settings.yOffset;
					} else {
						toppos = smallimagedata.pos.t;
					}
			    		break;

				case "top":
					if (smallimagedata.pos.t - Math.abs(settings.yOffset) - settings.zoomHeight > 0) {
						toppos = smallimagedata.pos.t - Math.abs(settings.yOffset) - settings.zoomHeight;
					} else {
						toppos = smallimagedata.pos.t + smallimagedata.h + Math.abs(settings.yOffset);
					}
	
					leftwindow = smallimagedata.pos.l + settings.xOffset + settings.zoomWidth;
					if (leftwindow < screen.width && leftwindow > 0) {
						leftpos = smallimagedata.pos.l + settings.xOffset;
					} else {
						leftpos = smallimagedata.pos.l;
					}
			    		break;

				case "bottom":
					if (smallimagedata.pos.b + Math.abs(settings.yOffset) + settings.zoomHeight < $('body').height()) {
						toppos = (smallimagedata.pos.b + Math.abs(settings.yOffset));
					} else {
						toppos = (smallimagedata.pos.t - settings.zoomHeight - Math.abs(settings.yOffset));
					}
					leftwindow = smallimagedata.pos.l + settings.xOffset + settings.zoomWidth;
					if (leftwindow < screen.width && leftwindow > 0) {
						leftpos = smallimagedata.pos.l + settings.xOffset;
					} else {
						leftpos = smallimagedata.pos.l;
					}
			    		break;

				case "absolute":
					toppos = Math.abs(parseInt(settings.yOffset,10));
					leftpos = Math.abs(parseInt(settings.xOffset,10)+10);
					
			    		break;

				default:
					if (smallimagedata.pos.l + smallimagedata.w + settings.xOffset + settings.zoomWidth < screen.width) {
						leftpos = (smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset));
					} else {
						leftpos = (smallimagedata.pos.l - settings.zoomWidth - Math.abs(settings.xOffset));
					}
	
					if (smallimagedata.pos.b + Math.abs(settings.yOffset) + settings.zoomHeight < screen.height) {
						toppos = (smallimagedata.pos.b + Math.abs(settings.yOffset));
					} else {
						toppos = (smallimagedata.pos.t - settings.zoomHeight - Math.abs(settings.yOffset));
					}
			    		break;
			}
			this.node.style.position = "absolute";
			this.node.style.left = parseInt(leftpos,10) + 'px';
			this.node.style.top = parseInt(toppos,10) + 'px';
			return this;
		}

		Stage.prototype.activate = function() {
			if (settings.CallbackBefore !== null) {
				settings.CallbackBefore();
			}
			if ( !this.node.firstChild ) {
//alert('x ' + largeimage.node.style.left);
				this.node.appendChild( largeimage.node );
			}

			if(settings.title) {
				ZoomTitleObj.loadtitle();
			}

			document.body.appendChild( this.node );

			switch(settings.showEffect) {
				case 'show':
					$(this.node).show();
					break;
				case 'fadein':
					$(this.node).fadeIn(settings.fadeinSpeed);
					break;
				default:
					$(this.node).show();
					break;
			}
			$(this.node).show();

            	if ($.browser.msie && $.browser.version < 7) {
            	//if ($.browser.msie) {
				this.ieframe = $('<iframe class="zoom_ieframe" frameborder="0" src="#"></iframe>')
					.css({ position: "absolute", left: parseInt(this.node.style.left,10), top: parseInt(this.node.style.top,10), zIndex: 99, width: parseInt(settings.zoomWidth,10), height: parseInt(settings.zoomHeight,10)})
					.insertBefore(this.node);
			}
			largeimage.node.style.display = 'block';
		};

		Stage.prototype.remove = function() {
			switch(settings.hideEffect) {
				case 'hide':
					$('.jqZoomWindow').remove();
					break;
				case 'fadeout':
					$('.jqZoomWindow').fadeOut(settings.fadeoutSpeed);
					break;
				default:
					$('.jqZoomWindow').remove();
					break;
			}
			if (settings.CallbackAfter !== null) {
				settings.CallbackAfter();
			}
		};

		function zoomTitle() {
			this.node =  jQuery('<div />')
				.addClass('jqZoomTitle')
				.html('' + ZoomTitle +'');

			this.loadtitle = function() {
				if(settings.zoomType === 'innerzoom') {
					$(this.node).css({
						position: 'absolute',
						top: parseInt(smallimagedata.pos.b +3,10),
						left: parseInt((smallimagedata.pos.l+1),10),
						width: parseInt(smallimagedata.w,10)
						})
					.appendTo('body');
				} else {
					$(this.node).appendTo(stage.node);
				}
			};
		}

		zoomTitle.prototype.remove = function() {
			$('.jqZoomTitle').remove();
		};

		function Loader() {
			this.node = document.createElement("div");
			$(this.node).addClass('preload');
			$(this.node).html(settings.preloadText);//appendo il testo

			$(this.node )
				.appendTo("body")
				.css('visibility','hidden');

			this.show = function() {
				var loadertop = 0;
				var loaderleft = 0;
				switch(settings.preloadPosition) {
					case 'center':
						loadertop =  smallimagedata.pos.t + (smallimagedata.h - $(this.node ).height())/2;
						loaderleft = smallimagedata.pos.l + (smallimagedata.w - $(this.node ).width())/2;
						break;
					default:
						var loaderoffset = $(this.node).offset();
						loadertop = !isNaN(loaderoffset.top) ? smallimagedata.pos.t + loaderoffset.top : smallimagedata.pos.t + 0;
						loaderleft = !isNaN(loaderoffset.left) ? smallimagedata.pos.l + loaderoffset.left : smallimagedata.pos.l + 0;
						break;
				}

				//setting position
				$(this.node).css({
							top: parseInt(loadertop,10)  ,
							left: parseInt(loaderleft,10) ,
							position: 'absolute',
							visibility:'visible'
					    	});
				};
			return this;
		}

		Loader.prototype.getoffset = function() {
			var o = null;
			o = $('div.preload').offset();
			return o;
		};

		});
	};
})(jQuery);

function trim(stringa) {
    while (stringa.substring(0,1) === ' '){
        stringa = stringa.substring(1, stringa.length);
    }
    while (stringa.substring(stringa.length-1, stringa.length) === ' '){
        stringa = stringa.substring(0,stringa.length-1);
    }
    return stringa;
}
	
