/* Pour faire l'habillage par défaut. */
$(document).ready(function () { 
	habillerContenu();
});

/* Habille la page pour le theme */
function habillerContenu() {
	colorierBouton(); 
	colorierTableau();
    colorierBoite();
}

/* Les DIV.boite deviennent des boites */
function colorierBoite() {
	$(".boite").addClass("ui-widget-content");
	$(".boite h2").addClass("ui-widget-header");
}

/* Appelle les 2 prochaine fonctions lorsque la page sera chargée. */
function colorierTableau() { 
	alternerLignePairesImpaires();
	surlignerLigneSurvolee();
}

/* Mets la ligne survolée en évidence. */
function colorerLigne(ligne) { 
	$("."+ligne).addClass("ligneSelectionnee");
}

/* Mets la colonne survolée en évidence. */
function colorerColonne(colonne) { 
	$("."+colonne).addClass("colonneSelectionnee");
}

/* Mets la case survolée encore plus en évidence. */
function colorerTableau(ligne,colonne) { 
	decolorerTableau();
	colorerLigne(ligne);
	colorerColonne(colonne);
	$("."+colonne+"."+ligne).removeClass("ligneSelectionnee").removeClass("colonneSelectionnee").addClass("caseSelectionnee");
}

/* La souris s'en va, on décolore les cases */
function decolorerTableau() { 
	$(".ligneSelectionnee, .colonneSelectionnee, .caseSelectionnee").removeClass("ligneSelectionnee colonneSelectionnee caseSelectionnee");
}

/* Les tableaux ayant la classe 'alternerCouleur' auront une couleur différente par ligne. Sauf pour les lignes de classe 'noAlternance'. */
function alternerLignePairesImpaires() { 
	$(".alternerCouleur tr:even").each(function (a) {
		if (!$(this).hasClass("noAlternance")) {
			$(this).addClass("lignePaire");
		}
	});
	$(".alternerCouleur tr:odd").each(function (a) {
		if (!$(this).hasClass("noAlternance")) {
			$(this).addClass("ligneImpaire");
		}
	});
}

/* Les lignes n'ayant pas la classe 'noSurvol' dans les tableaux ayant la classe 'surlignerLigneSurvolee' seront surlignées au survol de la souris. */
function surlignerLigneSurvolee() { 
	$(".surlignerLigneSurvolee tr").mouseover(function(){
		if (!$(this).hasClass("noSurvol")) {
			$(this).addClass('ligneSelectionnee');
		}
	}).mouseout(function() {
		if (!$(this).hasClass("noSurvol")) {
			$(this).removeClass('ligneSelectionnee');
		}
	});
}

/* Pour appliquer les effets de survols sur les boutons / liens */
function colorierBouton() {
	
	$(".bouton-ui, .lien-ui, .bouton-ui-toggleable").addClass('ui-state-default ui-corner-all');
	$(".bouton-ui:not(.ui-state-disabled), .bouton-ui-toggleable:not(.ui-state-disabled)")
	.hover(
		function () {
			$(this).addClass("ui-state-hover"); 
		},
		function () {
			$(this).removeClass("ui-state-hover"); 
		}
	)
	.mousedown(function(){
			$(this).parents('.boutonset-ui-single:first').find(".bouton-ui.ui-state-active").removeClass("ui-state-active");
			if( $(this).is('.ui-state-active.bouton-ui-toggleable, .boutonset-ui-multi .ui-state-active') ) { $(this).removeClass("ui-state-active"); }
			else { $(this).addClass("ui-state-active"); }
	})
	.mouseup(function(){
		if(! $(this).is('.bouton-ui-toggleable, .boutonset-ui-single .bouton-ui,  .boutonset-ui-multi .bouton-ui') ){
			$(this).removeClass("ui-state-active");
		}
	});
	
}


/* Coche / décoche les case à cocher d'une même classe (IE7&8 aime pas)*/
function cocherCases(classeCase) {
	if ($("input#"+classeCase).attr("checked")==true) {
		$("input."+classeCase).attr("checked","checked");
	} else {
		$("input."+classeCase).removeAttr("checked");
	}
}

/* Inverse les coches / décoches les cases à cocher d'une même classe */
function inverserCases(classe) {
	$("input."+classe).each(function(t) {
		if ($(this).attr("checked")==true)
			$(this).removeAttr("checked");
		else
			$(this).attr("checked","checked");
	});
}

