// JavaScript Document
var headArray = new Array();
var imageArray = new Array();
var abstractArray = new Array();
var urlArray = new Array();
var currentSlide = 0;
var numSlides = 0;
var intervalId = 0;
var bPaused = false;
var INTERVAL_DELAY = 6000;
var MILLISEC = 6000;
var isIE = false;

//	loadSlides()
//	This function parses the XML DOM object
//	It sets the "numSlides" variable, and loads the arrays
//	which will contain our slideshow data.
function loadSlides(xmlDoc) {

	if(xmlDoc) {
		var sNodes = xmlDoc.getElementsByTagName("slideNode");
		//alert(sNodes.length);
		if(sNodes.length == 0) {
		    //alert("Trouble Parsing XML");
		    return false;
		} else {
		    numSlides = sNodes.length;
	    }
	    var sHead = "";
		for(var i=0; i < numSlides; i++) {
		    sHead = sNodes[i].getElementsByTagName("head")[0].childNodes[0].nodeValue;
		    // Truncate Deck depending on it's length, to keep visual formatting of slideshow
		    headArray[i] = sHead;
		    abstractArray[i] = sNodes[i].getElementsByTagName("abstract")[0].childNodes[0].nodeValue;
			imageArray[i] = sNodes[i].getElementsByTagName("img")[0].childNodes[0].nodeValue;
			urlArray[i] = sNodes[i].getElementsByTagName("url")[0].childNodes[0].nodeValue;
		}

		// Set slide count on webpage
		//var n = document.getElementById("exTotalSlides");
		//alert(n.firstChild.nodeValue);
		//n.firstChild.nodeValue = numSlides;
		return true;
	} else {
		//alert("xmlDoc is null");
		return false;
	}
}

//	loadXML()
//	This function creates & loads the XML document into the DOM.
//	It gets the pre-formatted (XML) text from the server page
//	shown in the oXHR.open() call.
//	Cross browser handling of XML doc creation.
function loadXML() {

	// create XMLHttpRequest object using cross-browser library
	var oXHR = zXmlHttp.createRequest();

	// call our script to generate XML
	oXHR.open("get", xurl, true);

	// define what to do when file is finished loading
	oXHR.onreadystatechange = function () {
		if(oXHR.readyState == 4) {
			if(oXHR.status == 200 || oXHR.status == 304) {
				//alert(oXHR.responseText);
				if(window.ActiveXObject) {
					isIE = true;
					var oXmlDom = new ActiveXObject("Microsoft.XMLDOM");
					oXmlDom.loadXML(oXHR.responseText);
					oXmlDom.async = false;
				} else {
					var oParser = new DOMParser();
					var oXmlDom = oParser.parseFromString(oXHR.responseText, "text/xml");
				}
				loadSlides(oXmlDom);
			} else {
				//alert("An error occurred: " + oXHR.statusText);
			}
		}
	}

	oXHR.send(null);
}

//	initSlideshow()
//	This function is called when the HTML page is loaded.
// 	It calls "loadXML()", which loads and parses the XML file
// 	and "showSlide()", which starts the slideshow
function initSlideshow() {
	// Read XML file and initialize arrays
	loadXML();

	// Start the slide show
	intervalId = setInterval("showSlide()", INTERVAL_DELAY);
}
//	showPreviewText()
//	This function updates the content displayed in the
//  "Next" field, under the image.
function showPreviewText(status) {
    var cs = currentSlide;
    switch(status) {
        case 0: // Auto Advance Or Manual Advance Mode
            if(cs == numSlides - 1)
                cs = 0;
            else
                cs++;
            break;
        case 1:    // Manual Back Mode
            if(cs == 0)
                cs = numSlides - 1;
            else
                cs--;
            break;
        default:    // Automatic Mode
            break;
    }

    var aNext = document.getElementById("aNextExclusive");
	var txt = headArray[cs];
	while(aNext.hasChildNodes())
	    aNext.removeChild(aNext.firstChild);
	aNext.setAttribute('href', urlArray[cs]);
	//alert("currentSlide: "+currentSlide+", cs: "+cs);
	aNext.appendChild(document.createTextNode(txt));
}

//	showSlide()
//	This function updates the content displayed in the slideshow.
//	It is called every INTERVAL_DELAY milleseconds from the "initSlideshow()"
//	function.
//	It gets a handle to the DOM objects, and then sets their content
//	from the arrays that we filled in "getSlidesXML()".
function showSlide() {
	if(!bPaused) {
		var currentHead = document.getElementById("aHead");
		var currentImage = document.getElementById("exImage");
		var currentImageLink = document.getElementById("aImage");
		//var imageDiv = document.getElementById("exImageDiv");
		var currentAbstract = document.getElementById("exAbstract");
		var counter = document.getElementById("exCurrentSlide");
		var currentMore = document.getElementById("exSource");

		currentSlide++;
		if(currentSlide == numSlides) {
			currentSlide = 0;
		}
		if(currentSlide < 0) {
			currentSlide = numSlides - 1;
		}

		// Update each section of the slide show
		counter.firstChild.nodeValue = currentSlide + 1;
		currentHead.firstChild.nodeValue = headArray[currentSlide];
		currentHead.setAttribute("href", urlArray[currentSlide]);
		currentAbstract.firstChild.nodeValue = abstractArray[currentSlide];
		currentImageLink.setAttribute("href", urlArray[currentSlide]);
		currentMore.setAttribute("href", urlArray[currentSlide]);
		// Update "Up next" head text
		showPreviewText(0);

		// Update the image
		if(isIE)
		    blendImage();
		else
		    currentImage.src = imageArray[currentSlide];

	}
}

