var ARTimeout = 6000;
var RTimeout = 19000;
var FRTimeout = 800;

var mmax = 450;

var pp = null;
var ppbg = null;

var isMessageReceived = false;
var bUseRSA = true;
// preload images
var preimgs = [];
var siteRoot = 'http://'+window.location.host+window.location.pathname;
siteRoot = siteRoot.toLowerCase().substring(0,siteRoot.lastIndexOf('/')+1);

function gomessenger(url)
{
    window.location='http://'+url;
}
function pri(n,t)
{
    preimgs[preimgs.length] = new Image();
    preimgs[preimgs.length-1].src = siteRoot + (t?TIF:"")+ 'images/' +n;
}
// /preload images
function ShowError(tag,text)
{
	HPUT();
	var p = GetTagPos(tag);
	var m = document.getElementById('errBlock');
	var bgm = document.getElementById('bgerrBlock1');
	var t = document.getElementById('errMes');
    var bgt = document.getElementById('bgerrMes');
    var m1 = document.getElementById('errBlock1');
    
	if(bgm)
	{
        m1.style.top = p.y+120+5+'px';
	    m1.style.left = p.x+100+5+'px';
    	m1.style.display = 'inline';
    	
	    bgm.style.top = p.y+120+'px';
	    bgm.style.left = p.x+100+'px';
	    bgm.style.display = '';

	    t.innerHTML = text;
	    bgt.innerHTML = text;

	    m.style.display = 'inline';
	    pp = m;
	}
	else
    {
        if(isMobile)
        {
            m.style.top = p.y+70+'px';
            m.style.left = p.x+10+'px';
        }else
        {
            m.style.top = p.y+140+'px';
            m.style.left = p.x+120+'px';
        }
        m.style.display = '';
        t.innerHTML = text;
        pp = m;
    }
    
    document.body.style.zIndex  = 1;
	tag.style.zIndex  = 100;
}
function onLoginFormSubmit()
{
    Login();
    return false;
}
function KeyMouseEvent()
{
    HPUT();
}
function HPUT()
{
    HidePopup();
    UpdateTitle();
}

