// Ajax constructor
NTSP_Ajax = function () {
    // Element type
    this.e_type = null;
    // Element ID et bouton
    this.e_id = null;
    this.form_id = null;
    this.element_id = null;
    this.container_id = null; // Doit être retrouvé automatiquement
    this.ajax_obj = null;
    // config
    this.post_url = null;
    this.load_url = null;
    this.form_url = null;
    this.list_url = null;
    this.element_url = null;
    this.result_type = null;
    this.result_id = null; // Definir plusieurs variables de destination : cas ADD,EDIT,DEL,INFO,REPLACE...
    this.result_fct = null;
    this.init_type = null;
    this.linked_e_id = null; // Element lié devant subir un post après une action
    // Process element
    this.todo = null;
    this.todonext = null;
    // Elements pour lesquels il faut gérer les events
    this.evtchange = null;
    this.evtclick = null;
    // Variables à traiter lors des requètes
    this.vars_type = null;
    this.vars = null;
    this.postvars = null;
    this.lastChekboxName = null;
    // Styles
    this.process_img = null;
    this.save_off_img = null;
    this.save_on_img = null;
    this.add_img = null;
    this.del_img = null;
    this.result_success_class = null;
    this.result_error_class = null;
    // Dyn
    this.i = 0;
};

// Methode qui se charger d'instancier un objet Ajax
NTSP_Ajax.setup = function (vars) {
    
    // Affectation des vars / confs par défaut
    function affectVars(vname, vval) {
        if (typeof vars[vname] == "undefined") {
            vars[vname] = vval;
        }
        ntsp_ajax[vname] = vars[vname];
    };
    
    // On crée une instance de l'objet
    var ntsp_ajax = new NTSP_Ajax();
    
    // Variables obligatoires
    ntsp_ajax.e_id = vars['e_id'];
    ntsp_ajax.post_url = vars['post_url'];
    
    // Variables optionnelles
    affectVars("load_url", "");
    affectVars("form_url", "");
    affectVars("list_url", "");
    affectVars("evtchange", []);
    affectVars("evtclick", []);
    affectVars("vars", []);
    affectVars("result_type", "eval");
    affectVars("result_fct", "");
    affectVars("result_id", "");
    affectVars("result_success_class", "infoBoxSuccess");
    affectVars("result_error_class", "infoBoxError");
    affectVars("process_img", "/imgs/ajax-loader.gif");
    affectVars("save_off_img", "_imgs/16x16/accept_disabled.png");
    affectVars("save_on_img", "_imgs/16x16/accept.png");
    affectVars("add_img", "_imgs/16x16/add.png");
    affectVars("del_img", "_imgs/16x16/delete.png");
    affectVars("init_type", "");
    affectVars("linked_e_id", "");
    
    // Detection du type d'obj
    if (typeof vars['e_id'] == "string") {
        obj = document.getElementById(vars['e_id']);
        if (obj.tagName.toLowerCase() == 'div') {
            ntsp_ajax.e_type = 'div';
        } else if (obj.tagName.toLowerCase() == 'form') {
            ntsp_ajax.e_type = 'form';
        } else {
            ntsp_ajax.e_type = obj.type;
        }
        // alert(ntsp_ajax.e_type);
        switch (ntsp_ajax.e_type) {
            case 'div':
                if (ntsp_ajax.vars.length == 0 && typeof vars['vars_type'] == "undefined") {
                    affectVars("vars_type", "");
                }
                break;
            case 'form':
                ntsp_ajax.form_id = vars['e_id'];
                if (ntsp_ajax.vars.length == 0 && typeof vars['vars_type'] == "undefined") {
                    affectVars("vars_type", "form");
                }
                break;
            case 'text':
            case 'hidden':
            case 'password':
            case 'textarea':
            case 'select-one':
            case 'radio':
            case 'checkbox':
                ntsp_ajax.form_id = obj.form.id;
                ntsp_ajax.element_id = vars['e_id'];
                if (ntsp_ajax.vars.length == 0 && typeof vars['vars_type'] == "undefined") {
                    affectVars("vars_type", "element");
                }
                break;
        }
        
        switch (ntsp_ajax.init_type) {
            case 'editlist':
                // Identification du container
                ntsp_ajax.container_id = obj.parentNode.parentNode.id;
                ntsp_ajax.affectBtObjAndEvent();
                break;
            default:
                // Identification du container
                ntsp_ajax.container_id = obj.parentNode.id;
                ntsp_ajax.affectObjAndEvent();
                break;
        }
    } else {
        alert('ID ELEMENT non fourni');
    }

}

