﻿function Ajax()
{
  this.req            = null;
  this.url            = null;
  this.method         = 'POST';
  this.async          = true;
  this.status         = null;
  this.statusText     = '';
  this.postData       = null;
  this.IsComplete     = false;
  this.readyState     = null;
  this.responseText   = null;
  this.responseXML    = null;
  this.handleResp     = null;
  this.response       = null;
  this.responseFormat = 'text'; // 'text', 'xml', or 'object'
  this.mimeType       = null;
  
  this.init = function()
  {
    if(!this.req)
    {
      try
      {
        //  Try to create an object for Firefox, Safari, IE7, etc.
        this.req = new XMLHttpRequest();
      }
      catch(e)
      {
        try
        {
          //  Try to create an object for later versions of IE.
          this.req = new ActiveXObject('MSXML2.XMLHTTP');
        }
        catch(e)
        {
          try
          {
            //  Try to create an object for earlier versions of IE.
            this.req = new ActiveXObject('Microsoft.XMLHTTP');
          }
          catch(e)
          {
            //  Could not create the XHLHttpRequest object
            return false;
          }
        }
      }
    }
    return this.req;
  };
  
  this.doReq = function()
  {
    if(!this.init())
    {
      alert('Could not create an XMLHttpRequest object');
      return;
    }

    this.req.open(this.method, this.url, this.async);
    if(this.method == "POST")
    {
        this.req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        this.req.setRequestHeader("Content-Length", this.postData.length);
    }
    if(this.mimeType)
    {
      try
      {
        this.req.overrideMimeType(this.mimeType);
      }
      catch(e)
      {
        // Could not override MIME type --- IE6 or Opera?
      }
    }
    var self = this; // Fix the loss of scope in the inner function
    
    //  Check the state change
    this.req.onreadystatechange = function()
    {
      var resp = null;
      if(self.req.readyState == 4)
      {
        self.IsComplete = true;
        switch(self.responseFormat)
        {
          case 'text':
            resp = self.req.responseText;
            break;
          case 'xml':
            resp = self.req.responseXML;
            break;
          case 'object':
            resp = req;
            break;        
        }
        self.response = resp;
        if(self.req.status >= 200 && self.req.status <= 299)
        {
          self.handleResp(resp);
        }
        else
        {
          self.handleErr(resp);
        }
      }
    };
    this.req.send(this.postData);
  };
  
  //  Set the mime type
  this.setMimeType = function(mimeType)
  {
    this.mimeType = mimeType;
  };
  
  //  Error handling
  this.handleErr = function()
  {
    //alert('Error Code : ' + this.req.status + ', Desc : ' + this.req.statusText);
  };
  
  //  Set error handler?
  this.setHandleErr = function(funcRef)
  {
    this.handleErr = funcRef;
  }
  
  //  Set the handler for errors and responses
  this.setHandlerBoth = function(funcRef)
  {
    this.handleResp = funcRef;
    this.handleErr = funcRef;
  };
  
  //  Abort the request
  this.abort = function()
  {
    if(this.req)
    {
      this.req.onreadystatechange = function() {};
      this.req.abort();
      this.req = null;
    }
  };
  
  //  This is what we do with the response
  this.doGet = function(url, hand, format)
  {
    this.url = url;
    this.handleResp = hand;
    this.responseFormat = format || 'text';
    this.doReq();
  };
}

function getNodeText(xmlNode)  
{  
    if(!xmlNode) return '';  
    if(typeof(xmlNode.textContent) != "undefined") return xmlNode.textContent;  
    return xmlNode.firstChild.nodeValue;  
}  

function AjaxValue(M, N)
{
    if (M == null)
    {
        //alert('No node ' + N);
        return '';
    }

    if (M.getElementsByTagName(N).length == 0)
    {
        //alert('No items in tag ' + N + ' raw ' + M.getElementsByTagName(N)[0].firstChild.nodeValue);
        return '';
    }

    if (M.getElementsByTagName(N)[0].childNodes.length == 0)
    {
        //alert('No child items in tag ' + N);
        return '';
    }

    return getNodeText(M.getElementsByTagName(N)[0]);

}
function AjaxValueX(Message, Name)
{
	if(Message.getElementsByTagName(Name).length == 0) {
		//alert('Item '+Name+' not found in XML message');
		return '';
	}
	if(Message.getElementsByTagName(Name)[0].childNodes.length == 0) {
		return '';
	}
	return(Message.getElementsByTagName(Name)[0].firstChild.nodeValue);
}

