/*
 *   Easy Slider 1.7 - jQuery plugin
 *  written by Alen Grakalic  
 *  http://cssglobe.com/post/4004/easy-slider-15-the-easiest-jquery-plugin-for-sliding
 *
 *  Copyright (c) 2009 Alen Grakalic (http://cssglobe.com)
 *  Dual licensed under the MIT (MIT-LICENSE.txt)
 *  and GPL (GPL-LICENSE.txt) licenses.
 *
 *  Built for jQuery library
 *  http://jquery.com
 *
 *   Easy Slider 1.75 - jQuery plugin
 *  updated by Justin Carroll  
 *  http://www.3circlestudio.com/
 *
 *  Added option "allControls" to show both next/previous/first/last and
 *  numeric paging all at once
 *
 *   Easy Slider 1.8 - jQuery plugin
 *  updated by Alexis Rackelboom and Alexandre Paixao  
 *  http://www.alexandre-paixao.fr.cr/
 *
 *  Replaced "allControls" and "numeric" options by "classicControls" and "numericControls"
 *  Added option "pauseOnHover" (if auto=true) to pause on mouseover
 *  Fixed problems with vertical mode
 *
 */
 
/*
 *  markup example for $("#slider").easySlider();
 *  
 *   <div id="slider">
 *    <ul>
 *      <li><img src="images/01.jpg" alt="" /></li>
 *      <li><img src="images/02.jpg" alt="" /></li>
 *      <li><img src="images/03.jpg" alt="" /></li>
 *      <li><img src="images/04.jpg" alt="" /></li>
 *      <li><img src="images/05.jpg" alt="" /></li>
 *    </ul>
 *  </div>
 *
 */

