//###############################################################################
//### This function is called by oep_0.cgi to check that a game has been
//### selected
//###############################################################################
function checkGame() {
	if (document.gameselect.game.value == "-1") {
		alert("Please select a Game")
		document.gameselect.game.focus()
		return false
	}
}

//###############################################################################
//### This function is called by oep_1.cgi to check the field values
//###############################################################################
function validateForm(passForm) {
	if (passForm.module.value == "") {
		alert("Please enter a Module #")
		passForm.module.focus()
		return false
	}
	if (passForm.playernumber.value == "") {
		alert("Please enter a Player #")
		passForm.playernumber.focus()
		return false
	}
	if (passForm.accountnumber.value == "") {
		alert("Please enter an Account #")
		passForm.accountnumber.focus()
		return false
	}
	if (passForm.eaddress.value == "") {
		alert("Please enter Your Email Address")
		passForm.eaddress.focus()
		return false
	} else {
		var emailStr = passForm.eaddress.value
		var emailPat=/^(.+)@(.+)$/
		var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
		var validChars="\[^\\s" + specialChars + "\]"
		var quotedUser="(\"[^\"]*\")"
		var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
		var atom=validChars + '+'
		var word="(" + atom + "|" + quotedUser + ")"
		var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
		var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
		var matchArray=emailStr.match(emailPat)
		if (matchArray==null) {
			alert("Email address seems incorrect (check @ and .'s)")
			return false
		}
		var user=matchArray[1]
		var domain=matchArray[2]
		if (user.match(userPat)==null) {
    			// user is not valid
    		alert("The username doesn't seem to be valid.")
    		return false
		}
		var IPArray=domain.match(ipDomainPat)
		if (IPArray!=null) {
			for (var i=1;i<=4;i++) {
				if (IPArray[i]>255) {
					alert("Destination IP address is invalid!")
					return false
				}
			}
			return true
		}
		var domainArray=domain.match(domainPat)
		if (domainArray==null) {
			alert("The domain name doesn't seem to be valid.")
			return false
		}
		var atomPat=new RegExp(atom,"g")
		var domArr=domain.match(atomPat)
		var len=domArr.length
		if (domArr[domArr.length-1].length<2 || 
			domArr[domArr.length-1].length>3) {
			alert("The address must end in a three-letter domain, or two letter country.")
			return false
		}
		if (len<2) {
   			var errStr="This address is missing a hostname!"
			alert(errStr)
			return false
		}
		return true;
	}
	return true
}

