/*
* HYPERCAROUSEL
*/

var Hypercarousel = function(oSettings) {
	
	if (!oSettings) {
		oSettings = {};
	}
	var oConfig = $.extend({}, Hypercarousel.s_oDefaults, {
		margin: 10,
		animationSpeed: 5
	}, oSettings);

	this.each(function() {
		
		var dThis = this;
		
		dThis.m_oOptions = oConfig;
		dThis.m_jUl;
		dThis.m_iLoading;
		dThis.m_iWidth;
		dThis.m_iTotalWidth;
		dThis.m_fAnimationStep = 0;
		dThis.m_bInitialized = false;
		
		dThis._Constructor = function() {
			dThis.m_jUl = $(dThis).find('ul').css('left', 0);
			$(dThis).addClass('hypercarousel');
			dThis.m_iWidth = $(dThis).width();
			dThis.m_iLoading = $(dThis).find('img').length;
			var sSrc = dThis.m_jUl.find('img').each(function() {
				var sSrc = this.src;
				this.src = '';
				this.onload = dThis._OnImageLoad;
				this.src = sSrc;
			});
		};
		
		dThis._OnImageLoad = function(eEvent) {
			if (--dThis.m_iLoading <= 0) {
				dThis._Initialize();
			}
		};
		
		dThis._Initialize = function() {
			if (dThis.m_bInitialized) {
				return;
			}
			dThis.m_bInitialized = true;
			dThis._PrepareNodes();
			dThis._PreapreEvents();
			dThis.StartAuto();
		};
		
		dThis._PrepareNodes = function() {
			dThis.m_iTotalWidth = 0;
			var jLis = dThis.m_jUl.find('li');
			for (var i = 0; i < jLis.length; i++) {
				dThis.m_iTotalWidth += jLis.eq(i).find('img').width() + dThis.m_oOptions.margin;
			}
			dThis.m_jUl.css('width', dThis.m_iTotalWidth * 2 + 1000);
			dThis.m_jUl.append(jLis.clone());
		};
		
		dThis._PreapreEvents = function() {
			dThis.m_jUl.mousemove(dThis._OnMouseMove).mouseleave(dThis._OnMouseLeave);
		};
		
		dThis.StartAuto = function() {
			$(dThis).animate({
				m_fAnimationStep: 200 / dThis.m_oOptions.animationSpeed * dThis.m_iTotalWidth
			}, {
				duration: (200 / dThis.m_oOptions.animationSpeed * dThis.m_iTotalWidth) - dThis.m_fAnimationStep,
				easing: 'linear',
				step: dThis._Animate,
				complete: function() {					
					dThis.m_fAnimationStep = 0;
					dThis.StartAuto();
				}
			});
		};
		
		dThis._Animate = function(iStep) {
			dThis.m_jUl.css({
				'left': - iStep / (200 / dThis.m_oOptions.animationSpeed)
			});
		};
		
		dThis._OnMouseMove = function(eEvent) {
			$(dThis).stop(true, false);
			dThis.m_fAnimationStep = Math.max(0, Math.min(1, ((eEvent.pageX - $(dThis).offset().left) / dThis.m_iWidth * 1.3 - 0.15))) * (200 / dThis.m_oOptions.animationSpeed) * (dThis.m_iTotalWidth - dThis.m_iWidth);
			dThis._Animate(dThis.m_fAnimationStep);
		};
		
		dThis._OnMouseLeave = function(eEvent) {
			dThis.StartAuto();
		};
		
		dThis._Constructor();
		
	});

	return this;

};

(function($) {
	$.fn.Hypercarousel = Hypercarousel;
})(jQuery);

