/* <![CDATA[ */


/* run on document load */
function loadedInit(){
	Forms.check();
}

var Calculator={
	checkNumber:function(input,min,max,msg){
		var value=input.type?input.value:input; // allows both a form field and a discrete value to be passed
		msg+=' field has invalid data: '+value;
		if(!/^\d\.?\d*$/.test(value)){alert(msg);return false;}
		var num=parseFloat(value);
		if((num<min)||(max<num)){alert(msg+' not in range ['+min+'..'+max+']');return false;}
		return true;
	}
};

var Forms={
	check:function(){
		if(document.getElementById('app')){ // mortgage application form
			Events.add(document.getElementById('app'),'submit',checkApplication);
			Events.add(document.getElementById('app_joint_0'),'click',toggleJoint);
			Events.add(document.getElementById('app_joint_1'),'click',toggleJoint);
		}
		if(document.getElementById('calc')){ // index page calculator
			Events.add(document.getElementById('incomeBorrow'),'click',LoanCalculator.borrow);
			Events.add(document.getElementById('incomeLend'),'click',LoanCalculator.lend);
		}
		if(document.getElementById('callMeBack')){ // callmeback form
			Events.add(document.getElementById('callMeBack'),'submit',checkCallMeBack);
		}
		if(document.getElementById('enquiry')){ // contact us
			Events.add(document.getElementById('enquiry'),'submit',checkEnquiry);
		}
		if(document.getElementById('frmCalc')){ // mortgage calculator
			Events.add(document.getElementById('frmCalc'),'submit',MortgageCalculator.calc);
			Events.add(document.getElementById('frmCalc_main'),'blur',MortgageCalculator.income);
			Events.add(document.getElementById('frmCalc_supp'),'blur',MortgageCalculator.income);
		}
	}
};

var LoanCalculator={
	borrow:function(event){
		Events.cancel(event);event.target.blur();
		var f=document.forms['calc'],mainlend=parseFloat(f['mainincome'].value),sublend=parseFloat(f['subincome'].value);
		if(isNaN(mainlend)){mainlend=0;}else{mainlend=Math.max(0,mainlend);}
		if(isNaN(sublend)){sublend=0;}else{sublend=Math.max(0,sublend);}
		var multmax=4.5,multmin=3;
		f['mainincome'].value=mainlend;f['subincome'].value=sublend;
		f['maxlend'].value=Math.floor((mainlend+sublend)*multmax);
		f['minlend'].value=Math.floor((mainlend+sublend)*multmin);
	},
	checkNumber:Calculator.checkNumber,
	lend:function(event){
		Events.cancel(event);event.target.blur();
		var f=document.forms['calc'];
		if(!LoanCalculator.checkNumber(f['interest'],0.001,99,'Interest')||
			!LoanCalculator.checkNumber(f['totalint'],100,10000000,'Total Interest')){f['payment'].value='Invalid';return;}
		var repaid=0.01*Math.round(100*(f['totalint'].value*(f['interest'].value/100)/12));
		f['payment'].value=repaid.toFixed(2);
	}
};

var err={focus:'',msg:''};

/*Mortgage calculator */
var MortgageCalculator={
	calc:function(event){
		Events.cancel(event);
		var lend={ // get details from form
			amount:document.getElementById('frmCalc_amount').value,
			interest:0,interest6:0,
			maxLend:document.getElementById('frmCalc_maxLend').value,minLend:document.getElementById('frmCalc_minLend').value,
			period:document.getElementById('frmCalc_period').value,rate:document.getElementById('frmCalc_rate').value,
			repay:0,repay6:0
		};
		if(isNaN(parseFloat(lend.maxlend))||isNaN(parseFloat(lend.minlend))){ // attempt to populate max and min lend
			var temp=MortgageCalculator.income();lend.maxLend=temp.maxLend;lend.minLend=temp.minLend;
		}
		if(isNaN(parseFloat(lend.maxLend))||isNaN(parseFloat(lend.minLend))||
			(parseInt(lend.maxLend,10)===0)||(parseInt(lend.minLend,10)===0)){ // can't do this, so don't try
			alert('Please complete the annual income field(s)');document.getElementById('frmCalc_main').focus();return false;
		}
		if(MortgageCalculator.checkNumber(lend.amount,lend.minLend,lend.maxLend,'Mortgage required')&&
			MortgageCalculator.checkNumber(lend.period,5,40,'Repayment period')&&
			MortgageCalculator.checkNumber(lend.rate,0.001,1000,'Interest rate')){ // everything checks out, proceed
			var fields=['interest','interest6','repay','repay6'],field;
			while((field=fields.pop())){
				lend[field]=MortgageCalculator[field.replace('6','')]({amount:lend.amount,period:lend.period,rate:(field.indexOf('6')!=-1)?6:lend.rate});
				document.getElementById('frmCalc_'+field).value=MortgageCalculator.checkResult(Math.floor(lend[field]*100)/100);
			}
		}
	},
	checkNumber:Calculator.checkNumber,
	checkResult:function(n,b){return (n!==0)?(b||(Math.floor(n)!=n))?n.toFixed(2):n:'n/a';},
	income:function(event){
		var main=parseFloat(document.getElementById('frmCalc_main').value),supp=parseFloat(document.getElementById('frmCalc_supp').value);
		if(isNaN(main)){main=0;}else{main=Math.max(0,main);}
		if(isNaN(supp)){supp=0;}else{supp=Math.max(0,supp);}
		var multmax=4.5,multmin=3;
		var lend={maxLend:(main+supp)*multmax,minLend:(main+supp)*multmin};
		document.getElementById('frmCalc_maxLend').value=MortgageCalculator.checkResult(lend.maxLend,false);
		document.getElementById('frmCalc_minLend').value=MortgageCalculator.checkResult(lend.minLend,false);
		return lend;
	},
	interest:function(lend){return (lend.amount*(lend.rate/100))/12;},
	repay:function(lend){return ((lend.amount*(lend.rate/100))/12) * (1/(1-(Math.pow(1/(1+(lend.rate/100)),lend.period))));}
};

