//  http://aspn.activestate.com/ASPN/Cookbook/Rx/
//  http://regxlib.com/RETester.aspx
var PatternsDict = new Object();
var PatternsDesc = new Object();

// matches 04-35-59 
PatternsDict.uksortcode = /^[0-9]{2}[-][0-9]{2}[-][0-9]{2}$/; 
PatternsDesc.uksortcode= "32-09-56 or 04-89-54"; 

// matches alphanumeric
PatternsDict.alphanumeric = /^[a-zA-Z0-9]+$/;
PatternsDesc.alphanumeric = "Alphanumeric Format";

// matches zip codes
PatternsDict.zip = /\d{5}(-\d{4})?/;
PatternsDesc.zip = "Zip Code Format";

// matches $17.23 or $14,281,545.45 or ...
PatternsDict.currency = /\£\d{1,3}(,\d{3})*\.\d{2}/;
PatternsDesc.currency = "£99.99 or £99,999.99";

// matches 12:34 but also 75:83
PatternsDict.time = /\d{2}:\d{2}/;
PatternsDesc.time = "hh:mm";

// matches 5:04 or 05:04 or 12:34 or 23:59 but not 75:83
//PatternsDict.hhmmPat=/^([1-9]|1[0-2]):[0-5]\d$/;
PatternsDict.hhmm=/^([0-9]|[0-1][0-9]|[2][0-3]):([0-5][0-9])$/;
PatternsDesc.hhmm="hh:mm";

// matches numeric or decimal numbers
PatternsDict.nfloat=/^\d*\.?\d*$/;
PatternsDesc.nfloat="eg. 1.2, 0.4, 1 or 0";

// matches whole number only
PatternsDict.integer = /^\d*$/;
PatternsDesc.integer = "Whole number e.g 1, 2 or 18";

// matches postcode  http://regxlib.com/RETester.aspx
PatternsDict.postcode=/^[a-zA-Z]{1,2}[1-9][0-9A-Za-z]{0,1} {0,1}[0-9][A-Za-z]{2}$/;
PatternsDesc.postcode="eg. DE3 5LJ";

// matches postcode with first part padded with extra space if less than four chars
PatternsDict.paddedpostcode=/^[a-zA-Z]{1,2}[0-9][0-9A-Za-z ]{0,1} {0,1}[0-9][A-Za-z]{2}$/;
PatternsDesc.paddedpostcode="eg. DE3  5LJ";

// matches email - NOT TESTED. Can be tested here http://regxlib.com/RETester.aspx
PatternsDict.email=/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/;
PatternsDesc.email="alias@domain.co.uk";

// Verify URL
PatternsDict.url=/(http|ftp|https):\/\/[\w]+(.[\w]+)([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/;
PatternsDesc.url="http://www.domain.com";

// matches date. In the format of 01 Dec 2001 or 1 Dec 2001
PatternsDict.ddmmmyyyy=/^([0-9]|[0][1-9]|[1][0-9]|[2][0-9]|[3][0-1]) (JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec) 20[0-9][0-9]$/;
PatternsDesc.ddmmmyyyy="12 Jan 2000";

// matches date. In the format of dd/mm/yyyy
PatternsDict.mmddyyyy=/^(([1-9])|(0[1-9])|(1[0-2]))\/(([0-9])|([0-2][0-9])|(3[0-1]))\/(([0-9][0-9])|([1-2][0,9][0-9][0-9]))$/;
PatternsDesc.mmddyyyy="dd/mm/yyyy";


// matches date. In the format of dd/mm/yyyy
PatternsDict.ddmmyyyy=/^(([0-9])|([0-2][0-9])|(3[0-1]))\/(([1-9])|(0[1-9])|(1[0-2]))\/(([0-9][0-9])|([1-2][0,9][0-9][0-9]))$/;
PatternsDesc.ddmmyyyy="dd/mm/yyyy";

// matches date. In the format of dd/mm/yyyy
//PatternsDict.phone_sep=/^(\d{1,5}[\-\ ])\d{1,10}$/;
//PatternsDesc.phone_sep="eg. 01709 673787";


// <form action="funding_maint.cfm" method="post" onsubmit="return checkform(this)">
// 'required='"yes"', 'validate', 'message' - must be lowercase
//  e.g.  <input type="Text" validate="nfloat" message="Turnover" name="fund_turnover" value='#DecimalFormat(fund_turnover)#' size="10" maxlength="10" class="formentry"></td></tr>
//        <input required="yes" message="Fund Heading" type="Text" name="fund_description" value='#fund_description#' size="50" maxlength="50" class="formentry"></td></tr>
//
//
// function checkform(theform) {
//   return validateform(theform);
// }
//
function validateform(theform)
{
  var error='';
  var elArr = theform.elements; // get all elements of the form into array
  
  // for each element of the form...
  for (var i = 0; i < elArr.length; i++) {
    with (elArr[i]){              
	  var v = elArr[i].getAttribute("validate"); // get validator, if any
	  var m = elArr[i].getAttribute("message"); // get message, if any
   	  var r = elArr[i].getAttribute("required"); // get required, if any
	  var strlength = elArr[i].getAttribute("minmax"); // get strlength, if any

      if  (r=="Yes" || r=='yes' && value.length==0) {
	      error=error+ m + ": A value must be entered\n"; 
      }

	  if (v) // If 'validate' defined
	    {
		  if (value.length>0) {       		     
		      var thePat = PatternsDict[v]; // select the validating regular expr
		      var gotIt = thePat.exec(value); // run it on value of elArr[i]
		      if (!gotIt) {
		          error=error+m + ": Valid format is '" + PatternsDesc[v] + "'. You have entered '" + value +"'" + "\n"; 
			  }
		  } 
	   } // endif (v)

	  if (strlength) {  // If 'strlength' defined
		  if (value.length>0) {       		     
		      var re = new RegExp ('^.{' + strlength + '}$') ;
			  var gotIt = re.exec(value); // run it on value of elArr[i]
		      if (!gotIt) {
				var splitstr = strlength.split(",")
				  if (splitstr[0]==splitstr[1]) {
			  	     error=error+m + ': Valid entry should be ' + splitstr[0] + ' characters long\n'; 
				  } else {
			  	     error=error+m + ': Valid entry must be between ' + splitstr[0] + ' and ' + splitstr[1] +  " characters\n"; 
			      }
			  }
		  }
	  }		   

	}  // endwith
  } // endfor

  if (error != '') { 
     alert('The Following Errors have been Detected\n\n'+error+'\n'+'Please Correct'); 
	 return false; 
  } else {
     return true;
  }
}
