/*
## ---------------------------------------------------------------------------
## FONCTION  : verifDate utilise estDate
## AUTEUR    : R. Ceriani
## DATE      : 04-04-2000
## ---------------------------------------------------------------------------
## Description       : Vérifie que la valeur d'un champ corresponde à une date.
##                     Les formats acceptés sont jjmmaaaa, jjsmmsaa, jjsmmsaaaa
##                     où s indique un séparateur (presque) quelconque. L'année
##                     de basculement est 90 (89->2089, 90->1990).
## Paramètres entrée : Champ à contrôler
## Paramètres sortie : Vrai si la date est valide ou vide, faux sinon
## ---------------------------------------------------------------------------
*/
function verifDate(champ) {
	var date = champ.value
	var longueur = date.length
	if (longueur == 0) return true
	//Suppression des espaces aux extrémités.
	var pos = longueur - 1
	while (date.charAt(pos) == " ") pos--
	date = date.substring(0, pos + 1)
	pos = 0
	while (date.charAt(pos) == " ") pos++
	date = date.substring(pos)
	longueur = date.length
	if (longueur == 0) return true

	var jour
	var mois
	var an
	var date8valide = false
	//La date peut être entrée sans séparateur sur 8 positions.
	if (longueur == 8) {
		jour = parseInt(date.substring(0, 2), 10)
		mois = parseInt(date.substring(2, 4), 10)
		an = parseInt(date.substring(4), 10)

		//Vérification de la validité de la date.
		if (an > 999 && estDate(jour, mois, an)) date8valide = true
	}

	if (!date8valide) {
		//Récupération des chiffres.
		var c
		var jourStr = ""
		var moisStr = ""
		var anStr = ""
		pos = 0
		var jourCtrl = true
		while (jourCtrl && pos < longueur) {
			c = date.charAt(pos)
			if ("" + parseInt(c, 10) == c) {//Chiffre
				jourStr += c
			}
			else {
				jourCtrl = false
			}
			pos++
		}
		if (pos >= longueur) {
			alert("Date erronée.")
			champ.focus()
			return false
		}
		jour = parseInt(jourStr, 10)
		if (isNaN(jour)) {
			//Le jour ne contient pas de chiffres.
			alert("Date erronée.")
			champ.focus()
			return false
		}
		
		var estMois = false
		while (!estMois && pos < longueur) {
			c = date.charAt(pos)
			if ("" + parseInt(c, 10) == c) {//Chiffre
				estMois = true
			}
			else {
				pos++
			}
		}
		if (pos >= longueur) {
			alert("Date incomplète.")
			champ.focus()
			return false
		}
		
		var moisCtrl = true
		while (moisCtrl && pos < longueur) {
			c = date.charAt(pos)
			if ("" + parseInt(c, 10) == c) {//Chiffre
				moisStr += c
			}
			else {
				moisCtrl = false
			}
			pos++
		}
		if (pos >= longueur) {
			alert("Date incomplète.")
			champ.focus()
			return false
		}
		mois = parseInt(moisStr, 10)
		
		var estAn = false
		while (!estAn && pos < longueur) {
			c = date.charAt(pos)
			if ("" + parseInt(c, 10) == c) {//Chiffre
				estAn = true
			}
			else {
				pos++
			}
		}
		if (pos >= longueur) {
			alert("Date incomplète.")
			champ.focus()
			return false
		}
		
		var anCtrl = true
		while (anCtrl && pos < longueur) {
			c = date.charAt(pos)
			if ("" + parseInt(c, 10) == c) {//Chiffre
				anStr += c
			}
			else {
				anCtrl = false
			}
			pos++
		}
		an = parseInt(anStr, 10)

		if (an >= 0 && an <= 99) {
			if (an >= 90)
				an += 1900
			else
				an += 2000
		}
		else if (an >= 100 && an <= 999 || an > 9999) {
			alert("Date erronée.")
			champ.focus()
			return false
		}

		//Vérification de la validité de la date.
		if (!estDate(jour, mois, an)) {
			alert("Date erronée.")
			champ.focus()
			return false
		}
	}

	jourStr = "" + jour
	if (jourStr.length == 1) jourStr = "0" + jourStr
	moisStr = "" + mois
	if (moisStr.length == 1) moisStr = "0" + moisStr
	date = jourStr + "-" + moisStr + "-" + an
	champ.value = date
	return true		
}

function estDate(jour, mois, annee) {
	if (jour < 1 || jour > 31) return false
	if (mois < 1 || mois > 12) return false
	var jourCtrl = true
	switch (mois) {
	case 2:
		if (jour > 29) {
			jourCtrl = false
		}
		else if (jour == 29) {
			if (annee % 100 == 0 && annee % 400 != 0) {
				jourCtrl = false
			}
			if (annee % 4 != 0) {
				jourCtrl = false
			}
		}
		break
	case 4:
	case 6:
	case 9:
	case 11:
		if (jour > 30) jourCtrl = false
		break
	}
	return jourCtrl
}
