﻿//-------------------------------------------------------------------
// [RP] Error Message Array
//-------------------------------------------------------------------
ErrMsgArray = new Array();
ErrMsgArray[0]='';
ErrMsgArray[1]='The field \'';
ErrMsgArray[2]=' has the following error:';

//-------------------------------------------------------------------
// [RP] Check if string is numeric
// version: 3-2004-06-15 [RP]
//
// allows a leading minus and a single point separator
// format: +/- 10 digits (0-9) . 4 digits (0-9)
// e.g. 2147483647.0001
//-------------------------------------------------------------------
function IsNumeric(val)
{
	var objRegExp = /(^\+?\-?\d{0,100}\.?\d{0,4}$)/;
	return objRegExp.test(val);
}

//-------------------------------------------------------------------
// [RP] Boolean/YesNo Functions
//-------------------------------------------------------------------
function jsBooleanToYesNo(bValue)
{
	if (bValue) {return 'Y';}
	else {return 'N';}
}
function jsBooleanToYN(bValue)
{
	if (bValue) {return 'Y';}
	else {return 'N';}
}
function jsYNToBoolean(sValue)
{
	switch (sValue.toString().toLowerCase())
	{
		case '1': case 'true': case 'y': case 'yes':
			return true; break;
		default:
			return false; break;
	}
}

//-------------------------------------------------------------------
// [RP] .NET Specific Functions
//-------------------------------------------------------------------
function fixDotNetURL(sURL, sPatern, bRemoveAllAmp)
{
	var re = new RegExp(sPatern, 'gi');
	sURL = sURL.replace(re, '');
	if (bRemoveAllAmp) {sURL.replace(/&/gi, '');}
	return sURL;
}
function cleanViewState(oForm)
	{oForm.__VIEWSTATE.value='';}
function fixDotNetDropDownList(oDropDownList, sValue)
	{oDropDownList.options[0].value=sValue;}
function removeViewState(oForm)
{
	cleanViewState(oForm);
	oForm.__VIEWSTATE.name = 'OLD__VIEWSTATE';
}

//-------------------------------------------------------------------
// [RP] MessageBox Header Line
// version: 1-2004-01-29 [RP]
//
// Arguments: Message, Header
// Returns: String
//-------------------------------------------------------------------
function MsgBoxHeaderLine(msg, msgHeader)
{
	var defaultLine='________________________________________';
	var returnString='';
	var lineLen=0;
	
	if (arguments.length==3) {return defaultLine;}
	lineLen = msg.indexOf('\n');
	if (lineLen==-1) {lineLen=msg.length;}
	if (msgHeader.length > lineLen) {lineLen=msgHeader.length;}
	for (var x=1; x<lineLen; x++)
		{returnString += '_'}
	return returnString;
}

//-------------------------------------------------------------------
// [RP] Generic(ish) Error MessageBox
// version: 3-2005-01-13 [RP]
//
// Arguments: Message, Header, ConfirmDialog (T/F)
//-------------------------------------------------------------------
function errorMsgBox()
{
	var errMsg='', errHeader='', errLine='', errMsgFull='';
	var errConfirm=false, useDefaultLine=false;
	
	if(arguments[0]){errMsg=arguments[0]}
	if(arguments[1]){errHeader=arguments[1]}
	if(arguments[2]){errConfirm=arguments[2]}
	if(arguments[3]){useDefaultLine=arguments[3]}
	
	if (errHeader!='' && useDefaultLine)
		{errLine='\n'+MsgBoxHeaderLine(errMsg, errHeader, true)+'\n\n';}
	else if (errHeader!='')
		{errLine='\n'+MsgBoxHeaderLine(errMsg, errHeader)+'\n\n';}
	
	errMsgFull = errHeader+errLine+errMsg;
	
	if (errConfirm)
		{return confirm(errMsgFull);}
	else
		{alert(errMsgFull);}
}

