/* jFeed : jQuery feed parser plugin
 * Copyright (C) 2007 Jean-François Hovinne - http://www.hovinne.com/
 * Dual licensed under the MIT (MIT-license.txt)
 * and GPL (GPL-license.txt) licenses.
 */
(function($) {
	jQuery.getFeed = function(options) {
		options = jQuery.extend( {
			url : null,
			data : null,
			success : null
		}, options);
		if (options.url) {
			$.ajax( {
						type : 'GET',
						url : options.url,
						data : options.data,
						dataType : 'xml',
						success : function(xml) {
							var feed = new JFeed(xml);
							if (jQuery.isFunction(options.success))
								options.success(feed);
						},
						error : function(xhr, textStatus, err) {
							showError('an unknown error occurred while trying to fetch the feed: ' + xhr.status);
						}
					});
		}
	};
	function JFeed(xml) {
		if (xml)
			this.parse(xml);
	}
	;
	JFeed.prototype = {
		type : '',
		version : '',
		title : '',
		link : '',
		description : '',
		parse : function(xml) {
			if (jQuery('channel', xml).length == 1) {
				this.type = 'rss';
				var feedClass = new JRss(xml);
			} else if (jQuery('feed', xml).length == 1) {
				this.type = 'atom';
				var feedClass = new JAtom(xml);
			}
			if (feedClass)
				jQuery.extend(this, feedClass);
		}
	};
	function JFeedItem() {
	}
	;
	JFeedItem.prototype = {
		title : '',
		link : '',
		description : '',
		updated : '',
		id : ''
	};
	function JAtom(xml) {
		this._parse(xml);
	}
	;
	JAtom.prototype = {
		_parse : function(xml) {
			var channel = jQuery('feed', xml).eq(0);
			this.version = '1.0';
			this.title = jQuery(channel).find('title:first').text();
			this.link = jQuery(channel).find('link:first').attr('href');
			this.description = jQuery(channel).find('subtitle:first').text();
			this.language = jQuery(channel).attr('xml:lang');
			this.updated = jQuery(channel).find('updated:first').text();
			this.items = new Array();
			var feed = this;
			jQuery('entry', xml).each(function() {
				var item = new JFeedItem();
				$this = $(this);
				item.title = $this.find('title').eq(0).text();
				item.link = $this.find('link').eq(0).attr('href');
				item.description = $this.find('content').eq(0).text();
				item.updated = $this.find('updated').eq(0).text();
				item.id = $this.find('id').eq(0).text();
				feed.items.push(item);
			});
		}
	};
	function JRss(xml) {
		this._parse(xml);
	}
	;
	JRss.prototype = {
		_parse : function(xml) {
			if (jQuery('rss', xml).length == 0)
				this.version = '1.0';
			else
				this.version = jQuery('rss', xml).eq(0).attr('version');
			var channel = jQuery('channel', xml).eq(0);
			this.title = jQuery(channel).find('title:first').text();
			this.link = jQuery(channel).find('link:first').text();
			this.description = jQuery(channel).find('description:first').text();
			this.language = jQuery(channel).find('language:first').text();
			this.updated = jQuery(channel).find('lastBuildDate:first').text();
			this.items = new Array();
			var feed = this;
			jQuery('item', xml).each(
					function() {
						var item = new JFeedItem();
						$this = $(this);
						item.title = $this.find('title').eq(0).text();
						item.link = $this.find('link').eq(0).text();
						item.pubDate = new Date($this.find('pubDate').eq(0).text());
						item.description = $this.find('description').eq(0).text();
						item.updated = $this.find('pubDate').eq(0).text();
						item.id = $this.find('guid').eq(0).text();
						feed.items.push(item);
					});
		}
	};
})(jQuery);

