
window.addEvent('domready', function() {
	var referrerCookieKey = 'referrer';

	var referrer = document.referrer || '';
	if (referrer) {
		referrer = referrer.replace(/^https?:\/\/([^\/]+).*/i, '$1');
	}
	if (referrer.indexOf('google') >= 0) {
		referrer = 'Google';
	}
	else if (referrer.indexOf('yahoo') >= 0) {
		referrer = 'Yahoo';
	}
	else if (referrer.indexOf('autotrader') >= 0) {
		referrer = 'Autotrader';
	}
	else {
		referrer = Cookie.read(referrerCookieKey) || 'SEO'; //default
	}

	Cookie.write(referrerCookieKey, referrer, {path: '/'});

	var fldSearchEngine = $('fldSearchEngine');
	if (fldSearchEngine) {
		fldSearchEngine.set('value', referrer);
	}

	new ConditionalElements('frmContactForm');
});

function checkQuoteForm (frm) {
	frm = $(frm);
	var ret = checkForm(frm);
	var error = false;

	// check occupation is entered if part time
	var v = $('fldTrader').get('value').match('part', 'i');
	var e = $('fldMainOccupation');
	if (v && e.get('value') == '') {
		e.addClass('jpFrmError');
		error = true;
	}
	else {
		e.removeClass('jpFrmError');
	}

	// check that the percentage field is completed if
	// they have selected that they deal in it
	var fields = [
		'fldImports',
		'fldMotorcycles',
		'fldBreakdown',
		'fldPerformance',
		'fldClassics',
		'fldSalvage',
		'fldModified',
		'fldCommercialVehicles'
	];
	fields.each(function (field) {
		var v = $(field).get('value').match('yes', 'i');
		var e = $(field + 'Percent');
		if (v && e.get('value') == '') {
			e.addClass('jpFrmError');
			error = true;
		}
		else {
			e.removeClass('jpFrmError');
		}
	});

	// check personal vehicles
	var v = $('fldPersonalVehicles').get('value').match('yes', 'i');
	var fields = [
		'fldPersonalVehicle%dMake',
		'fldPersonalVehicle%dModel',
		'fldPersonalVehicle%dValue',
		'fldPersonalVehicle%dEngine'
	];
	var n = 4;
	for (var i = 1; i <= n; i++) {
		fields.each(function(field) {
			var e = $(field.replace('%d', i));
			e.removeClass('jpFrmError');
		});
	}
	if (v) {
		var bad = false;
		var blankRows = 0;
		for (var i = 1; i <= n; i++) {
			var rowBlank = true;

			fields.each(function (field) {
				var e = $(field.replace('%d', i));
				if (e.get('value') != '') {
					rowBlank = false;
				}
			});

			if (rowBlank == false) {
				bad = true;
				fields.each(function (field) {
					var e = $(field.replace('%d', i));
					if (e.get('value') == '') {
						e.addClass('jpFrmError');
					}
				});
			}
			else {
				blankRows++;
			}
		}

		if (bad) {
			error = true;
		}
		else if (blankRows == n) {
			var i = 1;
			fields.each(function (field) {
				var e = $(field.replace('%d', i));
				if (e.get('value') == '') {
					e.addClass('jpFrmError');
				}
			});
			error = true;
		}
	}

	// check the named drivers
	var v = $('fldNamedDrivers').get('value');
	$$('#tNamedDriversSpouse input').removeClass('jpFrmError');
	$$('#tNamedDriversDrivers input').removeClass('jpFrmError');
	if (v.match('insured only', 'i')) {
		// clear all the fields
		$$('#tNamedDriversSpouse input', '#tNamedDriversDrivers input').each(function (e) {
			e.set('value', '');
		});
	}
	else if (v.match('spouse', 'i')) {
		var inputs = $$('#tNamedDriversSpouse input');
		inputs.each(function (e) {
			if (e.get('value') == '') {
				error = true;
				e.addClass('jpFrmError');
			}
		});
	}
	else if (v.match('named drivers', 'i')) {
		var rows = $$('#tNamedDriversDrivers tr');
		rows.shift(); // remove the header row
		var blankRows = 0;
		var bad = false;
		rows.each(function (row) {
			var rowBlank = true;
			fields = row.getElements('input');
			fields.each(function (e) {
				if (e.get('value') != '') {
					rowBlank = false;
				}
			});

			if (rowBlank == false) {
				bad = true;
				fields.each(function (e) {
					if (e.get('value') == '') {
						e.addClass('jpFrmError');
					}
				});
			}
			else {
				blankRows++;
			}
		});

		if (bad) {
			error = true;
		}
		else if (blankRows == rows.length) {
			var row = rows.shift();
			fields = row.getElements('input');
			fields.each(function (e) {
				if (e.get('value') == '') {
					e.addClass('jpFrmError');
				}
			});
			error = true;
		}
	}


	// check claims
	var v = $('fldNamedDriverClaims').get('value').match('yes', 'i');
	var fields = [
		'fldClaim%dDriver',
		'fldClaim%dDate',
		'fldClaim%dClaim'
	];
	var n = 7;
	for (var i = 1; i <= n; i++) {
		fields.each(function(field) {
			var e = $(field.replace('%d', i));
			e.removeClass('jpFrmError');
		});
	}
	if (v) {
		var bad = false;
		var blankRows = 0;
		for (var i = 1; i <= n; i++) {
			var rowBlank = true;

			fields.each(function (field) {
				var e = $(field.replace('%d', i));
				if (e.get('value') != '') {
					rowBlank = false;
				}
			});

			if (rowBlank == false) {
				bad = true;
				fields.each(function (field) {
					var e = $(field.replace('%d', i));
					if (e.get('value') == '') {
						e.addClass('jpFrmError');
					}
				});
			}
			else {
				blankRows++;
			}
		}

		if (bad) {
			error = true;
		}
		else if (blankRows == n) {
			var i = 1;
			fields.each(function (field) {
				var e = $(field.replace('%d', i));
				if (e.get('value') == '') {
					e.addClass('jpFrmError');
				}
			});
			error = true;
		}
	}


	// check convictions
	var v = $('fldNamedDriverCons').get('value').match('yes', 'i');
	var fields = [
		'fldConviction%dDriver',
		'fldConviction%dCode',
		'fldConviction%dDate',
		'fldConviction%dFine',
		'fldConviction%dPoints',
		'fldConviction%dBan',
		'fldConviction%dBanTime'
	];
	var n = 7;
	for (var i = 1; i <= n; i++) {
		fields.each(function(field) {
			var e = $(field.replace('%d', i));
			e.removeClass('jpFrmError');
		});
	}
	if (v) {
		var bad = false;
		var blankRows = 0;
		for (var i = 1; i <= n; i++) {
			var rowBlank = true;

			fields.each(function (field) {
				var e = $(field.replace('%d', i));
				e.removeClass('jpFrmError');
				if (e.get('value') != '') {
					rowBlank = false;
				}
			});

			if (rowBlank == false) {
				bad = true;
				fields.each(function (field) {
					var e = $(field.replace('%d', i));
					if (e.get('value') == '') {
						e.addClass('jpFrmError');
					}
				});
			}
			else {
				blankRows++;
			}
		}

		if (bad) {
			error = true;
		}
		else if (blankRows == n) {
			var i = 1;
			fields.each(function (field) {
				var e = $(field.replace('%d', i));
				if (e.get('value') == '') {
					e.addClass('jpFrmError');
				}
			});
			error = true;
		}
	}


	// check criminal record
	var v = $('fldNamedDriverCriminalRecord').get('value').match('yes', 'i');
	if (v) {
		var e = $('fldCrimialRecordBox');
		if (e.get('value') == '') {
			error = true;
			e.addClass('jpFrmError');
		}
	}

	ret = ret && !error;
	return ret;
}

