// Validate Lite

// This function eliminates extraneous whitespace. Returns a string value.
// NOTE: This function eliminates ALL whitespace (even between two words)
function zapWhitespace(stringValue) {
	if (typeof stringValue != "undefined") {
		var reWhitespace = /\ +/;			// one or more whitespace characters
		for (var i = 0; i < stringValue.length; i++)
			stringValue = stringValue.replace(reWhitespace, "");
		var reWhitespaceEOL = /\ +$/;		// whitespace at End Of Line
		stringValue = stringValue.replace(reWhitespaceEOL, "");
		return stringValue;
	}
}

// this function takes an element value and tests to see if it is a valid
// time. Valid times are either Regular (3:00pm), Military (15:00), or
// in short-hand format (3pm or 3p). Function returns FALSE if time
// is not valid. Function returns FALSE if the elementName is invalid.
function fixTime(elementID, standardOrMilitary)
{
	var errorMessage = "[fixTime] Error: This is not a valid time.\nPlease use either regular or military time format.";

	if (document.getElementById(elementID)) {
		var theElement = document.getElementById(elementID);
		var theTime = theElement.value.toString();
		var re = /\w/;

		if (re.test(theTime)) {
			var reMilTime = /^[0]?\d{1}\:[0-5][0-9]\ ?$|^[1][0-9]\:[0-5][0-9]\ ?$|^[2][0-3]\:[0-5][0-9]\ ?$|^[0][0-9]\:[0-5][0-9]\ ?$/;
			var reRegTime = /^[0]?[1-9]{1}\:[0-5][0-9](\ ?[a]\ ?$|\ ?[p]\ ?$|\ ?[a][m]\ ?$|\ ?[p][m]\ ?$)|^[0-1]?[0-2]{1}\:[0-5][0-9](\ ?[a]\ ?$|\ ?[p]\ ?$|\ ?[a][m]\ ?$|\ ?[p][m]\ ?$)/i;
			var reQckTime = /^[0]?[1-9]{1}(\ ?[a]\ ?$|\ ?[p]\ ?$|\ ?[a][m]\ ?$|\ ?[p][m]\ ?$)|^[0-1]?[0-2]{1}(\ ?[a]\ ?$|\ ?[p]\ ?$|\ ?[a][m]\ ?$|\ ?[p][m]\ ?$)/i;

			var milTime = reMilTime.test(theTime);	// check if its a military time
			var regTime = reRegTime.test(theTime);	// check if its a regular time
			var qckTime = reQckTime.test(theTime);	// check if its a quick-entry time ("3pm" or "2p")
			
			if (!standardOrMilitary) var standardOrMilitary = "standard";
			
			if (milTime ^ regTime ^ qckTime) {		// if 1 of these formats match (^ = exclusive-or)
				// find numbers, find a colon, find am/pm, test if number is greater than 12....
				if (milTime) {
					var reBC = /^[0]?\d{1}\:|^[1][0-9]\:|^[2][0-3]\:|^[0][0-9]\:/;
					var reAC = /\:[0-5][0-9]/;

					var tmp = theTime;
					var tmpIndex = tmp.search(/\:/);
					var beforeColon = tmp.slice(0, tmpIndex);
					var afterColon = tmp.slice(tmpIndex + 1, tmp.length);
					var newTimeOutput = "";
					var amPM = "";

					if (standardOrMilitary == "standard") {
						if (beforeColon >= 12) {
							if (beforeColon > 12) beforeColon -= 12;
							amPM = " PM";
						}
						else
							amPM = " AM";
						
						if ((beforeColon == "0") || (beforeColon == "00")) {
							beforeColon = "12";
							amPM = " AM";
						}
						
						newTimeOutput = beforeColon + ':' + afterColon + amPM;
						theElement.value = newTimeOutput;
					}
					else {
						if ((beforeColon <= 9) && (beforeColon.length <= 1)) beforeColon = '0' + beforeColon;
						newTimeOutput = beforeColon + ':' + afterColon;
						theElement.value = newTimeOutput;
					}
				}
				
				if (regTime) {
					var reBC = /^[0]?[1-9]{1}\:|^[0-1]?[0-2]{1}\:/;
					var reAC = /\:[0-5][0-9]/;
					var reTT = /(\ ?[a]\ ?$|\ ?[p]\ ?$|\ ?[a][m]\ ?$|\ ?[p][m]\ ?$)/i;

					var tmp = theTime;
					var tmpIndex = tmp.search(/\:/);
					var tmpIndex2 = tmp.search(reTT);
					var beforeColon = tmp.slice(0, tmpIndex);
					var afterColon = tmp.slice(tmpIndex+1, tmpIndex2);
					var amPM = tmp.slice(tmpIndex2, tmp.length);
					var newTimeOutput = "";

					if (standardOrMilitary == "standard") {
						var amPM = zapWhitespace(amPM.toLowerCase());
						if ((amPM == "a") || (amPM == "am")) amPM = " AM";
						else amPM = " PM";
						
						if (beforeColon <= 9)
							if (beforeColon.length > 1)
								beforeColon = beforeColon.charAt(1);
						
						newTimeOutput = beforeColon + ':' + afterColon + amPM;
						theElement.value = newTimeOutput;
					}
					else {
						var amPM = zapWhitespace(amPM.toLowerCase());
						
						if ((amPM == "a") || (amPM == "am")) {
							if (beforeColon <= 9)
								beforeColon = '0' + beforeColon;
						}
						else
							beforeColon = eval(beforeColon) + 12;
						
						newTimeOutput = beforeColon + ':' + afterColon;
						theElement.value = newTimeOutput;
					}
				}
				
				if (qckTime) {
					var reBTT = /^[0]?[1-9]{1}|^[0-1]?[0-2]{1}/;
					var reTT = /(\ ?[a]\ ?$|\ ?[p]\ ?$|\ ?[a][m]\ ?$|\ ?[p][m]\ ?$)/i;

					var tmp = theTime;
					var tmpIndex = tmp.search(reTT);
					var beforeTT = tmp.slice(0, tmpIndex);
					var amPM = tmp.slice(tmpIndex, tmp.length);
					var newTimeOutput = "";

					if (standardOrMilitary == "standard") {
						var amPM = zapWhitespace(amPM.toLowerCase());

						if ((amPM == "a") || (amPM == "am")) amPM = " AM";
						else amPM = " PM";
						
						newTimeOutput = beforeTT + ":00" + amPM;
						theElement.value = newTimeOutput;
					}
					else {
						if ((amPM == "a") || (amPM == "am")) {
							if (beforeTT <= 9) beforeTT = '0' + beforeTT;
							if (beforeTT == 12) beforeTT = "24";
						}
						else {
							if (beforeTT < 12) beforeTT = eval(beforeTT) + 12;
						}
						
						newTimeOutput = beforeTT + ":00";
						theElement.value = newTimeOutput;
					}
				}
				return true;	
			}
			else {
				alert(errorMessage);
				theElement.focus();
				theElement.select();
				return false;
			}
		}
	}
	else
		return false;			// function returns FALSE if the element doesn't exist
}

