/*
var Address = {
	init: function() {
		Address.attachCountryChange($('country'));
		Address.attachPostcodeButton();		
	},
	attachPostcodeButton: function(el) {
		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) {
		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"}]}'.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 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 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;
	}
}

var LoadID = {
	load: function() {
		id = URL.getQSValue('id');
		$('othercomments').value = 'Internal item ID: ' + id;
		url = '/ws/items.svc/item/' + id;
		idRequest = new Ajax.Request(url, {
			method: 'get',
			onSuccess: function(transport) {
				root = transport.responseXML.documentElement;
				name = (root.getElementsByTagName('Name') && root.getElementsByTagName('Name')[0].firstChild.data) ? root.getElementsByTagName('Name')[0].firstChild.data : null;
				uri = (root.getElementsByTagName('Uri')) ? root.getElementsByTagName('Uri')[0].firstChild.data : null;
				template = (root.getElementsByTagName('Template')) ? root.getElementsByTagName('Template')[0].firstChild.data : null;
				message = null;
				if(typeof name != 'undefined' && typeof uri != 'undefined') {
					switch(template) {
						case 'Itinerary':
							message = 'I am interested in the \'' + name + '\' itinerary.\n\nThis is at http://www.audleytravel.com' + uri + '';
						break;
						case 'Offer':
							message = 'I am interested in the \'' + name + '\' offer.\n\nThis is at http://www.audleytravel.com' + uri + '';
						break;
						default:
							message = 'I am interested in \'' + name + '\'.\n\nThis is at http://www.audleytravel.com' + uri + '';
						break;
					}
					$('othercomments').value = message;
				}
			}
		});
	}
}

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);
	}
	*/
	
	Validation.init();
	
	if(typeof URL.getQSValue('id') == 'string') {
		LoadID.load();
	}

	fillAnalyticsFields();

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