//Sur cette page, on retrouve les fonctions JS qu'a besoin le fichier chat.php pour gerer a partie AJAX.


/***********/
var chat_serveur_url='chat_infos.php', xmlHttpChat, tps_maj=15000, cache=new Array(), dernier_id_message=-1, champ_message, fenetre_affiche;
var numero_page_a_demander=1;
var inscrit_qu = false;
var DEBUG_MODE = false;

//On a l'id du gars là-dedans:
function id_gars(numero_id, pseudo_numero_id)
{
	if(numero_id > 0 && pseudo_numero_id.length > 3) //Si le gars est inscrit
	{
		inscrit_qu = true;
		id_visiteur = numero_id;
		pseudo_visiteur = pseudo_numero_id;
	}
	demande_au_serveur_qui_ecrit();
}


function chatInit()
{
	 // Le textarea
	if(inscrit_qu === true && document.formulaire_bbcode.message) // Seulement si le gars est inscrit, parce que sinon on lui a pas affiché le formulaire
	{
		champ_message = document.formulaire_bbcode.message;
		champ_message.setAttribute("autocomplete", "off");
	}
	
	 // Le div dans lequel on va afficher les messages du chat
	fenetre_affiche = document.getElementById("table_chat_php");
	
	 // On chope un objet xmlHttpChat
	xmlHttpChat = createxmlHttpRequest();
	if(!xmlHttpChat) // S'il ne marche pas, alors on affiche un message d'erreur aux yeux du gars, et on l'empêche de continuer, en 'fermant' le textarea et en stoppant la fonction
	{
		fenetre_affiche.innerHTML = "Une erreur est survenue lors de la création d'un objet JS utilisé pour ce Chat."
								  + "<br/>Veuillez réessayer plus tard."
								  + "<br/>Si le problème presiste, veuillez en informer les Admins.";
		fenetre_affiche.className = "erreur";
		
		if(inscrit_qu === true)
			champ_message.disabled = "disabled";
		
		return false;
	}
	
	searchMessages();
	
	setInterval('searchMessages()', tps_maj);
}

function createxmlHttpRequest()
{
	//On initialise la variable qui sera notre requête
	var xmlHttpChatObj = false;
	
	/*On essaie de créer l'objet de requête:*/
	//Si le client est tout sauf IE6 et les versions plus anciennes:
	try
	{
		xmlHttpChatObj = new XMLHttpRequest();
	}
	//Si on n'a pas réussi juste avant, on suppose que le client est IE6 ou plus ancien:
	catch(e)
	{
		//On enregistre les différentes possibilités de versions du client
		var xmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
										"MSXML2.XMLHTTP.5.0",
										"MSXML2.XMLHTTP.4.0",
										"MSXML2.XMLHTTP.3.0",
										"MSXML2.XMLHTTP.2.0",
										"MSXML2.XMLHTPP.1.0",
										"Msxml2.XMLHTPP",
										"MSXML2.XMLHTPP",
										"Microsoft.XMLHTPP");
		
		//On essaie chaque probable version, jusqu'à ce qu'il y en ait une qui marche...
		for(var i=0; i < xmlHttpVersions.length; i++)
		{
			try
			{
				//On essaie de créer l'instancer xmlHttpChatRequest:
				xmlHttpChatObj = new ActiveXObject(xmlHttpVersions[i]);
			}
			catch(e)
			{
			}
		}
	}
	
	return xmlHttpChatObj;
}

function searchMessages(Params)
{
	if(xmlHttpChat)
	{
		try
		{
			if(xmlHttpChat.readyState == 4 || xmlHttpChat.readyState == 0) //Si on peut demander quelque chose au serveur...
			{
				var parametres = "";//On initialise la variable
				
				if(Params) // Si le gars envoie un paramètre, c'est qu'il veut que l'action soit faite tout de suite.
				{
					parametres = Params;
				}
				else
				{
					if(cache.length > 0) //S'il y a des requêtes enregistrées dans la file, on enregistre la première requête dans parametres:
					{
						parametres = cache.shift();
					}
					else //Si la file est vide, on demande juste de retrouver les nouveaux messages
					{
						parametres = "mode=TrouverNouveauxMessages&dernier_id_message="+dernier_id_message+"&numero_page_a_demander="+numero_page_a_demander;
					}
				}
				
				//Et ici on appelle le serveur, etc...
				xmlHttpChat.open("POST", chat_serveur_url, true);
				xmlHttpChat.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				xmlHttpChat.onreadystatechange = receiveMessages;
				xmlHttpChat.send(parametres);
			}
		}
		catch(e)
		{
			writeError(e.toString()); // On écrit l'erreur causée s'il y en a une
		}
	}
}

