//set globals variable to earn some µs, especially on IE
var i = 0;
var name = '';
var form = null;
var IEFlag = document.all ? true : false;

function nl2br( str )
{
  while( str.indexOf('\n') != -1 )
  {
    str = str.replace(/\n+/ , '<br />')
  }
  return str;
}
function trim( str )
{
  str = new String( str );
  return str.replace(/(^\s*)|(\s*$)/, '');
}

function checkEmail( str )
{
  str = new String( str );
  return new RegExp( '^([a-zA-Z0-9][a-zA-Z0-9_.-]*|"([^\\\\\x80-\xff\015\012"]|\\\\[^\x80-\xff])+")\@([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}$' ).test(str);
}

function checkInteger( str )
{
  str = new String( str );
  return  str.search(/[^0-9]/) == -1 ;
}

function fieldReplace( valueToReplace, nameOfReplace )
{
  i = 0;
  while( document.forms[i] )
  {
    if( document.forms[i].elements[nameOfReplace] )
    {
      var inputToReplace = document.forms[i].elements[nameOfReplace];
      if( valueToReplace && ! inputToReplace.value )
      {
        inputToReplace.value = valueToReplace;
      }
      break;
    }
  }
}

function checking( form, toCheck )
{
  i = 0;
  name = '';
  var err = '';

  for( i = 0; i < form.elements.length; i++ )
  {
    form.elements[i].value = trim(form.elements[i].value);
  }

  if( mails[toCheck] )
  {
    for( i = 0; i < mails[toCheck].length; i++ )
    {
      name = mails[toCheck][i];
      if( ! checkEmail(form.elements[name].value) )
      {
        form.elements[name].className = 'error';
        err += name + ';';
      }
      else
      {
        form.elements[name].className = '';
        if( document.getElementById( name + '-result' ) )
        {
          document.getElementById( name + '-result' ).getElementsByTagName('span')[0].innerHTML = nl2br( form.elements[name].value );
        }
      }
    }
  }

  if( integers[toCheck] )
  {
    for( i = 0; i < integers[toCheck].length; i++ )
    {
      name = integers[toCheck][i];
      if( ! checkInteger(form.elements[name].value) )
      {
        form.elements[name].value = '';
        form.elements[name].className = 'error';
        err += name + ';';
      }
      else
      {
        form.elements[name].className = '';
        if( document.getElementById( name + '-result' ) )
        {
          document.getElementById( name + '-result' ).getElementsByTagName('span')[0].innerHTML = nl2br( form.elements[name].value );
        }
      }
    }
  }

  if( notNull[toCheck] )
  {
    for( i = 0; i < notNull[toCheck].length; i++ )
    {
      name = notNull[toCheck][i];
      if( ! form.elements[name].value )
      {
        form.elements[name].value = '';
        form.elements[name].className = 'error';
        err += name + ';';
      }
      else
      {
        form.elements[name].className = '';
        if( document.getElementById( name + '-result' ) )
        {
          document.getElementById( name + '-result' ).getElementsByTagName('span')[0].innerHTML = nl2br( form.elements[name].value );
        }
      }
    }
  }
  

/*  if( radioInput[toCheck] )
  {
    var j = 0;
    var ch = 0;
    var radioCheck = false;
    var radioValue = '';

    for( i = 0; i < radioInput[toCheck].length; i++ )
    {
      name = radioInput[toCheck][i];
      alert(name);
      for( ch = 0; ch < form.elements[name].length; ch++ )
      {
        if( form.elements[name][ch].checked );
        {
          radioValue = form.elements[name][ch].value;
          break;
        }
      }
      alert(ch);

      if( ch >= form.elements[name].length )
      {
        for( j = 0; j < form.elements[name].length; j++ )
        {
          form.elements[name][j].className = 'error';
        }
        err += name + ';';
      }
      else
      {
        for( j = 0; j < form.elements[name].length; j++ )
        {
          form.elements[name][j].className = '';
        }
        if( document.getElementById( name + '-result' ) )
        {
          if( specialRadioValue && specialRadioValue[toCheck] && specialRadioValue[toCheck][radioValue] )
          {
            document.getElementById( name + '-result' ).getElementsByTagName('span')[0].innerHTML = specialRadioValue[toCheck][radioValue];
          }
          else
          {
            document.getElementById( name + '-result' ).getElementsByTagName('span')[0].innerHTML = radioValue;
          }
        }
      }
    }
  }
*/

  if( checkBoxInput[toCheck] )
  {
    var ch = 0;
    var checkBoxCheck = false;
    var checkBoxValue = new Array();

    for( i = 0; i < checkBoxInput[toCheck].length; i++ )
    {
      name = checkBoxInput[toCheck][i];

      j = 0;
      while( form.elements[name][j] )
      {
        if( form.elements[name][j].checked )
        {
          checkBoxValue[ch] = form.elements[name][j].value;
          ch++;
        }
        j++;
      }

      if( ch == 0 )
      {
        j = 0;
        while( form.elements[name][j] )
        {
          form.elements[name][j].className = 'error';
          j++;
        }
        err += name + ';';
      }
      else
      {
        j = 0;
        while( form.elements[name][j] )
        {
          form.elements[name][j].className = '';
          j++;
        }
        if( document.getElementById( name + '-result' ) )
        {
          var result = '';
          for( j = 0; j <= ch ; j++ )
          {
            if( specialCheckBoxValue && specialCheckBoxValue[toCheck] && specialCheckBoxValue[toCheck][checkBoxValue[j]] )
            {
              result += specialCheckBoxValue[toCheck][checkBoxValue[j]] + ', ';
            }
            else
            {
              result += checkBoxValue[j] + ', ';
            }
          }
          document.getElementById( name + '-result' ).getElementsByTagName('span')[0].innerHTML = nl2br( result.replace( /, $/ , '') );
        }
      }
    }
  }


  if( maxLength[toCheck] )
  {
    for( i in maxLength[toCheck] )
    {
      if( ( ! form.elements[i].value ) || form.elements[i].value.length > maxLength[toCheck][i] )
      {
        form.elements[i].className = 'error';
        err += i + ';';
      }
      else
      {
        form.elements[i].className = '';
        if( document.getElementById( i + '-result' ) )
        {
          document.getElementById( i + '-result' ).getElementsByTagName('span')[0].innerHTML = nl2br( form.elements[i].value );
        }
      }
    }
  }
  
  if( minLength[toCheck] )
  {
    for( i in minLength[toCheck] )
    {
      if( ( ! form.elements[i].value ) || form.elements[i].value.length < minLength[toCheck][i] )
      {
        form.elements[i].className = 'error';
        err += i + ';';
      }
      else
      {
        form.elements[i].className = '';
        if( document.getElementById( i + '-result' ) )
        {
          document.getElementById( i + '-result' ).getElementsByTagName('span')[0].innerHTML = nl2br( form.elements[i].value );
        }
      }
    }
  }

  if( fieldToReplace[toCheck] )
  {
    for( i in fieldToReplace[toCheck] )
    {
      fieldReplace( form.elements[i].value, fieldToReplace[toCheck][i] );
    }
  }
  
  if( sameValue[toCheck] )
  {
    for( i in sameValue[toCheck] )
    {
      if( form.elements[i] && form.elements[sameValue[toCheck][i]] )
      {
      	if( form.elements[i].value != form.elements[sameValue[toCheck][i]].value ) 
      	{
          form.elements[i].value = '';
          form.elements[sameValue[toCheck][i]].value = '';
          form.elements[i].className = 'error';
          form.elements[sameValue[toCheck][i]].className = 'error';
          err += i + ';';
      	}
      	else
    		{
	        form.elements[i].className = '';
          form.elements[sameValue[toCheck][i]].className = '';
	        if( document.getElementById( i + '-result' ) )
	        {
	          document.getElementById( i + '-result' ).getElementsByTagName('span')[0].innerHTML = nl2br( form.elements[i].value );
	        }
    		}
      }
    }
  }

  if( others[toCheck] )
  {
    for( i = 0; i < others[toCheck].length; i++ )
    {
      name = others[toCheck][i];
      err = err.replace( new RegExp( name + ';' ), '' );
      if( document.getElementById( name + '-result' ) )
      {
        if( ! form.elements[name].value )
        {
          document.getElementById( name + '-result' ).style.display = 'none';
        }
        else
        {
          document.getElementById( name + '-result' ).style.display = 'block';
          if( document.getElementById( name + '-result' ) )
          {
            document.getElementById( name + '-result' ).getElementsByTagName('span')[0].innerHTML = nl2br( form.elements[name].value );
          }
        }
      }
    }
  }

  return err;
}

