﻿    function Ajax(location, successHandler, failureHandler, completionHandler, noCache, userData)
      {
      if (noCache)
        location = makeNoCacheLocation(location);
      
      this.location = location;
      this.successHandler = successHandler;
      this.failureHandler = failureHandler;
      this.completionHandler = completionHandler;
      this.userData = userData;
      
      this.execute = ajax_execute;
      }

    function ajax_execute()
      {
      var xhr = ajax_createXHR();
      if (xhr != null)
        {
        var ajax = this;
        var failureHandler = ajax.failureHandler;
        var completionHandler = ajax.completionHandler;
        var userData = ajax.userData;
        xhr.onreadystatechange = function()
          {
          if (xhr.readyState == 4)
            {
            var responseText = xhr.responseText;
            var status = xhr.status;
            var statusText = xhr.statusText;
            if (xhr.status == 200)
              {
              var successHandler = ajax.successHandler;
              if (successHandler != null)
                successHandler(responseText, status, statusText, userData);
              }
            else
              {
              if (failureHandler != null)
                failureHandler(status, statusText, userData);
              }
            if (completionHandler != null)
              completionHandler(responseText, status, statusText, userData);
            }
          }

        try
          {
          var location = this.location;
          xhr.open("GET", location, true);
          xhr.send(null);
          }
        catch (e)
          {
          var status = -1;
          var statusText = 'unable to open location or send request.';
          failureHandler(status, statusText, userData);
          completionHandler(null, status, statusText, userData);
          }
        }
      }
      
    function makeNoCacheLocation(location)
      {
      var symbol = '?';
      var hasParameter = location.indexOf(symbol) >= 0;
      if (hasParameter)
        symbol = '&';
      
      location += symbol + 'nocache=' + Math.random();
        
      return location;
      }
      
    function ajax_createXHR()
      {
      var xhr = null;
      try
        {
        xhr = new XMLHttpRequest();
        }
      catch (e1)
        { 
        try
          {
          xhr = new ActiveXObject("Msxml2.XMLHTTP");
          } 
        catch (e2)
          { 
          try
            {
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
            } 
          catch (e3)
            {
            }
          }
        }
        
      return xhr;
      }