// new_validate.js

//	TESTED DOCUMENTED
function ShowEmail(address,userdomain,tld)
{
	var atsign = '@';
	var dot = '.';
	document.write('<a href=mailto:' + address + atsign + userdomain + dot + tld + '>');
	document.write(address + atsign + userdomain + dot + tld + '</a>');
}

//	TESTED DOCUMENTED
function ShowEmailText(address,userdomain,tld,extratext)
{
	var atsign = '@';
	var dot = '.';
	document.write('<a href=mailto:' + address + atsign + userdomain + dot + tld + '>');
	document.write(extratext + '</a>');
}

//	TESTED DOCUMENTED
function ShowCopyright()
{
	var thedate = new Date();
	document.write('&copy; ' + thedate.getFullYear());
}

// DOCUMENTED
function LowerMe(field)
{
	field.value = field.value.toLowerCase();
}

// DOCUMENTED
function UpperMe(field)
{
	field.value = field.value.toUpperCase();
}

// DOCUMENTED
function FindSpecialCharacters()
{
	var myBigBlob = '';
	var mySpecChar = false;
	// concatenate all text fields
	for (i=0; i<document.forms[0].elements.length; i++)
	{
		// need to include HIDDEN variables, too
		if (document.forms[0].elements[i].type == 'text' || document.forms[0].elements[i].type == 'hidden') myBigBlob += document.forms[0].elements[i].value;
	}
	// look for any occurrence of a special character
	// return when you find *1* or at end of string
	for (i=0; i<myBigBlob.length; i++)
	{
		testChar = 0 + myBigBlob.charCodeAt(i);
		if (testChar-0 > 127) mySpecChar = true;
		if (mySpecChar == true) break;
	}
	return(mySpecChar);
}

// DOCUMENTED
function CheckLanguage()
{
	if (navigator.appName == 'Netscape')
	{
		var myLanguage = navigator.language;
	}
	else
	{
		var myLanguage = navigator.browserLanguage;
	}
	document.forms[0].browser_language.value=myLanguage;
	if (myLanguage.indexOf('en') > -1) document.forms[0].language_name.value = 'English';
		else if (myLanguage.indexOf('nl') > -1) document.forms[0].language_name.value = 'Dutch';
		else if (myLanguage.indexOf('fr') > -1) document.forms[0].language_name.value = 'French';
		else if (myLanguage.indexOf('de') > -1) document.forms[0].language_name.value = 'German';
		else if (myLanguage.indexOf('ja') > -1) document.forms[0].language_name.value = 'Japanese';
		else if (myLanguage.indexOf('it') > -1) document.forms[0].language_name.value = 'Italian';
		else if (myLanguage.indexOf('pt') > -1) document.forms[0].language_name.value = 'Portuguese';
		else if (myLanguage.indexOf('es') > -1) document.forms[0].language_name.value = 'Spanish';
		else if (myLanguage.indexOf('sv') > -1) document.forms[0].language_name.value = 'Swedish';
		else if (myLanguage.indexOf('zh') > -1) document.forms[0].language_name.value = 'Chinese';
	else document.forms[0].language_name.value = 'Not known';
}

//	TESTED DOCUMENTED
function ValidateEmail(eTest)
{
	var badEmailCharacters = ',/\\{}[]|()*&$~"?:;<>#\x22\x27\x60';
	// \\ is required to escape the \ character
	// last 3 entries add " and ' and ` to bad characters (HEX codes)
	// are codes above 127 (7F) allowed in e-mail addresses?
	var addressOK = true;
	// if there is no entry, return TRUE
	if (eTest.length == 0) return(true);
	// we have an entry; let's test it
	for (var i=0; i<badEmailCharacters.length; i++)
	{
		if (eTest.indexOf(badEmailCharacters.charAt(i)) > -1) return(false);
		// return false as soon as you find even 1 bad character
	}
	// break address into 2 parts -- before and after @
	// if more than 2 pieces, return error
	var myAddress = eTest.split('@');
	if (myAddress.length != 2) return(false);
	if (!addressOK) return;
	// now we have 2 pieces: myAddress[0] will be the name
	//                       myAddress[1] will be the domain and tld
	// anything in myAddress[0] is assumed to be ok, even a single character
	// break myAddress[1] into parts
	var myDomain = myAddress[1].split('.');
	// make sure we have at least 2 pieces (domain and tld)
	if (myDomain.length < 2) return(false);
	// tld (the final part) must be at least 2 characters
	if (myDomain[myDomain.length-1].length < 2) return (false);
	// domain (the penultimate part) must be at least 2 characters
	if (myDomain[myDomain.length-2].length < 2) return (false);
	// if there are other pieces in front of the domain, they
	// do not concern us
	return(addressOK);
}


