// RssReader class for encafe.
// Copyright (C) 2009 encafe
// modified kaz_a 2009/01/04
// Creative Commons License - Attribution-ShareAlike 3.0
function RssReader(maxcnt, divtag, url, format) {

	if (!format) format = 'rss2.0';
	this.reader = this;

	this.format = format;
	this.maxcnt = maxcnt;
	this.divtag = document.getElementById(divtag);
	this.url    = url;

	this.message = document.createTextNode('Now Reading Rss...');
	this.divtag.appendChild(this.message);

	this.doRequest(this.reader);
	this.doSetTimer(this.reader);
};

RssReader.prototype.doRequest = function(reader) {
	this.request = new Ajax.Request(
		this.url, 
		{
			method: "get", 
			onException: function(req, json) {
				reader.showException.call(reader, req, json);},
			onSuccess: function(req, json) {
				reader.showResponse.call(reader, req, json);},
			onFailure: function(req, json) {
				reader.showFailure.call(reader, req, json);}
		});
};

RssReader.prototype.doSetTimer = function(reader) {
	this.timer = window.setInterval(function() {
			reader.doRequest.call(reader, reader);
		}, 600000);
};

RssReader.prototype.toString = function() {
	return "[encafeRssReader target=" + this.divtag + ", url=" + this.url + "]";
};

RssReader.prototype.showResponse = function(req, json) {
	//put returned XML in the textarea
	this.response = req.responseXML;
	this.buildHTML();
};

RssReader.prototype.showError = function(req, json) {
	//put returned XML in the textarea
	this.divtag.removeChild(this.message);
	this.message = document.createTextNode('Error has occured.');
	this.divtag.appendChild(this.message);
};

RssReader.prototype.showFailure = function(req, json) {
	//put returned XML in the textarea
	this.divtag.removeChild(this.message);
	this.message = document.createTextNode('Failure.');
	this.divtag.appendChild(this.message);
};

RssReader.prototype.showException = function(req, json) {
	//put returned XML in the textarea
	this.divtag.removeChild(this.message);
	this.message = document.createTextNode('Exception has occured.');
	this.divtag.appendChild(this.message);
};

RssReader.prototype.buildHTML = function() {
	this.divtag.removeChild(this.message);
	if (this.format == 'rss2.0') {
		this.buildHTML_fromRss20('text');
	} else if (this.format == 'rss2.0withMedia') {
		this.buildHTML_fromRss20('media');
	} else if (this.format == 'atom') {
		this.buildHTML_fromAtom();
	}
};

RssReader.prototype.buildHTML_fromRss20 = function(mode) {
	var items = this.response.getElementsByTagName('item');
	if (items.length > 0) {
		var target = this.divtag;
		var ul = document.createElement('ul');
		for (var i = 0; i < Math.min(items.length, this.maxcnt); i++) {
			var item = items.item(i);
			var title = item.getElementsByTagName('title').item(0);
			var auther = item.getElementsByTagName('auther').item(0);
			var category = item.getElementsByTagName('category').item(0);
			var link = item.getElementsByTagName('link').item(0);
			var date = item.getElementsByTagName('pubDate').item(0);

//mediaデータ生成
			if(mode == 'media'){
	                        var enclosure = item.getElementsByTagName('enclosure').item(0);
				if(enclosure.getAttribute('type') == 'application/x-shockwave-flash'){
					var media=document.createElement('embed');
					media.type=enclosure.getAttribute('type');
					media.wmode='transparent';
				}else{
        	                	var media=document.createElement('img');
					media.type=enclosure.getAttribute('type');
				}
                	        media.src=enclosure.getAttribute('url');
	                        media.alt=title.firstChild.data;
			}else{
				media = document.createTextNode(title.firstChild.data);
			}

			var li = document.createElement('li');
			var anchor = document.createElement('a');
			anchor.href = link.firstChild.data;
			anchor.appendChild(media);
			li.appendChild(anchor);
			if(auther){
				if(auther.firstChild){
                                        var buf=auther.firstChild.data.replace(/\[i:([0-9]+)\]/g , '');

			        	var text_aux = document.createTextNode(' ('+buf+')');
			        	li.appendChild(text_aux);
		        	}
		        }
		        if(category){
		        	if(category.firstChild){
                                        var buf=category.firstChild.data.replace(/\[i:([0-9]+)\]/g , '');
			        	var text_aux = document.createTextNode(' ('+buf+')');
					li.appendChild(text_aux);
				}
		        }
			ul.appendChild(li);
		}
		target.appendChild(ul);
		this.message = ul;
	} else {
		this.message = document.createTextNode('No Rss feed item available.');
		this.divtag.appendChild(this.message);
	}
};


RssReader.prototype.buildHTML_fromAtom = function() {
	var items = this.response.getElementsByTagName('entry');
	if (items.length > 0) {
		var target = this.divtag;
		var ul = document.createElement('ul');
		for (var i = 0; i < Math.min(items.length, this.maxcnt); i++) {
			var item = items.item(i);
			var title = item.getElementsByTagName('title').item(0);
			var links = item.getElementsByTagName('link');
			var date = item.getElementsByTagName('published').item(0);

			var li = document.createElement('li');
			var anchor = document.createElement('a');
			for (var j = 0; j < links.length; j++) {
				var link = links[j];
				var nodeName;
				var nodeValue;
				var href = null;
				var relalt = false;
	
				for (var k = 0; k < link.attributes.length; k++) {
					nodeName = link.attributes[k].nodeName;
					nodeValue = link.attributes[k].nodeValue;
					if (nodeName == 'rel' &&
						nodeValue == 'alternate') {
						relalt = true;
					} else if (nodeName == 'href') {
						href = nodeValue;
					}
				}
				if (relalt && href != null) {
					anchor.href = href;
				}
			}
			var text = document.createTextNode(title.firstChild.data);
			anchor.appendChild(text);
			li.appendChild(anchor);
			ul.appendChild(li);
		}
		target.appendChild(ul);
		this.message = ul;
	} else {
		this.message = document.createTextNode('No Rss feed item available.');
		this.divtag.appendChild(this.message);
	}
};
