/*
 * 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: 350,    //zoomed width default width
            zoomHeight: 363,    //zoomed div default width
            xOffset: 30,    //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: 'fadeout',
            fadeinSpeed: 'fast',
            fadeoutSpeed: 'slow',
            preloadImages :true,
            showPreload: true,
            preloadText : 'Loading zoomed image...',
            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.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;
  }