// remoteXML.js
// library for creating requestor object and returning XML [or text]

// javascript requires this is done in a specific way to get encapsulation of functionality
// top function [sendUsernameRequest] is the only one that gets called from HTML
//  should be called in try ... catch loop

// results are returned to handleRequest function
//   a function with this name must exist on page that needs data from remote server
// handleResults processes the data from the server



// GLOBALS

var req = false;



// FUNCTIONS

// sends request off to server
// does minimal error checking on input
// errors are thrown up stack
function sendUsernameRequest( XMLrequest )
{

  var err;
  if ( ! XMLrequest )
  {
    err = new Error( 'invalid request passed in' );
    err.name = 'BadXMLrequestError';
    throw err;
  }

  try
  {
    req = getReq();
  }
  catch(err)
  {
    throw err;
  }
  
  if ( ! req )
  {
    err = new Error( 'could not get requestor' );
    err.name = 'NoXMLHTTPobjectError';
    throw err;
  }

  var handlerURL = '/wsrv/xml';
  
  req.onreadystatechange = populateRes;
  req.open( 'POST', handlerURL );
  req.send ( XMLrequest );
}



// returns requestor object or false on errors
// mostly from http://developer.apple.com/internet/webcontent/xmlhttpreq.html
function getReq()
{
  
  var err;
  
  // mozilla
  if ( window.XMLHttpRequest ) 
  {
    try 
    {
      req = new XMLHttpRequest();
    }
    catch(e)
    {
      err = new Error( e.message );
      err.name = e.name;
    }
  } 
  
  // ie
  else if ( window.ActiveXObject ) 
  {
    try 
    {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    } 
    catch(e) 
    {
      try 
      {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      } 
      catch(e)
      {
        err = new Error( e.message ); 
        err.name = e.name;
      }
    }
  }
  else
  {
    err = new Error( 'your browser does not support the javascript XML HTTP object' );
    err.name = 'noXMLHTTP';
  }
  
  if (
       ( ! req )
       &&
       ( err )
       &&
       ( err.message != '' )
     )
  {
    throw err;
  }
 
  return req;
}



// grabs data from remote server
// framework from http://developer.apple.com/internet/webcontent/xmlhttpreq.html
// returns XML obj if present
// passes off response to a function called handleResponse that is not a part of this library
function populateRes() 
{

  // "loaded" [download complete]
  if ( req.readyState == 4 ) 
  {
    
    var res;
    
    // "OK"
    if ( req.status == 200 ) 
    {
      if ( req.responseXML )
      {
        res = req.responseXML;        
      }
      else
      {
	res = req.responseText;
      }
    } 
    else 
    {
      res = 'error getting file from webserver';
      res += "\nstatus code: " + req.status;
      res += "\nstatus text: " + req.statusText;
    }
    
    handleResponse( res );
  }
}



