/*
 * 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: 265,		//zoomed width default width
            zoomHeight: 265,		//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 : true,
            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

            smallImageClass: 'jqzoom-small-image',
            mediumImageClass: 'jqzoom-medium-image'
        };

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

            /* bind click to small image */
            $('.' + settings.smallImageClass).click(function() {
                var _this = $(this);

                $('.jqzoom').attr('href', _this.attr('rev'));
                $('.' + settings.mediumImageClass).attr('src', _this.attr('rel'));

                /* Reset title */
                ZoomTitle = _this.attr('title');
                ZoomTitleObj = new zoomTitle();

                /* Reload image */
                largeimage = new Largeimage(_this.attr("rev"));
                largeimage.loadimage();

                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 ).innerWidth();
                    smallimagedata.h = $( this ).innerHeight();


                    //non viene fatta assegnazione alla variabile globale
                    smallimagedata.h = $( this ).innerHeight();
                    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.css("height",smallimagedata.h);
                    a.css("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).innerWidth());
                    var	h = Math.round($(this).innerHeight());

                    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').innerHeight())
                        ? (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 ).innerHeight())/2;
                            loaderleft = smallimagedata.pos.l + (smallimagedata.w - $(this.node ).innerWidth())/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(text)
{
    while (text.substring(0,1) == ' '){
        text = text.substring(1, text.length);
    }
    while (text.substring(text.length-1, text.length) == ' '){
        text = text.substring(0,text.length-1);
    }
    return text;
}
