var xml_cache = {}

function string_to_xml(text){
    var xmlDoc = null;
    try {
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async="false";
        xmlDoc.loadXML(text);
    } catch(e) {
        try {
            parser=new DOMParser();
            xmlDoc=parser.parseFromString(text,"text/xml");
        } catch(e) {
            alert(e.message);
            return;
        }
    }
    return xmlDoc;
}

function add_template(xml_name, parent, data){
    var request                                                                     = {};
    request['file_name']                                                            = xml_name;
    var options = {
        method:    'post',
        async:     false,
        url:       'php/echo.php',
        data:      request,
        onSuccess: function(text){
            xml_cache[xml_name] = text;
            if (data != null) text = new Template(text, data);
            var xmlDoc = string_to_xml(text.template || text);
            var html = xmlDoc.getElementsByTagName('root')[0];
            add_xhtml(html, $(parent));
        }
    }
    if (xml_cache[xml_name]){
        var text = (data != null)? new Template(xml_cache[xml_name], data): xml_cache[xml_name];
        var xmlDoc = string_to_xml(text.template || text);
        var html = xmlDoc.getElementsByTagName('root')[0];
        add_xhtml(html, $(parent));
    } else {
        var submit = new Request(options).send();
    }
}

function add_xhtml(object, parent){
    for (var i=0; i<object.childNodes.length; i++){
        var node = null;
        if (object.childNodes[i].nodeName == "#text"){
            var text = (object.childNodes[0].nodeValue == null)? '': object.childNodes[0].nodeValue;
            node = document.createTextNode(text);
        } else {
            if (Browser.Engine.trident){
                var nodename = object.childNodes[i].nodeName;
                var obj = "<" + nodename + " ";
                for (var j=0; j<object.childNodes[i].attributes.length; j++){
                    obj += object.childNodes[i].attributes[j].nodeName + "=\"" + object.childNodes[i].attributes[j].nodeValue + "\" ";
                }
                obj += "<" + nodename + " />";
                node = document.createElement(obj);
            } else {
                var properties = {}
                for (var j=0; j<object.childNodes[i].attributes.length; j++){
                    properties[object.childNodes[i].attributes[j].nodeName] = object.childNodes[i].attributes[j].nodeValue;
                }
                node = new Element(object.childNodes[i].nodeName, properties);
            }
        }
        parent.appendChild(node);
        if (object.childNodes[i].childNodes.length > 0){
            add_xhtml(object.childNodes[i], node);
        }
    }
}