//Validation routines(c)Geare Info-Systems Ltd. 1998-2006
//Version 6.7.0 - 19th June 2006

//This is the uncompacted version of the Javascript Validation Routines.
//Many of the functions here are low level ones that support the higher level ones.
//Keep the entire library together of or some of the higher level ones will not work.
//The 'High Level' routines are as follows :-
//inField   - Keeps track of current field number.
//ckEmail   - Checks that an email address looks valid.
//ckText    - Validates text strings
//ckNumber  - Validates numeric input
//ckTelNo   - Checks telephone number format fields
//ckSDate	  - Checks whole date fields DD/MM/YY or DD/MM/YYYY

var ErrCon = 0;
var fldFocus = 1;
var fldLast;

var defaultEmptyOK = false;

function makeArray(n) {
for (var i = 1; i <= n; i++) {this[i] = 0} return this}

var daysInMonth = makeArray(12);
daysInMonth[1] = 31;
daysInMonth[2] = 29;
daysInMonth[3] = 31;
daysInMonth[4] = 30;
daysInMonth[5] = 31;
daysInMonth[6] = 30;
daysInMonth[7] = 31;
daysInMonth[8] = 31;
daysInMonth[9] = 30;
daysInMonth[10] = 31;
daysInMonth[11] = 30;
daysInMonth[12] = 31;

function isEmpty(s)
{return ((s == null) || (s.length == 0))}

function isDigit(c) //fun2
{return((c>="0")&&(c<="9"))}

function isInteger (s)
{var i;
if (isEmpty(s)) 
if (isInteger.arguments.length == 1) return defaultEmptyOK;
else return (isInteger.arguments[1] == true);
for (i = 0; i < s.length; i++)
{var c = s.charAt(i);
if (!isDigit(c)) return false;}
return true;}

function isSignedInteger (s)
{if (isEmpty(s)) 
if (isSignedInteger.arguments.length == 1) return defaultEmptyOK;
else return (isSignedInteger.arguments[1] == true);
else {
var startPos = 0;
var secondArg = defaultEmptyOK;
if (isSignedInteger.arguments.length > 1)
secondArg = isSignedInteger.arguments[1];
if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") )
startPos = 1;    
return (isInteger(s.substring(startPos, s.length), secondArg))}}

function isNonnegativeInteger (s)
{var secondArg = defaultEmptyOK;
if (isNonnegativeInteger.arguments.length > 1)
secondArg = isNonnegativeInteger.arguments[1];
return (isSignedInteger(s, secondArg)
&& ( (isEmpty(s) && secondArg)  || (parseInt (s) >= 0) ) );}

function isIntegerInRange (s, a, b)
{if (isEmpty(s)) 
if (isIntegerInRange.arguments.length == 1) return defaultEmptyOK;
else return (isIntegerInRange.arguments[1] == true);
if (!isInteger(s, false)) return false;
var num = parseInt (s);
return ((num >= a) && (num <= b));}