NTSP_Ajax.prototype.affectObjAndEvent = function () {
    
    // Attachement du formulaire
    switch (this.e_type) {
        case 'form':
            // On affecte l'objet à l'élément HTML pour y faire référence après et pouvoir
            // utiliser l'objet sans this qui se trouve réaffecté au HTML sur un event
            var form_e = document.getElementById(this.form_id);
            form_e.ajax_obj = this;
            
            // On affecte les evt onchange
            var evt_e = null;
            
            for (var i in this.evtchange) {
                if (typeof this.evtchange[i] == "string") {
                    evt_e = document.getElementById(this.evtchange[i]);
                    evt_e.onchange = NTSP_ajaxPostFormData;
                }
            }
            
            // On affecte les evt onclick
            for (var i in this.evtclick) {
                if (typeof this.evtclick[i] == "string") {
                    evt_e = document.getElementById(this.evtclick[i]);
                    evt_e.onmousedown = NTSP_ajaxPostFormData;
                }
            }
            // Par précaution
            form_e = null;
            evt_e = null;
            
            break;
        case 'text':
        case 'hidden':
        case 'password':
        case 'textarea':
        case 'select-one':
        case 'radio':
        case 'checkbox':
            // Attachement de l'élément d'un formulaire
            if (typeof this.element_id == "string") {
                var e = document.getElementById(this.element_id);
                // On affecte l'objet à l'élément HTML pour y faire référence après et pouvoir
                // utiliser l'objet sans this qui se trouve réaffecté au HTML sur un event
                e.onchange = NTSP_ajaxPostElementData;
                e.ajax_obj = this;
                e = null;
            }
            break;
        case 'div':
            var e = document.getElementById(this.e_id);
            e.ajax_obj = this;
            e = null;
            break;
    }
    
}

NTSP_Ajax.prototype.affectBtObjAndEvent = function () {
    
    // Attachement du formulaire
    if (this.e_type == 'form') {
        // On affecte l'objet à l'élément HTML pour y faire référence après et pouvoir
        // utiliser l'objet sans this qui se trouve réaffecté au HTML sur un event
        var form_e = document.getElementById(this.form_id);
        form_e.ajax_obj = this;
        
        // On parse les elements pour ajouter les events
        var todo = 'add';
        var elt = null;
        
        for (i = 0; i < form_e.elements.length; i++) {
            elt = form_e.elements[i];
            if (elt.name == 'r_id' && elt.value != '') {
                todo = 'edit';
            }
            if (elt.type != 'hidden') {
                elt.onchange = NTSP_ajaxActivateLineSave;
            }
        }
        
        // On ajoute les boutons de liste
        var tn = null;
        
        // On cherche la table
        var fc = form_e.firstChild;
        if (fc.nodeType == 1) {
            tn = fc.tagName.toLowerCase();
        } else {
            tn = '';
        }
        while (tn != "table") {
            fc = fc.nextSibling;
            if (fc.nodeType == 1) {
                tn = fc.tagName.toLowerCase();
            } else {
                tn = '';
            }
        }
        var tb = fc;
        // On cherche le tbody
        fc = tb.firstChild;
        if (fc.nodeType == 1) {
            tn = fc.tagName.toLowerCase();
        } else {
            tn = '';
        }
        while (tn != "tbody") {
            fc = fc.nextSibling;
            if (fc.nodeType == 1) {
                tn = fc.tagName.toLowerCase();
            } else {
                tn = '';
            }
        }
        var tbdy = fc;
        // On cherche le tr
        fc = tbdy.firstChild;
        if (fc.nodeType == 1) {
            tn = fc.tagName.toLowerCase();
        } else {
            tn = '';
        }
        while (tn != "tr") {
            fc = fc.nextSibling;
            if (fc.nodeType == 1) {
                tn = fc.tagName.toLowerCase();
            } else {
                tn = '';
            }
        }
        var tr = fc;
        var ntd = document.createElement('td');
        var bt = document.createElement('img');
        bt.setAttribute("width","16");
        bt.setAttribute("height","16");
        bt.setAttribute("border","0");
        switch (todo) {
            case 'add':
                bt.setAttribute("id",this.form_id+'_add');
                bt.setAttribute("src",this.add_img);
                bt.onmousedown = NTSP_ajaxPostListFormData;
                break;
            case 'edit':
                bt.setAttribute("id",this.form_id+'_save');
                bt.setAttribute("src",this.save_off_img);
                // bt.onmousedown = NTSP_ajaxPostListFormData;
                break;
        }
        ntd.appendChild(bt);
        tr.appendChild(ntd);
        if (todo == 'edit') {
            ntd = document.createElement('td');
            bt = document.createElement('img');
            bt.setAttribute("id",this.form_id+'_del');
            bt.setAttribute("src",this.del_img);
            bt.setAttribute("width","16");
            bt.setAttribute("height","16");
            bt.setAttribute("border","0");
            bt.onmousedown = NTSP_ajaxDelListFormData;
            ntd.appendChild(bt);
            tr.appendChild(ntd);
        }
        // RAB
        // td_img = document.getElementById(td_img_id);
        // td_img.src = "imgs/18x18/save_tr.gif";
    } else {
        alert('Erreur : init_type sans form');
    }
    
}