function checkDate(elementID) {
	if (document.getElementById(elementID)) {
		var theElement = document.getElementById(elementID);
		var dateStr = theElement.value;
		var re = /\w/;
		var reDate = /^([0]?[1-9]{1}|[1]{1}[0-2]{1})(\/|\-)([3]?[0-1]{1}|[2]?[0-9]{1}|[1]?[0-9]{1}|[0]?[1-9]{1}|\d{1})\2(\d{2}|\d{4})\s?$/;
		var reFebCheck = /^[0]?[2]{1}(\/|\-)[3]{1}\d{1}/;	// valid only if this is false
		var reDayCheck = /^([0]?[4]{1}|[0]?[6]{1}|[0]?[9]{1}|[1]{1}[1]{1})(\/|\-)[3]{1}[1-9]{1}/; // valid only if this is false
		var reDotDash = /(\.|\-)/g;
	
		if (typeof dateStr != "undefined") {
			dateStr = dateStr.replace(/\ +/g, '');
			dateStr = dateStr.replace(reDotDash, '/');
			theElement.value = dateStr;
			var integrityArray = dateStr.split('/');
			var dateStrMonth = integrityArray[0];
			var dateStrDays = integrityArray[1];
			
			var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31][(dateStrMonth - 1)]; // get actual daysInMonth 
			if (dateStrDays > daysInMonth) {
				theElement.value = '';
				theElement.focus();
				return false;
			}
			
			if (reFebCheck.test(dateStr) || reDayCheck.test(dateStr)) {
				theElement.value = '';
				theElement.focus();
				return false;
			}
			else if (reDate.test(dateStr)) return true;
			else {
				theElement.value = '';
				theElement.focus();
				return false;
			}
		} else {
			return false;
		}
	} else {
		return false;
	}
}

