//OBJECTS

//objects inside the RSS2Item object
function RSS2Enclosure(encElement) {
	if (encElement == null) {
		this.url = null;
		this.length = null;
		this.type = null;
	}
	else {
		this.url = encElement.getAttribute("url");
		this.length = encElement.getAttribute("length");
		this.type = encElement.getAttribute("type");
	}
}

function RSS2Guid(guidElement) {
	if (guidElement == null) {
		this.isPermaLink = null;
		this.value = null;
	}
	else {
		this.isPermaLink = guidElement.getAttribute("isPermaLink");
		this.value = guidElement.childNodes[0].nodeValue;
	}
}

function RSS2Source(souElement) {
	if (souElement == null) {
		this.url = null;
		this.value = null;
	}
	else {
		this.url = souElement.getAttribute("url");
		this.value = souElement.childNodes[0].nodeValue;
	}
}

//object containing the RSS 2.0 item
function RSS2Item(itemxml) {
	//required
	this.title;
	this.link;
	this.description;

	//optional vars
	this.author;
	this.comments;
	this.pubDate;

	//optional objects
	this.category;
	this.enclosure;
	this.guid;
	this.source;

	var properties = new Array("title", "link", "description", "author", "comments", "pubDate");
	var tmpElement = null;
	for (var i=0; i<properties.length; i++) {
		tmpElement = itemxml.getElementsByTagName(properties[i])[0];
		if (tmpElement != null) {
			if (tmpElement.childNodes[0] != null) {
				eval("this."+properties[i]+"=tmpElement.childNodes[0].nodeValue");
			} else {
				eval("this."+properties[i]+"=''");
			}
		}
	}

	this.category = new RSS2Category(itemxml.getElementsByTagName("category")[0]);
	this.enclosure = new RSS2Enclosure(itemxml.getElementsByTagName("enclosure")[0]);
	this.guid = new RSS2Guid(itemxml.getElementsByTagName("guid")[0]);
	this.source = new RSS2Source(itemxml.getElementsByTagName("source")[0]);
}

//objects inside the RSS2Channel object
function RSS2Category(catElement) {
	if (catElement == null || catElement.childNodes.length == 0) {
		this.domain = null;
		this.value = null;
	}
	else {
		this.domain = catElement.getAttribute("domain");
		this.value = catElement.childNodes[0].nodeValue;
	}
}

//object containing RSS image tag info
function RSS2Image(imgElement) {
	if (imgElement == null) {
		this.url = null;
		this.link = null;
		this.width = null;
		this.height = null;
		this.description = null;
	}
	else {
		imgAttribs = new Array("url","title","link","width","height","description");
		for (var i=0; i<imgAttribs.length; i++) {
			if (imgElement.getAttribute(imgAttribs[i]) != null) {
				eval("this."+imgAttribs[i]+"=imgElement.getAttribute("+imgAttribs[i]+")");
			}
		}
	}
}

//object containing the parsed RSS 2.0 channel
function RSS2Channel(rssxml) {
	//required
	this.title;
	this.link;
	this.description;

	//array of RSS2Item objects
	this.items = new Array();

	//optional vars
	this.language;
	this.copyright;
	this.managingEditor;
	this.webMaster;
	this.pubDate;
	this.lastBuildDate;
	this.generator;
	this.docs;
	this.ttl;
	this.rating;

	//optional objects
	this.category;
	this.image;

	var chanElement = rssxml.getElementsByTagName("channel")[0];
	var itemElements = rssxml.getElementsByTagName("item");

	for (var i=0; i<itemElements.length; i++) {
		Item = new RSS2Item(itemElements[i]);
		this.items.push(Item);
		//chanElement.removeChild(itemElements[i]);
	}

	var properties = new Array("title", "link", "description", "language", "copyright", "managingEditor", "webMaster", "pubDate", "lastBuildDate", "generator", "docs", "ttl", "rating");
	var tmpElement = null;
	for (var i=0; i<properties.length; i++) {
		tmpElement = chanElement.getElementsByTagName(properties[i])[0];
		if (tmpElement!= null) {
			if (tmpElement.childNodes[0] != null) {
				eval("this."+properties[i]+"=tmpElement.childNodes[0].nodeValue");
			} else {
				eval("this."+properties[i]+"=''");
			}
		}
	}
	
	this.category = new RSS2Category(chanElement.getElementsByTagName("category")[0]);
	this.image = new RSS2Image(chanElement.getElementsByTagName("image")[0]);
}

