/**
 * DISNEY UI - Feature
 * @version 1.1
 * @author: Dwight Brown <dwightb at construct7.com>
 */
	 
;(function($)
{
	var count = 1; // Used to generate div ids for SWFObject
	
	var _options =
		{
			"flashVer":      "9.0.124",
			"xiSwfUrlStr":   "assets/js/swfobject/expressInstall.swf",
			"flashVars":     {},
			"flashParams":   { "wmode": "transparent" }
		};


	var classes =
		{
			"error":     "disney-ui-error",
			"loading":   "disney-ui-loading",
			"container": "disney-ui-feature",
			"panel":     "feature-panel",
			"header":    "feature-header",
			"footer":    "feature-footer",
			"heading":   "feature-heading",
			"title":     "feature-title",
			"media":     "feature-media",
			"content":   "feature-content",
			"price":     "feature-price",
			"related":   "feature-related"
		};
	
	$.fn.Feature = 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.media );
			}
		};
	
		function generateHTML( xml, el, options )
		{
			// OPTIONS
			var options = options || {};
			
			// Set default options
			classes        = options.classes || classes;
			options.footer = options.footer || "";
		
			// DATA
			var feature = $(xml).find("feature");
			var feature_heading = $(feature).attr("title");
			var heading = $(feature).find("heading").text();
			var title   = $(feature).find("title").text();
			var link    = $(feature).find("link:first");
			var media   = $(feature).find("media");
			var desc    = $(feature).find("desc").text();
			var price   = $(feature).find("price").text();
			var links   = $(feature).find("related").find("link");
			
			if ( link && link.length && $(link).attr("url") )
			{
				title = '<a href="' + $(link).attr("url") + '">' + title + '</a>';
			}

			// STRUCTURE
			$(el).html(
				'<div class="' + classes.container + '">' +
					'<div class="' + classes.header + " " + classes.heading + '">' +
					(feature_heading?"<h2>" + feature_heading + "</h2>":"") +
					'</div>' +
					'<table class="' + classes.panel + '">' +
					(heading?'<tr><td class="' + classes.heading + '" colspan="2"><h2>' + heading + '</h2></td></tr>':"") +
					'<tr>' +
					'<td class="' + classes.media + '"></td>' +
					'<td class="' + classes.content + '">' +
					'<h3>' + title + '</h3>' +
					(desc?'<p>' + desc + '</p>':"") +
					(price?'<p class="' + classes.price + '">' + price + '</p>':"") +
					'<ul class="' + classes.related + '"></ul>' +
					'</td>' +
					'</tr>' +
					'</table>' +
					'<div class="' + classes.footer + '">' + options.footer + '</div>' +
				'</div>'
			);
			
			// MEDIA
			var swfs = {};
			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['feature-'+count] = media_url;
						media_html = '<div id="feature-'+(count++)+'" class="' + classes.media + '"></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.media + '" />';
						if ( link && link.length && $(link).attr("url") )
						{
							media_html = '<a href="' + $(link).attr("url") + '" title="' + $(link).text() + '">' + media_html + '</a>';
						}
						break;
				}
				
				$(el).find("." + classes.media).html( media_html );
				
				embedSWFs( swfs );
			}
			
			if ( links && links.length )
			{
				var related = $("." + classes.container + " ." + classes.content + " ." + classes.related);
				
				$(links).each( function()
				{
					$(related).append('<li><a href="' + $(this).attr("url") + '">' + $(this).text() + '</a></li>');
				});
			}
		};
	
		return this.each( function()
		{
			// Display loading indicator
			$(this).html( '<p class="' + classes.loading + '">' + options.loadingText + '</p>' );
			
			if ( options && options.feed )
			{
				$.ajax(
				{
					target: this,
					options: options,
					type: "GET",
					url: options.feed,
					dataType: "xml",
					success: function( xml )
					{
						generateHTML( xml, this.target, this.options );
						$(this.target).trigger( "loadComplete" );
					},
					error: function()
					{
						$(this).html( '<p class="' + classes.error + '">Error: Feed failed to load.</p>' );
					}
				});
			}
			else
			{
				$(this).html( '<p class="' + classes.error + '">Error: Feed not specified.</p>' );
			}
		});
	};
})(jQuery);

/* Avoid errors in browser that do not support console.log() */
if ( !window.console )
{
	window.console = {};
	console.log = function(){};
}