var ajaxEndFlag;

/*
Elle soumet un formulaire en mettant le nom de l'objet qui a demandé la soumission (@submittedBy) dans un
controle spéciale dont l'identifiant est oser_submitted_by_id. Si @submitFlag est présent et positionné à true alors
on execute document.form.submit(); Cela permet de gérer le cas des bouton images pour lesquels si on ajoute cette
instruction le formulaire est soumis deux fois dans IE.
*/
function oser_submit(submittedBy, submitFlag){
    if(typeof submitFlag == "undefined") 
        submitFlag = false;
    var submitCtrl = document.getElementById('oser_submitted_by_id');
    if(submitCtrl!=null)
        submitCtrl.value=submittedBy;
    if(submitFlag)
        document.form.submit();    
    return false;
}

/*
Elle fait la même chose que oser_submit après avoir changé l'action du formulaire dans le cas où sont
paramètre @actionUrl est défini et non vide
*/
function oser_submit_action(formId, ctrlName, actionUrl, submitFlag){
    if(typeof actionUrl != "undefined" && actionUrl != ''){//on change l'action
           document.getElementById(formId).action=actionUrl; 
        }
        return oser_submit(ctrlName, submitFlag);        
}


function ifEmpty(ctrlId, msg){
    if(document.getElementById(ctrlId).options.length<1){
        alert(msg);
        return false;
    }
    return true;
}

function setReload(reloadId, crtVal){
     var reload = document.getElementById(reloadId);
   //alert('le reload vaut:'+reload.value);
   reload.value = (crtVal-1+2)%2;
   return;
}

function reportToClient(msg){
    alert(msg);
}

function reportToServer(msg){
    //on envoie le msg par ajax au server
    alert(msg);
}


function isNumeric(sText){
    var validChars = "0123456789.";
    var isNumber=true;
    var ch;
    for (i = 0; i < sText.length && isNumber == true; i++){ 
        ch = sText.charAt(i); 
        if(validChars.indexOf(ch) == -1){
            isNumber = false;
        }
    }
    return isNumber;
}

function findIndex(arr, val){
  if(arr==null)
    return -1;
  for(var i=0; i<arr.length; i++){
    if(arr[i]==val)
      return i;
  }
  return -1;
}

function addMessageOption(ctrlName, value, text){
    var ctrl = document.getElementById(ctrlName+'_id');
    ctrl.options[ctrl.options.length] = new Option(text, value, false, true);
    ctrl.selectedIndex=ctrl.options.length - 1;
    return;
}
function getSelectedOptionValue(ctrlId){
    var ctrl = document.getElementById(ctrlId);
    if(ctrl==null)
        return null;
    if(ctrl.selectedIndex==-1)
        return null;
    return ctrl.options[ctrl.selectedIndex].value;
}

/*
A l'usage des contrôles select simple, elle soumet un formulaire suite à un changement. Si la valeur courante 
du select est celle du paramètre @defaultValue alors le formulaires est soumit, et dans ce cas l'action du 
formulaire sera changée si @actionUrl est défini et non vide

*/
function onchangeSubmit(formId, ctrlName, defaultValue, actionUrl){
    var ctrl = document.getElementById(ctrlName+'_id');
    if(ctrl.options[ctrl.selectedIndex].value!=defaultValue){//on fait le submit
       oser_submit_action(formId, ctrlName, actionUrl, true);
    }
}
/*
Retourne la valeur courante du contrôle si c'est un input, hidden ou un select simple
*/
function getCtrlValue(ctrlId){
    var ctrl = document.getElementById(ctrlId);
    if(ctrl==null)
        return null;
    if(ctrl.type=='input' || ctrl.type=='hidden')
        return ctrl.value;
    //sinon, on suppose que c'est un select
    if(ctrl.selectedIndex==-1)
        return null;
    return ctrl.options[ctrl.selectedIndex].value;
 }
 
/*@nameValueList string: une liste de nom de contrôle|valeur séparés par ||
  @submittedBy string: S'il est présent alors le formulaire ne sera pas soumit
  But: Elle met dans chaque contrôle la valeur associée et soumet le formulaire si 
        @notSubmittedFlag n'est pas positionné.
*/
function setValues(nameValueList){
    //alert('setValues: nameValueList='+nameValueList+ ' et ' +items[0].split('|')[0] + '_id'); 
    if(nameValueList.length>0){
        var items = nameValueList.split('||');   
        for(var i=0; i<items.length; i++){
            document.getElementById(items[i].split('|')[0] + '_id').value = items[i].split('|')[1];
        }
    }
    return;
}

