/*
*  jquery.ACKSlider
*  Versione: 2.0 - Data: 01/02/2011
*  -----------------------------------------------------------
*  Versione revisionata del moveH/ACKSlider per implementare 
*  uno slider automatico con gestione singola della posizione.
*  Sviluppato per BitMAT 2.0 per la fascia video , da non 
*  confondere con l'ACKSlider semplice.
*  ATTENZIONE: Dalla versione 1.1 richiede i file 
*  $.easing.1.3.js e $.easing.compatibility.js
*  -----------------------------------------------------------  
*
*  TO DO :
*  - Modificare tutti i $ con il jQuery in modo che sia compatibile con anche gli script prototype senza il noConflict
*
*  HISTORY:
*  - Aggiunto l'auto dimensionamento della maschera in a 99999px
*  - Fixato il bug del "doppio click 2"
*  - Fixato il bug del "doppio click"
*  - Introduzione della possibilità di effetti "easing" (richiede i file $.easing.1.3.js, $.easing.compatibility.js)
*  - Introduzione della possibilità di nascondere/cambiare i tasti di destra/sinistra
*  - Introdotta la correzione degli style per maschera e maschera_in
*  - Aggiunta l'autocorrezione della posizione finale nel caso in cui ci siano immagini dinamiche con 
*  - Aggiungere lo slider verticale
*  - Aggiungere l'autoslider
*
*  BUG:
*  - Non calcola automaticamente la larghezza dei child di maschera_in su Safari/Chrome
*/

