(function( $ ){

	$.fn.EfNavCarousel = function( options ) {

	if( /template\.asp/.test(document.URL) ) return false;

	var settings = {
		'scrollspeed'		: 3,
		'width'				: 500,
		//'height'			: null,
		'startIndex'		: 0,
		'activeAreaWidth'	: 50,
		'navLeftSrc'		: 'left_grey.png',
		'navRightSrc'		: 'right_grey.png',
		//'slideWidth'	: 100,
		//'slideHeight'	: 100,
		autoScroll			: true,
		circular			: true,
		direction			: '<',
		acceleration		: 3
	};
	

	return this.each(function() {
		if ( options ) { 
			$.extend( settings, options );
		}
				
		var blockHtml = '';
		var slideSet = '';
		
		var slidesCount = 0;
		var slidesTotalWidth = 0;
		var slideMaxHight = 0;
		
		var startOffset = 0;
		var widthCounter = 0;
		var oneSetWidth = 0;

		var autoScroll = settings.circular && settings.autoScroll;
		var acceleration = parseInt(settings.acceleration) || 1
		var defAcceleration = 1;
		var curAcceleration = 1;
		
		/*if(settings.acceleration.length > 1) {
			var pref = settings.acceleration[0];
			
			if(pref == '+') {
				acceleration = settings.scrollspeed + parseInt(settings.acceleration.substr(1));
			} else if(pref == 'x') {
				acceleration = settings.scrollspeed * parseInt(settings.acceleration.substr(1));
			} else {
				acceleration = parseInt(settings.acceleration);
			}
			
			acceleration =  acceleration || defAcceleration;
		}*/
		
		
		
		switch(settings.direction) {
			case '>':
				settings.direction = 1;
				break;
			case '<':
				settings.direction = -1;
				break;
			default:
				settings.direction = -1
				break;
		}
		
		$('li', this).each(function(index, el) {
			
			var slideW = settings.slideWidth || $(el).width();
			var slideH = settings.slideHeight || $(el).height();			
			
			if(settings.startIndex == index) {
				startOffset = widthCounter;
			}
			
			widthCounter += slideW;
			
			slideSet += '<div class="slide" style="width: '+ slideW +'px; height: '+ slideH +'px;">'+ el.innerHTML +'</div>';
			
			slideMaxHight = Math.max( slideMaxHight, slideH );			
			slidesTotalWidth += slideW;
			++slidesCount;
		});
		
		oneSetWidth = slidesTotalWidth;
		
		if(settings.circular) {
			slidesTotalWidth *= 3;
			
			slideSet += slideSet + slideSet;
			//startOffset = slidesTotalWidth - startOffset;
			
		}
		
		
		slideSetStyle = 'width: '+ slidesTotalWidth +'px; height: '+ slideMaxHight +'px;';
		slideSetHolderStyle = 'width: '+ slidesTotalWidth +'px; height: '+ slideMaxHight +'px;';
		
		
		
		slideSet = '<div style="'+ slideSetHolderStyle +'"><div class="slide-set main-slide-set" style="'+ slideSetStyle +' left: 0px;">'+ slideSet +'</div>';
		
		blockHtml = '<div class="app-nav-carousel-container" style="width: '+settings.width +'px; height: '+ slideMaxHight +'px; display: none;">' +
			 slideSet +
			 ''+
			'</div><div class="nav-left"> </div><div class="nav-right"> </div></div>';
		
		var tempContainer = document.createElement('DIV');
		tempContainer.innerHTML = blockHtml;
		
		
		$(this).replaceWith(tempContainer);
		
		
		
		var dir = settings.direction;
		var $appContainer = $(".app-nav-carousel-container", tempContainer);
		var $mainSlideContainer = $(".main-slide-set", $appContainer);
		//var isMoving = false;
		var maxLeftOffsetAbs = slidesTotalWidth - $appContainer.width();
		
		initNavigation($appContainer);
		
		/**
			Calculating start offset
		*/
		if(startOffset < 0) startOffset = 0;
		if(startOffset > maxLeftOffsetAbs) startOffset = maxLeftOffsetAbs;
		
		startOffset = -1 * startOffset;		
		
		$mainSlideContainer.css('left', startOffset + 'px');
		
		
		
		
		/**
			Add event handlers		
		*/
		$('.nav-left', $appContainer).mouseenter(function(eventObject){
			dir = 1;
			curAcceleration = acceleration;
			
			animateInit();
		});
		
		$('.nav-right', $appContainer).mouseenter(function(eventObject){
			dir = -1;
			curAcceleration = acceleration;
			
			animateInit();
		});
		
		$('.nav-left, .nav-right', $appContainer).mouseleave(function(eventObject){
			curAcceleration = defAcceleration;
			
			if(!settings.circular) {
				stop();
				return false;
			}
			
			animateInit();
		});
		
		
		$appContainer.fadeIn(1000, 'linear', function() {
			//autoScroll
			if(autoScroll)
				animateInit();
		});
		
		
		
		
		
		/**
		 * Functions
		 */
		function animateInit() {
			stop();
			//carouselReset2();
			
			var destX = getDestinationXValue(dir);
			var delta = Math.abs( parseInt($mainSlideContainer.css('left')) - destX );
			var duration = delta * settings.scrollspeed;
			
			//be paranoid
			if(delta < 1)
				return false;
			
			$mainSlideContainer.animate(
				{left: destX},
				{
					duration : duration / curAcceleration,
					easing	 : 'linear',
					/*complete : (settings.circular) ? animateInit : null,*/
					step	 : (settings.circular) ? carouselReset : null
				});
		}
		
		function carouselReset2() {
			if(settings.circular != true) {
				return false;
			}
			
			
			var limit = 100;
			var left = parseInt($mainSlideContainer.css('left'));
			//slidesTotalWidth
			
			if(dir == 1 && Math.abs(left) < limit) {
				$mainSlideContainer.css('left', left - oneSetWidth + 'px');
			}
			else if (
				dir == -1
				&& (slidesTotalWidth - Math.abs(left) - $appContainer.width()) < limit
			) {
				$mainSlideContainer.css('left', left % oneSetWidth + 'px');
			}
			
		}
		
		function carouselReset(now, fx) {
			if(settings.circular != true) {
				return false;
			}
			
			var limit = 200;
			var delta = (dir == -1) ? Math.abs(fx.end - fx.now) : Math.abs(fx.now);
			
			if(delta < limit) {
				
				var left = parseInt($mainSlideContainer.css('left'));
				
				stop();
				
				if(fx.end < 0) {
					$mainSlideContainer.css('left', left % oneSetWidth + 'px');
				} else {
					$mainSlideContainer.css('left', left - oneSetWidth + 'px');
				}
				
				animateInit();
				
			}
		}
		
		
		/**
			Functions
		*/
		function stop() {
			//isMoving = false;
			$mainSlideContainer.stop();
		}
		
		function initNavigation($container) {
			if(!settings.navLeftSrc || !settings.navRightSrc) return false;
			
			$navLeft	= $('.nav-left', $container);
			$navRight	= $('.nav-right', $container);
			
			var cssObj = {
				backgroundImage: 'url('+settings.navLeftSrc+')',
				backgroundPosition: 'center',
				backgroundRepeat: 'no-repeat',
				width: settings.activeAreaWidth,
				height: slideMaxHight,
				display: 'block'
			}
			
			$navLeft.css(cssObj);
			
			cssObj.backgroundImage = 'url('+settings.navRightSrc+')';
			$navRight.css(cssObj);
		}
				
		function getDestinationXValue(dir) {
			if($mainSlideContainer.width() < $appContainer.width())
				return 0;
			
			if(dir == 1) {
				return /*(settings.circular) ? maxLeftOffsetAbs :*/ 0;
			} else {
				return -1 * maxLeftOffsetAbs;
			}
		}

	});

	};
})( jQuery );

/*
$(document).ready(function(){
	$('.app-nav-carousel').EfNavCarousel({
		'scrollspeed'		: 4,
		'width'				: 500,
		'height'			: 102,
		'startIndex'		: 0,
		'activeAreaWidth'	: 50,
		'navLeftSrc'		: '/images/nav_carousel/left_grey_32.png',
		'navRightSrc'		: '/images/nav_carousel/right_grey_32.png'
	});
});*/
	

