function trimString( s)
{
	var i = 0;
	var l = s.length;
	while
	(
		i < l
		&&
		s.charAt( i) == ' '
		||
		s.charAt( i) == '\n'
		||
		s.charAt( i) == '\r'
		||
		s.charAt( i) == '\t'
		||
		s.charAt( i) == '\f'
	)
	{
		i++;
	}
	if (i >= l)
	{
		return ("");
	}
	do
	{
		l--;
	}
	while
	(
		s.charAt( l) == ' '
		||
		s.charAt( l) == '\n'
		||
		s.charAt( l) == '\r'
		||
		s.charAt( l) == '\t'
		||
		s.charAt( l) == '\f'
	);
	return (s.substring( i, l + 1));
}

function ismail( addr, txto) {

	var chkEmail = true;
	var i, len, atpos, dotpos;

	// trim
	addr = trimString( addr.toLowerCase());
	len = addr.length;
	
	// strip out any blank
	i = 0;
	while (i < len) {
		if (addr.charAt( i) == ' ') {
			addr = addr.substring( 0, i) + addr.substring( i + 1, addr.length);
			--len;
		} else {
			++i;
		}
	}

	if (
		// a@bcd.ef should be the shortest an address could be
		len < 8 ||
		// exactly one "@" after at least one user name characters
		((atpos = addr.indexOf( "@")) < 1 || addr.indexOf( "@", atpos + 1) > atpos) ||
		// no "_" after the "@"
		addr.indexOf( "_") > atpos ||
		// at least one "." after at least three characters
		(dotpos = addr.lastIndexOf( ".")) < 3 ||
		// at least 2 but no more than 3 characters for tld
		((len - (dotpos + 1)) < 2 || (len - (dotpos + 1)) > 3) ||
		// no two dots in succession
		addr.indexOf( "..") >= 0
	) {
		chkEmail = false;
	} else {
		// check if domain name is at least 2 characters long
//		var username = addr.substring( 0, atpos);
		var host_domain = addr.substring( atpos + 1, len).split( /\.+/);
		if (host_domain[host_domain.length - 2].length < 2) {
			chkEmail = false;
		} else {
			// check each character for validity
			var _a = "az09".charCodeAt( 0);
			var _z = "az09".charCodeAt( 1);
			var _0 = "az09".charCodeAt( 2);
			var _9 = "az09".charCodeAt( 3);
			for (i = 0; i < len; i++) {
				var c = addr.charAt( i);
				var cc = addr.charCodeAt( i);
				if (
					(cc < _a || cc > _z) &&
					c != '_' &&
					c != '.' &&
					c != '@' &&
					c != '-'
				) {
					if (i < dotpos && cc >= 0 && cc <= _9) {
						continue;
					}
					chkEmail = false;
					break;
				}
			}
		}
	}
	
	if (chkEmail && txto != null) {
		txto.value = addr;
	}

	return (chkEmail);
}