function UpdateTitle()
{
    if(isMessageReceived)
    {
        isMessageReceived = false;
        if(contacts)
        {
            contacts.UpdateTitle();
        }
    }
}
function ShEr(id,text)
{
    try
    {
        var div = document.getElementById('div'+id);
        ShowError(div,text); 
        document.getElementById('ta'+id).removeAttribute('disabled');
	    document.getElementById('btn'+id).removeAttribute('disabled');
	}catch(e){}
}
function Check(div,text,evt)
{
	if(text.length>mmax||encodetext(text).length>2000) // 2048 max url
	{
		evt = (evt) ? evt : ((event) ? event : null);
		if (evt) {        
			ShowError(div,consts.ErrMesLong);
			try{evt.cancelBubble = true;}catch(e){;};
		}
		return false;
	}
	return true;
}
function encodetext(text)
{
    var encoder = window.encodeURIComponent ? encodeURIComponent:escape;
    return encoder(text).replace(/\+/g,'%2b');
}
function HidePopup()
{
	if(pp!=null)
	{
		pp.style.display = 'none';
		pp=null;
	}
	if(ppbg!=null)
	{
		ppbg.style.display = 'none';
		ppbg=null;
	}
}
function Requests(tagID)
{
    var root = document.getElementById(tagID);
    var cnt=1;
    var lcnt=1; 
    var hashAReqs = {};
    var hashLogins = {};

    var GetNode = function()
    {
        var r = document.createElement('iframe');
        r.setAttribute('id','rq'+cnt);
		r.name='rq'+cnt;
		r.setAttribute('id','rq'+cnt)
		r.className='hide';
		return r;
    }
    var SendReq = function(u,cnt,callback)
    {
        if(IsAJAX)
        {
           u = u + '&a=1';
           hashAReqs[cnt] = new AJAXRequest(cnt,u,callback);             
        }
        else
        {
            var r = GetNode();
            r.src=u;
            root.appendChild(r);
        }        
    }
    this.SendJM=function(id,isClose)
    {
        cnt++;
        var u = 'j.aspx?r='+'rq'+cnt+'&id='+ encodetext(id)+'&j='+ isClose; 
        SendReq(u,cnt,OpenCloseChatCallback);
    
    }
    this.SendTM=function(id,text)
    {
        cnt++;
        var u = 'g.aspx?r='+'rq'+cnt+'&id='+ encodetext(id) +'&t='+encodetext(text); //.substr(0,450)
        SendReq(u,cnt,SendCallback);
    }
    this.SendIM=function()
    {
        cnt++;
        var u = 'i.aspx?r='+'rq'+cnt;
        if(MyStatus == cStat.NA)
        {
            u = u + '&s=1';     
        }
        SendReq(u,cnt,CheckCallback);
    }
    var ShowLoadingScreen = function(useRSA)
    {
        var lp = document.getElementById('divLoading');
        var lbSign = document.getElementById('lbSign');
        var lbEnc = document.getElementById('lbEnc');
        
        if(lp)
        {
            lp.style.display    = 'inline';
            lbSign.className    = useRSA?'hidden':'visible';
            lbEnc.className   = useRSA?'visible':'hidden';
        }
    }
    this.LoginStep1 = function(index)
    {
        var rm = hashLogins[index][0];
        var p = hashLogins[index][1];
        var useRSA = hashLogins[index][2];
        delete hashLogins[index];
        var u = 'l.aspx?r='+'rq'+cnt;
        u+="&c="+p.length/3;
        u+="&rm="+rm;
        if(!useRSA)
        {
            for(var i=0;i<p.length;i++)
            {
                u += "&p"+i+"="+encodetext(""+p[i]);
            }
        }else
        {
            for(var i=0;i<p.length;i=i+3)
            {
                u += "&k"+i/3+"="+encodetext(""+p[i]);
                u += "&lp"+i/3+"="+EncryptLoginPass(p[i+1],p[i+2]);
            }
             u+="&rsa=1";           
        }
        
        if(useRSA)
        {
            var lbSign = document.getElementById('lbSign');
            var lbEnc = document.getElementById('lbEnc');
            lbSign.className  = 'visible';
            lbEnc.className   = 'hidden';
        }
        SendReq(u,cnt,LoginCallback);
    }
    this.Login = function(rm,p,useRSA)
    {   
        lcnt++;
        cnt++;
        var prm  = {};
        prm[0] = rm;
        prm[1] = p;
        prm[2] = useRSA;
        
        hashLogins[lcnt]=prm;
        ShowLoadingScreen(useRSA);
        window.setTimeout('requests.LoginStep1('+lcnt+')', 1);
        
    }
    var LoginCallback = function(num,OK,xml)
    {
        if(OK)
        {
            try
            {
               var res = xml.documentElement.getElementsByTagName("Result")[0].firstChild.nodeValue;
               if(res=='True')
               {
                    window.location=siteRoot;
               }else
               {
                    var errs = xml.documentElement.getElementsByTagName("Err");
                    var aErr = [];
                    for(var i=0;i<errs.length;i++)
                    {
                        var el = [];
                        el[0] = errs[i].getAttributeNode('Type').nodeValue;
                        el[1] = errs[i].getAttributeNode('Text').nodeValue;
                        aErr[aErr.length] = el;
                    }
                    
                    Login_ShowError(aErr);
               }
            }catch(e)
                {
                    var lp = document.getElementById('divLoading');
                    if(lp)
                    {
                        lp.style.display = 'none';
                    }
                    document.getElementById('btnLogin').disabled=false;
                }
        }else
        {
            var lp = document.getElementById('divLoading');
            if(lp)
            {
                lp.style.display = 'none';
            }
            document.getElementById('btnLogin').disabled=false;
        }
        
        delete hashAReqs[num];
    }
    var OpenCloseChatCallback = function(num,OK,xml)
    {
         delete hashAReqs[num];        
    }
    var SendCallback = function(num,OK,xml)
    {
        if(OK)
        {
            try
            {
               var res = xml.documentElement.getElementsByTagName("Result")[0].firstChild.nodeValue;
               if(res=='True')
               {
                    var mymess = xml.documentElement.getElementsByTagName("Mess");
                    if(mymess)
                    {
                        var mcid = mymess[0].getAttributeNode('CID').nodeValue;
                        var mtext = mymess[0].getAttributeNode('Text').nodeValue;
                        var mdate = parseFloat(mymess[0].getAttributeNode('Date').nodeValue);
                        contacts.AddMess(mcid,mtext,true,mdate,'');
                    }

               }else
               {
                    var errs = xml.documentElement.getElementsByTagName("Err");
                    if(errs)
                    {
                        var cid = errs[0].getAttributeNode('CID').nodeValue;
                        var errtext = errs[0].getAttributeNode('Text').nodeValue;
                        ShEr(cid,errtext);
                    }
               }
            }catch(e){}
        }
        delete hashAReqs[num];
    }
    var CheckCallback = function(num,OK,xml)
    {
        if(OK)
        {
            try
            {
               var res = xml.documentElement.getElementsByTagName("Result")[0].firstChild.nodeValue;
               if(res=='True')
               {
                    //Banner,Mess,Contact,Info,Err
                    var nodes = xml.documentElement.childNodes;
                    for(var i=0;i<nodes.length;i++)
                    {
                        var node = nodes[i];
                        switch(node.nodeName)
                        {
                            case "Banner":
                                SetBaner(node.getAttributeNode('Type').nodeValue,node.getAttributeNode('Text').nodeValue);
                                break;
                            case "Mess":
                                contacts.AddMess(node.getAttributeNode('ID').nodeValue,node.getAttributeNode('Text').nodeValue,false,parseFloat(node.getAttributeNode('Date').nodeValue),node.getAttributeNode('From').nodeValue);
                                break;
                            case "Contact":
                                if(node.getAttributeNode('Action').nodeValue=='add')
                                {
                                   var ctype1 = GetCType(node.getAttributeNode('Type').nodeValue);
                                   var cst1 = GetCSt(node.getAttributeNode('Status').nodeValue);
                                   
                                    contacts.Add(new parent.Contact(ctype1 ,
                                        node.getAttributeNode('ID').nodeValue,
                                        node.getAttributeNode('Name').nodeValue,
                                        cst1,
                                        parseFloat(node.getAttributeNode('IsChannel').nodeValue)
                                            )
                                        );
                                }else{contacts.Delete(node.getAttributeNode('ID').nodeValue);}
                                break;
                            case "Info":
                                var cst2 = GetCSt(node.getAttributeNode('Status').nodeValue);
                                contacts.SetState(node.getAttributeNode('ID').nodeValue,cst2);
                                break;
                            case "Err":
                                ShEr(node.getAttributeNode('ID').nodeValue,node.getAttributeNode('Text').nodeValue);
                                break;
                        }
                    }
               }
            }catch(e){}
        }
        delete hashAReqs[num];
    }
    var GetCType = function(ctype)
    {
        switch(ctype)
        {
            case "ICQ":
                return cType.ICQ;
                break;
            case "MSN":
                return cType.MSN;
                break;
            case "GTalk":
                return cType.GTalk;
                break;
            case "IRC":
                return cType.IRC;
                break;
        }
    }
    var GetCSt = function(cst)
    {
        switch(cst)
        {
            case "Online":
                return cStat.Online;
                break;
            case "Offline":
                return cStat.Offline;
                break;
            case "NA":
                return cStat.NA;
                break;                                
        }
    }
    this.Remove = function(rid)
    {
		root.removeChild(document.getElementById(rid));
    }
    this.Count = function()
    {
        return root.childNodes.length;
    }
}