NTSP_Ajax.prototype.disableSaveBt = function () {
    var bt = document.getElementById(this.form_id+'_save');
    var form_e = document.getElementById(this.form_id);
    bt.src = form_e.ajax_obj.save_off_img;
    this.result_type = "listeditprocess";
    bt.onmousedown = "";
}

NTSP_Ajax.prototype.addSaveAndDeleteBt = function () {
    var bt = document.getElementById(this.form_id+'_add');
    bt.id = this.form_id+'_save';
    this.disableSaveBt();
    var tr = bt.parentNode.parentNode;
    ntd = document.createElement('td');
    bt = document.createElement('img');
    bt.setAttribute("id",this.form_id+'_del');
    bt.setAttribute("src",this.del_img);
    bt.setAttribute("width","16");
    bt.setAttribute("height","16");
    bt.setAttribute("border","0");
    bt.onmousedown = NTSP_ajaxDelListFormData;
    ntd.appendChild(bt);
    tr.appendChild(ntd);
}

// Traitement des elements
function NTSP_ajaxPostElementData() {
    var e = this;
    var ajax_obj = e.ajax_obj;
    ajax_obj.form_id = this.form.id;
    ajax_obj.postData('');
}

function NTSP_ajaxEvalReturn() {
   // A faire (une fonction par défaut)
}

// Traitement des donnees de formulaire (rechargement des donnees uniquement EDIT)
function NTSP_ajaxPostFormData() {
    var e = this.form;
    var ajax_obj = e.ajax_obj;
    ajax_obj.postData('');
}

// Post des données fournies en param
function NTSP_ajaxPostData(e_id, vars) {
    var e = document.getElementById(e_id);
    var ajax_obj = e.ajax_obj;
    ajax_obj.postData(vars);
}

// Post des données fournies en param à destination d'un element spécifique
function NTSP_ajaxPostDataToTarget(e_id, vars, t_id) {
    var e = document.getElementById(e_id);
    var ajax_obj = e.ajax_obj;
    ajax_obj.postDataToTarget(vars, t_id);
}

/*
// Active le bouton add
function NTSP_ajaxActivateLineAdd() {
    var form_e = this.form;
    var form_id = form_e.id;
    var bt = null;
    bt = document.getElementById(form_id+'_save');
    // On active et on change de style
    bt.src = form_e.ajax_obj.add_img;
    bt.onmousedown = NTSP_ajaxPostListFormData;
}
*/

// Active le bouton save
function NTSP_ajaxActivateLineSave() {
    var form_e = this.form;
    var form_id = form_e.id;
    var bt = null;
    bt = document.getElementById(form_id+'_save');
    // On active et on change de style
    // if (bt != "undefined") {
    if (bt) {
        bt.src = form_e.ajax_obj.save_on_img;
        bt.onmousedown = NTSP_ajaxPostListFormData;
    }
}

function NTSP_ajaxPostListFormData() {
    // Detection du form_id
    var id_array = this.id.split('_');
    var form_id = id_array[0];
    var e = document.getElementById(form_id);
    var ajax_obj = e.ajax_obj;
    ajax_obj.postData('');
    // Si retour ok il faut désactiver le bt sinon renvoi de l'erreur
}

