﻿///////////////////////////////////////////////////////////////
// ___ QU_Tools.js ___                                       //
//     -----------                                           //
// fonctions utilisées pour la validation des questionnaires //
///////////////////////////////////////////////////////////////

//----------------------------------------------------------------------------
// variables globales
//----------------------------------------------------------------------------
var messages = new Array(15);
var jsIsMobile = false;
messages[0] = "La réponse à cette question est obligatoire";
messages[1] = "Vous devez sélectionner entre @1 et @2 réponses";
messages[2] = "Vous devez sélectionner au moins @1 réponses";
messages[3] = "Vous devez sélectionner au plus @1 réponses";
messages[4] = "Vous devez entrer un nombre entier";
messages[5] = "Vous devez entrer un nombre entier entre @1 et @2";
messages[6] = "Vous devez entrer un nombre entier inférieur à @1";
messages[7] = "Vous devez entrer un nombre entier supérieur à @1";
messages[8] = "Vous devez entrer un numérique";
messages[9] = "Vous devez entrer un numérique entre @1 et @2";
messages[10] = "Vous devez entrer un numérique inférieur à @1";
messages[11] = "Vous devez entrer un numérique supérieur à @1";
messages[12] = "Vous devez entrer un numérique ayant au plus @1 chiffres après la virgule";
messages[13] = "Vous devez entrer une date de type jj/mm/aaaa";
messages[14] = "La date doit être inférieure à ";
messages[15] = "La date doit être supérieure à ";

if(typeof(langQuestionnaire)!="undefined" && langQuestionnaire!=""){
  if(langQuestionnaire!='fr'){
      messages[0] = "Mandatory answer";
      messages[1] = "Select @1 or @2 answers";
      messages[2] = "Select at least @1 answer";
      messages[3] = "Select no more than @1 answer";
      messages[4] = "Enter an integer number";
      messages[5] = "Enter an integer beetween @1 and @2";
      messages[6] = "Enter an integer number lower than @1";
      messages[7] = "Enter an integer number higher than @1";
      messages[8] = "Enter a numerical number";
      messages[9] = "Enter a numerical number between @1 and @2";
      messages[10] = "Enter a numerical number lower than @1";
      messages[11] = "Enter a numerical number higher than @1";
      messages[12] = "Enter a numerical number with only @1 decimal";
      messages[13] = "Enter a date like dd/mm/yyyy";
      messages[14] = "the date must be inferior to ";
      messages[15] = "the date must be superior to ";
  }
 }

//----------------------------------------------------------------------------
// détection du navigateur client
//----------------------------------------------------------------------------
function checkBrowser(){
  this.ver = navigator.appVersion;
  this.agent = navigator.userAgent;
  this.nav = navigator.appName;
  this.dom = document.getElementById ? 1 : 0;
  this.opera5 = (navigator.userAgent.indexOf("Opera") > -1 && document.getElementById) ? 1 : 0;
  this.ie5 = (this.ver.indexOf("MSIE 5") > -1 && this.dom && !this.opera5) ? 1 : 0;
  this.ie6 = (this.ver.indexOf("MSIE 6") > -1 && this.dom && !this.opera5) ? 1 : 0;
  this.ie4 = (document.all && !this.dom && !this.opera5) ? 1 : 0;
  this.ie = this.ie4 || this.ie5 || this.ie6;
  this.mac = this.agent.indexOf("Mac") > -1;
  this.ns7 = (this.dom && parseInt(this.ver) >= 7) ? 1 : 0;
  this.ns6 = (this.dom && parseInt(this.ver) >= 5) ? 1 : 0;
  this.ns4 = (document.layers && !this.dom) ? 1 : 0;
  this.nn = (this.ver.indexOf("Netscape") > -1) ? 1 : 0;
  this.bw = (this.ie6 || this.ie5 || this.ie4 || this.ns4 || this.ns6 || this.ns7 || this.opera5);
  return this;
}
var browser = checkBrowser();


function DoAlert(v, t){
  if (jQuery && !$.browser.msie && !jsIsMobile){
    setTimeout(function() {jAlert(v,t);}, 300);
  }
  else{
    t = replace(t, '► ', '');
    alert(v + '\n\n' + t);
  }
}
//----------------------------------------------------------------------------
// indique à l'utilisateur que la réponse à la question est obligatoire
//----------------------------------------------------------------------------
function alertMandatory(titleId){
  if ($('#T' + titleId)){
  DoAlert(messages[0], $('#T' + titleId).text());
  }
  else{
    DoAlert(messages[0], '');
  }
}

//----------------------------------------------------------------------------
// Timer: fonctions utlisées pour le calcul du temps écoulé lors d'un questionnaire
//----------------------------------------------------------------------------
function dcountup(currentdate, startingdate, baseunit){
	this.currentTime= new Date(currentdate)
	this.startingdate=new Date(startingdate)
	this.timesup=false
	this.baseunit=baseunit
	this.start()
}

dcountup.prototype.oncountup=function(){} //default action for "oncountup"

dcountup.prototype.start=function(){
	var thisobj=this
	this.currentTime.setSeconds(this.currentTime.getSeconds()+1)
	var timediff=(this.currentTime-this.startingdate)/1000 //difference btw target date and current date, in seconds
	var oneMinute=60 //minute unit in seconds
	var oneHour=60*60 //hour unit in seconds
	var oneDay=60*60*24 //day unit in seconds
	var dayfield=Math.floor(timediff/oneDay)
	var hourfield=Math.floor((timediff-dayfield*oneDay)/oneHour)
	var minutefield=Math.floor((timediff-dayfield*oneDay-hourfield*oneHour)/oneMinute)
	var secondfield=Math.floor((timediff-dayfield*oneDay-hourfield*oneHour-minutefield*oneMinute))
	if (this.baseunit=="hours"){ //if base unit is hours, set "hourfield" to be topmost level
		hourfield=dayfield*24+hourfield
		dayfield="00"
	}
	else if (this.baseunit=="minutes"){ //if base unit is minutes, set "minutefield" to be topmost level
		minutefield=dayfield*24*60+hourfield*60+minutefield
		dayfield=hourfield="00"
	}
	else if (this.baseunit=="seconds"){ //if base unit is seconds, set "secondfield" to be topmost level
		var secondfield=timediff
		dayfield=hourfield=minutefield="00"
	}
	if (hourfield < 0) { hourfield = 0;}
	if (hourfield.toString().length == 1) { hourfield = "0" + hourfield;}
	if (minutefield < 0) { minutefield = 0;}
	if (minutefield.toString().length == 1) { minutefield = "0" + minutefield;}
	if (secondfield < 0) { secondfield = 0;}
	if (secondfield.toString().length == 1) { secondfield = "0" + secondfield;}
	var result={days: dayfield, hours:hourfield, minutes:minutefield, seconds:secondfield}
	this.oncountup(result)
	setTimeout(function(){thisobj.start()}, 1000) //update results every second
}

