// JavaScript Document
function get_X(){
   var xhr_object = null;
   if(window.XMLHttpRequest){
      xhr_object = new XMLHttpRequest();
      return xhr_object;
   }
   else if(window.ActiveXObject){
      xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
      return xhr_object;
   }
   else {
      alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
      return null;
   }
}
//loading
var current_requests=0;



function loadUrlTo(url,data,destination,debug){
	//var dest=document.getElementById(destination);
	var xmlhttp=get_X();
	if(data){
		url+="?"+data;
	}
	xmlhttp.open("GET",url,true);
	xmlhttp.onreadystatechange=function() {
	        if (xmlhttp.readyState==4) {
			current_requests--;
			for(var i=0;i<destination.length;i++){
				var dest=document.getElementById(destination[i]);
				
				dest.innerHTML=xmlhttp.responseText;
				if(debug!=false){
					debugIt(debug,"Reponse:"+xmlhttp.responseText);
				}
			}
			if(window.stopLoading){
				stopLoading();
			}
	       }else if(xmlhttp.readyState==1){
	       		current_requests++;
			//loading
			if(window.startLoading){
				startLoading();
			}
      		}
   	}
  	xmlhttp.send(data);
}


function print_ex(exc){
	return "An error occured \n" +
				"Message: " + exc.message + "\n" +
				"File: " + exc.fileName + "\n" +
				"Name: " + exc.name;
}


function loadUrlToSelect(url,data,destination,mapping,callback,debug){
	//var xmlhttp=get("loadUrlToSelect");
	var xmlhttp=get_X();
	var dest=document.getElementById(destination);
	if(debug!=false){
		data+="&debug=1";
	}
	xmlhttp.open("GET",url+"?"+data,true);
	try{
		//xmlhttp.setRequestHeader('Accept','message/x-formresult');
	}catch(e){
		if(debug!=false){
			debugIt(debug,print_ex(e));
		}
	}
	xmlhttp.onreadystatechange=function() {
		if (xmlhttp.readyState==null) {
			xmlhttp.readyState=1;
		}
	        if (xmlhttp.readyState==4) {
			current_requests--;
			
			if(debug!=false){
				debugIt(debug,"Status:"+xmlhttp.status);
			}
			
			try{
			if (xmlhttp.status == 200) {
				clearList(destination);
				if(debug!=false){
					debugIt(debug,"ReponseXML:"+xmlhttp.responseXML.xml);
				}
            			buildList(destination,xmlhttp.responseXML,mapping,debug);
				if(eval("window."+callback)){
					eval(callback+"();")
				}
         		} else {
           			alert("There was a problem retrieving the XML data:\n"+xmlhttp.statusText);
  			}
			}catch(e){
				if(debug!=false){
					debugIt(debug,print_ex(e));
				}
			}
			if(window.stopLoading){
				stopLoading();
			}

		}else if(xmlhttp.readyState==1){
			current_requests++;
			if(window.startLoading){
				startLoading();
			}
      		}
   	}
	try{
	  	xmlhttp.send(data);
	}catch(e){
		if(debug!=false){
			debugIt(debug,print_ex(e));
		}
	}
}
function clearList(destination) {
    var select=document.getElementById(destination);
    
    while (select.length > 1) {
        select.remove(select.length-1);
    }
}
function clearListe(select) {
    while (select.length > 1) {
        select.remove(select.length-1);
    }
}


function appendToSelect(select, value, content) {
    var opt;
    opt = document.createElement("option");
    opt.value = value;
    opt.appendChild(content);
    select.appendChild(opt);
}
function pushToSelect(select, value, content) {
    var opt;
    opt = document.createElement("option");
    opt.value = value;
    opt.appendChild(content);
    select.insertBefore(opt,select.firstChild);
    select.selectedIndex=0;
}





