// 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 - NOT USED


// 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=109;                       // height of the news scroller in pixels(must be a multiple of 4(ie the firefoxNewsPixelStep value))
                                             // set 10 pixels higher than the actaully box height specified in the HTML, to give the news messages some separation
var newsBoxWidth=364;                        // width of the news scroller in pixels
var newsBoxLeftRightPadding = 0;             // total left and right padding between the news box and the news item text itself
var newsBoxColor="#ffffff";                  // background color of the news scroller (not used in this script)
var newsMessageHeight = newsBoxHeight - 0;   // 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 


// NEWS TICKER VARIABLES
var totalNewsTickerMessages;
var maxNewsTickerMessages = 50;
var newsTickerMessageSpacing = 20;
var newsTickerTrainEnd = newsTickerMessageSpacing;

var newsTickerBoxHeight = 18;                  // height of the news ticker in pixels
var newsTickerBoxWidth = 750;                  // width of the news ticker in pixels
var newsTickerBoxColor = "#528ebe";            // background color of the news ticker (not used in this script)
var newsTickerRef;
var newsTickerOuter;
var newsTickerMessages = new Array();
var newsTickerMessageLength = new Array();
var newsTickerMessageName = 'newsTickerMessageHolder';


// TICKER MOVEMENT
var tickerInterval;      // the currency ticker will step at each tickerInterval.  the news ticker will step once every newsTickerInterval inervals (see below)
var tickerSpeed = 20;    // lower is faster (interval length for when to do the next step, from 1-10 all seem to be the same)
var tickerPixelStep = 1;

var newsTickerPaused = 0;                     


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

// GENERAL SCROLLING FUNCTIONS

function initScrolling(mode) {
	// Resolution Setting
	//resSet();
	
	/*
	if (!mode) { mode = 'normal'; }
	
	// initialize the features slideshow 
	if (mode == 'normal') {
		initSlides();
	}
	// initialize the news vertical scroller
	if (mode == 'normal') {
		initNews();	
	}

	if (mode == 'normal' || mode == 'wide') {
		// initialize the news ticker
		initNewsTicker();
	}
	*/
	
	//initSlides();
	initNews();
	
	// start the ticker interval
	tickerInterval = setInterval( 'scrollTicker()', tickerSpeed );
	
	/*	
	//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');
	//newsTickerOuter.style.left = getPageLeft( newsTickerRef ) + 'px';
	//newsTickerOuter.style.top = getPageTop( newsTickerRef ) + '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
		///////////////CH Sez: This is broken on NCC site -- commenting out entirely.
		////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 VERTICAL SCROLLER 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 - newsBoxLeftRightPadding)+'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 ) pauseNewsTicker();
	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 ) resumeNewsTicker();
		}
		if( parseInt( newsMessages[i].style.top ) < -(newsMessageHeight) ) {
			newsMessages[i].style.top = newsTrainEnd + 'px';
			newsTrainEnd += ( newsMessageHeight );
		}
	}
}

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


// NEWS TICKER FUNCTIONS
function initNewsTicker() {
	newsTickerRef = document.getElementById( 'newsTickerRef' );
	newsTickerOuter = document.getElementById( 'newsTickerOuter' );
	totalNewsTickerMessages = renameObjects( newsTickerMessageName, maxNewsTickerMessages );
	for( var i = 0; i < totalNewsTickerMessages; i++ ) {
		newsTickerMessages[i] = document.getElementById( newsTickerMessageName + i );					
		newsTickerMessages[i].style.position = 'absolute';
		newsTickerMessages[i].style.overflow = 'hidden';
		newsTickerMessageLength[i] = getElWidth( newsTickerMessages[i] );
		//set inital postions for all items
		newsTickerMessages[i].style.left = newsTickerTrainEnd + 'px';
		newsTickerTrainEnd += ( newsTickerMessageLength[i] + newsTickerMessageSpacing );
		newsTickerMessages[i].style.clip = 'rect( 0px, ' + ( newsTickerMessageLength[i] ) + 'px, ' + ( newsTickerBoxHeight - 2 ) + ' px, 0px )';
		newsTickerMessages[i].style.visibility = 'visible';
	}
	newsTickerOuter.style.width = newsTickerBoxWidth;
	newsTickerOuter.style.left = getPageLeft( newsTickerRef )+'px';
	newsTickerOuter.style.top = getPageTop( newsTickerRef )+'px';
	newsTickerOuter.style.visibility = "visible";
}

function pauseNewsTicker() {
	newsTickerPaused = 1;
}
function resumeNewsTicker() {
	newsTickerPaused = 0;
}


// TICKER MOVEMENT
function scrollTicker() {
	
	if( !newsTickerPaused ) {   // check if the news ticker is paused
		newsTickerTrainEnd -= tickerPixelStep;
		for( var i = 0; i < totalNewsTickerMessages; i++ ) {
			newsTickerMessages[i].style.left = ( parseInt( newsTickerMessages[i].style.left ) - tickerPixelStep ) + 'px';
			if( parseInt( newsTickerMessages[i].style.left ) < ( 2 - newsTickerMessageLength[i] ) ) {						
				if( newsTickerTrainEnd < newsTickerBoxWidth ) newsTickerTrainEnd = newsTickerBoxWidth;
				newsTickerMessages[i].style.left = newsTickerTrainEnd + 'px';
				newsTickerTrainEnd += ( newsTickerMessageLength[i] + newsTickerMessageSpacing );
			}					
		}
	}

}



