$(function(){
  var Scroller = function(opts){
    var obj      = this;
    var defaults = {};     
    defaults.selectorId       = 'scroller-';
    defaults.disabledNavClass = 'disabled';
    defaults.effectTime       = 500;
    defaults.fixBoxesHeight   = false;
    defaults.transitionMethod = function(itemToHide, itemToShow, cb){
      itemToHide.fadeOut(obj.opts.effectTime, function(){
        itemToShow.fadeIn(obj.opts.effectTime, cb);
      });
    };
    
    // merge options with defaults
    obj.opts = $.extend({}, defaults, opts);  

    if(obj.opts.selectorId == null) return false;
    
    obj.items = $("." + obj.opts.selectorId + "fragment");
    obj.navPrev = $("." + obj.opts.selectorId + "prev");
    obj.navNext = $("." + obj.opts.selectorId + "next");
    
    obj.inTransact = false;
    
    obj.init = function(){     
      obj.navPrev.addClass(obj.opts.disabledNavClass);
      obj.navPrev.attr("href", "javascript:void(0)");
      obj.navNext.attr("href", "javascript:void(0)");        
      
      if(obj.items.length > 1){
        obj.navPrev.attr("rel", -1);
        obj.navNext.attr("rel", 1);
        
        obj.items.each(function(i, el){ 
          if(i == 0) $(el).addClass(obj.opts.selectorId + "current");
      
          if(i != 0){
      //console.log(obj.opts.selectorId + " " + i);
      $(el).hide();    
      }  
          $(el).addClass(obj.opts.selectorId + "fragment-" + i);
        });      
        
        obj.navPrev.click(obj.showItem);
        obj.navNext.click(obj.showItem);  
        
        obj.navPrev.show();
        obj.navNext.show();            
      }else{
        obj.navNext.addClass(obj.opts.disabledNavClass);  
      }

    if(obj.opts.fixBoxesHeight){
      $(window).load(function(){
        var maxHeight = 0;
        obj.items.each(function(){
          var boxHeight = $(this).outerHeight();
          if(boxHeight > maxHeight) maxHeight = boxHeight;        
        });
        
        obj.items.each(function(){
          $(this).height(maxHeight);
        });   
        
        obj.navPrev.fadeIn(200);
        obj.navNext.fadeIn(200);            
      });
    }
      $(window).load(function(){       
        obj.navPrev.fadeIn(200);
        obj.navNext.fadeIn(200);            
      });      
    };
    
    obj.showItem = function(event){
      if(obj.inTransact) return;
      
      var trigger = $(event.target);
      var index   = parseInt(trigger.attr('rel'));
            
      if(index > -1 && obj.items.length > index){       
        var item = $("." + obj.opts.selectorId + "fragment-" + index);
       
        if(item.length > 0){
          obj.inTransact = true;
          
          var currentClass = obj.opts.selectorId + "current"; 
                          
          obj.opts.transitionMethod($("." + currentClass), item, function(){
            $("." + currentClass).removeClass(currentClass);  
            item.addClass(currentClass);  

            obj.inTransact = false;
          });

          var prevIndex, nextIndex;
          if(index == 0){
            obj.navPrev.addClass(obj.opts.disabledNavClass);
            obj.navNext.removeClass(obj.opts.disabledNavClass);            
            prevIndex = -1;
            nextIndex = index + 1;
          }else{
            obj.navPrev.removeClass(obj.opts.disabledNavClass);                  
            if(index == obj.items.length - 1){
              obj.navNext.addClass(obj.opts.disabledNavClass);         
              nextIndex = -1;                
            }else{
              obj.navNext.removeClass(obj.opts.disabledNavClass);                 
              nextIndex = index + 1;
            }
            prevIndex = index -1;  
          }
    
          obj.navPrev.attr("rel", prevIndex);
          obj.navNext.attr("rel", nextIndex);    
        }
      }
    };
    
    obj.init();
  }
  
  // extends jquery
  $.extend({
    scroller: function(opts){
      var _Scroller = new Scroller(opts);
    }
  });
});
