// Projet : SIGMA
// Module : VALIDATION
// Page   : /include/validate.js
// Objet  : geGenion de la vérification des entrées dans un formulaire HTML
// Entrée :
//	n/a
// Auteur : Christophe PETIT <cpetit@sigma.fr>
//	2000-02-21 CHP : création à partir de bouts trouvés un peu partout...
//	2000-04-07 CHP : ajouté type "Quantity" (0 ou compris entre min et max) pour grimaud-web
//	2000-07-27 CHP : corrigé isDate test NaN sur y, m et d (merci Johann ;-)
//	2001-01-18 DD  : modifié isInteger pour tester sur des nombres négatifs
//	2004-11-02 DD  : correction dans fonction isEmail



function goToCorrectField(thisForm, nomfield) {
	thisForm.elements[nomfield].focus();
	if (thisForm.elements[nomfield].type == "text" || thisForm.elements[nomfield].type == "textarea") {
		if (thisForm.elements[nomfield].value != "")
			thisForm.elements[nomfield].select();
	}
}

// format des dates : dd/mm/yyyy
var dateDelimiter = '/';
var dateYear      = 2;
var dateMonth     = 1;
var dateDay       = 0;
var dateYearMin   = 1900;
var dateYearMax   = 2100;

// découpe la chaîne string en un tableau de n éléments
// équivalent à la fonction Split de VBScript et split de JavaScript 1.1
function splitString(string, delimiter)
{
	var table = new Array();
	var buffer = "";
	var index = 0;
	var i = 0;
	var c = '';
		
	for (i = 0; i < string.length; i++)
	{
		c = string.charAt(i);
		if (c == delimiter)
		{
			table[index] = buffer;
			index++;
			buffer = "";
		}
		else
			buffer += c;
	}
	if (buffer != "")
		table[index] = buffer;
	return table;
}

// renvoie vrai si string est un entier compris entre min et max,
// faux sinon
function isInteger(string, min, max)
{
	// ne prend pas en compte les espaces
	var i = 0;

	//if (string == '') return false;

	for (i = 0; i < string.length; i++)
	{
		var c = string.charAt(i);
		
		if ((string.charAt(0) != '-') || (c != '-')){
			if (c < '0' || c > '9')
				return false;
		}
	}
	
	i = parseInt(string, 10);

	if (i < min)
		return false;
	if (i > max)
		return false;
	return true;
}

// renvoie vrai si string est une date valide dont l'année est comprise entre
// dateYearMin et dateYearMax, faux sinon
function isDate(string) 
{
	if (string == "") return true;

	var table = splitString(string, "/");
	var d = 0, m = 0, y = 0;
	var ndm = new Array(12);
			
	if (table.length != 3)
		return false;
	y = parseInt(table[dateYear ], 10);
	m = parseInt(table[dateMonth], 10);
	d = parseInt(table[dateDay  ], 10);
	if (""+y=="NaN") return false;
	if (""+m=="NaN") return false;
	if (""+d=="NaN") return false;
	if (!isInteger(y, dateYearMin, dateYearMax))
		return false;
	if (!isInteger(m,           1,          12))
		return false;
	ndm[ 1] = 31; ndm[ 2] =  0; ndm[ 3] = 31; ndm[ 4] = 30;
	ndm[ 5] = 31; ndm[ 6] = 30; ndm[ 7] = 31; ndm[ 8] = 31;
	ndm[ 9] = 30; ndm[10] = 31; ndm[11] = 30; ndm[12] = 31;
	if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
		ndm[2] = 29;
	else
		ndm[2] = 28;
	if (!isInteger(d, 1, ndm[m]))
		return false;
	return true;	
}

// renvoie vrai si date1 avant la date du jour
function DateBeforeToday(date1)
{
	var DateToday = new Date();
	var Jour1, Mois1, Annee1;
	var Jour2, Mois2, Annee2;
	
	Jour1 = parseInt(date1.substring(0, 2));
	Mois1 = parseInt(date1.substring(3, 5));
	if (Mois1 == 0)  Mois1 = parseInt(date1.substring(4, 5))
	Annee1 = parseInt(date1.substring(6, 10));
	Jour2 = DateToday.getDate();
	Mois2 = DateToday.getMonth() + 1;
	Annee2 = DateToday.getYear();
	if (Annee2 > 99 && Annee2 < 1000) Annee2 += 1900

	if (Annee1 < Annee2) return true;
	if (Annee1 > Annee2) return false;
	if (Mois1 < Mois2) return true;
	if (Mois1 > Mois2) return false;
	if (Jour1 < Jour2) return true;
	if (Jour1 > Jour2) return false;
	return false;
}
	
// renvoie vrai si string fait de min à max caractères, faux sinon
function isString(string, min, max)
{
	var l = string.length;
	if (l < min || l > max)
		return false;
	return true;
}

// renvoie vrai si tous les caractères de string sont dans alphabet, 
// faux sinon
function isString2(string, alphabet)
{
	var i = 0;
	var c = '';

	for (i = 0; i < string.length; i++)
	{
		c = string.charAt(i);
		if (alphabet.indexOf(c) == -1)
			return false;
	}
	return true;
}

// renvoie vrai si string "ressemble à un e-mail ", faux sinon
function isEmail(string)
{
	if (string == "") return true;
	var alphabet = 
		"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz.-_";

	// chercher @
	var pos1 = string.indexOf('@');
	if (pos1 < 0) return false; // pas de @
	var pos2 = string.lastIndexOf('@');
	if (pos1 != pos2) return false; // plusieurs @
	
	// à gauche, c'est la partie compte
	var account = string.substring(0, pos1-1);
	if (account=="") return false; // il faut un compte
	if (!isString2(account, alphabet)) return false; // caractères invalides ?
	
	// à droite, c'est la partie domaine
	var domain = string.substring(pos2+1, string.length-1);
	if (domain=="") return false; // il faut un domaine
	if (!isString2(domain, alphabet)) return false; // caractères invalides ?
	
	return true;
}

// renvoie vrai si string est une suiet d'e-mails séparés par delimiter
function isEmails(string, delimiter)
{
	if (string == "") return true;
	
	var table = splitString(string, delimiter);
	var i = 0;

	for (i = 0; i < table.length; i++)
		if (!isEmail(table[i]))
			return false;

	return true;
}

// renvoie vrai si le champ est valide, faux sinon
function checkField(type, field, value, min, max, desc)
{
	var flag = true;
	var message = "";

	message = "La rubrique '" + desc + "' ";
	if (type=="String")
	{
		flag = isString(value, min, max);
		message += "doit comprendre de " + min + " à " + max + " caractères.";
	}
	else if (type=="Integer")
	{
		flag = isInteger(value, min, max);
		message += "doit être comprise entre " + min + " et " + max + ".";
	}
	else if (type=="Quantity")
	{
		flag = isInteger(value, 0, max);
		if (flag)
			if (parseInt(value)!=0)
				flag = isInteger(value, min, max);
		message += "doit être nulle ou comprise entre " + min + " et " + max + ".";
	}
	else if (type=="Date")
	{
		flag = isDate(value);
		message += "doit être une date entre " + dateYearMin + " et " + dateYearMax + ".";
	}
	else if (type=="Email")
	{
		flag = isString(value, min, max) && isEmail(value);
		message += "doit être un e-mail.";
	}
	else if (type=="Emails")
	{
		flag = isString(value, min, max) && isEmails(value, ',');
		message += "doit être une suite d'e-mails séparés par des virgules.";
	}
	else	
		return true;
		
	if (!flag)
	{
		alert(message);
		field.focus();
	}
	return flag;
}