function Send(evt,id)
{
    var div = document.getElementById('div'+id);
    var text = document.getElementById('ta'+id).value;
    
	if(!Check(div,text,evt)){return false;}
	
	document.getElementById('ta'+id).setAttribute('disabled','true');
	document.getElementById('btn'+id).setAttribute('disabled','true');
	requests.SendTM(id,text);
}
// MyStatus
var MyStatus = cStat.Online;
function SetMyStatus()
{
    try 
    {
        var aSt1 = document.getElementById('aSt1');
        var aSt2 = document.getElementById('aSt2');
        var imgSt = document.getElementById('imgSt');
        
        if(MyStatus == cStat.Online){MyStatus = cStat.NA;}else{MyStatus = cStat.Online;}
        
        aSt1.setAttribute('title',GetMyStatusChangeText(MyStatus));

        imgSt.setAttribute('title',MyStatus);
        imgSt.setAttribute('alt',MyStatus);
        imgSt.src = GetMyStatusImg(MyStatus);
        
        aSt2.setAttribute('title',GetMyStatusChangeText(MyStatus));
        aSt2.innerHTML=MyStatus;
    }catch(e){}
    return false;
}
function GetMyStatusImg(mystat)
{
    if(MyStatus == cStat.Online)
        return "images/myonline.gif";
    else
        return "images/myna.gif";
}
function GetMyStatusChangeText(mystat)
{
    if(MyStatus == cStat.Online)
        return cMyStat.Online;
    else
        return cMyStat.NA;
}

// Common
function GetTagPos(el){var pos=new Object;pos.x=0;pos.y = 0;while(el.offsetParent!=null){pos.x+=el.offsetLeft;pos.y+=el.offsetTop;el=el.offsetParent;}return pos;}
function Over(tag){tag.className=tag.className.replace('Out','Over');}
function Out(tag){tag.className=tag.className.replace('Over','Out');}

