/*
 * jQuery Horizontal Move
 * 
 * Examples and documentation at:
 * http://www.astrusweb.com/horizontalmove
 * 
 * 2011 Astrusweb.com 
 * 
 * Copyright 2011 Astrusweb.com
 * Licensed under the MIT license.
 * http://www.opensource.org/licenses/mit-license.php
 *
 * Version: 1.4.3 (30-MAY-2011)
 * 
 */

(function($) {

    $.fn.horizontalmove = function(options) {
        
        var movements = [];
        var page = !options.page ? 0 : options.page;
        var time = !options.time ? 1200 : options.time;
        var ease = !options.ease ? 'easeInOutExpo' : options.ease;
        
        options.main = !options.main ? '.horizontalmove-main:first' : options.main;
        options.mask = !options.mask ? '.horizontalmove-mask:first' : options.mask;
        options.item = !options.item ? '.horizontalmove-item' : options.item;        
        options.left = !options.left ? '.horizontalmove-left' : options.left;
        options.right = !options.right ? '.horizontalmove-right' : options.right;
        
        var main_width = 0,
            calc = 0,
            rest = 0;
        
        var $this = $(this);
        var main = $this.find(options.main);
        var mask = $this.find(options.mask);
        
        var mask_width = !options.width ? mask.width() : options.width;
        
        var margin = !options.itemMargin ? 0 : options.itemMargin;
        
        $this.find(options.item).each(function(){
            main_width += $(this).width() + margin;
        });
        
        main.width(main_width);
        
        if(mask_width > main_width)
        {
           return;             
        }
        
        calc = main.width() / mask_width;
        desloc = Math.floor(calc);
        
        if (calc != desloc)
        { 
            rest = main.width() - (mask_width * desloc);
            desloc++;
        }
        
        for (var i = 0; i < desloc; i++) 
        {
            if (rest != 0 && (desloc - 1) == i) 
            {
                movements.push( rest + ( mask_width * (i - 1) ) );
            } else {
                movements.push( mask_width * i );
            }
        }
        
        var callBack = function(place){
          var percent = (place * 100) / movements[movements.length - 1];
          
          !options.callBack ? '' : options.callBack(page,percent);          
        }
        
        var move = function(){            
            try
            {
              callBack(movements[page]);              
            }catch(e){}
            
            goToAndPlay(movements[page],false);
        };
        
        var goToAndPlay = function(go,type){
          if(type)
          {          
            main.stop().css({'left': - go + 'px'});
          }else{
            main.stop().animate({
              left: - go
            }, time, ease,function(){!options.onComplete ? '' : options.onComplete(true)});           
          }
        }
        
        if(page > 0)
        {
          move(page);
        }
        
        $this.find(options.left).click(function(){
            page--;
            setPage(page);
        });

        $this.find(options.right).click(function(){
            page++;       
            setPage(page);
        });
        
        var setPage = function(p){
          
          page = validatePage(p);
          
          move(page);
        }        
        
        var setPercentege = function(percent,type){
          
          type = !type ? false :true;
          
          var move_percent = (movements[movements.length - 1] / 100) * percent;
          
          goToAndPlay(move_percent,type);
          
          var division = mask_width / 2;
          
          if(type)
          {
            if(move_percent > (movements[page + 1] - division))
            {
              page++;
              
            }if(move_percent < (movements[page] - division)){
              
              page--;
            }            
          }else{            
             for(var i = 0; i < movements.length; i++)
             {
               if((movements[i] - division) > move_percent)
               {
                 page = i - 1;            
                 break;
               }
             }
          }
          
          page = validatePage(page);
          
          callBack(move_percent);          
        }
        
        var validatePage = function (p){
          if (p < 0) 
          {
            p = movements.length - 1;
          }else if (p >= movements.length) 
          {
            p = 0;
          }          
          return p;
        } 
        
        var cp = function(){
        	return page;
        }
        
        return {
          setPage : setPage,
          setPercentege : setPercentege,
          cp:cp
        }
    };

})(jQuery);
