// scrolling.js
// Used for various JavaScript scrolling on a page
// Originally from www.ScriptAsylum.com , but modified substanitially by Mike Saxton.  (and quite nicey I must add)

// ******** VARIABLES ********

// GENERAL SCROLLING VARIABLES
var usingFirefox = false;                    // if the browser is Firefox
var newsScrolling = false;                   // if the news messages are currently scrolling


// SLIDESHOW VARIABLES
var totalSlides;                             // total number of slides
var currentSlide = 0                         // number of the current slide being displayed
var maxSlides = 25;                          // max number of slides, used as a safegaurd
var changeSlideTime;                         // timer to tell when to change slides
var viewSlideLength = 10000;                 // length of time a slide is displayed for with normal rotation

var slideMessageName = 'featureSlide';       // id of the <div>'s holding the individual slide content


// VERTICAL NEWS SCROLLER VARIABLES
var totalNewsMessages;                       // total number of news messages
var maxNewsMessages = 50;                    // max number of slides, used as a safegaurd
var newsTrainEnd = 0;                        // current end of the train of news messages, measured in pixels
var newsInterval;                            // interval use to scroll the news messages
var newsSpeed = 20;                          // length of time between scrolling intervals (except on Firefox)
var newsPixelStep = 1;                       // distnace each news messages is moved on each scrolling interval (except Firfox)
var firefoxNewsSpeed = 2;                    // length of time between scrolling intervals, on Firefox
var firefoxNewsPixelStep = 4;                // distnace each news messages is moved on each scrolling interval, on Firefox
var viewNewsLength = 10000;                  // length of time a news message is displayed for

var newsBoxHeight=132;                       // height of the news scroller in pixels(must be a multiple of 4(ie the firefoxNewsPixelStep value))
var newsBoxWidth=182;                        // width of the news scroller in pixels
var newsBoxColor="#FFFFFF";                  // background color of the news scroller (not used in this script)
var newsMessageHeight = newsBoxHeight - 4;   // height of each news message div   
var newsRef;                                 // a reference div to hold the news scroller
var newsOuter;                               // an outer div to contain the news messages
var newsMessages = new Array();              // an array of news messages content divs
var newsMessageName = 'newsMessage';         // id of the <div>'s holding the individual news message content 


// MARQUEE VARIABLES
var totalMarqueeMessages;
var maxMarqueeMessages = 50;
var messageSpacing = 10;
var marqueeTrainEnd = messageSpacing;
var marqueeInterval;
var marqueeSpeed=50;                      
var marqueePixelStep=1;

var marqueeBoxHeight=20;                  // height of the marquee in pixels
var marqueeBoxWidth=528;                  // width of the marquee in pixels
var marqueeBoxColor="#FFFFFF";            // background color of the marquee (not used in this script)
var marqueeRef;
var marqueeOuter;
var marqueeMessages = new Array();
var marqueeMessageLength = new Array();
var marqueeMessageName = 'marqueeMessage';

// ******** FUNCTIONS ********

// GENERAL SCROLLING FUNCTIONS

function initScrolling() {
	// initialize the features slideshow 
	initSlides();
	// initialize the news scroller
	initNews();	
	// initialize the events marquee
	initMarquee();
		
	//adjust if we are using Mozilla Firefox, since when both scrollers are scrolling, it lags.
	var agt = navigator.userAgent.toLowerCase();
	if( agt.indexOf( "firefox" ) != -1 ) {
		//alert('Firefox detected');
		newsSpeed = firefoxNewsSpeed;
		newsPixelStep = firefoxNewsPixelStep;
		usingFirefox = true;
	}	
}

window.onresize=function(){
	//alert('WINDOW was resized');
	marqueeOuter.style.left=getPageLeft(marqueeRef)+'px';
	marqueeOuter.style.top=getPageTop(marqueeRef)+'px';
	newsOuter.style.left=getPageLeft(newsRef)+'px';
	newsOuter.style.top=getPageTop(newsRef)+'px';
}
			
function getElWidth( el ) {
	//alert( 'el.offsetWidth:' + el.offsetWidth + ', el.clientWidth:' + el.clientWidth + ', el.style.Width:' + el.style.Width );
	return parseInt(el.offsetWidth);
}

