var address = {
		
	init: function(fieldsetclass) {
	
		var fsc = $('fieldset.address.' + fieldsetclass);
	
		// Setup billing address
		if($('input.billingmatchdelivery').is(":checked")) {
			$('div.billingaddress').hide();
		}
		$('input.billingmatchdelivery').live('click', function() {
			if($(this).is(":checked")) {
				$('.billingaddress').hide();
			} else {
				$('.billingaddress').show();
			}
		});

		// add address finder if addressstge is manual
		if ($('input.addressstage', fsc).val() == 'manual') {
			// add postcode finders
			$('div.manualentry', fsc).hide();
			$('div.postcodefinder', fsc).show();
			$('input.addressstage', fsc).val('auto1');
		}
		
		if ($('input.addressudprn', fsc).val()) {
			$('div.manualentry', fsc).hide();
		}
		
		// bind to address search buttons
		$('input.postcodelookup', fsc).live('click', function() {
			var postcode = $('input[name*="postcodefinder"]', fsc).val();
			if (postcode.length > 4) {
				// Hide postcode box
				$('div.postcodefinder', fsc).hide();
				address.find(postcode, fieldsetclass);
			} else {
				alert('Please enter your full postcode.');
			}
			return false;
		});
		
		// display the selected address
		$('input.addressselector', fsc).live('click', function() {
			var addressudprn = $(this).val();
			address.showaddress($(this).val(), $('label', $(this).parent()).html(), fieldsetclass);
		});
		
		// reset address finder
		$('a.editpostcode', fsc).live('click', function() {
			$(this).parent().remove();
			$('a.manualentry.notlisted', fsc).parent().remove();
			$('div.addresslist', fsc).hide();
			$('div.manualentry', fsc).hide();	
			$('div.postcodefinder', fsc).show();	
			$('input.addressstage', fsc).val('auto1');
			return false;
		});
		
		// choose manual entry
		$('fieldset.address.' + fieldsetclass + ' a.manualentry').live('click', function() {
			$(this).parent().remove();
			$('div.postcodefinder', fsc).hide();
			$('p.information.notlisted', fsc).remove();
			$('div.addresslist', fsc).hide();
			$('div.manualentry', fsc).show();
			$('input.addressstage', fsc).val('manual');
			fsc.prepend($('<p class="information"><a href="#" class="editpostcode">Change address</a></p>'));
			return false;
		});
		
		// prevent pressing enter on postcode field from submitting form
		$('input.postcodefinder', fsc).live('keypress', function(e) {
			if (e.keyCode == 13) {
				$('input.postcodelookup', fsc).click();
				return false;
			}
		});
		
	},
	
	find: function(postcode, fieldsetclass) {
		
		var fsc = $('fieldset.address.' + fieldsetclass);
		
		// Send request for addresses
		$('p.addressmessage', fsc).remove();
		fsc.addClass('ajaxtrigger');
		$.ajax({
			url: '/ajax/address.php',
			data: 'mode=find&postcode=' + postcode,
			success: function(xml) {
				switch ($("status", xml).text()) {
					case '0':
						// Addresses not found
						// Show message
						$('div.postcodefinder', fsc).prepend($('<p class="information addressmessage">No addresses found.</p>'));
						// Show postcode box
						$('div.postcodefinder', fsc).show();
						// Display link to enter address manually
						break;
					case '1':
						// Addresses found
						// Remove old address items
						$('div.addresslist', fsc).remove();
						// Dislay Addresses
						var addresslistcontainer = $('<div class="addresslist"></div>');
						var addresslist = $('<ul class="addresslist"></ul>');
						addresslistcontainer.append(addresslist);
						addresslistcontainer.css('display', 'none');
						fsc.append(addresslistcontainer);
						fsc.append($('<p class="information"><a href="#" class="manualentry notlisted">My address is not listed</a></p>'));;
						addresslistcontainer.show();
						var i = 1;
						$("address", xml).each(function() {
							var addresslistitem = $('<li class="addresschoice"><input type="radio" name="' + fieldsetclass + 'addressudprn" value="' + $('id', this).text() + '" id="' + fieldsetclass + 'address' + i + '" class="addressselector"><label for="' + fieldsetclass + 'address' + i + '">' + $('streetaddress', this).text() + '<span class="area">, ' + $('place', this).text() + '</span></label></li>');
							addresslist.append(addresslistitem);
							addresslistcontainer.scrollTop(0);
							i++;
						});
						// Display link to edit postcode
						fsc.prepend($('<p class="information"><a href="#" class="editpostcode">Change address</a></p>'));
						$('input.addressstage', fsc).val('auto2');
						break;
					default:
						alert('Unexpected Response: ' + $("message", xml).text(), 'Message');
						break;
				}
			},
			error: function(xml, type) {
				alert('Error - unable to load address list.');
				// Lookup error
				// Display form to enter address manually
				
			}
		});
	},
	
	showaddress: function(addressudprn, addresslabel, fieldsetclass) {
		
		var fsc = $('fieldset.address.' + fieldsetclass);
		
		// Cleanup address fieldset
		$('div.postcodefinder', fsc).hide();
		$('div.addresslist', fsc).remove();
		$('a.manualentry', fsc).parent().remove();
		$('a.editpostcode', fsc).parent().remove();
		$('p.information.notlisted', fsc).remove();
		// Show address
		var addressradiocontainer = $('<div class="addressselection"></div>');
		var addressradio = $('<p class="address"><input id="' + fieldsetclass + 'address" type="hidden" name="' + fieldsetclass + 'addressudprn" value="' + addressudprn + '">' + addresslabel + '. <a href="#" class="editpostcode">Change</a></p>')
		addressradiocontainer.append(addressradio);
		fsc.append(addressradiocontainer);
		$('input.addressstage', fsc).val('auto3');
	}
	
}

$(function() {
	
	address.init('delivery');
	address.init('billing');
	
});