//###############################################################################
//### This function is called by oep_1.cgi to check the Noticeboard Message
//### values for '<' and '>' characters
//###############################################################################
function validateNotice(passForm) {
	if (passForm.module.value == "") {
		alert("Please enter a Module #")
		passForm.module.focus()
		return false
	}
	if (passForm.playernumber.value == "") {
		alert("Please enter a Player #")
		passForm.playernumber.focus()
		return false
	}
	if (passForm.accountnumber.value == "") {
		alert("Please enter an Account #")
		passForm.accountnumber.focus()
		return false
	}
	if (passForm.eaddress.value == "") {
		alert("Please enter Your Email Address")
		passForm.eaddress.focus()
		return false
	} else {
		var emailStr = passForm.eaddress.value
		var emailPat=/^(.+)@(.+)$/
		var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
		var validChars="\[^\\s" + specialChars + "\]"
		var quotedUser="(\"[^\"]*\")"
		var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
		var atom=validChars + '+'
		var word="(" + atom + "|" + quotedUser + ")"
		var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
		var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
		var matchArray=emailStr.match(emailPat)
		if (matchArray==null) {
			alert("Email address seems incorrect (check @ and .'s)")
			return false
		}
		var user=matchArray[1]
		var domain=matchArray[2]
		if (user.match(userPat)==null) {
    			// user is not valid
    		alert("The username doesn't seem to be valid.")
    		return false
		}
		var IPArray=domain.match(ipDomainPat)
		if (IPArray!=null) {
			for (var i=1;i<=4;i++) {
				if (IPArray[i]>255) {
					alert("Destination IP address is invalid!")
					return false
				}
			}
		}
		var domainArray=domain.match(domainPat)
		if (domainArray==null) {
			alert("The domain name doesn't seem to be valid.")
			return false
		}
		var atomPat=new RegExp(atom,"g")
		var domArr=domain.match(atomPat)
		var len=domArr.length
		if (domArr[domArr.length-1].length<2 || 
			domArr[domArr.length-1].length>3) {
			alert("The address must end in a three-letter domain, or two letter country.")
			return false
		}
		if (len<2) {
   			var errStr="This address is missing a hostname!"
			alert(errStr)
			return false
		}
	}
	for (i=0; i<passForm.nb1.value.length; i++) {
		if (passForm.nb1.value.charAt(i) == "<") {
			alert("Please do not use the character '<' in the Player Noticeboard Message")
			passForm.nb1.focus()
			return false
		}
		if (passForm.nb1.value.charAt(i) == ">") {
			alert("Please do not use the character '>' in the Player Noticeboard Message")
			passForm.nb1.focus()
			return false
		}
	}
	for (i=0; i<passForm.nb2.value.length; i++) {
		if (passForm.nb2.value.charAt(i) == "<") {
			alert("Please do not use the character '<' in the Player Noticeboard Message");
			passForm.nb2.focus()
			return false
		}
		if (passForm.nb2.value.charAt(i) == ">") {
			alert("Please do not use the character '>' in the Player Noticeboard Message")
			passForm.nb2.focus()
			return false
		}
	}
	for (i=0; i<passForm.nb3.value.length; i++) {
		if (passForm.nb3.value.charAt(i) == "<") {
			alert("Please do not use the character '<' in the Player Noticeboard Message");
			passForm.nb3.focus()
			return false
		}
		if (passForm.nb3.value.charAt(i) == ">") {
			alert("Please do not use the character '>' in the Player Noticeboard Message")
			passForm.nb3.focus()
			return false
		}
	}
	return true
}

//###############################################################################
//### This function tabs to the next field if the return or carriage return
//### keyboard button is tapped.
//###############################################################################
function tabOnEnter (field, evt, type) {
	var keyCode = document.layers ? evt.which : document.all ? 
	evt.keyCode : evt.keyCode;
	if (keyCode == 13) {
		if (type == 0 || type == 3 || type == 9) {
			tabOneForward(field).focus();
			return false;
		} else if ( type == 1 || type == 4) {
			tabThreeForward(field).focus();
			return false;
		} else if ( type == 2 || type == 5) {
			tabTwoForward(field).focus();
			return false;
		} else {
			return false
		}
	}
	if (keyCode == 37) {
		if (type == 9) {
			return false;
		} else {
			tabOneBack(field).focus();
			return false;
		}
	}	
	if (keyCode == 38) {
		if (type == 0 || type == 1 || type == 8) {
			tabOneBack(field).focus();
			return false;
		} else if ( type == 2) {
			tabTwoBack(field).focus();
			return false;
		} else if ( type == 9) {
			return false;
		} else {
			tabThreeBack(field).focus();
			return false;
		}
	}
	if (keyCode == 39) {
		if (type == 7 || type == 8) {
			return false;
		} else {
			tabOneForward(field).focus();
			return false;
		}
	}
	if (keyCode == 40) {
		if (type == 6 || type == 7 || type == 8) {
			return false;
		} else if ( type == 0 || type == 9) {
			tabOneForward(field).focus();
			return false;
		} else {
			tabThreeForward(field).focus();
			return false;
		}
	}
}

//###############################################################################
//### These functions are called by tabOnEnter to tab forward
//###############################################################################
function tabOneForward(field) {
	var form = field.form;
				// begin loop to find what field we are in
	for (var e = 0; e < form.elements.length; e++)
	if (field == form.elements[e])
		break;
				// goto next field
	return form.elements[++e % form.elements.length];
}