//----------------------------------------------------------------------------
// affichage d'un message d'erreur
//----------------------------------------------------------------------------
function alertMaxInteger(titleId, maxi){DoAlert(replace(messages[6], '@1', maxi), $('#T' + titleId).text());}
function alertMaxNumeric(titleId, maxi){DoAlert(replace(messages[10], '@1', maxi), $('#T' + titleId).text());}
function alertMaxResponse(titleId, maxi){DoAlert(replace(messages[3], '@1', maxi),$('#T' + titleId).text());}
function alertMinInteger(titleId, mini){DoAlert(replace(messages[7], '@1', mini), $('#T' + titleId).text());}
function alertMinMaxInteger(titleId, mini, maxi){DoAlert(replace(replace(messages[5], '@1', mini), '@2', maxi), $('#T' + titleId).text());}
function alertMinMaxNumeric(titleId, mini, maxi){DoAlert(replace(replace(messages[9], '@1', mini), '@2', maxi), $('#T' + titleId).text());}
function alertMinNumeric(titleId, mini){DoAlert(replace(messages[11], '@1', mini), $('#T' + titleId).text());}
function alertMinMaxResponse(titleId, mini, maxi){DoAlert(replace(replace(messages[1], '@1', mini), '@2', maxi), $('#T' + titleId).text());}
function alertMinResponse(titleId, mini){DoAlert(replace(messages[2], '@1', mini), $('#T' + titleId).text());}
function alertNotInteger(titleId){DoAlert(messages[4], $('#T' + titleId).text());}
function alertNotNumeric(titleId){DoAlert(messages[8], $('#T' + titleId).text());}
function alertNotDate(titleId){DoAlert(messages[13], $('#T' + titleId).text());}
function alertPrecision(titleId, precision){DoAlert(replace(messages[12], '@1', precision), $('#T' + titleId).text());}

//----------------------------------------------------------------------------
// coche automatiquement l'élément checkbox associé au champ autre
//----------------------------------------------------------------------------
function autoCheckCB(questionId, modalityId){
  if (document.getElementById('Q' + questionId + '_Others').value != '') {
    document.getElementById('Q' + questionId + '_' + modalityId).checked = true;
  }
}

//----------------------------------------------------------------------------
// sélectionne automatiquement l'élément multiselect associé au champ autre
//----------------------------------------------------------------------------
function autoCheckDDL(questionId, modalityId){
  if (document.getElementById('Q' + questionId + '_Others').value != '') {
    var elements = document.getElementById('Q' + questionId).options;
    var element = elements[elements.length - 1];
    if (!element.selected) {
      elements[elements.length - 1].selected = true;
    }
  }
}

//----------------------------------------------------------------------------
// coche automatiquement l'élément radio associé au champ autre
//----------------------------------------------------------------------------
function autoCheckRadio(questionId, modalityId){
  if (document.getElementById('Q' + questionId + '_Others').value != '') {
    var elements = document.getElementsByName('Q' + questionId);
    var element = elements[elements.length - 1];
    if (!element.checked) {
      elements[elements.length - 1].checked = true;
      resetRadio(questionId);
    }
  }
}

//----------------------------------------------------------------------------
// effectue le classement lorsque le champ 'autre' est rempli
//----------------------------------------------------------------------------
function autoRank(questionId, questionsArray){
  var element = document.getElementById('Q' + questionId + '_' + modalityId);
  if (element.value == '') {
    doRank(questionId, questionsArray);
  }
}

//----------------------------------------------------------------------------
// renvoie true si 'min' <= value <= 'max'
//----------------------------------------------------------------------------
function checkIntegerRange(value, min, max){
  var result = false;
  if (min == '' && max == '') {result = true;}
  else if (min == '' && max != ''){
    if (value <= parseInt(max, 10)) {result = true;}
  }
  else if (min != '' && max == ''){
    if (value >= parseInt(min, 10)) {result = true;}
  }
  else if (min != '' && max != ''){
    if (value >= parseInt(min, 10) && value <= parseInt(max, 10)) {result = true;}
  }
  return result;
}

//----------------------------------------------------------------------------
// renvoie true si 'min' <= value <= 'max'
//----------------------------------------------------------------------------
function checkFloatRange(value, min, max){
  var result = false;
  if (min == '' && max == ''){result = true;}
  else if (min == '' && max != ''){
    if (value <= parseFloat(max)) {result = true;}
  }
  else if (min != '' && max == ''){
    if (value >= parseFloat(min)){result = true;}
  }
  else if (min != '' && min != ''){
    if (value >= parseFloat(min) && value <= parseFloat(max)) {result = true;}
  }
  return result;
}

//----------------------------------------------------------------------------
// renvoie true si 'value' comporte au plus 'precision' chiffres après la virgule
//----------------------------------------------------------------------------
function checkPrecision(value, precision){
  var result = false;
  var valueLength = value.length;
  var position = -1;
  var nbDecimal = 0;
  if (!isBlank(value)) {
    var dotPosition = value.indexOf('.');
    var commaPosition = value.indexOf(',');
    if (dotPosition >= 0) {position = dotPosition;}
    else if (commaPosition >= 0) {position = commaPosition;}
    else {return true;}
    nbDecimal = value.substring(position + 1, valueLength).length;
    if (position >= 0 && nbDecimal <= precision) {result = true;}
  }
  else {result = true;}
  return result;
}

//----------------------------------------------------------------------------
// compte le nombre de check box cochées
//----------------------------------------------------------------------------
function countCheckedBox(questionId, modalitiesArray){
  var result = 0;
  var arrayLength = modalitiesArray.length;
  for (var i = 0; i < arrayLength; i++) {
    if (document.getElementById('Q' + questionId + '_' + modalitiesArray[i])) {
        if (document.getElementById('Q' + questionId + '_' + modalitiesArray[i]).checked) {result++;}
    }
    // Pour les questionnaires multiples
    if (document.getElementById('Q' + modalitiesArray[i] + '_' + questionId)) {
        if (document.getElementById('Q' + modalitiesArray[i] + '_' + questionId).checked) {result++;}
    }
  }
  return result;
}

//----------------------------------------------------------------------------
// compte le nombre de questions classées pour une modalité
//----------------------------------------------------------------------------
function countRanked(modalityId, questionsArray){
  var result = 0;
  var elementId;
  var arrayLength = questionsArray.length;
  for (var i = 0; i < arrayLength; i++) {
    elementId = 'Q' + questionsArray[i];
    if (modalityId != '') {elementId += '_' + modalityId;}
    if (document.getElementById(elementId).value != '') {result++;}
  }
  return result;
}

//----------------------------------------------------------------------------
// effectue le classement sur l'événement onclick
//----------------------------------------------------------------------------
function doRank(questionId, modalityId, questionsArray, max){
  var elementId = 'Q' + questionId;
  if (modalityId != '') {elementId += '_' + modalityId;}
  var element = document.getElementById(elementId);
  if (isBlank(element.value)) {
   var maxValue = getMaxRankValue(modalityId, questionsArray);
    if (max == '' || maxValue < parseInt(max)) {
      switch (maxValue) {
        case 0 :
          element.value = 1;
          break;
        default :
          element.value = maxValue + 1;
          break;
      }
    }
  }
  else {
    var tempElement;
    var tempElementId;
    var savedValue = parseInt(element.value);
    element.value = ''; // vide la cellule
    for (var i = 0; i < questionsArray.length; i++) { // met à jour les autres cellules
      tempElementId = 'Q' + questionsArray[i];
      if (modalityId != '') {tempElementId += '_' + modalityId;}
      tempElement = document.getElementById(tempElementId);
      if (parseInt(tempElement.value) > savedValue) {
        tempElement.value = parseInt(tempElement.value) - 1;
      }
    }
  }
}

