//AtomDate parsing code from: http://www.ibm.com/developerworks/library/x-atom2json.html
AtomDate = Class.create(); 
AtomDate.pattern = /^(\d{4})(?:-(\d{2}))?(?:-(\d{2}))?(?:[Tt](\d{2}):(\d{2}):(\d{2})(?:\.(\d*))?)?([Zz])?(?:([+-])(\d{2}):(\d{2}))?$/; 
AtomDate.localoffset = (new Date()).getTimezoneOffset(); 
AtomDate.padding = function(val,char,count) { 
  var value = ""; 
  while(count > 0) { 
    if (val < Math.pow(10,count)) value = char + value; 
    count--; 
  } 
  return value + val; 
};
AtomDate.parse = function(val) { 
  if (!val) throw "Invalid Date"; 
  if (val instanceof Date) return val; 
  var m = AtomDate.pattern.exec(val); 
  var year = new Number(m[1]?m[1]:0); 
  var month = new Number(m[2]?m[2]:0); 
  var day = new Number(m[3]?m[3]:0); 
  var hour = new Number(m[4]?m[4]:0); 
  var minute = new Number(m[5]?m[5]:0); 
  var second = new Number(m[6]?m[6]:0); 
  var millis = new Number(m[7]?m[7]:0); 
  var gmt = m[8]; 
  var dir = m[9]; 
  var offhour = new Number(m[10]?m[10]:0); 
  var offmin = new Number(m[11]?m[11]:0); 
  
  if (dir && offhour && offmin) { 
    var offset = ((offhour * 60) + offmin); 
    if (dir == "+") { 
      minute -= offset; 
    } else if (dir == "-") { 
      minute += offset; 
    } 
  } 
  return new Date(Date.UTC(year,month,day,hour,minute,second,millis)); 
};

DIIrss = function() {	
	function sortAndPackageFeed(feedarray)
	{
		feedarray.sort(function () {return arguments[0][1] < arguments[1][1]});
		var result = [];
		for (var i=0; i < Math.min(5, feedarray.length); ++i)
		{
			result.push({ title: feedarray[i][0],
				          link: feedarray[i][2] });
		}
		return result;		
	}
	
	function getFeedReader(type)
	{
		switch (type)
		{
			case 'rss': return {
				read: function(xmlDOM) {
					var items = xmlDOM.getElementsByTagName('item');
					var feedarray = [];
					for (var i=0; i<items.length; ++i)
					{
						var title = items[i].getElementsByTagName('title').item(0).firstChild.data;
						var pubdate = Date.parse(items[i].getElementsByTagName('pubDate').item(0).firstChild.data);
						var link = items[i].getElementsByTagName('link').item(0).firstChild.data;
						feedarray.push([title, pubdate, link]);
					}
					return sortAndPackageFeed(feedarray);
				}
			}
			case 'atom': return {
				read: function(xmlDOM) {
					var items = xmlDOM.getElementsByTagName('entry');
					var feedarray = [];
					for (var i=0; i<items.length; ++i)
					{
						var title = items[i].getElementsByTagName('title').item(0).firstChild.data;
						var pubdate = AtomDate.parse(items[i].getElementsByTagName('published').item(0).firstChild.data);
						var links = items[i].getElementsByTagName('link');
						var link = "";
						var j=0;
						var found = false;
						while ((j<links.length) && (found == false))
						{
							for(var k=0;k<links[j].attributes.length;++k)
							{
								switch (links[j].attributes[k].nodeName)
								{
									case 'rel': found = true;
									case 'href': link = links[j].attributes[k].nodeValue;
								}
							}
							if (found == false) link = "";
							++j;
						}
						feedarray.push([title, pubdate, link]);
					}
					return sortAndPackageFeed(feedarray);
				}
			}
		}
	}
	
	function readFeed(type, xmlDOM)
	{
		var reader = getFeedReader(type);
		return reader.read(xmlDOM);
	}
	
	function determineFeedType(xmlDOM)
	{
		switch (xmlDOM.documentElement.nodeName)
		{
			case 'rss': return 'rss'
			case 'feed': return 'atom'
		}
	}
	
	var feed_block = null;
	
	function loadHelper(request) {
		var feed_format = determineFeedType(request.responseXML);
		feed_block({ format: feed_format,
			         items: readFeed(feed_format, request.responseXML) });
	}
	
	return {
		loadFeed: function(url, block) {
			feed_block = block;
			new Ajax.Request(url, {
				method: 'get',
				asynchronous: false,
				onComplete: loadHelper.bind(this)
			});
		}
	}
}();

