var ajaxEndFlag;
var loadingOn = false;
var nbLoadingsOn = 0;

/*
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){
    //alert('oser_submit : '+submittedBy);
    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;
}
/*
Fait la meme chose que document.getElementById mais si ne trouve pas avec idOrName esaie avec idOrName_id
*/
function getElt(idOrName){
    var elt = document.getElementById(idOrName);
    return elt==null?document.getElementById(idOrName+'_id'):elt;
}
function oser_submit_creation_te(formId, submittedBy, ctrlsToSave){
    //alert('oser_submit_creation_te : '+submittedBy);
    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 true;
    }
    return false;
}

function replaceTextCotes(ctrl){
  ctrl.value = ctrl.value.replace("'", '’');
}

/* This fucntion controles the content of a basket.
It returns TRUE if the number of selected options is between @minSize and @maxSize,
otherwise it returns false after sending and alert if @msg is defined and not empty ('' string).
*/
function checkBasketSize(ctrlId, minSize, maxSize, msg){
    var len = document.getElementById(ctrlId).options.length;
    if(len < minSize || len > maxSize){
        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;
}

function getSelectedOptionText(ctrlId){
    var ctrl = document.getElementById(ctrlId);
    if(ctrl==null)
        return null;
    if(ctrl.selectedIndex==-1)
        return null;
    return ctrl.options[ctrl.selectedIndex].text;
}

/*
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('||');
        var val;   
        for(var i=0; i<items.length; i++){
            val = items[i].split('|')[1];
            //alert('pour '+items[i].split('|')[0]+' val='+val);
            document.getElementById(items[i].split('|')[0] + '_id').value = (typeof val == "undefined")?'':val;
        }
    }
    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){
    select = (typeof select == "string")?document.getElementById(select):select;      
    var options = select.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 .
      DIV contenant le champ Parcourir pour les vignettes, fichiers ...  
*/
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 red;margin-left:15px;">';
    html += '<font class="labels">'+label.replace('required', '<font style=\'color:red\'>&nbsp;*</font>')+'</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"){ //unite de borne n'est pas obligatoire mais ne doit pas depasser une certaine taille
        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+'\', event)" ';
        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(required, fileCtrlName, label, postBackMsg, help){
   document.getElementById(fileCtrlName+'_hidden_id').value='';
   toggleFileCtrlContent(required, 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(required, 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_info'?'Fichier actuel':'Vignette actuelle';
    html += '<font class="labels">'+tmp+'</font>';
    if(required==1){
        html += ' <font style="color:red">&nbsp;*</font>';
        //label += 'required';
        //alert(label += ' <font style=\'color:red\'>&nbsp;*</font>');
    };
    html += '</div><div style="float:left;">'+filename+'&nbsp;&nbsp;&nbsp;&nbsp;';
    html += '<a href="#?name='+filename+'" class="lien" ';
    html += 'onclick="javascript:toggleFileCtrlContentAux('+required+', \''+fileCtrlName+'\', \''+label+'\', \''+postBackMsg+'\', \''+help+'\')">';
    tmp = fileCtrlName == 'fichier_info'?'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){
    //alert('setOptionsFormString : ctrlIds='+ctrlIds+'  optionsList='+optionsList+'  defaultValues='+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
            //alert('setOptionsFormString: '+valueTextArray);
            optionsAttr = valueTextArray[j].split('|');
            options[j-1] = new Option(optionsAttr[1], optionsAttr[0], false, false);
            options[j-1].title = optionsAttr.length>=3 ? optionsAttr[2] : 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;
    }
}


/*
Elle complete le titre d'un des panier d'un controle BASKET. Son objectif principal est de remplacer la sequence &*& par la 
taille du panier concerne. Si le flag ctrlFlag est positionne text designe l'id d'un input qui contient le text 
source
*/
function setBasketTitleOld(ctrlId, divId, text, ctrlFlag){
    //alert('title for '+divId+' = '+text);
    var titleDiv = document.getElementById(divId);
    var ctrl = document.getElementById(ctrlId);
    if(titleDiv==null || ctrl==null) return false;
    if(typeof ctrlFlag != "undefined"){
        text = document.getElementById(text).value;
    }
    if(ctrl.tagName=='input'){
        titleDiv.innerHTML = text.replace('&*&', ctrl.value);
    }else{//on suppose que c'est un select
        titleDiv.innerHTML = text.replace('&*&', ctrl.length);
    }
    return true;
}

function setBasketTitle(divId, ctrlId, msg){
    //alert('setBasketTitle : msg='+msg);
    var titleDiv = document.getElementById(divId);
    var ctrl = document.getElementById(ctrlId);
    if(titleDiv==null || ctrl==null) return false;
    var content;
    var al;
    for (var att in titleDiv) {al += 'name='+att+'  value='+titleDiv[att]+';   ';}
    //document.write('titleDiv contains : '+al);
    if(ctrl.tagName=='input'){
        content = titleDiv.label.replace('&*&', ctrl.value);
    }else{//on suppose que c'est un select
        content = titleDiv.label.replace('&*&', ctrl.length);
    }
    if(msg){
      titleDiv.msg = msg;
    }
    titleDiv.innerHTML = content + (titleDiv.msg?titleDiv.msg:'');
    return true;
}

function setBasketOptions(srceDestArray, valuesTexts){    
    var destId = srceDestArray[1].split('|')[0];
    var basketName = srceDestArray[1].split('|')[1];
    var tmp;
    valuesTexts = valuesTexts.split('|||');
    setOptionsFormString(srceDestArray[0], valuesTexts[0]);
    filterSourceOptions(srceDestArray[0], destId);
    setBasketTitle(basketName+'_top_id', srceDestArray[0], valuesTexts.length>1?valuesTexts[1]:'')        
    setBasketTitle(basketName+'_bottom_id', destId, false);//pas de warning
}

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 AjaxRequest1(); 
    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 AjaxRequest1(){
    var req;
    var actionType;
    var paramsArray;
    
    //var method = "GET";
    //var nocache = true;
    this.loadXMLDoc = function(url, action, params){
         if(action!='table' && action!='illus' && action!='illus_imprim_tout') {
            show(((action=='select' || action=='basket' || action=='indic_terr' || action=='set')?'static_':'')+'oser_info_bulle_id', '<center><img id="loadingclash" alt="Chargement" src="'+IMG+'loading_3.gif"></center>', null, action);
         }
         //alert('action='+action+', div='+((action=='select'?'static_':'')+'oser_info_bulle_id'))
        // 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);
                        //alert('Reponse du serveur à Ajax: '+req.responseText);
                        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;
                    case 'illus':
                        createIllusImageAux(paramsArray[0], req.responseText);
                        nbIllus--;
                        break;
                    case 'illus_imprim_tout':
                        createIllusImageAux(paramsArray[0], req.responseText);
                        nbAutresIllus--;
                        break;
                    break;
                    default:
                        alert(actionType+": Action non reconnue par la classe AjaxRequest1");
                }
                hide(((actionType=='select' || actionType=='basket' || actionType=='indic_terr' || actionType=='set')?'static_':'')+'oser_info_bulle_id');
            } 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 AjaxRequest1();
    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 AjaxRequest1();  
        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, basketName, from, to) {
    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].title = srceOptions[i].title ? srceOptions[i].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++;
    }
    var tmp;
    setBasketTitle(basketName+'_'+from+'_id', sourceId, false);
    setBasketTitle(basketName+'_'+to+'_id', destinationId, false);
}