//-------------------------------------------------------------------
// [RP] Wrapper for errorMsgBox()
// version: 1-2004-01-26 [RP]
//
// ARGUMENTS: Message, Header, ConfirmDialog (T/F)
//-------------------------------------------------------------------
function MsgBox()
{
	switch (arguments.length)
	{
		case 1: errorMsgBox(arguments[0]); break;
		case 2: errorMsgBox(arguments[0], arguments[1]); break;
		case 3: return errorMsgBox(arguments[0], arguments[1], arguments[2]); break;
	}
}

//-------------------------------------------------------------------
// [RP] Standard Form Error MessageBox
// version: 1-2003-02-20 [RP]
//
// ARGUMENTS: FieldName, Message
// DEPENDANCY: errorMsgBox()
//-------------------------------------------------------------------
function formErrorMsgBox(sField, sErrMsg)
	{errorMsgBox(sErrMsg,'The field \''+sField+'\' has the following error:');}
	
//-------------------------------------------------------------------
// [RP] Standard Debug MessageBox
// version: 1-2003-03-07 [RP]
//
// ARGUMENTS: Message
// DEPENDANCY: errorMsgBox()
//-------------------------------------------------------------------
function debugMsgBox(sErrMsg)
	{errorMsgBox(sErrMsg,'Debug Message');}
	
//-------------------------------------------------------------------
// [RP] Validate Telephone Number
// version: 6-2004-08-20 [RP]
//
// ARGUMENTS:
//  oTelNo = TelephoneNumber (object);
//  sNoType = Type of Number (char)
//    T or TT=Telephone, M or TM=Mobile, F or TF=Fax, O or TO = Office Telephone (can have text)
// OPTIONAL:
//  iMaxLen = Max Len of Number (int);
//  iMinLen = Min Len of Number (int);
//  sFieldName = Field Name (varchar);
//  bMandatory = T/F is field mandatory, if F then will NOT do all validation!
//  bShowAlert = T/F to show Error Messages.
// 
// DEPENDANCY: IsNumeric(), formErrorMsgBox(..), jsYNToBoolean(..)
// IMPORTANT: this requires JavaScript 1.2
//-------------------------------------------------------------------
function validateTelNo(oTelNo, sNoType)
{
	var iMaxLen=11, iMinLen=5, iMobLen=11;
	var blnErr=false; var blnMandatory=true; var blnOffice=false; var bShowAlert=true;
	var errMsg='', strFieldName='', strTypeText='';
	// get optional Tel No. Max Len if 
	if (arguments.length>2) {if (arguments[2].length>1) {if (IsNumeric(arguments[2]) && arguments[2]!=-1){iMaxLen=arguments[2];}}}
	if (arguments.length>3) {if (arguments[3].length>0) {if (IsNumeric(arguments[3]) && arguments[3]!=-1){iMinLen=arguments[3];}}}
	if (arguments.length>4) {if (arguments[4].length>0) {if (arguments[4]!='') {strFieldName=arguments[4];}}}
	if (arguments.length>5) {blnMandatory=jsYNToBoolean(arguments[5]);}
	if (arguments.length>6) {bShowAlert=jsYNToBoolean(arguments[6]);}
	// get Type
	var strType=sNoType.toUpperCase();
	switch (strType)
	{
		case 'O': case 'TO': strType='O'; strTypeText='Telephone'; blnOffice=true; break;
		case 'M': case 'TM': strType='M'; strTypeText='Mobile'; break;
		case 'F': case 'TF': strType='F'; strTypeText='Fax'; break;
		default: strType='T'; strTypeText='Telephone'; break
	}
	// strip leading extra zeros and country code
	oTelNo.value = oTelNo.value.replace(/^\+/g,'00');
	oTelNo.value = oTelNo.value.replace(/^0044/g,'0');
	if (strType=='M') {oTelNo.value = oTelNo.value.replace(/\D/g, '');}
	if (blnMandatory && !blnOffice) {oTelNo.value = oTelNo.value.replace(/\D/g, '');}
	// init msgs
	var msg1 = 'Your '+strTypeText+' number ';
	var msg2 = msg1+'must be a valid UK '+strTypeText+' number.';
	// validation
	if (!blnOffice && IsNumeric(oTelNo.value.replace(/[ ]/gi, ''))==false)
		{blnErr=true; errMsg=msg1+'must be numerical.';}
	else if(blnMandatory && strType!='M' && oTelNo.value.length<iMinLen)
		{blnErr=true; errMsg=msg1+'must have at least '+iMinLen+' numbers.';}
	else if(oTelNo.value.length>iMaxLen)
		{blnErr=true; errMsg=msg1+'cannot exceed '+iMaxLen+' numbers.';}
	else if(!blnOffice && strType!='M' && oTelNo.value.length>0 && oTelNo.value.substr(0,1) != '0')
		{blnErr=true;errMsg=msg2;}
	else if(strType=='M' && oTelNo.value.length>0 && oTelNo.value.length != iMobLen)
		{blnErr=true;errMsg=msg2;}
	else if(strType=='M' && oTelNo.value.length>0 && oTelNo.value.substr(0,2) != '07')
		{blnErr=true;errMsg=msg2;}
	// Field Name
	if (strFieldName=='') {strFieldName=strTypeText+' Number';}
	// Error Handler
	if (blnErr && bShowAlert)
		{formErrorMsgBox(strFieldName, errMsg); oTelNo.focus();}
	
	return blnErr;
}

