//----------------------
// EMS FORM VALIDATION
//----------------------
_f = new Array();

function emsformvalidate(tform) {
	
	for(var i=0; i<tform.elements.length; i++) {
		fele = tform.elements[i];
		   ftype = fele.type;
		if (!(ftype == 'button') && !(ftype == 'submit')  && !(ftype == 'image') && !(fele.disabled) && (fele.type)) {
			fname = fele.name.split('~')[0].split('-')[0].toLowerCase();
			isval = false;
			fval = ''; ferrtxt = ''; ferrtype = 1;
			if (_f[fname]) {
				switch(ftype) {
					case 'hidden': fval = fele.value; ferrtype = 1; break;
					case 'text': fval = fele.value; ferrtype = 0; break;
					case 'radio': fval = fele.value; ferrtype = 1; break;
					case 'textarea': fval = fele.value; ferrtype = 0; break;
					case 'checkbox': fval = fele.checked; ferrtype = 1; break;
					case 'select': fval = fele.options[fele.selectedIndex].value; ferrtype = 1; break;
				}
				
				switch(!(fele.getAttribute('emstype')) ? _f[fname].type : fele.getAttribute('emstype')) {
					case 'boolean': isval = _f_b(fval,_f[fname]); ferrtxt = 'It must contain a boolean (yes/no) value.'; break;
					case 'integer': isval = _f_i(fval,_f[fname]); ferrtxt = 'It must contain a number (and no fractions or decimal points are allowed).'; break;
					case 'float': isval = _f_f(fval,_f[fname]); ferrtxt = 'It must contain a number (decimal points are allowed).'; break;
					case 'date': isval = _f_d(fval,_f[fname]); ferrtxt = 'It must contain a valid date (in the British format - dd/mm/yyyy).'; break;
					case 'string':
						switch(!(fele.getAttribute('emsvalidation')) ? _f[fname].validation : fele.getAttribute('emsvalidation')) {
							case 'general':
								
								// change carriage returns to single space (for a text type value)
								if(ftype == 'textarea')
								{
									fval = fval.replace(/\r|\n|\r\n/g, " ")
								}
								
								var incpattern = '^[\\w\\.\\,\\?\\\\\'\\"\\-\\+\\@\\£\\$\\*\\!\\=\\&\\;\\/\\:\\# ]*$';
								var excpattern = '&lt;|&gt;|&quote;';
								ferrtxt = 'It appears to contain unknown/unsafe characters. It can only contain letters, numbers and .,?\'"-+£$*!&; characters.';
								isval = _f_s(fval,_f[fname], incpattern, excpattern); break;
							case 'generalmulti':
								
								var incpattern = '^[\\w\\s\\.\\,\\?\\\\\'\\"\\-\\+\\@\\£\\$\\*\\=\\!\\&\\;\\/\\:\\# ]*$';
								var excpattern = '&lt;|&gt;|&quote;';
								ferrtxt = 'It appears to contain unknown/unsafe characters. It can only contain letters, numbers and .,?\'"-+£$*!&; characters.';
								isval = _f_s(fval,_f[fname], incpattern, excpattern); break;
							case 'url':
								var incpattern = '^(http|https):\\/\\/[\\w\\.\\-]+\\.[a-zA-Z]{2,5}(:\\w+)?(\\/\\w*)*((\\/[\\w\\.]*)?(\\?[\\w\\=\\.\\-\\&\\+\\?\\:\\/]+)?)?$';
								var excpattern = '';
								ferrtxt = 'It must contain a valid URL (starting with either http:// or https://.';
								isval = _f_s(fval,_f[fname], incpattern, excpattern); break;
							case 'email':
								var incpattern = '^[\\w\\.=-]+@[\\w\\.\\-]+\\.[\\w]{2,5}$';
								var excpattern = '';
								ferrtxt = 'It must contain a valid email address (e.g. fred.bloggs@hotmail.com)';
								isval = _f_s(fval,_f[fname], incpattern, excpattern); break;
							case 'pattern':
								ferrtxt = '';
								isval = _f_s(fval,_f[fname], _f[fname].incpattern, _f[fname].excpattern); break;
							default:
								isval = false;
						}
						break;
					default:
						isval = false;
				}
			}
			if (!isval) {
				if (ferrtype == 1) {
					makeAlert('<b>Sorry, A Technical Error Has Occurred</b><br /><br />We are very sorry, but it seems that a technical error has occurred that is stopping the action from being completed. We have logged the details of the error and will attempt to resolve the problem as soon as possible. In the meantime  please try again or, if you require further assistance, please contact our customer support team.', true);
					document.frames['actionframe'].location.href = '/cgi-clients/500error.asp?emsfirewall=1&fn='+fname+'&fp='+document.location.href;
				} else {
					makeAlert('<b>Sorry, Invalid Information Entered</b><br /><br />The information you have entered for the <b>' + (!(fele.getAttribute('emscaption')) ? _f[fname].title : fele.getAttribute('emscaption')) + '</b> is not allowed. ' + ferrtxt + '<br /><br />Please re-enter and try again.',true);
					try { fele.style.backgroundColor = '#ffeeee'; } catch(e) {}
				}
				return false;
			} else {
				try { fele.style.backgroundColor = '#ffffff'; } catch(e) {}
			}
		}
	}
	return true;
}

//======================================
// BOOLEAN
//======================================
function _f_b( val, par ) {
	val = (val+'').toLowerCase();
	if (val == '') return true;
	return ((val == 'true') || (val == 'false') || (val == '0') || (val == '1') || (val == 'yes') || (val == 'no') || (val == 'on') || (val == 'off'));
}

