/*=========================================================================
	Fonction renvoyant le code de la touche appuyée lors d'un événement clavier
=========================================================================*/
function getKeyCode(evenement)
{
    for (prop in evenement)
    {
        if(prop == 'which'){
            return evenement.which;}
    }
    return event.keyCode;
}


/*=========================================================================
	Suppression des espaces/sauts de ligne inutiles (http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256C0C0062AC78)
=========================================================================*/
function trim(aString) {
	var regExpBeginning = /^\s+/;
	var regExpEnd       = /\s+$/;

   	return aString.replace(regExpBeginning, "").replace(regExpEnd, "");
}

/*=========================================================================
	Fonction renvoyant une valeur "aléatoire" pour forcer le navigateur (ie...)
	à envoyer la requête de mise à jour
=========================================================================*/
function ieTrick(sep)
{
	d = new Date();
	trick = d.getYear() + "ie" + d.getMonth() + "t" + d.getDate() + "r" + d.getHours() + "i" + d.getMinutes() + "c" + d.getSeconds() + "k" + d.getMilliseconds();

	if (sep != "?")
	{
		sep = "&";
	}

	return sep + "ietrick=" + trick;
}



//On ne pourra éditer qu'une valeur à la fois
var editionEnCours = false;

//variable évitant une seconde sauvegarde lors de la suppression de l'input
var is_saving = false;

/*=========================================================================
	Fonction de modification inline de l'élément double-cliqué
=========================================================================*/
function inline_edit(id, objet, champ, option)
{
	if(editionEnCours)
		return false;
	else 
	{
		editionEnCours = true;
		is_saving = false;
	}

	//objetet servant à l'édition de la valeur dans la page
	var input = null;
	var oldvaleur = '';

	//On crée un composant différent selon le champ pour modifier sa valeur
	switch(champ)
	{
		case "dev_titre":
		case "cre_libelle":
		case "cre_rang":
		case "acr_numero_releve":
		case "reg_numero_releve":
		case "dev_date_expected":
		case "dev_point_prevu":
		case "dev_point":
		case "dev_point2":
		case "cqu_rang":
		case "usb_commentaire":
		case "prf_flottante":
			input = document.createElement("input");
			input.style.height = objet.offsetHeight-10+"px";
			break;

		case "tod_task":
		case "cco_libelle":
			input = document.createElement("input");
			break;

		case "dev_description":
		case "dev_description_technique":
		case "dev_aide":
		case "dev_support":
		case "usr_note":
		case "evi_commentaire":
			input = document.createElement("textarea");
			input.style.height = "300px";
			break;

		case "dev_type":
		case "dev_id_produit":
		case "dev_id_version":
		case "dev_id_tag":
		case "dev_id_developpeur":
		case "dev_id_developpeur2":
		case "dev_couleur":
		case "dev_priorite":
			input = document.createElement("select");
			if (objet.childNodes.length>0){
				valeur=objet.firstChild.nodeValue;}
			else{
				valeur="";}
			ajouter_option(input,valeur,champ,option);
			break;
	}
	if (champ!="tod_task" && champ!="cco_libelle") {
		input.style.width  = objet.offsetWidth-13+"px";}
	
	input.value='';
	
	// Initialisation de la valeur
	// je fais tout ça parce que lorsque l'objet a été créé en ajax les \n ne sont pas repris
	// donc dans tous les cas je le supprime tous pour les gérer moi même
	for (i=0;i<objet.childNodes.length;i++)
	{
		if (objet.childNodes.item(i).tagName!='/A')
		{
			if (objet.childNodes.item(i).nodeName!="BR")
			{
				if (i>0){
					input.value+="\n";}
				input.value+=trim(objet.childNodes.item(i).nodeValue.replace("\r\n","","g"));
			}
		}
	}

	//input.value = trim(input.value);
	oldvaleur='"'+input.value+'"';

	//Remplacement du texte par notre objet et input
	while (objet.childNodes.length>0){
		objet.removeChild(objet.lastChild);}
	objet.appendChild(input);

	//On donne le focus à l'input et on sélectionne le texte qu'il contient
	input.focus();
	//input.select();

	//Assignation des deux événements qui déclencheront la sauvegarde de la valeur

	//Sortie de l'input
	input.onblur = function sortir() 
	{
		save_edit(id, objet, champ, oldvaleur, input.value);
		objet.removeChild(input);
	};
	// Changement de valeur
	if (input.nodeName=="SELECT") 
	{
		input.onchange = function change() 
		{
			save_edit(id, objet, champ, oldvaleur, input.value);
			objet.removeChild(input);
		}
	}
	//Appui sur la touche Entrée
	if (input.nodeName!="TEXTAREA") 
	{
		input.onkeydown = function keyDown(event)
		{
			if (!event&&window.event)
				event = window.event;
			if(getKeyCode(event) == 13)
			{
				save_edit(id, objet, champ, oldvaleur, input.value);
				objet.removeChild(input);
			}
		}
	}
}

