// DI : Début d'input
// FI : Fin d'input
// ----------------------------------------------------------------------------------
var defaultEmptyOK = false
// DI, suivi d'un ou plusieurs espaces, terminé par FI.
var reWhitespace = /^\s+$/
// DI, suivi d'une lettre en majuscule ou minuscule, terminé par FI.
var reLetter = /^[a-zA-Z]$/
// DI, suivi d'une ou plusieurs lettres en majuscule ou minuscule, terminé par FI. 
var reAlphabetic = /^[a-zA-Z]+$/
// DI, suivi d'un ou plusieurs chiffres ou lettres en majuscule ou minuscule, terminé par FI.
var reAlphanumeric = /^[a-zA-Z0-9]+$/
// DI, suivi d'un chiffre, terminé par FI.
var reDigit = /^\d/
// DI, suivi d'un chiffre ou d'une lettre en majuscule ou minuscule, terminé par FI.
var reLetterOrDigit = /^([a-zA-Z]|\d)$/
// DI, suivi d'un ou plusieurs chiffres, terminé par FI.
var reInteger = /^\d+$/
// DI, suivi d'un ou plusieurs caractères suivi par @, suivi d'un ou plusieurs caractères suivi ., suivi d'un ou plusieurs caractères, terminé par FI.
var reEmail = /^.+\@.+\..+$/
// Variables globales
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz"
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
// espaces
var whitespace = " \t\n\r";
// caractères non numérique autorisés dans les numéros de téléphone.
var phoneNumberDelimiters = "()- ";
// jeu de caractères complet pour les numéros de téléphone
// Le caractère + en début de chaà®ne est OK
var validWorldPhoneChars = digits + phoneNumberDelimiters + "+";

// Retourne true si la chaine s est vide
function isEmpty(s) {
	return ((s == null) || (s.length == 0))
}
// Retourne true si le caractère c est une lettre
function isLetter (c) {
	return reLetter.test(c)
}
// Retourne true si le caractère c est un chiffre compris entre 0 et 9
function isDigit (c) {
	return reDigit.test(c)
}
// Retourne true si le caractère c est une lettre ou un chiffre
function isLetterOrDigit (c) {
	return reLetterOrDigit.test(c)
}
// Retourne true si la chaine s est un entier
function isInteger (s) {
	if ( !s || s == "" )
		return false
    return reInteger.test(s)
}
function isEmail (s) {
	if ( isEmpty(s) ) 
		if (isEmail.arguments.length == 1)
			return defaultEmptyOK;
		else
			return (isEmail.arguments[1] == true)
	else {
		return reEmail.test(s)
	}
}
// Retire x caractères contenu dans la chaine bag de la chaine s
function stripCharsInBag (s, bag) {
	var i;
	var returnString = "";
	
	// Search through string's characters one by one.
	// If character is not in bag, append to returnString.
	for (i = 0; i < s.length; i++) {   
		// Check that current character isn't whitespace.
		var c = s.charAt(i);
		if (bag.indexOf(c) == -1)
			returnString += c;
	}
	return returnString;
}
// L'inverse
function stripCharsNotInBag (s, bag) {
	var i;
	var returnString = "";

	// Search through string's characters one by one.
	// If character is in bag, append to returnString.
	for (i = 0; i < s.length; i++) {   
  	// Check that current character isn't whitespace.
  	var c = s.charAt(i);
  	if (bag.indexOf(c) != -1)
  		returnString += c;
  }
  return returnString;
}

// Retire tous les espaces dans une chaine de caractère
function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"")
}

function populateWithNumbers ( orig, delta, range ) {
	var numbers = new Array ()
	var i = 0
	var bsup = range - delta + 1

	if ( isInteger(delta) && delta > 0 ) {
		if ( isInteger ( orig ) && isInteger ( range ) ) {
			numbers[i] = orig
			while ( numbers[i] < bsup ) {
				i++
				numbers[(i)] = numbers[(i-1)] + delta
			}

		}
	}
	
	return numbers
}

