/*****************************************************************
 * Javascript Rss/Atom Feed Reader Object			
 * ---------------------------------------------	
 * Author : Kevin Prud'homme
 * Date : Wed, 30 May 2007
 *
 * Compatibility with :
 *	- Atom Syndication Format (http://www.w3.org/2005/Atom)
 *  - RSS 2.0
 ***********************************************/
function RssReader( xmlDocument )
{
    this._x = xmlDocument;
    this._format = "rss";
    this._skin = null;
    var n = this._x.getElementsByTagName( "feed" )
    if( n[0] && n[0].getAttribute( "xmlns" ).toLowerCase() == "http://www.w3.org/2005/atom" )
		this._format = "atom";
}
RssReader.prototype.Render = function( n, z )
{
    var tab = new Array();
    var items = null;
    if( this._format == "atom" ) items = this._x.getElementsByTagName( "entry" );
    else if( this._format == "rss" ) items = this._x.getElementsByTagName( "item" );
    var t = this._skin.item;
    var a = this._skin.alternate ? this._skin.alternate : t;
    if( !z && z != 0 )
	{
		if( n <= 0 ) z = items.length;
		else z = n;
		n = 0;
	}
	else
	{
		if( z <= 0 || z <= n ) z = items.length;
		if( n < 0 ) n = 0; 
	}
    for( var i = n ; i < z ; i++ )
    {
        if( items[i] )
        {   
            var item = new Object();
            this.BuildItem( item, items[i] );
            tab[tab.length] = Cuke.ApplyTemplate( i % 2 ? a : t, item );
        }
        else break;
    }
    return this._skin.header + tab.join(this._skin.separator) + this._skin.footer;
};
RssReader.prototype.BuildItem = function( Container, xmlNode )
{
	var atom = this._format == "atom";
	function GetValue( xmlNode, nodeName, nodeAttribute )
	{
		var n = xmlNode.getElementsByTagName( nodeName );
		if( n.length && (n=n[0]) ) 
		{
			if( nodeAttribute ) return n.getAttribute( nodeAttribute );
			return n.firstChild.nodeValue;
		}
		return "";
	}
	function ExtractDate( xmlNode )
	{
		if( atom ) 
		{
			var n = xmlNode.getElementsByTagName( "updated" );
			if( !n.length ) n = xmlNode.getElementsByTagName( "published" );
			if( !n.length ) n = xmlNode.getElementsByTagName( "modified" );
			if( !n.length ) n = xmlNode.getElementsByTagName( "issued" );
			if( !n.length ) n = xmlNode.getElementsByTagName( "created" );
			if( n.length && (n=n[0]) ) return n.firstChild.nodeValue;
			return "";
		}
		else
		{
			var n = xmlNode.getElementsByTagName( "pubDate" );
			if( n.length && (n=n[0]) ) return n.firstChild.nodeValue;
			return "";
		}
		return "";
	}
	function ExtractLink( e )
	{
		var n = xmlNode.getElementsByTagName( "link" );
		if( n.length && (n=n[0]) ) 
		{
			if( atom ) return n.getAttribute( "href" );
			return n.firstChild.nodeValue;
		}	
		return "";
	}
	return eval( this._skin.proc );
};
RssReader.prototype.BuildSkin = function( x )
{
    var i = x.getElementsByTagName( "Item" )[0];
    if( !i ) return null;
    var a = x.getElementsByTagName( "AlternateItem" )[0];
    var h = x.getElementsByTagName( "Header" )[0];
    var s = x.getElementsByTagName( "Separator" )[0];
    var f = x.getElementsByTagName( "Footer" )[0];
    var p = x.getElementsByTagName( "Data" )[0];
    i = i.firstChild.nodeValue;
    a = a ? a.firstChild.nodeValue : "";
    h = h ? h.firstChild.nodeValue : "";
    s = s ? s.firstChild.nodeValue : " ";
    f = f ? f.firstChild.nodeValue : "";
    p = p ? p.firstChild.nodeValue : "";
    return {header:h,item:i,alternate:a,separator:s,footer:f,proc:p};
};
RssReader.prototype.LoadSkin = function( u )
{
    u = Cuke.GetUrl( Cuke.Skin + u );
    if( u ) this._skin = this.BuildSkin( u );
    if( !this._skin ) this._skin = {header:"",item:"##Container.date## - ##Container.title##",alternate:"",separator:" ",footer:"",proc:""};
    if( !this._skin.proc ) this._skin.proc = 'item.title=GetValue(xmlNode,"title");item.date=ExtractDate(xmlNode);item.link=ExtractLink(xmlNode);';
    if( !this._skin.alternate ) this._skin.alternate = this._skin.item;
};
