﻿
var CONST_STYLE_QUESTIONS_BACKGROUND_BLEUFONCE = 'questionBleuFonce';
var CONST_STYLE_QUESTIONS_BACKGROUND_BLEUCLAIR = 'questionBleuClair';
var CONST_STYLE_INTITULES_FONTCOLOR_DEFAULT = '#787789';


//Cache un élément (span, question, bloc, etc)
function cacherElement(idElement)
{
    var element = document.getElementById(idElement);
    if(element!=null)
    {
        element.style.display = "none";
    }
}

//Affiche un élément (span, question, bloc, etc)
function afficherElement(idElement)
{
    var element = document.getElementById(idElement);
    if(element!=null)
    {
        element.style.display = "";
    }
}

//Affiche l'ensemble des blocs présents dans le groupe courant
function afficheBlocs()
{
    var dynActive = document.forms["form1"].dynActive.value;
    if (dynActive !='false') {
    var tableau = recupereBlocs();
	    for(k=0;k<tableau.length;k++){
		    var bloc = tableau[k];
		    afficheBlocComplete(bloc.id);
	    }
    }
}

//Cache l'ensemble des alertes d'erreur du groupe courant
function cacherAlertesReponse()
{
    var idBlocs = retournerBlocs();
    
    for(i=0;i<idBlocs.length;i++)
    {
        var idQuestions = retournerQuestionsBloc(idBlocs[i],true);
        
        for(j=0;j<idQuestions.length;j++)
        {
            cacherElement(idQuestions[j].id+'AlerteReponse');
            flasheQuestion(idQuestions[j].id,CONST_STYLE_INTITULES_FONTCOLOR_DEFAULT);                        
        }
    }
    cacherElement('ErreurSaisie');
}

//Retourne le premier élément question d'un bloc
function recupererPremiereQuestionBloc(idBloc)
{
    var noeudBloc = document.getElementById(idBloc);
    var noeudsQuestion = noeudBloc.getElementsByTagName('DIV');
    if(noeudsQuestion!=null)
    {
        var i = 0;        
        while(i < noeudsQuestion.length)
        {
            if (noeudsQuestion[i].firstChild.className == "questionIntitule")
            {
                return noeudsQuestion[i];    
            }
            i = i + 1;
        }
    }
    return null;
}

//Ordonne les éléments d'un groupe (blocs ou questions) selon l'ordre du tableau d'éléments passé en paramètre
//Les éléments doivent être du même type (blocs ou questions)
//Le paramètre respecterBlocs (True/False) détermine si le tri de questions tient compte de la structure des blocs
//Retourne True/False en cas de réussite/échec.
function ordonnerElements(tabElements,respecterBlocs)
{
    var element1;
    var element2;    
    var i = 0;
    var ordonnerOK = true;
    
    while (i < tabElements.length-1)
    {
        element1 = document.getElementById(tabElements[i]);
        element2 = document.getElementById(tabElements[i+1]);
        ordonnerOK = ordonnerOK && trierNoeuds(element1,element2,respecterBlocs);
        i = i + 1;
    }
    return ordonnerOK;
}

//Ordonne 2 éléments de même type (blocs ou questions) en plaçant le second (noeud2) juste après le premier (noeud1)
//Le paramètre respecterBlocs (True/False) détermine si le tri de questions tient compte de la structure des blocs
//Retourne True/False en cas de réussite/échec.
function trierNoeuds(noeud1,noeud2,respecterBlocs)
{
    try
    {
        var noeudTmp = noeud2.cloneNode(1);

        var noeudParent1 = noeud1.parentNode;
        var noeudParent2 = noeud2.parentNode; 
        var bloc1 = noeudParent1.id.toString();
        var bloc2 = noeudParent2.id.toString();
            
        noeudParent2.removeChild(noeud2);
        
        if((respecterBlocs) && (bloc1 != bloc2))
        {
            var premiereQuestion = recupererPremiereQuestionBloc(noeudParent2.id.toString());
            noeudParent2.insertBefore(noeudTmp,premiereQuestion);
            premiereQuestion = null; 
        }
        else
        {
            noeudParent1.insertBefore(noeudTmp,noeud1.nextSibling);
        }        
        noeudTmp = null;
        return true;    
    }
    catch (Exception)
    {
        return false;
    }
}

//Interchange la position de 2 éléments de même type (blocs ou questions)
function echangerNoeuds(noeud1,noeud2)
{
    var noeudTmp = noeud1.cloneNode(1);

    var noeudParent1 = noeud1.parentNode;
    var noeudParent2 = noeud2.parentNode; 

    noeud2 = noeudParent2.replaceChild(noeudTmp,noeud2);
    noeudParent1.replaceChild(noeud2,noeud1);
    noeudParent2.replaceChild(noeud1,noeudTmp);

    noeudTmp = null;
}

//Applique le nom d'un style à un élément (bloc ou question)
function appliquerStyleElement(idElement,style)
{
    var element = document.getElementById(idElement);
    var styleElement = style;
    
    if(element != null)
    { 
        element.className += " " + styleElement;
    }
}

