/**
 * DISNEY UI - Carousel
 * @version 1.1
 * @author: Dwight Brown <dwightb at construct7.com>
 */
	 
;(function($)
{
	var count = 1; // Used to generate div ids for SWFObject

    var _baseAdServerURL  = "http://disney.go.com/Adserver?CallDown&AdTypes=SponsorLogo&url=";

	
	var _options =
		{
			"flashVer":      "9.0.124",
			"xiSwfUrlStr":   "assets/js/swfobject/expressInstall.swf",
			"flashVars":     {},
			"flashParams":   { "wmode": "transparent" }
		};

	var classes =
		{
			"loading"     : "disney-ui-loading",
			"container"   : "disney-ui-carousel",
			"header"      : "carousel-header",
			"carousel"    : "carousel",
			"wheel"       : "carousel-wheel",
			"item"        : "carousel-item",
			"itemTitle"   : "carousel-itemTitle",
			"itemMedia"   : "carousel-itemMedia",
			"itemOverlay" : "carousel-itemOverlay",
			"itemDesc"    : "carousel-itemDesc",
			"itemLink"    : "carousel-itemLink",
			"adSliver"    : "carousel-adSliver",
			"prev"        : "carousel-back",
			"prevOff"     : "carousel-back-disabled",
			"next"        : "carousel-forward",
			"nextOff"     : "carousel-forward-disabled"
		};
	
	$.fn.Carousel = function( options )
	{
		// Set default options
		options = options || {};
		options.flashVer      = options.flashVer      || _options.flashVer;
		options.xiSwfUrlStr   = options.xiSwfUrlStr   || _options.xiSwfUrlStr;
		options.flashVars     = options.flashVars     || _options.flashVars;
		options.flashParams   = options.flashParams   || _options.flashParams;
	
		function getExtension( filename )
		{
			if( !filename || filename.length == 0 ) return ""; 

			var i = filename.lastIndexOf( "." ); 
			if ( i == -1 ) return ""; 

			return (filename.substr( i+1, filename.length )).toUpperCase();
		};
		
		function embedSWFs( swfs )
		{
			for ( elementId in swfs )
			{
			    swfobject.embedSWF(
			    	swfs[elementId],
			    	elementId,
			    	$('#'+elementId).width(),
			    	$('#'+elementId).height(),
			    	options.flashVer,
			    	options.xiSwfUrlStr,
			    	options.flashVars,
			    	options.flashParams,
			    	{}
			    );
			    
			    $('#'+elementId).addClass( classes.itemMedia );
			}
		};
	
		function autoAdjustWheel( el, options )
		{
			// Adjust wheel size
			//var wheel = $(el).children('.' + classes.carousel).children('.' + classes.wheel);
			var wheel = $(el).find('.' + classes.carousel).find('.' + classes.wheel);
			var items = $(wheel).find('.' + classes.item);
			
			if ( items.length > 0 )
			{
				$(items[0]).addClass( "first" );
				$(items[items.length - 1]).addClass( "last" );

				$(wheel).width( $(items[0]).width() * items.length );
				$(wheel).attr( "itemWidth", $(items[0]).width() );
			}

			// Disable Next button if no part of the wheel is hidden (too few items)
			if ( $(wheel).width() <= $(el).find('.' + classes.carousel).width() )
			{
				$(el).find('.' + classes.next).addClass(classes.nextOff);
			}
		};
	
		return this.each( function()
		{
			// Cache contents
			var html = $(this).html();
			
			// Create HTML/CSS framework
			$(this).html(
				'<div class="' + classes.container + '">' +
				'<div class="' + classes.header + '"></div>' +
				'<div class="' + classes.prev + " " + classes.prevOff +'"></div>' +
				'<div class="' + classes.carousel + '" style="overflow: hidden; position: relative;">' +
					'<div class="' + classes.wheel + '" style="position: relative; left: 0;">' +
						'<p class="' + classes.loading + '">' + options.loadingText + '</p>' +
					'</div>' +
				'</div>' +
				'<div class="' + classes.next + '"></div>' +
				'</div>'
			 );

			// Prev button even
			$(this).find( '.' + classes.prev ).click( function()
			{
				// Prevent/remove text selection from control dblclick events
				if ( document.selection && document.selection.empty )
				{
					document.selection.empty();
				}
				else if ( window.getSelection )
				{
					var sel = window.getSelection();
					sel.removeAllRanges();
				}
				
				if ( $(this).hasClass(classes.prevOff) ) return 0;

				// Enable Next button
				$(this).parent().find('.' + classes.next).removeClass(classes.nextOff);
			
				var el = $(this).parent().find('.' + classes.carousel).find('.' + classes.wheel);
				var left = parseInt($(el).css("left"));
				var itemWidth = parseInt($(el).attr("itemWidth"));
				
				if ( left < 0 && (left % itemWidth) == 0 )
				{
					if ( (left + itemWidth) >= 0 )
					{
						$(this).parent().find('.' + classes.prev).addClass(classes.prevOff);
					}
					
					$(el).animate( {"left": "+="+itemWidth+"px"}, "fast" );
				}
			});
			
			// Next button event
			$(this).find( '.' + classes.next ).click( function()
			{
				// Prevent/remove text selection from control dblclick events
				if ( document.selection && document.selection.empty )
				{
					document.selection.empty();
				}
				else if ( window.getSelection )
				{
					var sel = window.getSelection();
					sel.removeAllRanges();
				}
				
				if ( $(this).hasClass(classes.nextOff) ) return 0;
				
				// Enable Prev button
				$(this).parent().find('.' + classes.prev).removeClass(classes.prevOff);
						
				var el = $(this).parent().find('.' + classes.carousel).find('.' + classes.wheel);
				var left = parseInt($(el).css("left"));
				var itemWidth = parseInt($(el).attr("itemWidth"));

				var wheelRemaining = ($(el).width() + left) - $(el).parent().width();
				
				if ( wheelRemaining > 0 && (left % itemWidth) == 0 )
				{
					if ( (wheelRemaining - itemWidth) <= 0 )
					{
						$(this).parent().find('.' + classes.next).addClass(classes.nextOff);
					}

					$(el).animate( {"left": "-="+itemWidth+"px"}, "fast" );
				}
			});

			if ( options && options.feed )
			{
				$.ajax(
				{
					target: this,
					wheel: $(this).find('.' + classes.carousel).find('.' + classes.wheel),
					type: "GET",
					url: options.feed,
					dataType: "xml",
					success: function( xml )
					{
						var target = this.target;
						var wheel = this.wheel;
						var html = "";
						
						var title = $(xml).find("items").attr("title");
						if ( title && title != "" ) $(target).find("."+classes.header).html( '<h2>' + title + '</h2>' );

						var swfs = {};
						$(xml).find("item").each( function()
						{
							var title = $(this).find("title").text();
							var media = $(this).find("media");
							var desc  = $(this).find("desc").text();
							var link  = $(this).find("link");
							var sponsorLogoAd = $(this).find("sponsorLogoAd").text();
								
							// MEDIA
							if ( media && media.length )
							{
								var media_title = $(media).text();
								var media_url = $(media).attr("url");
								var media_html = "";
							
								switch ( getExtension(media_url) )
								{
									case "SWF":
										swfs['carousel-'+count] = media_url;
										media_html = '<div id="carousel-'+(count++)+'" class="' + classes.itemMedia + '"></div>';
										if ( link && link.length && $(link).attr("url") )
										{
											media_html += '<a href="' + $(link).attr("url") + '" title="' + $(link).text() + '">' + media_html + '</a>';
										}
										break;
									
									default:
										media_html = '<img src="' + media_url + '" alt="' + media_title + '" class="' + classes.itemMedia + '" />';
										if ( link && link.length && $(link).attr("url") )
										{
											media_html += '<a href="' + $(link).attr("url") + '" title="' + $(link).text() + '"></a>';
										}
										break;
								}
							}
							
							html +=
								'<div class="' + classes.item + '">' +
									'<table cellspacing="0" cellpadding="0">' +
										'<tr><td class="' + classes.itemTitle + '"><h3>' + title + '</h3></td></tr>' + 
										'<tr><td class="' + classes.itemMedia + '"><div>' + media_html + '</div></td></tr>' + 
										'<tr><td class="' + classes.itemDesc + '">' + desc + '</td></tr>' + 
										'<tr><td class="' + classes.itemLink + '"><a href="' + $(link).attr("url") + '">' + $(link).text() + '</a></td></tr>';
							if (sponsorLogoAd != "") {
								html += '<tr><td class="' + classes.adSliver + '"><iframe src="' + _baseAdServerURL + sponsorLogoAd +  '" width="120" height="60" marginwidth="0" marginheight="0" hspace="0" vspace="0" frameborder="0" scrolling="no" bordercolor="#000000"></iframe></div>';
							} else {
								html += '<tr><td class="' + classes.adSliver + '">&nbsp;</td></tr>';							
							}
							html += '</table>' +
								'</div>';
						});
						
						$(wheel).html( html );
						
						embedSWFs( swfs );
					
 						autoAdjustWheel( target, options );
					}
				});
			}
			else
			{
				$(this).find('.' + classes.carousel).find('.' + classes.wheel).html( html );
				autoAdjustWheel( this, options );
			}
		});
	};
})(jQuery);

/* Avoid errors in browser that do not support console.log() */
if ( !window.console )
{
	window.console = {};
	console.log = function(){};
}