function roundNumber(num, dec) {
		var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
		return result;
	}
	function quote() {

		var SALEvalue = parseFloat(document.getElementById('saleValue').value);
                var PURCHASEvalue = parseFloat(document.getElementById('purchaseValue').value);
		var SALEcost = 0;
		var PURCHASEcost = 0;
		if(SALEvalue <= 1000000 || PURCHASEvalue <= 1000000) {

			/////////// first do the part for a sale
			type = 'sale';
		
			var SALEConveyancingFee = applyConveyancingFees(SALEvalue,type);
			SALEcost = SALEcost + SALEConveyancingFee;
		
			var SALEdiscount = tenPercentDiscount(SALEcost);
			SALEcost = SALEcost - SALEdiscount;	

			SALEdiscount = roundNumber(SALEdiscount,2);

			var SALEConveyancingFeeMinusDiscount = SALEConveyancingFee - SALEdiscount;
			SALEConveyancingFeeMinusDiscount = roundNumber(SALEConveyancingFeeMinusDiscount,2);
		
			var SALEvat = addVAT(SALEcost);
			SALEcost = SALEcost + SALEvat;	
			
			var SALElandRegistryFee = applyLandRegistryFees(SALEvalue,type);
			SALEcost = SALEcost + SALElandRegistryFee;						
			
			var SALEstampFee = applyStampDutyFees(SALEvalue,type);
			SALEstampFee = parseInt(SALEstampFee);
			SALEcost = SALEcost + SALEstampFee;
			
			var SALEmiscFees = addMiscFees(SALEvalue,type)	
			SALEcost = SALEcost + SALEmiscFees;
			
			SALEvat = roundNumber(SALEvat, 2);
			SALEcost = roundNumber(SALEcost, 2);
			
			/////////// first do the part for a sale
			type = 'purchase';
		
			var PURCHASEConveyancingFee = applyConveyancingFees(PURCHASEvalue,type);
			PURCHASEcost = PURCHASEcost + PURCHASEConveyancingFee;
		
			var PURCHASEdiscount = tenPercentDiscount(PURCHASEcost);
			PURCHASEcost = PURCHASEcost - PURCHASEdiscount;	

			PURCHASEdiscount = roundNumber(PURCHASEdiscount,2);

			var PURCHASEConveyancingFeeMinusDiscount = PURCHASEConveyancingFee - PURCHASEdiscount;
			PURCHASEConveyancingFeeMinusDiscount = roundNumber(PURCHASEConveyancingFeeMinusDiscount,2);
		
			var PURCHASEvat = addVAT(PURCHASEcost);
			PURCHASEcost = PURCHASEcost + PURCHASEvat;	
			
			var PURCHASElandRegistryFee = applyLandRegistryFees(PURCHASEvalue,type);
			PURCHASEcost = PURCHASEcost + PURCHASElandRegistryFee;						
			
			var PURCHASEstampFee = applyStampDutyFees(PURCHASEvalue,type);
			PURCHASEstampFee = parseInt(PURCHASEstampFee);
			PURCHASEcost = PURCHASEcost + PURCHASEstampFee;
			
			var PURCHASEmiscFees = addMiscFees(PURCHASEvalue,type)	
			PURCHASEcost = PURCHASEcost + PURCHASEmiscFees;
			
			PURCHASEvat = roundNumber(PURCHASEvat, 2);
			PURCHASEcost = roundNumber(PURCHASEcost, 2);
			
			// set the value
			var output;
			output = '<div id="costings">';
			output += '<table cellspacing="0" cellpadding="5">';
                        if(SALEvalue > 0) {
			output += '<tr><td colspan="2"><h3>Sale</h3></td></tr>';
			output += '<tr><td align="right" width="240">Legal Charges on Sale Price of &pound;'+number_format(SALEvalue,2)+' (with 10% online discount): </td><td>&pound;'+number_format(SALEConveyancingFeeMinusDiscount,2) +' </td></tr>';
			output += '<tr><td align="right">VAT: </td><td>&pound;'+number_format(SALEvat,2)+' </td></tr>';
			output += '<tr><td align="right">Official Copies: </td><td>&pound;12.00 </td></tr>';      
			output += '<tr><td align="right"><strong>Total Sale Cost: </strong></td><td><strong>&pound;'+number_format(SALEcost,2)+'</strong></td></tr>'; 
                        } 
			
			if(PURCHASEvalue > 0) {
			output += '<tr><td colspan="2"><h3>Purchase</h3></td></tr>';   
			output += '<tr><td align="right" width="240">Legal Charges on Purchase Price of &pound;'+number_format(PURCHASEvalue,2)+' (with 10% online discount): </td><td>&pound;'+number_format(PURCHASEConveyancingFeeMinusDiscount,2) +' </td></tr>';
			output += '<tr><td align="right">VAT: </td><td>&pound;'+number_format(PURCHASEvat,2)+' </td></tr>';               																														
			output += '<tr><td align="right">Land Registry Fees: </td><td>&pound;'+number_format(PURCHASElandRegistryFee,2)+' </td></tr>';
			output += '<tr><td align="right">Stamp Duty Land Tax: </td><td>&pound;'+number_format(PURCHASEstampFee,2)+' </td></tr>';
			output += '<tr><td align="right">Land Registry Search Fee: </td><td>&pound;6.00 </td></tr>';
			output += '<tr><td align="right">Bankruptcy Search Fee: </td><td>&pound;2.00 </td></tr>';
			output += '<tr><td align="right">Bank Telegraphic Transfer Fee: </td><td>&pound;44.06 </td></tr>';
			output += '<tr><td align="right">Chancel check and Environmental search: </td><td>&pound;57.00 </td></tr>';
			output += '<tr><td align="right"><strong>Total Purchase Cost: </strong></td><td><strong>&pound;'+number_format(PURCHASEcost,2)+'</strong></td></tr>';
                        }
			output += '</table></div>';
			
			

			
output += '<form action="/FormHandler.aspx" method="post" enctype="multipart/form-data" name="quote" onSubmit="return v.exec()">';


if(PURCHASEcost > 0 && SALEcost > 0) {
output += '<input type="hidden" name="FormId" value="15134" />';
}
else {
if(PURCHASEcost > 0) {
output += '<input type="hidden" name="FormId" value="15230" />';
}
if(SALEcost > 0) {
output += '<input type="hidden" name="FormId" value="15229" />';
}
}
output += '<input type="hidden" name="SALEcost" value="'+number_format(SALEcost,2)+'" />';
output += '<input type="hidden" name="SALEConveyancingFee" value="'+number_format(SALEConveyancingFee,2)+'" />';
output += '<input type="hidden" name="SALEdiscount" value="'+number_format(SALEdiscount,2)+'" />';
output += '<input type="hidden" name="SALEvat" value="'+number_format(SALEvat,2)+'" />';
output += '<input type="hidden" name="SALElandRegistryFee" value="'+number_format(SALElandRegistryFee,2)+'" />';
output += '<input type="hidden" name="SALEstampFee" value="'+number_format(SALEstampFee,2)+'" />';
output += '<input type="hidden" name="SALEmiscFees" value="'+number_format(SALEmiscFees,2)+'" />';
output += '<input type="hidden" name="SALEConveyancingFeeMinusDiscount" value="'+number_format(SALEConveyancingFeeMinusDiscount,2)+'" />';


output += '<input type="hidden" name="PURCHASEcost" value="'+number_format(PURCHASEcost,2)+'" />';
output += '<input type="hidden" name="PURCHASEConveyancingFee" value="'+number_format(PURCHASEConveyancingFee,2)+'" />';
output += '<input type="hidden" name="PURCHASEdiscount" value="'+number_format(PURCHASEdiscount,2)+'" />';
output += '<input type="hidden" name="PURCHASEvat" value="'+number_format(PURCHASEvat,2)+'" />';
output += '<input type="hidden" name="PURCHASElandRegistryFee" value="'+number_format(PURCHASElandRegistryFee,2)+'" />';
output += '<input type="hidden" name="PURCHASEstampFee" value="'+number_format(PURCHASEstampFee,2)+'" />';
output += '<input type="hidden" name="PURCHASEmiscFees" value="'+number_format(PURCHASEmiscFees,2)+'" />';
output += '<input type="hidden" name="PURCHASEConveyancingFeeMinusDiscount" value="'+number_format(PURCHASEConveyancingFeeMinusDiscount,2)+'" />';

output += '<input type="hidden" name="PURCHASEvalue" value="'+number_format(PURCHASEvalue,2)+'" />';
output += '<input type="hidden" name="SALEvalue" value="'+number_format(SALEvalue,2)+'" />';
output += '<table>';
output += '<tr>';
output += '<td>First Name:</td><td><input type="text" name="firstName" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>Last Name:</td><td><input type="text" name="lastName" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>Street Address:</td><td><input type="text" name="streetAddress" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>Address(cont.):</td><td><input type="text" name="address2" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>City:</td><td><input type="text" name="city" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>County:</td><td><input type="text" name="county" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>Postcode:</td><td><input type="text" name="postcode" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>Work Phone:</td><td><input type="text" name="workPhone" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>Home Phone:</td><td><input type="text" name="homePhone" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>FAX:</td><td><input type="text" name="fax" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td>E-mail:</td><td><input type="text" name="emailaddress" id="emailaddress" /></td>';
output += '</tr>';
output += '<tr>';
output += '<td colspan="2"><input type="submit" value="Yes, I am interested" /></td>';
output += '</tr>';
output += '</table>';
output += '</form>';

	
			document.getElementById('finalValue').innerHTML = output;	
		} else {
			if(SALEvalue > 1000000 || PURCHASEvalue > 1000000) {
				alert ('Please accept our apologies we cannot, quote online for properties over £1,000,000, please contact us on 01635 50 80 80 for more information.');
			} else {
				alert ('Please enter a number between 0 and 1000000');
			}
		}
	}
	function tenPercentDiscount(cost) {
		return roundNumber(parseFloat(cost*0.1),2);
	}
	function addVAT(cost) {
		return parseFloat(cost*0.175);
	}
	function addMiscFees(value,type) {
		switch(type) {
			case 'purchase':
				//return 95.76;
				return 108.13;
			break
			case 'sale':
				return 12;
			break
		}
	}
	function applyLandRegistryFees(value,type) {	
		if(type == 'purchase') {
		if(value > 0 && value <= 50000) {
			return 50;
		}
		if(value > 50001 && value <= 80000) {
			return 80;
		}
		if(value > 80001 && value <= 100000) {
			return 130;
		}
		if(value > 100001 && value <= 200000) {
			return 200;
		}
		if(value > 200001 && value <= 500000) {
			return 280;
		}
		if(value > 500001 && value <= 1000000) {
			return 550;
		}
		if(value > 1000001) {
			return 920;
		}
		}
		if(type == 'sale') {
		    return 0;
		}
	}
	function applyConveyancingFees(value,type) {
		switch(type) {
			case 'purchase':
				if(value > 0 && value <= 75000) {
					return 425;
				}
				if(value > 75000 && value <= 100000) {
					return 460;
				}
				if(value > 100000 && value <= 125000) {
					return 525;
				}
				if(value > 125000 && value <= 180000) {
					return 560;
				}
				if(value > 180000 && value <= 220000) {
					return 600;
				}
				if(value > 220000 && value <= 260000) {
					return 650;
				}
				if(value > 260000 && value <= 300000) {
					return 695;
				}
				if(value > 300000 && value <= 350000) {
					return 750;
				}
				if(value > 350000 && value <= 400000) {
					return 795;
				}
				if(value > 400000 && value <= 500000) {
					return 895;
				}
				if(value > 500000 && value <= 600000) {
					return 995;
				}
				if(value > 600000 && value <= 700000) {
					return 1100;
				}
				if(value > 700000 && value <= 800000) {
					return 1300;
				}
				if(value > 800000 && value <= 900000) {
					return 1500;
				}
				if(value > 900000 && value <= 1000000) {
					return 1800;
				}
			break  
			case 'sale':
				if(value > 0 && value <= 75000) {
					return 425;
				}
				if(value > 75000 && value <= 100000) {
					return 460;
				}
				if(value > 100000 && value <= 125000) {
					return 495;
				}
				if(value > 125000 && value <= 180000) {
					return 535;
				}
				if(value > 180000 && value <= 220000) {
					return 570;
				}
				if(value > 220000 && value <= 260000) {
					return 610;
				}
				if(value > 260000 && value <= 300000) {
					return 650;
				}
				if(value > 300000 && value <= 350000) {
					return 695;
				}
				if(value > 350000 && value <= 400000) {
					return 750;
				}
				if(value > 400000 && value <= 500000) {
					return 805;
				}
				if(value > 500000 && value <= 600000) {
					return 895;
				}
				if(value > 600000 && value <= 700000) {
					return 995;
				}
				if(value > 700000 && value <= 800000) {
					return 1200;
				}
				if(value > 800000 && value <= 900000) {
					return 1400;
				}
				if(value > 900000 && value <= 1000000) {
					return 1650;
				}
			break
		}
	}
	function applyStampDutyFees(value,type) {
                if(type == 'purchase') {
		if(value > 0 && value <= 125000) {
			return 0;
		}
		if(value > 125000 && value <= 250000) {
			return parseFloat(parseFloat(value)*0.01);
		}
		if(value > 250000 && value <= 500000) {
			return parseFloat(parseFloat(value)*0.03);
		}
		if(value > 500000) {
			return parseFloat(parseFloat(value)*0.04);
		}
                }
                if(type == 'sale') {
		    return 0;
		}
	}



