// retourne un objet xmlHttpRequest.
// methode compatible entre tous les navigateurs (IE/Firefox/Opera)
function getXMLHTTP()
{
    var xhr = null;
    if(window.XMLHttpRequest)
    { // Firefox et autres
        xhr = new XMLHttpRequest();
    }
    else if(window.ActiveXObject)
    { // Internet Explorer
        try
        {
            xhr = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            try
            {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e1)
            {
                xhr = null;
            }
        }
    }
    else
    { // XMLHttpRequest non supporte par le navigateur
        alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
    }

    return xhr;
}


//Fonction renvoyant le code de la touche appuyee lors d'un evenement 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(value) {
   var temp = value;
   var obj = /^(\s*)([\W\w]*)(\b\s*$)/;
   if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }
   var obj = /  /g;
   while (temp.match(obj)) { temp = temp.replace(obj, " "); }
   return temp;
}

//Fonction donnant la largeur en pixels du texte donne (merci SpaceFrog !)
function getTextWidth(texte)
{
	//Valeur par defaut : 150 pixels
	var largeur = 150;

	if(trim(texte) == "")
	{
		return largeur;
	}

	//Creation d'un span cache que l'on "mesurera"
	var span = document.createElement("span");
	span.style.visibility = "hidden";
	span.style.position = "absolute";

	//Ajout du texte dans le span puis du span dans le corps de la page
	span.appendChild(document.createTextNode(texte));
	document.getElementsByTagName("body")[0].appendChild(span);

	//Largeur du texte
	largeur = span.offsetWidth;

	//Suppression du span
	document.getElementsByTagName("body")[0].removeChild(span);
	span = null;

	return largeur;
}


