var defaultEmptyOK = false;

//set up basic character groups
var digits = "0123456789";
var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
var whitespace = " \t\n\r";
var nameDelimiters = "-. ";
var decimalPointDelimiter = ".";
var daysInMonth = makeArrayFromString(31,29,31,30,31,30,31,31,30,31,30,31);

//set up allowed characters for specific data types

//phone numbers
var phoneNumberDelimiters = "()-. ";
var digitsInUSPhoneNumber = 10;
var validUSPhoneChars = digits + phoneNumberDelimiters;
var validWorldPhoneChars = digits + phoneNumberDelimiters + "+";

//electronic addresses
var validDomainNameChars = digits + uppercaseLetters + lowercaseLetters + "-_.";

//snail mail addresses
var addressDelimiters = ".,/-" + whitespace;
var validAddressCharacters = addressDelimiters + digits + uppercaseLetters + lowercaseLetters;

//US mail address parameters
var digitsInZIPCode1 = 5;
var digitsInZIPCode2 = 9;
var ZIPCodeDelimiters = "-";
var ZIPCodeDelimeter = "-";
var validZIPCodeChars = digits + ZIPCodeDelimiters;
var USStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP";
var USStateCodeDelimiter = "|";

//Canadian mail address parameters
var cdnProvCodes = "BC|AB|SK|MB|ON|QC|NF|PE|NS|NB|NT|YT|NU";
var postalCodeDelimiter = " ";
var validPostalCodeChars = digits + lowercaseLetters + uppercaseLetters + postalCodeDelimiter;
var charsInPostalCode = 6;
var cdnProvCodeDelimiter = "|";

// imagemap parameter
var linefeed;
if (document.all)
	linefeed = '\n';
else
	linefeed = '<br>';

// imagemap variables
var mcpherson = 'Tom McPherson' + linefeed + ' President and CEO';
var jager = 'Joe Jager' + linefeed + ' Vice President, Product Development';
var sheehan = 'Kevin Sheehan' + linefeed + ' Vice President, Marketing';
var savage = 'Peter Savage' + linefeed + ' Vice President, Business Development';
var prendergast = 'John Prendergast' + linefeed + ' Vice President, Manufacturing Operations';
var zimmer = 'Tim Zimmer' + linefeed + ' Vice President, Software Engineering';
var ventura = 'Mark L. Ventura' + linefeed + ' Vice President, Hardware Engineering';
var hinnant = 'David Hinnant' + linefeed + 'Director, Software Engineering';
var squire = 'Matt Squire' + linefeed + 'Chief Technology Officer';

if (!document.layers&&!document.all)
	event="test"

function showtip(current,e,text){
	if (document.all){
		thetitle=text.split('<br>');
		if (thetitle.length>1){
			thetitles='';
			for (i=0;i<thetitle.length;i++)
				thetitles+=thetitle[i];
				current.title=thetitles;
			}
		else
			current.title=text;
	}

	else if (document.layers){
		document.tooltip.document.write('<layer bgColor="#94216E" style="border:1px solid black;font-size:14px;color:white;">'+text+'</layer>');
		document.tooltip.document.close();
		document.tooltip.left=e.pageX+5;
		document.tooltip.top=e.pageY+5;
		document.tooltip.visibility="show";
	}
}

function hidetip(){
	if (document.layers)
		document.tooltip.visibility="hidden"
}

function cook(fForm){
	var reqFields = new Array("txtContactName","txtContactEmail","txtContactTitle","txtContactCompany");
	var reqDescriptions = new Array("Name","Email Address","Title","Company");
	var cfieldsNeeded = "\nA value must be entered in the following field(s):\n\n\t";
	var cfieldCheck = true;
	for(var fieldNum=0; fieldNum < reqFields.length; fieldNum++) {
   	// Check Text fields
		if (fForm.elements[reqFields[fieldNum]].type == "text") {
        	if ((fForm.elements[reqFields[fieldNum]].value == "") ||
         	 (fForm.elements[reqFields[fieldNum]].value == " ")) {
             cfieldsNeeded += reqDescriptions[fieldNum] + "\n\t";
             cfieldCheck = false;
        	}
       	}
	}
    // Alert with the missing fields
    if (!cfieldCheck) {
        alert(cfieldsNeeded);
        fForm.txtContactName.focus();
        fForm.txtContactName.select();
        return false;
    }
    else{
    	// Check validity if email address
    	if (fForm.txtContactEmail.value != "") {
	    	if (!isEmail(fForm.txtContactEmail.value)) {
	    		alert("Invalid Email Format\nPlease try again.");
	    		fForm.txtContactEmail.select();
	    		fForm.txtContactEmail.focus();
	    		return false;
	    	}
	    }
		for (var c=0;c<fForm.elements.length;c++){
			if (fForm.elements(c).name != "formname" && 
			 fForm.elements(c).name != "txtContactComments" &&
			 fForm.elements(c).name != "btnSubmit")
				setCookie(fForm.elements(c).name,fForm.elements(c).value,'','');
		}
		return true;
	}
}

