/*
	RSS News Ticker
	Jude Venn 2005, based on the BBC News ticker
	
	Requires:
		MochiKit (http://www.mochikit.com/)
	Usage:
		ticker = new RSSTicker("http://example.com/rssfeed.xml", window.document.getElementById("idTickerAnchor"));
		ticker.start();
*/
function RSSTicker(rssurl, anchorobject) {
	
	/*** public properties */
	
	/* initial story display timeout (after receipt of the rss data) */
	this.Timeout = 500;
	/* character display speed */
	this.CharacterTimeout = 50;
	/* story display speed */
	this.StoryTimeout = 5000;
	/* cursor widget characters */
	this.Widget = new Array('_', '-');
	
	/*** private properties */
	
	/* Take a reference to this so methods can be used as async event handlers */
	var self = this;
	
	var myRSSURL = rssurl;
	var myAnchorObject = anchorobject;
	
	/* RSS item list */
	var myRSSItems = null;
	/* index of current RSS item */
	var myCurrentItem = 0;
	
	/* current item title */
	var myCurrentTitle = '';
	/* tickers current character index in item title */
	var myPos = 0;
	
	this.start = function() {
		r = getXMLHttpRequest();
		if (r.overrideMimeType) {
			r.overrideMimeType("text/xml");
		}
		r.open("GET", myRSSURL, true);
		log('Requesting "' + myRSSURL + '"');
		d = sendXMLHttpRequest(r).addCallbacks(self.onRecvRSS, self.onFailRSS);
	}
	
	this.onRecvRSS = function(req) {
		log('Received: ' + req.statusText);
		myRSSItems = req.responseXML.documentElement.getElementsByTagName('item');
		setTimeout(self.onTick, self.Timeout);
	}
	
	this.onFailRSS = function(err) {
		log('Failed to fetch "' + myRSSURL + '":\n' + err);
	}
	
	this.onTick = function () {
		var t;  
		if (myPos == 0) {
			myCurrentItem = myCurrentItem % myRSSItems.length;
			myCurrentTitle = scrapeText(myRSSItems[myCurrentItem].getElementsByTagName('title')[0]).replace(/&quot;/g,'"');
			myAnchorObject.href = scrapeText(myRSSItems[myCurrentItem].getElementsByTagName('link')[0]);
			++myCurrentItem;
		}
		
		myAnchorObject.innerHTML = myCurrentTitle.substring(0, myPos) + self.getCurrentWidget();
		
		if (myPos != myCurrentTitle.length) {
			++myPos;
			t = self.CharacterTimeout;
		}
		else {
			myPos = 0;
			t = self.StoryTimeout;
		}
		
		setTimeout(self.onTick, t);
	}
	
	this.getCurrentWidget = function() {
		if (myPos == myCurrentTitle.length) {
			return '';
		}
		return self.Widget[myPos % self.Widget.length];
	}
	
};
