/* ReaderWidget - by Alan Rowarth (c)2008 APN Online Ltd */

var defaultFeedUrl = 'http://www.nzherald.co.nz/json/rss/';

var feed;
var googleIsReady = false;

/* The structure of the generated widget is:
	<... parentElement ...>
		<ul>
			<li><strong>$Time</strong><a href='$Link'>$Description</a><li>
			[... more <li>'s ...]
		</ul>
	<... /parentElement ...>
*/

function ReaderWidget(targetDivName, feed, nItems, refreshInterval) {
	if (feed == undefined) {
		this.feed = new JsonFeeder(defaultFeedUrl);
	}
	else if (feed.constructor == String) {
		this.feedUrl = feed;
		this.feed = new JsonFeeder(feed);
	}
	else {
		this.feed = feed;
	}
	this.nItems = (nItems == undefined ? 6 : nItems);
	this.refreshInterval = (refreshInterval == undefined ? 60 : refreshInterval);
	this.feedTitle = 
	this._targetDivName = targetDivName;
	this._initialized = false;
	this._intervalHandle = null;
}

/* Display feed and activate autorefresh */
ReaderWidget.prototype.run = function() {
	this._init();
	this._loadFeed();
	this.startTimer();
}

/* Display feed without activating autorefresh */
ReaderWidget.prototype.display = function(completionCallback) {
	this._init();
	this._loadFeed(completionCallback);
}

/* Start autorefresh timer */
ReaderWidget.prototype.startTimer = function() {
	this._setRefreshInterval(this.refreshInterval);
}

/* Stop autorefresh timer */
ReaderWidget.prototype.stop = function() {
	this._clearRefreshInterval();
}

/* Reload widget contents */
ReaderWidget.prototype.reload = function() {
	this._loadFeed();
}

ReaderWidget.prototype._setRefreshInterval = function(intervalSeconds) {
	if (!intervalSeconds) return;
	var thisx = this;
	var reloadFn = function() {
		thisx.reload();
	}
	this._intervalHandle = window.setInterval(reloadFn, intervalSeconds * 1000);
}

ReaderWidget.prototype._clearRefreshInterval = function() {
	if (this._intervalHandle) {
		window.clearInterval(this._intervalHandle);
	}
}

ReaderWidget.prototype._renderDisplayTime = function(inTime) {
	var timeStr;
	var viewMins;
	var meridiem;
	var _viewMins = new String(inTime.getMinutes());
	
	/* Fix minutes string if necessary */
	if (_viewMins.length == 1) {
		viewMins = '0' + _viewMins;
	}
	else {
		viewMins = _viewMins;
	}
	
	meridiem = (inTime.getHours() < 12 ? 'AM' : 'PM');
	timeStr = inTime.getHours() + ':' + viewMins + meridiem;
	return timeStr;
}

ReaderWidget.prototype._init = function() {
	this.targetDiv = document.getElementById(this._targetDivName);
	if (!this.initialized) {
		this.feed.setNumEntries(this.nItems);
		this.initialized = true;
	}
}

/* Returns a formed DOM element for the given entry */
ReaderWidget.prototype._renderEntry = function(entry) {
	var li = document.createElement('li');
	var strong = document.createElement('strong');
	var anchor = document.createElement('a');
	var viewTime = new Date(entry.publishedDate);
	var timeStr;
	strong.appendChild(document.createTextNode(this._renderDisplayTime(new Date(entry.publishedDate))));
	anchor.href = entry.link + '&ref=weg';
	anchor.appendChild(document.createTextNode(entry.title.replace(/<\/?[^>]*>/g, '')));
	li.appendChild(strong);
	li.appendChild(anchor);
	return li;
}

/* Returns a renderer callback function suitable for passing to a Google feed object */
ReaderWidget.prototype._makeRendererFunction = function(completionCallback) {
	thisx = this;
	return function(result) {
		if (!result.error) {
			var containerUl = document.createElement('ul');
			for (var i = 0; i < result.feed.entries.length; i++) {
				var entry = result.feed.entries[i];
				containerUl.appendChild(thisx._renderEntry(entry));
			}
			
			var headerH1 = document.createElement('h1');
			var headerA = document.createElement('a');
			headerA.appendChild(document.createTextNode(thisx.feed.name));
			headerA.href = thisx.feed.link;
			headerH1.appendChild(headerA);
			
			var footerDiv = document.createElement('div');
			var footerA = document.createElement('a');
			footerA.appendChild(document.createTextNode('Feed powered by www.nzherald.co.nz'));
			footerA.href = 'http://www.nzherald.co.nz';
			footerDiv.className = 'footer';
			footerDiv.appendChild(footerA);
			
			thisx._removeChildNodes(thisx.targetDiv);
			thisx.targetDiv.appendChild(headerH1);
			thisx.targetDiv.appendChild(containerUl);
			thisx.targetDiv.appendChild(footerDiv);
			
		}
		if (completionCallback) completionCallback();
	};
}

ReaderWidget.prototype._removeChildNodes = function(node) {
	for (var i=node.childNodes.length-1; i >= 0; i--) {
		node.removeChild(node.childNodes[i]);				
	}
}

ReaderWidget.prototype._loadFeed = function(completionCallback) {
	this.feed.load(this._makeRendererFunction(completionCallback));	
}