/*
Elle enleve du controle sourceId toutes les options (identifiée par leur 'value') qui figurent dans destinationId
*/
function filterSourceOptions(sourceId , destinationId) {
    var source = document.getElementById(sourceId);
    var srceOptions = source.options;
    var destination = document.getElementById(destinationId);
    var destOptions = destination.options;
    var i = 0;
    var jj;
    //alert('source.length='+source.length);
    for(var i=0; i<destOptions.length; i++){
        jj = 0;
        while(jj<source.length){
            if (srceOptions[jj].value==destOptions[i].value) {//il faut virer cet élément de la source
                srceOptions[jj] = null;
            }
            else{//on saute cet élément car il n'est pas dans la destination, il reste dans la source
                jj++;
            }
        }
    }
}
/* 
    @select object: Select Objet  de Javascript (la vérification n'est pas faite).
    @sep string: Séparateur    
    BUT: Elle met les texts des options selectionnées du select dans une chaîne avec 
        @sep comme séparateur '|' si @sep n'est pas fourni.
*/
function getSelectedOptionsText(select, sep){
    if(typeof sep == "undefined") 
        sep = '|';
    var options = document.getElementById(select.getAttribute('id')).options;
    var ret = '';
    var flag = true;
    for (var i=0; i<options.length; i++) {
        if (options[i].selected) {
            if(flag){
                ret = options[i].text;
                flag = false;
            }
            else
                ret += sep+options[i].text;
        }
    } 
    return ret;
}

/* 
    @select object: Select Objet  de Javascript (la vérification n'est pas faite).
    @sep string: Séparateur 
    @saveYears boolean: Sa présence indique qu'il faut recupérer les années dui terminent
        le texte de chaque option. Les années sont séparées des textes par '|'           
    BUT: Elle met toutes les options du select à 'selected' et leur texts dans une 
        chaîne avec @sep comme séparateur.
        Elle est utilisées dans le cadre des paniers ou contrôle apparenté pour
        permettre l'envoie du contenu du panier. L'options @years permet de recupérer
        les éventuelles années qui figurent dans les texts, c'est le cas lors de la 
        recupérartion de données et l'année est composée des 4 dernier caractéres.
        Les années sont séparées du reste par un doublement de @sep 
*/
function getAllOptionsText(select, saveYears, sep){
    if(typeof sep == "undefined") sep = '|';
    if(typeof saveYears == "undefined") saveYears = false;
    //alert("llllllllllllll");
    var options = document.getElementById(select.getAttribute('id')).options;    
    var ret = '';
    var flag = true;
    if(!saveYears){        
        for (var i=0; i<options.length; i++) {    
            if(flag){
                ret = options[i].text;
                flag = false;
            }
            else{
                ret += '|'+options[i].text; 
            }
            select.options[i] = new Option(options[i].text, options[i].value, false, true);
        }
        return ret;
    }
    var years='';
    for (var i=0; i<options.length; i++) {    
        if(flag){
            ret = options[i].text;
            years = options[i].text.substring(options[i].text.length-4);
            flag = false;
        }
        else{
            ret += '|'+options[i].text;
            years += sep+options[i].text.substring(options[i].text.length-4);
        }
        select.options[i] = new Option(options[i].text, options[i].value, false, true);    
    }
    if(ret.length>0)
        ret +='||'+years;
    //alert("Ret est: "+ret);
    return ret;                                                           
}

/*  @formId string: identifiant de formulaire.    
    BUT: Pour chaque contrôle select simple ou multiple du formulaire elle vérifie s'il existe un champs 
        caché correspondant et dans l'affirmative y met les texts des options selectionnées 
        en les séparant par des |.
*/
function saveTextsOfSelectedOptions(formId){     
    var selects = document.getElementById(formId).getElementsByTagName('select'); 
    var ident;     
    for(var j=0; j<selects.length; j++){
        var hiddenInput = document.getElementById(selects[j].getAttribute("name")+'_hidden_id');
        if(hiddenInput!=null){
            //var selectedOptionValue = select.options[select.selectedIndex].value ;
            hiddenInput.value = '';
            if(selects[j].selectedIndex>-1){             
                hiddenInput.setAttribute('value', selects[j].options[selects[j].selectedIndex].text); 
                //alert(hiddenInput.getAttribute('value')+' trouvé !');
            }   
        }       
    }    
}
/* 
  @select Object: Select Object
  @arrayOfValues Array: Tableau de valeurs    
    BUT: Met à selected toutes les options dont la valeur figure dans le tableau 
    arrayOfValues. Cela est utile pour mettre en brillance des options de select
    multiple dès le chargement chez le client (on évite d'aller fouiller dans les 
    option au niveau du serveur). 
*/
function setOptionsSelected(select, arrayOfValues){
    var options = document.getElementById(select.getAttribute('id')).options;      
    for (var i=0; i<options.length; i++) {
        if(findIndex(arrayOfValues, options[i].value)>-1)
            select.options[i] = new Option(options[i].text, options[i].value, false, true);
    }       
}

  