function checkForm(frm) {
	frm = $(frm);

	// check all required fields
	var fields = frm.getElements('.jpFrmRequired');
	var error = 0;

	fields.each(function (e) {
		var bad = false;
		var type = e.type.toLowerCase();
		switch (type) {
			case 'select-one':
			case 'text':
			case 'password':
			case 'textarea':
			case 'file':
				bad = e.value == '' ? 1 : 0;
				if (!bad) {
					if (e.hasClass('jpFrmEmail')) {
						bad = e.value.match(/.+\@.+\..+/) ? 0 : 1;
					}
					else if (e.hasClass('jpFrmNumeric')) {
						bad = e.value.match(/\d+/) ? 0 : 1;
					}
				}
				break;
		}
		error += bad;
		if (bad) {
			// highlight field
			e.addClass('jpFrmError');
		}
		else {
			e.removeClass('jpFrmError');
		}
	});

	var msg = $('jpFrmMessage');
	if (error) {
		if (msg) {
			msg.setStyles({
				display: 'block'
			});
		}
		return false;
	}
	return true;
}



var ConditionalElements = new Class({
	Implements: Options,
	options: {
		className: 'conditionally-hidden'
	},
	form: null,
	inputs: [],
	initialize: function (form, options) {
		this.form = $(form);
		this.setOptions(options);

		if (!this.form) {
			return;
		}

		// get all the conditional elements
		this.elements = this.form.getElements('.' + this.options.className);

		// get the all fields
		var inputs = [].extend(this.form.getElements('input')).extend(this.form.getElements('select')).extend(this.form.getElements('textarea'));
		inputs.each(function (input) {
			this.addInput(input);
		}, this);
	},
	addInput: function (input) {
		var id = input.get('id');
		if (id == '') {
			return;
		}

		var regex = new RegExp('[\\s]?' + id + '-([^\\s]*)[\\s]?', 'g');
		var targets = [];
		this.elements.each(function (element) {
			while (matches = regex.exec(element.get('class'))) {
				targets.push({
					value: matches[1],
					element: element
				});
			}
		}, this);

		if (!targets.length) {
			return;
		}

		this.inputs.push({
			element: input,
			targets: targets
		});

		if (input.nodeName == 'SELECT') {
			input.addEvent('change', function () {
				this.valueChanged(input);
			}.bindWithEvent(this, input));
			this.valueChanged(input);
		}
		else if (input.nodeName == 'INPUT') {
			input.addEvent('click', function () {
				this.valueChanged(input);
			}.bindWithEvent(this, input));

			if (input.get('type') == 'radio') {
				if (input.checked) {
					this.valueChanged(input);
				}
			}
			else {
				this.valueChanged(input);
			}
		}
	},
	formatValue: function (value) {
		// return a lower case, hyphenated version of the value
		var value = new String(value).toLowerCase();
		value = value.replace(/^\s+/g, ''); // strip leading spaces
		value = value.replace(/\s+$/g, ''); // strip trailing spaces
		value = value.replace(/[^a-z\-0-9]/g, '-'); // replace misc characters with hyphens
		value = value.replace(/-+/g, '-'); // replace multiple hyphens with a singe hyphen
		return value;
	},
	setTarget: function (element) {
		var targets = [];
		this.inputs.each(function (input) {
			if (input.element == element) {
				targets = input.targets;
			}
		}, this);

		var value = this.formatValue(element.value);
		if (element.get('type') == 'checkbox') {
			if (!element.get('checked')) {
				value = '';
			}
		}

		var matched = [];
		targets.each(function (target) {
			// hide all the targets
			target.element.addClass(this.options.className);
			if (target.value == value) {
				matched.push(target);
			}
		}, this);
		matched.each(function (target) {
			// show the matched targets
			target.element.removeClass(this.options.className);
		}, this);
		return targets;
	},
	valueChanged: function (element) {
		this.setTarget(element);
	}
});