function setToggleDiv(innerDivIds, msg, properties){//si le flag est positionne alors on n'ecrase pas la div
    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
        if(typeof properties != "undefined"){
            var tmp = properties.split('||');
            for(var i=0; i<tmp.length; i++){
                div.setAttribute(tmp[i].split('|')[0], tmp[i].split('|')[1]);
            }
        }else{
            div.aspect=false;
            div.style.margin='0px';
            div.style.padding='0px';
        }
    }
    return true;
}



function hide(divId){
    divFlags[divId] --;
    //alert('hide : divId='+divId);
    if(divFlags[divId]>=1){//les chargement ne sont pas tous finis, on ne cache pas
        //alert('hide : div occupée');
        return;
    }
    //les chargement sont tous finis, on cache
    var div = document.getElementById(divId);
    div.style.visibility="hidden";
    div.style.display='none';
    div.aspect = false;
    div.style.margin='0px';
    div.style.padding='0px';
    //document.onmousemove = null;
    //alert('hide : div libérée');
}

/*
Cette fonction permet de d'afficher du contenu dans une fenêtre de manière interactive. En général une seule div permet de visualiser
toutes les informations
*/
function show(divId, helpText, event, infoType, eventHandler, left, top){
    divFlags[divId] ++;
    if(divFlags[divId]>1) {//la div est occupé, on ne peut rien y mettre
        return;
    }
    var div = document.getElementById(divId);    
    if(typeof infoType == "undefined"){
        infoType = 'infoBulle';        
    }
    var padding = '0px';;
    var mousePos = null;
    div.style.border = '0px';
    switch(infoType){
    case 'infoBulle':
        padding = '5px';
        div.style.border = '1px solid Black';
        var mousePos = getMousePosition(event);
        mousePos.left = mousePos.left - screen.width/8;
        if(navigator.appName=="Microsoft Internet Explorer"){
            //break;
            //if(mousePos.left>screen.width*2/5) mousePos.left = mousePos.left - screen.width/4;
            div.style.width = (screen.width/4) + 'px';
        }
        div.style.left = mousePos.left + 'px';
        div.style.top = mousePos.top + 'px';
        break;
    case 'tabIndic':
      div.style.border = '1px solid Black';
      document.onmousemove = move;
      div.style.left = screen.width+'px'; 
      div.style.top = screen.height+'px';
    case 'illusIndic':
      document.onmousemove = move;
      div.style.left = screen.width+'px'; 
      div.style.top = screen.height+'px';
      break;
    case 'select': 
    case 'basket':
    case 'indic_terr':
    case 'set':
        div.style.left =''; 
        div.style.top = '';
        break;
    }
    div.infotype = infoType;//pour indiquer à move comment positionner la div
    //alert('div.infotype pour '+divId+' = '+div.infotype);
    div.innerHTML = helpText; 
    div.style.margin = padding;
    div.style.padding = padding;
    div.aspect = true;
    div.style.display = 'block';
    div.style.visibility = "visible";//on le rend visible.
    //alert('div.infotype pour = '+div.aspect);
} 

