
/*
  -----------------------------
  WHAT:   SIMPLE AJAX FRAMEWORK
  AUTHOR: ERIC NORDENG
  DATE:   05-09-2006
  -----------------------------
  
  This framework requires the following global variables to be used in your code:
  
   => objReq              [ XMLHttpRequest Object ]
   => displayDivID        [ Area to display messages while server pages are processing ]
   => displayMessage      [ Message to display while server pages are processing ] 
   => parseResponseFunc   [ Name of function to call when server pages are done processing ]
                          [ This should be set right before sendXMLHttpRequest is called ]
                          [ Set it to blank ('') if nothing should run ]
   
   
   An example of your code may look something like this:
   
    // GLOBAL AJAX VARIABLES
    var objReq;
    var parseResponseFunc;
    var displayDivID = "requestStatus";
    var displayMessage = "Please Wait...";
    
    function buttonClicked()
    {
      // CREATE DOCUMENT OBJECT FOR XML
      var objXMLDoc = createDocumentObject('','');

      // BUILD XML FOR SERVER PAGE TO PARSE
      addNode(objXMLDoc,'nodeName','nodeValue');

      // SEND REQUEST TO SERVER
      parseResponseFunc = "doSomething()";
      sendXMLHttpRequest('serverPage.asp',objXMLDoc,true);
    }
*/

/* ------------------------------------------------------------------------------------- */

function sendXMLHttpRequest(url,objXMLDoc,async)
{
  createRequestObject();
  objReq.open("post", url, async);
  objReq.onreadystatechange = handleStateChange;
  objReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;');
  objReq.send(objXMLDoc);
}

/* ------------------------------------------------------------------------------------- */

function createRequestObject()
{
  objReq = null;
  if (window.ActiveXObject)
  {
    objReq = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else if (window.XMLHttpRequest)
  {
    objReq  = new XMLHttpRequest();
  }
}

/* ------------------------------------------------------------------------------------- */

function handleStateChange()
{
  if (objReq.readyState == 4)
  {
    if (objReq.status == 200)
    {
      eval(parseResponseFunc);
      changeInnerHTML(displayDivID,"&nbsp;");
    }
    else
    {
      changeInnerHTML('errors',objReq.responseText);
    }
  }
  else
  {
    changeInnerHTML(displayDivID,displayMessage);
  }
}

/* ------------------------------------------------------------------------------------- */

function createParserObject(strXML)
{  
  var browser = navigator.appName;
  
  if (browser == "Microsoft Internet Explorer")
  {
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.loadXML(strXML);
  } 
  else
  {
    var objDOMParser = new DOMParser();
    var xmlDoc = objDOMParser.parseFromString(strXML,"text/xml");
  }
  return xmlDoc;
}

/* ------------------------------------------------------------------------------------- */

function createDocumentObject(nameSpace,rootName)
{
  var xmlDoc;
  var browser = navigator.appName;
  
  if (rootName.length == 0)
  {
    rootName = "XMLroot";
  }
  
  if (browser == "Microsoft Internet Explorer")
  {
    xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.loadXML("<" + rootName + "/>");
  } 
  else
  {  
    xmlDoc = document.implementation.createDocument(nameSpace,rootName,null);
    if (xmlDoc.documentElement == null)
    {
      xmlDoc.appendChild(xmlDoc.createElement(rootName));
    }
    if (navigator.userAgent.indexOf("Safari") == -1)
    {
      // STANDARDIZE the loadXML FUNCTION AND THE xml PROPERTY
      Document.prototype.loadXML = function(strXML)
      {
        var objDOMParser = new DOMParser();
        var objDoc = objDOMParser.parseFromString(strXML,"text/xml");
      }
  
      Document.prototype.__defineGetter__("xml", function () 
      {
         return (new XMLSerializer()).serializeToString(this);
      });
    }
  }
  return xmlDoc;
}

/* ------------------------------------------------------------------------------------- */

function addNode(XMLDoc,name,val)
{
  if (val == '&')
  {
    val = replace(val,'&','&amp;');
  }
  if (val == '"')
  {
    val = replace(val,'"','&quot;');
  }
  if (val == '<')
  {
    val = replace(val,'<','&lt;');
  }
  if (val == '>')
  {
    val = replace(val,'>','&gt;');
  }
  var root = XMLDoc.documentElement;
  var newNode = XMLDoc.createElement(name);
  var newTextNode = XMLDoc.createTextNode(val);
  newNode.appendChild(newTextNode);
  root.appendChild(newNode);
}

/* ------------------------------------------------------------------------------------- */

function getNodeVal(objParser,nodeName)
{
  if (objParser.getElementsByTagName(nodeName)[0].firstChild)
  {
    return objParser.getElementsByTagName(nodeName)[0].firstChild.nodeValue;
  }
  else
  {
    return "";
  }
}

/* ------------------------------------------------------------------------------------- */

function changeInnerHTML(divId,html)
{
  if (document.getElementById)
  {
    document.getElementById(divId).innerHTML= html;
  }
  else
  {
    document.layers[divId].document.open();
    document.layers[divId].document.write(html);
    document.layers[divId].document.close();
  }
}

/* ------------------------------------------------------------------------------------- */