/*
  @ctrlName string: Nom d'un contrôle. Une div dont l'identifiant est ctrlName_div_id 
    doit exister
  @label string: Text du label qui doit accompagner le contrôle à créer.
  @type string: Le type du contrôle à créer (select, file, input, text ...)
  BUT: Elle construit un contrôle. Le label et le contrôle seront contenu dans deux div 
      (identifiées par ctrlName_div_label_id et ctrlName_div_cell_id) qui elles même sont 
      dans la div dont l'identifiant est ctrlName_div_id. Si les divs n'existent pas 
      elle sont créées dans ctrlName_div_id.
      Sa différence avec l'ancienne est qu'elle pose son html directement dans la div container   
*/
function addCtrlElement(ctrlName, label, type, value, help, note) {
    var div = document.getElementById(ctrlName+'_div_id');
    var id = ctrlName+'_id';
    var html = '<center><div style="float:left;width:35%; text-align:left;padding-right:10px;border:0px solid black;margin-left:10px;">';
    html += '<font class="labels">'+label+'</font><font style="color:red">&nbsp;*</font></div><div style="float:left;border:0px solid pink;text-align:left;">';
    
    html += '<input id="'+id+'" name="'+ctrlName+'" type="'+type+'"';
    if(value!=null)
        html += 'value="'+value+'">';
    html += '</input>';
    if(typeof note!="undefined")
        html += '<br><font style="color:red">'+note+'</font><br />';
    html += '</div></center>';
    if(help!=null){
        html += '<div style="float:left"><img style="display:block;" ';
        html += 'src="'+IMG+'info.gif" ';
        html += 'onmouseover="javascript:show(\'oser_info_bulle_id\',\''+help+'\')" ';
        html += 'onmouseout="javascript:hide(\'oser_info_bulle_id\')"></div>';
    }
    //alert('html= '+html);
    div.innerHTML = html;
    div.style.display = 'block';    
}

  



/*Pour éviter de mettre l'instruction document.getElementById(fileCtrlName+'_hidden_id').value='';
dans le lien  de la modification du choix de fichier.
*/
function toggleFileCtrlContentAux(fileCtrlName, label, postBackMsg, help){
   document.getElementById(fileCtrlName+'_hidden_id').value='';
   toggleFileCtrlContent(fileCtrlName, label, postBackMsg, help);    
}
/* 
  @fileCtrlName string: Nom du controle en charge du upload d'un fichier
  @actionType boolean: Si @actionType vaut true elle fait un controle permettant de 
  uploader un fichier. Sinon un message indiquant le nom du fichier déjà fourni et 
  la possibilité de le modifier. 
*/
function toggleFileCtrlContent(fileCtrlName, label, postBackMsg, help){
    var hidden = document.getElementById(fileCtrlName+'_hidden_id'); 
    //alert(hidden.value.length);
    if(hidden.value.length==0){//il faut poser le controle de fichier
        //les deux 'null' sont pour value et help
        if(postBackMsg.length>0)//il faut le message d'erreur
            addCtrlElement(fileCtrlName, label, 'file', null, help, postBackMsg);
        else
            addCtrlElement(fileCtrlName, label, 'file', null, help);
        return;//fin car un controle a été posé
    }
    //le fichier existe, il faut poser le lien qui permet de le modifier
    var file = document.getElementById(fileCtrlName+'_id');
    if(file!=null)        
        hidden.value = file.value;//on est la a cause d'un onchange du controle type=file, sinon c'est le load
    var filename = hidden.value;
    var html = '<center><div style="float:left;width:35%; text-align:left;padding-right:10px;border:0px solid black;margin-left:15px;">';
    var tmp = fileCtrlName == 'fichier'?'Fichier actuel':'Vignette actuelle';
    html += '<font class="labels">'+tmp+'</font> <font style="color:red">&nbsp;*</font></div>';    
    html += '<div style="float:left;">'+filename+'&nbsp;&nbsp;&nbsp;&nbsp;';
    html += '<a href="#?name='+filename+'" class="lien" ';
    html += 'onclick="javascript:toggleFileCtrlContentAux(\''+fileCtrlName+'\', \'&nbsp;&nbsp;'+label+'\', \''+postBackMsg+'\', \''+help+'\')">';
    tmp = fileCtrlName == 'fichier'?'Changer le fichier':'Changer la vignette';
    html += tmp+'</a> </div></center>';
    //alert('toggleFileCtrlContent, ajout de paragraphe:\n labelHTML='+html);
    document.getElementById(fileCtrlName+'_div_id').innerHTML = html;
    return;
}

