﻿(function ($) {
	var _pos;
	var _dragHandler;
	var _slideshowInner;
	var _animating = false;
	var _scrollSpeed = 3;
	var resizeTimer;

	function getMax() {
		return parseInt($(document).width() - _dragHandler.width());
	}

	function scrollTo(scroller, elm, pos, animate) {
		var min = 0;
		var max = getMax();
		var finalPos = Math.max(min, Math.min(max, pos - _pos));

		var newLeft = 0;
		
		if(max == 0) {
			newLeft =  ($(document).width() - elm.width()) / 2;
		} else {
			newLeft = -(((elm.width() - $(document).width()) * finalPos) / max);
		}

		if (animate) {
			scroller.stop();
			elm.stop();
			_animating = true;
			scroller.animate({ left: finalPos }, "fast", "linear", function () { _animating = false; });
			elm.animate({ left: newLeft }, "fast", "linear", function () { _animating = false; });
		} else {
			scroller.css("left", finalPos);
			elm.css("left", newLeft);
		}
	}

	function startDrag(evt) {
		if (evt.which != 1) return;
		evt.stopPropagation();
		$(this).unbind("mousedown");
		$(document).bind("mousemove", onDrag).bind("mouseup", endDrag);
		_pos = parseFloat(evt.pageX) - parseFloat($(this).position().left);
	}

	function onDrag(evt) {
		evt.preventDefault();
		evt.stopPropagation();
		scrollTo(_dragHandler, _slideshowInner, evt.pageX, false);
	}

	function endDrag(evt) {
		evt.stopPropagation();
		$(document).unbind("mousemove").unbind("mouseup");
		_dragHandler.bind("mousedown", startDrag);
	}

	function wheelScroll(evt, delta) {
		evt.stopPropagation();
		evt.preventDefault();
		if (_animating) return;
		_pos = 0;
		var speed = getMax() / (parseInt(_slideshowInner.children().length) / _scrollSpeed);
		var newPos = parseFloat(_dragHandler.position().left) + (speed * -delta);
		scrollTo(_dragHandler, _slideshowInner, newPos, true);
	}

	function refreshSizes() {
		var docWidth = parseFloat($(window).width());
		var slideElement = _slideshowInner.children(":first");
		var singleWidth = parseFloat(slideElement.width()) + parseFloat(slideElement.css("margin-left")) + parseFloat(slideElement.css("margin-right"));
		var totalWidth = _slideshowInner.children().length * singleWidth;

		//IE6 detects wrong width
		if ($.browser.msie && $.browser.version.substr(0, 1) < 7) {
			totalWidth += 10;
		}

		//drag handler size is proportional to the amount of stuff shown
		var handlerWidth = Math.max(50, Math.min(docWidth, Math.pow(docWidth, 2) / totalWidth));

		_slideshowInner.width(totalWidth);
		_dragHandler.width(handlerWidth);

		//center items if smaller than document
		if (totalWidth < docWidth) {
			_slideshowInner.css("left", (docWidth - totalWidth) / 2);
		}
		if (parseFloat(_dragHandler.css("left")) > getMax()) {
			_dragHandler.css("left", getMax());
		}

		//scroll to current position to check bounds
		_pos = 0;
		scrollTo(_dragHandler, _slideshowInner, parseFloat(_dragHandler.position().left), false);
	}

	$.fn.dragSlider = function (dragHandler, enableMouseWheel) {

		_pos = 0;
		_dragHandler = dragHandler;
		_slideshowInner = this;

		refreshSizes();

		if (enableMouseWheel)
			_slideshowInner.parent().mousewheel(wheelScroll);

		_dragHandler.attr("onclick", "return false;");
		_dragHandler.attr("ondragstart", "event.preventDefault()");
		_dragHandler.bind("mousedown", startDrag);

		$(window).resize(function () { clearTimeout(resizeTimer); resizeTimer = setTimeout(refreshSizes, 20); });
	};
})(jQuery);
