CriticalLogicServiceAgentClass = function()
{
    var _serviceUrl = "http://www.recax.com/deepreach//Services/default.aspx";
    
    var _serviceNamespace = "http://www.recax.com/DeepReach/Services/CriticalLogicService";

    this.createNewSession = function(userName, language)
    {
        var request = _createSoapRequest("CreateNewSession");
        var envelopeDom = _createSoapEnvelope("CreateNewSession");
        
        var methodElement = envelopeDom.selectSingleNode("//CreateNewSession");
        methodElement.appendChild(envelopeDom.createElement("userName")).text = userName;
        methodElement.appendChild(envelopeDom.createElement("language")).text = language;
        
        request.send(envelopeDom.xml);
        
        return request.responseXML.selectSingleNode("//CreateNewSessionResult").text;
    }
    
    this.restartSession = function(sessionID)
    {
        var request = _createSoapRequest("RestartSession");
        var envelopeDom = _createSoapEnvelope("RestartSession");
        
        var methodElement = envelopeDom.selectSingleNode("//RestartSession");
        methodElement.appendChild(envelopeDom.createElement("sessionID")).text = sessionID;
        
        request.send(envelopeDom.xml);
        
        return request.responseXML.selectSingleNode("//RestartSessionResult").text == "true";
    }
    
    this.endSession = function(sessionID)
    {
        var request = _createSoapRequest("EndSession");
        var envelopeDom = _createSoapEnvelope("EndSession");
        
        var methodElement = envelopeDom.selectSingleNode("//EndSession");
        methodElement.appendChild(envelopeDom.createElement("sessionID")).text = sessionID;
        
        request.send(envelopeDom.xml);
        
        return request.responseXML.selectSingleNode("//EndSessionResult").text == "true";
    }
    
    this.sendMessage = function(sessionID, message)
    {
        var request = _createSoapRequest("SendMessage");
        var envelopeDom = _createSoapEnvelope("SendMessage");
        
        var methodElement = envelopeDom.selectSingleNode("//SendMessage");
        methodElement.appendChild(envelopeDom.createElement("sessionID")).text = sessionID;
        methodElement.appendChild(envelopeDom.createElement("message")).text = message;
        
        request.send(envelopeDom.xml);
        
        return request.responseXML.selectSingleNode("//SendMessageResult");
    }
    
    function _createSoapRequest(methodName)
    {
        var xmlHttpRequest =  new ActiveXObject("Msxml2.XMLHTTP");
        xmlHttpRequest.open("POST", _serviceUrl, false);
        xmlHttpRequest.setRequestHeader("content-type", "text/xml; charset=utf-8");
        xmlHttpRequest.setRequestHeader("SOAPAction", _serviceNamespace + "/" + methodName);
        return xmlHttpRequest;
    }
    
    function _createSoapEnvelope(methodName)
    {
        var soapEnvelopeDom = new ActiveXObject("Msxml2.DOMDocument");
        soapEnvelopeDom.loadXML(
            "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +
            "<soap:Body/>" +
            "</soap:Envelope>"
        );
        var soapBodyElement = soapEnvelopeDom.documentElement.childNodes[0];
        var methodElement = soapBodyElement.appendChild(soapEnvelopeDom.createElement(methodName));
        methodElement.setAttribute("xmlns", _serviceNamespace);
        return soapEnvelopeDom;
    }
    
    return this;
}