function RetObjChat(obj,div)
{
    this.Obj = obj;
    this.Div = div;
} 
// Class Chat
function Chat(ID,Title)
{
    this.ID = ID;
    var div=null;
    var isActive=true;

    var Create = function()
    {
        var o = CreateChat(ID,Title,this.Status,TAKeyPress);
        div = o.Div; 
        return o.Obj;
    }
    var TAKeyPress = function(evt,id)
    {
        evt = (evt) ? evt : ((event) ? event : null);
        if (evt) {
            var keyCode = (evt.keyCode) ? evt.keyCode : evt.which;
            var isCtrl = evt.ctrlKey;

            if((keyCode==13 || keyCode==10) && isCtrl)
            {
                return Send(evt,id);
            }
        }
    }
    this.object = Create();
    this.Hide = function()
    {
		isActive = false;
        var table = document.getElementById(ID);
        var firstTR = table.childNodes.item(0).childNodes.item(0);
        firstTR.nextSibling.style.display='none';
        firstTR.nextSibling.nextSibling.style.display='none'; 
        var headerlabel = document.getElementById('HL'+ID);
        headerlabel.className = headerlabel.className.replace('Show','Hide');
        
        firstTR.className = firstTR.className.replace('Show','Hide');
    }
    this.Show = function()
    {
		isActive = true;
        var table = document.getElementById(ID);
        var firstTR = table.childNodes.item(0).childNodes.item(0);
        firstTR.nextSibling.style.display='';
        firstTR.nextSibling.nextSibling.style.display=''; 
        var headerlabel = document.getElementById('HL'+ID);
        headerlabel.className = headerlabel.className.replace('Hide','Show');
        
        firstTR.className = firstTR.className.replace('Hide','Show');
        this.focus();
        ScrollToBottom();
    }
    this.focus = function()
    {
		try{document.getElementById('btn'+ID).focus();}catch(e){;};
		try{document.getElementById('ta'+ID).focus();}catch(e){;};
    }
    var ScrollToBottom = function()
    {
		if(isActive)
		{
	        div.scrollTop=div.scrollHeight;
		}
    }
    this.SetStatusIcon = function(url,status)
    {
        var img = document.getElementById('chatimg'+this.ID);
        if(img && !(img.src.indexOf(url)>-1))
        {
            img.src=url;
			img.setAttribute("title",status);
        }
        if(img && img.getAttribute("title") !=status)
        {
			img.setAttribute("title",status);
        }
    }
    var Enable = function()
    {
        var doc = document;
		doc.getElementById('ta'+ID).removeAttribute('disabled');
		doc.getElementById('btn'+ID).removeAttribute('disabled');
		doc.getElementById('ta'+ID).value='';    
    }
    this.AddMess=function(text,isMy,mdate,uname) //chat
    {
		var doc = document;
		var t = GetMess(text,isMy,mdate,uname);
		div.appendChild(t);
		
		if(isMy)
		{
		    Enable();
		}else
		{
			var h = document.getElementById('HL'+ID);
			h.setAttribute('title',t.innerText);
			h.parentNode.setAttribute('title',t.innerText);
		}

		if(isActive)
		{
		    this.focus();
		}
		else
		{
			if(!isMy)
			{
				var c = contacts.Contact(this.ID);
				contacts.SetStatus(c.ID,c.Status,true);
				contacts.Chats.SetStatus(c.ID,c.Status,true,c.Type);
			}
		}
		ScrollToBottom();
    }
	this.Active = function()
	{
		return isActive;
	}
	var GetMess = function(text,isMy,mdate,uname)
	{
		var doc = document;
		var root = doc.createElement('span');
		var time = doc.createElement('b');
		var prefix = uname=''?mdate:mdate + ' ' + uname;
		time.appendChild(doc.createTextNode(prefix));
		root.appendChild(time);
		root.appendChild(doc.createTextNode(': '));
		var mess = doc.createElement('span');
		mess.className = isMy ? 'messagemytext':'messagetext';
		
        var arrText = text.split('\n');
        for(var i=0;i<arrText.length;i++)
        {
            //if(arrText[i]!='')
            {
                //mess.appendChild(doc.createTextNode(arrText[i]));
                SetParsedUrls(arrText[i],doc,mess);
                mess.appendChild(doc.createElement('br'));                
            }
        }
		root.appendChild(mess);
		//root.appendChild(doc.createElement('br'));
		return root;
	}
	var SetParsedUrls =function(text,doc,mess)
    {
        var re=/http:\/\/([^\s]+)/g;
        var arr;
        var last = 0;
        while ((arr = re.exec(text)) != null)
        {
        
            mess.appendChild(doc.createTextNode(text.substring(last, arr.index)));
            
            var a =doc.createElement('a')
            a.href=arr[0];
            a.target="_blank";
            a.title = consts.UrlTitle;
            a.appendChild(doc.createTextNode(arr[0]));
            
            mess.appendChild(a);
            last= arr.index +arr[0].length ;
        }
        mess.appendChild(doc.createTextNode(text.substring(last)));
    }
}
function Chats(tagID)
{
    var root = document.getElementById(tagID);
    var hash = {};
    var activeWindowID = null;
    this.Count = 0;
    this.Add = function(chat)
    {
        if(!(chat.ID in hash))
        {
            hash[chat.ID] = chat;
            root.appendChild(hash[chat.ID].object);
            this.Count++;
            
			var c = contacts.Contact(chat.ID);
			var newMess = c.GetNewMess();
			
            this.Activate(chat.ID);
            for(var i=0;i<newMess.length;i++)
			{
				chat.AddMess(newMess[i][0],false,newMess[i][1],newMess[i][2]);
			}

        }
        else
        {
            this.Activate(chat.ID);
        }
    }
    this.Remove = function(ID)
    {
        var tag = document.getElementById(ID);
        if((ID in hash) && tag !=null)
        {
            delete hash[ID];
            root.removeChild(document.getElementById(ID));
            this.Count--;
            if(ID==activeWindowID)
            {
                var lastWind = root.lastChild;
                if(lastWind!=null)
                {
                    var wid = lastWind.getAttribute('id');
                    
                    this.Chat(wid).Show();
                    activeWindowID=wid;
                    this.SetRead(wid);
                }else
                {
                    activeWindowID=null;   
                }
            }
            // Send close chat 
            requests.SendJM(ID,1);
        }
        HPUT();
    }
    this.Chat = function(ID){return hash[ID];}
    this.Activate = function(ID)
    {
        if(activeWindowID!=ID)
        {
            if(activeWindowID!=null)
            {
                this.Chat(activeWindowID).Hide();
            }
            this.Chat(ID).Show();
            this.SetRead(ID);
            activeWindowID = ID;
        }
        HPUT();      
    }
    this.SetRead = function(ID)
    {
        var c = contacts.Contact(ID);
        var m = this.Chat(ID);
        if(c!=null && m!=null)
        {
            contacts.SetStatus(c.ID,c.Status,false);
            this.SetStatus(c.ID,c.Status,c.HasMessages,c.Type);
        }
    }
    this.SetStatus = function(ID,status,HasMessage,type)
    {
        if(ID in hash)
        {
            var m = hash[ID];
            m.SetStatusIcon(contacts.GetStatusImgUrl(status,HasMessage,type),status);
        }
    }
}
function Contact(type,name,title,status,ischannel)
{
    this.Name=name;
    this.ID = type+name;
    this.Title = title;
    this.Status = status;
    this.Type=type;
    this.HasMessage = false;
    this.IsChannel = ischannel==1;
    var mess = new Array();
    
    this.getObject = function()
    {
        var tr = document.createElement('tr');
        tr.setAttribute('id','cont'+this.ID);
        tr.setAttribute('st',this.Status);
        if(this.HasMessage)
        {
            tr.setAttribute('m','1');
        }
        var td1 = document.createElement('td');
        td1.className='contactscol1';
        var statusImg = document.createElement('img'); 
        statusImg.setAttribute('src',contacts.GetStatusImgUrl(this.Status,this.HasMessage,this.Type));
        statusImg.setAttribute('width','16px');
        statusImg.setAttribute('height','16px');
        statusImg.setAttribute('hspace','0');
        statusImg.setAttribute('vspace','0');
        statusImg.setAttribute('border','0');
        statusImg.setAttribute('align','middle');
        statusImg.setAttribute('alt',this.Status);
        statusImg.setAttribute('title',this.Status);
        
        td1.appendChild(statusImg);
        tr.appendChild(td1);
        var td2 = document.createElement('td');
        td2.className='contactscol2';
        
        var shortName = this.Title;
        if(shortName.length>25)
        {
            shortName = shortName.substr(0,22) + '...'
        }
        var a = document.createElement('a');
        a.setAttribute('href','#');
        a.setAttribute('title',this.Title);
        a.className='uin';
        a.appendChild(document.createTextNode( shortName ))
        a.onclick=function(){contacts.Contact(type+name).Activate();return false;}   
        td2.appendChild(a);
        tr.appendChild(td2);
        return tr;
    }
    this.AddMess = function(text,isMy,mdate,uname) //Contact
    {
		var ch = contacts.Chats.Chat(this.ID);
		if(ch==null)
		{
			if(!isMy)
			{
			    if(!this.IsChannel)// skip mess after channel closed
			    {
				    mess.push([text,mdate,uname]);
				    contacts.SetStatus(this.ID,this.Status,true);
				}
			}
		}else
		{
			ch.AddMess(text,isMy,mdate,uname);//Chat
		}
    }
    this.Activate = function()
    {
        var titleLen = 33;
        if(isMobile) titleLen = 24;
        
        contacts.Chats.Add(new Chat(this.ID,this.Title.substr(0,titleLen)));
        // Send activate mess 
        requests.SendJM(this.ID,0);
    }
    this.GetNewMess = function(){var tmp=mess;mess=new Array();return tmp;}
}
function Contacts(rootTagID,chRootTagID)
{
    var root = document.getElementById(rootTagID);
    this.Chats = new Chats(chRootTagID);
    var hash = {};
    
    this.Add = function(contact)
    {
        var isNew = false;
        if(!(contact.ID in hash))
        {
            hash[contact.ID] = contact;
            isNew = true;
        }
        var tag = null;
        
        if(contact.HasMessage) tag = root.firstChild;
        else
        {
            tag = GetFirst(contact.Status);
        }
        if(tag==null)
        {
            if(contact.Status==cStat.Online)
            {
                tag = GetFirst(cStat.NA);
            }
            if(tag==null)
            {
                tag = GetFirst(cStat.Offline);
            }
        }
        if(isNew)
        {
            root.insertBefore(contact.getObject(),tag);
        }
    }
    var GetFirst = function(status)
    {
        var nodes = root.childNodes;
        var l = nodes.length;
        var ret=null;
        for(i=0;i<l;i++)
        {
            var n = nodes[i];
            if(n.getAttribute('st')==status && n.getAttribute('m')!='1')
            {
                ret = n;
                break;
            }
        }
        return ret;
    }
    this.SetStatus = function(ID,status,HasMessage)
    {
        if(ID in hash)
        {
            var c = hash[ID];
            if(c.Status != status || c.HasMessage !=HasMessage)
            {
                this.Remove(ID);
                c.Status = status;
                c.HasMessage =HasMessage;
                this.Add(c);
				this.UpdateTitle();
            }
        }
    }
    this.SetState = function(ID,status)
    {
        if(ID in hash)
        {
            var c = hash[ID];
            if(c.Status != status)
            {
                this.Remove(ID);
                c.Status = status;
                this.Add(c);
                contacts.Chats.SetStatus(c.ID,c.Status,c.HasMessage,c.Type);
				this.UpdateTitle();
            }
        }
    }        
	this.UpdateTitle = function()
	{
			try{
			document.title= isMessageReceived || HasUnread()? consts.TextNewMess+document.title.replace(consts.TextNewMess,''): document.title.replace(consts.TextNewMess,'');
			}catch(e){;};
	}
	var HasUnread = function()
	{
		var f = root.firstChild;
		if(f!=null)
		{
			return f.getAttribute('m')=='1';
		}
		return false;
	}
	this.Delete = function(ID)
	{
	    //this.Chats.Remove(ID);
	    this.Remove(ID);
	}
    this.Remove = function(ID)
    {
        if(ID in hash)
        {
            var c = hash[ID];
            DeleteTag(ID);
            delete hash[ID];
        }
    }
    var DeleteTag = function(ID)
    {
        var tag = document.getElementById('cont'+ID);
        var prnt = tag.parentNode;
        prnt.removeChild(tag);
    }
    this.Contact = function(ID){return hash[ID];}
    this.AddMess = function(ID,text,isMy,mdate,uname) //Contacts
    {
		if(ID in hash)
        {
            var d = new Date(mdate);
            var sdh = d.getHours()<10?'0'+d.getHours():d.getHours();
            var sdm = d.getMinutes()<10?'0'+d.getMinutes():d.getMinutes();
            
            var c = hash[ID];
            c.AddMess(text,isMy,sdh+':'+sdm,uname); //Contact
            if(!isMy){isMessageReceived = true;}
            this.UpdateTitle();
        }			
    }
    this.GetStatusImgUrl = function(Status,HasMessage,type)
    {
        var imgurl='';
        if(HasMessage) imgurl= 'images/msg.gif';
        else
        {
            if(type == cType.ICQ )
            {
                if(Status == cStat.Offline) imgurl= 'images/icqoffline.gif';
                if(Status == cStat.Online)  imgurl= 'images/icqonline.gif';
                if(Status == cStat.NA)      imgurl= 'images/icqNA.gif';
            }
            if(type == cType.MSN )
            {
                if(Status == cStat.Offline) imgurl= 'images/msnoffline.gif';
                if(Status == cStat.Online)  imgurl= 'images/msnonline.gif';
                if(Status == cStat.NA)      imgurl= 'images/msnNA.gif';
            }
            if(type == cType.GTalk )
            {
                if(Status == cStat.Offline) imgurl= 'images/gtalkoffline.gif';
                if(Status == cStat.Online)  imgurl= 'images/gtalkonline.gif';
                if(Status == cStat.NA)      imgurl= 'images/gtalkNA.gif';
            }
            if(type == cType.IRC )
            {
                if(Status == cStat.Offline) imgurl= 'images/ircoffline.gif';
                if(Status == cStat.Online)  imgurl= 'images/irconline.gif';
                if(Status == cStat.NA)      imgurl= 'images/ircNA.gif';
            }
        }        
        return imgurl;
    }
}

