var unsavedChangesForm = null;
var divHeightID = '';

function setDivHeight(){
    if (divHeightID != '') {
        var dTable = document.getElementById(divHeightID);
        var browseHeight=document.body.clientHeight - 190;
        dTable.style.height=browseHeight;
    }
}

function checkEmail(strEmail) {
    if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(strEmail)) {
        return (true)
    }
    return (false)
}

function isEmpty(str) {
	return (str == null) || /^\s*$/.test(str);
}

function dumpFormValues(f) {
	var msg = "<pre>\n";
	msg += "Form values for form " + f.name + "\n\n";
	for (var i = 0; i < f.elements.length; i++) {
		var e = f.elements[i];
		msg += e.name + " = " + e.value + "\n";
	}
	msg += "</pre>";
	var w = window.open(null, 'dump', '');
	w.document.write(msg);
}

// debugging tool
function dumpProps(obj) {
	var msg = "<pre>\n";
	msg += "Base object = [" + (typeof obj) + "] " + obj + "\n\n";
	for (var i in obj) {
		msg += i + " = [" + (typeof obj[i]) + "] " + obj[i] + "\n";
	}
	msg += "</pre>";
	var w = window.open(null, 'dump', '');
	w.document.write(msg);
}

// submitAnyForm
// expected usage:
// submitAnyForm("formElementId_0","formElementValue_0","formElementId_1","formElementValue_1",
//          ..."formElementId_N-1","formElementValue_N-1","formElementId_N","formElementValue_N",
//          ..."formID")
// where all ids are unique on the page
// the form with formID will be submitted
// call with only formID if the default values should be accepted

function submitAnyForm() {
    var args = submitAnyForm.arguments;
    var length = args.length;

    if (length < 1) return false;

    // find the form
    var target_form = getField( args[(length-1)]);

    // sanity check the passed form name/object
    if ((typeof target_form != "object") || (target_form.elements == null)) {
        alert("could not find the specified form");
        return false;
    }

	// check for unsaved changes
	if (unsavedChangesForm != null) {

	    // sanity check the passed form name/object
	    if ((typeof unsavedChangesForm != "object") || (unsavedChangesForm.elements == null)) {
	        alert("checkForUnsavedChanges: could not find the specified form");
	        return false;
	    }

		if ((target_form != unsavedChangesForm) && checkForUnsavedChanges()) {
			if (!confirm("You have unsaved changes. Do you want to continue?")) {
				return false;
			}
		}
	}

    // set all of the fields passed in (varargs)
    for (var i = 0; i < length-1; ) {
        var param = target_form.elements[args[i++]];
        if ((typeof param != "object") || (param == null)) {
        	alert("Can't find target field " + args[i++ - 1]);
        	return false;
        } else {
            param.value = args[i++];
        }
    }

    target_form.submit();
    return false;
}

function formatTel(t) {
    var v = formatTelNumber(t.value);

    t.value = v

// commented out so that user can navigate off the field if incorrect
//    if(!checkTel(v)) {
//        t.focus();
//    }

    return;
}

// note - add this event handler with:
//     onkeypress="return limitToNumeric(event)"
// and that the return and the event variable matters
// This function has been tested on IE6, Mozilla 1.7, Firefox 0.9, and Opera 7
function limitToNumeric(evt) {

	evt = (evt) ? evt : window.event;
	if (evt == null) {
		// if we can't even figure out what happened, allow the char
		return true;
	}

	var key;

	// on netscape, evt.which is the ascii key, or 0 for special keys
	// and keyCode is only for special characters
	if (typeof evt.which == "number") {

		// window.status = "kc=" + evt.keyCode + " &w=" + evt.which;
		// allow netscape backspace, tab, leftarrow, rightarrow, and delete
		if ((evt.keyCode == 8) || (evt.keyCode == 9) || (evt.keyCode == 37) || (evt.keyCode == 39) || (evt.keyCode == 46)) {
			return true;
		}

		key = String.fromCharCode(evt.which);
	} else {
		// window.status = "kc=" + evt.keyCode;
		key = String.fromCharCode(evt.keyCode);
	}

	return /\d/.test(key);
}

function formatTelNumber(t) {

    t = t.replace(/[^0-9]/g,"");

    if (t.length < 10) {
    	return t;
    }

    return "(" + t.substr(0,3) + ")" + t.substr(3,3) + "-" + t.substr(6, 4);
}

