if( typeof nameSpace == 'undefined' ){
	var nameSpace = {};
}

if( typeof nameSpace.modules == 'undefined' ){
	nameSpace.modules = {};
}

if( typeof $ == 'function' && typeof $$ == 'undefined' ){
	$(document).ready(function(){
		if( nameSpace.modules.carousel.autoInit ){
			nameSpace.modules.carousel.init();
		}
	});
}

/////////////////////////////////////////////
// Class - nameSpace.modules.carousel
// Description - 
/////////////////////////////////////////////
nameSpace.modules.carousel = 
{

	/////////////////////////////////////////////
	// Define the properties of the class
	/////////////////////////////////////////////
	autoInit				: true,
	_eContainer				: '',
	_eSlider				: '',
	_arrElements			: [],
	selectorContainer		: '#carouselContainer',
	selectorSliderContainer	: '#carouselContainer .container',
	selectorSlider			: '#carouselContainer .container ul',
	selectorElements		: '#carouselContainer .container ul li',
	selectorPrevious		: '#carouselContainer .previous_button',
	selectorNext			: '#carouselContainer .next_button',
	bucketsOriginalLength	: null,
	initialLeft				: null,
	allowOverscroll			: false,
	scrollInc				: "auto",
	autoScroll				: 0,
	autoScrollId			: null,
	currentFirst			: 1,
	groupNumber				: 1,
	groupSize				: 3,
	doAlphaOnScroll			: true,
	
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.init
	/////////////////////////////////////////////
	//init : function( elementId, options )
	init : function( objOverride )
	{
		if(nameSpace.modules.carousel.checkRequirements()){
			nameSpace.modules.carousel.overrideParams( objOverride );
			nameSpace.modules.carousel.setInitialStage();
			nameSpace.modules.carousel.initLayoutFix();
			nameSpace.modules.carousel.initBuckets();
			nameSpace.modules.carousel.initAutoScroll();
			// page specific
			setCarouselCounter();
			setCarouselPager();
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.checkRequirements
	/////////////////////////////////////////////
	checkRequirements : function() 
	{
		var message = '';
		
		if( $(nameSpace.modules.carousel.selectorContainer).size() == 0 ){
			return false;
		}
		
		if( typeof $ != 'function' || typeof $$ != 'undefined' ){
			message += '* File is missing: jquery\n';
		}
		
		if( message != '' ){
			alert(message);
			return false;
		}
		
		return true;
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.overrideParams
	/////////////////////////////////////////////
	overrideParams : function( e ) 
	{
		if( typeof e == 'object' ){
			for( var i in e ){
				if( typeof e[i] == typeof nameSpace.modules.carousel[i] ){
					nameSpace.modules.carousel[i] = e[i];
				}
			}
		}
		//
		for( var j in nameSpace.modules.carousel ){
			if( typeof j == 'string' && j[0] != '_' && typeof $(nameSpace.modules.carousel.selectorContainer).attr(j) != 'undefined' ){
				nameSpace.modules.carousel[j] = $(nameSpace.modules.carousel.selectorContainer).attr(j);
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.setInitialStage
	/////////////////////////////////////////////
	setInitialStage : function() 
	{
		var $slider = nameSpace.modules.carousel._eSlider = $(nameSpace.modules.carousel.selectorSlider)[0];
		var $elements = nameSpace.modules.carousel._arrElements = $(nameSpace.modules.carousel.selectorElements);
		nameSpace.modules.carousel.bucketsOriginalLength = $elements.length;
		nameSpace.modules.carousel.initialLeft = nameSpace.modules.carousel.cumulativeOffset($slider)[0];
		// fixes
		if( nameSpace.modules.carousel.groupSize > $elements.size() && true ){
			var pad = ($(nameSpace.modules.carousel.selectorContainer)[0].clientWidth - ($elements[0].clientWidth * $elements.size()))/2;			
			$(nameSpace.modules.carousel.selectorSliderContainer).css('left', pad+'px');
		}
		if( nameSpace.modules.carousel.groupSize > nameSpace.modules.carousel.bucketsOriginalLength ){
			nameSpace.modules.carousel.groupSize = nameSpace.modules.carousel.bucketsOriginalLength;
		}
		if( nameSpace.modules.carousel.scrollInc == 'auto' || nameSpace.modules.carousel.scrollInc > nameSpace.modules.carousel.groupSize ){
			nameSpace.modules.carousel.scrollInc = nameSpace.modules.carousel.groupSize;
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.initLayoutFix
	/////////////////////////////////////////////
	initLayoutFix : function()
	{
		// width
			var liWidth = $(nameSpace.modules.carousel.selectorElements)[0].clientWidth;
			var containerWidth = ( liWidth * nameSpace.modules.carousel.groupSize );
			//var carouselWidth = containerWidth + 71;
			//$(nameSpace.modules.carousel.selectorContainer)[0].style.width = carouselWidth + 'px';
			$(nameSpace.modules.carousel.selectorSliderContainer)[0].style.width = containerWidth + 'px';
		// scrollers
			var $prev = $(nameSpace.modules.carousel.selectorPrevious);
			var $next = $(nameSpace.modules.carousel.selectorNext);
			// previous
			$prev.show();
			$prev.click(function(){ nameSpace.modules.carousel.scroll(-1) });
			// next
			$next.show();
			$next.click(function(){ nameSpace.modules.carousel.scroll(+1) });
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.initBuckets
	/////////////////////////////////////////////
	initBuckets : function()
	{
		var aBucket = $(nameSpace.modules.carousel.selectorElements);
		var bucketIdx = 0;
		aBucket.each( function(){
			bucketIdx += 1;
			$(this).attr('bucketIdx', bucketIdx);
			$(this).attr('id', 'bucketIdx_' + bucketIdx);
		});
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.scroll
	/////////////////////////////////////////////
	scroll : function( scrollDirection, isAutoScroll )
	{
		var eUl = $(nameSpace.modules.carousel.selectorSlider);
		var liWidth = $(nameSpace.modules.carousel.selectorElements)[0].clientWidth;
		var currentLeft = nameSpace.modules.carousel.cumulativeOffset(eUl[0])[0] - nameSpace.modules.carousel.initialLeft;
		var actualScrollInc = nameSpace.modules.carousel.scrollInc;
		var scrollTo;
		var setNextDisable = false;
		// stop sutoscroll
		if( typeof isAutoScroll == 'undefined' ){
			nameSpace.modules.carousel.stopAutoScroll();
		}
		// check scroll limits for no overScroll
		if( !nameSpace.modules.carousel.allowOverscroll ){
			if( scrollDirection == 1 ){
				var currentLast = nameSpace.modules.carousel.currentFirst + nameSpace.modules.carousel.groupSize - 1;
				if( currentLast + actualScrollInc > nameSpace.modules.carousel._arrElements.size() ){
					actualScrollInc = nameSpace.modules.carousel._arrElements.size() - currentLast;
					setNextDisable = true;
				}
			}
			else{
				if( nameSpace.modules.carousel.currentFirst - nameSpace.modules.carousel.groupSize < 1 ){
					actualScrollInc = nameSpace.modules.carousel.currentFirst - 1;
				}
			}
		}
		// set scroll amount
		scrollTo = ( currentLeft + ( -1 * scrollDirection * liWidth * actualScrollInc ) );
		// check left scroll limits
		if( scrollTo > 0 ){
			scrollTo = 0;
		}
		// create new bucktes
		if( nameSpace.modules.carousel.allowOverscroll ){
			nameSpace.modules.carousel.checkBucket( scrollDirection );
		}
		
		if( nameSpace.modules.carousel.checkScroll( scrollDirection ) == true ){
			//
			$(nameSpace.modules.carousel.selectorPrevious).addClass('button_disabled');
			$(nameSpace.modules.carousel.selectorNext).addClass('button_disabled');
			//
			// TEMP
			//
			if( nameSpace.modules.carousel.doAlphaOnScroll == true ){
				eUl.animate({opacity: 0.5}, 200, 'linear', function(){
					eUl.animate({opacity: 0.5}, 200, 'linear', function(){
						eUl.animate({left: + scrollTo + 'px'}, 1000, 'linear', function(){
							eUl.animate({opacity: 1}, 200, 'linear', function(){
								nameSpace.modules.carousel.groupNumber += scrollDirection;
								nameSpace.modules.carousel.currentFirst += actualScrollInc * scrollDirection;
								// enable/disable previous
								if( scrollTo == 0 ){
									$(nameSpace.modules.carousel.selectorPrevious).addClass('previous_button_disabled');
								}
								else{
									$(nameSpace.modules.carousel.selectorPrevious).removeClass('previous_button_disabled');
								}
								// enable/disable next
								if( setNextDisable == true ){
									$(nameSpace.modules.carousel.selectorNext).addClass('next_button_disabled');
								}
								else{
									$(nameSpace.modules.carousel.selectorNext).removeClass('next_button_disabled');
								}
								
								$(nameSpace.modules.carousel.selectorPrevious).removeClass('button_disabled');
								$(nameSpace.modules.carousel.selectorNext).removeClass('button_disabled');
								
								nameSpace.modules.carousel.initAutoScroll();
								// page specific
								setCarouselCounter();
								setCarouselPager();
							});
						});
					});
				});
			}
			else{
				eUl.animate({opacity: 0}, 200, 'linear', function(){
					eUl.animate({opacity: 0}, 200, 'linear', function(){
						eUl.animate({left: + scrollTo + 'px'}, 1, 'linear', function(){
							eUl.animate({opacity: 1}, 200, 'linear', function(){
								nameSpace.modules.carousel.groupNumber += scrollDirection;
								nameSpace.modules.carousel.currentFirst += actualScrollInc * scrollDirection;
								// enable/disable previous
								if( scrollTo == 0 ){
									$(nameSpace.modules.carousel.selectorPrevious).addClass('previous_button_disabled');
								}
								else{
									$(nameSpace.modules.carousel.selectorPrevious).removeClass('previous_button_disabled');
								}
								// enable/disable next
								if( setNextDisable == true ){
									$(nameSpace.modules.carousel.selectorNext).addClass('next_button_disabled');
								}
								else{
									$(nameSpace.modules.carousel.selectorNext).removeClass('next_button_disabled');
								}
								
								$(nameSpace.modules.carousel.selectorPrevious).removeClass('button_disabled');
								$(nameSpace.modules.carousel.selectorNext).removeClass('button_disabled');
								
								nameSpace.modules.carousel.initAutoScroll();
								// page specific
								setCarouselCounter();
								setCarouselPager();
							});
						});
					});
				});
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.checkScroll
	/////////////////////////////////////////////
	checkScroll : function( scrollDirection )
	{
		if( scrollDirection == 1 ){
			return $(nameSpace.modules.carousel.selectorNext).hasClass('next_button_disabled') == false && $(nameSpace.modules.carousel.selectorNext).hasClass('button_disabled') == false;
		}
		else{
			return $(nameSpace.modules.carousel.selectorPrevious).hasClass('previous_button_disabled') == false && $(nameSpace.modules.carousel.selectorPrevious).hasClass('button_disabled') == false;
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.checkBucket
	/////////////////////////////////////////////
	checkBucket : function( scrollDirection )
	{
		var bucketId = null;
		var lastValidBucket = null;
		for( var i = 0; i < nameSpace.modules.carousel.groupSize; i++ ){
			if( scrollDirection == 1 ){
				bucketId = '#bucketIdx_' + ( parseInt(nameSpace.modules.carousel.currentFirst) + parseInt(nameSpace.modules.carousel.groupSize) + i );
			}
			else{
				bucketId = '#bucketIdx_' + ( nameSpace.modules.carousel.currentFirst - i );
			}
			
			if( typeof $(bucketId).attr('id') == 'undefined' && scrollDirection == 1 ){
				nameSpace.modules.carousel.createBucket( bucketId, scrollDirection );
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.createBucket
	/////////////////////////////////////////////
	createBucket : function( bucketId, bucketDirection )
	{
		var copyBucketIdx = null;
		var eLi = document.createElement('li');
		var lastBucketNumber = bucketId.split('_')[1];
		var lastBucketIndex = $( 'bucketIdx_' + ( lastBucketNumber - ( bucketDirection ) ) ).attr('bucketIdx');
		
		copyBucketIdx = ( ( lastBucketNumber - 1 ) % nameSpace.modules.carousel.bucketsOriginalLength );
		if( copyBucketIdx < 0 ){
			copyBucketIdx += nameSpace.modules.carousel.bucketsOriginalLength;
		}

		eLi.id = bucketId;
		eLi.setAttribute('bucketIdx', copyBucketIdx + 1);
		eLi.innerHTML = nameSpace.modules.carousel._arrElements[copyBucketIdx].innerHTML;
		//eLi.observe('click', function(){ alert( this.id ) } );
		
		if( bucketDirection == 1 ){
			$(nameSpace.modules.carousel.selectorSlider)[0].appendChild( eLi );
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.initAutoScroll
	/////////////////////////////////////////////
	initAutoScroll : function()
	{
		if( nameSpace.modules.carousel.autoScroll > 0 && nameSpace.modules.carousel.autoScrollId == null ){
			nameSpace.modules.carousel.autoScrollId = setInterval( function(){ nameSpace.modules.carousel.scroll(1, 1) } , nameSpace.modules.carousel.autoScroll * 1000 );
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.stopAutoScroll
	/////////////////////////////////////////////
	stopAutoScroll : function()
	{
		clearInterval(nameSpace.modules.carousel.autoScrollId);
		nameSpace.modules.carousel.autoScrollId = null;
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel.cumulativeOffset
	/////////////////////////////////////////////
	cumulativeOffset: function( element )
	{
		var valueT = 0, valueL = 0;
		do {
			valueT += element.offsetTop  || 0;
			valueL += element.offsetLeft || 0;
			element = element.offsetParent;
		} while (element);
		return [valueL, valueT];
	}
};

/* PAGE SPECIFIC FUNCTIONALITY */
function setCarouselCounter(){
	var $intFirst = nameSpace.modules.carousel.currentFirst;
	var $intLast = nameSpace.modules.carousel.currentFirst + nameSpace.modules.carousel.groupSize - 1;
	var $intTotal = nameSpace.modules.carousel._arrElements.size();
	
	$('#carouselContainer .carouselCounter').html($intFirst + '-' + $intLast + ' / ' + $intTotal);
}

function setCarouselPager(){
	if( $('#carouselContainer .carouselPager').size() ){
		if( $('#carouselContainer .carouselPager').html() == '' ){
			for( var i = 0; i < $(nameSpace.modules.carousel.selectorElements).size(); i++ ){
				$('#carouselContainer .carouselPager').append('<div></div>');
			}
		}
		//
		$('#carouselContainer .carouselPager div').removeClass('active');
		$($('#carouselContainer .carouselPager div')[ $($(nameSpace.modules.carousel.selectorElements)[ nameSpace.modules.carousel.currentFirst-1 ]).attr('bucketidx') - 1 ]).addClass('active');
	}
}