/**
 * @author klucznik
 * version 0.2 - some code size optimization
 */

(function($){
    $.kluslider = function(el, options) {
        // To avoid scope issues, use 'base' instead of 'this'
        // to reference this class from internal events and functions.
        var base = this;

        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el;

        // Add a reverse reference to the DOM object
        //base.$el.data("kluslider", base);
		
		base.handleSliderChange = function(event, ui) {
			var maxScroll = base.$el.attr("scrollHeight") - base.$el.height();
			//base.$el.animate( {scrollTop: (100 - ui.value) * (maxScroll / 100), overwrite: true }, 150);
			base.$el.scrollTop((100 - ui.value) * (maxScroll / 100));
		};
	
		base.handleSliderSlide = function(event, ui) {
			var maxScroll = base.$el.attr("scrollHeight") - base.$el.height();
			base.$el.scrollTop((100 - ui.value) * (maxScroll / 100));
		}

        base.init = function() {
			base.$el.data('kluslider_initiated', true);
            base.options = $.extend({}, $.kluslider.defaultOptions, options);
			
			if (typeof base.options.callback == 'function') base.options.callback.call();
			
			// wrap target in an div and set its overflow to hidden
			base.$el.wrap('<div class="sliderWrapper" />').before('<div class="' + base.options.sliderClass + '"/>');
			base.$el.parent().css({ overflow: 'hidden' });
			
			base.slider = base.$el.siblings('.' + base.options.sliderClass);
			
			base.slider.slider({
				animate: false,
			    change: base.handleSliderChange,
			    slide: base.handleSliderSlide,
				orientation: "vertical"
			});
			base.slider.slider({ value: 100 });
			
			base.$el.width( base.$el.width() - base.slider.outerWidth(false) );
			
			if (base.options.autoHide == true) { 
				
				// fix for ie7 and below
				if ($.browser.msie && parseInt($.browser.version) <= 7) {
					base.slider.hide(0); 
					base.$el.parent().hover( 
						function() { $(this).children('.ui-slider').show(0); }, 
						function() { $(this).children('.ui-slider').hide(0); }
					);
					
				} else {
					base.slider.css({opacity: 0}).children('.ui-slider-handle').css({opacity: 0});
                 
					base.$el.parent().hover( 
						function() { 
						    $(this).children('.ui-slider').animate( { opacity: 1, queue: false }, base.options.fadeTime ); 
						    $(this).children('.ui-slider').children('.ui-slider-handle').animate( { opacity: 1, queue: false }, base.options.fadeTime ); 
						}, 
						function() { 
						    $(this).children('.ui-slider').animate( { opacity: 0, queue: false }, base.options.fadeTime ); 
						    $(this).children('.ui-slider').children('.ui-slider-handle').animate( { opacity: 0, queue: false }, base.options.fadeTime ); 
						}
					);	
				}
			}
			
			// mousewheel
			base.$el.parent().bind("mousewheel", function(event, delta) {
				event.preventDefault();
				
				var sliderMin = base.slider.slider("option", "min");
				var sliderMax = base.slider.slider("option", "max");
				var sliderVal = base.slider.slider("option", "value");
	
				sliderVal += (delta * base.options.scrollWheelSpeed);
	
				if (sliderVal > sliderMax) 
					sliderVal = sliderMax;
				else if (sliderVal < sliderMin) 
					sliderVal = sliderMin;
	
				base.slider.slider("value", sliderVal);
			});
			
        };

		if ( base.$el.data("kluslider_initiated") != true && base.$el.attr("scrollHeight") > base.$el.height() )
			base.init();
    };

    $.kluslider.defaultOptions = {
		autoHide: false,
		fadeTime: 200,
		sliderClass: 'kluslider',
		scrollWheelSpeed: 10
	};

    $.fn.kluslider = function(options) {
        return this.each(function() {
            (new $.kluslider(this, options));
        });
    };

})(jQuery);
