function doSubmit(theFormName, errorDiv, 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)
			row = document.getElementById("tr_" + field.name.substr(0, field.name.length - 2));
		
		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);
    }
    
		//=== check for required field
		if (typeof(field.isnotnull) != "undefined")
		{
			ok = eval(field.isnotnull);
			if (!ok)
			{				
				displayError(labelField + " '" + field.longname + "' " + labelMandatory, errorDiv);
				field.focus();
				break;
			}
		}
		
		//=== check for input validity
		if (typeof(field.isvalid) != "undefined") 
		{
			ok = eval(field.isvalid);
			if (!ok)
			{
				displayError(labelField + " '" + field.longname + "' " + labelInvalid, errorDiv);
				
				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)
			{
				displayError(labelNbAnswers + " '" + field.longname + "' " + labelInvalid, errorDiv);
				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 checkOneChoicePerRow(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] )
          {
            alert('La valeur ' + value + ' est déjà sélectionnée !');
            if( type == 's' )
              field.selectedIndex = 0;
            else
              field.value = '';
            return false;
          }
        }
      }
      data.push(value);
    }
    else
      break;
    i++;
  }
  return true;
}

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 clearRadioValue(formName, radioName)
//===========================================
{
	var radio = document.forms[formName][radioName];
	for (var i=0; i < radio.length ;i++)
		radio[i].checked = false;
	return undefined;
}

function isRadioValueChecked(radio)
//=================================
{
  for (var i=0; i<radio.length ;i++)
  {
    if( radio[i].checked )
      return true;
  }
	return false;
}

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] );
		}
	}
}

/* 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 = document.forms[formName][selectName];
	
	//create <option value="val">message</option>

	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 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 manageAssociatedText( field, index )
//===========================================
{
	var enableText = false;
	if( field.type == "radio" )
	{
		if( index == "0" ) 
			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") 
      {
        var checkedValues = getFirstElementValue(element, field.name);
        if( checkedValues == '' )
          field.checked = false;
        else
          field.checked = true;

        /*
           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 setSelectDate( fullDate, format, formName, selYear, selMonth, selDay )
//=============================================================================
{
  var day, month, year;
  if( format == "yyyy-mm-dd" || format == "yyyy/mm/dd" )
  {
    year  = fullDate.substring(0,4);
    month = fullDate.substring(5,7);
    day   = fullDate.substring(8,10);

    setSelectValue(formName, selYear, year);
    setSelectValue(formName, selMonth, month);
    //setSelectValueById(month);
    setSelectValue(formName, selDay, day);
  }
}

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();
  }
}
*/