//Requires Event;Style;YUI.Animation;YUI.Dom

var Slideshow = function()
{
  var images = [];
  var loadedImages = [];
  var animateImages = [];
  var captions = [];
  var controlButtons = [];
  var interval = undefined;
  var current = 0;
  var last = 0;
  var container = undefined;
  var statusContainer = undefined;
  var playButton = undefined;
  var started = false;
  var animating = false;
  var time = undefined;
  
  function loadThis(index)
  {
    if(loadedImages.length == 1 || index >= loadedImages.length || animating) return;
    stopSlideshow();
    if(index == current) return;
    animating = true;
    last = current;
    current = index;
    YAHOO.util.Dom.setStyle(images[last],'opacity','0');
    controlButtons[last].toggle();
    controlButtons[current].toggle();
    animateImages[current].animate();
  }
  function createImage(src,caption)
  {
    var thisIndex = images.push(document.createElement('div')) - 1;
    loadedImages.push(false);
    Dom.add(document.createElement('img'),images[thisIndex]);
    if(caption)
    {
      Dom.add(document.createElement('p'),images[thisIndex]);
      Dom.add(document.createElement('span'),images[thisIndex].lastChild);
      Dom.add(document.createTextNode(caption),images[thisIndex].lastChild.lastChild);
    }
    Style.set(images[thisIndex],'position','absolute');
    Style.set(images[thisIndex],'left','0px');
    Style.set(images[thisIndex],'top','0px');
    YAHOO.util.Dom.setStyle(images[thisIndex],'opacity','0');
    Event.add(images[thisIndex].firstChild,'load',function(){updateStatus(thisIndex);});
    images[thisIndex].firstChild.setAttribute('src',(src));
    return thisIndex;
  }
  function createControlButton(theEl,ind)
  {
    var index = ind;
    var element = theEl;
    var isActive = false;
    if(!loadedImages[ind] && YAHOO.env.ua.ie <= 0) YAHOO.util.Dom.setStyle(element,'opacity','0.5');
    function loadMe()
    {
      return (isActive) ? loadThis(index) : false;
    }
    Event.add(element,'click',function(e){Event.cancel(e);loadMe();});
    return {
      toggle: function()
      {
        element.className = (element.className == '') ? 'selected' : '';
      },
      activate: function()
      {
        isActive = true;
        if(YAHOO.env.ua.ie <= 0) YAHOO.util.Dom.setStyle(element,'opacity','1');
      },
      node: element
    }
  }
  function createPlayButton(container)
  {
    var isIn = false;
    var element = document.createElement('a');
    element.className = 'playButton';
    element.setAttribute('href','#');
    element.setAttribute('title','Play');
    hide();
    function hide(){Style.set(element,'visibility','hidden');}
    function show(){Style.set(element,'visibility','visible');}
    Dom.add(element,container);
    Event.add(element,'click',function(e){Event.cancel(e);if(animating || Style.get(element,'visibility') != 'visible'){return;}hide();loadNext();startSlideshow(time);});
    return {
      toggle: function()
      {
        if(isIn) hide();
        else show();
      }
    }
  }
  function updateStatus(index)
  {
    var loadedImageIndex = index;
    loadedImages[loadedImageIndex] = true;
    controlButtons[loadedImageIndex].activate();
    animateImages[loadedImageIndex] = new YAHOO.util.Anim(images[loadedImageIndex], {opacity: {to: 0.99}}, 1.1, YAHOO.util.Easing['easeIn']);
    animateImages[loadedImageIndex].onComplete.subscribe(function(){return nextLoaded()});
  }
  function loadNext()
  {
    if(loadedImages.length == 1) return;
    animating = true;
    last = current;
    current = (current + 1) % loadedImages.length;
    while(!loadedImages[current] && current != last) current = (current + 1) % loadedImages.length;
    YAHOO.util.Dom.setStyle(images[last],'opacity','0');
    controlButtons[last].toggle();
    animateImages[current].animate();
    controlButtons[current].toggle();
  }
  function nextLoaded()
  {
    animating = false;
  }
  function startSlideshow(newTime)
  {
    if(started) return;
    time = newTime;
    started = true;
    interval = setInterval(function(){loadNext();},time);

  }
  function stopSlideshow()
  {
    if(!started) return;
    started = false;
    clearInterval(interval);
    playButton.toggle();
  }
  return {
    init : function(imageContainer,statusContainer,imagesToAdd,captionsToAdd,pathToImages)
    {
      if(imagesToAdd.length == 1)
      {
        this.start = false;
        return false;
      }
      container = Dom.get(imageContainer);
      statusContainer = Dom.get(statusContainer);
      captions = captionsToAdd;
      controlButtons.push(new createControlButton(statusContainer.childNodes[0],0));
      var origImage = container.getElementsByTagName('div')[0]
      Style.set(origImage,'zIndex','20');
      Style.set(origImage,'position','absolute');
      Style.set(origImage,'left','0px');
      Style.set(origImage,'top','0px');
      updateStatus((images.push(origImage)-1));
      var thisIndex;
      for(i=0;i < imagesToAdd.length;i++)
      {
        thisCaption = (captions.length > i) ? captions[i] : '';
        newLink = document.createElement('a');
        newLink.setAttribute('href',pathToImages+imagesToAdd[i]);
        if(thisCaption) newLink.setAttribute('title',thisCaption);
        controlButtons.push(new createControlButton(newLink,i+1));
        Dom.add(images[createImage(pathToImages+imagesToAdd[i],thisCaption)],container);
        Dom.add(newLink,statusContainer);
      }
      playButton = createPlayButton(statusContainer);
    },
    start : function(newTime)
    {
      return startSlideshow(newTime);
    },
    stop : function()
    {
      return stopSlideshow();
    }
  };
};
/*
/Usage
*/

//var mySlideshow = new Slideshow();
//mySlideshow.init("slideshowContainerID","slideshowStatusContainerID",["array","Of","Image","Paths"],["Array","of","captions","forImages"],"")
//if(mySlideshow.start)
//{
//  mySlideshow.start(5000);
//}
//</script>
//init will load the images and place controls on the control container if there is more than one.
//start will start the slideshow with the interval between animations as a parameter
//the slideshow acts as a bullet point operated gallery without calling start
//stop is also available