/*
*  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 
*  jquery.easing.1.3.js e jquery.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 jquery.easing.1.3.js, jquery.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,
            pixel_step      : 100,
            rightHref       : "#btn_right",
            leftHref        : "#btn_left",
            topHref         : "#btn_top",
            downHref        : "#btn_down",
            max_width       : 0,
            max_height      : 0,
            activeRPLC      : 0,
            rightRPLC       : "#btn_right_vuoto",
            leftRPLC        : "#btn_left_vuoto",
            topRPLC         : "#btn_top_vuoto",
            downRPLC        : "#btn_down_vuoto",
            multichild      : false,
            easingFx        : "linear",
            navigation      : false,
            navigationId    : "#navigation",
            navigationHover : false,
            autoSlider      : false,
            autoSliderTime  : 2000
         };
         
         var authorization = true;
         
         var options = $.extend(defaults, options);
         
         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) {
               $(options.rightHref).css({display: "none"});
               $(options.rightRPLC).css({display: "inline"});
            } else {
               $(options.rightRPLC).css({display: "none"});
               $(options.rightHref).css({display: "inline"});
            }
         }
         
         return this.each(function() {
            
            //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");
                                 }
                              }
                           } 
                        });
                     }
                  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");
                              }
                           }
                        });
                     }
                  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.leftHref, options.leftRPLC, element_position, begin_position);   //chiamo la funzione che fa apparire/sparire il pulsante di sinistra
                           replaceBtn(options.rightHref, options.rightRPLC, 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.leftHref, options.leftRPLC, element_position, begin_position);   //chiamo la funzione che fa apparire/sparire il pulsante di sinistra
                           replaceBtn(options.rightHref, options.rightRPLC, 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; 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>");
                  }
               }
            }
                        
            //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");
                              }
                           }
                        } 
                     });
                  }
               }, 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);