//Récupère le nom du style d'un élément (bloc ou question)
function recupererStyleElement(idElement)
{
    var element = document.getElementById(idElement);
    
    if(element != null)
    {
        return  element.className;
    } 
    return "";
}

//Renvoi un array d'id des questions d'un bloc 
function retournerQuestionsBloc(idBloc,questionsCachees)
{
    var noeudBloc = document.getElementById(idBloc);
    var noeudsQuestion = noeudBloc.getElementsByTagName('DIV');
    var questions = new Array();
            
    if(noeudsQuestion!=null)
    {
        var i = 0;        
        while(i < noeudsQuestion.length)
        {
            if (noeudsQuestion[i].attributes["typeElt"] != null)
            {
                if((noeudsQuestion[i].firstChild.className == "questionIntitule") || (noeudsQuestion[i].firstChild.className == "reponse"))
                {
                    if((noeudsQuestion[i].style.display == "none") && (!questionsCachees))
                    {}
                    else
                    {
                        questions.push(noeudsQuestion[i]);
                    }
                }
            }
            i = i + 1;
        }
    }
    return questions;
}

//Renvoi un array d'id des blocs du groupe
function retournerBlocs()
{
    var blocs = document.getElementsByTagName('FIELDSET');
    var blocsArray = new Array();
    
    for (var i=0; i < blocs.length; i++)
    {
        if(blocs[i].attributes["typeElt"] != null)
        {
            if(blocs[i].attributes["typeElt"].nodeValue == "bloc")
            {
                blocsArray.push(blocs[i].id);                
            }   
        }
    }
    return blocsArray;
}

//Alterne le style des questions entre le style1 et le style2 dans tous les blocs du groupe courant
//Le paramètre razStyleBloc indique si on doit remettre à zéro le style lors du passage à un nouveau bloc
//ou s'il faut continuer d'assurer l'alternance des styles
function alternerStyleBlocs(style1,style2,razStyleBloc)
{
    var blocs = retournerBlocs();
    var tmpStyle1 = style1;
    var tmpStyle2 = style2;
    var tmpStyle = style1;
    var dernierStyle;
   
    for (var i=0; i < blocs.length; i++)
    {
        appliquerStyleElement(blocs[i],tmpStyle1);
        dernierStyle = alternerStyleQuestions(blocs[i],tmpStyle1,tmpStyle2);
        if(!razStyleBloc)
        {
            if(tmpStyle1==dernierStyle)
            {
                tmpStyle = tmpStyle2;
                tmpStyle2 = tmpStyle1;
                tmpStyle1 = tmpStyle;           
            }
        } 
    } 
}

//Alterne le style des questions entre le style1 et le style2 dans un bloc
//L'alternance ne s'effectue pas pour les questions ayant un attribut idQuestionParente, elles récupèrent le
//style de leur question parente
function alternerStyleQuestions(idBloc,style1,style2)
{
    var questionsBloc = retournerQuestionsBloc(idBloc,false);
    var styles = new Array(style1,style2);
    var style = style2;
    
    if(questionsBloc.length==0)
    {
        return style2;    
    }
    
    var styleDefault = questionsBloc[0].className.toString();
    styleDefault = styleDefault.replace(style1,"");
    styleDefault = styleDefault.replace(style2,"");
    styleDefault = trim(styleDefault);
    
    for (var i=0; i < questionsBloc.length; i++)
    {                     
        var idQuestionParente = questionsBloc[i].attributes["idQuestionParente"].nodeValue;
        
        if((idQuestionParente!=null) && (idQuestionParente!="") && (document.getElementById(idQuestionParente)))
        {
            style = recupererStyleElement(idQuestionParente)
            style = style.replace(styleDefault,"");
            style = trim(style);
        }
        else
        {        
            if(style==style1)
            {
                style = style2;
            }
            else
            {
                style = style1;
            }
        }
        supprimerStylesElement(questionsBloc[i].id,styles);
        supprimerStylesElement(questionsBloc[i].id+"AvantReponse",styles);
        supprimerStylesElement(questionsBloc[i].id+"ApresReponse",styles);
        appliquerStyleElement(questionsBloc[i].id,style);
        appliquerStyleElement(questionsBloc[i].id+"AvantReponse",style);
        appliquerStyleElement(questionsBloc[i].id+"ApresReponse",style);        
    }
    return style;
}

//Supprime les styles d'un élément (bloc ou question)
//Prend en paramètre l'id de l'élément et un tableau de noms de styles
function supprimerStylesElement(idElement,styles)
{
    var element = document.getElementById(idElement);
    var stylesArray = styles;
    
    if((element != null) && (stylesArray.length > 0))
    {        
        for(var i=0; i < stylesArray.length; i++)
        {
            element.className = element.className.toString().replace(stylesArray[i],"");
            element.className = trim(element.className);        
        }
    }        
}