function tabTwoForward(field) {
	var form = field.form;
				// begin loop to find what field we are in
	for (var e = 0; e < form.elements.length; e++)
	if (field == form.elements[e])
		break;
				// goto next order
	return form.elements[e+2 % form.elements.length];
}

function tabThreeForward(field) {
	var form = field.form;
				// begin loop to find what field we are in
	for (var e = 0; e < form.elements.length; e++)
	if (field == form.elements[e])
		break;
				// goto next order
	return form.elements[e+3 % form.elements.length];
}

//###############################################################################
//### These functions are called by tabOnEnter to tab forward
//###############################################################################
function tabOneBack(field) {
	var form = field.form;
				// begin loop to find what field we are in
	for (var e = 0; e < form.elements.length; e++)
	if (field == form.elements[e])
		break;
				// goto next field
	return form.elements[e-1 % form.elements.length];
}

function tabTwoBack(field) {
	var form = field.form;
				// begin loop to find what field we are in
	for (var e = 0; e < form.elements.length; e++)
	if (field == form.elements[e])
		break;
	return form.elements[e-2 % form.elements.length];
				// goto next order
}

function tabThreeBack(field) {
			// begin loop to find what field we are in
	var form = field.form;
	for (var e = 0; e < form.elements.length; e++)
	if (field == form.elements[e])
		break;
				// goto next order
	return form.elements[e-3 % form.elements.length];
}

//###############################################################################
//### This function is called from oep_2.cgi - it copies the character order to
//### the final order box then resets all the values in the order form
//###############################################################################
function addtoOrder(passForm,sendVal) {
					// validate Character ID
	if (passForm.idnumber.value == "") {
		alert("Please enter a Character ID #")
		passForm.idnumber.focus()
		return false
	}
					// check for at least one order
	var orderVal = 0
	for (i=0; i < passForm.elements.length; i++) {
		if (passForm.elements[i].value != "" && passForm.elements[i].name.charAt(5) == "a") {
			orderVal++;
		}
	}
	if (orderVal == 0) {
		alert("Please enter at least one order.")
		return false
	}

	var endBox = document.finalform.box1
	var viewBox = document.finalform.vieworders
					// is this the first Character Order ?
	if (firstOne == "start") {
					// if yes, clear the order boxes
		if (endBox.value != "") {
			endBox.value = ""
			playerBox.value = ""
		}
					// place the module, playernumber and accountnumber into the order boxes
		endBox.value = endBox.value + "#g" + document.finalform.module.value + " "
		viewBox.value = viewBox.value + "Module : " + document.finalform.module.value + "\n"
		endBox.value = endBox.value + "#p" + document.finalform.playernumber.value + " "
		viewBox.value = viewBox.value + "Player # : " + document.finalform.playernumber.value + "\n"
		endBox.value = endBox.value + "#a" + document.finalform.accountnumber.value + " "
		viewBox.value = viewBox.value + "Account # : " + document.finalform.accountnumber.value + "\n\n"
					// set value so this bit doesn't run again
		firstOne = ""
	}
					// input Character ID
	endBox.value = endBox.value + "#c" + passForm.idnumber.value + " "
	viewBox.value = viewBox.value + "Character ID : " + passForm.idnumber.value + "\n"
	orderCount = 0
					// begin loop through orders
	for (i=0; i < passForm.elements.length; i++) {
	
		if (passForm.elements[i].name.charAt(5) == "a") {
			orderCount++
		}
	
					// if order is not empty
		if (passForm.elements[i].value != "" && passForm.elements[i].name.charAt(5) == "a") {
					// if box 2 doesn't have a value, make it '0'
			if (passForm.elements[i+1].value == "") {
				passForm.elements[i+1].value = "0"
			}
					// copy order over
			endBox.value = endBox.value + "&" + orderCount + " " + passForm.elements[i].value + " " + passForm.elements[i+1].value + " " + passForm.elements[i+2].value + " "
			viewBox.value = viewBox.value + "Order " + orderCount + " : " + passForm.elements[i].value + " " + passForm.elements[i+1].value + " " + passForm.elements[i+2].value + "\n"
					// increment order number
		}
	}
	viewBox.value = viewBox.value + "\n"
	if (sendVal != 1) {
		alert("Character ID "+document.orderform.idnumber.value+" has been added to your order. Now enter another Character ID and their orders or click on the 'Send Order' button to finish.")
	}
					// emptry all order fields
	for (i=0; i < passForm.elements.length; i++) {
		passForm.elements[i].value = ""
	}
	document.orderform.idnumber.focus()
	document.orderform.addbut.value = "Add To Order"
	return true
}

