
function Slide(imageUrl, targetUrl) {
  this.imageUrl = imageUrl;
  this.targetUrl = targetUrl;
  this.element = document.createElement("div");
  this.element.className = "slide";
  this.anchor = document.createElement("a");
  this.element.appendChild(this.anchor);
  this.anchor.href = targetUrl;
  this.img = this.anchor.appendChild(document.createElement("img"));
  this.img.src = imageUrl;
  this.img.style.position = "absolute";
  this.img.style.border = 0;
  this.img.border = 0;
  this.img.style.zIndex = 0;
  this.content = this.element.appendChild(document.createElement("div"));
  this.content.style.position = "absolute";
  this.content.style.zIndex = 1;
  this.content.appendChild(document.createElement("br"));
}

function SlidePlayer(slides,width,height,delay) {
  var myElement = document.createElement("div");
  this.element = myElement;
  this.element.className = "slides";
  var slides = slides;
  var slideCount;
  var slideDelay = delay; //2000 milliseconds = 2 seconds
  var currentSlide = 0;
  var slideWidth = width;
  var slideHeight = height;
  var playing = false;
  var advancePending = false;
  var hovering = false;
  var initializedSlides = false;
  
  this.getSlides = function() {return slides};
  this.element.onmouseover = function(){hovering=true;};
  this.element.onmouseout = function(){hovering=false;};
  
  var initializeSlides = function() {
    if (!initializedSlides) {
      if (!slides) slides = new Array();
      for (var i=0;i<slides.length;i++) {
        slides[i].img.width = slideWidth;
        slides[i].img.height = slideHeight;
        slides[i].element.style.display = 'none';
        myElement.appendChild(slides[i].element);
      }
      
      slideCount = slides.length;
      initializedSlides = true;
      
    }
  }
  
  this.nextSlide = function() {
    //window.status=currentSlide;
    fnSetSlideVisible(currentSlide,false);
    currentSlide = (currentSlide + 1) % slideCount;
    fnSetSlideVisible(currentSlide,true);
  }

  var fnNextSlide = this.nextSlide;

  this.prevSlide = function () {
    fnSetSlideVisible(currentSlide,false);
    currentSlide = (currentSlide - 1 + slideCount) % slideCount;
    fnSetSlideVisible(currentSlide,true);
  }
  
  var fnPrevSlide = this.prevSlide;

  this.setSlideVisible = function(slideNumber,visible) {
    if (!slideCount) return;
    if (visible)
      slides[slideNumber].element.style.display = "block";
    else
      slides[slideNumber].element.style.display = "none";
  }
  
  var fnSetSlideVisible = this.setSlideVisible;
   
  this.start = function() {
    initializeSlides();
    if (!playing) {
      playing = true;
      //document.getElementById("btnPlay").className="hidden";
      //document.getElementById("btnStop").className="visible";
      if (!advancePending) autoAdvance();
    }
  }
  
  var fnStart = this.start;
  
  this.stop = function() {
    if (playing) {
      playing = false;
      //document.getElementById("btnPlay").className="visible";
      //document.getElementById("btnStop").className="hidden";
    }
  }
  
  var fnStop = this.stop;

  var autoAdvance = function() {
    advancePending = false;
    if (playing) {
      if (!hovering) {
        fnNextSlide();
      }
      advancePending = true;
      setTimeout(function(){autoAdvance()},slideDelay);
    }
  }

  var getXMLDOM = function(docURL) {
    var xhttp;
    if (window.XMLHttpRequest)
      {
      xhttp=new XMLHttpRequest();
      }
    else // Internet Explorer 5/6
      {
      xhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xhttp.open("GET",docURL,false);
    xhttp.send("");
    xmlDoc=xhttp.responseXML;
    return xmlDoc;
  }

  var clearSlides = function() {
    fnStop();
    while (myElement.hasChildNodes()) 
      myElement.removeChild(myElement.firstChild);
    if (!slides) slides = new Array();
    slides.length = 0;    
    slideCount = slides.length;
    initializedSlides = false;
  }
  
  this.clear = clearSlides;

  this.loadSlideShow = function(docUrl){
    this.clear();
    var xmlDoc = getXMLDOM(docUrl);
    if (!xmlDoc.documentElement) return;
    var slideNodes = xmlDoc.documentElement.childNodes;
    var showAttributes = xmlDoc.documentElement.attributes;
    var slidePropNodes = null;
    var imgUrl;
    var targetUrl;
    
    for (var i=0;i<showAttributes.length;i++) {
      if (showAttributes[i].nodeName == 'slide-width')
        slideWidth = showAttributes[i].childNodes[0].nodeValue;
      else if (showAttributes[i].nodeName == 'slide-height')
        slideHeight = showAttributes[i].childNodes[0].nodeValue;
      else if (showAttributes[i].nodeName == 'slide-delay')
        slideDelay = showAttributes[i].childNodes[0].nodeValue;
    }
    
    if (slideNodes) for (var i=0;i<slideNodes.length;i++) {
      if (slideNodes[i].nodeName=='slide') {
        slidePropNodes = slideNodes[i].childNodes;
        imgUrl='';
        targetUrl='';
        for (var j=0;j<slidePropNodes.length;j++) {
          if (slidePropNodes[j].nodeName == 'image')
            imgUrl = slidePropNodes[j].childNodes[0].nodeValue;
          if (slidePropNodes[j].nodeName == 'target')
            targetUrl = slidePropNodes[j].childNodes[0].nodeValue;
        };
        slides.push(new Slide(imgUrl,targetUrl));
      }
    }
    slideCount = slides.length;
  }
  
}

