﻿/**
*
*  uno.xml.presentmore.js 
*  by Hideki Yamamoto eu-gsm[+393453332248]
*  Version Alpha 0.0.3.0
*  This file is part of the uno project.
*  The user must agree with the terms specified in
*
*  ©Hideki Yamamoto, all rights reserved.
*
*  Licence       : Http://www.unodot.net/framework/current/uno.licence.txt
*  Documentation : Http://www.unodot.net/framework/current/uno.js.usage.txt
*  History       : Http://www.unodot.net/framework/current/uno.js.history.txt
*
**/
var loadingtext = '<img src="themes/cesvisoci/images/loading_cesvi.gif" />Loading...';
if(!uno.xml.present){alert('uno.xml.presentmore.js requires uno.xml.present.js');}
uno.xml.renderlist = function(elm,configurl,dataurl){uno.clearchilds(elm);elm.innerHTML=loadingtext;var pidx = uno.xml.processes.length;uno.xml.processes[pidx] = new uno.xml.process('list',elm,configurl,dataurl);uno.xml.startprocess(pidx);};
uno.xml.rendertable = function(elm,configurl,dataurl){uno.clearchilds(elm);elm.innerHTML=loadingtext;var pidx = uno.xml.processes.length;uno.xml.processes[pidx] = new uno.xml.process('table',elm,configurl,dataurl);uno.xml.startprocess(pidx);};
uno.xml.rendertree = function(config,data){var pidx = uno.xml.processes.length;uno.xml.processes[pidx] = new uno.xml.process('tree',elm,configurl,dataurl);uno.xml.startprocess(pidx);};

uno.xml.appendselect = function(node) {
    var select_elm = document.createElement('select');
    var selected = uno.xml.attributevalue(node.getAttributeNode('selected'));
    var opts = node.getElementsByTagName('option');
    for (var e = 0 ; e<opts.length ; e++){
        uno.xml._appendoption(select_elm,selected,opts[e]);}
    var parent_id = uno.xml.attributevalue(node.getAttributeNode('parent'));
    $(parent_id).appendChild(select_elm);};
uno.xml._appendoption = function(select_elm,selected,node) {
  var onodevalue = uno.xml.attributevalue(node.getAttributeNode('value'));
  var onodehtml = uno.xml.nodeinnerxml(node);
  var opt = document.createElement('option');
  if (selected == onodevalue){opt.setAttribute('selected', 'selected');} 
  opt.setAttribute('value', onodevalue);
  opt.innerHTML = onodehtml;   
  $(select_elm).appendChild(opt);};
//////////////////////////////////////////////////////////////////////////////////
uno.xml.processes = new Array();
uno.xml.process = function(ptype,elm,configurl,dataurl){this.ptype = ptype;this.elm = $(elm);this.configurl = configurl;this.dataurl = dataurl;this.config=null;this.data=null;};
uno.xml._h1s = new Array();uno.xml._h2s = new Array();
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);};uno.xml.asyncload(uno.xml.processes[pidx].configurl,false,uno.xml._h1s[pidx],false);};
uno.xml.continueprocess = function(pidx,req){
    //TODO:OKMECHANISM
    uno.xml.processes[pidx].config = req.responseXML.documentElement;
    uno.xml.asyncload(uno.xml.processes[pidx].dataurl,false,uno.xml._h2s[pidx],false);};
uno.xml.finishprocess = function(pidx,req){
    try{var data = req.responseXML.documentElement;
        var ok = data.getElementsByTagName('ok')[0].childNodes[0].nodeValue;
        if (ok != 'ok'){
            alert(req.responseText);
            //uno.dialog.show('Error',req.responseText,'error');
            //var errs = data.getElementsByTagName('error');
	        //for (var 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);}}
        }}catch(ex){}
    try{if(UnTip){UnTip();}}catch(ex){}
    try{    
        uno.xml.processes[pidx].data = req.responseXML.documentElement;
        if (uno.xml.processes[pidx].ptype=='list'){uno.xml._renderlist(pidx);}
        if (uno.xml.processes[pidx].ptype=='table'){uno.xml._rendertable(pidx);}
        }catch(ex){if (uno.dialog){uno.dialog.show('Error',ex.message+'<br />Response :<br />'+req.responseText,'error');}else{alert(ex.message);}}
    };
uno.xml._renderlist=function(pidx){
    var rt=0;var x=0;var v=0;var s='';
    var p=uno.xml.processes[pidx];
    //Prepare constants
    //alert(uno.xml.nodeinnerxml(p.data));
    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');}
    //Start Writing
    s = uno.xml.nodeinnerxml(p.config.getElementsByTagName('beforeall')[0]);
    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 = '';
    //Write row types
    for (rt=0;rt<rowtypes.length;rt++){
        //Fetch rows
        s = uno.xml.getattribute(rowtypes[rt],'tagname');
        rows = p.data.getElementsByTagName(s);
        //Prepare variables
        xvars = rowtypes[rt].getElementsByTagName('variable');        
        for (v=0;v<xvars.length;v++){vars_name[v] = uno.xml.getattribute(xvars[v],'substitution');}
        //Prepare prefix and suffix
        rbefore = uno.xml.nodeinnerxml(rowtypes[rt].getElementsByTagName('before')[0]);        
        rafter = uno.xml.nodeinnerxml(rowtypes[rt].getElementsByTagName('after')[0]);        
        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]);}
            //row
            s = uno.xml.nodeinnerxml(rowtypes[rt].getElementsByTagName('html')[0]);
            s = uno.xml._substitute(s,consts,consts_name);
            html += uno.xml._substitute(s,vars,vars_name);
        }   }  
        html += uno.xml._substitute(rafter,consts,consts_name);}
    //Finish Writing
    s = uno.xml.nodeinnerxml(p.config.getElementsByTagName('afterall')[0]);
    html += uno.xml._substitute(s,consts,consts_name);
    uno.clearchilds(p.elm);
    p.elm.innerHTML = html;
    var js
    try{
        js = uno.xml.nodeinnerxml(p.config.getElementsByTagName('javascript')[0]);
        if(js){
        js = uno.xml._substitute(js,consts,consts_name);
        eval(js);};
    }catch(ex){
        if (uno.debug){alert(ex.message+'\n'+js);}
        else{uno.throwerror(ex.message+'\n'+js);}
    };    
};
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;
};
