// fbk.js : feedback client/serveur  

/******************************************************************************
 * fonction sendRequest() dépendant navigateur (pompé et rassemblé le 28 novembre 2010) 
 * pompé de quirksmode.com 
 * 
 * 29/11/2010 suite 
 * il était possible d'envoyé des données GET par url en fesant '?var1=1&var2=2' 
 * en même temps que des données POST en remplissant data 
 * mais ça cassait la flexibilité de la méthode GET/HEAD vs POST
 * de toute façon je vois pas l'intérêt 
 * en tout cas le httpLogger.php log GET ou POST ou les deux 
 *  
 * USAGE : 
 * mapData est un map du style {"var1":"blabla","var2":"blibli"} 
 * si url est '' alors pas d'envoie
 * Pour envoyé des données n'utilisé QUE data (pour plus flexibilité entre les méthodes) 
 *  
 * EXEMPLE :     
 * sendRequest('.',alert,'POST',{'var1':'blabla','var2':'superblabla'},true)   
 *         
 ******************************************************************************/
function sendRequest(url,callback,method,mapData,async) {
	var req = false;
	var factories = [
		function () {return new XMLHttpRequest()},
		function () {return new ActiveXObject("Msxml2.XMLHTTP")},
		function () {return new ActiveXObject("Msxml3.XMLHTTP")},
		function () {return new ActiveXObject("Microsoft.XMLHTTP")}
	];
	for (var i=0;i<factories.length;i++) {
		try {
			req = factories[i]();
		}	catch (e) {
			continue;
		}
		break;
	}
	if (!req || url=='' ){
		dbgVar={"req":req,"url":url}  ;//alertVar(dbgVar)
	  return dbgVar;
	} 
	var data="isXMLHttpRequest=1&" // pour différencier d'une requete classique
  for(id in mapData){            // mapData format to data request
  	data+=id+'='+mapData[id]+'&'
  }
  data=data.substr(0,data.length-1) 		// pour virer le dernier '&' 
	if (method=='GET' || method=='HEAD'){ 
		url=url.substr(0,url.indexOf('?'))  // drop url data 
		url=url+'?'+data                    // add data to url 
		data=null                           // no post data
	}
	req.open(method,url,async);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (method=='POST'){
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	}
	req.onreadystatechange = function () {
		if (req.readyState != 4){ return;}
		if (req.status != 200 && req.status != 304) {
			dbgVar={"msg":'HTTP error',"status":req.status}  ;//alertVar(dbgVar)
			return dbgVar;
		}
		callback(req);
	}
	if (req.readyState == 4){
	  dbgVar={"readyState":req.readyState}  ;alertVar(dbgVar)
		return dbgVar;
	} 
	
	req.send(data);
}

/******************************************************************************
 * fonction dataFromClient() dépendant navigateur (codé le 01/01/2011) 
 * parse le formulaire passé en argmument et en sort un tableau(map) name => value 
 * tout les entrées qui ne sont pas nommé sont ignoré (exemple : input submit seul) 
 * exemple usage : /!\ this.parentNode dans champ donne le form  
 * <input onclick="sendRequest('./getPropBrowser.php',feedbackFromServer,'POST',dataFromClient(this.parentNode),true)" type="submit" value="Submit" />  
 ******************************************************************************/
function dataFromClient(refForm){
	data={}
	for(i=0;i<refForm.elements.length;i++){  // foreach fields (input,select, and other ...)
		curElem=refForm.elements[i]
		if(curElem.name!=""){
		  if(curElem.type!="checkbox"){
        data[curElem.name]=curElem.value
      }else{
        data[curElem.name]=(curElem.checked)?1:0
      }
		}			
	}		
	return data
}

/******************************************************************************
 * fonction parseXml() dépendant navigateur (repompé le 1 novembre 2010) 
 * parse un document xml (par exemple qui serait formé par le serveur)
 * et renvoie un pointeure sur la racine à exploré par des childNodes     
 ******************************************************************************/ 
function parseXml(xml){ // http://www.w3schools.com/xml/xml_parser.asp
  doc=null;
  if (window.ActiveXObject){ // code for IE
    var doc=new ActiveXObject("Microsoft.XMLDOM");
    doc.async="false";
    doc.loadXML(xml);
  }else{ // code for Mozilla, Firefox, Opera, etc.
    var parser=new DOMParser();
    // PB GECKO with text node between nodes http://blogs.developpeur.org/cyril/archive/2005/04/12/5861.aspx
    // I have discovered this problem with the index array in childnode in GECKO : for(i=1;i<x.childNodes.length;i=i+2) instead of for(i=0;i<x.childNodes.length;i++)
    // to test : parse for test at http://www.chouette.info/testdom/          
    xml=xml.replace(/>[ \t\r\n\v\f]*</gi, '><');
    var doc=parser.parseFromString(xml,"text/xml");
  }
  return doc.documentElement;
}

