var apollo_feed_data = [];
var apollo_feed_username;

function apollo_feed_init(feed_path, username)
{
    apollo_feed_username = username;
    var tables = document.getElementsByTagName("table");
    for(var i=0; i<tables.length; ++i)
    {
        if(tables[i].getAttribute("apollo_feed"))
        {
            var feed_arguments = tables[i].getAttribute("apollo_feed").split(":");
            var feed_data = [];
            var feed_name = feed_arguments.shift();
            for(var j=0; j<feed_arguments.length; ++j)
            {
                if(feed_arguments[j] == "horizontal")
                { feed_data["horizontal"] = true; }
                else if(feed_arguments[j].match(/^max=(\d+)/))
                { feed_data["max"] = RegExp.$1; }
            }
            feed_data["url"] = feed_path+"?u="+username+"&feed="+feed_name;
            if(feed_arguments.length)
            { feed_data["url"] += "&"+feed_arguments.join("&"); }
            feed_data["options"] = [];
            if( feed_name == "recent_in")
            { feed_data["refresh"] = 10; }
            else
            { feed_data["refresh"] = 900; }
            feed_data["ajax"] = apollo_feed_ajax();
            feed_data["queue"] = [];
            feed_data["latest_timestamp"] = 0;
            if(!tables[i].getAttribute("id"))
            { tables[i].setAttribute("id", "apollo_feed_"+i); }
            feed_data["table"] = tables[i].getAttribute("id");
            apollo_feed_data.push(feed_data);

            apollo_feed_start(feed_data);
        }
    }

    setTimeout("apollo_feed_update();", 10000);
    setTimeout("apollo_feed_process_queue();", 3000);
}

function apollo_feed_start(feed_data)
{
    var ajax = feed_data["ajax"];
    ajax.abort();
    ajax.open("GET", feed_data["url"], true);
    ajax.onreadystatechange = apollo_feed_process_initial;
    ajax.send(null);
}

function apollo_feed_process_initial()
{
    for(var i=0; i<apollo_feed_data.length; ++i)
    {
        var feed_data = apollo_feed_data[i];
        if(feed_data["ajax"].readyState == 4)
        {
            if(feed_data["ajax"].status == 200 && feed_data["ajax"].responseXML)
            {
                feed_data["last_refresh"] = apollo_feed_unixtime();

                var table = document.getElementById(feed_data["table"]);
                apollo_feed_removeChildren(table);
                var thead = document.createElement("thead");
                table.appendChild(thead);
                var tbody = document.createElement("tbody");
                table.appendChild(tbody);

                if(feed_data["horizontal"])
                { tbody.appendChild(document.createElement("tr")); }

                var root = apollo_feed_get_feed(feed_data["ajax"]);
                if(root)
                {
                    var entries = root.getElementsByTagName("entry");
                    for(var j=0; j<entries.length; ++j)
                    {
                        var entry = entries[j];
                        if(j==0)
                        { feed_data["latest_timestamp"] = entry.getElementsByTagName("updated")[0].firstChild.nodeValue; }
                        if(j<feed_data["max"])
                        { apollo_feed_add_entry(tbody, entry, feed_data["horizontal"], false); }
                    }
                }
            }
            else
            { setTimeout("apollo_feed_start(feed_data);", 5000); }
        }
    }
}

function apollo_feed_update()
{
    for(var i=0; i<apollo_feed_data.length; ++i)
    {
        var feed_data = apollo_feed_data[i];
        if(apollo_feed_unixtime() - feed_data["last_refresh"] <= feed_data["refresh"])
        { continue; }
        apollo_feed_data[i]["last_refresh"] = apollo_feed_unixtime();

        var ajax = feed_data["ajax"];
        ajax.abort();
        ajax.open("GET", feed_data["url"], true);
        ajax.onreadystatechange = apollo_feed_process_update;
        ajax.send(null);
    }

    setTimeout("apollo_feed_update();", 500);
}

function apollo_feed_process_update()
{
    for(var i=0; i<apollo_feed_data.length; ++i)
    {
        var feed_data = apollo_feed_data[i];
        if(feed_data["ajax"].readyState == 4 && feed_data["ajax"].status == 200 && feed_data["ajax"].responseXML)
        {
            feed_data["last_refresh"] = apollo_feed_unixtime();

            var root = apollo_feed_get_feed(apollo_feed_data[i]["ajax"]);
            if(root)
            {
                var entries = root.getElementsByTagName("entry");
                for(var j=0; j<entries.length; ++j)
                {
                    var entry = entries[entries.length-j-1];
                    var timestamp = entry.getElementsByTagName("updated")[0].firstChild.nodeValue;
                    if(timestamp >= feed_data["latest_timestamp"] &&
                    !document.getElementById("apollo_feed_entry_"+entry.getElementsByTagName("id")[0].firstChild.nodeValue))
                    {
                        feed_data["latest_timestamp"] = timestamp;
                        feed_data["queue"].push(entry);
                    }
                }
            }
        }
    }
}

