var slideCache = new Array();

 function AddObj(img, lnk, tgt) {
    this.arr[this.count] = new ssMember(img,lnk,tgt);
    this.count++;
}
function NextObj() {
    this.cur = this.cur + 1;
    if (this.cur >= this.count)
       this.cur = 0;
     
    return this.arr[this.cur];
}
function PrevObj() {
    this.cur = this.cur - 1;
    if (this.cur < 0 )
       this.cur = this.count - 1;
     
    return this.arr[this.cur];
}
function ssObj(varname,imgsel,imgunsel)
{
    this.varName = varname;
    this.count = 0;
    this.arr = new Array();
    this.cur = 0;
    this.AddObj = AddObj;
    this.NextObj = NextObj;
    this.PrevObj = PrevObj;
    this.tmr = 0;
    this.divid = '';
    this.imageid = ''; 
    this.lnkid = '';
    this.timeout = 8;
    this.imgUnsel = imgunsel;
    this.imgSel = imgsel;
    this.stop = 0;
}
function ssMember(img, lnk, tgt) {
   this.img = img; 
   this.lnk = lnk;
   this.tgt = tgt;
   // the following will cause the image to be cached when this
   // ssMember is created
   this.cachedimg = new Image();
   this.cachedimg.src = img;
}

function ObjSlideShow(divid,imageid,lnkid,arrid,displaySecs)
{
    var nxt = arrid.NextObj();
    var nextImage = nxt.img;
    var nextLink  = nxt.lnk;
    
    ObjBlendImages(arrid,divid,imageid,lnkid,nxt,100);
    setTimeout("ObjSlideShow('"+divid+"','"+imageid+"','"+lnkid+"',"+arrid.varName+","+displaySecs+")",displaySecs*1000);
    
}

function ObjSlideShowWithNavBar(divid,imageid,lnkid,arrid,displaySecs)
{
    // get curselImgid before calling NextObj which will increment it
    var curselImgid = arrid.varName + '_' + arrid.cur;
    var nxt = arrid.NextObj();
    var nextImage = nxt.img;
    var nextLink  = nxt.lnk;
    var nxtselImgid = arrid.varName + '_' + arrid.cur;
    arrid.divid = divid;
    arrid.imageid = imageid;
    arrid.lnkid = lnkid;
    arrid.timeout = displaySecs;
    
    // var saveImg = document.getElementById(curselImgid).src ;
    
    document.getElementById(curselImgid).src = arrid.imgUnsel;
    document.getElementById(nxtselImgid).src = arrid.imgSel;

    ObjBlendImages(arrid,divid,imageid,lnkid,nxt,100);
    arrid.tmr = setTimeout("ObjSlideShowWithNavBar('"+divid+"','"+imageid+"','"+lnkid+"',"+arrid.varName+","+displaySecs+")",displaySecs*1000);
    
}
function SetCurrentSlide(arrid, slidenum)
{
    var Imgid = ' ';
    arrid.stop = 1;
    StopSlideShow(arrid);
    if (slidenum >= arrid.count)
       slidenum = 0;

    for(i = 0; i < arrid.count; i++) {
        Imgid = arrid.varName + '_' + i;
        if (i == slidenum)
            document.getElementById(Imgid).src = arrid.imgSel;
        else
            document.getElementById(Imgid).src = arrid.imgUnsel;
    }
    arrid.cur = slidenum;
     
    var obj = arrid.arr[slidenum];
    arrid.stop = 0;
    ObjBlendImages(arrid, arrid.divid, arrid.imageid, arrid.lnkid, obj, 100);
    
    // resume slide show, doubling the timeout this one time
    arrid.tmr = setTimeout("ObjSlideShowWithNavBar('"+arrid.divid+"','"+arrid.imageid+"','"+arrid.lnkid+"',"+arrid.varName+","+arrid.timeout+")",arrid.timeout*2000);

}
function StopSlideShow(arrid)
{
    clearTimeout(arrid.tmr);
    arrid.tmr = 0;
    
}

function ObjBlendImages(arrid, divid, imageid, linkid, ssobj, millisec) {
    // change divisor from 10 to 100 makes transition much faster
    // TODO: add new parm for blendimage() for "blendspeed"
	var speed = Math.round(millisec / 10); 
	var timer = 0;
	var elemDiv = document.getElementById(divid);
	
	//set the current image as background
	if (elemDiv != null)
	{
	    elemDiv.style.backgroundImage = "url(" + document.getElementById(imageid).src + ")";
    
        // pause for 1.5 sec
        // pausecomp(1500);
    	
	    changeOpac(0, imageid);
    	
	    //make new image
	    document.getElementById(imageid).src = ssobj.img;


	    //fade in image
	    for(i = 0; i <= 100; i++) {
	        if (arrid.stop > 0)
	           break;
	           
		    setTimeout("changeOpac(" + i + ",'" + imageid + "')",(timer * speed));
		    timer++;
	    }
	    // set link
	    if (arrid.stop == 0)
	    {
	        if (ssobj.lnk == "")
	            document.getElementById(linkid).removeAttribute('href');
	        else
                document.getElementById(linkid).href = ssobj.lnk;
            
            if (ssobj.tgt == "")
	            document.getElementById(linkid).removeAttribute('target');
	        else
                document.getElementById(linkid).target = ssobj.tgt;    
        }
	}
        
	
}

//change the opacity for different browsers
function changeOpac(opacity, id) {
	var object = document.getElementById(id).style; 
	object.opacity = (opacity / 101);
	object.MozOpacity = (opacity / 101);
	object.KhtmlOpacity = (opacity / 101);
	object.filter = "alpha(opacity=" + opacity + ")";
}

function pausecomp(millis)
{
    var date = new Date();
    var curDate = null;

    do { curDate = new Date(); }
    while(curDate-date < millis);
}


function opacity(id, opacStart, opacEnd, millisec) {
	//speed for each frame
	var speed = Math.round(millisec / 100);
	var timer = 0;

	//determine the direction for the blending, if start and end are the same nothing happens
	if(opacStart > opacEnd) {
		for(i = opacStart; i >= opacEnd; i--) {
			setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
			timer++;
		}
	} else if(opacStart < opacEnd) {
		for(i = opacStart; i <= opacEnd; i++)
			{
			setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
			timer++;
		}
	}
}

function shiftOpacity(id, millisec) {
	//if an element is invisible, make it visible, else make it ivisible
	if(document.getElementById(id).style.opacity == 0) {
		opacity(id, 0, 100, millisec);
	} else {
		opacity(id, 100, 0, millisec);
	}
}

function currentOpac(id, opacEnd, millisec) {
	//standard opacity is 100
	var currentOpac = 100;
	
	//if the element has an opacity set, get it
	if(document.getElementById(id).style.opacity < 100) {
		currentOpac = document.getElementById(id).style.opacity * 100;
	}

	//call for the function that changes the opacity
	opacity(id, currentOpac, opacEnd, millisec)
}

