/*
 * rss200.js
 * A RSS 2.0 API wrapper
 *
 * Copyright (C) 2005 Gustavo Marin (gustavoandresmarin@gmail.com)
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2.1 of the License, or
 * (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

/*** CONFIG BEGINS HERE ***/

var RSS_PROXY_URL = '/lfvr/rss.proxy.php';
var RSS_ERR_CODE  = '999';
var RSS_ERR_MSG   = 'Unknown error';

/*** CONFIG END HERE ***/

function rssAPI_Base()
{
    this.feeds = function feeds(){};
}


var rssAPI = new rssAPI_Base();
var rssAPI_Parser = new rssAPI_Base();


rssSACK = function(method)
{
    var s = new sack(RSS_PROXY_URL);
    s.method = method;
    s.call = s.runAJAX;

    onLoading = function(){};
    onLoaded = function(){};
    onInteractive = function(){};
    onCompletion = function(){};

    s.isError = function(xml)
    {
        var stat = xml.getElementsByTagName('rss').item(0);
        if (!stat) { this.error = {error:RSS_ERR_CODE,msg:RSS_ERR_MSG+'\n\n'+this.response}; return true; }
        stat = stat.getAttribute('version');
        if(stat != '2.0')
        {
//            var err = xml.getElementsByTagName('err').item(0).getAttribute('code');
//            var msg = xml.getElementsByTagName('err').item(0).getAttribute('msg');
            var err = RSS_ERR_CODE;
            var msg = RSS_ERR_MSG+'\n\nNot RSS2.0';
            this.error = {error:err,msg:msg};
            return true;
        }
        else
            return false;
    };

    s.setCallback = function(parser,callback,args)
    {
        var result=(s.isError(s.responseXML))?s.error:parser(s.responseXML); 
        callback(result,args);
    }

    s.onLoading = onLoading;
    s.onLoaded = onLoaded;
    s.onInteractive = onInteractive;
    s.onCompletion = onCompletion;
    return s;
}

/* 
 * Extra functionality
 * --------------------------------------------------------*/
rssAPI.setExtras = function(e){ this.extras = e; }


rssAPI.feeds.getItems = function(callback,args,url)
{
    var s = new rssSACK('GET');
    s.onCompletion = function(){ s.setCallback(rssAPI_Parser.feeds.rss200,callback,args); }
    s.call(url);
};

/*
rssAPI.feeds.photosComments = function(callback,args,id,format)
{
    var s = new rssSACK('GET');
    s.setVar('feedurl', 'http://www.flickr.com/photos_comments_feed.gne?');
    s.setVar('user_id',id);
    s.setVar('format',format);
    s.onCompletion = function(){ s.setCallback(rssAPI_Parser.flickr.comments,callback,args); }
    s.call();
};
*/

rssAPI_Parser.feeds.rss200 = function(xml)
{
    var result = new Object();
    var xmlItems = xml.getElementsByTagName('item');
    var items = new Array();
    result.title = xml.getElementsByTagName('title').item(0).firstChild.data;
    result.link = xml.getElementsByTagName('link').item(0).firstChild.data;
    if( xml.getElementsByTagName('description').item(0).firstChild ) 
	result.description = xml.getElementsByTagName('description').item(0).firstChild.data;
    else result.description = '';
    for(var x=0;x<xmlItems.length;x++)
    {
        var title = xmlItems.item(x).getElementsByTagName('title').item(0).firstChild.data;
        var link = xmlItems.item(x).getElementsByTagName('link').item(0).firstChild.data;
        var description = '' + xmlItems.item(x).getElementsByTagName('description').item(0).firstChild.data;
        var pubDate = xmlItems.item(x).getElementsByTagName('pubDate').item(0).firstChild.data;
        var author = xmlItems.item(x).getElementsByTagName('author').item(0).firstChild.data;
        items[items.length] = {
                title:title,
                link:link,
                description:description,
                pubDate:pubDate,
                author:author };
    }
    result.items = items;

    return result;
};