function getPageLeft(el){
	var x = 0;
	while(el.offsetParent!=null){
		//alert( 'getPageLeft-->el.offsetLeft:' + el.offsetLeft ); 
		x+=el.offsetLeft;
		el=el.offsetParent;
	}
	x+=el.offsetLeft;
	//alert( 'getPageLeft-->final_X:' + x );
	return x;
}

function getPageTop(el){
	var y=0;
	while(el.offsetParent!=null){
		//alert( 'getPageTop-->el.offsetTop:' + el.offsetTop );
		y+=el.offsetTop;
		el=el.offsetParent;
	}
	y+=el.offsetTop;
	//alert( 'getPageTop-->final_Y:' + y );
	return y;
}

function renameObjects( messageName, maxMessages ) {
	// All message objects start off with the same name, so we go through and rename them incrementally, starting at 0
	var currentMessageObj;             // the current message object to be renamed
	var totalMessages = 0;             // a rolling number of messages found
	var foundAllMessages = false;      // determine when all the messages have been renamed
	var safeGaurd = 0;                 // just a safe gaurd to make sure we don't get stuck in an endless loop

	while( !foundAllMessages ) {   // loop until we've found all the messages
		//alert('Looking for ' + messageName + totalMessages );
		if( currentMessageObj = document.getElementById( messageName ) ) {
			currentMessageObj.id = messageName + totalMessages;
			//alert('Renamed: ' + currentMessageObj.id );
			totalMessages++;
		} else {
			foundAllMessages = true;
			//alert('All \'' + messageName + '\' messages are found');
		}
		safeGaurd++;
		// don't want to get stuck in an endless loop, so if we're still finding stuff when we hit the max, somethings gone wrong-o. Bail
		if( safeGaurd > maxMessages ) foundAllMessages = true;
	}
	return totalMessages;  // return the total number of messages found
}


// SLIDESHOW FUNCTIONS
function initSlides() {	
	totalSlides = renameObjects( slideMessageName, maxNewsMessages );     // rename the slides incrementally
	var initialSlideObj;
	
	if( totalSlides >= 1 ) {      // check that we actually have a slide to display 
		// make the first slide visible
		initialSlideObj = document.getElementById( slideMessageName + currentSlide );
		initialSlideObj.style.visibility = 'visible';
	}
	
	if( totalSlides > 1  ) {   // check the there are multiple slides to scroll
		// set a timer to change the slides
		changeSlideTime = setTimeout( 'changeSlide("next")', viewSlideLength );
	}
	else if( totalSlides == 1 ) {   // check if there's only 1 slide
		// since there's only 1 slide, don't scroll, and turn off left and right arrow buttons
		var leftArrowImage = document.getElementById( 'leftFeatureArrow' );
		var rightArrowImage = document.getElementById( 'rightFeatureArrow' );
		leftArrowImage.src = 'images/1x1.gif';
		leftArrowImage.onclick = '';
		rightArrowImage.src = 'images/1x1.gif';
		rightArrowImage.onclick = '';		
	}
}

function changeSlide( dirOfNextSlide ) {
	
	// reset the timer for changing slides
	clearTimeout( changeSlideTime );
	
	// make old slide hidden
	var slideObj = document.getElementById( 'featureSlide' + currentSlide );
	slideObj.style.visibility = 'hidden';
	
	// determine which slide to display
	if( dirOfNextSlide == 'next' ) {   // check if we want the next slide in the train or the previous slide
		currentSlide++;
		if( currentSlide >= totalSlides ) {   // if we've gone off the back of the train, go back to the start
			currentSlide = 0;
		}
	} else if ( dirOfNextSlide == 'prev' ) {
		if( currentSlide == 0 ) {     // if we're at the start and want the previous slide, go to the last slide
			currentSlide = totalSlides; 
		}
		currentSlide--;
	}
	// make new slide visible
	var slideObj = document.getElementById( 'featureSlide' + currentSlide );
	slideObj.style.visibility = 'visible';	
	changeSlideTime = setTimeout( 'changeSlide("next")', viewSlideLength);   // reset the timer

}


