var Address = {
	init: function() {
		Address.attachCountryChange($('country'));
		Address.attachPostcodeButton();		
	},
	attachPostcodeButton: function(el) {
		if($('paf')) {
			Element.observe('paf', 'click', function(e){
				Event.stop(e);
			
				var postcode = $F('pafpostcode');
				var building = $F('pafbuilding');
				var url = '/dev/forms/services/postcode.php?postcode=';
				if(postcode)
				{
					$('paf').disabled = true;
					$('pafImg').src = 'images/buttons/checking.png';

					var scriptTag = document.getElementById("postcodeScript");
					var headTag = document.getElementsByTagName("head").item(0);
					var strUrl = "";

					//Build the url
					strUrl = "http://services.postcodeanywhere.co.uk/json.aspx?";
					strUrl += "&action=fetch";
					strUrl += "&postcode=" + escape(postcode);
					strUrl += "&building=" + escape(building);
					strUrl += "&account_code=" + 'AUDLE11112';
					strUrl += "&license_code=" + 'JG72-DJ37-MZ73-JG73';
					strUrl += "&callback=Address.populate";

					//Make the request
					if (scriptTag) 
					{
						try
						{
							headTag.removeChild(scriptTag);
						}
						catch (e)
						{
							//Ignore
						}
					}
					scriptTag = document.createElement("script");
					scriptTag.src = strUrl
					scriptTag.type = "text/javascript";
					scriptTag.id = "pcaScript";
					headTag.appendChild(scriptTag);
/*
					url = url + escape(postcode);
					if(building)
					{
						url = url + "&building=" + escape(building);
					}
					new Ajax.Request(url, {
						method: 'get',
						sanitizeJSON: 'true',
						evalJSON: 'true',
						onCreate: function(transport) {
							$('paf').disabled = true;
							$('pafImg').src = 'images/buttons/checking.png';
						},
						onComplete: function(transport) {
							$('paf').disabled = false;
							$('pafImg').src = 'images/buttons/lookup.png';
						},
						onSuccess: function(transport) {
							if(transport.status != '200')
							{
								alert('There has been an error - please try again');
							} else {
								address = (transport.responseJSON != null) ? transport.responseJSON : transport.responseText;
								if(transport.responseJSON.postcode == '')
								{
									alert('Sorry, we couldn\'t locate your address - please enter it manually');
								} else {
									$('address1').value = transport.responseJSON.line1;
									$('address2').value = transport.responseJSON.line2;
									$('town').value = transport.responseJSON.post_town;
									$('county').value = transport.responseJSON.county;
									$('postcode').value = transport.responseJSON.postcode;
									$('addressArrow').style.display = 'block';
								}
							}
						},
						onFailure: function(transport) {
							alert('Sorry - there was an error. Please try again.' + '\n\n' + 'Response: ' + transport.status + '\n\n' + 'Status: ' + transport.statusText);
						}
					});
*/
				}
				Event.stop(e);
			});
		}
	},
	attachCountryChange: function(el) {
		if($('paf')) {
			Element.observe(el, 'change', function(){
				if($F(el) == 'United Kingdom' || $F(el) == 'England' || $F(el) == 'Scotland' || $F(el) == 'Northern Ireland' || $F(el) == 'Wales')
				{
					/* make sure the postcode checker and field hints are showing */
					$('pafSet').style.color = '#000';
					$('paf').disabled = false;
					$('pafpostcode').disabled = false;
					$('pafbuilding').disabled = false;
					$('pafImg').setOpacity(1);
					$('pafUK').style.display = 'block';
					$('pafNonUK').style.display = 'none';
				} else {
					/* hide the postcode checker and field hints */
					$('pafSet').style.color = '#ccc';
					$('paf').disabled = true;
					$('pafpostcode').disabled = true;
					$('pafbuilding').disabled = true;
					$('pafImg').setOpacity(0.5);
					$('pafUK').style.display = 'none';
					$('pafNonUK').style.display = 'block';
				}
			})
		}
	},
	populate: function(response)
	{
		if (response.length==1 && typeof(response[0].error_number) != 'undefined')
		{
			//Show the error message
			alert(response[0].message);
		} else {
			//Check if there were any items found
			if (response.length==0)
			{
				alert("Sorry, no matching items found");
			} else {
				//PUT YOUR CODE HERE
				$('address1').value = response[0].line1;
				$('address2').value = response[0].line2;
				$('town').value = response[0].post_town;
				$('county').value = response[0].county;
				$('postcode').value = response[0].postcode;
			}
		}
		$('paf').disabled = false;
		$('pafImg').src = 'images/buttons/lookup.png';
	}
}