/* F L A S H   -   I N F O S */
function flash(type,message) {
	
	$("div#flash").fadeOut("slow");

    $("div#flash span").empty().append(message);
    
    if (type=="notice") {
        $("div#flash").removeClass("ui-state-error").addClass("ui-corner-all ui-state-highlight").fadeIn("slow");
    }
    
    if ((type=="error")||(type=="erreur")) {
        $("div#flash").removeClass("ui-state-highlight").addClass("ui-corner-all ui-state-error").fadeIn("slow");
    }
    
    $("div#flash").click(function() {
    	$("div#flash").fadeOut("slow");
    });
}



/* La zone contient l'image en attente tant que le téléchargement des données et leur affichage n'est pas fini.*/
function rechargerUneZone(zone,commande) {
	$(zone).empty().append('<img src="/ajax-loader.gif" alt="Veuillez patienter" />');
	var data = eval(commande);
	$(zone).empty().append(data);
	
	habillerContenu();
}

/* Mettre en attente une DIV */
function miseEnAttenteZone(zone) {
	$(zone).empty().append('<img src="/images/ajax-loader.gif" alt="Veuillez patienter..." class="veuillezPatienter" />');
}

/* Mettre en attente une DIV, variante image d'un cercle au lieu d'une barre */
function miseEnAttenteZoneCercle(zone) {
	$(zone).empty().append('<img src="/images/circle-loader.gif" alt="Veuillez patienter..." class="veuillezPatienter" />');
}

/* Une url, des paramètres et le tout est envoyé en POST, et retourne la réponse. Petite alerte en cas d'echec. */
function vaChercher (url, parametres) {
	var retour = "";
	$.ajax({
		async: false,
		cache: false,
		url: url,
		data: parametres,
		type: "POST",
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
		error: function(data, status) {
			jAlert(data.responseText,data.statusText);
			retour = false;
		},
		success: function(data) {
			retour = data;
			
			/* Gère les session TIMEOUT */
			if ($(retour).find("timeout").text()=="oui") {
				$("#header").empty();
				$("#content").empty().append("<div class='boite'><h2>Session expirée</h2><div class='boite-content'>Votre session a expirée. Vous allez devoir vous reconnecter et recommencer.<a href='"+$(retour).find("location").text()+"'>Se re-connecter</a></div></div>");
				habillerContenu();
			}
		}
	});
	return (retour);
}

/* True si le paramètre est une url valide, ALERT() + return FALSE sinon. */
function validerUrl(url) {
	if (isValidURL(url)) {
		return true;
	} else {
		jAlert(url+" n'est pas une URL correcte !","Incorrect");
	}
	return false;
}

/* True si le paramètre est une url valide, False sinon. */
function isValidURL(url){
	var RegExp = /^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/; 
	if(RegExp.test(url)){ 
		return true; 
	}else{ 
		return false; 
	} 
} 


/* On passe l'id d'un formulaire (ou d'une DIV), et il retourne les valeur de ses champs INPUT, SELECT et TEXTAREA sous form &nom=valeur&nom_2=valeur_2.... */
function recupererDonneeFormulaire(idForm) {
	var param = "";
	
	$("#"+idForm+" input[type='text']").each( function () {
		param+="&"+$(this).attr("name")+"="+$(this).val();
	});
	$("#"+idForm+" input[type='hidden']").each( function () {
		param+="&"+$(this).attr("name")+"="+$(this).val();
	});
	$("#"+idForm+" input[type='password']").each( function () {
		param+="&"+$(this).attr("name")+"="+$(this).val();
	});
	$("#"+idForm+" input[type='val']").each( function () {
		param+="&"+$(this).attr("name")+"="+$(this).val();
	});
	$("#"+idForm+" input[type='submit']").each( function () {
		param+="&"+$(this).attr("name")+"="+$(this).val();
	});
	$("#"+idForm+" select").each( function () {
		param+="&"+$(this).attr("name")+"="+$(this).val();
	});
	$("#"+idForm+" textarea").each( function () {
		param+="&"+$(this).attr("name")+"="+$(this).val();
	});
	$("#"+idForm+" input[type='checkbox']").each(function() {
		if ($(this).attr("checked")) {
			param += "&"+$(this).attr("name")+"="+$(this).val();
		}
	});
    
    $("#"+idForm+" input[type='radio']").each(function() {
		if ($(this).attr("checked")) {
			param += "&"+$(this).attr("name")+"="+$(this).val();
		}
	});
    
	return param;
}

