/*	--------------------
	Interaction avec la page
	2009-07-10,	Marc Brillault
	--------------------	*/

//	Durée du voyage par défaut
var jours_retour = 15;

tab_mois	=	new Array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');
tab_jours	=	new Array('dim', 'lun', 'mar', 'mer', 'jeu', 'ven', 'sam');

function is_date_ok(string) {
	//	Dans le principe :
	//	JavaScript corrige automatiquement une date qu'il considère fausse (un 30 février, par exemple, ou un 29 février d'une année non bissextile)
	//	Selon le navigateur, il peut ajouter ou retirer des jours, pour aboutir DANS TOUS LES CAS à une date valide
	//	Que la date ainsi créée soit plus petite ou plus grande que la date d'origine importe peu
	//	Il suffit juste de tester si la date est différente (auquel cas la date entrée n'est pas valide), ou si elle est identique (auquel cas la date était valide)
	//	D'après un principe énoncé par David Vincent sur Webmaster-Hub : http://www.webmaster-hub.com/publication/Javascript-Verifiez-la-validite-d.html

	//	On ne prend que les dates au format aaaa-mm-jj
	reg = /[0-9]{4}-[0-9]{2}-[0-9]{2}/;
	if(!reg.test(string))
		return false;
	//	Le test est ok, on crée une nouvelle date avec les valeurs textuelles de l'ancienne
	tab		=	string.split('-');
	date	=	new Date(tab[0], tab[1]-1, tab[2]);
	annee	=	date.getFullYear();
	mois	=	date.getMonth()+1;
	jour	=	date.getDate();
	
	if(annee < 1900)
		annee = annee+1900;
	if(mois < 10)
		mois = '0'+mois;
	if(jour < 10)
		jour = '0'+jour;
		
	new_date = annee+'-'+mois+'-'+jour;
	if(new_date == string)
		return true;
	return false;
}

function texte_date(texte) {
	//	Le texte doit être au format français : 17 juillet 2009
	tab_texte = texte.split(' ');
	jour		=	tab_texte[0];
	nom_mois	=	tab_texte[1];
	annee		=	tab_texte[2];
	
	if(jour < 10)
		jour = '0'+parseInt(jour, 10);	//	Un string commençant par 0 est considéré par défaut comme un octal; on précise donc qu'il s'agit d'un décimal.
	if(annee < 1900)
		annee = 1900+annee;
		
	
	//	On parcourt le tab_mois pour trouver le numéro du mois
	numero_mois = null;
	for(num_mois in tab_mois) {
		if(tab_mois[num_mois].toLowerCase() == nom_mois.toLowerCase()) {
			numero_mois = parseInt(num_mois)+1;
			break;
		}
	}
	
	if(numero_mois) {
		if(numero_mois < 10)
			numero_mois = '0'+numero_mois;
		return annee+'-'+numero_mois+'-'+jour;
	}
	return false;
}

function date_plus(date, nb_jours, format) {
	//	Retourne une date (objet Date ou string, en fonction du paramètre format), en y ajoutant un nombre de jours précis
	if(date == null)
		date = new Date();
	else {
		tab_date = date.split('-');
		date = new Date(tab_date[0], tab_date[1]-1, tab_date[2]);
	}
	annee	=	date.getFullYear();
	mois	=	date.getMonth();
	if(date == null)
		mois++;
	jour	=	date.getDate();
	
	if(annee < 1900)
		annee =+ 1900;
		
	date = new Date(annee, mois, jour+nb_jours);

	switch(format) {
		case 'date':
			return date;
			break;
		case 'string':
			annee	=	date.getFullYear();
			mois	=	date.getMonth()+1;
			jour	=	date.getDate();
			
			if(annee < 1900)
				annee =+ 1900;
			if(mois < 10)
				mois = '0'+mois;
			if(jour < 10)
				jour = '0'+jour;
			return annee+'-'+mois+'-'+jour;
			break;
	}
}