// TODO add a callback function
function buildList(destination,XML,mapping,debug){
    var elementsToSelect="item";
    if(mapping[0]!=null){
	elementsToSelect=mapping[0];
    }
    var attributeEl="name";
    if(mapping[1]!=null){
	attributeEl=mapping[1];
    }
    var valueEl="value";
    if(mapping[2]!=null){
	valueEl=mapping[2];
    }
    if(debug!=false){
	debugIt(debug,"Mapping:"+mapping);
    }
    var select = document.getElementById(destination);
    var items = XML.getElementsByTagName(elementsToSelect);
    if(debug!=false){
	debugIt(debug,"Items corresponding:"+items.length);
    }
    for (var i = 0; i < items.length; i++) {
        appendToSelect(select, getElementTextNS("",valueEl, items[i], 0),
            document.createTextNode(getElementTextNS("",attributeEl, items[i], 0)));
    }
}

function debugIt(debug,error){
	if(document.getElementById(debug)){
		document.getElementById(debug).innerHTML+=error;

	}
}

function validFormTo(frm,destination,debug,newUrl,callback) {
	var xmlhttp=get_X();
	var frm=document.getElementById(frm);
	var url=frm.action;
	if(newUrl!=null && newUrl!=""){
		var url=newUrl;
	}
	var method=frm.method;
	var data="";
	/*
	for(var i=0;i<frm.elements.length;i++){
		data+=frm.elements[i].name+"="+frm.elements[i].value+"&";
	}*/
	data=getFormValues(frm);
	if(debug==false){
		data+="&debug=1";
		debugIt(debug,"data:"+data);
	}
	var meth="GET";
	if(method=="post"){
		meth="POST";
	}
	if(meth=="GET"){
		url+="?"+data;
	}
	xmlhttp.open(meth,url,true);
	if(meth=="POST"){
		//xmlhttp.setRequestHeader("Method", "POST " + url+"?"+data + " HTTP/1.1");
		xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	}else{
		xmlhttp.setRequestHeader('Accept','message/x-formresult');
	}
	xmlhttp.onreadystatechange=function() {
		if (xmlhttp.readyState==4) {
			current_requests--;
	  		
			if(debug!=false){
				debugIt(debug,xmlhttp.responseText);
			}else{
				for(var i=0;i<destination.length;i++){
					var dest=document.getElementById(destination[i]);
					dest.innerHTML=xmlhttp.responseText;
				}
				if(callback!=false && eval('window.'+callback)){
					eval(callback+"()");
				}
			}
			if(window.stopLoading){
				stopLoading();
			}
			//dest.innerHTML=xmlhttp.responseText;
	        }
	        else if(xmlhttp.readyState==1){
			current_requests++;
			//loading
			if(window.startLoading){
				startLoading();
			}
		}
	}
	xmlhttp.send(data)
	return false
}

function getFormValues(fobj,valFunc)
    {
       var str = "";
       var valueArr = null;
       var val = "";
       var cmd = "";
       for(var i = 0;i < fobj.elements.length;i++)
       {
           switch(fobj.elements[i].type)
           {
               case "text":
                    if(valFunc)
                    {
                        //use single quotes for argument so that the value of
                        //fobj.elements[i].value is treated as a string not a literal
                        cmd = valFunc + "(" + 'fobj.elements[i].value' + ")";
                        val = eval(cmd)
                    }
                    str += fobj.elements[i].name +
                     "=" + escape(fobj.elements[i].value) + "&";
                     break;
	       case "checkbox":
			if(fobj.elements[i].checked==true){
				str += fobj.elements[i].name +
                     		"=" + escape(fobj.elements[i].value) + "&";
			}
	       		break;
               case "select-one":
                    str += fobj.elements[i].name +
                    "=" + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + "&";
                    break;
		default:
			str += fobj.elements[i].name +
                     "=" + escape(fobj.elements[i].value) + "&";
           }
       }
       str = str.substr(0,(str.length - 1));
       return str;
}

function getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
    if (prefix && isIE) {
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes 
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;    		
        }
    } else {
        return "-- Aucun --";
    }
}