function isDateStr(dateStr) {
	var re = /\w/;
	var reDate = /^([0]?[1-9]{1}|[1]{1}[0-2]{1})(\/|\-)([3]?[0-1]{1}|[2]?[0-9]{1}|[1]?[0-9]{1}|[0]?[1-9]{1}|\d{1})\2(\d{2}|\d{4})\s?$/;
	var reFebCheck = /^[0]?[2]{1}(\/|\-)[3]{1}\d{1}/;	// valid only if this is false
	var reDayCheck = /^([0]?[4]{1}|[0]?[6]{1}|[0]?[9]{1}|[1]{1}[1]{1})(\/|\-)[3]{1}[1-9]{1}/; // valid only if this is false
	var reDotDash = /(\.|\-)/g;

	if (typeof dateStr != "undefined") {
		dateStr = dateStr.replace(/\ +/g, '');
		dateStr = dateStr.replace(reDotDash, '/');
		var integrityArray = dateStr.split('/');
		var dateStrMonth = integrityArray[0];
		var dateStrDays = integrityArray[1];
		
		var daysInMonth = [31,29,31,30,31,30,31,31,30,31,30,31][(dateStrMonth - 1)]; // get actual daysInMonth 
		if (dateStrDays > daysInMonth) {
			return false;
		}

		if (reFebCheck.test(dateStr) || reDayCheck.test(dateStr)) return false;
		else if (reDate.test(dateStr)) return true;
		else return false;
	} else {
		return false;
	}
}

// This function checks to make sure that a phone number was entered in the correct format.
//
// ASSUMPTION: If only 7 digits are entered, area code is set to 734
function checkPhone(elementID) {
	if (document.getElementById(elementID)) {
		var re = /\w/;
		var theElement = document.getElementById(elementID);
		var thePhone = theElement.value.toString();
		
		if (re.test(thePhone)) {
			var tmp = thePhone;
			var returnString = "";
			var removeThese = " \t\n\r()[]-.;";
			for (var i = 0; i < tmp.length; i++) {
				// Check that current character isn't whitespace.
				var c = tmp.charAt(i);
				if (removeThese.indexOf(c) == -1)
					returnString += c;
			}
			tmp = returnString.toUpperCase();

			var reElvnNums = /^(\d{1})(\d{3})(\d{3})(\d{4})$/;
			var reElvnChrs = /^(\d{1})(\d{3})(\w{3})(\w{4})$/;
			var reTenNumbs = /^(\d{3})(\d{3})(\d{4})$/;
			var reSevenNum = /^(\d{3})(\d{4})$/;
			var reSevenChr = /^(\w{3})(\w{4})$/;
			var reTenChars = /^(\d{3})(\w{3})(\w{4})$/;

			if (tmp.length == 5) {
				alert("Error: Only 5 digits entered.\nIf you are entering a campus number, you must include the complete 7-digit number.");
				theElement.focus();
				theElement.select();
				return true;
			}
			else if (reElvnNums.test(tmp)) {
				reElvnNums.exec(tmp);
				if (RegExp.$1 == 1) {
					var newNum = RegExp.$2 + " " + RegExp.$3 + "-" + RegExp.$4;
					theElement.value = newNum;
					return true;
				}
				else {
					var reFaxNum = /fax/i;
					if (reFaxNum.test(elementName)) alert("Warning: This does not appear to be a valid fax number.\nPlease make sure the number is correct.");
					else alert("Warning: This does not appear to be a valid phone number.\nPlease make sure the number is correct.");
					theElement.focus();
					return true;
				}
			}
			else if (reElvnChrs.test(tmp)) {
				reElvnChrs.exec(tmp);
				var newNum = RegExp.$2 + " " + RegExp.$3 + "-" + RegExp.$4;
				theElement.value = newNum;
				return true;
			}
			else if (reSevenNum.test(tmp)) {
				reSevenNum.exec(tmp);
				var newNum = "734 " + RegExp.$1 + "-" + RegExp.$2;
				theElement.value = newNum;
				return true;
			}
			else if (reTenNumbs.test(tmp)) {
				reTenNumbs.exec(tmp);
				var newNum = RegExp.$1 + " " + RegExp.$2 + "-" + RegExp.$3;
				theElement.value = newNum;
				return true;
			}
			else if (reSevenChr.test(tmp)) {
				reSevenChr.exec(tmp);
				var newNum = "734 " + RegExp.$1 + "-" + RegExp.$2;
				theElement.value = newNum;
				return true;
			}
			else if (reTenChars.test(tmp)) {
				reTenChars.exec(tmp);
				var newNum = RegExp.$1 + " " + RegExp.$2 + "-" + RegExp.$3;
				theElement.value = newNum;
				return true;
			}
			else {
				var reFax = /fax/i;
				if (reFax.test(elementID))
					alert("Warning: This does not appear to be a valid fax number.\nPlease make sure the number is correct.");
				else
					alert("Warning: This does not appear to be a valid phone number.\nPlease make sure the number is correct.");
				theElement.focus();
				theElement.select();
				return true;
			}
		}
	}
}

