/**
 * qpBannerSwitcher
 * 
 * uma classe que implementa carrosel em uma coletanea de banners 
 * 
 * methods
 * @method  void   init     Inicializa a classe
 * @method  void   move     Movimenta o carrosel em uma direção
 * @method  void   show     Exibe um banner do carrosel
 * @method  void   toggle   Exibe/Oculta os banners
 * @method  void   startTimer    Inicializa o carrosel
 * @method  void   stopTimer     Finaliza o carrosel
 * @method  int    countBanners  Contabiliza quantos banners existem
 * 
 * getters and setters
 * @method  void   setActiveBanner  Detemrina qual o banner ativo
 * @method  int    getActiveBanner  Identifica qual o banner ativo
 * @method  void   setIntervalTime  Determina a duração que um item permanece exibido
 * @method  int    getIntervalTime  Identiica quanto tempo um item permanece exibidos (default: 5)
 * @method  void   setBannerClass   Determina a classe utilizada pelos banners
 * @method  string getBannerClass   Identifica a classe utilizada pelos banners (default: 'banner')
 * @method  void   setBannerNavigationClass Determina a classe utilizada pelo navagedor de banners
 * @method  string getBannerNavigationClass Identifica a classe utilizada pelo navegador de banners (default: 'banner-navigation)
 * @method  void   setActiveClass   Determina a classe que identifica itens ativos
 * @method  string getActiveClass   Identifica a classe que identiica itens ativos (default: 'on')
 * 
 * @autor     valdir bruxel junior <valdir@qualitypress.com.br>
 * @since     2010-06-29
 * @copyright &copy; 2010 Quality Press
 */
var qpBannerSwitcher =  
{
  /**
   * inicializa o seletor automático de banners
   */
  init: function()
  {
    var timer = 0;
    
    var default_banner_class = 'banner';
    var default_banner_navigation_class = 'banner-navigation';
    var default_active_class = 'on';
    
    if(this.countBanners()) {
      this.setActiveBanner(1);

      if(this.countBanners() >= 2)
        this.startTimer('qpBannerSwitcher.move(1)');
    } 
    else {
      throw new Error('Não há banners associados à classe: ' + this.getBannerClass());
    }
  },
  
  
  
  /**
   * alterna entre o banner seguinte e o anterior
   * 
   * @param integer movement A direção e intensidade do movimento. Números negativos
   *                         exibem os banners anteriores. Caso o resultador for
   *                         maior que o numero de banners existentes ou menor que 0,
   *                         escapa para o inicio ou fim da fila 
   *                         
   * @return boolean
   */
  move: function(movement)
  {
    destination = this.getActiveBanner() + parseInt(movement);
    
    if(destination > this.countBanners())
      destination = 1;
    else if(destination <= 0)
      destination = this.countBanners();
     
    this.show(destination);
    return;
  },
  
  

  /**
   * exibe o banner com rel="destination"
   * 
   * @param integer destination O valor do atributo 'rel' do banner a ser exibido
   * @param boolean stopTimer   Determina se o timmer de troca deve ser interrompido
   * 
   * @return false
   */
  show: function(destination, stopTimer)
  {
    if(this.getActiveBanner() == destination)
      return;
    
    if(stopTimer)
      this.stopTimer();
      
    // alterna os banners
    $('.' + this.getBannerClass()).hide();
    $('.' + this.getBannerClass() + ':nth-child(' + destination + ')').fadeIn('slow');

    this.setActiveBanner(destination);
      
    return;
  },
  
  
  /**
   * exibe ou oculta o container aonde se encontram os banners, solicitando
   * que o servidor lembre da escolha do usuário utilizando AJAX 
   * 
   * @return false
   */
  toggle: function(container, uri)
  {
    $(container).toggle();

    $.ajax({
      url: uri,
      data: { 
        display: $(container).css('display') 
      }
    });
    
    return false;
  },
  
  
  /**
   * inicializa o carrosel
   * 
   * @param  string method  O método a ser utilizado pelo carrosel
   */
  startTimer: function(method)
  {
    this.timer = setInterval(method, this.getIntervalTime() * 1000);
  },
  
  
  
  /**
   * finaliza o carrosel
   */
  stopTimer: function()
  {
    clearInterval(this.timer);
  },
  
  
  
  /**
   * contabiliza quantos banners existem no site
   */
  countBanners: function()
  {
    return $('.' + this.getBannerClass()).length;
  },

  
  
  /**
   * determina qual o banner ativo
   */
  setActiveBanner: function(banner)
  {
    $('.' + this.getBannerClass()).removeClass(this.getActiveClass());
    $('.' + this.getBannerNavigationClass() + ' A').removeClass(this.getActiveClass());

    $('.' + this.getBannerClass() + ':nth-child(' + banner + ')').addClass(this.getActiveClass());
    $('.' + this.getBannerNavigationClass() + ' A:nth-child(' + banner + ')').addClass(this.getActiveClass());
    
    this.active_banner = banner;
    
    return;
  },

  
  /**
   * identifica qual o banner ativo
   * 
   * @return integer
   */
  getActiveBanner: function()
  {
    if(this.active_banner == null)
      this.setActiveBanner(1);
    
    return this.active_banner;
  },
  
  
  /**
   * determina a duração do intervalo de troca automatica dos banners
   * 
   * @param integer time A duração, em segundos
   */
  setIntervalTime: function(time)
  {
    this.interval = parseInt(time);
    
    return;
  },
  
  
  /**
   * retorna a duração do intervalo de troca automatica dos banners
   * 
   * @return integer
   */
  getIntervalTime: function()
  {
    if(this.interval == undefined)
      this.interval = 5;
    
    return this.interval;
  },
  
  
  /**
   * determina a classe utilizada para identiicar os banners
   * 
   * @param string cls A classe (ou id) comum à todos os banners
   */
  setBannerClass: function(cls) 
  {
    this.banner_class = cls;
    
    return;
  },
  
  
  /**
   * retorna a classe utilizada para identificar os banners
   * 
   * @return string 
   */
  getBannerClass: function()
  {
    if(this.banner_class == undefined)
      this.setBannerClass(this.default_banner_class);
    
    return this.banner_class;
  },
  
  
  /**
   * determina a classe utilizada para identiicar os navegadores de banners
   * 
   * @param string cls A classe (ou id) comum à todos os navegadores de banner
   */
  setBannerNavigationClass: function(cls)
  {
    this.banner_navigation_class = cls;
    
    return;
  },
  
  
  /**
   * retorna a classe utilizada para identificar os navegadores de banner
   * 
   * @return string 
   */
  getBannerNavigationClass: function()
  {
    if(this.banner_navigation_class == undefined)
      this.setBannerNavigationClass(this.default_banner_navigation_class);
        
    return this.banner_navigation_class;
  },
  
  
  /**
   * determina a classe utilizada para identificar itens ativos. Esta classe
   * identifica tanto banners quanto navegadores ativos
   * 
   * @param string cls A classe utilizada para identificar um item ativo
   */
  setActiveClass: function(cls)
  {
    this.active_class = cls;
    
    return;
  },
  
  
  /**
   * retorn a classe utilizada para identificar itens ativos. 
   * 
   * @return string
   */
  getActiveClass: function()
  {
    if(this.active_class == undefined)
      this.setActiveClass(this.default_active_class);
    
    return this.active_class;
  }
  
}
