(function() {

mouseInsideCarousel = false;

function $(id) {
	return document.getElementById(id);	
}

function updateCarouselOpacities()
{
	var items = carousel.getElementForItems();
	for(var i = 0; i < items.length; i++)
	{
		var el = new YAHOO.util.Element(items[i]);
		if (!el.hasClass('yui-carousel-item-selected'))
			el.setStyle('opacity', 0.4);
	}
}

// Called whenever a different thumbnail in the carousel is selected
// Replaces the image and caption in the carousel viewer, using the appropriate animations
function updateCarouselDetails(selectedIndex) {

	var el = new YAHOO.util.Element(carousel.getElementForItem(selectedIndex));
	el.setStyle('opacity', 1);
	updateCarouselOpacities();

	var viewerImg = $('mainImg');
	var captionContainer = $('captionContainer');
	var detailsContainer = $('detailsContainer');
	
	//update main image
	var newImg = viewerImg.cloneNode(true);
	newImg.setAttribute('src', mediawallData[selectedIndex].large);
	// we're already providding caption text adjacent to the image, so alt text is not absolutely necesary. 
	// instead we provide an empty alt. Alternatively, the alt text coult contain a short description of the item it represents
	newImg.setAttribute('alt', "");
	newImg.setAttribute('id', 'replacementImg');
	viewerImg.parentNode.appendChild(newImg);
	newImg.style.left = "480px";
	
	YAHOO.util.Event.onContentReady('replacementImg', function() {
		
		var elId = 'mediaWallViewport';
		YAHOO.util.Event.purgeElement(elId);
		var el = new YAHOO.util.Element($(elId));
		
		if (mediawallData[selectedIndex].movie != undefined)
		{
			YAHOO.util.Event.addListener(elId, "click", function() {
				Shadowbox.open({
					content:    mediawallData[selectedIndex].movie,
					player:     "flv",
					title:      mediawallData[selectedIndex].caption,
					width:      512,
					height:     384+20
				});
			});
			el.addClass('clickable');
		}
		else if (mediawallData[selectedIndex].link != undefined)
		{
			YAHOO.util.Event.addListener(elId, "click", function() {
				var url = mediawallData[selectedIndex].link.url;
				
				if (mediawallData[selectedIndex].link.open_in_new_window == true)
				{
					window.open(url, 'Mediawall Window');
				}
				else
				{
					window.location.href = url;
				}
			});
			el.addClass('clickable');
		}
		else
		{
			el.removeClass('clickable');
		}
		
		var imgSlideAnim = new YAHOO.util.Anim(newImg, {}, 0.3, YAHOO.util.Easing.easeOut);
		imgSlideAnim.attributes.left = {to : 0};
		imgSlideAnim.onComplete.subscribe(function(ev)
		{
			$('mediaWallViewport').removeChild($('mainImg'));
			$('replacementImg').id = "mainImg";
		});
		imgSlideAnim.animate();
	});
	
	//animate the caption text
	captionAnim.attributes.bottom = {by : 10-captionContainer.clientHeight};
	captionAnim.animate(); //down...
	captionAnim.onComplete.subscribe(function(ev) {	
		YAHOO.util.Selector.query('#captionContainer p', undefined, true).innerHTML = mediawallData[selectedIndex].subtitle;
		
		var nodeBuyNowInfo = YAHOO.util.Selector.query('#buyNowInfo', undefined, true);
		if (mediawallData[selectedIndex].sale == undefined)
		{
			nodeBuyNowInfo.style.display = 'none';
		}
		else
		{
			nodeBuyNowInfo.style.display = 'block';
			YAHOO.util.Selector.query('div', nodeBuyNowInfo, true).innerHTML = mediawallData[selectedIndex].sale.msg;
			var nodeLink = YAHOO.util.Selector.query('a', nodeBuyNowInfo, true);
			nodeLink.href = mediawallData[selectedIndex].sale.url;
		}
		
		captionAnim.attributes.bottom = {to : 0};
		captionAnim.animate(); // ...and up again
		captionAnim.onComplete.unsubscribe();
	});

	// Again, normally this content would be loaded from a remote source in a more intelligent way, using the proper markup (heasdings, lists, etc.) 
	var detailsString = "<h1>" + mediawallData[selectedIndex].caption +"</h1>";	
	detailsString += "<div>";
	detailsString += mediawallData[selectedIndex].content;
	if (mediawallData[selectedIndex].press_release != undefined)
	{
		detailsString += "<p><a href='"
			+ mediawallData[selectedIndex].press_release.url + "'>"
			+ mediawallData[selectedIndex].press_release.text
			+ "</a></p>";
	}
	detailsString += "</div>";
	detailsContainer.innerHTML = detailsString;
}

function initializeBannerRotator()
{
	var nodes = YAHOO.util.Selector.query('#bannerRotator');
	
	if (nodes.length != 1) return;
	var nodeBannerRotator = nodes[0];
	
	var bannerRotator = new YAHOO.widget.Carousel(nodeBannerRotator, { 
		 animation: { speed: .5, effect : YAHOO.util.Easing.easeBoth }
		//,usearia : true
		,carouselEl: "OL"
		,isCircular: true
		,numVisible: 1
		,autoPlayInterval: 10000
	});
	bannerRotator.render();
	bannerRotator.startAutoPlay();
}

function initializeBannerFader()
{
	var nodes = YAHOO.util.Selector.query('#bannerFader');
	
	if (nodes.length != 1) return;
	var nodeBannerFader = nodes[0];
	
	var carousel = new YAHOO.widget.Carousel(nodeBannerFader, { 
		 carouselEl: "OL"
		,isCircular: true
		,numVisible: 1
	});
	var skipBeforeScroll = false;
	var lastInfoBeforeScroll = {};
	carousel.on("beforeScroll", function(info) {
		if (skipBeforeScroll == true)
		{
			skipBeforeScroll = false;
			return true;
		}
		else
		{
			skipBeforeScroll = true;
		}
		//alert("beforeScroll" + " selected: " + carousel.get("selectedItem") +  ", dir: " + info.dir + ", first: " + info.first + ", last: " +  info.last );
		
		lastInfoBeforeScroll = info;
		
		var items = carousel.getElementForItems();
		
		var itemCurrent = new YAHOO.util.Element(items[info.first]);
		var itemNext = new YAHOO.util.Element(items[info.last]);
		
		var myAnim = new YAHOO.util.Anim(itemCurrent);
		myAnim.attributes.opacity = { from: 1, to: 0 };
		myAnim.duration = 0.5;
		myAnim.method = YAHOO.util.Easing.easeNone;
		myAnim.onComplete.subscribe(function() {  
			carousel._isAnimationInProgress = false;
			
			if ( (lastInfoBeforeScroll.dir == 'forward' && carousel.get("selectedItem") != 0)
				|| (lastInfoBeforeScroll.first == lastInfoBeforeScroll.last
						&& lastInfoBeforeScroll.first != carousel.get("selectedItem"))
				)
				carousel.scrollForward();
			else
				carousel.scrollBackward();
		});
		myAnim.animate();
		carousel._isAnimationInProgress = true; // must set this, otherwise animation screws up
		
		itemNext.setStyle('opacity', 0);
		
		return false;
	});
	carousel.on("afterScroll", function(info) {
		//alert("afterScroll" + " selected: " + carousel.get("selectedItem") +  ", first: " + info.first + ", last: " +  info.last );
		
		var items = carousel.getElementForItems();
		var itemCurrent = new YAHOO.util.Element(items[carousel.get("selectedItem")]);
		
		var myAnim = new YAHOO.util.Anim(itemCurrent);
		myAnim.attributes.opacity = { from: 0, to: 1 };
		myAnim.duration = 0.5;
		myAnim.method = YAHOO.util.Easing.easeNone;
		myAnim.animate();
	});
	
	var autoPlayInterval = setInterval(function () {
		carousel.selectNextItem();
	}, 7000);
	YAHOO.util.Event.addListener(nodeBannerFader, "click", function() {
		clearInterval(autoPlayInterval);
	});
	carousel.on("keydown", function() { clearInterval(autoPlayInterval); });
	
	carousel.render();
}

//initialize YUI components
YAHOO.util.Event.onDOMReady( function(ev) {
	
	initializeBannerRotator();
	
	initializeBannerFader();

	if (mediawallData != undefined)
	{
		var imgPreloads = [];
		for (var i = 0 ; i < mediawallData.length; i++) {
			imgPreloads[i] = new Image(100,25); 
			imgPreloads[i].src= mediawallData[i].large; 
		}
		
		var numVisible = 3;
		var numDuplicated = 0;
		
		// Copy tiles from the first page to the last page, the last page has some blank tiles
		if (mediawallData.length > numVisible)
		{
			numDuplicated = (numVisible - mediawallData.length % numVisible) % numVisible;
			var tiles = YAHOO.util.Selector.query('#mediaWallCarousel ol li');
			var parent = YAHOO.util.Selector.query('#mediaWallCarousel ol')[0];
			
			for (i=0; i<numDuplicated; i++)
			{
				mediawallData.push(mediawallData[i]);
				var newTile = tiles[i].cloneNode(true);
				parent.appendChild(newTile);
			}
		}
		
		carousel = new YAHOO.widget.Carousel("mediaWallCarousel", { 
			animation: { speed: .5, effect : YAHOO.util.Easing.easeBoth },
			usearia : true,
			carouselEl: "OL",
			isCircular: true,
			numVisible: numVisible
		});
		
		var nodeLink = YAHOO.util.Selector.query('#buyNowInfo a', undefined, true);
		YAHOO.util.Event.addListener(nodeLink, "click", function(e) {
			YAHOO.util.Event.stopEvent(e);
		});
		
		carousel.on("itemSelected", updateCarouselDetails);
		
		if (numDuplicated > 0)
		{
			carousel.on('beforeSelectedItemChange', function(e) {
				var prev = e.prevValue;
				var next = e.newValue;
				var lastItemIndex = carousel.get('numItems')-1;
				
				if (prev == lastItemIndex && next == 0)
				{
					carousel.set('selectedItem', numDuplicated);
					return false;
				}
				else if (prev == 0 && next == lastItemIndex)
				{
					carousel.set('selectedItem', lastItemIndex - numDuplicated);
					return false;
				}
			});
		}
		
		var autoPlayInterval = setInterval(function () {
			carousel.selectNextItem();
		}, 15000);
		
		YAHOO.util.Event.addListener("prevBtnContainer", "click", function() {
			clearInterval(autoPlayInterval);
			carousel.selectPreviousItem();
		});
		YAHOO.util.Event.addListener("nextBtnContainer", "click", function() {
			clearInterval(autoPlayInterval);
			carousel.selectNextItem();
		});
		YAHOO.util.Event.addListener("mediaWallCarousel", "click", function() {
			clearInterval(autoPlayInterval);
		});
		carousel.on("keydown", function() { clearInterval(autoPlayInterval); });
		
		captionAnim = new YAHOO.util.Anim('captionContainer', {}, 0.2, YAHOO.util.Easing.easOut);
		
		carousel.render();
		
		var el = new YAHOO.util.Element('mediaWallCarousel');
		var items = el.getElementsByTagName('li');
		
		YAHOO.util.Event.addListener(items, "mouseenter", function(e) {
			var el = new YAHOO.util.Element(this);
			el.setStyle('opacity', 1);
			mouseInsideCarousel = true;
		});
		
		YAHOO.util.Event.addListener(items, "mouseleave", function(e) {
			updateCarouselOpacities();
			mouseInsideCarousel = false;
		});
	}
});

})()