/*
Elle construit les options d'un ou plusieurs selects en partant d'une chaine de 
value1|text1||value1|text1.
@ctrlIds string: Liste d'identifiants (ou de noms) de contrôles select: id1|id2 ...
@optionsList string: Les options des selects séparées par |||
@defaultValues string optionnel: Les valeurs par défaut des selects (* si pas de valeur par défaut
    pour un select donné).
*/
function setOptionsFormString(ctrlIds, optionsList, defaultValues){
    var ctrls = ctrlIds.split('|');
    //on vérifie si ce sont des noms ou des id
    var id = document.getElementById(ctrls[0])==null?'_id':'';    
    var stringOptions = optionsList.split('|||');
    var dfltValues = typeof defaultValues=="undefined"?new Array():defaultValues.split('|');
    if(ctrls.length!=stringOptions.length || (dfltValues.length!=0 && ctrls.length!=dfltValues.length)){
        //alert('Le nombre de contrôles est différent de celui des options ou des valeurs par défault\nctrlIds='+ctrlIds+', defaultValues='+defaultValues+', nb options='+stringOptions.length);
        return;
    }
    
    for(var i=0; i<ctrls.length; i++){//boucle sur les ctrl
        //alert('setOptionsFormString: id courant = '+ctrls[i]+id);
        var ctrl = document.getElementById(ctrls[i]+id);
        var options = ctrl.options;
        options.length = 0;
        var valueTextArray = stringOptions[i].split('||');
        if(valueTextArray.length==1){//zero options (on tient compte du caractère illisible de devant, c'est souvent une erreur
            //alert('Pas d’options pour le contrôle' + ctrls[i]+' dans setOptionsFormString ! ctrlIds='+ctrlIds+'  et  optionsList='+optionsList);
            continue; 
        }    
        var optionsAttr;   
        for(var j=1; j<valueTextArray.length; j++){//boucle sur les options
            optionsAttr = valueTextArray[j].split('|');
            options[j-1] = new Option(optionsAttr[1], optionsAttr[0], false, false);
            options[j-1].title = optionsAttr[1];
        }
        //alert('setOptionsFormString: dfltValues.length='+dfltValues.length);
        if(dfltValues.length!=0){
            //alert('setOptionsFormString: id courant = '+ctrls[i]+id+' default='+dfltValues[i]);
            setOptionsSelected(ctrl, new Array(dfltValues[i]));
        }
    }
}


function addTitles(selectId){
    //alert('addTitles: selectId='+selectId); 
    var options = document.getElementById(selectId).options;
    for (var i=0; i<options.length; i++){
        options[i].title = options[i].text;
    }
}


function setBasketOptions(srceDestArray, valuesTexts){
    //alert('setBasketOptions');
    setOptionsFormString(srceDestArray[0], valuesTexts);
    filterSourceOptions(srceDestArray[0], srceDestArray[1]); 
}

function setOptionsOfCtrls(ctrlIdsParam, str){
    var ctrlIds = ctrlIdsParam.split('|');
    var ctrlOptions = str.plit('|||');
    for(var i=0; i<ctrlIds.length; i++){
        setOptionsFormString(ctrlIds[i], ctrlOptions[i]);
    }
}
/*
@idsKeys contient des expressions de la forme [ctrlId|GETkey]*. Pour chaque occurrence on recupère la
valeur selectionnée du contrôle qui sera celle de la clée du paramètre 
*/
function setRecursiveOptions(leaderSelectId, url, idsKeys, firstIdsKeys){
    //alert('setRecursiveOptions: idsKeys='+idsKeys);
    if(leaderSelectId.length==0 || idsKeys.length==0){
        return;
    }
    var value = getSelectedOptionValue(leaderSelectId);
    var crtIdKey = idsKeys.split('||')[0].split('|');
    var id = crtIdKey[0];
    var key = crtIdKey[1];
    //alert('setRecursiveOptions: cle GET = '+key);
    //si un troisieme element existe c'est la valeur par défaut du contrôle à poser
    var ajaxParams = crtIdKey.length<3?new Array(id, nextIdsKeys):new Array(id, nextIdsKeys, crtIdKey[3]);
    var req = new AjaxRequest(); 
    var separatorIndex = idsKeys.indexOf('||');
    var nextIdsKeys = separatorIndex==-1 ? '' : idsKeys.substring(separatorIndex+2);
    if(typeof firstIdsKeys!="undefined"){
        var tmp = firstIdsKeys.split('||');
        for(var i=0; i<tmp.length; i++){
            url += '&'+tmp[i].split('|')[1]+'='+document.getElementById(tmp[i].split('|')[0]).value;
        }
    }       
    //alert('url='+url);
    req.loadXMLDoc(url+'&'+key+'='+value, 'rec_select', ajaxParams);
    return;
}

