/*
    Following three functions work together to enable text fields that display
    dimmed helper text until given focus. To enable this behaviour, text inputs
    must have a custom attribute added called "helptext" with the value of the
    text to be displayed prior to the field receiving focus. Then, at page
    load, the initHelpTextFields function needs to be called.
 */
function initHelpTextFields(formObj) {
	var inputs = new Array();
	for (var i = 0; i < formObj.elements.length; i++) {
		if (formObj.elements[i].type == "text"
			|| formObj.elements[i].type == "textarea") {
			inputs[inputs.length] = formObj.elements[i];
		}
	}
	for (var i = 0; i < inputs.length; i++) {
        var helpText = inputs[i].getAttribute("helptext");
		if (helpText) {
            if (inputs[i].value.length == 0 || inputs[i].value == helpText) {
                inputs[i].style.color = "#aaaaaa";
                inputs[i].value = helpText;
            }
			addEventHandler(inputs[i], "focus", setTextFieldActive);
			addEventHandler(inputs[i], "blur", resetTextField);
		}
	}
}

function setTextFieldActive(e) {
    var elem = getEventSource(e);
    var helpText = elem.getAttribute("helptext");
    if (elem.value == helpText) {
	    elem.style.color = "#000000";
	    elem.value = "";
    }
}

function resetTextField(e) {
    var elem = getEventSource(e);
    var helpText = elem.getAttribute("helptext");
    if (elem.value.length == 0 || elem.value == helpText) {
	    elem.style.color = "#aaaaaa";
	    elem.value = helpText;
    }
}

// Call at onload to give focus to first text or select field in page
function setFocusToFirstField(formObj) {
	if (!formObj) formObj = document.forms[0];
	for (var i = 0; i < formObj.elements.length; i++) {
		var elem = formObj.elements[i];
		if (elem.type == "text" ||
			elem.type == "password" ||
			elem.type == "textarea" ||
			elem.type == "select-one" ||
			elem.type == "select-multiple") {
			elem.focus();
			break;
		}
	}
}

function isString(s) {
	return trimString(s).length > 0;
}

function isNumber(n, allowDecimal, allowNeg) {
    if (!isString(n)) return false;
	var validChars = "0123456789";
	if (allowDecimal) validChars += ".";
	for (var i = 0; i < n.length; i++) {
		if (allowNeg && i == 0 && n.charAt(0) == "-") continue;
		if (validChars.indexOf(n.charAt(i)) == -1) return false;
	}
	return true;
}

function isLegalInputString(fieldObj, extraLegal) {
	var s = fieldObj.value;
	if (fieldObj.getAttribute("helptext") && fieldObj.getAttribute("helptext") == s) return false;
	if (isString(s)) {
		s = s.toLowerCase();
		var validChars = "0123456789abcdefghijklmnopqrstuvwxyz ,.?-!@#$%&()+=:'";
		if (extraLegal) validChars += extraLegal;
		for (var i = 0; i < s.length; i++) {
			if (validChars.indexOf(s.charAt(i)) == -1) return false;
		}
		if (s == "password") return false;
		return true;
	}
	return false;
}

function trimString(s) {
    while (s.charAt(0) == " ") s = s.substring(1, s.length);
    while (s.charAt(s.length - 1) == " ") s = s.substring(0, (s.length - 1));
    return s;
}

function isEmailValid(fieldObj) {
	if (!isLegalInputString(fieldObj)) return false;
	var val = fieldObj.value;
	apos = val.indexOf("@");
	dotpos = val.lastIndexOf(".");
	if (apos < 1 || dotpos - apos < 2) {
		return false;
	}
	return true;
}

function toggleMarkFieldValid(fieldObj, invalidClassName, isValid) {
	if (isValid) markFieldValid(fieldObj, invalidClassName);
	else markFieldInvalid(fieldObj, invalidClassName);
}

function markFieldInvalid(fieldObj, invalidClassName) {
	if (fieldObj.className.indexOf(invalidClassName) == -1) {
		if (fieldObj.className.length > 0) {
			fieldObj.className = fieldObj.className + " " + invalidClassName;
		} else {
			fieldObj.className = invalidClassName;
		}
	}
}

function markFieldValid(fieldObj, invalidClassName) {
	if (fieldObj.className.length > 0 && fieldObj.className.indexOf(invalidClassName) != -1) {
		if (fieldObj.className.indexOf(" ")) {
			fieldObj.className = fieldObj.className.substring(0, fieldObj.className.indexOf(" "));
		} else {
			fieldObj.className = "";
		}
	}
}


/*
   Function adds an event handler to a designated element using a method
   appropriate to the current client.
*/
function addEventHandler(element, event, handler) {
	if (element.attachEvent) {
		// MS registration model
		element.attachEvent('on' + event, handler);
	} else if (element.addEventListener) {
		// NN (W4C) regisration model
		element.addEventListener(event, handler, false);
	} else {
		// old regisration model as fall-back
		element[event] = handler;
	}
}

/* Function identifies the element that spawned a given event using a
   method appropriate to the current client.
*/
function getEventSource(evt) {
	if (document.attachEvent) {
		return evt.srcElement;
	} else if (document.addEventListener) {
		return evt.target;
	} else {
		window.event.srcElement;
	}
}

function writeEMLink(id, text, subj, dom) {
	if (!dom) dom = "bluesilk";
	var url = id + unescape("%40") + dom + "." + "org";
	document.write("<a href=\"ma" + "ilto:" + url);
	if (subj) document.write("?" + "sub" + "ject=" + escape(subj));
	document.write("\" onmouseover=\"window.status=''; return true;\">");
	if (text) document.write(text);
	else document.write(url);
	document.write("</a>");
}