function checkTel(t) {
	var isValidPhone = t.match(/^\([1-9][0-9]{2}\)[0-9]{3}-[0-9]{4}$/);
    return isValidPhone;
}

function formatZip(t) {
    t = t.replace(/[^0-9]/g,"");
    return t;
}

function getField(f, e) {

	if ((typeof e == "object") && (e != null)) {
		return e;
	}

	var g = null;
	if (typeof f == "string") {
		if (typeof document.getElementById == "function") {
			g = document.getElementById(f);
		}

		if ((g == null) && (document[f] != null)) {
			g = document[f];
		}

		if ((g == null) && (document.all[f] != null)) {
			g = document.all[f];
		}

		if (g == null) {
			alert("Can't find form named " + f );
			return null;
		}
	} else {
		g = f;
	}

	if (typeof e != "string") {
		return g;
	}

	if (g != null) {
		var h = g.elements[e];
		if (h != null) {
			return h;
		}
	}

	if (typeof document.getElementById == "function") {
		h = document.getElementById(e);
		if (h != null) {
			return h;
		}
	}

	if (document[e] != null) {
		return document[e];
	}

	if ((document.all != null) && (document.all[e] != null)) {
		return document.all[e];
	}

	return null;
}

function validatePassword(f, e1, e2, msg) {

	e1 = getField(f, e1);
	e2 = getField(f, e2);

	if ((e1.value == "") && (e2.value == "")) {
        e1.value = "";
        e2.value = "";
        e1.className = "errHilite";
        e2.className = "errHilite";
        e1.focus();
	    return "Please enter " + msg + "password.\n";
    } else if (!/[A-Za-z]/.test(e1.value) ||
		(!/[0-9]/.test(e1.value)) ||
		(e1.value.length < 6)) {

        e1.value = "";
        e2.value = "";
        e1.className = "errHilite";
        e2.className = "errHilite";
        e1.focus();

		return "Your password is invalid.\n" +
	       "Password must consist of a minimum of 6 characters, " +
	       "with at least one numeric and one alpha characters.\n";
	} else if (e1.value != e2.value) {
        e1.value = "";
        e2.value = "";
        e1.className = "errHilite";
        e2.className = "errHilite";
        e1.focus();
	    return "The passwords you typed don't match.  Please try again\n";
    }

    e1.className = "";
    e2.className = "";
	return "";
}

function validatePhoneNumber(f, e, msg) {

	e = getField(f, e);
    e.value = formatTelNumber(e.value);

    if (e.value == "" || !checkTel(e.value)) {
        e.className = "errHilite";
        e.focus();
		if ((e.value.length < 13) && (e.value != "")) {
	        return "Please enter a valid phone number.\n";
	    } else {
	        return "Please enter " + msg + "phone number.\n";
	    }
    }

    e.className = "";
    return "";
}

function validateZipCode(f, e, msg) {

	e = getField(f, e);
	e.value = e.value.replace(/[^0-9]/g,"");

    if (e.value.length < 5) {
        e.className = "errHilite";
        e.focus();
        return "Please enter " + msg + "zip code.\n";
    }

    e.className = "";
    return "";
}

function validateEmail(f, e, msg) {

	e = getField(f, e);
	e.value = e.value.trim();

    if (checkEmail(e.value) == false) {
		e.className = "errHilite";
		e.focus();
		return "Please enter a valid " + msg + " email address.\n".replace(/\s\s/g, " ");
    }

    e.className = "";
    return "";
}

function stringTrim() {
	return this.replace(/^\s+/,'').replace(/\s+$/,'');
}

String.prototype.trim = stringTrim;

function validateNonEmpty(f, e, msg) {
	e = getField(f, e);

	var isEmpty = false;
	if (e.options != null) {
		isEmpty = (e.selectedIndex < 0) || (e.options[e.selectedIndex].value == null) || (e.options[e.selectedIndex].value == "");
	} else {
		e.value = e.value.trim();
		isEmpty = (e.value == "");
	}

    if (isEmpty) {
        e.className = "errHilite";
        e.focus();
        return "Please enter " + msg + ".\n";
    }

    e.className = "";
    return "";
}