function isLetter (c)  //fun7
{return ((( c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z")))}

function isYear (s)
{if (isEmpty(s)) 
if (isYear.arguments.length == 1) return defaultEmptyOK;
else return (isYear.arguments[1] == true);
if (!isNonnegativeInteger(s)) return false;
return ((s.length == 2) || (s.length == 4));}

function isAlphaNumSpc (s)
{var i; for (i = 0; i < s.length; i++)
{var c = s.charAt(i);if (! (isLetter(c) || isDigit(c) || (c==" ")) ) return false; } return true;}

function isAlphaNumeric (s)
{var i; for (i = 0; i < s.length; i++)
{var c = s.charAt(i); if (! (isLetter(c) || isDigit(c)) ) return false; } return true;}

function isAlphaOnly (s)
{var i; for (i = 0; i < s.length; i++)
{var c = s.charAt(i); if (! isLetter(c) ) return false; } return true;}

function isAlphaSpc (s)
{var i; for (i = 0; i < s.length; i++)
{var c = s.charAt(i); if (! (isLetter(c) || (c==" "))) return false; } return true;}

function isNumerical (s)
{var i; for (i = 0; i < s.length; i++)
{var c = s.charAt(i); if (! (isDigit(c) || (c==".") || (c=="+") || (c=="-") || (c==",")))
return false; } return true;}

function isTelephonic (s)
{var i; for (i = 0; i < s.length; i++)
{var c = s.charAt(i); if (! (isDigit(c) || (c=="+") || (c==" ") || (c=="(") || (c==")")))
return false; } return true;}

function isYesNo (s)
{var i; var c = s.charAt(0);
if (! ((c=="Y") || (c=="y") || (c=="n") || (c=="N"))) {return false;} return true;}

function isQuoteless (s)
{var i; for (i = 0; i < s.length; i++)
{var c = s.charAt(i); if (c=="'") return false; } return true;}

function isMonth (s)
{if (isEmpty(s)) 
if (isMonth.arguments.length == 1) return defaultEmptyOK;
else return (isMonth.arguments[1] == true);
return isIntegerInRange (s, 1, 12);}

function isDay (s)
{if (isEmpty(s)) 
if (isDay.arguments.length == 1) return defaultEmptyOK;
else return (isDay.arguments[1] == true);   
return isIntegerInRange (s, 1, 31);}

function daysInFebruary (year)
{ return (  ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );}

function isDate (year, month, day)
{if (! (isYear(year, false) && isMonth(month, false) && isDay(day, false))) return false;
var intYear = parseInt(year);
var intMonth = parseInt(month);
var intDay = parseInt(day);
if (intDay > daysInMonth[intMonth]) return false; 
if ((intMonth == 2) && (intDay > daysInFebruary(intYear))) return false;
return true;}

function DaysSinceFirstJan1900(dd,mm,yy)
{var days;
 if (yy>1900) {yy=yy-1900}
 days=((yy)*365) + parseInt(yy/4) + dd;
 if (mm==1) days=days+0;
 if (mm==2) days=days+31;
 if (mm==3) days=days+59;
 if (mm==4) days=days+90;
 if (mm==5) days=days+120;
 if (mm==6) days=days+151;
 if (mm==7) days=days+181;
 if (mm==8) days=days+212;
 if (mm==9) days=days+243;
 if (mm==10) days=days+273;
 if (mm==11) days=days+304;
 if (mm==12) days=days+334;
 return days;
}

function formatNumber(MyNum,DecPlaces,MoneySymbol)
{
var NumValue;
var p;
var m;
var n;
var NewStr;

//Ensure number is in string form
NumValue=MyNum.toString();

//If not a number, default to zero
if(NumValue=="NaN"){NumValue="0"}

//Set pointer to position of decimal point
p=NumValue.lastIndexOf('.');

//Initialise return string to empty
NewStr='';

if(p!=-1)
{
	//if decimal point in string, set required no of dec places
	for(m=p+1;m<p+DecPlaces+1;m++)
	{
		NewStr=NewStr+NumValue.charAt(m);
	}
	if(NewStr.length<DecPlaces)
	{
		NewStr=NewStr+'0'
	}
}
else
{
	//if no decimalpoint in string, add required no of dec places
	if (DecPlaces>0)
	{
		NewStr='.';
		for(m=0;m<DecPlaces;m++)
		{
			NewStr=NewStr+'0'
		}
	}
	p=NumValue.length;
}
n=0;
//Add formatting commas
for(m=p;m>-1;m--)
{
	if(n==4)
	{
		NewStr=','+NewStr;
		n=1
	}
	NewStr=NumValue.charAt(m)+NewStr;
	n=n+1;
}
//If MoneySymbol present, prefix number with it
if(MoneySymbol.length!=0)
{
	NewStr=MoneySymbol+NewStr
}

return NewStr
}


function inField(FieldNo)
{fldLast=fldFocus;fldFocus=FieldNo}

function ckEmail(FormRef,FieldNo,ImgRef,EmailAddr,MaxLen,Mand,Mode)
{var atcnt=0;var fldValid=0;
 if ((ErrCon==0) || (ErrCon==FieldNo))
 {
  if (! isQuoteless(EmailAddr)) {fldValid=50}
  if (! isAlphaNumeric(EmailAddr.charAt(EmailAddr.length-1))) {fldValid=49}
  if (! isAlphaNumeric(EmailAddr.charAt(0))) {fldValid=48}
  if (EmailAddr.charAt(EmailAddr.length-1) == "@") {fldValid=37}
  if (EmailAddr.charAt(0) == "@") {fldValid=36}
  if (EmailAddr.charAt(0) == ".") {fldValid=35}
  if (EmailAddr.charAt(EmailAddr.length-1) == ".") {fldValid=34}
  for (i = 0; i < EmailAddr.length; i++) {var c = EmailAddr.charAt(i); if (c=="@") atcnt++; }if (atcnt >= 2) {fldValid=33}
  if (EmailAddr.length < 7) {fldValid=24}
  if (EmailAddr.length > MaxLen) {fldValid=23}
  if (EmailAddr.indexOf(".") == -1) {fldValid=6}
  if (EmailAddr.indexOf("!") != -1) {fldValid=5}
  if (EmailAddr.indexOf("#") != -1) {fldValid=4}
  if (EmailAddr.indexOf(",") != -1) {fldValid=3}
  if (EmailAddr.indexOf("@") == -1) {fldValid=2}
  if ((EmailAddr == "") && (Mand=="Y")) {fldValid=1}
  if ((EmailAddr == "") && (Mand=="N")) {fldValid=0}
  if (fldValid==0)
  {
  if((Mode==1)||(Mode==2)){document.images[ImgRef].src='alerts/noalert.gif'; ErrCon=0; return 0}
  if(Mode==3){var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertGood"); ErrCon=0; return 0;}
  }
  else
  {
   if (Mode==3){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertBad");}; 
   if (Mode==2) {document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/plug.gif'}
   if (Mode==1) {document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/alert'+fldValid+'.gif'}
  }
  if ((Mode==0)||(Mode==4)||(Mode==5)) {return fldValid}
 }
}


function ckText(FormRef,FieldNo,ImgRef,InText,VRule,MaxLen,NCase,Mand,Mode)
{var fldValid=0;var TmpStr; var c;
 if ((ErrCon==0) || (ErrCon==FieldNo))
 {
  if (VRule=="X") {if (! isAlphaNumSpc(InText)) {fldValid=51;}}
  if (VRule=="Y") {if (! isAlphaSpc(InText)) {fldValid=52;}}
  if (VRule=="A") {if (! isAlphaOnly(InText)) {fldValid=19;}}
  if (VRule=="N") {if (! isAlphaNumeric(InText)) {fldValid=20;}}
  if (VRule=="B") {if (! isYesNo(InText)) {fldValid=21;}}
  if (VRule=="Q") {if (! isQuoteless(InText)) {fldValid=50;}}
  if (InText!='') {if (InText.length > MaxLen) {fldValid=23;}}
  if ((InText=='') && (Mand=="Y")) {fldValid=1;}
  if (fldValid==0)
    {
    if (NCase=='U') {document.forms[FormRef].elements[FieldNo].value=InText.toUpperCase()}
    if (NCase=='L') {document.forms[FormRef].elements[FieldNo].value=InText.toLowerCase()}
    if (NCase=='F') {c=InText.charAt(0);TmpStr=c.toUpperCase();for (i = 1; i < InText.length; i++){c=InText.charAt(i);TmpStr=TmpStr+c.toLowerCase()}document.forms[FormRef].elements[FieldNo].value=TmpStr}
    if (NCase=='I') {c=InText.charAt(0);TmpStr=c.toUpperCase();for (i = 1; i < InText.length; i++){c=InText.charAt(i);if ((InText.charAt(i-1)==' ') || (InText.charAt(i-1)=='-')){TmpStr=TmpStr+c.toUpperCase()}else {TmpStr=TmpStr+c.toLowerCase()}} document.forms[FormRef].elements[FieldNo].value=TmpStr}
    if ((Mode==1)||(Mode==2)){document.images[ImgRef].src='alerts/noalert.gif'};
    if (Mode==3){var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertGood");}; 
    ErrCon=0;
    return 0
    }
  else
  {
   if (Mode==3){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertBad");} 
   if (Mode==2){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/plug.gif'}
   if (Mode==1){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/alert'+fldValid+'.gif'}
   if ((Mode==0)||(Mode==4)||(Mode==5)) {return fldValid}
  }
 }
}

function ckNumber(FormRef,FieldNo,ImgRef,NumValue,LoVal,HiVal,NumType,Format,MoneySymbol,Mand,Mode)
//NumType:I=int,F=float
//Format:no. of decimal places to show
//MoneySymbol:String prefix to show if currency, e.g. '£'
{var fldValid=0;var MyNum;var TmpStr='';var p;var m;var NewStr;var n;

p=NumValue.length;
if (NumValue.charAt(p-1)=="m") {p--;m=1}
if (NumValue.charAt(p-1)=="k") {p--;m=2}

//filter out any commas and money symbol
for (i=0;i<p;i++)
	{if ((NumValue.charAt(i)!=',') && (NumValue.charAt(i)!=MoneySymbol))
		{TmpStr=TmpStr+NumValue.charAt(i)}
	}
NumValue=TmpStr;
 if ((ErrCon==0) || (ErrCon==FieldNo))
 {
  if ((NumValue == "") && (Mand=="Y")) {fldValid=1;}
  if (NumValue != null)
  {
   if (! isNumerical(NumValue))
    {fldValid=14}
   else
   {
    if ((LoVal != 0) || (HiVal != 0))
    {
     MyNum=parseFloat(NumValue,10);
     if (m==1){MyNum=MyNum*1000000}
     if (m==2){MyNum=MyNum*1000}
	 NumValue = MyNum.toString();
     if (NumType=="I") {MyNum = parseInt(NumValue,10)}
                  else {MyNum = parseFloat(NumValue,10)}
     if ((MyNum > HiVal) || (MyNum < LoVal)) {fldValid=16}
    }
   }
  }

  if (fldValid==0)
    {
    if ((Mode==1)||(Mode==2)){document.images[ImgRef].src='alerts/noalert.gif'};
    if (Mode==3){var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertGood");}; 
    NumValue = MyNum.toString();
    NewStr=formatNumber(NumValue,Format,MoneySymbol);
    //                    pip4    pip8     pip9
    ErrCon=0;
    document.forms[FormRef].elements[FieldNo].value=NewStr; 
    return 0
    }
  else
  {
   if (Mode==3){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertBad");}; 
   if (Mode==2){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/plug.gif'}
   if (Mode==1){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/alert'+fldValid+'.gif'}
   if ((Mode==0)||(Mode==4)||(Mode==5)) {return fldValid}
  }
 }
}

function ckNumber2(FormRef,FieldNo,ImgRef,NumValue,LoVal,HiVal,NumType,Mand,Mode)
{var fldValid=0;var MyNum;var TmpStr='';var p;var m;var NewStr;var n;

p=NumValue.length;
if (NumValue.charAt(p-1)=="m") {p--;m=1}
if (NumValue.charAt(p-1)=="k") {p--;m=2}

for (i=0;i<p;i++)
	{if (NumValue.charAt(i)!=',')
		{TmpStr=TmpStr+NumValue.charAt(i)}
	}
NumValue=TmpStr;

 if ((ErrCon==0) || (ErrCon==FieldNo))
 {
  if ((NumValue == "") && (Mand=="Y")) {fldValid=1;}
  if (NumValue != null)
  {
   if (! isNumerical(NumValue))
    {fldValid=14}
   else
   {
    if ((LoVal != 0) || (HiVal != 0))
    {
     MyNum=parseFloat(NumValue,10);
     if (m==1){MyNum=MyNum*1000000}
     if (m==2){MyNum=MyNum*1000}
	 NumValue = MyNum.toString();
     if (NumType=="I") {MyNum = parseInt(NumValue,10)}
                  else {MyNum = parseFloat(NumValue,10)}
     if ((MyNum > HiVal) || (MyNum < LoVal)) {fldValid=10}
    }
   }
  }

  if (fldValid==0)
    {
    if ((Mode==1)||(Mode==2)){document.images[ImgRef].src='alerts/noalert.gif'};
    if (Mode==3){var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertGood");}; 
    NumValue = MyNum.toString();
    ErrCon=0;
    return 0
    }
  else
    {
    if (Mode==3){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertBad");}; 
    if (Mode==2){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/plug.gif'}
    if (Mode==1){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/alert'+fldValid+'.gif'}
    if ((Mode==0)||(Mode==4)||(Mode==5)) {return fldValid}
    }
 }
}


function ckTelNo(FormRef,FieldNo,ImgRef,InTelNo,MaxLen,Mand,Mode)
{var fldValid=0;
 if ((ErrCon==0) || (ErrCon==FieldNo))
 {
  if ((InTelNo == "") && (Mand=="Y")) {fldValid=1;}
  if (! isTelephonic(InTelNo)) {fldValid=13;}
  if (InTelNo.length > MaxLen) {fldValid=23;}
  if (fldValid==0)
    {
    if ((Mode==1)||(Mode==2)){document.images[ImgRef].src='alerts/noalert.gif'};
    if (Mode==3){var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertGood");}; 
    ErrCon=0;
    return 0
    }
  else
  {
   if (Mode==3){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertBad");}; 
   if (Mode==2){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/plug.gif'}
   if (Mode==1){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/alert'+fldValid+'.gif'}
   if ((Mode==0)||(Mode==4)||(Mode==5)) {return fldValid}
  }
 }
}



function ckSDate(FormRef,FieldNo,ImgRef,InDate,CompDate1,CompDate2,Format,VRule,Mand,Mode)
{
 var dd=null; var mm=null; var yy=null; var yylen=0; var fldValid=0;
 var intdate=0;
 var c1IntDate=0; var c1yy=0; var c1mm=0; var c1dd=0;
 var c2IntDate=0; var c2yy=0; var c2mm=0; var c2dd=0;
 var tdy = new Date(); var i=0;     var c=null; var e=1; var tdd=null;
 mm=""; dd=""; yy=""; tdd=""; var d="";
 var vldChr=false;
 var tmpstr="";
 var YearNow;
 YearNow=tdy.getFullYear();
 
 if ((ErrCon==0) || (ErrCon==FieldNo))
 {
  if (Format==0) {InDate=InDate+' 2004'}
  if (Format==1) {Indate=InDate+' '+tdy.getFullYear()}
  
  //v614 remove st,nd,rd ,th
  for (i=0;i<(InDate.length-1);i++)
  {c=InDate.charAt(i)+InDate.charAt(i+1);
   d=InDate.charAt(i);
   c=c.toUpperCase();
   if ((c=='ST')||(c=='ND')||(c=='RD')||(c=='TH'))
    {i=i+1}
    else
    {tmpstr=tmpstr+d}
  }
  i=InDate.length;
  d=InDate.charAt(i-1);
  tmpstr=tmpstr+d;
  InDate=tmpstr;
  tmpstr="";

  //614 insert separators on Digit/Letter boundries if none exist
  for (i=0;i<(InDate.length-1);i++)
  {c=InDate.charAt(i);
   d=InDate.charAt(i+1);
   tmpstr=tmpstr+c;
   if ((isDigit(c) && isLetter(d)) || (isLetter(c) && isDigit(d)))
   {tmpstr=tmpstr+"/"}
  }
  tmpstr=tmpstr+d;
  InDate=tmpstr; 
  tmpstr="";

  //Strip out leading and multiple separators v613
  for (i=0;i<InDate.length;i++)
  {c = InDate.charAt(i);
   if (isDigit(c) || isLetter(c))
   {
    vldChr=true;
    tmpstr=tmpstr+c
   }
   else
   {
    if (vldChr==true)
    {
     tmpstr=tmpstr+"/";
     vldChr=false
    }
   }
  }  
  InDate=tmpstr; 
  tmpstr="";
	
  for (i=0;i<InDate.length;i++)
  {
   c = InDate.charAt(i);
   if (isDigit(c) || isLetter(c))
   {
    if (e==1) {dd=dd+c}
    if (e==2) {mm=mm+c}
    if (e==3) {yy=yy+c}
   }
   else {e=e+1};
  }

  c=dd.charAt(0);
  if (isLetter(c)) {tdd=dd;dd=mm;mm=tdd}

  tdd="";
  for (i=0;i<dd.length;i++)
  {
   c = dd.charAt(i);
   if (isDigit(c)) {tdd=tdd+c};
  }
  dd=tdd;

  c=mm.charAt(0);
  if (isLetter(c))
  {
   tdd=mm.charAt(0)+mm.charAt(1);
   tdd=tdd.toUpperCase();
   if ((tdd=='JU') || (tdd=='MA'))
   {
    tdd=tdd+mm.charAt(2);
    tdd=tdd.toUpperCase()
   };
   mm='0';
   if (tdd=='JA') {mm='1'}    if (tdd=='FE') {mm='2'}    if (tdd=='MAR') {mm='3'}
   if (tdd=='AP') {mm='4'}    if (tdd=='MAY'){mm='5'}    if (tdd=='JUN') {mm='6'}
   if (tdd=='JUL'){mm='7'}    if (tdd=='AU') {mm='8'}    if (tdd=='SE') {mm='9'}
   if (tdd=='OC') {mm='10'}   if (tdd=='NO') {mm='11'}   if (tdd=='DE') {mm='12'}
  }

  //if unambiguous wrong US/UK format, swap date and month elements
  if((mm>12)&&(dd<13)){e=mm;mm=dd;dd=e}

  //615 if dd or mm 2digits with leading 0, drop the 0.
  if ((mm.length==2) && (mm.charAt(0)=='0')) {mm=mm.charAt(1);}
  if ((dd.length==2) && (dd.charAt(0)=='0')) {dd=dd.charAt(1);}

  //If 2 digit year make up to 4 digits
  if (((Format==2) || (Format==3)) && (yy.length==2))
  {
   if (parseInt(yy)<52)
    {yy='20'+yy}
   else
    {yy='19'+yy}
  }
  yylen=yy.length;
  

  //SETUP COMPARE DATE 1 (TODAY IF BLANK)
  //=====================================
  if (CompDate1=='')
  {
   c1yy=tdy.getYear();
   if (yylen==4) c1yy=tdy.getFullYear();
   c1mm=tdy.getMonth()+1;
   c1dd=tdy.getDate();
  }
  else
  {
   e=1;
   c1dd='';
   c1mm='';
   c1yy='';
   for (i=0;i<CompDate1.length;i++)
   {
    c = CompDate1.charAt(i);
    if (isDigit(c) || isLetter(c))
    {
     if (e==1) {c1dd=c1dd+c}
     if (e==2) {c1mm=c1mm+c}
     if (e==3) {c1yy=c1yy+c}
    }
    else {e=e+1}
   }
   c=c1mm.charAt(0);
   if (isLetter(c))
   {
    tdd=(c1mm.charAt(0))+(c1mm.charAt(1))+(c1mm.charAt(2));
    tdd=tdd.toUpperCase();
    c1mm='0';
    if (tdd=='JAN') {c1mm='1'}  if (tdd=='FEB') {c1mm='2'}  if (tdd=='MAR') {c1mm='3'}
    if (tdd=='APR') {c1mm='4'}  if (tdd=='MAY') {c1mm='5'}  if (tdd=='JUN') {c1mm='6'}
    if (tdd=='JUL') {c1mm='7'}  if (tdd=='AUG') {c1mm='8'}  if (tdd=='SEP') {c1mm='9'}
    if (tdd=='OCT') {c1mm='10'} if (tdd=='NOV') {c1mm='11'} if (tdd=='DEC') {c1mm='12'}
   }
  }

  //SETUP COMPARE DATE 2 (TODAY IF BLANK)
  //=====================================
  if (CompDate2=='')
  {
   c2yy=tdy.getYear();
   if (yylen==4) c2yy=tdy.getFullYear();
   c2mm=tdy.getMonth()+1;
   c2dd=tdy.getDate();
  }
  else
  {
   e=1;
   c2dd='';
   c2mm='';
   c2yy='';
   for (i=0;i<CompDate2.length;i++)
   {
    c = CompDate2.charAt(i);
    if (isDigit(c) || isLetter(c))
    {
     if (e==1) {c2dd=c2dd+c}
     if (e==2) {c2mm=c2mm+c}
     if (e==3) {c2yy=c2yy+c}
    }
    else {e=e+1}
   }
   c=c2mm.charAt(0);
   if (isLetter(c))
   {
    tdd=(c2mm.charAt(0))+(c2mm.charAt(1))+(c2mm.charAt(2));
    tdd=tdd.toUpperCase();
    c2mm='0';
    if (tdd=='JAN') {c2mm='1'}  if (tdd=='FEB') {c2mm='2'}  if (tdd=='MAR') {c2mm='3'}
    if (tdd=='APR') {c2mm='4'}  if (tdd=='MAY') {c2mm='5'}  if (tdd=='JUN') {c2mm='6'}
    if (tdd=='JUL') {c2mm='7'}  if (tdd=='AUG') {c2mm='8'}  if (tdd=='SEP') {c2mm='9'}
    if (tdd=='OCT') {c2mm='10'} if (tdd=='NOV') {c2mm='11'} if (tdd=='DEC') {c2mm='12'}
   }
  }

  //MAKE COMPARISONS TO EVALUATE VALIDITY OF INPUT
  //==============================================
  if ((InDate=="") && (Mand=='Y')) {fldValid=1}
  if ((fldValid==0) && (! isDate(yy,mm,dd))) {fldValid=12}
  if ((fldValid==0) && (Format == 4) && (yylen != 4)) {fldValid=59}
  if ((InDate!="") && (fldValid==0) && ((VRule=='A') || (VRule=='B') || (VRule=='H') || (VRule=='F') || (VRule=='X') || (VRule=='I') || (VRule=='O')))
  {
   intdate=DaysSinceFirstJan1900(parseInt(dd),parseInt(mm),parseInt(yy));
   c1IntDate=DaysSinceFirstJan1900(parseInt(c1dd),parseInt(c1mm),parseInt(c1yy));
   c2IntDate=DaysSinceFirstJan1900(parseInt(c2dd),parseInt(c2mm),parseInt(c2yy));
   //msg=intdate+'  /  '+c1IntDate+'  /  '+c2IntDate;
   //alert(msg);
   if ((VRule=='H') && (intdate>=c1IntDate)) {fldValid=54}
   if ((VRule=='B') && (intdate>c1IntDate)) {fldValid=58}
   if ((VRule=='A') && (intdate<c1IntDate)) {fldValid=57}
   if ((VRule=='F') && (intdate<=c1IntDate) && (CompDate=='')) {fldValid=55}
   if ((VRule=='F') && (intdate<=c1IntDate) && (CompDate!='')) {fldValid=18}
   if ((VRule=='X') && (intdate==c1IntDate)) {fldValid=56}
   if ((VRule=='I') && ((intdate<c1IntDate) || (intdate>c2IntDate))) {fldValid=62}
   if ((VRule=='O') && ((intdate>c1IntDate) && (intdate<c2IntDate))) {fldValid=62}
  }
  if ((InDate=="") && (Mand=='N')) {fldValid=0}

  //DISPLAY VALIDITY TO USER
  //========================
  if (fldValid==0) 
  {
   if ((Mode==1)||(Mode==2)){document.images[ImgRef].src='alerts/noalert.gif'}; 
   if (Mode==3){var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertGood");}; 
   ErrCon=0; 
   if (mm=='1') {tdd='JAN'}  if (mm=='2') {tdd='FEB'}  if (mm=='3') {tdd='MAR'}
   if (mm=='4') {tdd='APR'}  if (mm=='5') {tdd='MAY'}  if (mm=='6') {tdd='JUN'}
   if (mm=='7') {tdd='JUL'}  if (mm=='8') {tdd='AUG'}  if (mm=='9') {tdd='SEP'}
   if (mm=='10'){tdd='OCT'}  if (mm=='11'){tdd='NOV'}  if (mm=='12'){tdd='DEC'}
   c=dd+' '+tdd;
   if (Format>1) {c=c+' '+yy};
   document.forms[FormRef].elements[FieldNo].value=c;
   return 0
  }
  else
  {
   if (Mode==3){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertBad");}; 
   if (Mode==2){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/plug.gif'}
   if (Mode==1){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/alert'+fldValid+'.gif'}
   if ((Mode==0)||(Mode==4)||(Mode==5)) {return fldValid}
  }
 }
}



function ckTime(FormRef,FieldNo,ImgRef,InTime,Format,Mand,Mode)
{var tmpstr='';
 var c;
 var hh=''; 
 var mm=''; 
 var ap=''; 
 var e=1;
 var fldValid=0; 
 var i=0; 
 var vldChr=true;
 
 if ((ErrCon==0) || (ErrCon==FieldNo))
 {
	 if (InTime.length<3)
		{fldValid=24}
	 else
	 {
		//Change all Non-AlphaNums to '/'s
		for (i=0;i<(InTime.length);i++)
		{c=InTime.charAt(i);
		 if (isAlphaNumeric(c)) {tmpstr=tmpstr+c}
		 else {tmpstr=tmpstr+'/'}
		}
		InTime=tmpstr;
		tmpstr="";
		
		//Add separators between numbers and letters
		for (i=0;i<(InTime.length-1);i++)
		{c=InTime.charAt(i);
		 d=InTime.charAt(i+1);
		 tmpstr=tmpstr+c;
		 if ((isDigit(c) && isLetter(d)) || (isLetter(c) && isDigit(d)))
			{tmpstr=tmpstr+"/"}
		}
		tmpstr=tmpstr+d;
		InTime=tmpstr;
		tmpstr="";

		//Strip out leading and multiple separators
		for (i=0;i<InTime.length;i++)
		{c = InTime.charAt(i);
	   	 if (isDigit(c) || isLetter(c))
		 {
		  vldChr=true;
		  tmpstr=tmpstr+c
		 }
	     else
	     {
	      if (vldChr==true)
	      {tmpstr=tmpstr+"/";
	       vldChr=false
	      }
	     }
	    }  
		InTime=tmpstr; 
		tmpstr="";
		
		//Breakdown	
		{for (i=0;i<InTime.length;i++)
		 {c = InTime.charAt(i);
		  if (isDigit(c) || isLetter(c))
		    {if (e==1) {hh=hh+c};
		     if (e==2) {mm=mm+c};
		     if (e==3) {ap=ap+c}}
		  else {e=e+1};}}

		//Make ap one uppercased character only
		if (ap.length>0) {ap=ap.charAt(0);ap=ap.toUpperCase()}
		
		//if entered in hhmm notation split into hh:mm notation
		if ((mm.length==0)&&(ap.length==0)&&(hh.length!=0)) 
		{
		 ap=mm.charAt(0);
		 ap=ap.toUpperCase();
		 mm=hh%100;
		 hh=parseInt(hh/100);
		 if(mm.length<2){mm='0'+mm}
		}	

		//if entered in hhap notation e.g. 1am split into hh:00:ap notation
		if ((!isNumerical(mm))&&(ap=='')) 
		{
		 ap=mm.charAt(0);
		 ap=ap.toUpperCase();
		 mm='00'
		}

		//if hh is 0 or hh>12 make ap nothing
		if ((parseInt(hh)==0) || (parseInt(hh)>12)) ap='';	
	 }
	//if not a* or p* entered in ap reject
	if ((ap.length>0) && (ap.charAt(0)!='A') && (ap.charAt(0)!='P')) {fldValid=25}

	//if hour not in range 0..23 reject
	if ((hh<0)||(hh>23)) {fldValid=25}

	//if mins not in range 0..59 reject
	if ((mm<0)||(mm>59)) {fldValid=25}

	//if not Mandatory and not entered, allow entry
	if ((InTime=='') && (Mand=='N')) {fldValid=0}

	if (fldValid==0)
	{
	 if ((Mode==1)||(Mode==2)){document.images[ImgRef].src='alerts/noalert.gif'};
   if (Mode==3){var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertGood");}; 
	 ErrCon=0;
	 if (ap.length==0)
	 {
	  if(hh<12)
		{ap='A'}
	  else
		{ap='P'}
	 }
	 if (ap=='A')
		{ap='am'}
	 else
		{ap='pm'}
	 mm=mm.toString();
	 if (Format=='C')
	 {
	   if (hh>12) {hh=parseInt(hh)-12};
	   hh=hh.toString();
	   if (hh.length<2) {hh='0'+hh}
	   if (hh.length<2) {hh='0'+hh}
	   if (mm.length<2) {mm='0'+mm}
	   if (mm.length<2) {mm='0'+mm}
	   tmpstr=hh+':'+mm+' '+ap;}
	 else
	 {
		if ((hh<12)&&(ap=='pm'))
			{hh=parseInt(hh)+12}
		if ((hh==12) && (ap=='am')) hh='0';
		hh=hh.toString();
		if (hh.length<2) {hh='0'+hh}
		if (hh.length<2) {hh='0'+hh}
		if (mm.length<2) {mm='0'+mm}
		if (mm.length<2) {mm='0'+mm}
		tmpstr=hh+':'+ mm
	 }
	 document.forms[FormRef].elements[FieldNo].value=tmpstr;
	 return 0}
	else
	{
   if (Mode==3){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	var n=document.forms[FormRef].elements[FieldNo].name;var f=document.getElementById(n);f.setAttribute("className","AlertBad");}; 
	 if (Mode==2){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/plug.gif'}
	 if (Mode==1){document.forms[FormRef].elements[FieldNo].focus();	ErrCon=FieldNo;	window.document.images[ImgRef].src='alerts/alert'+fldValid+'.gif'}
	 if ((Mode==0)||(Mode==4)||(Mode==5)) {return fldValid}
	}
  }
}
