String.prototype.trim = function() {
	return this.replace(/^\s+/, '').replace(/\s+$/, '');
}

function doSubmit(theFormName, controlFunction, ajaxFunction) 
//===========================================================
{
	var ok = true;
 
	if( controlFunction && controlFunction != ' ' )
	{
		ok = controlFunction( theFormName );
		if (!ok)
			return false;
	}
	var theform = document.getElementById(theFormName);
	
	for (var i = 0; (i < theform.elements.length) && ok; i++)
	{
		var field = theform.elements[i];

		// if field is hidden or disabled, does not check anything
		// just clear the field
		// (for visibility, test the visibility of the row containing the field if exists)
		// (probable bug in use of parentNode : build the id of the row instead)
		var row = document.getElementById("tr_" + field.name);
		
		// no row : the field is probably part of a table question
		// get rid of the trailing _X
		if (!row)
		{
		  //The table questions are of the form : myQuestion_1, myQuestion_2, myQuestion_3...
      var radical = field.name.substr(0, field.name.lastIndexOf('_'));
      row = document.getElementById("tr_" + radical );
      //Or if exists columns : myQuestion_1_1, myQuestion_1_2, myQuestion_2_1, myQuestion_2_2...
      if( !row )
        row = document.getElementById("tr_" + radical.substr(0, radical.lastIndexOf('_')) );
		}
		if (row && row.style.display == "none" || field.disabled == true)
		{
			// select object ?
			// instanceof does not work with ie...
			//if (field instanceof HTMLSelectElement)
			if (typeof field == "object" && field.nodeName && field.nodeName.toLowerCase() == "select")	
			{
				field.options.selectedIndex = 0;
				//Pb with IE
				//for (var j = 0; j < field.options.length; j++)
					//field.options[j].selected = false;
			}
			// text area input
			else if (typeof field == "object" && field.nodeName && field.nodeName.toLowerCase() == "textarea")
			{
				field.disabled = "true";
				field.value= "";
			}
			// text input
			else if (typeof field == "object" && field.nodeName && field.nodeName.toLowerCase() == "input")
			{
				field.disabled = "true";
				field.value= "";
			}
			// radio or check box ?
			else
				field.checked = false;
					
			continue;
		}

    //=== money check
    if( field.name.indexOf("_vm_money") > 0 )
    {
      var pos = field.name.indexOf("_vm_money");
      var moneyName = field.name.substring(0,pos);
      var field_cts = moneyName + "_vm_cts";
      
      theform[moneyName].value = '';
      var euros = field.value;
      var cts   = theform[field_cts].value;
      if( euros != '' || cts != '' )
      {
        if( euros == '' )
          euros = '0';
        theform[moneyName].value = euros + "." + cts;
      }
      //alert(' value : ' + field.value + '€' + theform[field_cts].value  + 'cts =' + theform[moneyName].value);
    }
    
    //=== day-month-year check
    if( field.name.indexOf("_day") > 0 && typeof field == "object" && 
        field.nodeName && field.nodeName.toLowerCase() == "select" )
    {
      var pos = field.name.indexOf("_day");
      var dateName = field.name.substring(0,pos);
      var field_month = dateName + "_month";
      var field_year  = dateName + "_year";
      if( theform[field_month] && theform[field_year] ) //this is a day, month, year select
      {
        ok = verifyAndReturnDate( theFormName, dateName );
        if (!ok)
        {
           //theform[field.name].value = '';
           //theform[field_month].value = '';
           //theform[field_year].value = '';
           theform[field.name].focus();
           alert(labelField + " '" + theform[dateName].longname + "' " + labelInvalid);
        }
      }
    }
    
		//=== check for required field
		if (typeof(field.isnotnull) != "undefined")
		{                                             
			ok = eval(field.isnotnull);
			if (!ok)
			{				
			 /** DOM
			 var longname = field.longname;
       var pos = field.longname.indexOf("- ")
       if( pos > 0 )
       {
        longname = longname.substring(0, pos);
        longname = "Numéro " + longname;
       } 
				alert(labelField + " '" + longname + "' " + labelMandatory);
				*/
				alert(labelField + " '" + field.longname + "' " + labelMandatory);
				
        if( field.type != 'hidden' )
				  field.focus();
				else      //a required field of type hidden is a "money" type or of "date combo"
				{
				  if( theform[ field.name + "_vm_money"] )
            theform[ field.name + "_vm_money"].focus();
          else if( theform[ field.name + "_day"] )
            theform[ field.name + "_day"].focus();
        }
				break;
      }
		}
		
		//=== check for input validity
		if (typeof(field.isvalid) != "undefined") 
		{
			ok = eval(field.isvalid);
			if (!ok)
			{
			/** DOM 
			var longname = field.longname;
       var pos = field.longname.indexOf("- ")
       if( pos > 0 )
       {
        longname = longname.substring(0, pos);
        longname = "Numéro " + longname;
       }
				alert(labelField + " '" + longname + "' " + labelInvalid);
			*/
        alert(labelField + " '" + field.longname + "' " + labelInvalid);
	
				if( field.type != 'hidden' )
				  field.focus();
				else      //a required field of type hidden is a "money" type
				  theform[ field.name + "_vm_money"].focus();
				  
				break;
			}
		}
		
		//=== check for input cardinality
		if (typeof(field.isnbminmax) != "undefined") 
		{
			ok = eval(field.isnbminmax);
			if (!ok)
			{
				alert(labelNbAnswers + " '" + field.longname + "' " + labelInvalid);
				field.focus();
				break;
			}
		}
	}
	if( ok && ajaxFunction )
	{
		ajaxFunction( theFormName );		//may be useful to have the form name parameter
	}
	return (ok);
}

