
    var isConnected = false;
       
    function getRequest()
    {
        var sendRequest;
        if(window.XMLHttpRequest) {
            sendRequest = new XMLHttpRequest();
            if(sendRequest.overrideMimeType) {
                sendRequest.overrideMimeType('text/xml');
            }
        }
        else if(window.ActiveXObject) {
            try {
                sendRequest = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e) {
            try {
                sendRequest = new ActiveXObject("Msxml2.XMLHTTP");
              }
              catch (e) {
                alert("Could not create httpRequest");
              }
            }
        }
        return sendRequest;            
    }
    
    function send(message)
    {
        if(!isConnected) { 
            openChannel();
        }
     
        if(message.length > 0) {
            var sendRequest = getRequest();
            var url = "send.php?message=" + message;
            sendRequest.onreadystatechange = function()
            {
                document.getElementById("sStatus").innerHTML = "Sent";
                if(sendRequest.readyState == 4) {
                    if(sendRequest.status == 200) {
                        var command = sendRequest.responseXML.documentElement.firstChild.nodeValue;
                        if(command == "CO") {
                            document.getElementById("cStatus").innerHTML = "Disconnected";
                            openChannel();
                        }
                    }
                }    
            };
            sendRequest.open('GET', url, true);
            sendRequest.send(null);
        }
    }
    
    function openChannel()
    {
        var channel = getRequest();
        var url = "channel.php";
        channel.multipart = true;
        channel.onload = function(e) 
        {
            var message;
            if(this.responseXML) {
                message = this.responseXML;                        
            }
            else {
                message = this.event.target.responseXML;                     
            }
            
            if(message.documentElement.firstChild.nodeValue == "CO") {
                isConnected = false;
                document.getElementById("cStatus").innerHTML = "Disconnected";
            }
            else {
                var reply = document.getElementById('reply');
                if(reply.childNodes.length > 5) {
                    reply.removeChild(reply.firstChild);
                }
                reply.appendChild(message.documentElement);  
                reply.innerHTML = reply.innerHTML;
            }
        };
        channel.onerror = function ()
        {
            isConnected = false;
            document.getElementById("cStatus").innerHTML = "Disconnected";
        }
       
        channel.open('GET', url, true);
        channel.send(null);
        isConnected = true; 
        document.getElementById("cStatus").innerHTML = "Connected";
    }
      
    function shouldI(e)
    {
        var code;
        if (!e) var e = window.event;
        if (e.keyCode) code = e.keyCode;
        else if (e.which) code = e.which;
        var character = String.fromCharCode(code);
        if(code == 13) {
            document.getElementById("sStatus").innerHTML = "Sending";
            return true;
        }    
        else {
            document.getElementById("sStatus").innerHTML = "Typing";
            return false;
        }
    }

    function gogo(control, e) 
    {
        if(shouldI(e)) {
            send(control.value);
            control.value = control.defaultValue;
            return false;
        }
    }
