//Important! You must remember to put an element in your html called formCheckerReadout!


var arrCheckerFields = new Array()
var sCheckerButton
var sCheckerForm
var bCheckerShowReadout = true

var sAuthCode = '191'



function performAllChecks(){
	checkFields()
	checkTickBoxDependencies()
	checkMaxLengthFields()
}


function addCheckerField(sFieldName,sType,bCanBeBlank,sConfirmationFieldName){

	var oField = new Object()
	oField.FieldName = sFieldName
	oField.Type = sType
	oField.CanBeBlank = bCanBeBlank
	oField.ConfirmationFieldName = sConfirmationFieldName
	
	arrCheckerFields.push(oField)
	
	if (sType == "MustTick"){
		getObject(sFieldName).onclick = function(){performAllChecks()}
	}else{
		getObject(sFieldName).onkeyup = function(){performAllChecks()}
	}
	
	if (sConfirmationFieldName != undefined){
		getObject(sConfirmationFieldName).onkeyup = function(){performAllChecks()}
	}
	
}

function setCheckerButton(sButtonName,sFormName,bShowReadout){
	sCheckerButton = sButtonName
	sCheckerForm = sFormName
	if (bShowReadout != undefined){
	bCheckerShowReadout = bShowReadout
	}
	
	getObject(sCheckerForm).onsubmit = function(){return false}
	getObject(sCheckerButton).onclick = function(){this.disabled = true; this.value = 'Please wait...'; this.form.submit()}
	
	
	performAllChecks()
}

function checkFields(){
	var oButton = getObject(sCheckerButton)
	oButton.disabled = false
	
	var oForm = getObject(sCheckerForm)
	
	var oResults = new Array()
	
	//loop through the fields we have
	for (var i = 0;i<arrCheckerFields.length;i++){
	
	var oField = arrCheckerFields[i];
	var oInputBox = getObject(oField.FieldName);
	
	
		//can it be blank?
		if (oField.CanBeBlank == false){
			if (oInputBox.value == ''){
				oResults.push(openFocusLink(oField.FieldName) + formatForReadOut(oField.FieldName) + ' is empty' + closeFocusLink(oField.FieldName))
			}
		}
		
		
		//is it a currency field?
		if (oField.Type == 'Currency'){
			if (isCurrency(oInputBox.value) == false){
				oResults.push(openFocusLink(oField.FieldName) + formatForReadOut(oField.FieldName) + ' is not valid currency' + closeFocusLink(oField.FieldName))
			}
		}
		
		//is it a integer field?
		if (oField.Type == 'Integer'){
			if (isNumeric(oInputBox.value) == false){
				oResults.push(openFocusLink(oField.FieldName) + formatForReadOut(oField.FieldName) + ' is not a number' + closeFocusLink(oField.FieldName))
			}
		}
		
		
		//is it a date field?
		if (oField.Type == 'Date'){
			if (isDate(oInputBox.value) == false){
				if (oInputBox.value != ''){
					oResults.push(openFocusLink(oField.FieldName) + formatForReadOut(oField.FieldName) + ' is not a valid date' + closeFocusLink(oField.FieldName))
				}
			}
		}
		
		
		//is it an auth code field
		if (oField.Type == 'AuthCode'){
			if (oInputBox.value != sAuthCode){
				if (oInputBox.value != ""){
					oResults.push(openFocusLink(oField.FieldName) + formatForReadOut(oField.FieldName) + ' is not a valid auth code' + closeFocusLink(oField.FieldName))
				}
			}
		}
		
		
		
		
		//is it a "must tick" checkbox?
		if (oField.Type == 'MustTick'){
			if (!oInputBox.checked){
				oResults.push(openFocusLink(oField.FieldName) + formatForReadOut(oField.FieldName) + ' must be ticked' + closeFocusLink(oField.FieldName))				
			}
		}
		
		
		
		
		//is it an email field?
		if (oField.Type == 'Email'){
			if (isEmail(oInputBox.value) == false){
				if (oInputBox.value != ''){
					oResults.push(openFocusLink(oField.FieldName) + formatForReadOut(oField.FieldName) + ' is not a valid email address' + closeFocusLink(oField.FieldName))
				}
			}
		}
		
		//is it a confirmed field?
		if (oField.ConfirmationFieldName != undefined){
			var oConfirmationInputBox = getObject(oField.ConfirmationFieldName)
				if (oInputBox.value != oConfirmationInputBox.value){
					oResults.push(openFocusLink(oField.ConfirmationFieldName) + formatForReadOut(oField.ConfirmationFieldName) + ' does not match ' + formatForReadOut(oField.FieldName) + closeFocusLink(oField.FieldName))
				}
		}
	
	
	}
	
	if (bCheckerShowReadout){
	var sReadout = ''
	
	for (var i = 0;i<oResults.length;i++){
	
	sReadout = sReadout + oResults[i]
	
	
	if (i < oResults.length-1){
			sReadout = sReadout + ', '
		}
	}
	
	var oReadout = getObject('formCheckerReadout')
	
	if (oResults.length == 0){
		sReadout = 'All required fields completed'
	}
	
	oReadout.innerHTML = sReadout
	}
	
	var bAllowSubmit = oResults.length > 0
	oButton.disabled = (bAllowSubmit)

}






