///////////////////////////////////////////////////////////////////////
// imageScroller (1.1), Copyright (C) 2008 - 2009 Max Kiusso
//
// Autor :		Max Kiusso - kiussoATgmailDOTcom
// Date :		2008 12 01
// Modified:	2009 11 23
//
// REQUIRES jQuery 1.2+ <http://jquery.com/>
//
// Features:
// 		This software provide to create a multidirectional image
//		scroller with mouse events
//
// Configuration:	$( "#div" ).imageScroller( {options} )
//					
//					options:	speed (millisecond)
//								loading (text)
//								direction (left, right, top, bottom)
//
// New in release 1.1:
//		- bug fix for preload images
///////////////////////////////////////////////////////////////////////

// Modified by Felix Elsener; 10.2.2011
(function($) {
   	$.fn.imageScroller = function (options) {
		return this.each(function() {
			var $this = $(this);
            var loadImgs = 0;
			
            var opt = $.extend(
				{ 
					speed: '2000',
					loading: 'Loading images...',
					direction: 'left'
				},
				options || {}
			);
			
			$this.children().hide();
			$this.append(
				"<div style='clear:both; padding: 0px; margin: 0px;'>" + 
				"<div id='loading'>" + opt.loading + "</div>" + 
				"</div>"
			);
			
			$('img', $this).each(function() {
				var img = new Image();
				var soc = $(this).attr('src');

				$(img).load(function () {
					loadImgs++;
				}).attr('src', soc);
			});

			var intVal = window.setInterval(function() {
				if (loadImgs == $('img', $this ).length ) {
					window.clearInterval(intVal);
					$('#loading').remove();
					$this.append("<div class='mask-left'></div><div class='mask-right'></div>");
					$this.children().show();
					var totImg = 0;

					$('li', $this).each(function() {
						switch (opt.direction) {
							case 'left':
							case 'right':
								if ($(this).children().length) {
									$(this).width($(this).children(':eq(0)').width());
								}
								totImg += $(this).width();
								break;

							case 'top':
							case 'bottom':
										$(this).css('display', 'block');
										if ($(this).children().length) {
											$(this).height($(this).children(':eq(0)').height());
										}
										totImg += $(this).height();
								break;
						}
								
						$(this).css({
							margin:  '0px',
							padding: '0px'
						});
								
						$(this).bind('mouseover', function() {
							$('ul:eq(0)', $this).stop();
						}).bind('mouseout', function() {
							scrollStart($('ul:eq(0)', $this), opt);
						});
								
						$('ul:eq(0)', $this).append($(this));
					});

					switch (opt.direction) {
						case 'left':
							$('ul:eq(0)', $this).css('width', totImg + 'px');
							break;
							
						case 'right':
							$('ul:eq(0)', $this).css('width', totImg + 'px');
							$('ul:eq(0)', $this).css({
								marginLeft: -(totImg - $this.width()) + 'px'
							});
							break;
								
						case 'top':
							$('ul:eq(0)', $this).css('height', totImg + 'px');
							break;
								
						case 'bottom':
							$('ul:eq(0)', $this).css('height', totImg + 'px');
							$('ul:eq(0)', $this).css({
								marginTop: -(totImg - $this.height()) + 'px'
							});
							break;
					}

					scrollStart($('ul:eq(0)', $this), opt);
				}
				},
				100
			);

			function scrollStart ($scroll, opt) {
				switch (opt.direction) {
					case 'left':
						var pos = -($scroll.children(':eq(0)').width());
						var spd = opt.speed - (Math.abs(parseInt($scroll.css('marginLeft'))) * (opt.speed / $scroll.children(':eq(0)').width()));
						break;
						
					case 'right':
						var pos = -($scroll.width() - $scroll.parents('ul:eq(0)').width()) + $scroll.children(':last').width();
						var spd = opt.speed - (($scroll.children(':last').width() - (Math.abs(parseInt($scroll.css('marginLeft'))) - Math.abs(pos))) * (opt.speed / $scroll.children(':last').width()));
						break;
						
					case 'top':
						var tos = -($scroll.children(':eq(0)').height());
						var spd = opt.speed - (Math.abs( parseInt($scroll.css('marginTop'))) * (opt.speed / $scroll.children(':eq(0)').height()));
						break;
						
					case 'bottom':
						var tos = -($scroll.height() - $scroll.parents('div:eq(0)').height()) + $scroll.children(':last').height();
						var spd = opt.speed - (($scroll.children(':last').height() - (Math.abs(parseInt($scroll.css('marginTop'))) - Math.abs(tos))) * (opt.speed / $scroll.children(':last').height()));
						break;
				}

				$scroll.animate(
					{
						  marginLeft: ( pos || '0' ) + 'px'
						, marginTop: ( tos || '0' ) + 'px'
					},
					spd,
					'linear',
					function() {
						switch ( opt.direction ) {
							case 'left':
								$scroll.append($(this).children(':eq(0)'));
								$scroll.css('marginLeft', '0px');	
								break;
								
							case 'right':
								$scroll.prepend($(this).children(':last'));
								$scroll.css('marginLeft', -($scroll.width() - $scroll.parents('ul:eq(0)').width()) + 'px');
								break;
								
							case 'top':
								$scroll.append($(this).children(':eq(0)'));
								$scroll.css('marginTop', '0px');
								break;
								
							case 'bottom':
								$scroll.prepend($(this).children(':last'));
								$scroll.css('marginTop', -($scroll.height() - $scroll.parents('ul:eq(0)').height()) + 'px');
								break;
						}

						scrollStart($scroll, opt);	
				});
			};
		});
	};
})(jQuery);