//======================================
// INTEGER
//======================================
function _f_i( val, par ) {
	var retval = true; val = val+'';
	if (val == '') return true;
	eval('var regex = /' + '^\\-?[0-9]*$' + '/');
	retval = (retval && regex.test(val));
	if (!(par.min == -99887766)) try { retval = (retval && (parseInt(val) >= par.min)); } catch(e) { retval = false; }
	if (!(par.max == -99887766)) try { retval = (retval && (parseInt(val) <= par.max)); } catch(e) { retval = false; }
	return retval;
}

//======================================
// FLOAT
//======================================
function _f_f( val, par ) {
	var retval = true; val = val+'';
	if (val == '') return true;
	eval('var regex = /' + '^\\-?[0-9]*\\.?[0-9]*$' + '/');
	retval = (retval && regex.test(val));
	if (!(par.min == -99887766)) try { retval = (retval && (parseFloat(val) >= par.min)); } catch(e) { retval = false; }
	if (!(par.max == -99887766)) try { retval = (retval && (parseFloat(val) <= par.max)); } catch(e) { retval = false; }
	return retval;
}

//======================================
// DATE
//======================================
function _f_d( val, par ) {
	val = val+'';
	if(val == '') return true;
	var errf = '';
	var sls1 = val.indexOf('/',0);
	var sls2 = val.indexOf('/',sls1+1);
	if ((sls1 == -1) || (sls2 == -1)){
		errf = 'The date contains spurious characters. Please use numerical characters and the / character only';
	} else {
		var d = parseInt(val.substring(0,sls1),10);
		var m = parseInt(val.substring(sls1+1,sls2),10);
		var y = parseInt(val.substring(sls2+1,val.length),10);
		var sy	= val.substring(sls2+1,val.length);
		if(isNaN(d) || isNaN(m) || isNaN(y)) {
			errf = 'The date contains spurious characters. Please use numerical characters and the / character only';
		} else {
			if(((y > 9999) || (y < 1000)) && !((sy.length==2) && (y >= 0 || y <= 99))) errf = 'The year ' + y + '  is invalid. Please amend';
			if((m > 12) || (m < 1)) errf = 'The month ' + m + ' is invalid. Please check and try again';
			if((d > 31) || (d < 1)) errf = 'The day ' + d + '  is invalid. Please check and try again';
			if((m == 1) && (d > 31)) errf = 'January only contains 31 days. Please amend';
			if((m == 2) && (d > 29)) errf = 'February only contains (at most) 29 days. Please amend';
			if((m == 3) && (d > 31)) errf = 'March only contains 31 days. Please amend';
			if((m == 4) && (d > 30)) errf = 'April only contains 30 days. Please amend';
			if((m == 5) && (d > 31)) errf = 'May only contains 31 days. Please amend';
			if((m == 6) && (d > 30)) errf = 'June only contains 30 days. Please amend';
			if((m == 7) && (d > 31)) errf = 'July only contains 31 days. Please amend';
			if((m == 8) && (d > 31)) errf = 'August only contains 31 days. Please amend';
			if((m == 9) && (d > 30)) errf = 'September only contains 30 days. Please amend';
			if((m == 10) && (d > 31)) errf = 'October only contains 31 days. Please amend';
			if((m == 11) && (d > 30)) errf = 'November only contains 30 days. Please amend';
			if((m == 12) && (d > 31)) errf = 'December only contains 31 days. Please amend';
		}
	}
	if (errf != '') { return false; }
	return true;
}

//======================================
// STRING
//======================================
function _f_s( val, par, inc, exc ) {
	var retval = true; val = val+'';
	if (val == '') return true;
	if (!(inc+'' == '')) {
		eval('var regex = /' + inc + '/'); retval = (retval && regex.test(val));
	}
	if (!(exc+'' == '')) {
		eval('var regex = /' + exc + '/'); retval = (retval && (!regex.test(val)));
	}
	if (!(par.min == -99887766)) try { retval = (retval && (val.length >= par.min)); } catch(e) { retval = false; }
	if (!(par.max == -99887766)) try { retval = (retval && (val.length <= par.max)); } catch(e) { retval = false; }
	return retval;
}

//======================================
// EMS FIREWALL PARAMETER
//======================================
function _af(ftitle,fmin,fmax,ftype,fvalidation,fincpattern,fexcpattern,fhassubid) {
	ftitle = ftitle.toLowerCase();
	_f[ftitle] = new Object();
	_f[ftitle].title = ftitle;
	_f[ftitle].min = fmin;
	_f[ftitle].max = fmax;
	_f[ftitle].type = ftype;
	_f[ftitle].validation = fvalidation;
	_f[ftitle].incpattern = fincpattern;
	_f[ftitle].excpattern = fexcpattern;
	_f[ftitle].hassubid = fhassubid;
}

function emsfirewallinit() {
	var fs = document.getElementsByTagName('form');
	for(var i=0; i<fs.length; i++) {
		try {
		for(var j=0; j<fs[i].elements.length; j++) {
			fele = fs[i].elements[j];
			ftype = fele.type;
			fname = fele.name.split('~')[0].split('-')[0].toLowerCase();
			if (!(ftype == 'button') && (_f[fname])) {
				switch(ftype) {
					case 'text': if (!(_f[fname].max == -99887766)) { fele.maxLength = _f[fname].max; } break;
					case 'textarea':  if (!(_f[fname].max == -99887766)) { fele.setAttribute('maxlength',_f[fname].max+''); fele.onkeyup=function() { return ismaxlength(this) }; } break;
				}
			}
		} } catch(e) { }
	}
}