function populateSelectWithNumbers ( sId, orig, delta, range, dft ) {
	var numbers = populateWithNumbers ( orig, delta, range )
	var elm = document.getElementById ( sId );
	var opt = ""
	var opt_txt = ""
	
	if ( numbers.length == 0 )
		return false

	if ( ! elm )
		return false;

	elm.innerHTML = ""
		
	for ( var i=0; i < numbers.length; i++ ) {
		opt = document.createElement("option")
		opt_txt = document.createTextNode(numbers[i])
		opt.appendChild(opt_txt)
		opt.setAttribute("value", numbers[i])
		if ( numbers[i] == dft )
			opt.setAttribute("selected", "selected")
		elm.appendChild(opt)
	}
	
	return true
}

function populateSelectWithValues ( sId, data, key, dft ) {
	var elm = document.getElementById (sId)
	var DEFAULT_1ST_SELECT = "auto_1st"
	var opt = ""
	var opt_txt = ""
	var dTable = ""
	var dataOptions = ""

	if ( ! elm )
		return (false)
/*		
	while (elm.firstChild)
		elm.removeChild(elm.firstChild);
*/

	elm.innerHTML = ""
		
	if ( ! key )
		return (false)

	dTable = data[key].split(':')

//	Gestion à  part du premier élément pour pouvoir gérer sa sélection en automatique le cas échéant	
	if ( dTable.length > 0 ) {
		dataOptions = dTable[0].split("#")
		opt = document.createElement("option")
		if ( dataOptions.length == 2 ) {
			opt_txt = document.createTextNode(dataOptions[1])
			opt.appendChild(opt_txt)
			opt.setAttribute("value", dataOptions[0])
			if ( dft == DEFAULT_1ST_SELECT || dataOptions[0] == dft )
				opt.setAttribute("selected", "selected")
		}
		else {
			opt_txt = document.createTextNode(dataOptions[0])
			opt.appendChild(opt_txt)
			opt.setAttribute("value", dataOptions[0])
			if ( dft == DEFAULT_1ST_SELECT || dataOptions[0] == dft )
				opt.setAttribute("selected", "selected")
		}
		elm.appendChild(opt)

		for ( var i=1; i < dTable.length; i++ ) {
			dataOptions = dTable[i].split("#")
			opt = document.createElement("option")
			if ( dataOptions.length == 2 ) {
				opt_txt = document.createTextNode(dataOptions[1])
				opt.appendChild(opt_txt)
				opt.setAttribute("value", dataOptions[0])
				if ( dataOptions[0] == dft )
					opt.setAttribute("selected", "selected")
			}
			else {
				opt_txt = document.createTextNode(dataOptions[0])
				opt.appendChild(opt_txt)
				opt.setAttribute("value", dataOptions[0])
				if ( dataOptions[0] == dft )
					opt.setAttribute("selected", "selected")
			}
			elm.appendChild(opt)
		}
	}

	return (true)
}
// Transforme une chaine avec séparateur en un tableau à  2 dimensions
// cle1#valeur1:cle2#valeur2:...
// => tableau['cle1'] = valeur1; tableau['cle2'] = valeur2 ...
function stringToTable ( s_list, sep1, sep2 ) {
	var retArray = new Array ()
	var tmpArray1 = ""
	var tmpArray2 = ""
	
	tmpArray1 = split ( s_list, sep1 )
	
	for ( var i=0; i < tmpArray1.length; i++ ) {
		tmpArray2 = split ( tmpArray2, sep2 )
		if ( tmpArray2.length == 2 )
			eval ( "retArray['" + tmpArray2[0] + "'] = " + tmpArray2[1] )
	}
}
function new_window ( url , nom , param ) {
	newWindow = open ( url , nom , param )
	newWindow.focus()
}
function mail_page() {
	var mail_url = "mailto:?subject= Sur donatello.fr"
	if ( document.title && document.title != "" && document.title != "undefined" )
		mail_url += " : " + document.title

	mail_url += "&body= Je recommande cette page"

	mail_url += " consultable à  l'adresse : " + location.href
	location.href = mail_url
}
// -----------------------------------------------------------------------------------
// Utilitaires de gestion des dates
function IsLeapYear(Year){
	return ((Year % 4) == 0 && ( ! ((Year % 100) == 0) || ((Year % 400) == 0)))
}
function NbDaysInMonth(Month, Year){
	if (Month < 1 || Month > 12)
		return 0
	if (Month == 4 || Month == 6 || Month == 9 || Month == 11)
		return 30
	else if (Month != 2)
		return 31
	else if (IsLeapYear(Year))
		return 29
	else
		return 28
	return 0
}
function IsValidDate(Day, Month, Year){
	return (Day > 0 && Day <= NbDaysInMonth(Month, Year))
}
function FormateDate(aDate){
	var Day, Month, Year
	var strDate = new String(aDate)

	if (strDate.length == 6){
		Day = strDate.substring(0, 2)
		Month = strDate.substring(2, 4)
		Year = strDate.substring(4, 6)
	}
	else if (strDate.length == 8){
		Day = strDate.substring(0, 2)
		Month = strDate.substring(3, 5)
		Year = strDate.substring(6, 8)
	}
	else if (strDate.length == 10){
		Day = strDate.substring(0, 2)
		Month = strDate.substring(3, 5)
		Year = strDate.substring(6, 10)
	}
	else
		return ""

	if (Year <= 99)
		if (Year > 40)
			Year = "19" + Year
		else
			Year = "20" + Year
		
	if (IsValidDate(Day, Month, Year))
		return Day + "/" + Month + "/" + Year
	else
		return ""
}

