/**
 * Fichier javascript pour le fonctionnement du panier.
 * Le code ci-dessous fait en sorte d'ajouter les demandes dans le panier en respectant les contraintes suivantes:
 * 		- Au plus 3 demandes par résidence
 *		- Au plus 3 résidences différentes.
 * Le code fait intervenir les cookies pour enregistrer les informations d'une session à une autre;
 * un plugin cookie à base de jquery est utilisé.
 * Auteur: Issam BOUZIANE (ibouziane@sqli.com).
 *	
 */

/**
 * Cookie plugin
 *
 * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};

/**
 * Retourne la valeur d'un paramètre d'une url
 * 
 * @param string param
 * nom du paramètre dont on souhaite avoir la valeur
 * @param url
 * url dans laquel on souhaite récupérer le paramètre ou rien si l'on souhaite travailler sur l'url courante
 * @return String
 * @author Labsmedia
 * @see http://www.labsmedia.com
 * @licence GPL
 */
function getParamValue(param,url)
{
	var u = url == undefined ? document.location.href : url;
	var reg = new RegExp('(\\?|&|^)'+param+'=(.*?)(&|$)');
	matches = u.match(reg);
	return matches[2] != undefined ? decodeURIComponent(matches[2]).replace(/\+/g,' ') : '';
}

/***********************************************************************************************
 ****************** Thumbhover plugin **********************************************************
 *******************Changements par Issam BOUZIANE**********************************************
 * L'idée est d'utiliser ce plugin qui permet, au survol d'une image, d'afficher une autre image
 * en popin. j'ai ajouté un span sur l'image, (modifications dans le code du plugin, pour afficher 
 * sur la position souhaitée, en fonction du dep.
 */
(function($) {
	$.fn.thumbPopup = function(options)
	{
		//Combine the passed in options with the default settings
		settings = jQuery.extend({
			popupId: "DPE_popup",
			popupCSS: {'position': 'relative', 'border': '1px solid #000000', 'background': '#FFFFFF'},
			imgSmallFlag: "_t",
			imgLargeFlag: "_l",
			cursorTopOffset: 15,
			cursorLeftOffset: 15,
			loadingHtml: "<span style='padding: 5px;'>Loading</span>"
		}, options);
		
		//Create our popup element
		popup =
		$("<div />")
		.css(settings.popupCSS)
		.attr("id", settings.popupId)
		.css("position", "absolute")
		.appendTo("body").hide();

		//Attach hover events that manage the popup
		$(this)
		.hover(setPopup)
		.mousemove(updatePopupPosition)
		.mouseout(hidePopup);
		
		function setPopup(event)
		{
			var fullImgURL = $(this).attr("src").replace(settings.imgSmallFlag, settings.imgLargeFlag);
			// récupération de la valeur du dep (cachée).
			var dep_valeur = $(this).closest('.meub').siblings('.pan_dep_ce_valeur').html();
			var dep_bilan = $(this).closest('.meub').siblings('.pan_dep_ce_bilan').html();
			
			if (getParamValue('L',document.location.href)!='1'){
			// s'il s'agit de la version anglaise du site.
				// on définit la hauteur du texte sur l'image qui représente la valeur dep_bilan
				var top = (dep_bilan=='A')?40:
							(dep_bilan=='B')?59:
								(dep_bilan=='C')?80:
									(dep_bilan=='D')?99:
										(dep_bilan=='E')?120:
											(dep_bilan=='F')?141:160;
			}
			else{
				// on définit la hauteur du texte sur l'image qui représente la valeur dep_bilan
				var top = (dep_bilan=='A')?40:
							(dep_bilan=='B')?58:
								(dep_bilan=='C')?77:
									(dep_bilan=='D')?96:
										(dep_bilan=='E')?113:
											(dep_bilan=='F')?132:150;

			}
			
			$(this).data("hovered", true);
			
			//Load full image in popup
			$('<img />')
			.bind("load", {thumbImage: this}, function(event)
			{
				//Only display the larger image if the thumbnail is still being hovered
				if ($(event.data.thumbImage).data("hovered") == true) {
					$(popup).empty().append(this);
					// on ajoute le span contenant la valeur du dep, placé sur l'image au bon endroit
					$(popup).append('<span style="color:white;position:absolute;top:'+top+'px;left:146px;">'+dep_valeur+'</span>');
					updatePopupPosition(event);
					$(popup).show();
				}
				$(event.data.thumbImage).data("cached", true);
			})
			.attr("src", fullImgURL);
			
			//If no image has been loaded yet then place a loading message
			if ($(this).data("cached") != true) {
				$(popup).append($(settings.loadingHtml));
				$(popup).show();
			}

			updatePopupPosition(event);			
		}
		
		function updatePopupPosition(event)
		{
			var windowSize = getWindowSize();
			var popupSize = getPopupSize();
			if (windowSize.width + windowSize.scrollLeft < event.pageX + popupSize.width + settings.cursorLeftOffset){
				$(popup).css("left", event.pageX - popupSize.width - settings.cursorLeftOffset);
			} else {
				$(popup).css("left", event.pageX + settings.cursorLeftOffset);
			}
			if (windowSize.height + windowSize.scrollTop < event.pageY + popupSize.height + settings.cursorTopOffset){
				$(popup).css("top", event.pageY - popupSize.height - settings.cursorTopOffset);
			} else {
				$(popup).css("top", event.pageY + settings.cursorTopOffset);
			}
		}
		
		function hidePopup(event)
		{
			$(this).data("hovered", false);
			$(popup).empty().hide();
		}
		
		function getWindowSize() {
			return {
				scrollLeft: $(window).scrollLeft(),
				scrollTop: $(window).scrollTop(),
				width: $(window).width(),
				height: $(window).height()
			};
		}
		
		function getPopupSize() {
			return {
				width: $(popup).width(),
				height: $(popup).height()
			};
		}

		//Return original selection for chaining
		return this;
	};
})(jQuery);