function formatForReadOut(sText){
	var sResult = sText
	
	sResult = sResult.replace(/_/g,' ')
	
	return sResult
}



function setFocusOnInput(sInputName){
	getObject(sInputName).focus()
}

function openFocusLink(sElementID){
	var sResult = ''
	
	if (getObject(sElementID).type != 'hidden'){
	sResult = '<a href="javascript:setFocusOnInput(\'' + sElementID + '\')">'
	}
	return sResult
}
function closeFocusLink(sElementID){
	var sResult = ''
	if (getObject(sElementID).type != 'hidden'){
	sResult = '</a>'
	}
	return sResult
}





var arrTickBoxDependencies = new Array()

function addTickBoxDependency(sTickBoxName,sInputName,bBlankOnDisable){

	var oDependency = new Object()
	oDependency.TickBoxName = sTickBoxName
	oDependency.InputName = sInputName
	oDependency.BlankOnDisable = bBlankOnDisable
	
	arrTickBoxDependencies.push(oDependency)
	
	getObject(sTickBoxName).onclick = function(){performAllChecks()}
	
	performAllChecks()
	
}
 

function checkTickBoxDependencies(){
	for (var i = 0;i<arrTickBoxDependencies.length;i++){
	
		var oDependency = arrTickBoxDependencies[i]
		
		
		
		var oTickBox = getObject(oDependency.TickBoxName)
		var oInput = getObject(oDependency.InputName)
		
		oInput.disabled = !oTickBox.checked
		
		if(oInput.disabled == true){
			if(oDependency.BlankOnDisable == true){
				oInput.value = ""
				oInput.onkeyup()
			}
		}
	}
}










var arrMaxLengthFields = new Array()

function addMaxLengthField(sFieldName,lMaxLength,sReadoutID){

	var oMaxLengthField = new Object()
	oMaxLengthField.FieldName = sFieldName
	oMaxLengthField.MaxLength = lMaxLength
	oMaxLengthField.ReadoutID = sReadoutID
	
	arrMaxLengthFields.push(oMaxLengthField)
	
	getObject(sFieldName).onkeyup = function(){performAllChecks()}
	
	performAllChecks()
	
}
 

function checkMaxLengthFields(){
	for (var i = 0;i<arrMaxLengthFields.length;i++){
	
		var oMaxLengthField = arrMaxLengthFields[i]
		
		
		var oInput = getObject(oMaxLengthField.FieldName)
		var oReadout = getObject(oMaxLengthField.ReadoutID)
		
		
		var lMaxLength = oMaxLengthField.MaxLength
		var lRemaining = oMaxLengthField.MaxLength - oInput.value.length
		
		if (lRemaining < 0){
		oInput.value = Left(oInput.value,lMaxLength)
		lRemaining=0
		}
		
		
		
		var sReadout = 'Maximum ' + formatNumber(lMaxLength) + ' characters | ' + formatNumber(lRemaining) + ' characters remaining'
		
		getObject(oMaxLengthField.ReadoutID).innerHTML = sReadout
		
		
	}
	
	
}



function addOneOffNonBlankDependency(sInputID,sButtonID,sAlert){
	getObject(sButtonID).onclick = function(){
		if (getObject(sInputID).value == ''){
			alert(sAlert)
			return false;
		}
	}
}