function receiveMessages()
{
	if(xmlHttpChat.readyState == 4) //Seulement si le processus est complet
	{
		if(xmlHttpChat.status == 200) //Seulement si le statut HTTP est "OK"
		{
			try //On essaie de lire la réponse du serveur
			{
				readMessages();
			}
			catch(e) //Sinon on affiche le message d'erreur
			{
				writeError(e.toString());
			}
		}
		else //Sinon on affiche le message d'erreur
		{
			writeError((xmlHttpChat.statusText)? xmlHttpChat.statusText : "Le statut HTTP est: "+ xmlHttpChat.status);
		}
	}
}

//Lit les messages venant du serveur
function readMessages()
{
	//On enregistre la réponse du serveur:
	var reponse_serveur = changemoicasilteplaitencaractere_et(xmlHttpChat.responseText);
	
	//alert(reponse_serveur);
	if(reponse_serveur.indexOf("Erreur") >= 0 || reponse_serveur.indexOf("Error") >= 0 || reponse_serveur.indexOf("error:") >= 0 || reponse_serveur.indexOf("ERRNO") >= 0 || reponse_serveur.length == 0 || reponse_serveur.indexOf("error") >= 0 || reponse_serveur.indexOf("<b>Fatal error") >= 0 || reponse_serveur.indexOf("<b>Fatal") >= 0 || reponse_serveur.indexOf("Parse error") >= 0 || reponse_serveur.indexOf("<b>Parse") >= 0) //S'il y a une erreur du serveur
	{
		//On l'affiche
		writeError((reponse_serveur.length == 0)? "Erreur du serveur." : reponse_serveur);
	}
	else
	{
		//On affiche les messages du Chat
		showMessage(reponse_serveur);
	}
}

//Cette fonction envoie le message que l'utilisateur veut envoyer (soit il a appuyé sur 'Enter', soit il a cliqué sur le bouton 'Envoyer')
function envoyer_message()
{
	//Sauvegarde l'id de l'utilisateur:
	var id_utilisateur = document.getElementById("id_utilisateur").value;
	//Sauvegarde le message dans une variable locale et vide la zone de texte:
	var message_a_envoyer = champ_message;
	if(trim(message_a_envoyer.value) != "")//Si le message n'est pas vide
	{
		// On dit que l'utilisateur n'est plus en train d'écrire
		//je_suis_en_train_decrire("");
		//On enregistre ce qu'on va demander au serveur
		parametres = "mode=EnvoyerEtTrouverMessages&dernier_id_message="+dernier_id_message+"&message="+encodeURIComponent(message_a_envoyer.value)+"&id_utilisateur="+encodeURIComponent(id_utilisateur)+"&numero_page_a_demander="+numero_page_a_demander;
		// Et on fout tout ca sur la "liste" qui s'occupera que tout ce fera dans l'ordre dans lequel on l'a demandé:
		searchMessages(parametres);
		// On vide la zone de texte:
		message_a_envoyer.value = "";
		// Et on remet le curseur en place
		curseur_en_place();
	}
}

//Fonction qui affiche sur la fenêtre:
function showMessage(message)
{
	fenetre_affiche.innerHTML = (message)? message : fenetre_affiche.innerHTML;
	//memorise_en_ligne_affiche_qu();
}

//Fonction qui gère les erreurs:
function writeError(erreur)
{
	//Affiche l'erreur
	showMessage("<table width=\"100%\"><tr><td class=\"titrecommentaire\"><strong>Erreur lors de l'accès au serveur! </strong></td></tr><tr><td class=\"commentaire\">" + ((DEBUG_MODE === true)? erreur : "")  +"</td></tr></table>");
}

// Fonction comme dans PHP:
function trim(s)
{
	return s.replace(/(^\s+)|(\s+$)/g, "");
}