/************************************************************
 ************************ FUNCTIONS *************************
 ***********************************************************/

/**
 * Retourne le cookie correspondant à une residence et une demande en paramètre.
 * il existe 9 cookie pour gérer le fait qu'il y ait au plus 3 demandes par résidence, et au plus 3 résidences différentes;
 */
function getDemande(residence, demande){
	return  (residence == 1 && demande ==1)?$.cookie('campusea_pan_res1_dem1'):
			(residence == 1 && demande ==2)?$.cookie('campusea_pan_res1_dem2'):
			(residence == 1 && demande ==3)?$.cookie('campusea_pan_res1_dem3'):
			(residence == 2 && demande ==1)?$.cookie('campusea_pan_res2_dem1'):
			(residence == 2 && demande ==2)?$.cookie('campusea_pan_res2_dem2'):
			(residence == 2 && demande ==3)?$.cookie('campusea_pan_res2_dem3'):
			(residence == 3 && demande ==1)?$.cookie('campusea_pan_res3_dem1'):
			(residence == 3 && demande ==2)?$.cookie('campusea_pan_res3_dem2'):
			(residence == 3 && demande ==3)?$.cookie('campusea_pan_res3_dem3'):
			null;
}

/**
 * Supprime un cookie en fonction de la résidence et de la demande.
 *
 */
function deleteDemande(residence, demande){
	$.cookie('campusea_pan_res'+residence+'_dem'+demande, null, {path: '/'});
}

/**
 * Affecte une valeur au cookie en fonction de la résidence et de la demande.
 *
 */
function setDemande(residence, demande, value){
	$.cookie('campusea_pan_res'+residence+'_dem'+demande, value, {path: '/'});
}

/**
 * Retourne l'eicode à partir du cookie donné en paramètre.
 *
 */
function getEiCode(cookie){
	if(cookie!=null){
		var tab;
		tab = cookie.split('|');
		return tab[1];
	} 
	else
	{
		return -1;
	}
}

/**
 * Retourne l'eicode de la résidence, en fonction du numéro de résidence dans les noms de cookies.
 *
 */
