/*
Requires: scripts/common.js
Requires: scriptaculous/lib/prototype.js
*/				
function RssReader()
{
	var self = this;
	this.feeds = {};
	var webServiceProxy = "";
	

	function init()
	{
		self.feeds = new rssFeeds();
	}
	
	this.setProxy = function(url)
	{
		webServiceProxy = url;
	}
	
	this.load = function()
	{
		self.feeds.load();
	}

	function rssFeeds()
	{
		var self = this;
		var myFeeds = [];
		this.add = function(id,url)
		{
			var feedIndex = getIndexOfId(id);
			var item;
			if(feedIndex == -1) //new Feed
			{
			    item = new rssFeed();
				item.id = id;
				item.URLs.add(url);
				myFeeds[myFeeds.length] = item;				
			}
			else //add into existing
			{
                item = myFeeds[feedIndex];
				item.URLs.add(url);
			}
			return item;
		}
		
		this.reload = function(id,urls)
		{
			var feedIndex = getIndexOfId(id);
			if(feedIndex == -1)
				return;
			
			if(urls.length>0)
			{
				var urls = urls.split(",");
				myFeeds[feedIndex].URLs.clear();
				for(var i=0;i<urls.length;i++)
				{
					myFeeds[feedIndex].URLs.add(urls[i]);
				}
			}
			myFeeds[feedIndex].load();
		}
				
		this.get = function(index)
		{
			return myFeeds[index];
		}
		
		this.getById = function(id)
		{
			var feedIndex = getIndexOfId(id);
			if(feedIndex == -1)
				return;
				
			return myFeeds[feedIndex];
		}
		
		this.count = function()
		{
			return myFeeds.length;
		}
		
		function getIndexOfId(id)
		{
			for(var i=0;i<self.count();i++)
			{
				if(id == self.get(i).id)
				{
					return i;
				}
			}
			return -1;
		}
		
		this.load = function()
		{
			for(var i=0;i<self.count();i++)
			{
				myFeeds[i].load();
			}
		}
		
		function rssFeed()
		{
			var self = this;
			this.id = "";
			this.maxItems = -1;
			this.maxItemsPerChannel = -1;
			this.showChannelLink = true;
			var onComplete = {};
			var blnShowChannelHeader = true;
			var blnShowChannelHeaderInItems = false;
			var blnShowItemPublishDateInItems = false;
			this.dateFormat = "";
			var channels = {};
			this.URLs = new rssURLs();
			
			this.showChannelHeader = function(val)
			{
				blnShowChannelHeader = val;
			}
		
			this.showChannelHeaderInItems = function(val)
			{
				blnShowChannelHeaderInItems = val;
			}
			
			this.showItemPublishDateInItems = function(val)
			{
				blnShowItemPublishDateInItems = val;
			}
			
			this.onComplete = function(func)
			{
				onComplete = func;
			}
			
			function rssURLs()
			{
				var self = this;
				var URLs = [];
				this.add = function(val)
				{
					URLs[URLs.length] = val;
				}
				
				this.get = function(index)
				{
					return URLs[index];
				}
				
				this.clear = function()
				{
					URLs = [];
				}
				
				this.count = function()
				{
					return URLs.length;
				}
			}
			
			function parseXML(data)
			{
			
				var rootNode = data.responseXML;
				var channelNodes = rootNode.getElementsByTagName("channel");
				var channelItemNodes;
				for(var i=0;i<channelNodes.length;i++)
				{
					channels.add(getNodeValue(channelNodes[i],"title"), getNodeValue(channelNodes[i],"description"), getNodeValue(channelNodes[i],"link"),getNodeValue(channelNodes[i],"pubDate"));
					channelItemNodes = channelNodes[i].getElementsByTagName("item");
					
					for(var j=0;j<channelItemNodes.length;j++)
					{
						if(self.maxItemsPerChannel>-1)
						{
							if(!(j<self.maxItemsPerChannel))
							break;
						}
						channels.get((channels.count()-1)).items.add(getNodeValue(channelItemNodes[j],"title"),getNodeValue(channelItemNodes[j],"description"), getNodeValue(channelItemNodes[j],"link"),getNodeValue(channelItemNodes[j],"pubDate"));
					}
				}
			}
			
			function showLoading(i)
			{
				var html = "";
				html += "<div id=\"loading" + i + "\" style=\"display:none;\">";
				html += "loading...";
				html += "<img src=\"" + appUrl + "/images/loading/loading_circle3_maroon.gif\"/>";
				html += "</div>";
				if($(self.id))
				{
					$(self.id).innerHTML = html;
					new Effect.Appear($("loading" + i));
				}
			}
			
			this.load = function()
			{
				channels = new rssChannels();
				if(self.URLs.count()>0)
					loadNext(0);
			}
			
			function render()
			{
				var html = "";
				var itemCount = 0;
				html += "<div class=\"rssContent\" style=\"height:100%;\">";
				html += "<ul>";
				if(channels.count()==0)
					html += "<li class=\"channelItem\" style=\"text-align:center;\">No Events Available.</li>";
				
				for(var i=0;i<channels.count();i++)
				{
					if(blnShowChannelHeader)
					{
                        html += "<li class=\"channelHeader\">";
						html += "<strong>" + channels.get(i).title + "</strong> ";
						html += "</li>";
						html += "<ul>";
					}
					
					for(var j=0;j<channels.get(i).items.count();j++)
					{
						itemCount++;
						if(self.maxItems > -1)
						{
							if(itemCount > self.maxItems)
							{
								continue;
							}
						}
					
						html +=	"<li class=\"channelItem\">";
						html +=	"<a href=\"" + channels.get(i).items.get(j).link + "\" target=\"_blank\">";
						if(blnShowChannelHeaderInItems)
							html += channels.get(i).title + " ";
						if(blnShowItemPublishDateInItems)
						{
							html += "(";
							if(self.dateFormat.length == 0)
								html += channels.get(i).items.get(j).pubDate;
							else
								html += new Date(channels.get(i).items.get(j).pubDate).format(self.dateFormat);
							html += ") ";
						}
						html += channels.get(i).items.get(j).title; 
						html += "</a>";
						html += "</li>";
					}
					
                    if(blnShowChannelHeader)
					{
					    html += "</ul>";
					}
					
					if(self.showChannelLink)
					{
						html += "<li class=\"channelHeader\"><strong><a id=\"" + self.id + "_channelLink" + i + "\" href=\"" + channels.get(i).link + "\" target=\"_blank\">&gt; show more...</a></strong></li>";
					}
				}
                html += "</ul>";				
				html += "</div>";
				$(self.id).innerHTML = html;
			}
			
			function loadNext(i)
			{
				showLoading(i);
				var url=self.URLs.get(i);
				var method="get";
				if(webServiceProxy.length > 0)
				{
					url = webServiceProxy + "?url=" + url;
					method="post";
				}
				
				new Ajax.Request(url, 
				{
					method: method,
					onSuccess : parseXML,
					onFailure : function()
					{
						$(self.ids[i]).innerHTML = requestFailed();
					},
					onComplete : function()
					{
						i++;
						if(i<self.URLs.count())
							loadNext(i);
						else
							postProcessing();
					}
				});
				
				
			}
			
			function postProcessing()
			{
				render();
				onComplete();
			}
			
			function rssChannels()
			{
				var self = this;
				var channels = [];
				
				this.add = function(title, description, link, pubDate)
				{
					channels[channels.length] = new rssChannel(title, description, link, pubDate);
				}
				
				this.get = function(index)
				{
					return channels[index];
				}			
				
				this.count = function()
				{
					return channels.length;
				}
				
				function rssChannel(title,description,link,pubDate)
				{
					var self = this;
					this.title = title;
					this.description = description;
					this.link = link;
					this.pubDate = pubDate;
					this.items = new rssItems();
					
					function rssItems()
					{
						var self = this;
						var items = [];
						
						this.add = function(title,description,link,pubDate)
						{		
							items[items.length] = new item(title,description,link,pubDate);
						}
						
						this.count = function()
						{
							return items.length;
						}
						
						this.get = function(index)
						{
							return items[index];
						}
						
						function item(title,description, link, pubDate)
						{
							var self = this;
							this.title = title;
							this.description = description;
							this.link = link;
							this.pubDate = pubDate;
						}
					}
				}
			}
		}
	}
	init();

}