/**
 * Set globals hashtables for checking
 * FIELDS MUST NOT HAVE A CLASS ATTRIBUTE
 *  settings :
 *  - hashtable of arrays:
 *  variable = {
 *    'typeOfChecking1' : [ 'fieldName11' , 'fieldName12' ... ],
 *    'typeOfChecking2' : [ 'fieldName21' , 'fieldName22' ... ]    
 *             };
 *  - hashtable of hashtables:
 *  variable = {
 *    'typeOfChecking1' : { 'fieldName11' : value11 , 'fieldName12' : value12 ... },
 *    'typeOfChecking2' : { 'fieldName21' : value21 , 'fieldName22' : value22 ... }
 *             };
 *
 * IMPORTANT NOTE: DON'T FORGET TO NOT HAVE A COMA AT THE END OF EACH OBJECT
 */

//hashtable of arrays
var notNull        = {
  'contact'  : [ 'name' , 'content' ] 
                     };

//hashtable of arrays
var radioInput     = {
                     };

//hashtable of arrays
var checkBoxInput  = {
                     };

//hashtable of arrays
var integers       = {
                     };

//hashtable of arrays
var mails          = {
	'contact'   : [ 'e_mail' ]
                     };

//hashtable of hashtables
var sameValue = {
	              };
//hashtable of hashtables
var fieldToReplace = {
	                   };

//hashtable of hashtables
//useless for inputs (set maxlength attributes)
//usefull for textarea
var maxLength      = {
                     };
                     
//hashtable of hashtables
var minLength      = {
                     };

//hashtable of arrays
var others         = {
	'contact'   : [ 'adress', 'cp', 'town', 'tel' ]
                     };

function checkContact()
{
	form = document.forms['contact'];
	
	var err = checking( form, 'contact' );
	
	return ( err == '' );
}