var Validation = {
	rules: '{"fields": [{"field": "firstname", "regex": "^.+$", "message": "You must enter your first name"}, {"field": "surname", "regex": "^.+$", "message": "You must enter your surname"}, {"field": "telephone", "regex": "^.+$", "message": "You must enter your telephone number"}, {"field": "email", "regex": "^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$", "message": "Your email does not appear to be valid"}, {"field": "country", "regex": "^.+$", "message": "You must select a country of residence"}, {"field": "address1", "regex": "^.+$", "message": "You must enter the first line of your address"}, {"field": "town", "regex": "^.+$", "message": "You must enter your town"}]}'.evalJSON(true),
	init: function() {
		
		/* loop through each validation, adding the val */
		Validation.rules.fields.each(function(rule, iterator){
			// add the fieldstatus markers
			$(rule.field).insert({after: '<span class="fieldStatus required">required</span>'});
			
			Validation.checkField(rule);
			
			Element.observe(rule.field, 'blur', function(){
				Validation.checkField(rule);
			})
		});
		
		/* attach to the form, so the form revalidates when the form is sent */
		Element.observe('form', 'submit', function(ev){
			Validation.checkForm(ev);
		});
		
		/* set up a periodical observer to check the form regularly */
		new PeriodicalExecuter(function(pe){
			Validation.checkForm(pe, false);
		}, 1);
		
	},
	checkField: function(rule) {
		regex = new RegExp(rule.regex);
		if(regex.test($F(rule.field)))
		{
			$(rule.field).next('span.fieldStatus').removeClassName('required').addClassName('accepted').update('Accepted');
			return true;
		} else {
			$(rule.field).next('span.fieldStatus').removeClassName('accepted').addClassName('required').update('Required');
			return false;
		}		
	},
	/* checkForm checks validation for the whole form */
	/* if verbose is set to true, informs user of errors */
	checkForm: function(ev, verbose) {
		var failed = false;
		var verbose = (!Object.isUndefined(verbose)) ? verbose : true;
		Validation.rules.fields.each(function(rule, iterator){
			if(!failed && !Validation.checkField(rule)) {
				failed = true;
				if(verbose) {
					alert(rule.message);
					$(rule.field).focus();
				}
				if(ev != null && ev.type == 'submit') {
					Event.stop(ev);
				}
				return false;
			};
		});
		return !failed;
	}
}

var Brochures = {	
	maxBrochures: 3,
	init: function() {
		Brochures.getBrochures().each(function(el){
			Brochures.attachClick(el);
		});		
		Brochures.preselect();
	},
	attachClick: function(el) {
		Element.observe(el, 'click', function(){
			
			
			/* get the checkbox */
			var checkbox = el.down('.brochureCheckbox');
			
			/* check if the element is already selected */
			if(el.hasClassName('selected'))
			{
				checkbox.checked = false;
				el.removeClassName('selected');
			} else {
				if(Brochures.numBrochuresSelected() >= Brochures.maxBrochures)
				{
					alert('Sorry, you can only select up to ' + Brochures.maxBrochures + ' brochures');
				} else {
					checkbox.checked = true;
					el.addClassName('selected');
				}				
			}
		});
	},
	getBrochures: function(el) {
		return brochures = $$('div.brochure');
	},
	numBrochures: function(el) {
		return Brochures.getBrochures().length;
	},
	numBrochuresSelected: function(el) {
		var counter = 0;
		var brochures = this.getBrochures();
		for(var i=0; i < brochures.length; i++)
		{
			if(brochures[i].match('.selected'))
			{
				counter++;
			}
		}
		return counter;
	},
	preselect: function() {
		var brochures = URL.getQSValue('brochures');
		if(Object.isUndefined(brochures) == false) {
			brochures = brochures.split(',');
			brochures.each(function(str){
				str = str.toLowerCase();
				if($('brochure-' + str) !== null) {
					$('brochure-' + str).checked = 'true';
					$('brochure-' + str).up('div.brochure').addClassName('selected');
				}
			})
		}
	}
}

var Cookie = {
    set: function(name, value, daysToExpire) {
        var expire = '';
        if (daysToExpire != undefined) {
            var d = new Date();
            d.setTime(d.getTime() + (86400 * parseFloat(daysToExpire)));
            expire = '; expires=' + d.toGMTString();
        }
        return (document.cookie = escape(name) + '=' + escape(value || '') + expire + '; path=/');
    },
    get: function(name) {
        var cookie = document.cookie.match(new RegExp('(^|;)\\s*' + escape(name) + '=([^;\\s]*)'));
        return (cookie ? unescape(cookie[2]) : false);
    },
    erase: function(name) {
        var cookie = Cookie.get(name) || true;
        Cookie.set(name, '', -1);
        return cookie;
    },
    accept: function() {
        if (typeof navigator.cookieEnabled == 'boolean') {
            return navigator.cookieEnabled;
        }
        Cookie.set('_test', '1');
        return (Cookie.erase('_test') === '1');
    }
};

