/* 
 * Liste des fonctions permettant de formater/remplir ou autre un formulaire
 */

/**
 * Permet de valider les champs obligatoire d'un formulaire
 * @param <string> idForm reçoit l'id du formulaire sans le #
 */
function validerForm (idForm)
{
    J('#'+idForm).validator(
    {
	lang: 'fr',
	errorClass: 'formulaire_erreur_input',
	messageClass: 'formulaire_erreur_message'
    });
}

/**
 * Permet d'afficher un calendrier sur deux champs differents pour selectionner une periode
 * @param <string> from reçoit l'id du champs permettant de selectionner le debut
 * @param <string> to reçoit l'id du champs permettant de selectionner la fin
 */
function afficheCalendrierPeriode(from,to)
{
    var dates = J('#'+from+', #'+to).datepicker(
    {
	defaultDate: "+1d",
	changeMonth: true,
	numberOfMonths: 1,
	onSelect: function(selectedDate)
	{
	    var option = this.id == from ? "minDate" : "maxDate";
	    var instance = J(this).data("datepicker");
	    var date = J.datepicker.parseDate(instance.settings.dateFormat || J.datepicker._defaults.dateFormat, selectedDate, instance.settings);
	    dates.not(this).datepicker("option", option, date);
	},
	onClose: function(dateText, inst)
	{
	    if(dateText != "" && J(this).hasClass("formulaire_erreur_input")) {
		J(this).removeClass("formulaire_erreur_input");
	    }
	}
    });

}

/**
 * Permet d'afficher un calendrier sur l'input cible
 * @param <string> inputCible l'id du champ auquel on veut ajouter le calendrier
 */
function afficheCalendrier(inputCible)
{
    J('#'+inputCible).datepicker(
    {
	defaultDate: "+1d",
	changeMonth: true,
	numberOfMonths: 1,
	onClose: function(dateText, inst)
	{
	    if(dateText != "" && J(this).hasClass("formulaire_erreur_input")) {
		J(this).removeClass("formulaire_erreur_input");
	    }
	}
    });

}

/**
 * Permet d'afficher une liste des villes lorsq'un code postal est saisie
 * @param <string> codePostal id du champ de saisie du code postal
 * @param <string> ville id du champ d'affectation de la ville
 */
function afficheListeVille(codePostal, ville)
{
    function log(message)
    {
	document.getElementById(ville).value = message;
    }

    J("#"+codePostal).autocomplete(
    {
	source: function(request, response)
	{
	    J.ajax(
	    {
		url: "http://ws.geonames.org/searchJSON",
		dataType: "jsonp",
		data: {
		    q:"france",
		    featureClass: "P",
		    style: "full",
		    maxRows: 12,
		    name_startsWith: request.term
		},
		success: function(data)
		{
		    response(J.map(data.geonames, function(item)
		    {
			return {
			    label: item.name,
			    value: document.getElementById(codePostal).value
			}
		    }))
		}
	    })
	},
	minLength: 5,
	select: function(event, ui)

	{
	    log(ui.item ? (ui.item.label) : "");
	}
    });
}

/**
 * Permet de changer la forme des listes deroulante et de filtrer son contenu lors de la saisie
 * @param <string> listeDeroulante id de la liste deroulante du formulaire
 */
function formateListeDeroulante(listeDeroulante, valeurDefaut)
{
    J.widget("ui.combobox",
    { 
	_create: function()
	{
	    var self = this;
	    var select = this.element.hide();
	    var required = ' type="text" id="combobox'+listeDeroulante+'"';
	   
	    if(J('#'+listeDeroulante).attr("required") == "true" || J('#'+listeDeroulante).attr("required") == "required")
	    {
		required += ' required=true ';
	    }
	    if(valeurDefaut != null && valeurDefaut != '') {
		required += ' value="'+valeurDefaut+'" ';
	    }
	    var input = J("<input"+required+">")
	    .insertAfter(select)
	    .autocomplete(
	    {
		source: function(request, response)
		{
		    var matcher = new RegExp(request.term, "i");
		    response(select.children("option").map(function()
		    {
			var text = J(this).text();
			if (this.value && (!request.term || matcher.test(text)))
			    return {
				id: this.value,
				label: text.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + J.ui.autocomplete.escapeRegex(request.term) + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>"),
				value: text
			    };
		    }));
		},
		delay: 0,
		change: function(event, ui)
		{
		    if (!ui.item)
		    {
			// remove invalid value, as it didn't match anything
			J(this).val("");
			return false;
		    }
		    select.val(ui.item.id);
		    self._trigger("selected", event, {
			item: select.find("[value='" + ui.item.id + "']")
		    });
		 
		    if(J("#combobox"+listeDeroulante).hasClass("formulaire_erreur_input")) {
			J("#combobox"+listeDeroulante).removeClass("formulaire_erreur_input");
		    }

		},
		minLength: 2
	    })
	    .click(function()
	    {
		// close if already visible
		if (input.autocomplete("widget").is(":visible"))
		{
		    input.autocomplete("close");
		    return;
		}
		// pass empty string as value to search for, displaying all results
		input.autocomplete("search", "");
		input.focus();
	    });
	}
    });
    J("#"+listeDeroulante).combobox();
}

