/* chatURL - URL for updating chat messages */
var chatURL = "chat.php";

/* create XMLHttpRequest objects for updating the chat messages */
var xmlHttpGetMessages = createXmlHttpRequestObject();

/* variable that establishes how often to access the server */
var updateInterval = 1000; // how many miliseconds to wait to get new message - 1 sec.

/* variable that establishes how long to let chat stay open if not in use */
var start   = 15 * 60;  // how many seconds to wait to get new message - 15 min.
var timer   = start;
var sleeper = false;

// when set to true, display detailed error messages
var debugMode = false;

/* initialize the messages cache */
var cache = new Array();

/* lastMessageID - the ID of the most recent chat message */
var lastMessageID = -1;

/* We need this next variable for throttling or else we can display stuff that hasn't posted yet. */
var verylastMessageID;


/* creates an XMLHttpRequest instance */
function createXmlHttpRequestObject() {
// will store the reference to the XMLHttpRequest object
var xmlHttp;
// this should work for all browsers except IE6 and older
try
	{
	// try to create XMLHttpRequest object
	xmlHttp = new XMLHttpRequest();
	}
catch(e)
	{
	// assume IE6 or older
	var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
"MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP");
	// try every prog id until one works
	for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
		{
		try
			{
			// try to create XMLHttpRequest object
			xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
			}
		catch (e) {}
		}
	}
// return the created object or display an error message
if (!xmlHttp)
	alert("Error creating the XMLHttpRequest object.");
else
	return xmlHttp;
}


/* this function initiates the chat; it executes when the chat page loads */
function init() {
// Restart page re-director.
if (sleeper == false)
	{
	countdown();
	}
// perform housekeeping on database (deletes messages older than # minutes)
cleanupMessages();
// get a reference to the text box where the user writes new messages
var oMessageBox = document.getElementById("messageBox");
// prevents the autofill function from starting
oMessageBox.setAttribute("autocomplete", "off");
// ensures our user has a default random name when the form loads
checkUsername();
// clear chat window and reset the id
document.getElementById("scroll").innerHTML = "";
/* lastMessageID - the ID of the most recent chat message */
lastMessageID = -1;
// initiates updating the chat window
requestNewMessages();
}

/* function that ensures that the username is never empty and if so a random name is generated */
function checkUsername() {
// ensures our user has a default random name when the form loads
var oUser=document.getElementById("userName");
if(oUser.value == "") oUser.value = "Guest" + Math.floor(Math.random() * 1000);
}



/* function called when the Send button is pressed */
function sendMessage() {
// Wake Up Page.
timer=start;
// Control the input to prevent runanway keyboards
if (verylastMessageID == lastMessageID) { } else
	{
	// save the message to a local variable and clear the text box
	var oCurrentMessage = document.getElementById("messageBox");
	var currentUser     = document.getElementById("userName").value;
	var currentColor    = document.getElementById("color").value;
	// don't send void messages
	if (trim(oCurrentMessage.value) != "" && trim(currentUser) != "" && trim (currentColor) != "")
		{
		// if we need to send and retrieve messages
		params = "mode=SendAndRetrieveNew" +
		"&id=" + encodeURIComponent(lastMessageID) +
		"&color=" + encodeURIComponent(currentColor) +
		"&name=" + encodeURIComponent(currentUser) +
		"&message=" + encodeURIComponent(oCurrentMessage.value);
		// add the message to the queue
		cache.push(params);
		// clear the text box
		oCurrentMessage.value = "";
		}
	verylastMessageID = lastMessageID; // Input accepted.
	}
}


/* function called when we init */
function cleanupMessages() {
// set the flag that specifies we're cleaning up the database
params = "mode=CleanUp";
// add the message to the queue
cache.push(params);
}


/* function called when the Delete Messages button is pressed */
function deleteMessages() {
// set the flag that specifies we're deleting the messages
params = "mode=DeleteAndRetrieveNew";
// add the message to the queue
cache.push(params);
}


/* makes asynchronous request to retrieve new messages, post new messages, delete messages */
function requestNewMessages() {
// only continue if xmlHttpGetMessages isn't void
if(xmlHttpGetMessages)
	{
	try
		{
		// don't start another server operation if such an operation is already in progress
		if (xmlHttpGetMessages.readyState == 4 || xmlHttpGetMessages.readyState == 0)
			{
			// we will store the parameters used to make the server request
			var params = "";
			// if there are requests stored in queue, take the oldest one
			if (cache.length > 0)
				params = cache.shift();
				// if the cache is empty, just retrieve new messages
			else
				params = "mode=RetrieveNew" + "&id=" +lastMessageID;
			// call the server page to execute the server-side operation
			xmlHttpGetMessages.open("POST", chatURL, true);
			xmlHttpGetMessages.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
			xmlHttpGetMessages.onreadystatechange = handleReceivingMessages;
			xmlHttpGetMessages.send(params);
			} else {
			// we will check again for new messages
			setTimeout("requestNewMessages();", updateInterval); // this seemed redundant so I turned it off.
			}
		}
	catch(e)
		{
		displayError(e.toString());
		}
	}
}


