(function($){
  
  
  LazyLoading = function(){
    this.elements = [];
    this.current = 0;
  };
  
  
  
  LazyLoading.prototype = {
    
    LOADER_FOLDER : 'images/lazy_loader/',
    // les types image
    TYPE_IMG : 1,
    TYPE_IMG_LIBELLE : 'image',
    TYPE_BG_IMG : 2,
    TYPE_BG_IMG_LIBELLE : 'background',
    
    // les loader
    TYPE_LOADER_THUMB : 1,
    TYPE_LOADER_MEDIUM : 2,
    TYPE_LOADER_KING_SIZE : 3,
    TYPE_LOADER_THUMB_LIBELLE : 'thumb',
    TYPE_LOADER_MEDIUM_LIBELLE : 'medium',
    TYPE_LOADER_KING_SIZE_LIBELLE : 'kingsize',
    
    FADE_TRANSITION : 500,
    
    /**
     *  ajouter un loader dans la pile
     */
    add : function(elt, img_src, typeLibelle, loader_size){
      try{
        var lz_type = this.getLazyTypeForLibelle(typeLibelle);
      }catch(e){
        return 0;
      }
      
      try{
        var lz_loader = this.getLazyLoaderForLibelle(loader_size);
      }catch(e){
        return 0;
      }
      
      this.elements.push({
        elt:elt,
        img:img_src,
        lazy_type : lz_type,
        loader_size:lz_loader
      });
      
      this.elements.bg_position = $(elt).css('background-position');
      $(elt).css({'background-position':'center center'});
      elt.addClass(this.getLoaderClassForType(lz_loader));
    },
    
    startLoad: function(){
      if(this.elements.length == 0){
        return 0;
      }
      
      var current = this.elements.shift();
      var img = new Image();
      img.src = current.img;
      var self = this;
      img.onload = function(){
        switch(current.lazy_type){
          case self.TYPE_IMG:
            self.displayImage.call(self, this, current);
          break;
          
          case self.TYPE_BG_IMG:
            self.displayBgImage.call(self, this, current);
          break;
        }
        
        self.startLoad();
      }
    },
    
    /**
     *  affiche l'image
     */
    displayImage : function(image, item){
      //
    },
    
    
    /**
     *  affiche l'image de bg
     */
    displayBgImage : function(image, item){
      item.elt.css({
        'background-position':  item.bg_position
      });
      
      item.elt.css({
        'background-image' : 'url('+image.src+')'
      });

      item.elt.removeClass('lazy_loading');
      item.elt.removeClass('loader_thumb');
      item.elt.removeClass('loader_medium');
      item.elt.removeClass('loader_king');
    },
    
    
    /**
     * récupérer l'id du libelle
     */
    getLazyTypeForLibelle : function(typeLibelle){
      switch(typeLibelle){
        case this.TYPE_IMG_LIBELLE :
          return this.TYPE_IMG;
        break;
        
        case this.TYPE_BG_IMG_LIBELLE :
          return this.TYPE_BG_IMG;
        break;
        
        default:
          throw 'getLazyTypeForLibelle >> No data found';
      }
    },
    
    
    getLazyLoaderForLibelle : function(loaderSize){
      switch(loaderSize){
        case this.TYPE_LOADER_THUMB_LIBELLE :
          return this.TYPE_LOADER_THUMB;
        break;
        
        case this.TYPE_LOADER_MEDIUM_LIBELLE :
          return this.TYPE_LOADER_MEDIUM;
        break;  
        
        case this.TYPE_LOADER_KING_SIZE_LIBELLE :
          return this.TYPE_LOADER_KING_SIZE;
        break;
        
        default:
          throw 'getLazyLoaderForLibelle >> No data found';
      }
    },
    
    
    getLoaderClassForType : function(loaderType){
       switch(loaderType){
        case this.TYPE_LOADER_THUMB:
          return 'loader_thumb';
        break;
        
        case this.TYPE_LOADER_MEDIUM:
          return 'loader_medium';
        break;  
        
        case this.TYPE_LOADER_KING_SIZE:
          return 'loader_king';
        break;
       }
       return '';
    }
    
  };
  
})($);