function setBackwardToFalse(theFormName)
//======================================
{
	var theform = document.getElementById(theFormName);
	if( theform.backward )		//No backward on the first page
		theform.backward.value='false';
	return true;
}

/* Function to use if for each row we select a unique value: for instance if we need to order
   according to a preference */
function oneRowPerChoice(formName, rowName)
//=========================================
{
  var type = '';
  var i =1;
  var data = new Array();
  while(true)
  {
    var fieldName = rowName + '_' + i;
    var field = document.getElementById(fieldName);
    if( field )
    {
      var value = '';
      
      if ( field.nodeName.toLowerCase() == "select" )
      {
        type = 's';
        value = getSelectValue(formName, fieldName);
      }
      else
        value = field.value;
        
      if( value != '' )
      {
        for(var j=0; j<data.length; j++)
        {
          if( value == data[j] )
          {
            if( type == 's' )
            {
              //var text = getTextContent( select.options[select.selectedIndex] );
              //alert('La valeur ' + text + ' est déjà sélectionnée !');
              field.selectedIndex = 0;
            }
            else
              field.checked = false;
            return false;
          }
        }
      }
      data.push(value);
    }
    else
      break;
    i++;
  }
  return true;
}

function forceOneRowPerChoice(theChoice)
//======================================
{
  // if the item is input_answer_12_2 (2ndr row of question 12 named input_answer_12)
  //row name will be : input_answer_12
  var nameCompo = theChoice.name.split('_');
  
  var rowName = nameCompo[0] + '_' + nameCompo[1]+ '_' + nameCompo[2];
  var formName = 'quizExec';
  var choiceRow = nameCompo[3];
  
  var choiceValue = '';
  var type = '';
  if ( theChoice.nodeName.toLowerCase() == "select" )
  {
    type = 's';
    choiceValue = theChoice.selectedIndex;
    if( choiceValue == 0 )     //Nothing to do, we are currently deselecting a value
      return false;
  }
  else
  {
    choiceValue = radioValue(formName, theChoice.name);
  }
  var i =1;
  while(true)
  {
    if( i == choiceRow )     //Skip the current row
      i++;
      
    var fieldName = rowName + '_' + i;
    //var field = document.getElementById(fieldName);
    var field = document.forms[formName][fieldName];
    if( field )
    {  
      if( type=='s' )
      {
        if( field.selectedIndex==choiceValue )
        {
         field.selectedIndex = 0;
         return false;      //No need to continue, we cannot have more than 2 identical values
        }
      }
      else
      {
        if( radioValue(formName, fieldName) == choiceValue )
        {
          clearRadioValue(formName, fieldName);
          return false;      //No need to continue, we cannot have more than 2 identical values
        }
      }
    }
    else
      break;
    i++;
  }
  return true;
}

