/********************* Fonctions JavaScript *********************/
	
	
	/*************************/
	/******** General ********/
	/*************************/
	
	/**
	 * Affiche une information d'erreur
	 *
	 * @param string str -> Le message à afficher
	 * @param string error_lang -> Le text "ERREUR" suivant la langue choisie
	 * @param int duration -> La durée d'affichage en ms
	 */
	function displayInfoError(str, error_lang, duration){
		var selector = "#info";
		var info_page_text = $(selector).text();
		$(selector).removeClass("info_theme_color");
		if( $(selector).hasClass("info_help") ){ $(selector).removeClass("info_help"); }
		$(selector).addClass("info_error");
		$(selector).hide();
		$(selector).text(error_lang+" : "+str);
		$(selector).fadeIn("fast");
		if(duration){
			setTimeout(function(){
				$(selector).removeClass("info_error");
				$(selector).addClass("info_theme_color");
				$(selector).hide();
				$(selector).text(info_page_text);
				$(selector).fadeIn("fast");
			}, duration);
		}
	}
	
	
	/**
	 * Affiche une information d'aide
	 *
	 * @param string str -> Le message à afficher
	 * @param string help_lang -> Le text "AIDE" suivant la langue choisie
	 * @param int duration -> La durée d'affichage en ms
	 */
	function displayInfoHelp(str, help_lang, duration){
		var selector = "#info";
		var info_page_text = $(selector).text();
		$(selector).removeClass("info_theme_color");
		if( $(selector).hasClass("info_error") ){ $(selector).removeClass("info_error"); }
		$(selector).addClass("info_help");
		$(selector).hide();
		$(selector).fadeIn("fast");
		$(selector).text(help_lang+" : "+str);
		if(duration){
			setTimeout(function(){
				$(selector).removeClass("info_help");
				$(selector).addClass("info_theme_color");
				$(selector).hide();
				$(selector).text(info_page_text);
				$(selector).fadeIn("fast");
			}, duration);
		}
	}
	
	
	/**
	 * Coche toutes les checkbox d'un selecteur depuis un lien
	 *
	 * @param string checkboxlist_selector -> Le selecteur de la liste des checkbox à cocher
	 * @param array link_title             -> [[title_checked, display_checked], [title_unchecked, diplay_unchecked]]
	 */
	(function($){
		$.fn.checkAllFromLink = function(checkboxlist_selector, link_title){
			$(this).click(function(){
				// Si les cases sont cochés, on décoche tout
				if( $(this).attr("name") == "checked" ){
					$(this).text(""+link_title[0][1]+"");
					$(this).attr("title", ""+link_title[0][0]+"");
					$(this).attr("name", "checkall");
					$(checkboxlist_selector).attr("checked", false);
				}
				// Sinon on coche
				else{
					$(this).text(""+link_title[1][1]+"");
					$(this).attr("title", ""+link_title[1][0]+"");
					$(this).attr("name", "checked");
					$(checkboxlist_selector).attr("checked", true);
				}
				return false;
			});
		};
	})(jQuery);
	
	
	/**
	 * Coche toutes les checkbox d'un selecteur depuis une checkbox
	 *
	 * @param string checkboxlist_selector -> Le selecteur de la liste des checkbox à cocher
	 */
	(function($){
		$.fn.checkAllFromCheckbox = function(checkboxlist_selector){
			$(this).click(function(){
				// Si les cases sont cochés, on décoche tout
				if( $(this).attr("name") == "checked" ){
				$(checkboxlist_selector).attr("checked", false);
				$(this).attr("name", "checkall");
				}
				// Sinon on coche
				else{
					$(checkboxlist_selector).attr("checked", true);
					$(this).attr("name", "checked");
				}
			});
		};
	})(jQuery);
	
	
	/**
	 * Scroll la page en bas
	 *
	 */
	function scrolldown(){
		var height = 0;
		if(document.body && document.body.offsetHeight){
			height = window.document.body.offsetHeight;
		}
		else if(document.documentElement && document.documentElement.clientHeight){
			height = document.documentElement.clientHeight;
		}
		else if(window.innerHeight){
			height = window.innerHeight;
		}
		window.scroll(1, height);
	}
	
	
	/**
	 * Math.round avec précision
	 *
	 * @param int value     -> Valeur à arrondir
	 * @param int precision -> Nombre de caractère après la virgule
	 */
	function round(value, precision){
		power = Math.pow(10, precision);
		poweredVal = Math.ceil(value * power);
		result = poweredVal / power;
		return result;
	}
	
	
	/**
	 * Vérifie si une valeur existe dans un tableau
	 *
	 * @param mixed needle -> Valeur à chercher
	 * @param array haystack -> Tableau de recherche
	 * @param bool argStrict -> Mode scrict
	 * @return true si la valeur a été trouvée, sinon false
	 */
	function in_array(needle, haystack, argStrict){
		var key = "", strict = !!argStrict; 
		if(strict){
			for(key in haystack){
				if(haystack[key] === needle){
					return true;
				}
			}
		}
		else{
			for(key in haystack){
				if(haystack[key] == needle){
					return true;
				}
			}
		}
		return false;
	}
	
	
	/**
	 * Redirection
	 *
	 * @param string url      -> la page à rediriger
	 * @param int    duration -> Nb de ms secondes avant de rediriger
	 */
	(function($){
		$.fn.redirection = function(url, duration){
			$(this).click(function(){
				if(duration){
					setTimeout(function(){
						$(location).attr("href", url);
					},duration);
				}else{
					if(url){
						$(location).attr("href", url);
					}else{
						$(location).attr("href", "./");
					}
				}
			});
		};
	})(jQuery);
	
	
	/**
	 * Vérifie si au moins une checkbox est cochée
	 *
	 * @param string checkbox_selector -> Le selecteur des checkbox à traiter
	 * @return true si au moins une checkbox est cochée, sinon false
	 */
	(function($){
		$.fn.checkboxIsChecked = function(checkbox_selector){
			$(this).click(function(){
				// On récupère le nombre de coche
				var nb_check = $(checkbox_selector).length;
				// Si on a coché au moins un challenge
				if(nb_check > 0){
					return true;
				}else{
					return false;
				}
			});
		};
	})(jQuery);
	
	
	/**
	 * Retourne l'effet choisit pour un selecteur
	 *
	 * @param selector    -> Le selecteur à afficher
	 * @param effect      -> L'effet à renvoyer : "fade", "show" ou "slide"
	 * @param display     -> "in" ou "out" pour l'affichage d'entrée ou de sortie 
	 * @param effect_opt  -> Options de l'effet : Par défaut "fast"
	 * @return le code d'affichage d'un selecteur avec effet
	 */
	function chooseJqueryEffect(selector, effect, display, effect_opt){
		if(effect_opt){ var effect_option = effect_opt; }
		else{ var effect_option = "fast"; }
		// Liste des effets
		if(effect == "fade"){
			if(display.toLowerCase() == "in"){
				return $(selector).fadeIn(effect_option);
			}else{
				return $(selector).fadeOut(effect_option);
			}
		}
		else if(effect == "show"){
			if(display.toLowerCase() == "in"){
				return $(selector).show(effect_option);
			}else{
				return $(selector).hide(effect_option);
			}
		}
		else if(effect == "slide"){
			if(display.toLowerCase() == "in"){
				return $(selector).slideDown(effect_option);
			}else{
				return $(selector).slideUp(effect_option);
			}
		}
	}
	
	
	/**
	 * Affiche un selecteur avec un effet
	 *
	 * @param effect      -> L'effet à renvoyer : "fade", "show" ou "slide"
	 * @param display     -> "in" ou "out" pour l'affichage d'entrée ou de sortie 
	 * @param effect_opt  -> Options de l'effet : Par défaut "fast"
	 */
	(function($){
		$.fn.display = function(effect, display, effect_opt){
			if(display){
				chooseJqueryEffect(this, effect, display, effect_opt);
				if(display.toLowerCase() == "out"){
					$(this).addClass("displaynone");
				}else{
					$(this).removeClass("displaynone");
				}
			}else{
				// Afficher
				if( $(this).hasClass("displaynone") ){
					chooseJqueryEffect(this, effect, "in", effect_opt);
					$(this).removeClass("displaynone");
				}
				// Masquer
				else{
					chooseJqueryEffect(this, effect, "out", effect_opt);
					$(this).addClass("displaynone");
				}
			}
		};
	})(jQuery);
	
	
	
	/*************************/
	/******* AdminServ *******/
	/*************************/
	
	/**
	 * Affiche le statut du serveur
	 */
	function adminservStatus(){
		$.getJSON("./status.php",
		function(data){
			$("#status").html(data);
		});
	}
	
	
	/**
	 * Affiche les lignes du chat
	 *
	 * @param string path   -> Chemin du fichier chatlines
	 * @param string params -> Les paramètres de la page
	 */
	function adminservChatLines(params){
		$.getJSON("./chatlines.php"+params,
		function(data){
			var chatlines = "";
			for(var i=0; i < data.length; i++){
				chatlines += data[i];
			}
			$("#chatlines").html(chatlines);
		});
	}
	
	
	/**
	 * Créer la liste des niveaux admin suivant le serveur sélectionné
	 *
	 * @param array array            -> Le tableau contenant tous les niveaux admins de la config
	 * @param int   lastAdminLevelID -> Le dernier niveau admin utilisé
	 */
	function createAdminLevelList(array, lastAdminLevelID){
		var serverID = $("select#serverList").val();
		var adminLevelList = "";
		for(var i = 0; i < array[serverID].length; i++){
			if(lastAdminLevelID == array[serverID][i]){ var selected = 'selected="selected"'; }
			else{ var selected = ""; }
			adminLevelList += '<option '+selected+' value="'+array[serverID][i]+'">'+array[serverID][i]+'</option>';
		}
		// On met à jour la liste
		$("select#admin_level_list").html(adminLevelList);
	}
	
	
	/**
	 * Applique une catégorie dans la page challenges
	 *
	 * @param int category_id -> L'id de la catégorie à traiter
	 * @param string display_effect -> L'effet d'affichage (show, fade, slide)
	 */
	function setChallengesCategory(category_id, display_effect){
		if(category_id == 1){
			$("#upload").hide();
			$("#local").hide();
			$("#matchsettings").hide();
			if(display_effect == "show"){$("#challenges").show(); }
			else{ $("#challenges").fadeIn("fast"); }
			$("li#ctg_liste").addClass("list_selected");
			if($("li#ctg_upload").hasClass("list_selected")){ $("li#ctg_upload").removeClass("list_selected"); }
			if($("li#ctg_local").hasClass("list_selected")){ $("li#ctg_local").removeClass("list_selected"); }
			if($("li#ctg_matchsettings").hasClass("list_selected")){ $("li#ctg_matchsettings").removeClass("list_selected"); }
		}
		else if(category_id == 2){
			$("#challenges").hide();
			$("#local").hide();
			$("#matchsettings").hide();
			if(display_effect == "show"){$("#upload").show(); }
			else{ $("#upload").fadeIn("fast"); }
			$("li#ctg_upload").addClass("list_selected");
			if($("li#ctg_liste").hasClass("list_selected")){ $("li#ctg_liste").removeClass("list_selected"); }
			if($("li#ctg_local").hasClass("list_selected")){ $("li#ctg_local").removeClass("list_selected"); }
			if($("li#ctg_matchsettings").hasClass("list_selected")){ $("li#ctg_matchsettings").removeClass("list_selected"); }
		}
		else if(category_id == 3){
			$("#challenges").hide();
			$("#upload").hide();
			$("#matchsettings").hide();
			if(display_effect == "show"){$("#local").show(); }
			else{ $("#local").fadeIn("fast"); }
			$("li#ctg_local").addClass("list_selected");
			if($("li#ctg_liste").hasClass("list_selected")){ $("li#ctg_liste").removeClass("list_selected"); }
			if($("li#ctg_upload").hasClass("list_selected")){ $("li#ctg_upload").removeClass("list_selected"); }
			if($("li#ctg_matchsettings").hasClass("list_selected")){ $("li#ctg_matchsettings").removeClass("list_selected"); }
		}
		else if(category_id == 4){
			$("#challenges").hide();
			$("#upload").hide();
			$("#local").hide();
			if(display_effect == "show"){$("#matchsettings").show(); }
			else{ $("#matchsettings").fadeIn("fast"); }
			$("li#ctg_matchsettings").addClass("list_selected");
			if($("li#ctg_liste").hasClass("list_selected")){ $("li#ctg_liste").removeClass("list_selected"); }
			if($("li#ctg_local").hasClass("list_selected")){ $("li#ctg_local").removeClass("list_selected"); }
			if($("li#ctg_upload").hasClass("list_selected")){ $("li#ctg_upload").removeClass("list_selected"); }
		}
	}
	
	
	/**
	 * Permet de parcourir le dossier "Tracks" de Trackmania
	 *
	 * @param string category -> La catégorie courante
	 * @param string path_directory -> Le chemin du dossier courant
	 * @param string dossier_parent_lang -> La langue du texte "Dossier parent"
	 */
	(function($){
		$.fn.browseTrackDirectory = function(category, path_directory, dossier_parent_lang){
			$(this).live("click", function(){
				var current_dir = $(this).text();
				current_dir = current_dir.split("(");
				current_dir = current_dir[0];
				var path_dir = path_directory;
				if( $(this).hasClass("clicknone") ){
					return false;
				}else{
					if(current_dir == dossier_parent_lang){
						var path_split = path_dir.split("/");
						var path_parent_dir = "";
						for(var i = 0; i < path_split.length-2; i++){
							path_parent_dir += path_split[i]+"/";
						}
						$(location).attr("href", "./challenges.php?c="+category+"&d="+path_parent_dir);
					}else{
						$(location).attr("href", "./challenges.php?c="+category+"&d="+path_dir+current_dir+"/");
					}
				}
			});
		};
	})(jQuery);
	
	
	/**
	 * Vérifie si un challenge est utilisé par le serveur
	 *
	 * @param string directory -> Le dossier courant
	 * @param array challengeFileNameList -> Le tableaè contenant la liste des FileName des challenges
	 * @return true si le challenge est utilisé, sinon false
	 */
	(function($){
		$.fn.checkChallengeIsUsed = function(directory, challengeFileNameList){
			// On récupère le nombre de coche
			var nb_check = $(this).length;
			// Si on a cochée plusieurs challenges, on liste les filename
			if(nb_check > 1){
				var filename = [];
				$(this).each(function(i){
					filename[i] = directory + $(this).val();
				});
			}
			// Sinon on récupère l'unique sélection
			else{
				var filename = [directory + $(this).val()];
			}
			// Si le filename est présent dans la liste des challenge du serveur, on informe qu'il est déjà utilisé
			for(var i = 0; i < filename.length; i++){
				if( in_array(filename[i], challengeFileNameList) ){
					return true;
				}
			}
			return false;
		};
	})(jQuery);
	
	
	/**
	 * Affiche la valeur seconde en minute en live
	 *
	 * @param string get -> Id de l'element à récupérer la valeur en seconde
	 * @param string set -> Id de l'element à afficher la valeur en minute
	 */
	function displayMinInLive(get,set){
		var sec = $("#"+get).attr("value");
		if(sec == "" || sec == undefined || isNaN(sec) ){ sec = 0; }
		sec = parseInt(sec);
		var min = sec/60;
		$("#"+set).text("["+round(min,1)+" min]");
	}
	
	
	
	/*************************/
	/****** DisplayServ ******/
	/*************************/
	
	/**
	 * Affiche le statut d'un serveur
	 *
	 * @param int serverid -> L'ID du serveur dans la tableau $server
	 */
	function displayserv(serverid){
		$.getJSON("./displayserv.php?sid="+serverid,
		function(data){
			$("#ds_status"+serverid).html(data[0]);
			$("#ds_playerList"+serverid).html(data[1]);
		});
	}