/* DEPRECATED
function NTSP_ajaxPostListFormDataAndAddForm() {
    // Detection du form_id
    var id_array = this.id.split('_');
    var form_id = id_array[0];
    var e = document.getElementById(form_id);
    var ajax_obj = e.ajax_obj;
    ajax_obj.postData();
    // Il faut que l'ajout du nouveau form se fasse sur retour ok de la requete sinon renvoi de l'erreur
}
*/

function NTSP_ajaxDelListFormData() {
    if (confirm('Confirmez-vous la suppression ?')) {
        // Detection du form_id
        var id_array = this.id.split('_');
        var form_id = id_array[0];
        var form_e = document.getElementById(form_id);
        // a controler
        form_e.todo.value = 'del';
        // form_e["todo"].value = 'del';
        var ajax_obj = form_e.ajax_obj;
        ajax_obj.result_type = "removeonsuccess";
        ajax_obj.postData('');
        // Si retour ok il faut désactiver le bt sinon renvoi de l'erreur
    }
}

function NTSP_ajaxLoadFormData(form_id, r_id) {
   var e = document.getElementById(form_id);
   var ajax_obj = e.ajax_obj;
   ajax_obj.loadRecordData(r_id);
}

// Traitement du formulaire (rechargement complet du form ADD ou LOAD)
function NTSP_ajaxLoadForm(form_id, record_id) {
    var e = document.getElementById(form_id);
    var ajax_obj = e.ajax_obj;
    ajax_obj.loadRecordForm(record_id);
}


NTSP_Ajax.prototype.loadRecordForm = function (record_id) {
    if (record_id) {
        this.postvars = 'r_id='+record_id;
    } else {
        this.postvars = '';
    }
    this.xmlhttpPost(this.form_url, this.postvars, 'reloadobj', '', '');
}

NTSP_Ajax.prototype.addRecordForm = function () {
    this.postvars = '';
    this.xmlhttpPost(this.form_url, this.postvars, 'addtocontainer', '', '');
}

// Il faut faire la fct qui vide et rempli les éléments du form
NTSP_Ajax.prototype.loadRecordData = function (r_id) {
    this.postvars = 'fields[r_id]='+r_id;
    this.xmlhttpPost(this.load_url, this.postvars, '', '', '');
}

NTSP_Ajax.prototype.postData = function (vars) {
    this.setPostVars(vars);
    this.xmlhttpPost(this.post_url, this.postvars, '', '', this.result_fct);
}

NTSP_Ajax.prototype.postDataToTarget = function (vars, t_id) {
    this.setPostVars(vars);
    this.xmlhttpPost(this.post_url, this.postvars, '', t_id, '');
}

NTSP_Ajax.prototype.setPostVars = function (vars) {
    if (!vars.length && (this.vars.length || this.vars_type == 'form' || this.vars_type == 'element')) {
        this.getFormData();
    } else if (vars.length) {
        for (var i in vars) {
            this.postvars += i + '=' + vars[i] + '&';
        }
        this.postvars = this.postvars.substr(0, this.postvars.length - 1);
    } else {
        this.postvars = '';
    }
}

NTSP_Ajax.prototype.getFormData = function () {
    
    var frm;
    var elt;
    
    this.postvars = '';
    
    if (this.vars.length) {
        for (var i in this.vars) {
            elt = document.getElementById(this.vars[i]);
            this.postvars += this.getFormatedData(elt) + '&';
        }
        this.postvars = this.postvars.substr(0, this.postvars.length - 1);
    } else {
        // On prend les variables par defaut
        switch (this.vars_type) {
            case 'form':
                frm = document.getElementById(this.form_id);
                for (i = 0; i < frm.elements.length; i++) {
                    elt = frm.elements[i];
                    this.postvars += this.getFormatedData(elt) + '&';
                    if (elt.name == 'todo') {
                        this.todo = elt.value;
                    }
                    if (elt.name == 'todonext') {
                        this.todonext = elt.value;
                    }
                }
                this.postvars = this.postvars.substr(0, this.postvars.length - 1);
                break;
            case 'element':
                elt = document.getElementById(this.element_id);
                this.postvars += this.getFormatedData(elt);
                break;
        }
    }
    return this.postvars;
}

