AjaMyAjax Site

AjaMyCore.js source listing

/***
 **  AjaMyAjax --> CORE AJAX functions library
 **
 **  This software provided "AS IS," but is FREE to use and share.
 **  For details see the as-is doc and Creative Commons license:
 **  http://creativecommons.org/licenses/by-sa/3.0/
 **
 **  See doc.txt or examples.html for syntax and more info at
 **  http://AjaMyAjax.com, (c) Mark Omohundro
 */

/**
 ** constructor and public variables:
 */

var pbcheckBrowserScript = true;
var pbshowAlertMsgs = true;
var pbshowStartUpIcon = true;
var pbCoreLibReady = false;
var pbXMLLibReady = false;
var pbXSLLibReady = false;
var pbJSONLibReady = false;
var pbChartLibReady = false;
var pbMyLibReady = false;

var pbCoreLibHeader = "[AjaMyAjax Core Lib]";

var AjaMyAjax = function() {
  /**
   ** xhr callback method:
   */
  this.processResponse = function(xhrResp) {
    var strurl = (arguments[1]) ? arguments[1] : null;
    var strcontainer = (arguments[2]) ? arguments[2] : null;
    var strprocessType = (arguments[3]) ? arguments[3] : null;
    var stroutputFormat = (arguments[4]) ? arguments[4] : null;
    var strSearchElement = (arguments[5]) ? arguments[5] : null;
    var strSTSValue = (arguments[6]) ? arguments[6] : null;
    var strSTSKey = (arguments[7]) ? arguments[7] : null;

    var stateComplete = 4;
    var statusOk = 200;
    var statusNotFound = 404;

    if (!xhrResp || xhrResp.readyState < stateComplete) {
      return;
    }

    try {
      if (xhrResp.readyState == stateComplete) {
        if (xhrResp.status == statusOk) {
          if (strcontainer && strprocessType) {

            if (strSTSValue) {
              // AjaMyAjax Simple Text Security (STS)
              // custom file checksum routine to validate
              // your document or data file's authenticity
              if (!isNaN(strSTSValue)) {
                var securityVerified = false;
                var docKey = 0, docText = "";

                if (strprocessType.substr(0,1) === "X") {
                  // xml, xsl response
                  var nodeText = xhrResp.responseXML.getElementsByTagName('*').item(0);
                  docText = aja_getXmlNodeText(nodeText);

                  docKey = aja_sumAlphaNumChars(docText);
                  if (docKey == strSTSValue) {
                    securityVerified = true;
                  }
                  nodeText = null;
                }
                else {
                  // all other text reponses
                  docText = xhrResp.responseText;

                  docKey = aja_sumAlphaNumChars(docText);
                  if (docKey == strSTSValue) {
                    securityVerified = true;
                  }
                }
                docText = null;

                // (you will need an initial STS Value to get here..)
                // un-comment this line to get your doc's initial key value:
                //alert(strurl + " " + docKey);

                // or this of the above value in a simple encoded form:
                //alert(strurl + " " + aja_encodeNum(docKey));

                // or this with your additional encoding key:
                //alert(strurl + " " + aja_encodeNum(docKey, strSTSKey));

                if (!securityVerified) {
                  // optional check #2: test for an encoded key match
                  if (strSTSKey) {
                    if (aja_encodeNum(docKey, strSTSKey) == strSTSValue) {
                      securityVerified = true;
                    }
                  }
                  else {
                    if (aja_encodeNum(docKey) == strSTSValue) {
                      securityVerified = true;
                    }
                  }

                  if (!securityVerified) {
                    xhrResp.abort();
                    aja_empty(strcontainer);
                    if (pbshowAlertMsgs) {
                      aja_alertMsg(pbCoreLibHeader, "Security check failed for " + strurl);
                    }
                    if (xhrResp) {
                      xhrResp = null;
                    }
                    return;
                  }
                }
              }
            }

            // XML, XSLT, JSON processing; otherwise standard output
            switch (strprocessType) {
              case "XML":
                if (pbXMLLibReady) {
                  if (stroutputFormat === "CHART") {
                    if (pbChartLibReady) {
                      processChart(xhrResp.responseXML, strurl, strcontainer,
                                   stroutputFormat, strSearchElement, "XML");
                    }
                    else {
                      xhrResp.abort();
                      aja_empty(strcontainer);
                      if (pbshowAlertMsgs) {
                        aja_alertMsg(pbCoreLibHeader, "Error in Chart Lib load");
                      }
                    }
                  }
                  else {
                    processXML(xhrResp.responseXML, strurl, strcontainer,
                               stroutputFormat, strSearchElement);
                  }
                }
                else {
                  xhrResp.abort();
                  aja_empty(strcontainer);
                  if (pbshowAlertMsgs) {
                    aja_alertMsg(pbCoreLibHeader, "Error in XML Lib load");
                  }
                }
                break;

              case "XSL":
                if (pbXSLLibReady) {
                  processXSL(xhrResp.responseXML, strurl, strcontainer,
                             stroutputFormat);
                }
                else {
                  xhrResp.abort();
                  aja_empty(strcontainer);
                  if (pbshowAlertMsgs) {
                    aja_alertMsg(pbCoreLibHeader, "Error in XSL Lib load");
                  }
                }
                break;

              case "JSON":
                if (pbJSONLibReady) {
                  if (stroutputFormat === "CHART") {
                    if (pbChartLibReady) {
                      processChart(xhrResp.responseText, strurl, strcontainer,
                                   stroutputFormat, strSearchElement, "JSON");
                    }
                    else {
                      xhrResp.abort();
                      aja_empty(strcontainer);
                      if (pbshowAlertMsgs) {
                        aja_alertMsg(pbCoreLibHeader, "Error in Chart Lib load");
                      }
                    }
                  }
                  else {
                    processJSON(xhrResp.responseText, strcontainer,
                                strSearchElement);
                  }
                }
                else {
                  xhrResp.abort();
                  aja_empty(strcontainer);
                  if (pbshowAlertMsgs) {
                    aja_alertMsg(pbCoreLibHeader, "Error in JSON Lib load");
                  }
                }
                break;

              case "MYLIB":
                if (pbMyLibReady) {
                  processMyFunctions(xhrResp.responseXML, xhrResp.responseText,
                                     strurl, strcontainer, stroutputFormat,
                                     strSearchElement, strSTSValue, strSTSKey);
                }
                else {
                  xhrResp.abort();
                  aja_empty(strcontainer);
                  if (pbshowAlertMsgs) {
                    aja_alertMsg(pbCoreLibHeader, "Error in Custom Lib load");
                  }
                }
                break;

              default:
                aja_fill(strcontainer, xhrResp.responseText);
            }
          }
          else {
            xhrResp.abort();
            aja_empty(strcontainer);
            if (pbshowAlertMsgs) {
              aja_alertMsg(pbCoreLibHeader, "Data destination or output unspecified for " + strurl);
            }
          }
        }
        else if (xhrResp.status == statusNotFound) {
          xhrResp.abort();
          aja_empty(strcontainer);
          if (pbshowAlertMsgs) {
            aja_alertMsg(pbCoreLibHeader, strurl + " not found for data request");
          }
        }
        else {
          xhrResp.abort();
          aja_empty(strcontainer);

          if (pbshowAlertMsgs) {
            // provide user with a generic alert msg
            // for a "not found" from a PHP response
            if (strprocessType === "PHP") {
              aja_alertMsg(pbCoreLibHeader, "No data found for this selection");
            }
            else {
              aja_alertMsg(pbCoreLibHeader, "Sorry, cannot retrieve data requested for " + strurl);
            }
          }
        }
      }
    }
    catch (e) {
      xhrResp.abort();
      if (strcontainer) {
        aja_empty(strcontainer);
      }
      if (pbshowAlertMsgs) {
        aja_alertMsg(pbCoreLibHeader, "Sorry, an unexpected error occurred during processing of " + strurl);
      }
      if (e.description) {
        if (pbshowAlertMsgs) {
          aja_alertMsg("Gen Error", e.description);
        }
      }
    }
    // clean up after:
    try {
      if (strurl) strurl = null;
      if (strcontainer ) strcontainer = null;
      if (strprocessType) strprocessType = null;
      if (stroutputFormat) stroutputFormat = null;
      if (strSearchElement) strSearchElement = null;
      if (strSTSValue) strSTSValue = null;
      if (strSTSKey) strSTSKey = null;
    }
    finally {
      xhrResp = null;
    }
  } // end of processResponse

  /**
   ** public utility functions:
   */
  aja_fill = function(strcontainer, strtext) {
    if (strtext) {
      document.getElementById(strcontainer).innerHTML = strtext;
    }
  }

  aja_empty = function(strcontainer) {
    document.getElementById(strcontainer).innerHTML = "";
  }

  aja_cloak = function(strcontainer) {
    // called first at times, so check container
    if (strcontainer) {
      document.getElementById(strcontainer).style.visibility = "hidden";
    }
  }

  aja_reveal = function(strcontainer) {
    if (strcontainer) {
      document.getElementById(strcontainer).style.visibility = "visible";
    }
  }

  aja_alertMsg = function() {
    var strtitle = (arguments[0]) ? arguments[0] : "Unknown Error";
    var strmsg = (arguments[1]) ? arguments[1] : "program id #501";
    alert(strtitle + "\r\n" + strmsg);
  }

  // AjaMyAjax Simple Text Security (STS)
  // sums alphanumerics only for speed
  aja_sumAlphaNumChars = function(txt) {
    var regexp = /[a-zA-Z0-9]/;
    var charsum = 0;
    // sum unicode values found in text:
    for (var i=0; i < txt.length; i++) {
      if (regexp.test(txt.charAt(i))) {
        charsum += txt.charCodeAt(i);
      }
    }
    return charsum;
  }

  // simple encoding of a numeric key
  // as an additional security measure
  // (uses your key or Math.PI by default)
  aja_encodeNum = function(num, yourvalue) {
    if (num) {
      if (isNaN(num)) {
        return -1;
      }
      if (yourvalue) {
        if (isNaN(yourvalue)) {
          return -1;
        }
        num = Math.round(num * yourvalue);
      }
      else {
        num = Math.round(num * Math.PI);
      }
    }
    return num;
  }

  aja_getXmlNodeText = function(xmlnode) {
    try {
      // Firefox, etc.
      if (xmlnode.textContent) {
        return xmlnode.textContent;
      }
      // MS Internet Explorer
      else {
        return xmlnode.text;
      }
    }
    catch (e) {
      return null;
    }
  }

  /**
   ** MAIN user request method:
   */
  this.ajaxRequest = function() {
    if (pbcheckBrowserScript) {
      // basic browser/javascript compatibility checks
      if (!document.getElementById) {
        if (pbshowAlertMsgs) {
          aja_alertMsg(pbCoreLibHeader, "JavaScript error, browser upgrade or fix needed to run this");
        }
        return;
      }
      try {
        var arrtest = [];
        arrtest.push("*");
        arrtest = null;
      }
      catch (e) {
        if (pbshowAlertMsgs) {
          aja_alertMsg(pbCoreLibHeader, "JavaScript error, browser upgrade probably needed");
        }
        if (e.description) {
          if (pbshowAlertMsgs) {
            aja_alertMsg("Gen Error", e.description);
          }
        }
        return;
      }
    }

    var strurl = (arguments[0]) ? arguments[0] : null;
    var strparam = (arguments[1]) ? arguments[1] : null;

    // property for user's div, span, etc.
    var strcontainer = (arguments[2]) ? arguments[2] : null;
    // user option to process as XML, XSL, JSON, etc.
    var strprocessType = (arguments[3]) ? arguments[3] : null;
    // output formatting option: tables, etc.
    var stroutputFormat = (arguments[4]) ? arguments[4] : null;
    // optional XML start node
    var strSearchElement = (arguments[5]) ? arguments[5] : null;
    // optional Simple Text Security value
    var strSTSValue = (arguments[6]) ? arguments[6] : null;
    // optional Simple Text Security key
    var strSTSKey = (arguments[7]) ? arguments[7] : null;
    // optional override for selected ajax call to show alerts
    pbshowAlertMsgs = (arguments[8] != null) ? arguments[8] : pbshowAlertMsgs;
    // optional override for show startup icon variable
    pbshowStartUpIcon = (arguments[9] != null) ? arguments[9] : pbshowStartUpIcon;

    if (!strurl || !strcontainer) {
      if (pbshowAlertMsgs) {
        aja_alertMsg(pbCoreLibHeader, "Required parameters are missing");
      }
      return;
    }

    if (strprocessType) {
      strprocessType = strprocessType.toUpperCase();
    }
    if (stroutputFormat) {
      stroutputFormat = stroutputFormat.toUpperCase();
    }
    if (strurl) {
      strurl = strurl.toLowerCase();
    }   
    if (strparam) {
      // add any additional parameters
      strurl += strparam;
    }

    // note this will also trap any invalid container names:
    try {
      // simple, fast 'loading' icon or indicator...
      if (pbshowStartUpIcon) {
        aja_fill(strcontainer, "*");
      }
      else {
        aja_empty(strcontainer);
      }
    }
    catch (e) {
      if (pbshowAlertMsgs) {
        aja_alertMsg(pbCoreLibHeader, "Invalid container, check parameter list for " + strurl);
      }
      if (e.description) {
        if (pbshowAlertMsgs) {
          aja_alertMsg("Gen Error", e.description);
        }
      }
      return;
    }

    // change: run php xsl translation for these browsers instead of using javascript:
    if (strurl.indexOf(".xml") != -1 && strprocessType === "XSL") {
      if (navigator.userAgent.indexOf("Chrome") != -1 || navigator.userAgent.indexOf("Safari") != -1) {
         strurl = "phpxsl.php?url=" + strurl.replace(".xml", ".xsl");
         strprocessType = "PHP";
      }
    }  

    pbCoreLibReady = true;

    var xhrRequest = null;
    var callmethod = "GET";
    var async = true;

    if (window.XMLHttpRequest) {
      // Firefox, Opera, Safari, etc.
      xhrRequest = new XMLHttpRequest();
      // here is this code if you need it
      // but you will probably get spurious
      // error messages in debugging consoles
//      if (xhrRequest.overrideMimeType) {
//        xhrRequest.overrideMimeType('text/xml');
//      }
    }
    else if (window.ActiveXObject) {
      // MS Internet Explorer...
      // synchronous mode needed for older IE browsers
      // (notably IE6), to help with memory leaks...
      // runs a bit slower but there seems to be
      // less problems with IE6 in synch mode.
      async = false;

      xhrRequest = new ActiveXObject("Msxml2.XMLHTTP");
      if (!xhrRequest) {
        xhrRequest = new ActiveXObject("Microsoft.XMLHTTP");
      }
//      if (this.processResponse.overrideMimeType) {
//        this.processResponse.overrideMimeType('text/xml; charset=iso-8859-9');
//      }
    }
    if (!xhrRequest) {
      aja_empty(strcontainer);
      if (pbshowAlertMsgs) {
        aja_alertMsg(pbCoreLibHeader, "Sorry, browser does not support XMLHttpRequest");
      }
      return;
    }

    xhrRequest.open(callmethod, strurl, async);
    xhrRequest.setRequestHeader('content-type', 'text/xml');
    if (window.XMLHttpRequest) {
      xhrRequest.source = this;
      xhrRequest.onreadystatechange = function() {
        xhrRequest.source.processResponse(xhrRequest,
                                          strurl,
                                          strcontainer,
                                          strprocessType,
                                          stroutputFormat,
                                          strSearchElement,
                                          strSTSValue,
                                          strSTSKey); };
    }
    else {
      // MS Internet Explorer
      xhrRequest.onreadystatechange = function() {
        AjaMyAjax.apply(this);
        this.processResponse(xhrRequest,
                             strurl,
                             strcontainer,
                             strprocessType,
                             stroutputFormat,
                             strSearchElement,
                             strSTSValue,
                             strSTSKey); };
    }
    if (xhrRequest) {
       xhrRequest.send(null);
    }

    if (!async && navigator.userAgent.indexOf("Firefox") != -1) {
      // separate callback method needed for Firefox (3.xx and earlier), synchronous mode only
      this.processResponse(xhrRequest,
                           strurl,
                           strcontainer,
                           strprocessType,
                           stroutputFormat,
                           strSearchElement,
                           strSTSValue,
                           strSTSKey);
    }
  } // end of ajaxRequest
} // eop

[eof]

More Resources from AjaMyAjax.com