function ShowText(tag)        
{
	HPUT();
	var p = GetTagPos(tag);
	var m = document.getElementById('about');
	var bm = document.getElementById('aboutbg');
	var t = document.getElementById('aboutText');
    
	
	if(isMobile)
	{
	    m.style.top = p.y+20+'px';
	}
	else
	{
	    m.style.top = p.y+14+'px';
	    m.style.left = p.x+'px';
	}
	m.style.display = 'inline';
	if(bm)
	{
    	bm.style.top = p.y+14+5+'px';
        bm.style.left = p.x+5+'px';
        bm.style.display = '';
        ppbg = bm;
	}
	pp=m;
}
function ShowAbout(tag,evt)
{
	evt = (evt) ? evt : ((event) ? event : null);
	if (evt) {        
		ShowText(tag);
		try{evt.cancelBubble = true;}catch(e){;};
	}
	return false;
}
function refrsh()
{
    var tt = contacts.Chats.Count>0?ARTimeout:RTimeout;
    requests.SendIM();
    window.setTimeout('refrsh()', tt);
}


///////////////////////////
function ShowTab(id)
{
    var i;
    for(i=1;i<5;i++)
    {
        var td = document.getElementById('t'+i);
        td.className = i==id?'tabshowOver':'tabhideOut';
        var b = document.getElementById('b'+i);
        b.className = i==id?'borderHide':'borderShow';
        
        var f = document.getElementById('f'+i);
        f.className = i==id ?'l_tabShow':'l_tabHide';
    }
    return false;
}
function ShowRTab(id)
{
    var i;
    for(i=1;i<5;i++)
    {
        var li = document.getElementById('li'+i);
        li.className = i==id ?'tabsA':'tabsU';
        var f = document.getElementById('f'+i);
        f.className = i==id ?'l_tabShow':'l_tabHide';
    }
    return false;
}
function ShowMTab(id)
{
    var f = document.getElementById('f'+id);
    f.style.display = f.style.display=='none'?'':'none';
    return false;
}
var arFilled = [[false,'',''],[false,'',''],[false,'',''],[false,'','']];

