
//fonction verifiant que le node est bien une liste de choix
function isComboBox(node){
	var result = false;
	if(null != node && node.tagName == 'SELECT'){
		result = true;
	}
	return result;
}	

//fonction verifiant l'affichage ou non de la combobox pour le choix de la ville
function checkCountry(nodeCountryCode, nodeCityCombo, nodeCityText, nodeCityMode){
	if(null != nodeCityCombo && null != nodeCityText) {
		var countryCode = "FR";
		if(null == nodeCountryCode || null == nodeCountryCode.value) {
			//log.debug("countryCode par defaut : " + countryCode);
		}
		else {
			countryCode = nodeCountryCode.value;
		}
		
		//masquage/affichage combo/textBox
		if(isNational(countryCode) == true){
				// cas ou le pays selectionne est la France ou un DOM
				affg(nodeCityCombo.id);
				hide(nodeCityText.id);
				nodeCityMode.value = "COMBO";
		}
		else{
				// cas ou le pays selectionne n'est pas la France ou un DOM
				hide(nodeCityCombo.id);
				affg(nodeCityText.id);
				nodeCityMode.value  = "";	
		}
	}
}

//fonction renvoyant true si le pays est national
// FR pour FRANCE
// GP pour GUADELOUPE
// GF pour GUYANE
// MQ pour MARTINIQUE
// YO pour MAYOTTE
// RE pour REUNION
// G2 pour SAINT-MARTIN

function isNational(countryCode){
	switch(countryCode) {
		case "FR":
		case "GP":
		case "GF":
		case "MQ":
		case "YO":
		case "RE":
		case "G2":

			// cas ou le pays selectionne est la France ou un DOM
			return true;
			break;
		default:
			// cas ou le pays selectionne n'est pas la France ou un DOM
			return false;
	}
}



//instanciation des objets de communication Ajax
var xmlhttp1;
var xmlhttp2;