var AutoSave = {
	/* number of days to store the saved form for - 0 for persistent */
	expires: 1,
	cookieName: 'quoteAutoSave',
	watcher: null,
	init: function() {
		/* make sure the browser can handle cookies */
		if(Cookie.accept())
		{
			/* attach the reset action to the link */
			if($('resetLink'))
			{
				Element.observe('resetLink', 'click', function(el){
					/* disable the form watcher */
					AutoSave.watcher = null;
					Form.reset('form');
					/* console.log('Resetting the form'); */
					Cookie.erase(AutoSave.cookieName);
					/* console.log('Erasing the cookie'); */
					Event.stop(el);
					/* enable the form watcher */
					AutoSave.watcher = new Form.Observer('form', 2, function(form, value){
						AutoSave.save();
					});
				});
			}
			
			/* see if the cookie exists */
			if(Cookie.get(AutoSave.cookieName))
			{
				$('resurrectNotice').style.display = 'block';
				AutoSave.resurrect();
			} else {
			}
			AutoSave.watcher = new Form.Observer('form', 2, function(form, value){
				AutoSave.save();
			});
		}
	},
	resurrect: function() {
		var data = Cookie.get(AutoSave.cookieName);
		/* console.log('Resurrecting: ' + data); */
		
		/* parse */
		var bits = data.split('&');
		/* console.log('Pairs: ' + bits.size()); */
		var pairs = new Array();
		bits.each(function(value){
			var part = value.split('=');
			var name = part[0];
			var value = unescape(part[1]);
			pairs[name] = value;
			if(value != '')
			{
				/* console.log('Value of ' + name + ' is ' + value); */
				$(name).value = value;
			}
		});
		return true;
	},
	save: function() {
		var data = $('form').serialize();
		Cookie.set(AutoSave.cookieName, data, AutoSave.expires);
		/* console.log('Saving: ' + data); */
	},
	remove: function() {
		return Cookie.erase(AutoSave.cookieName);
	}
}

var Tooltips = Class.create({
	initialize: function() {
		$$('.brochure').each(function(el){
			var contentEl = el.down('.contents').identify();
			if(!$(contentEl).empty()) {
				new Tip(el, $(contentEl), {
					style: 'darkgrey',
					hook: { target: 'bottomLeft', tip: 'topLeft' },
					stem: 'topMiddle',
					offset: { x: 0, y: 0 }
				});
			}
		});
	}
});

var URL = {
	extractQueryString: function(url) {
		var pattern = '?';
		var startPosition = url.indexOf('?');
		if(startPosition == -1) {
			return false;
		} else {
			var qs = url.slice(startPosition + 1);
			var pairs = new Array();
			pairs = qs.split('&');
			var qs = new Array();
			pairs.each(function(pair){
				if(pair.indexOf('=') != -1) {
					var parts = pair.split('=');
					qs[parts[0]] = parts[1];
				} else {
					qs[pair] = true;
				}
			});
			return qs;
		}
	},
	getQSValue: function(key, url) {
		var url = (url == null) ? window.location.toString() : url;
		var qs = URL.extractQueryString(url);
		return qs[key];
	}
}

var Browser = {
	get: function() {
		if(Prototype.Browser.IE)
			return 'IE';
		if(Prototype.Browser.Opera)
			return 'Opera';
		if(Prototype.Browser.WebKit)
			return 'WebKit';
		if(Prototype.Browser.Gecko)
			return 'Gecko';
		if(Prototype.Browser.MobileSafari)
			return 'MobileSafari';
		return null;
	}
}

document.observe('dom:loaded', function(){

	var resuscitating = false;
	
	Prototype.Browser.Name = Browser.get();
	
// see if there is a hash in the url
	var hash = URL.getQSValue('hash');
	if(Object.isUndefined(hash) == false) {
		resuscitating = true;
		Resuscitate.fetch(hash);
	}
	
	if(!resuscitating) {
		Validation.init();
		Brochures.init();
		Address.init();
	}
	
	var tips = new Tooltips();
	$('showQuickForm').observe('click', function(e) {
		window.location = 'http://www.audleytravel.com/forms/enquiry.html';
/*
		Lightview.show({
			href: 'quick.html',
			options: {
				width: 560,
				height: 520,
				topclose: false
			}
		});
*/
		Event.stop(e);
	});

/*
	$('backLink').update('<a href="#" title="Go back">&larr; Back</a>');
	$$('backLink a')[0].observe('click', function(ev){
		history.go(-1);
	});
*/

	fillAnalyticsFields();

});