function apollo_feed_process_queue()
{
    for(var i=0; i<apollo_feed_data.length; ++i)
    {
        var feed_data = apollo_feed_data[i];
        if(feed_data["queue"].length)
        {
            var tbody = document.getElementById(apollo_feed_data[i]["table"]).getElementsByTagName("tbody")[0];
            if(tbody)
            {
                apollo_feed_add_entry(tbody, feed_data["queue"].shift(), feed_data["horizontal"], true);
                apollo_feed_trim_table(tbody, feed_data["max"], feed_data["horizontal"]);
            }
        }
    }

    setTimeout("apollo_feed_process_queue();", 3000);
}

function apollo_feed_trim_table(tbody, max, horizontal)
{
    if(horizontal)
    {
        var row = tbody.firstChild;
        while(row.getElementsByTagName("td").length > max*2)
        {
            var cells = row.getElementsByTagName("td");
            row.removeChild(cells[cells.length-1]);
            row.removeChild(cells[cells.length-1]);
        }
    }
    else
    {
        while(tbody.getElementsByTagName("tr").length > max)
        {
            var rows = tbody.getElementsByTagName("tr");
            tbody.removeChild(rows[rows.length-1]);
        }
    }
}

function apollo_feed_add_entry(tbody, entry, horizontal, prepend)
{
    var enclosure_link = "";
    var item_link = "";
    var links = entry.getElementsByTagName("link");
    for(var k=0; k<links.length; ++k)
    {
        if(links[k].getAttribute("rel") == "enclosure")
        { enclosure_link = links[k].getAttribute("href"); }
    }

    var title = "";
    var title_elements = entry.getElementsByTagName("title");
    if(title_elements.length && title_elements[0].firstChild)
    { title = title_elements[0].firstChild.nodeValue; }
    var image_cell = document.createElement("td");
    var img = document.createElement("img");
    img.setAttribute("src", enclosure_link);
    image_cell.appendChild(img);
    image_cell.className = "apollo_feed_image_cell";
    var title_cell = document.createElement("td");
    title_cell.className = "apollo_feed_title_cell";
    title_cell.setAttribute("id", "apollo_feed_entry_"+entry.getElementsByTagName("id")[0].firstChild.nodeValue);
    title_cell.appendChild(document.createTextNode(title));

    var elements = [];
    var parent_element;
    if(!horizontal)
    {
        parent_element = tbody;
        var row = document.createElement("tr");
        row.appendChild(image_cell);
        row.appendChild(title_cell);
        elements.push(row);
    }
    else
    {
        parent_element = tbody.firstChild;
        elements.push(image_cell);
        elements.push(title_cell);
    }

    if(!prepend)
    {
        for(var i=0; i<elements.length; ++i)
        { parent_element.appendChild(elements[i]); }
    }
    else
    {
        for(var i=elements.length-1; i>=0; --i)
        { parent_element.insertBefore(elements[i], parent_element.firstChild); }
    }
}

function apollo_feed_unixtime()
{
    var date = new Date;
    return parseInt(date.getTime()/1000);
}

function apollo_feed_ajax()
{
    var xmlHttp;
    if(window.XMLHttpRequest)
    {
        try
        { xmlHttp = new XMLHttpRequest(); }
        catch(e)
        { xmlHttp = false; }
    }
    //ActiveX
    else if(window.ActiveXObject)
    {
        try
        { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); }
        catch(e)
        {
            try
            { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); }
            catch(e)
            { xmlHttp = false; }
        }
    }

    return xmlHttp;
}

function apollo_feed_removeChildren(object)
{
    if(object)
    {
        while(object.firstChild)
        { object.removeChild(object.firstChild); }
    }
}

function apollo_feed_get_feed(xmlHttpElement)
{
    var feed;

    try
    { feed = xmlHttpElement.responseXML.getElementsByTagName("feed")[0]; }
    catch(err)
    {
        var xmldoc = apollo_feeds_text_to_xml(xmlHttpElement.responseText);
        feed = xmldoc.getElementsByTagName("feed")[0];
    }

    if(!feed)
    {
        var xmldoc = apollo_feeds_text_to_xml(xmlHttpElement.responseText);
        feed = xmldoc.getElementsByTagName("feed")[0];
    }

    return feed;
}

function apollo_feeds_text_to_xml(text)
{
    var xmldoc;
    try
    {
        xmldoc = new ActiveXObject("Microsoft.XMLDOM");
        xmldoc.async = "false";
        xmldoc.loadXML(text);
    }
    catch(err)
    {
// alert(err.message);
        try
        {
            var parser = new DOMParser();
            xmldoc = parser.parseFromString(text, "text/xml");
        }
        catch(err2)
        {
// alert(err2.message);
            xmldoc = null;
        }
    }

    return xmldoc;
}
