(function($) {

$.fn.inDyCarousel = function(o){
   o = $.extend({

      speed: 1000,
      easing: "linear",

      vertical: false,
      start: 0,
      scroll: 1,
      
      save_position : true
   }, o || {});

   return this.each(function() {

      if( o.save_position ) 
         o.start = parseInt(getCookie("carousel_start")) || o.start;
      
      var running = false,
          animCss = o.vertical ? "top"    : "left", 
          sizeCss = o.vertical ? "height" : "width";
      var slider     = $(this);
      var v          = o.visible;
      var itemLength = Math.floor(slider.width()/o.block_size);
      var curr       = o.start + v > itemLength ? itemLength - v : ( o.start < 0 ? 0 : o.start );
      
      slider.css("marginLeft", -(curr*o.block_size));
      
      if(o.btnPrev){
         $(o.btnPrev).mousedown(function() {
            running = true;
            return go(-o.scroll);
         });
         $(o.btnPrev).mouseup(function() {
            running = false;
         });
      }
         
      if(o.btnNext){
         $(o.btnNext).mousedown(function() {
            running = true;
            return go(o.scroll);
         });
         $(o.btnNext).mouseup(function() {
             running = false;
         });
      }
      
      if(o.btnGo)
         $.each(o.btnGo, function(i, val) {
             $(val).click(function() {
                 return go(o.circular ? o.visible+i : i);
             });
         });

      if(o.auto)
         setInterval(function() {
             go(curr+o.scroll);
         }, o.auto+o.speed);

      function vis() {
         return li.slice(curr).slice(0,v);
      };
      
      buttonsState()
      
      function go(step) {
            
         if(curr + step<0 || curr + step>itemLength-v) return
         else curr += step;
         
         running = true;
         
         slider.animate(
            o.vertical ? { marginTop: -(curr*o.block_size) } : { marginLeft: -(curr*o.block_size) } , o.speed, o.easing,
            function() {
               buttonsState();
               if(curr + step<0 || curr + step>itemLength-v){
                  running = false;
                  return;
               } else if( !running ) return;
               else go( step );
               
            }
         );
         
         if( o.save_position ){
            var path = String(document.location).replace(/http:\/\/[^\/]+\/?/,'/').replace(/\/[0-9]+\/?$/, '/');
            setCookie("carousel_start", curr, null, path);
         }
         return false;
         
      };
      
      function buttonsState(){
         if( curr <= 0 )
            $(o.btnPrev).removeClass(o.classl)
         else
            $(o.btnPrev).addClass(o.classl);
         if( curr == itemLength-v )
            $(o.btnNext).removeClass(o.classr)
         else
            $(o.btnNext).addClass(o.classr);
      }

   });
   
};
})(jQuery)

function getCookie( name ) {
   var start = document.cookie.indexOf( name + '=' );
   var len = start + name.length + 1;
   if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
      return null;
   }
   if ( start == -1 ) return null;
   var end = document.cookie.indexOf( ';', len );
   if ( end == -1 ) end = document.cookie.length;
   return unescape( document.cookie.substring( len, end ) );
}


function setCookie( name, value, expires, path, domain, secure ) {
   var today = new Date();
   today.setTime( today.getTime() );
   if ( expires ) {
      expires = expires * 1000 * 60 * 60 * 24;
   }
   var expires_date = new Date( today.getTime() + (expires) );
   document.cookie = name+'='+escape( value ) + ( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) +
  	( ( path ) ? ';path=' + path : '' ) +
   ( ( domain ) ? ';domain=' + domain : '' ) +
   ( ( secure ) ? ';secure' : '' );
}