// This function checks to make sure that the URL was entered in a valid format.
//
// ASSUMPTION: entering "~something" resolves to "http://www.umich.edu/~something"
function checkURL(elementID)
{
	if (document.getElementById(elementID)) {
		var theElement = document.getElementById(elementID);
		var theURL = theElement.value.toString();
		var re = /(\w|\W)/;
		if (re.test(theURL))
		{
			var tmp = theURL;

			tmp = zapWhitespace(tmp);
			theElement.value = tmp;

			reWhitespace = /\ /;
			while(reWhitespace.test(tmp)) tmp = tmp.replace(reWhitespace, "%20");

			reTest = /(^(http:\/\/)|^(https:\/\/)|^(ftp:\/\/))/;
			if (reTest.test(tmp)) return true;
			else {
				re2 = /^\~[a-z]{2,}/;
				re3 = /\.([a-z]{2,}|[0-9]{2,})/;
				if (re2.test(tmp)) {
					var newStr = "http://www.umich.edu/" + tmp;
					theElement.value = newStr;
					return true;
				}
				else if (re3.test(tmp)) {
					var newStr = "http://" + tmp;
					theElement.value = newStr;
					return true;
				}
				else {
					theElement.focus();
					theElement.select();
					return false;
				}
			}
		}
		else
			return true;
	}
}


// This function checks to make sure that the email address is in a valid format
//
// NOTE: if the elementName is "from", the field is treated as required (ie: in a
// form with HTMail, from is a required field name, therefore this function will
// cause an error message if no value is entered)
function checkEmail(elementID) {
	if (document.getElementById(elementID)) {
		var theElement = document.getElementById(elementID);
		var theEmail = theElement.value.toString();
		var re = /\w/;
		if (re.test(theEmail)) {
			var tmp = theEmail;

			tmp = zapWhitespace(tmp);
			theElement.value = tmp;

			reEmail = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
			
			if (reEmail.test(tmp)) return true;
			else {
				re2 = /^[a-z]{2,8}$/;
				if (re2.test(tmp)) {
					theElement.value = tmp + "@umich.edu";
					return true;
				}
				else {
					alert("Error: This does not appear to be a valid email address.");
					theElement.focus();
					theElement.select();
					return false;
				}
			}
		}
		else {
			if (elementID == 'from') {
				alert("Error: An email address is required.");
				return false;
			}
			else
				return true;
		}
	}
}

function setCookie(cookieName, someValue, numberOfDays)
{
	if ((!someValue) || (someValue == ""))
		deleteCookie(cookieName);						// if value of cookie is null or "", delete the cookie (make sure it doesn't exist)
	else
	{
		if (document.cookie != document.cookie)
			index = document.cookie.indexOf(cookieName);
		else
			index = -1;

		if (index == -1)
		{
			var expirationDate = new Date();

			if (!numberOfDays)		// if numberOfDays was not specified, set to 1 year (365)
				expirationDate.setTime(expirationDate.getTime() + (365 * 24 * 60 * 60 * 1000));
			else
				expirationDate.setTime(expirationDate.getTime() + (numberOfDays * 24 * 60 * 60 * 1000));

			document.cookie = cookieName + "=" + someValue + "; expires=" + expirationDate.toGMTString();;
		}
	} // if (!someValue) || (some...
}