function save_edit(id, objet, champ, oldvaleur, valeur)
{
	if(is_saving)
		return false;
	else
		is_saving = true;

	editionEnCours = false;
	if (oldvaleur!=valeur)
	{
		var parametre="id="+ id +"&champ="+champ+ieTrick()+"&valeur="+escape(valeur);
		var docXML = new Ajax.Request(
			'script/inline_save.php?'+parametre,// je met de paramètre dans l'adresse sinon les accents sont mal gérés
			{
				method:'GET',
				parameters:'',
				onComplete:afficher_result,
				asynchronous:true
			}
		);
	}
	function afficher_result(reponse) {
		//alert(reponse.responseText);
	}

	if (champ!="dev_id_produit" && champ!="dev_id_version" && champ!="dev_id_tag" && champ!="dev_id_developpeur" && champ!="dev_id_developpeur2")
	{
		var tableau=valeur.split("\n");

		//Réinitialisation de la variable d'état d'édition
		editionEnCours = false;

		//Remplacement de l'input par le texte qu'il contient
		//objet.replaceChild(document.createTextNode(tableau[0]), objet.firstChild);
		//alert(objet.firstChild.toString());
		var noeud=objet.firstChild;
		//objet.replaceChild(document.createTextNode(tableau[0]), objet.firstChild);
		
		for (i=0;i<tableau.length;i++)
		{
			//alert(tableau[i]);
			objet.appendChild(document.createTextNode(tableau[i]));
			if (i!=tableau.length-1){
				objet.appendChild(document.createElement("br"));}
		}
		objet.removeChild(noeud);
//		if (champ=='dev_point')
//		{
//			$('nb_point').value=round(parseFloat($('nb_point').value)+parseFloat(valeur)-oldvaleur,2);
//			$('info_dev').innerHTML=$('nb_dev').value+' développements / '+$('nb_point').value+' points';
//		}
	}
	else
	{
		if (champ=="dev_id_produit") {
			var parametre="produit="+ valeur ;}
		else if (champ=="dev_id_version") {
			var parametre="version="+ valeur ;}
		else if (champ=="dev_id_tag") {
			var parametre="tag="+ valeur ;}
		else if (champ=="dev_id_developpeur") {
			var parametre="developpeur="+ valeur ;}
		else if (champ=="dev_id_developpeur2") {
			var parametre="developpeur2="+ valeur ;}

		var docXML = new Ajax.Request(
			'script/ajax_xml.php',
			{
				method:'GET',
				parameters:parametre,
				onComplete:afficher_nom,
				asynchronous :true
			}
		);
	}
	function afficher_nom(reponse)
	{
		xml=reponse.responseXML;
		objet.appendChild(document.createTextNode(xml.getElementsByTagName('nom').item(0).firstChild.data));
	}
}

function ajouter_option(objet,valeur,nom_champ,option)
{
	function ajoute(valeur_existante,id,valeur){
			option=document.createElement("option");
			option.setAttribute('value',id);
			if (trim(valeur_existante)==trim(valeur)) {
				option.setAttribute('selected','selected');}
			option.appendChild(document.createTextNode(valeur));
			return option;
	}
	switch(nom_champ)
	{
		case "dev_type":
			objet.appendChild(ajoute(valeur,"Bug","Bug"));
			objet.appendChild(ajoute(valeur,"Evolution","Evolution"));
			objet.appendChild(ajoute(valeur,"Refactoring","Refactoring"));
			objet.appendChild(ajoute(valeur,"RetD","RetD"));
			break;

		case "dev_priorite":
			objet.appendChild(ajoute(valeur,"",""));
			objet.appendChild(ajoute(valeur,"-1","-1"));
			objet.appendChild(ajoute(valeur,"0","0"));
			objet.appendChild(ajoute(valeur,"1","1"));
			objet.appendChild(ajoute(valeur,"2","2"));
			objet.appendChild(ajoute(valeur,"3","3"));
			objet.appendChild(ajoute(valeur,"4","4"));
			break;

		case "dev_couleur":
			objet.appendChild(ajoute(valeur,"",""));
			objet.appendChild(ajoute(valeur,"bleu","Bleu"));
			objet.appendChild(ajoute(valeur,"vert","Vert"));
			objet.appendChild(ajoute(valeur,"rose","Rose"));
			objet.appendChild(ajoute(valeur,"orange","Orange"));
			break;

		case "dev_id_produit":
				var parametre="liste_produit&id_solution="+option;
				var docXML = new Ajax.Request(
					'script/ajax_xml.php',
					{
						method:'GET',
						parameters : parametre,
						onComplete:affiche_element,
						asynchronous : true
					}
				);
			break;

		case "dev_id_version":
				var parametre="liste_version&id_solution="+option;
				var docXML = new Ajax.Request(
					'script/ajax_xml.php',
					{
						method:'GET',
						parameters : parametre,
						onComplete:affiche_element,
						asynchronous : true
					}
				);
			break;
		case "dev_id_developpeur":
		case "dev_id_developpeur2":
				var parametre="liste_developpeur";
				var docXML = new Ajax.Request(
					'script/ajax_xml.php',
					{
						method:'GET',
						parameters : parametre,
						onComplete:affiche_element,
						asynchronous : true
					}
				);
			break;
		case "dev_id_tag":
				var parametre="liste_tag";
				var docXML = new Ajax.Request(
					'script/ajax_xml.php',
					{
						method:'GET',
						parameters : parametre,
						onComplete:affiche_element,
						asynchronous : true
					}
				);
			break;

	}
	function affiche_element(reponse) {
		xml=reponse.responseXML;
		try{nb=xml.getElementsByTagName('element').length;}catch(e){nb=0;}
		if (nom_champ=="dev_id_version" || nom_champ=="dev_id_tag" || nom_champ=="dev_id_developpeur" || nom_champ=="dev_id_developpeur2"){
			objet.appendChild(ajoute(valeur,0,""));}
		else if (nb==0){
			objet.appendChild(ajoute(valeur,"",""));}
		for (i=0; i<nb; i++)
		{
			element=xml.getElementsByTagName('element').item(i);
			try{id=element.getElementsByTagName('id').item(0).firstChild.data;}catch(ex){id='';}
			try{nom=element.getElementsByTagName('nom').item(0).firstChild.data;}catch(ex){nom='';}
			objet.appendChild(ajoute(valeur,id,nom));
		}
	}
}



