
function GetXmlHttpObject() {
  var obj = null;
  if (window.XMLHttpRequest)
    obj = new XMLHttpRequest();
  else if (window.ActiveXObject) 
    obj = new ActiveXObject("Microsoft.XMLHTTP");

  return obj;
}

function ajaxGetCall(url, params, after)
{
  xmlHttp = GetXmlHttpObject();

  if (xmlHttp == null) return;
  
	var requestTimer 
  
  xmlHttp.onreadystatechange = function() 
  {
    if (xmlHttp.readyState != 4) return
	  if (requestTimer != null) clearTimeout(requestTimer)
		if (xmlHttp.status != 200) {
		  alert("server error")
			return
		}
		if (after != null) after();
  }

	if (params != null) url += "?" + params
  
	requestTimer = 
	  setTimeout(
	    function() { xmlHttp.abort(); alert("time out") }, 5000 
		)

  xmlHttp.open("GET", url, true)
  xmlHttp.send(null)
}

// for backward-compatibility with previous incarnation
function ajaxCall(url, after){ ajaxGetCall(url,null,after) }


function ajaxPostCall(url, params, after)
{
  xmlHttp = GetXmlHttpObject();

  if (xmlHttp == null) return;
  
	var requestTimer 
  
  xmlHttp.onreadystatechange = function() 
  {
    if (xmlHttp.readyState != 4) return
	  if (requestTimer != null) clearTimeout(requestTimer)
		if (xmlHttp.status != 200) {
		  alert("server error")
			return
		}
		if (after != null) after();
  }

	if (params != null) url += "?" + params
  
	requestTimer = 
	  setTimeout(
	    function() { xmlHttp.abort(); alert("time out") }, 5000 
		)
		
  xmlHttp.open( "POST", url, true ); 
  xmlHttp.setRequestHeader( 
    'Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8' 
  )
  xmlHttp.send(params)
}

function urlencode(str) {
  var newstr = escape(str);
  newstr = newstr.replace(/\+/g, "%2B");
  newstr = newstr.replace(/\//g, "%2F");
  return newstr;
}