// A compléter

NTSP_Ajax.prototype.getFormatedData = function (elt) {
   
   var str = "";
   
   switch (elt.type) {
      // Text fields, hidden form elements
      case 'text':
      case 'hidden':
      case 'password':
      case 'textarea':
      case 'select-one':
         str = elt.name + '=' + escape(elt.value);
         break;
         
      // Radio buttons
      case 'radio':
         if (elt.checked) {
            str = elt.name + '=' + escape(elt.value);
         }
         break;
         
      // Checkboxes
      case 'checkbox':
         // A tester
         if (elt.checked) {
            // Continuing multiple, same-name checkboxes
            if (elt.name == this.lastChekboxName) {
               // Strip of end ampersand if there is one
               if (this.postvars.lastIndexOf('&') == this.postvars.length-1) {
                  this.postvars = this.postvars.substr(0, this.postvars.length - 1);
               }
               // Append value as comma-delimited string
               str = ',' + escape(elt.value);
            } else {
               str = elt.name + '=' + escape(elt.value);
            }
         }
         this.lastChekboxName = elt.name
         break;
         
   }
   
   return str;
}

NTSP_Ajax.prototype.xmlhttpPost = function (strSubmitURL, strSubmitContent, strResultType, strResultId, strResultFct) {
    
    var xmlHttpReq = false;
    var strResponse = '';
    
    // En raison de la non conservation de l'objet en retour
    var obj = this;
    var result_type = null;
    if (!strResultType) {
        result_type = this.result_type;
    } else {
        result_type = strResultType;
    }
    var result_fct = null;
    if (!strResultFct) {
        result_fct = this.result_fct;
    } else {
        result_fct = strResultFct;
    }
    var result_id = null;
    if (!strResultId) {
        result_id = this.result_id;
    } else {
        result_id = strResultId;
    }
	
    switch (result_type) {
        case "process":
            // Disable save bt pour eviter double post
            break;
        case "display":
            document.getElementById(result_id).innerHTML = '<center><br /><img src="' + this.process_img + '" border="0" /><br /></center>';
            break;
        case "reloadobj":
            document.getElementById(obj.container_id).innerHTML = '<center><br /><img src="' + this.process_img + '" border="0" /><br /></center>';
            break;
    }
    
    // Create new XMLHTTPRequest object
    // ----------------
    // Mozilla
    if (window.XMLHttpRequest) {
        xmlHttpReq = new XMLHttpRequest();
        // xmlHttpReq.overrideMimeType('text/xml');
    } else if (window.ActiveXObject) {
        xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
    }
    
   /* 
   if (window.XMLHttpRequest) // Firefox
      xmlHttpReq = new XMLHttpRequest();
   else if (window.ActiveXObject) // Internet Explorer
      xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
   else { // XMLHttpRequest non supporté par le navigateur
      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
      return;
   }
   */
    
    xmlHttpReq.open('POST', strSubmitURL, true);
    xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlHttpReq.onreadystatechange = function() {
    if (xmlHttpReq.readyState == 4) {
        strResponse = xmlHttpReq.responseText;
        switch (xmlHttpReq.status) {
            // Page-not-found error
            case 404:
                alert('Error: Not Found. The requested URL ' + strSubmitURL + ' could not be found.');
                break;
            // Display results in a full window for server-side errors
            case 500:
                handleErrFullPage(strResponse);
                break;
            default:
                // Call JS alert for generated error or debug messages
                if (strResponse.indexOf('Error:') > -1 || strResponse.indexOf('Debug:') > -1) {
                    alert(strResponse);
                } else { // Call the desired result function
                    // alert(result_type);
                    switch (result_type) {
                        case "eval":
                            eval(strResponse);
                            break;
                        case "function":
                            eval(result_fct + '(strResponse);');
                            break;
                        case "process":
                            var process_result = '';
                            eval(strResponse);
                            obj.parseProcessResult(process_result);
                            // Prise en compte des actions
                            if (!process_result['error']) {
                                // Il faut recharger le form et le todonext est redefini au prochain post
                                // en lui demandant d'executer la fonction de reaffect
                                if (obj.todonext == "edit") {
                                    obj.loadRecordForm(obj.record_id);
                                } else if (obj.todonext == "add") {
                                    obj.loadRecordForm('');
                                }
                                if (obj.linked_e_id) {
                                    // On utilise la fonction en shortcut
                                    NTSP_ajaxPostData(obj.linked_e_id,'');
                                }
                            }
                            break;
                        case "listaddprocess":
                            var process_result = '';
                            eval(strResponse);
                            obj.parseProcessResult(process_result);
                            // Prise en compte du résultat du process
                            if (!process_result['error']) {
                                // On affecte r_id
                                var form_e = document.getElementById(obj.form_id);
                                form_e['r_id'].value = process_result['record_id'];
                                form_e['todo'].value = 'edit';
                                // Il faut charger le nouveau form en lui demandant d'executer la fonction de reaffect
                                obj.addRecordForm();
                            } else {
                                alert(process_result['error']);
                            }
                            break;
                        case "listeditprocess":
                            var process_result = '';
                            eval(strResponse);
                            obj.parseProcessResult(process_result);
                            // Prise en compte du résultat du process
                            if (!process_result['error']) {
                                // On disable le save
                                obj.disableSaveBt();
                            } else {
                                alert(process_result['error']);
                            }
                            break;
                        case "removeonsuccess":
                            var process_result = '';
                            eval(strResponse);
                            obj.parseProcessResult(process_result);
                            // Prise en compte du résultat du process
                            if (!process_result['error']) {
                                // Il faut effacer le form et supprimer l'objet
                                var form_e = document.getElementById(obj.form_id);
                                form_e.parentNode.removeChild(form_e);
                                delete obj;
                            } else {
                                alert(process_result['error']);
                            }
                            break;
                        case "display":
                            document.getElementById(result_id).innerHTML = strResponse;
                            break;
                        case "reloadobj":
                            document.getElementById(obj.container_id).innerHTML = strResponse;
                            obj.affectObjAndEvent();
                            break;
                        case "addtocontainer":
                            var container = document.getElementById(obj.container_id);
                            // On ajoute un div
                            var newnode = document.createElement("div");
                            container.appendChild(newnode);
                            container.lastChild.innerHTML = strResponse;
                            // Il faut creer le nouvel id et l'affecter au dernier form du container
                            // var new_form = container.lastChild.lastChild;
                            var tn = null;
                            // On cherche le nouveau form
                            var fc = container.lastChild.firstChild;
                            if (fc.nodeType == 1) {
                                tn = fc.tagName.toLowerCase();
                            } else {
                                tn = '';
                            }
                            while (tn != "form") {
                                fc = fc.nextSibling;
                                if (fc.nodeType == 1) {
                                    tn = fc.tagName.toLowerCase();
                                } else {
                                    tn = '';
                                }
                            }
                            var new_form = fc;
                            var timestamp = new Date().getTime();
                            var new_id = timestamp;
                            new_form.id = new_id;
                            // alert(new_form.id);
                            // ICI il faut trouver un moyen de recréer un objet sans reparser tout le DOM
                            var new_obj= new NTSP_cloneObject(obj);
                            new_obj.form_id = new_id;
                            new_obj.affectBtObjAndEvent();
                            // On transforme le bouton add en save et on ajoute le bouton de suppression
                            obj.addSaveAndDeleteBt();
                            break;
                        default:
                            alert("ret_mode erreur : " + ret_mode);
                            break;
                    }
                }
                break;
            }
        }
    }
    xmlHttpReq.send(strSubmitContent);
}

NTSP_Ajax.prototype.parseProcessResult = function (process_result) {
    if (typeof process_result['record_id'] == "string" && process_result['record_id']) {
        this.record_id = process_result['record_id'];
    }
    if (this.result_id) {
        var result_box = document.getElementById(this.result_id);
        if (typeof process_result['success'] == "string" && process_result['success']) {
            // mettre un style vert
            result_box.className = this.result_success_class;
            result_box.innerHTML = process_result['success'];
        } else if (typeof process_result['error'] == "string" && process_result['error']) {
            // mettre un style rouge
            result_box.className = this.result_error_class;
            result_box.innerHTML = process_result['error'];
        }
    }
}

function NTSP_cloneObject(what) {
    for (i in what) {
        if (typeof what[i] == 'object') {
            this[i] = new NTSP_cloneObject(what[i]);
        }
        else
            this[i] = what[i];
    }
}

