/* 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.
 */

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);
			}
		});
	}
};

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: ''*/
	title: '',
	link: '',
	description: '',
	updated: '',
	id: '',
	category: '',
	creator: '',
	source: ''
};

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();
			
			item.title = jQuery(this).find('title').eq(0).text();
			item.link = jQuery(this).find('link').eq(0).attr('href');
			item.description = jQuery(this).find('content').eq(0).text();
			item.updated = jQuery(this).find('updated').eq(0).text();
			item.id = jQuery(this).find('id').eq(0).text();
			//item.source = jQuery(this).find('source').eq(0).text(); //new 4/23/09... added Ian Collins
			item.category = jQuery(this).find('category').eq(0).text(); //new 4/23/09... added Ian Collins
			item.creator = jQuery(this).find('dc\\:creator').eq(0).text(); //new 5/27/09... added Ian Collins
			item.source = jQuery(this).find("[nodeName=news\\:source]").text(); //new 7/27/11... added Ian Collins
			
			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();
			
			item.title = jQuery(this).find('title').eq(0).text();
			item.link = jQuery(this).find('link').eq(0).text();
			item.description = jQuery(this).find('description').eq(0).text();
			item.updated = jQuery(this).find('pubDate').eq(0).text();
			item.id = jQuery(this).find('guid').eq(0).text();
			//item.source = jQuery(this).find('source').eq(0).text(); //new 4/23/09... added Ian Collins
			item.category = jQuery(this).find('category').eq(0).text(); //new 4/23/09... added Ian Collins
			item.creator = jQuery(this).find('dc\\:creator').eq(0).text(); //new 5/27/09... added Ian Collins
			item.source = jQuery(this).find("[nodeName=news\\:source]").text(); //new 7/27/11... added Ian Collins
			
			feed.items.push(item);
		});
	}
};