//Alterne le style des lignes d'un tableau : n'alterne pas si une ligne est vide
function alternerStyleLignesTableau(idTableau,style1,style2)
{
    var tableau = document.getElementById(idTableau);
    var style = style1;
    
    if(tableau != null)
    {
        for(var i=0; i < tableau.rows.length; i++)
        {   
            var vide = true;
            for(var j=0; j < tableau.rows[i].cells.length; j++)
            {
                if((tableau.rows[i].cells[j].innerText != "") || (tableau.rows[i].cells[j].innerText != null))
                {
                   vide = false;
                }
            }
            if(!vide)
            {         
                tableau.rows[i].className = tableau.rows[i].className.toString().replace(style1,"");
                tableau.rows[i].className = tableau.rows[i].className.toString().replace(style2,"");
                trim(tableau.rows[i].className.toString());
                tableau.rows[i].className += style;
                if(style == style1)
                {
                    style=style2;
                }
                else
                {
                    style=style1;
                }
            }
        }    
    }
}

//Alterne le style des lignes d'un tableau de récapitulatif, sauf si une ligne a sa 2nde cellule vide
function alternerStyleLignesTableauRecap(idTableau,style1,style2)
{
    var tableau = document.getElementById(idTableau);
    var style = style1;
    
    if(tableau != null)
    {        
        for(var i=0; i < tableau.rows.length; i++)
        {    
            if((tableau.rows[i].style.display != "none") && (tableau.rows[i].cells[1].firstChild.innerHTML != "") && (tableau.rows[i].cells[1].firstChild.innerHTML != null))
            {    
                tableau.rows[i].cells[0].className = "tdpadd2";     
                tableau.rows[i].className = tableau.rows[i].className.toString().replace(style1,"");
                tableau.rows[i].className = tableau.rows[i].className.toString().replace(style2,"");
                trim(tableau.rows[i].className.toString());
                tableau.rows[i].className += style;
                if(style == style1)
                {
                    style=style2;
                }
                else
                {
                    style=style1;
                }
            }
        }    
    }
    tableau.cellSpacing = "0";
}


//***********************************
//*** Masque de saisie des champs ***
//*** A faire évoluer...          ***
//***********************************

//Sélectionne une chaîne dans un champ
function setSelectionRange(input, selectionStart, selectionEnd)
{
    if (input.setSelectionRange)
    {
        input.focus();
        input.setSelectionRange(selectionStart, selectionEnd);
    }
    else if (input.createTextRange) 
    {
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', selectionEnd);
        range.moveStart('character', selectionStart);
        range.select();
    }
}

//Applique un masque de saisie à un champ
//Le délimiteur par défaut est "/" et la vérification de masque est paramétrée depuis
//la fonction verifierMasque(valeur,masque), qui devrait se trouver plus tard dans un commun.regex.js
//On pourra aussi éventuellement passer le délimiteur en paramètre à la fonction masqueSaisie plus tard
function masqueSaisie(input,format)
{           
    var delimiteur = "/";
    var masques = format.split(delimiteur);   
    var saisies = input.value.split(delimiteur);
    var index = 0;
    var masqueOk = true;
    var saisieComplete = true;        
    
    
    if(saisies.length == 1 && masques.length > 1)
    {
        input.value = format;
        return masqueSaisie(input,format);
    }
    
    if(saisies.length < masques.length)
    {
        var loc = 0;
    
        for(var k=0;k<masques.length-1;k++)
        {
            loc = loc + masques[k].length;
            if(input.value.substr(loc,1) != delimiteur)
            {
                input.value = input.value.replace(input.value.substr(0,loc),input.value.substr(0,loc)+delimiteur); 
            }
            loc++;
        }
        saisies = input.value.split(delimiteur);
    }

    for(var i=0;i<masques.length;i++)
    {
        index = index + masques[i].length;
        if(saisies[i].length < masques[i].length && saisies[i].length > 0)
        {
            saisieComplete = false;
        }
        
        if(saisies[i].length == 0)
        {
            saisies[i] = masques[i];
            input.value = "";
            for(var j=0;j<saisies.length;j++)
            {
                if(saisies[j] != "")
                {
                    input.value += saisies[j] + delimiteur;
                }                
            }
            input.value = input.value.substr(0,input.value.length-1);
        }
                     
        masqueOk = verifierMasque(saisies[i],masques[i]);        
        if(!masqueOk && saisieComplete)
        {
            setSelectionRange(input, index-saisies[i].length, index);
            return masqueOk;
        }
        index++;
    }
    return masqueOk;    
}

//Vérifie  la validité d'une valeur par rapport à un sous-masque
function verifierMasque(valeur,masque)
{
 
    var regExpInteger = new RegExp("[^0-9]");
    
    switch (masque)
    {
        case "JJ" :
        {
            return !regExpInteger.test(valeur);
        }
            
       case "MM" :
       {
            return !regExpInteger.test(valeur);
       }
       
       case "AAAA" :
       {
            return !regExpInteger.test(valeur);
       }
       
       default: return false;
    }  
}

//***********************************
//***********************************