jQuery.preloadImages = function(){
  for(var i = 0; i < arguments.length; i++){
    jQuery("<img>").attr("src", arguments[i]);
  }
}

jQuery.fn.scrollable2 = function(settings){
	var defaultSettings = {};

	defaultSettings.buttonDownHTML        = "scroll down";
	defaultSettings.buttonUpHTML          = "scroll up";
	defaultSettings.height                = "auto";
	defaultSettings.buttonsClass          = "jquery-scrollable-button";
	defaultSettings.buttonsUpClass          = "";
	defaultSettings.buttonsDownClass          = "";
	defaultSettings.buttonsDisabledClass  = "jquery-scrollable-button-disabled";
	defaultSettings.buttonsEnabledClass   = "jquery-scrollable-button-enabled";
	defaultSettings.pixelsPerSecond       = 300;
	defaultSettings.width                 = "auto";
	defaultSettings.interval              = 30;
	defaultSettings.buttonDisabledOpacity = 1;

	settings = jQuery.extend(defaultSettings, settings);


	// Returns the scroll container, based only on the button
	// the user has just hovered in or out.
	function getScrollContainer(scrollButton){
		if(scrollButton.nextSibling){
			// Scrolling up.
			return scrollButton.nextSibling;
		} else if(scrollButton.previousSibling){
			// Scrolling down.
			return scrollButton.previousSibling;
		}
	}

	function enableButtons(jQueryObj){
		return jQueryObj
			.css({"opacity": 1})
			.removeClass(defaultSettings.buttonsDisabledClass)
			.addClass(defaultSettings.buttonsEnabledClass)
		;
	}

	function disableButtons(jQueryObj){
		return jQueryObj
			.css({"opacity": settings.buttonDisabledOpacity})
			.addClass(defaultSettings.buttonsDisabledClass)
			.removeClass(defaultSettings.buttonsEnabledClass)
		;
	}

	function stopScrolling(){
		var container = getScrollContainer(this);
		if(container.scrollingInterval){
			clearInterval(container.scrollingInterval);
		}
	}

	function startScrolling(){
		var container = getScrollContainer(this);
		var step      = this.step;

		container.scrollingInterval = setInterval(function (){
			var content   = $(container).children()[0];
			var limitDown = parseInt(container.offsetHeight) - parseInt(content.offsetHeight);
			var limitUp   = 0;


			var top = (content.style.top ? parseInt(content.style.top) : 0) + step;
			var newTop = null;
			var stop   = false;

			if(top > limitDown && top < limitUp){
				newTop = top;
				enableButtons($(container).siblings());
			} else if(top <= limitDown) {
				newTop = limitDown;

				enableButtons($(container).prev());
				disableButtons($(container).next());

				clearInterval(container.scrollingInterval);
			} else if(top >= limitUp) {
				newTop = limitUp;

				enableButtons($(container).next());
				disableButtons($(container).prev());

				clearInterval(container.scrollingInterval);
			}

			if(newTop != null){
				content.style.top = newTop+"px";
			}
		}, settings.interval);
	}

	return this.each(function (){
		var scrollingStep = Math.round(Math.max(1, settings.interval * parseInt(settings.pixelsPerSecond) / 1000));

		this.style.position = "relative";

		var scrollContainer = document.createElement("div");
		scrollContainer.style.position = "relative";
		scrollContainer.style.width    = (settings.width == "auto" ? this.offsetWidth : settings.width);

		var scrollInnerContainer = document.createElement("div");
		scrollInnerContainer.style.overflow = "hidden";
		scrollInnerContainer.style.position = "relative";
		scrollInnerContainer.style.height   = (settings.height == "auto" ? this.offsetHeight : settings.height);

		var scrollUp = document.createElement("div");
		scrollUp.step = scrollingStep;
		disableButtons(
			$(scrollUp)
				.addClass(settings.buttonsClass)
				.addClass(settings.buttonsUpClass)
				.append(settings.buttonUpHTML)
				.hover(startScrolling, stopScrolling)
		);

		var scrollDown = document.createElement("div");
		scrollDown.step = -scrollingStep;
		enableButtons(
			$(scrollDown)
				.addClass(settings.buttonsClass)
				.addClass(settings.buttonsDownClass)
				.addClass(settings.buttonsEnabledClass)
				.append(settings.buttonDownHTML)
				.hover(startScrolling, stopScrolling)
		);

		$(scrollContainer)
			.append(scrollUp)
			.append(scrollInnerContainer)
			.append(scrollDown)
		;

		$(this).before(scrollContainer);
		$(scrollInnerContainer).append(this);
	});
};

