// stores the reference to the XMLHttpRequest object
var xmlHttp = createXmlHttpRequestObject();

// creates an XMLHttpRequest instance
function createXmlHttpRequestObject()
{
	// will store the reference to the XMLHttpRequest object
	var xmlHttp;
	
	// this should work for all browsers except IE6 and older
	try {
		// try to create XMLHttpRequest object
		xmlHttp = new XMLHttpRequest();
	}
	catch(e) {
		// assume IE6 or older
		var XmlHttpVersions = new Array('MSXML2.XMLHTTP.6.0',
										'MSXML2.XMLHTTP.5.0',
										'MSXML2.XMLHTTP.4.0',
										'MSXML2.XMLHTTP.3.0',
										'MSXML2.XMLHTTP',
										'Microsoft.XMLHTTP');
		// try every prog id until one works
		for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++) {
			try {
				// try to create XMLHttpRequest object
				xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
			}
			catch (e) {} // ignore potential error
		}
	}

	// return the created object or display an error message
	if (!xmlHttp)
		alert("Error creating the XMLHttpRequest object.");
	else
		return xmlHttp;
}

// Fonction exécutée quand on clique sur un div éditable
// Affiche la form d'édition
function faaeEdit(divLabel) {
	// Cacher le divLabel
	divLabel.style.display = "none";

	// Remplir et afficher la form d'édition
	switch (document.getElementById(divLabel.id + "_type").value) {
		case 'xinha':
			// Afficher avant de démarrer
			document.getElementById(divLabel.id + "_editDiv").style.display = "block";
			// Démarrer l'éditeur si pas déjà fait
			if (!xinha_editors[divLabel.id + '_newValue'].started) {
				Xinha.startEditors([xinha_editors[divLabel.id + '_newValue']]);
				xinha_editors[divLabel.id + '_newValue'].started = true;
			} else {
				xinha_editors[divLabel.id + '_newValue'].setHTML(xinha_editors[divLabel.id + '_newValue'].inwardHtml(document.getElementById(divLabel.id + "_originalValue").innerHTML));
				xinha_editors[divLabel.id + '_newValue'].outwardHtml(xinha_editors[divLabel.id + '_newValue'].getHTML());
			}
		case 'input':
		case 'textarea':
		case 'select':
			document.getElementById(divLabel.id + "_newValue").value = document.getElementById(divLabel.id + "_originalValue").innerHTML;
			break;
		
		case 'multiselect':
			// Sélectionner les options selon la valeur originale
			var ori = document.getElementById(divLabel.id + "_originalValue").innerHTML.split('|');
			var opt = document.getElementById(divLabel.id + "_newValue").options;
			for (var intLoop=0; intLoop < opt.length; intLoop++) {
				if (ori.in_array(opt[intLoop].value))
					opt[intLoop].selected = true;
				else
					opt[intLoop].selected = false;
			}
			break;
		
		case 'image':
			break;
	}
	document.getElementById(divLabel.id + "_editDiv").style.display = "block";
}

// Requête de mise à jour d'un div éditable
function faaeUpdate(faaeId) {
	// procéder seulement si l'objet xmlHttp n'est pas occupé
	if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) {

		// Cacher la form d'édition
		document.getElementById(faaeId + '_editDiv').style.display = "none";

		// Effacer message d'erreur
		try {
			document.getElementById(document.getElementById(faaeId + '_errorMessageDivId').value).style.display = "none";
			document.getElementById(document.getElementById(faaeId + '_errorMessageDivId').value).innerHTML = ''; 
		} catch (e) {}

		// Mettre un loading gif dans le div éditable
		try {
			loadingGif = "<img src=\"ajaxedit/loading.gif\" width=\"18\" height=\"18\" border=\"0\" alt=\"loading...\">";
			document.getElementById(faaeId).innerHTML = loadingGif;
		} catch (e) {}

		// Afficher le contenu du div éditable
		document.getElementById(faaeId).style.display = "block";

		// Définir la nouvelle valeur
		var newValue;
		try {
			newValue = document.getElementById(faaeId + '_newValue').value;
			// Si multiselect
			if (document.getElementById(faaeId + '_type').value == 'multiselect') {
				newValue = getSelectedValues(document.getElementById(faaeId + "_newValue").options).join('|');
			}
		} catch (e) {}


		// Préparer la requête
		try {
			params =	"action=update";
			params +=	"&faaeId="				+ encodeURIComponent(faaeId);
			params +=	"&newValue="			+ encodeURIComponent(newValue);
			params +=	"&errorMessageDivId="	+ encodeURIComponent(document.getElementById(faaeId + '_errorMessageDivId').value);	
		} catch (e) {}

		//alert(params);

		// Envoyer la requête
		xmlHttp.open('POST', "ajaxedit_response.php", true);
		xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xmlHttp.setRequestHeader("Content-length", params.length);
		xmlHttp.setRequestHeader("Connection", "close");
		xmlHttp.onreadystatechange = handleServerResponse;
		xmlHttp.send(params);
	} 
	// si la connection est occupé, réessayer dans .5 sec
	else {
		setTimeout("faaeUpdate('" + faaeId + "')", 500);
	}

}