//Fonction renvoyant une valeur "aleatoire" pour forcer le navigateur (ie...)
//a envoyer la requete de mise a jour
function ieTrick(sep)
{
	var 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 editer qu'une valeur a la fois
var editionEnCours = false;

//variable evitant une seconde sauvegarde lors de la suppression de l'input
var sauve = false;

//Fonction de modification inline de l'element double-clique
function inlineMod(id, obj, nomValeur,nomValeur_cle,  nomTable, type)
{
	if(editionEnCours)
	{
		return false;
	}
	else
	{
		editionEnCours = true;
		sauve = false;
	}

	//Objet servant a l'edition de la valeur dans la page
	var input = null;

	//On cree un composant different selon le type de la valeur a modifier
	switch(type)
	{
		//Valeur de type texte ou nombre
		case "texte":
		case "nombre":
			input = document.createElement("input");
			input.style.width  = getTextWidth(input.value) + 5 + "px";
			break;

		//Valeur de type texte multilignes
		case  "texte-multi":
			input = document.createElement("textarea");
			input.style.width  = getTextWidth(input.value) + 300 + "px";
			break;
		case "select" :
			input = document.createElement("select");
			input.innerHTML = "<option value='Sans'>Sans</option><option value='9K'>9K</option><option value='8K'>8K</option><option value='7K'>7K</option><option value='7K'>7K</option><option value='6K'>6K</option><option value='5K'>5K</option><option value='4K'>4K</option><option value='3K'>3K</option><option value='2K'>2K</option><option value='1K'>1K</option><option value='1D'>1D</option><option value='2D'>2D</option><option value='3D'>3D</option><option value='4D'>4D</option><option value='5D'>5D</option><option value='6D'>6D</option><option value='7D'>7D</option><option value='8D'>8D</option><option value='9D'>9D</option><option value='10D'>10D</option><option value='11D'>11D</option><option value='12D'>12D</option><option value='13D'>13D</option><option value='14D'>14D</option><option value='15D'>15D</option>";
			input.style.width  = getTextWidth(input.value) + 30 + "px";
			break;
		case "select_y_n" :
			input = document.createElement("select");
			input.innerHTML = "<option value='Y'>Oui</option><option value='N'>Non</option>";
			input.style.width  = getTextWidth(input.value) + 50 + "px";
			break;
        case "select_paiement" :
			input = document.createElement("select");
			input.innerHTML = "<option value='Chèque'>Chèque</option><option value='Chèque 3 fois'>Chèque en 3 fois</option><option value='Espèces'>Espèces</option><option value='Paypal'>Paypal</option><option value='Virement'>Virement</option>";
			input.style.width  = getTextWidth(input.value) + 70 + "px";
			break;
		case "file":
			alert("file");
			input = document.createElement("input");
			alert(input);
			input.type = "file";
			alert(input);
			
			break;
	}

	//Assignation de la valeur
	if (obj.innerText)
		input.value = obj.innerText;
	else
		input.value = obj.textContent;
		
	input.value = trim(input.value);

	//On lui donne une taille un peu plus large que le texte a modifier

	//Remplacement du texte par notre objet input
	obj.replaceChild(input, obj.firstChild);

	//On donne le focus a l'input et on selectionne le texte qu'il contient
	input.focus();
	/*if (type != "select") {
		input.select();
	}*/

	//Assignation des deux evenements qui declencheront la sauvegarde de la valeur
	//Sortie de l'input
	input.onblur = function sortir()
	{
		sauverMod(id, obj, nomValeur, nomValeur_cle, input.value, nomTable, type);
		delete input;
	};
	
	input.onchange = function sortir()
	{
		sauverMod(id, obj, nomValeur, nomValeur_cle, input.value, nomTable, type);
		delete input;
	};

	//Appui sur la touche Entree
	input.onkeydown = function keyDown(event)
	{
        if (!event&&window.event)
        {
            event = window.event;
        }
		if(getKeyCode(event) == 13)
        {
			sauverMod(id, obj, nomValeur, nomValeur_cle, input.value, nomTable, type);
			delete input;
		}
	};
}

//Objet XMLHTTPRequest
var XHR = null;

//Fonction de sauvegarde des modifications apportees
function sauverMod(id, obj, nomValeur, nomValeur_cle, valeur, nomTable, type)
{
	//Si on a deja sauve la valeur en cours, on sort
	if(sauve) {
		return false;
	}else{
		sauve = true;		
	}
	
	/********************************/
	/* controle des champs modifies */
	/********************************/
	if (valeur=="") {
		alert("Merci d'entrer une valeur");
		sauve = false;
		return false;
	}
	reg = new RegExp("^([a-zA-Z0-9_-])+([.]?[a-zA-Z0-9_-]{1,})*@([a-zA-Z0-9-_]{2,}[.])+[a-zA-Z]{2,}$");
	if((nomValeur=="user_mail")&&(reg.exec(valeur) == null)) {
		alert("Ce mail n'est pas valide");
		sauve = false;
		return false;
	}
	
	/****** fin patch ******/


	//Si l'objet existe deja on abandonne la requete et on le supprime
	if(XHR && XHR.readyState != 0)
	{
		XHR.abort();
		delete XHR;
	}

	//Creation de l'objet XMLHTTPRequest
	XHR = getXMLHTTP();

	if(!XHR)
	{
		return false;
	}

	//URL du script de sauvegarde auquel on passe la valeur a modifier
	XHR.open("GET", "classes/sauverMod.php?id=" + id + "&"+"champ=" + nomValeur + "&"+"champ_cle=" + nomValeur_cle + "&"+"table=" + nomTable +"&"+"valeur=" + valeur + "&"+"type=" + type + ieTrick(), true);
	
	//On se sert de l'evenement OnReadyStateChange pour supprimer l'input et le replacer par son contenu
	XHR.onreadystatechange = function()
	{
		//Si le chargement est termine
		if (XHR.readyState == 4)
		{
			//Reinitialisation de la variable d'etat d'edition
			editionEnCours = false;

			//Remplacement de l'input par le texte qu'il contient
			obj.replaceChild(document.createTextNode(valeur), obj.firstChild);
		}
	}

	//Envoi de la requete
	XHR.send(null);
}
