var _ValidateEmailStripRegExp;
var agt         = navigator.userAgent.toLowerCase();
var is_major    = parseInt(navigator.appVersion);
var is_minor    = parseFloat(navigator.appVersion);
var is_ie       = ((agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1));
var is_ie3      = (is_ie && (is_major < 4));
var is_ie4      = (is_ie && (is_major == 4) && (agt.indexOf("msie 5") == -1) );
var is_ie4up    = (is_ie  && (is_major >= 4));
var is_ie5      = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.0") !=-1) );
var is_ie5_5    = (is_ie && (is_major == 4) && (agt.indexOf("msie 5.5") !=-1));
var is_ie6      = (is_ie && (is_major == 4) && (agt.indexOf("msie 6.0") !=-1) );
var is_ie6up    = (is_ie6);
var is_ie5up    = (is_ie6up || (is_ie  && !is_ie3 && !is_ie4));
var is_ie5_5up  = (is_ie6up || (is_ie && !is_ie3 && !is_ie4 && !is_ie5));
var is_win      = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );
var is_mac      = (agt.indexOf("mac")!=-1);
var is_gecko    = (agt.indexOf('gecko') != -1);

var is_ie7      = (is_ie && (is_major == 4) && (agt.indexOf("msie 7.0") !=-1) );
var is_ie7up    = (is_ie7);

if ((((is_mac) && (!is_gecko)) || ((is_win) && (is_ie) && (!is_ie5_5up))) && (!is_ie7up)) {
	_ValidateEmailStripRegExp = new RegExp('^(([^"\]|\.)*("([^"\]|\.)*"([^"\]|\.)*)*)\(([^()\]|\.)*\)');
} else {
	_ValidateEmailStripRegExp = new RegExp('^((?:[^"\]|\.)*(?:"(?:[^"\]|\.)*"(?:[^"\]|\.)*)*)\((?:[^()\]|\.)*\)');
}

var _ValidateEmailString = '';

function __ValidateEmail() {
	if ((((is_mac) && (!is_gecko)) || ((is_win) && (is_ie) && (!is_ie5_5up))) && (!is_ie7up)) {
		// macIE does not support a full set of regex
		var lwsp = '((\\r\\n)?[ \\t])';
		var specials = '()<>@,;:\\\\".\\[\\]';
		var controls = '\\000-\\031';
		var dtext = '[^\\[\\]\\r\\\\]';
		var domain_literal = '\\[(' + dtext + '|\\\\.)*\\]' + lwsp + '*';
		var quoted_string = '"([^\\\"\\r\\\\]|\\\\.|' + lwsp + ')*"' + lwsp + '*';
		var atom = '[^' + specials + ' ' + controls + ']+(' + lwsp + '+)';
		var word = '(' + atom + '|' + quoted_string + ')';
		var localpart = word + '(\\.' + lwsp + '*' + word + ')*';
		var sub_domain = '(' + atom + '|' + domain_literal + ')';
		var domain = sub_domain + '(\\.' + lwsp + '*' + sub_domain + ')*';
		var addr_spec = localpart + '\@' + lwsp + '*' + domain;
		var phrase = word + '*';
		var route = '(\@' + domain + '(,\@' + lwsp + '*' + domain + ')*:' + lwsp + '*)';
		var route_addr = '\\<' + lwsp + '*' + route + '?' + addr_spec + '\\>' + lwsp + '*';
		var mailbox = '(' + addr_spec+ '|' + phrase + route_addr + ')';
		var group = phrase + ':' + lwsp + '*(' + mailbox + '(,\\s*' + mailbox + ')*)?;\\s*';
		var address = '(' + mailbox + '|' + group + ')';
		return lwsp + '*' + address;
	} else {
		var lwsp = '(?:(?:\\r\\n)?[ \\t])';
		var specials = '()<>@,;:\\\\".\\[\\]';
		var controls = '\\000-\\031';
		var dtext = '[^\\[\\]\\r\\\\]';
		var domain_literal = '\\[(' + dtext + '|\\\\.)*\\]' + lwsp + '*';
		var quoted_string = '"(?:[^\\\"\\r\\\\]|\\\\.|' + lwsp + ')*"' + lwsp + '*';
		var atom = '[^' + specials + ' ' + controls + ']+(?:' + lwsp + '+|(?=[\\["' + specials + ']))';
		// should have been
		// var atom = '[^' + specials + ' ' + controls + ']+(?:' + lwsp + '+|\\Z|(?=[\\["' + specials + ']))';
		// except ECMAscript v3 does not support \Z - it should not give any problems in real life...
		var word = '(?:' + atom + '|' + quoted_string + ')';
		var localpart = word + '(?:\\.' + lwsp + '*' + word + ')*';
		var sub_domain = '(?:' + atom + '|' + domain_literal + ')';
		var domain = sub_domain + '(?:\\.' + lwsp + '*' + sub_domain + ')*';
		var addr_spec = localpart + '\@' + lwsp + '*' + domain;
		var phrase = word + '*';
		var route = '(?:\@' + domain + '(?:,\@' + lwsp + '*' + domain + ')*:' + lwsp + '*)';
		var route_addr = '\\<' + lwsp + '*' + route + '?' + addr_spec + '\\>' + lwsp + '*';
		var mailbox = '(?:' + addr_spec+ '|' + phrase + route_addr + ')';
		var group = phrase + ':' + lwsp + '*(?:' + mailbox + '(?:,\\s*' + mailbox + ')*)?;\\s*';
		var address = '(?:' + mailbox + '|' + group + ')';
		return lwsp + '*' + address;
	}
}

_ValidateEmailString = __ValidateEmail();
var _ValidateEmailStringRegExp = new RegExp(_ValidateEmailString);

function _ValidateEmailStrip(value) {
	var counter = 0;
	while ((counter < 100) && (value.match(_ValidateEmailStripRegExp))) {
		counter++;
		if (value == RegExp.$1) {
			counter = 100;
		} else {
			value = value.replace(RegExp.$1);
		}
	}
	return value;
}

function _ValidateField(value) {
	value = value.replace(/^\s+/, '');
	value = value.replace(/\s+$/, '');
	// e-mail address
	value = _ValidateEmailStrip(value);
	if (value.match(_ValidateEmailStringRegExp)) {
		return true;
	} else {
		return false;
	}
}