function CheckLoginStatus(id)
{
    var l = document.getElementById('l'+id);
    var p = document.getElementById('p'+id);
    var i = document.getElementById('i'+id);
    if(l.value.length>0 && p.value.length>0)
    {
        arFilled[id-1][0] = true;
        arFilled[id-1][1] = l.value;
        arFilled[id-1][2] = p.value;
        if(i)
            i.src="images/bshow.gif";    
    }else
    {
        arFilled[id-1][0] = false;
        arFilled[id-1][1] = l.value;
        arFilled[id-1][2] = p.value;
        if(i)
            i.src="images/bhide.gif";
    }
    var b = !(arFilled[0][0] || arFilled[1][0] || arFilled[2][0] || arFilled[3][0]) || requests.Count()>0;
    document.getElementById('btnLogin').disabled = b;
}

function Login()
{
    var p = [];
    if(arFilled[0][0] || arFilled[1][0] || arFilled[2][0] || arFilled[3][0])
    {
        if(arFilled[0][0])
        {
            p[p.length] = cType.ICQ;
            p[p.length] = arFilled[0][1];
            p[p.length] = arFilled[0][2];
        }
        if(arFilled[1][0])
        {
            p[p.length] = cType.MSN;
            p[p.length] = arFilled[1][1];
            p[p.length] = arFilled[1][2];
        }
        if(arFilled[2][0])
        {
            p[p.length] = cType.IRC;
            p[p.length] = arFilled[2][1];
            p[p.length] = arFilled[2][2];
        }
        if(arFilled[3][0])
        {
            p[p.length] = cType.GTalk;
            p[p.length] = arFilled[3][1];
            p[p.length] = arFilled[3][2];
        }     
        var rm = document.getElementById('chRM').checked;
        document.getElementById('btnLogin').disabled=true;
        requests.Login(rm,p,bUseRSA);
    }
}

