//(c)Alex Barnard 2000-2004
//--------------------------------------------------------------------------------
var CONST_NUMBER="0123456789"
var CONST_DATE=",./"+CONST_NUMBER
var CONST_TIME=".:apm"+CONST_NUMBER
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_YESNO="Y"

//var CONST_FORMAT_TICKBOX="X"
//var CONST_FORMAT_NEW_FIELD="_X_NEW"
var CONST_FORM_KEEP_FIELD="X0_KeepRecord"
var JAVASCRIPT_CHECK_FIELD="X0java_processed"
var LIMIT_TO_THESE_CHARS=""

var g_Remove_=/_/g
var g_day,g_month,g_year
var g_hPWin=0

function fnSetFocus(theField){
	if(theField.type!="hidden"){
		theField.focus()
		if(theField.type=="text")
			theField.select()
	}	
	return true
}	
//--------------------------------------------------------------------------------
function checkFor(txt,sTest,flg)
{
	if(!txt.length) 
		return !flg

	for(var i = 0; i < txt.length; i++ ){
		var	cChar=txt.charAt(i).toLowerCase()
		if (sTest.indexOf(cChar)<0)
			if (sTest.indexOf(cChar.toUpperCase())<0)
				return false
	}	
	return true
} 
//--------------------------------------------------------------------------------
function fnTestBit(sName,iBit){
	return ((parseInt(sName.substring(1,2))&iBit)==iBit)
}	
//--------------------------------------------------------------------------------
function fnChkNumber(theField,isFloat,flgReq)
{
	var sTest=","+CONST_NUMBER
	if(isFloat)sTest+="."
	if(!checkFor(theField.value,sTest,flgReq)){
		alert(fnGetFieldName(theField.name)+" requires Numerical entry")
		fnSetFocus(theField)
		return false
	}
	return true
}		
//--------------------------------------------------------------------------------
function keyPress(theField,e,parseChars,param,param2)
{	//get keypressed	
	var c = document.layers ? e.which 
            : document.all ? event.keyCode
            : e.which;
	var cc=String.fromCharCode(c)
	var theFormat=theField.name.substr(0,1)

	if(c==8||c==9||c==0)
		return true
	
	if(parseChars)
		if(!eval("/["+parseChars+"]/.test(cc)"))
			return false

	switch(theFormat){
		case CONST_FORMAT_TIME:
			 return checkFor(cc,CONST_TIME)
		case CONST_FORMAT_DATE:
			if(checkFor(cc,CONST_DATE)){
				if(c>=44&&c<=47){
					c=0
					for(var i=0;i<theField.value.length;i++)//loop along text entered
						if(theField.value.charAt(i)>=","&&theField.value.charAt(i)<="/")//if charcter found in text, set inc cntr
							c++
					return (c<2)		//false if delimiter found > twice
				}
				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:
			return /[\w:\/\.\-&%]/.test(cc)
				
		case CONST_FORMAT_CHARACTER:
			return true
		
		case CONST_FORMAT_INT:
			return /[\d,]/.test(cc)//checkFor(cc,CONST_NUMBER+",")		
			
		case CONST_FORMAT_SMALLINT:
			return /\d/.test(cc)//checkFor(cc,CONST_NUMBER)
			
		case CONST_FORMAT_MEMO:
			if(param2)
				return (theField.value.length<param)
			else	
				return (theField.value.split(/\W/g).length<param)
		
		case CONST_FORMAT_FLOAT:
			if(/[\d,.]/.test(cc)){//checkFor(cc,CONST_NUMBER+",.")){
				if(c==46)//check if decimal point added
					if(theField.value.indexOf(".")>=0)
						return false

				return true
			}	
	}
	return false
}
//--------------------------------------------------------------------------------
function fnChkText(theField,flgReq){
	return true
}		
//--------------------------------------------------------------------------------
function fnUpperCase(theField){
	theField.value=theField.value.toUpperCase()
}
function fnLowerCase(theField){
	theField.value=theField.value.toLowerCase()
}
//--------------------------------------------------------------------------------
function fnMakeFirstUpper(theField){
	var words=theField.value.replace(/([’"`])/g,"'").toLowerCase().split(" ");
	var arr
	for(var i=0;i<words.length;i++){
		arr=words[i].match(/(^([a-z]))|(\W[a-z][a-z]?)/g)
		if(arr)
			for(j=0;j<arr.length;j++){
				if(/[']/.test(arr[j])){
					if((/['][a-z][a-z]/.test(arr[j])))
						arr[j]=arr[j].substr(0,arr[j].length-1)
					else
						arr[j]=" "
				}else		
					if(arr[j].length>2)
						arr[j]=arr[j].substr(0,arr[j].length-1)
				
				words[i]=words[i].replace(arr[j],arr[j].toUpperCase())
//			alert(words[i]+" ["+arr[j]+"]")
		}
	}
	theField.value=words.join(" ")
	return true
}	//’
//--------------------------------------------------------------------------------
function fnChkFieldLen(theField,pLen){
	var msg=""
	if(theField.value.indexOf(" ")>=0)
		msg+="\nmust not contain spaces"
	if(theField.value.length<pLen)
		msg+="\nmust be "+pLen+" characters or more"
	if(msg){
		alert("  Error in "+fnGetFieldName(theField.name)+"\n________________________\n"+msg)
		fnSetFocus(theField)		
		return false
	}	
	return true	
}		
//--------------------------------------------------------------------------------
function fnChkDate(theField,flgReq)
{	var flgErr
	var sName=theField.name
	var d = theField.value;

	var r=/\s/g
	
	if(!flgReq && !d)
		return true
		
	d=d.replace(r,"")
	r=/\D/g
	d=d.replace(r,"/")
	r=d

	var o = d.indexOf("/");
	if ( o < 1 )
		flgErr=true	
	else
	{	
		var day = parseInt(d.substring(0,o),10);
		
		d = d.substring( o+1, d.length );
		o = d.indexOf("/");
		if ( o < 1 )
			flgErr=true
		else	
		{
			var month = parseInt(d.substring(0,o),10);
			var year = parseInt(d.substring( o+1, d.length ),10)
			if(!year)
				flgErr=true
			if (year>100&&year<1000)	
				flgErr=true
		}
	}
	
	if(flgErr)
	{
		alert("You must enter "+fnGetFieldName(sName)+" as dd/mm/yyyy    (day/month/year).")
		fnSetFocus(theField)
		return false
	}	
				
	//check date entered is valid			
	if (month == 2 )	//if February
	{
		//if leap g_year (century / 400) OR (g_year / 4)
		if (( year % 100 ==0 && year % 400==0)||( year % 4==0 && year % 100 !=0))	
		{
			//if leap g_year check Feb <=29 g_days
			if ( day > 29 )
			{
				alert("Invalid Date\nFebruary has only 29 days in "+year)
				fnSetFocus(theField)
				return false
			}	
		}
		else
			//ordinary g_year - check Feb <=28 g_days
			if ( day > 28 )
			{
				alert("Invalid Date\nFeburary has only 28 days in "+year)
				fnSetFocus(theField)
				return false
		 	}
		}	 
		//check g_months with only 30 g_days
	else if ( (month == 4) || (month == 6) || (month == 9) || (month == 11) )	
		{
			//if >30 g_days
			if ( day > 30 )
			{
				alert("Invalid Date\nMonth "+month+" has only 30 days")
				fnSetFocus(theField)
				return false
			}
		}
		else if(month>12)
		{
			alert("Invalid Date\nIncorrect month entered. Must be in the range 1-12.")
			fnSetFocus(theField)
			return false
		}
	if(day<10)day="0"+day.toString()	
	if(month<10)month="0"+month.toString()
	if(year<10)year="200"+year.toString()
	theField.value=day+"/"+month+"/"+year
	return true
}
//----------------------------------------------------------------------------
function fnChkURL(pField){
	pField.value=pField.value.replace(/(http:)*(\/\/)*/gi,"")
}
//----------------------------------------------------------------------------	
function fnChkPhone(pField,pflgReq){
	if(!pField.value&&!pflgReq)
		return true
	if(/[^0-9 ext]|(^[^\d ])|([^\d ]$)|(((\de)|e[\d ])|([\d ]x)|(x[\d ])|([\d ]t)|(t\d))/.test(pField.value)){
		alert(fnGetFieldName(pField.name)+" requires a Phone Number entry\ne.g. 0121 2020202 ext 115")
		fnSetFocus(pField)
		return false
	}
	return true
}
//------------------------------------------------------------------------------
function fnChkEmail(pField,pflgReq){	

	if(!pField.value&&!pflgReq)
		return true
	pField.value=pField.value.replace( /([‘’`])/g,"'").toLowerCase()
	var f1 = /(@.*@)|(@\.)|(^@)|(\.@)|(@$)|(^\.)|(\.\.)|(\.$)/;
	var f2 = /^.+\@[a-z0-9\-\.]+\.([a-z]{2,4}|[0-9]{1,3})$/;
	if (!f1.test(pField.value) && f2.test(pField.value)){
		return true
	}	
	
	alert("                    Invalid Email Address\n\nYou have entered an incorrectly formatted email address.\n\nPlease check your email address");
	fnSetFocus(pField)
	return false;
}
//--------------------------------------------------------------------------------
function fnChkPostcode(pField,pflgReq)	{
	var f=/\s{2,}/g
	var pc=pField.value.replace(f," ")
	if(!pc&&!pflgReq)
		return true
	f=/^([a-z]{1,2}\d{1,2}[a-z]?)[ ](\d\d?[a-z]{2})$/i
	if(!f.test(pc)){
		alert("                   Invalid Postcode\n\nRequired format : [AaOoa OAA]\n\nA = Character (A-Z),  0 = Digit (0-9),  a o = Optional\n\ne.g. A1 2BC,  D34 5EF,  GH6 7IJ,  KL8M 9NO");
		fnSetFocus(pField)
		return false;
	}
	pField.value=pc.toUpperCase()
 	return true;
}
//------------------------------------------------------------------------------------
function fnChkTime(theTimeField){
	var v=theTimeField.value.toLowerCase()
	var flg=false
	var time=/(\d+)([:.])*(\d+)*(\w+)*/
	var arrTime=v.match(time) 
	if(arrTime!=null){	
		if(!isNaN(arrTime[1])){
			arrTime[1]=parseInt("0"+arrTime[1],10)
			if(arrTime[1]<24){
				arrTime[3]=parseInt("0"+arrTime[3],10)
				if(arrTime[3]<60)
					if(!arrTime[4]){
						if(arrTime[1]<10&&arrTime[0].substr(0,1)!="0")
							arrTime[1]+=12
						flg=true	
					}else		
						if(arrTime[4]=="am"){
							if(arrTime[1]==12)
								arrTime[1]=0
							if(arrTime[1]<12)
								flg=true
						}else{
							if(arrTime[4]=="pm")
								if(arrTime[1]<13){
									if(arrTime[1]<12)
										arrTime[1]=arrTime[1]+12
									flg=true
								}	
						}			
					}			
			}			
	}				
	if(flg){
		if((""+arrTime[1]).length==1)
			arrTime[1]="0"+arrTime[1]
		if((""+arrTime[3]).length==1)
			arrTime[3]="0"+arrTime[3]
		theTimeField.value=arrTime[1]+":"+arrTime[3]
	}else{
		alert("Invalid "+fnGetFieldName(theTimeField.name)+"\nExample of valid time entry - 1.20pm OR 13.20")	
		fnSetFocus(theTimeField)
		theTimeField.select
		return false		
	}		
	return true
}	
//----------------------------------------------------------------------------
function fnChkWordCount(me,minUnit,maxUnit,flgChars){	
	var MARKER="|--->"
	var sName=fnGetFieldName(me.name)
	var txt=me.value
	var tlen=0
	
	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("Your entry MUST contain MORE than "+minUnit+" "+sUnit+"s.")
		fnSetFocus(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 want to enter and 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)
			fnSetFocus(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 fnGetFieldName(theField){
//	var removenew=eval("/"+CONST_FORMAT_NEW_FIELD+"/g")
	
	var sName=theField.substr(2)
	sName=sName.replace(g_Remove_," ")
	if(sName.substr(0,3)=="ID ")
		sName=sName.substr(3)

	return "["+sName+"]"
}
//-----------------
function fnChkForm(theForm,flgForceReq){
	var flgErr=false
	var iPassPtr=-1
	var chk=0
	var objEg
	var objE
	var sBox
	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 flgNewRecord=false
	
	for(var i=0;i<maxE;i++){
		objE=theForm.elements[i]
		flg=false
		//if(objE.name.indexOf(CONST_FORM_KEEP_FIELD)==0)
		///	flgNewRecord=true
		if(objE.name.substring(0,1)!="X")
			if(fnTestBit(objE.name,2))
				if(objE.type!="hidden")
//					if(objE.name.substring(0,1)!=CONST_FORMAT_BOOLEAN){
						if(sName.indexOf(objE.name)<0){
							sName=sName+","+objE.name
							if(objE.name.substring(0,1)==CONST_FORMAT_OPTION){
								for(j=0;j<theForm[objE.name].length;j++)
									if(theForm[objE.name][j].checked)
										flg=true
							}else			
							if(objE.value!="")
								flg=true
							if(flg)	
								iFilledField++			
							else	
								if(fnTestBit(objE.name,1)){
									iNotFilled++
									err+="\n"+fnGetFieldName(objE.name)
									if(firstField<0)
										firstField=i
								}		
						}
//					}	
	}		
//	alert(iFilledField+"&&"+iNotFilled+"!=0")				
	if(iNotFilled&&iFilledField!=0){
		alert("________________________________________________\n\nThe form was not submitted because the following\nrequired field(s) for the New Record are empty\n________________________________________________\n"+err)
		fnSetFocus(theForm.elements[firstField])
		return false
	}	

    for(var i=0;i<maxE;i++){
		objE=theForm.elements[i]
		fType=objE.name.substring(0,1)		
		sName=fnGetFieldName(objE.name)
		flgReq=(flgForceReq||fnTestBit(objE.name,1))
	//	alert(objE.name+" "+fnTestBit(objE.name,1)+" "+flgReq)
		if(fType!="X"){
			if(objE.type=="password"){
				if(objE.value=="" && flgReq){
					alert("You need to make an entry for "+sName)
					fnSetFocus(objE)
					return false
				}
			
				if(iPassPtr<0)
					iPassPtr=i
				else
					if(objE.value!=theForm.elements[iPassPtr].value){
						alert("Your password does not Verify.  Re-Enter your Password");
						objE.value=""
						theForm.elements[iPassPtr].value=""
						fnSetFocus(theForm.elements[iPassPtr])
						return false
					}		
			}
	
			if(objE.type=="radio"||objE.type=="checkbox"){	
				objEg=eval("theForm."+objE.name)
				chk=false
				if(!objEg.length)
					chk=objEg.checked
				else	
					for(var j=0;j<objEg.length;j++){
						if(objEg[j].checked)
								chk=true
					}
					if (!chk && flgReq){
						if(objE.type=="checkbox")
							alert("You must tick the '"+sName+"' box.")
						else	
							alert("You must give an answer to "+sName)
						fnSetFocus(objE)
						return false
					}	
			}	
				
			if(!fnTestBit(objE.name,2)){//TEST IF NOT NEW FIELD
				if(objE.type=="text" || objE.type=="file"){// || objE.type=="hidden")
					if(objE.value=="" && flgReq){
						alert("You need to make an entry for "+sName)
						fnSetFocus(objE)
						return false
					}
					switch(fType){
						case CONST_FORMAT_DATE:
							if(!fnChkDate(objE,flgReq))
								return false
							break
						case CONST_FORMAT_FLOAT:
							if(!fnChkNumber(objE,true,flgReq))
								return false
							break
						case CONST_FORMAT_INT,CONST_FORMAT_SMALLINT:
							if(!fnChkNumber(objE,false,flgReq))
								return false
							if(fType==CONST_FORMAT_SMALLINT)
								if(objE.value>255){
									alert(sName+" can not be more than 255")
									fnSetFocus(objE)
									return false
								}	
							break
						case CONST_FORMAT_TIME:
							if(!fnChkTime(objE))
								return false
							break		
						case CONST_FORMAT_EMAIL:
							if(!fnChkEmail(objE,flgReq))
								return false
							break	
						case CONST_FORMAT_PHONE:
							if(!fnChkPhone(objE))
								return false
							break			
						case CONST_FORMAT_POSTCODE:	
							if(!fnChkPostcode(objE))
								return false
							break	
							
						case CONST_FORMAT_URL:
							fnChkURL(objE)
							break															
					}		
				}
				if(objE.type=="select-one"){
					if(objE.selectedIndex<0 && flgReq)
						flgErr=true
					else				
						if(objE.options[objE.selectedIndex].value=="" && flgReq)
							flgErr=true
							
					if(flgErr){
						if(sName.substring(0,3)=="ID ")
							sName=sName.substring(3,sName.length)
						alert("You need to make an entry for "+sName);
						objE.focus()
						return false
					}
				}	
			
				if(objE.type=="textarea"){
					if(!objE.value){
						if(flgReq){
							alert("You must make an entry for "+sName)
							fnSetFocus(objE)
							return false				
						}	
					}	
				}			
			}
		}
	}
	return fnStampFormProcessed(theForm)
}
//----------------
function fnStampFormProcessed(theForm){
	var obj=theForm.elements[JAVASCRIPT_CHECK_FIELD]
	if(obj)
		if(obj.value==0){
			obj.value=1
			return true
		}
	return (!obj)
}	
//-------------
//PLACE THIS IN FORM's ONLOAD
function fnResetForms(theForm){
	var obj=null
	for(i=0;i<document.forms.length;i++){
		obj=document.forms[i].elements[JAVASCRIPT_CHECK_FIELD]
		if(obj)
			obj.value=0
	}		
}	

//------------------------------------------------------------------------------------
function fnSwitch(name,idx){
	for(var i=0;i<d.forms.length;i++)
		for(var j=0;j<d.forms[i].elements.length;j++)
			if(d.forms[i].elements[j].name==name){
				eval("d.forms[i]."+name+"[idx].checked=true")
				return
			}	
}
//----------------------------------------------------------------------------
function msg(txt){
	window.status=txt
	return true
}	
//----------------------------------------------------------------------------
function fnASPuploadProgress(theForm,aspFile,flgReq){
	var strAppVersion = navigator.appVersion;
	var flg = (theForm.type=="FORM") ? fnChkForm(theForm,flgReq) : theForm
	if(flg) 
    	if (strAppVersion.indexOf('MSIE') != -1 && strAppVersion.substr(strAppVersion.indexOf('MSIE')+5,1) > 4) {
			var winstyle = "dialogWidth=375px; dialogHeight:130px; center:yes"
			window.showModelessDialog(aspFile+'&b=IE',null,winstyle)
		}else 
			window.open(aspFile+'&b=NN','','width=370,height=115', true)
	else 
  		return false
	return true
}
//------------
function fnPopUp(url,n,w,h,p){
	if(!url)
		return
	if(!w) w=510
	if(!h) h=348;

	if(g_hPWin!=0&&!g_hPWin.closed){
		if(g_hPWin.name!=n)
			g_hPWin.close()
	}		
	if(!g_hPWin||g_hPWin.closed)
		g_hPWin=window.open(url,n,"width="+w+",height="+h+p)
	else 
		g_hPWin.location.replace(url);
	g_hPWin.focus()
}

function fnConvertDate(d){
	var o = d.indexOf("/")
	var cd = d.substring(0,o)//day
	d = d.substring( o+1, d.length )
	o = d.indexOf("/")
	cd = "/"+d.substring(0,o)+"/"+cd//month
	cd= d.substring(o+1, d.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 fnBoolean(me,fID){
	var fld=eval("me.form.Field"+fID)
	fld.value=(fld.value!="true")
}

function fnAskDeleteRecord(pName,pID){
	var sName="",obj=document.forms["theForm"]
	if(pName)
		sName="["+pName+"]\n\n"
	if(confirm("               DELETE RECORD No."+pID+"\n_____________________________________\n\n"+sName+"Are you sure you want to DELETE this record ?")){
		var q=""+obj.action.match(/stp=\d*/)
		if(q!=""+null)
			obj.action=obj.action.replace(/stp=\d*/,("stp="+(parseInt(q.substr(4))+100)))
		else
			obj.action=obj.action+"&stp=100"
		fnStampFormProcessed(obj)
		obj.submit()
		return true
	}
	return false		
}			

function fnFormElement(theID){
	return document.forms["theForm"].elements["Field"+theID].value
}	

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(fldCol[m].name.substr(0,1)==CONST_FORMAT_FLOAT)
					t+=parseFloat(fldCol[i].value.replace(/,/g,""))
				else
					t+=parseInt(fldCol[i].value)	
		m=fldCol.length-1		
		if(fldCol[m].name.substr(0,1)==CONST_FORMAT_FLOAT)
			fldCol[m].value=t.toFixed(2)
		else	
			fldCol[m].value=t
	}		
}	