function testDate(objID){
	var obj = document.getElementById (objID)
	var dt = ""
	
	if ( (obj == "undefined") || (obj.value == "") )
		return true
	
	dt = FormateDate(obj.value)
	if (dt != "") {
		obj.value = dt
		return true
	}

	alert("La date est invalide !\n\nSaisissez une date au format JJ/MM/AAAA, par exemple 25/04/2007.")
	return false
}

function testCheckPromo(dateId, checkPromoId){
	var objDate = document.getElementById (dateId)
	var objPromo = document.getElementById (checkPromoId)
	
	if ( (objPromo == "undefined") || (objPromo==null) ){
		return true
	}
	else if( (!objPromo.checked) ) {
		return true
	}
	else {
		if ( (objDate == "undefined") || (objDate.value == "") ){
			alert("Vous devez saisir une date de depart valide")
			return false
		}
	}
	return true
}

// Prototype de Date

/*
Tableau contenant les noms des jours de la semaine
*/
Date.DAY_NAMES = ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"];

/*
Retourne le nom du jour de la semaine, comme par exemple "vendredi".

@return String Le nom du jour de la semaine de cet objet Date.
*/
Date.prototype.getDayName = function () { return Date.DAY_NAMES[this.getDay()]; }

function putDay ( dt, cid ) {
	
	var elm = document.getElementById (cid)
	
	if ( elm == "undefined" || elm == null )
		return false
		
	
	var Day = dt.substring(0, 2)
	var Month = dt.substring(3, 5)
	var Year = dt.substring(6, 10)
	
	var myDate = new Date ( Year, Month, Day )
	
	var myDay = myDate.getDayName()
	
	elm.innerHTML = myDay
}

function extractComparableDate ( dt ) {
	var Day = dt.substring(2, 4)
	var Month = dt.substring(5, 7)
	var Year = dt.substring(8, 12)
	
	return ( Year+Month+Day )
}