//----------------------------------------------------------------------------
// renvoie la valeur maximum du classement
//----------------------------------------------------------------------------
function getMaxRankValue(modalityId, questionsArray){
  var result = 0;
  var currentElement;
  var currentElementId;
  for (var i = 0; i < questionsArray.length; i++) {
    currentElementId = 'Q' + questionsArray[i];
    if (modalityId != '') {currentElementId += '_' + modalityId;}
    currentElement = document.getElementById(currentElementId).value;
    if (!isBlank(currentElement)) {
      if (parseInt(currentElement) > result) {
        result = parseInt(currentElement);
      }
    }
  }
  return result;
}

//----------------------------------------------------------------------------
// masquage d'un élément
//----------------------------------------------------------------------------
function hide(elementId){
  var elem = document.getElementById(elementId);
  if (elem != null) {
    if (browser.dom) {
      elem.style.visibility = "hidden";
      elem.style.display = "none";
    }
    else {
      elem.visibility = "hide";
      elem.display = "none";
    }
  }
}

//----------------------------------------------------------------------------
// masquage d'un élément hint
//----------------------------------------------------------------------------
function hideKF(n){
  hide('KF' + n);
}

//----------------------------------------------------------------------------
// initialisation de la page
//----------------------------------------------------------------------------
function init(){
  if (window.focus) {window.focus();}
  if (document.getElementById("requiredSign")) {show("required");}
  var langQuestionnaire = document.getElementById('questLang').value;
  if(typeof(langQuestionnaire)!="undefined" && langQuestionnaire!=""){
    if(langQuestionnaire=='fr'){
      messages[0] = 'La réponse à cette question est obligatoire';
      messages[1] = 'Vous devez sélectionner entre @1 et @2 réponses';
      messages[2] = 'Vous devez sélectionner au moins @1 réponses';
      messages[3] = 'Vous devez sélectionner au plus @1 réponses';
      messages[4] = 'Vous devez entrer un nombre entier';
      messages[5] = 'Vous devez entrer un nombre entier entre @1 et @2';
      messages[6] = 'Vous devez entrer un nombre entier inférieur à @1';
      messages[7] = 'Vous devez entrer un nombre entier supérieur à @1';
      messages[8] = 'Vous devez entrer un numérique';
      messages[9] = 'Vous devez entrer un numérique entre @1 et @2';
      messages[10] = 'Vous devez entrer un numérique inférieur à @1';
      messages[11] = 'Vous devez entrer un numérique supérieur à @1';
      messages[12] = 'Vous devez entrer un numérique ayant au plus @1 chiffres après la virgule';
      messages[13] = 'Vous devez entrer une date de type jj/mm/aaaa';
      messages[14] = 'la date doit être inférieure à ';
      messages[15] = 'la date doit être supérieure à ';
    }
    if(langQuestionnaire=='en'){
      messages[0] = 'Compulsory answer';
      messages[1] = 'Select @1 or @2 answers';
      messages[2] = 'Select at least @1 answer';
      messages[3] = 'Select no more than @1 answer';
      messages[4] = 'Enter an integer number';
      messages[5] = "Enter an integer beetween @1 and @2";
      messages[6] = 'Enter an integer number lower than @1';
      messages[7] = 'Enter an integer number higher than @1';
      messages[8] = 'Enter a numerical number';
      messages[9] = 'Enter a numerical number between @1 and @2';
      messages[10] = 'Enter a numerical number lower than @1';
      messages[11] = 'Enter a numerical number higher than @1';
      messages[12] = 'Enter a numerical number with only @1 decimal';
      messages[13] = 'Enter a date like dd/mm/yyyy';
      messages[14] = 'the date must be inferior to ';
      messages[15] = 'the date must be superior to ';
    }
    if(langQuestionnaire=='de'){
      messages[0]='Die Frage muss beantwortet werden';
      messages[1]='Sie können eine oder zwei Antworten auswaehlen';
      messages[2]='Sie müssen mindestens eine Antwort auswaehlen';
      messages[3]='Sie können hoechstens eine Antwort auswaehlen';
      messages[4]='Sie müssen die ganze Zahl eingeben';
      messages[5]='Sie können zwischen @1 und @2 auswaehlen';
      messages[6]='Sie müssen eine ganze Zahl bis @1 eingeben';
      messages[7]='Sie müssen eine ganze Zahl über @1 eingeben';
      messages[8]='Sie müssen eine genaü Zahl eingeben';
      messages[9]='Sie müssen eine genaü Zahl zwischen @1 und @2 eingeben';
      messages[10]='Sie müssen eine genaü Zahl kleiner als @1 eingeben';
      messages[11]='Sie müssen eine genaü Zahl größer als @1 eingeben';
      messages[12]='Sie müssen eine genaü Zahl mit mindestens einer Nachkommastelle eingeben';
      messages[13] = 'Enter a date like dd/mm/yyyy';
      messages[14] = 'the date must be inferior to ';
      messages[15] = 'the date must be superior to ';
    }
    if(langQuestionnaire=='it'){
      messages[0] = 'Respuesta obligatoria ';
      messages[1] = 'Devi selezionare tra @1 e @2 risposte';
      messages[2] = 'Devi selezionare almeno @1 risposta';
      messages[3] = 'Devi selezionare al massimo @1 risposta';
      messages[4] = 'Devi entrare un numero intero';
      messages[5] = 'Devi entrare un numero intero tra @1 e @2';
      messages[6] = 'Devi entrare un numero intero inferiore a @1';
      messages[7] = 'Devi entrare un numero intero superiore a @ 1';
      messages[8] = 'Devi entrare una ciffra';
      messages[9] = 'Devi entrare una ciffra tra @1 e @2';
      messages[10] = 'Devi entrare una ciffra inferiore a @1';
      messages[11] = 'Devi entrare una ciffra superiore a @1';
      messages[12] = 'Devi entrare una ciffra con al massimo @ 1 numero dopo la virgola';
      messages[13] = 'Enter a date like dd/mm/yyyy';
      messages[14] = 'the date must be inferior to ';
      messages[15] = 'the date must be superior to ';
    }
    if(langQuestionnaire=='es'){
      messages[0] = 'Respuesta obligatoria';
      messages[1] = 'Debe seleccionar entre @1 y @2 respuestas';
      messages[2] = 'Debe seleccionar por lo menos @1 repuesta';
      messages[3] = 'Debe seleccionar menos de @1 respuesta';
      messages[4] = 'Debe entrar un número entero';
      messages[5] = 'Debe entrar un número entero entre @1 y @2';
      messages[6] = 'Debe entrar un número entero inferior a @1';
      messages[7] = 'Debe entrar un número entero superior a @1';
      messages[8] = 'Debe entrar un numérico';
      messages[9] = 'Debe entrar un numérico entre @1 y @2';
      messages[10] = 'Debe entrar un mumérico inferior a @1';
      messages[11] = 'Debe entrar un numérico superior a @1';
      messages[12] = 'Debe entrar un numérico que tenga mas de @1 número depues de la coma';
      messages[13] = 'Debe entar una fecha de formato dd/mm/aaaa';
      messages[14] = 'La fecha debe ser inferior a ';
      messages[15] = 'La fecha debe ser superior a ';
    }
    if(langQuestionnaire=='nl'){
      messages[0] = 'Verplicht antwoord';
      messages[1] = 'Selecteer @1 of @2 antwoorden';
      messages[2] = 'Selecteer minimaal @1 antwoord';
      messages[3] = 'Selecteer niet meer dan @1 antwoord';
      messages[4] = 'Vul een geheel getal in';
      messages[5] = 'Vul @1 of @2 in';
      messages[6] = 'Vul een geheel getal in dat kleiner is dan @1';
      messages[7] = 'Vul een geheel getal in dat groter is dan @1';
      messages[8] = 'Vul een numeriek getal in';
      messages[9] = 'Vul een numeriek getal in tussen @1 en @2';
      messages[10] = 'Vul een numeriek getal in dat kleiner is dan @1';
      messages[11] = 'Vul een numeriek getal in dat groter is dan @1';
      messages[12] = 'Vul een numeriek getal in met slechts @1 decimaal';
      messages[13] = 'Gebruik het datumformaat dd/mm/jjjj';
      messages[14] = 'de datum moet vroeger zijn dan ';
      messages[15] = 'de datum moet later zijn dan ';
    }
    if(langQuestionnaire=='sv'){
      messages[0] = 'Obligatoriskt svar';
      messages[1] = 'Välj @1 eller @2 svar';
      messages[2] = 'Välj minst @1 svar';
      messages[3] = 'Välj inte mer än @1 svar';
      messages[4] = 'Ange ett heltal';
      messages[5] = 'Ange antingen @1 eller @2';
      messages[6] = 'Ange ett heltal som är lägre än @1';
      messages[7] = 'Ange ett heltal som är högre än @1';
      messages[8] = 'Ange ett numeriskt värde';
      messages[9] = 'Ange ett numeriskt värde mellan @1 och @2';
      messages[10] = 'Ange ett numeriskt värde som är lägre än @1';
      messages[11] = 'Ange ett numeriskt värde som är högre än @1';
      messages[12] = 'Ange ett numeriskt värde som bara har @1 decimal';
      messages[13] = 'Ange ett datum i formatet dd/mm/åååå';
      messages[14] = 'datumet måste vara tidigare än ';
      messages[15] = 'datumet måste vara senare än ';
    }
    if(langQuestionnaire=='da'||langQuestionnaire=='fi'||langQuestionnaire=='no'){
      messages[0] = 'Compulsory answer';
      messages[1] = 'Select @1 or @2 answers';
      messages[2] = 'Select at least @1 answer';
      messages[3] = 'Select no more than @1 answer';
      messages[4] = 'Enter an integer number';
      messages[5] = "Enter an integer beetween @1 and @2";
      messages[6] = 'Enter an integer number lower than @1';
      messages[7] = 'Enter an integer number higher than @1';
      messages[8] = 'Enter a numerical number';
      messages[9] = 'Enter a numerical number between @1 and @2';
      messages[10] = 'Enter a numerical number lower than @1';
      messages[11] = 'Enter a numerical number higher than @1';
      messages[12] = 'Enter a numerical number with only @1 decimal';
      messages[13] = 'Enter a date like dd/mm/yyyy';
      messages[14] = 'the date must be inferior to ';
      messages[15] = 'the date must be superior to ';
    }
    if(langQuestionnaire=='pl'){
      messages[0] = 'Odpowiedź obowiązkowa';
      messages[1] = 'Musisz wybrać @1 lub @2 odpowiedzi';
      messages[2] = 'Musisz wybrać przynajmniej @1 odpowiedź';
      messages[3] = 'Musisz wybrać maksymalnie @1';
      messages[4] = 'Musisz wprowadzić liczbę całkowitą';
      messages[5] = 'Musisz wprowadzić liczbę całkowitą od @1 do @2';
      messages[6] = 'Musisz wprowadzić liczbę całkowitą mniejszą od @1';
      messages[7] = 'Musisz wprowadzić liczbę całkowitą większą niż @1';
      messages[8] = 'Musisz wprowadzić wartość liczbową';
      messages[9] = 'Musisz wprowadzić @1 lub @2 wartości liczbowe';
      messages[10] = 'Musisz wprowadzić wartość liczbową mniejszą niż @1';
      messages[11] = 'Musisz wprowadzić wartość liczbową większą niż @1';
      messages[12] = 'Musisz wprowadzić wartość liczbową z maksymalnie @1 jednym znakiem po przecinku.';
      messages[13] = 'Musisz wprowadzić datę w formacie dd/mm/rrrr';
      messages[14] = 'Data musi być wcześniejsza niż ';
      messages[15] = 'Data musi być późniejsza niż ';
    }
    if(langQuestionnaire=='pt'){
      messages[0] = 'Resposta obrigatória';
      messages[1] = 'Deve seleccionar entre @1 e @2 respostas';
      messages[2] = 'Deve seleccionar pelo menos @ 1 resposta';
      messages[3] = 'Deve seleccionar no máximo @1 resposta';
      messages[4] = 'Deve introduzir um número inteiro';
      messages[5] = 'Deve introduzir um número inteiro entre @1 e @2';
      messages[6] = 'Deve introduzir um número inteiro inferior a @1';
      messages[7] = 'Deve introduzir um número inteiro superior a @1';
      messages[8] = 'Deve introduzir um numérico';
      messages[9] = 'Deve introduzir um numérico entre @1 e @2';
      messages[10] = 'Deve introduzir um numérico inferior a @1';
      messages[11] = 'Deve introduzir um numérico superior a @1';
      messages[12] = 'Deve introduzir um numérico com mais de @1 algarismo depois da vírgula';
      messages[13] = 'Enter a date like dd/mm/yyyy';
      messages[14] = 'the date must be inferior to ';
      messages[15] = 'the date must be superior to ';
    }
    if(langQuestionnaire=='tr'){
      messages[0] = 'Cevap vermek mecburidir';
      messages[1] = '@1 ve @2 numaralı cevaplar arasından seçim yapmalısınız';
      messages[2] = 'En az @1 cevap seçmek zorundasınız';
      messages[3] = 'En fazla @1 cevap vermelisiniz';
      messages[4] = 'Bir tam sayı girmelisiniz';
      messages[5] = '@1 yada @2 arasında bir tamsayı girmelisiniz';
      messages[6] = '@1\'den daha küçük bir tamsayı girmelisiniz';
      messages[7] = '@1\'den daha büyük bir tamsayı girmelisiniz';
      messages[8] = 'Bir sayı girmelisiniz';
      messages[9] = '@1 yada @2 arasında bir sayı girmelisiniz';
      messages[10] = '@1\'den daha küçük bir sayı girmelisiniz';
      messages[11] = '@1\'den daha büyük bir sayı girmelisiniz';
      messages[12] = 'Virgülden sonra en fazla @1 rakamı olan bir sayı girmelisiniz';
      messages[13] = 'GG/AA/YYYY formatında bir tarih girmelisiniz';
      messages[14] = 'Tarih\'dan küçük olmalıdır ';
      messages[15] = 'Tarih\'dan büyük olmalıdır ';
    }
    if(langQuestionnaire=='cz'){
      messages[0] = 'Povinná odpověď';
      messages[1] = 'Vyberte jednu nebo dvě odpověde';
      messages[2] = 'Vyberte nejméně jednu odpověď';
      messages[3] = 'Vyberte nejvíc jednu odpověď';
      messages[4] = 'Zadejte celé číslo';
      messages[5] = 'Zadejte celé číslo mezi @1 až @2';
      messages[6] = 'Zadejte celé číslo menší než @1';
      messages[7] = 'Zadejte celé číslo větší než @1';
      messages[8] = 'Zadejte číslo';
      messages[9] = 'Zadejte číslo mezi @1 až @2';
      messages[10] = 'Zadejte číslo menší než @1';
      messages[11] = 'Zadejte číslo větší než @1';
      messages[12] = 'Zadejte číslo s nejvíc jednou číslici za desetinní čárkou';
      messages[13] = 'Zadejte datum typu dd/mm/rrrr';
      messages[14] = 'Datum musí být menší než';
      messages[15] = 'Datum musí být větší než';
    }
    if(langQuestionnaire=='ja'){
      messages[0] = '回答必須項目です';
      messages[1] = 'Select @1 or @2 answers';
      messages[2] = 'Select at least @1 answer';
      messages[3] = 'Select no more than @1 answer';
      messages[4] = 'Enter an integer number';
      messages[5] = 'Enter either @1 or @2';
      messages[6] = 'Enter an integer number lower than @1';
      messages[7] = 'Enter an integer number higher than @1';
      messages[8] = 'Enter a numerical number';
      messages[9] = 'Enter a numerical number between @1 and @2';
      messages[10] = 'Enter a numerical number lower than @1';
      messages[11] = 'Enter a numerical number higher than @1';
      messages[12] = 'Enter a numerical number with only @1 decimal';
      messages[13] = 'Enter a date like dd/mm/yyyy';
      messages[14] = 'the date must be inferior to ';
      messages[15] = 'the date must be superior to ';
    }
    if(langQuestionnaire=='zc'){
      messages[0] = '必须答复';
      messages[1] = '必须选择  @1 和 @2 之间的答复';
      messages[2] = '至少选择 @1 项答复';
      messages[3] = '至多选择 @1 项答复';
      messages[4] = '必须键入一个整数';
      messages[5] = '必须键入 @1 和 @2 之间的整数';
      messages[6] = '必须键入小于 @1 的整数';
      messages[7] = '必须键入大于 @1 的整数';
      messages[8] = '必须键入一个数字';
      messages[9] = '必须键入 @1 和 @2 之间的数字';
      messages[10] = '必须键入小于 @1 的数字';
      messages[11] = '必须键入大于 @1 的数字';
      messages[12] = '必须键入小数点后保留 @1 位的数字';
      messages[13] = '必须键入 XX日/XX月/XXXX年 形式的日期';
      messages[14] = '日期必须小于';
      messages[15] = '日期必须大于';
    }
    if(langQuestionnaire=='zt'){
      messages[0] = '必須作答項';
      messages[1] = '請您從 @1 和 @2中選擇答案';
      messages[2] = '請您至少選擇@1項答案 ';
      messages[3] = '請您至多選擇@1項答案 ';
      messages[4] = '請您輸入一個整數';
      messages[5] = '請您輸入@1和@2之間的一個整數';
      messages[6] = '請您輸入小於@1的一個整數';
      messages[7] = '請您輸入大於@1的一個整數';
      messages[8] = '請您輸入一個數據';
      messages[9] = '請您輸入@1和@2之間的一個數據';
      messages[10] = '請您輸入小於@1的一個數據';
      messages[11] = '請您輸入大於@1的一個數據';
      messages[12] = '請您輸入小數點後僅保留一位元小數的數據';
      messages[13] = '請您以日日/月月/年年年年的格式輸入日期';
      messages[14] = '日期應小於';
      messages[15] = '日期應大於';
    }
  }
  $('select.selectOthers').each(function(){
    try{
      var $this = $(this);
      var $id = $this.attr('id');
      var $txtOther = $('#' + $id + '_Others');
      $txtOther.hide();
      var elements = document.getElementById($id).options;
      if (elements[elements.length - 1]) {
         if (elements[elements.length - 1].selected){
          txtOther.show().focus();
        }
      }
      $this.change(function(){
        var $this = $(this);
        var $id = $this.attr('id');
        var $txtOther = $('#' + $id + '_Others');
        $txtOther.hide();
        var elements = document.getElementById($id).options;
        if (elements[elements.length - 1]) {
           if (elements[elements.length - 1].selected){
            $txtOther.show().focus();
          }
        }
      })
    }
    catch(e){}
  });
}