function Login_ShowError(arErr)
{
    var lp = document.getElementById('divLoading');
    if(lp)
    {
        lp.style.display = 'none';
    }
    
    var root = document.getElementById('errBlock');
    root.style.display='block';
    
    var rootContent = document.getElementById('errBlockContent');
    rootContent.removeChild(rootContent.firstChild);
 
    var table =  document.createElement('table');
    table.cellSpacing=0;
    table.cellPadding=0;
    table.setAttribute('border','0');
    table.setAttribute('width','100%');
    table.className='l_err';
    var tableBody =table.appendChild(document.createElement('tbody'));
    
    for(var i=0;i<arErr.length;i++)
    {
        var tableTr = tableBody.appendChild(document.createElement('tr'));
        var tableTd = tableTr.appendChild(document.createElement('td'));
        var bld = tableTd.appendChild(document.createElement('b'));
        bld.appendChild(document.createTextNode(arErr[i][0]));
        tableTd.appendChild(document.createTextNode( ': ' ));
        tableTd.appendChild(document.createTextNode( unescape(arErr[i][1]) ));
    }
    
    rootContent.appendChild(table);
    document.getElementById('btnLogin').disabled=false;
    
    
    var divAD = document.getElementById('divAD');
    if(divAD) divAD.style.top = (182+root.offsetHeight)+'px';
}
// Banners
function SetBaner(type,html)
{
    var btag = document.getElementById('B' +type);
    if(btag)
    {
       btag.innerHTML = html;
    }
}
// AJAX functions
var IsAJAX = CheckAjax(); // Global var