function getResidence(residenceNum){
	var tempCookie;
	for(i=1; i<=3;i++){
		tempCookie = $.cookie('campusea_pan_res'+residenceNum+'_dem'+i);
		if(tempCookie != null){
			return getEiCode(tempCookie);
		}
	}
	return false;
}

/**
 * Permet de construire le string contenant les informations à propos d'une demande.
 *
 */
function setDemandeString(uid, eicode, residence, type, surface, loyer){
	return uid+'|'+eicode+'|'+residence+'|'+type+'|'+surface+'|'+loyer;
}

/**
 * Retourne l'uid à partir du cookie donné en paramètre.
 *
 */
function getUid(cookie){
	if(cookie!=null){
		var tab;
		tab = cookie.split('|');
		return tab[0];
	}
	else
	{
		return -1;
	}
}


/**
 * Permet de savoir si une demande existe déjà dans le panier à partir de son uid.
 *
 */
function demandeExiste(uid){
	for(i=1;i<=3;i++){
		for(j=1;j<=3;j++){
			if(getUid(getDemande(i,j))==uid){
				return true;
			}
		}
	}
	return false;
}

/**
 * Permet de savoir si une residence d'une demande existe déjà dans le panier à partir de son uid.
 *
 */
function residenceExiste(eicode){
	for(i=1;i<=3;i++){
		for(j=1;j<=3;j++){
			if(getEiCode(getDemande(i,j))==eicode){
				return true;
			}
		}
	}
	return false;
}

/**
 * Avoir le numéro de résidence associé à un eicode.
 * à partir des noms des cookies: 1 2 ou 3
 */
function getNumResidence(eicode){
	for(i=1;i<=3;i++){
		for(j=1;j<=3;j++){
			if(getEiCode(getDemande(i,j))==eicode){
				return i;
			}
		}
	}
}

/**
 * permet de savoir si le nombre de 3 demandes est atteint pour une résidence.
 *
 */
function residenceFull(numResidence){
	var nombre =0;
	for(i=1;i<=3;i++){
		if(getDemande(numResidence, i)!=null){
			nombre++;
		}
	}
	return nombre==3;
}

/**
 * Renvoie un numéro de résidence qui ne contient aucun élément.
 */
function getFreeResidence(){
	var temp;
	for(i=1;i<=3;i++){
		temp = 0;
		for(j=1;j<=3;j++){
			if(getDemande(i,j)!=null){
				temp++;
			}
		}
		if(temp==0) return i;
	}
	return -1;
}

/**
 * Insert une demande dans un cookie, tout en testant si les cookies ne sont pas pleins.
 */
function insertDemande(numResidence, demandeValue){
// si le nombre des demandes est inférieur à 3.
	if(!residenceFull(numResidence)){
		for(i=1;i<=3;i++){
			if(getDemande(numResidence, i)==null){
				setDemande(numResidence, i, demandeValue);
				return true;
			}
		}
	}
	return false;
}

/**
 * Insert le contenu dans la table. (panier).
 */
function insertContentTable(uid, eicode, residence, type, surface, loyer){
	$('#panier tbody').append(' \
	<tr> \
		<td class="uid_panier" style="display:none;">'+uid+'</td> \
		<td style="display:none;">'+eicode+'</td> \
		<td>'+residence+'</td> \
		<td>'+type+'</td> \
		<td>'+surface+'</td> \
		<td>'+loyer+'&euro;</td> \
		<td id="pan_supprimer"><a href="javascript:;">close</a></td> \
	</tr>');
}

/**
 * Affichage du panier vide et plein.
 *
 */
function affichagePanier(){
	// on récupère le nombre de balises <tr> dans le tableau du panier.
	var taille = $("#panier_plein #panier tr").size();
	
	// s'il existe un seul <tr> (celui des titres) on affiche l'image.
	if(taille==1)
	{
		$('#panier_vide').show();
		$('#panier_plein').hide();
	}
	// sinon, si le panier est plein
	else
	{
		$('#panier_vide').hide();
		$('#panier_plein').show();
	}
}

