/**************************************************************************
*
*	Description:	Javascript implementation of a scrolling tickertape of messages
*
*	Project:		WS Atkins - Environment Agency web site home page
*
*	Author:			Gordon Irving
*
*	Initiated:		18th February 2002
*
*	Synopsis:
*		Displays a continuous left-to-right ticker of individual messages.
*		Each message can have a hyperlink or not.
*		Ticker pauses as each message completes.
*
*	Usage:
*		MS IE:
*			create an HTML SPAN element 'tickerElementIE'
*			(onMouseOver and onMouseOut handlers are set up automatically)
*		Netscape:
*			create a layer 'tickerElementNS',
*				with onMouseOver='tickerHold()' and onMouseOut='tickerRelease()'
*			set the 'top' and 'left' properties as appropriate
*
*		Both browsers:
*			call tickerItemsClear() to initialise the message store
*			call tickerAddItem(text,hyperlink) once for each message
*			call tickertape() to start the ticker (e.g. in BODY onLoad handler)
*
*	Configuration:
*		Maximum displayed message length:	'maxLen'		(default 70 chars)
*		Scrolling speed (delay):		'scrollSpeed'		(default 30 milliseconds)
*		Pause speed (delay) at left boundary:	'holdScrollSpeed'	(default 2000 milliseconds)
*
*	Dependencies:
*		Constructed ticker text [in 'scrollTicker()'] includes class="hd7n" [for EA]
*
*	Known issues:
*		Ticker stops in Netscape if page resized (page is reloaded)
*
*	Change history:
*		2002-02-20	GI	First demo version ready for Environment Agency evaluation & approval
*		2002-02-25	GI	Second version - l2r ticker, no scrolling, no mouseOver pause
*
**************************************************************************/

/* configuration variables ... */
var maxLen			= 70;
var scrollSpeed		= 50;
var holdScrollSpeed	= 2000;

/* declarations of 'global' variables ... */
var hasTicker = 1;
var tickerMsgs = new Array();
var tickerHyperlinks = new Array();
var tickerBuffer = new String();
var tickerMsgOffset;
var tickerHeld = 0;
var maxMsgNum = 0;
var msgNum;
var msg = new String();
var showChar = 0;

var G_href;

var nullVar;
var textNode;
var hrefNode;

function showDOMTicker( newMsg ) {
	var tickerNode = document.getElementById('tickerDOM');
	if ( ! tickerNode )
		return;

	if ( textNode ) {
		var nodeList = tickerNode.childNodes;
		if ( hrefNode ) {
			hrefNode = nodeList.item(0);
			nodeList = hrefNode.childNodes;
			hrefNode.removeChild(textNode);
			textNode = nullVar;
			tickerNode.removeChild(hrefNode);
			hrefNode = nullVar;
		} else {
			tickerNode.removeChild(textNode);
		}
	}

	if ( G_href ) {
		hrefNode = document.createElement("a");
		hrefNode.setAttribute("href", G_href);
	//	hrefNode.setAttribute("id", "tickerHref");
		tickerNode.appendChild(hrefNode);
		textNode = document.createTextNode(newMsg);
		hrefNode.appendChild(textNode);
	} else {
		textNode = document.createTextNode(newMsg);
		tickerNode.appendChild(textNode);
	}
}

/* present the ticker text in the dynamic HTML element ... */
function showTicker(messageText) {

/* Start - Edited: D.johns 30.04.04 */
/*	messageText = '> ' + messageText; */
	messageText
/* End - Edited: D.johns 30.04.04 */

	if (document.all) {
/*
		if ( G_href ) {
			document.all.tickerLink.href = G_href;
		} else {
			document.all.tickerLink.href = '';
		}
*/
		tickerElementIE.innerHTML = messageText;
	} else if (document.getElementById != null) {
		showDOMTicker( messageText );
	} else if (document.layers) {
		var s_start = '<span class="hd7n">';
		var s_end = '</span>';
		var newHTML = ( G_href )
			? s_start + '<a href="' + G_href + '">' + messageText + '</a>' + s_end
			: messageText;
//alert("writing HTML: "+newHTML);

		document.tickerElementNS.document.visibility='show';
		document.tickerElementNS.document.write(newHTML);
		document.tickerElementNS.document.close();
	}
}

function setHyperlink( newLink ) {
	if (document.all) {
		document.all.tickerLink.href = (newLink) ? newLink : '';
	} else if (document.getElementById != null) {
		G_href = newLink;
	} else if (document.layers) {
		G_href = newLink;
	}
}

/* construct the ticker text for display ... */
function scrollTicker( flag ){

	if ( tickerHeld == 1 ) { return; }
	if ( maxMsgNum == 0 ) { return; }

	if ( (tickerMsgOffset > msg.length) || (tickerMsgOffset > maxLen) ) {
		// reached the end of this item - set up the next one ...
		tickerMsgOffset = 0;

		setTimeout("scrollTicker(1)",holdScrollSpeed);
	} else {
		if ( flag == 1 ) {
			if ( msgNum == maxMsgNum-1 ) { msgNum=0; } else { msgNum++; }

			setHyperlink( tickerHyperlinks[msgNum] );
			msg = tickerMsgs[msgNum];
			showChar = 0;
		}

		tickerBuffer = msg.substring(0,tickerMsgOffset);

		var tickerDelay = scrollSpeed;
		var delayTrailer = "";
		if ( tickerMsgOffset == (maxLen) ) {
			tickerDelay = holdScrollSpeed;
			if ( tickerMsgs[msgNum].length >= maxLen ) {
				delayTrailer = "...";
			}
		} else {
			if	( showChar == 2 )	{ showChar = 0; }
			else if	( showChar == 1 )	{ showChar++; if ( tickerMsgOffset < msg.length) {tickerBuffer += '_';} }
			else				{ showChar++; if ( tickerMsgOffset < msg.length) {tickerBuffer += '-';} }
		}

		var outputHTML;

		outputHTML = tickerBuffer + delayTrailer;
		showTicker(outputHTML);
		tickerMsgOffset++;

		setTimeout("scrollTicker(0)",tickerDelay);
	}
}

/* event handlers for mouseOver and mouseOut ... */
function tickerHold()		{ tickerHeld = 1; }
function tickerRelease()	{ tickerHeld = 0; scrollTicker(0); }

	/******************/
	/* "external API" */
	/******************/

function tickerItemsClear() {
	tickerMsgs.length = 0;
	tickerHyperlinks.length = 0;
	maxMsgNum = 0;
}

function tickerAddItem(text,hyperlink) {
	if ( ! hasTicker ) { return; }

	var idx = tickerMsgs.length;
	
	tickerMsgs.length++;
	tickerHyperlinks.length++;
	
	tickerMsgs[idx] = text;
	tickerHyperlinks[idx] = hyperlink;
	
	maxMsgNum++;
}

function tickertape() {
	if ( ! hasTicker ) { return; }
	
	msgNum = 0;
	setHyperlink( tickerHyperlinks[msgNum] );
	msg = tickerMsgs[msgNum];
	tickerMsgOffset = 0;
		
	tickerRelease();
}