function hideIllusImage(){
    return hide('oser_info_bulle_id');
}
function showIllusImage(imageUrl, event, divId, infoType){
  //alert('showIllusImage : '+divId);
  if(typeof divId == "undefined"){
      divId = 'oser_info_bulle_id';        
  }
  if(typeof infoType == "undefined"){
      infoType = 'illusIndic';        
  }
  var helpText = '<img id="id_im", src="'+imageUrl+'" style="width:700px;height:400px;border-width:0px;" />';               
  show(divId, helpText, event, infoType);
}
function getMouseXY(e) // works on IE6,FF,Moz,Opera7
{
  if (!e) e = window.event; // works on IE, but not NS (we rely on NS passing us the event)

  if (e)
  {
    if (e.pageX || e.pageY)
    { // this doesn't work on IE6!! (works on FF,Moz,Opera7)
      mousex = e.pageX;
      mousey = e.pageY;
      algor = '[e.pageX]';
      if (e.clientX || e.clientY) algor += ' [e.clientX] '
    }
    else if (e.clientX || e.clientY)
    { // works on IE6,FF,Moz,Opera7
      mousex = e.clientX + document.body.scrollLeft;
      mousey = e.clientY + document.body.scrollTop;
      algor = '[e.clientX]';
      if (e.pageX || e.pageY) algor += ' [e.pageX] '
    } 
  }
  //alert(mousex+', '+mousey);
}

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 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 );
}

