		/*
	 	 * Set up event handlers
	 	 */
		function setupForm() {
			// Get the 'submit' button and hook it up with 
			// function 'submit' 
			var elem = document.getElementById("submitIt");
			if (elem.addEventListener)
				elem.addEventListener('click', submit, false);
			else if (elem.attachEvent)
				elem.attachEvent('onclick', submit);
			else
				elem.onclick = submit;
		}

		/*
	 	 * This function is called when the submit button is clicked
	  	 */
		function submit() {
			// clear up the error messages, if any
			clearUp();
			
			// Get the user input
			var name = document.getElementById("name").value;
			var email = document.getElementById("email").value; 
			var comments = document.getElementById("comments").value;

			// Create the XMLHttpRequest object
			xmlHttp = new XMLHttpRequest();

			// Set up how to respond when the state of XMLHttpRequest changes
			xmlHttp.onreadystatechange = function() {
				// If we get the response from the server correctly
				if (xmlHttp.readyState == 4) {
				   	if (xmlHttp.status == 200) {
						fixError();
				   	} else
						window.alert(xmlHttp.status + ": " + xmlHttp.statusText);
				}

			}

			// If we use "post" method, then run the following piece of code
			xmlHttp.open("post", "reg_form.php", true);
			var data = "name=" + name + "&email=" + email + "&comments=" + comments;
			xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			xmlHttp.send(data);
		}

		/*
		 * Fix the error
		 */
		function fixError() {
			// No error
			if (!xmlHttp.responseText)
				return;
			// Retrieve the error messages returned from the server.
			// and parse the message and create corresponding error message
			// to be shown
			var errors = xmlHttp.responseText.split(":");
			var nameErr;
			var emailErr;
			var commentsErr;
			for (var i=0; i<errors.length; i++) {
				if (errors[i] == "name") {
					nameErr = document.createElement("span");
					nameErr.id = "error_msg";
					nameErr.style.color = "red";
					var txt = document.createTextNode("(Name is empty)");
					nameErr.appendChild(txt);
				}

				if (errors[i] == "email_empty" || errors[i] == "email_invalid") {
					emailErr = document.createElement("span");
					emailErr.id = "error_msg";
					emailErr.style.color = "red";
					var txt = document.createTextNode("(Email is incorrect)");
					emailErr.appendChild(txt);
				}
				
				if (errors[i] == "comments") {
					commentsErr = document.createElement("span");
					commentsErr.id = "error_msg";
					commentsErr.style.color = "red";
					var txt = document.createTextNode("(Comments are empty)");
					commentsErr.appendChild(txt);
				}
				
				if (errors[i] == "thanks"){
					alert("Your information was submitted. Thanks!");
				}
				
				if (errors[i] == "problem"){
					alert("There was a problem. Please try again.");
				}
			}
			
			// Insert this error element into the correct position
			if (nameErr)
				insertAfter(nameErr, document.getElementById("name"));

			if (emailErr) {
				insertAfter(emailErr, document.getElementById("email"));
			}
			
			if (commentsErr) {
				insertAfter(commentsErr, document.getElementById("comments"));
			}
		}

		/*
		 * Clear up the error message
		 */
		function clearUp() {
			// remove existing error messages
			var error = document.getElementById("error_msg");

			while (error) {
				var parent = error.parentNode;
				parent.removeChild(error);

				error = document.getElementById("error_msg");
			}
		}
		
		/*
		 * Insert an element after another element
		 */
		function insertAfter (newElem, refElem) {
			// Get the parent
			var parent = refElem.parentNode;

			// Insert it to the correct spot
			if (parent.lastChild == refElem) {
				parent.appendChild(newElem);
			} else
				parent.insertBefore(newElem, refElem.nextSibling);
		}

		// Define an error event handler
		function errorHandler(msg, url, line) {
			var txt = "An error happened\n\n";
			txt += "Error: " + msg + "\n";
			txt += "URL: " + url + "\n";
			txt += "Line: " + line + "\n";
			txt += "Click OK to continue.\n\n";
			
			alert(txt);
		}

		// Deal with errors
		window.onerror = errorHandler;