//###############################################################################
//### This function is called from oep_2.cgi to clear the final order form
//###############################################################################

function clearOrder() {
	document.finalform.box1.value = "";
	document.finalform.vieworders.value = "";
	firstOne = "start"
}

//###############################################################################
//### This function is called from oep_2.cgi to check before sending the data
//###############################################################################

function sendOrder() {
	var sendVal = 1
	if (document.orderform.idnumber.value != "") {
		addtoOrder(document.orderform,1)
	}
	if (document.finalform.box1.value == "") {
		alert ("Please enter at least one order before sending!")
		return false
	}
}

//###############################################################################
//### This function is called from oep_2.cgi and shows the advanced options
//###############################################################################

function showAdv() {
	if (visAdv == "hidden") {
		show_me.style.visibility = "visible";
		visAdv = "visible";
	} else {
		show_me.style.visibility = "hidden";
		visAdv = "hidden";
	}
}

//###############################################################################
//### This function is used by Copy To End and Copy Last to locate the next 
//### empty order and copy the previous values into it, then loop to the end
//### if required
//###############################################################################
function copyThis(type, thisForm) {
	if (thisForm.idnumber.value == "") {
					// exit if no character id number
		alert("Please enter a Character ID.")
		document.orderform.idnumber.focus()
		return false
	}
	if (thisForm.box15a.value > "") {
					// exit if all orders
		alert("You have used all 15 Orders already.")
		return false
	}
	if (thisForm.box01a.value == "") {
					// exit if no orders
		alert("You must have at least one Order to use the Copy functions.")
		return false
	}
	for (i=0; i < thisForm.elements.length; i++) {
					// is this field a box 'a' and is it empty ?
		if (thisForm.elements[i].value == "" && thisForm.elements[i].name.charAt(5) == "a") {
					// if it is copy the previous order into it
			thisForm.elements[i].value = thisForm.elements[i-3].value
			thisForm.elements[i+1].value = thisForm.elements[i-2].value
			thisForm.elements[i+2].value = thisForm.elements[i-1].value
					// is this Copy Last or Copy To End ?
			if (type == "0") {
					// if it's Copy Last then exit
				return false
			}
		}
	}
}

