/*
 * 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.2,
			title: true,
			alwaysOn: false,
			showEffect: 'show',
			hideEffect: 'hide',
			fadeinSpeed: 'fast',
			fadeoutSpeed: 'slow',
			preloadImages: true,
			showPreload: true,
			preloadText: 'Loading zoom',
			preloadPosition: 'center', //bycss,
			width: -1,
			height: -1,
			offset: -1
		};

		//extending options
		options = options || {};
		$.extend(settings, options);


		return this.unbind().each(function () {
			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 smallimage = new Smallimage(img);
			var smallimagedata = {};

			//al docuemnt ready viene caricato l'src quindi viene azionato l'onload e carico tutti i dati
			if (settings.width == -1) {
				smallimagedata.w = $(this).width();
			}
			else {
				smallimagedata.w = settings.width;
			}
			// console.log("Small image width: " + smallimagedata.w);
			
			if (settings.height == -1) {
				smallimagedata.h = $(this).height();
			}
			else {
				smallimagedata.h = settings.height;
			}
			
			// console.log("Small image height: " + smallimagedata.h);

			// alert(smallimagedata.h);
			//non viene fatta assegnazione alla variabile globale
			
			if (settings.offset == -1) {
				smallimagedata.pos = $(this).offset();
			}
			else {
				smallimagedata.pos = settings.offset;
			}
			
			smallimagedata.pos.l = smallimagedata.pos.left;
			// console.log("Small image offset left: " + smallimagedata.pos.l);
			smallimagedata.pos.t = smallimagedata.pos.top;
			// console.log("Small image offset top: " + smallimagedata.pos.t);
			smallimagedata.pos.r = smallimagedata.w + smallimagedata.pos.l;
			smallimagedata.pos.b = smallimagedata.h + smallimagedata.pos.t;


			//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


			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 = true;
			var isMouseDown = false;
			var dragstatus = false
			//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 = e.pageX;
				mousepos.y = e.pageY;
				activate();
			}, function () {
				deactivate();
			});


			//ALWAYS ON
			if (settings.alwaysOn) {
				setTimeout(function () {
					activate();
				}, 150);
			}


			function activate() {

				// console.log('In 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();
					}
					
					// console.log('I get here');
					

					//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();
					
					// console.log('And here');
					
					return false;
				}




			}

			function deactivate() {

				// console.log('In 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 () {
					
					// console.log('In smallimage.onload');
					
					//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'
						});
					}

					// //al docuemnt ready viene caricato l'src quindi viene azionato l'onload e carico tutti i dati
					// if (settings.width == -1) {
					// 	smallimagedata.w = $(this).width();
					// }
					// else {
					// 	smallimagedata.w = settings.width;
					// }
					// console.log("Small image width: " + smallimagedata.w);
					// 
					// if (settings.height == -1) {
					// 	smallimagedata.h = $(this).height();
					// }
					// else {
					// 	smallimagedata.h = settings.height;
					// }
					// 
					// console.log("Small image height: " + smallimagedata.h);
					// 
					// // alert(smallimagedata.h);
					// //non viene fatta assegnazione alla variabile globale
					// 
					// if (settings.offset == -1) {
					// 	smallimagedata.pos = $(this).offset();
					// }
					// else {
					// 	smallimagedata.pos = settings.offset;
					// }
					// 
					// smallimagedata.pos.l = smallimagedata.pos.left;
					// console.log("Small image offset left: " + smallimagedata.pos.l);
					// smallimagedata.pos.t = smallimagedata.pos.top;
					// console.log("Small image offset top: " + smallimagedata.pos.t);
					// 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 () {

					// console.log('In Lens.loadlens');


					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;
					}



					switch (settings.zoomType) {
					case 'innerzoom':
						lensdata.w = smallimagedata.w;
						lensdata.h = smallimagedata.h;
						break;
					default:
						lensdata.w = (settings.zoomWidth) / scale.x;
						lensdata.h = (settings.zoomHeight) / scale.y;
						break;
					}

					$(this.node).css({
						width: lensdata.w + 'px',
						height: lensdata.h + 'px',
						position: 'absolute',
						/*cursor: 'crosshair',*/
						display: 'none',
						//border: '1px solid blue'
						borderWidth: 1 + 'px'
					});
					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
					});

					(settings.alwaysOn) ? lens.center() : 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 );
					});
					*/


					(settings.alwaysOn) ? lens.center() : 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;
				}

				if (firstime == 0) {
					var lensleft = (smallimagedata.w) / 2 - (lensdata.w) / 2;
					var 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 {
					var lensleft = mousepos.x - smallimagedata.pos.l - (lensdata.w) / 2;
					var 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
				//sotto
				if (overbottom()) {

					if ($.browser.msie) {
						lenstop = smallimagedata.h - lensdata.h + btop + 1;
					} else {
						lenstop = smallimagedata.h - lensdata.h - 1 + btop;
					}

				}
				lensleft = parseInt(lensleft);
				lenstop = parseInt(lenstop);

				//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 = lensleft + 'px';
				this.node.style.top = lenstop + '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 = lensleft + 'px';
				this.node.style.top = lenstop + 'px';
				$('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)
					});
				}

				largeimage.setposition();
				if ($.browser.msie) {
					$('div.jqZoomPup', a).show();
				} else {
					setTimeout(function () {
						$('div.jqZoomPup').fadeIn('fast');
					}, 10);
				}
			};


			//ritorna l'offset
			Lens.prototype.getoffset = function () {
				
				var o = {};
				o.left = parseInt(this.node.style.left);
				o.top = parseInt(this.node.style.top);
				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');
				lensbtop = '';
				var borderleft = '';
				borderleft = $('div.jqZoomPup').css('borderLeft');
				lensbleft = '';
				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) {
							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;
					}


					document.body.appendChild(this.node);
					this.node.src = this.url; // fires off async
				}

				this.node.onload = function () {
										
					this.style.display = 'block';
					var w = Math.round($(this).width());
					var h = Math.round($(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) {
						lens = new Lens();

						lens.activate();

					}
					//la attivo
					if ($('div.preload').length > 0) {
						$('div.preload').remove();
					}
				}
				return this;
			}


			Largeimage.prototype.setposition = function () {
								
				this.node.style.left = Math.ceil(-scale.x * parseInt(lens.getoffset().left) + bleft) + 'px';
				this.node.style.top = Math.ceil(-scale.y * parseInt(lens.getoffset().top) + btop) + 'px';
			};

			//setto la posizione dell'immagine grande nel caso di innerzoom
			Largeimage.prototype.setinner = function (e) {
								
				this.node.style.left = Math.ceil(-scale.x * Math.abs(e.pageX - smallimagedata.pos.l)) + 'px';
				this.node.style.top = Math.ceil(-scale.y * Math.abs(e.pageY - smallimagedata.pos.t)) + 'px';
				$('div.jqZoomPup img', a).css({
					'position': 'absolute',
					'top': this.node.style.top,
					'left': this.node.style.left
				});
			};


			Largeimage.prototype.setcenter = function () {
								
				this.node.style.left = Math.ceil(-scale.x * Math.abs((smallimagedata.w) / 2)) + 'px';
				this.node.style.top = Math.ceil(-scale.y * Math.abs((smallimagedata.h) / 2)) + 'px';


				$('div.jqZoomPup img', a).css({
					'position': 'absolute',
					'top': this.node.style.top,
					'left': this.node.style.left
				});
			};


			//STAGE


			function Stage() {

				var leftpos = smallimagedata.pos.l;
				var toppos = smallimagedata.pos.t;
				//creating element and class
				this.node = document.createElement("div");
				$(this.node).addClass('jqZoomWindow');

				$(this.node).css({
					position: 'absolute',
					width: Math.round(settings.zoomWidth) + 'px',
					height: Math.round(settings.zoomHeight) + 'px',
					display: 'none',
					zIndex: 10000,
					overflow: 'hidden'
				});

				// alert(smallimagedata.h);
				//fa il positionamento
				switch (settings.position) {
				case "right":

					leftpos = (smallimagedata.pos.r + Math.abs(settings.xOffset) + settings.zoomWidth < screen.width) ? (smallimagedata.w + Math.abs(settings.xOffset)) : (settings.zoomWidth - Math.abs(settings.xOffset));

					topwindow = smallimagedata.pos.t + settings.yOffset + settings.zoomHeight;
					toppos = (topwindow < screen.height && topwindow > 0) ? settings.yOffset : 0;

					break;
				case "left":

					leftpos = (smallimagedata.pos.l - Math.abs(settings.xOffset) - settings.zoomWidth > 0) ? (smallimagedata.pos.l - Math.abs(settings.xOffset) - settings.zoomWidth) : (smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset));

					topwindow = smallimagedata.pos.t + settings.yOffset + settings.zoomHeight;
					toppos = (topwindow < screen.height && topwindow > 0) ? smallimagedata.pos.t + settings.yOffset : smallimagedata.pos.t;

					break;
				case "top":

					toppos = (smallimagedata.pos.t - Math.abs(settings.yOffset) - settings.zoomHeight > 0) ? (smallimagedata.pos.t - Math.abs(settings.yOffset) - settings.zoomHeight) : (smallimagedata.pos.t + smallimagedata.h + Math.abs(settings.yOffset));


					leftwindow = smallimagedata.pos.l + settings.xOffset + settings.zoomWidth;
					leftpos = (leftwindow < screen.width && leftwindow > 0) ? smallimagedata.pos.l + settings.xOffset : smallimagedata.pos.l;

					break;
				case "bottom":


					toppos = (smallimagedata.pos.b + Math.abs(settings.yOffset) + settings.zoomHeight < $('body').height()) ? (smallimagedata.pos.b + Math.abs(settings.yOffset)) : (smallimagedata.pos.t - settings.zoomHeight - Math.abs(settings.yOffset));


					leftwindow = smallimagedata.pos.l + settings.xOffset + settings.zoomWidth;
					leftpos = (leftwindow < screen.width && leftwindow > 0) ? smallimagedata.pos.l + settings.xOffset : smallimagedata.pos.l;

					break;
				default:

					leftpos = (smallimagedata.pos.l + smallimagedata.w + settings.xOffset + settings.zoomWidth < screen.width) ? (smallimagedata.pos.l + smallimagedata.w + Math.abs(settings.xOffset)) : (smallimagedata.pos.l - settings.zoomWidth - Math.abs(settings.xOffset));

					toppos = (smallimagedata.pos.b + Math.abs(settings.yOffset) + settings.zoomHeight < screen.height) ? (smallimagedata.pos.b + Math.abs(settings.yOffset)) : (smallimagedata.pos.t - settings.zoomHeight - Math.abs(settings.yOffset));

					break;
				}

				this.node.style.left = leftpos + 'px';
				this.node.style.top = toppos + 'px';
				return this;
			}


			Stage.prototype.activate = function () {

				if (!this.node.firstChild) this.node.appendChild(largeimage.node);


				if (settings.title) {
					ZoomTitleObj.loadtitle();
				}



				a.append(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) {
					this.ieframe = $('<iframe class="zoom_ieframe" frameborder="0" src="#"></iframe>').css({
						position: "absolute",
						left: this.node.style.left,
						top: this.node.style.top,
						zIndex: 99,
						width: settings.zoomWidth,
						height: settings.zoomHeight
					}).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;
				}
			}

			function zoomTitle() {				

				this.node = jQuery('<div />').addClass('jqZoomTitle').html('' + ZoomTitle + '');

				this.loadtitle = function () {
									
					if (settings.zoomType == 'innerzoom') {
						$(this.node).css({
							position: 'absolute',
							top: smallimagedata.pos.b + 3,
							left: (smallimagedata.pos.l + 1),
							width: smallimagedata.w
						}).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 () {
										
					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.getoffset();
						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: loadertop,
						left: loaderleft,
						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;
}
