(function($) {
	$.tiny = $.tiny || {};
	$.tiny.scrollbar = {
		options : {
			axis : 'x'
		}
	};
	$.fn.tinyscrollbar = function(options) {
		var options = $.extend( {}, $.tiny.scrollbar.options, options);
		new Scrollbar($(this), options)
		return this;
	};
	function Scrollbar(root, options) {
		var oSelf = this;
		var oWrapper = root;

		var oWrapContent = $('.wrap_content', root);

		var oContent = $('.content', root);

		var oScrollbar = $('.scrollbar', root);

		var oNext = $('.next', root);

		var oPrev = $('.prev', root);

		var oTrack = $('.track', oScrollbar);

		var sAxis = options.axis == 'x', sDirection = sAxis ? 'left' : 'top', sSize = sAxis ? 'Width'
				: 'Height';
		var iMouse = {};
		var position = {};
		function initialize() {
			update();
			setEvent();
			return oSelf;
		}
		;
		function update() {
			setStyle();
			if ((oContent[0]['offset' + sSize] - oWrapContent[0]['offset' + sSize]) > 0) {
				oScrollbar.ratio = (oContent[0]['offset' + sSize] - oWrapContent[0]['offset' + sSize])
						/ ((oScrollbar[0]['offset' + sSize] - oTrack[0]['offset' + sSize]));
				oTrack.max = oScrollbar[0]['offset' + sSize]
						- oTrack[0]['offset' + sSize];
				position.scroll=0;
			} else {
				oNext.css('display', 'none');
				oPrev.css('display', 'none');
				oScrollbar.css('display', 'none');
				return false;
			}
		}
		;

		function setStyle() {
			position.now = 0;
			oWrapContent.css( {
				'position' : 'relative',
				'overflow' : 'hidden'
			});
			oContent.css('position', 'absolute');
			oScrollbar.css('position', 'relative');
			oTrack.css( {
				'position' : 'absolute',
				'overflow' : 'hidden'
			});
			oNext.css('overflow', 'hidden');
			oPrev.css('overflow', 'hidden');
		}

		function setEvent() {
			oTrack.bind('mousedown', start);
			oNext.mousedown(function() {
				startRun('next')
			});
			oPrev.mousedown(function() {
				startRun('prev')
			});

			
			if (oWrapper[0].addEventListener) {
				oWrapper[0].addEventListener('DOMMouseScroll', wheel, false);
			} else {
				oWrapper[0].onmousewheel = wheel;
			}
		}
		;
		function startRun(dir) {
			$(document).bind('mouseup', endRun);
			oScrollbar.run = setInterval(function() {
				if (dir == 'next') {
					position.now = Math.min(oTrack.max, Math.max(0,
							(position.now + 5)));
				} else {
					position.now = Math.min(oTrack.max, Math.max(0,
							(position.now - 5)));
				}
				var scroll = oScrollbar.ratio * position.now;
				oTrack.css(sDirection, position.now + 'px');
				oContent.css(sDirection, -scroll + 'px');
			}, 10);
		}
		function endRun() {
			window.clearInterval(oScrollbar.run);
			$(document).unbind('mouseup', endRun);
			return false;
		}

		function start(oEvent) {
			iMouse.start = (sAxis ? oEvent.pageX : oEvent.pageY) - position.now;
			$(document).bind('mousemove', drag);
			$(document).bind('mouseup', end);
			return false;
		}
		;

		function end(oEvent) {
			$(document).unbind('mousemove', drag);
			$(document).unbind('mouseup', end);
			return false;
		}
		;

		function wheel(event) {
			var delta = 0;
			if (!event) /* For IE. */
				event = window.event;
			if (event.wheelDelta) { /* IE/Opera. */
				delta = event.wheelDelta / 120;
				if (window.opera)
					delta = -delta;
			} else if (event.detail) {
				delta = -event.detail / 3;
			}
			
			position.now -= delta * 10;
			position.now = Math.min(
					(oTrack.max),
					Math.max(0, position.now));
			position.scroll = oScrollbar.ratio * position.now;
			if(!isNaN(position.now)){
			oTrack.css(sDirection, position.now + 'px');
			oContent.css(sDirection, -position.scroll + 'px');
			}
			if (event.preventDefault)
				event.preventDefault();
			event.returnValue = false;
		}

		function drag(oEvent) {
			var positionMouse = sAxis ? oEvent.pageX : oEvent.pageY;
			position.now = Math.min(oTrack.max, Math.max(0, positionMouse
					- iMouse.start));

			position.scroll = oScrollbar.ratio * position.now;
			oTrack.css(sDirection, position.now + 'px');
			oContent.css(sDirection, -position.scroll + 'px');
			return false;
		}
		;

		return initialize();
	}
	;
})(jQuery);
