//no translations?
if (!TR) { var TR = function(t) { return t } }

/**
 * Create a new XML Http Request
 * Requires ActiveX in Internet Explorer
 *
 * @constructor
 */
function newXMLHttpRequest() {
  var xrq = false;

  if (window.XMLHttpRequest) {
    xrq = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    //IE
    try {
      xrq = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e1) {
      try {
        xrq = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
      	alert (TR("Please enable ActiveX in your browser"));
      }
    }
  }
  return xrq;
}

/**
 * Wrap request and result function in ReadyStateHandler
 * 
 * @param {newXMLHttpRequest} req
 * @param {Function} onRes result method
 * @param {DOMNode} tgt DOMNode to send to result method
 * @param {String} desc optional description
 * @return ready state handler pointer
 */
function getReadyStateHandler(req, onRes, tgt, desc, onError) {
	//show activity & measure timeout
	window.status = "AJAX:"+desc;
	
	return function () {
    if (req.readyState == 4) {
      if (req.status == 200) {
        onRes(req.responseXML, tgt);
      } else {
      	onError(req.status)
      }
    }
  }
}

/**
 * Make AJAX request
 * Call only this function directly!
 * always use MULTIPART if you are sending a lot of data or special characters
 * 
 * @param {Object} o all parameters as object
 * @param {String} o.service URL of service
 * @param {Object} o.params Parameters to send name:value
 * @param {Function} o.callBack result method 
 * @param {DOMNode} o.target DOMNode to send to result method
 * @param {String} o.description optional
 * @param {String} o.mode MULTIPART of XFORM
 * @param {Function} o.onError error fallback method
 * @param {Function} o.onNoAjax fallback method
 */
function ajax( o ) {

  if (typeof o != "object") alert("depricated use");

  //target body as source element if none other was defined
  if (!o.target) o.target = document.body;

  //show command url if no description was given
  if (!o.description) o.description = o.service;

  //set default mode
  if (!o.mode) o.mode = 'XFORM'
 
 //set error handler
  if (!o.onError) o.onError =  function (status) { alert(TR("HTTP error: ")+status) };
  
   //loosen security on mozilla
  try {
    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
   } catch (e) {}

  var req = newXMLHttpRequest();

  //no AJAX?

  if (!req) {
  		if (o.onNoAjax) o.onNoAjax(o);
  		else alert(TR("This function is not available for non AJAX-browsers:\n"+o.service+"\n"+o.description));
 		return;
  }

  var handlerFunction = getReadyStateHandler(req, o.callBack, o.target, o.description, o.onError);
  req.onreadystatechange = handlerFunction;
  
  //use GET if static xml
  if (o.service.indexOf(".xml") > -1 )
  	req.open("GET", o.service, true);
  else
  	req.open("POST", o.service, true);
  
  var s = "";

  if (o.mode == "MULTIPART") {
  	var d = new Date();
  	o.params.timestamp = d.getTime();
  	var boundary = "ambientia"+d.getTime();
  	req.setRequestHeader("Content-Type","multipart/form-data; charset=UTF-8; enctype=\"multipart/form-data\"; boundary="+boundary);
  	for(p in o.params) {
   		s += '--'+boundary+'\nContent-Disposition: form-data; name="'+p+'"\n\n'+o.params[p]+'\n\n';
  	}
  	s += '--'+boundary;  	
	req.setRequestHeader("Content-length", s.length+1);
  	req.setRequestHeader("Connection", "close");
  } else {
	  req.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	  for(p in o.params) { 
	    if (s.length) s += "&";
	  	s += p + "=" + escape(o.params[p]);
	  } 
  }
  req.send(s);
}

/**
 *  converts xmlNodeTree to similar DOMNodeTree
 *  
 *  @param {XMLNode} xml XMLNode to convert
 *  @return {DOMNode} conversion result as DOMNode
 */
function XML2DOM(xml) {	
	//create node
	if (xml.nodeType == 1)  {
		var dnode = document.createElement(xml.nodeName);
		//copy attributes
		if (xml.attributes) {
			for(var i = 0; i < xml.attributes.length; i++) {
				dnode.setAttribute(xml.attributes[i].name,xml.attributes[i].value);
				
				//IE has bug that prevents class attribute from working correctly
				if (isIE && xml.attributes[i].name == "class") {
					dnode.className = xml.attributes[i].value;
				}
			}
		}
	}
	else if (xml.nodeType == 3 || xml.nodeType == 4)	{
		//textnode or cdata
		var dnode = document.createTextNode(xml.nodeValue);
	}

	//recurse XML to copy contents
	for (var i = 0; i < xml.childNodes.length; i++) {
		dnode.appendChild( XML2DOM(xml.childNodes[i]) )
	}
	return dnode;
}

/**
 * @param {XMLNode} xml
 * @param {String} nodeName
 * @return value of first node of that nodeName
 */
function getValue(xml, nodeName) {
	return xml.getElementsByTagName(nodeName)[0].firstChild.nodeValue;
}




 

 
 