// Réponse du serveur et mise à jour du contenu
function handleServerResponse() {
	// move forward only if the transaction has completed
	if (xmlHttp.readyState == 4) {
		// status of 200 indicates the transaction completed successfully
		if (xmlHttp.status == 200) {
			// extract the XML retrieved from the server
			xmlResponse = xmlHttp.responseXML;
			// obtain the document element (the root element) of the XML structure
			xmlDocumentElement = xmlResponse.documentElement;

			// Récupérer result, message, faaeId, new_value et label
			try { result = xmlDocumentElement.getElementsByTagName('result')[0].firstChild.data; } catch (e) { result = ''; }
			try { faaeId = xmlDocumentElement.getElementsByTagName('faaeId')[0].firstChild.data; } catch (e) { faaeId = ''; }
			try { newValue = xmlDocumentElement.getElementsByTagName('newValue')[0].firstChild.data; } catch (e) { newValue = ''; }
			try { label = xmlDocumentElement.getElementsByTagName('label')[0].firstChild.data; } catch (e) { label = ''; }
			try { message = xmlDocumentElement.getElementsByTagName('message')[0].firstChild.data; } catch (e) { message = ''; }
			try { errorMessageDivId = xmlDocumentElement.getElementsByTagName('errorMessageDivId')[0].firstChild.data; } catch (e) { errorMessageDivId = ''; }

			// Si success
			if (result == "success") {
				// Remplacer valeur originale
				document.getElementById(faaeId + "_originalValue").innerHTML = newValue;

				// Remplacer label original (textarea seulement)
				if (document.getElementById(faaeId + "_type").value == 'textarea') {
					document.getElementById(faaeId + "_originalLabel").innerHTML = label;
				}

				// Afficher le nouveau contenu du div éditable
				document.getElementById(faaeId).innerHTML = label;
			
			// Si error
			} else {
				// Remettre la valeur originale
				switch (document.getElementById(faaeId + "_type").value) {
					case 'input':
					case 'select':
						document.getElementById(faaeId).innerHTML = document.getElementById(faaeId + "_originalValue").innerHTML;
						break;

					case 'xinha':
					case 'textarea':
						document.getElementById(faaeId).innerHTML = document.getElementById(faaeId + "_originalLabel").innerHTML;
						break;
					
					case 'multiselect':
						// Créer un label en joignant les sélections par des virgules
						var ori = document.getElementById(faaeId + "_originalValue").innerHTML.split('|');
						var val = getValueLabel(document.getElementById(faaeId + "_newValue").options);
						label = new Array;
						for (var intLoop=0; intLoop < ori.length; intLoop++) {
							label[intLoop] = val[ori[intLoop]];
						}
						document.getElementById(faaeId).innerHTML = label.join(', ');
						break;
				}


				// Afficher message d'erreur
				try { 
					document.getElementById(errorMessageDivId).innerHTML = message;
					document.getElementById(errorMessageDivId).style.display = "block";
				} catch (e) {}
			}

			// Debug
			try {
				//alert(xmlHttp.responseText);
				document.getElementById('xml_response_result').innerHTML = result;
				document.getElementById('xml_response_message').innerHTML = message;
				document.getElementById('xml_response_faaeId').innerHTML = faaeId;
				document.getElementById('xml_response_new_value').innerHTML = new_value;
				document.getElementById('xml_response_label').innerHTML = label;
			}
			catch (e) {}

		// a HTTP status different than 200 signals an error
		} else {
			alert("There was a problem accessing the server: " + xmlHttp.statusText);
		}
	}
}

