
var slideSettings = {
	siteRoot: './',								// Must End in '/'
	photosXML: 'slider/slider/media/xml/slideshow.xml',
	infoXML: 'webservices/homeflash.xml.asp',
	easeFunc: "expoinout",						// chose from jquery.easing.1.3.js
	easeTime: 1000,								// in milliseconds
	photoDelay: 4000,							// in milliseconds
	introTime: 4000								// in milliseconds
};

var slides = [];
var products = [];
var currency = '';
var exploreLabel = '';
var purchaseLabel = '';
var currentSlide = 0;
var currentPhoto = 0;
var ajaxD = 0;
var loadingD = 0;
var loadCount = 0;
var container;
var productData;
var slideData;
var panelWidth;
var fadeTimer;
var maskTimer;
var loadTimer;
var slideCount;
var startTime;
var totalTime;

jQuery.fn.portraitSlider = function(settings) {
	settings = jQuery.extend(slideSettings, settings);
	
	//
	// Build DOM from objects
	//
	var createSlides = function() {
		/*
		<div id="portraitContainer">
			<div id="slideshowContainer">
				<div id="panelContainer" class="sliderContainer">
					<div id="slide_0" class="panel" title="DNA Portraits"><div class="wrapper">
						<img src="./slider/media/images/..." class="slideImage_0" id="slideImage_0_0" alt="" />
						<img src="./slider/media/images/..." class="slideImage_0 hidden" id="slideImage_0_1" alt="" />
						...
					</div></div>
					...
				</div>
				<div id="infoContainer" class="sliderContainer">
					<div id="info_0" class="infoPanel"><div class="wrapper">
						<div class="infoBox">
							<div class="topInfoBox">
								<h2>DNA Portraits<sup class="trademark">TM</sup></h2>
								//<h4>Starting at $199 USD</h4>
							</div>
							<div class="bottomInfoBox">
							<a href="/explore.asp"><ul><li class="exploreLink">Explore <img src="./slider/media/images/slideshow_images/linkButton.png"></li></ul></a>
							//<ul>
								//<li class="exploreLink"><a href="/explore.asp">Explore <img src="./slider/media/images/slideshow_images/linkButton.png"></a></li>
								//<li class="purchaseLink"><a href="/purchase.asp">Purchase Now <img src="./slider/media/images/slideshow_images/linkButton.png"></a></li>
							//</ul>
							<div class="clear spacer0">&nbsp;</div></div>
						</div>
					</div></div>
					...
				</div>
			</div>
			<div id="timerContainer">
				<div id="timer_0" class="timerPanel">
					<div class="timerMask">&nbsp;</div>
					<h2>DNA Portraits<sup class="trademark">TM</sup></h2>
				</div>
				...
			</div>
		</div>
		*/
		
		container.addClass("stripViewer");
		var panelCount = slides.length;
		container.find("div#slideshowContainer").append('<div id="panelContainer" class="sliderContainer"></div><div id="infoContainer" class="sliderContainer"></div>');
		for (var i=0;i < panelCount; i++) {
			$("#panelContainer").append('<div id="slide_'+ i +'" class="panel" title="'+ products[i]['portrait'] +' Portraits"><div class="wrapper"></div></div>');
			for (var j=0;j < slides[i].length;j++) {
				var hiddenStr = (j == 0) ? '' : ' hidden';
				$('#slide_'+i+' .wrapper').append('<img src="'+ settings.siteRoot + slides[i][j] +'" class="slideImage_'+ i + hiddenStr +'" id="slideImage_'+ i +'_'+ j +'" alt="" />');
			}
			$("#infoContainer").append('<div id="info_'+ i +'" class="infoPanel"><div class="wrapper"><div class="infoBox"><div class="topInfoBox"><h2>'+
										products[i]['portrait'] +'<sup class="trademark">TM</sup></h2></div><div class="bottomInfoBox"><a href="'+ products[i]['exploreLink'] +'"><ul><li class="exploreLink">'+
										exploreLabel +' <img src="'+ settings.siteRoot +'slider/media/images/slideshow_images/linkButton.png"></li>'+
										//<li class="purchaseLink"><a href="'+ products[i]['purchaseLink'] +'">'+ purchaseLabel +' <img src="'+
										//settings.siteRoot +'slider/media/images/slideshow_images/linkButton.png"></a></li>'+
										'</ul></a><div class="clear spacer0">&nbsp;</div></div></div>');
			$("#timerContainer").append('<div id="timer_'+ i +'" class="timerPanel"><div class="timerMask">&nbsp;</div><h2>'+ products[i]['portrait'] +
										'<sup class="trademark">TM</sup></h2></div>');
		}
		panelWidth = container.find("div.panel").width();
		var stripViewerWidth = panelWidth*panelCount;
		container.find("div.sliderContainer").css("width", stripViewerWidth);
		
		$('.timerPanel').each(function(z){$(this).bind('click', function(){changeSlide(z);});});
	}
	
	//
	// Create slides after both files are loaded
	//
	var ajaxDone = function() {
		ajaxD++;
		if (ajaxD > 1) {
			createSlides();
		}
	}
	
	
	//
	// Parse Products into an array of objects
	// products[i] = {portrait: 'DNA', price: '$399', ...};
	//
	var parseProducts = function(data) {
		if ($.browser.msie) {
			var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");  
			xmlDoc.loadXML(data);
			for (var i=0;i < xmlDoc.childNodes.length;i++) {
				var node = xmlDoc.childNodes[i];
				if (node.baseName == 'language') {
					for (var j=0; j < node.attributes.length;j++) {
						var attr = node.attributes[j];
						switch(attr.name) {
							case 'currency':
								currency = attr.value;
								break;
							case 'exploreLabel':
								exploreLabel = attr.value;
								break;
							case 'purchaseLabel':
								purchaseLabel = attr.value;
								break;
						}
					}
					for (var j=0;j < node.childNodes.length;j++) {
						var product = node.childNodes[j];
						var po = '';
						var pr = '';
						var ex = '';
						var pu = '';
						for (var k=0;k < product.attributes.length;k++) {
							var attr = product.attributes[k];
							switch(attr.name) {
								case 'portrait':
									po = attr.value;
									break;
								case 'price':
									pr = attr.value;
									break;
								case 'exploreLink':
									ex = attr.value;
									break;
								case 'purchaseLink':
									pu = attr.value;
									break;
							}
						}
						products.push({
							portrait: po,
							price: pr,
							exploreLink: ex,
							purchaseLink: pu
						});
					}
				}
			}
		} else {
			currency = $(data).children().parent().attr('currency');
			exploreLabel = $(data).children().parent().attr('exploreLabel');
			purchaseLabel = $(data).children().parent().attr('purchaseLabel');
			$(data).find('product').each(function(){
				products.push({
					portrait: $(this).attr('portrait'),
					price: $(this).attr('price'),
					exploreLink: $(this).attr('exploreLink'),
					purchaseLink: $(this).attr('purchaseLink')
				});
			});
		}
	}
	
	
	//
	// Parse Photos into array of objects
	// slides[i] = ['url1', 'url2', ...];
	//
	var parsePhotos = function(data) {
		if ($.browser.msie) {
			var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");  
			xmlDoc.loadXML(data);
			for (var i=0;i < xmlDoc.childNodes.length;i++) {
				var node = xmlDoc.childNodes[i];
				if (node.baseName == 'slideshow') {
					for (var i=0;i < node.childNodes.length;i++) {
						var slide = node.childNodes[i];
						var s = [];
						for (var j=0;j < slide.childNodes.length;j++) {
							var img = slide.childNodes[j];
							var url = '';
							for (var k=0;k < img.attributes.length;k++) {
								var attr = img.attributes[k];
								if (attr.name == 'url') url = attr.value;
							}
							s.push(url);
						}
						slides.push(s);
					}
				}
			}
		} else {
			$(data).children().each(function(){
				var s = [];
				$(this).children().each(function(){s.push($(this).attr('url'));});
				slides.push(s);
			});
		}
	}
	
	//
	// Load XML
	//
	return this.each(function(){
		container = $(this);
		slideSettings = settings;
		$.ajax({
			url: settings.siteRoot + settings.infoXML,
			dataType: ($.browser.msie) ? "text" : "text/xml",
			success: function(data){
				parseProducts(data);
				ajaxDone();
			}
		});
		$.ajax({
			url: settings.siteRoot + settings.photosXML,
			dataType: ($.browser.msie) ? "text" : "text/xml",
			success: function(data){
				parsePhotos(data);
				ajaxDone();
			}
		});
	});
}

