	//
	// Global variables
	//
	var ch_timeout = 0;
	var ch_requestsent = 0;
	var ch_postsent	= 0;
	var ch_chatsent	= 0;
	var ch_refreshRate = 1000 * 7;		 // two seconds
	var ch_last_msg = 0;
	var ch_loginmsg = 'Authentication is required. <a href="../users/login.php" target="_blank">login</a> or <a href="../users/register.php" target="_blank">register</a>';
	var ch_banmsg = 'You have been banned from the chat';
	
	// added to reduce server load
	var ch_t = 0;
	var ch_throttle_back = 20;  // this is in multiples of ch_refreshRate
	var ch_lastpost = 0;        // throttling reduces traffic by 
	
	function ch_getAjax() {
		var request = null;
		try{
			request = new XMLHttpRequest();
		}catch (trymicrosoft){
			try{
				request = new ActiveXObject("Msxml2.XMLHTTP");
			}catch (othermicrosoft){
				try{
					request = new ActiveXObject("Microsoft.XMLHTTP");
				}catch (failed){
					request = null;
				}
			}
		}
		if (request == null){
			alert("Error creating request object!");
		}
		return request;
	}
	//
	// Capture the enter key on 
	// the input box and initiate a
	// GET to the post url
	//
	function ch_captureReturn( event )
	{
		//
		// Supress event bubbling
		//
		if( event.keyCode == 13 ) {
			//
			// ch_fetch the feed
			//
			ch_postText();
			
			if (event.preventDefault) event.preventDefault();
			else event.returnValue = false;
		}
	}
	//
	// Auto scroll the chat window
	// if the text exceeds the div 
	//
	function scrollChatPane()
	{
		pane = document.getElementById("chatpane");
		pane.scrollTop = pane.scrollHeight;
	}
	//
	// Show the little loading animation
	// when the page starts
	//
	function ch_showLoadScreen()
	{
		var loading = "<div style=\"text-align:center;\"><h4>Loading...</h4></div>";
		
		var chat = document.getElementById( "chatpane" );
		chat.innerHTML = loading;
	}
	//
	// Start the ch_fetch timer to update
	// the chatpane and userlist
	//
	function ch_setTimers()
	{
		window.clearTimeout(ch_timeout);
		ch_timeout = window.setTimeout( "ch_fetch()", ch_refreshRate );
	}
	//
	// Start the async ch_fetch 
	// and reset the ch_fetch timer
	//
	var ch_fetching = false;
	var ch_fetchi = 0;
	function ch_fetch()
	{
		ch_setTimers();
		if (ch_fetching) {
			ch_fetchi ++;
			if (ch_fetchi > 2) ch_req.abort();
			return;
		}
		ch_fetchi = 0;
		ch_fetching = true;
		ch_fetchBufferText();
		
		ch_t++;
		if ( ch_t - ch_lastpost > (2 * ch_throttle_back) ) {
			ch_refreshRate = 60000;
		} else if( ch_t - ch_lastpost > ch_throttle_back ) {
		  ch_refreshRate = 10000;
		} else {
		  ch_refreshRate = 5000;
		}		
	}
	
	function appendNode(obj, className, text) {
		var el = document.createElement('div');
		if (className != "") el.className = className;
		el.innerHTML = text;
		obj.appendChild(el);
	}
	
	function formatText(msg) {
		msg = msg.replace(/:\)/g, "<img src='../chatr/images/smile.gif' border=0 align='bottom' />");
		msg = msg.replace(/;\)/g, "<img src='../chatr/images/wink.gif' border=0 align='bottom' />");
		msg = msg.replace(/:\(/g, "<img src='../chatr/images/sad.gif' border=0 align='bottom' />");
		msg = msg.replace(/:p/gi, "<img src='../chatr/images/tongue.gif' border=0 align='bottom' />");
		msg = msg.replace(/:d/gi, "<img src='../chatr/images/laugh.gif' border=0 align='bottom' />");
		msg = msg.replace(/:\-d/gi, "<img src='../chatr/images/laugh.gif' border=0 align='bottom' />");
		msg = msg.replace(/:roll/gi, "<img src='../chatr/images/roll.gif' border=0 align='bottom' />");
		msg = msg.replace(/:cheers/gi, "<img src='../chatr/images/cheers.gif' border=0 align='bottom' />");
		msg = msg.replace(/:kiss/gi, "<img src='../chatr/images/kiss.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*yahoo\*/gi, "<img src='../chatr/images/yahoo.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*dontknow\*/gi, "<img src='../chatr/images/dontknow.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*angry\*/gi, "<img src='../chatr/images/angry.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*crazy\*/gi, "<img src='../chatr/images/crazy.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*pardon\*/gi, "<img src='../chatr/images/pardon.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*no\*/gi, "<img src='../chatr/images/no.gif' border=0 align='bottom' />");
		msg = msg.replace(/:-x/gi, "<img src='../chatr/images/al.gif' border=0 align='bottom' />");
		msg = msg.replace(/8-\)/gi, "<img src='../chatr/images/sunglasses.gif' border=0 align='bottom' />");
		msg = msg.replace(/:-\|/gi, "<img src='../chatr/images/an.gif' border=0 align='bottom' />");
		msg = msg.replace(/:-\//gi, "<img src='../chatr/images/ao.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*bravo\*/gi, "<img src='../chatr/images/bravo.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*crying\*/gi, "<img src='../chatr/images/crying.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*help\*/gi, "<img src='../chatr/images/help.gif' border=0 align='bottom' />");
		msg = msg.replace(/:-\*/gi, "<img src='../chatr/images/kiss2.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*love\*/gi, "<img src='../chatr/images/love.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*ok\*/gi, "<img src='../chatr/images/ok.gif' border=0 align='bottom' />");
		msg = msg.replace(/:-o/gi, "<img src='../chatr/images/shocked.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*sorry\*/gi, "<img src='../chatr/images/sorry.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*stop\*/gi, "<img src='../chatr/images/stop.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*thumbs\*/gi, "<img src='../chatr/images/thumbs.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*tired\*/gi, "<img src='../chatr/images/tired.gif' border=0 align='bottom' />");
		msg = msg.replace(/:-!/gi, "<img src='../chatr/images/unk1.gif' border=0 align='bottom' />");
		msg = msg.replace(/:-\[/gi, "<img src='../chatr/images/unk2.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*wassup\*/gi, "<img src='../chatr/images/wassup.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*metal\*/gi, "<img src='../chatr/images/metal.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*rose\*/gi, "<img src='../chatr/images/rose.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*confused\*/gi, "<img src='../chatr/images/confused.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*kissing\*/gi, "<img src='../chatr/images/kissing.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*jokingly\*/gi, "<img src='../chatr/images/jokingly.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*music\*/gi, "<img src='../chatr/images/music.gif' border=0 align='bottom' />");
		msg = msg.replace(/\*dance\*/gi, "<img src='../chatr/images/dance.gif' border=0 align='bottom' />");
		return msg;
	}
	
	/* #############################
	 * 
	 * function: ch_fetchBufferText()
	 * purpose:
	 * 
	 * This function retrieves the last 
	 * twenty lines of the chat buffer.
	 * The chat buffer is returned as a 
	 * set of list-items and are rendered
	 * in a <ul> tag.  This function calls
	 * the scroll function to scroll the 
	 * chat pane.
	 *
	 * notes: A random number is generated 
	 * when this page loads.  This number is
	 * incrimented and appended to the url to
	 * prevent caching problems in IE
	 *
	 * #############################
	*/
	function ch_fetchBufferText()
	{
		var url = '../chatr/buffertext.php?l=' + ch_last_msg + '&c=' + ch_channel + '&rand=' + new Date().getTime();
		ch_req = ch_getAjax();
		
		ch_req.onreadystatechange = function(){
		
			if( ch_req.readyState == 4) {
				try	{
					var status = ch_req.status;
				} catch (e) {
					var status = -100;
				}
				
				if (status == -100) {
					ch_fetching = false;
					ch_fetch();
					return;
				}
				
				if (status == 200) {
					var obj = document.getElementById("chatpane");
					if (ch_last_msg == 0) {
						obj.innerHTML = '';
					}
					var timexxx = ch_last_msg == 0;
					var s = ch_req.responseText;
					if (s.length > 0) {
						var lines = s.split("\n");
						for (var i = 0; i < lines.length; i++) {
							var line = lines[i];
							if (line.length != 0) {
								var data = line.split("\t");
								var msg_id = parseInt(data[0]);
								if (msg_id > ch_last_msg) {
									ch_last_msg = msg_id;
									if (!timexxx) {
										var timestamp = new Date();
										//timestamp.setTime(parseInt(data[1]) * 1000);
										var h = timestamp.getHours();
										if (h < 10) h = '0' + h;
										var m = timestamp.getMinutes();
										if (m < 10) m = '0' + m;
										var formatedTime = h + ':' + m;
									} else {
										var formatedTime = 'xx:xx';
									}
									var formated = formatText(data[3]);
									appendNode(obj, '', '<span class="time">' + formatedTime + '</span> <span class="nick">' + data[2] + '</span> &#187; ' + formated);
								}
							}
						}
						scrollChatPane();
						
						if (document.getElementById('ch_form').style.display == 'none') {
							document.getElementById('chattitle').innerHTML = '<span style="color:#FF0078;">&#187; chatr :)</span>'
						}
					}
				}
				ch_fetching = false;
			}
		}
		
		ch_req.open( 'GET', url , true );
		ch_req.send( null );
		
		ch_requestsent++;
	}
	/* #############################
	 * 
	 * function: ch_postText()
	 * purpose:
	 * 
	 * A users chat is posted to the server in 
	 * the querystring of the ch_postText.aspx url.
	 * The format of the querystring is: 
	 *
	 * ?u=[username]&ch_t=[chat text]
	 *
	 * Because of the nature of the url encoding
	 * certain chat text will fail to post.  
	 * The chat text cannot contain any values
	 * that are invalid in a url, or are part
	 * of the url structure, such as the ampersand (&)
	 * forward slash (/), etc.  
	 *
	 * #############################
	*/
	function ch_postText()
	{
		chatbox = document.getElementById( "mytext" );
		var chat = chatbox.value;
		chatbox.value = '';
		if (chat.length == 0 ) {return; }

		var url = '../chatr/posttext.php?c=' + ch_channel + '&rand=' + new Date().getTime();
		
		var req_post = ch_getAjax();
		
		req_post.onreadystatechange = function(){
		
			if (req_post.readyState == 4 && req_post.status == 200) {
				var s = req_post.responseText;
				var nRes = parseInt(s);
				if (nRes == 0) {
					ch_fetch();
				} else if (nRes == 1) {
					var obj = document.getElementById('chatpane');
					appendNode(obj, 'servermsg', ch_loginmsg);
					scrollChatPane();
				} else if (nRes == 2) {
					var obj = document.getElementById('chatpane');
					appendNode(obj, 'servermsg', ch_banmsg);
					scrollChatPane();
				} else if (nRes == 11) {
					var obj = document.getElementById('chatpane');
					appendNode(obj, 'servermsg', 'calm down <img src="../chatr/images/devil.gif" align="bottom" border="0" />');
					scrollChatPane();
				} else if (nRes == 10) {
					//
				} else {
					var obj = document.getElementById('chatpane');
					appendNode(obj, 'servermsg', 'ERROR!');
					scrollChatPane();
				}
			}
		
		}
		
		req_post.open( 'POST', url, true );
		req_post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		req_post.send('t=' + chat);
		
		ch_lastpost = ch_t;
		ch_postsent++;
	}
	
	function startChat()
	{
		ch_showLoadScreen();
		ch_fetch();
	}
	
	
	var ch_cancelHide = false;
	function hideSmileys() {
		if (ch_cancelHide) return;
		document.getElementById('smileys').style.display = 'none';
	}
	function ch_doHide() {
		ch_cancelHide = false;
		setTimeout('hideSmileys()', 100);
	}
	function ch_getAbsolutePos(el) {
		var r = { x: el.offsetLeft, y: el.offsetTop };
		if (el.offsetParent) {
			var tmp = ch_getAbsolutePos(el.offsetParent);		
			r.x += tmp.x;
			r.y += tmp.y;
		}
		return r;
	}
	function showSmileys() {
		var r = ch_getAbsolutePos(document.getElementById('smiley'));
		var cp = document.getElementById('smileys');
		cp.style.left = (r.x - 130) + 'px';
		cp.style.top = (r.y - 220) + 'px';
		cp.style.display = 'block';
		ch_cancelHide = true;
	}
	
var ch_curr = null;	
var ch_dx;
var ch_dy;

function ch_select(el, event) {
	ch_curr = el;
	var cx = el.offsetLeft;
	var cy = el.offsetTop;
	var tx = -100;
	var ty = -100;
	if (event.pageX) tx = event.pageX;
	else if (event.x) tx = event.x;
	if (event.pageY) ty = event.pageY;
	else if (event.y) ty = event.y;
	if ((tx == -100) || (ty == -100)) return;
	
	if (el.id == 'ch_body') {
		ch_dx = cx - tx;
		ch_dy = cy - ty;
	} else if (el.id == 'chatpane') {
		ch_dx = el.offsetWidth - tx - 6;
		ch_dy = el.offsetHeight - ty - 6;
	}

    if (event.stopPropagation) event.stopPropagation();
	else event.cancelBubble = true; 

	if (event.preventDefault) event.preventDefault();
    else event.returnValue = false;
	
	if (document.addEventListener) {
        document.addEventListener("mousemove", ch_move, true);
        document.addEventListener("mouseup", ch_release, true);
    }
    else if (document.attachEvent) {
        document.attachEvent("onmousemove", ch_move);
        document.attachEvent("onmouseup", ch_release);
    }
}

function ch_move(event) {
	if (ch_curr == null) return;
	
	var tx = -100;
	var ty = -100;
	if (event.pageX) tx = event.pageX;
	else if (event.x) tx = event.x;
	if (event.pageY) ty = event.pageY;
	else if (event.y) ty = event.y;
	if ((tx == -100) || (ty == -100)) return;
	
	var cx = ch_dx + tx;
	var cy = ch_dy + ty;	
	
	if (ch_curr.id == 'ch_body') {
		ch_curr.style.left = cx + 'px';
		ch_curr.style.top = cy + 'px';
	} else if (ch_curr.id = 'chatpane') {
		with (document.getElementById('chatpane').style) {
			width = cx + 'px';
			height = cy + 'px';
		}
		with (document.getElementById('ch_body')) {
			style.left = offsetLeft + 1 + 'px';
			style.left = offsetLeft - 1 + 'px';
			//height = cy + 16 + 'px';
		}
		with (document.getElementById('mytext').style) {
			width = cx - 41 + 'px';
		}
	}
	
	if (event.stopPropagation) event.stopPropagation();
	else event.cancelBubble = true; 

	if (event.preventDefault) event.preventDefault();
    else event.returnValue = false;
}

function ch_release(event) {
	if (document.removeEventListener) {
		document.removeEventListener("mouseup", ch_release, true);
		document.removeEventListener("mousemove", ch_move, true);
	}
	else if (document.detachEvent) {
		document.detachEvent("onmouseup", ch_release);
		document.detachEvent("onmousemove", ch_move);
	}
	
	if (event.stopPropagation) event.stopPropagation();
	else event.cancelBubble = true; 
	
	ch_curr = null;
}

function ch_toggle_vis() {
	var ch_form = document.getElementById('ch_form');
	if (ch_form.style.display != 'none') {
		ch_form.style.display = 'none';
		var ch_body = document.getElementById('ch_body');
		ch_body.style.left = ch_body.offsetLeft + 1 + 'px';
		ch_body.style.left = ch_body.offsetLeft - 1 + 'px';
		document.getElementById('ch_min').style.backgroundImage = 'url(../chatr/images/max.png)';
	} else {
		ch_form.style.display = 'block';
		document.getElementById('chattitle').innerHTML = '&#187; chatr :)';
		document.getElementById('ch_min').style.backgroundImage = 'url(../chatr/images/min.png)';
		scrollChatPane();
	}
}