/**
 * GENERIC XMLHTTP FUNCTIONS
 */
function AjaxRequest(){
    var req;
    var actionType;
    var paramsArray;
    
    //var method = "GET";
    //var nocache = true;
    this.loadXMLDoc = function(url, action, params){
        // branch for native XMLHttpRequest object
        
        //alert("L'url est: "+url+";  \nl'action: " + action);
        paramsArray = params
        actionType = action;
                 
        if (window.XMLHttpRequest) {
            try {
                req = new XMLHttpRequest();
            } catch(e) {
                req = false;
            }
        // branch for IE/Windows ActiveX version
        } else if (window.ActiveXObject) {
            try {
                req = new ActiveXObject("Msxml2.XMLHTTP");
            } catch(e) {
                try {
                    req = new ActiveXObject("Microsoft.XMLHTTP");
                } catch(e) {
                    req = false;
                }
            }          
        }

        if (req) {
            req.onreadystatechange = processReqChange;
            // avoid caching by adding arbitrary values
            //url += '&zxyq=' + (new Date()).getTime();
            req.open("GET", url, true);
            req.send(null);
        }        
    }


    var processReqChange = function(){
    // only if req shows "complete"
        if (req.readyState == 4) {
            // only if "OK"
            //if (req.status == 0 || req.status == 200) {
            if (req.status == 200) {
                // processing statements go here
                //alert('Reponse du serveur à Ajax: '+req.responseText);     
                switch(actionType){
                    case 'select':
                        //alert('paramsArray.length='+paramsArray.length);
                        switch(paramsArray.length){
                            case 1:
                                setOptionsFormString(paramsArray[0], req.responseText);
                                break;
                            case 2:
                                setOptionsFormString(paramsArray[0], req.responseText, paramsArray[1]);
                                break;
                            default:
                                break;
                        }
                        break;
                    case 'basket':
                        setBasketOptions(paramsArray, req.responseText);
                        break;
                    case 'set':
                        break;
                    case 'indic_terr':
                        break;
                        setOptionsOfCtrls(paramsArray, req.responseText);
                    case 'rec_select':
                        setOptionsFormString(paramsArray, req.responseText);
                        setRecursiveOptions(paramsArray[0], url, paramsArray[1]);
                        break;
                    case 'table':
                        setTableContentAux(paramsArray[0], req.responseText);
                        break;
                    case 'indic':
                        alert('indic: not used anymore');
                        var ctrlNames = paramsArray[0].split('|');
                        var dfltVals = paramsArray[1].split('|');
                        var options = req.responseText.split('|||');
                        //alert('nb options = '+options.length);
                        for(var i=0; i<options.length; i++){
                            //alert('ctrl et dflt='+idsDfltVals[i]+'; options='+options[i]);
                            setOptionsFormString(ctrlNames[i]+'_id', options[i], dfltVals[i]);
                        }
                        break;
                    default:
                        alert(action+": Action non reconnue par la classe AjaxRequest");
                }
            } else {

            }
        }
    }
}

/* 
BUT: Pour un controle dont la valeur détermine le contenu de plusieurs autres elle détermine 
    de ceux-ci sous la forme options1|||options2||| ... et les cherge.
@leaderSelectIds string: identifiant d'un ou plusieurs contrôles suivi de le clé get.
    Ces contrôles commandent le contenu d'un ou plusieurs contrôles select.
@filterUrl string: L'url a contacter pour obtenir la liste des options
@ctrlNames string : noms des select dépendants séparés par '|'.
@defaultValues string (optionnel): valeurs par défault des selects séparées par '|'. S'il est 
    présent sa taille doit être égale à celle de @ctrlNames.
*/
function setMultipleOptions(leaderSelectIds, filterUrl, ctrlNames, defaultValues){
    //alert('les id et cles get dans setMultipleOptions: '+leaderSelectIds+'; ctrlNames='+ctrlNames);
    if(leaderSelectIds.length>0){//on est dans le cas où il faut ajouter la valeur d'un paramètre _GET
        var idGetkey = leaderSelectIds.split('||');
        var leaderCtrl;
        var curCtrlElts
        for(var i=0; i<idGetkey.length; i++){
            curCtrlElts = idGetkey[i].split('|');
            //alert('setMultipleOptions: leader id courant='+[0]);
            leaderCtrl = document.getElementById(curCtrlElts[0]);
            if(curCtrlElts.length==2){//c'est un select
                filterUrl += '&'+curCtrlElts[1]+'='+leaderCtrl.options[leaderCtrl.selectedIndex].value;
            }
            else{//c'est un input
                filterUrl += '&'+curCtrlElts[1]+'='+leaderCtrl.value;
            }
        }
    }
    var req = new AjaxRequest();
    req.loadXMLDoc(filterUrl, 'select', typeof defaultValues=="undefined"?new Array(ctrlNames):new Array(ctrlNames, defaultValues));
    return;   
}