function regCheck(fForm){
	var reqFields = new Array("First","Last","Company","City","State","Phone","Email","WebEvent");
	var reqDescriptions = new Array("First Name","Last Name","Company Name","City","State","Phone","Email","Web Event");
	var cfieldsNeeded = "\nA value must be entered in the following field(s):\n\n\t";
	var cfieldCheck = true;
	for(var fieldNum=0; fieldNum < reqFields.length; fieldNum++) {
		//alert(fForm.elements[reqFields[fieldNum]].name);
   		// Check Text fields
		if (fForm.elements[reqFields[fieldNum]].type == "text" || fForm.elements[reqFields[fieldNum]].type == "password") {
        		if ((fForm.elements[reqFields[fieldNum]].value == "") || (fForm.elements[reqFields[fieldNum]].value == " ")) {
             			cfieldsNeeded += reqDescriptions[fieldNum] + "\n\t";
             			cfieldCheck = false;
        		}
        	}
		else {
		     	if (fForm.elements[reqFields[fieldNum]].selectedIndex == 0) {
		        	cfieldsNeeded += reqDescriptions[fieldNum] + "\n\t";
		        	cfieldCheck = false;
		        }
		      }
	}
    // Alert with the missing fields
    if (!cfieldCheck) {
        alert(cfieldsNeeded);
        fForm.First.focus();
        fForm.First.select();
        return false;
    }
    // Check validity if email address
    if (fForm.Email.value != "") {
		if (!isEmail(fForm.Email.value)) {
			alert("Invalid Email Format\nPlease try again.");
			fForm.Email.select();
			fForm.Email.focus();
			return false;
		}
	}
	return true;
}

function updateProfileCheck(fForm){
	var reqFields = new Array("First","Last","strPass", "strVerify","strQuestion", "strAnswer", "Company", "Address1", "City", "State", "Zip","Phone", "Email", "LIMSno", "Timing_M", "Timing_Y");
	var reqDescriptions = new Array("First Name","Last Name","Password","Verify Password","Question to remember password", "Answer to Question", "Company Name", "Address", "City", "State", "Zip/Postal Code", "Phone", "Email", "Estimated number of LIMS users", "Timing Purchase (Month)", "Timing Purchase (Year)");
	var cfieldsNeeded = "\nA value must be entered in the following field(s):\n\n\t";
	var cfieldCheck = true;
	for(var fieldNum=0; fieldNum < reqFields.length; fieldNum++) {
	//alert(fForm.elements[reqFields[fieldNum]].name);
   	// Check Text fields
		if (fForm.elements[reqFields[fieldNum]].type == "text" || fForm.elements[reqFields[fieldNum]].type == "password") {
        		if ((fForm.elements[reqFields[fieldNum]].value == "") || (fForm.elements[reqFields[fieldNum]].value == " ")) {
             			cfieldsNeeded += reqDescriptions[fieldNum] + "\n\t";
             			cfieldCheck = false;
        		}
        	}
		else {
		     	if (fForm.elements[reqFields[fieldNum]].selectedIndex == 0) {
		        	cfieldsNeeded += reqDescriptions[fieldNum] + "\n\t";
		        	cfieldCheck = false;
		        }
		      }
	}
	var contactCheck;
        for (var cc=0; cc < fForm.elements["Contact"].length; cc++){
    		if (fForm.elements.Contact[cc].checked == true) {
    			contactCheck = true;
    			break;
    		}
    		else {

    			contactCheck = false;
    		}
    	}
    	if (contactCheck == false) {
    		cfieldsNeeded += "Would you like an Account Manager Contact You?" + "\n\t";
		cfieldCheck = false;
    	}    
    // Alert with the missing fields
    if (!cfieldCheck) {
        alert(cfieldsNeeded);
        fForm.First.focus();
        fForm.First.select();
        return false;
    }
    else{
    //"Do you have a written requirements document?"
    //"Have an Account Manager Contact You?",
    	// Check validity if email address
    	if (fForm.Email.value != "") {
	    	if (!isEmail(fForm.Email.value)) {
	    		alert("Invalid Email Format\nPlease try again.");
	    		fForm.Email.select();
	    		fForm.Email.focus();
	    		return false;
	    	}
	    }
	//check passwords
	if(fForm.strPass.value != fForm.strVerify.value){
		alert("Password and Password Verification must match\nPlease try again.");
		fForm.strPass.select();
		fForm.strPass.focus();
		return false;
	}
	if(fForm.strPass.value.length < 4){
		alert("Password must be at least 4 or more characters long");
		fForm.strPass.select();
		fForm.strPass.focus();
		return false;
	}


		return true;
	}
}

