function loadXmlDoc(url, callback)
{
  var argv = [];
  var argc = arguments.length;
  
  if (argc > 2)
  {
    for (var i = 2; i < arguments.length; i++)
    {
      argv[i - 2] = arguments[i];
    }
  }
  
  loadDoc(url, callback, false, argv);
}

function loadTextDoc(url, callback)
{
  var argv = [];
  var argc = arguments.length;
  
  if (argc > 2)
  {
    for (var i = 2; i < arguments.length; i++)
    {
      argv[i - 2] = arguments[i];
    }
  }
  
  loadDoc(url, callback, true, argv);
}

function loadDoc(url, callback, asText, argv)
{
  var xmlDoc;
  
  if (window.ActiveXObject) // ie
  {
    if (asText)
    {
      xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
      xmlDoc.onreadystatechange = function () {if (xmlDoc.readyState == 4) callback(xmlDoc.responseText, argv)};
      
      xmlDoc.open("GET", url, false);
      xmlDoc.send(null);
    }
    else
    {
      xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.onreadystatechange = function () {if (xmlDoc.readyState == 4) callback(xmlDoc, argv)};
      
      xmlDoc.load(url);
    }
  }
  else if (window.XMLHttpRequest) // firefox and safari
  {
    xmlDoc = new XMLHttpRequest();
    
    if (xmlDoc)
    {
      xmlDoc.onreadystatechange = function()
      {
        if (xmlDoc.readyState == 4)
        {
          if (asText)
          {
            callback(xmlDoc.responseText, argv);
          }
          else
          {
            callback(xmlDoc.responseXML.documentElement, argv);
          }
        }
      };
      
      try
      {
        xmlDoc.open("GET", url, true);
        xmlDoc.send(null);
      }
      catch (e)
      {
        alert("Error loading " + url + "!");
      }
    }
  }
  else // doh!
  {
    alert("A modern browser is required for this functionality.");
  }
}

// this is the equivalent for retrieving data via http.
// it doesn't have to be an xml file, and probably won't be.
// just be sure to set the content type as text/xml in the header

function loadXmlDocViaHttp(url, callback)
{
  var xmlDoc;
  
  if (window.ActiveXObject)
  {
    xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else if (window.XMLHttpRequest)
  {
    xmlDoc = new XMLHttpRequest();
  }
  
  if (xmlDoc)
  {
    xmlDoc.onreadystatechange = function()
    {
      if (xmlDoc.readyState == 4)
      {
        if (xmlDoc.status == 200 || xmlDoc.status == 0)
        {
          xmlDoc = xmlDoc.responseXML.documentElement;
          callback(xmlDoc);
        }
        else
        {
          alert("An error occurred retrieving document.");
        }
      }
    };
    
    xmlDoc.open("GET", url, true);
    xmlDoc.send(null);
  }
}