function  getMousePosition(e, action, left, top){ //onclickEvent, 'change', left, top
    if(typeof left != 'undefined' && typeof top != 'undefined'){
        return {'left':left, 'top':top};
    }
    var largeur_ecran = screen.width; 
    var hauteur_ecran = screen.height;
    if(navigator.appName!="Microsoft Internet Explorer"){//autre que IE
        if(!(e==null || (typeof e == "undefined"))){ 
            left = e.pageX + 5;
            top = e.pageY + 10; 
        }      
        return {'left':left, 'top':top};
    }
           
    // Pour version IE 6.0 ou +
    e = (e==null || (typeof e == "undefined"))?window.event:e; 
    //alert('getMousePosition : '+e);
    switch(largeur_ecran){
    case 1440:
        left = event.x+document.body.scrollLeft - 240;
        top = event.y+document.body.scrollTop;
        break;
    case 1280:
        left = event.x+document.body.scrollLeft - 130;
        top = event.y+document.body.scrollTop;
        break;
    case 1152:
        left = event.x+document.body.scrollLeft - 70;
        top = event.y+document.body.scrollTop;
        break;
     default :
        left = event.x+document.body.scrollLeft - 50;
        top = event.y+document.body.scrollTop;
        break;
    }    
    top += 10;
    return {'left':left, 'top':top};
}

function move(e) {
    //if(i++%200==0)alert('move appelé');
   var div = document.getElementById('oser_info_bulle_id');
   var largeur_ecran;
   var hauteur_ecran;
   largeur_ecran = screen.width; 
   hauteur_ecran = screen.height;
   if(!div.aspect){//la bulle est invisible, on ne calcule rien
        //if(i++%200==0) alert('move: div.aspect = '+div.aspect);
        return false;
    }
      
      
      if(div.infotype == 'tabIndic'){
          var imgWidth = 700;
          var imgheight = 300;
          var xCenter = largeur_ecran/2;
          var yCenter = hauteur_ecran/2;
          if (navigator.appName!="Microsoft Internet Explorer"){//autre que IE
              //var xPos = e.pageX; var yPos = e.pageY;
              //var xPos = e.x; var yPos = e.y; 
              top = e.pageY - imgheight - 10 ;//la div est toujours au dessus de la souris
              if(e.pageX>largeur_ecran/2){
                  left = e.pageX - imgWidth + 30 ;
              }else{
                  left = e.pageX - 30 ; //et a droite
              }
              div.style.left = left+"px";
              div.style.top = top+"px";
          }else{// Pour version IE 6.0 ou +
              var shift;
              if(event.x+document.body.scrollLeft>largeur_ecran/2){
                  shift = imgWidth - 70 ; //et a gauche
              }else{
                  shift = 80 ; //et a droite
              }
              if (largeur_ecran==1440){
                div.style.left=event.x+document.body.scrollLeft-shift-240+"px";
                div.style.top=event.y+document.body.scrollTop - imgheight -15+"px";
              }else{
                    if (largeur_ecran==1280){
                        div.style.left=event.x+document.body.scrollLeft-shift-130+"px";
                        div.style.top=event.y+document.body.scrollTop - imgheight-15+"px";
                    }else{
                          if (largeur_ecran==1152){
                        div.style.left=event.x+document.body.scrollLeft-shift-70+"px";
                        div.style.top=event.y+document.body.scrollTop - imgheight-15+"px";
                            }else{
                                div.style.left=event.x+document.body.scrollLeft-shift-50+"px";
                                div.style.top=event.y+document.body.scrollTop - imgheight-15+"px";
                            }
                    }
              }
            }
        }
      
      if(div.infotype == 'infoBulle'){
              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";
              }
              else { // Mode Quirks pour les versions inférieures à IE 6.0
                      if(document.documentElement.clientWidth>0) {
                              if (largeur_ecran==1440){
                                div.style.left=event.x+document.body.scrollLeft-210+"px";
                                div.style.top=event.y+document.body.scrollTop+15+"px";
                              }else{
                                    if (largeur_ecran==1280){
                                        div.style.left=event.x+document.body.scrollLeft-130+"px";
                                        div.style.top=event.y+document.body.scrollTop+15+"px";
                                    }else{
                                          if (largeur_ecran==1152){
                                        div.style.left=event.x+document.body.scrollLeft-70+"px";
                                        div.style.top=event.y+document.body.scrollTop+15+"px";
                                            }else{
                                                div.style.left=event.x+document.body.scrollLeft-10+"px";
                                                div.style.top=event.y+document.body.scrollTop+15+"px";
                                            }
                                    }
                              }
                      }
                      else { // Pour version IE 6.0 ou +
                              if (largeur_ecran==1440){
                                div.style.left=event.x+document.body.scrollLeft-210+"px";
                                div.style.top=event.y+document.body.scrollTop+15+"px";
                              }else{
                                    if (largeur_ecran==1280){
                                        div.style.left=event.x+document.body.scrollLeft-130+"px";
                                        div.style.top=event.y+document.body.scrollTop+15+"px";
                                    }else{
                                          if (largeur_ecran==1152){
                                        div.style.left=event.x+document.body.scrollLeft-70+"px";
                                        div.style.top=event.y+document.body.scrollTop+15+"px";
                                            }else{
                                                div.style.left=event.x+document.body.scrollLeft-10+"px";
                                                div.style.top=event.y+document.body.scrollTop+15+"px";
                                            }
                                    }
                              }
                      }
              }
      }else if(div.infotype == 'illusIndic'){
          var imgWidth = 700;
          var imgheight = 400;
          var xCenter = largeur_ecran/2;
          var yCenter = hauteur_ecran/2;
          if (navigator.appName!="Microsoft Internet Explorer"){//autre que IE
              //var xPos = e.pageX; var yPos = e.pageY;
              //var xPos = e.x; var yPos = e.y; 
              top = e.pageY - imgheight - 10 ;//la div est toujours au dessus de la souris
              if(e.pageX>largeur_ecran/2){
                  left = e.pageX - imgWidth + 30 ;
              }else{
                  left = e.pageX - 30 ; //et a droite
              }
              div.style.left = left+"px";
              div.style.top = top+"px";
          }else{// Pour version IE 6.0 ou +
              var shift;
              if(event.x+document.body.scrollLeft>largeur_ecran/2){
                  shift = imgWidth - 70 ; //et a gauche
              }else{
                  shift = 80 ; //et a droite
              }
              if (largeur_ecran==1440){
                div.style.left=event.x+document.body.scrollLeft-shift-240+"px";
                div.style.top=event.y+document.body.scrollTop - imgheight -15+"px";
              }else{
                    if (largeur_ecran==1280){
                        div.style.left=event.x+document.body.scrollLeft-shift-130+"px";
                        div.style.top=event.y+document.body.scrollTop - imgheight-15+"px";
                    }else{
                          if (largeur_ecran==1152){
                        div.style.left=event.x+document.body.scrollLeft-shift-70+"px";
                        div.style.top=event.y+document.body.scrollTop - imgheight-15+"px";
                            }else{
                                div.style.left=event.x+document.body.scrollLeft-shift-50+"px";
                                div.style.top=event.y+document.body.scrollTop - imgheight-15+"px";
                            }
                    }
              }
              return;
          }
      }//else if()
}

