/****************************************************************/
/*				REGULAR EXPRESSION DECLARATIONS					*/
/****************************************************************/

// BOI = Beginning Of Input
// EOI = End Of Input

// BOI, followed by one or more whitespace characters, followed by EOI.
var reWhitespace = /^\s+$/;
// BOI, followed by one lower or uppercase letter, followed by EOI.
var reLetter = /^[a-zA-Z]$/;
// BOI, followed by one or more lower or uppercase letters, followed by EOI.
var reAlphabetic = /^[a-zA-ZÀÄÂâäàÇçÉÈÊËéèêëÏÎïîÖÔöôÜÛÙüûù\s\-]+$/;
// BOI, followed by one or more lower or uppercase letters or digits, followed by EOI.
var reAlphanumeric = /^[a-zA-Z0-9ÀÄÂâäàÇçÉÈÊËéèêëÏÎïîÖÔöôÜÛÙüûù]+$/;
// BOI, followed by one or more lower letters or digits, followed by EOI.
var reAlphanumericLower = /^[a-z0-9]+$/;
// BOI, followed by one or more digits, followed by EOI.
var reNumeric = /^[0-9]+$/;
//1 or more digits in Input
var reChiffre = /[0-9]+/
//Zip FR
var reZipFr = /^[0-9]{5}$/;
// BOI, followed by one digit, followed by EOI.
var reDigit = /^d/;
// BOI, followed by one lower or uppercase letter or digit, followed by EOI.
var reLetterOrDigit = /^([a-zA-Z]|d)$/;
//4 or more following vowels lower or uppercase
var reVowel = /[aeyuioAEYUIO]{4,}/;
//4 or more following consonants lower or uppercase
var reConsonant = /[bcdfghjklmnpqrstvwxzBCDFGHJKLMNPQRSTVWXZ]{4,}/;
//2 or more comma / ;
var reComma = /[\,]{3,}|[\;]{3,}/;