/* On file un ID de DIV (ou autre) et on la recharge en executant la commande JS */
function rechargerUneZoneSansEffet(zone,commande) {
	var data = eval(commande);
	if (data != false) {
		$(zone).empty().append(data);
	}
	habillerContenu(); 
}

function trim (string) { 
	return string.replace(/^\s+/g,'').replace(/\s+$/g,'');
}

// Construit une liste <ul></ul> avec l'object passé en paramètres
function print_r(theObj) {
    var retour="<ul>";
    for(var p in theObj) {
        if (theObj[p].constructor == Array || theObj[p].constructor == Object) {
            retour=retour+"<li>["+p+"] =>"+typeof(theObj)+"</li>";
            retour=retour+"<ul>";
            print_ra(theObj[p]);
            retour=retour+"</ul>";
        } else {
            retour=retour+"<li>["+p+"] =>"+theObj[p]+"</li>";
        }
    }
    retour=retour+"</ul>";
    return retour;
}


function str_replace (search, replace, subject, count) {
    var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0,
            f = [].concat(search),
            r = [].concat(replace),
            s = subject,
            ra = r instanceof Array, sa = s instanceof Array;
    s = [].concat(s);
    if (count) {
        this.window[count] = 0;
    }
 
    for (i=0, sl=s.length; i < sl; i++) {
        if (s[i] === '') {
            continue;
        }
        for (j=0, fl=f.length; j < fl; j++) {
            temp = s[i]+'';
            repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
            s[i] = (temp).split(f[j]).join(repl);
            if (count && s[i] !== temp) {
                this.window[count] += (temp.length-s[i].length)/f[j].length;}
        }
    }
    return sa ? s : s[0];
}

/* V R A I - F A U X   P O P U P */

/* Remplie la DIV avec ce qu'on lui a passé et l'affiche (temporairement) au détriment des onglets */
function fauxPopup(titre,details) {
	
	changerTitreFauxPopup(titre); /* Mets en place le titre */	
	rechargerFauxPopup(details); /* Mets en place le contenu */

	$("#fauxPopup").show();
	$("#content").hide();
	$("#footer").hide();
}

/* Vide la DIV et la masque au profit des onglets */
function fermerFauxPopup() {
	$("#fauxPopup").toggle();
	$("#content").toggle();
	$("#footer").toggle();
}

function changerTitreFauxPopup(titre) {
	$("#titreFauxPopup").empty().append(titre);
}

/* Recharge le contenu du popup de détails */
function rechargerFauxPopup(details) {
	$("#contenuFauxPopup").empty().append(details);
	
	habillerContenu(); 
}

function changerTitreJAlert(titre) {
	$("#ui-dialog-title-popup_container").empty().append(titre);
}

/* Fonction jQuery UI dialogs */
function jAlert(message, title, callback, width, height ) {

    nettoyerPopupContainer();

    if (height==undefined) {
        heightDialog = 300;
    } else {
        heightDialog = height;
    }

    if (width==undefined) {
        widthDialog = 450;
    } else {
        widthDialog = width;
    }

	$("BODY").append(
	  '<div id="popup_container" title="'+title+'" >' +
		  '<p id="popup_message">'+message+'</p>' +
	  '</div>');
	
	$("#popup_container").dialog({
		bgiframe: true,
		modal: true,
		buttons: {
			'OK':  function() {
				jQuery(this).dialog('close');
				if(callback)
					callback(true);
			}
		},
        height: heightDialog,
        width: widthDialog,
		close: function(event, ui) { $("#popup_container").remove(); }
	});
}

function jConfirm(message, title, callback) {

    nettoyerPopupContainer();

	$("BODY").append(
	  '<div id="popup_container" title="'+title+'" >' +
		  '<p id="popup_message">'+message+'</p>' +
	  '</div>');
	  
	$("#popup_message").html( $("#popup_message").text().replace(/\n/g, '<br />') );
	$("#popup_container").dialog({
		bgiframe: true,
		resizable: false,
		modal: true,
		overlay: {
			backgroundColor: '#000',
			opacity: 0.5
		},
		buttons: {
			'OK':  function() {
				$(this).dialog('close');
				if( callback )
					callback(true);
			},
			'Annuler': function() {
				$(this).dialog('close');
			}
		},
		close: function(event, ui) { $("#popup_container").remove(); }
	});
}