function populate_days_and_nights ( id_date, id_nuit, tab_date, tab_nuit, idx_ville, dft_date, dft_nuit ) {
	var dataOptions = ""
	var cmp_dft_date = ""
	var cmp_date = ""
	var nearest_date = ""
	var first_date = ""
	var dTable = ""
	var msg = ""

	document.getElementById('divAlerte').innerHTML = ""
	
	// Si la date par défaut existe mais ne contient pas de durée connue on complète sa longueur pour le traitement
	if ( dft_date.length == 11 )
		dft_date = "?" + dft_date
	
	cmp_dft_date = extractComparableDate (dft_date)
	dTable = tab_date[idx_ville].split(':')

//	On mémorise la première valeur => au cas ou l'utilisateur choisi une date de départ antérieure à  la date du jour
	dataOptions = dTable[0].split("#")
	first_date = dataOptions[0]
	if ( dft_date != "" && dft_date != "null" ) {
// 		Important : les dates du select sont placées dans l'ordre croissant	
		for ( var i=0; i < dTable.length; i++ ) {
			dataOptions = dTable[i].split("#")
		
			cmp_date = extractComparableDate ( dataOptions[0] )
//			alert ( cmp_date + " | " + cmp_dft_date )
			if ( cmp_date <= cmp_dft_date )
				nearest_date = dataOptions[0]
			else
				break
		}
		
//		Si la date la plus proche n'a pas été trouvée, on utilise la première
		if ( nearest_date != "" ) {
			populateSelectWithValues ( id_date, tab_date, idx_ville, nearest_date )
			populateSelectWithValues ( id_nuit, tab_nuit, nearest_date, dft_nuit )
			if ( extractComparableDate (dft_date) != extractComparableDate (nearest_date) ) {
				msg += "<p class='texte' style='color: #ff0000'>La date de départ a été modifiée pour se rapprocher le plus possible de votre choix !</p>"
				document.getElementById('divAlerte').innerHTML = msg
			}
			return true
		}
		
	}
	
	populateSelectWithValues ( id_date, tab_date, idx_ville, first_date)
	populateSelectWithValues ( id_nuit, tab_nuit, first_date, dft_nuit)
		
	return true
}
function populateCustomSelectWithValues ( selectObject, data, key, dft ) {
	var DEFAULT_1ST_SELECT = "auto_1st"
	var dTable = ""
	var dataOptions = ""
	var selectValue = ""

	if ( typeof (selectObject) == "undefined" )
		return (false)
		
	if ( ! key )
		return (false)

	dTable = data[key].split(':')

//	Gestion à  part du premier élément pour pouvoir gérer sa sélection en automatique le cas échéant	
	if ( dTable.length > 0 ) {
		dataOptions = dTable[0].split("#")
		if ( dataOptions.length == 2 ) {
			if ( dataOptions[0] != 0 )
				selectValue = dataOptions[1]
			else
				selectValue = "<strong>"+dataOptions[1]+"</strong>"
			selectObject.addOption ( dataOptions[0], selectValue )
			if ( dft == DEFAULT_1ST_SELECT || dataOptions[0] == dft )
				selectObject.setDefaultValue(dataOptions[0])
		}
		else {
			if ( dataOptions[0] != 0 )
				selectValue = dataOptions[0]
			else
				selectValue = "<strong>"+dataOptions[0]+"</strong>"
			selectObject.addOption ( dataOptions[0], selectValue )
			if ( dft == DEFAULT_1ST_SELECT || dataOptions[0] == dft )
				selectObject.setDefaultValue(dataOptions[0])
		}

		for ( var i=1; i < dTable.length; i++ ) {
			dataOptions = dTable[i].split("#")
			if ( dataOptions.length == 2 ) {
				if ( dataOptions[0] != 0 )
					selectValue = dataOptions[1]
				else
					selectValue = "<strong>"+dataOptions[1]+"</strong>"
				selectObject.addOption ( dataOptions[0], selectValue )
				if ( dataOptions[0] == dft )
					selectObject.setDefaultValue(dataOptions[0])
			}
			else {
				if ( dataOptions[0] != 0 )
					selectValue = dataOptions[0]
				else
					selectValue = "<strong>"+dataOptions[0]+"</strong>"
				selectObject.addOption ( dataOptions[0], selectValue )
				if ( dataOptions[0] == dft )
					selectObject.setDefaultValue(dataOptions[0])
			}
		}
	}
	selectObject.draw()
	return (true)
}