var xmlHttp;
	var cb_object;
	var cb_function;
	var startTag;
	var paramTag = null;
	var xmlHttp=null;
	var success;
	
	function XML_node ( obj ){
		//begin processing of branch
		var l = 0 ;
		var aName = new Object;;
		var tmp_buf = obj.childNodes ;
		
		try {
				if((obj.firstChild.nodeValue.indexOf("\n") == -1) || (obj.firstChild.nodeValue.indexOf("\n") > 1)){
					this.value = obj.firstChild.nodeValue ;
				}
		} catch (er) {};
		
		//get attributes
		if (obj.attributes != null){
			for (tmp = 0; tmp < obj.attributes.length; tmp++){
				this[obj.attributes[tmp].nodeName.toLowerCase()] = obj.attributes[tmp].nodeValue;	
			}
		}
		
		//get all child nodes
		for ( l=0 ; ( l < tmp_buf.length ) ; l++ ) {
			
			if (tmp_buf[l].nodeName != null) {
				if ( this[ tmp_buf[l].nodeName.toLowerCase() ] == undefined ) {
					//node is new
					this[ tmp_buf[l].nodeName.toLowerCase() ] = new XML_node( tmp_buf[l] ) ;
				} else if ( this[ tmp_buf[l].nodeName.toLowerCase() ] instanceof Array ) {
					//node exists and is already an array
					this[ tmp_buf[l].nodeName.toLowerCase() ].push( new XML_node( tmp_buf[l] ) ) ;
				} else {
					//node exists but is not an array
					var tmp = this[ tmp_buf[l].nodeName.toLowerCase() ] ;
					this[ tmp_buf[l].nodeName.toLowerCase() ] = new Array() ;
					this[ tmp_buf[l].nodeName.toLowerCase() ].push( tmp ) ;
					this[ tmp_buf[l].nodeName.toLowerCase() ].push( new XML_node( tmp_buf[l] ) ) ;
				} 
			}
		}
		//alert(this);
		return this;
	}
	
	function stateChanged() 
	{ 
		if (xmlHttp.readyState == 4){
			if (xmlHttp.status == 200) {
				
				success = true;		
				matchData = parse(trimXML(xmlHttp.responseText), startTag);
				eval(cb_function)(matchData);
			} else {
				
				success = false;
				matchData = parse(trimXML(xmlHttp.responseText), startTag);
				eval(cb_function)(matchData);
			}
		}
	}
	
	function loadXML(url)
	{
		try
		  {
		  // Firefox, Opera 8.0+, Safari
		  xmlHttp=new XMLHttpRequest();
		  }
		catch (e)
		  {
		  // Internet Explorer
		  try
			{
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
			}
		  catch (e)
			{
			xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}
		  }
		if (xmlHttp==null)
		  {
		  alert ("Your browser does not support AJAX!");
		  return;
		  }
		  
		 
		if (paramTag == "null"){
			url=url+"?random="+Math.random();
			xmlHttp.onreadystatechange=stateChanged;
			xmlHttp.open("get",url,true);
			xmlHttp.send(null);
			
		} else {
			//alert(paramTag)
			//var my = "<FORM NAME=\"TestDrive\"><ACTION>1</ACTION><FIELDS><FIELD NAME=\"Obs-Cap\"><VALUE>adsfsadfas</VALUE></FIELD><FIELD NAME=\"OBS-Address1\"><VALUE>sdfasd</VALUE></FIELD></FIELDS></FORM>";
			xmlHttp.onreadystatechange=stateChanged;
			xmlHttp.open("POST",url + "?random=" +escape(Math.random()) ,true);
			xmlHttp.setRequestHeader("content-type", "application/x-www-form-urlencoded");
			xmlHttp.send("xmlForm=" + escape(paramTag).replace(/%25/g,"%"));
			//xmlHttp.send("xmlForm=" +escape(my));
			//alert(xmlHttp.responseText.replace(/^\s+/, ''));
		}
	}
	
	function parse( XMLdocument, startTag) {
		var retval = new Object() ;
		var startNode= XMLdocument ;
	
		if ( success == true && startTag != undefined && startTag != startNode.nodeName.toLowerCase() ) {
			//if there is a result find first node according to stored value
			startNode = this.find_child_node( XMLdocument, startTag ) ;
		}
		if ( success == true && startNode.hasChildNodes ) {
			retval[ "status" ] = { value: 0, msg: "" } ;
			retval[ startNode.nodeName.toLowerCase() ] = new XML_node( startNode ) ;
		} else  {
			//if unsuccessful format error information
			retval[ "status" ] = { value: -1, msg: "Impossibile stabilire una connessione con il server, riprova pił tardi" } ;
		}
		
		return retval;
	}
	
	
	function find_child_node ( node, childName ) {
		var retval    = new Object() ;
		var l         = 0 ;
		var tmp_buf = node.childNodes ;
	
		if ( node.hasChildNodes ) {
			for ( l=0 ; ( l < tmp_buf.length ) && ( retval != undefined ) ; l++ ) { 
				if ( tmp_buf[l].nodeName.toLowerCase() == childName ) {
					//if found stop and return
					retval = tmp_buf[l] ;
					break ;
				} else if ( tmp_buf[l].hasChildNodes ) {
					//otherwise follow branch
					retval = this.find_child_node( tmp_buf[l], childName ) ;
				}
			}
		}
		return ( retval ) ;
	}
	
	function xml_data_load(funct,tag, url,param){
		cb_function   = ( funct != undefined ) ? funct : "callback" ;
		//stores the name of the XML tag from which to start reading
		startTag = ( tag != undefined ) ? tag.toLowerCase() : "xml" ;
		//se ci sono parametri li passo
		paramTag = ( param != null ) ? param : "null" ;
		//starts data acquisition
		loadXML( ( url != undefined ) ? url : this.cmdURL ) ;
	}
	
	function trimXML(stringa){
		var _xmlTmp = stringa.replace(/^\s+/, '');
		
		try{
			xmlDoc= new DOMParser().parseFromString(_xmlTmp, 'application/xml');
		} catch(er){
			var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.loadXML(_xmlTmp);
		}
		
		return xmlDoc;
	}