///////////////////////////////////
//         ajax im v3.1          //
//    AJAX Instant Messenger     //
//   Copyright (c) 2006-2007     //
// unwieldy studios/Joshua Gross //
//  http://unwieldy.net/ajaxim/  //
//   Do not remove this notice   //
///////////////////////////////////

// Configurable Options //

// Notification // 
var useBlinker    = true;           // Show new message in titlebar when window isn't active.
var blinkSpeed    = 1000;           // How fast to change between the titles when "blinking" (in milliseconds).
var pulsateTitles = true;           // Pulsate (blink) IM window titles on new IM when they are not the active window.
var audioNotify   = true;           // By default, play sounds upon getting an IM?

// Server //
var pingFrequency = 2500;           // How often to ping the server (in milliseconds). Best range between 2500 and 3500 ms.
var pingTo        = 'ajax_im.php';  // The file that is the "server".

// Windows //
//var imWidth       = 310;            // Default IM window width
var imWidth       = 435;
var imHeight      = 335;            // Default IM window height
var imHistory     = false;           // "Save" conversations with buddies throughout the session
var imDetachable  = false;           // Enable/Disable ability to detach windows from the application

// Smilies //
var smilies = [                    // Smiley format: 'smiley~imagename.ext',
	"[vui]~1.gif", // happy  
	"[buon]~2.gif", // sad
	"[cuoimim]~3.gif", // winking  
	"[cuoideu]~4.gif", // grin     
	"[nhaymat]~5.gif", // eyelashes
	"[mungro]~6.gif", // hug
	"[khochiu]~7.gif", // confused
	"[yeu]~8.gif", // love
	"[macco]~9.gif", // blushing 
	"[leluoi]~10.gif", // tongue 
	"[hun]~11.gif", // kiss 
	"[tannat]~12.gif", // broken heart 
	"[ngacnhien]~13.gif", // supprise 
	"[giandu]~14.gif", // angry 
	"[ongke]~15.gif", // smug 
	"[ngau]~16.gif", // cool
	"[lolang]~17.gif", // worried
	"[daudau]~18.gif", // whew
	"[keke]~19.gif", // devil
	"[khoc]~20.gif", //  crying 
	"[cuoibu]~21.gif", // laughing 
	"[tinhbo]~22.gif", // straight face 
	"[nhiumay]~23.gif", // raised eyebrow 
	"[cuoibo]~24.gif", // rolling on the floor 
	"[thienthan]~25.gif", // angel 
	"[giaosu]~26.gif", // nerd
	"[stop]~27.gif", // talk to the hand 
	"[buonngu]~28.gif", // sleepy 
	"[tronmat]~29.gif", // rolling eyes 
	"[thua]~30.gif", // loser 
	"[binh]~31.gif", // sick 
	"[suyt]~32.gif", // don't tell anyone 
	"[khongnoi]~33.gif", // not talking 
	"[tote]~34.gif", // clown 
	"[ngoc]~35.gif", // silly 
	"[thoiken]~36.gif", // party 
	"[ngap]~37.gif", // yawn 
	"[them]~38.gif", // drooling 
	"[suynghi]~39.gif", // thinking 
	"[ohoh]~40.gif", // d'oh 
	"[votay]~41.gif", // applause 
	"[chemieng]~42.gif", // nailbiting 
	"[chopchop]~43.gif", // hypnotized 
	"[xao]~44.gif", // liar 
	"[doi]~45.gif", // waiting 
	"[xoi]~46.gif", // sigh 
	"[oeoe]~47.gif", // phbbbbt 
	"[caoboi]~48.gif", // cowboy   
	"[callme]~49.gif", // on the phone - New!
	"[onphone]~50.gif", // call me - New! 
	"[ahah]~51.gif", // at wits' end - New! 
	"[vaytay]~52.gif", // wave - New! 
	"[hetgio]~53.gif", // time out - New! 
	"[momong]~54.gif", // daydreaming - New! 
	"[vuive]~55.gif",
	"[thacmac]~56.gif",
	"[ykienhay]~57.gif",
	"[tocvang]~58.gif",
	"[tocden]~59.gif",
	"[tocdo]~60.gif",
	"[quabi]~61.gif",
	"[daulau]~62.gif",
	"[nguoihanhtinh]~63.gif",
	"[ninza]~64.gif",
	"[heo]~65.gif",
	"[ga]~66.gif",
	"[bo]~67.gif",
	"[khi]~68.gif",
	"[cafe]~69.gif",
	"[batquai]~70.gif",
	"[la]~71.gif",
	"[hoahong]~72.gif",
	"[khongnghe]~73.gif",
	"[cuccu]~74.gif",
	"[kinhngac]~75.gif",
	"[chao]~76.gif",
	"[huytsao]~77.gif",
	"[tien]~78.gif",
	"[vodau]~79.gif",
	"[goidien]~80.gif",
	"[hinhsu]~81.gif",
	"[lamduyen]~82.gif",
	"[nanni]~83.gif",
	"[chienthang]~84.gif",
	"[vannai]~85.gif",
	"[khongbiet]~86.gif",
	"[khongbaogio]~87.gif",
	"[potay]~88.gif",
	"[khieukhich]~89.gif",
	"[sao]~90.gif",
	"[VIETNAM]~vietnam.gif",
	"[vietnam]~vietnam.gif",
	"[YEU]~love2.gif"
];

// Other //
var alertCSS      = 'alphacube';    // CSS file for alerts and login/add buddy/IM anyone windows
var alertWidth    = 400;            // Alert window width (see above)
var windowCSS     = 'default';      // CSS file for all other windows (buddylist, IMs)
var buddyListLoc  = 1;              // Buddylist location: 0=left, 1=right

// End Configurable Options //

// Begin Code                                   //
// Note: Do not edit below this line unless you //
//       know what you are doing!               //
var user='';
var pass='';
var isAway=0;
var awayMessage = '';
var curSelected='';
var loggedIn = false;
var IMWindows={};
var titlebarBlinker=false;
var defaultTitle=document.title;
var blinkerTimer;
var pingTimer;
var buddyList = {};
var toWin;
var newWin, newWinRcvd;

var isTyping = 0;
var lastMsgs = [];

var avatar='';
var alias = '';

var favatar = [];
var falias = [];

window.onbeforeunload = function(event) {
   if(isIE || !event) event = window.event;
   if(event && user.length > 0) {
      var text = "If you do so, you will be signed out of the instant messenger.";
      if(isIE) event.returnValue = text;
      window.onbeforeunload = function() { };
      return text;
   }
}

window.onunload = function() {
   if(user.length > 0) {
      logout();
   }
}

var buddyListWin;

function fixBuddyList() {
   if(buddyListWin && buddyListWin.isVisible()) {
      buddyListWin.setSize(210, (browserHeight() - 50));
      buddyListWin.setLocation((((browserHeight()-40) / 2) - (buddyListWin.getSize()['height'] / 2)), (buddyListLoc == 0 ? 10 : (browserWidth() - buddyListWin.getSize()['width'] - 10)));
      sizeBuddyList();
   }
}

