/*
 * 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
		};

		// extending options
		options = options || {};
		$.extend(settings, options);

		return this.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 = {};
				// 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 = false;
				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() {

					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.url != a[0].href) {
							largeimage = new Largeimage(a[0].href);
							largeimageloaded = false;
							preloadshow = false;
						}

						// 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;
					}

				}

				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();

						// 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;
						}

						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') {
						/*
						 * 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() {
					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');
					// alert(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 = ((1.0 * w) / smallimagedata.w);
						scale.y = ((1.0 * 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.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'
					});

					// fa il positionamento
					switch (settings.position) {
					case "right":

						leftpos = (smallimagedata.pos.r
								+ Math.abs(settings.xOffset)
								+ settings.zoomWidth < screen.width) ? (smallimagedata.pos.l
								+ smallimagedata.w + Math.abs(settings.xOffset))
								: (smallimagedata.pos.l - settings.zoomWidth - 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 "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();
					}

					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) {
						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;
}