/*
*  jquery.ACKSlider2
*  Versione: 1.0 - Data: 20/04/2011
*  -----------------------------------------------------------
*  Versione revisionata per il multislider.
*  -----------------------------------------------------------  
*
*  TO DO :
*  - Utilizzare l'easing di jQuery Easing
*
*  HISTORY:
*
*  BUG:
*/

(function($){  
     $.fn.ackslider3 = function(options) {  

         var $this = '';
         var defaults = {
            speed             : 500,                     //velocità di slide
            pixel_step        : 100,                     //numero di pixel di slide
            rightHref         : "#btn_right",            //id bottone di slide a destra
            leftHref          : "#btn_left",             //id bottone di slide a sinistra
            topHref           : "#btn_top",              //id bottone di slide su
            downHref          : "#btn_down",             //id bottone di slide giu
            max_width         : 0,
            max_height        : 0,
            activeRPLC        : 0,                       //attivazione replace dei pulsanti di slide
            rightRPLC         : "#btn_right_vuoto",      //id bottone di slide a destra vuoto
            leftRPLC          : "#btn_left_vuoto",       //id bottone di slide a sinistra vuoto
            topRPLC           : "#btn_top_vuoto",        //id bottone di slide su vuoto
            downRPLC          : "#btn_down_vuoto",       //id bottone di slide giu destra vuoto
            easingFx          : "linear",                //effetto di movimento (http://gsgd.co.uk/sandbox/jquery/easing/)
            navigation        : false,                   //attivazione navigazione a elementi
            navigationId      : "#navigation",           //id navigazione a elementi
            navigationHover   : false,                   //attivazione hover navigazione a elementi
            autoSlider        : false,                   //attivazione slide automatico
            autoSliderTime    : 2000,                    //intervallo tra uno slide e l'altro (solo su slide automatico)
            autoSliderAltRPLC : false,                   //se attivato (true) mette nello autoSliderAltId il contenuto dell'alt
            autoSliderAltId   : "#slider_alt_container",
            returnNoSlide     : false
         };

         /**
          * Metodo : init();
          * Inizializzazione dello slider.
          * Imposta un'array con tutti i dati dello slider
          * return array;
          */
         $.init = function(obj, opt) {

            //assegnazione degli attributi a maschera e maschera_in
            obj.attr({
               style: "overflow: hidden; position: relative;"
            });
            obj.children().attr({
               style: " position: absolute; left: 0px; top:0px; width: 99999px;"
            });

            //variabili da ritornare
            mask = obj.children();                // maschera esterna
            mask_in = mask.children();            // maschera ul
            begin_pos = 1;                        // definisco l'inizio degli elementi
            end_pos = mask_in.length;             // definisco la fine degli elementi

            // dimensioni maschera interna
            mask_in_width = opt.max_width;
            mask_in_height = opt.max_height;

            //se la larghezza della maschera_in non è definita la definisco
            if (mask_in_width==0) {
               //ciclo gli elementi e calcolo la larghezza della maschera_in
               $.each(mask_in, function(key, value) {
                  mask_in_width = mask_in_width + $(value).outerWidth(true);
               });
               mask_in_width = 0 - mask_in_width;
            }

            //se l'altezza della maschera_in non è definita la definisco
            mask_in_height = (mask_in.height() - mask.height());
            mask_in_height = 0 - mask_in_height;

            //definizione dell'array di ritorno
            config = {
               mask : mask,
               mask_in : mask_in,
               element_array : mask_in,
               begin_position: begin_pos,
               end_position : end_pos,
               mask_in_width : mask_in_width,
               mask_in_height : mask_in_height,
               position : 1,
               authorization : true,
               navigationId :  opt.navigationId
            }

            //permetto la disattivazione dei pulsanti
            if (opt.activeRPLC==1) {
               $.replaceBtnLimit(config, opt);
            }

            return config;
         }

         /**
          * Metodo : replaceBtnLimit(config, setting);
          * Funzione che mostra/nasconde le frecce per la navigazione
          * return integer;
          */
         $.replaceBtnLimit = function(config, opt) {
            if ($.get_x(config.mask, opt)==0) { //se la posizione è uguale a 0 faccio scomparire il pulsante di sinistra
               $(opt.leftHref).css({display: "none"});
               $(opt.leftRPLC).css({display: "inline"});
            } else { //altrimenti faccio ricomparire il pulsante di sinistra
               $(opt.leftRPLC).css({display: "none"});
               $(opt.leftHref).css({display: "inline"});
            }
            if (($.get_x(config.mask, opt)-$(config.mask).parent().width())==config.mask_in_width) {
               $(opt.rightHref).css({display: "none"});
               $(opt.rightRPLC).css({display: "inline"});
            } else {
               $(opt.rightRPLC).css({display: "none"});
               $(opt.rightHref).css({display: "inline"});
            }
         }
         
         /**
          * Metodo : get_x();
          * Funzione che passando l'id restituisce la posizione
          * x nello slider.
          * return integer;
          */
         $.get_x = function(obj, opt) {
            l = obj.css("left");
            if (l=='auto') {
               l = '0px';
            }
            l = l.replace("px", "");
            l = parseInt(l);
            ratio = l/opt.pixel_step;
            return l;  //restituisce la posizione X parsata come intero
         }
         
         /**
          * Metodo : get_y();
          * Funzione che passando l'id restituisce la posizione
          * y nello slider.
          * return integer;
          */
         $.get_y = function(obj, opt) {
            l = obj.css("top");
            l = l.replace("px", "");
            if (l=='auto') {
               l = '0px';
            }
            l = parseInt(l);
            ratio = l/opt.pixel_step;
            return l;  //restituisce la posizione Y parsata come intero
         }
         
         /**
          * Metodo : slidermovement(direzione);
          * Funzione che muove l'elenco nella maschera
          * return integer;
          */
          $.slidermovement = function(where, cfg, opt) {
            switch(where) {
               case "right":
                  x = $.get_x(cfg.mask, opt);
                  if (cfg.authorization==true){
                     cfg.authorization = false;
                     element_position = parseInt(cfg.position) + 1;  //incremento/decremento la posizione dell'elemento
                     new_position = x - parseInt(opt.pixel_step);
                     //parte nuova ale 2012
                     mask_overflow = $(cfg.mask).parent().width();
                     diff_mask = cfg.mask_in_width + mask_overflow;
                     //parte nuova ale 2012 - include anche caso OR nell'if qua sotto
                     if (((new_position - opt.pixel_step) <= cfg.mask_in_width) || (new_position<diff_mask)){ //se la nuova posizione è minore del massimo scorro fino al massimo
                        new_position = cfg.mask_in_width + mask_overflow;
                     }
                     mask = cfg.mask;
                     mask.animate({ left: new_position + "px"}, { duration: opt.speed, easing: opt.easingFx, complete: function(){
                           cfg.authorization = true;
                           if (opt.activeRPLC==1){
                              $.replaceBtnLimit(cfg, opt);
                              if (opt.navigation==true){
                                 $.resetNavigation(cfg, opt);
                                 $(opt.navigationId).children("[rel=" + cfg.position + "]").css("background-position", "bottom");
                              }
                           }
                           //$.autoSliderAltRPLC(cfg, opt);
                        } 
                     });
                  }
               break;
               case "left":
                  x = $.get_x(cfg.mask, opt);
                  if (cfg.authorization==true){
                     cfg.authorization = false;
                     element_position = cfg.position - 1;  //incremento/decremento la posizione dell'elemento
                     new_position = x + parseInt(opt.pixel_step);
                     if (new_position > 0){
                        new_position = 0;
                     }
                     mask = cfg.mask;
                     mask.animate({left: new_position + "px"}, {duration: opt.speed, easing: opt.easingFx, complete: function(){
                           cfg.authorization = true;
                           if (opt.activeRPLC==1){
                              $.replaceBtnLimit(cfg, opt);
                           }
                           if (options.navigation==true){
                              resetNavigation();
                              $(opt.navigationId).children("[rel=" + element_position + "]").css("background-position", "bottom");
                           }
                           //$.autoSliderAltRPLC(cfg, opt);
                        }
                     });
                  }
               break;
               case "top":
                  y = $.fn.get_y(id_mask_in);
                  if (authorization==true){
                     authorization = false;
                     element_position = element_position - 1;  //incremento/decremento la posizione dell'elemento
                     if (options.activeRPLC==1) {
                        replaceBtn(options.topHref, options.topRPLC, element_position, begin_position);   //chiamo la funzione che fa apparire/sparire il pulsante di sinistra
                        replaceBtn(options.downHref, options.downRPLC, element_position, end_position);   //chiamo la funzione che fa apparire/sparire il pulsante di destra
                     }
                     new_position = y + parseInt(options.pixel_step);
                     if (new_position > 0){
                        new_position = 0;
                     }
                     $(id_mask_in).animate({top: new_position + "px"}, {duration: options.speed, easing: options.easingFx, complete: function() {
                           authorization = true;
                        }
                     });
                  }
               break;
               case "down":
                  y = $.fn.get_y(id_mask_in);
                  if (authorization==true){
                     authorization = false;
                     element_position = element_position + 1;  //incremento/decremento la posizione dell'elemento
                     if (options.activeRPLC==1) {
                        replaceBtn(options.topHref, options.topRPLC, element_position, begin_position);   //chiamo la funzione che fa apparire/sparire il pulsante di sinistra
                        replaceBtn(options.downHref, options.downRPLC, element_position, end_position);   //chiamo la funzione che fa apparire/sparire il pulsante di destra
                     }
                     new_position = y - parseInt(options.pixel_step);
                     if ((new_position + options.pixel_step) <= mask_in_height) { //se la nuova posizione è minore del massimo scorro fino al massimo
                        new_position = mask_in_height;
                     }
                     $(id_mask_in).animate({ top: new_position + "px"}, { duration: options.speed, easing: options.easingFx, complete: function(){
                           authorization = true;
                        } 
                     });
                  }
               break;                  
            }            

         }

         /**
          * Metodo : autoSliderReplaceALT(config, options);
          * Funzione che muove l'elenco nella maschera
          * return integer;
          */
         $.autoSliderReplaceALT = function(config, opt) {
            if (opt.autoSlider==true && opt.autoSliderAltRPLC==true) {
               $(opt.autoSliderAltId).html($(id_mask_in + " li:nth-child(" + element_position + ")").attr("alt"));
            }
            if (opt.autoSlider==true && opt.autoSliderTitRPLC==true) {
               $(opt.autoSliderTitId).html($(id_mask_in + " li:nth-child(" + element_position + ")").attr("title"));
            }
         }
         
         /**
          * Metodo : resetNavigation(object, config, options);
          * Funzione che azzera l'over dei pallini
          * return none;
          */
         $.resetNavigation = function(config, opt) {
            $(config.navigationId).children().each(function() {
               if (opt.navigationHover==true){
                  $(this).css("background-position", "top");
               }
            });
         }

         /**
          * Metodo : autoslide(config, options);
          * Funzione che abilita l'autoslide
          * return integer;
          */
         $.autoslide = function(config, opt) {
            var t = setInterval(function(){
               if (config.position<config.end_position){
                  config.position = config.position + 1;
                  $.slidermovement('right', config, opt);
               } else {
                  config.position = 1;
                  new_position = 0;
                  //alert(opt.returnNoSlide + '--' + new_position);
                  if (opt.returnNoSlide==true) {
                     mask.css({
                        left : '0px'
                     });
                     config.authorization = true;
                     if (opt.activeRPLC==1){
                        $.replaceBtnLimit(config, opt);
                        if (opt.navigation==true){
                           $.resetNavigation(config, opt);
                           $(opt.navigationId).children("[rel=" + config.position + "]").css("background-position", "bottom");
                        }
                     }
                     $.autoSliderReplaceALT(config, opt);
                  } else {                  
                     mask = config.mask;
                     mask.animate({ left: new_position + "px"}, { duration: opt.speed, easing: opt.easingFx, complete: function(){
                           config.authorization = true;
                           if (opt.activeRPLC==1){
                              $.replaceBtnLimit(config, opt);
                              if (opt.navigation==true){
                                 $.resetNavigation(config, opt);
                                 $(opt.navigationId).children("[rel=" + config.position + "]").css("background-position", "bottom");
                              }
                           }
                           $.autoSliderReplaceALT(config, opt);
                        } 
                     });
                  }
               }
            }, opt.autoSliderTime);
            return t;
         }

         return this.each(function() {

            // Oggetto slider
            $this = $(this);

            if (options) { 
               $.extend(defaults, options);
            }
            
            // Inizializzazione
            $this.cfg = $.init($this, defaults);
            $this.def = defaults;

            //variabili per il timeout
            $this.timeout = false;
            
            //definizione della navigazione
            //nav = 1;
            if ($this.def.navigation==true){
               for (nav=1; nav<=$this.cfg.end_position; nav=nav+1) {
                  if (nav==1 && $this.def.navigationHover==true) {
                     $($this.def.navigationId).append("<li rel=\"" + nav + "\" style=\"background-position: bottom;\">&nbsp;</li>");
                  } else {
                     $($this.def.navigationId).append("<li rel=\"" + nav + "\">&nbsp;</li>");
                  }
               }
            }

            //setup iniziale dell'alt
            $.autoSliderReplaceALT($this.cfg, $this.def);
            
            //movimento a destra
            $($this.def.rightHref).click(function(){
               $.slidermovement('right', $this.cfg, $this.def);
            });

            //movimento a sinistra
            $($this.def.leftHref).click(function(){
               $.slidermovement('left', $this.cfg, $this.def);
            });
            
            //movimento giu
            $($this.def.downHref).click(function(){
               $.slidermovement('down', $this.cfg, $this.def);
            });
            
            //movimento su
            $($this.def.topHref).click(function(){
               $.slidermovement('top', $this.cfg, $this.def);
            });
                                    
            //navigazione tramite "pallini"
            if ($this.def.navigation==true){
               $($this.def.navigationId).children().click(function() {
                  if ($this.def.navigationHover==true){
                     $.resetNavigation($this.cfg, options);
                     $(this).css("background-position", "bottom");
                     element_position = $(this).attr("rel");
                     new_position = 0 - (($(this).attr("rel")-1)*options.pixel_step);
                     mask = $this.cfg.mask;
                     mask.animate({ left: new_position + "px"}, { duration: options.speed, easing: options.easingFx, complete: function(){
                           authorization = true;
                           if (options.activeRPLC==1){
                              $.replaceBtnLimit($this.cfg, options);
                           }
                        } 
                     });
                  }
               });
            }
            
            //slider automatico
            if ($this.def.autoSlider==true){
               $this.timeout = $.autoslide($this.cfg, $this.def);
            }

            //stop del timer all'hover
            $this.mouseover(function(){
               if ($this.def.autoSlider==true){
                  clearInterval($this.timeout);
               }
            });
                        
            //stop del timer all'hover
            $this.mouseout(function(){
               if ($this.def.autoSlider==true){
                  $this.timeout = $.autoslide($this.cfg, $this.def);
               }
            });
            
         });
        
     };  
})(jQuery);