function login() {
	
   //var username = ($('username').value) ? $('username').value : WindowUtilities.getCookie('vuser');// edited khanh
   var username = $('username').value;
   var password = $('password').value;   
   
   var signonButton = $('signon_button');
   signonButton.onclick = function() { };
   
   var xhConn = new XHConn();
   //xhConn.connect(pingTo, "POST", "call=login&from="+username+"&pwd="+hex_md5(password),
	xhConn.connect(pingTo, "POST", "call=login&from="+username+"&pwd="+password,
      function(xh) {
         if(xh.responseText == 'invalid') {		
		 	$('modal').style.display = 'block'; // added khanhvu
			login_dialog(); // added khanhvu
			if(username!='' && password!='')
			{
				$('login_error_msg').innerHTML = 'Username or password incorrect!';
				$('login_error_msg').style.display = 'block'; 
				new Effect.Shake('modal');
			}
            signonButton.onclick = function() { checklogin();return false; };			
         } else {			 	
            user = username;
            pass = hex_md5(password);
            defaultTitle = document.title = document.title + ' ' + user;
            window.onresize = fixBuddyList;
			
            if(!$('bl')) {
               buddyListWin = new Window('bl', {className: "dialog", width: 210, height: (browserHeight() - 60), zIndex: 100, resizable: true, 
                                                title: "Hcmmail!chat", draggable: true, closable: false, maximizable: false, detachable: false, minWidth: 205, minHeight: 150,
                                                showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}});
            }
            buddyListWin.getContent().innerHTML = '<div id="blTopToolbar"><span class="toolbarButton"><img id="addbuddy" src="images/'+windowCSS+'/addbuddy.gif" class="toolbarButton" onclick="new_buddy_dialog();" alt="Add Contact" title="Add Contact" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onmousedown="buttonDown(this);" onmouseup="buttonNormal(this);" /></span><span class="toolbarButton"><img id="removebuddy" src="images/'+windowCSS+'/removebuddy.gif" class="toolbarButton" onclick="remove_buddy_dialog();" alt="Remove Contact" title="Remove Contact" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onmousedown="buttonDown(this);" onmouseup="buttonNormal(this);" /></span><span class="toolbarButton"><a href="http://mail.hcmmail.vn" target="blank"><img id="joinroom" src="images/'+windowCSS+'/joinroom.gif" class="toolbarButton" border="0" alt="Read mail" title="Read mail" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onmousedown="buttonDown(this);" onmouseup="buttonNormal(this);"/></a></span><span class="toolbarButton"><img id="imanyone" src="images/'+windowCSS+'/imanyone.gif" class="toolbarButton" onclick="new_im_dialog();" alt="IM Anyone" title="IM Anyone" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onmousedown="buttonDown(this);" onmouseup="buttonNormal(this);" /></span><span class="toolbarButton"><a href="javascript:mocs()" style="cursor:hand"><img id="joinroom" src="images/'+windowCSS+'/help.gif" class="toolbarButton" border="0" alt="Help" title="Help" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onmousedown="buttonDown(this);" onmouseup="buttonNormal(this);"/></a></span><span class="toolbarButton"><img id="toggleaudio" src="images/'+windowCSS+'/audio_'+(audioNotify ? 'on' : 'off')+'.gif" onclick="toggleAudio();" alt="Toggle Audio" title="Toggle Audio" /></span><div id="statusSettings"><input type="text" id="customStatus" onkeypress="processCustomAway(event);" style="display:none" onblur="if($(\'customStatus\').style.display != \'none\') { $(\'customStatus\').style.display = \'none\'; $(\'curStatus\').style.display = \'block\'; }" /><a href="#" id="curStatus" onclick="toggleStatusList();return false;"><b>'+username+'</b> - I\'m available</a></div></div><div id="blContainer"><ul id="buddylist" class="sortable box"><li style="display:none"></li></ul></div><div id="blBottomToolbar"><a href="#" style="-moz-outline-style: none;" onclick="logout();return false;"><img src="images/'+windowCSS+'/signoff.png" style="border:0;" alt="Sign off" title="Sign off" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onmousedown="buttonDown(this);" onmouseup="buttonNormal(this);" /></a></div>';
            buddyListWin.getContent().oncontextmenu = function() { return false; };
            $('bl_minimize').style.left = (buddyListWin.getSize()['width'] - 21) + 'px';
            sizeBuddyList();
            buddyListWin.showCenter(false, (((browserHeight()-40) / 2) - (buddyListWin.getSize()['height'] / 2)), (buddyListLoc == 0 ? 10 : (browserWidth() - buddyListWin.getSize()['width'] - 10)));			
           
            if(trim(xh.responseText).length == 0) logout();

            var response = xh.responseText.parseJSON();
            
            pingTimer = setInterval(ping, pingFrequency);
            $('modal').style.display = 'none';
			
			if(response.logtime && response.logip)
			{
				$('loginStatus').innerHTML = '<span style="padding-left:10px; font-weight:bold; color:#330066; font-size:12px">' + ':: Last login : ' + response.logtime + '--- from : ' + response.logip + ' ::</span>';
			}else{
				$('loginStatus').innerHTML = '<span style="padding-left:10px; font-weight:bold; color:#330066; font-size:12px">' + ':: This is your first login ::</span>';
			}
			 
            $('contentBox').style.display = 'block';
			$('warnBox').style.display = 'block';
			setTimeout("$('warnBox').style.display='none';",20000);
			
			avatar = response.avatar;
			alias = response.fullname;
			
            var buddy;
            if(!response.buddy || response.buddy.length == 0) return;
            var budList = response.buddy.parseJSON();
			
            for(var group in budList) {				
               if(!$(group.replace(/\s/, '_')+'_group') && group != 'toJSONString') addGroupToList(group);
               if(!buddyList[group]) buddyList[group] = [];
               for(i=0; i<budList[group].length; i++) {
                     buddy = budList[group][i];
                     buddyList[group][i] = buddy.username;					 
					 
					 falias[buddy.username] = buddy.fullname;
					 favatar[buddy.username] = buddy.avatar;
					 
                     if(!$(buddy.username+'_blItem')) addBuddyToList(buddy.username, group);
                     $(buddy.username+'_blItem').style.display='block';
                     if(buddy.is_online == 0 || buddy.is_online == 50) {
                        moveBuddy(buddy.username, 'Offline');
                        $(buddy.username+'_blImg').src = 'images/offline.png';
                     } else if(buddy.is_online == 2) {
                        moveBuddy(buddy.username, group);
                        $(buddy.username+'_blImg').src = 'images/away.png';            
                     } else {
                        moveBuddy(buddy.username, group);
                        //$(buddy.username+'_blImg').src = 'images/online.png';
						if(favatar[buddy.username]!='' && favatar[buddy.username]!='noavatar.gif'){
							$(buddy.username+'_blImg').style.padding = '0px 0px 0px 12px'; 
							$(buddy.username+'_blImg').src = '../avatar/'+favatar[buddy.username];	
							$(buddy.username+'_blImg').width = 16;
							$(buddy.username+'_blImg').height = 16;
						 }else{
							$(buddy.username+'_blImg').src = 'images/online.png';
						 }		
						/*if(favatar[buddy.username]!=''){
							$(buddy.username+'_blImg').src = '../avatar/' + favatar[buddy.username];
						}else{
							$(buddy.username+'_blImg').src = 'images/online.png';
						}*/
                     }
               }
            }
			//offline message			
			if(!response.omsg || response.omsg.length == 0) return;
			/*
			createOFFWindow('omsg','Offline Message');
			var rcvdBox = $("omsg_rcvd");
			//rcvdBox.innerHTML = 
			rcvdBox.innerHTML += '<table id="omsg_tb" class="omsg_tb" cellpadding="3" cellspacing="3">';
			//rcvdBox.innerHTML = 
			rcvdBox.innerHTML += '<tr bgcolor="#ddd">';
			//rcvdBox.innerHTML = 
			rcvdBox.innerHTML += '<th>Sender</th><th width="50%">Message</th><th>Time</th><th>Recipient</th></tr>';
			
			var z; var sender; var recipient; var message; var stamp;
			
			for(z=0; z<response.num_omsg; z++) {
				
				sender = response.omsg[z].sender;
				recipient = response.omsg[z].recipient;
				message = response.omsg[z].message;
				stamp = response.omsg[z].stamp;
				
				//rcvdBox.innerHTML = 
				rcvdBox.innerHTML += '<tr bgcolor="#eee"><td>'+sender+'</td><td>'+message+'</td><td>'+stamp+'</td><td>'+recipient+'</td></tr>';
				
			}		
			rcvdBox.innerHTML += '</table>';
			*/
			omsgWin = new Window('omsg_im', {className: "dialog", width: 500, height: 300, top: '10px', left: '10px', resizable: true, title: 'Offline Message', draggable: true, detachable: imDetachable, minWidth: 500, minHeight: 300, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}});
   omsgWin.getContent().innerHTML = '<div class="rcvdOff" id="omsg_rcvd"></div><div class="rcvdOff" id="omsg_showBox"></div>';
   //onMouseOver=this.style.backgroundColor="#ffffff"
			
			var rcvdBox = $("omsg_rcvd");	
			rcvdBox.innerHTML += '<div class="omsgListHead"><div class="omsgListItem" style="width:15%;float:left;"><b>Sender</b></div><div class="omsgListItem" style="width:40%;float:left"><b>Message</b></div><div class="omsgListItem" style="width:25%;float:left"><b>Time</b></div><div class="omsgListItem" style="float:right"><b>Recept</b></div><div style="clear:both"></div></div>';
			
			var rcvdShow = $("omsg_showBox");
			
			var z; var sender; var recipient; var message; var stamp;
			
			for(z=0; z<response.num_omsg; z++) {
				
				sender = response.omsg[z].sender;
				recipient = response.omsg[z].recipient;
				message = response.omsg[z].message;
				stamp = response.omsg[z].stamp;
				
				message = message.replace(/(\s|\n|>|^)(\w+:\/\/[^<\s\n]+)/, '$1<a href="$2" target="_blank">$2</a>');
            	message = emoteReplace(message, smilies);
				
				//rcvdBox.innerHTML += "<tr bgcolor=\"#eee\"><td>"+sender+"</td><td>"+message+"</td><td>"+stamp+"</td><td>"+recipient+"</td></tr>";
				rcvdBox.innerHTML += '<div id="omsgItem_'+z+'" class="omsgListCont" onMouseOver=this.style.background="#e1ebf7" onMouseOut=this.style.background="#eee" onClick="toggleOmsg(\''+z+'\')" ondblclick="onDClick(\''+sender+'\')"><div class="omsgListItem" style="width:15%;float:left;"><span class="userA"><b>'+sender+'</b></span></div><div class="omsgListItem" style="width:40%;float:left">'+message+'</div><div  class="omsgListItem" style="width:25%;float:left">'+stamp+'</div><div class="omsgListItem" style="float:right">'+recipient+'</div><div style="clear:both"></div></div>';
				
				rcvdShow.innerHTML += '<div class="omsgShow" id="omsgShow_'+z+'">'+message+'</div>';
				
			}				
			//rcvdBox.innerHTML += "</table>";
			
			$('omsg_rcvd').style.height = 3/5*(omsgWin.getSize().height) + 'px'; // 103	
			$('omsg_showBox').style.height = 2/5*(omsgWin.getSize().height) + 'px'; 
			
			omsgWin.show();
			omsgWin.toFront();
			
			
			//rcvdBox.innerHTML = rcvdBox.innerHTML + '</table>';
			
			//$("omsg_tb").style.padding = '5px';
			
			//rcvdBox.innerHTML = rcvdBox.innerHTML + '<div>aaa_'+abc+'</div><br>';
			//rcvdBox.innerHTML = rcvdBox.innerHTML + abc;
			//end offline message();
			
         }
		 
      });
}
function onDClick(curSelected) {
   if(curSelected.length > 0) {
      if(!$(curSelected + '_im')) {
         createIMWindow(curSelected, curSelected);
      } else {
         if(IMWindows[curSelected].popup) {
            if(IMWindows[curSelected].popup.closed) {
               IMWindows[curSelected] = IMWindows[curSelected].old;
               IMWindows[curSelected].show();
            } else {
               IMWindows[curSelected].popup.focus();
            }
         } else if(!IMWindows[curSelected].isVisible()) {
            IMWindows[curSelected].show();
            IMWindows[curSelected].toFront();
            setTimeout("scrollToBottom('" + curSelected + "_rcvd')", 125);
            setTimeout("$('" + curSelected + "_sendBox').focus();", 250);
         } else {
            IMWindows[curSelected].toFront();
            setTimeout("$('" + curSelected + "_sendBox').focus();", 250);
         }
      }
   }
}