//Fonction qui va vhanger tout ce qui s'appelle "changemoicasilteplaitencaractere-et-" en "&"
function changemoicasilteplaitencaractere_et(a_changer)
{
	a_changer = a_changer.replace(/changecasen-et/g, "\&");
	return a_changer;
}

//Cette fonction gère le choix de page de l'utilisateur
function quelle_page(page)
{
	//On enregistre son choix:
	numero_page_a_demander = page;
	//Cf + haut
	parametres = "mode=ChangerDePage&numero_page_a_demander="+numero_page_a_demander;
	searchMessages(parametres);
}

//On met le curseur dans la zone de texte, de sorte que l'utilisateur puisse de suite écrire
function curseur_en_place()
{
	champ_message.focus();
}



// Fonction de décompte des caractères
var ns6=document.getElementById&&!document.all

function restrictinput(maxlength,e,placeholder){
if (window.event&&event.srcElement.value.length>=maxlength)
return false
else if (e.target&&e.target==eval(placeholder)&&e.target.value.length>=maxlength){
var pressedkey=/[a-zA-Z0-9\.\,\/]/ 
if (pressedkey.test(String.fromCharCode(e.which)))
e.stopPropagation()
}
}

function countlimit(maxlength,e,placeholder){
var theform=eval(placeholder)
var lengthleft=maxlength-theform.value.length
var placeholderobj=document.all? document.all[placeholder] : document.getElementById(placeholder)
if (window.event||e.target&&e.target==eval(placeholder)){
if (lengthleft<0)
theform.value=theform.value.substring(0,maxlength)
placeholderobj.innerHTML=lengthleft
}
}

function displaylimit(thename, theid, thelimit){
var theform=theid!=""? document.getElementById(theid) : thename
var limit_text='<b><span id="'+theform.toString()+'">'+thelimit+'</span></b> caractères restants.'
if (document.all||ns6)
document.write(limit_text)
if (document.all){
eval(theform).onkeypress=function(){ return restrictinput(thelimit,event,theform)}
eval(theform).onkeyup=function(){ countlimit(thelimit,event,theform)}
}
else if (ns6){
document.body.addEventListener('keypress', function(event) { restrictinput(thelimit,event,theform) }, true); 
document.body.addEventListener('keyup', function(event) { countlimit(thelimit,event,theform) }, true); 
}
}



/************************************************En train d'écrire*****************************************/

/* On traite maintenant qui est-ce qui est en train d'écrie ou non */

/* Variables de départ: */
//Adresse de la page sur le serveur gérant tout ca
var infos_ecrire_url = "chat_infos_ecrit.php";
//Création des objets XMLHttpRequest:
var xmlHttp2 = createxmlHttpRequest();
var xmlHttp3 = createxmlHttpRequest();
//Combien de temps on doit attendre jusqu'à ce qu'on se reconnecte au serveur:
var tps_avt_re = 2000;
//Initialisation de la variable qui contient false (je n'étais pas en train d'écrire) ou true (j'étais en train d'écrire
var etaisje_en_train_decrire = false;
//Le message qui s'affiche aux yeux du visiteur s'il n'y a personne en train d'écrire
var personne_ecrit = "<span style='color:red;background:white;border:red 1px solid;'>Personne n'est en train d'écrire en ce moment!</span>";
//Le début du message qui s'affiche aux yeux du visiteur s'il y a au moins quelqu'un en train d'écrire
var qqn_ecrit = "<span style='color:green;background:white;border:1px solid green;'>";
//La fin du message qui s'affiche aux yeux du gars si au moins une personne écrit:
var qqn_ecrit_fin = "</span>";
//On initialise l'id et le pseudo de l'utilisateur (si le gars est inscrit, ca prendra sa valeur plus loin):
var id_visiteur = 0;
var pseudo_visiteur = "";
//On initialise ces variables, qui vont fournire les paramètres au serveur
var parametres2 = "";
//La variable qui va stocker les données de la deuxième connexion (celle qui met à jour ceux qui sont en train d'écrire)
var message2 = "";