/* This function completes forceOneRowPerChoice when we want to valid the fact that 
if we have to classify for instance our first, 2nd, 3rd choices, each choice is selected 
at least once 
WARNING : 
- We have only done the radio value version
- Should implement the select one 
- In this simplified version we suppose we have forceOneRowPerChoice and the one choice 
cannot be selected or checked twice */
 
function checkAllChoicesAreChecked(formName, rowName)
//===================================================
{
  // The rows are named rowName_1, rowName_2, ...
  var fieldName = rowName + '_' + 1;  
  var field = document.forms[formName][fieldName];
  if( field )     //at least one row !
  {  
    var nbPossibleChoices = field.length;
    var count = 0;
    var i=1;
    while(true)
    {
      for (var j=0; j < nbPossibleChoices ; j++)
      {
        if (field[j].checked == true)
        {
          count++;
          break;
        }
      }
      if( count == nbPossibleChoices )
        return true;
      i++;
      fieldName = rowName + '_' + i;  
      field = document.forms[formName][fieldName];
      if( !field )
        break;
    }
  }
  return false;
}

function radioValue(formName, radioName)
//======================================
{
	var radio = document.forms[formName][radioName];
	if( radio )
	{
    for (var i=0; i < radio.length ;i++)
      if (radio[i].checked == true)
        return radio[i].value;
	}	
	return undefined;
}

function getRadioText(formName, radioName)
//========================================
{
	var radio = document.forms[formName][radioName];
	
	for (var i=0; i < radio.length ;i++)
	{
		if (radio[i].checked == true)
			return trimAll( getTextContent( radio[i].nextSibling ) );
	}		
	return undefined;
}

function setRadioValue(formName, radioName, index)
//================================================
{
	var radio = document.forms[formName][radioName];
	
	for (var i=0; i < radio.length ;i++)
	{
		if( i == index )
			radio[i].checked = true;
		else
			radio[i].checked = false;
	}		
	return undefined;
}

function setRadioValueByValue(formName, radioName, value)
//=======================================================
{
	var radio = document.forms[formName][radioName];
	
	for (var i=0; i < radio.length ;i++)
	{
    if( radio[i].value == value )
    {
      radio[i].checked = true;
      break;
    }
	}		
	return undefined;
}

function clearRadioValue(formName, radioName)
//===========================================
{
	var radio = document.forms[formName][radioName];
	for (var i=0; i < radio.length ;i++)
		radio[i].checked = false;
	return undefined;
}

function getSelectText(formName, selectName)
//==========================================
{
	var select = document.forms[formName][selectName];	
	return getTextContent( select.options[select.selectedIndex] );
}
function getSelectValue(formName, selectName)
//===========================================
{
	var select = document.forms[formName][selectName];	
	return select.options[select.selectedIndex].getAttribute("value");
}
function setSelectValue(formName, selectName, value)
//==================================================
{
	var select = document.forms[formName][selectName];	
	for (var i=0; i < select.options.length ;i++)
	{
		if( select.options[i].getAttribute("value") == value )
		{
			select.selectedIndex = i;
			return true; 
		}
	}
	return false;
}
function setSelectValueById(selectId, value)
//==========================================
{
	var select = document.getElementById(selectId);	
	for (var i=0; i < select.options.length ;i++)
	{
		if( select.options[i].getAttribute("value") == value )
		{
			select.selectedIndex = i;
			return true; 
		}
	}
	return false;
}

function clearSelectValue(formName, selectName)
//=============================================
{
	var select = document.forms[formName][radioName];
	
	select.options.selectedIndex = 0;
	//Pb with IE
	//for (var i=0; i < select.options.length ;i++)
		//select.options[i].selected = false;
	return undefined;
}

function removeSelectOptions(formName, selectName, index)
//=======================================================
{
	var select = document.forms[formName][selectName];
	if( !index || index==0 )
	{
		select.removeChildren("option");
	}
	else
	{
		var optArray = select.getElementsByTagName("option");
		var len = optArray.length;
		for(var i=len-1; i>=index; i--)	//decreasing order till index
		{
			select.removeChild( optArray[i] );
		}
	}
}