//----------------------------------------------------------------------------
// supprime la valeur de l'élément 'autre' associé à la question
//----------------------------------------------------------------------------
function removeOther(questionId){
  var theId = '#Q' + questionId;

  if ($(theId + ' option:selected').val()==$(theId + ' option:last').val())
  {
    $('#Q' + questionId + '_Others').show();
  }
  else{
    $('#Q' + questionId + '_Others').hide().val('');
  }
}

//----------------------------------------------------------------------------
// remplace chaque occurrence de 'oldString' par 'newString' dans la chaine 'string'
//----------------------------------------------------------------------------
function replace(string, oldString, newString){
  var stringLength = string.length;
  var oldStringLength = oldString.length;
  if ((stringLength == 0) || (oldStringLength == 0)) {return string;}
  var i = string.indexOf(oldString);
  if ((!i) && (text != string.substring(0, oldStringLength))) {return string;}
  if (i == -1) {return string;}
  var returnString = string.substring(0, i) + newString;
  if ((i + oldStringLength) < stringLength) {
    returnString += replace(string.substring(i + oldStringLength, stringLength), oldString, newString);
  }
  return returnString;
}

//----------------------------------------------------------------------------
// coche/décoche un bouton radio
//----------------------------------------------------------------------------
function resetRadio(qid){
  var e = document.getElementsByName('Q' + qid);
  var R = false;
  var idx = -1;
  var previousIdx = document.getElementById('R' + qid).value;
  for (var i = 0; i < e.length; i++) {
    if (e[i].getAttribute("type") != "hidden") {
      if ((!R) && (e[i].checked)) {
        R = true;
        document.getElementById('R' + qid).value = i;
        idx = i;
      }
    }
  }
  if ((previousIdx == idx) && (idx >-1 )) {
    e[idx].checked = false;
    document.getElementById('R' + qid).value = -1;
  }
}