function toggleStatus(name){
	if($(name+'_lm').style.display == 'block') {
      	$(name+'_lm').style.display = 'none';    
   } else {     
      	$(name+'_lm').style.display = 'block';
   }	
}

function toggleOmsg(divID){
	for(var i=0;i<50;i++)
	{
		document.getElementById('omsgShow_'+i).style.display = 'none';		
		document.getElementById('omsgShow_'+divID).style.display = 'block';	
		document.getElementById('omsgItem_'+divID).style.background = '#fff';	
	}
}
function createOFFWindow(name, imTitle) {  

   IMWindows[name] = new Window(name + '_im', {className: "dialog", width: 500, height: 300, top: '10px', left: '10px',
                                               resizable: true, title: imTitle, draggable: true, detachable: imDetachable, minWidth: 500, minHeight: 300, showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}});
   IMWindows[name].getContent().innerHTML = '<div class="rcvdOff" id="' + name + '_rcvd"></div>' + "\n" +'<div class="rcvdOff" id="' + name + '_showBox">aaa</div>';
   
	$(name + '_rcvd').style.height = 3/5*(IMWindows[name].getSize().height) + 'px'; // 103	
	$(name + '_showBox').style.height = 2/5*(IMWindows[name].getSize().height) + 'px';
   //$(name + '_rcvd').style.width = (IMWindows[name].getSize().width - 10) + 'px';
   
	//$(name + '_rcvd').style.position = 'relative';
	//$(name + '_sendBox').style.position = 'relative';	
	 
   //$(name + '_sendBox').style.top = (IMWindows[name].getSize().height - 45) + 'px';
   //$(name + '_sendBox').style.left = '2px'; 
   
   //$(name + '_sendBox').style.height = (IMWindows[name].getSize().height - 103) + 'px';
   //$(name + '_sendBox').style.width = (IMWindows[name].getSize().width - 10) + 'px';

   IMWindows[name].show();
   IMWindows[name].toFront();
   //setTimeout("$('"+name+"_sendBox').focus();", 250);   
}
function logout() {
   if(user == '' || pass == '') return;
   //if(user == '') return; //edited khanh  
   //var xhConn = new XHConn();
   //xhConn.connect(pingTo, 'POST', 'call=logout&from='+user+'&pwd='+pass, null);

   var xmlhttp=false;
   /*@cc_on @*/
   /*@if (@_jscript_version >= 5)
   // JScript gives us Conditional compilation, we can cope with old IE versions.
   // and security blocked creation of the objects.
    try {
     xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
     try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     } catch (E) {
      xmlhttp = false;
     }
    }
   @end @*/
   if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
     xmlhttp = new XMLHttpRequest();
   }
   
   xmlhttp.open('POST', pingTo, false);
   xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   xmlhttp.send('call=logout&from='+user+'&pwd='+pass);
   
   clearTimeout(pingTimer);

   defaultTitle = document.title = document.title.replace(' ' + user, '');
   clearInputs()
   user = '';
   pass = '';
   
   isAway = 0;
   awayMessage = '';
   window.onresize = function() { };
   buddyListWin.hide();
   for(var name in IMWindows) {
      if(typeof($(name + '_im')) != 'undefined') {
         try {
            if(IMWindows[name].popup)
               IMWindows[name].popup.close();
            else
               IMWindows[name].destroy();
         } catch(e) { }
      }
   }
   
   Dialog.alert('<span class="dialog_long_label" style="color:#aa0000"><br>C&aacute;m &#417;n &#273;&atilde; s&#7917; d&#7909;ng HCMMAIL!Chat</span>',
                { windowParameters: {className:alertCSS, width:alertWidth, height: 85}, 
                  okLabel: "Back",
                  ok:function(win) {
                     try {
                        window.location.reload(); // edited khanh						
                     } catch(e) { }
                  }
                });
}

function auto_logout() {
   if(user == '' || pass == '') return;   
   //if(user == '') return; //edited khanh  
   //var xhConn = new XHConn();
   //xhConn.connect(pingTo, 'POST', 'call=logout&from='+user+'&pwd='+pass, null);

   var xmlhttp=false;
   /*@cc_on @*/
   /*@if (@_jscript_version >= 5)
   // JScript gives us Conditional compilation, we can cope with old IE versions.
   // and security blocked creation of the objects.
    try {
     xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
     try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
     } catch (E) {
      xmlhttp = false;
     }
    }
   @end @*/
   if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
     xmlhttp = new XMLHttpRequest();
   }
   
   xmlhttp.open('POST', pingTo, false);
   xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   xmlhttp.send('call=logout&from='+user+'&pwd='+pass);
   
   clearTimeout(pingTimer);

   defaultTitle = document.title = document.title.replace(' ' + user, '');
   clearInputs()
   user = '';
   pass = '';
   $('username').value = '';
   $('password').value = '';
   isAway = 0;
   awayMessage = '';
   window.onresize = function() { };
   buddyListWin.hide();
   for(var name in IMWindows) {
      if(typeof($(name + '_im')) != 'undefined') {
         try {
            if(IMWindows[name].popup)
               IMWindows[name].popup.close();
            else
               IMWindows[name].destroy();
         } catch(e) { }
      }
   }
   
   Dialog.alert('<span class="dialog_long_label" style="color:#aa0000; font-size:12px"><br>T&agrave;i kho&#7843;n c&#7911;a b&#7841;n,hi&#7879;n t&#7841;i &#273;&#432;&#7907;c &#273;&#259;ng nh&#7853;p b&#7857;ng m&aacute;y kh&aacute;c.!<br>&#272;&oacute;ng tr&igrave;nh duy&#7879;t l&#7841;i, ki&#7875;m tra t&agrave;i kho&#7843;n c&#7911;a b&#7841;n ngay l&#7853;p t&#7913;c</span>',
                { windowParameters: {className:alertCSS, width:alertWidth, height: 85}, 
                  okLabel: "Reconnect",
                  ok:function(win) {
                     try {
                        window.location.reload(); // edited khanh		
						//window.location.href = 'index.php';
                     } catch(e) { }
                  }
                });
}

function register() {
   var error = '';
   
   var registerButton = $('register_button');
   registerButton.onclick = function() { };
   
   if(($('newpassword').value == $('newpassword2').value)) {
      if(checkEmailAddr($('newemail').value)) {
         if($('newpassword').value.length >= 4 && $('newpassword').value.length <= 16) {
            if($('newusername').value.isAlphaNumeric() && $('newusername').value.length >= 3 && $('newusername').value.length <= 16) {
               var xhConn = new XHConn();
               
               var username = $('newusername').value;
               var password = $('newpassword').value;
               var email    = $('newemail').value;
               xhConn.connect(pingTo, "POST", "call=register&from="+username+"&pwd="+password+"&email="+email,
                  function(xh) {
                     switch(xh.responseText) {
                        case 'user_registered':
                           Dialog.alert('<span class="dialog_long_label">Registration Successful!</span><div style="clear:both"></div>',
                                        {windowParameters: {className:alertCSS, width:alertWidth},
                                         ok:function(win) { clearInputs(); Dialog.closeInfo(); login_dialog(); }});
                           registerButton.onclick = function() { register();return false; };
                           return;
                        case 'username_taken':
                           error = 'The username you have chosen is already in use.';
                           break;
                        case 'username_bad':
                           error = 'Usernames may only contain letters, numbers, _,<br />and be 3 to 16 characters long.';
                           break;
                        case 'password_bad_length':
                           error = 'Passwords must be 4 to 16 characters long!';
                           break;
                        case 'invalid_email':
                           error = 'Invalid Email Address!';
                           break;
                        case 'email_already_used':
                           error = 'A username is already registered with that email address!';
                           break;
                        default:
                           error = 'Registration Failed! Please try again later.';
                     }
                     $('register_error_msg').innerHTML = error;
                     $('register_error_msg').style.display = 'block';
                     new Effect.Shake('modal');
                     registerButton.onclick = function() { register();return false; };
                  });
                  return;
            } else {
               error = 'Usernames may only contain letters, numbers, _,<br />and be 3 to 16 characters long.';
            }
         } else {
            error = 'Passwords must be 4 to 16 characters long!';
         }
      } else {
         error = 'Invalid Email Address!';
      }
   } else {
      error = 'Passwords do not match!';
   }
   $('register_error_msg').innerHTML = error;
   $('register_error_msg').style.display = 'block';
   new Effect.Shake('modal');
   registerButton.onclick = function() { register();return false; };
}