//###############################################################################
//### This function captures keystrokes if they are'Shift' and '1' to '8' and
//### places the relevant movement order into the next empty order
//###############################################################################
function handlePress(e, thisForm) {
					// find out which key was pressed
	var whichCode = (window.Event) ? e.which : e.keyCode;
	var actualChar = String.fromCharCode(whichCode);
					// loop through the form elements
	for (i=0; i < thisForm.elements.length; i++) {
					// locate the first empty order
		if (thisForm.elements[i].value == "" && thisForm.elements[i].name.charAt(5) == "a") {
					// was 'Shift' & '1' pressed ?	
			if (actualChar == "!") {
					// if yes, then is there a Character ID value ?
				if (thisForm.idnumber.value == "") {
					alert("Please enter a Character ID #")
					// if not, exit
					thisForm.idnumber.focus()
					break
				}
					// don't let the actual value of '!' be placed in any field
				thisForm.elements[i].focus()
				thisForm.elements[i].blur()
					// input the order
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "1"
					// was 'Shift' & '2' pressed ?
			} else if (actualChar == "@") {
					// if yes, then is there a Character ID value ?
				if (thisForm.idnumber.value == "") {
					alert("Please enter a Character ID #")
					// if not, exit
					thisForm.idnumber.focus()
					break
				}
					// don't let the actual value of '!' be placed in any field
				thisForm.elements[i].focus()
				thisForm.elements[i].blur()
					// input the order
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "2"
					// was 'Shift' & '3' pressed ?
			} else if (actualChar == "£" || actualChar == "#") {
					// if yes, then is there a Character ID value ?
				if (thisForm.idnumber.value == "") {
					alert("Please enter a Character ID #")
					// if not, exit
					thisForm.idnumber.focus()
					break
				}
					// don't let the actual value of '!' be placed in any field
				thisForm.elements[i].focus()
				thisForm.elements[i].blur()
					// input the order
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "3"
					// was 'Shift' & '4' pressed ?
			} else if (actualChar == "$") {
					// if yes, then is there a Character ID value ?
				if (thisForm.idnumber.value == "") {
					alert("Please enter a Character ID #")
					// if not, exit
					thisForm.idnumber.focus()
					break
				}
					// don't let the actual value of '!' be placed in any field
				thisForm.elements[i].focus()
				thisForm.elements[i].blur()
					// input the order
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "4"
					// was 'Shift' & '5' pressed ?
			} else if (actualChar == "%") {
					// if yes, then is there a Character ID value ?
				if (thisForm.idnumber.value == "") {
					alert("Please enter a Character ID #")
					// if not, exit
					thisForm.idnumber.focus()
					break
				}
					// don't let the actual value of '!' be placed in any field
				thisForm.elements[i].focus()
				thisForm.elements[i].blur()
					// input the order
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "5"
					// was 'Shift' & '6' pressed ?
			} else if (actualChar == "^") {
					// if yes, then is there a Character ID value ?
				if (thisForm.idnumber.value == "") {
					alert("Please enter a Character ID #")
					// if not, exit
					thisForm.idnumber.focus()
					break
				}
					// don't let the actual value of '!' be placed in any field
				thisForm.elements[i].focus()
				thisForm.elements[i].blur()
					// input the order
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "6"
					// was 'Shift' & '7' pressed ?
			} else if (actualChar == "&") {
					// if yes, then is there a Character ID value ?
				if (thisForm.idnumber.value == "") {
					alert("Please enter a Character ID #")
					// if not, exit
					thisForm.idnumber.focus()
					break
				}
					// don't let the actual value of '!' be placed in any field
				thisForm.elements[i].focus()
				thisForm.elements[i].blur()
					// input the order
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "7"
					// was 'Shift' & '8' pressed ?
			} else if (actualChar == "*") {
					// if yes, then is there a Character ID value ?
				if (thisForm.idnumber.value == "") {
					alert("Please enter a Character ID #")
					// if not, exit
					thisForm.idnumber.focus()
					break
				}
					// don't let the actual value of '!' be placed in any field
				thisForm.elements[i].focus()
				thisForm.elements[i].blur()
					// input the order
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "8"
			}
			return false
		}
	}
}

//###############################################################################
//### This function is called by oep_2.cgi by the 'compass' and places the relevant 
//### movement order into the next empty order
//###############################################################################
function compassMove(direction, thisForm) {
	if (thisForm.idnumber.value == "") {
					// exit if no character id number
		alert("Please enter a Character ID.")
		document.orderform.idnumber.focus()
		return false
	}
	if (thisForm.box15a.value > "") {
					// exit if all orders
		alert("You have used all 15 Orders already.")
		return false
	}
					// begin loop to find an empty field
	for (i=0; i < thisForm.elements.length; i++) {
					// is the order empty ?
		if (thisForm.elements[i].value == "" && thisForm.elements[i].name.charAt(5) == "a") {
					// if yes, find out which direction and place order
			if (direction == "N") {
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "1"
			} else if (direction == "NE") {
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "2"
			} else if (direction == "E") {
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "3"
			} else if (direction == "SE") {
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "4"
			} else if (direction == "S") {
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "5"
			} else if (direction == "SW") {
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "6"
			} else if (direction == "W") {
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "7"
			} else if (direction == "NW") {
				thisForm.elements[i].value = "M"
				thisForm.elements[i+1].value = "8"
			}
			return false
		}
	}
}