/* 
  @leaderSelectId string: identifiant d'un select qui commande le comtenu d'un autre
  @idsAndUrls string : Suite de i|u;i|u,i|u d'identifiant de select et d'url
  BUT: Pour chaque valeur de @leaderSelectId  les contenus des selcts subordonnés
        sont mis à jour en passant dans l'url fournie et l'option selectionnée dans 
        @leaderSelectId. Ainsi il peut en commander plusieurs selects, les mettant à jour
        en focntion des paramètre fournis dans @idsAndUrls.
*/
function setOptionsOfSubordinates(leaderSelectId, action, idsAndUrls, sndParam){
    var value = '';
    /*si un identifiant de contrôle non vide est founi alors la valeur de son option séléctionnée est celle
    du paramettre get immediatement apres
    */
    if(leaderSelectId.length>0){//on est dans le cas où il faut ajouter la valeur d'un paramètre _GET
        var leaderSelect = document.getElementById(leaderSelectId);
        value = leaderSelect.options[leaderSelect.selectedIndex].value;
    }
    //alert("SelctedIndex de "+leaderSelectId+": "+leaderSelect.selectedIndex);
    var parameters = idsAndUrls.split('||');
    var paramArray;
    for(var i=0; i<parameters.length; i++){
        var id = parameters[i].split('|')[0];
        var url = parameters[i].split('|')[1];
        //alert("Parametres: "+parameters[i]+selectedOptionValue+"; i="+i);
        var req = new AjaxRequest();  
        if(typeof sndParam == "undefined")
            paramArray = new Array(id);
        else
            paramArray = new Array(id, sndParam);        
        req.loadXMLDoc(url+value, action, paramArray);
        //req.loadXMLDoc(subordinateSelect, url+selectedOptionValue, new Array(sourceId, destinationId));
    }
  return req;   
}
/*
Elle cherche la div qui contient celle dont l'identifiant est passé en paramètre
*/
function getParentDiv(childId){
    var allDivs = document.getElementsByTagName('div');    
    var children;
    var div;
    for(var i=0; i<allDivs.length; i++){
        children = allDivs[i].childNodes;        
        for(var j=0; j<children.length; j++){        
            if(children[j].id==childId){//le noeud en paramètre est enfant de allDivs[i]
               //alert('Trouvé');
                return allDivs[i];
            }
        }
    }
   //alert('getParentDiv:'+childId+' parent not found');
   return null;
}

function deplacer(sourceId, destinationId) {
    var srceOptions = document.getElementById(sourceId).options;
    var destination = document.getElementById(destinationId);
    var i = 0;
    while(i<srceOptions.length){
        if (srceOptions[i].selected) {//cet élément est selectionné
            destination.options[destination.length] = new Option(srceOptions[i].text, srceOptions[i].value, false, false);//on tente de le déplacer
            destination.options[destination.length -1].title = srceOptions[i].text; 
            destination.options[destination.length-1].text = srceOptions[i].text;
            srceOptions[i] = null; //on l'a copié dans destination, on le supprime
        }
        else//on saute cet élément car il n'est pas sélectionné
            i++;
    }
}


function setToggleDiv(innerDivIds, msg){
    var ids = innerDivIds.length=0?new Array():innerDivIds.split('|');
    var innerDivId;
    var innerDiv;
    var div;
    for(var i=0; i<ids.length; i++){
        innerDivId = ids[i];
        innerDiv = document.getElementById(innerDivId);
         if(innerDiv==null){//La div interne n'existe pas
            reportToClient(msg);
            reportToServer(msg);
            return false;
        }   
        if(!(div=getParentDiv(innerDivId))){//La div externe n'a pa été trouvée
            reportToClient(msg);
            reportToServer(msg);
            return false;
       }   
        //il faut enlever la div interne
        div.removeChild(innerDiv);
        div.id = innerDivId;//il reprend l'identifiant de la div interne
        div.aspect=false;
        div.style.margin='0px';
        div.style.padding='0px';
    }
    return true;
}


function hide(divId){
   var div = document.getElementById(divId);
   div.style.visibility="hidden";
   div.aspect = false; // Si la bulle etais visible on la cache
}

function show(divId, helpText){
       var div = document.getElementById(divId);
       for(var i=0; i<40000; i++);
       div.style.visibility="visible"; // Si il est cacher (la verif n'est qu'une securité) on le rend visible.
       div.innerHTML = helpText; // Cette fonction est a améliorer, il parait qu'elle n'est pas valide (mais elle marche)
       div.aspect = true;
}

