//(c)Alex Barnard 2000-2004
//--------------------------------------------------------------------------------
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_ID="I"
var CONST_FORMAT_FILE="L"
var CONST_FORMAT_MEMO="M"
var CONST_FORMAT_INT="N"
var CONST_FORMAT_SMALLINT="S"
var CONST_FORMAT_PHONE="P"
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 JAVASCRIPT_CHECK_FIELD="X0java_processed"

var g_Remove_=/_/g
var g_day,g_month,g_year
var g_hPWin=0
var g_currentFormElement

function _setFocus(me,flg){
	if(me.type!="hidden"){
		me.focus()
		if(!flg && "textareapassword".indexOf(me.type)>-1)
			me.select()
	}	
	return true
}	
//--------------------------------------------------------------------------------
function fnChkNumber(me,isFloat,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
		}
//alert(v)	
	if(!ok)
	 	_setFocus(me)
	return ok
}		
//--------------------------------------------------------------------------------
function keyPress(me,theFormat,e,param){	//get keypressed	
	var c = document.layers ? e.which 
            : document.all ? event.keyCode
            : e.which;
	var cc=String.fromCharCode(c)

	if(c==8||c==9||c==0)
		return true
		
	switch(theFormat){
		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_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_FILE:
			return /[^\s\b\?:\\\/\<\>]/.test(cc)
			
		case CONST_FORMAT_INT:
		case CONST_FORMAT_SMALLINT:
			return /[\d,]/.test(cc)
		
		case CONST_FORMAT_MEMO:
			return (me.value.length<param)
		
		case CONST_FORMAT_FLOAT:
			if(/[\d,.]/.test(cc))
				if(c==46)//check if decimal point added
					return (me.value.indexOf(".")<1)
				else	
					return true	
				
	}
	return false
}
//--------------------------------------------------------------------------------
function fnChkText(me,pReq)
{
	return true
}		
//--------------------------------------------------------------------------------
function fnUpperCase(me){
	me.value=me.value.toUpperCase()
}
//--------------------------------------------------------------------------------
function fnMakeFirstUpper(me){
	me.value=me.value.replace(/\b[\w\']+\b/g,function(w){return w.substr(0,1).toUpperCase()+w.substr(1).toLowerCase()})	
	return true
}	//’
//--------------------------------------------------------------------------------
function fnChkPassword(me){
		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,pReq){
	var msg
	var n = me.value;

	if(!pReq && !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]
				} 
			}		 
			//check Month with only 30 dayss
			else if ((n[2] == 4) || (n[2] == 6) || (n[2] == 9) || (n[2] == 11)){
				//if >30 Days
				if ( n[1] > 30 )	{
					msg="Month "+n[2]+" has only 30 days"
				}
			}else if(n[2]>12||n[2]<1){
			
				msg="MONTH: must be in the range 1-12."+n[2]
				if(n[1]<1||n[1]>31)
					msg=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 fnChkPhone(me,pReq){
	if(!me.value&&!pReq)
		return true
	if(/[^0-9 ext]|(^[^\d ])|([^\d ]$)|(((\de)|e[\d ])|([\d ]x)|(x[\d ])|([\d ]t)|(t\d))/.test(me.value)){
		_alert("Invalid Format",_getFieldName(me)+" : Telephone Number entry.\n\nValid formats being :-\n012 1202 0202\n0121 20202022 ext 115")
		_setFocus(me)
		return false
	}
	return true
}
//------------------------------------------------------------------------------
function fnChkEmail(me,pReq){	

	if(!me.value&&!pReq)
		return true
	me.value=me.value.replace( /([‘’`])/g,"'").toLowerCase()
	var f1 = /(@.*@)|(@\.)|(^@)|(\.@)|(@$)|(^\.)|(\.\.)|(\.$)/;
	var f2 = /^.+\@[a-z0-9\-\.]+\.([a-z]{2,4}|[0-9]{1,3})$/;
	if (!f1.test(me.value) && f2.test(me.value)){
		return true
	}	
	var n=_getFieldName(me)
	_alert("Invalid Format",n+" : Email Address\n\nYou have entered an badly formatted email address. Please check the "+n+" entry again.");
	_setFocus(me)
	return false;
}
//--------------------------------------------------------------------------------
function fnChkPostcode(me,pReq)	{
	var f=/\s{2,}/g
	var pc=me.value.replace(f," ")
	if(!pc&&!pReq)
		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 fnChkWordCount(me,minUnit,maxUnit,flgChars){
	var MARKER="|--->"
	var sName=_getFieldName(me)
	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("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 _getFieldName(me){
//	var removenew=eval("/"+CONST_FORMAT_NEW_FIELD+"/g")
	return "["+me.title+"]"
//	var sName=me.substr(2).replace(eval("/"+CONST_FORMAT_NEW_FIELD+"/g"),"")	
//	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

	for(var i=0;i<maxE;i++){
		objE=theForm.elements[i]
		if(objE.editorValue)
			objE.value=objE.editorValue()
		if(objE.name.substring(0,1)!="X")
			if(objE.name.indexOf(CONST_FORMAT_NEW_FIELD)>=0){
				if(objE.type!="hidden"&&!objE.disabled)
					if(objE.name.substring(0,1)!=CONST_FORMAT_BOOLEAN)
						if(objE.value!="")
							iFilledField++			
						else	
							if(objE.name.indexOf("1")>=0){
								iNotFilled++
								err+="\n"+_getFieldName(objE)
								if(firstField<0)
									firstField=i
							}}
	}						
	if(iFilledField&&iNotFilled){
		_alert("Missing Entries","The form was not submitted because the following required field(s) for the New Record are empty\n"+err)
		_setFocus(theForm.elements[firstField])
		return false
	}	

    for(var i=0;i<maxE;i++){
		objE=theForm.elements[i]
		fType=_format(objE)
		sName=_getFieldName(objE)
		flgReq=flgForceReq
		if (!flgReq)
			flgReq=(objE.name.substr(1,1)==1)&&!objE.disabled

		if(fType!="X"&&objE.name.indexOf(CONST_FORMAT_NEW_FIELD)<0){
			if(objE.type=="text" || objE.type=="file"){// || objE.type=="hidden")
				if(!objE.readOnly)
				if(objE.value=="" && flgReq){
					_alert("Missing Entry",sName+" requires an entry.")
					_setFocus(objE)
					return false
				}
				if(objE.type!="hidden"){
					if(fType==CONST_FORMAT_DATE)
						if(!fnChkDate(objE,flgReq))
							return false
	
					if(fType==CONST_FORMAT_FLOAT)
						if(!fnChkNumber(objE,true,flgReq))
							return false
	
					if(fType==CONST_FORMAT_INT)
						if(!fnChkNumber(objE,false,flgReq))
							return false
					
					if(fType==CONST_FORMAT_TIME)
						if(!fnChkTime(objE))
							return false

					if(sName.search(/email/i)>=0)	
						if(!fnChkEmail(objE,flgReq))
							return false
							
					if(sName.search(/phone/i)>=0||sName.search(/fax/i)>=0||sName.search(/mobile/i)>=0)	
						if(!fnChkPhone(objE))
							return false
		
					if(sName.search(/postcode/i)>=0)	
						if(!fnChkPostcode(objE))
							return false
	
					if(sName.search(/password/i)>=0)
						if(!fnChkPassword(objE))
							return false
					}		
			}	

			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("Missing Entry",sName+" requires an entry.")
					objE.focus()
					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("Missing Box Entry","Please check the "+sName+" box.")
						else	
							_alert("Missing Option Entry","Please select an option for "+sName)
						_setFocus(objE)
						return false
					}	
		
			}	
	
			if(objE.type=="password"){
				if(objE.value=="" && flgReq){
					_alert("Missing Entry",sName+" requires an entry.")
					_setFocus(objE)
					return false
				}
			
				if(iPassPtr<0)
					iPassPtr=i
				else
					if(objE.value!=theForm.elements[iPassPtr].value){
						_alert("Password Entry","Your password does not Verify.\nPlease Re-enter your Password");
						objE.value=""
						theForm.elements[iPassPtr].value=""
						_setFocus(theForm.elements[iPassPtr])
						return false
					}		
			}
				
			if(objE.type=="textarea"){
				if(!objE.value){
					if(flgReq){
						_alert("Missing Entry",sName+" requires an entry.")
						_setFocus(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
		}else
			return false
			
	return true
}	
//----------------------------------------------------------------------------

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 fnAskDeleteRecord(me,pID){
	var f=me.form,sName=""
	for(i=0;i<f.elements.length;i++){
		if(/name|title/ig.test(f.elements[i].name)){
			sName=f.elements[i].value.toUpperCase()
			break;
		}
	}		
	if(sName)
		sName=sName+"\n"+"_".rep(40)+"\n\n"
		
	if(confirm("               DELETE RECORD No."+pID+"\n"+"_".rep(40)+"\n\n"+sName+"Are you sure you want to DELETE this record ?\n\nOnce deleted, this record can not be restored.")){
		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 fnASPuploadProgress(theForm,pReq,aspFile){
	var strAppVersion = navigator.appVersion;

	if(fnChkForm(theForm,pReq)){
    	if (strAppVersion.indexOf('MSIE') != -1 && strAppVersion.substr(strAppVersion.indexOf('MSIE')+5,1) > 4) {
			var winstyle = "dialogWidth=385px; dialogHeight:140px; center:yes"
			window.showModelessDialog(aspFile+'&b=IE',null,winstyle)
		}else 
			window.open(aspFile+'&b=NN','','width=385,height=140', 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+",scrollbars=1"+p)
	else 
		g_hPWin.location.replace(url);
	if(g_hPWin)
		g_hPWin.focus()
}
function fnPopUp_Close(){
	if(g_hPWin)g_hPWin.close()
	g_hPWin=0
}	
//----------
function fnConvertDate(dd){
	if(!dd)
		return
	var cd=dd.split("/")
	if(cd[2].length==2)
		cd[2]="20"+cd[2]
	cd=cd[2]+"/"+cd[1]+"/"+cd[0]
	return cd
}

function fnChkMemoForm(theForm)		
{
	if(!fnChkForm(theForm,false))
		return false
	

	if(!fnChkWordCount(theForm.elements[0],1,1024))
		return false
		
	return true	
}		

function fnBoolean(me,meID,flg){
	var fld=eval("me.form.Field"+meID)
	if(!flg)
		fld.value=(fld.value!="true")
	else
		fld.value=(me.checked)?me.value:""	
	//alert(fld.name+" "+fld.id+" "+fld.value)
}			
function _format(me){
	return me.name.substr(0,1)
}
function _alert(pTitle,pTxt){
	var m=40
	var r=new RegExp("([^\\b\\n]{"+(m+20)+"}[ ])","g")
	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 _strRep(n) {
   var s="", t=this.toString()
   while (--n>=0) s+=t
   return s
}
String.prototype.rep=_strRep