function remplir_mois(id, date_precise) {
	if(date_precise != null) {
		annee_precise	=	date_precise.substr(0, 4);
		mois_precis		=	date_precise.substr(5, 2);
		jour_precis		=	date_precise.substr(8,2);
	}
	else
		annee_precise = mois_precis = jour_precis = null;
	
	//	On remplit les formulaires avec les mois sur un an
	var now = new Date();
	month	=	now.getMonth();
	year	=	now.getFullYear();
	if(year < 1900)
		year = year+1900;
	for(i = 0; i < 12; i++) {
		date		=	new Date(year, month+i, 1);
		mois		=	date.getMonth();
		annee		=	date.getFullYear();
		if(annee < 1900)
			annee = annee+1900;
		nom_mois	=	tab_mois[mois];
		mois++;
		if(mois < 10)
			mois = '0'+mois;
		selected = (String(annee)+String(mois) == String(annee_precise)+String(mois_precis)) ? ' selected="selected"' : null;
		$('#'+id).append('<option value="'+annee+mois+'"'+selected+'>'+nom_mois+' '+annee+'</option>');
	}
	maj_jours(id, jour_precis);
}

function maj_jours(id_mois, nb_jour) {
	if($('#'+id_mois).length) {
		//	On récupère le mois et l'année
		date = $('#'+id_mois).val();
		annee = date.substr(0, 4);
		mois = date.substr(4, 2);
		num_mois = mois-1;
		
		id		=	id_mois.substr(0, 4)+'Day';
		name	=	id_mois.substr(2, 2)+'Day';

		//	Si le select jour équivalent existe, on garde sa valeur
		if($('#'+id).length)
			jour = $('#'+id).val();
		
		$('#'+id).remove();
		$('#'+id_mois).before('<select id="'+id+'" name="'+name+'"></select>');
		
		//	On remplit les jours
		now = new Date();
		for(i = 1; i <= 31; i++) {
			date		=	new Date(annee, num_mois, i, 23, 59, 59);	//	On retarde l'heure, sinon on la date "du jour" sera forcément inférieure au moment de la journée
			jour		=	date.getDate();
			num_jour	=	(jour < 10) ? '0'+jour : jour;
			nom_jour	=	tab_jours[date.getDay()];
			if(date >= now && date.getMonth() == num_mois) {
				selected = (jour == nb_jour) ? ' selected="selected"' : '';
				if(jour == 1)
					jour += 'er';
				$('#'+id).append('<option value="'+num_jour+'"'+selected+'>'+nom_jour+' '+jour+'</option>');
			}
		}
	}
}