function CheckURL(URLtoCheck,WantHTTP)
{
	// minimum length is 5 (without http), 12 with
	urlOK = true;
	minURL = 5;
	urlLength = 0;
	// allow blank to pass
	urlLength = URLtoCheck.length;
	if (urlLength == 0) return (true);
	// Locate the first dot and the last dot (they may be the same)
	FirstDot = 0;
	LastDot = 0;
	for (var i=0; i<URLtoCheck.length; i++)
	{
  		if (URLtoCheck.charAt(i) == '.' && FirstDot == 0)FirstDot = i;
		if (URLtoCheck.charAt(i) == '.') LastDot = i;
		// Two sequential dots are not permitted
		if (LastDot-FirstDot<2 && LastDot-FirstDot>0)
		{
			urlOK = false;
			break;
		}
	}
	// String must begin with http://
	if (!WantHTTP)
	{
		if (URLtoCheck.indexOf('http://') != 0) urlOK = false;
		minURL = 12;
	}
	else
	{
		if (URLtoCheck.indexOf('http://') == 0) urlOK = false;
	}
	// URL must be at least 12 characters: http://a.com
	if (urlLength < minURL) urlOK = false;
	// URL must contain at least one dot
	if (FirstDot == 0) urlOK = false;
	// URL must contain at least 2 characters after the final dot
	if (urlLength - LastDot < 3) urlOK = false;
	// URL cannot contain any characters but a-z, 0-9, and hyphen.
	var theseOK = '0123456789-:/.ABCDEFGHIJKLMNOPQRSTUVWXYZ';
	for (var i=0; i<urlLength; i++)
	{
		temp = '' + URLtoCheck.substring(i, i+1).toUpperCase();
		if (theseOK.indexOf(temp) == '-1')
		{
			urlOK = false;
			break;
		}
	}
	if (!urlOK)
	{
		return (false);
	}
	else
	{
		return (true);
	}
}

//	TESTED DOCUMENTED
function ValidateFormattedNumber(myTemplate,myNumber)
{
	numbersOK = "0123456789";
	// blank entry is ok; if required, check elsewhere
	if (myNumber.length == 0) return (true);
	if (myTemplate.length != myNumber.length) return (false);
	// if still here, loop through entry and compare each character to template
	var temLength = myTemplate.length;
	var nbrLength = myNumber.length;
	for (var i=0; i<temLength; i++)
	{
		tempNbr = "" + myNumber.substring(i, i+1);
		tempTemplate = "" + myTemplate.substring(i, i+1);
		// Does the template have a non-number here?
		if (tempTemplate != "9")
		{
			// It's a formatting character
			if (tempNbr != tempTemplate) return (false);
		}
		else
		{
			// It should be a number, then
			if (numbersOK.indexOf(tempNbr) == "-1") return (false);
		}
	}
return (true);
}

//	TESTED DOCUMENTED
function ValidateAlphaNumericEntry(myTemplate,theEntry)
{
	var myMsg = ''
	var entryOK = false;
	var myNumbers = '0123456789';
	var myLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
	var myAlphaNumeric = myNumbers + myLetters;
	// Allow blank entry to go through; if required, check elsewhere
	// Initially, we assume the entry is false and let it prove itself.
	if (theEntry.length == 0)
	{
		entryOK = true;
	}
	else
	{
		if (theEntry.length > 0)
		{
			// check individual characters here
			// loop through number and compare each character to template
			var templateLength = myTemplate.length;
			var entryLength = theEntry.length;
			// return false if entries don't match in length
			if (templateLength != entryLength) return (false);
			for (var i=0; i<templateLength; i++)
			{
				var entryTestChar = '' + theEntry.substring(i, i+1);
				var templateTestChar = '' + myTemplate.substring(i, i+1);
				// does the template have a non-number here?
				if (templateTestChar != '9' && templateTestChar != 'A' && templateTestChar != 'Z')
				{
					// it's a literal character
					// reset the test value
					entryOK = false;
					if (entryTestChar == templateTestChar) entryOK = true;
					if (!entryOK) return (false);
				}
				else
				{
					// the length is OK and we've checked for the presence of a literal.
					// now make entryOK true and let the procedure fail on false
					entryOK = true;
					// maybe it should be a number
					if (templateTestChar == '9')
					{
						if (myNumbers.indexOf(entryTestChar) == -1) entryOK = false;
						if (!entryOK) return (false);
					} // end number test
					// maybe it should be a letter
					if (templateTestChar == 'A')
					{
						if (myLetters.indexOf(entryTestChar) == -1) entryOK = false;
						if (!entryOK) return (false);
					} // end letter test
					// well then maybe it should be a number OR a letter
					if (templateTestChar == 'Z')
					{
						if (myAlphaNumeric.indexOf(entryTestChar) == -1) entryOK = false;
						if (!entryOK) return (false);
					} // end test number or letter
				} // end test for literal
			} // end length test
		} // end zero length test
		return (entryOK);
	}
}

