/* 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($){
	
	var $div = $("<div/>");
	jQuery.getFeed = function(options){
	
		options = jQuery.extend({
		
			url: null,
			data: null,
			success: null,
			complete: null,
			error: null
		
		}, options);
		
		if (options.url) {
			$.ajax({
				type: 'GET',
				url: options.url,
				data: options.data,
				dataType: ($.browser.msie) ? "text" : "xml",
				success: function(data){
					var xml;
					if (typeof data == "string") {
						xml = new ActiveXObject("Microsoft.XMLDOM");
						xml.async = false;
						xml.loadXML(data);
					} else {
						xml = data;
					}
					var feed = new JFeed(xml);
					
					if (jQuery.isFunction(options.success)) 
						options.success(feed);
				},
				error: function(XMLHttpRequest, textStatus, errorThrown){
					if(jQuery.isFunction(options.error)) options.error(XMLHttpRequest, textStatus, errorThrown);
				}
			});
		}
	};
	
	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: '',
		content: '',
		updated: '',
		id: ''
	};
	
	function JAtom(xml){
		this._parse(xml);
	};
	
	JAtom.prototype = {
	
		_parse: function(xml){
		
			var $channel = jQuery(jQuery('feed', xml).eq(0));
			
			this.version = '1.0';
			this.title = $channel.find('title:first').text();
			this.link = $channel.find('link:first').attr('href');
			this.description = $channel.find('subtitle:first').text();
			this.language = $channel.attr('xml:lang');
			this.updated = $channel.find('updated:first').text();
			
			this.items = new Array();
			
			var feed = this;
			
			jQuery('entry', xml).each(function(){
			
				var item = new JFeedItem();
				var $this = jQuery(this);
				item.title = $this.find('title').eq(0).text();
				item.link = $this.find('link').eq(0).attr('href');
				item.description =$this.find('summary').eq(0).text();
				item.content = $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(jQuery('channel', xml).eq(0));
			
			this.title = $channel.find('title:first').text();
			this.link = $channel.find('link:first').text();
			this.description = $channel.find('description:first').text();
			this.language = $channel.find('language:first').text();
			this.updated = $channel.find('lastBuildDate:first').text();
			
			this.items = new Array();
			
			var feed = this;
			jQuery('item', xml).each(function(){
				var item = new JFeedItem();
				var $this = jQuery(this);
				item.title = $this.find('title').eq(0).text();
				item.link = $this.find('link').eq(0).text();
				item.description = $this.find('description').eq(0).text();
				item.content = $this.find('[nodeName=content:encoded]').eq(0).text();
				item.updated = $this.find('pubDate').eq(0).text();
				item.id = $this.find('guid').eq(0).text();
				
				feed.items.push(item);
			});
		}
	};
})(jQuery);
