/**
 * DISNEY UI - Tile Pack
 * @version 1.4.4
 * @author: Dwight Brown <dwightb at construct7.com>
 */
	 
;(function($)
{
	var count = 1; // Used to generate div ids for SWFObject

	var _options =
		{
            "flashProxySWF": "flashproxy.swf",
			"flashVer":      "9.0.124",
			"xiSwfUrlStr":   "assets/js/swfobject/expressInstall.swf",
			"flashVars":     {},
			"flashParams":   { "wmode": "transparent" },
			"priceSaleText": "SALE: ",
			"priceWasText":  "WAS: "
		};

	var classes =
		{
			"error":     "disney-ui-error",
			"loading":   "disney-ui-loading",
			"container": "disney-ui-tilepack",
			"header":    "tilepack-header",
			"footer":    "tilepack-footer",
			"carousel":  "tilepack-carousel",
			"grid":      "tilepack-grid",
			"meta":      "tilepack-meta",
			"title":     "tilepack-title",
			"desc":      "tilepack-desc",
			"price":     "tilepack-price",
			"priceSale": "tilepack-price-sale",
			"media":     "tilepack-media",
			"overlay":   "tilepack-overlay",
			"paging":    "tilepack-paging"
		};

	var xmlMap =
		{
			"items":           "items",
			"items_title":     "", // attr("title")
			"item":            "items item",
			"link":            "link",
			"link_url":        "", // attr("url")
			"link_title":      "", // attr("title")
			"media":           "media",
			"media_url":       "", // attr("url")
			"media_title":     "", // attr("title")
			"title":           "title",
			"desc":            "desc",
			"price":           "price",
			"price_reg_low":   "reg_price_low",
			"price_reg_high":  "reg_price_high",
			"price_sale_low":  "sale_price_low",
			"price_sale_high": "sale_price_high"
		};

	$.fn.TilePack = function( options )
	{
		var self = this;

		// Set default options
		options = options || {};
		options.xmlMap        = options.xmlMap        || xmlMap;
		options.flashProxySWF = options.flashProxySWF || _options.flashProxySWF;
		options.flashVer      = options.flashVer      || _options.flashVer;
		options.xiSwfUrlStr   = options.xiSwfUrlStr   || _options.xiSwfUrlStr;
		options.flashVars     = options.flashVars     || _options.flashVars;
		options.flashParams   = options.flashParams   || _options.flashParams;
		options.priceSaleText = options.priceSaleText || _options.priceSaleText;
		options.priceWasText  = options.priceWasText  || _options.priceWasText;

		function generatePaging( options, items )
		{
			var itemsPerPage = options.cols * options.rows;
			if ( itemsPerPage >= items.length || itemsPerPage == 0 ) return "";
			
			var html = '<table class="' + classes.paging + '"><tr>';
			for ( var i = 0; i < (items.length / itemsPerPage); ++i )
			{
				html += '<td><a href="#page-'+ (i + 1) +'" class="page-' + (i + 1) + '"><span>' + ((i + 1).toString()) + '</span></a></td>';
			}
			html += '</tr></table>';
		
			return html;
		};

		function changePage( target, page )
		{
			var carousel = $(target).find('.' + classes.carousel );
			var grid = $(target).find('.' + classes.grid );
			var left = 0;
			
			left = (page - 1) * $(carousel).width();
			left = "-" + left + "px";
			
			$(grid).animate( {"left": left}, "fast" );
		};

		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 parseXML( xml )
		{
			if ( window.ActiveXObject && window.GetObject )
			{
				var dom = new ActiveXObject( 'Microsoft.XMLDOM' );
				dom.loadXML( xml );
				return dom;
			}
			
			if ( window.DOMParser )
			{
				return new DOMParser().parseFromString( xml, 'text/xml' );
			}
			
			throw new Error( 'No XML parser available' );
		};

        function processXML( xml )
        {
			//if xml is a string parse it into an xml object first.
			if ( xml.length ) xml = parseXML( xml );
			
			var swfs = {};
			var rows_media = [], rows_meta = [], rows_title_desc = [], rows_price = [];
			var n = 0;
			var i = 0;
			
			var items = $(xml).find(options.xmlMap.item);
			
			// Media/Overlays
			$(items).each( function()
			{
				if ( i == 0 || i % options.cols == 0 )
				{
					if ( n >= rows_media.length ) rows_media[n] = "";
				}
				
				var link_url    = options.xmlMap.link_url    ? $(this).find(options.xmlMap.link_url).text()    : (options.xmlMap.link  ? $(this).find(options.xmlMap.link).attr("url") : "");
				var link_title  = options.xmlMap.link_title  ? $(this).find(options.xmlMap.link_title).text()  : (options.xmlMap.link  ? $(this).find(options.xmlMap.link).text() : "");
				var media_url   = options.xmlMap.media_url   ? $(this).find(options.xmlMap.media_url).text()   : (options.xmlMap.media ? $(this).find(options.xmlMap.media).attr("url") : "");
				var media_title = options.xmlMap.media_title ? $(this).find(options.xmlMap.media_title).text() : (options.xmlMap.media ? $(this).find(options.xmlMap.media).text() : "");
				link_url = link_url || "#";
				
				rows_media[n] += '<td class="'+classes.media+'">';
				rows_media[n] += '<div>';
				switch ( getExtension(media_url) )
				{
					case 'SWF':
						swfs['tile-'+count] = media_url;
						media_url = '';
						rows_media[n] += '<div id="tile-' + (count++) + '" class="'+classes.media+'" src="'+(media_url||'')+'"></div>';
						break;
					default:
						rows_media[n] += '<a href="'+link_url+'" title="'+link_title+'"><img id="tile-' + (count++) + '" class="'+classes.media+'" src="'+(media_url||'')+'" /></a>';
				}
				rows_media[n] += '<a class="'+classes.overlay+'"';
				rows_media[n] += ' href="'+link_url+'"';
				rows_media[n] += ' title="'+link_title+'">';
				rows_media[n] += '</a></div></td>\n';
				
				++i;
				
				if ( i % options.cols == 0 )
				{
					++n;
					if ( n >= options.rows ) n = 0;
				}
			});
			
			// Meta
			i = 0;
			n = 0;
			$(items).each( function()
			{
				if ( i == 0 || i % options.cols == 0 )
				{
					if ( n >= rows_title_desc.length )  rows_title_desc[n]  = "";
					if ( n >= rows_price.length ) rows_price[n] = "";
				}
				
				var title    = $(this).find(options.xmlMap.title).text();
				var desc     = $(this).find(options.xmlMap.desc).text();
				var link_url = options.xmlMap.link_url ? $(this).find(options.xmlMap.link_url).text() : (options.xmlMap.link ? $(this).find(options.xmlMap.link).attr("url") : "");
				link_url = link_url || "#";
				
				// determine if and what price should be displayed
				var price = $(this).find(options.xmlMap.price).text();
				
				var price_reg_low   = $(this).find(options.xmlMap.price_reg_low).text();
				var price_reg_high  = $(this).find(options.xmlMap.price_reg_high).text();
				var price_sale_low  = $(this).find(options.xmlMap.price_sale_low).text();
				var price_sale_high = $(this).find(options.xmlMap.price_sale_high).text();
				
				var sale = (price_sale_low != null || price_sale_high != null) && (price_sale_low != price_reg_low && price_sale_high != price_reg_high);
				var price_reg  = (price_reg_low  == price_reg_high)  ? (price_reg_low || price) : price_reg_low  + ' - ' + price_reg_high;
				var price_sale = (price_sale_low == price_sale_high) ? price_sale_low : price_sale_low + ' - ' + price_sale_high;
				
				if ( sale )
				{
					price = '<span class="' + classes.priceSale + '">' + options.priceSaleText + price_sale + '</span><br />' + options.priceWasText + price_reg;
				}
				else
				{
					price = price_reg;
				}
				
				rows_title_desc[n] += '<td class="'+classes.meta+'">';
				rows_title_desc[n] += '<p class="'+classes.title+'"><a class="'+classes.title+'" href="'+link_url+'">'+title+'</a></p>';
				if ( desc ) rows_title_desc[n] += '<p class="'+classes.desc+'">'+desc+'</p>';
				rows_title_desc[n] += '</td>';
				rows_price[n] += '<td class="'+classes.meta+' '+classes.price+'">'+price+'</td>';
				
				++i;
				
				if ( i % options.cols == 0 )
				{
					++n;
					if ( n >= options.rows ) n = 0;
				}
			});
			
			var html = '<div class="' + classes.container + '">';
			html += '<div class="'+classes.header+'">';
			var title = options.xmlMap.items_title ? $(xml).find(options.xmlMap.items_title).text() : (options.xmlMap.items ? $(xml).find(options.xmlMap.items).attr("title") : "");
			if ( title && title != "" ) html += '<h2>' + title + '</h2>';
			
			if ( options.pagingPosition == "top" ) html += generatePaging( options, items );
			html += '</div>';
			html += '<div class="'+classes.carousel+'" style="position: relative; overflow: hidden;">';
			html += '<table class="' + classes.grid + '" style="position: relative; left: 0;">\n';
			for ( i = 0; i < options.rows; ++i )
			{
				if ( i >= rows_media.length ) break;
				html += '<tr>\n' + rows_media[i] + '</tr>\n';
				html += '<tr>\n' + rows_title_desc[i] + '</tr>\n';
				html += '<tr>\n' + rows_price[i] + '</tr>\n';
			}
			html += "</table>\n";
			html += '</div>';
			html += '<div class="'+classes.footer+'">';
			if ( options.pagingPosition == "bottom" ) html += generatePaging( options, items );
			html += '</div></div>';
			
			$(self).html( html );
			
			embedSWFs( swfs );
			
			// Hover effect
			$(self).find( 'td.' + classes.media + ' ' + 'div' ).mouseover( function()
			{

				var theSRC = $(this).find('img.tilepack-media').attr("src");
				var theImageWidth =  $(this).find('img.tilepack-media').width();
				var theImageHeight =  $(this).find('img.tilepack-media').height();
				//Only perform hover effect on smaller images
				if(theImageWidth < 100){
					theImageWidth = parseInt(theImageWidth * 1.10);
					theImageHeight = parseInt(theImageHeight * 1.10);
					var theLink = $(this).find('a.tilepack-overlay').attr("href");
					var leftPosition = $(this).find('img.tilepack-media').offset().left;
					var topPosition = $(this).find('img.tilepack-media').offset().top;
					leftPosition -= 12;
					topPosition -= 11;

					$('body').find('div#PreHoverDiv').css('width', '101px');
					$('body').find('div#PreHoverDiv').css('height', '86px');
					$('body').find('div#PreHoverDiv div#PreHoverBackground').html('<img src="' + theSRC + '" alt="" style="width:' + theImageWidth + 'px; height=' + theImageHeight + 'px; padding: 10px 0 0 1px;" />');
					$('body').find('div#PreHoverDiv').css('left', leftPosition + 'px');
					$('body').find('div#PreHoverDiv').css('top', topPosition + 'px');
					$('body').find('div#PreHoverDiv div#PreHoverForeground').html('<a href="' + theLink + '"><img src="http://a.dolimg.com/en-US/dcom/media/foryou/preschool/disney-ui/tilepack/item-overlay-hover.gif" alt="" /></a>');

					$('body').find('div#PreHoverDiv').css('visibility', 'visible');
				}
				return false;
			});



			$('body').find('div#PreHoverDiv').mouseout( function()
			{				
				$('body').find('div#PreHoverDiv').css('visibility', 'hidden');
			});

			// Paging buttons event
			$(self).find( '.' + classes.paging + ' a' ).click( function()
			{
				var target = $(this).parents('.' + classes.container);
				var href = $(this).attr("href");
				var page = href.split("#page-");
				page = parseInt( page[1] );
				changePage( target, page );
				return false;
			});
        };

		function isLocal( uri )
		{
			var start = uri.indexOf("//") + 2;
			if ( start == 1 ) return true;
			var end = uri.indexOf("/", start);
			var domain = uri.slice(start, end);
			
			return (location.hostname == domain);
		};

		return this.each( function()
		{
			// Display loading indicator
			$(this).html( '<p class="' + classes.loading + '">' + options.loadingText + '</p>' );
			
			if ( options && options.feed )
			{
				if ( isLocal(options.feed) )
				{	
					$.ajax(
					{
						target: this,
						type: "GET",
						url: options.feed,
						dataType: "xml",
						success: processXML,
						error: function()
						{
							$(this).html( '<p class="' + classes.error + '">Error: Article feed failed to load.</p>' );
						}
					});
				}
				else if ( $.flashproxy )
				{
					//$.flashproxy.debug = true;
					$.flashproxy.swf = options.flashProxySWF;
					
					$.flashproxy.onFinish = processXML;
					
					$.flashproxy.onError = function( error )
					{
						$(self).html( '<p class="' + classes.error + '">' +error +  '</p>' );
					};
					
					$.flashproxy.init();
					$.flashproxy.get( options.feed );
				}
				else
				{
					$(this).html( '<p class="' + classes.error + '">Error: FlashProxy not available for remote request.</p>' );
				}
			}
			else
			{
				$(this).html( '<p class="' + classes.error + '">Error: Article feed not specified.</p>' );
			}
		});
	};
})(jQuery);

/* Avoid errors in browser that do not support console.log() */
if ( !window.console )
{
	window.console = {};
	console.log = function(){};
}