//	TESTED DOCUMENTED
function TrimSpaces(myInput)
{
	while(''+myInput.charAt(0)==' ')myInput=myInput.substring(1,myInput.length);
	while(''+myInput.charAt(myInput.length-1)==' ')myInput=myInput.substring(0,myInput.length-1);
	return(myInput);
}


function IsAllCaps(myText)
{
	var returnCaps = true;
	if (myText != myText.toUpperCase()) returnCaps = false;
	return (returnCaps);
}

// TESTED
function CheckCaps(FieldToCheck) {
	var totalLength = FieldToCheck.value.length; // full length of field
	// how many letters are present? omit numbers and spaces
	var totalLetters = 0;
	var totalCaps = 0;
	var totalLower = 0;
	var tooManyCaps = false;
	for (var i=0; i < totalLength; i++) {
		// lc letters are 97~122, caps are 65~90; count only these
		if (FieldToCheck.value.charCodeAt(i)>64 && FieldToCheck.value.charCodeAt(i)<91) totalCaps++;
		if (FieldToCheck.value.charCodeAt(i)>96 && FieldToCheck.value.charCodeAt(i)<123) totalLower++;
	}
	totalLetters = totalCaps + totalLower;
	// 6 characters or less total -- assume it's an acronym
	if (totalLength <= 6) return;
	if (totalLetters / totalCaps < 1.1) tooManyCaps = true;
	if (tooManyCaps) {
		alert("Please do not use ALL CAPS!\nEnter text in standard Upper and Lower format only.");
		FieldToCheck.focus();
		FieldToCheck.select();
		return;
	}
}

function ShowBig(winWid, winHi, winScroll, winContents)
{
	var winSettings =
	   'width=' + winWid +
		',height=' + winHi +
	   ',toolbar=0,location=0,' +
	   'resizable=1,directories=0,' +
	   'menubar=0,status=0,' +
		'scrollbars=' + winScroll;
	showIt = window.open(winContents, 'showIt', winSettings);
}

function ValidateInteger(TestMe) {
	var theseOK = "0123456789"
	for (var i=0; i<TestMe.length; i++)
	{
		temp = "" + TestMe.substring(i, i+1);
		if (theseOK.indexOf(temp) == "-1") return (false);
	}
	return (true);
}


// display a dialog box that contains the contents of most of the variables in a form.
function DebugInputs()
{
	var myList = 'Variables in this form';
	var howMany = document.forms[0].elements.length;
	for (i=0; i<howMany; i++)
	{
		myList += '\n'+ document.forms[0].elements[i].type;
		// TEXT FIELDS
		if (document.forms[0].elements[i].type=='hidden')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ': ' +document.forms[0].elements[i].value;
		}
		if (document.forms[0].elements[i].type=='text')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ': ' +document.forms[0].elements[i].value;
		}
		// SELECTION LISTS
		if (document.forms[0].elements[i].type=='select-one')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ': ' +document.forms[0].elements[i].options[document.forms[0].elements[i].selectedIndex].value;
		}
		// CHECK BOXES
		if (document.forms[0].elements[i].type=='checkbox')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ': ' +document.forms[0].elements[i].checked;
		}
		// RADIO BUTTONS
		if (document.forms[0].elements[i].type=='radio')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ': ' +document.forms[0].elements[i].value;
			myList += '-'  +document.forms[0].elements[i].checked;
		}
	}
	alert (myList);
}

//	Placeholder function
function DoNothing()
{
	return;
}

// same as DebugInputs(), but opens a new window
function DebugInputsToNewWindow()
{
	SummaryWindow=window.open('','popthiswindow','resizable=1,menubar=0,toolbar=0,directories=0,location=0,status=0,scrollbars=1');
	var myList = '<h1>This form would have been submitted with the following information</h1><p>';
	var howMany = document.forms[0].elements.length;
	for (i=0; i<howMany; i++) {
	myList += '\n<br>('+ document.forms[0].elements[i].type + ')';
		// TEXT FIELDS
		if (document.forms[0].elements[i].type=='hidden')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ' value: "'+document.forms[0].elements[i].value + '"';
		}
		if (document.forms[0].elements[i].type=='text')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ' value: "'+document.forms[0].elements[i].value + '"';
		}
		// SELECTION LISTS
		if (document.forms[0].elements[i].type=='select-one')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ' value: "'+document.forms[0].elements[i].options[document.forms[0].elements[i].selectedIndex].value + '"';
		}
		// CHECK BOXES
		if (document.forms[0].elements[i].type=='checkbox')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ' value: "'+document.forms[0].elements[i].checked + '"';
		}
		// RADIO BUTTONS
		if (document.forms[0].elements[i].type=='radio')
		{
			myList += ' - '+document.forms[0].elements[i].name;
			myList += ' value: "'+document.forms[0].elements[i].value + '"';
			myList += '-'+document.forms[0].elements[i].checked;
		}
	}
	myList += '</p>';
	SummaryWindow.document.write(myList);
}