/****************************************************************************************************/
/* Form Validator ***********************************************************************************/
/****************************************************************************************************/

// Title: Tigra Form Validator
// URL: http://www.softcomplex.com/products/tigra_form_validator/
// Version: 1.2
// Date: 07/11/2005 (mm/dd/yyyy)
// Note: Permission given to use this script in ANY kind of applications if
// header lines are left unchanged.

// regular expressions or function to validate the format
var re_dt = /^(\d{1,2})\-(\d{1,2})\-(\d{4})$/,
re_tm = /^(\d{1,2})\:(\d{1,2})\:(\d{1,2})$/,
a_formats = {
	'alpha'   : /^[a-zA-Z\.\-]*$/,
	'alphanum': /^\w+$/,
	'unsigned': /^\d+$/,
	'integer' : /^[\+\-]?\d*$/,
	'real'    : /^[\+\-]?\d*\.?\d*$/,
	'email'   : /^[\w-\.]+\@[\w\.-]+\.[a-z]{2,4}$/,
	'phone'   : /^[\d\.\s\-]+$/,
	'date'    : function (s_date) {
		// check format
		if (!re_dt.test(s_date))
			return false;
		// check allowed ranges	
		if (RegExp.$1 > 31 || RegExp.$2 > 12)
			return false;
		// check number of day in month
		var dt_test = new Date(RegExp.$3, Number(RegExp.$2-1), RegExp.$1);
		if (dt_test.getMonth() != Number(RegExp.$2-1))
			return false;
		return true;
	},
	'time'    : function validate_time(s_time) {
		// check format
		if (!re_tm.test(s_time))
			return false;
		// check allowed ranges	
		if (RegExp.$1 > 23 || RegExp.$2 > 59 || RegExp.$3 > 59)
			return false;
		return true;
	}
},
a_messages = [
	'No form name passed to validator construction routine',
	'No array of "%form%" form fields passed to validator construction routine',
	'Form "%form%" can not be found in this document',
	'Incomplete "%n%" form field descriptor entry. "l" attribute is missing',
	'Can not find form field "%n%" in the form "%form%"',
	'Can not find label tag (id="%t%")',
	'Can not verify match. Field "%m%" was not found',
	'"%l%" is a required field',
	'Value for "%l%" must be %mn% characters or more',
	'Value for "%l%" must be no longer than %mx% characters',
	'"%v%" is not valid value for "%l%"',
	'"%l%" must match "%ml%"'
]

