// Form helper functions
// REQUIRES: eventHelper.js

// ASCII constants
var KEY_BACKSPACE	= 8;
var KEY_NEWLINE		= 10;
var KEY_ENTER		= 13;
var KEY_DELETE		= 46; /* 127? */
var KEY_LEFT		= 37;
var KEY_UP			= 38;
var KEY_RIGHT		= 39;
var KEY_DOWN		= 40;

// Returns a boolean if a string is null or empty
function isEmpty(s) {
	return (s == null || ((s != null) && (s.length == 0 || s.length == undefined)));
}

// Returns the empty string for null values
function nullToEmpty(s) {
	return (s == null ? '' : s);
}

// Check for a valid e-mail address
function checkEmail(s) {
	var emailReg = '^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+[.][a-zA-Z]{2,4}$';
	var regex = new RegExp(emailReg);
	return regex.test(s);
}

// Check for a valid number
function checkNumber(n) {
	var numberReg = '^[0-9]+$';
	var regex = new RegExp(numberReg);
	return regex.test(n);
}

// Check for a valid string
function checkString(s, def) {
	return ((s != null) && (s.length > 0) && (s != def));
}

// Check if two strings match.
// Null values are converted to the empty string, so in the case of:
//   s1 = null, s2 = '' or
//   s1 = null, s2 = null
// these would evaluate as equal.
function checkStringMatch(s1, s2) {
	return (nullToEmpty(s1) == nullToEmpty(s2));
}

// Check for text length, via word count (useful on TEXTAREA)
function checkMaxWords(obj, maxWords) {
	return (getWordCount(obj) <= maxWords);
}

// Check for text length, via characters (useful on TEXTAREA)
function checkMaxLength(obj, maxLen) {
	return (obj.value.length <= maxLen);
}

// Event handler to check for text length
function handlerCheckMaxLength(evt) {
	var src = getEventSource(evt);
	var key = getEventKeyCode(evt);
	var maxLen = src.getAttribute('maxlength');
	if (!checkMaxLength(src, maxLen)) {
		src.value = src.value.substr(0, maxLen);
	}
	return (checkMaxLength(src, maxLen) || (key == KEY_BACKSPACE) || (key == KEY_DELETE)
		|| (key == KEY_LEFT) || (key == KEY_UP) || (key == KEY_RIGHT) || (key == KEY_DOWN));
}

// Event handler to check for ENTER key press in forms
function handlerCheckEnterPressed(evt) {
	var key = getEventKeyCode(evt);
	if (key == null) return false;
	return ((key == KEY_ENTER) || (key == KEY_NEWLINE));
}

// Add key-capturing events to all text fields of a given form
function formKeyCapture(id, fn)
{
	var frm = document.forms[id];
	var inputs = frm.getElementsByTagName('input');
	for (var i = 0; i < inputs.length; i++) {
		if (inputs[i].type == 'text' || inputs[i].type == 'password') {
			//alert('Adding key event to: ' + inputs[i].getAttribute('id'));
			addKeyDownEvent(inputs[i], fn);
		}
	}
}

// Count words/characters in a form field
function getWordCount(fld, showWords, showChars) {
	// String constants
	var STR_WORDLABEL = "word";
	var STR_WORDSLABEL = "words";
	var STR_CHARLABEL = "character";
	var STR_CHARSLABEL = "characters";
	
	// Set defaults
	showWords = (showWords == null) ? true : showWords;
	showChars = (showChars == null) ? false : showChars;
	
	// Get the character count
	var chars = fld.value.length;
	
	// Prepare the string to be parsed:
	//  - Add an additional space to the end for split count
	//  - Remove all non-alphanumeric chars at the beginning
	//  - Replace all other non-alphanumeric chars with a single space char
	var s = fld.value + " ";
	s = s.replace(/^[^A-Za-z0-9]+/gi, "").replace(/[^A-Za-z0-9]+/gi, " ");

	// Get the word count
	var aryWords = s.split(" ");
	var words = aryWords.length - 1;
	if (s.length < 2) words = 0;

	// Set the word count label
	wordLabel = (words == 1) ? STR_WORDLABEL : STR_WORDSLABEL;
	charLabel = (chars == 1) ? STR_CHARLABEL : STR_CHARSLABEL;

	var msg = "";
	if (showWords & showChars) {
		msg = "Word Count:\n" + "    " + words + " " + wordLabel + "\n" + "    " + chars + charLabel;
	} else {
		if (showWords) { msg = "Word Count:  " + words + " " + wordLabel; }
		else { if (showChars) { msg = "Character Count:  " + chars + " " + charLabel; } }
	}

	return words;
}