//----------------------------------------------------------------------------
// affichage d'un élément hint
//----------------------------------------------------------------------------
function showKF(e, divName,posX,posY){
  if (!e) var e = window.event;
  var mouseX = 0;
  var mouseY = 0;
  var scrollTopWindow = 0;
  var scrollLeftWindow = 0;
  if(browser.nn) {
    mouseX = e.pageX;
    mouseY = e.pageY;
  }
  else {
    mouseX = e.clientX;
    mouseY = e.clientY;
    scrollLeftWindow = document.body.scrollLeft;
    scrollTopWindow = document.body.scrollTop;
  }
  var d = document.getElementById('KF' + divName);
  d.style.top = mouseY + scrollTopWindow + posY;
  d.style.left = mouseX + scrollLeftWindow + posX;
  show('KF' + divName);
}

//----------------------------------------------------------------------------
// rafraichit le style du titre 'titleId' en fonction de son état (validé ou non)
//----------------------------------------------------------------------------
function updateTitleStatus(titleId, validated){
  var titleQ=document.getElementById('T' + titleId);
  if (!titleQ){titleQ=document.getElementById('c' + titleId);}
  if (titleQ){
    if (!validated) {
      if (titleQ.className.indexOf("Selected") == -1) {
        titleQ.className += "Selected";
      }
      try {titleQ.focus();$('html,body').animate({scrollTop: $('#T' + titleId).offset().top},20);} catch (err) {}
    }
    else {
      var position = titleQ.className.indexOf("Selected");
      if (position > 0) {
        titleQ.className = titleQ.className.substring(0, position);
      }
    }
  }

}
//----------------------------------------------------------------------------
// Valide les checkbox d'une question lorsque la propriété "Aucun" est cochée
//----------------------------------------------------------------------------
function disabledModalityNone(questionId, modalityId, modalitiesArray, modalitiesNoneArray){
  var modalitiesArrayLength = modalitiesArray.length;
  var modalitiesNoneArrayLength = modalitiesNoneArray.length;

  for (var i = 0; i < modalitiesArrayLength; i++) {
  	if (document.getElementById('Q' + questionId + '_' + modalitiesArray[i]) != null){
      if (document.getElementById('Q' + questionId + '_' + modalitiesArray[i]).value == modalityId)
      {
   	    for (var j = 0; j < modalitiesNoneArrayLength; j++) {
   	    	if (document.getElementById('Q' + questionId + '_' + modalitiesNoneArray[j]) != null){
            document.getElementById('Q' + questionId + '_' + modalitiesNoneArray[j]).checked = false;
          }
         }
       return
     }
   }
  }
  var modalitiesNoneArrayLength = modalitiesNoneArray.length;
  for (var i = 0; i < modalitiesNoneArrayLength; i++) {
	  document.getElementById('Q' + questionId + '_' + modalitiesNoneArray[i]).checked = false;
	}
  for (var i = 0; i < modalitiesNoneArrayLength; i++) {
  	if (document.getElementById('Q' + questionId + '_' + modalitiesNoneArray[i]) != null){
      if (document.getElementById('Q' + questionId + '_' + modalitiesNoneArray[i]).value == modalityId)
      {
   	    for (var j = 0; j < modalitiesArrayLength; j++) {
   	    	if (document.getElementById('Q' + questionId + '_' + modalitiesArray[j]) != null){
        	  document.getElementById('Q' + questionId + '_' + modalitiesArray[j]).checked = false;
        	}
        }
        document.getElementById('Q' + questionId + '_' + modalitiesNoneArray[i]).checked = true;
        return
      }
    }
  }
}

