
// Author: Anedix Technologies, Inc.
// Web Author: http://www.anedix.com/
// Date: October 2, 2006
// Description: Slide show w/ fade effect without using Flash.
// Compatability: IE 5.5+, IE6/7, Mozilla Firefox, Opera 9, Safari 1.3
// Copyright (c) 2006 all rights reserved.
//
// Completely rewritten February 17-21, 2008 to enhance cycle types (random, sequential, etc)
var browserName=navigator.appName;
// multiple picture effect types 
var sequential = 0;
var alternate = 1;   //every other one, all at the same time
var random = 2;
var simultaneous = 3;   // all at once
var slidePasses=0;
var slidePassCount=0;
// counter for number of image placeholders
var slideOrder = sequential;  // can reset this before calling ShowSlides()
var slideOrderSet = false;
var slideOpacity=100;
var slideDelay = 2000;
var slideInterval = 50;
var slideStep = 10;
// time between effects 
// each transition of any image for 0,1,2
// each transition of all images for 3
var timerFadeInID=0;
var timerFadeOutID=0;
var timeoutID=0;

// object for javascript images
function MySlideClass (tag,order){
  this.imageArray = new Array();
  this.imageSeen = new Array();
  this.ID=tag;
  this.imageOrder=sequential;  // only sequential and random are valid
  this.current=0;
  this.victim=false;  //bool - change this image?
  this.slidename = "slide"+tag;
  this.slideurl = "slideurl"+tag;
  this.slidehead = "slidehead"+tag;
  this.slideauth = "slideauth"+tag;
  this.slidedate = "slidedate"+tag;
  this.slidesumm = "slidesumm"+tag;
  this.passCount = 0;
}
// slideshow add data
//  this.InnerAddSlide=function(slidedata) {
MySlideClass.prototype.InnerAddSlide=function(slidedata) {
    this.imageArray[this.imageArray.length] = ''+slidedata+'';
    this.imageSeen[this.imageSeen.length] = 0;
    }

var slides = new Array();

function AddSlideObject(tag){
  var counter;
  for(counter=0; counter<slides.length; counter++){
    if(slides[counter].ID==tag){
      alert("Error: Duplicate slide object "+tag+" cannot be created");
      return;
      }
    }
  slides[slides.length]=new MySlideClass(tag);
}

function AddSlide(tag,slidedata){
  var counter;
   for(counter=0; counter<slides.length; counter++){
    if(slides[counter].ID == tag){
      slides[counter].InnerAddSlide(slidedata);
      return;
      }
    }
  alert("Attempt to add slide to unknown object "+tag);
}

function ShowSlides() {
  if(slideOrderSet){
    clearTimeout(timeoutID);
    DisplaySlideEffectFadeOut();
    }
  else{
    // initial display
    var counter;
    for(counter=0; counter<slides.length; counter++){
      SetImage(counter,100);
      }
    if(slideOrder==random)slidePasses=0;
    SetVictims();
    slideOrderSet=true;
    StartSlideTimer();
    }
}

function SetVictims(){
  // select which image objects to transition
  var counter;
  for(counter=0; counter<slides.length; counter++){
    if(slideOrder==sequential){
      if(!slideOrderSet){
	slides[counter].victim=true;
	break;
        }
      if(slides[counter].victim){
	slides[counter].victim=false;
	counter++;
	if(counter==slides.length)counter=0;
	slides[counter].victim=true;
	break;
        }
      }
    if(slideOrder==alternate){
      if(slideOrderSet){
        slides[counter].victim=!slides[counter].victim;
        }
      else{
	if((counter/2)*2 == counter){
          slides[counter].victim=true;
          }
        }
      }
    if(slideOrder==random){
      slides[counter].victim=Math.floor((Math.random()*2));
      }
    if(slideOrder==simultaneous){
      slides[counter].victim=true;
      }
    }
  slideOrderSet=true;
}

function StartSlideTimer() { 
  // called to wait for next transition
  timeoutID = setTimeout("ShowSlides()",slideDelay);
  }

function BumpImages(){
  var counter;
  for(counter=0; counter<slides.length; counter++){
    if(slides[counter].victim){
      if(slides[counter].imageOrder == random){
        slides[counter].victim=Math.floor((Math.random()* slides[counter].imageArray.length));
	}
      else {
        slides[counter].current++;
        if(slides[counter].current==slides[counter].imageArray.length){
    	  slides[counter].current=0;
	  }
	}
      SetImage(counter,0);
      }
    }
  DisplaySlideEffectFadeIn();
}

