(function($) {

    /* Params:
      fade_value - Р·РЅР°С‡РµРЅРёРµ Р·Р°С‚РµРјРЅРµРЅРёСЏ(РѕС‚ 0 РґРѕ 1)
      fadeout_time - РІСЂРµРјСЏ РїРµСЂРµС…РѕРґР° РѕС‚ fade_value РґРѕ 1 (РјСЃ)
      fadein_time - РІСЂРµРјСЏ РїРµСЂРµС…РѕРґР° РѕС‚ 1 РґРѕ fade_value (РјСЃ)
      DOMelements - РёР· РєР°РєРёС… СЌР»РµРјРµРЅС‚РѕРІ СЃС‚СЂРѕРёС‚СЊ РєР°СЂСѓСЃРµР»СЊ
      elements - РєР°РєРёРµ СЌР»РµРјРµРЅС‚С‹ РІРЅСѓС‚СЂРё DOMelements Р·Р°С‚РµРјРЅСЏС‚СЊ,
      class_name - РёРјСЏ РєР»Р°СЃСЃР° РєР°СЂСѓСЃРµР»Рё
      ride_idx - РєРѕСЌС„С„РёС†РёРµРЅС‚ С‚РѕСЂРѕР¶РµРЅРёСЏ РєР°СЂСѓСЃРµР»Рё РїСЂРё РїСЂРѕРєСЂСѓС‚РєРµ
    */    

    jQuery.fn.extend({
        rider: function(params) {
            this.each(function() {
                this.__rider = new Rider(this,params);
                this.__rider.setup();
            });
        }
    });

    var __FADE_VALUE = .75;
    var __FADEOUT_TIME = 200;
    var __FADEIN_TIME = 200;
    var __DOM_ELEMENTS = 'li';
    var __INNER_ELEMENTS = 'a';
    var __CAROUSEL_CLASS = 'rider';
    var __RIDE_IDX = 0.3;

    var Rider = function(list,params) {
        this.list = list;
        this.$list = $(list);
        
        this.timer = 0;
        this.timerDelay = 100;
        this.pX = 0;
        
        this.params = params;
        if(this.params==undefined){
            this.params = {fade_value: __FADE_VALUE,
                           fadeout_time: __FADEOUT_TIME,
                           fadein_time: __FADEIN_TIME,
                           DOMelements: __DOM_ELEMENTS,
                           elements: __INNER_ELEMENTS,
                           class_name: __CAROUSEL_CLASS,
                           ride_idx: __RIDE_IDX
                          }
        }else{
            if(this.params.fade_value==undefined){ this.params.fade_value = __FADE_VALUE; }
            if(this.params.fadeout_time==undefined){ this.params.fadeout_time = __FADEOUT_TIME; }
            if(this.params.fadein_time==undefined){ this.params.fadein_time = __FADEIN_TIME; }
            if(this.params.DOMelements==undefined){ this.params.DOMelements = __DOM_ELEMENTS; }
            if(this.params.elements==undefined){ this.params.elements = __INNER_ELEMENTS; }
            if(this.params.class_name==undefined){ this.params.class_name = __CAROUSEL_CLASS; }
            if(this.params.ride_idx==undefined){ this.params.ride_idx = __RIDE_IDX; }    
        }
    }
    
    Rider.prototype = {
        setup: function() {
            var self = this;
            self.$elements = this.$list.find(self.params.DOMelements);
            
            var length = this.length = this.$elements.length;
            self.$list.addClass(self.params.class_name).wrapInner('<div />');
            var $sc = self.$list.find('div').eq(0);
            
            self.$list.find(self.params.elements)
                .hover(function(){ $(this).fadeTo(self.params.fadeout_time, 1);},
                       function(){ $(this).fadeTo(self.params.fadein_time, self.params.fade_value);})
                .css( { opacity: self.params.fade_value } );
                
            self.itemWidth = self.$elements.get(0).offsetWidth;
            self.$list.find(self.params.DOMelements).each(function(i) {
                this.style.left = self.itemWidth*i+'px';
            });
            
            self.activeWidth = self.itemWidth*length;
            var ofw = $sc.width();
            if (self.activeWidth < ofw) $sc.css( { width: self.activeWidth, left: Math.floor((ofw-self.activeWidth)/2) } );
            else {
                self.$sc = $sc;
                $sc.mousemove(function(e){ self.ride(e); });
            }
        },
        ride: function(e){
            var self = this;
            var event = e || window.event;
            var layerPos = self.$sc.offset();
            x1 = e.clientX - self.itemWidth - layerPos.left;
            self.setScrollTimer(x1);
        },
        setScrollTimer: function(toX) {
            var self = this;
            self.scroll = true;
            if (!self.timer) self.timer = window.setInterval(function() { self.decScroll(); }, self.timerDelay);
            self.x = toX;
        },
        decScroll: function() {
            var self = this;
            if(self.scroll){
                self.pX = self.pX-(self.pX - self.x)*self.params.ride_idx;
                self.$sc.scrollLeft(Math.round(((self.activeWidth-self.$sc.innerWidth())*self.pX))/(self.$sc.innerWidth()-self.itemWidth*2));
                if (Math.abs(self.x - self.pX)<0.01) {
                    self.scroll = false;
                    window.clearInterval(self.timer);
                    self.timer = null;
                }
            }
        }
    }
})(jQuery);

