/*
 * Tiny Scrollbar 1.0
 *
 * Copyright (c) 2010 Maarten Baijs
 *
 * Date: 21 / 08 / 2010
 * Library: jQuery
 *
 */
(function($){
	$.fn.tinyscrollbar = function(options){
		var defaults = { 
			axis: 'x', // vertical or horizontal scrollbar? ( x || y ).
			wheel: 40  // how many pixels must the mouswheel scroll at a time.
		};
		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 = { start: oThumb.obj.offset()[sDirection] };
		if (this.length > 1){ 
			this.each(function(){$(this).tinyscrollbar(options)}); 
			return this;
		}   
		this.initialize = function(){
			this.update();
			setEvents();
		};
		this.update = function(){
			oViewport[options.axis] = sAxis ? oViewport.obj[0].offsetWidth : oViewport.obj[0].offsetHeight;
			oContent[options.axis] = sAxis ? oContent.obj[0].scrollWidth : oContent.obj[0].scrollHeight;
			oContent.ratio = oViewport[options.axis] / oContent[options.axis];
			oTrack.obj.css(sSize, oViewport[options.axis]);
			oTrack[options.axis] = sAxis ? oTrack.obj[0].offsetWidth : oTrack.obj[0].offsetHeight;
			oThumb[options.axis] = Math.min(oTrack[options.axis], Math.max(0, (oTrack[options.axis] * oContent.ratio)));
			oThumb.obj.css(sSize, oThumb[options.axis]);
			oScrollbar.ratio = oContent[options.axis] / oTrack[options.axis];
			oScrollbar.obj.toggleClass('disable', oContent.ratio >= 1);
		};
		function setEvents(){
			oThumb.obj.bind('mousedown', start);
			oTrack.obj.bind('mouseup', drag);
		//	if(this.addEventListener){
		//		oWrapper[0].addEventListener('DOMMouseScroll', wheel, false);
		//		oWrapper[0].addEventListener('mousewheel', wheel, false );
		//	}
		//	else{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){
			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;
		};
		
			this.scrollup = function(){
			
			var iDelta = 40;
			iScroll -= iDelta * 2;
			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);
		};
		
		function drag(oEvent){
			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);
