/*
 * 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(){
	$(".jqzoom").jqzoom();
});
(function($){
    $.fn.jqzoom = function(options){
        var settings = {
            zoomType: 'standard', //standard/reverse/innerzoom
            zoomWidth: 450,		//zoomed width default width
            zoomHeight: 450,		//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 = 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;
		}
	    }

	    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.src = this.url;
		    
		    //added on 10-05-2010
		    //author: FK
		    //to activate the already-default-hover-zoom
		    this.node.id = 'zoomedImage';
		    var newSrc = $("#zoomlargeImg").attr("href");
		    $("#zoomedImage").attr('src', newSrc);
		    
		}
	    
		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){
		    //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;
}