//	getNextSlide()
//	This function advances the slideshow.
//	It is called when the user presses the "right arrow" on the page
//	It pauses the slideshow, advances the current slide and populates
//	the DOM objects just as in "showSlide()"
function getNextSlide() {
	if(bPaused)
		pauseSlide();

	currentSlide++;
	if(currentSlide == numSlides) {
		currentSlide = 0;
	}
	var currentHead = document.getElementById("aHead");
	var currentImage = document.getElementById("exImage");
	var currentImageLink = document.getElementById("aImage");
	//var imageDiv = document.getElementById("exImageDiv");
	var currentAbstract = document.getElementById("exAbstract");
	var counter = document.getElementById("exCurrentSlide");
	var currentMore = document.getElementById("exSource");

	// Update each section of the slide show
	counter.firstChild.nodeValue = currentSlide + 1;
	currentHead.firstChild.nodeValue = headArray[currentSlide];
	currentHead.setAttribute("href", urlArray[currentSlide]);
	currentAbstract.firstChild.nodeValue = abstractArray[currentSlide];
	currentImageLink.setAttribute("href", urlArray[currentSlide]);
	currentMore.setAttribute("href", urlArray[currentSlide]);
	// Update "Up next" head text
	showPreviewText(0);

	// Update the image
	if(isIE)
	    blendImage();
	else
	    currentImage.src = imageArray[currentSlide];
}

//	getPrevSlide()
//	This function rewinds the slideshow one slide.
//	It is called when the user presses the "left arrow" on the page
//	It pauses the slideshow, decrements the current slide and populates
//	the DOM objects just as in "showSlide()"
function getPrevSlide() {
	if(bPaused)
		pauseSlide();

	currentSlide--;
	if(currentSlide < 0) {
		currentSlide = numSlides - 1;
	}
	var currentHead = document.getElementById("aHead");
	var currentImage = document.getElementById("exImage");
	var currentImageLink = document.getElementById("aImage");
	//var imageDiv = document.getElementById("exImageDiv");
	var currentAbstract = document.getElementById("exAbstract");
	var counter = document.getElementById("exCurrentSlide");
	var currentMore = document.getElementById("exSource");

	// Update each section of the slide show
	counter.firstChild.nodeValue = currentSlide + 1;
	currentHead.firstChild.nodeValue = headArray[currentSlide];
		currentHead.setAttribute("href", urlArray[currentSlide]);
	currentAbstract.firstChild.nodeValue = abstractArray[currentSlide];
	currentImageLink.setAttribute("href", urlArray[currentSlide]);
	currentMore.setAttribute("href", urlArray[currentSlide]);
	// Update "Up next" head text
	showPreviewText(1);

	// Update the image
	if(isIE)
	    blendImage();
	else
	    currentImage.src = imageArray[currentSlide];
}

//	pauseSlide()
//	This function pauses the slideshow.
//	It changes the image state of the "pause" graphic after
//	toggling the "bPaused" boolean variable. The function
//	"showSlide()" doesn't do anything when "bPaused" is <true>
function pauseSlide() {
	var n = document.getElementById("exPause");

	bPaused = !bPaused;
	if(bPaused) {
		n.firstChild.src = "/images/slideshow/exPauseOn.jpg";
	} else {
		n.firstChild.src = "/images/slideshow/exPause.jpg";
	}
}

//	changeOpacity()
//	This function changes the opacity of an image. It is
//	cross-browser compatible.
//	Arguments: opacity - the new opacity for the image
//			   id - the element ID of the image to change
function changeOpac(opacity, id) {
    var objStyle = document.getElementById("exImage").style;
    objStyle.opacity = (opacity / 100);
    objStyle.MozOpacity = (opacity / 100);
    objStyle.KhtmlOpacity = (opacity / 100);
    objStyle.filter = "alpha(opacity=" + opacity + ")";
}

//	blendImage()
//	This function replaces a current image by fading in
//	the new image (using opacity)
function blendImage() {
    var imagefile = imageArray[currentSlide];
    var speed = Math.round(MILLISEC / 100);
    var timer = 0;

    // set the current image as background
    //document.getElementById("exImageDiv").style.backgroundImage = "url("+document.getElementById("exImage").src+")";
   //alert(document.getElementById("exImageDiv").style.backgroundImage);

    // set top image transparent
    changeOpac(0, "exImage");

    // make new image
    document.getElementById("exImage").src = imagefile;

    //fade in image
    var s = "";
    for(var i = 0; i <= 100; i++) {
        if(i<10)
            s += "i: " + document.getElementById("exImage").style.opacity + "\n";
        setTimeout("changeOpac(" + i + ",'exImage')",(timer * speed));
        timer++;
    }
   // trace(s);
}