function ping() {
   var xhConn = new XHConn();
   
   var awayText = (isAway==1) ? awayMessage : '';
   xhConn.connect(pingTo, "POST", "call=ping&from="+user+"&pwd="+pass+"&away="+isAway+"&awayMessage="+awayText,
      function(xh) {
         var i;

         if(xh.responseText == 'not_logged_in') {
            logout();
            return;
         }
		 else if(xh.responseText == 'auto_logout')
		 {
			auto_logout();
			return;
		 }
         
         if(trim(xh.responseText).length == 0) return;
         
         var response = xh.responseText.parseJSON();
         
         var from, data;
         for(i=0; i<response.numMessages; i++) {
            from = response.messages[i].sender;
            data = response.messages[i].message;
            who  = (response.messages[i].recipient == user ? from : response.messages[i].recipient);
         
            if(!$(who + '_im')) {
               createIMWindow(who, who);
            } else {
               if(!IMWindows[who].detached && !IMWindows[who].isVisible()) {
                  IMWindows[who].show();
                  setTimeout("scrollToBottom('" + who + "_rcvd')", 125);
               }
            }
            
            Stamp = new Date();
			var D = String(Stamp.getDate());
			var M = String(Stamp.getMonth()+1);
			var Y = String(Stamp.getFullYear());
			var h = String(Stamp.getHours());
			var m = String(Stamp.getMinutes());
			var s = String(Stamp.getSeconds());
            h = (h.length > 1) ? h : "0"+h;
			m = (m.length > 1) ? m : "0"+m;
			s = (s.length > 1) ? s : "0"+s;
			
            var curIM = (!IMWindows[who].detached ? $(who+"_rcvd") : IMWindows[who].popup.$(who+"_rcvd"));
		
if(data.search('UserIsTyping')!=-1)
{
	$(who+'_im_bottom').innerHTML ='<img align="absmiddle" src="images/emoticons/typing.gif">&nbsp;'+ falias[who] + ' is typing a message ';	
	if(lastMsgs[who]==null) lastMsgs[who] = '&nbsp;';
	setTimeout("$('"+who+"_im_bottom').innerHTML='"+lastMsgs[who]+"'", 30000);
}
else
{
			$(who+'_im_bottom').innerHTML = 'Last message received on ' + D + '/' + M + '/' + Y + ' at ' + h + ':' + m + ':' + s;	
			lastMsgs[who] = $(who+'_im_bottom').innerHTML;
            data = data.replace(/(\s|\n|>|^)(\w+:\/\/[^<\s\n]+)/, '$1<a href="$2" target="_blank">$2</a>');
            data = emoteReplace(data, smilies);
            if(data.replace(/<([^>]+)>/ig, '').indexOf('/me') == 0)
               //curIM.innerHTML = curIM.innerHTML + "<b class=\"userB\">[" + h + ":" + m + "] <i>" + from + ' ' + data.replace(/<([^>]+)>/ig, '').replace(/\/me/, '') + "</i></b><br>\n";
			   curIM.innerHTML = curIM.innerHTML + "<b class=\"userB\"><i>" + falias[from] + ' ' + data.replace(/<([^>]+)>/ig, '').replace(/\/me/, '') + "</i></b><br>\n";
            else
               //curIM.innerHTML = curIM.innerHTML + "<b class=\"userB\">[" + h + ":" + m + "] " + from + ":</b> " + data + "<br>\n";
			   curIM.innerHTML = curIM.innerHTML + "<b class=\"userB\">" + falias[from] + ":</b> " + data + "<br>\n";
            curIM.scrollTop = curIM.scrollHeight - curIM.clientHeight + 6;
            
            //if(curIM.innerHTML.toLowerCase().replace(/<\S[^>]*>/g, '').indexOf(user.toLowerCase()+': (auto-reply)') == -1 && isAway == 1 && who == from) {
//               $(from+"_sendBox").value = '(Auto-Reply) ' + awayMessage;
//               sendMessage(from);
//            }
            
            if(Windows.getFocusedWindow().getId() != who + "_im" && pulsateTitles == true) {
               new Effect.Pulsate(who + '_im_top');
            }

            if(titlebarBlinker == true && useBlinker == true) {
               clearTimeout(blinkerTimer);
               setTimeout("titlebarBlink('"+who+"', \""+data.replace(/\"/, '\"').replace(/<([^>]+)>/ig, '')+"\", 0)", blinkSpeed);
            }
			
			// sound and shake
			 var isBuzz = data.search('BUZZ');
			 var wBuzz = who + '_im';
			 if(response.numMessages > 0 && audioNotify == true)
			 {
				if(isBuzz!=-1)
				{
					new Effect.Shake(''+wBuzz+'');
					soundManager.play('buzz', 1, true);
				}else{
					soundManager.play('msg_in', 1, true); 
				}			 
			 }
			 
			 // added khanh im to front
			IMWindows[who].toFront();
			curIM = null;
			//if(titlebarBlinker == true) popbox(who,'mess');  
			//if(titlebarBlinker == true) popbox(who,'mess');			
			 
} // end msg<>user typing
			
         }// end for
                
         from = null; data = null;
         var group = '';
         var buddy = '';
         var event = '';
         for(i=0; i<response.numEvents; i++) {
            from = response.events[i].sender;
            data = response.events[i].event;
            who  = (response.events[i].recipient == user ? from : response.events[i].recipient);
            
            event = data.split(',');
            switch(event[0]) {
               case 'status':
                  group = response.events[i].group;
                  if(!$(group.replace(/\s/, '_')+'_group') && group != 'toJSONString') addGroupToList(group);
                  if(!$(from+'_blItem')) {
                     addBuddyToList(from, group);
                     buddyList[group][buddyList[group].length] = from;
                     $(from+'_blItem').style.display='block';
                  }
				  
				  if(event[2] && event[2].length>0){
					  var ex = $(from+'_blItem').innerHTML.split(':-)');
					  var status_text = event[2].substring(0, 10) + (event[2].length > 10 ? '...' : '');				  
					  $(from+'_blItem').innerHTML = ex[0] + ':-)<i>' + status_text + '</i>';
					  $(from+'_blItem').title = from + ':-)' + event[2];
				  }else{
					  var ex = $(from+'_blItem').innerHTML.split(':-)');					  				  
					  $(from+'_blItem').innerHTML = ex[0];
					  $(from+'_blItem').title = from;
				  }
                  
                  if(event[1] == 0 || event[1] == 50) {
                     moveBuddy(from, 'Offline');
                     $(from+'_blImg').src = 'images/offline.png';
					 $(from+'_blImg').width = 30;
					 $(from+'_blImg').style.padding = '0px';
					 soundManager.play('usr_in', 1, true); 
					 popbox(who,'offline');
                  } else if(event[1] == 2) {
                     moveBuddy(from, group);
                     $(from+'_blImg').src = 'images/away.png';     
					 $(from+'_blImg').width = 30;
					 $(from+'_blImg').style.padding = '0px';
                  } else {
                     moveBuddy(from, group);						
                     //$(from+'_blImg').src = 'images/online.png';	
					 if(favatar[from]!='' && favatar[from]!='noavatar.gif'){
						$(from+'_blImg').style.padding = '0px 0px 0px 12px';
					 	$(from+'_blImg').src = '../avatar/'+favatar[from];	
						$(from+'_blImg').width = 16;
					 	$(from+'_blImg').height = 16;
					 }else{
						$(from+'_blImg').src = 'images/online.png';
					 }					 
					 soundManager.play('usr_in', 1, true); 
					 popbox(who,'online');
                  }		
				  //$(from+'_blImg').width = 30;
                  break;
               case 'chat':
                  var rcvdBox = $(event[2]+"_rcvd");
                  //Stamp = new Date(); var h = String(Stamp.getHours()); var m = String(Stamp.getMinutes()); var s = String(Stamp.getSeconds());
                  //h = (h.length > 1) ? h : "0"+h; m = (m.length > 1) ? m : "0"+m;

                  if(event[1] == 'join') {
                     if(!$(from+'_blItem')) addBuddyToList(from, event[2]);
                     //rcvdBox.innerHTML = rcvdBox.innerHTML + "<b class=\"userB\">[" + h + ":" + m + "] <i>"+from+" has joined.</i></b><br>";
					 rcvdBox.innerHTML = rcvdBox.innerHTML + "<b class=\"userB\"><i>"+from+" has joined.</i></b><br>";

                     scrollToBottom(event[2]+"_rcvd");
                  } else if(event[1] == 'left') {
                     if(typeof(response.events[i]['group']) == 'object') deleteBuddyFromList(from);
                     //rcvdBox.innerHTML = rcvdBox.innerHTML + "<b class=\"userB\">[" + h + ":" + m + "] <i>"+from+" has left.</i></b><br>";
					 rcvdBox.innerHTML = rcvdBox.innerHTML + "<b class=\"userB\"><i>"+from+" has left.</i></b><br>";
                     scrollToBottom(event[2]+"_rcvd");
                  }
                  break;
            }
            event = null;
         }
         from = null; data = null; who = null;
         
      }
   );
   xhConn = null;
}

function popbox(who,status)
{
	var settings = "toolbar=no,location=no,directories=no,menubar=no,"; 
	settings += "scrollbars=no,status=no,width=250,height=50";
	var p = window.open('',who,settings);  	
	p.document.write('<html><head><title>'+who+'-'+status+'</title>');	
	p.document.write('</head><body style="margin:0px; padding:0px" bgcolor="#eaf7fe" onLoad="self.focus();">');
	p.document.write('<p align="center" style="padding-top:10px"><a href="javascript:self.close();self.opener.focus();" style="font-family:arial; font-size:12px; text-decoration:none; color:#333333">');
	
	if(status=='online')
	{
		p.document.write('<img src="images/online.png" border="0" align="absmiddle">&nbsp;<b>'+who+'</b> is now online.');	
		
	}else if(status=='offline'){		
		p.document.write('<img src="images/offline.png" border="0" align="absmiddle" >&nbsp;<b>'+who+'</b> is now offline.');	
	}else{
		p.document.write('<div style="height:100%; width:100%; background:#ffd74d"><img src="images/typing.gif" border="0" align="absmiddle">&nbsp;You have new message from <b>'+who+'</b>.</div>');
	}		
	p.document.write('</a></p>');
	p.document.write('<script language="javascript">setTimeout("self.close();",3000);</script>');
	p.document.write('</body></html>');
	p.document.close();
	p.resizeTo(250,50);
	p.moveTo(browserWidth()-250,browserHeight()+50);
	//p.focus();
	//blinkerOn(false);							  
}

function buzz(name)
{
	//var rcvdBox = $(name+"_rcvd");
	//rcvdBox.innerHTML = rcvdBox.innerHTML + '<span style="color:red"><b>BUZZ</b></span><br>';
	//$(name + '_sendBox').style.fontColor = 'red';
	//$(name + '_sendBox').style.fontWeight = '400';
	$(name + '_sendBox').value = 'BUZZ';
	sendMessage(name);
}

function sendMessage(winName) {
   var xhConn = new XHConn();
   
   var isBold      = ($(winName + '_sendBox').style.fontWeight == '400' ? 'false' : 'true');
   var isItalic    = ($(winName + '_sendBox').style.fontStyle == 'normal' ? 'false' : 'true');
   var isUnderline = ($(winName + '_sendBox').style.textDecoration == 'none' ? 'false' : 'true');
   var fontName    = $(winName + '_setFont').innerHTML;
   var fontSize    = $(winName + '_setFontSize').innerHTML;
   var fontColor   = $(winName + '_setFontColorColor').style.backgroundColor;

   if(trim($(winName+"_sendBox").value).length > 0) {
	   
	  //var sBox = (isTyping==true) ? 'UserIsTyping' : $(winName + '_sendBox').value;	   
      var sBox = $(winName + '_sendBox').value;
	   
      $(winName+"_sendBox").value = '';
	  
      xhConn.connect(pingTo, "POST", "call=send&from="+user+"&pwd="+pass+"&recipient="+winName+"&bold="+isBold+"&italic="+isItalic+"&underline="+isUnderline+"&font="+fontName+"&fontsize="+fontSize+"&fontcolor="+fontColor+"&msg="+encodeURIComponent(sBox.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/&/g, "<amp>")),
         function(xh) {			
            if(xh.responseText == 'sent') {
               // do nothing!
            } else if(xh.responseText == 'not_online') {
               var rcvdBox = $(winName+"_rcvd");
			   if(sBox!='UserIsTyping'){
               rcvdBox.innerHTML = rcvdBox.innerHTML + '<span style="color:#999999"><b><i>'+falias[winName]+' is\'not online. Leave your offline message.</i></b></span><br>';
               scrollToBottom(winName+"_rcvd");
			   }
            } else if(xh.responseText == 'too_long') {
               var rcvdBox = $(winName+"_rcvd");
               rcvdBox.innerHTML = rcvdBox.innerHTML + '<span style="color:#999999"><b>Error: Your message could not be sent because it is too long.</b></span><br>';
               scrollToBottom(winName+"_rcvd");
            } else if(xh.responseText == 'not_logged_in') {
               logout();
            } else {
               alert('An error occured while sending your message:' + xh.responseText);
            }
            $(winName+"_sendBox").focus();
         }
      );

      var sentText = sBox;
	  
      sentText = sentText.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/<([^>]+)>/ig, '').replace(/(\s|\n|>|^)(\w+:\/\/[^<\s\n]+)/, '$1<a href="$2" target="_blank">$2</a>');
      sentText = emoteReplace(sentText, smilies);
	  
      var rcvdBox = $(winName+"_rcvd");
	  
	  if(sentText=='BUZZ') sentText = '<span style="color:red;font-weight:bold; font-size:11px">BUZZ!!!</span>';
	  
	  //if(sentText=='UserIsTyping') sentText = '';
	  
      //Stamp = new Date(); var h = String(Stamp.getHours()); var m = String(Stamp.getMinutes()); var s = String(Stamp.getSeconds());
      //h = (h.length > 1) ? h : "0"+h; m = (m.length > 1) ? m : "0"+m;
      if(sentText.replace(/<([^>]+)>/ig, '').indexOf('/me') == 0)
	  {
         //.innerHTML = rcvdBox.innerHTML + "<b class=\"userA\">[" + h + ":" + m + "] <i>" + user + ' ' + sentText.replace(/<([^>]+)>/ig, '').replace(/\/me/, '') + "</i></b><br>\n";
		 
		 if(sentText!='UserIsTyping')
		 {			 
			 rcvdBox.innerHTML = rcvdBox.innerHTML + "<b class=\"userA\"><i>" + alias + ' ' + sentText.replace(/<([^>]+)>/ig, '').replace(/\/me/, '') + "</i></b><br>\n";
		 }

	  }
	  else
	  {
         //rcvdBox.innerHTML = rcvdBox.innerHTML + "<b class=\"userA\">[" + h + ":" + m + "] " + user + ":</b> <span style=\"font-family:" + fontName + ",sans-serif;font-size:" + fontSize + "px;color:" + fontColor + ";\">" + (isBold == 'true' ? "<b>" : "") + (isItalic == 'true' ? "<i>" : "") + (isUnderline == 'true' ? "<u>" : "") + sentText + (isBold == 'true' ? "</b>" : "") + (isItalic == 'true' ? "</i>" : "") + (isUnderline == 'true' ? "</u>" : "") + "</span><br>\n";
		 if(sentText!='UserIsTyping')
		 {	
		 rcvdBox.innerHTML = rcvdBox.innerHTML + "<b class=\"userA\">" + alias + ":</b> <span style=\"font-family:" + fontName + ",sans-serif;font-size:" + fontSize + "px;color:" + fontColor + ";\">" + (isBold == 'true' ? "<b>" : "") + (isItalic == 'true' ? "<i>" : "") + (isUnderline == 'true' ? "<u>" : "") + sentText + (isBold == 'true' ? "</b>" : "") + (isItalic == 'true' ? "</i>" : "") + (isUnderline == 'true' ? "</u>" : "") + "</span><br>\n";
		 }
	  }
      scrollToBottom(winName+"_rcvd");
      //if(audioNotify == true) soundManager.play('msg_out', 1, true);
	  
	 // sound and shake	
	 var isBuzz = sentText.search('BUZZ');
	 var wBuzz = winName + '_im';
	 if(audioNotify == true && sentText!='UserIsTyping')
	 {		 
		if(isBuzz!=-1)
		{
			new Effect.Shake(''+wBuzz+'');
			soundManager.play('buzz', 1, true);
		}else{
			//soundManager.play('msg_out', 1, true);
		}
	 }		 
   } // end if user type some message
}