//-------------------------------------
// Philippe: 28/01/2010 PASCAL
//-------------------------------------
function JVisible(item){
  if ($(item).parents("div.Section:first").length==0) {return true;}
  var iSection = $(item).parents("div.Section:first");
  return iSection!=null?iSection.is(":visible"):true
}
//----------------------------------------------------------------------------
// valide une question de type checkbox
//----------------------------------------------------------------------------
function validateCheckbox(questionId, isRequired, mini, maxi, modalitiesArray, titleId, groupHasOther){
  // s'il s'agit d'une question appartenant à un groupe
  // et que le groupe comporte un champ de type 'commentaires'
  // alors il faut enlever le dernier id dans le tableau des
  // modalités (il ne correspond à aucune modalité valide)
  if (groupHasOther == 'true') {modalitiesArray.pop();}
  var result = false;
  var nbChecked = countCheckedBox(questionId, modalitiesArray);
  var range = checkIntegerRange(nbChecked, mini, maxi);
  if (isRequired == 'true' && mini == '' && maxi == '' && nbChecked == 0) {alertMandatory(titleId);}
  else if (isRequired == 'true' && range && mini == '' && nbChecked == 0) {alertMandatory(titleId);}
  else if (!range) {
    if (mini != '' && maxi != '') {alertMinMaxResponse(titleId, mini, maxi);}
    else if (mini == '' && maxi != '') {alertMaxResponse(titleId, maxi);}
    else if (mini != '' && maxi == '') {alertMinResponse(titleId, mini);}
  }
  else {result = true;}
  updateTitleStatus(titleId, result);
  return result;
}

//----------------------------------------------------------------------------
// vérifie que 'value' est un entier positif et les bornes
//----------------------------------------------------------------------------
function validateInteger(questionId, isRequired, min, max, titleId){
  var result = false;
  var elem = document.getElementById('Q' + questionId);
  if (!JVisible(elem)) return true;
  elem.value = jQuery.trim(elem.value);
  var value = elem.value;
  if (   (value == '' && isRequired != 'true')
      || (value != '' && isInteger(value) && checkIntegerRange(parseInt(value, 10), min, max))) {result = true;}
  else {
    var range = checkIntegerRange(parseInt(value, 10), min, max);
    if (isRequired == 'true' && value == '') {alertMandatory(titleId);}
    else if (value != '' && !isInteger(value)) {alertNotInteger(titleId);}
    else if (!range) {
      if (min != '' && max != '') {alertMinMaxInteger(titleId, min, max);}
      else if (min != '' && max == '') {alertMinInteger(titleId, min);}
      else if (min == '' && max != '') {alertMaxInteger(titleId, max);}
    }
  }
  return result;
}

//----------------------------------------------------------------------------
// valide une question de type multiselect
//----------------------------------------------------------------------------
function validateMultiselect(questionId, isRequired, titleId){
  var result = false;
  if (isRequired == 'true') {
    var multiselectArray = document.getElementById('Q' + questionId);
    if (!JVisible(multiselectArray)) return true;
    var selectedIndex = multiselectArray.selectedIndex;
    for (var i = 0; i < multiselectArray.length; i++) {
    	if (multiselectArray[i].selected && selectedIndex != 0) {result = true;}
    }
    if (result == false) {alertMandatory(titleId);}
  }
  else {result = true;}
  updateTitleStatus(titleId, result);
  return result;
}

//----------------------------------------------------------------------------
// vérifie que 'value' est un numérique et les bornes et la précision
//----------------------------------------------------------------------------
function validateNumeric(questionId, isRequired, min, max, precision, titleId){
  var result = false;
  var elem = document.getElementById('Q' + questionId);
  if (!JVisible(elem)) return true;
  elem.value = jQuery.trim(elem.value);
  var val = elem.value;
  if ((val == '' && isRequired != 'true')
      || (val != '' && isNumeric(val) && checkFloatRange(parseFloat(val), min, max) && checkPrecision(val, parseInt(precision)))) {result = true;}
  else {
    var rangeOk = checkFloatRange(parseFloat(val), min, max);
    var precisionOk = checkPrecision(val, parseInt(precision));
    if (isRequired == 'true' && val == '') {alertMandatory(titleId);}
    else if (!isNumeric(val)) {alertNotNumeric(titleId);}
    else if (!rangeOk) {
      if (min != '' && max != '') {alertMinMaxNumeric(titleId, min, max);}
      else if (min != '' && max == '') {alertMinNumeric(titleId, min);}
      else if (min == '' && max != '') {alertMaxNumeric(titleId, max);}
    }
    else if (!precisionOk) {
      alertPrecision(titleId, precision);
    }
  }
  return result;
}

//----------------------------------------------------------------------------
// vérifie que 'value' est une date de type jj/mm/aaaa
//----------------------------------------------------------------------------
function validateDate(questionId, isRequired, titleId){
  var result = false;
  var elem = document.getElementById(questionId);
  if (!JVisible(elem)) return true;
  elem.value = jQuery.trim(elem.value);
  var val = elem.value;
  if ((val == '' && isRequired != 'true')||(val != '' && isDate(val))) {result = true;}
  else {
    if (isRequired == 'true' && val == '') {alertMandatory(titleId);}
    else if (!isDate(val)) {alertNotDate(titleId);}
  }
  return result;
}