/**
 * Permet de créer les sliders qui vont donner heures et minutes, et de remplir le champ cible
 * @param <string> inputCible L'id du div dans lequel on souhaite avoir l'heure (l'input doit avoir comme value 00:00 par défaut)
 */
function afficheHeureMinute(inputCible) {

    //Creation et insertion des divs permettant l'ajout des sliders
    J("#"+inputCible).after("<div id=\"slideHeure\" class=\"slider\"></div><div id=\"slideMinute\" class=\"slider\"></div>");

    //Ajout du slider de l'heure ( de 0 a 23 )
    J("#slideHeure").slider({
	range: "min",
	min: 0,
	max: 23,
	step: 1,
	value :J("#"+inputCible).val().substr(0, 2),
	slide: function(event, ui) { //Lors du deplacement, on ecrit dans le champ texte
	    var valeur = ui.value;
	    //Si la valeur est inferieure a 10, on rajoute un 0 devant
	    if(valeur < 10)
	    {
		valeur = '0'+valeur;
	    }
	    //On rajoute les minutes que l'on recupere depuis le champ texte
	    valeur += ':'+J("#"+inputCible).val().substr(-2, 2);
	    //On ecrit
	    J("#"+inputCible).val(valeur);
	}
    });

    //Ajout du slider des minutes ( de 0 a 55, avec un pas de 5)
    J("#slideMinute").slider({
	range: "min",
	min: 0,
	max: 55,
	step: 5,
	value :J("#"+inputCible).val().substr(-2, 2),
	slide: function(event, ui) { //Lors du deplacement, on ecrit dans le champ texte
	    var valeur = ui.value;
	    //Si la valeur est < 10, on rajoute un 0 devant
	    if(valeur < 10)
	    {
		valeur = '0'+valeur;
	    }
	    //On rajoute les heures que l'on recupere depuis le champ texte
	    valeur = J("#"+inputCible).val().substr(0, 2)+':'+valeur;
	    //On ecrit
	    J("#"+inputCible).val(valeur);
	}
    });

    //Si l'utilisateur ecrit dans le champ texte, on replace les sliders
    J("#"+inputCible).keyup(function() {
	J("#slideHeure").slider("value", J("#"+inputCible).val().substr(0, 2));
	J("#slideMinute").slider("value", J("#"+inputCible).val().substr(-2, 2));
    });

}


/**
 * Permet d'executer une requete vers le serveur par le biais d'ajax
 * @param <string> variable liste des variables utile pour la requete
 * de type "variable1=valeur1&variable2=valeur2"
 * @param <string> idChampsDestination indique l'id (separe par des :) des champs qui doivent recevoir les infos de la bdd
 * exemple dans les animations ligne 372 pour la liste ligne 420
 */
function executionRequeteAjax(variable,idChampsDestination)
{
    
    J.ajax(
    {
	type: "POST",
	url: "fonctions/traitementsAjax.php",
	data: variable,
	success: function(data){
	    //je les separe dans un tableau
	    var tabChampsDestination = idChampsDestination.split(":");
	    var tabDonnee = data.split(":");
	    
	    for(var i=0;i < tabChampsDestination.length;i++)
	    {
		J("#"+tabChampsDestination[i]).val(tabDonnee[i]);
		if(J("#"+tabChampsDestination[i]).hasClass("formulaire_erreur_input")) {
		    J("#"+tabChampsDestination[i]).removeClass("formulaire_erreur_input");
		}
	    }
	}
    });
   
 
}