function CheckAjax()
{
    try
    {
        if (window.XMLHttpRequest) 
        {
            return true;
        }
        if (window.ActiveXObject) 
        {
            var a = new ActiveXObject("Microsoft.XMLHTTP"); 
            if(a)  
            {
                a=null;
                return true;
            }
        }
    }
    catch(e){};
    return false;
}
function GetAJAXObject()
{
    try
    {
        if (window.XMLHttpRequest) 
        {
            return new XMLHttpRequest();
        }
        else
        {
            return new ActiveXObject("Microsoft.XMLHTTP");
        }
    }catch(e){};
    
    return null;
}
function AJAXRequest(num,url,callback)
{
    var oAJAX = null;
    var responseXML = null;
    
    if(IsAJAX)
    {
        try
        {
            oAJAX = GetAJAXObject();
            oAJAX.onreadystatechange = onreadystatechange;
            oAJAX.open('GET',url,true);
            oAJAX.send(null);
        }catch(e){};
    }
    function onreadystatechange()
    {
       var OK = false;
       if (oAJAX.readyState == 4) 
       {
            if (oAJAX.status == 200) 
            {
                if(oAJAX.responseXML)
                {
                    responseXML = oAJAX.responseXML;
                    if(responseXML.documentElement)
                    {
                        OK = true;
                    }
                }
            }
            
            delete oAJAX['onreadystatechange'];
            oAJAX = null;
            callback(num,OK,responseXML);
        }
    }
}

// System utils
function encode64(input) 
{
    var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var output = "";
    var chr1, chr2, chr3;
    var enc1, enc2, enc3, enc4;
    var i = 0;

    do {
        chr1 = input.charCodeAt(i++);
        chr2 = input.charCodeAt(i++);
        chr3 = input.charCodeAt(i++);

        enc1 = chr1 >> 2;
        enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
        enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
        enc4 = chr3 & 63;

        if (isNaN(chr2)) {
         enc3 = enc4 = 64;
        } else if (isNaN(chr3)) {
         enc4 = 64;
        }

        output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + 
        keyStr.charAt(enc3) + keyStr.charAt(enc4);
    } while (i < input.length);

    return output;
}

function EncryptLoginPass(login,password)
{
    var lp = escape(login) + "&" + escape(password)
    return encryptedString(RSAkey, encode64(lp) );
}