// BOI, followed by one or more characters, followed by @, followed by one or more characters, followed by ., followed by one or more characters, followed by EOI.
var reEmail = /^[_a-zA-Z0-9-\']+(\.[_a-zA-Z0-9-\']+)*@([0-9a-zA-Z](-?[0-9a-zA-Z])*\.)+[a-zA-Z]{2}([zmuvtgZMUVTG]|fo|me|FO|ME)?$/;

//var reEmail = /^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@([0-9a-zA-Z](-?[0-9a-zA-Z])*\.)+[a-zA-Z]{2}([zmuvtgZMUVTG]|fo|me|FO|ME)?$/;

//var reEmail = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/;


// BOI, followed by one of these two patterns:
// (a) one or more digits, followed by ., followed by zero or more digits
// (b) zero or more digits, followed by ., followed by one or more digits
// ... followed by EOI.
var reFloat = /^(([0-9]+(\.[0-9]*)?)|(([0-9]*\.)?[0-9]+))$/;


/****************************************************************/
/*					VARIABLES DECLARATIONS						*/
/****************************************************************/

var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var whitespace = " \t\n\r";

var defaultEmptyOK = false;

/****************************************************************/
/*					FUNCTIONS DECLARATIONS						*/
/****************************************************************/

// s = string
// c = char

//return true si la chaine est vide
function isEmpty(s) {
	return ((s == null) || (s.length == 0));
}

//return true si la chaine est vide ou si elle ne contient que des espaces
function isWhitespace(s) {
	return (isEmpty(s) || reWhitespace.test(s));
}

function isLetter(c){
	return reLetter.test(c);
}

function isDigit(c) {
	return reDigit.test(c);
}

function isLetterOrDigit(c) {
	return reLetterOrDigit.test(c);
}

function isNumeric(s) {
	return reNumeric.test(s);
}

function isAlphabetic(s) {
	return reAlphabetic.test(s);
}

function isAlphanumeric(s) {
	return reAlphanumeric.test(s);
}

function isAlphanumericLower(s) {
	return reAlphanumericLower.test(s);
}

function hastoomuchVowels(s) {
	return reVowel.test(s);
}

function hastoomuchConsonants(s) {
	return reConsonant.test(s);
}

function hastoomuchComma(s, commaType) {
	var i;
	var bag = commaType;
	var returnString = "";
	for (i = 0 ; i < s.length ; i++) {
		var c = s.charAt(i);
		if (c == bag) returnString += c;
	}
	return reComma.test(returnString);
}

function isZipFr(s) {
	return reZipFr.test(s);
}

function isEmail(s) {
	return reEmail.test(s);
}

function isStringInRange(s, min, max) {
	return ((s.length >= min) && (s.length <= max));
}

function isDate(y, m, d) {
	now = new Date();
	t_mois = [['', ''], [31, 'de janvier'], [29, 'de février'], [31, 'de mars'], [30, 'd\'avril'], [31, 'de mai'], [30, 'de juin'], [31, 'de juillet'], [31, 'd\'août'], [30, 'de septembre'], [31, 'd\'octobre'], [30, 'de novembre'], [31, 'de décembre']];
	if (y%4 != 0 || (y%100 == 0 && y%400 != 0)) t_mois[2][0] = 28; /* L'année n'est pas bissextile*/
	if ((d.search(/[^0-9]/g) != -1) || (d < 1)) return false;
	else if ((m.search(/[^0-9]/g) != -1) || m < 1 || m > 12) return false;
	else if ((y.search(/[^0-9]/g) != -1) || (y.length != 4 && y != "")) return false;
	else if (d > t_mois[parseInt(m,10)][0]) return false;
	else return true;
}

function isFloat(s)
{
	return reFloat.test(s);
}

function hasDigit(s)
{
	return reChiffre.test(s);
}

/****************************************************************/
/*				FUNCTIONS FORMS DECLARATIONS					*/
/****************************************************************/

//enleve tous les caracteres de s qui sont dans bag
function stripCharsInBag(s, bag) {
	var i;
	var returnString = "";
	for (i = 0 ; i < s.length ; i++) {
		var c = s.charAt(i);
		if (bag.indexOf(c) == -1) returnString += c;
	}
	return returnString;
}

//enleve tous les caracteres de s qui ne sont pas dans bag
function stripCharsNotInBag(s, bag) {
	var i;
	var returnString = "";
	for (i = 0 ; i < s.length ; i++) {
		var c = s.charAt(i);
		if (bag.indexOf(c) != -1) returnString += c;
	}
	return returnString;
}

// check si un Input text est vide
function checkTextEmpty() {
	var args = checkTextEmpty.arguments;
	for (var i = 0 ; i < args.length ; i++)
		if (isEmpty(args[i].value)) return args[i];
	return -1;
}

// check si un Select est valide, arg[0] = la valeur interdite renvoi -1 si valide
function checkSelectEmpty() {
	var args = checkSelectEmpty.arguments;
	for (var i = 1 ; i < args.length ; i++)
		if (args[i].options[args[i].selectedIndex].value == args[0]) return args[i];
	return -1;
}

// check si un Radio est valide
function checkRadioEmpty() {
	var args = checkRadioEmpty.arguments;
	for (var i = 0 ; i < args.length ; i++) {
		var check = false;
		for (var j = 0 ; j < args[i].length ; j++)
			if (args[i][j].checked) check = true;
		if (check == false) return args[i];
	}
	return -1;
}

// check si un Checkbox est valide
function checkCheckBoxEmpty(obj) {
	if (obj.length>0) {
		for (var i = 0 ; i < obj.length ; i++) {
			if (obj[i].checked) {
				return 1;
			}
		}
	} else {
		if (obj.checked) {
			return 1
		}
	}
	return -1;
}


function getSelect(obj) {
	return obj.options[obj.selectedIndex].value;
}

function getRadio(obj) {
	for (var i = 0 ; i < obj.length ; i++) {
		if (obj[i].checked) return obj[i].value;
	}
}

function getCheckBox(obj, sep) {
	var str = "";
	if (obj.length>0) {
		for (var i = 0 ; i < obj.length ; i++) {
			if (obj[i].checked) str += obj[i].value + sep;
			else str += "-" + sep;
		}
		if (str != "") return str.substring(0, str.length - sep.length);
		else return "";
	}
	else {
		return obj.value;
	}
}

function getSelectMultiple(obj, sep) {
	var str = "";
	for (var i = 0 ; i < obj.length ; i++) {
		if (obj[i].selected) str += obj[i].value + sep;
		else str += "-" + sep;
	}
	if (str != "") return str.substring(0, str.length - sep.length);
	else return "";
}