/**
 * Functionality for auto slideshow / straplines / anything else
 *
 */
 
AutoSlideShow = function(slidePrefix, numSlides, outerWrapperId, innerWrapperId) {

    this.slidePrefix = slidePrefix;
    this.outerWrapper = document.getElementById(outerWrapperId);
    this.innerWrapper = document.getElementById(innerWrapperId);
    this.numSlides = numSlides;
}


AutoSlideShow.prototype.start = function(delay) {

    if (this.outerWrapper && this.innerWrapper) {
        this.fixAndStartSlideshow(delay);
    }
    else {        
        this.startSlideshow(delay);
    }
}


AutoSlideShow.prototype.startSlideshow = function(delay) {
    
    startSs(this.slidePrefix, this.numSlides, delay);
}


AutoSlideShow.prototype.fixAndStartSlideshow = function(delay) {

    // fix the height of the slideshow and start
    if (window.attachEvent) {
        window.attachEvent('onload', fixAndStartSs(this.slidePrefix, this.numSlides, this.outerWrapper, this.innerWrapper, delay));
    }
    else {
        window.addEventListener('load', fixAndStartSs(this.slidePrefix, this.numSlides, this.outerWrapper, this.innerWrapper, delay), false);
    }
}


function startSs(slidePrefix, numSlides, delay, checkHeightFixed, innerWrapper) {

    if (!checkHeightFixed || (checkHeightFixed && innerWrapper)) {
        
        if (checkHeightFixed) {
            var ssFixedRegEx = /fixed/i;
            var ssIsFixed = innerWrapper.className.match(ssFixedRegEx);
            
            if (ssIsFixed) {
            
                // crude check to make sure the slideshow height has not been set before images have finished loading
                var imgs = innerWrapper.getElementsByTagName('img');
                
                for (var img in imgs) {
                
                    if (img.offsetHeight > innerWrapper.offsetHeight) {
                    
                        ssIsFixed = false;
                    }
                }
            }
        }
        
        if (!checkHeightFixed
            || (checkHeightFixed && ssIsFixed)) {
            
            // set visibility visible and display none on all slides apart from the first
            for (var i = 0; i < numSlides; i++) {

                var slide = document.getElementById(slidePrefix + String(i));
                
                if (slide && (i > 0)) {
                    slide.style.display = 'none';
                    slide.style.visibility = 'visible';
                }
            }
            
            setTimeout(switchSlides(0, 0, numSlides - 1, delay, slidePrefix), delay);
        }
    }
    
    // if we get here the height of the slideshow couldn't be fixed so don't start it
}


function fixAndStartSs(slidePrefix, numSlides, outerWrapper, innerWrapper, delay) {
	
    return (function() {

        if (outerWrapper && innerWrapper) {
                
            var max = 0;
        	
            for (var i = 0; i < numSlides; i++) {
        	
                var slide = document.getElementById(slidePrefix + String(i));
    	        
                if (slide)
                {
                    var sHeight = slide.offsetHeight | 0;
            	    
                    max = Math.max(max, sHeight);
                }
            }
        	
            if ((max > 0) && outerWrapper && innerWrapper) {
    	        
                outerWrapper.style.height = String(max) + 'px';
                innerWrapper.style.height = String(max) + 'px';
                
                // if we get to here we're good to go - indicate this to the startSlideshowTimeout function
                innerWrapper.className = innerWrapper.className + ' fixed';
            }
            
            startSs(slidePrefix, numSlides, delay, true, innerWrapper);
        }
    });
}


function switchSlides(frame, startFrame, endFrame, delay, slidePrefix) {
       
    return (function() {
      Effect.Fade(slidePrefix + frame);
      if (frame == endFrame) { frame = startFrame; } else { frame = frame + 1; }
      setTimeout("Effect.Appear('" + slidePrefix + frame + "');", 1000);
      setTimeout(switchSlides(frame, startFrame, endFrame, delay, slidePrefix), delay + 1500);
    })
}