function setSelectDate(formName, dateName, dateValue)
//===================================================
{
	var hiddenDate = document.forms[formName][dateName];
	hiddenDate.value = dateValue;
	
  var dayName   = dateName + "_day";
  var monthName = dateName + "_month";
  var yearName  = dateName + "_year";
 
  //assume dateValue is under the form aaaa-mm-yy 
  setSelectValue(formName, dayName, dateValue.substring(8,10) );
  setSelectValue(formName, monthName, dateValue.substring(5,7) );
  setSelectValue(formName, yearName, dateValue.substring(0,4) );
}

/* Add options to a select coming from an XML tree result of an Ajax request */

function addSelectOptions(formName, selectName, element, tag, valueTag, messageTag)
//================================================================================
{
  var select;
  if( formName != '' )
    select = document.forms[formName][selectName];
	else
    select = document.getElementById(selectName);

  return addOptionsIntoSelect(select, element, tag, valueTag, messageTag);
}

function addOptionsIntoSelect(select, element, tag, valueTag, messageTag)
//=======================================================================
{
	//create <option value="val">message</option>
  if( element )
	{
    var optArray = element.getElementsByTagName(tag);
  	var len = optArray.length;
  
  	for(var i=0; i<len; i++)
  	{
  		var opt = document.createElement('option');
  		opt.setAttribute('value', optArray[i].getElementsByTagName(valueTag)[0].firstChild.data);
  		setTextContent(opt, optArray[i].getElementsByTagName(messageTag)[0].firstChild.data);
  
  		select.appendChild(opt);
  	}
	}
}
function addOptionsIntoSelectWithOptionGroup(select, element, tag, valueTag, messageTag, groupLabel)
//==================================================================================================
{
	//create <optgroup label="groupLabel">
  //then the <options>
  //then end tag </optgroup>
  var optGroup = document.createElement('optgroup');
  if( groupLabel && groupLabel != "" )
    optGroup.setAttribute('label', groupLabel);
  
  select.appendChild(optGroup);
  addOptionsIntoSelect(optGroup, element, tag, valueTag, messageTag);
}

function getCheckedBoxesValues(formName, checkBoxName, separator)
//===============================================================
{
	return getCheckedBoxesValuesByForm(document.forms[formName], checkBoxName, separator);
}

function getCheckedBoxesValuesByForm(form, checkBoxName, separator)
//=================================================================
{
	var cb = form[checkBoxName];
	var allValues = "";
	
	for (var i=0; i < cb.length ;i++)
	{
		if (cb[i].checked == true)
		{
			if( allValues != "" )
				allValues += separator;
			allValues += cb[i].value;
		}
	}
	return allValues;
}

function getCheckedBoxesTexts(formName, checkBoxName, separator)
//==============================================================
{
	var cb = document.forms[formName][checkBoxName];
	var allValues = "";
	
	for (var i=0; i < cb.length ;i++)
	{
		if (cb[i].checked == true)
		{
			if( allValues != "" )
				allValues += separator;
			allValues += trimAll( getTextContent( cb[i].nextSibling ) ); 
		}
	}
	return allValues;
}

/* problem if only one checkbox */
function getNbCheckedBoxes(formName, checkBoxName)
//================================================
{
	var cb = document.forms[formName][checkBoxName];
	var nbChecked = 0;

	for (var i=0; i < cb.length ;i++)
		if (cb[i].checked == true)
			nbChecked++;
	return nbChecked;
}

function validNbCheckedBoxes(formName, checkBoxName, minVal, maxVal)
//==================================================================
{
	var nbChecked = getNbCheckedBoxes(formName, checkBoxName);
	if( minVal != "" && nbChecked < minVal )
		return false;
	if( maxVal != "" && nbChecked > maxVal )
		return false;
	return true;
}

function manageExclusiveChoice(theCheckbox, formName)
//===================================================
{
  var exclu  = theCheckbox.checked;
  var cbName = theCheckbox.name;
  var cb = document.forms[formName][cbName];

  for (var i=0; i < cb.length ;i++)
	{
    if( cb[i] != theCheckbox )
    {
      if ( exclu )
      {
        cb[i].disabled = true;
        cb[i].checked  = false;

        var assText = document.forms[formName][cbName + "_com"];
        if( assText )
        {
          assText.value = "";
          assText.disabled = true;
        }
      }
      else
        cb[i].disabled = false;
    }
	}
  return true;
}