// NEWS FUNCTIONS
function initNews() {
	newsRef = document.getElementById('newsRef');
	newsOuter = document.getElementById('newsOuter');
	totalNewsMessages = renameObjects( newsMessageName, maxNewsMessages );
	
	for( var i = 0; i < totalNewsMessages; i++ ) {
		newsMessages[i] = document.getElementById( newsMessageName + i );
		newsMessages[i].id = newsMessageName;
		//alert( 'newsMessages[' + i + '].offsetHeight:' + newsMessages[i].offsetHeight );
		newsMessages[i].style.top = newsTrainEnd + 'px';
		newsTrainEnd += ( newsBoxHeight );
		newsMessages[i].style.clip='rect(0px, '+(newsBoxWidth-12)+'px, '+(newsMessageHeight)+'px, 0px)';
		newsMessages[i].style.visibility = 'visible';
		
	}
	newsOuter.style.left=getPageLeft(newsRef)+'px';
	newsOuter.style.top=getPageTop(newsRef)+'px';
	newsOuter.style.visibility='visible';
	if( totalNewsMessages > 1 ) {   // no need to do sliding if there's only one news message
		setTimeout('pauseNews()', 10000);
	}
}

function scrollNews(){
	if( usingFirefox ) newsScrolling = true;
	newsTrainEnd -= newsPixelStep;
	for( var i = 0; i < totalNewsMessages; i++ ) {
		newsMessages[i].style.top= ( parseInt(newsMessages[i].style.top) -newsPixelStep ) + 'px';
		if(parseInt( newsMessages[i].style.top ) == 0 ) {
			clearInterval(newsInterval);
			setTimeout('pauseNews()', 10000);
			if( usingFirefox ) newsScrolling = false;
		}
		if( parseInt( newsMessages[i].style.top ) < -(newsMessageHeight) ) {
			newsMessages[i].style.top = newsTrainEnd + 'px';
			newsTrainEnd += ( newsMessageHeight );
		}
	}
}

function pauseNews(){
	newsInterval = setInterval('scrollNews()', newsSpeed);
}


// MARQUEE FUNCTIONS
function initMarquee() {
	marqueeRef = document.getElementById('marqueeRef');
	marqueeOuter = document.getElementById('marqueeOuter');
	totalMarqueeMessages = renameObjects( marqueeMessageName, maxMarqueeMessages );
	
	for( var i = 0; i < totalMarqueeMessages; i++ ) {
		marqueeMessages[i] = document.getElementById( marqueeMessageName + i );					
		marqueeMessages[i].style.position = 'absolute';
		marqueeMessages[i].style.overflow = 'hidden';
		marqueeMessageLength[i] = getElWidth( marqueeMessages[i] );
		//set inital postions for all items
		marqueeMessages[i].style.left = marqueeTrainEnd + 'px';
		marqueeTrainEnd += ( marqueeMessageLength[i] + messageSpacing - 4 );  // minus 4 bacuse the MessageLength has 4 pixels of padding
		marqueeMessages[i].style.clip='rect(0px, '+(marqueeMessageLength[i])+'px, '+(marqueeBoxHeight-2)+'px, 0px)';
		marqueeMessages[i].style.visibility = 'visible';
	}
	marqueeOuter.style.width=marqueeBoxWidth;
	marqueeOuter.style.left=getPageLeft(marqueeRef)+'px';
	marqueeOuter.style.top=getPageTop(marqueeRef)+'px';
	marqueeOuter.style.visibility="visible";
	marqueeInterval = setInterval('scrollMarquee()',marqueeSpeed);
}

function scrollMarquee(){
	if( !newsScrolling ) {
		marqueeTrainEnd -= marqueePixelStep;
		for( var i = 0; i < totalMarqueeMessages; i++ ) {
			marqueeMessages[i].style.left = (parseInt(marqueeMessages[i].style.left) - marqueePixelStep)+'px';
			if( parseInt( marqueeMessages[i].style.left ) < ( 2 - marqueeMessageLength[i] ) ) {						
				if( marqueeTrainEnd < marqueeBoxWidth ) marqueeTrainEnd = marqueeBoxWidth;
				marqueeMessages[i].style.left = marqueeTrainEnd + 'px';
				marqueeTrainEnd += ( marqueeMessageLength[i] + messageSpacing );
			}					
		}
	}
}

function pauseMarquee() {
	clearInterval( marqueeInterval );
}

function resumeMarquee() {
	marqueeInterval = setInterval('scrollMarquee()',marqueeSpeed);
}