$(window).load(function(){
	//$('#loadingMask').fadeOut('slow', function() {
	setTimeout("beginSlides()", slideSettings.introTime)
		
		//loadCount = $('#loadingSlides').children().length;
		//$('#loadingSlides').css({width: loadCount * panelWidth});
		//loadTimer = setTimeout("slideLoader(0)", slideSettings.introTime);
});

var beginSlides = function() {
	$('#loadingContainer').fadeOut('slow', function() {
		startSlideFade(0);
		return;
		});
}

var slideLoader = function(i) {
	clearTimeout(loadTimer);
	if (i < loadCount) {
		$('#loadingSlides').animate({left: -panelWidth * (i+1)}, slideSettings.easeTime, function() {
			if (i >= loadCount) {
				$('#loadingContainer').hide();
				startSlideFade(0);
				return;
			}
		});
		i++;
		loadTimer = setTimeout("slideLoader("+i+")", slideSettings.introTime);
	}
}

var startMask = function(i) {
	if (i < 0 || i > 2) return;
	d = new Date();
	startTime = d.getTime();
	totalTime = (slideCount * (slideSettings.photoDelay + slideSettings.easeTime)) - slideSettings.easeTime;
	$('#timer_'+i+' .timerMask').css({left: 0});
	maskTimer = setTimeout('updateMask('+i+')', 25);
}