// 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"){
        if(idsAndKeys!=''){
            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 AjaxRequest1();
    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'));
    }   
}

function setSearchWords(ctrlName){
    //alert('setSearchWords : ctrlName='+ctrlName);
    var ctrl = document.getElementById(ctrlName+'_id');//we suppose ctrlName is a name 
    if(ctrl==null){
        ctrl = document.getElementById(ctrlName);//we assume ctrlName is an id
    }
    if(ctrl==null){
        return '';
    }
    var tmp = '';
    var ch;
    for(var i=0; i<ctrl.value.length; i++){
        ch = ctrl.value.charAt(i);
        if(('A'<=ch&&ch<='Z') || ('a'<=ch && ch<='z') || ('0'<=ch&&ch<='9') || ch==',' || ch==' '){
            tmp += ch;
        }else{
            tmp += '_';
        }
    }
    var hiddenCtrl = document.getElementById(ctrlName+'_hidden_id');
    if(hiddenCtrl!=null){
        //alert('hiddenctrl foun : ');
        return (hiddenCtrl.value = tmp.toLowerCase());
    }
    return tmp.toLowerCase();
}

/*
C'est la fonction qui est appelee une fois les donnees
*/
function setTableContentAux(names, text){
    //alert ('setTableContentAux : names='+names);
    if(names.length==0){
        return;
    }
    var namesArray = names.split('|');
    var textArray = text.split('<_ALERT_>');
    var alertMsg = '';
    if(textArray.length>1){
      alertMsg = textArray[0];
      textArray = textArray[1].split('|||');
    }else{
        textArray = textArray[0].split('|||');
    }
    var ctrlName;
    var ctrl;
    for(var i=0; i<namesArray.length; i++){
        ctrlName = namesArray[i];
        ctrl = document.getElementById(ctrlName+'_id');
        var innerDiv;
        switch(ctrl.tagName.toLowerCase()){
            case 'div':
                ctrl.innerHTML = textArray[i]; 
                break;
                /*innerDiv = document.getElementById(ctrlName+'_id_inner');
                if(innerDiv != null) ctrl.removeChild(innerDiv);
                innerDiv = document.createElement('div');
                innerDiv.id = ctrlName+'_id_inner';
                innerDiv.innerHTML = textArray[i];
                ctrl.appendChild(innerDiv);*/
            case 'select':
                setOptionsFormString(ctrlName, textArray[i]);//no default values
                break;
            case 'input':
                setValues(ctrlName+'|'+textArray[i]);
                break
        }             
    }
    if(alertMsg!='') alert(alertMsg);        
}