function validateQuestion(thisForm){
	var cfieldsNeeded = "\nA value must be entered in the following field(s):\n\n\t";
	var myerror  = 0;
	if(thisForm.strQuestion.selectedIndex == 0){
		cfieldsNeeded += "Select a question\n\t";
		myerror = 1;
	}
	if(thisForm.strAnswer.value == "" || thisForm.strAnswer.value == ""){
		cfieldsNeeded += "Answer to question\n\t";
		myerror = 1;
	}
	if(myerror==1){
		alert(cfieldsNeeded);
		return false;
	}
	else{
		return true;
	}
}

function validateRegistryOne(thisForm){
	var reqFields = new Array("strFirst","strLast","strEmail","strPass", "strVerify", "strQuestion", "strAnswer");
	var reqDescriptions = new Array("First Name","Last Name","Email Address", "Password","Password Verification", "Question for password", "Answer");
	var cfieldsNeeded = "\nA value must be entered in the following field(s):\n\n\t";
	var cfieldCheck = true;
	for(var fieldNum=0; fieldNum < reqFields.length; fieldNum++) {
	   	// Check Text fields
		if (thisForm.elements[reqFields[fieldNum]].type == "text") {
        		if ((thisForm.elements[reqFields[fieldNum]].value == "") ||
        	 	 (thisForm.elements[reqFields[fieldNum]].value == " ")) {
        		     cfieldsNeeded += reqDescriptions[fieldNum] + "\n\t";
        		     cfieldCheck = false;
        		}
       		}
       		else {
		       if (thisForm.elements[reqFields[fieldNum]].selectedIndex == 0) {
		       	cfieldsNeeded += reqDescriptions[fieldNum] + "\n\t";
		        cfieldCheck = false;
		        }
		      }
		 

	}
	
    // Alert with the missing fields
    if (!cfieldCheck) {
        alert(cfieldsNeeded);
        thisForm.strFirst.focus();
        thisForm.strFirst.select();
        return false;
    }
    else{
    	// Check validity if email address
    	if (thisForm.strEmail.value != "") {
	    	if (!isEmail(thisForm.strEmail.value)) {
	    		alert("Invalid Email Format\nPlease try again.");
	    		thisForm.strEmail.select();
	    		thisForm.strEmail.focus();
	    		return false;
	    	}
	    }
	//check passwords
	if(thisForm.strPass.value != thisForm.strVerify.value){
		alert("Password and Password Verification must match\nPlease try again.");
		thisForm.strPass.select();
		thisForm.strPass.focus();
		return false;
	}
	if(thisForm.strPass.value.length < 4){
		alert("Password must be at least 4 or more characters long");
		thisForm.strPass.select();
		thisForm.strPass.focus();
		return false;
	}
	//else just return true;
		return true;
	}
}

