// feedReader.js
//
// Modification Log:
// Date 	Initial Description
// 10 Apr 2007	TKO	Created by Tanny O'Haley

var feedReader = {
	feeds: new Array(),
	headingTag: "h2",
	iDefaultRefreshMinutes: 0,
	bScan: true,
	
	init: function(sTitle, sURL, sFeedURL, iRefreshMinutes, sID, sCount){
		var self = this;
		// New feed item.
		var iCurFeed = this.feeds.length;
		// Save data to feed array.
		this.feeds[iCurFeed] = {
			title: sTitle,
			href: sURL,
			feedURL: sFeedURL,
			RefreshMinutes: (iRefreshMinutes?iRefreshMinutes:this.iDefaultRefreshMinutes),
			id: (sID?sID:"feed" + iCurFeed),
			count: parseInt(sCount?sCount:0),
			idx: iCurFeed,
			el: null,

			show: function(feed) {
				self.show(this, feed);
			},

			create: function() {
				self.create(this);
			}
		};
	},

	run: function() {
		// Get all anchor elements that have a feed class.
		this.setFeeds();

		var feeds = this.feeds;
		for(var i = 0; i < feeds.length; i++) {
			feeds[i].create();
		}
	},

	create: function(feedItem){
		feedItem.el = document.getElementById(feedItem.id);
		if(!feedItem.el) {
			return;
		}

		// Clear the feed.
		this.removeClass(feedItem.el, "hide");
		// For some reason IE doesn't like to set the innerHTML of a created
		// node. Delete the child nodes with DOM calls. Not as fast as innerHTML.

		try {
			feedItem.el.innerHTML = "Loading " + feedItem.title;
		} catch(e) {
			// Delete all items in the feed div.
			while(feedItem.el.hasChildNodes()) {
				feedItem.el.removeChild(feedItem.el.childNodes[0]);
			}

			// Add the title to the div while we are waiting.
			var textNode = document.createTextNode("Loading " + feedItem.title);
			feedItem.el.appendChild(textNode)
		}
		
		this.addClass(feedItem.el, "loading");

		// If the script has been created before, delete the previous script.
		try {
			if(typeof feedItem.script != "undefined") {
				feedItem.script.parentNode.removeChild(feedItem.script);
			}
		} catch(e) {
			alert("Error: " + e.number + ":" + e.description + 
				"\ntypeof: " + typeof feedItem.script +
				"\ntype: " + feedItem.script.type);
		}

		feedItem.script = this.addScript("http://pipes.yahoo.com/pipes/zIQi0Iy72xGJ3NMhJhOy0Q/run?_render=json&_callback=feedReader.feeds[" + feedItem.idx + "].show&s=" + feedItem.feedURL, 1);
	},

	show:function(feedItem, feed){
		// Set class so that rotating graphic disapears.
		this.removeClass(feedItem.el, "loading");
		this.addClass(feedItem.el, "loaded");
		feedItem.el.innerHTML = "";
		// Create a heading item.
		var heading = document.createElement(this.headingTag);
		// Create the heading link.
		var headingLink = document.createElement("a");
		headingLink.href = feedItem.href;
		headingLink.innerHTML = feedItem.title;
		// Add the heading link to the heading.
		heading.appendChild(headingLink);
		// Add the heading to the feed widget.
		feedItem.el.appendChild(heading);
		// Create the feed list.
		var feedList = document.createElement("ul");

		// Are there items to show?
		if(feed.value.items.length){
			var iLen = feed.value.items.length;
			if(feedItem.count > 0 && feedItem.count < iLen) {
				iLen = feedItem.count;
			}

			// Walk through each item and create a list item with link.
			for(var i=0; i<iLen; i++){
				var li=document.createElement("li");
				var a=document.createElement("a");
				a.href=feed.value.items[i].link;
				a.title=feed.value.items[i].title;
				a.innerHTML=feed.value.items[i].title;
				li.appendChild(a);
				feedList.appendChild(li);
			}
		}

		// Add the feed list to the feed widget.
		feedItem.el.appendChild(feedList);
// to hide the date & time of last update, comment out from here all the down to "feedItem.el.appendChild(p)"
/*
		var p = document.createElement("p");
		var d = new Date();
		var h = d.getHours();
		var hh = (h == 0? 12: h);
		var m = d.getMinutes();
		var s = d.getSeconds();

		p.innerHTML = "Last updated: " + (d.getMonth() + 1) + "/" + d.getDate() + "/" + d.getFullYear() + " "
			+ (h > 12?h-12:hh) + ":" + this.padZero(m) + ":" + this.padZero(s) + (h > 11?" pm":" am");
		feedItem.el.appendChild(p);
*/
		if(feedItem.RefreshMinutes) {
			setTimeout("feedReader.feeds[" + feedItem.idx + "].create()", feedItem.RefreshMinutes * 60000);
		}
	},

	setFeeds: function() {
		var feedEls = this.getElementsByClassName("feed", "a");
		if (feedEls.length == 0) {
			return;
		}

		// Process each anchor/link with a className of "feed".
		// The form of the anchor should be:
		// <a href="site url" rel="feed url" title="optional title">Site Title</a>
		for(var i = 0; i < feedEls.length; i++) {
			var a = feedEls[i];
			var sTitle = a.title?a.title:a.innerHTML;
			var sID = "feed"+this.feeds.length;
			var sFeedURL = a.getAttribute("feed");
			if(!sFeedURL) {
				continue;
			}
			var sRefresh = a.getAttribute("refresh");
			var sCount = a.getAttribute("count");

			// Create feed div.
			var div = document.createElement("div");
			div.id = sID;
			div.innerHTML = sTitle;

			// Add div to DOM before anchor.
			a.parentNode.insertBefore(div,a);
			this.addClass(a, "hide");
			this.init(sTitle, a.href, sFeedURL, sRefresh, sID, sCount);
		}
	},

	padZero: function(num) {
		return ((num <= 9) ? ("0" + num) : num);
	},

	addScript: function(sUrl, bNoCache) {

		// Create new script element.
		var script = document.createElement('script');
		script.type = 'text/javascript';

		// Keep IE from caching requests
		if (bNoCache) {
			script.src = sUrl + '&noCacheIE=' + (new Date()).getTime();
		} else {
			script.src = sUrl;
		}

		// For debugging, put src in scriptURL element.
		var el = document.getElementById("scriptURL");
		if (el) {
			el.innerHTML += script.src + "<br>";
		}

		// Add the script to the page.
		document.getElementsByTagName('head')[0].appendChild(script);
		return script;
	},

	getElementsByClassName: function(strClassName, strTagName, oElm) {
		if(oElm == null)
			oElm = document;
		if(strTagName == null)
			strTagName = "*";

		var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
		var arrReturnElements = new Array();
		var oRegExp = new RegExp("(^|\\s)" + strClassName.replace(/\-/g, "\\-") + "(\\s|$)");
		var oElement;
		for(var i=0; i<arrElements.length; i++){
			oElement = arrElements[i];		
			if(oRegExp.test(oElement.className)){
				arrReturnElements.push(oElement);
			}	
		}

		return (arrReturnElements)
	},

	addClass: function(target, classValue){
		var pattern = new RegExp("(^| )" + classValue.replace(/\-/g, "\\-") + "( |$)");
		if (!pattern.test(target.className)){
			if (target.className == ""){
				target.className = classValue;
			}else{
				target.className += " " + classValue;
			}
		}

		return true;
	},

	removeClass: function(target, classValue){
		var removedClass = target.className;
		var pattern = new RegExp("(^| )" + classValue.replace(/\-/g, "\\-") + "( |$)");

		removedClass = removedClass.replace(pattern, "$1");
		removedClass = removedClass.replace(/ $/, "");
		target.className = removedClass;

		return true;
	}
};

if(typeof addDOMLoadEvent != "undefined") {
	addEvent(window, "DOMContentLoaded", function() { feedReader.run(); });
} else {
	addEvent(window, "load", function() { feedReader.run(); });
}