function setTableContent(namesAndTypes, filterUrl, leaderSelectIds, keyWordsCtrlName, clashImage){
    //alert('setTableContent: namesAndTypes = '+namesAndTypes+'; filterUrl='+filterUrl+'; leaderSelectIds'+leaderSelectIds);
    //alert('setTableContent : keyWordsCtrlName='+keyWordsCtrlName);
    loadingClash(namesAndTypes.split('|')[namesAndTypes.split('|').length-1], clashImage)
    if((typeof keyWordsCtrlName != "undefined") && keyWordsCtrlName !=''){
        filterUrl += setSearchWords(keyWordsCtrlName);   
    } 
    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('|');
            leaderCtrl = getElt(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 AjaxRequest1();
    req.loadXMLDoc(filterUrl, 'table', new Array(namesAndTypes));
    return; 
}

/*
Cette fonction permet de mettre des valeurs a un attribut de plusieurs elements (cas ou attributeType est un string)
Plutar elle pourra mettre des valeur pour des attributs distincts de plusiseur elemenet (cas ou attributeType est un tableau
ou plusieur chaines separees par |)

*/
function setAttributeForElts(eltsIds, eltsValues, attributeType){
    var elts = eltsIds.split('|');
    var values = eltsValues.split('|');
    if( typeof attributeType == "string"){
        for(var i=0; i<elts.length; i++){
            document.getElementById(elts[i]).setAttribute(attributeType, values[i]); 
        }
    }else{
        alert('setAttributeForElts: cas tableau de attributeType pas encore implemente');   
    }
}

function updatePageNumberingCtrl(ctrlName, eventType, namesAndTypes, filterUrl, leaderSelectIds, keyWordsCtrlName, clashImage){
    //alert('setTableContent: namesAndTypes = '+namesAndTypes);
    var ctrl = document.getElementById(ctrlName+'_id');
    var selectedIndex = ctrl.selectedIndex;
    switch(eventType){
    case 'first':
      if(selectedIndex==0){//on est au debut
          return true;  
      }
      selectedIndex = 0;
      break;
    case 'previous':
      if(selectedIndex==0){//on est au debut
          return true;  
      }
      selectedIndex--;// = (ctrl.selectedIndex>0)?(ctrl.selectedIndex-0-1):0;
      break;
    case 'next':
      if(selectedIndex==ctrl.options.length-1){//on est a la fin
          return true;  
      }
      selectedIndex++;//= (ctrl.selectedIndex - 1<ctrl.options.length) ? (ctrl.selectedIndex - 0 + 1):ctrl.options.length - 1;
      break;
    case 'last':
        if(selectedIndex==ctrl.options.length-1){//on est a la fin
          return true;  
      }
      selectedIndex = ctrl.options.length - 1;
        break;
    case 'onchange':
        selectedIndex = ctrl.selectedIndex;
        break;
    default:
        selectedIndex = 0;
        //alert('updatePageNumberingCtrl() : unknown event \''+eventType+'\'');
        break;
    }
    var im;
    selectedIndex = Math.min(Math.max(selectedIndex, 0), ctrl.options.length - 1);
    //alert(selectedIndex);
    if(selectedIndex<=0) {//blur previous and top buttons
        //setAttributeForElts(ctrlName+'_previous_id|'+ctrlName+'_top_id', 'display.none|display.none', 'style');
        im = document.getElementById(ctrlName+'_previous_id'); im.src = IMG+'previous_page_.jpg'; im.look='l_'; im.title=''; im.style.cursor='default';
        im = document.getElementById(ctrlName+'_first_id'); im.src = IMG+'first_page_.jpg'; im.look='l_'; im.title=''; im.style.cursor='default';
    }else{//show previous and top buttons
        //setAttributeForElts(ctrlName+'_previous_id|'+ctrlName+'_top_id', 'display.block|display.block', 'style');
        im = document.getElementById(ctrlName+'_previous_id'); im.src = IMG+'previous_page.jpg'; im.look='l'; im.title='Aller à la page précédente'; im.style.cursor='pointer';
        im = document.getElementById(ctrlName+'_first_id'); im.src = IMG+'first_page.jpg'; im.look='l'; im.title='Aller à la première page'; im.style.cursor='pointer';
    
    }
    if(selectedIndex>=ctrl.options.length - 1) {//blur next and bottom buttons
        //setAttributeForElts(ctrlName+'_next_id|'+ctrlName+'_bottom_id', 'display.none|display.none', 'style');
        im = document.getElementById(ctrlName+'_next_id'); im.src = IMG+'next_page_.jpg'; im.look='l_'; im.title=''; im.style.cursor='default';
        im = document.getElementById(ctrlName+'_last_id'); im.src = IMG+'last_page_.jpg'; im.look='l_'; im.title=''; im.style.cursor='default';
    }else{//show next and bottom buttons
        //setAttributeForElts(ctrlName+'_next_id|'+ctrlName+'_bottom_id', 'display.block|display.block', 'style');
        im = document.getElementById(ctrlName+'_next_id'); im.src = IMG+'next_page.jpg'; im.look='l'; im.title='Aller à la page suivante'; im.style.cursor='pointer';
        im = document.getElementById(ctrlName+'_last_id'); im.src = IMG+'last_page.jpg'; im.look='l'; im.title='Aller à la dernière page'; im.style.cursor='pointer';
    }  
    ctrl.selectedIndex = selectedIndex;
    var pageTopFlagId = ctrl.options[selectedIndex].value;//identifiant du document qui limite en haut la page
    //pageBottomFlagId : identifiant du document qui limite en bas la page ou '' si c'est la deniere page
    var pageBottomFlagId = (selectedIndex>=ctrl.options.length-1)?'':ctrl.options[selectedIndex+1].value;
    
    setTableContent(namesAndTypes, filterUrl+eventType+'&pageno='+(selectedIndex+1)+'&pagetopflag='+pageTopFlagId+'&pagebottomflag='+pageBottomFlagId, leaderSelectIds, keyWordsCtrlName, clashImage)      
    return true;
}


function disableControles(names){
    if(names.length==0)
        return;
    var ctrlNames = names.split('|');
    for(var i=0; i<ctrlNames.length; i++){
        //alert(ctrlNames[i]);
        document.getElementById(ctrlNames[i]+'_id').disabled=true;
        //ctrl.title = "Choisir un indicateur d'abord";
    }
}

function enableControles(names){
    if(names.length==0)
        return;
    var ctrlNames = names.split('|');
    for(var i=0; i<ctrlNames.length; i++){
        document.getElementById(ctrlNames[i]+'_id').disabled=false;
        //ctrl.title = "Choisir un indicateur d'abord";
    }
}


function loadingClash(divName, imageSrce){
    loadingOn = true;
    var div = document.getElementById(divName+'_id');
    if(div!=null){
        if(typeof imageSrce == "undefined"){
            imageSrce = IMG+'loading.gif';
        }
        div.innerHTML = '<center><br><br><br><img id="loadingimg" alt="Chargement" src="'+imageSrce+'"></center>';
    }
}

function endLoadingClash(divName){
    var div = document.getElementById(divName+'_id');
    if(div!=null){
        div.innerHTML = '';
    }
    loadingOn = false;
}

function setUrlGetParams(urlId, idsAndKeys, constPart){
    //alert('idsAndKeys='+idsAndKeys);
    //document.getElementById('export_link_id').href='$urlExport?theme='+document.getElementById('$filtreThemeCtrlId').options[document.getElementById('$filtreThemeCtrlId').selectedIndex].value+'&motscles='+setSearchWords('$keyWordsCtrlName')"
    var tmp = idsAndKeys.split('||');
    for(var i=0; i<tmp.length; i++){
        var elts = tmp[i].split('|');
        var ctrl = document.getElementById(elts[0]);
        if(elts.length==2){//c'est un select simple
            constPart += '&'+elts[1]+'='+ctrl.options[ctrl.selectedIndex].value;
        }else{//c'est un input
            constPart += '&'+elts[1]+'='+(elts[1]=='motscles'?setSearchWords(elts[0]):ctrl.value);
        }
    }
    //alert(constPart);
    document.getElementById(urlId).href = constPart;
}
/* 
    Ce fichier contient le javascript associé aux pages des ressources documentaires de oser70.  
*/

/* @formId string: identifiant de formulaire.     
    BUT: Elle sauvegarde les texts des options selectionnées
*/
function descriptionOnSubmit(formId){     
    saveTextsOfSelectedOptions(formId);    
    return false;
}


/*  @form string: identifiant de formulaire.
    @fileCtrlName string: nom d'un contrôle de upload de fichier.   
    BUT: Vérifier si un fichier a été uploadé. Dans ce cas suavegarde le nom complet 
          dans un controlé caché. Cela est utile pour rappeler à l'usager le chemin
          complet du fichier qu'il avait donné s'il revient sur cette étape.
*/
function caracteristiquesOnSubmit(formId, fileCtrlName, vignetteCtrlName){   
    saveTextsOfSelectedOptions(formId);//pour péridodicité_maj
    return false;    
}  

/*  @formId string: identifiant de formulaire.
    @rigthCtrlName string: Nom du select de droite du panier des documents liés (qui 
    contient les documents sélectionnés).    
    BUT: Elle met les options du contrôle de droite pour que son  contenu puissent être
        envoyé au serveur.
*/
function indicateursLiesOnSubmit(formId, rigthCtrlName){
    //alert('documentsLiesOnSubmit: rigthCtrlName='+rigthCtrlName);        
    var hiddenInput = document.getElementById(rigthCtrlName+'_hidden_id');
    if(hiddenInput!=null){
       //alert("Hidden trouvé");
        var select = document.getElementById(rigthCtrlName+'_id');        
        hiddenInput.setAttribute('value', getAllOptionsText(select)); 
       //alert(hiddenInput.getAttribute('value')+': contenu du hidden !');   
    }
    return false;
}

function documentsAccessiblesOnSubmit(formId, searBtName){    
    return false;
}

function descriptionOnLoad(formId, filterSelect, idsAndUrls){ 
    setOptionsOfSubordinates(filterSelect, 'select', idsAndUrls);     
    return true;
}

function setFileControle(radioValue, required, fileCtrlName, label, postBackMsg, help){ 
    if(radioValue=='0'){
        document.getElementById(fileCtrlName+'_hidden_id').value='';
        var div = document.getElementById(fileCtrlName+'_div_id');
        div.innerHTML = '';
    }else{
        toggleFileCtrlContent(required, fileCtrlName, label, postBackMsg, help);
    }
}
 

function indicateursLiesRecherche(formId, filter_id, url, srceId, destId, keyWordsCtrlName, basketName){
    setOptionsOfSubordinates(filter_id, 'basket', srceId+'|'+url+setSearchWords(keyWordsCtrlName)+'&theme=', destId+'|'+basketName);
    addTitles(destId);
}
 



function documentsAccessiblesOnload(DivNames, msg){
    setToggleDiv(DivNames, msg); 
    var tmp = DivNames.split('|');
    var ctrl;
    for(var i=0; i<tmp.length; i++){
        ctrl = document.getElementById(tmp[i]+'_id');
        crtl.innerHTML = '<div id="'+tmp[i]+'_innerdiv_id"></div>';
    }
}