function cancelEdit(faaeId) {
	// Cacher la form d'édition
	document.getElementById(faaeId + '_editDiv').style.display = "none";

	// Afficher le contenu du div éditable
	document.getElementById(faaeId).style.display = "block";
/*
	// Remettre la valeur originale
	switch (document.getElementById(faaeId + "_type").value) {
		case 'input':
			document.getElementById(faaeId).innerHTML = document.getElementById(faaeId + "_originalValue").innerHTML;
			break;

		case 'select':
		case 'textarea':
			document.getElementById(faaeId).innerHTML = document.getElementById(faaeId + "_originalLabel").innerHTML;
			break;
		
		case 'multiselect':
			// Créer un label en joignant les sélections par des virgules
			var ori = document.getElementById(faaeId + "_originalValue").innerHTML.split('|');
			var val = getValueLabel(document.getElementById(faaeId + "_newValue").options);
			label = new Array;
			for (var intLoop=0; intLoop < ori.length; intLoop++) {
				label[intLoop] = val[ori[intLoop]];
			}
			document.getElementById(faaeId).innerHTML = label.join(', ');
			break;
	}
	*/
}



//------------------------------------------------------
function hideElement (elementId) {
	var element;
	if (document.all)
		element = document.all[elementId];
	else if (document.getElementById)
		element = document.getElementById(elementId);
	if (element && element.style)
		element.style.display = 'none';
}
function showElement (elementId) {
	var element;
	if (document.all)
		element = document.all[elementId];
	else if (document.getElementById)
		element = document.getElementById(elementId);
	if (element && element.style)
		element.style.display = '';
}
Array.prototype.in_array = function(search_term) {
  var i = this.length;
  if (i > 0) {
	 do {
		if (this[i] === search_term) {
		   return true;
		}
	 } while (i--);
  }
  return false;
}
function getSelected(opt) {
	var selected = new Array();
	var index = 0;
	for (var intLoop=0; intLoop < opt.length; intLoop++) {
		if (opt[intLoop].selected) {
			index = selected.length;
			selected[index] = new Object;
			selected[index].value = opt[intLoop].value;
			selected[index].label = opt[intLoop].innerHTML;
			selected[index].index = intLoop;
		}
	}
	return selected;
}
function getSelectedValues(opt) {
	var selected = new Array();
	var index = 0;
	for (var intLoop=0; intLoop < opt.length; intLoop++) {
		if (opt[intLoop].selected) {
			index = selected.length;
			selected[index] =  opt[intLoop].value;
		}
	}
	return selected;
}
function getValueLabel(opt) {
	var valueLabel = new Array();
	var index = 0;
	for (var intLoop=0; intLoop < opt.length; intLoop++) {
		valueLabel[opt[intLoop].value] = opt[intLoop].innerHTML;
	}
	return valueLabel;
}

/**
* Function : dump()
* Arguments: The data - array,hash(associative array),object
*    The level - OPTIONAL
* Returns  : The textual representation of the array.
* This function was inspired by the print_r function of PHP.
* This will accept some data as the argument and return a
* text that will be a more readable version of the
* array/hash/object that is given.
*/
function dump(arr,level) {
var dumped_text = "";
if(!level) level = 0;

//The padding given at the beginning of the line.
var level_padding = "";
for(var j=0;j<level+1;j++) level_padding += "    ";

if(typeof(arr) == 'object') { //Array/Hashes/Objects
 for(var item in arr) {
  var value = arr[item];
 
  if(typeof(value) == 'object') { //If it is an array,
   dumped_text += level_padding + "'" + item + "' ...\n";
   dumped_text += dump(value,level+1);
  } else {
   dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
  }
 }
} else { //Stings/Chars/Numbers etc.
 dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
}
return dumped_text;
} 