var updateMask = function(i) {
	if (i < 0 || i > 2) return;
	d = new Date();
	currentTime = d.getTime();
	timeDiff = currentTime - startTime;
	var leftOffset = timeDiff / totalTime * 320;
	$('#timer_'+i+' .timerMask').css({left: leftOffset});
	maskTimer = setTimeout('updateMask('+i+')', 25); // 1000 ms / 40 fps = 25ms
}

var clearMasks = function() {
	clearTimeout(maskTimer);
	$('.timerMask').animate({left: 0}, slideSettings.easeTime, slideSettings.easeFunc);
}

var nextSlide = function() {
	if (currentSlide == 2) changeSlide(0);
	else changeSlide(currentSlide+1);
}

var changeSlide = function(i) {
	if (i == currentSlide || i < 0 || i > 2) return;
	clearMasks();
	clearTimeout(fadeTimer);
	currentSlide = i;
	$('.slideImage_'+i).not('#slideImage_'+i+'_0').hide();
	var w = - (panelWidth * i);
	$("div#panelContainer").animate({left: w}, slideSettings.easeTime, slideSettings.easeFunc, function() {startSlideFade(i);});
	$("div#infoContainer").animate({right: w}, slideSettings.easeTime, slideSettings.easeFunc);
}

var startSlideFade = function(i) {
	clearTimeout(fadeTimer);
	slideCount = $('.slideImage_'+i).length;
	startMask(i);
	currentSlide = i;
	currentPhoto = 0;
	$('.slideImage_'+i).removeClass('hidden').not('#slideImage_'+i+'_0').hide();
	fadeTimer = setTimeout("fadeNextPhoto()", slideSettings.photoDelay);
}

var fadeNextPhoto = function() {
	clearTimeout(fadeTimer);
	currentPhoto++;
	if (currentPhoto == slideCount) {nextSlide(); return;}
	$('#slideImage_'+currentSlide+'_'+currentPhoto).fadeIn(slideSettings.easeTime, function(){
		fadeTimer = setTimeout("fadeNextPhoto()", slideSettings.photoDelay);
	});
}
