﻿(function($) { 
	jQuery.fn.divScroll = function(options){
		var defaults = {
		scrollWrapper: "div.scrollWrapper",
		scrollableArea: "div.scrollableArea",
		vertical: false,
		interval: 30,
		hiddenOnStart: false,
		scrollStyle: "endlessloop",
		autoScrollSpeed: 1,
		pauseAutoScroll: "mouseover"
		};
		if (!(options && options.vertical)) {
		    defaults.scrollWrapper += "H";
		    defaults.scrollableArea += "H";
		} else {
		    defaults.scrollWrapper += "V";
		    defaults.scrollableArea += "V";
		}
		options = $.extend(defaults, options);
		return this.each(function() {
			var $mom = $(this);
			$(window).one("load",function(){
				$mom.autoScrollInterval = setInterval(autoScroll, options.interval);
			});
			$(window).bind("resize",function(){
				windowIsResized();
			});

			function windowIsResized() {
				if(!(options.hiddenOnStart))
				{
					$mom.scrollableAreaWidth = 0;
					$mom.find(options.scrollableArea).children().each(function() {
						$mom.scrollableAreaWidth += (options.vertical ? $(this).outerHeight(true) : $(this).outerWidth(true));
					});
					$mom.find(options.scrollableArea).css(options.vertical ? "height" : "width", $mom.scrollableAreaWidth + 'px');
				}
				if (options.vertical)
				    $mom.find(options.scrollWrapper).scrollTop("0");
				else
				    $mom.find(options.scrollWrapper).scrollLeft("0");
			}
			if(options.pauseAutoScroll == "mousedown") {
				$mom.find(options.scrollWrapper).bind('mousedown',function(){
					clearInterval($mom.autoScrollInterval);
				});
				$mom.find(options.scrollWrapper).bind('mouseup',function(){
					$mom.autoScrollInterval = setInterval(autoScroll, options.interval);
				});
			} else if(options.pauseAutoScroll == "mouseover") {
				$mom.find(options.scrollWrapper).bind('mouseover',function(){
					clearInterval($mom.autoScrollInterval);
				});
				$mom.find(options.scrollWrapper).bind('mouseout',function(){
					$mom.autoScrollInterval = setInterval(autoScroll, options.interval);
				});
			}
			windowIsResized();
			$mom.previousScrollLeft = 0;
			$mom.pingPongDirection = "right";
			$mom.swapAt;
			$mom.getNextElementHeight = true;
			var autoScroll = function() {
				switch(options.scrollStyle) {
					case "backandforth":
						if (options.vertical)
						    $mom.previousScrollLeft = $mom.find(options.scrollWrapper).scrollTop();
						else
						    $mom.previousScrollLeft = $mom.find(options.scrollWrapper).scrollLeft();
						
						if($mom.pingPongDirection == "right") {
						    if (options.vertical)
							    $mom.find(options.scrollWrapper).scrollTop($mom.find(options.scrollWrapper).scrollTop() + options.autoScrollSpeed);
							else
							    $mom.find(options.scrollWrapper).scrollLeft($mom.find(options.scrollWrapper).scrollLeft() + options.autoScrollSpeed);
						}
						else {
						    if (options.vertical)
							    $mom.find(options.scrollWrapper).scrollTop($mom.find(options.scrollWrapper).scrollTop() - options.autoScrollSpeed);
							else
							    $mom.find(options.scrollWrapper).scrollLeft($mom.find(options.scrollWrapper).scrollLeft() - options.autoScrollSpeed);
						}

						if($mom.previousScrollLeft === (options.vertical ? $mom.find(options.scrollWrapper).scrollTop() : $mom.find(options.scrollWrapper).scrollLeft()))
						{
							if($mom.pingPongDirection == "right") {
								$mom.pingPongDirection = "left";
							}
							else {
								$mom.pingPongDirection = "right";
							}
						}
						break;
		
					case "endlessloop":
						if($mom.getNextElementHeight) {
						    if (options.vertical)
							    $mom.swapAt = $mom.find(options.scrollableArea).children(":first-child").outerHeight(true);
							else
							    $mom.swapAt = $mom.find(options.scrollableArea).children(":first-child").outerWidth(true);
							$mom.getNextElementHeight = false;
						}
						if (options.vertical)
						    $mom.find(options.scrollWrapper).scrollTop($mom.find(options.scrollWrapper).scrollTop() + options.autoScrollSpeed);
						else
						    $mom.find(options.scrollWrapper).scrollLeft($mom.find(options.scrollWrapper).scrollLeft() + options.autoScrollSpeed);
						if ($mom.swapAt <= (options.vertical ? $mom.find(options.scrollWrapper).scrollTop() : $mom.find(options.scrollWrapper).scrollLeft())) { 
						    $mom.find(options.scrollableArea).hide();
							$mom.find(options.scrollableArea).append($mom.find(options.scrollableArea).children(":first-child").clone());

							if (options.vertical)
							    $mom.find(options.scrollWrapper).scrollTop(($mom.find(options.scrollWrapper).scrollTop() - $mom.find(options.scrollableArea).children(":first-child").outerHeight(true)));
							else
							    $mom.find(options.scrollWrapper).scrollLeft(($mom.find(options.scrollWrapper).scrollLeft() - $mom.find(options.scrollableArea).children(":first-child").outerWidth(true)));
							
							$mom.find(options.scrollableArea).children(":first-child").remove();
						    $mom.find(options.scrollableArea).show();
							$mom.getNextElementHeight = true;
						}
						break;
					default:
						break;
				}
			};
	    });
    };
})(jQuery);