//Fonction appelée lorsque le gars écrit un message (onKeyUp)
function je_suis_en_train_decrire(ce_que_je_suis_en_train_decrire)
{
	if(trim(ce_que_je_suis_en_train_decrire) == "") //S'il n'y a pas de messages (ou que des espaces)
	{
		if(etaisje_en_train_decrire == true) //Si avant j'étais en train d'écrire un message, mais que je me suis décidé à tout effacer
		{
			//On ajoute à la liste
			parametres2 = "mode=Jecris&Jecris_qu=false&id_visiteur="+id_visiteur;
			dit_au_serveur_si_jecris();
		}
		etaisje_en_train_decrire = false;
	}
	else //S'il y a quelque chose dans l'input (donc que je suis en train d'écrire)
	{
		if(etaisje_en_train_decrire == false) //Si avant je n'étais pas en train d'écrire
		{
			//On appelle la fonction qui va envoyer l'info au serveur
			parametres2 = "mode=Jecris&Jecris_qu=true&id_visiteur="+encodeURIComponent(id_visiteur)+"&pseudo_visiteur="+encodeURIComponent(pseudo_visiteur);
			dit_au_serveur_si_jecris();
		}
		etaisje_en_train_decrire = true;
	}
}

//Cette fonction donne au serveur les infos concernant l'activité du visiteur, à savoir s'il écrit ou non
function dit_au_serveur_si_jecris()
{
	if(xmlHttp2) //Seulement si pas vide
	{
		try
		{
			if(xmlHttp2.readyState == 4 || xmlHttp2.readyState == 0) //Si on peut demander quelque chose au serveur...
			{
				//Et ici on appelle le serveur, etc...
				xmlHttp2.open("GET", infos_ecrire_url + "?" + parametres2, true);
				xmlHttp2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				xmlHttp2.send(null);
			}
			else //Si le serveur n'est pas (encore) libre, on rappelle la fonction au bout de l'intervalle de temps définit au départ
			{
				setTimeout('dit_au_serveur_si_jecris()', tps_avt_re);
			}
		}
		catch(e)
		{
			setTimeout("dit_au_serveur_si_jecris()", tps_avt_re);
		}
	}
}

//Demande au serveur qui est en train d'écrire un message
function demande_au_serveur_qui_ecrit()
{
	if(xmlHttp3) //Seulement si pas vide
	{
		try
		{
			if(xmlHttp3.readyState == 4 || xmlHttp3.readyState == 0) //Si on peut demander quelque chose au serveur...
			{
				var parametres3 = "mode=JeVeuxSavoir&id_visiteur="+encodeURIComponent(id_visiteur);
				//Et ici on appelle le serveur, etc...
				xmlHttp3.open("GET", infos_ecrire_url + "?" + parametres3, true);
				xmlHttp3.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				xmlHttp3.onreadystatechange = qui_est_en_train_decrire;
				xmlHttp3.send(null);
			}
			else //Si le serveur n'est pas (encore) libre, on rappelle la fonction au bout de l'intervalle de temps définit au départ
			{
				setTimeout("demande_au_serveur_qui_ecrit()", tps_avt_re);
			}
		}
		catch(e)
		{
			setTimeout("demande_au_serveur_qui_ecrit()", tps_avt_re);//S'il y a une erreur du serveur, on ne fait que redémarrer la séquence
		}
	}
}