function emoteReplace(str, itemsList) {
   var r;
   for(var i=0; i<itemsList.length; i++) {
      r = itemsList[i].split('~');
      if(str.indexOf(r[0]) > -1)
         str = str.replace(new RegExp(regExpEscape(r[0]), 'g'), '<img src="images/emoticons/' + r[1] + '" alt="' + r[1] + '" title="' + r[0] + '" /><span style="display:none">'+r[0]+'</span>');
   }
   return str;
}

function regExpEscape(text) {
  if (!arguments.callee.sRE) {
    //var specials = ['/', '.', '*', '+', '?', '|','(', ')', '[', ']', '{', '}', '\\','=','#','@','$','&','^'];
	var specials = ['/', '.', '*', '+', '?', '|','(', ')', '[', ']', '{', '}', '\\'];	
    arguments.callee.sRE = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
  }
  return text.replace(arguments.callee.sRE, '\\$1');
}

function newIMWindow() {
   if($('sendto').value.replace(/^\s*|\s*$/g,"").length > 0) {
      var toWhom = $('sendto').value;

      if(!$(toWhom + '_im')) {
         createIMWindow(toWhom, toWhom);
      } else {
         if(!IMWindows[toWhom].isVisible()) {
            IMWindows[toWhom].show();
            setTimeout("scrollToBottom('" + toWhom + "_rcvd')", 125);
         }
      }
      
      Windows.close('newIM');
      IMWindows[toWhom].toFront();
      setTimeout("$('"+toWhom+"_sendBox').focus()", 125);
   } else {
      $('newim_error_msg').innerHTML = 'Please enter a proper username!';
   }
}
function jsUpload(upload_field,winName)
{
	var xhConn = new XHConn();  
	
	var rcvdBox = $(winName+"_rcvd");
	
	xhConn.connect(pingTo, "POST", "call=sendfile&from="+user+"&recipient="+winName,
         function(xh) {
            if(xh.responseText == 'not_online') {              
               rcvdBox.innerHTML = rcvdBox.innerHTML + '<span style="color:#330066"><b>'+winName+' is\'not online. File is not sended.</b></span><br>';
               scrollToBottom(winName+"_rcvd");            
            } else if(xh.responseText == 'ok_to_send') {				
				rcvdBox.innerHTML = rcvdBox.innerHTML + '<span style="color:#330066">Sending file ...</span><br>';
				scrollToBottom(winName+"_rcvd");
				upload_field.form.submit();				
				return true;
            } else {
               alert('An error occured.');
            }           
         }
      );
   
   xhConn = null;
	
}
function saveFile(name)
{	
	if($(name + '_rcvd').innerHTML!='')
	{
		$('scontent').value = $(name + '_rcvd').innerHTML;
		$('sfrom').value = user;
		$('srecipient').value = name;
		$('sform').submit();
	}
	
}
function createIMWindow(name, imTitle) {

   var imLeft = Math.round(Math.random()*(browserWidth()-360))+'px';
   var imTop  = Math.round(Math.random()*(browserHeight()-400))+'px';
   
   var buddy_avatar = (favatar[name]) ? favatar[name] : 'noavatar.gif';

   IMWindows[name] = new Window(name + '_im', {className: "dialog", width: 360, height: 360, top: imTop, left: imLeft,
                                               resizable: true, title: imTitle, draggable: true, detachable: imDetachable, minWidth: 360, minHeight: 360,
                                               showEffectOptions: {duration: 0}, hideEffectOptions: {duration: 0}});
   IMWindows[name].getContent().innerHTML = '<div style="position:absolute; left:5px; padding-top:3px"><img src="../avatar/'+avatar+'" width="90" height="90" border="0" title="'+alias+' Avatar" ><a href="../profile.php" target="_blank" border="0"><img src="images/arrow.gif" border="0" title="'+alias+' Profile" ></a></div>' + 									
   											'<div style="position:absolute; left:34%; padding-top:20px"><img src="e01.gif"> &nbsp; <img src="e02.gif"></div>' +										
											'<div style="position:absolute; right:5px; padding-top:3px"><img src="../avatar/'+buddy_avatar+'" width="90" height="90" border="0" title="'+falias[name]+' Avatar" ></div>' +
											'<div class="rcvdTopToolbar" id="' + name + '_browseFiles"><form action="'+pingTo+'" target="upload_iframe" method="post" enctype="multipart/form-data" style="margin:0px;padding:0px"><input type="hidden" name="call" value="upload"><input type="hidden" name="from" value="'+user+'"><input type="hidden" name="recipient" value="'+name+'"><input type="hidden" name="fileframe" value="true"><label class="cabinet" id="'+name+'_sendFile"><input type="file" name="file" id="file" class="file" onChange="jsUpload(this,\'' + name + '\');" title="Send File"></label></form><iframe name="upload_iframe" style="width: 400px; height: 100px; display: none;"></iframe></div>'+
   											'<div class="rcvdMessages" id="' + name + '_rcvd"></div>' + "\n" +
                                            '<div class="imToolbar" id="' + name + '_toolbar" onmousemove="return false;" onselectstart="return false;"><img src="images/'+windowCSS+'/bold_off.gif" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onclick="toggleBold(\'' + name + '\');" onmousedown="return false;" alt="Bold" title="Bold" id="' + name + '_bold" style="cursor:hand">' +
                                            '<img src="images/'+windowCSS+'/italic_off.gif" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onclick="toggleItalic(\'' + name + '\');" onmousedown="return false;" alt="Italic" id="' + name + '_italic" / title="Italic" style="cursor:hand">'+
                                            '<img src="images/'+windowCSS+'/underline_off.gif" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onclick="toggleUnderline(\'' + name + '\');" onmousedown="return false;" alt="Underline" id="' + name + '_underline" title="Underline" style="cursor:hand">' +
											'<img src="images/'+windowCSS+'/buzz_off.gif" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onclick="buzz(\'' + name + '\');" onmousedown="return false;" alt="Buzz" title="Buzz" id="' + name + '_Buzz" style="cursor:hand"></div>' +
                                            ' <a href="#" class="setFontLink" id="' + name + '_setFont" onclick="toggleFontList(\'' + name + '\');return false;" onselectstart="return false;">Arial</a>' +
                                            ' <a href="#" class="setFontSizeLink" id="' + name + '_setFontSize" onclick="toggleFontSizeList(\'' + name + '\');return false;" onselectstart="return false;">12</a>' +
                                            ' <a href="#" class="setFontColorLink" id="' + name + '_setFontColor" onclick="toggleFontColorList(\'' + name + '\');return false;" onselectstart="return false;"><img src="images/default/color.gif" alt="Text color" title="Text color"  style="border:0;" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);"><div id="' + name + '_setFontColorColor" style="display:block; overflow: hidden;"></div></a>' +
                                            ' <a href="#" class="insertEmoticonLink" id="' + name + '_insertEmoticon" ><img src="images/emoticons/default.gif" alt="Emoticons" title="Emoticons"  style="border:0;" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" onclick="toggleEmoticonList(\'' + name + '\');return false;" onselectstart="return false;"></a>' +
                                            ' <a href="#" class="saveFile" id="' + name + '_saveFiles"  onclick="saveFile(\'' + name + '\')" title="Save Chat"><img src="images/save.gif" border="0" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);"></a>' +
											"\n" + '<div style="overflow:auto;"><textarea class="inputText" id="'+name+'_sendBox" onfocus="blinkerOn(false);" onkeypress="return keyHandler(event,'+"'"+name+"'"+');"></textarea></div>';
	$(name + '_rcvd').style.top = (IMWindows[name].getSize().height - 240) + 'px';										
	$(name + '_rcvd').style.height = (IMWindows[name].getSize().height - 196) + 'px'; // 103
	$(name + '_rcvd').style.width = (IMWindows[name].getSize().width - 10) + 'px';
	
	$(name + '_toolbar').style.top = (IMWindows[name].getSize().height - 49) + 'px';
	$(name + '_toolbar').style.width = (IMWindows[name].getSize().width - 10) + 'px';
	
	$(name + '_setFont').style.top = (IMWindows[name].getSize().height - 42) + 'px';
	
	$(name + '_setFontSize').style.top = (IMWindows[name].getSize().height - 42) + 'px';
	
	$(name + '_setFontColor').style.top = (IMWindows[name].getSize().height - 42) + 'px';
	$(name + '_setFontColorColor').style.backgroundColor = '#000';
	
	$(name + '_insertEmoticon').style.top = (IMWindows[name].getSize().height - 43) + 'px';

	$(name + '_saveFiles').style.top = (IMWindows[name].getSize().height - 43) + 'px';
    
    $(name + '_browseFiles').style.top = (IMWindows[name].getSize().height - 43) + 'px';
	
	//$(name + '_Buzz').style.top = (IMWindows[name].getSize().height - 47) + 'px';
	
	$(name + '_sendBox').style.top = (IMWindows[name].getSize().height - 23) + 'px';
	$(name + '_sendBox').style.left = '2px';
	$(name + '_sendBox').style.width = (IMWindows[name].getSize().width - 15) + 'px';
	$(name + '_sendBox').style.fontWeight = '400';
	$(name + '_sendBox').style.fontStyle = 'normal';
	$(name + '_sendBox').style.textDecoration = 'none';

    

	IMWindows[name].show();
	IMWindows[name].toFront();
	setTimeout("$('"+name+"_sendBox').focus();", 250);
	SI.Files.stylizeAll();
	// added khanh
	//detachIMWindow(name);
}

