// vim: set ts=4 sts=4 sw=4 si noet:

$(function() {

	var notcovered = function() {
		if (confirm('Sorry, we currently do not have coverage in this area. \r\n' +
			'Please provide your address so that we could notify you\r\n' +
			'when your area is covered in the future')) {
			$('#not-covered').trigger('click');
		}
	}

	$register = $('#register');
	$form = $('#RegistrationRegisterForm');
	$submit = $('#submit_registration', $form);
	$captcha_container = $('#captcha-container');

	/*
	$.validator.setDefaults({
		debug: false,
		success: 'valid'
	});

	$.validator.messages = {
		required: validation_required,
		email: validation_email,
		number: validation_number,
		minlength: $.validator.format(validation_minlength)
	};
	*/

	submitRegistration = function() {
		if ($form.valid()) {
			$form.get(0).submit();
		}
		return false;
	}

	var validCaptcha;

	$form.validate({
		errorPlacement: function(label, el) {
			el.parent().append(label);
		},

		rules: {

			'data[Registration][CustName]': {
				required: true,
				minlength: 5
			},

			'data[Registration][Phone]': {
				required: true,
				minlength: 6
			},

			'data[Registration][HP]': {
				required: true,
				minlength: 8
			},

			'data[Registration][Email]': {
				required: true,
				email: true
			},

			'captcha_response_field': {
				required: true,
				remote: {
					url: fmweb.cfg.base + '/registration/validate_code.json',
					type: 'post',

					data: {
						captcha_response_field: function() {
							return $("input#captcha_response_field").val();
						}
					},

					dataFilter: function(responseText) {
						validCaptcha = $.parseJSON(responseText);
						return validCaptcha;
					},

					complete: function() {
						if (validCaptcha) {
							$captcha_container.removeClass('error');
						} else {
							$captcha_container.addClass('error');
						}
						return validCaptcha;
					}
				}
			},

			'data[Registration][City]': {
				required: true
			},

			'data[Registration][RegistrationIdLev3]': {
				required: true
			},

			'data[Registration][PostalCode]': {
				required: true
			}

		},

		messages: {
			'recaptcha_response_field': {
				remote: 'Please try again'
			},
			'captcha_response_field': {
				remote: 'Please try again'
			}
		},

		focusInvalid: true,
		onkeyup: false

	});

	$city = $('#RegistrationCity', $form);
	$area = $('#RegistrationIdLev3', $form);
	$postcode = $('#RegistrationPostalCode', $form);

	$houseDiv = $('#house', $form);
	$buildingDiv = $('#building', $form);
	$type = $('[name="data[Registration][type]"]', $form);
	$complex = $('#RegistrationComplexName', $form);
	$building = $('#RegistrationBuilding', $form);
	$street = $('#RegistrationStreetName', $form);
	$floor = $('#RegistrationFloorRoom', $form);
	$abl = $('#abl', $form);
	$addresses = $('#addresses', $form);
	$coverage_address = $('#RegistrationAddress', $form);

	$House = $('#RegistrationHouse', $form);
	$Cust = $('#RegistrationCust', $form);
	$Covered = $('#RegistrationCovered', $form);

	var pleaseChoose = '<option value="">-- Please choose --</option>';

	resetSelection = function() {
		$building.html(pleaseChoose);
		$complex.html(pleaseChoose);
		$floor.val('');
		$coverage_address.val('').parent('div.input').hide();;
		$addresses
			.parent('fieldset').hide().stop()
			.find('#tbody').html('');
	}

	var populateAreaPostal = function(json) {
		var areaText = postalText = pleaseChoose;
		var selectedArea = $area.find(':selected').val();
		var postcodes = [];
		for (var i in json) {
			var area = json[i];
			areaText += '<option value="' + i + '">' + area + '</option>';
			postcodes.push(i);
		}
		postcodes.sort();
		for (var j in postcodes) {
			var zip = postcodes[j];
			postalText += '<option value="' + zip + '">' + zip + '</option>';
		}
		$area
			.html(areaText)
			.parent('div.input')
				.removeClass('loading');
		$postcode
			.html(postalText)
			.parent('div.input')
				.removeClass('loading');
	}

	var populateArea = function(json) {
		var areaText = postalText = pleaseChoose;
		for (var i in json) {
			var area = json[i];
			areaText += '<option value="' + i + '">' + area + '</option>';
		}
		$area
			.html(areaText)
			.parent('div.input')
			.removeClass('loading');
	}

	$form.delegate($city.selector, 'change', function() {
		resetSelection();
		if (this.value == '') return;
		$area.parent('div').addClass('loading');
		$postcode.parent('div').addClass('loading');

		var url = fmweb.cfg.base + '/registration/areas/' + this.value + '.json';
		$.getJSON(url, null, populateAreaPostal)
	});

	$form.delegate($area.selector, 'change', function() {
		resetSelection();
		$postcode.val(this.value);
		$($type.selector + ':checked').removeAttr('checked');
	});

	$form.delegate($postcode.selector, 'change', function() {
		resetSelection();
		$area.val(this.value);
		$street.find(':selected').removeAttr('selected');
		$($type.selector + ':checked').removeAttr('checked');
	});

	var populateComplex = function(json) {
		var complexText = streetText = pleaseChoose;

		for (var i in json.complexes) {
			var complex = json.complexes[i];
			complexText += '<option value="' + complex + '">' + complex + '</option>';
		}

		for (var i in json.streets) {
			var street = json.streets[i];
			streetText += '<option value="' + street + '">' + street + '</option>';
		}

		$complex
			.html(complexText)
			.parent('div.input.loading')
			.removeClass('loading');

		$street
			.html(streetText)
			.parent('div.input.loading')
			.removeClass('loading');

		if (json.streets.length == 0) {
			notcovered();
		}
	}

	var populateBuilding = function(json) {
		var buildingText = pleaseChoose;

		for (var i in json.buildings) {
			var building = json.buildings[i];
			buildingText += '<option value="' + building + '">' + building + '</option>';
		}

		$building
			.html(buildingText)
			.parent('div.input.loading')
			.removeClass('loading');

		if (json.buildings.length == 0) {
			notcovered();
		}
	}

	$form.delegate($type.selector, 'change', function() {
		resetSelection();
		if ($postcode.val() == '') {
			return;
		}
		var which = $($type.selector + ':checked').val();
		switch (which) {
		case '2':
			$houseDiv.hide(); $buildingDiv.show();
			$complex.parent('div.input').addClass('loading');
			$street.parent('div.input').addClass('loading');
			var url = fmweb.cfg.base + '/registration/building_address/' + $postcode.val() + '.json';
			$.getJSON(url, null, populateBuilding);
			break;

		case '1':
		default:
			$houseDiv.show(); $buildingDiv.hide();
			$buildingDiv.parent('div.input').addClass('loading');
			var url = fmweb.cfg.base + '/registration/house_address/' + $postcode.val() + '.json';
			$.getJSON(url, null, populateComplex);
			break;
		}

	});

	$form.delegate($complex.selector, 'change', function() {
		if (this.value == '') {
			$street.find(':selected').removeAttr('selected');
			return;
		}
		$street.parent('div.input').addClass('loading');
		$abl.hide();
		$addresses.find('#tbody').html('');
		var url = fmweb.cfg.base + '/registration/complex_address/' + $complex.val() + '.json';
		$.getJSON(url, null, function(json) {
			var streetText = pleaseChoose;

			for (var i in json.streets) {
				var street = json.streets[i];
				streetText += '<option value="' + street + '">' + street + '</option>';
			}

			$street
				.html(streetText)
				.parent('div.input.loading')
				.removeClass('loading');
		});
	});

	$form.delegate($street.selector, 'change', function() {
		$addresses.find('#tbody').html('');
		$abl.addClass('loading').show();
		var complex = $complex.val();
		if (complex == '') {
			complex = 'all';
		}
		if (($postcode.val() == '') || $street.val() == '') {
			return;
		}
		var url = fmweb.cfg.base + '/registration/abl/' +
			encodeURIComponent($postcode.val()) + '/' +
			encodeURIComponent(complex) + '/' +
			encodeURIComponent($street.val()) +
			'.json';

		$.getJSON(url, null, function(json) {

			var tbody = '<table>';

			var j = 1;
			for (var i in json) {
				var addr = json[i].ExtAreaLev5Abl;
				tbody +=
					'<tr id="address-' + j + '" class="address-row">' +
					'<td class=no>' + j + '</td>' +
					'<td class="cust hidden">' + $.trim(addr.cust) + '</td>' +
					'<td class="house hidden">' + $.trim(addr.house) + '</td>' +
					'<td class=icomplex_name>' + $.trim(addr.icomplex_name) + '</td>' +
					'<td class=istreet_name>' + $.trim(addr.istreet_name) + '</td>' +
					'<td class=ino>' + $.trim(addr.ino) + '</td>' +
					'<td class=action><input class=select-address type=button value=Register address-id=' + j + ' /></td>' +
					'</tr>';
				j++;
			}
			tbody += '</table>';

			$addresses.find('#tbody')
				.html(tbody);

			$abl
				.removeClass('loading')
				.show();

			if (json.length == 0) {
				notcovered();
			}

		});
	});

	$register.delegate('input.select-address', 'click', function (e) {
		$this = $(this);
		var $addressRow = $('#address-' + $this.attr('address-id'));
		var addressText = $addressRow.find('td.istreet_name').html() + ' No.' + $addressRow.find('td.ino').html() + '\r\n';
		var complexName = $addressRow.find('td.icomplex_name').html()

		$House.val($addressRow.find('td.house').html());
		$Cust.val($addressRow.find('td.cust').html());
		$Covered.val('1');

		if (complexName != '') {
			addressText += complexName + '\r\n';
		}

		addressText +=
			$area.find(':selected').html() + '-' + $area.val() + '\r\n' +
			$city.find(':selected').html();

		$abl.hide('medium', function() {
			$coverage_address.val(addressText).attr('readonly', 'readonly').parent('div.input').show();
		});
	})

	$register.delegate($floor.selector, 'change', function() {
		var addressText =
			'Building/Apartment/Hotel: ' + $building.find(':selected').val() + '\r\n' +
			'Floor/Room: ' + $floor.val() + '\r\n' +
			$area.find(':selected').html() + '-' + $area.val() + '\r\n' +
			$city.find(':selected').html();

		$abl.hide('medium', function() {
			$coverage_address.val(addressText).attr('readonly', 'readonly').parent('div.input').show();
		});
	});

	$register.delegate('#not-covered', 'click', function() {
		$Covered.val('0');
		$houseDiv.hide();
		$buildingDiv.hide();
		$abl.hide('medium', function() {
			$coverage_address.removeAttr('readonly').parent('div.input').show();
		});
	});


	$form.delegate($submit.selector, 'click', submitRegistration);

	resetSelection();
	$houseDiv.hide();
	$buildingDiv.hide();
	$form.get(0).reset();

	$register.formToWizard({
		submitButton: 'submit_registration'
		});

});