//-------------------------------------------------------------------
// [RP] Validate Email Address
// version: 2-2004-08-20 [RP]
//
// ARGUMENTS:
//  oEmail = Email Address (object)
//
// OPTIONAL ARGUMENTS:
//  fieldName = Email Address field name (varchar)
//  bShowAlert = T/F to show Error Messages.
//
// RETURNS:
//  true/false depending on whether an error was found. i.e. true = error found.
//
// DEPENDANCY:
//  formErrorMsgBox(..), jsYNToBoolean(..)
//-------------------------------------------------------------------
function validateEmail(oEmail)
{
	var validEmailRE = /([\w\.!#\$%\-+.&]+@[\w-]+\.\w+(\.\w+)*$)/; //v3
	// trim leading & trailing spaces and reset object to that
	var email = oEmail.value.replace(/^\s+/,'').replace(/\s+$/,'');
	var fieldName ='Email Address';
	var msg='The field must be a valid email address.';
	var blnErr=false; var bShowAlert=true;

	if (arguments.length>1) {if (arguments[1]!='') {fieldName = arguments[1];}}
	if (arguments.length>2) {bShowAlert=jsYNToBoolean(arguments[2]);}
	
	oEmail.value = email;
	if (!validEmailRE.test(email) && email!='')
		{blnErr=true;}
	if (blnErr && bShowAlert)
	{
		formErrorMsgBox(fieldName, msg);
		oEmail.focus();
		oEmail.select();
	}
	return blnErr;
}

//-------------------------------------------------------------------
// [RP] Validate multiple textbox or textarea elements on a form.
// version: 9-2006-02-03 [RP]
//
// ARGUMENTS:
//  objArray - contains an array of all the elements to check,
//  and is in the following format:
//  object name | Display Name | Max Length | Min Length | Validation Type | Mandatory
//  the | (pipe) is used as a seperator.
//  a value of -1 in the Max or Min length will ignore the validation
//  a value of -2 in the Min length means that it cannot be blank, but there is NO minimum value.
//  ValidationType: '' or 0 = default; 1 or N = Numeric; TT,TM,TF,TO = Telephone Number; E = Email;
//  Mandatory Y/N (optional) this overrides the min value of -2
//
// NOTES:
//  Email validation is not definitive!
//
// RETURNS:
//  true/false depending on whether an error was found. i.e. true = error found.
//  e.g. var aryForm=new Array(
//			'txtAccountName|Company Account|8|8|0',
//			'txtPostalAddress|Company Address|500|-2|0');
//
// DEPENDANCY:
//  formErrorMsgBox(..), validateTelNo(..)
//-------------------------------------------------------------------
function validateFormTextElements(objArray)
{
	var aryTemp; var objTemp;
	var strMsg='', strTemp='', objType='';
	var blnErr=false, blnObjErr=false, blnMsg=true, blnFocus=true, blnMandatory=false, blnCheckMin=true;
	var version=3;
	var isNumericRE = /(^\+?\-?\d{0,100}\.?\d{0,4}$)/;
	//var validEmailRE = /(^\w+(\.\w+)*@\w+\.\w+(\.\w+)*$)/; //v1
	//var validEmailRE = /(^[\w-.]*@[\w-]+\.\w+(\.\w+)*$)/; //v2
	var validEmailRE = /([\w\.!#\$%\-+.&]+@[\w-]+\.\w+(\.\w+)*$)/; //v3
	for (var x=0; x<objArray.length; x++)
	{
		// defaults
		version=3; blnMandatory=false; blnCheckMin=true;
		// get values
		aryTemp = objArray[x].split('|');
		// check for backwards compatible mode!
		if (aryTemp.length<6) {version=2;}
		// get object
		objTemp=document.getElementById(aryTemp[0]);
		// error check object existance
		if (objTemp!=null && objTemp!='undefined')
		{
			// error check object type
			switch (objTemp.type)
			{
				case 'text':
				case 'textarea':
					// replace all occureances of < and > in text fields
					// objTemp.value=objTemp.value.replace(/\</g, '').replace(/\>/g, '');
				case 'password':
					strTemp=objTemp.value;
					objType=aryTemp[4];
					// Mandatory check
					if (version==2 && aryTemp[3]==-2) {blnMandatory=true;}
					if (version==3 && aryTemp[5]=='Y') {blnMandatory=true;}
					// trim leading & trailing spaces and reset object to that
					objTemp.value = strTemp.replace(/^\s+/,'').replace(/\s+$/,'');
					strTemp=objTemp.value;
					// check Blank
					if(strTemp=='' && blnMandatory)
					{
						strMsg='The field cannot be left blank.';
						blnErr=true; break;
					}
					// check Max length (-1 = do not check)
					if((strTemp.length>aryTemp[2])&& (aryTemp[2]!=-1))
					{
						strMsg='The maximum length cannot exceed '+aryTemp[2]+' characters.';
						blnErr=true; break;
					}
					// check Min length (-1 = do not check)
					if (version==3 && blnMandatory==false && strTemp.length==0) {blnCheckMin=false;}
					if(blnCheckMin && (strTemp.length<aryTemp[3]) && (aryTemp[3]!=-1))
					{
						strMsg='The minimum length cannot be less than '+aryTemp[3]+' characters.';
						blnErr=true; break;
					}
					// check object Types
					switch (aryTemp[4])
					{
						case 'N': case '1':
							// new IsNumeric check via Regualr Expression.
							if(!isNumericRE.test(strTemp))
							{
								strMsg='The field must be numeric.';
								blnErr=true;
							}
							 break;
						case 'T': case 'TT': case 'TM': case 'TF': case 'TO':
							if (aryTemp[2]!=-1)
								{var blnReturnValue = validateTelNo(objTemp, aryTemp[4], aryTemp[2], '', aryTemp[1], blnMandatory);}
							else
								{var blnReturnValue = validateTelNo(objTemp, aryTemp[4], '', '', aryTemp[1], blnMandatory);}
							if (blnReturnValue)
							{
								blnMsg=false; blnFocus=false;
								blnErr=true;
							}
							break;
						case 'E':
							// new Validate Email check via Regular Expresion.
							if (!validEmailRE.test(strTemp) && strTemp!='')
							{
								strMsg='The field must be a valid email address.';
								blnErr=true;
							}
							break;
					}
					break;
				default:
					// Incorrect object type.
					strMsg='Field type \''+objTemp.type+'\' is not supported for this function';
					blnErr=true; blnObjErr=true; break;
			}
		}
		else
		{
			strMsg='Object does not exist.';
			blnErr=true; blnObjErr=true; break;
		}
		// if error then display msg & set focus to object
		if (blnErr)
		{
			if (!blnObjErr && blnFocus)
			{
				if (objTemp.style.display=='')
					{objTemp.focus();objTemp.select();}
			}
			if (blnMsg) {formErrorMsgBox(aryTemp[1], strMsg);}
			break;
		}
	}
	// return error t/f to the calling function
	return blnErr;
}