// function that gets a cookie named [cookieName]
function getCookie(cookieName)
{
	var arg = cookieName + "=";
	var argLength = arg.length;
	var cookieLength = document.cookie.length;
	var i = 0;

	while (i < cookieLength)
	{
		var j = i + argLength;

		if (document.cookie.substring(i, j) == arg)
			return getCookieVal(j);

		i = document.cookie.indexOf(" ", i) + 1;

		if (i == 0)
			break;
	}

	return null;
}

// function used by getCookie(cookieName) to actually get the cookie data
function getCookieVal(offset)
{
	var endstr = document.cookie.indexOf (";", offset);

	if (endstr == -1)
		endstr = document.cookie.length;

	return unescape(document.cookie.substring(offset, endstr));
}

// function that deletes a cookie named [cookieName]
function deleteCookie(cookieName)
{
	var expirationDate = new Date();
	expirationDate.setTime(expirationDate.getTime() - 1);		// set the expiration date to yesterday
	var cookieValue = getCookie(cookieName);						// get the cookie data
	document.cookie = cookieName + "=" + cookieValue + "; expires=" + expirationDate.toGMTString();	// expire the new cookie
}

// function that returns true or false
function isCookie(cookieName)
{
	if (getCookie(cookieName))
		return 1;
	else
		return 0;
}

// This function is useful with the onKeyPress event handler
function getkey(e)
{
	if (window.event)
		return window.event.keyCode;
	else if (e)
		return e.which;
	else
		return null;
}

// this function should be called from an input field like this:
//			<input type="text" onKeyPress="return restrictInput(event, '0123456789');">
//
//		That example only allows integers to be typed in the input field.
function restrictInput(e, validCharacters) {
	var key, keychar;
	key = getkey(e);

	if (key == null)	return true;
	// get character
	keychar = String.fromCharCode(key);
	keychar = keychar.toLowerCase();
	validCharacters = validCharacters.toLowerCase();

	// check valid characters
	if (validCharacters.indexOf(keychar) != -1) return true;

	// control keys
	if (key == null || key == 0 || key == 8 || key == 9 || key == 13 || key == 27 ) return true;

	// else return false
	return false;
}

function preventInput(e, invalidCharacters, quotes) {
	var key, keychar;
	key = getkey(e);

	if (key == null) return true;

	// get character
	keychar = String.fromCharCode(key);
	keychar = keychar.toLowerCase();
	invalidCharacters = invalidCharacters.toLowerCase();
	
	if (quotes) {
		if (quotes == "double") invalidCharacters += '"';
		if (quotes == "single") invalidCharacters += "'";
		if (quotes == "all") {
			invalidCharacters += '"';
			invalidCharacters += "'";
		}
	}
		
	// check valid characters
	if (invalidCharacters.indexOf(keychar) != -1) return false;

	// control keys
	if (key == null || key == 0 || key == 8 || key == 9 || key == 13 || key == 27 ) return true;

	// else return false
	return true;
}

function preventQuotes(e) {
	return preventInput(e, '&', 'all');
}

function dup(e, srcElementID, targetElementID) {
	var key = getkey(e);
	var keychar = String.fromCharCode(key);
	var theTarget = document.getElementById(targetElementID);
	
	if (srcElementID == "Title") {
		var theTitle = document.getElementById("eventtitle");
		var Title = document.getElementById("Title");
		theTitle.className = (Title.value.toString().length >= 50) ? "h2" : "h1";
	}
	theTarget.innerHTML = document.getElementById(srcElementID).value.toString();
}

function dupvalue(src, targetElementID) {
	if (document.getElementById) {
		if (document.getElementById(targetElementID)) {
			document.getElementById(targetElementID).innerHTML = src.toString();
		}
	}
}

function closeWindow() {
	if (document.all)
		top.window.close();
	else	{
		if (top.window) top.window.close();
		else window.close();
	}
}