/* function that handles the http response when updating messages */
function handleReceivingMessages() {
// continue if the process is completed
if (xmlHttpGetMessages.readyState == 4)
	{
	// continue only if HTTP status is "OK"
	if (xmlHttpGetMessages.status == 200)
		{
		try
			{
			// process the server's response
			readMessages();
			}
		catch(e)
			{
			// display the error message
			displayError(e.toString());
			}
		} else {
		// display the error message
		displayError(xmlHttpGetMessages.statusText);
		}
	}
}


/* function that processes the server's response when updating messages */
function readMessages() {
// retrieve the server's response
var response = xmlHttpGetMessages.responseText;
// server error?
if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0)
	throw(response.length == 0 ? "Void server response." : response);
// retrieve the JSON object correspondig to the responseText element
responseJSON = xmlHttpGetMessages.responseText.parseJSON();
// retrieve the flag that says if the chat window has been cleared
clearChat = responseJSON[0].clear;
// if the clear flag is set, we need to clear the chat window
if(clearChat == "true")
	{
	// clear chat window and reset the id
	document.getElementById("scroll").innerHTML = "";
	lastMessageID = -1;
	}
// initialize the arrays
idArray      = new Array();
colorArray   = new Array();
nameArray    = new Array();
timeArray    = new Array();
messageArray = new Array();
// retrieve the arrays
for(i=0;i<responseJSON[1].results.length;i++)
	{
	// retrieve the arrays from the server's response
	idArray[i]      = responseJSON[1].results[i].id;
	colorArray[i]   = responseJSON[1].results[i].color;
	nameArray[i]    = responseJSON[1].results[i].name;
	timeArray[i]    = responseJSON[1].results[i].time;
	messageArray[i] = responseJSON[1].results[i].message;
	}
// add the new messages to the chat window
displayMessages(idArray, colorArray, nameArray, timeArray, messageArray);
// the ID of the last received message is stored locally
if(idArray.length>0) lastMessageID = idArray[idArray.length - 1]; // restart sequence
setTimeout("requestNewMessages();", updateInterval); 
}


/* function that appends the new messages to the chat list */
function displayMessages(idArray, colorArray, nameArray, timeArray, messageArray) {
// Get status of "display time checkbox.
var timedsp = document.getElementById("timeok").checked==true;
// each loop adds a new message
for(var i=0; i<idArray.length; i++)
	{
	// get the message details
	var color   = colorArray[i];
	var time    = timeArray[i];
	var name    = nameArray[i];
	var message = messageArray[i];
	// compose the HTML code that displays the message
	var htmlMessage = "";
	htmlMessage += "<div class=\"item\" style=\"color:" + color + "\">";
//	htmlMessage += "[" + time + "] " + name + " &raquo; ";
	if (timedsp)
		{
		htmlMessage += time + " " + name + " &raquo; ";
		} else {
		htmlMessage += name + " &raquo; ";
		}
	htmlMessage += message.toString();
	htmlMessage += "</div>";
	// display the message
	displayMessage(htmlMessage);
	}
}


/* displays a message */
function displayMessage(message) {
// get the scroll object
var oScroll = document.getElementById("scroll");
// check if the scroll is down
var scrollDown = (oScroll.scrollHeight - oScroll.scrollTop <= oScroll.offsetHeight );
// display the message
oScroll.innerHTML += message;
// scroll down the scrollbar
oScroll.scrollTop = scrollDown ? oScroll.scrollHeight : oScroll.scrollTop;
}


/* function that displays an error message */
function displayError(message) {
// display error message, with more technical details if debugMode is true
//displayMessage("Error accessing the server! "+ (debugMode ? "<br/>" + message : ""));
if (debugMode)
	{
	displayMessage("Error accessing the server!<br/>" + message);
	} else {
	//displayMessage("Delay accessing the server!<br/>");
	}
}


/* handles keydown to detect when enter is pressed */
function handleKey(e) {
// get the event
e = (!e) ? window.event : e;
// get the code of the character that has been pressed
code = (e.charCode) ? e.charCode : 
((e.keyCode) ? e.keyCode :
((e.which) ? e.which : 0));
// handle the keydown event
if (e.type == "keydown")
	{
	// if enter (code 13) is pressed
	if(code == 13)
		{
		// send the current message
		sendMessage();
		}
	}
}


/* removes leading and trailing spaces from the string */
function trim(s) {
return s.replace(/(^\s+)|(\s+$)/g, "")
}


/* Updates users color choice */
function UpdateColor() {
var selColor = document.getElementById("colorsel").value;
document.getElementById("color").value = selColor;
}

// The following causes the page to redirects after 15 minutes.
// It get's reset by any action they take.
// This prevents wasting bandwidth if someone leaves their screen open.
function countdown(){
sleeper = true;
if (timer > 0)
	{
	//document.test.x.value = timer;
	timer -= 1;
	setTimeout("countdown()",1000);
	} else {
	location.href="http://www.motorcyclesafari.com/community.php";
	}
}
