﻿/**
*
*  uno.xml.render.js v 0.0.4.0  (Part of [uno-js].)
*
*  Released by Hideki Yamamoto - LGPL equiv.
*
**/

if (!uno.xml) { alert('uno.xml.render.js requires uno.xml.loader.js'); }
if (!uno.xml.nodexml) { alert('uno.xml.render.js requires uno.xml.reader.js'); }

uno.xml.pagetarget='supercontainer';
uno.xml.rendertimestep=450;
uno.xml.renderpage = function(dataurl){uno.xml.asyncload(dataurl,false,uno.xml._renderpage,false);};
uno.xml.rendercontent = function(elm,dataurl){var pidx=uno.xml.processes.length;uno.xml.processes[pidx]=new uno.xml.process('content',elm,false,dataurl,false);uno.xml.startprocess(pidx);};
uno.xml.rendercontrol = function(elm,configurl,dataurl){var pidx=uno.xml.processes.length;uno.xml.processes[pidx]=new uno.xml.process('control',elm,configurl,dataurl,false);uno.xml.startprocess(pidx);};
uno.xml.renderpagepost = function(dataurl,form){uno.xml.asyncloadpost(dataurl,form,false,uno.xml._renderpage,false);};
uno.xml.rendercontentpost = function(elm,dataurl,form){var pidx=uno.xml.processes.length;uno.xml.processes[pidx]=new uno.xml.process('content',elm,false,dataurl,pp);uno.xml.startprocess(pidx);};
uno.xml.rendercontrolpost = function(elm,configurl,dataurl,form){var pidx=uno.xml.processes.length;uno.xml.processes[pidx]=new uno.xml.process('control',elm,configurl,dataurl,pp);uno.xml.startprocess(pidx);};
//////////////////////////////////////////////////////////////////////////////////
uno.xml._renderpage = function(req) {
    try {
        var e; var data = req.responseXML.documentElement;
        var nodes = null;
        nodes = data.getElementsByTagName('icon');
        for (e = 0; e < nodes.length; e++) { uno.importwebicon(uno.xml.nodetext(nodes[e])); }
        nodes = data.getElementsByTagName('title');
        for (e = 0; e < nodes.length; e++) { uno.setitle(uno.xml.nodeinnerxml(nodes[e], true)); }
        nodes = data.getElementsByTagName('style');
        for (e = 0; e < nodes.length; e++) { uno.importcss(uno.xml.nodetext(nodes[e])); }
        nodes = data.getElementsByTagName('script');
        for (e = 0; e < nodes.length; e++) { uno.importscript(uno.xml.nodetext(nodes[e])); }
        nodes = data.getElementsByTagName('html');
        var elm = $(uno.xml.pagetarget);
        elm.innerHTML = uno.xml.nodeinnerxml(nodes[0], true);
        nodes = data.getElementsByTagName('content');
        var tgt = ''; var curl = ''; var durl = ''; var timeout=200;
        for (e = 0; e < nodes.length; e++) {
            tgt = uno.xml.childinnerxml(nodes[e], 'target');
            durl = uno.xml.childinnerxml(nodes[e], 'dataurl');
            setTimeout('uno.xml.rendercontent(' + tgt + ',' + durl + ');', timeout);
            timeout += uno.xml.rendertimestep;
        }
        nodes = data.getElementsByTagName('control');
        for (e = 0; e < nodes.length; e++) {
            tgt = uno.xml.childinnerxml(nodes[e], 'target');
            curl = uno.xml.childinnerxml(nodes[e], 'ctrurl');
            durl = uno.xml.childinnerxml(nodes[e], 'dataurl');
            setTimeout('uno.xml.rendercontrol(' + tgt + ',' + curl + ',' + durl + ');', timeout);
            timeout += uno.xml.rendertimestep;
        }
        nodes = data.getElementsByTagName('onload');
        for (e = 0; e < nodes.length; e++) { eval(uno.xml.nodeinnerxml(nodes[e], true)); }
    } catch (ex) { if (uno.dialog) { uno.dialog.show('Error', ex.message + '<br />Response :<br />' + req.responseText, 'error'); } else { alert(ex.message); } }
};
uno.xml._rendercontent = function(pidx,req){
    var p = uno.xml.processes[pidx];uno.clearchilds(p.elm);var written = false;
    try{var nodes;
            var ctc = req.responseXML.documentElement.getElementsByTagName('html')[0];
            p.elm.innerHTML = uno.xml.nodeinnerxml(ctc, true);
            written = true;
            var tgt = ''; var curl = ''; var durl = ''; var timeout = 200;
            nodes = req.responseXML.documentElement.getElementsByTagName('content');
            for (e = 0; e < nodes.length; e++) {
                tgt = uno.xml.childinnerxml(nodes[e], 'target');
                durl = uno.xml.childinnerxml(nodes[e], 'dataurl');
                setTimeout('uno.xml.rendercontent(' + tgt + ',' + durl + ');', timeout);
                timeout += uno.xml.rendertimestep;
            }
            nodes = req.responseXML.documentElement.getElementsByTagName('control');
            for (e = 0; e < nodes.length; e++) {
                tgt = uno.xml.childinnerxml(nodes[e], 'target');
                curl = uno.xml.childinnerxml(nodes[e], 'ctrurl');
                durl = uno.xml.childinnerxml(nodes[e], 'dataurl');
                setTimeout('uno.xml.rendercontrol(' + tgt + ',' + curl + ',' + durl + ');', timeout);
                timeout += uno.xml.rendertimestep;
            }
            nodes = req.responseXML.documentElement.getElementsByTagName('onload');
            for (e = 0; e < nodes.length; e++) { try { eval(uno.xml.nodeinnerxml(nodes[e], true)); } catch (exxx) { i = 0; }; }
        } catch (exx) {
            if (written == false) { p.elm.innerHTML = req.responseText; }
       }
};
uno.xml.processes = new Array(); uno.xml._h1s = new Array(); uno.xml._h2s = new Array();
uno.xml.process = function(ptype,elm,configurl,dataurl,pp){this.ptype=ptype;this.elm=$(elm);this.configurl=configurl;this.dataurl=dataurl;this.pp=pp;this.config=null;this.data=null;};
uno.xml.startprocess = function(pidx) {
    uno.xml._h1s[pidx]=function(node){uno.xml.continueprocess(pidx.valueOf(),node);};uno.xml._h2s[pidx]=function(node){uno.xml.finishprocess(pidx.valueOf(),node);};
    if(uno.xml.processes[pidx].ptype=='content'){
      if(uno.xml.processes[pidx].pp){uno.xml.asyncloadpost(uno.xml.processes[pidx].dataurl,uno.xml.processes[pidx].pp, false, uno.xml._h1s[pidx], false);}
      else{uno.xml.asyncload(uno.xml.processes[pidx].dataurl,false,uno.xml._h1s[pidx],false);}
  }else{uno.xml.asyncload(uno.xml.processes[pidx].configurl,false,uno.xml._h1s[pidx],false); } 
};
uno.xml.continueprocess = function(pidx, req) {
    if (uno.xml.processes[pidx].ptype=='content'){uno.xml._rendercontent(pidx,req);}
    else {uno.xml.processes[pidx].config = req.responseXML.documentElement;
        if(uno.xml.processes[pidx].pp){uno.xml.asyncloadpost(uno.xml.processes[pidx].dataurl,uno.xml.processes[pidx].pp,false,uno.xml._h2s[pidx],false);}
        else {uno.xml.asyncload(uno.xml.processes[pidx].dataurl, false, uno.xml._h2s[pidx], false);
}   }   };
uno.xml.finishprocess = function(pidx, req) {
    try {var e; var ok = 'ok';
        try { req.responseXML.documentElement.getElementsByTagName('ok')[0].childNodes[0].nodeValue; } catch (exx) { ok = 'ok'; }
        if (ok != 'ok') {
            var errs = req.responseXML.documentElement.getElementsByTagName('error');
            var msg = ''; for (e = 0; e < errs.length; e++) { msg = msg + errs[e].childNodes[0].nodeValue + '<br />'; }
            if (uno.dialog) {
                uno.dialog.show('Error', msg + 'Response :<br />' + req.responseText, 'error');
                for (e = 0; e < errs.length; e++) { if (uno.dialog) { uno.dialog.show('Error', errs[e].childNodes[0].nodeValue + '<br />Response :<br />' + req.responseText, 'error'); } else { alert(errs[e].childNodes[0].nodeValue); } }
            } else { alert(msg); }
        } else {
            if (uno.xml.processes[pidx].ptype == 'control') { uno.xml.processes[pidx].data = req.responseXML.documentElement; uno.xml._rendercontrol(pidx); }
        }
    } catch (ex) { if (uno.dialog) { uno.dialog.show('Error', ex.message + '<br />Response :<br />' + req.responseText, 'error'); } else { alert(ex.message); } }
};
uno.xml._rendercontrol = function(pidx) {
    var rt = 0; var x = 0; var v = 0; var s = '';
    var p = uno.xml.processes[pidx];
    //Prepare constants
    var consts = new Array(); var consts_name = new Array();
    var xconsts = p.config.getElementsByTagName('constant');
    for (v = 0; v < xconsts.length; v++) {
        s = uno.xml.getattribute(xconsts[v], 'tagname');
        consts[v] = uno.xml.nodeinnerxml(p.data.getElementsByTagName(s)[0]);
        consts_name[v] = uno.xml.getattribute(xconsts[v], 'substitution');
    }
    //Prepare and plot constant conditions;
    var js = '';
    var const_xconds = null; var const_conds = new Array(); var const_conds_name = new Array();
    const_xconds = p.config.getElementsByTagName('constantcondition');
    for (v = 0; v < const_xconds.length; v++) {
        const_conds_name[v] = uno.xml.getattribute(const_xconds[v], 'substitution');
        js = uno.xml.childinnerxml(const_xconds[v], 'js');
        js = uno.xml._substitute(js, consts, consts_name);
        if (eval(js)) { const_conds[v] = uno.xml.childinnerxml(const_xconds[v], 'true'); }
        else { const_conds[v] = uno.xml.childinnerxml(const_xconds[v], 'false'); }
    }
    //Start Writing
    s = uno.xml.nodeinnerxml(p.config.getElementsByTagName('beforeall')[0]);
    s = uno.xml._substitute(s, const_conds, const_conds_name);
    var html = uno.xml._substitute(s, consts, consts_name);
    //Fetch row types
    var rowtypes = p.config.getElementsByTagName('rowtype');
    var xvars = null; var vars = new Array(); var vars_name = new Array();
    var rows = null; var rbefore = ''; var rafter = '';
    var xconds = null; var conds = new Array(); var condsT = new Array(); var condsF = new Array(); var conds_name = new Array(); var conds_js = new Array();
    //Write row types
    for (rt = 0; rt < rowtypes.length; rt++) {
        //Fetch rows
        s = uno.xml.getattribute(rowtypes[rt], 'tagname');
        rows = p.data.getElementsByTagName(s);
        //Fetch variables 
        xvars = rowtypes[rt].getElementsByTagName('variable');
        for (v = 0; v < xvars.length; v++) { vars_name[v] = uno.xml.getattribute(xvars[v], 'substitution'); }
        //Fetch conditions 
        xconds = rowtypes[rt].getElementsByTagName('condition');
        for (v = 0; v < xconds.length; v++) {
            conds_name[v] = uno.xml.getattribute(xconds[v], 'substitution');
            conds_js[v] = uno.xml.childinnerxml(xconds[v], 'js');
            conds_js[v] = uno.xml._substitute(conds_js[v], const_conds, const_conds_name);
            conds_js[v] = uno.xml._substitute(conds_js[v], consts, consts_name);
            condsT[v] = uno.xml.childinnerxml(xconds[v], 'true');
            condsF[v] = uno.xml.childinnerxml(xconds[v], 'false');
        }
        //Prepare prefix and suffix
        rbefore = uno.xml.childinnerxml(rowtypes[rt], 'before');
        rbefore = uno.xml._substitute(rbefore, const_conds, const_conds_name);
        rafter = uno.xml.childinnerxml(rowtypes[rt], 'after');
        rafter = uno.xml._substitute(rafter, const_conds, const_conds_name);
        //Case zero rows
        if (rows.length == 0) {
            try {
                var casezero = rowtypes[rt].getElementsByTagName('casezero')[0];
                html += uno.xml._substitute(uno.xml.nodeinnerxml(casezero), consts, consts_name);
            } catch (ex) { html += ''; };
        } else {
            html += uno.xml._substitute(rbefore, consts, consts_name);
            //Write rows
            for (x = 0; x < rows.length; x++) {
                //Read variables
                for (v = 0; v < xvars.length; v++) {
                    s = uno.xml.getattribute(xvars[v], 'tagname');
                    vars[v] = uno.xml.nodeinnerxml(rows[x].getElementsByTagName(s)[0]);
                }
                //Execute & Plot conditions
                for (v = 0; v < xconds.length; v++) {
                    js = uno.xml._substitute(conds_js[v], vars, vars_name);
                    if (eval(js)) { conds[v] = condsT[v]; }
                    else { conds[v] = condsF[v]; }
                }
                //Write Base Row HTML
                s = uno.xml.nodeinnerxml(rowtypes[rt].getElementsByTagName('html')[0]);
                //Replace Conditions
                s = uno.xml._substitute(s, conds, conds_name);
                //Replace Variables
                s = uno.xml._substitute(s, vars, vars_name);
                //Replace Constant conditions
                s = uno.xml._substitute(s, const_conds, const_conds_name);
                //Replace Constants
                html += uno.xml._substitute(s, consts, consts_name);
                //Load Contents and Controls
                //uno.xml._chainload(rowtypes[rt], false);
            }
        }
        html += uno.xml._substitute(rafter, consts, consts_name);
    }
    //Finish Writing
    s = uno.xml.nodeinnerxml(p.config.getElementsByTagName('afterall')[0]);
    s = uno.xml._substitute(s, const_conds, const_conds_name);
    html += uno.xml._substitute(s, consts, consts_name);
    uno.clearchilds(p.elm);
    p.elm.innerHTML = html;
    //uno.xml._chainload(req.responseXML.documentElement, true);
    nodes = p.config.getElementsByTagName('onload');
    try { js = uno.xml.nodeinnerxml(nodes[0]); } catch (ex) { js = false; }
    if (js) { js = uno.xml._substitute(js, consts, consts_name); eval(js); };
};
uno.xml._chainload = function(node,constant,subs){
    var e=0;var tgt = ''; var curl = ''; var durl = ''; var timeout = 200;
    var ctcname = 'content';var ctrname = 'control';
    if(constant){ctcname = 'constant'+ctcname;ctrname='constant'+ctcname;}
    var nodes = parent.getElementsByTagName(ctcname);
    for (e = 0; e < nodes.length; e++) {
        tgt = uno.xml.childinnerxml(nodes[e], 'target');
        durl = uno.xml.childinnerxml(nodes[e], 'dataurl');
        setTimeout('uno.xml.rendercontent(' + tgt + ',' + durl + ');', timeout);
        timeout += uno.xml.rendertimestep;
    }
    nodes = parent.getElementsByTagName(ctrname);
    for (e = 0; e < nodes.length; e++) {
        tgt = uno.xml.childinnerxml(nodes[e], 'target');
        curl = uno.xml.childinnerxml(nodes[e], 'ctrurl');
        durl = uno.xml.childinnerxml(nodes[e], 'dataurl');
        setTimeout('uno.xml.rendercontrol(' + tgt + ',' + curl + ',' + durl + ');', timeout);
        timeout += uno.xml.rendertimestep;
    }
};
uno.xml._substitute = function(value,vars,names){if (!value) {return '';}value=uno.replaceglobal(value,'<![CDATA[','');value=uno.replaceglobal(value,']]>','');if (vars){for (var i=0;i<vars.length;i++){value=uno.replaceglobal(value,names[i],vars[i]);}}return value;};