function validatePinNumber(f, e1, e2, allowEmptyPins) {

	e1 = getField(f, e1);
	e2 = getField(f, e2);

    if ((e1.value == "") && (e2.value == "")) {
    	if ((typeof allowEmptyPins != "boolean") || !allowEmptyPins) {
	        e1.value = "";
	        e2.value = "";
	        e1.className = "errHilite";
	        e2.className = "errHilite";
	        return "Please enter the provider's pin number.\n";
        }
    } else if (e1.value != e2.value) {
        e1.value = "";
        e2.value = "";
        e1.className = "errHilite";
        e2.className = "errHilite";
        return "The two new pin numbers do not match.\n";
    } else if (!/^\d+$/.test(e1.value)) {
        e1.value = "";
        e2.value = "";
        e1.className = "errHilite";
        e2.className = "errHilite";
        return "Pin numbers must be numeric.\n";
    }

    e1.className = "";
    e2.className = "";
    return "";
}

function getRadioValue(f, e) {
	e = getField(f, e);

    // check for the 1 element special case
    if (typeof e.defaultChecked == "boolean") {
        e = Array( e );
    }

	for (var i = 0; i < e.length; i++) {
		if (e[i].checked) {
			return e[i].value;
		}
	}

	return null;
}

// return true if one is checked
function validateRadioButtons(f, e, msg) {

	e = getField(f, e);

    // check for the 1 element special case
    if (typeof e.defaultChecked == "boolean") {
        e = Array( e );
    }

	for (var i = 0; i < e.length; i++) {
		if (e[i].checked) {
			return true;
		}
	}

	return false;
}

function setUnsavedChangesForm(name) {
	unsavedChangesForm = (name == null) ? null : getField(name);
}

function selectOptionByValue(f, e, value) {
    var opts = getField(f, e).options;

	for (var i = 0; i < opts.length; i++) {
        var opt = opts[i];
        opts[i].selected = (opts[i].value == value);
        opts[i].defaultSelected = (opts[i].value == value);
	}
}

// set all of the default values of the form to their current values
// this allows a form to use extensive JavaScript setup and still use
// the unsavedChanges hooks
function setAllFormDefaults() {
	for (var i = 0; i < unsavedChangesForm.elements.length; i++) {
		var element = unsavedChangesForm.elements[i];
		var nodeName = element.nodeName.toLowerCase();
		if (nodeName == "input") {
			var inputType = element.type.toLowerCase();
			if ((inputType == "password") || (inputType == "hidden") || (inputType == "text")) {
				element.defaultValue = element.value;
			} else if ((inputType == "checkbox") || (inputType == "radio")) {
				element.defaultChecked = element.checked;
			}
		} else if (nodeName == "textarea") {
			element.defaultValue = element.value;
		} else if (nodeName == "select") {
			for (var k = 0; k < element.options.length; k++) {
				element.options[k].defaultSelected = element.options[k].selected;
			}
		}
	}
}

// returns true if something changed since page load
function checkForUnsavedChanges() {

	for (var i = 0; i < unsavedChangesForm.elements.length; i++) {
		var element = unsavedChangesForm.elements[i];
		var nodeName = element.nodeName.toLowerCase();
		if (nodeName == "input") {
			var inputType = element.type.toLowerCase();
			if ((inputType == "password") || (inputType == "hidden") || (inputType == "text")) {
				if (element.value != element.defaultValue) {
					return true;
				}
			} else if ((inputType == "checkbox") || (inputType == "radio")) {
				if (element.checked != element.defaultChecked) {
					return true;
				}
			}
		} else if (nodeName == "textarea") {
			if (element.value != element.defaultValue) {
				return true;
			}
		} else if (nodeName == "select") {
			// note - yes, for selects, you have to loop through the options
			// to properly check multi-select lists
			for (var k = 0; k < element.options.length; k++) {
				if (element.options[k].selected != element.options[k].defaultSelected) {
					return true;
				}
			}
		}
	}

	return false;
}

function limitFieldSize(element, length, message) {
    if (element.value.length > length) {
        alert(message);
        element.value = element.value.substring(0,length);
        return false;
    } else {
        return true;
    }
}

// this function is used for javascript sorting
function strcmp(s1,s2){
    if (s1.text < s2.text ) {
        return -1;
    } else if (s1.text > s2.text) {
        return 1;
    }
    return 0;
}