function controlNbChecked(theCB, formName, nbMax)
//===============================================
{
  if( theCB.checked )   //No control when we uncheck the box
  {
    var cbName = theCB.name;
    var count = 0;
    var cb = document.forms[formName][cbName];
    for (var i=0; i < cb.length ;i++)
    {
      if( cb[i].checked )
      {
        if( count == nbMax )
        {
          alert(labelCheckboxMaxBegin +  nbMax + labelCheckboxMaxEnd);
          theCB.checked = false;
          return false;
        }
        count++;
      }
    }
  }
  return true;
}

function isValueInArray( theValue, theArray )
//===========================================
{
  for( var i=0; i<theArray.length; i++ )
  {
    if( theValue == theArray[i] )
      return true;
  }
  return false;
}
       
function manageAssociatedText( field, currentIndex, textIndex )
//=============================================================
{
	var enableText = false;
	if( field.type == "radio" )
	{
		if( currentIndex == textIndex ) 
			enableText = true;
	}
	else
		enableText = field.checked;
		
	var assText = document.getElementById(field.name + "_com");
	if( enableText )
	{
		assText.disabled = false; 
		assText.focus();
	}
	else
	{
		assText.value = "";
		assText.disabled = true;
	} 
}

function getFormContent(theFormName)
//==================================
{
  var getstr = "";
  var theform = document.getElementById(theFormName);
  
  for ( var i=0; i < theform.elements.length ; i++)
  {
    var field = theform.elements[i];
    //alert(field + "," + field.tagName + "," + field.type);
	
    if (field.tagName == "INPUT") 
    {
      if (field.type == "text" || field.type == "hidden"  || field.type == "password") 
      {
           getstr += field.name + "=" + encodeURIComponent(field.value) + "&";
      }
      else if (field.type == "checkbox") 
      {
           if (field.checked) {
              getstr += field.name + "=" + field.value + "&";
           } 
           else {
              getstr += field.name + "=&";
           }
      }
      else if (field.type == "radio") 
      {
        if (field.checked) {
              getstr += field.name + "=" + field.value + "&";
        }
      }
    }   
    else if (field.tagName == "SELECT") 
    {
      getstr += field.name + "=" + field.options[field.selectedIndex].value + "&";
    }  
    else if (field.tagName == "TEXTAREA") 
    {
		  getstr += field.name + "=" + encodeURIComponent(field.value) + "&";
    }  
  }
  return getstr;
}

function setFormContent(theFormName, element)
//===========================================
{
	//=== we begin by clearing it
	clearFormContent(theFormName);
	
  var theform = document.getElementById(theFormName);
  
  for ( var i=0; i < theform.elements.length ; i++)
  {
    var field = theform.elements[i];
    //alert(field + "," + field.tagName + "," + field.type + "," + field.name);
    
    if (field.tagName == "INPUT") 
    {
		  if (field.type == "text" || field.type == "hidden") 
      {
        	if( element.getElementsByTagName(field.name)[0] && element.getElementsByTagName(field.name)[0].firstChild )
        		field.value = element.getElementsByTagName(field.name)[0].firstChild.data;
        	
        	else if( field.type == "text" )	//we decide to clear text fields, hidden fields
        		field.value = "";			//are perhaps not returned
      }
      else if (field.type == "checkbox") 
      {
        /*
           if (field.checked) {
              getstr += field.name + "=" + field.value + "&";
           } 
           else {
              getstr += field.name + "=&";
           }
           */
      }
      else if (field.type == "radio") 
      {
        field.checked = false;
        if( element.getElementsByTagName(field.name)[0] && element.getElementsByTagName(field.name)[0].firstChild ) 
        {
				  var value = element.getElementsByTagName(field.name)[0].firstChild.data;
				  if( value == field.value )
            field.checked = true;
        }
      }
    }   
    else if (field.tagName == "SELECT") 
    {
    	field.selectedIndex = 0;
		  if( element.getElementsByTagName(field.name)[0] && element.getElementsByTagName(field.name)[0].firstChild )
		  {
        var value = element.getElementsByTagName(field.name)[0].firstChild.data;
        var nbSelect = field.options.length;
        for(var j=0; j<field.options.length; j++)
        {
          if( value == field.options[j].value )
          {
            field.selectedIndex = j;
            break;
				  }
        }
		  }
    }  
    else if (field.tagName == "TEXTAREA") 
    {
    	if( element.getElementsByTagName(field.name)[0] )
    	{
    		if( element.getElementsByTagName(field.name)[0].firstChild )	//some time null
				field.value = element.getElementsByTagName(field.name)[0].firstChild.data;
        }
	  }  
  }
  return;
}