//var i = 0;
function move(e) {
    //if(i++%200==0)alert('move appelé');
   var div = document.getElementById('oser_info_bulle_id');
      if(div.aspect){  // Si la bulle est visible, on calcul en temps reel sa position ideale
              if (navigator.appName!="Microsoft Internet Explorer") { // Si on est pas sous IE
                  div.style.left=e.pageX - 10+"px";
                      div.style.top= e.pageY +15+"px";
                      div.style.padding="5px";
              }
              else { // Mode Quirks pour les versions inférieures à IE 6.0
                      if(document.documentElement.clientWidth>0) {
                              div.style.left=event.x+document.documentElement.scrollLeft-10+"px";
                              div.style.top=event.y+document.documentElement.scrollTop+15+"px";
                              div.style.padding="5px";
                      }
                      else { // Pour version IE 6.0 ou +
                              div.style.left=event.x+document.body.scrollLeft-10+"px";
                              div.style.top=event.y+document.body.scrollTop+15+"px";
                              div.style.padding="5px";
                      }
              }
      }
}

// Fonction pour ajouter le site aux favoris dans le navigateur
function favoris() {
    if ( navigator.appName != 'Microsoft Internet Explorer' ){
    window.sidebar.addPanel("OSER70 - Observatoire Socio-Economique en Réseau de la Haute-Saône","http://www.oser70.fr/","");
    }
    else {
    window.external.AddFavorite("http://www.oser70.fr/","OSER70 - Observatoire Socio-Economique en Réseau de la Haute-Saône");
    }
}

function setContent(url, idsAndKeys){
    if(typeof idsAndKeys == "undefined"){
        var elts = idsAndKeys.split('||');
        for(var i=0; i<elts.length; i++){
            url += '&'+elts[i].split('|')[1]+'='+document.getElementById(elts[i].split('|')[0]).value;
        }
    }
    var req = new AjaxRequest();
    req.loadXMLDoc(url, 'set', new Array());
    
}

function ecraseRadio(){
    //alert('ecraseRadio: debut');
    var arr = new Array('div_radio1', 'div_radio2');
    var node = document.getElementById('center_divradio');
    if(node!=null && node!='null'){
        node.removeChild(document.getElementById('div_radio1'));
        node.removeChild(document.getElementById('div_radio2'));
    }
    //alert('ecraseRadio: fin');
    
   /* for(var i=1; i<arr.length; i++){
    
    var div = doucment.getElementById;
    for(var i=0; i<ids.length; i++){
        innerDivId = ids[i];
        innerDiv = document.getElementById(innerDivId);
         if(innerDiv==null){//La div interne n'existe pas
            reportToClient(msg);
            reportToServer(msg);
            return false;
        }   
        if(!(div=getParentDiv(innerDivId))){//La div externe n'a pa été trouvée
            reportToClient(msg);
            reportToServer(msg);
            return false;
       }   
        //il faut enlever la div interne
        div.removeChild(innerDiv);
        div.id = innerDivId;//il reprend l'identifiant de la div interne
        div.aspect=false;
        div.style.margin='0px';
        div.style.padding='0px';
    }
    return true;*/
}
var ajaxEndFlag;

/**
 * GENERIC XMLHTTP FUNCTIONS
 */
function AjaxRequest()
{
    var req;
    //var method = "GET";
    //var nocache = true;

    this.loadXMLDoc = function(url)
    {
        // branch for native XMLHttpRequest object
        if (window.XMLHttpRequest) {
            try {
                req = new XMLHttpRequest();
            } catch(e) {
                req = false;
            }
        // branch for IE/Windows ActiveX version
        } else if (window.ActiveXObject) {
            try {
                req = new ActiveXObject("Msxml2.XMLHTTP");
            } catch(e) {
                try {
                    req = new ActiveXObject("Microsoft.XMLHTTP");
                } catch(e) {
                    req = false;
                }
            }
        }

        if (req) {
            req.onreadystatechange = processReqChange;
            // avoid caching by adding arbitrary values
            //url += '&zxyq=' + (new Date()).getTime();
            req.open("GET", url, true);
            req.send(null);
        }
    }

    var processReqChange = function()
    {
        // only if req shows "complete"
        if (req.readyState == 4) {
            // only if "OK"
            //if (req.status == 0 || req.status == 200) {
            if (req.status == 200) {
                // processing statements go here
                //alert(req.responseText);
                eval('response = ' + req.responseText);
                if (response.method){
                    method = response.method;
                    eval(method + '(\'\',' + req.responseText + ')');
                } else {
                    eval(req.responseText);
                }
            } else {

            }
        }
    }
}

/**************************************************************************/
/**************************************************************************/
/*     Fonctions de chargement  de l'identite              */
/**************************************************************************/
/**************************************************************************/