function validateTellaFriend(thisForm, requiredFields, requiredDescriptions) {
    var fieldCheck   = true;
    var fieldsNeeded = "\nA value must be entered in the following field(s):\n\n\t";
    var humanCheck = true;
    var employeeCheck = true;
    var contactCheck = true;
    var submitCheck = true;

   // Check fields for content
   for(var fieldNum=0; fieldNum < requiredFields.length; fieldNum++) {

   	// Check Text fields
	if (thisForm.elements[requiredFields[fieldNum]].type == "text") {
	       	if ((thisForm.elements[requiredFields[fieldNum]].value == "") ||
         	    (thisForm.elements[requiredFields[fieldNum]].value == " ")) {
             		fieldsNeeded += requiredDescriptions[fieldNum] + "\n\t";
             		fieldCheck = false;
        	}
       	}
       	// Check Select fields
       	else {
       		if (thisForm.elements[requiredFields[fieldNum]].selectedIndex == 0) {
	            	fieldsNeeded += requiredDescriptions[fieldNum] + "\n\t";
        	     	fieldCheck = false;
        	}
      	}
    }

    // All required fields have been entered
    if (fieldCheck == true) {
    	// Check validity if email address
   	if (thisForm.elements.Associates_Email.value != "") {
	    	if (!isEmail(thisForm.elements.Associates_Email.value)) {
	    		alert("Invalid Email Format\nPlease try again.");
	    		thisForm.elements.Associates_Email.select();
	    		thisForm.elements.Associates_Email.focus();
	    		return false;
	    	}
	    }
	if (thisForm.elements.Your_Email.value != "") {
	    	if (!isEmail(thisForm.elements.Your_Email.value)) {
	    		alert("Invalid Email Format\nPlease try again.");
	    		thisForm.elements.Your_Email.select();
	    		thisForm.elements.Your_Email.focus();
	    		return false;
	    	}
	    }

	// Check Is_Human field
	if (thisForm.Is_Human) {
		if (thisForm.Is_Human[0].checked == true) {
			//thisForm.action = "cw.asp?template=tell_an_associate&level1=tell_an_associate_failed";
			thisForm.action = "cw.asp?template=lims_resource&level1=tell_an_associate_failed";
      		}
   	}

	//return true;
    }
    // Alert with the missing fields
    else {
        alert(fieldsNeeded);
        return false;
    }
}

/****************************************************/
/* Description : This function proctors the form	*/
/*  validation process.	Inputs are:					*/
/*	 thisForm : the form to be validated			*/
/*	 requiredFields : array of required field names	*/
/*	 fieldNames : array of descriptions				*/
/*													*/
/****************************************************/
function validateRequiredFields(thisForm, requiredFields, requiredDescriptions) {
	var fieldCheck   = true;
   	var fieldsNeeded = "\nA value must be entered in the following field(s):\n\n\t";
    var employeeCheck = true;
    var contactCheck = true;
    var submitCheck = true;
	// Check fields for content
   for(var fieldNum=0; fieldNum < requiredFields.length; fieldNum++) {
   	// Check Text fields
		if (thisForm.elements[requiredFields[fieldNum]].type == "text") {
        	if ((thisForm.elements[requiredFields[fieldNum]].value == "") ||
         	 (thisForm.elements[requiredFields[fieldNum]].value == " ")) {
             fieldsNeeded += requiredDescriptions[fieldNum] + "\n\t";
             fieldCheck = false;
        	}
       	}
       	// Check Select fields
       	else {
       		if (thisForm.elements[requiredFields[fieldNum]].selectedIndex == 0) {
            	fieldsNeeded += requiredDescriptions[fieldNum] + "\n\t";
             	fieldCheck = false;
        	}
      	}
    }
    // Check methods of contact buttons
    for (var cc=0; cc < thisForm.elements["contact"].length; cc++){
    	if (thisForm.elements.contact[cc].checked == true) {
    		contactCheck = true;
    		break;
    	}
    	else {
    		contactCheck = false;
    	}
    }
    if (contactCheck == false) {
    	fieldsNeeded += "Contact Method" + "\n\t";
		fieldCheck = false;
    }
    // Check current employee contact
    for (var ce=0; ce < thisForm.elements["contactcurrent"].length; ce++){
    	if (thisForm.elements.contactcurrent[ce].checked == true) {
    		employeeCheck = true;
    		break;
    	}
    	else {
    		employeeCheck = false;
    	}
    }
    if (employeeCheck == false) {
    	fieldsNeeded += "Current Employer Contact" + "\n\t";
		fieldCheck = false;
    }
     // Check for submission type
	    for (var st=0; st < thisForm.elements["submittype"].length; st++){
	    	if (thisForm.elements.submittype[st].checked == true) {
	    		submitCheck = true;
	    		break;
	    	}
	    	else {
	    		submitCheck = false;
	    	}
	    }
	    if (submitCheck == false) {
	    	fieldsNeeded += "Submission Type" + "\n\t";
			fieldCheck = false;
	    }
    // All required fields have been entered
    if (fieldCheck == true) {
    	// Check validity if email address
    	if (thisForm.elements.homeemail.value != "") {
	    	if (!isEmail(thisForm.elements.homeemail.value)) {
	    		alert("Invalid Email Format\nPlease try again.");
	    		thisForm.elements.homeemail.select();
	    		thisForm.elements.homeemail.focus();
	    		return false;
	    	}
	    }
	    if (thisForm.elements.workemail.value != "") {
	    	if (!isEmail(thisForm.elements.workemail.value)) {
	    		alert("Invalid Email Format\nPlease try again.");
	    		thisForm.elements.workemail.select();
	    		thisForm.elements.workemail.focus();
	    		return false;
	    	}
    	}
		if ((thisForm.elements.homephone.value != "") && (thisForm.elements.homephone.value != " ")) {
			if (!checkUSPhone(thisForm.elements.homephone,true)) {
				alert("Please enter a valid phone number.");
				thisForm.elements.homephone.select();
				thisForm.elements.homephone.focus();
				return false;
			}
		}
		if (thisForm.elements.workphone.value != "") {
			if ((thisForm.elements.workphone.value != "") && (thisForm.elements.workphone.value != " ")) {
				if (!checkUSPhone(thisForm.elements.workphone,true)) {
					alert("Please enter a valid phone number.");
					thisForm.elements.workphone.select();
					thisForm.elements.workphone.focus();
					return false;
				}
			}
		}
	    return true;
    }
    // Alert with the missing fields
    else {
        alert(fieldsNeeded);
        return false;
    }
}