//----------------------------------------------------------------------------
// valide une question ouverte
//----------------------------------------------------------------------------
function validateOpen(questionId, isRequired, kind, mini, maxi, precision, titleId){
  var result = false;
  var elem;
  if (document.getElementById(questionId)){
    elem = document.getElementById(questionId)
  }
  else{
    elem = document.getElementById('Q' + questionId)
  }
  if (!JVisible(elem)) return true;
  elem.value = jQuery.trim(elem.value);
  switch (kind) {
    case 'integer' :
      result = validateInteger(questionId, isRequired, mini, maxi, titleId);
      break;
    case 'numeric' :
      result = validateNumeric(questionId, isRequired, mini, maxi, precision, titleId);
      break;
    case 'percent' :
      result = validateInteger(questionId, isRequired, '0', '100', titleId);
      break;
    case 'date' :
      result = validateDate(questionId, isRequired, titleId);
      break;
    case 'text' :
      if (isRequired != 'true' || (isRequired == 'true' && elem.value != '' && elem.value != null)) {result = true;}
      else {alertMandatory(titleId);}
      break;
  }
  updateTitleStatus(titleId, result);
  return result;
}

//--- Added by pascal to make sure that if a question "other" is mandatory then the text field will be fulfilled
function validateOthers(questionId, isRequired, titleId){
  var result = false;
  var elem = document.getElementById('Q' + questionId);
  if (elem != null)
  {
    if (!JVisible(elem)) return true;
    var elemMaster = document.getElementById(elem.getAttribute('linkeditem'));
    if (elemMaster.checked)
    {
      elem.value = jQuery.trim(elem.value);
      if (isRequired != 'true' || (isRequired == 'true' && elem.value != '' && elem.value != null)) {result = true;}
      else
      {
        alertMandatory(titleId);
        updateTitleStatus(titleId, result);
      }
    }
    else {result=true;}
 }
 else {result=true;}

  return result;
}

//----------------------------------------------------------------------------
// valide une question de type radio
//----------------------------------------------------------------------------
function validateRadio1(questionId, isRequired, titleId){
  	var result=false;
  	if (isRequired=='true')
	{
	   if (document.getElementsByName('Q' + questionId))
	   {
        	var radioButtonArray = document.getElementsByName('Q' + questionId);
        	if (!JVisible(radioButtonArray[0])) return true; // ---PASCAL ajout de [0] pour pointer vers quelque chose
        	for (var i=0; i<radioButtonArray.length; i++) {
          		if (radioButtonArray[i].checked) {
    				result=true;
    			}
    		}
    	}
    }
    if (result==false) {

		alertMandatory(titleId);
   }
  else {result=true;}
  updateTitleStatus(titleId, result);
  return result;
}


function validateRadio(questionId, isRequired, titleId){
  var result=false;
  if (isRequired=='true') {
    var radioButtonArray = document.getElementsByName('Q' + questionId);
    if (!JVisible(radioButtonArray[0])) return true; // ---PASCAL ajout de [0] pour pointer vers quelque chose
    for (var i=0; i<radioButtonArray.length; i++) {
      if (radioButtonArray[i].checked) {
		result=true;
		if ((document.getElementById('L' + questionId) != null) && (document.getElementById('L' + questionId).parentNode != null) && (document.getElementById('L' + questionId).parentNode.parentNode != null))
		{
			if (document.getElementById('L' + questionId).parentNode.parentNode.className == "Section")
			{
	 			//document.getElementById('L' + questionId).parentNode.style.borderWidth = "0px";
	 			//document.getElementById('L' + questionId).parentNode.style.borderStyle = "";
				document.getElementById('L' + questionId).className = "Question";

			}
		}
		else
		{
   		    if (document.getElementById('T' + questionId))
		    {
		      document.getElementById('T' + questionId).style.textDecoration = "none";
            }
        }
	}
    }
    if (result==false) {

		alertMandatory(titleId);

		if ((document.getElementById('L' + questionId) != null) && (document.getElementById('L' + questionId).parentNode != null) && (document.getElementById('L' + questionId).parentNode.parentNode != null))
		{
	 		if ((document.getElementById('L' + questionId).parentNode.parentNode.className == "Section") && (document.getElementById('L' + questionId) != null))
			{
				document.getElementById('L' + questionId).className = "Question QuestionEmpty";
	    		//document.getElementById('L' + questionId).parentNode.style.borderColor = "#E32418";
	 			//document.getElementById('L' + questionId).parentNode.style.borderWidth = "0px";
	 			//document.getElementById('L' + questionId).parentNode.style.borderLeftWidth = "5px";
	 			//document.getElementById('L' + questionId).parentNode.style.borderStyle = "solid";
			}
		}
		else
		{
   		    if (document.getElementById('T' + questionId))
		    {
		      document.getElementById('T' + questionId).style.textDecoration = "underline";
            }
        }

	}
  }
  else {result=true;}
  updateTitleStatus(titleId, result);
  return result;
}

//----------------------------------------------------------------------------
// valide un groupe de questions de type rank
//----------------------------------------------------------------------------
function validateRank(modalityId, isRequired, mini, maxi, titleId, questionsArray){
  var result = false;
  var elem = document.getElementById('GC_' + modalityId)
  if (elem != null)
  {
    if (!JVisible(elem)) return true;
    var nbRanked = countRanked(modalityId, questionsArray);
    var range = checkIntegerRange(nbRanked, mini, maxi);
    if (isRequired == 'true' && mini == '' && maxi == '' && nbRanked < questionsArray.length) {alertMandatory(titleId);}
    else if (isRequired == 'true' && range && mini == '' && nbRanked == 0) {alertMandatory(titleId);}
    else if (!range) {
      if (mini != '' && maxi != '') {alertMinMaxResponse(titleId, mini, maxi);}
      else if (mini == '' && maxi != '') {alertMaxResponse(titleId, maxi);}
      else if (mini != '' && maxi == '') {alertMinResponse(titleId, mini);}
    }
    else {result = true;}
    updateTitleStatus(titleId, result);
  }
  else {result=true;}
  return result;
}

//----------------------------------------------------------------------------
// validation d'un groupe de questions matricielles ouvertes
//----------------------------------------------------------------------------
function validateOpenGroup(groupId, group, kind, isRequired, min, max, precision, rowTotal, columnTotal)
{
  // variables locales
  var nbQuestions = group.length; if (nbQuestions == 0) {return true;}
  var nbModalities = group[0].length; if (nbModalities == 0) {return true;}
  var rowTotals = new Array(nbQuestions);
  var columnTotals = new Array(nbModalities);
  var value;
  // initialisation des tableaux de totaux
  if (kind == 'percent' && (rowTotal != '' || columnTotal != '')) {
    for (var i = 0; i < rowTotals.length; i++) {rowTotals[i] = 0;}
    for (var j = 0; j < columnTotals.length; j++) {columnTotals[j] = 0;}
  }
  // parcours de toutes les cellules
  for (var i = 0; i < nbQuestions; i++) {
    for (var j = 0; j < nbModalities; j++) {
      // validation du contenu
      if (!validateOpen(group[i][j].substring(1), isRequired, kind, min, max, precision, groupId)) {return false;}
      // calcul des totaux
      if (kind == 'percent' && (rowTotal != '' || columnTotal != '')) {
        value = document.getElementById(group[i][j]).value;
        rowTotals[i] += (value != '' ? parseInt(value) : 0);
        columnTotals[j] += (value != '' ? parseInt(value) : 0);
      }
    }
  }
  // le contenu des cellules est correct
  // vérification des totaux en ligne et en colonne
  if (kind == 'percent') {
    if (rowTotal != '') {
      for (var i = 0; i < rowTotals.length; i++) {
        if (rowTotals[i] != parseInt(rowTotal)) {
          updateTitleStatus(groupId, false);
          DoAlert('La somme des pourcentages pour chaque ligne doit être égale à ' + rowTotal + ' %.', 'Erreur');
          return false;
        }
      }
    }
    if (columnTotal != '') {
      for (var j = 0; j < columnTotals.length; j++) {
        var gcId = group[0][j].substring(group[0][j].indexOf('_') + 1);
        var gcText = document.getElementById('GC_' + gcId).innerText;
        if (countFilled(group, j) > 0 && columnTotals[j] != parseInt(columnTotal)) {
          updateGroupColumnStatus(gcId, false);
          DoAlert('La somme des pourcentages pour la colonne "' + gcText + '" doit être égale à ' + columnTotal + ' %.', 'Erreur');
          return false;
        }
        else {
          updateGroupColumnStatus(gcId, true);
        }
      }
    }
  }
  return true;
}