//PROCESSES

//uses xmlhttpreq to get the raw rss xml
function getRSS(rssFile, target, bodyTplId, itemTplId, maxItems) {
	var xhr;
	
	var contentEl = document.getElementById(target);
	var bodyTpl = RSS_getTpl(bodyTplId);
	var itemTpl = RSS_getTpl(itemTplId);
	
	// hide templates
	document.getElementById(bodyTplId).style.display = "none";
	document.getElementById(itemTplId).style.display = "none";

	//call the right constructor for the browser being used
	if (window.ActiveXObject)
		xhr = new ActiveXObject("Microsoft.XMLHTTP");
	else if (window.XMLHttpRequest)
		xhr = new XMLHttpRequest();
	else
		alert("not supported");

	//prepare the xmlhttprequest object
	//xhr.open("GET",document.rssform.rssurl.value,true);
	xhr.open("GET", rssFile, true);
	xhr.setRequestHeader("Cache-Control", "no-cache");
	xhr.setRequestHeader("Pragma", "no-cache");
	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4) {
			if (xhr.status == 200) {
				if (xhr.responseText != null) {
					processRSS(xhr.responseXML, contentEl, bodyTpl, itemTpl, maxItems);
				} 
				else {
					alert("Failed to receive RSS file from the server - file not found.");
					return false;
				}
			}
			else {
				alert("Error code " + xhr.status + " received: " + xhr.statusText);
			}
		}
	}

	//send the request
	xhr.send(null);
}

//processes the received rss xml
function processRSS(rssxml, contentEl, bodyTpl, itemTpl, maxItems) {
	RSS = new RSS2Channel(rssxml);
	showRSS(RSS, contentEl, bodyTpl, itemTpl, maxItems);
}

//shows the RSS content in the browser
function showRSS(RSS, contentEl, bodyTpl, itemTpl, maxItems) {	
	var bodyHtml = bodyTpl;
	var itemsHtml = "";
	
	//populate channel data
	var properties = new Array("title","link","description","pubDate","copyright");
	for (var i=0; i<properties.length; i++) {
		curProp = eval("RSS."+properties[i]);
		if (curProp != null) {	
			bodyHtml = bodyHtml.replace("rssBody_" + properties[i], curProp);
			//document.getElementById("debug").innerHTML += "<br>body_" + properties[i] + ": " + curProp;
		}
	}

	//show the image
	if (RSS.image.url != null) {
		/*document.getElementById("chan_image_link").href = RSS.image.link;
		document.getElementById("chan_image_link").innerHTML = imageTag
			+" alt='"+RSS.image.description
			+"' width='"+RSS.image.width
			+"' height='"+RSS.image.height
			+"' src='"+RSS.image.url
			+"' "+"/>";
			*/
		/*bodyHtml = bodyHtml.replace("rssBody_image.url", RSS.image.url);
		bodyHtml = bodyHtml.replace("rssBody_image.title", RSS.image.title);
		bodyHtml = bodyHtml.replace("rssBody_image.link", RSS.image.link);*/
	}
	else {
		/*document.getElementById('rssBodyImage').style.display="none";*/
	}

	//populate the items
	var itemsAdded = 0;
	for (var i=0; i<RSS.items.length; i++) {
		item_html = itemTpl;
		item_html = item_html.replace("rssItem_title", RSS.items[i].title);
		item_html = item_html.replace("rssItem_link", RSS.items[i].link);
		item_html = item_html.replace("rssItem_description", RSS.items[i].description);
		
		if (itemsAdded < maxItems) {
			itemsHtml += item_html;
		}
		itemsAdded++;
		
		//document.getElementById("debug").innerHTML += "<br>itemTitle: " + RSS.items[i].title;
	}
	
	bodyHtml = bodyHtml.replace("rssBody_items", itemsHtml);
	
	contentEl.innerHTML = bodyHtml;
	
	return true;
}

function RSS_getTpl (id) {
	var tpl = document.getElementById(id);
	return tpl.innerHTML;
}

