/*
 * forte media carousel plugin
 * @author webmaster@forteinteractive.com - http://www.forteinteractive.com
 * @version 1.0
 * @date January 10, 2010
 * @copyright (c) 2010 webmaster@forteinteractive.com (www.forteinteractive.com)
 */

(function($){
	$.fn.extend({ 
		infiniteCarousel: function(options) {
			var defaults = {
				transitionSpeed: 1500,
				displayTime: 6000,
				textholderHeight: .2,
				autoRotate: 1,
				autoPlayVideo:0,
				imageHeight: 0,
				imageWidth: 0,
				displayControllerBar: 1,
				displaySelectors: 1,
				outerContainerId: 'HomepageMediaRotatorWpr'
			};
			var options = $.extend(defaults, options);
	
    		return this.each(function() {
    			var randID = Math.round(Math.random()*100000000);
				var o=options;
				var cont = $('#' + o.outerContainerId);
				var obj = $(this);
				var curr = 1;
				var numImages = $('li', obj).length;
				var ImageContainerWidth = o.imageWidth * numImages;
				var imgHeight = o.imageHeight;
				var imgWidth = o.imageWidth;
				var autopilot = 1;

				/* --- Apply Inline CSS To Markup  --- */
				$(cont).width(imgWidth);
				$(obj).width(imgWidth).height(imgHeight);
				$(obj).css({'overflow':'hidden','position':'relative'});
				if(o.autoRotate) {
					$('li:last', obj).prependTo($('ul', obj));
					$('ul',obj).css('left',-imgWidth+'px').css({'position':'relative'});
				}
				$('ul',obj).width(ImageContainerWidth);
				$('div.objectCaptionCt',obj).width(imgWidth);
		
				/* --- Build Carousel Controller Elements --- */
				if(o.displayControllerBar) {
					PagObj = $(cont).find('.mediaControllerCt');
					$(PagObj).append('<div id="ControllerCt_'+randID+'" class="controllerCt"><div class="controllerInnerCt"><ul class="controllerItemCt"></ul></div></div>');
					$('.controllerItemCt').append('<li class="previous_button" title="Previous"><a href="javascript:void(0);"><span>Previous</span></a></li>');
					$('.controllerItemCt').append('<li class="play_button" title="Play"><a href="javascript:void(0);"><span>Play</span></a></li>');
					$('.controllerItemCt').append('<li class="pause_button" title="Pause"><a href="javascript:void(0);"><span>Pause</span></a></li>');
					$('.controllerItemCt').append('<li class="next_button" title="Next"><a href="javascript:void(0);"><span>Next</span></a></li>');
					if(o.autoRotate) {
						$('#' + o.outerContainerId + ' .play_button').hide();
					} else {
						$('#' + o.outerContainerId + ' .pause_button').hide();
					}
				}
							
				/* --- Configure Controller Events --- */
				$('#' + o.outerContainerId + ' .pause_button').click(function(){ PauseAnimation(); });
				$('#' + o.outerContainerId + ' .play_button').click(function(){ ResumeAnimation(); });
				$('#' + o.outerContainerId + ' .next_button').click(function(){ NextElement(); });
				$('#' + o.outerContainerId + ' .previous_button').click(function(){ PreviousElement(); });
				
				/* --- Configure Media Object Events --- */
				ConfigureAnchorEvents();
				
				/* --- Build Carousel Selector Elements --- */
				if(o.displaySelectors) {
					PagObj = $(cont).find('.mediaControllerCt');
					$(PagObj).append('<div id="SelectorCt_'+randID+'" class="selectorCt"><div class="selectorInnerCt"><ul class="selectorItemCt"></ul></div></div>');
					for(i=0; i<=numImages-1; i++) {
						$('.selectorItemCt').append('<li id="selectorItem'+randID+'_'+(i+1)+'" class="selectorItem"><a href="javascript:void(0);"><span>'+(i+1)+'</span></a></li>');
						if(i==0) $('#selectorItem'+randID+'_1').addClass("active");
					}
					ActivateSelectorEvent();
				}
				
				/* --- Auto Play Video Events --- */
				if(o.autoPlayVideo) {
					$('#' + o.outerContainerId + ' a.video').trigger("click");
					$('#' + o.outerContainerId + ' a.youtube').trigger("click");
				}
				
				function GoToElement(event) {
					DeactivateSelectorEvent();
					target_elem = this.id.split('_');
					select_elem = target_elem[1];
					if(curr != select_elem) {
						SetSelector(this.id);
						PauseAnimation()
					}
					if(select_elem > curr) { diff = select_elem - curr; anim('next',diff); }
					if(select_elem < curr) { diff = curr - select_elem; anim('prev',diff); }
				}
				
				function SetSelector(elemId) {
					$('.selectorItem').removeClass('active');
					$('#' + elemId).addClass('active');
				}
				
				function ActivateSelectorEvent() { 
					$('.selectorItem').bind('click', GoToElement);
					$('#' + o.outerContainerId + ' .pause_button').bind('click',function(){ PauseAnimation(); });
					$('#' + o.outerContainerId + ' .play_button').bind('click',function(){ ResumeAnimation(); });
					$('#' + o.outerContainerId + ' .next_button').bind('click',function(){ NextElement(); });
					$('#' + o.outerContainerId + ' .previous_button').bind('click',function(){ PreviousElement(); });
				}
				
				function DeactivateSelectorEvent() { 
					$('.selectorItem').unbind('click');
					$('#' + o.outerContainerId + ' .pause_button').unbind('click');
					$('#' + o.outerContainerId + ' .play_button').unbind('click'); 
					$('#' + o.outerContainerId + ' .next_button').unbind('click'); 
					$('#' + o.outerContainerId + ' .previous_button').unbind('click');
				}
				
				function ConfigureAnchorEvents() {
					$('#' + o.outerContainerId + ' a.link').bind('click', function(event){ ImageClicked(event); });
					$('#' + o.outerContainerId + ' a.video').bind('click', function(event){
						event.preventDefault();
						PauseAnimation();
						VideoClicked(event);
					});
					$('#' + o.outerContainerId + ' a.youtube').bind('click', function(event){
						event.preventDefault();
						PauseAnimation();
						YoutubeClicked(event);													
					});
				}
 				
				function PauseAnimation() {
					removeVideoPlayer();
					autopilot = 0;
					clearTimeout(clearInt);
					$('#' + o.outerContainerId + ' .pause_button').hide();
					$('#' + o.outerContainerId + ' .play_button').show();
				}
				
				function ResumeAnimation() {
					removeVideoPlayer();
					autopilot = 1;
					anim('next');
					clearInt=setInterval(function(){anim('next');},o.displayTime+o.transitionSpeed);
					$('#' + o.outerContainerId + ' .pause_button').show();
					$('#' + o.outerContainerId + ' .play_button').hide();
				}
				
				function NextElement() { PauseAnimation(); anim('next'); }
				function PreviousElement() { PauseAnimation(); anim('prev'); }
				
				function removeVideoPlayer(playerId) {
					$('.inlineVideoPlayer').each(function() {
						var currentElem = $(this);
						var child = currentElem.find("object");
						child.remove();
						currentElem.remove();
					});
					$('.inlineYoutubePlayer').each(function() {
						var currentElem = $(this);
						var child = currentElem.find("object");
						child.remove();
						currentElem.remove();
					});
				}
				
				function loadVideoPlayer(playerId,videoUrl) {
					flowplayer( playerId, {
						src: 'http://releases.flowplayer.org/swf/flowplayer-3.1.5.swf', 
						wmode: 'transparent'
					 },{
						clip: { url: videoUrl },
						plugins: {
							controls: { 
								backgroundColor: '#cfcfcf',
								backgroundGradient: 'high',
								timeColor: '#000000',
								durationColor: '#000000',
								progressColor: '#E72727',
								bufferColor: '#C78F8E',
								buttonColor: '#999999',
								buttonOverColor: '#666666',
								volumeSliderColor: '#C78F8E',
								timeBgColor: '#B1B1B1'
							}  	
						}
					});	
				}
				
				function loadYoutubePlayer(playerId,videoUrl) {
					flashembed(playerId, { 
						src: videoUrl,
						wmode: 'transparent'
					},{
						autoplay: 1,
						playerMode: 'embedded',
						rel: 0,
						iv_load_policy: 3,
						showinfo: 0,
						wmode: "transparent"
					});
				}

				function ImageClicked(event) { /* intentionally blank */ }
				function VideoClicked(event) { 
					var randomVideoID = Math.round(Math.random()*100000000);
					var playerId = 'InlineVideoPlayerCt_' + randomVideoID;
					var firstElem = $(event.target);
					var secondElem = $(event.target).parent();
					var thirdElem = $(event.target).parent().parent();
					var fourthElem = $(event.target).parent().parent().parent();
					var videoUrl = '';
					var anchorElem = '';
					var loadPlayer = false;
					
					if (firstElem.is('a')) { 
						anchorElem = firstElem; videoUrl = firstElem.attr('href');
					} else if (secondElem.is('a')) {
						anchorElem = secondElem; videoUrl = secondElem.attr('href');
					} else if (thirdElem.is('a')) {
						anchorElem = thirdElem; videoUrl = thirdElem.attr('href');
					} else if (fourthElem.is('a')) {
						anchorElem = fourthElem; videoUrl = fourthElem.attr('href');
					}
					
					if (anchorElem != '' && videoUrl != '') { var loadPlayer = true; }
					if (loadPlayer) {
						$(anchorElem).after('<div id="'+playerId+'" class="inlineVideoPlayer"></div>');
						$('.inlineVideoPlayer').width(imgWidth).height(imgHeight);
						loadVideoPlayer(playerId,videoUrl);
					}
				}
				
				function YoutubeClicked(event) {
					var randomVideoID = Math.round(Math.random()*100000000);
					var playerId = 'InlineYoutubePlayerCt_' + randomVideoID;
					var firstElem = $(event.target);
					var secondElem = $(event.target).parent();
					var thirdElem = $(event.target).parent().parent();
					var fourthElem = $(event.target).parent().parent().parent();
					var videoUrl = '';
					var anchorElem = '';
					var loadPlayer = false;
					
					if (firstElem.is('a')) {
						anchorElem = firstElem; videoUrl = firstElem.attr('href');
					} else if (secondElem.is('a')) {
						anchorElem = secondElem; videoUrl = secondElem.attr('href');
					} else if (thirdElem.is('a')) {
						anchorElem = thirdElem; videoUrl = thirdElem.attr('href');
					} else if (fourthElem.is('a')) {
						anchorElem = fourthElem; videoUrl = fourthElem.attr('href');
					}
					
					if (anchorElem != '' && videoUrl != '') { var loadPlayer = true; }
					if (loadPlayer) {
						$(anchorElem).after('<div id="'+playerId+'" class="inlineYoutubePlayer"></div>');
						$('.inlineYoutubePlayer').width(imgWidth).height(imgHeight);
						loadYoutubePlayer(playerId,videoUrl);
					}
				}
				
				function anim(direction,dist) {
					if(direction == "next") {
						if(curr == numImages) curr = 0;
						if(dist > 1) {
							$('li:lt(2)', obj).clone().insertAfter($('li:last', obj));
							$('ul', obj).animate({left:-imgWidth*(dist+1)},o.transitionSpeed,function(){
								$('li:lt(2)', obj).remove();
								for(j=1;j<=dist-2;j++) {
									$('li:first', obj).clone().insertAfter($('li:last', obj));
									$('li:first', obj).remove();
								}
								$(this).css({'left':-imgWidth});
								curr = curr+dist;
								ConfigureAnchorEvents();
								ActivateSelectorEvent();
							});
						} else {
							DeactivateSelectorEvent();
							SetSelector('selectorItem'+randID+'_'+(curr+1));
							$('li:first', obj).clone().insertAfter($('li:last', obj));	
							$('ul', obj).animate({left:-imgWidth*2},o.transitionSpeed,function(){
								$('li:first', obj).remove();
								$('ul', obj).css('left',-imgWidth+'px');
								curr=curr+1;
								ConfigureAnchorEvents();
								ActivateSelectorEvent();
							});
						}
					}
					if(direction == "prev") {
						if(dist>1) {
							$('li:gt('+(numImages-(dist+1))+')', obj).clone().insertBefore($('li:first', obj));
							$('ul', obj).css({'left':(-imgWidth*(dist+1))}).animate({left:-imgWidth},o.transitionSpeed,function(){
								$('li:gt('+(numImages-1)+')', obj).remove();
								curr = curr - dist;
								ConfigureAnchorEvents();
								ActivateSelectorEvent();
							});
						} else {
							DeactivateSelectorEvent();
							select_elem = curr - 1;
							if(select_elem == 0) select_elem = numImages;
							
							SetSelector('selectorItem'+randID+'_'+select_elem);
							$('li:last', obj).clone().insertBefore($('li:first', obj));
							$('ul', obj).css('left',-imgWidth*2+'px').animate({left:-imgWidth},o.transitionSpeed,function(){
								$('li:last', obj).remove();
								curr=curr-1;
								if(curr==0) curr=numImages;
								ConfigureAnchorEvents();
								ActivateSelectorEvent();
							});
						}
					}
				}
				
				if(o.autoRotate) {
					var clearInt = setInterval(function(){anim('next');},o.displayTime+o.transitionSpeed);
				}
  			});
    	}
	});
})(jQuery);