(function($){
    $.fn.tinyscrollbar=function(options){
        var defaults={
            axis:'y',
            wheel:40,
            scroll:true,
            size:'auto',
            sizethumb:'auto'
        };

        var options=$.extend(defaults,options);
        var oWrapper=$(this);
        var oViewport={
            obj:$('.viewport',this)
            };

        var oContent={
            obj:$('.overview',this)
            };

        var oScrollbar={
            obj:$('.scrollbar',this)
            };

        var oTrack={
            obj:$('.track',oScrollbar.obj)
            };

        var oThumb={
            obj:$('.thumb',oScrollbar.obj)
            };

        var sAxis=options.axis=='x',sDirection=sAxis?'left':'top',sSize=sAxis?'Width':'Height';
        var iScroll,iPosition={
            start:0,
            now:0
        },iMouse={};

        if(this.length>1){
            this.each(function(){
                $(this).tinyscrollbar(options)
                });
            return this;
        }
        this.initialize=function(){
            this.update();
            setEvents();
        };

        this.update=function(){
				
			if(oContent.obj.height() <= 200){				
				oViewport.obj.css('height',oContent.obj.height());		
				oScrollbar.obj.addClass('disable');
				
			}else{
				iScroll=0;
				oViewport[options.axis]=oViewport.obj[0]['offset'+sSize];
				oContent[options.axis]=oContent.obj[0]['scroll'+sSize];
				oContent.ratio=oViewport[options.axis]/oContent[options.axis];
				oScrollbar.obj.toggleClass('disable',oContent.ratio>=1);
				oTrack[options.axis]=options.size=='auto'?oViewport[options.axis]:options.size;
				oThumb[options.axis]=Math.min(oTrack[options.axis],Math.max(0,(options.sizethumb=='auto'?(oTrack[options.axis]*oContent.ratio):options.sizethumb)));
				oScrollbar.ratio=options.sizethumb=='auto'?(oContent[options.axis]/oTrack[options.axis]):(oContent[options.axis]-oViewport[options.axis])/(oTrack[options.axis]-oThumb[options.axis]);
				
				setSize();
			}
        };

        function setSize(){
            oContent.obj.removeAttr('style');
            oThumb.obj.removeAttr('style');
            iMouse['start']=oThumb.obj.offset()[sDirection];
            var sCssSize=sSize.toLowerCase();
            oScrollbar.obj.css(sCssSize,oTrack[options.axis]);
            oTrack.obj.css(sCssSize,oTrack[options.axis]);
            oThumb.obj.css(sCssSize,oThumb[options.axis]);
        };

        function setEvents(){
            oThumb.obj.bind('mousedown',start);
            oTrack.obj.bind('mouseup',drag);
            if(options.scroll&&this.addEventListener){
                oWrapper[0].addEventListener('DOMMouseScroll',wheel,false);
                oWrapper[0].addEventListener('mousewheel',wheel,false);
            }
            else if(options.scroll){
                oWrapper[0].onmousewheel=wheel;
            }
        };

    function start(oEvent){
        iMouse.start=sAxis?oEvent.pageX:oEvent.pageY;
        iPosition.start=parseInt(oThumb.obj.css(sDirection));
        $(document).bind('mousemove',drag);
        $(document).bind('mouseup',end);
        oThumb.obj.bind('mouseup',end);
        return false;
    };

    function wheel(oEvent){
        if(!(oContent.ratio>=1)){
            oEvent=$.event.fix(oEvent||window.event);
            var iDelta=oEvent.wheelDelta?oEvent.wheelDelta/120:-oEvent.detail/3;
            iScroll-=iDelta*options.wheel;
            iScroll=Math.min((oContent[options.axis]-oViewport[options.axis]),Math.max(0,iScroll));
            oThumb.obj.css(sDirection,iScroll/oScrollbar.ratio);
            oContent.obj.css(sDirection,-iScroll);
            oEvent.preventDefault();
        };

};

function end(oEvent){
    $(document).unbind('mousemove',drag);
    $(document).unbind('mouseup',end);
    oThumb.obj.unbind('mouseup',end);
    return false;
};

function drag(oEvent){
    if(!(oContent.ratio>=1)){
        iPosition.now=Math.min((oTrack[options.axis]-oThumb[options.axis]),Math.max(0,(iPosition.start+((sAxis?oEvent.pageX:oEvent.pageY)-iMouse.start))));
        iScroll=iPosition.now*oScrollbar.ratio;
        oContent.obj.css(sDirection,-iScroll);
        oThumb.obj.css(sDirection,iPosition.now);;
    }
    return false;
};

return this.initialize();
    };

})(jQuery);