function jPrompt(message, value, title, callback) {

    nettoyerPopupContainer();
    
	$("BODY").append(
	  '<div id="popup_container" title="'+title+'" >' +
		  '<p id="popup_message">'+message+'</p>' +
		  '<input type="text" size="30" id="popup_prompt" value="'+value+'" />' +
	  '</div>');
	  
	$("#popup_message").html( $("#popup_message").text().replace(/\n/g, '<br />') );
	$("#popup_container").dialog({
		bgiframe: true,
		resizable: false,
		modal: true,
		overlay: {
			backgroundColor: '#000',
			opacity: 0.5
		},
		buttons: {
			'OK':  function() {
				var valeur = $("#popup_prompt").val();
				$(this).dialog('close');
				callback(valeur);
			},
			'Annuler': function() {
				$(this).dialog('close');
			}
		},
		close: function(event, ui) { $("#popup_container").remove(); }
	});
}

function nettoyerPopupContainer() { /* Pour éviter les doublons et que tout ne s'enchaine au pied de la page. (c'est moche et c'est nul) */
    $("#popup_container").remove();
}



/* ACTION AJAX */
/* Une zone a recharcher avec le retour de cette URL */
function rechargerAjax(zone,url) {

	var nouveauContenu = vaChercher(url);
	$(zone).empty().append(nouveauContenu);	
	
	habillerContenu();

}

/* Une url dont le retour doit aller dans le faux popup */
function actionAjaxPopup(titre,url) {	
	fauxPopup(titre,vaChercher(url));	
	habillerContenu();	
}

/* Retourne l'URL */
function faireUrl(module, action, param) {
	if (param!= undefined) {
		return debutUrl+'/'+module+'/'+action+param;
	}
	return debutUrl+'/'+module+'/'+action;
}

/*
 * Selectionne toutes les checkbos de l'id donné, cochée ou non, et en fait une
 * string de parametres GET
 */
function recupererTouteLesCheckbox(idForm) {
	var param = "";
	$("#"+idForm+" input[type='checkbox']").each(function() {
		param += "&"+$(this).attr("name")+"="+$(this).val();
	});
	return param;
}

function rechargerBoite(id) { // Recharge la boite ID depuis l'URL fournie 

    var zone = "#"+id;
    
    if ($(zone+"_ajax").val()!=undefined) { // Soumission en AJAX, rempli l'ID avec la réponse. 
    
        var url = $(zone+" form").attr("action");
        var datas = recupererDonneeFormulaire(id);
        
        // alert("zone = "+ zone+"\n\n id = "+id+" \n\n url = "+url);
        // $(zone).empty().append('<img src="/images/ajax-loader.gif" />');
        
        var reponse = vaChercher(url,datas);
        $(zone).empty().append(reponse);
        
        habillerContenu();
    
    } else { // Soumet le formulaire et va à la page de l'action de celui ci     	
        $(zone+" > div > form").submit();        
    }
}

/* On change de page ... */
function rechargerBoitePage(id,page) {
    $("#"+id+" .pagerPage").val(page);    
    rechargerBoite(id);    
}

function toggleZone(id) {
	$(id+" .miniListe").toggle();
	$(id+" .upButton").toggle();
	$(id+" .downButton").toggle();
}

/* Fourni le XHR en fonction du navigateur. */
function recupererXhr () { 
	var xhr = null; 

	if (window.XMLHttpRequest) // Navigateurs normaux.
		xhr = new XMLHttpRequest(); 
	else if(window.ActiveXObject) { // MS IE 
		try {
			xhr = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}
	else { // Le navigateur ne peux pas executer les XHR.
		alerteFatale("<br />"+rougeConsole("Votre navigateur ("+navigator.appName+") ne supporte pas les objets XMLHTTPRequest... <br />"+orangeConsole("Essayez avec Internet Explorer ou "+lienConsoleNom("http://www.mozilla-europe.org/fr/firefox/","Firefox")+".")));
		xhr = false; 
	}
	return (xhr);
}

/* TRUE si le navigateur supporte le Cross Site Scripting */
function testerNavigateurCompatibleXSS(urlTest) {
	var xmlHTTP = recupererXhr();
	
	try {
		if (window.ActiveXObject) {
			xmlHTTP.open("GET", urlTest, false);
			xmlHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xmlHTTP.setRequestHeader("Accept-Language", "en-US");
			xmlHTTP.onreadystatechange = function () { ; }
			xmlHTTP.send();
		}
		else {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
			xmlHTTP.onreadystatechange = function () { ; }
			xmlHTTP.open("GET", urlTest, true);
			xmlHTTP.send(null);
		}
	}
	catch (e) {
		return false;
	}
	return true;
}