(function($) {

  $.fn.easySlider = function(options){
    
    // default configuration properties
    var defaults = {      
      prevId:          'prevBtn',
      prevText:        'Previous',
      nextId:          'nextBtn',
      nextText:        'Next',
      controlsId:      'controls',
      controlsShow:    true,
      controlsBefore:  '',
      controlsAfter:   '',
      controlsFade:    true,
      firstId:         'firstBtn',
      firstText:       'First',
      firstShow:       false,
      lastId:          'lastBtn',
      lastText:        'Last',
      lastShow:        false,
      vertical:        false,
      speed:           800,
      auto:            false,
      pause:           2000,
      pauseOnHover:    true,
      pauseOnControlsHover: false,
      continuous:      false,
      numericControls: false,
      classicControls: true
    }; 
    
    options = $.extend(defaults, options);
    
    this.each(function() {
      var obj = $(this);
      obj.css("position","relative");
      $("ul", obj).addClass('easyslider-slides').wrap('<div class="easyslider-content" />');
      var s = $("li", obj).length;
      var w = obj.width();
      var clickable = true;
      
      $("div.easyslider-content", obj).css("overflow","hidden");
      var ts = s-1;
      var t = 0;
      $("ul", obj).css('width',s*w);      
      
      if(options.continuous){
        if(!options.vertical) {
          $("ul", obj).prepend($("ul li:last-child", obj).clone().css("margin-left","-"+ w +"px"));
          $("ul", obj).append($("ul li:nth-child(2)", obj).clone());
        }
        else {
          $("ul", obj).append($("ul li:nth-child(1)", obj).clone());
        }
        
        $("ul", obj).css('width',(s+1)*w);
      }
      
      if(!options.vertical) $("li", obj).css('float','left');
                
      if(options.controlsShow){
        var html = options.controlsBefore;
        
        if(options.classicControls || options.numericControls){
          html += '<ul class="easyslider-controls" id="'+ options.controlsId +'"></ul>';
        }
        
        html += options.controlsAfter;
        var controls = $(html);
        $(obj).append(controls);
      }
      
      if(options.classicControls) {
        var html = '';
        if(options.firstShow) html += '<li class="easyslider-first" id="'+ options.firstId +'"><a href=\"javascript:void(0);\">'+ options.firstText +'</a></li>';
        html += ' <li class="easyslider-prev" id="'+ options.prevId +'"><a href=\"javascript:void(0);\">'+ options.prevText +'</a></li>';
        html += ' <li class="easyslider-next" id="'+ options.nextId +'"><a href=\"javascript:void(0);\">'+ options.nextText +'</a></li>';
        if(options.lastShow) html += ' <li class="easyslider-last" id="'+ options.lastId +'"><a href=\"javascript:void(0);\">'+ options.lastText +'</a></li>';
        $(html).appendTo(controls);
        
        $("li.easyslider-next a",controls).click(function(){
          animate("next",true);
        });
        $("li.easyslider-prev a",controls).click(function(){
          animate("prev",true);        
        });  
        $("li.easyslider-first a",controls).click(function(){
          animate("first",true);
        });        
        $("li.easyslider-last a",controls).click(function(){
          animate("last",true);        
        });        
      }
      if(options.numericControls){
        for(var i=0;i<s;i++){            
          $(document.createElement("li"))
            .attr('class','numeric control' + (i+1))
            .html('<a rel='+ i +' href=\"javascript:void(0);\">'+ (i+1) +'</a>')
            .appendTo($(controls))
            .click(function(){              
              animate($("a",$(this)).attr('rel'),true);
            });                         
        }
        $(document.createElement("li"))
            .css('clear', 'both')
            .css('float', 'none')
            .css('width', '0')
            .css('height', '0')
            .css('overflow', 'hidden')
            .css('visibility', 'hidden')
            .css('list-style', 'none')
            .appendTo($(controls));
      }
      
      function setCurrent(i){
        i = parseInt(i)+1;
        $('li.current', controls).removeClass("current");
        $('li.control' + i, controls).addClass("current");
      }
      
      function adjust(){
        if(t>ts) t=0;    
        if(t<0) t=ts;  
        if(!options.vertical) {
          $("ul.easyslider-slides",obj).css("margin-left",(t*w*-1));
        } else {
          $("ul.easyslider-slides",obj).css("margin-top",(t*h*-1));
        }
        clickable = true;
        if(options.numericControls || options.classicControls) setCurrent(t);
      }
      
      function animate(dir,clicked){
        if (clickable){
          clickable = false;
          var ot = t;        
          switch(dir){
            case "next":
              t = (ot>=ts) ? (options.continuous ? parseInt(t)+1 : ts) : parseInt(t)+1;            
              break; 
            case "prev":
              t = (t<=0) ? (options.continuous ? t-1 : 0) : t-1;
              break; 
            case "first":
              t = 0;
              break; 
            case "last":
              t = ts;
              break; 
            default:
              t = dir;
              break; 
          }
          var diff = Math.abs(ot-t);
          var speed = (1 + diff/10)*options.speed;
          if(!options.vertical) {
            p = (t*w*-1);
            $("ul.easyslider-slides",obj).animate(
              {marginLeft: p}, 
              {queue:false, duration:speed, complete:adjust}
            );        
          } else {
            p = (t*h*-1);
            $("ul.easyslider-slides",obj).animate(
              {marginTop: p}, 
              {queue:false, duration:speed, complete:adjust}
            );          
          }
          
          if(!options.continuous && options.controlsFade){          
            if(t==ts){
              $("li.easyslider-next a",controls).hide();
              $("li.easyslider-last a",controls).hide();
            } else {
              $("li.easyslider-next a",controls).show();
              $("li.easyslider-last a",controls).show();
            }
            if(t==0){
              $("li.easyslider-prev a",controls).hide();
              $("li.easyslider-first a",controls).hide();
            } else {
              $("li.easyslider-prev a",controls).show();
              $("li.easyslider-first a",controls).show();
            }          
          }      
          
          if(clicked) clearTimeout(timeout);
          if(options.auto && dir=="next" && !clicked){
            timeout = setTimeout(function(){
              animate("next",false);
            },diff*options.speed+options.pause);
          }
      
        }
        
      }
      
      // init
      var h = obj.height()-$("ul.easyslider-controls").outerHeight(true);
      $("div.easyslider-content li", obj).height(h);
      $("div.easyslider-content li", obj).width(w);
      $("div.easyslider-content", obj).css('height', h);
      var timeout;
      if(options.auto){
        timeout = setTimeout(function(){
          animate("next",false);
        },options.pause);
      }
      
      if(options.numericControls || options.classicControls) setCurrent(0);
    
      if(!options.continuous && options.controlsFade){
        $("li.easyslider-prev a",controls).hide();
        $("li.easyslider-first a",controls).hide();
      }

      if(options.auto && options.pauseOnHover){
        $(this).hover(function(){
          clearTimeout(timeout);
        }, function(){
          //Restart the timer
          clearTimeout(timeout);
          timeout = setTimeout(function(){
            animate("next",false);
          },options.speed+options.pause);
        });

        $(controls).hover(function(){
          // If you want to pause on controls mouseover
          if(options.pauseOnControlsHover) {
            clearTimeout(timeout);
          }
        }, function(){
          //Restart the timer
          clearTimeout(timeout);
          timeout = setTimeout(function(){
            animate("next",false);
          },options.speed+options.pause);
        });
      }
      
    });
    
  };

})(jQuery);