/****************************************************/
/* Description : This function will validate that 	*/
/*  the text passed in is a valid email address.	*/
/*													*/
/****************************************************/
function isEmail (s){
	if (isEmpty(s)) {
   	if (isEmail.arguments.length == 1) {
      	return defaultEmptyOK;
      }
      else {
      	return (isEmail.arguments[1] == true); 
      }
	}
	if (isWhitespace(s)) {
		return false;
	}
	
	var i = 1;
	var sLength = s.length;
	while ((i < sLength) && (s.charAt(i) != "@")) { 
		i++;
	}
	
	if ((i >= sLength) || (s.charAt(i) != "@")) {
		return false;
	}
	else {
		atloc = i;
	}
	
	j = i+1;
	i += 1;
	while ((j < sLength) && (validDomainNameChars.indexOf(s.charAt(j)) != -1)) { 
		j++; 
	}
	if (j < sLength) {
		return false;
	}
	while ((i < sLength) && (s.charAt(i) != ".")) { 
		i++; 
	}
	if (i == sLength) {
		return false;
	}
	
	if (i == (atloc +1)) {
		return false;
	}
	
	k = atloc+1;
	while (k < sLength){
		if ((s.charAt(k) == ".") && (s.charAt(k+1) == ".")) {
			return false;
		}
		k++;
	}
	l = sLength;
	while ((i < sLength -2) && (l != i) && (s.charAt(l) != ".")) { 
		l = l-1 
	}
	if ((i >= sLength - 2) || (s.charAt(i) != ".") || (l >= sLength - 2)) {
		return false;
	}
	else {
		return true;
	}
}

/****************************************************/
/* Description : This function will validate that 	*/
/*  the text passed in is a valid zipcode.			*/
/*													*/
/****************************************************/
function checkZIPCode (theField, emptyOK){
	if (checkZIPCode.arguments.length == 1) {
   	emptyOK = defaultEmptyOK;
   }
   if ((emptyOK == true) && (isEmpty(theField.value))) {
   	return true;
   }
   else {
   	var normalizedZIP = stripCharsInBag(theField.value, ZIPCodeDelimiters);
      if (!isZIPCode(normalizedZIP, false)) {
         return false;
      }
      else {
         theField.value = reformatZIPCode(normalizedZIP);
         return true;
      }
   }
}

function reformatZIPCode (ZIPString){
	if (ZIPString.length == 5) {
   	return ZIPString;
   }
   else {
   	return (reformat (ZIPString, "", 5, "-", 4));
   }
}

function isZIPCode (s){
	if (isEmpty(s)) {
   	if (isZIPCode.arguments.length == 1) {
   		return defaultEmptyOK;
   	}
      else {
      	return (isZIPCode.arguments[1] == true);
      }
	}
   return (isInteger(s) && ((s.length == digitsInZIPCode1) || (s.length == digitsInZIPCode2)));
}