function form_td() {
	//	On lance le comportement sur le td
	$('td.top').click(function() {
		//	On cherche l'index du td cliqué. Si l'index est pair, on ne fait rien. S'il est impair (ie si on a cliqué sur le td "prix"), on récupère l'index précédent
		index = $('#new_promo td').index(this);
		index = index-(index % 2);
		
		//	On recherche le texte du lien, et on en sépare les deux parties
		texte	=	$('#new_promo td:eq('+index+')').find('a').text();
		tab		=	texte.split(' - ');
		if(typeof(tab[1]) == 'undefined') {
			//	Si on n'a qu'une ville de précisée, on met automatiquement "Paris" comme ville de départ
			depart	=	'Paris';
			arrivee	=	tab[0];
		
		}
		else {
			depart	=	tab[0];
			arrivee	=	tab[1];
		}
		
		//	On recherche le code compagnie dans le formulaire de droite, ainsi que le type de cabine
		code	=	$('input[name=INCL_AIRLINE_1]').val();
		cabine	=	$('input[name=CABIN]').val();
		
		//	Si le formulaire flottant existe déjà, on le supprime
		$('#form_flottant').remove();
		
		//	On crée le formulaire flottant
		$('body').append('<form id="form_flottant" method="post" action="http://vols.opodo.fr/apps/jsp/planItGoMP/AirAvailabilityServlet"></form>');
		//	Ajout du bouton "fermer"
		$('#form_flottant').append('<img id="F_CLOSE" src="http://vol.opodo.fr/squelettes/bouton_fermer.gif">');
		if(code)
			$('#form_flottant').append('<input type="hidden" name="INCL_AIRLINE_1" value="'+code+'">');
		$('#form_flottant').append('<input type="hidden" name="E_LOCATION_IN" id="E_LOCATION_IN" value="'+arrivee+'">');
		$('#form_flottant').append('<input type="hidden" name="B_LOCATION_IN" id="B_LOCATION_IN" value="'+depart+'">');
		$('#form_flottant').append('<input type="hidden" name="CABIN" value="'+cabine+'">');
		$('#form_flottant').append('<label for="F_D_Month">Départ :</label>');
		$('#form_flottant').append('<select name="D_Month" id="F_D_Month"></select>');
		$('#form_flottant').append('<label for="F_R_Month">Retour :</label>');
		$('#form_flottant').append('<select name="R_Month" id="F_R_Month"></select>');
		$('#form_flottant').append('<fieldset><label for="F_NB_ADULTS">Adultes :</label><select name="NB_ADULTS" id="F_NB_ADULTS"></select></fieldset>');
		$('#form_flottant').append('<fieldset><label for="F_NB_CHILDREN">Enfants :</label><select name="NB_CHILDREN" id="F_NB_CHILDREN"></select></fieldset>');
		$('#form_flottant').append('<fieldset><label for="F_NB_INFANTS">Bébés :</label><select name="NB_INFANTS" id="F_NB_INFANTS"></select></fieldset>');
		$('#form_flottant').append('<label for="F_MINUS_PLUS_DATE"><input type="checkbox" id="F_MINUS_PLUS_DATE" name="MINUS_PLUS_DATE" value="OK" style="float: left; margin-right: 10px;"><span style="font-weight: normal;">Dates de voyages flexibles (+/- 1 jour)</span></label>');
		$('#form_flottant').append('<input type="image" class="button" src="http://www.opodo.fr/img_opodo/homepages/buttonSearch_vol.gif">');
		
		//	On détecte les dates (td sous le td cliqué)
		//	On cherche l'index du td
		index_td	=	parseInt(index)+6-(2 + ((index % 6)/2));
		//	Si le contenu de ce td est vide, c'est qu'on est sur une ligne incomplète. L'index est alors forcément index+3.
		if($('#new_promo td:eq('+index_td+')').html() == '')
			index_td	=	index+3;
		//	Pour que ça fonctionne, il faut que la classe du td ciblé soit (entre autres éventuellement) promo_date
		texte	=	$('#new_promo td:eq('+index_td+').promo_date').html();
		
		if(texte) {
		texte			=	texte.replace(/&nbsp;/g, ' ');
		var tab_texte	=	texte.split(' - ');
		
		date_depart	=	texte_date(tab_texte[0]);
		date_retour	=	texte_date(tab_texte[1]);
		
		}
		if(texte && is_date_ok(date_depart) && is_date_ok(date_retour)) {
			remplir_mois('F_D_Month', date_depart);
			remplir_mois('F_R_Month', date_retour);
		}
		else {
			//	On remplit les select de mois avec les valeurs par défaut
			remplir_mois('F_D_Month', date_plus(null, 1, 'string'));				//	On choisit le lendemain, sans quoi le moteur bugge (pas de résa pour le jour même)
			remplir_mois('F_R_Month', date_plus(null, jours_retour+1, 'string'));	//	On choisit la date + 7jours
		}
		
		//	On remplit les select nombres
		for(i = 0; i <= 9; i++) {
			if(i > 0)
				$('#F_NB_ADULTS').append('<option value="'+i+'">'+i+'</option>');
			if(i < 9)
				$('#F_NB_CHILDREN').append('<option value="'+i+'">'+i+'</option>');
			if(i < 2)
				$('#F_NB_INFANTS').append('<option value="'+i+'">'+i+'</option>');
		}
		
		//	En modifiant le nombre d'adultes, on modifie le nombre de bébés également, tout en conservant la valeur initiale
		$('#F_NB_ADULTS').change(function() {
			nb_bebes	=	$('#F_NB_INFANTS').val();
			nb_adultes	=	$('#F_NB_ADULTS').val();
			$('#F_NB_INFANTS').empty();
			for(i = 0; i <= nb_adultes; i++) {
				selected = (i == nb_bebes) ? ' selected="selected"' : null;
				$('#F_NB_INFANTS').append('<option value="'+i+'"'+selected+'>'+i+'</option>');
			}
			
		});

		
		//	On calcule la position du td
		position	=	$('#new_promo td:eq('+index+')').position();
		ftop		=	position.top;
		fleft		=	position.left;
		
		//	On positionne le formulaire
		css_form	=	{
			position:	'absolute',
			top:		ftop+20+'px',
			left:		fleft+10+'px'
		};
		$('#form_flottant').css(css_form);
		
		tab_select = new Array('F_D_Month', 'F_R_Month');
		for(id in tab_select) {
			$('#'+tab_select[id]).change(function() {
				//	On récupère la valeur du jour correspondant au mois, pour l'adapter au mois sélectionné
				id		=	$(this).attr('id');
				id_jour	=	id.substr(0, 4)+'Day';
				jour	=	$('#'+id_jour).val();
				maj_jours(id, jour);
			});
		}
		
		$('#F_D_Month').change(function() {
			//	On compare les valeurs des deux select
			//	Si le premier est plus grand que le second, on modifie le second : 
			//	Si le jour du second est supérieur ou égal au jour du premier, on ne modifie que le mois
			//	Sinon, le second est égal au premier + 7 jours
			moisan_depart	=	$('#F_D_Month').val();
			annee_depart	=	moisan_depart.substr(0, 4);
			mois_depart		=	moisan_depart.substr(4, 2);
			jour_depart		=	$('#F_D_Day').val();
			moisan_retour	=	$('#F_R_Month').val();
			jour_retour		=	$('#F_R_Day').val();
			
			if(moisan_depart > moisan_retour) {
				if(jour_depart < jour_retour)
					date_modif	=	date_plus(annee_depart+'-'+mois_depart+'-'+jour_retour, 0, 'string');
				else
					date_modif	=	date_plus(annee_depart+'-'+mois_depart+'-'+jour_depart, jours_retour, 'string');
				remplir_mois('F_R_Month', date_modif);
			}
		});
		
		$('#F_CLOSE').click(function() {
			$('#form_flottant').remove();
		});
		//	Comportement suivant désactivé : on ne supprime le formulaire que lors du clic sur le bouton de fermeture (ou l'affichage d'un nouveau formulaire)
		/*
		$('#form_flottant').hover(function() {}, function(e) {
			//	On calcule la position du formulaire, ainsi que sa largeur, puis on les compare à la position de la souris
			pos = $(this).position();
			width = $(this).width();
			left = pos.left;
			top = pos.top;
			mousex = e.pageX;
			mousey = e.pageY;
			//	Si on sort par la gauche, le haut ou la droite, on ferme le formulaire
			if(mousey < top || mousex < left || mousex > left+width)
				$(this).remove();
		});
		*/
		
		//	Envoi du formulaire
		$('#form_flottant').submit(function() {
			//	On envoie les dates dans un champ unique
			$('#form_flottant').append('<input type="hidden" id="F_D_Date" name="D_DATE" value="'+$('#F_D_Month').val()+$('#F_D_Day').val()+'">');
			$('#form_flottant').append('<input type="hidden" id="F_R_Date" name="R_DATE" value="'+$('#F_R_Month').val()+$('#F_R_Day').val()+'">');
			
			nb_adultes	=	$('#F_NB_ADULTS').val();
			nb_enfants	=	$('#F_NB_CHILDREN').val();
			nb_bebes	=	$('#F_NB_INFANTS').val();
			
			//	On crée autant de champs TRAVELLER_TYPE que nécessaire
			for(i = 1; i <= nb_adultes; i++)
				$('#form_flottant').append('<input type="hidden" name="TRAVELLER_TYPE_'+i+'" value="ADT">');
			for(j = i+1; j <= eval(i+'+'+nb_enfants); j++)
				$('#form_flottant').append('<input type="hidden" name="TRAVELLER_TYPE_'+j+'" value="CHD">');
			
			//	On crée autant de champs HAS_INFANT que nécessaire
			for(k = 1; k <= nb_bebes; k++)
				$('#form_flottant').append('<input type="hidden" name="HAS_INFANT_'+k+'" value="true">');
			return true;
		});
		
		return false;
	});
}

$(document).ready(function() {
	form_td();
});