var xmlConnection = null
var connectionTimer = null
var kMaxRetries = 8
var noOfRetries = 0
var kTimeout = 15000 // 15 seconds
var kGetValueCGI = "a_getvalue.cgi"

function GetXmlHttpObject()
{
  var xmlHttp=null
  
  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");
    }
  }
  return xmlHttp;
}

function buildQueryString(params)
{
  var query = "";
  for (var i = 0; params != null && i < params.length; i++)
  {
    query += (i > 0 ? "&" : "")
      + encodeURIComponent(params[i].name) + "="
      + encodeURIComponent(params[i].value);
  }
  return query;
}

function loadXMLDoc (url, params, bAsync)
{
  if (bAsync == null) bAsync = true
  if (params) url += "?" + buildQueryString(params)
  xmlConnection = GetXmlHttpObject ()

  if (xmlConnection)
  {
    try
    {
      if (bAsync) 
         xmlConnection.onreadystatechange = processReqChange;
         
      xmlConnection.open("GET", url, bAsync);
      xmlConnection.setRequestHeader("Accept","text/xml");
      xmlConnection.setRequestHeader("If-Modified-Since",
                                     "Sat, 1 Jan 2000 00:00:00 GMT");
      xmlConnection.setRequestHeader("Cache-Control","no-cache");
      xmlConnection.send("");
      
      if (bAsync) 
        connectionTimer = setTimeout ("OnTimeout ()", kTimeout)
      else 
        connectionTimer = null
    }
    catch (e)
    {
      alert ("loadXMLDoc: Something is wrong \"" + e.description + "\"")
    }
  }
}

function getVariable (variable)
{
  data = [{name: "variable", value: variable}]
  return execCGIGet (kGetValueCGI, data)
}

function serialize(dom)
{
  var xml = dom.xml;
  if (xml == undefined)
  {
    try
    {
      var serializer = new XMLSerializer();
      xml = serializer.serializeToString(dom);
      delete serializer;
    }
    catch (error)
    {
      if (debug) alert("DOM serialization is not supported.");
    }
  }
  return xml;
}

function execCGIGet (cgi, data)
{
  loadXMLDoc (cgi, data, false)
  return xmlConnection.responseText
}

function Response(sResponse)
{
    this.GetData = GetData
    this.IsSuccess = IsSuccess
    this.IsRebooting = IsRebooting
    this.Initialize = Initialize
    var m_arrData = null
    var m_bStatus = null
    
    this.Initialize(sResponse)
    
    function Initialize(sResponse)
    {   
        var xmlResponse
        try //Internet Explorer
        {
          xmlResponse=new ActiveXObject("Microsoft.XMLDOM")
          xmlResponse.async="false"
          xmlResponse.loadXML(sResponse)
        }
        catch(e)
        {
          try //Firefox, Mozilla, Opera, etc.
          {
            parser=new DOMParser()
            xmlResponse=parser.parseFromString(sResponse,"text/xml")
          }
          catch(e)
          {
            return
          }
        }    
        m_arrData = new Array()
        m_bStatus = (xmlResponse.getElementsByTagName ("response")[0].getAttribute("status") == "SUCCESS")
        m_bReboot = IsTrue(xmlResponse.getElementsByTagName ("response")[0].getAttribute("rebooting"))
        var arrData = xmlResponse.getElementsByTagName ("data")
        for (var nIndex = 0; nIndex < arrData.length; nIndex++)
        {
          xmlData = arrData [nIndex]
          m_arrData[nIndex] = xmlData.childNodes[0].nodeValue
        }    
    }
    
    function GetData()
    {
        if(m_arrData == null)
            return
        
        var sData = ""
		
        for (var nIndex = 0; nIndex < m_arrData.length; nIndex++)
        {
			var tmpArray = new Array()
			tmpArray = m_arrData[nIndex].split(' ')
			if(tmpArray.length > 1)
			{
				for(var nArrayIndex = 0; nArrayIndex < tmpArray.length; nArrayIndex++)
				{
		            try
		            {
		                sData += eval(tmpArray[nArrayIndex]) + " "
		            }
		            catch(e)
		            {
		                sData += tmpArray[nArrayIndex] + " "
		            }
				}
				sData += "<br />"
			}
			else
			{
	            try
	            {
	                sData += eval(m_arrData[nIndex]) + "<br />"
	            }
	            catch(e)
	            {
	                sData += m_arrData[nIndex] + "<br />"
	            }
			}
        }
        return sData
    }
    
    function IsSuccess()
    {
        return m_bStatus
    }    
    
    function IsRebooting()
    {
        return m_bReboot
    }  
}