var AjaxControls = new Array();
var AjaxUpdate = new Array();

function G(e)
{
    return document.getElementById(e);
}

function AjaxControl()
{
  this.Div            = '';
  this.Module         = '';
  this.Identifier     = '';
}

function AjaxUniqueId()
{
    return hex_md5('rnd ' + Math.random()*500);
}

function AjaxCreate(RenderToDiv, Module, Identifier)
{
    var C = new AjaxControl();
    if(Identifier == "")
    {
        C.Identifier = AjaxUniqueId();
    }
    
    C.Div = G(RenderToDiv);
    C.Module = Module;
    if(C.Div == null)
    {
        alert('Could not draw to div ' + RenderToDiv);
        return;
    }
    C.Div.innerHTML = 'Refresh Ajax from ' + Module;
    
    AjaxControls.push(C);
    
    AjaxRefreshControl(C);
    
    return C;
}

function AjaxCallback(Txt)
{
}

function AjaxMethod()
{
    if (!arguments || arguments.length < 2)
    {
        return;
    }

    var Method = arguments[0];
    var Callback = arguments[1];
    if (Callback == null)
    {
        Callback = AjaxCallback;
    }

    var PostData = '';
    for (var i = 2; i < arguments.length; i = i + 2)
    {
        var K = arguments[i];
        var V = arguments[i + 1];

        PostData = PostData + encodeURI(K) + '=' + encodeURI(V) + '&';
    }


    var QS = Method + "?R=" + AjaxUniqueId();
    var A = new Ajax();
    A.method = "POST";
    A.postData = PostData;
    A.doGet(
        QS,
        Callback,
        'xml'
    );
}


function AjaxMethodSync()
{
    if (!arguments || arguments.length < 2)
    {
        return;
    }

    var Method = arguments[0];
    var Callback = arguments[1];
    if (Callback == null)
    {
        Callback = AjaxCallback;
    }

    var PostData = '';
    for (var i = 2; i < arguments.length; i = i + 2)
    {
        var K = arguments[i];
        var V = arguments[i + 1];

        PostData = PostData + encodeURI(K) + '=' + encodeURI(V) + '&';
    }


    var QS = Method + "?R=" + AjaxUniqueId();
    var A = new Ajax();
    A.method = "POST";
    A.async = false;
    A.postData = PostData;
    A.doGet(
        QS,
        Callback,
        'xml'
    );
}

function AjaxMethodArray(objArgs)
{
    var Method = objArgs[0];
    var Callback = objArgs[1];
    if (Callback == null)
    {
        Callback = AjaxCallback;
    }

    var PostData = '';
    for (var i = 2; i < objArgs.length; i = i + 2)
    {
        var K = objArgs[i];
        var V = objArgs[i + 1];

        PostData = PostData + encodeURI(K) + '=' + encodeURI(V) + '&';
    }

    var QS = Method + "?R=" + AjaxUniqueId();
    var A = new Ajax();
    A.method = "POST";
    A.postData = PostData;
    A.doGet(
        QS,
        Callback,
        'xml'
    );
}























function AjaxRefreshControl(Control)
{
    AjaxUpdate.push(Control);
}

function AjaxConnectx()
{
    var QS = '/Resource/Modules/AjaxChat/Connect';
    var A = new Ajax();
    A.method = "POST";
    A.postData = "Message=HelloWorld";
    A.doGet(
        QS,
        function(Txt) { alert(Txt); },
        'xml'
    );
}

function AjaxDisconnect()
{
    var QS = '/Resource/Modules/AjaxChat/Disconnect';
    var A = new Ajax();
    A.method = "POST";
    A.postData = "Message=HelloWorld";
    A.doGet(
        QS,
        function(Txt) { },
        'xml'
    );
    alert('Got It ' + A.response);
}

function AjaxMessage(Message)
{
    var QS = '/Resource/Modules/AjaxChat/Message?Message=' + Message;
    var A = new Ajax();
    A.method = "POST";
    A.postData = "MessagePosted=" + Message;
    A.doGet(
        QS,
        function(Txt) { alert(Txt); },
        'xml'
    );
}