//Quand on reçoit une réponse du serveur, c'est cette fonction qui est appelée
function qui_est_en_train_decrire()
{
	if(xmlHttp3.readyState == 4) //Si toute la connexion est bien finie
	{
		if(xmlHttp3.status == 200) //Seulement si le statut HTTP est "OK"
		{
			try //On essaie de lire la réponse du serveur
			{
				//On enregistre la réponse du serveur
				var reponse_serveur_ecrire = xmlHttp3.responseText;
				if(reponse_serveur_ecrire.indexOf("Erreur") >= 0 || reponse_serveur_ecrire.indexOf("Error") >= 0 || reponse_serveur_ecrire.indexOf("error:") >= 0 || reponse_serveur_ecrire.indexOf("ERRNO") >= 0 || reponse_serveur_ecrire.length == 0 || reponse_serveur_ecrire.indexOf("error") >= 0 || reponse_serveur_ecrire.indexOf("<b>Fatal error") >= 0 || reponse_serveur_ecrire.indexOf("<b>Fatal") >= 0 || reponse_serveur_ecrire.indexOf("Parse error") >= 0 || reponse_serveur_ecrire.indexOf("<b>Parse") >= 0) //S'il y a une erreur du serveur
				{
					//On dit au visiteur que personne n'est en train d'écrire en ce moment:
					affiche_message_ecrire(personne_ecrit);
				}
				else //S'il n'y a pas d'erreur du serveur
				{
					reponse_serveur_ecrire = xmlHttp3.responseXML.documentElement; //Cf + haut
					if(reponse_serveur_ecrire.getElementsByTagName("cb_ecrit").item(0).firstChild.data == 0 || reponse_serveur_ecrire.getElementsByTagName("cb_ecrit").item(0).firstChild.data == "0") //S'il y n'y a personne en train d'écrire
					{
						//On le dit:
						message2 = personne_ecrit;
					}
					else
					{
						if(reponse_serveur_ecrire.getElementsByTagName("cb_ecrit").item(0).firstChild.data == 1 || reponse_serveur_ecrire.getElementsByTagName("cb_ecrit").item(0).firstChild.data == "1") //S'il n'y a qu'une seule personne en train d'écrire:
						{
							//On écrit ca.
							pseudo_ecrire = reponse_serveur_ecrire.getElementsByTagName("pseudo_ecrit").item(0).firstChild.data;
							message2 = qqn_ecrit + pseudo_ecrire + " est en train d'écrire un message." + qqn_ecrit_fin;
						}
						else //S'il y a plusieurs personnes en train d'écrire
						{
							//On récupère les données récuperées
							cb_ecrit = reponse_serveur_ecrire.getElementsByTagName("cb_ecrit").item(0).firstChild.data;
							pseudo_tableau_ecrire = reponse_serveur_ecrire.getElementsByTagName("pseudo_ecrit");
							
							var pseudo_ecrire = "";
							for(var i2=0; i2<cb_ecrit; i2++) //Tant qu'il y a des personnes qui écrivent
							{
								if(i2 == 0) //si c'est le premier utilisateur qu'on écrit... on va pas mettre la virgule juste avant lui:
								{
									pseudo_ecrire = pseudo_tableau_ecrire.item(i2).firstChild.data;
								}
								else if(i2 != cb_ecrit - 1)
									pseudo_ecrire = pseudo_ecrire+", "+pseudo_tableau_ecrire.item(i2).firstChild.data;
								else //Si on va écrire le dernier utilisateur en train d'écrire
									pseudo_ecrire = pseudo_ecrire+" et "+pseudo_tableau_ecrire.item(i2).firstChild.data;
							}
							
							//On écrit tout ca
							message2 = qqn_ecrit + pseudo_ecrire + " sont en train d'écrire un message." + qqn_ecrit_fin;
						}
					}
					
					//Et finalement on affiche tout ca:
					affiche_message_ecrire(message2);
				}
			}
			catch(e) //Sinon on ne fait rien
			{
			}
		}
		//Sinon on ne fait rien
	}
}

//Cette fonction affiche le message du serveur sur le client:
function affiche_message_ecrire(message2)
{
	document.getElementById("qui_ecrit_div").innerHTML = changemoicasilteplaitencaractere_et(message2);
	setTimeout("demande_au_serveur_qui_ecrit()", tps_avt_re);
}

//True: affiche; false: "ravale"
var qui_est_en_ligne_affiche_qu = true;
//Cette fonction est appelée lors de chaque réponse lue. Elle détermine quel class on mettra au div contenant les personnes connectées sur le Chat
function memorise_en_ligne_affiche_qu()
{
	if(qui_est_en_ligne_affiche_qu == true) //S'il faut afficher...
	{
		document.getElementById("qui_est_en_ligne_affiche_div").className = "affiche_div_en_ligne";
	}
	else //Sinon...
	{
		document.getElementById("qui_est_en_ligne_affiche_div").className = "cache_div_en_ligne";
	}
}

//Cette fonction affiche, ou "ravale" qui est connecté sur le Chat.
function qui_est_en_ligne_affiche()
{
	if(qui_est_en_ligne_affiche_qu == true) //Si on doit afficher qui est en ligne...
	{
		//On affiche^^
		document.getElementById("qui_est_en_ligne_affiche_div").className = "cache_div_en_ligne";
		qui_est_en_ligne_affiche_qu = false; //Et on dit que la prochaine fois on doit "ravaler"
	}
	else //Sinon...
	{
		document.getElementById("qui_est_en_ligne_affiche_div").className = "affiche_div_en_ligne";
		qui_est_en_ligne_affiche_qu = true;
	}
}