function liste_identite(action, url, territoire){
    document.getElementById('identite_id').style.display='block';
    document.getElementById('chiffres_cles_id').style.display='none';
    document.getElementById('tous_les_chiffres_id').style.display='none';
    document.getElementById('chiffres_cles_id').innerHTML='';
    document.getElementById('tous_les_chiffres_id').innerHTML='';
    url = url + '?action=' + action + '&territoire=' + territoire;
    valid_liste(url,'','identite');
}

function liste_chiffres_cles(action, url, territoire){
    document.getElementById('identite_id').style.display='none';
    document.getElementById('chiffres_cles_id').style.display='block';
    document.getElementById('tous_les_chiffres_id').style.display='none';
    document.getElementById('identite_id').innerHTML='';
    document.getElementById('tous_les_chiffres_id').innerHTML='';
    url = url + '?action=' + action + '&territoire=' + territoire;
    valid_liste(url,'','chiffres_cles');
}

function liste_tous_les_chiffres(action, url, territoire){
    document.getElementById('identite_id').style.display='none';
    document.getElementById('chiffres_cles_id').style.display='none';
    document.getElementById('tous_les_chiffres_id').style.display='block';
    document.getElementById('identite_id').innerHTML='';
    document.getElementById('chiffres_cles_id').innerHTML='';
    url = url + '?action=' + action + '&territoire=' + territoire;
    valid_liste(url,'','tous_les_chiffres');
}


/* Fonction  qui se charge de récupérer les résultats de la page serveur */
function valid_liste(qurl, response, madiv){
  if (response != ''){ //Le résultat a été récupéré
	    var tableau=response.tableau;
	    var madiv=response.madiv;
	    var ctrl = document.getElementById(madiv+'_id');
	    ctrl.innerHTML = tableau; 
    }else{ //Appel du serveur dans le but de récupérer les résultat
		  var ctrl = document.getElementById(madiv+'_id');
		  ctrl.style.display='block';
      ctrl.innerHTML = '<center><div style="height:140px"><br><br><br><IMG id="loadingimg" alt="Chargement" src="../../presentation/images/loading.gif"></div></center>';
      var req = new AjaxRequest();
      req.loadXMLDoc(qurl);
    }
}

function mouseMove(evt) { 
    //Affichage de la div
    var div = document.getElementById('oser_info_bulle_id');
    div.style.display='block';

    //Taille du scroll
    offsetY = (document.all) ? document.body.scrollTop : window.pageYOffset;
    offsetX = (document.all) ? document.body.scrollLeft : window.pageXOffset;
		var x=0; var y=0;
		if (document.layers) {
			x=evt.x; y=evt.y;
		} 
		if (document.all) {
			x=event.clientX; y=event.clientY;
		} else {
			if (document.getElementById) {
				x=evt.clientX; y=evt.clientY; 
			}
		}
		//Décalage du au centrage de l'application sur de grande résolutions
	  var decalage = 0;
    if(navigator.appName=="Microsoft Internet Explorer"){decalage=(screen.width - 1024)/2;}

    //Définition de la largeur et de la hauteur de l'image à afficher
    var hauteurImage = document.getElementById('vignetteAgrandie').height;
    var largeurImage = document.getElementById('vignetteAgrandie').width;
    //Affichage de la div en fonction de la position du curseur
    switch(true){ 
        case (x-decalage)<(largeurImage):
              div.style.left=(x-decalage)+5+"px"; 
              break;
        default:
              div.style.left=x-decalage-(largeurImage+5)+"px"; 
              break;
    }   
    switch(true){ 
        case y<(hauteurImage/2):
              div.style.top=y+offsetY+"px";
              break;
        case y>hauteurImage:
              div.style.top=y+offsetY-hauteurImage+"px";
              break;
        default:
              div.style.top=y+offsetY-(hauteurImage/2)+"px";
              break;
    }   
} 

function centerPopup(divId,helpText) {
      var div = document.getElementById('oser_info_bulle_id');
      div.innerHTML = helpText;
      addEvent(document,'mousemove',mouseMove);
}

function cache(divId) {
      removeEvent( document, 'mousemove', mouseMove);
      var div = document.getElementById(divId);
      div.style.display='none';
}

function addEvent( obj, type, fn ) {
  if ( obj.attachEvent ) {
    obj['e'+type+fn] = fn;
    obj[type+fn] = function(){obj['e'+type+fn]( window.event );}
    obj.attachEvent( 'on'+type, obj[type+fn] );
  } else
    obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
  if ( obj.detachEvent ) {
    obj.detachEvent( 'on'+type, obj[type+fn] );
    obj[type+fn] = null;
  } else
    obj.removeEventListener( type, fn, false );
}