function detachIMWindow(name) {
   newWin = name;
   newWinRcvd = $(name + '_rcvd').innerHTML;
   IMWindows[name].hide();
   var temp = IMWindows[name];
   var popupWin = window.open('./popup.html', name + '_im', 'left='+IMWindows[name].getLocation()['left']+',top='+IMWindows[name].getLocation()['top']+',width=320,height=335,toolbar=0,location=0,status=0,menubar=0,resizable=1,scrollbars=0');
   IMWindows[name] = {};
   IMWindows[name].popup = popupWin;
   IMWindows[name].isVisible = function() { return true; };
   IMWindows[name].show = function() { return true; };
   IMWindows[name].detached = true;
   IMWindows[name].old = temp;
}

function joinRoom(room) {
 var xhConn = new XHConn();
   xhConn.connect(pingTo, "POST", "call=joinroom&from="+user+"&pwd="+pass+"&room="+room,
      function(xh) {
         if(xh.responseText.indexOf('"') == -1) {
            switch(xh.responseText) {
               case 'already_joined':
                  $('newroom_error_msg').innerHTML = 'You are already in "' + room + '".';
                  break;
               case 'room_is_user':
                  $('newroom_error_msg').innerHTML = 'The chosen room name is invalid.';
                  break;
               case 'invalid_chars':
                  $('newroom_error_msg').innerHTML = 'Room name contains invalid characters!';
                  break;
            }
         } else {
            if(!$(room + '_im')) {
               createIMWindow(room.toLowerCase(), room.toLowerCase());
            } else {
               if(!IMWindows[room].isVisible()) {
                  IMWindows[room].show();
                  setTimeout("scrollToBottom('" + room + "_rcvd')", 125);
               }
            }
            var users = xh.responseText.parseJSON().users;
            if(!$(room.replace(/\s/, '_')+'_group')) addGroupToList(room);
            for(var i=0; i<users.length; i++) {
               if(!$(users[i]+'_blItem')) addBuddyToList(users[i], room);
            }
            Windows.close('newRoom');
            IMWindows[room].toFront();
            setTimeout("$('"+room+"_sendBox').focus()", 125);
         }
		  });
}

function leaveRoom(room){
   var xhConn = new XHConn();
   xhConn.connect(pingTo, "POST", "call=leaveroom&from="+user+"&pwd="+pass+"&room="+room,
      function(xh) {
         if(xh.responseText=='left')
            deleteGroupFromList(room);
      });
}

function keyHandler(e, name) {
	var asc = document.all ? event.keyCode : e.which;
	if(asc == 13) {
		isTyping = 0;
		sendMessage(name);
		return false;
	}
	else
	{	
		if(isTyping==0)
		{
			isTyping = 1;
			$(name + '_sendBox').value = 'UserIsTyping';
			sendMessage(name);	   
		}
	}	
	return true;
}

function loginHandler(e) {
   var asc = document.all ? event.keyCode : e.which;
   if(asc == 13) checklogin();
   return asc != 13;
}

function destroyIMWindow(name) {
   var toKill = $(name);
   toKill.parentNode.removeChild(toKill);
}

function addBuddyToList(username, groupname) {
   if(!$(groupname.replace(/\s/, '_') + '_group')) addGroupToList(groupname);

   var groupList = $(groupname.replace(/\s/, '_') + '_group');
   
   var buddy_alias = (falias[username]!='' && typeof(falias[username])!='undefined') ? falias[username] : username;
   //var buddy_avatar = (favatar[username]!='') ? favatar[username] : 'noavatar.gif';
	
	groupList.innerHTML += '<li title="'+username+'" style="padding-top:5px" id="'+username+'_blItem" class="buddy" onmousedown="clickBuddy(\''+username+'\');return false;" onselectstart="return false;" onmouseover="selectBuddy(this, \''+username+'\', true);" onmouseout="selectBuddy(this, \''+username+'\', false);" ondblclick="onBuddyDblClick();">&nbsp;&nbsp;<img src="images/online.png" align="absmiddle" alt="" id="'+username+'_blImg">&nbsp;'+buddy_alias+'</li>';
	
   //groupList.innerHTML += '<li title="'+username+'" style="padding-top:5px" id="'+username+'_blItem" class="buddy" onmousedown="clickBuddy(\''+username+'\');return false;" onselectstart="return false;" onmouseover="selectBuddy(this, \''+username+'\', true);" onmouseout="selectBuddy(this, \''+username+'\', false);" ondblclick="onBuddyDblClick();">&nbsp;&nbsp;<img src="images/online.png" align="absmiddle" alt="" id="'+username+'_blImg"><img src="../avatar/'+buddy_avatar+'" align="absmiddle" alt="" width="15" height="15">&nbsp;'+buddy_alias+'</li>';
   //groupList.innerHTML += '<li title="'+username+'" style="padding-top:5px" id="'+username+'_blItem" class="buddy" onmousedown="clickBuddy(\''+username+'\');return false;" onselectstart="return false;" onmouseover="selectBuddy(this, \''+username+'\', true);" onmouseout="selectBuddy(this, \''+username+'\', false);" ondblclick="onBuddyDblClick();">&nbsp;&nbsp;<img src="'+buddy_avatar+'" align="absmiddle" alt="" id="'+username+'_blImg">&nbsp;'+buddy_alias+'</li>';
   $(username + '_blItem').style.listStyleType = 'none';   
}