(function($){  
     $.fn.ackslider = function(options) {  
     
         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
            multichild        : false,
            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"
         };

         var options = $.extend(defaults, options);

         return this.each(function() {

            function getX(id) {
               l = $(id).css("left");
               l = l.replace("px", "");
               l = parseInt(l);
               ratio = l/options.pixel_step;
               return l;  //restituisce la posizione X parsata come intero
            }
            
            function getY(id) {
               l = $(id).css("top");
               l = l.replace("px", "");
               l = parseInt(l);
               ratio = l/options.pixel_step;
               return l;  //restituisce la posizione Y parsata come intero
            }
            
            function replaceBtn(id, id_rplc, position, hide_position, max_pix_mask) {
               if (!max_pix_mask) {
                  max_pix_mask = "";
               }
               //funzione che attiva l'elemento id e disattiva l'elemento id_rplc
               //viene utilizzata per attivare/disattivare i bottoni destra e sinistra
      			if (position==hide_position) {
                  $(id).css({display: "none"});
                  $(id_rplc).css({display: "inline"});
               } else {
                  $(id).css({display: "inline"});
                  $(id_rplc).css({display: "none"});
               }
            }
            
            function replaceBtnLimit() {
               if (getX(id_mask_in)==0) { //se la posizione è uguale a 0 faccio scomparire il pulsante di sinistra
                  $(options.leftHref).css({display: "none"});
                  $(options.leftRPLC).css({display: "inline"});
               } else { //altrimenti faccio ricomparire il pulsante di sinistra
                  $(options.leftRPLC).css({display: "none"});
                  $(options.leftHref).css({display: "inline"});
               }
               if ((getX(id_mask_in)-$(id_mask).width())==(mask_in_width+20)) {
                  $(options.rightHref).css({display: "none"});
                  $(options.rightRPLC).css({display: "inline"});
               } else {
                  $(options.rightRPLC).css({display: "none"});
                  $(options.rightHref).css({display: "inline"});
               }
            }
            
            function autoSliderReplaceALT() {
               if (options.autoSlider==true && options.autoSliderAltRPLC==true) {
                  $(options.autoSliderAltId).html($(id_mask_in + " li:nth-child(" + element_position + ")").attr("alt"));
               }
               if (options.autoSlider==true && options.autoSliderTitRPLC==true) {
                  $(options.autoSliderTitId).html($(id_mask_in + " li:nth-child(" + element_position + ")").attr("title"));
               }
            }

            var authorization = true;
            
            //definizione degli id maschera e maschera_in
            id_mask = "#" + this.id;
            id_mask_in = "#" + this.id + "_in";
            
            //variabili per il timeout
            var timeout = false;
            
            //funzione di movimento
            $.fn.slidermovement = function(where) {
               switch(where) {
                  default:
                     x = getX(id_mask_in);
                     if (authorization==true){
                        authorization = false;
                        element_position = parseInt(element_position) + 1;  //incremento/decremento la posizione dell'elemento
                        new_position = x - parseInt(options.pixel_step);
                        if ((new_position - options.pixel_step) <= mask_in_width){ //se la nuova posizione è minore del massimo scorro fino al massimo
                           new_position = mask_in_width + options.pixel_step;
                        }
                        $(id_mask_in).animate({ left: new_position + "px"}, { duration: options.speed, easing: options.easingFx, complete: function(){
                              authorization = true;
                              if (options.activeRPLC==1){
                                 //replaceBtn(options.leftHref, options.leftRPLC, element_position, begin_position, "0");   //chiamo la funzione che fa apparire/sparire il pulsante di sinistra
                                 //replaceBtn(options.rightHref, options.rightRPLC, element_position, end_position, mask_in_width);   //chiamo la funzione che fa apparire/sparire il pulsante di destra
                                 replaceBtnLimit("h");
                                 if (options.navigation==true){
                                    resetNavigation();
                                    $(options.navigationId).children("[rel=" + element_position + "]").css("background-position", "bottom");
                                 }
                              }
                              autoSliderReplaceALT();
                           } 
                        });
                     }
                  break;
                  case "left":
                     x = getX(id_mask_in);
                     if (authorization==true){
                        authorization = false;
                        element_position = element_position - 1;  //incremento/decremento la posizione dell'elemento
                        new_position = x + parseInt(options.pixel_step);
                        if (new_position > 0){
                           new_position = 0;
                        }
                        $(id_mask_in).animate({left: new_position + "px"}, {duration: options.speed, easing: options.easingFx, complete: function(){
                              authorization = true;
                              if (options.activeRPLC==1){
                                 //replaceBtn(options.leftHref, options.leftRPLC, element_position, begin_position, "0");   //chiamo la funzione che fa apparire/sparire il pulsante di sinistra
                                 //replaceBtn(options.rightHref, options.rightRPLC, element_position, end_position, mask_in_width);   //chiamo la funzione che fa apparire/sparire il pulsante di destra
                                 replaceBtnLimit("h");
                              }
                              if (options.navigation==true){
                                 resetNavigation();
                                 $(options.navigationId).children("[rel=" + element_position + "]").css("background-position", "bottom");
                              }
                              autoSliderReplaceALT();
                           }
                        });
                     }
                  break;
                  case "top":
                     y = getY(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 = getY(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;                  
               }            
            }
            
            //assegnazione degli attributi a maschera e maschera_in
            $(id_mask).attr({
               style: "overflow: hidden; position: relative;"
            });
            $(id_mask_in).attr({
               style: " position: absolute; left: 0px; top:0px; width: 99999px;"
            });
            
            //definizione degli elementi figlio di maschera_in
            element_array = $(id_mask_in).children();
            begin_position = 1;                          //definisco l'inizio degli elementi
            end_position = element_array.length;         //definisco la fine degli elementi
            element_position = begin_position;
            mask_in_width = options.max_width;
            mask_in_height = options.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(element_array, function(key, value) {
                  mask_in_width = mask_in_width + value.offsetWidth;
                  //alert("Larghezza singolo figlio maschera = " + mask_in_width);
               });
               //controllo che verifica se la maschera contiene più di un figlio
               if (options.multichild==true) {
                  mask_in_width = mask_in_width - $(id_mask).width();
               }
               mask_in_width = 0 - mask_in_width;
               //alert("Larghezza maschera_in = " + mask_in_width);
            }

            //se l'altezza della maschera_in non è definita la definisco
            mask_in_height = ($(id_mask_in).height() - $(id_mask).height());
            mask_in_height = 0 - mask_in_height;
            //alert($.id_mask_in).height() + "/" + $.id_mask).height() + "=" + mask_in_height);
            
            //permetto la disattivazione dei pulsanti
            if (options.activeRPLC==1) {
               //setto i default
               //replaceBtn(options.rightHref, options.rightRPLC, element_position, end_position, mask_in_width);
               //replaceBtn(options.leftHref, options.leftRPLC, element_position, begin_position, "0");
               replaceBtnLimit("h");
            }
            
            function resetNavigation() {
               $(options.navigationId).children().each(function() {
                  if (options.navigationHover==true){
                     $(this).css("background-position", "top");
                  }
               });
            }
            
            //definizione della navigazione
            nav = 1;
            if (options.navigation==true){
               /*
               $.options.navigationId).children().each(function() {
                  $.this).attr("id", options.navigationId.replace("#", "") + "_" + nav);
                  $.this).attr("rel", nav);
                  if (nav==1 && options.navigationHover==true){
                     $.this).css("background-position", "bottom");
                  }
                  nav = nav + 1;
               });
               */
               for (nav=1; nav<=end_position; nav=nav+1) {
                  if (nav==1 && options.navigationHover==true) {
                     $(options.navigationId).append("<li rel=\"" + nav + "\" style=\"background-position: bottom;\">&nbsp;</li>");
                  } else {
                     $(options.navigationId).append("<li rel=\"" + nav + "\">&nbsp;</li>");
                  }
               }
            }

            //setup iniziale dell'alt
            autoSliderReplaceALT();
            
            //movimento a destra
            $(options.rightHref).click(function(){
               $.fn.slidermovement();
            });

            //movimento a sinistra
            $(options.leftHref).click(function(){
               $.fn.slidermovement("left");
            });
            
            //movimento giu
            $(options.downHref).click(function(){
               $.fn.slidermovement("down");
            });
            
            //movimento su
            $(options.topHref).click(function(){
               $.fn.slidermovement("top");
            });
                                    
            //navigazione tramite "pallini"
            if (options.navigation==true){
               $(options.navigationId).children().click(function() {
                  if (options.navigationHover==true){
                     resetNavigation();
                     $(this).css("background-position", "bottom");
                     element_position = $(this).attr("rel");
                     new_position = 0 - (($(this).attr("rel")-1)*options.pixel_step);
                     $(id_mask_in).animate({ left: new_position + "px"}, { duration: options.speed, easing: options.easingFx, complete: function(){
                           authorization = true;
                           if (options.activeRPLC==1){
                              replaceBtnLimit("h");
                           }
                        } 
                     });
                  }
               });
            }
            
            $.fn.autoslide = function() {
               var t = setInterval(function(){
                  if (element_position<end_position){
                     $.fn.slidermovement();
                  } else {
                     element_position = 1;
                     new_position = 0;
                     $(id_mask_in).animate({ left: new_position + "px"}, { duration: options.speed, easing: options.easingFx, complete: function(){
                           authorization = true;
                           if (options.activeRPLC==1){
                              replaceBtnLimit("h");
                              if (options.navigation==true){
                                 resetNavigation();
                                 $(options.navigationId).children("[rel=" + element_position + "]").css("background-position", "bottom");
                              }
                           }
                           autoSliderReplaceALT();
                        } 
                     });
                  }
               }, options.autoSliderTime);
               return t;
            }

            //slider automatico
            if (options.autoSlider==true){
               timeout = $.fn.autoslide();
            }

            //stop del timer all'hover
            $(id_mask).mouseover(function(){
               if (options.autoSlider==true){
                  clearInterval(timeout);
                  //$(id_mask + "_hover").css("background", "red");
               }
            });
                        
            //stop del timer all'hover
            $(id_mask).mouseout(function(){
               if (options.autoSlider==true){
                  timeout = $.fn.autoslide();
                  //$(id_mask + "_hover").css("background", "green");
               }
            });
            
         });
        
     };  
})(jQuery);