//----------------------------------------------------------------------------
// compte le nombre de réponses dans une colonne du groupe
//----------------------------------------------------------------------------
function countFilled(group, columnIndex)
{
  var result = 0;
  for (var i = 0; i < group.length; i++) {
    if (document.getElementById(group[i][columnIndex]).value != '') {result++;}
  }
  return result;
}

//----------------------------------------------------------------------------
// rafraichit le style du titre 'titleId' en fonction de son état (validé ou non)
//----------------------------------------------------------------------------
function updateGroupColumnStatus(titleId, validated)
{
  var titleGroup = document.getElementById('GC_' + titleId);
  if (!validated) {
    if (titleGroup.className.indexOf("Selected") == -1) {
      titleGroup.className += "Selected";
    }
    try {titleGroup.focus();} catch (title) {}
  }
  else {
    var position = titleGroup.className.indexOf("Selected");
    if (position > 0) {
      titleGroup.className = titleGroup.className.substring(0, position);
    }
  }
}

//----------------------------------------------------------------------------
// test Restriction pour une question date de la page
//----------------------------------------------------------------------------
function CheckDateRestriction(myDateRestriction){
  var listRestriction = myDateRestriction.split('|');
  var myRestriction, myQuestion;
  // une ou plusieurs questions date avec restriction sur cette page
  for(i=0;i<listRestriction.length;i++){
    myRestriction = listRestriction[i].split(';');
    myQuestion    = document.getElementById('Q'+myRestriction[0]).value;
    if(myQuestion!='' & myRestriction[2]!=''){
    	//---------------------- year ----------------- month ---------------- day ----------
      var D1=new Date(myQuestion.substr(6,4), myQuestion.substr(3,2)-1, myQuestion.substr(0,2))                   //Month is 0-11 in JavaScript
      var D2=new Date(myRestriction[2].substr(6,4), myRestriction[2].substr(3,2)-1, myRestriction[2].substr(0,2)) //Month is 0-11 in JavaScript
      if(myRestriction[1]=='>'){
        if(D1 <= D2){
          DoAlert(messages[15] + ' ' + myRestriction[2], 'Erreur');
          updateTitleStatus(myRestriction[0], false);
          return false;
        }
      }
      else{
        if(D1 >= D2){
          DoAlert(messages[14] + ' ' + myRestriction[2], 'Erreur');
          updateTitleStatus(myRestriction[0], false);
          return false;
        }
      }
    }
  }
  return true;
}

//----------------------------------------------------------------------------
// CALENDRIER POUR LES QUESTIONS DATE
//----------------------------------------------------------------------------
function Popup(mypage,myname,w,h){
  var wBrowser = 480, hBrowser = 340;
  wBrowser = top.document.body.clientWidth;
  hBrowser = top.document.body.clientHeight;
  tBrowser = top.window.screenTop;
  lBrowser = top.window.screenLeft;
  var leftPos = (wBrowser-w)/2+lBrowser, topPos = (hBrowser-h)/2+tBrowser;
  settings = 'directories = no,' +
             'menubar = no,' +
             'status = no,' +
             'location = no,' +
             'scrollbars = no,' +
             'resizable = yes,' +
             'height = '+h+',' +
             'width = '+w+',' +
             'left = '+leftPos+',' +
             'top = '+topPos+',' +
             'fullscreen = no';
  win=window.open(mypage,myname,settings);
  if(win.focus){
    win.focus();
  }
}

function Calendar(divObject){
  var currentDate = divObject.value;
  Popup('includes/Calendar.asp?txtbox=' + divObject.id + '&startDate=' + currentDate, 'dp', 196, 154);
}

function setDate(date, divId){
  document.getElementById(divId).value = date;
  var Qid = divId.substr(1);
  document.getElementById(Qid).value = date;
}


//----------------------------------------------------------------------------
// Gestion des cookies
//----------------------------------------------------------------------------
function WriteCookie(nom, valeur)
{
	var argv=WriteCookie.arguments;
	var argc=WriteCookie.arguments.length;
	var expires=(argc > 2) ? argv[2] : null;
	var path=(argc > 3) ? argv[3] : null;
	var domain=(argc > 4) ? argv[4] : null;
	var secure=(argc > 5) ? argv[5] : false;
	document.cookie=nom+"="+escape(valeur)+
	((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
	((path==null) ? "" : ("; path="+path))+
	((domain==null) ? "" : ("; domain="+domain))+
	((secure==true) ? "; secure" : "");
}
function getCookieVal(offset)
{
	var endstr=document.cookie.indexOf (";", offset);
	if (endstr==-1) endstr=document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}
function ReadCookie(nom)
{
	var arg=nom+"=";
	var alen=arg.length;
	var clen=document.cookie.length;
	var i=0;
	while (i<clen)
	{
		var j=i+alen;
		if (document.cookie.substring(i, j)==arg) return getCookieVal(j);
		i=document.cookie.indexOf(" ",i)+1;
		if (i==0) break;
	}
	return null;
}
function DeleteCookie(nom)
{
	date=new Date;
	date.setFullYear(date.getFullYear()-1);
	WriteCookie(nom,null,date);
}


//----------------------------------------------------------------------------
// Gestion de la redirection par cookies
//----------------------------------------------------------------------------
function RedirectCookie(minutes,alias,rep,langue,variable){
	server = window.location.href.substr(0,window.location.href.lastIndexOf("/")+1);
	a = unescape(window.location.search.substr(1)).split("&");
	PARAM = new Array();
	for (i=0;i<a.length;i++){
		PARAM[a[i].substring(0,a[i].indexOf("="))] = a[i].substr(a[i].indexOf("=")+1);
	}
	if (PARAM["s"]==null){
		if (ReadCookie("s")!=null){
			window.location.replace(server+"questionnaire.asp?s="+ReadCookie("s")+"&a="+alias+"&r="+rep+"&l="+langue+"&var="+variable);
		}
	}
	else{
		if (minutes!=0){
			date=new Date;
			date.setMinutes(date.getMinutes()+minutes);
			WriteCookie("s", PARAM["s"], date);
		}else{
			WriteCookie("s", PARAM["s"]);
		}
	}
}