function DisplaySlideEffectFadeIn() {
  if (document.getElementById) {
    clearTimeout(timerFadeInID);
    if (slideOpacity < 100) {
      var counter;
      for(counter=0; counter<slides.length; counter++){
	if(slides[counter].victim){
          var obj = document.getElementById(slides[counter].slidename);
          SetSlideOpacity(obj, slideOpacity);
	  }
        }
      slideOpacity += slideStep;
      timerFadeInID = window.setTimeout("DisplaySlideEffectFadeIn()", slideInterval);
      }
    else {
      if(!slidePasses || slidePassCount<slidePasses){
      	if(slidePasses){
	  CheckSlidePassCount();
          if(slidePassCount==slidePasses)return;
	  }
        SetVictims();
        StartSlideTimer();
        }
      }
    }
}

function CheckSlidePassCount(){
  var bumpit=true;
  var num;
  for(num=0; num<slides.length; num++){
    for(counter=0; counter<slides[num].imageSeen.length; counter++){
      if(slidePasses>slides[num].imageSeen[counter]){
	bumpit=false;
	break;
	}
      }
    }
  if(bumpit)slidePassCount=slidePasses;
}

function DisplaySlideEffectFadeOut() {
  var counter
  if (document.getElementById) {
    clearTimeout(timerFadeOutID);
    if (slideOpacity >= -10) {
      for(counter=0; counter<slides.length; counter++){
	if(slides[counter].victim){
          var obj = document.getElementById(slides[counter].slidename);
          SetSlideOpacity(obj, slideOpacity);
	  }
        }
      slideOpacity -= slideStep;
      timerFadeOutID = window.setTimeout("DisplaySlideEffectFadeOut()", slideInterval);
      }
    else {
      BumpImages();
      }
    }
}

function SetImage(num, opaque){
  // width,height,src,summary,href,author,date
  var lstrOut='';
  var img_date=0;
  var img_headline=1;
  var img_summary=2
  var img_author=3;
  var img_href=4;
  var img_src=5;
  var img_height=6;
  var img_width=7
  if (slides[num].imageArray.length == 0) {
    // no images
    return;
    }
  if(slidePasses && opaque==0){  // don't do this on initial SetImage (where opaque=100)
    if(slides[num].passCount==slidePasses)return;  //keep the same image if this slide has shown all images
    }
  
  // grab data for new slides[num].slide
  var imageData = slides[num].imageArray[slides[num].current];
  var imageProperty = imageData.split("|");
  var image=document.getElementById(slides[num].slidename);
  if(image!=null){
    image.src=imageProperty[img_src];
    image.width=imageProperty[img_width];
    image.height=imageProperty[img_height];
    SetSlideOpacity(image, slideOpacity);
  }
  // update url
  if(document.getElementById(slides[num].slideurl)!=null){
    document.getElementById(slides[num].slideurl).href=imageProperty[img_href];
    }
  if(document.getElementById(slides[num].slideauth)!=null){
    document.getElementById(slides[num].slideauth).innerHTML=imageProperty[img_author];
    document.getElementById(slides[num].slideauth).title=imageProperty[img_author];
    }
  if(document.getElementById(slides[num].slidesumm)!=null){
    document.getElementById(slides[num].slidesumm).innerHTML=imageProperty[img_summary];
    }
  if (document.getElementById(slides[num].slidehead)!= null) {
    document.getElementById(slides[num].slidehead).innerHTML=imageProperty[img_headline];
    }
  if (document.getElementById(slides[num].slidedate)!= null) {
    document.getElementById(slides[num].slidedate).innerHTML=imageProperty[img_date];
    }
//  obj = document.getElementById(slides[num].slidename);
//  image.style.visibility = "visible";

  // keep track of how many passes through the slideshow.  Initial display counts.
  slides[num].imageSeen[slides[num].current]++;
}

function SetSlideOpacity(obj, opacity) {
  if(obj==null)return;
  opacity = (opacity == 100)?99.999:opacity;
  // IE/Win
  obj.style.filter = "alpha(opacity:"+opacity+")";
  // Safari<1.2, Konqueror
  obj.style.KHTMLOpacity = opacity/100;
  // Older Mozilla and Firefox
  obj.style.MozOpacity = opacity/100;
  // Safari 1.2, newer Firefox and Mozilla, CSS3
  obj.style.opacity = opacity/100;
}

function SwitchImages(source)
{
  clearTimeout(timeoutID);
  clearTimeout(timerFadeOutID);
  clearTimeout(timerFadeInID);
  slideOpacity=100;
  var newMain=slides[source].current-source;
  if(newMain<0)newMain+=numArticles;
  var x;
  for(x=0; x<slides.length; x++){
    slides[x].current+=source;
    if(slides[x].current>=slides[x].imageArray.length){
      slides[x].current-=slides[x].imageArray.length;
      }
    SetImage(x,100);
    }
  timeoutID = setTimeout("ShowSlides()",slideDelay);
}