function clearFormContent(theFormName)
//====================================
{  
  var theform = document.getElementById(theFormName);
  
  for ( var i=0; i < theform.elements.length ; i++)
  {
	   var field = theform.elements[i];
//alert(field + "," + field.tagName + "," + field.type + "," + field.name);
	
    if (field.tagName == "INPUT") 
    {
      if (field.type == "text") 
      {
        field.value = "";
      }
      else if (field.type == "checkbox") 
      {
        /*
        if (field.checked) {
          getstr += field.name + "=" + field.value + "&";
        } 
        else {
          getstr += field.name + "=&";
        }
        */
        field.checked = false;
      }
      else if (field.type == "radio") 
      {
        field.checked = false;
      }
    }   
    else if (field.tagName == "SELECT") 
    {
    	field.selectedIndex = 0;
    }  
    else if (field.tagName == "TEXTAREA") 
    {
      field.value = "";
    }  
  }
  return;
}

function enableFields(theFormName, arrayFields)
//=============================================
{
	var theform = document.getElementById(theFormName);
	
	for (var i=0; i < theform.elements.length; i++)
	{
		var field = theform.elements[i];
    for(var j=0; j<arrayFields.length; j++)
    {
      if( field.name == arrayFields[j] )
      {
        field.disabled = false;
        break;
      }
    }
  }	
  
  /* This implementation forgets the text fields 
  var theform = document.forms[theFormName];
  for(var j=0; j<arrayFields.length; j++)
  {    
    var coll = theform[ arrayFields[j] ];	
    for (var i=0; i < coll.length ;i++)
      coll[i].disabled = false;
  }
	*/
}

function checkEnter(e, functionToCall, formName)
//==============================================
{ 
  //code from : http://jennifermadden.com/javascript/stringEnterKeyDetector.html
  //e is event object passed from function invocation
  /*
  var characterCode;   //literal character code will be stored in this variable
  if(e && e.which) {    //if which property of event object is supported (NN4)
    e = e;
    characterCode = e.which;    //character code is contained in NN4's which property
  }
  else {
    e = window.event;
    characterCode = e.keyCode; //character code is contained in IE's keyCode property
  }
  
  if(characterCode == 13) {    //if generated character code is equal to ascii 13 (if enter key)
    if( functionToCall )
      functionToCall();
    else
      document.forms[0].submit(); //submit the form
    return false;
  }
  return true;
  */
    if (e == null)
      e = window.event ;
    if (e.keyCode == 13) 
    {
      if( functionToCall )
        functionToCall();
      else
      {
        if( formName )
          document.forms[formName].submit();
        else    //no formName specified, submit the first form
          document.forms[0].submit(); 
      }
    }
}

/*
document.onkeypress = processKey;
function processKey(e)
{
  if (null == e)
    e = window.event ;
  if (e.keyCode == 13)  {
    submitForm();
  }
}
*/

/* to manage key press
function manageKeyPress(theFormName)
//==================================
{
	var theform = document.getElementById(theFormName);	
	for (var i = 0; i < theform.elements.length; i++)
	{
		var field = theform.elements[i];
    // text input
		if (typeof field == "object" && field.nodeName && field.nodeName.toLowerCase() == "input"
          && field.type == "text" )
		{
				//field.onkeypress= function(){ checkEnter(this.event, manageReturn); };
				field.onkeypress= function(){ manageEnter(this.event); };
		}
	}
}
function manageEnter(theEvent)
{
  var e = window.event;
  //alert('dans manageEnter :' + e)
 
  if (e.keyCode == 13) 
  {
  alert('return')
    if( doSubmit('quizExec' , setBackwardToFalse) )
    {
  alert('submit :' + document.getElementById('quizExec').backward.value)
    }
  }
  else
      return false;
}
function manageReturn()
{
  alert('dans manageReturn')
}
*/