//fonction de creation d'un objet xmlHttpRequest necessaire a la communication Ajax
function createXmlHttpRequest(){
	
	var xmlhttp;
	
	// code for Mozilla, etc.
	if (window.XMLHttpRequest){
		xmlhttp = new XMLHttpRequest();
	}
	// code for IE
	else if (window.ActiveXObject){
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	
	return xmlhttp;
}

//fonction chargement des villes propres au code postal
function loadCity(urlAction, xmlhttp, nodeZipCode, nodeCityCombo, nodeCityText){
	//log.info("loadCity");
	loadCityAndCallBack(urlAction, xmlhttp, nodeZipCode, nodeCityCombo, nodeCityText, null);
}

//fonction chargement des villes propres au code postal avec appel d'une fonction au retour
function loadCityAndCallBack(urlAction, xmlhttp, nodeZipCode, nodeCityCombo, nodeCityText, fctCallBack){
//	log.info("loadCityAndCallBack");

	xmlhttp = createXmlHttpRequest();	

	//verification qu'il existe une instance de l'objet xmlhttp
	if (xmlhttp != null && nodeZipCode != null){
		//expression reguliere correspondant a un code postal valide
		var patternZipCode = /\d{5}/;
		var zipCode = nodeZipCode.value;
		
		//on teste la validite du code postal pour savoir si on lance une requette Ajax
		if(patternZipCode.test(zipCode) == true){
			// d?finition de la fonction de call-back
			xmlhttp.onreadystatechange= function(){ processCityReply(xmlhttp, nodeCityCombo, nodeCityText, fctCallBack); };

			//ecriture de l'url d'appel : action + variable code postal
			var url = urlAction + zipCode;

			// param?trage de la requ?te (true = asynchrone)
			xmlhttp.open("GET",url,true);
			// envoi de la requ?te
			xmlhttp.send(null);
		}
		else{
//			log.error("mauvais code postal : " + zipCode);
			//l'utilisateur a mis ajour le code postal et il ne correspond plus
			// a un CP valide => efface la liste des villes
			if(isComboBox(nodeCityCombo)){
				nodeCityCombo.options.length = 0;
			}
			if(document.getElementById("vill") && isComboBox(document.getElementById("vill"))){
				document.getElementById("vill").options.length = 0;
			}
		}
	}
}

//fonction call-back renvoyant vers la fonction de traitement de mise a jour de la liste des villes de la comboBox
function processCityReply (xmlhttp, nodeCityCombo, nodeCityText, fctCallBack){

	// si xmlhttp est "loaded"
	if (xmlhttp.readyState==4){
		// si "OK"
		if (xmlhttp.status==200){
			
			//la reponse Ajax est arrive, on appelle la methode de MAJ de la liste des villes
			if(null != nodeCityCombo && isComboBox(nodeCityCombo)){
				writeListCity(xmlhttp, nodeCityCombo, nodeCityText);		
			}	
			else {
				nodeCityCombo = document.getElementById("vill");
				if(isComboBox(nodeCityCombo)) {
					writeListCity(xmlhttp, nodeCityCombo, nodeCityText);
				}
			}	
			
			//appel de la fonction voulue
			if (fctCallBack != null){
				fctCallBack.apply();
			}
		}
	}
}

//place la liste des villes dans la comboBox voulue
function writeListCity(xmlhttp, nodeCityCombo, nodeCityText){
//	log.info("writeListCity");
	// Effacer la liste des villes
	nodeCityCombo.options.length = 0;
	
	// Ajouter les nouvelles villes
	var nodeXmlCities = xmlhttp.responseXML.documentElement;
	var nodeXmlCity = nodeXmlCities.firstChild;
	var i = 0;
	while (nodeXmlCity!= null)
	{
		var value = nodeXmlCity.firstChild.nodeValue;
//		log.debug("ajout de " + value);
		nodeCityCombo.options[i++] = new Option(value, value);
		nodeXmlCity = nodeXmlCity.nextSibling;
	}
	
//	log.debug("fin ajax");
	
	//pre-selection de la ville selectionnee
	selectCurrentCity(nodeCityCombo, nodeCityText);
}


function trim(str) {
	if(str == null) {
		return "";
	}
	else {
		//suppression d'eventuel espace : .replace(/^\s+|\s+$/, '') = trim()
		return str.replace(/^\s+|\s+$/, '');
	}
}


//fonction pre-selectionnat de la ville a selectionnee
function selectCurrentCity(nodeCityCombo, nodeCityText){
	
	//reccuperation du nom de la ville selectionne auparavant
	var currentCityValueOrig = "";
	if(null != nodeCityText) {
		currentCityValueOrig = nodeCityText.value;
	}
	var currentCityValue = "";
	
	//Mise en forme du nom de la ville pour pouvoir la comparer
	//suppression d'eventuel espace : .replace(/^\s+|\s+$/, '') = trim()
	currentCityValue = trim(currentCityValueOrig);
	//mise en majuscule
	currentCityValue = currentCityValue.toUpperCase() ;
	
	//parcours de la liste des villes pour comparer a la ville a preselectionner
	var currentOption = null;
	var currentOptionText = "";
	var currentOptionValue = "";
	var i;
	for(i=0; i<nodeCityCombo.length ; i++){
		//reccuperation du noeud contenant la ville
		currentOption = nodeCityCombo.options[i];
		//suppression d'eventuel espace : .replace(/^\s+|\s+$/, '') = trim()
		currentOptionText	= trim(currentOption.text);
		currentOptionValue	= trim(currentOption.value);
		
		//on compare la ville a selectionner avec la ville en cours de la liste
		if((currentCityValue == currentOptionValue) || (currentCityValue == currentOptionText)){
			//si la ville a selectionner dans la liste y est, la selectionner
			currentOption.selected = true;
			break;
		}
	}
}