/* Mortgage application */
function checkApplication(event){
	err.focus='';err.msg='';
	var app={ // fields and associated text for application
		'amount':'amount',
		'purchasePrice':'purchase price',
		'agree':'You must agree to the terms and conditions'
	};
	var applicant={ // fields and associated text for applicant
		'firstName':'First name',
		'surName':'Surname',
		'GBP':'Gross Annual Pay',
		'mobilePhone':'Mobile telephone',
		'homePhone':'Home telephone',
		'workPhone':'Work telephone',
		'email':'Email',
		'postcode':'Postcode',
		'address':'Address'
	};
	var form=document.getElementById('app'),key;for(key in app){applicant[key]=app[key];}
	// first check the main applicant JOINED with app required fields (always present)
	checkAppKeys(applicant,form.id);
	if(!err.msg.length&&document.getElementById(form.id+'_joint_1').checked){ // check the joint applicant
		for(key in app){try{delete applicant[key];}catch(ex){applicant[key]=null;}} // remove the app elements
		checkAppKeys(applicant,form.id,true);
	}
	var valid=(err.msg.length===0);
	if(!valid){Events.cancel(event);if(err.focus.length){document.getElementById(err.focus).focus();}alert(err.msg);}
	return valid;
}

function checkAppKeys(obj,id,joint){
	joint=joint||false;
	var ok=true,text;
	for(var key in obj){
		if(obj[key]){
			if(!joint&&(key=='agree')&&!document.getElementById(id+'_'+key).checked){err.msg=obj[key];}
			else if(!document.getElementById(id+'_'+key+(joint?'Joint':'')).value.length){err.focus=id+'_'+key+(joint?'Joint':'');err.msg='Invalid '+(joint?'Joint ':'')+obj[key];}
			else{
				text=document.getElementById(id+'_'+key+(joint?'Joint':'')).value;
				switch(key){
					case 'email':ok=/^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/.test(text);break;
					case 'homePhone':case 'mobilePhone':case 'workPhone':ok=/^0([125]\d{9}|7[57890]\d{8})$/.test(text.replace(/[^\d]/g,''));break;
					case 'postcode':ok=/^([A-Z][A-Z]?\d\d?|([NS]?[EW]|[EW]C)\d(\d?|[A-Z]))\d[A-Z]{2}$/i.test(text.replace(/\s/g,''));break;
					case 'GBP':case 'amount':case 'purchasePrice':ok=/^\d+$/.test(text.replace(/[^\d]/g,''))&&(parseFloat(text.replace(/[^\d]/g,''))!==0);break;
				}
				if(!ok){err.focus=id+'_'+key+(joint?'Joint':'');err.msg='Invalid '+(joint?'Joint ':'')+obj[key];}
			}
			if(err.msg.length){break;}
		}
	}
}
function toggleJoint(event){document.getElementById('app_Joint').style.display=/_0$/.test(event.target.id)?'none':'';}


/* Call Me Back form */
function checkCallMeBack(event){
	err.focus='';err.msg='';
	var callMeBack={ // fields and asociated text for CallMeBack
		'firstName':'First name',
		'surName':'Surname',
		'phone':'Telephone',
		'bestTime':'best time to call you'
	};
	checkCallMeBackKeys(callMeBack,'callMeBack');
	var valid=(err.msg.length===0);
	if(!valid){Events.cancel(event);if(err.focus.length){document.getElementById(err.focus).focus();}alert(err.msg);}
	return valid;
}
function checkCallMeBackKeys(obj,id){
	var ok=true,text;
	for(var key in obj){
		if(obj[key]&&document.getElementById(id+'_'+key)){
			if(!document.getElementById(id+'_'+key).value.length){err.focus=id+'_'+key;err.msg='Invalid '+obj[key];}
			else{
				text=document.getElementById(id+'_'+key).value;
				switch(key){
					case 'phone':ok=/^0([125]\d{9}|7[57890]\d{8})$/.test(text.replace(/[^\d]/g,''));break;
				}
				if(!ok){err.focus=id+'_'+key;err.msg='Invalid '+obj[key];}
			}
		}
		if(err.msg.length){break;}
	}
}

/* Enquiry form */
function checkEnquiry(event){
	err.focus='';err.msg='';
	var enquiry={ // fields and associated text for application
		'firstName':'First name',
		'surName':'Surname',
		'phone':'Telephone',
		'email':'Email',
		'comments':'Enquiry'			
	};
	checkEnqKeys(enquiry,'enquiry');
	var valid=(err.msg.length===0);
	if(!valid){Events.cancel(event);if(err.focus.length){document.getElementById(err.focus).focus();}alert(err.msg);}
	return valid;
}
function checkEnqKeys(obj,id){
	var ok=true,text;
	for(var key in obj){
		if(obj[key]&&document.getElementById(id+'_'+key)){
			if(!document.getElementById(id+'_'+key).value.length){err.focus=id+'_'+key;err.msg='Invalid '+obj[key];}
			else{
				text=document.getElementById(id+'_'+key).value;
				switch(key){
					case 'email':ok=/^([a-zA-Z0-9_.-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,4})+$/.test(text);break;
					case 'phone':ok=/^0([125]\d{9}|7[57890]\d{8})$/.test(text.replace(/[^\d]/g,''));break;
				}
				if(!ok){err.focus=id+'_'+key;err.msg='Invalid '+obj[key];}
			}
		}
		if(err.msg.length){break;}
	}
}

/* ]]> */