// validator counstruction routine
function validator(s_form, a_fields, o_cfg) {
	this.f_error = validator_error;
	this.f_alert = o_cfg && o_cfg.alert
		? function(s_msg) { alert(s_msg); return false }
		: function() { return false };
		
	// check required parameters
	if (!s_form)	
		return this.f_alert(this.f_error(0));
	this.s_form = s_form;
	
	if (!a_fields || typeof(a_fields) != 'object')
		return this.f_alert(this.f_error(1));
	this.a_fields = a_fields;

	this.a_2disable = o_cfg && o_cfg['to_disable'] && typeof(o_cfg['to_disable']) == 'object'
		? o_cfg['to_disable']
		: [];
		
	this.exec = validator_exec;
}

// validator execution method
function validator_exec() {
	var o_form = document.forms[this.s_form];
	if (!o_form)	
		return this.f_alert(this.f_error(2));
		
	b_dom = document.body && document.body.innerHTML;
	
	// check integrity of the form fields description structure
	for (var n_key in this.a_fields) {
		// check input description entry
		this.a_fields[n_key]['n'] = n_key;
		if (!this.a_fields[n_key]['l'])
			return this.f_alert(this.f_error(3, this.a_fields[n_key]));
		o_input = o_form.elements[n_key];
		if (!o_input)
			return this.f_alert(this.f_error(4, this.a_fields[n_key]));
		this.a_fields[n_key].o_input = o_input;
	}

	// reset labels highlight
	if (b_dom)
		for (var n_key in this.a_fields) 
			if (this.a_fields[n_key]['t']) {
				var s_labeltag = this.a_fields[n_key]['t'], e_labeltag = get_element(s_labeltag);
				if (!e_labeltag)
					return this.f_alert(this.f_error(5, this.a_fields[n_key]));
				this.a_fields[n_key].o_tag = e_labeltag;
				
				// normal state parameters assigned here
				e_labeltag.className = 'tfvNormal';
			}

	// collect values depending on the type of the input
	for (var n_key in this.a_fields) {
		var s_value = '';
		o_input = this.a_fields[n_key].o_input;
		if (o_input.type == 'checkbox') // checkbox
			s_value = o_input.checked ? o_input.value : '';
		else if (o_input.value) // text, password, hidden
			s_value = o_input.value;
		else if (o_input.options) // select
			s_value = o_input.selectedIndex > -1
				? o_input.options[o_input.selectedIndex].value
				: null;
		else if (o_input.length > 0) // radiobuton
			for (var n_index = 0; n_index < o_input.length; n_index++)
				if (o_input[n_index].checked) {
					s_value = o_input[n_index].value;
					break;
				}
		this.a_fields[n_key]['v'] = s_value.replace(/(^\s+)|(\s+$)/g, '');
	}
	
	// check for errors
	var n_errors_count = 0,
		n_another, o_format_check;
	for (var n_key in this.a_fields) {
		o_format_check = this.a_fields[n_key]['f'] && a_formats[this.a_fields[n_key]['f']]
			? a_formats[this.a_fields[n_key]['f']]
			: null;

		// reset previous error if any
		this.a_fields[n_key].n_error = null;

		// check reqired fields
		if (this.a_fields[n_key]['r'] && !this.a_fields[n_key]['v']) {
			this.a_fields[n_key].n_error = 1;
			n_errors_count++;
		}
		// check length
		else if (this.a_fields[n_key]['mn'] && this.a_fields[n_key]['v'] != '' && String(this.a_fields[n_key]['v']).length < this.a_fields[n_key]['mn']) {
			this.a_fields[n_key].n_error = 2;
			n_errors_count++;
		}
		else if (this.a_fields[n_key]['mx'] && String(this.a_fields[n_key]['v']).length > this.a_fields[n_key]['mx']) {
			this.a_fields[n_key].n_error = 3;
			n_errors_count++;
		}
		// check format
		else if (this.a_fields[n_key]['v'] && this.a_fields[n_key]['f'] && (
			(typeof(o_format_check) == 'function'
			&& !o_format_check(this.a_fields[n_key]['v']))
			|| (typeof(o_format_check) != 'function'
			&& !o_format_check.test(this.a_fields[n_key]['v'])))
			) {
			this.a_fields[n_key].n_error = 4;
			n_errors_count++;
		}
		// check match	
		else if (this.a_fields[n_key]['m']) {
			for (var n_key2 in this.a_fields)
				if (n_key2 == this.a_fields[n_key]['m']) {
					n_another = n_key2;
					break;
				}
			if (n_another == null)
				return this.f_alert(this.f_error(6, this.a_fields[n_key]));
			if (this.a_fields[n_another]['v'] != this.a_fields[n_key]['v']) {
				this.a_fields[n_key]['ml'] = this.a_fields[n_another]['l'];
				this.a_fields[n_key].n_error = 5;
				n_errors_count++;
			}
		}
		
	}

	// collect error messages and highlight captions for errorneous fields
	var s_alert_message = '',
		e_first_error;

	if (n_errors_count) {
		for (var n_key in this.a_fields) {
			var n_error_type = this.a_fields[n_key].n_error,
				s_message = '';
				
			if (n_error_type)
				s_message = this.f_error(n_error_type + 6, this.a_fields[n_key]);

			if (s_message) {
				if (!e_first_error)
					e_first_error = o_form.elements[n_key];
				s_alert_message += s_message + "\n";
				// highlighted state parameters assigned here
				if (b_dom && this.a_fields[n_key].o_tag)
					this.a_fields[n_key].o_tag.className = 'tfvHighlight';
			}
		}
		alert(s_alert_message);
		// set focus to first errorneous field
		if (e_first_error.focus && e_first_error.type != 'hidden'  && !e_first_error.disabled)
			eval("e_first_error.focus()");
		// cancel form submission if errors detected
		return false;
	}
	
	for (n_key in this.a_2disable)
		if (o_form.elements[this.a_2disable[n_key]])
			o_form.elements[this.a_2disable[n_key]].disabled = true;

	return true;
}

function validator_error(n_index) {
	var s_ = a_messages[n_index], n_i = 1, s_key;
	for (; n_i < arguments.length; n_i ++)
		for (s_key in arguments[n_i])
			s_ = s_.replace('%' + s_key + '%', arguments[n_i][s_key]);
	s_ = s_.replace('%form%', this.s_form);
	return s_
}

function get_element (s_id) {
	return (document.all ? document.all[s_id] : (document.getElementById ? document.getElementById(s_id) : null));
}





// {{{ number_format
function number_format( number, decimals, dec_point, thousands_sep ) {
    // Format a number with grouped thousands
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/
    // +       version: 809.2411
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // *     example 1: number_format(1234.5678, 2, '.', '');
    // *     returns 1: 1234.57     

    var n = number, c = isNaN(decimals = Math.abs(decimals)) ? 2 : decimals;
    var d = dec_point == undefined ? "." : dec_point;
    var t = thousands_sep == undefined ? "," : thousands_sep, s = n < 0 ? "-" : "";
    var i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", j = (j = i.length) > 3 ? j % 3 : 0;
    
    return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
}// }}}



















