function createXHR() 
{
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest()

    } else {
        if (window.ActiveXObject) {
            return new ActiveXObject("Microsoft.XMLHTTP"); 
        }
    }
}
function yim() 
{
    this.r_get=createXHR();
    this.responseBytes=0;
    this.listening=false;
    this.listenStartAt=0;
    this.intervalId;
    this.notify_receiver='';
    this.ping_id;
    this.pinging=false;
    this.onlineCache={}

    this.listen=function(url) {
        yim._listen(url);
        yim.intervalId=setInterval('yim._listen("'+url+'");',1000);
    }; 

    this._listen=function(url) {
        if (this.listenStartAt-(new Date()).getTime()>60000) {
            if (yim.listening==true) {
                yim.r_get.abort();
                yim.listening=false;
            }
        }
        if (yim.listening==true) {
            return;
        }

        yim.listening=true;
        yim.listenStartAt=(new Date()).getTime();
            yim.r_get.open("GET",url,true);
            yim.r_get.onreadystatechange=function () {
                if (yim.r_get.readyState==4) {
                    if (yim.r_get.responseText) {
                        var r_text=jQuery.trim(yim.r_get.responseText);
                        if (r_text) {
                            yim.onResponse(r_text);
                        }   
                    }
                    yim.listening=false;
                }
            }
            yim.r_get.send(null);
        //}
    };
    this.send=function (msg,receiver) {
        yim.onSend(msg,receiver);
        var r_send=createXHR();
        r_send.open("POST","/im/",true);
        r_send.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        r_send.send("action=send&receiver="+receiver+"&msg="+encodeURIComponent(msg));
    };
    this.quit=function () {
        if (this.listening) {
            clearInterval(yim.intervalId);
            yim.r_get.abort();
        }
        var r_send=createXHR();
        r_send.open("POST","/im/",true);
        r_send.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        r_send.send("action=quit");
    };
    this.chatWith=function(receiver) {
        this.notify_receiver=receiver
        var r_send=createXHR();
        r_send.open("POST","/im/",false);
        r_send.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        r_send.send("action=chatting");
        if (r_send.responseText==1) {
            yim.notifyStart(yim.notify_receiver);
            yim.chatWithCallback();
            return false;
        } else {
            yim.onOpen(receiver);
            yim.chatWithCallback();
            return true;
        }
    };
    this.chatWithCallback=function() { };
    this.pinging_id=0;
    this.ping=function() {
        clearTimeout(this.pinging_id);
        this.pinging_id=setTimeout("yim.pinging=false",5000);
        if (yim.pinging==true) return;
        yim.pinging=true
        var r_send=createXHR();
        r_send.open("POST","/im/",true);
        r_send.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        r_send.onreadystatechange=function () {
            //document.getElementById('ddbb').innerHTML+=r_send.readyState
            if (r_send.readyState==4) {
                if (r_send.responseText) {
                    var r_text=jQuery.trim(r_send.responseText);
                    yim.onPingBack(r_text==1?true:false)
                }
                yim.pinging=false
            }
        }
        r_send.send("action=ping");
    };
    this.onPingBack=function(result) {};
    this.startPing=function() {
        yim.ping();
        yim.ping_id=setInterval('yim.ping()',5000)
    };
    this.stopPing=function() {
        clearInterval(yim.ping_id)
        yim.ping_id=0
    };
    this.isOnline=function(who) {
        if (this.onlineCache[who]) {
            return this.onlineCache[who]
        }
        var r_send=createXHR();
        r_send.open("POST","/im/",false);
        r_send.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        r_send.send("action=is_online&who="+who);
        if (r_send.responseText==1) {
            this.onlineCache[who]=true
            return true;
        } else {
            this.onlineCache[who]=false
            return false;
        }
    };
    this.getInfo=function() {
        var r_send=createXHR();
        r_send.open("POST","/im/",false);
        r_send.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        r_send.send("action=get_info");
        var info={}
        try {
            eval('info='+r_send.responseText);
        } catch (e) {}
        return info
    };
    this.notifyStart=function(receiver) {
        var r_send=createXHR();
        r_send.open("POST","/im/",true);
        r_send.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        r_send.send("action=notify_start&receiver="+receiver);
    };
    this.onResponse=function(json_msg) {
    };
    this.onSend=function(msg,receiver) {
    };
    this.onOpen=function(receiver) {
    };
    this.htmlEncode=function(msg) {
        msg = msg.replace(/&/,"&amp;");
        msg = msg.replace(/</,"&lt;");
        msg = msg.replace(/>/,"&gt;");
        msg = msg.replace(/\r\n/,"<br />");
        msg = msg.replace(/\n/,"<br />");
        msg = msg.replace(/\r/,"<br />");
        return msg;
    };
}
yim=new yim;
