var defaultEmptyOk=true;


function makeArray(n) {
   for (var i = 1; i <= n; i++) {
      this[i] = 0
   } 
   return this
}


var daysInMonth = makeArray(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;   // must programmatically check this
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;


function isName(Chaine) {
	var ExprReg = /^[éèàùâêûîôäëüïö\sa-zA-Z\'-]+$/;
	if (isEmpty(Chaine)) 
		return (defaultEmptyOk);
	if (Chaine.match(ExprReg)==null)
		return (false);
	return (true);
}

// Retourne true, si la chaine est alpha-numérique
function isAlphaNum(Chaine) {
	//var ExprReg = /^[éèàùâêûîôäëüïö,;:.!?%()"&\sa-zA-Z0-9\'-]+$/;
	if (isEmpty(Chaine)) 
		return (defaultEmptyOk);
	//if (Chaine.match(ExprReg)==null)
	//	return (false);
	return (true);
}

// Retourne true, si la chaine ne contient que des chiffres
function isNum(Chaine) {
	var ExprReg = /^[0-9]+$/;
	if (isEmpty(Chaine)) 
		return (defaultEmptyOk);
	if (Chaine.match(ExprReg)==null)
		return (false);
	return (true);
}

// retourne true, si la valeur est une adresse electronique valide
function isEmail(Email) {
	var ExprReg = /^[\w\._\-]+\x40[\w\._\-]+\.[0-9a-zA-Z]+$/;
	if (isEmpty(Email)) 
		return (defaultEmptyOk);
	if (Email.match(ExprReg)==null)
		return (false);
	return (true);
}

// Renvoi true, si la chaine est vide ou constituée d'espaces.
function isEmpty(Chaine) {
	var ExprRegNull = /^[\s]*$/;
	//	if (!Chaine) return false;
	if (Chaine.toString().length==0) return true;
	if (Chaine.toString().match(ExprRegNull)!=null)
		return (true);
}



function isTelephone(Chaine) {
	var exprReg = /(01)|(02)|(03)|(04)|(05)|(06)|(08)/;
	var pays='france';

	if (isEmpty(Chaine)) return (defaultEmptyOk);

	if (isTelephone.arguments.length > 1)	 {	pays=isTelephone.arguments[1].toString().toLowerCase();}

	switch (pays)
	{	case 'monaco':	return (isMonacoTelephone(Chaine));break;
		case 'andorre':	return (isAndorreTelephone(Chaine));break;
		default: 		return (isFrenchTelephone(Chaine));break;	}	
}

function isFrenchTelephone(Chaine) {
	var exprReg = /(01)|(02)|(03)|(04)|(05)|(06)|(08)/;
	if (Chaine.length != 10) return false;
	else if (Chaine.substring(0,2).match(exprReg) == null) return false;
	else if (!isNum(Chaine)) return false;	
	return (true);
}

function isMonacoTelephone(Chaine) {
	if (Chaine.length != 8) return false;
	else if (!isNum(Chaine)) return false;	
	return (true);
}

function isAndorreTelephone(Chaine) {
	if (Chaine.length != 6) return false;
	else if (!isNum(Chaine)) return false;	
	return (true);
}


// Retourne vrai, si la chaine est une année valide
function isAnnee(Chaine)
{	
	if (isEmpty(Chaine))
		return defaultEmptyOk;
	if (Chaine.length==4)
		return (isNum(Chaine));
	return false;	}

// Retourne vrai, si la chaine est un code postal
function isCodePostal(Chaine)
{
	if (isEmpty(Chaine))
		return defaultEmptyOk;
	if (Chaine.length==5)
		return (isNum(Chaine));
	return false;	}

// Retourne vrai, si la chaine est unnombre d'enfants valide <100
function isNbEnfants(Chaine)
{
	if (isEmpty(Chaine))
		return defaultEmptyOk;
	if (Chaine.length==2)
		return (isNum(Chaine));
	return false;	}


function isMonth (s)
{
   if (isEmpty(s)) 
       if (isMonth.arguments.length == 1) return defaultEmptyOk;
       else return (isMonth.arguments[1] == true);
    return isIntegerInRange (s, 1, 12);
}


function isDigit (c)
{   return ((c >= "0") && (c <= "9"))
}

function isInteger (s)
{   var i;
    if (isEmpty(s)) 
       if (isInteger.arguments.length == 1) return defaultEmptyOk;
       else return (isInteger.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (!isDigit(c)) return false;
    }
    return true;
}

function isIntegerInRange (s, a, b)
{   if (isEmpty(s)) 
       if (isIntegerInRange.arguments.length == 1) return defaultEmptyOk;
       else return (isIntegerInRange.arguments[1] == true);
    if (!isInteger(s, false)) return false;
    var num = parseInt (s);

    return ((num >= a) && (num <= b));
}

function isDay (s)
{   if (isEmpty(s)) 
       if (isDay.arguments.length == 1) return defaultEmptyOk;
       else return (isDay.arguments[1] == true);   
    return isIntegerInRange (s, 1, 31);
}

function isYear (s)
{   if (isEmpty(s)) 
       if (isYear.arguments.length == 1) return defaultEmptyOK;
       else return (isYear.arguments[1] == true);
    if (!isInteger(s)) return false;
    return ((s.length == 2) || (s.length == 4));
}

function daysInFebruary (year)
{    return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 ); }

function isDateMEC(s)
{
	if (isEmpty(s)) return defaultEmptyOk;
	var sDay,sYear,sMonth;
	var sPos1,sPos2;
	var crtDate,inputDate,limitDate;
	
	sPos1=s.indexOf('/');
	if (sPos1==-1) return false;
	sPos2=s.indexOf('/',sPos1+1);
	if (sPos2==-1) return false;
	
	sDay=s.substring(0,sPos1);
	sMonth=s.substring(sPos1+1,sPos2);
	sYear=s.substring(sPos2+1);

	if (sDay.substring(0,1)=='0') sDay=sDay.substring(1);
	if (sMonth.substring(0,1)=='0') sMonth=sMonth.substring(1);

	if (sYear.length==1) sYear='200' + sYear;
	if (sYear.length==2) 
	{	if (sYear<'50') sYear='20' + sYear;
		else sYear='19' + sYear; }
	if (!isDate2(sYear,sMonth,sDay)) {return false};
		return true;


}

function isDate2 (year, month, day)
{   // catch invalid years (not 2- or 4-digit) and invalid months and days.
    if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;
    var intYear = parseInt(year);
    var intMonth = parseInt(month);
    var intDay = parseInt(day);
    if (intDay > daysInMonth[intMonth]) return false; 
    if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;
    return true;
}


function isNumChassis(num,marque)
{
	var ExprReg = /^$/;
	if (isEmpty(num))
		return defaultEmptyOk;
	switch (marque.toString())
	{
		case '1':
			// ExprReg= /^WVWZZZ[A-Za-z0-9]{11}$/;break;

			ExprReg= /^WVWZZZ[A-Za-z0-9]{11}|(WVGZZZ[A-Za-z0-9]{11})$/;break;

		case '2':
			ExprReg= /^(WAUZZZ[A-Za-z0-9]{11})|(TRUZZZ[A-Za-z0-9]{11})$/;break;
		case '3':
			ExprReg= /^(WV1ZZZ[A-Za-z0-9]{11})|(WV2ZZZ[A-Za-z0-9]{11})$/;break;
		case '4':
			ExprReg= /^VSSZZZ[A-Za-z0-9]{11}$/;break;
		case '5':
			ExprReg= /^TMB[A-Za-z0-9]{14}$/;break;
	}
	if (num.toUpperCase().match(ExprReg)==null)
		return (false);
	return (true);
}


function isImmatriculation(num,pays)
{
	//var ExprReg = /^$/;

	if (isEmpty(num))
		return defaultEmptyOk;

	//30/03/2010 : suppression des controles sur l'immatriculation
	//switch (pays.toLowerCase())
	//{
	//	case 'france':
	//		ExprReg= /^([0-9]([0-9]?){2}((\s)?)[A-Za-z]{3})|([0-9]([0-9]?){3}((\s)?)[A-Za-z]{2})((\s)?)([0-9]{2}|(2A)|(2B))$/;break;
	//	case 'monaco':
	//		ExprReg= /^([A-Za-z][0-9]{3})|([0-9]{4})$/;break;
	//	case 'andorre':
	//		ExprReg= /^([A-Za-z][0-9]{4})|([0-9]{5})$/;break;
	//}
	//if (num.toUpperCase().match(ExprReg)==null)
	//	return (false);
	return (true);
}


function checkNumber(champ)
{
	var valid = "1234567890";
	var ok = "yes";
	var temp;
	// on vérifie chaque caractère saisi.
	for (var i=0; i<champ.value.length; i++) 
	{	temp = "" + champ.value.substring(i, i+1);
		// on test si le caractère saisi est un chiffre
		if (valid.indexOf(temp) == -1) 
			ok = "no";
		//si le caractère saisi est erroné alors on
		//affiche à nouveau la valeur temporaire.
		if (ok == "no")
			champ.value = champ.value.substring(0, i);
	} 
}

function checkDate(champ)
{
	var valid = "/1234567890";
	var ok = "yes";
	var temp;
	// on vérifie chaque caractère saisi.
	for (var i=0; i<champ.value.length; i++) 
	{	temp = "" + champ.value.substring(i, i+1);
		// on test si le caractère saisi est un chiffre
		if (valid.indexOf(temp) == -1) 
			ok = "no";
		//si le caractère saisi est erroné alors on
		//affiche à nouveau la valeur temporaire.
		if (ok == "no")
			champ.value = champ.value.substring(0, i);
	} 
}


function checkFieldValue(field,oblig,fieldName,fieldType,param)
{
	var error=false;

	if ((isEmpty(field.value)) && oblig==true)
		{ alert('Veuillez saisir ' + fieldName + '. La saisie est obligatoire.'); field.focus(); return false;}

	//alert(field.value);
	switch (fieldType.toUpperCase())
	{
	case 'EMAIL': 
		if (!isEmail(field.value)) error=true; break;
	case 'NAME': 
		if (!isName(field.value)) error=true; break;
	case 'ALPHA': 
		if (!isAlphaNum(field.value)) error=true; break;
	case 'NUMBER': 
		if (!isNum(field.value)) error=true; break;
	case 'PHONE': 
		if (!isTelephone(field.value,param)) error=true; break;
	case 'ZIPCODE':
		if (!isCodePostal(field.value)) error=true; break;
	case 'DATEMEC':
		if (!isDateMEC(field.value)) error=true; break;
	case 'FREETEXT': 
		if (!isAlphaNum(field.value)) error=true; break;
	case 'CHASSIS':
		if (!isNumChassis(field.value,param)) error=true; break;
	case 'IMMATRICULATION':
		if (!isImmatriculation(field.value,param)) error=true; break;
	default: break;
	}

	if (error)
	{
		alert('La saisie de ' + fieldName + ' est incorrecte.');
		field.focus();
		return (false);
	}
	else
		return (true);
}