function moveBuddy(username, groupname) {
   if(groupname == null) return;
   if($(username+'_blItem').parentNode.id == $(groupname.replace(/\s/, '_') + '_group')) return;
   if(!$(groupname.replace(/\s/, '_') + '_group')) addGroupToList(groupname);
   
   $(groupname.replace(/\s/, '_') + '_group').insertBefore($(username+'_blItem'), null);
}

function addGroupToList(groupname) {
   var bList = $('buddylist');
   
   bList.innerHTML = (groupname=='Offline' ? bList.innerHTML : '') + '<li id="' + groupname.replace(/\s/, '_') + '_groupTop" class="groupTop" onmousedown="return false;" onselectstart="return false;" onclick=" toggleGroup(\'' + groupname + '\');"><img id="' + groupname.replace(/\s/, '_') + '_groupArrow" src="images/' + windowCSS + '/arrow.png" />&nbsp;&nbsp;' + groupname + 
                     (groupname!='Offline' ? ' <a href="#" class="delLink" onclick="remove_group_dialog(\'' + groupname + '\');return false;"><img src="images/' + windowCSS + '/smallx.png" style="border:0;" onmouseover="buttonHover(this);" onmouseout="buttonNormal(this);" /></a>' : '') + '</li>' + "\n" + '<ul id="' + groupname.replace(/\s/, '_') + '_group" class="group"></ul>' + (groupname!='Offline' ? bList.innerHTML : '');
}

function toggleGroup(groupname) {
   var groupList = $(groupname.replace(/\s/, '_') + '_group');
   var groupArrow = $(groupname.replace(/\s/, '_') + '_groupArrow');
   
   if(groupList.style.display != 'none') {
      groupList.style.display = 'none';
      groupArrow.src = 'images/' + windowCSS + '/arrow_up.png';
   } else {
      groupList.style.display = 'block';
      groupArrow.src = 'images/' + windowCSS + '/arrow.png';
   }
}

function selectBuddy(sel, username, selected) {
   if(selected === false) {
      if(curSelected != username) {
         sel.style.background = '#fff';
         sel.style.color = '#333';
      } else {
         sel.style.background = '#6aa4cb';
         sel.style.color = '#fff';
      }
   } else {
      sel.style.background = '#e1ebf7';
      sel.style.color = '#000';
   }
}

function clickBuddy(username) {
   if(curSelected.length > 0) {
      var sel = $(curSelected + '_blItem');   
      sel.style.background = '#fff';
      sel.style.color = '#333';
   }
   
   curSelected = username;
   
   sel = $(curSelected + '_blItem');
   sel.style.background = '#6aa4cb';
   sel.style.color = '#FFF';
}

function onBuddyDblClick() {
   if(curSelected.length > 0) {
      if(!$(curSelected + '_im')) {
         createIMWindow(curSelected, curSelected);
      } else {
         if(IMWindows[curSelected].popup) {
            if(IMWindows[curSelected].popup.closed) {
               IMWindows[curSelected] = IMWindows[curSelected].old;
               IMWindows[curSelected].show();
            } else {
               IMWindows[curSelected].popup.focus();
            }
         } else if(!IMWindows[curSelected].isVisible()) {
            IMWindows[curSelected].show();
            IMWindows[curSelected].toFront();
            setTimeout("scrollToBottom('" + curSelected + "_rcvd')", 125);
            setTimeout("$('" + curSelected + "_sendBox').focus();", 250);
         } else {
            IMWindows[curSelected].toFront();
            setTimeout("$('" + curSelected + "_sendBox').focus();", 250);
         }
      }
   }
}

function scrollToBottom(id) {
   $(id).scrollTop = $(id).scrollHeight - $(id).clientHeight;
}

function deleteBuddyFromList(username) {
   if(username.indexOf('_group') != -1) {
      deleteGroupFromList(username.substring(0, username.length - 6));
      return;
   }

   var usernam = username;

   var ingroup, loc;
   for (var group in buddyList) {
      for(var i=0; i<buddyList[group].length; i++) {
         if(buddyList[group][i] == username) {
            ingroup = group;
            loc = i;
            break;
         }
      }
   }

   var buddyToRmv = $(usernam+"_blItem");
   if(typeof(buddyToRmv) !== 'undefined') {
      buddyToRmv.parentNode.removeChild(buddyToRmv);
      if(buddyList[ingroup]) {
         buddyList[ingroup].splice(loc, 1);
         saveBuddyList();
      }
      Dialog.closeInfo();
	  curSelected = ''; // khanh - added to fix "sel has no properties" err
   }
}

function deleteGroupFromList(groupname) {
   var groupNoSpaces = groupname.replace(/\s/, '_');
   var groupToRmv = $(groupNoSpaces+"_group");
   var groupTop   = $(groupNoSpaces+"_groupTop");
      
   if(typeof(groupToRmv) !== 'undefined') {
      groupToRmv.parentNode.removeChild(groupToRmv);
      groupTop.parentNode.removeChild(groupTop);
      delete buddyList[groupname];
      saveBuddyList();
      Dialog.closeInfo();
   } else {
      $('deletebuddy_error_msg').innerHTML = 'No such group on buddylist!';
      $('deletebuddy_error_msg').show();
      Dialog.win.updateHeight();
   }
}

function addNewBuddyToList(username, groupname) {
   if(!inArray(buddyList, username) && !$(username + '_blItem')) {      
      var xhConn = new XHConn();
      
      xhConn.connect(pingTo, "POST", "call=isuser&from="+user+"&pwd="+pass+"&username="+username, function(xh) {
         if(xh.responseText == 'not_exists') {
            $('newbuddy_error_msg').innerHTML = 'No such user is registered!';
         } else {
            if(!$(groupname.replace(/\s/, '_') + '_group')) {
               addGroupToList(groupname);
               buddyList[groupname] = [];
            }
            
            addBuddyToList(username, 'Offline');
           
            if(parseInt(xh.responseText) == 0) {
               moveBuddy(username, 'Offline');
               $(username+'_blImg').src = 'images/offline.png';
            } else if(parseInt(xh.responseText) == 2) {
               moveBuddy(username, groupname);
               $(username+'_blImg').src = 'images/away.png';            
            } else {
               moveBuddy(username, groupname);
               $(username+'_blImg').src = 'images/online.png';			   
            }
           
            buddyList[groupname][buddyList[groupname].length] = username;
      
            saveBuddyList();
            Windows.close('newBuddy');
         }
      });
   } else {
      $('newbuddy_error_msg').innerHTML = 'User is already on your buddy list!';
   }
}
      
function trim(text) {
   if(text == null) return null;
   return text.replace(/^[ \t]+|[ \t]+$/g, "");
}

function saveBuddyList() {
   var xhConn = new XHConn();
   xhConn.connect(pingTo, "POST", "call=save&from="+user+"&pwd="+pass+"&list="+encodeURIComponent(buddyList.toJSONString()), null);
}

function resetPass() {
   var xhConn = new XHConn();
   var error = '';
   
   xhConn.connect(pingTo, "POST", "call=reset&from="+$('resetto').value.replace(/@/, '+AT+').replace(/\./, '+DOT+').replace(/ /, ''),
      function(xh) {
         if(xh.responseText == 'pw_reset') {
            Dialog.alert('<span class="dialog_long_label">Your new password has been emailed to ' + $('resetto').value + '</span><div style="clear:both"></div>',
                         {windowParameters: {className:alertCSS, width:alertWidth},
                          ok:function(win) { clearInputs(); Dialog.closeInfo(); login_dialog(); }});
         } else if(xh.responseText == 'no_email_on_record') {
            error = 'There is no such email address for any username on record.';
         } else {
            error = 'There has been a problem resetting your password.<br />Please try again later.';
         }
         $('forgotpass_error_msg').innerHTML = error;
         $('forgotpass_error_msg').style.display = 'block'; 
         new Effect.Shake('modal');
      }
   );
}

function changePass() {
   var currentPw = $('currentpw').value;
   var newPw = $('newpw').value;
   var error = '';
   if(hex_md5(currentPw) == pass) {
      if(newPw == $('confirmpw').value) {
         var xhConn = new XHConn();
         
         xhConn.connect(pingTo, "POST", "call=pwdchange&from="+user+"&pwd="+hex_md5(currentPw)+"&newpwd="+newPw,
            function(xh) {
               if(xh.responseText == 'pw_changed') {
                  Dialog.closeInfo();
                  Dialog.alert('<span class="dialog_long_label">The password change was successful!'+"\n"+'Please re-login now.</span><div style="clear:both"></div>',
                               {windowParameters: {className:alertCSS, width:alertWidth, height:85},
                                ok:function(win) { Dialog.closeInfo(); Windows.close('changePass'); setTimeout('logout();', 250); }});
               } else if(xh.responseText == 'invalid_pw') {
                  error = 'The "Current Password" you entered is invalid.';
                  $('currentpw').value = '';
               } else if(xh.responseText == 'password_bad_length') {
                  error = 'Passwords must be 4 to 16 characters long!';
                  $('newpw').value = '';
                  $('confirmpw').value = '';
               } else {
                  error = 'There was a problem processing your password change. Please try again later.';
               }
            }
         );
      } else {
         error = 'Your passwords do not match!';
      }
   } else {
      error = 'The "Current Password" you entered is invalid.';
   }
   if(error.length > 0) {
      $('changepass_error_msg').innerHTML = error;
   }
}

function insertText(tti) {
   $(toWin + '_sendBox').value += tti;
   setTimeout("$('" + toWin + "_sendBox').focus();", 125);
   toggleEmoticonList();
   return false;
}