/****************************************************/
/* Description : This function will validate that 	*/
/*  the text passed in is a valid phone number.		*/
/*													*/
/****************************************************/
function checkUSPhone(theField, emptyOK) {   
	if (checkUSPhone.arguments.length == 1) {
		emptyOK = defaultEmptyOK;
	}
	if ((emptyOK == true) && (isEmpty(theField.value))) {
		return true;
	}
	else {  
		var normalizedPhone = stripCharsInBag(theField.value, phoneNumberDelimiters);
	   if (!isUSPhoneNumber(normalizedPhone, false)) {
	      return false;
	   }
	   else {
	   	theField.value = reformatUSPhone(normalizedPhone);
	      return true;
	   }
	}
}

function isUSPhoneNumber (s){
	if (isEmpty(s)) {
   	if (isUSPhoneNumber.arguments.length == 1) {
      	return defaultEmptyOK;
      }
      else {
      	return (isUSPhoneNumber.arguments[1] == true);
      }
   }
   return (isInteger(s) && s.length == digitsInUSPhoneNumber)
}

function reformatUSPhone (USPhone) {   
	return (reformat (USPhone, "(", 3, ") ", 3, "-", 4));
}

/****************************************************/
/* Description : This function sets a cookie value 	*/
/* 													*/
/*													*/
/****************************************************/
function setCookie(cookieName, cookieValue, cookiePath, cookieExpires) {
	// Replace spaces with %
	cookieValue = escape(cookieValue);
	// If there is no expiration date, add one six months from now
	if (cookieExpires == "") {
		var nowDate = new Date();
		nowDate.setMonth(nowDate.getMonth() + 6);
		cookieExpires = nowDate.toGMTString();
	}
	// If no path, add one
	if (cookiePath != "") {
		cookiePath = ";Path=" + cookiePath;
	}
	// Write the cookie
	document.cookie = cookieName + "=" + cookieValue + ";expires=" + 
		cookieExpires + cookiePath;
}

/****************************************************/
/* Description : This function gets a cookies value	*/
/*  												*/
/*													*/
/****************************************************/
function getCookie(cookieName) {
	// Get the cookie and the starting point
	var cookieValue = document.cookie;
	var cookieStartsAt = cookieValue.indexOf(" " + cookieName + "=");
	// look for the cookie in the string
	if (cookieStartsAt == -1) {
		cookieStartsAt = cookieValue.indexOf(cookieName + "=");
	}
	// If not found set value to null
	if (cookieStartsAt == -1) {
		cookieValue = "";
	}
	// Otherwise return the cookie value
	else {
		cookieStartsAt = cookieValue.indexOf("=", cookieStartsAt) + 1;
		var cookieEndsAt = cookieValue.indexOf(";", cookieStartsAt);
		if (cookieEndsAt == -1) {
			cookieEndsAt = cookieValue.length;
		}
		cookieValue = unescape(cookieValue.substring(cookieStartsAt, cookieEndsAt));
	}
	return cookieValue;
}

function makeArray(n) {
   for (var i = 1; i <= n; i++) {
      this[i] = 0;
   } 
   this[length] = n;
   return this;
}

function makeArrayFromString() {
   for (var i = 1; i <= makeArrayFromString.arguments.length; i++){
      this[i] = makeArrayFromString.arguments[i];
   }
   this[length] = makeArrayFromString.arguments.length;
   return this;
}

function isEmpty(s) {
    return ((s == null) || (s.length == 0));
}

function isWhitespace(s) {
    var i;

    if (isEmpty(s)) return true;
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (whitespace.indexOf(c) == -1) return false; // not whitespace
    }
    return true;
}
function stripCharsInBag (s, bag){
    var i;
    var returnString = "";
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function stripCharsNotInBag (s, bag){
    var i;
    var returnString = "";
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (bag.indexOf(c) != -1) returnString += c;
    }
    return returnString;
}

function isLetter (c){
   return ( ((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")) )
}

function isDigit (c){
   return ((c >= "0") && (c <= "9"))
}

function isLetterOrDigit (c){
   return (isLetter(c) || isDigit(c))
}

function isInteger (s){
    var i;
    if (isEmpty(s)) 
       if (isInteger.arguments.length == 1) return defaultEmptyOK;
       else return (isInteger.arguments[1] == true);
    for (i = 0; i < s.length; i++)
    {   
        var c = s.charAt(i);
        if (!isDigit(c)) return false;
    }
    return true;
}

function reformat (s){
    var arg;
    var sPos = 0;
    var resultString = "";
    for (var i = 1; i < reformat.arguments.length; i++) {
       arg = reformat.arguments[i];
       if (i % 2 == 1) resultString += arg;
       else {
           resultString += s.substring(sPos, sPos + arg);
           sPos += arg;
       }
    }
    return resultString;
}