if( typeof nameSpace == 'undefined' ){
	var nameSpace = {};
}

if( typeof nameSpace.modules == 'undefined' ){
	nameSpace.modules = {};
}

if( typeof $ == 'function' && typeof $$ == 'undefined' ){
	$(document).ready(function(){
		if( nameSpace.modules.carousel2.autoInit ){
			nameSpace.modules.carousel2.init();
		}
	});
}

/////////////////////////////////////////////
// Class - nameSpace.modules.carousel2
// Description - 
/////////////////////////////////////////////
nameSpace.modules.carousel2 = 
{

	/////////////////////////////////////////////
	// Define the properties of the class
	/////////////////////////////////////////////
	autoInit				: true,
	_eContainer				: '',
	_eSlider				: '',
	_arrElements			: [],
	selectorContainer		: '#carouselContainer2',
	selectorSliderContainer	: '#carouselContainer2 .container',
	selectorSlider			: '#carouselContainer2 .container ul',
	selectorElements		: '#carouselContainer2 .container ul li',
	selectorPrevious		: '#carouselContainer2 .previous_button',
	selectorNext			: '#carouselContainer2 .next_button',
	bucketsOriginalLength	: null,
	initialLeft				: null,
	allowOverscroll			: true,
	scrollInc				: "auto",
	autoScroll				: 0,
	autoScrollId			: null,
	currentFirst			: 1,
	groupNumber				: 1,
	groupSize				: 3,
	doAlphaOnScroll			: true,
	isInAmination			: false,
	
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.init
	/////////////////////////////////////////////
	//init : function( elementId, options )
	init : function( objOverride )
	{
		if(nameSpace.modules.carousel2.checkRequirements()){
			nameSpace.modules.carousel2.overrideParams( objOverride );
			nameSpace.modules.carousel2.setInitialStage();
			nameSpace.modules.carousel2.initLayoutFix();
			nameSpace.modules.carousel2.initBuckets();
			nameSpace.modules.carousel2.initAutoScroll();
			// page specific
			setCarouselPager2();
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.checkRequirements
	/////////////////////////////////////////////
	checkRequirements : function() 
	{
		var message = '';
		
		if( $(nameSpace.modules.carousel2.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.carousel2.overrideParams
	/////////////////////////////////////////////
	overrideParams : function( e ) 
	{
		if( typeof e == 'object' ){
			for( var i in e ){
				if( typeof e[i] == typeof nameSpace.modules.carousel2[i] ){
					nameSpace.modules.carousel2[i] = e[i];
				}
			}
		}
		//
		for( var j in nameSpace.modules.carousel2 ){
			if( typeof j == 'string' && j[0] != '_' && typeof $(nameSpace.modules.carousel2.selectorContainer).attr(j) != 'undefined' ){
				nameSpace.modules.carousel2[j] = $(nameSpace.modules.carousel2.selectorContainer).attr(j);
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.setInitialStage
	/////////////////////////////////////////////
	setInitialStage : function() 
	{
		var i = 1;
		var $slider = nameSpace.modules.carousel2._eSlider = $(nameSpace.modules.carousel2.selectorSlider)[0];
		var $elements = nameSpace.modules.carousel2._arrElements = $(nameSpace.modules.carousel2.selectorElements);
		nameSpace.modules.carousel2.bucketsOriginalLength = $elements.length;
		nameSpace.modules.carousel2.initialLeft = nameSpace.modules.carousel2.cumulativeOffset($slider)[0];
		// fixes
		if( nameSpace.modules.carousel2.groupSize > $elements.size() && true ){
			var pad = ($(nameSpace.modules.carousel2.selectorContainer)[0].clientWidth - ($elements[0].clientWidth * $elements.size()))/2;			
			$(nameSpace.modules.carousel2.selectorSliderContainer).css('left', pad+'px');
		}
		if( nameSpace.modules.carousel2.groupSize > nameSpace.modules.carousel2.bucketsOriginalLength ){
			nameSpace.modules.carousel2.groupSize = nameSpace.modules.carousel2.bucketsOriginalLength;
		}
		if( nameSpace.modules.carousel2.scrollInc == 'auto' || nameSpace.modules.carousel2.scrollInc > nameSpace.modules.carousel2.groupSize ){
			nameSpace.modules.carousel2.scrollInc = nameSpace.modules.carousel2.groupSize;
		}
		
		$('.flvPlayer').each(function(){
			$(this).attr('id', 'flvPlayer' + i++);
		});
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.initLayoutFix
	/////////////////////////////////////////////
	initLayoutFix : function()
	{
		// width
			var liWidth = $(nameSpace.modules.carousel2.selectorElements)[0].clientWidth;
			var containerWidth = ( liWidth * nameSpace.modules.carousel2.groupSize );
			//var carouselWidth = containerWidth + 71;
			//$(nameSpace.modules.carousel2.selectorContainer)[0].style.width = carouselWidth + 'px';
			$(nameSpace.modules.carousel2.selectorSliderContainer)[0].style.width = containerWidth + 'px';
		// scrollers
			var $prev = $(nameSpace.modules.carousel2.selectorPrevious);
			var $next = $(nameSpace.modules.carousel2.selectorNext);
			// previous
			$prev.show();
			$prev.click(function(){ nameSpace.modules.carousel2.scroll(-1) });
			// next
			$next.show();
			$next.click(function(){ nameSpace.modules.carousel2.scroll(+1) });
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.initBuckets
	/////////////////////////////////////////////
	initBuckets : function()
	{
		var aBucket = $(nameSpace.modules.carousel2.selectorElements);
		var bucketIdx = 0;
		aBucket.each( function(){
			bucketIdx += 1;
			$(this).attr('bucketIdx', bucketIdx);
			$(this).attr('id', 'bucketIdx_' + bucketIdx);
		});
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.scroll
	/////////////////////////////////////////////
	scroll : function( scrollDirection, isAutoScroll )
	{
		var eUl = $(nameSpace.modules.carousel2.selectorSlider);
		var liWidth = $(nameSpace.modules.carousel2.selectorElements)[0].clientWidth;
		var currentLeft = nameSpace.modules.carousel2.cumulativeOffset(eUl[0])[0] - nameSpace.modules.carousel2.initialLeft;
		var actualScrollInc = nameSpace.modules.carousel2.scrollInc;
		var scrollTo;
		var setNextDisable = false;
		
		if( !nameSpace.modules.carousel2.isInAmination ){
			nameSpace.modules.carousel2.isInAmination = true;
			// stop sutoscroll
			if( typeof isAutoScroll == 'undefined' ){
				nameSpace.modules.carousel2.stopAutoScroll();
			}
			// check scroll limits for no overScroll
			if( !nameSpace.modules.carousel2.allowOverscroll ){
				if( scrollDirection >= 1 ){
					var currentLast = nameSpace.modules.carousel2.currentFirst + nameSpace.modules.carousel2.groupSize - 1;
					if( currentLast + actualScrollInc > nameSpace.modules.carousel2._arrElements.size() ){
						actualScrollInc = nameSpace.modules.carousel2._arrElements.size() - currentLast;
						setNextDisable = true;
					}
				}
				else{
					if( nameSpace.modules.carousel2.currentFirst - nameSpace.modules.carousel2.groupSize < 1 ){
						actualScrollInc = nameSpace.modules.carousel2.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.carousel2.allowOverscroll ){
				nameSpace.modules.carousel2.checkBucket( scrollDirection );
			}
			
			if( nameSpace.modules.carousel2.checkScroll( scrollDirection ) == true ){
				//
				$(nameSpace.modules.carousel2.selectorPrevious).addClass('button_disabled');
				$(nameSpace.modules.carousel2.selectorNext).addClass('button_disabled');
				//
				// TEMP
				//
				if( nameSpace.modules.carousel2.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.carousel2.groupNumber += scrollDirection;
									nameSpace.modules.carousel2.currentFirst += actualScrollInc * scrollDirection;
									// enable/disable previous
									if( scrollTo == 0 ){
										$(nameSpace.modules.carousel2.selectorPrevious).addClass('previous_button_disabled');
									}
									else{
										$(nameSpace.modules.carousel2.selectorPrevious).removeClass('previous_button_disabled');
									}
									// enable/disable next
									if( setNextDisable == true ){
										$(nameSpace.modules.carousel2.selectorNext).addClass('next_button_disabled');
									}
									else{
										$(nameSpace.modules.carousel2.selectorNext).removeClass('next_button_disabled');
									}
									
									$(nameSpace.modules.carousel2.selectorPrevious).removeClass('button_disabled');
									$(nameSpace.modules.carousel2.selectorNext).removeClass('button_disabled');
									
									nameSpace.modules.carousel2.initAutoScroll();
									// page specific
									setCarousel2CurrentActive();
									nameSpace.modules.carousel2.isInAmination = false;
								});
							});
						});
					});
				}
				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.carousel2.groupNumber += scrollDirection;
									nameSpace.modules.carousel2.currentFirst += actualScrollInc * scrollDirection;
									// enable/disable previous
									if( scrollTo == 0 ){
										$(nameSpace.modules.carousel2.selectorPrevious).addClass('previous_button_disabled');
									}
									else{
										$(nameSpace.modules.carousel2.selectorPrevious).removeClass('previous_button_disabled');
									}
									// enable/disable next
									if( setNextDisable == true ){
										$(nameSpace.modules.carousel2.selectorNext).addClass('next_button_disabled');
									}
									else{
										$(nameSpace.modules.carousel2.selectorNext).removeClass('next_button_disabled');
									}
									
									$(nameSpace.modules.carousel2.selectorPrevious).removeClass('button_disabled');
									$(nameSpace.modules.carousel2.selectorNext).removeClass('button_disabled');
									
									nameSpace.modules.carousel2.initAutoScroll();
									// page specific
									setCarousel2CurrentActive();
									nameSpace.modules.carousel2.isInAmination = false;
								});
							});
						});
					});
				}
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.scrollTo
	/////////////////////////////////////////////
	scrollTo : function( scrollTo )
	{
		if( scrollTo != nameSpace.modules.carousel2.currentFirst ){
			nameSpace.modules.carousel2.scroll( parseInt(scrollTo) - parseInt(nameSpace.modules.carousel2.currentFirst) );
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.checkScroll
	/////////////////////////////////////////////
	checkScroll : function( scrollDirection )
	{
		if( scrollDirection == 1 ){
			return $(nameSpace.modules.carousel2.selectorNext).hasClass('next_button_disabled') == false && $(nameSpace.modules.carousel2.selectorNext).hasClass('button_disabled') == false;
		}
		else{
			return $(nameSpace.modules.carousel2.selectorPrevious).hasClass('previous_button_disabled') == false && $(nameSpace.modules.carousel2.selectorPrevious).hasClass('button_disabled') == false;
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.checkBucket
	/////////////////////////////////////////////
	checkBucket : function( scrollDirection )
	{
		var bucketId = null;
		var lastValidBucket = null;
		for( var i = 0; i < nameSpace.modules.carousel2.groupSize; i++ ){
			if( scrollDirection == 1 ){
				bucketId = '#bucketIdx_' + ( parseInt(nameSpace.modules.carousel2.currentFirst) + parseInt(nameSpace.modules.carousel2.groupSize) + i );
			}
			else{
				bucketId = '#bucketIdx_' + ( nameSpace.modules.carousel2.currentFirst - i );
			}
			
			if( typeof $(bucketId).attr('id') == 'undefined' && scrollDirection == 1 ){
				nameSpace.modules.carousel2.createBucket( bucketId, scrollDirection );
			}
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.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.carousel2.bucketsOriginalLength );
		if( copyBucketIdx < 0 ){
			copyBucketIdx += nameSpace.modules.carousel2.bucketsOriginalLength;
		}

		eLi.id = bucketId;
		eLi.setAttribute('bucketIdx', copyBucketIdx + 1);
		eLi.innerHTML = nameSpace.modules.carousel2._arrElements[copyBucketIdx].innerHTML;
		//eLi.observe('click', function(){ alert( this.id ) } );
		
		if( bucketDirection == 1 ){
			$(nameSpace.modules.carousel2.selectorSlider)[0].appendChild( eLi );
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.initAutoScroll
	/////////////////////////////////////////////
	initAutoScroll : function()
	{
		var nextNode = nameSpace.modules.carousel2.currentFirst + 1;
		if( nextNode > nameSpace.modules.carousel2._arrElements.length ){
			nextNode = 1;
		}
		
		if( nameSpace.modules.carousel2.autoScroll > 0 && nameSpace.modules.carousel2.autoScrollId == null ){
			nameSpace.modules.carousel2.autoScrollId = setInterval( function(){ nameSpace.modules.carousel2.scrollTo(nextNode) } , nameSpace.modules.carousel2.autoScroll * 1000 );
		}
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.stopAutoScroll
	/////////////////////////////////////////////
	stopAutoScroll : function()
	{
		clearInterval(nameSpace.modules.carousel2.autoScrollId);
		nameSpace.modules.carousel2.autoScrollId = null;
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.doShowVideo
	/////////////////////////////////////////////
	doShowVideo : function(id)
	{
		// stop autoscroll
		nameSpace.modules.carousel2.stopAutoScroll();
		
		// show video
		$f(id, "/assets/flash/player/flowplayer.commercial-3.2.5.swf", { 
			// commercial version requires product key
	       		key: '$3bd92b7caf7f477c784',

			// now we can tweak logo settings
	        	logo: {
	                    url:'http://www.sapient.com/assets/images/transparent.gif',
	                    bottom: 1,
	                    right: 1,
	                    // for commercial versions you can specify where user is redirected when logo is clicked
	                    linkUrl: 'http://sapient.com'
                    	},

			clip: { 
			    
				autoPlay: true,
				autoBuffering: true,
				onPause: function() {
					nameSpace.modules.carousel2.onVideoStop();
					nameSpace.modules.carousel2.stopAutoScroll();
					this.unload();
				},
				onCuepoint: [
    						[1],
    						function () {
      							nameSpace.modules.carousel2.stopAutoScroll(); 
     						}
  					]
			},
		    plugins: {

		            viral: {
			            // load the viral videos plugin
			            url: '/assets/flash/player/flowplayer.viralvideos-3.2.3.swf',
            			
			            email: false,
			            
				    share: {
				            // define a video title used in sharing
				            //description: 'Extreme surfers riding big waves',
            				
				            // disable livespaces (it's from Microsoft)
				            livespaces: false,
					        orkut:false,
					        bebo: false,
                            myspace: false,
                            digg: false,
                            stumbleupon: false
			            },
			            // disable embedding completely, the same syntax can 
			            // be used to disable also email and share
			            embed: false
				}
			},

			onFinish: function() {
				nameSpace.modules.carousel2.onVideoStop();
				this.unload();
			}
		});
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.onVideoStop
	/////////////////////////////////////////////
	onVideoStop : function()
	{
		nameSpace.modules.carousel2.initAutoScroll();
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.doVideoStop
	/////////////////////////////////////////////
	doVideoStop : function()
	{
		try{
			$f().stop();
		}
		catch(err){}
		
	},
	
	/////////////////////////////////////////////
	// Function - nameSpace.modules.carousel2.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];
	}
};



function setCarouselPager2(){
	if( $('#carouselContainer2 .carouselPager').size() ){
		//Code bug fix for handling sapce in DIV tag
	    if(( $('#carouselContainer2 .carouselPager').html() == '' ) || ( $('#carouselContainer2 .carouselPager').html() == '&nbsp;' )){
			for( var i = 0; i < $(nameSpace.modules.carousel2.selectorElements).size(); i++ ){
				$('#carouselContainer2 .carouselPager').append('<div class="pager" bucketTitle="' + $($(nameSpace.modules.carousel2.selectorElements)[i]).attr('bucketTitle') + '" idx="' + ( $(nameSpace.modules.carousel2.selectorElements).size() - i ) + '"></div>');
			}
			$('#carouselContainer2 .carouselPager').append('<div class="bucketTitle"></div>');
		}
		//
		setCarousel2CurrentActive();
		
		$('#carouselContainer2 .carouselPager div[idx]').click(function(){ nameSpace.modules.carousel2.scrollTo( $(this).attr('idx') ) });
	}
}

function setCarousel2CurrentActive(){
	$('#carouselContainer2 .carouselPager div').removeClass('active');
	$('#carouselContainer2 .carouselPager div[idx=' + $($(nameSpace.modules.carousel2.selectorElements)[ nameSpace.modules.carousel2.currentFirst-1 ]).attr('bucketidx') + ']').addClass('active');
	// TEMP: need to change to correct selector for text
	$('#carouselContainer2 .carouselPager div.bucketTitle').html( $($(nameSpace.modules.carousel2.selectorElements)[ nameSpace.modules.carousel2.currentFirst-1 ]).attr('bucketTitle') );
	// if bucket has video
	if( $($(nameSpace.modules.carousel2.selectorElements)[ nameSpace.modules.carousel2.currentFirst-1 ]).find('.flvPlayer').size() ){
		nameSpace.modules.carousel2.doShowVideo($($(nameSpace.modules.carousel2.selectorElements)[ nameSpace.modules.carousel2.currentFirst-1 ]).find('.flvPlayer').attr('id'));
	}
	else{
		nameSpace.modules.carousel2.doVideoStop();
	}
}