function execPost (form, bAsync)
{
  post (form.action, form.elements, bAsync)
  return new Response(xmlConnection.responseText) 
}

function post (url, data, bAsync)
{
  xmlConnection = GetXmlHttpObject ()
  
  // If bAsync is null or not defind make it false.
  if (!bAsync) bAsync = false
    
  if(xmlConnection)
  {
    try
    {
      if (bAsync) xmlConnection.onreadystatechange = processReqChange;
      xmlConnection.open("POST", url, bAsync)
      xmlConnection.setRequestHeader("Content-Type",
                                   "application/x-www-form-urlencoded")
      xmlConnection.send(buildQueryString(data))
    }
    catch (e)
    {
      alert (WEB_ERROR_CONNECTING)
    }
  }
}

function postXMLDoc(url, xml, bAsync)
{
  if (!typeof xml == "string") xml = serialize (xml)
  var data = [{name: "xml", value: xml}]
    
  post (url, data, bAsync)
}

function postABKCommand (command, xml, bAsync)
{
  if (typeof xml != "string")
  {
    xml = serialize (xml)
    //alert (xml)
  }
  var data = [{name: "command", value: command},
              {name: "xml", value: ((xml) ? xml : "")}]
  var index
  
  for (index = 3; index < arguments.length; index++)
  {
    if (arguments[index]) data[data.length] = {name: "arg" + (index-2), value: data[data.length]}
  }
  post ("a_abkcommand.cgi", data, bAsync)
}

function OnTimeout ()
{
  //alert ("OnTimeout ()")
  if (xmlConnection) xmlConnection.abort ()
  clearTimeout (connectionTimer)
  
  if (noOfRetries == kMaxRetries && confirm (WEB_XMLDATA_PROBLEM))
  {
    noOfRetries = -1 // set to -1 so the test bellow will set it 0
  }
  
  if ((noOfRetries++ < kMaxRetries))
  {
    if (GetData != undefined) GetData ()
    else alert ("You must define a function called GetData ()")
  }
}

function processReqChange()
{
  var status
  // only if xmlConnection shows "loaded"
  if (xmlConnection && xmlConnection.readyState == 4)
  {
    // only if "OK"
    try {status = xmlConnection.status} catch (e) {status = 0}
    if (status == 200)
    {
      if (connectionTimer) clearTimeout (connectionTimer)
      noOfRetries = 0
        // This function must be defined inside the file that loads the xml document.
      if (ProcessXMLData != undefined) ProcessXMLData ()
      else alert ("You must define a function called ProcessXMLData ()")
    }
    else
    {
      //alert (status)
      //OnTimeout ()
    }
  }
}
function escapeXML(content) {
    if (content == undefined)
        return "";
    if (!content.length || !content.charAt)
        content = new String(content);
    var result = "";
    var length = content.length;
    for (var i = 0; i < length; i++) {
        var ch = content.charAt(i);
        switch (ch) {
            case '&':
                result += "&amp;";
                break;
            case '<':
                result += "&lt;";
                break;
            case '>':
                result += "&gt;";
                break;
            case '"':
                result += "&quot;";
                break;
            case '\'':
                result += "&apos;";
                break;
            default:
                result += ch;
        }
    }
    return result;
}
function attribute(name, value) {
    return " " + name + "=\"" + escapeXML(value) + "\"";
}

function buildXMLString(base, attributes)
{
  var xmlString = "<"+base
  for (var i = 0; i < attributes.length; i++)
  {
    if (attributes[i])
      xmlString += attribute (attributes[i].name,
                   getUnicodeString(attributes[i].value))
  }
  xmlString += "></"+base+">"
  
  return xmlString
}