/**
 * Extraction du nom court de la résidence à partir d'un nom de la forme:
 * 33 - PESSAC - Résidence Université
 */
function extraireNomCourt(chaine){
	var tab;
	tab = chaine.split('-'); // on découpe suivant les '-'
	tab = tab[2].split(' '); // on découpe encore suivant les espaces
	return tab[2].substr(0,10); // on retourn les 10 premiers caractères.
}

/**
 * Permet d'envoyer des données en paramètres sous forme de requête et 
 * d'ouvrir un autre onglet.
 * cette fonction crée un formulaire au niveau du dom, intègre le valeurs qu'on veut envoyer
 * en utilisant un tableau associatif au niveau du paramètre params.
 */
function post_to_url(path, params, method) {
    method = method || "post"; // Set method to post by default, if not specified.
	// création d'un nouveau élément form.
    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);
	form.setAttribute("target", "_blank");
	
	// ajout des paramètres comme étant des input de type hidden
    for(var key in params) {
        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("type", "hidden");
        hiddenField.setAttribute("name", key);
        hiddenField.setAttribute("value", params[key]);

        form.appendChild(hiddenField);
    }
    document.body.appendChild(form);
    form.submit(); // enfin, envoyer le formulaire.
}

/**
 * permet d'ajouter le reste des zéros à une chaine se composant de 6 caractères.
 * si la chaine est par exemple '1' elle retourne '000001'
 */
function addZeros(param){
	var tailleChaine = 6;
	var result = ''; // résultat à envoyer
	var reste = tailleChaine - param.length; // le reste pour arriver à 6 caractères.
	var i=0;
	for(i=0;i<reste;i++){
		result+="0";
	}
	result+=param;
	return result; // résultat de la fonction.
}
/**
 * Permet de transformer le tableau des IDs entré en paramètre en un string 
 * conforme à celui demandé par Ebail.
 */
function tranformParams(tab){
	var resultat = ''; // résultat à afficher
	var tailleMax = 9;
	var j=0;
	for(j=0;j<tailleMax;j++){
		if(tab[j] == undefined)
		{
			resultat+="000000";
		}
		else
		{
			
			resultat+=addZeros(tab[j]);
		}
	}
	return resultat;
}
/**
 * Permet de récupérer la valeur d'un paramètre depuis l'adresse de la page en fonction de son nom.
 */
function getParameterFromUrl( name )
{
	name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
	var regexS = "[\\?&]"+name+"=([^&#]*)";
	var regex = new RegExp( regexS );
	var results = regex.exec( window.location.href );
	if( results == null )
		return "";
	else
		return results[1];
}
/**
 * Permet d'alterner les couleurs des lignes du tableau.
 */
function colorierTableau(){
	// alternation de couleurs des tr du tableau du panier.
	$('#panier tr td').each(function(){$(this).css("background-color", "#F7F8F9")});
	$('#panier tr:odd td').each(function(){$(this).css("background-color", "#E4E2FA")});
}


/************************************************************
 *********************** PAGE EVENTS ************************
 ***********************************************************/
