//(c)Alexander Barnard 2000-2008
//--------------------------------------------------------------------------------
var CONST_FORMAT_POSTCODE="A"
var CONST_FORMAT_BOOLEAN="B"
var CONST_FORMAT_CHARACTER="C"
var CONST_FORMAT_DATE="D"
var CONST_FORMAT_EMAIL="E"
var CONST_FORMAT_FLOAT="F"
var CONST_FORMAT_USERNAME="G"
var CONST_FORMAT_ID="I"
var CONST_FORMAT_FILE="L"
var CONST_FORMAT_MEMO="M"
var CONST_FORMAT_INT="N"
var CONST_FORMAT_OPTION="O"
var CONST_FORMAT_PHONE="P"
var CONST_FORMAT_SMALLINT="S"
var CONST_FORMAT_TIME="T"
var CONST_FORMAT_URL="U"
var CONST_FORMAT_IMAGEPATH="V"
var CONST_FORMAT_IGNORE="X"
var CONST_FORMAT_YESNO="Y"

var CONST_FORM_FIELD_ID="Field"
var CONST_FORM_KEEP_FIELD="B8_KeepRecord"
var JAVASCRIPT_CHECK_FIELD="X8_JavaProcessed"
var CONST_HTTP_REFERER_FIELD="X8_HTTP_REFERER"
var CONST_HTTP_REFERER_QS="X8_HTTP_REFERER_QS"
var LIMIT_TO_THESE_CHARS=""

var g_blur=0

