var scrollAuto		= true;
var scrollMaxLength	= 0;

(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			= 0, 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(){
			oViewport[options.axis] = oViewport.obj[0]['offset'+sSize];
			oContent[options.axis]	= oContent.obj[0]['scroll'+sSize];
			oContent.ratio			= oViewport[options.axis]/oContent[options.axis];
			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]);
			
			oScrollbar.obj.toggleClass('disable', oContent.ratio>=1);
			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]);
			
			oContent.obj.css('left', 0);
			oThumb.obj.css('left', 0);
		};
		
		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);
			
			scrollAuto = true;
			return false;
		};
		
		function drag(oEvent){
			scrollAuto = false;
			
			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);

function scrollDiv(viewport_, overview_, view_, slider_, thumb_, thumbwidth){
	var viewport	= document.getElementById(viewport_);
	var overview	= document.getElementById(overview_);
	var view		= document.getElementById(view_);
	var slider		= document.getElementById(slider_);
	var thumb		= document.getElementById(thumb_);
	
	if(viewport && overview && view && slider && thumb && parseInt(viewport.style.width) < parseInt(view.scrollWidth) && scrollAuto==true){
		var contentRation		= (parseInt(viewport.style.width) / parseInt(view.scrollWidth));
		var scrollbarRation		= (parseInt(view.scrollWidth)-parseInt(viewport.style.width)) / (parseInt(viewport.style.width)-thumbwidth);
		var scrollContentWidth	= parseInt(viewport.style.width) - thumbwidth;
		
		var thumbPosition		= parseInt(thumb.style.left);	
		var newThumbPosition	= thumbPosition + 1;
		thumb.style.left		= newThumbPosition+'px';
		overview.style.left		= '-'+(newThumbPosition * scrollbarRation)+'px';
		
		if(newThumbPosition >= scrollContentWidth){
			setTimeout('startNewScroll(\''+viewport_+'\', \''+overview_+'\',\''+view_+'\', \''+slider_+'\', \''+thumb_+'\', \''+thumbwidth+'\');', 1000);
			return false;
		}		

	}else if(slider && slider.className!='scrollbar hide'){
		slider.className = 'scrollbar hide';
	}

	setTimeout('scrollDiv(\''+viewport_+'\', \''+overview_+'\',\''+view_+'\', \''+slider_+'\', \''+thumb_+'\', \''+thumbwidth+'\');', 50);
}

function startNewScroll(viewport_, overview_, view_, slider_, thumb_, thumbwidth){
	var overview	= document.getElementById(overview_);
	var thumb		= document.getElementById(thumb_);

	$('#overview').hide('fast');
	$('#thumb').hide('fast');

	thumb.style.left	= '0px';
	overview.style.left = '0px';

	$('#overview').show('fast');
	$('#thumb').show('fast');

	setTimeout('scrollDiv(\''+viewport_+'\', \''+overview_+'\',\''+view_+'\', \''+slider_+'\', \''+thumb_+'\', \''+thumbwidth+'\');', 1000);
}

function stopStartScroll(state){
	scrollAuto = state;
}