$(document).ready(function() {
	// afficher panier vide ou plein.
	affichagePanier();
	
	/**
	 * Remplir le panier avec les valeurs contenus dans les cookies, s'ils existent.
	 */
	var cookiesTab; // tableau contenant les cookies.
	for(i=0;i<=3;i++){
		for(j=0;j<=3;j++){
			if($.cookie('campusea_pan_res'+i+'_dem'+j)){
				cookiesTab = $.cookie('campusea_pan_res'+i+'_dem'+j).split('|');
				insertContentTable(cookiesTab[0], cookiesTab[1], cookiesTab[2], cookiesTab[3], cookiesTab[4], cookiesTab[5]);
				// afficher panier vide ou plein.
				affichagePanier();
			}
		}
	}
	
	/**
	 * Au click du bouton supprimer.
	 */
	$('#pan_supprimer a').live('click', function() {
		// sélection du td père.
		var pere = $(this).closest('#pan_supprimer');
		var uid = pere.siblings('.uid_panier').html();
		
		for(i=0;i<=3;i++){
			for(j=0;j<=3;j++){
				if(getUid(getDemande(i,j))==uid){
					deleteDemande(i,j);
				}
			}
		}
		
		(pere.closest('tr')).remove();
		
		affichagePanier(); // afficher panier vide si panier vidé.
		colorierTableau(); // colorier les lignes du tableau
	});

	/**
	 * Au click du bouton ajouter.
	 */
	$('td.pan_ajouter span a').click(function() {
		// sélection du td père.
		var pere = $(this).closest('.pan_ajouter');
		
		// sélection des valeurs qu'on va ajouter dans le panier.
		var residence = pere.siblings('.pan_nomResidence').html();
		residence = extraireNomCourt(residence);
		var type = pere.siblings('.pan_type').html();
		var surface = pere.siblings('.pan_surface').html();
		surface = surface.substr(0,surface.length-2); // enlever m²
		var loyer = pere.siblings('.pan_loyer').html();
		loyer = loyer.substr(0,loyer.length-2); // enlever euros
		loyer = loyer.split('.')[0];
		var uid = pere.siblings('.pan_uid').html();
		var eicode = pere.siblings('.pan_eicode').html();
		
		// on teste si la demande n'existe pas déjà dans le panier.
		if(!demandeExiste(uid)){
			// on teste si la résidence de la demande est déjà utilisée.
			if(residenceExiste(eicode)){
				var num = getNumResidence(eicode);
				var state = insertDemande(num, setDemandeString(uid, eicode, residence, type, surface, loyer));
				// si insertion réussie.
				if(state){
					// on insère le contenu dans le panier.
					insertContentTable(uid, eicode, residence, type, surface, loyer);
				}
			}
			// si la résidence n'existe pas.
			else
			{
				var res = getFreeResidence();
				var state = insertDemande(res, setDemandeString(uid, eicode, residence, type, surface, loyer));
				// si insertion réussie.
				if(state && res!=-1){
					// on insère le contenu dans le panier.
					insertContentTable(uid, eicode, residence, type, surface, loyer);
				}
			}

		}
		
		// afficher le panier plein.
		affichagePanier();
		// colorier les lignes du tableau
		colorierTableau();
	});
	
	/**
	 * Affichage de la popin au survol de l'image du DEP.
	 * les flags des petites images est small et celui des grandes est big.
	 * le plugin remplace le flag des petites images par le grand au survol;
	 */
	$("td.meub img").thumbPopup({
	  imgSmallFlag: "small",
	  imgLargeFlag: "big"
	});
	
	/**
	 * Survol du picto du panier dans l'accueil.
	 * afficher et faire disparaître le panier en popin.
	 */
	$("#picto-panier").hover(
		function(){
			$("#panier-accueil").show();
		}	
	,
		function(){
			$("#panier-accueil").hide();
		}	
	);
	
	/**
	 * Clique sur le bouton "créez votre candidature e-bail".
	 * on change d'url et on passe les paramètres.
	 */
	$("#btn_ebail").click(
		function ()
		{
			// on récupère les valeurs des ids des logements dans le panier.
			var ids = new Array();
			
			$("#panier_plein #panier td.uid_panier").each(
				function () {
					ids.push($(this).html());
				}
			);
			var panierEtudiant = tranformParams(ids); // transformation des paramètre en une chaine contenant des zéros
			
			// gestion de la langue
			var langue = getParameterFromUrl('L'); // récupération du paramètre
			var langueEbail = (langue == 0 || langue == '')?'FR':'EN'; // conversion
			
			// envoie de la requête.
			post_to_url(
				"https://ebail.gecina.fr/ivy/pro/GecinaExt/fonc_comm_ivy/130AC22A56074382/creationDossierCandidature.ivp", 
				{'panierEtudiant':panierEtudiant, 'L':langueEbail},  
				"POST"
			);
		}
	);
	// couleurs des lignes du tableau
	colorierTableau();

});

