﻿/* --- RSSReader --- */

function RSSReader(proxy) {

    // internal code
    
    this.proxy = proxy;
    var thisObj = this;
    
    var agent = new AjaxAgent();
    var valueBindingRegex = new RegExp("#[{][^#]*}#");
    function onResultSet() {}

    this.appendExternalNode = function(parent, node) { 
       if(node.nodeType==3) {
           parent.appendChild(parent.ownerDocument.createTextNode(node.nodeValue));
        } else if(node.nodeType==1) {
           var newNode = parent.ownerDocument.createElement(node.nodeName);
           parent.appendChild(newNode);
           var i = 0;
           for(i = 0; i < node.childNodes.length; i++) {
                this.appendExternalNode(newNode, node.childNodes[i]);
           }
           for(i = 0; i < node.attributes.length; i++) {
                newNode.setAttribute(node.attributes[i].name, node.attributes[i].value);
           }
        }
    }

    this.rssHandler = function(response, responseText, data) {
        var items = response.getElementsByTagName("item");
        var rs = new Array();
        var r = null;
        for(var i = 0; i < items.length && i < data.itemNumber; i++) {
           r = new Object();
           rs.push(r);
           for(var j = 0; j < items[i].childNodes.length; j++) {
                var node = items[i].childNodes[j];
                if(node.nodeType == 1) r[node.nodeName.toLowerCase()] = (node.firstChild==null)?"":node.firstChild.nodeValue;
           }
        }
        onResultSet(rs);
        data.rs = rs;
        agent.request(data.renderTemplate, thisObj.renderHtml, data);
    }
    this.renderHtml = function(renderTemplate, renderTemplateText, data) {
        var rs =            data.rs;
        var loadHandler =   data.loadHandler
        var handlerDataObj= data.dataObj;
        renderTemplate = renderTemplate.getElementsByTagName("template-root")[0];
        var itemRenderTemplate = renderTemplate.getElementsByTagName("template-item")[0];
        var parentNode = itemRenderTemplate.parentNode;
        var itemChildNodes = null;
        var i = 0;
        parentNode.removeChild(itemRenderTemplate);
        thisObj.doValueBindings(renderTemplate);
        for(i = 0; i < rs.length; i++) {
            itemChildNodes = thisObj.renderItem(rs[i], itemRenderTemplate).childNodes;
            for(var j = 0; j < itemChildNodes.length; j++) {
               thisObj.appendExternalNode(parentNode, itemChildNodes[j]);
            }
        }
        var renderContainer = document.createElement("renderContainer");
        for(i = 0; i < renderTemplate.childNodes.length; i++) {
            thisObj.appendExternalNode(renderContainer, renderTemplate.childNodes[i]);
        }
        loadHandler(renderContainer.innerHTML, handlerDataObj);
    }
    this.renderItem = function(item, itemRenderTemplate) {
        var output = itemRenderTemplate.cloneNode(true);
        this.doValueBindings(output, item); 
        return output;
    }
    this.doValueBindings = function(node, item) {
        if(node.nodeType == 3) {
            node.nodeValue = this.bindValues(node.nodeValue, item);
        } else if(node.nodeType==1) {
            var i = 0;
            for(i = 0; i < node.attributes.length; i++) {
                node.attributes[i].value = this.bindValues(node.attributes[i].value, item);
            }
            for(i = 0; i < node.childNodes.length; i++) {
                this.doValueBindings(node.childNodes[i], item);
            }
        }
    }
    this.bindValues = function(text, item) {
         var matchResult = null;
         var bindingResult = null;
         while((matchResult = valueBindingRegex.exec(text))!=null) { 
            bindingResult = eval( matchResult[0].substr(2, matchResult[0].length-4) );
            text = text.replace( matchResult[0], (bindingResult==null)?"":bindingResult );
         }
         return text;
    }

    // interface functions

    this.loadRss = function (rssUrl, itemNumber, renderTemplate, loadHandler, dataObj) {
        agent.request(this.proxy+"?url="+rssUrl, this.rssHandler, {itemNumber:itemNumber, renderTemplate:renderTemplate, loadHandler:loadHandler, dataObj:dataObj});
    }
}