function _testBit(me,iBit){
	return (parseInt(me.name.substr(1,1),16)&iBit)!=0
}	
//--------------------------------------------------------------------------------
function _FIELDkeyDown(it,e){
	var c=_keyCode(e)
	it._keyPressed=(_format(it)!=CONST_FORMAT_IGNORE)
	return it._keyPressed
}
function _FIELDkeyPress(me,e,parseChars,param,param2){
	if(me._keyPressed==false)
		return false

	//get keypressed	
	var c = _keyCode(e)

	var cc=String.fromCharCode(c)
	var meFMT=_format(me)

	_msg((e.altKey?'ALT+':'')+(e.ctrlKey?'CTRL+':'')+(e.shiftKey?'SHIFT+':'')+cc+' ('+c+')',2)
//alert(c)
	if(c==8||c==9||c==0||e.ctrlKey||e.altKey)
		return true
	
	if(parseChars)
		if(!eval("/["+parseChars+"]/.test(cc)"))
			return false

	switch(meFMT){
		case CONST_FORMAT_IGNORE:
			return false
		case CONST_FORMAT_TIME:
			return /[\dpam:.]/i.test(cc)
		case CONST_FORMAT_DATE:
			if(/[\d,.\/]/.test(cc)){
				c=me.value.match(/\D/g)
				if(c)
					if(c.length>1)
						return /\d/.test(cc)
				return true			
			}
			return false
		case CONST_FORMAT_USERNAME:
			return /[\w-]/.test(cc)
		case CONST_FORMAT_POSTCODE:
			return /\w+|\s+/.test(cc)
		case CONST_FORMAT_PHONE:
			return /[\d ext\/]/.test(cc)
		case CONST_FORMAT_EMAIL:
			return /[\w\.@\-&']/.test(cc)
		case CONST_FORMAT_URL:
		case CONST_FORMAT_IMAGEPATH:
			return /[\w:\/\.\-&%?=]/.test(cc)
		case CONST_FORMAT_CHARACTER:
			return true
		case CONST_FORMAT_INT:
			return /[\d,]/.test(cc)
		case CONST_FORMAT_SMALLINT:
			return /\d/.test(cc)
		case CONST_FORMAT_MEMO:
			if(param<0)
				return true
			if(param2)
				return (me.value.length<param)
			else	
				return (me.value.split(/\w/g).length<=param)
		case CONST_FORMAT_FLOAT:
			if(/[-\d,.]/.test(cc))
				if(c==45)//check if neg
					return !/\-/i.test(me.value)
				if(c==46)//check if decimal point added
					return !/\./i.test(me.value)
				else	
					return true	
	}
	return false
}
function _getFieldName(me){
	return "["+me.title+"]"
}
function _FIELDupperCase(me){
	me.value=me.value.toUpperCase()
	return true
}
function _FIELDlowerCase(me){
	me.value=me.value.toLowerCase()
	return true
}
function _FIELDfirstUpper(it){
	var txt=it.value
	if(!/[a-z]/.test(txt))txt=txt.toLowerCase()
	it.value=txt.replace(/(\w)(\w+)?(')?(\w+)?/g,function(a,b,c,d,e){
//alert(a+"\nb:"+b+"\nc:"+c+"\nd:"+d+"\ne:"+e+"\nf:"+f+"\ng:"+g)
	if(/^(at|and|en|for|in|is|it|le|of|or|s|to)$/i.test(a))return a
	if(!d)d=""
	if(!c)c=""
	if(!e)e=""
	if(e.length>1)e=e.substr(0,1).toUpperCase()+e.substr(1)
	return b.toUpperCase()+c+d+e
	})
	return true
}
//====CHECKS==========
function fnChkNumber(me,pReq){
	var ok=true
	var f=_format(me)
	var n=_getFieldName(me)
	var v=me.value
	
	if(!v&&!pReq)
		return true
	v=v.replace(/,/g,"")
	if(f!=CONST_FORMAT_FLOAT)
		v=parseInt(v)
	else
		v=parseFloat(v)	
	if(isNaN(v)){
		_alert("Invalid Format",n+" : Numerical entry.\n\nPlease re-type your entry.")
		ok=false
	}else if(f==CONST_FORMAT_SMALLINT)
		if(v>255){
			_alert("Invalid Entry",n+" : Numerical entry.\n\nValid entry must between 0 and 255")
			me.value=255
			ok=false
		}
	if(!ok)
	 	_setFocus(me)
	return ok
}
//--------------------------------------------------------------------------------
function fnChkText(theField,flgReq){
	return true
}		
//--------------------------------------------------------------------------------
function fnChkFieldLen(me,pLen){
	var msg="" 

	if(me.value.indexOf(" ")>=0)
		msg+="Must not contain spaces.\n"
	if(me.value.length<pLen)
		msg+="Must be "+pLen+" characters or more."
	if(msg){
		_alert("Invalid Format",_getFieldName(me)+" : Text entry\n\n"+msg)
		_setFocus(me)		
		return false
	}	
	return true	
}		
//--------------------------------------------------------------------------------
function fnChkDate(me,flgReq){
	var msg=""
	var n = me.value;

	if(!flgReq && !n)
		return true

	n=n.replace(/(\s|[A-z])/g,"")
	n=n.replace(/\D/g,"/")
	n=n.match(/(\d+)\/(\d+)\/(\d{2,4})/)
	if(n){
		for(i=1;i<n.length;i++)
			n[i]=n[i]*1
			
		if(n[3]<100){
			//2 DIG YEAR ADD ON
			n[3]+=(n[3]<50)?2000:1900
		}
		if(n[3]>=1000){
			//check date entered is valid
			if (n[2] == 2 ){	//if February
				//if leap Year (century / 400) OR (Year / 4)
				if (( n[3] % 100 ==0 && n[3] % 400==0)||( n[3] % 4==0 && n[3] % 100 !=0)){
					if (n[1] > 29){
						//if leap Year check Feb <=29 g_n[1]s
						msg="February has only 29 days in "+n[3]
					}
				}else if (n[1] > 28){
					//ordinary Year - check Feb <=28 days			
					msg="Feburary has only 28 days in "+n[3]
				} 
			}		 
			//Month in range
			if(n[2]>12||n[2]<1){
				msg+="\nMONTH: must be in the range 1-12."
			}	
			//check Month with only 30 dayss
			if ((n[2] == 4) || (n[2] == 6) || (n[2] == 9) || (n[2] == 11)){
				//if >30 Days
				if ( n[1] > 30 )	{
					msg+="\nMONTH "+n[2]+" has only 30 days"
				}
			}	
			if(n[1]<1||n[1]>31){
				msg+="\nDAY: must be a number between 1 and 31."
			}	
		}else
		msg=":"
	}else
		msg=":"
	if(msg){
		if(msg!=":")
			msg=msg+"\n\n"	
		msg=msg+"Valid date format : dd/mm/yyyy  (day/month/year)"
		_alert("Invalid Format",_getFieldName(me)+" : Date entry.\n\n"+msg)
		_setFocus(me)
		return false
	}

	me.value=((n[1]<10)?"0":"")+n[1]+"/"+((n[2]<10)?"0":"")+n[2]+"/"+n[3]
	return true
}
//----------------------------------------------------------------------------
function fnChkURL(me,pReq){
	var u=me.value.replace(/(http:)*(\/\/)*/gi,"")
	u=u.replace(/[^\w:\/\.\-&%?=]/g,"")
	me.value=u.toLowerCase()
	return (!pReq)?true:(me.value!="")
}
//----------------------------------------------------------------------------	
function fnChkPhone(me,pReq){
	if(!me.value&&!pReq)
		return true
	if(/^([\d ]+( ext )?[\d ]+(\/)?[\d ]+( ext )?[\d ]+)$/.test(me.value))
		return true
	_alert("Invalid Format",_getFieldName(me)+" : Telephone Number entry.\n\nValid formats being :-\n01210202020\n0121 020 2020\n0121020202 ext 0202\n0121020202 ext 000 / 0121 020202 ext 222")
	_setFocus(me)
	return false
}
//------------------------------------------------------------------------------
function fnChkEmail(me,pReq){	
	if(me.value==""&&!pReq)
		return true
	me.value=me.value.replace( /([‘’`])/g,"'").toLowerCase()
	if(/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/.test(me.value))
		return true
	var n=_getFieldName(me)
	_alert("Invalid Format",n+" : Email Address\n\nYou have entered an badly formatted email address.\nPlease check the entry "+n+" again.");
	_setFocus(me)
	return false;
}
//--------------------------------------------------------------------------------
function fnChkPostcode(me,pflgReq)	{
	var f=/\s{2,}/g
	var pc=me.value.replace(f," ")
	if(!pc&&(!pflgReq||(pflgReq&&!_hasChanged(me)&&me.value=="")))
		return true
	f=/^([a-z]{1,2}\d{1,2}[a-z]?)[ ](\d\d?[a-z]{2})$/i
	if(!f.test(pc)){
		var n=_getFieldName(me)
		_alert("Invalid Format",n+" : Postcode\n\nValid Postcode format : ''L(L)n(n)(L) <space> n(n)LL''\n\nL = letter\nn = Number 0-9\n( ) = optional.\n\nValid Examples : ''A1 2BC'', ''D34 5EF'', ''GH6 7IJ'', ''KL8 99MP'', ''QR2T 3UV''");
		_setFocus(me)
		return false;
	}
	me.value=pc.toUpperCase()
 	return true;
}
//------------------------------------------------------------------------------------
function fnChkTime(me,pReq){
	var v=me.value.toLowerCase()
	var flg=false
	var time=/(\d+)([:.])*(\d+)*(\w+)*/
	var a=v.match(time) 

	if(!v&&!pReq)
		return true

	if(a!=null){	
		if(!isNaN(a[1])){
			a[1]=parseInt("0"+a[1],10)
			if(a[1]<24){
				a[3]=parseInt("0"+a[3],10)
				if(a[3]<60)
					if(!a[4]){
						if(a[1]<10&&a[0].substr(0,1)!="0")
							a[1]+=12
						flg=true	
					}else		
						if(a[4]=="am"){
							if(a[1]==12)
								a[1]=0
							if(a[1]<12)
								flg=true
						}else{
							if(a[4]=="pm")
								if(a[1]<13){
									if(a[1]<12)
										a[1]=a[1]+12
									flg=true
								}	
						}			
					}			
			}			
	}				
	if(flg){
		if((""+a[1]).length==1)
			a[1]="0"+a[1]
		if((""+a[3]).length==1)
			a[3]="0"+a[3]
		me.value=a[1]+":"+a[3]
	}else{
		_alert("Invalid Format",_getFieldName(me)+" : Time entry.\n\nValid examples : 1.20pm , 1:20pm ,13.20 , 13:20")	
		_setFocus(me)
		return false		
	}		
	return true
}	
//----------------------------------------------------------------------------
function _FIELDwordCount(me,minUnit,maxUnit,flgChars){	
	var MARKER="|--->"
	var sName=_getFieldName(me)
	var txt=me.value
	var tlen=0

	if(!_testBit(me,1)&&!me.value)
		return true

	if(flgChars){
		var sUnit="character"
		var len=txt.length
		tlen=maxUnit
	}else{
	    var sUnit="word"
		var words=txt.split(/[\W]+/g)
		var gaps=txt.split(/[\w]+/g)
		var len=words.length
	}	

	if(len<minUnit){
		_alert("Invalid Entry",sName+" Text entry.\n\nYour entry MUST contain MORE than "+minUnit+" "+sUnit+"s.")
		_setFocus(me)
//		me.value=me.value+"1"
		return false
	}	
	if(len>maxUnit) {
		if(!flgChars)
			for(var j=0;j<maxUnit;j++)
				tlen+=words[j].length+gaps[j].length


		if(confirm("You have exceded the recommended maximum number of "+sUnit+"s for "+sName+",\nClick [OK] if you wish automatically remove the excess text\nClick [cancel] to edit your text to reduce the number of "+sUnit+"s to less than "+maxUnit+".")){
			me.value=txt.substring(0,tlen-3)+"..."
			return true
		}else{	
			alert("Cut the execss, as marked from '"+MARKER+"'\ninto the computer's clipboard, before submiting form.")
			me.value=txt=txt.substring(0,tlen)+MARKER+txt.substring(tlen,txt.length)
			_setFocus(me)
			if(document.all){
				var tr=me.createTextRange()
				if(tr.findText(MARKER)){
					tr.scrollIntoView()
					tr.moveEnd("textedit")	
					tr.select()
				}
				
			}else{
				me.selectionStart=me.value.indexOf(MARKER)
				me.selectionEnd=txt.length
			}							
			return false				
		}	
	}
	return true
}


//--------------------------------------------------------------------------------
function fnChkForm(theForm,pFlg,pCheck){
	//FN ret 0=problem,1=OK no changes,2=OK changes made
	//pFlg : =0 default, =1 force Req, =2 Force Req only if changed, 3=Don't accept empty forms.
	//pCheck : true if only checking form
	//if onChange active - stop form process
	if(!d._FORM)return false
	d._FORMcheck=(pCheck==undefined)?0:pCheck

	//stop if already processed.
	var objE=theForm[JAVASCRIPT_CHECK_FIELD]
	if(objE)if(objE.value!=0)return false

	var flgErr=false
	var iPassPtr=-1
	var chk=0
	var objEg

	var iNotFilled=0
	var iFilledField=0
	var err=""
	var firstField=-1
	var maxE=theForm.elements.length
	var fType
	var sName=""
	var flgReq
	var flg
	var change=false
	var force=(pFlg==1)
	var chkoneof=1
    var oneof=[]
	var txt=""
	for(var i=0;i<maxE;i++){
		objE=theForm.elements[i]
		
		fType=_format(objE)
		flg=false
		if(fType!="X"){
			//get Editor Value
			if(objE.editorValue)
				objE.value=objE.editorValue()
			if(_testBit(objE,2))
				if(objE.type!="hidden"&&!objE.disabled&&_isTABLEcellVisible(objE.id))
					if(sName.indexOf(objE.name+",")<0){
						sName=sName+objE.name+","
						if(objE.type=="radio"){
							objEg=theForm[objE.name]
							for(var j=0;j<objEg.length;j++)
								if(objEg[j].checked&&objEg[j].value)
									flg=true
						}else if (fType==CONST_FORMAT_BOOLEAN)
							flg=objE.checked
						else if(objE.options)
							flg=(objE.options[objE.selectedIndex].value!="")
						else
							flg=(objE.value!="")
//alert(objE.name+"="+flg+" "+_hasChanged(objE))
						if(_hasChanged(objE))
							iFilledField++//}
						if(_testBit(objE,4))
							if(chkoneof)if(flg)chkoneof=false;else oneof[oneof.length]=objE
						if(_testBit(objE,1))
							if(!flg){
								iNotFilled++
								err+="\n"+_getFieldName(objE)
								if(firstField<0)
									firstField=i
							}		
					}
		}			
	}		
	//check new form has been filled and/or No blank form req.
	//
	//check oneof fields in new form
	if(chkoneof)if(oneof.length>0)iNotFilled++
//alert(iNotFilled+" "+pFlg+" "+iFilledField)
	if(iNotFilled>0&&((iFilledField>=0&&pFlg==3&&!d._FORMcheck)||(iFilledField!=0&&pFlg!=3))){
		if(oneof.length>0){//build oneof list
			for(i=0;i<oneof.length;i++)if(oneof[i].name.substr(2,1)!="_")txt+="["+oneof[i].title+"]\n"
			txt="\n\nAn entry is required for one of the following fields\n\n"+txt
			objE=oneof[0]//set focus field
		}
		objE=(firstField!=-1)?theForm.elements[firstField]:oneof[0]//set focus field
		txt="The form was not submitted because the following required field(s) for the New Record are empty\n"+err+txt
		_alert("Missing Entries",txt)
		_setFocus(objE)
		return false
	}	

	//no existing entry and new entry blank
	if(theForm[CONST_FORM_KEEP_FIELD]==undefined&&iFilledField==0){
		return 1//No changes on Form. 
	}	


	//check if entries OK 
 	oneof=[]
	for(var i=0;i<maxE;i++){
		objE=theForm.elements[i]
		//Don't parse IGNORE field
		if(_format(objE)!="X"){

			if((iFilledField>0&&_testBit(objE,2))||!_testBit(objE,2)){//don't fire if no new rec entered
				var oc=objE['_change']
				if(oc){
					if((oc.go())==false)return false
				}else{
					oc=""+objE.onchange
					if(oc){
						oc=oc.match(/(return)([^}]*)/i)
						if(oc){
							if(oc.length==3){
								if(eval(oc[2].replace('this','objE'))==false)
									return false
							}
						}
					}
				}
			}
				
			//Get Change
			//
			//is Keep Field?
			if(objE.name==CONST_FORM_KEEP_FIELD)
				//cater for defaluValue error in hidden fields for FF
				flg=_hasChanged(_getObject(objE.id.substr(0,objE.id.length-1)))
			else	
				flg=_hasChanged(objE)
			//overall change
			change|=flg
			flgReq=(pFlg==2&&d._FORMcheck)?(_isRequired(objE)&&flg):_isRequired(objE,force)
			sName=_getFieldName(objE)

			if(objE.type=="text" || objE.type=="file"){// || objE.type=="hidden"){
					if(objE.value==""&&flgReq){
						_alert("Missing Entry",sName+" requires an entry.")
						_setFocus(objE)
						return false
					}		
				}
			if(objE.type=="select-one"){
//alert(objE.name+" "+(!objE.options[objE.selectedIndex].defaultSelected)+" New:"+(_testBit(objE,2)&&objE.selectedIndex!=0))
					err=0
					if(objE.selectedIndex<0 && flgReq)
						err=1
					else if(objE.options[objE.selectedIndex].value=="" && flgReq)
						err=1
					if(err){
						_alert("Missing Entry",sName+" requires an entry.")
						_setFocus(objE)
						return false
					}
				}
				
			if(objE.type=="textarea"){
					if(!objE.value){
						if(flgReq){
							_alert("Missing Entry",sName+" requires an entry.")
							_setFocus(objE)
							return false				
						}	
					}	
				}	
		
			if(objE.type=="password"||(/(password)+/i).test(objE.name))
					if(flgReq||(_testBit(objE,8)&&flg))
						if(!fnChkFieldLen(objE,6))
							return false

			if(objE.type=="radio"||objE.type=="checkbox"){	
					objEg=theForm[objE.name]
					if(objEg._processed==undefined){
						chk=false
						if(!objEg.length)
							chk=objEg.checked
						else	
							for(var j=0;j<objEg.length;j++)
								if(objEg[j].checked){chk=true;change|=!objEg[j].defaultChecked;break}
							
						if (!chk && flgReq){
							if(objE.type=="checkbox")
								_alert("Missing Box Entry","Please check the "+sName+" box.")
							else	
								_alert("Missing Option Entry","Please select an option for "+sName)
							_setFocus(objE)
							return false
						}	
						objEg._processed=true	
					}		
				}	
	
			if(_testBit(objE,4)){
//				var flgOo=0
//				for(j=0;j<oneof.length;j++)if(objE.title==oneof[j].title){flgOo=1;break}
//				if(!flgOo)
				oneof[oneof.length]=objE	
			}
			}
		}

		if(oneof.length>0){
			maxE=theForm[oneof[0].name].length
			if(maxE==undefined)maxE=1
			for(i=0;i<maxE;i++){
				chk=0
				for(j=0;j<oneof.length;j++){
					objE=(maxE==1)?theForm[oneof[j].name]:theForm[oneof[j].name][i]
					flg=(objE.type=="checkbox")?objE.checked:(objE.options)?(objE.options[objE.selectedIndex].value!=""):(objE.value!="")
					chk+=(flg)?1:0
				}
//alert(chk+"=0")
				if(chk==0){
					var txt=""
					for(j=0;j<oneof.length;j++)if(oneof[j].name.substr(2,1)!="_")if(txt.indexOf(oneof[j].title)==-1)txt+="["+oneof[j].title+"]\n"
					txt="An entry is required for one of the following fields\n\n"+txt
					if(maxE>1)txt=txt+"\n\nIn Record ("+(i+1)+")."
					_alert("Missing Field Value",txt)
					objE=(maxE==1)?theForm[oneof[0].name]:theForm[oneof[0].name][0]
					_setFocus(objE)
					return false
				}
			}	
		}	
	
//alert("****"+change)
//return false

	return fnStampFormProcessed(theForm,change)
	
}
//----------------
function fnStampFormProcessed(me,flg){
	var o=me.elements[JAVASCRIPT_CHECK_FIELD]
	if(o)
		if(o.value==0){
			o.value=flg?2:1
			return o.value
		}	
	return 0
}	
//
function fnResetForms(){
	_mouseCursor("wait")
	var o
	for(var i=0;i<d.forms.length;i++){
		fnFORMreset(d.forms[i])
		o=d.forms[i].elements[JAVASCRIPT_CHECK_FIELD]
		if(o)o.value=0
	}	
	_mouseCursor("default")
}	
//------------------------------------------------------------------------------------

function fnConvertDate(dd){
	var o = dd.indexOf("/")
	if(o<0)return "//"
	var cd = dd.substring(0,o)//day
	dd = dd.substring( o+1, dd.length )
	o = dd.indexOf("/")
	cd = "/"+dd.substring(0,o)+"/"+cd//month
	cd= dd.substring(o+1, dd.length)+cd//year
	o = cd.indexOf("/")//get length of year
	if(o==2)//only 2 dig in year??
		if(parseInt(cd.substring(0,2))<10)//<10 ??
			cd="20"+cd//add "20" to year string
	return cd
}

//function fnChkMemoForm(me){
//	if(!fnChkForm(me,false))
//		return false
//	if(!fnChkWordCount(me.elements[0],1,1024))
//		return false
//		
//	return true	
//}		

function _FIELDboolean(it,invert){
	var fld=it.form[it.id+"x"]
	if(fld)fld.value=!((invert)?it.checked:!it.checked)
}

function fnAskDeleteRecord(me,pCap,pFld,pMsg,pAsk){
	var f=me.form,i=0
	pMsg=(!pMsg)?'':(pMsg+'\n\n')
	if(!pCap)//Cap
		for(i=0;i<f.elements.length;i++)
			if(/name/ig.test(f.elements[i].name)){
				pCap=f.elements[i].value
				break;
			}
	if(pFld&&pCap){//field
		var r=eval("/"+pFld+"$/ig")
		for(i=0;i<f.elements.length;i++)
			if(r.test(f.elements[i].name)){
				pFld=f.elements[i].value
				break;
			}
			
	}else
		pCap="RECORD"
	if(pFld)
		pFld=pFld+"\n"+"_".rep(50)+"\n\n"
	else 
		pFld=""		
	pCap=pCap.toUpperCase()	
	var ok=confirm("DELETE "+pCap+"\n"+"_".rep(50)+"\n\n"+pFld+
		"Do you want to DELETE this "+pCap+" ?\n\n"+
		pMsg+"You can't restore the deleted record once it has been deleted.")
	if(ok&&pAsk)
		ok=confirm("LAST CHANCE - DELETE "+pCap+" - ARE YOU SURE ?\n"+
		"_".rep(50)+"\n\n"+pFld+
		"Click [Ok] to DELETE this "+pCap+"\n\n"+
		"Click [Cancel] to exit.")
	if(ok){		
		var q=""+f.action.match(/stp=\d*/)
		if(q!=""+null)
			f.action=f.action.replace(/stp=\d*/,("stp="+(parseInt(q.substr(4))+100)))
		else
			f.action=f.action+"&stp=100"
		fnStampFormProcessed(f)
		f.submit()
		return true
	}
	return false		
}			

function fnFormElement(theID){
	return document.forms["theForm"].elements[CONST_FORM_FIELD_ID+theID].value
}	
function _isTABLEcellVisible(id){
	var f=true;
	var o=document.getElementById("TABLE"+id)
	if(o)
		f=(_getStyle(o,'display')!='none')
	return f	
}
function _GetFieldIndex(me){
	return (me.id)?parseInt(me.id.substr(CONST_FORM_FIELD_ID.length)):0
}	

function fnFORMTotalize(pCols){
	if(!flgLoaded)
		return
	var f=document.forms["theForm"],m=0,t=0,arrCol=pCols.split(",")
	for(a=1;a<arrCol.length;a++){
		t=0
		fldCol=eval("f."+arrCol[a])
		for(i=0;i<fldCol.length-1;i++)
			if(fldCol[i].value)
				if(_format(fldCol[i])==CONST_FORMAT_FLOAT)
					t+=parseFloat(fldCol[i].value.replace(/,/g,""))
				else
					t+=parseInt(fldCol[i].value)	
		m=fldCol.length-1		
		if(_format(fldCol[m])==CONST_FORMAT_FLOAT)
			fldCol[m].value=t.toFixed(2)
		else	
			fldCol[m].value=t
	}		
}	
function _FIELDmakeOptional(me,pValue,pIDOffset){
	if(!pIDOffset)pIDOffset=1
	var id=_GetFieldIndex(me)+pIDOffset
	var o=_getObject("TABLEField"+id)
	var f=me.form.elements[CONST_FORM_FIELD_ID+id]
	var q=pValue&&me.value!=""
	if(o){
		if(!o._defaultDisplay)o._defaultDisplay=_getStyle(o,'display')
		o.style.display=(q)?(o.tagName=="TR"&&!document.all)?'table-row':'block':'none'
		if(q)_setFocus(f);else f.value=''//if show -focus,else hide -clear
	}	
	return true
}		
//
function _FIELDverify(me,offset){
	if(!offset)offset=1
	var id=CONST_FORM_FIELD_ID+(_GetFieldIndex(me)-offset)
	var f=me.form.elements[id]
//	alert("["+me.value+"] ["+f.value+"]")
	var oc=""+f.onchange
	var fm=_format(me)
	var msg=""
//alert(f.defaultValue+"=="+f.value+"&&"+me.value)
	if(f.defaultValue==f.value&&me.value=="")return true
	//alert("["+me.value+"] ["+f.value+"]")
	if(me.value!=f.value){
		if(!me.value)
			msg=_getFieldName(me)
		else
			msg=_getFieldName(f)
		_alert("Data Match Error","The entry for "+_getFieldName(f)+" did not match "+_getFieldName(me)+".\n\nPlease enter "+msg+" again.");
		
		if(!me.value)
			_setFocus(me)
		else{
			if(/_FIELDmakeOptional/g.test(oc))
				_FIELDmakeOptional(f,false)
			_setFocus(me)//highlight off
			me.value=""
			f.value=f.defaultValue
			_setFocus(f)
		}
		return false	
	}
	return true		
}	
function _FIELDpreValue(it){
	var v=(it.options)?it.selectedIndex:it.type=="checkbox"?(it.checked==true):it.value
	return v
}	
function _FIELDchange(me,fn){
//	var lv=_FIELDpreValue(me)
//	alert(me.name+" "+(!_hasChanged(me))+" "+(me.lastValue==lv)+" "+me.lastValue+"=="+lv)
//	if(!_hasChanged(me))
//		if(me.lastValue==lv)
//			return true
	d._FORM=0//stop FORM processing if alert shown
//	alert("OI")
	var ok=_checkFormat(me)
	if(ok)
		if(fn){
			fn=fn.split("$")
			for(var i=0;i<fn.length;i++){
				if(fn[i]){
					ok=eval(fn[i])
					if(!ok)
						break
				}		
			}	
		}	
//	me.lastValue=lv
	d._FORM=1//allow form to process
	return ok
}

function fnFORMreset(it){
	it._tmr=setTimeout(function(){_FORMreset(it)},25)
}
function _FORMreset(me){
	clearTimeout(me._tmr)
	for(var i=0;i<me.elements.length;i++){
		var e=me.elements[i]
		if(e._class!=undefined)
			e.className=(e._class!="")?e._class:"txtinput"
		if(e.editorResetValue)e.editorResetValue()
		if(e.onchange){d._FORM=0;d._FORMcheck=1;e.onchange();if(e._ih)ih_blur(e);d._FORM=1;d._FORMcheck=0}
		var o=d.getElementById("TABLE"+e.id)
		if(o)if(o._defaultDisplay!=undefined)o.style.display=o._defaultDisplay
		if(_DnD.ishelp)		
			if(e.type)
				if(e.type!="hidden"){
					o=d.getElementById("help"+e.name.substr(2))
					if(o)o.style.display="block"
				}
	}

	i=0;o=2
	while(o>0){
		o=(fnoo(0,i++,1))?o:o-1
	}
}
//
function _checkFormat(me,pFflg){
	var t=_format(me)
	if(!pFflg) pFflg=(d._FORMcheck)?0:_isRequired(me,0)
	var ok
	//check chars are valid.
	if(me.onkeypress){
		var m=me.onkeypress.toString()
		m=m.match(/(_FIELDkeyPress[^'"]+"|')([^"']*)('|")/)
		if(m)if(m.length==4)
			if(m[2]!=""){
				var r=new RegExp("["+m[2].replace(/\\\\/g,"\\\\\\")+"]","ig")
				m=me.value.replace(r,"")
				if(m){
					var r=new RegExp("["+m+"]","ig")
					me.value=me.value.replace(r,"")
				}	
			}	
	}	
	switch(t){
		case CONST_FORMAT_DATE:
			ok=fnChkDate(me,pFflg)
			break
		case CONST_FORMAT_FLOAT:
		case CONST_FORMAT_INT:
		case CONST_FORMAT_SMALLINT:
			ok=fnChkNumber(me,pFflg)
			break
		case CONST_FORMAT_TIME:
			ok=fnChkTime(me,pFflg)
			break		
		case CONST_FORMAT_EMAIL:
			ok=fnChkEmail(me,pFflg)
			break	
		case CONST_FORMAT_PHONE:
			ok=fnChkPhone(me,pFflg)
			break			
		case CONST_FORMAT_POSTCODE:	
			ok=fnChkPostcode(me,pFflg)
			break	
		case CONST_FORMAT_URL:
			ok=fnChkURL(me,pFflg)
			break															
		default:
			ok=true
	}
	return ok
}	

function _isRequired(me,pFflg){
	return !_testBit(me,2)&&(pFflg||_testBit(me,1))&&!me.disabled&&_isTABLEcellVisible(me.id)
}

function _format(me){
	return me.type!=undefined ? me.name ? me.name.substr(0,1) : "X" : "X"
}

function fnoo(me,id,force){
	var o=_getObject("XDIV"+id)
	if(o){
		if(o._divHeight==undefined){
			o._divHeight = /frmshow/i.test(o.className)?0:o.offsetHeight
//			o._open = (/\b_hidden\b/i.test(o.className))
		}	
		o._open=(force)?(/\b_hidden\b/i.test(o.className)):!o._open
		if(!o._open){o.scrollTop="0px"}
		o.style.overflow=(!o._open)?"visible":"hidden"
		o.style.height=(!o._open)?"auto":o._divHeight+"px"
		if(id==0)o.style.display=(o._open)?"none":"block"

		o=_getObject(o.id+'btn')
		if(o){
			var b=(o._open)?"/btn_close":"/btn_open"
			o._on.src=o._on.src.substr(0,o._on.src.lastIndexOf('/'))+b+'1.gif'
			o._off=o._off.substr(0,o._off.lastIndexOf('/'))+b+'0.gif'
		}	
		return true
	}
	return false
}

function _alert(pTitle,pTxt){
	var m=50
	var r=new RegExp("([^\\b\\n]{"+parseInt(m*1.55)+"}[ ])","g")
	_error=true
	l="=".rep(m)
	pTitle="FORM ENTRY ERROR : "+pTitle
	pTxt=pTxt.replace(r,function(w){return w+"\n"})	
	alert(pTitle+"\n"+l+"\n\n"+pTxt+"\n\n")
}

function _showIMG(me,id,pPath){
	var fid=CONST_FORM_FIELD_ID+id
	var o=_getObject(fid)
	var f=o.value

	fid=CONST_FORMAT_IMAGEPATH+fid
	o=_getObject(fid)
	_position(o,0,me)
	if(o._state){
		o.style.zIndex=100
		o.innerHTML="<img src="+unescape(pPath)+f+" border=0 id="+fid+"po>"
		setTimeout("__op('"+fid+"po')",1000)
	}	
}
function __op(id){
	o=_getObject(id)
    if ((o.naturalWidth != undefined && o.naturalWidth > 0)||(o.naturalWidth==undefined && o.complete)) return
	o.src="/_lib/img/error.gif"
}
function __strRep(n) {
   var s="", t=this.toString()
   while (--n>=0) s+=t
   return s
}
function _FIELDchanged(me){
	var ret=_hasChanged(me)
	if(!_testBit(me,1))ret=(ret||!me.value)
	return ret
}	
function _FIELDupdate(it,v){
	it.form[_format(it)+((parseInt(it.name.substr(1,1),16)-8).toString(16)).toUpperCase()+it.name.substr(3)].value=v
}
String.prototype.rep=__strRep

_onLoad.add("fnResetForms()")