function setFont(fontname) {
   $(toWin + '_sendBox').style.display = 'none';
   $(toWin + '_sendBox').style.fontFamily = fontname + ', sans-serif';
   $(toWin + '_setFont').innerHTML = fontname;
   $(toWin + '_sendBox').style.display = 'block';
   setTimeout("$('" + toWin + "_sendBox').focus();", 125);
   toggleFontList('');
}

function setFontSize(size) {
   $(toWin + '_sendBox').style.display = 'none';
   $(toWin + '_sendBox').style.fontSize = size + 'px';
   $(toWin + '_setFontSize').innerHTML = size;
   $(toWin + '_sendBox').style.display = 'block';
   setTimeout("$('" + toWin + "_sendBox').focus();", 125);
   toggleFontSizeList('');
}

function setFontColor(color) {
   $(toWin + '_sendBox').style.color = color;
   $(toWin + '_setFontColorColor').style.backgroundColor = color;
   setTimeout("$('" + toWin + "_sendBox').focus();", 125);
   toggleFontColorList('');
}

function setStatus(status, away_msg) {
   if(status == 1) { // away
      isAway = 1;
      awayMessage = away_msg;
      $('curStatus').innerHTML = '<b>' + user + '</b> - ' + awayMessage.substring(0, 15) + (awayMessage.length > 15 ? '...' : '');
   } else { // back
      isAway = status; // 0 for avail, 99 for "friends only", 49 for "invisible"
      awayMessage = '';
      $('curStatus').innerHTML = '<b>' + user + '</b> - ' + away_msg;
   }
   $('statusList').style.display = 'none';
}

function customAway() {
   $('curStatus').style.display = 'none';
   $('customStatus').style.display = 'block';
   $('customStatus').focus();
}

function processCustomAway(e) {
   var asc = document.all ? event.keyCode : e.which;
   
   if(asc == 13) {
      isAway = 1;
      awayMessage = $('customStatus').value;
      $('curStatus').innerHTML = '<b>' + user + '</b> - ' + awayMessage.substring(0, 15) + (awayMessage.length > 15 ? '...' : '');
      $('curStatus').style.display = 'block';
      $('customStatus').style.display = 'none';      
   }
   return asc != 13;
}

function toggleAudio() {
   if(audioNotify == true) {
      audioNotify = false;
      $('toggleaudio').src = 'images/'+windowCSS+'/audio_off.gif';
   } else {
      audioNotify = true;
      $('toggleaudio').src = 'images/'+windowCSS+'/audio_on.gif';
   }
}

function toggleBold(name) {
   $(name + '_sendBox').style.display = 'none'; // horrah weird Opera 9 input refresh!
   if($(name + '_sendBox').style.fontWeight == '400') {
      $(name + '_bold').src = 'images/' + windowCSS + '/bold_on.gif';
      $(name + '_sendBox').style.fontWeight = '700';
   } else {
      $(name + '_sendBox').style.fontWeight = '400';
      $(name + '_bold').src = 'images/' + windowCSS + '/bold_off.gif';
   }
   $(name + '_sendBox').style.display = 'block'; // horrah weird Opera 9 input refresh!
   setTimeout("$('" + name + "_sendBox').focus();", 125);
}
   
function toggleItalic(name) {
   $(name + '_sendBox').style.display = 'none'; // horrah weird Opera 9 input refresh!
   if($(name + '_sendBox').style.fontStyle == 'normal') {
      $(name + '_sendBox').style.fontStyle = 'italic';
      $(name + '_italic').src = 'images/' + windowCSS + '/italic_on.gif';
   } else {
      $(name + '_sendBox').style.fontStyle = 'normal';
      $(name + '_italic').src = 'images/' + windowCSS + '/italic_off.gif';
   }
   $(name + '_sendBox').style.display = 'block'; // horrah weird Opera 9 input refresh!
   setTimeout("$('" + name + "_sendBox').focus();", 125);
} 

function toggleUnderline(name) {
   $(name + '_sendBox').style.display = 'none'; // horrah weird Opera 9 input refresh!
   if($(name + '_sendBox').style.textDecoration == 'none') {
      $(name + '_sendBox').style.textDecoration = 'underline';
      $(name + '_underline').src = 'images/' + windowCSS + '/underline_on.gif';
   } else {
      $(name + '_sendBox').style.textDecoration = 'none';
      $(name + '_underline').src = 'images/' + windowCSS + '/underline_off.gif';
   }
   $(name + '_sendBox').style.display = 'block'; // horrah weird Opera 9 input refresh!
   setTimeout("$('" + name + "_sendBox').focus();", 125);
}

function titlebarBlink(name, message, alter) {
   if(titlebarBlinker == false) {
      document.title = defaultTitle;
      return;
   }
   
   if(IMWindows[name].popup) {
      IMWindows[name].popup.titlebarBlink(name, message, alter);
      return;
   }
   
   if(alter == 0) {
      document.title = name + '!';
      blinkerTimer = setTimeout("titlebarBlink('"+name+"', '"+message+"', 1)", 1000);
   } else if(alter == 1) {
      document.title = '"' + message.substring(0, 10) + (message.length > 10 ? '...' : '') + '"';
      blinkerTimer = setTimeout("titlebarBlink('"+name+"', '"+message+"', 2)", 1000);
   } else if(alter == 2) {
      document.title = defaultTitle;
      blinkerTimer = setTimeout("titlebarBlink('"+name+"', '"+message+"', 0)", 1000);
   }
}

function blinkerOn(onoff) {
   if(onoff == true)
      titlebarBlinker = true;
   else
      titlebarBlinker = false;
}

function buttonHover(el) {
   var newsrc = el.src;
   newsrc = newsrc.replace(/_hover/, '');
   el.src = newsrc.replace(/\.gif/, '_hover.gif');
}

function buttonDown(el) {
   el.src = el.src.replace(/_hover\.gif/, '_down.gif');
}

function buttonNormal(el) {
   el.src = el.src.replace(/\_hover.gif/, '.gif').replace(/\_down.gif/, '.gif');
}

function browserWidth() {
   if (self.innerWidth) {
      return self.innerWidth;
   } else if (document.documentElement && document.documentElement.clientWidth) {
      return document.documentElement.clientWidth;
   } else if (document.body) {
      return document.body.clientWidth;
   }
   return 630;
}

function browserHeight() {
   if (self.innerWidth) {
      return self.innerHeight;
   } else if (document.documentElement && document.documentElement.clientWidth) {
      return document.documentElement.clientHeight;
   } else if (document.body) {
      return document.body.clientHeight;
   }
   return 470;
}

function randomNumber(max) {
   return Math.round(Math.random()*max);
}

function checkEmailAddr( email ) {
   var filter  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
   if (filter.test(email)) return true;
   else return false;
}

function getElementsByCondition(condition, container) {
   container = container||document;
   var all = container.all||container.getElementsByTagName('*');
   var arr = [];
   for(var k=0;k<all.length;k++) {
      var elm = all[k];
      if(condition(elm,k))
         arr[arr.length] = elm;
   }
   return arr;
}

function getElementsByClass(node, searchClass, tag) {
   var classElements = [];
   var els = node.getElementsByTagName(tag); // use "*" for all elements
   var elsLen = els.length;
   var pattern = new RegEx("\\b"+searchClass+"\\b");
   for (i = 0, j = 0; i < elsLen; i++) {
      if ( pattern.test(els[i].className) ) {
         classElements[j] = els[i];
         j++;
      }
   }
   return classElements;
}

function isDefined(variable) {
   return (typeof(variable) == "undefined") ? false : true;
}

function inArray(arr, value)
// Returns true if the passed value is found in the
// array.  Returns false if it is not.
{
   var i;
   for (var group in arr) {
     // Matches identical (===), not just similar (==).
      for(i=0; i<arr[group].length; i++) {
         if(arr[group][i] === value)
            return true;
      }
   }
   return false;
};

function addOption(selectbox,text,value) {
   if(!isIE && !window.opera) {
      selectbox.innerHTML += '<option value="' + value + '">' + text + '</option>';
   } else {
      var optn = document.createElement("OPTION");
      optn.text = text;
      optn.value = value;
      var res = selectbox.options.add(optn);
   }
}

function removeItems(array, item) {
   var i = 0;
   while (i < array.length) {
      if (array[i] == item) {
         array.splice(i, 1);
      } else {
         i++;
      }
   }
   return array;
}

function removeAllOptions(selectbox) {
   var i;
   for(i=selectbox.options.length-1;i>=0;i--) {
      selectbox.remove(i);
   }
}

function removeOptions(selectbox, val) {
   var i;
   for(i=selectbox.options.length-1;i>=0;i--) {
      if(selectbox.options[i].value === val)
         selectbox.remove(i);
   }
}

String.prototype.isAlphaNumeric = function() {return /^[a-z0-9_\d]+$/.test (this)};

function Debug() {
   this.create = function() {
      createIMWindow('Debug', 'Debug');
   }
   
   this.write = function(text) {
      $('Debug_rcvd').innerHTML += text + "<br>\n";
   }
}

 /* VIET THEM */
function emoticonmore(emoticonmorea)
{	
	if (document.getElementById(emoticonmorea).style.display == "none" )
	{
		document.getElementById(emoticonmorea).style.display = "block"; 
	}
	else		
	{	
		document.getElementById(emoticonmorea).style.display = "none";
	}
}
function doi(value)
{
	var mang = new Array("next","pre")
	
	for(var i=0; i < mang.length;i++)
	{
		if(mang[i]==value){
			value = document.getElementById(value);
			value.style.display="block";
		}else{
			bien = document.getElementById(mang[i]);
			bien.style.display="none";
		}
	}		
}


function mocs()
{
	x=window.open("","","'toolbar=no,menubar=no,resizable=no,scrollbars=yes,status=no,location=no'");
	x.location="help.html";
	x.moveTo(200,150);
	x.resizeTo(965,643);
}

function dongcs()
{
	x.close();
}
