<!--
// $Id: e_Ajax.js,v 1.3 2006/10/31 16:47:08 lsmith Exp $
/**
 * OO First pass at an AJAX wrapper for Entice sites
 *
 * @category   HTML
 * @package    ENTICE_E_PBX
 * @author     Lance Smith
 * @copyright  2006 Emergent Network Solutions
 * @license    Emergent Network Solutions
 * @version    Release: @package_version@
 */

function e_AJAX() { }
/**
 * What function do we call with a valid response
 */
e_AJAX.setCallBack = function(callBackFunction) {
  e_AJAX._callBack = callBackFunction;
};


/**
 * Set an alternative error handler from the default alert box.
 */
e_AJAX.setErrorHandler = function(handler) {
  e_AJAX._errorHandler = handler;
};

/**
 * Set an alternative warning handler from the default alert box.
 */
e_AJAX.setWarningHandler = function(handler) {
  e_AJAX._warningHandler = handler;
};

/**
 * Which HTTP verb do we use to send results? Must be one of "GET" or "POST".
 * default is GET
 */
e_AJAX.setVerb = function(verb) {
  if (verb != "GET" && verb != "POST") {
    e_AJAX._handleError("Remoting verb must be one of GET or POST");
    return;
  }
  e_AJAX._verb = verb;
};

/**
 * How long do we wait for a response 0 do not set timer.
 * 0 is the default
 */
e_AJAX.settimeout = function(timeout) {
  e_AJAX._timeout = timeout;
};

/**
 * The default message handler.
 */
e_AJAX.defaultMessageHandler = function(message) {
  if (typeof message == "object" && message.name == "Error" && message.description) {
    alert("Error: " + message.description);
  }
  else {
    alert(message);
  }
};


/************************************************************************************************/
/* Private settings for defaults */
/** Default verb */
e_AJAX._verb = "GET";

/** Default timeout **/
e_AJAX._timeout = 0;

/** ActiveX objects to use when we want to convert an xml string into a DOM object. */
e_AJAX._DOMDocument = ["Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0", "Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument", "Microsoft.XMLDOM"];

/** The ActiveX objects to use when we want to do an XMLHttpRequest call. */
e_AJAX._XMLHTTP = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];

/** A function to call if when everything went correct. */
e_AJAX._callBack = e_AJAX.defaultMessageHandler;

/** A function to call if something fails. */
e_AJAX._errorHandler = e_AJAX.defaultMessageHandler;

/** A function to call to alert the user to some breakage. */
e_AJAX._warningHandler = e_AJAX.defaultMessageHandler;


/************************************************************************************************/
/* Lets do some real work */

/**
 * Process a request
 */
e_AJAX.sendRequest = function(url, parms){
    var request = {};
    request.req = false;
    request.verb = e_AJAX._verb;
    request.timeout = e_AJAX._timeout;
    if (window.XMLHttpRequest) {
      request.req = new XMLHttpRequest();
    }
    // IE5 for the mac claims to support window.ActiveXObject, but throws an error when it's used
    else if (window.ActiveXObject && !(navigator.userAgent.indexOf('Mac') >= 0 && navigator.userAgent.indexOf("MSIE") >= 0)) {
      request.req = e_AJAX._newActiveXObject(e_AJAX._XMLHTTP);
    }

    request.req.onreadystatechange = function() {
      e_AJAX._stateChange(request);
    };

    // Set a timeout timer if needed
    if (request.timeout && request.timeout != 0) {
      request.interval = setInterval(function() {
      clearInterval(request.interval);
      e_AJAX._abortRequest(request);
      }, request.timeout);
    }
    if (request.verb == "GET") {
      try {
        request.async = true; // hard code for now
        request.req.open("GET", url, request.async);
        request.req.send(null);
        if (!request.async) {
          e_AJAX._stateChange(request);
        }
      }
      catch (ex) {
        e_AJAX._errorHandler(ex);
      }
    }
    else {
      try {
        request.async = true; // hard code for now
        request.req.open("POST", url, request.async);
        request.req.send(parms);
        req.setRequestHeader('Content-Type',
          'application/x-www-form-urlencoded');
//                "application/x-www-form-urlencoded; charset=UTF-8");

        if (!request.async) {
          e_AJAX._stateChange(request);
        }
      }
      catch (ex) {
        e_AJAX._errorHandler(ex);
      }
    }

};

/**
 * @private Called by XMLHttpRequest to indicate that something has happened
 */
e_AJAX._stateChange = function(request) {
  if (!request.completed && request.req.readyState == 4) {
    try {
      var reply = request.req.responseText;
      var status = request.req.status;

      if (reply == null || reply == "") {
        e_AJAX._errorHandler("No data received from server");
        return;
      }

      // This should get us out of 404s etc.
      // should be something unique to everything we return
      if (status < 199 || status > 300) {
         e_AJAX._errorHandler("Invalid reply from server");
         return;
      }

      if (status != 200) {
        if (reply == null) reply = "Unknown error occured";
        e_AJAX._errorHandler(reply);
        return;
      }

      e_AJAX._callBack(reply);

      // We're done. Clean up
      e_AJAX._cleanUp(request);
    }
    catch (ex) {
      if (ex == null) ex = "Unknown error occured";
        e_AJAX._errorHandler(ex);
    }
    finally {
    }
  }
};

/**
 * @private A call has finished by whatever means and we need to shut it all down.
 */
e_AJAX._cleanUp = function(request) {
  if (request.completed) {
    alert("double complete");
    return;
  }
  // avoid IE handles increase
  if (request.req) delete request.req;
  request.completed = true;
};


/**
 * @private Called as a result of a request timeout
 */
e_AJAX._abortRequest = function(request) {
  if (request && request.metadata != null && !request.completed) {
    e_AJAX._cleanUp(request);
    if (request.req) request.req.abort();
    // Call all the timeout errorHandler
    e_AJAX._errorHandler("TIMEOUT");
  }
};

/**
 * @private Find an ActiveX object that works.
 * @param axarray An array of strings to attempt to create ActiveX objects from
 */
e_AJAX._newActiveXObject = function(axarray) {
  var returnValue;
  for (var i = 0; i < axarray.length; i++) {
    try {
      returnValue = new ActiveXObject(axarray[i]);
      break;
    }
    catch (ex) {
    }
  }
  return returnValue;
};

-->
