var AT = {
	
	initForm: function(t) {

		$('#err').empty();
		
		if (!this.makes) {return false;}
		
		this.ct = t;
		this.mk = document.getElementById('make');
		this.md = document.getElementById('model');
		$('#car-search-type').attr({name:t});

		var pc = $('#postcode');
		
		if (t == 'new') {pc.attr('value','').slideUp('fast');}
		else {
			if (this.pcVal) {var v = this.pcVal;}
			else {var v = 'Postcode';}
			pc.attr('value',v).slideDown('fast');
		}

		pc.click(function() {
			if (this.value == 'Postcode') {
				this.value = '';
			}
		});
		
		pc.blur(function() {
			AT.pcVal = this.value;
		});
		
		this.drawMakes();
	},

	drawMakes: function() {
		
		if (!this.makes[this.ct].length) {return;}
		
		var ms = this.makes[this.ct];
		this.mk.length=0;
		
		for (var i=0;i<ms.length;i++) {
			this.mk.options[i] = new Option(ms[i]);
			this.mk.options[i].value = ms[i];
			
			if (this.make == ms[i]) {
				this.mk.options[i].selected = true;
			}			
		}
		
		this.drawModels();
	},
	
	drawModels: function() {
		
		var mid = this.mk.selectedIndex;
		if (!this.models[this.ct][mid]) {return false;}

		var ms = this.models[this.ct][mid];
		this.md.length=0;
		
		for (var i=0;i<ms.length;i++) {
			this.md.options[i] = new Option(ms[i]);
			this.md.options[i].value = ms[i]; 
			
			if (this.model == ms[i]) {
				this.md.options[i].selected = true;
			}
		}		
	},
	
	checkFields: function() {
		
		var err = $('#err');
		err.empty();
		
		if (this.mk.selectedIndex == 0) {
			err.empty().append('Please select a make');
			return false;
		}
		
		if ($('#postcode').css('display') != 'none') {
			if (!this.checkPostCode($('#postcode').attr('value'))) {
				err.empty().append('Please check the postcode');
				return false;
			}
		}
		
		return true;
	},
	
	checkPostCode: function(toCheck)
	{
		// Permitted letters depend upon their position in the postcode.
		var alpha1 = "[abcdefghijklmnoprstuwyz]";                       // Character 1
		var alpha2 = "[abcdefghklmnopqrstuvwxy]";                       // Character 2
		var alpha3 = "[abcdefghjkstuw]";                                // Character 3
		var alpha4 = "[abehmnprvwxy]";                                  // Character 4
		var alpha5 = "[abdefghjlnpqrstuwxyz]";                          // Character 5

		// Array holds the regular expressions for the valid postcodes
		var pcexp = new Array ();

		// Expression for postcodes: AN NAA, ANN NAA, AAN NAA, and AANN NAA
		pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1,2})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

		// Expression for postcodes: ANA NAA
		pcexp.push (new RegExp ("^(" + alpha1 + "{1}[0-9]{1}" + alpha3 + "{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

		// Expression for postcodes: AANA  NAA
		pcexp.push (new RegExp ("^(" + alpha1 + "{1}" + alpha2 + "?[0-9]{1}" + alpha4 +"{1})(\\s*)([0-9]{1}" + alpha5 + "{2})$","i"));

		// Exception for the special postcode GIR 0AA
		pcexp.push (/^(GIR)(\s*)(0AA)$/i);

		// Standard BFPO numbers
		pcexp.push (/^(bfpo)(\s*)([0-9]{1,4})$/i);

		// c/o BFPO numbers
		pcexp.push (/^(bfpo)(\s*)(c\/o\s*[0-9]{1,3})$/i);

		// Load up the string to check
		var postCode = toCheck;

		// Assume we're not going to find a valid postcode
		var valid = false;

		// Check the string against the types of post codes
		for ( var i=0; i<pcexp.length; i++)
		{
			if (pcexp[i].test(postCode))
			{
				// The post code is valid - split the post code into component parts
				pcexp[i].exec(postCode);

				// Copy it back into the original string, converting it to uppercase and
				// inserting a space between the inward and outward codes
				postCode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();

				// If it is a BFPO c/o type postcode, tidy up the "c/o" part
				postCode = postCode.replace (/C\/O\s*/,"c/o ");

				// Load new postcode back into the form element
				valid = true;

				// Remember that we have found that the code is valid and break from loop
				break;
			}
		}

			// Return with either the reformatted valid postcode or the original invalid
			// postcode
			if (valid) {return postCode;} else return false;
	}
}


