// Modify tao.form
(function(form) {
		form.getInputLabel = function(ele) {
				return $(ele).up('form').select('label[for='+ele.identify()+']').first();
		};
		form.storeLabelText = function(eleId, labelEle) {
				tao.form.labels = tao.form.labels || new Hash();
				if (!labelEle.hasClassName(tao.form.errorClass)) {
						tao.form.labels.set(eleId, labelEle.innerHTML);
				}
		};
		form.getLabelText = function(eleId) {
				tao.form.labels = tao.form.labels || new Hash();
				return tao.form.labels.get(eleId);
		};
		var oldRemoveError = form.removeError;
		form.removeError = function(ele) {
			var eleId = ele.identify();
				var label = tao.form.getInputLabel(ele);
				var message = tao.form.getLabelText(eleId);
				if (message && label) {
						label.update(message).removeClassName(tao.form.errorClass);
				} else {
					oldRemoveError(ele);
				}
		};
		var oldDisplayError = form.displayError;
		form.displayError = function(ele, message, className) {
				var eleId = ele.identify();
				var label = tao.form.getInputLabel(ele);
				if (label) {
						tao.form.storeLabelText(eleId, label);
						label.update(message).addClassName(tao.form.errorClass);
				} else {
						oldDisplayError(ele, message, className);
				}
		};
})(tao.form);

/**
 * @author Joey Mazzarelli
 * @website http://bitbucket.org/mazzarelli/js-date/
 * @website http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/
 * @copyright Joey Mazzarelli
 * @license BSD license
 */

Date.fromString = (function () {

  var defaults = {
    order : 'DMY',
    strict : false
  };

  var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG",
      "SEP", "OCT", "NOV", "DEC"];

  var abs = ["AM", "PM", "AFTERNOON", "MORNING"];

  var mark = function (str, val) {
    var lval = val.toLowerCase();
    var regex = new RegExp('^' + lval + '|(.*[^:alpha:])' + lval, 'g');
    return str.replace(regex, '$1' + val);
  };

  var normalize = function (str) {
    str = str.toLowerCase();
    str = str.replace(/[^:a-z0-9]/g, '-');
    for (var i=0; i<months.length; i++) str = mark(str, months[i]);
    for (var i=0; i<abs.length; i++) str = mark(str, abs[i]);
    str = str.replace(/[a-z]/g, '');
    str = str.replace(/([0-9])([A-Z])/g, '$1-$2');
    str = ('-' + str + '-').replace(/-+/g, '-');
    return str;
  };

  var find_time = function (norm) {
    var obj = {date:norm, time:''};
    obj.time = norm.replace(
        /^.*-(\d\d?(:\d\d){1,2}(:\d\d\d)?(-(AM|PM))?)-.*$/, '$1');
    if (obj.time == obj.date)
      obj.time = norm.replace(/^.*-(\d\d?-(AM|PM))-.*$/, '$1');
    if (obj.time == obj.date) obj.time = '';
    obj.date = norm.replace(obj.time, '');
    obj.time = ('-' + obj.time + '-').replace(/-+/g, '-');
    obj.date = ('-' + obj.date + '-').replace(/-+/g, '-');
    return obj;
  };

  var find_year = function (norm) {
    var year = null;

    // Check for a 4-digit year
    year = norm.replace(/^.*-(\d\d\d\d)-.*$/, '$1');
    if (year != norm) return year; else year = null;

    // Check for a 2-digit year, over 32.
    year = norm.replace(/^.*-((3[2-9])|([4-9][0-9]))-.*$/, '$1');
    if (year != norm) return year; else year = null;

    // Day is always by month, so check for explicit months in
    // first or third spot
    year = norm.replace(/^.*-[A-Z]{3}-\d\d?-(\d\d?)-.*$/, '$1');
    if (year != norm) return year; else year = null;
    year = norm.replace(/^.*-(\d\d?)-\d\d?-[A-Z]{3}-.*$/, '$1');
    if (year != norm) return year; else year = null;

    // If all else fails, use the setting for the position of the year.
    var pos = '$3';
    if (defaults.opts.order.charAt(0) == 'Y') pos = '$1';
    else if (defaults.opts.order.charAt(1) == 'Y') pos = '$2';
    year = norm.replace(/^.*-(\d\d?)-([A-Z]{3}|\d{1,2})-(\d\d?)-.*$/, pos);
    if (year != norm) return year; else year = null;

    return year;
  };

  var find_month = function (norm, year) {
    // Check for an explicity month
    var matches = norm.match(/[A-Z]{3}/);
    if (matches && matches.length) return matches[0];

    // Remove the year, and unless obviously wrong, use order
    // to chose which one to use for month.
    var parts = norm.replace(year + '-', '').split('-');
    if (parts.length != 4) return null;
    var order = defaults.opts.order;
    var md = order.indexOf('M') < order.indexOf('D')? 1: 2;
    return (parseInt(parts[md], 10) <= 12)? parts[md]: parts[md==1? 2: 1];
  };

  var find_day  = function (norm, year, month) {
    return norm.replace(year, '').replace(month, '').replace(/-/g, '');
  };

  var create_absolute = function (obj) {

    var time = obj.time.replace(/[-APM]/g, '');
    var parts = time.split(':');
    parts[1] = parts[1] || 0;
    parts[2] = parts[2] || 0;
    parts[3] = parts[3] || 0;
    var ihr = parseInt(parts[0], 10);
    if (obj.time.match(/-AM-/) && ihr == 12) parts[0] = 0;
    else if (obj.time.match(/-PM-/) && ihr < 12) parts[0] = ihr + 12;
    parts[0] = ("0" + parts[0]).substring(("0" + parts[0]).length - 2);
    parts[1] = ("0" + parts[1]).substring(("0" + parts[1]).length - 2);
    parts[2] = ("0" + parts[2]).substring(("0" + parts[2]).length - 2);
    time = parts[0] + ":" + parts[1] + ":" + parts[2];
    var millisecs = parts[3];

    var strict = defaults.opts.strict;
    if (!obj.year && !strict) obj.year = (new Date()).getFullYear();
    var year = parseInt(obj.year, 10);
    if (year < 100) {
      year += (year<70? 2000: 1900);
    }

    if (!obj.month && !strict) obj.month = (new Date()).getMonth() + 1;
    var month = String(obj.month);
    if (month.match(/[A-Z]{3}/)) {
      month = "JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC-"
          .indexOf(month) / 4 + 1;
    }
    month = ("0" + month).substring(("0" + month).length - 2);
    if (!obj.day && !strict) obj.day = (new Date()).getDate();
    var day = ("0" + obj.day).substring(("0" + obj.day).length - 2);

    var date = new Date();
    date.setTime(Date.parse(year + '/' + month + '/' + day + ' ' + time));
    date.setMilliseconds(millisecs);
    return date;
  };

  var parse = function (norm) {
    return absolute(norm);
  };

  var absolute = function (norm) {
    var obj = find_time(norm);
    obj.norm = norm;
    obj.year = find_year(obj.date);
    obj.month = find_month(obj.date, obj.year);
    obj.day = find_day(obj.date, obj.year, obj.month);
    return create_absolute(obj);
  };

  return function (fuzz, opts) {
    defaults.opts = { order: defaults.order, strict: defaults.strict };
    if (opts && opts.order) defaults.opts.order = opts.order;
    if (opts && opts.strict != undefined) defaults.opts.strict = opts.strict;
    var date = parse(normalize(fuzz));
    return date;
  };

})();



var wc = {
	init: function() {
			tao.form.tips.init();
			wc.geo.init();
		wc.driver.init();
		wc.owner.init();
		wc.vehicle.init();
		wc.user.init();
		wc.search.init();
		wc.cserv.init();
		wc.shortlist.init();
		wc.social.init();
		wc.datepicker.init();
		//wc.chat.init();
	},
	chat: {
		init: function() {
			//window.$zopim||(function(d,s){var z=$zopim=function(c){z._.push(c)},$=z.s=d.createElement(s),e=d.getElementsByTagName(s)[0];z.set=function(o){z.set._.push(o)};$.setAttribute('charset','utf-8');$.async=!0;z.set._=[];$.src=('https:'==d.location.protocol?'https://ssl':'http://cdn')+'.zopim.com/?hYvCdRlrt7kZapZNFxa07CTwlBweSx3e';$.type='text/java'+s;z.t=+new Date;z._=[];e.parentNode.insertBefore($,e)})(document,'script');
		},
		bubbleInitialize: function() {
			$zopim.livechat.bubble.setTitle('Need Help?');
			$zopim.livechat.bubble.setText('Click here to speak with us');
			$zopim.livechat.setGreetings({
					'online': ['Ask us a question...', 'Ask us a question...'],
					'offline': ['Leave us a message', 'We\'re not online - please leave us a message.'],
					'away': ['Not here right now', 'Not here right now']
			});
		},
		userIdentify: function() {
			if($j('#zopim_name').length > 0) {
				$zopim.livechat.set({
						name: $j('#zopim_name').val(),
						email: $j('#zopim_email').val(),
						phone: $j('#zopim_phone').val(),
						notes: $j('#zopim_notes').val()
				});
			}
		},
		ask: function(question) {
			wc.chat.bubbleInitialize();
			wc.chat.userIdentify();
			$zopim.livechat.say(question);
			$zopim.livechat.window.show();
		},
		openWindow: function() {
			wc.chat.bubbleInitialize();
			wc.chat.userIdentify();
			$zopim.livechat.window.show();
		},
		bubble: function(title, body) {
			$zopim.livechat.bubble.setTitle(title);
			$zopim.livechat.bubble.setText(body);
			$zopim.livechat.bubble.show();
		}
	},
	datepicker: {
		focusOn: null,
		onChange: function() {
			this.focusOn.parents("ul").find("input.datepick").each(function(index, element) {
				if ($j(element).val() == "") {
					$j(element).prev("label.inline").removeClass("has_text");
				}
				else {
					$j(element).prev("label.inline").addClass("has_text");
				}
			});
		},
		selectedHours: '09',
		selectedMinutes: '00',
		selectedDateTime: null,
		selectedDate: null,
		firstMonth: null,
		lastMonth: null,
		currentMonth: null,
		imaginaryLastMonth: null, // Current month + number of months on calendar even if this turns to be bigger than 12
		imaginaryFirstMonth: null, // reversed last month, same logic
		init: function() {
			$j('#startdate').click(function(e) {
				e.stopPropagation();
				wc.datepicker.open($j('#startdate'));
			});
			$j('#enddate').click(function(e) {
				e.stopPropagation();
				wc.datepicker.open($j('#enddate'));
			});
			$j('#startdate, #enddate').focus(function(e) {
				$j(this).trigger('click');
			});
			$j('#startdate').keyup(function() {
				wc.datepicker.keyUpHandler();
			});
			$j('#enddate').keyup(function() {
				wc.datepicker.keyUpHandler();
			});
			$j('#startdate').blur(function() {
				wc.datepicker.blurHandler($j('#startdate'));
			});
			$j('#enddate').blur(function() {
				wc.datepicker.blurHandler($j('#enddate'));
			});
			$j('#wc_datepicker_hour').change(function() {
				wc.datepicker.setTime();
			});
			$j('#wc_datepicker_minutes').change(function() {
				wc.datepicker.setTime();
			});
			$j('#wc_datepicker').bind('click.datepicker', function(e){
				e.stopPropagation();
			});

			$j('#wc_datepicker td[data-day] a').click(function(e){
				if (!$j(this).closest('td').hasClass("unavailable")) {
					wc.datepicker.setDate($j(this).closest('td').attr('data-date'));
					$j('#wc_datepicker td[data-day] a.active').removeClass('active');
					$j(this).addClass('active');
				}
				e.preventDefault();
			});

			$j('#wc_datepicker #user_availability_calendar .user_availability_dates .Available, #wc_datepicker #user_availability_calendar .user_availability_dates .PartiallyAvailable').click(function(){
				var selectedDiv = $j('#wc_datepicker #user_availability_calendar .user_availability_dates .Selected');
				selectedDiv.addClass('Available').removeClass('Selected');
				$j(this).toggleClass('Selected');
				$j(this).toggleClass('Available');
				wc.datepicker.setDate(this);
			});
			wc.datepicker.loadMonthSwapping();
		},
		keyUpHandler: function() {
			var startDate = new Date(Date.fromString($j('#startdate').val()));
			var endDate		= new Date(Date.fromString($j('#enddate').val()));
			if (!isNaN(startDate.valueOf()) && !isNaN(endDate.valueOf())) {
				wc.datepicker.onChange();
			}
		},
		blurHandler: function() {
			wc.datepicker.onChange();
		},
		loadMonthSwapping: function() {
			wc.datepicker.currentMonth = $j('#wc_datepicker .user_availability_month:first .monthNum').text();
			wc.datepicker.firstMonth = wc.datepicker.currentMonth;

			wc.datepicker.imaginaryLastMonth	= parseInt(wc.datepicker.firstMonth, 10) + $j('#wc_datepicker .user_availability_month').size();
			wc.datepicker.imaginaryFirstMonth = parseInt(wc.datepicker.firstMonth, 10) - $j('#wc_datepicker .user_availability_month').size();
			var lastMonth = wc.datepicker.imaginaryLastMonth;
			if (lastMonth > 12) lastMonth -= 12;
			wc.datepicker.lastMonth = lastMonth;
			$j('#wc_datepicker .user_availability_month').css('display','none');
		},
		bindCloseEvent: function() {
			$j('body').bind('click.datepicker', function(){
				wc.datepicker.close();
			});
		},
		unbindCloseEvent: function() {
			$j('body').unbind('click.datepicker');
		},
		close: function() {
			wc.datepicker.unbindCloseEvent();
			wc.datepicker.focusOn.removeClass("surfaced").prev("label.inline").removeClass("surfaced");

			if (wc.datepicker.focusOn.val() != "") {
				wc.datepicker.focusOn.prev("label.inline").addClass("has_text");
			}

			$j('#wc_datepicker').hide();
		},
		open: function(textbox) {
			wc.datepicker.focusOn = textbox;
			wc.datepicker.bindCloseEvent(); // get rid of any old event bindings
			wc.datepicker.updateDateTimeValues(textbox);

			//Visual
			wc.datepicker.updateDatepickerDate();
			wc.datepicker.updateDatepickerTime();
			wc.datepicker.setPositioning(textbox);
			wc.datepicker.setVisibleMonth();

			$j(".datepick, label.inline").removeClass("surfaced");
			textbox.addClass("surfaced");
			textbox.prev("label.inline").addClass("surfaced");
			$j('#wc_datepicker').show();
		},
		setVisibleMonth: function() {
			if (wc.datepicker.currentMonth.length == 1 || wc.datepicker.currentMonth.length == undefined) {
				wc.datepicker.currentMonth = '0'+wc.datepicker.currentMonth;
			}
			$j('#wc_datepicker .user_availability_month').css('display','none');
			$j('#wc_datepicker .' + wc.datepicker.currentMonth).css('display','block');
		},
		switchToNextMonth: function() {
			var nextMonth = (wc.datepicker.currentMonth * 1) + 1
			if (nextMonth <= wc.datepicker.imaginaryLastMonth) {
				if (nextMonth > 12) nextMonth -= 12;
				var months = $j('#wc_datepicker .user_availability_month');
				months.each(function(){
							var month = $j(this);
							if (month.find('.monthNum').text() == nextMonth ) {
								months.css('display', 'none')
								month.css('display', 'block');
								wc.datepicker.currentMonth = nextMonth;
						}
						});
			}
		},
		switchToPrevMonth: function() {


			var prevMonth = (wc.datepicker.currentMonth * 1) - 1;
			if (prevMonth == 0) prevMonth = 12;
			var months = $j('#wc_datepicker .user_availability_month');
			months.each(function(){
						var month = $j(this);
						if (month.find('.monthNum').text() == prevMonth ) {
							months.css('display', 'none');
							month.css('display', 'block');
							wc.datepicker.currentMonth = prevMonth;
					}
						});
			},
		updateDateTimeValues: function(textbox) {
			wc.datepicker.selectedDateTime = new Date(Date.fromString(textbox.val()));
			if (!isNaN(wc.datepicker.selectedDateTime.valueOf())) {
				if (wc.datepicker.selectedDateTime.format('H') != "00") {
					wc.datepicker.selectedHours		 = wc.datepicker.selectedDateTime.format('H');
				}
				wc.datepicker.selectedMinutes	 = wc.datepicker.selectedDateTime.format('i');

								var currentMonth = new String(wc.datepicker.selectedDateTime.getMonth() + 1);
								if (currentMonth.length == 1) currentMonth = '0'+currentMonth;
				wc.datepicker.currentMonth = currentMonth;
			}
		},
		updateDatepickerDate: function() {
			var selectedA		= $j('#wc_datepicker #user_availability_calendar .wc_datepicker_date .active');
			var dateToSelect = wc.datepicker.selectedDateTime.format('Y-m-d');
			selectedA.removeClass('active');
			$j('#wc_datepicker #user_availability_calendar .wc_datepicker_date [data-date=' + dateToSelect + '] a').addClass('active')
		},
		updateDatepickerTime: function() {
			$j('#wc_datepicker_hour option').removeAttr('selected');
			$j('#wc_datepicker_hour option[value=\'' + wc.datepicker.selectedHours + '\']').attr('selected', 'selected');
			$j('#wc_datepicker_minutes option').removeAttr('selected');
			$j('#wc_datepicker_minutes option[value=\'' + wc.datepicker.selectedMinutes + '\']').attr('selected', 'selected');
		},
		setPositioning: function(textbox) {
			var vOffset = textbox.offset().top - textbox.parents("fieldset").offset().top;
			var hOffset = textbox.offset().left - textbox.parents("fieldset").offset().left;
			$j('#wc_datepicker').css('top', vOffset - 9).css('left', hOffset - 9);
		},
		setDate: function(date) {
			var dateVars = date.split('-');
			wc.datepicker.selectedDateTime = new Date(dateVars[0], dateVars[1] - 1, dateVars[2], 0, 0, 0, 0);
			wc.datepicker.setTime();
		},
		setTime: function() {
			wc.datepicker.selectedHours		= $j('#wc_datepicker_hour').val();
			wc.datepicker.selectedMinutes = $j('#wc_datepicker_minutes').val();
			wc.datepicker.setDateTime();
		},
		setDateTime: function() {
			wc.datepicker.selectedDateTime.setHours(wc.datepicker.selectedHours);
			wc.datepicker.selectedDateTime.setMinutes(wc.datepicker.selectedMinutes);
			if(!isNaN(wc.datepicker.selectedDateTime.valueOf())) {
				wc.datepicker.focusOn.val(wc.datepicker.selectedDateTime.format('d/m/Y H:i'));
				wc.search.checkDatesAreConsistent();
				wc.datepicker.onChange();
			}
		}
	},
	booking: {
		amend: {
			defaultAdditionalDriverText: "Enter driver's username",
			updateCost: function() {
				var startDate = new Date(Date.fromString($F('startdate')));
				var endDate		= new Date(Date.fromString($F('enddate')));
				var additionalDriverUsername = $j('#additional_driver_username').val();
				if (additionalDriverUsername == wc.booking.amend.defaultAdditionalDriverText) {
					additionalDriverUsername = '';
				}
				xajax_updateAmendCost($F('BookingId'), startDate.format('Y-m-d H:i'),	 endDate.format('Y-m-d H:i'), additionalDriverUsername);
			},
			cservSubmit: function() {
				var confirmText = 'If the Owner accepts the request the Driver will be charged ' + $F('amend_cost') + 'GBP. Are you sure you want to proceed and amend this booking? ';
				if ($F('hasStarted') == 'yes') {
					confirmText = 'The Driver must have Owner approval to extend this booking or will be liable for late fees if not returned at originally agreed booking return time. The Driver will be charged ' + $F('amend_cost') + 'GBP. Are you sure you want to proceed and amend this booking?';
				}
				if (confirm(confirmText)) {
					var startDate = new Date(Date.fromString($F('startdate')));
					var endDate		= new Date(Date.fromString($F('enddate')));
					var additionalDriverUsername = $j('#additional_driver_username').val();
					if (additionalDriverUsername == wc.booking.amend.defaultAdditionalDriverText) {
						additionalDriverUsername = '';
					}
					xajax_amendBooking($F('BookingId'), startDate.format('Y-m-d H:i'),	endDate.format('Y-m-d H:i'), additionalDriverUsername);
				}
			},
			removeDriver: function() {
				$j('#additional_driver_active').hide();
				$j('#additional_driver_username').val('');
				$j('#additional_driver_inactive').show();
				wc.booking.amend.updateCost();
			},
			submit: function() {
				var confirmText = 'If the owner accepts your request you will be charged ' + $F('amend_cost') + 'GBP. Are you sure you want to proceed and amend this booking? ';
				/*if ($F('hasStarted') == 'yes') {
					confirmText = 'You must have owner approval to extend this booking or will be liable for late fees if not returned at originally agreed booking return time. You will be charged ' + $F('amend_cost') + 'GBP. Are you sure you want to proceed and amend this booking?';
				}*/
				if (confirm(confirmText)) {
					var startDate = new Date(Date.fromString($F('startdate')));
					var endDate		= new Date(Date.fromString($F('enddate')));
					var additionalDriverUsername = $j('#additional_driver_username').val();
					if (additionalDriverUsername == wc.booking.amend.defaultAdditionalDriverText) {
						additionalDriverUsername = '';
					}
					xajax_submitBookingAmend($F('BookingId'), startDate.format('Y-m-d H:i'),	endDate.format('Y-m-d H:i'), additionalDriverUsername);
				}
			},
			closePanel: function(){
				$j('#temp_amend_div').hide();
			},
			cancel: function(amendId){
				if (confirm('Are you sure you want to cancel this amend request?')) {
					xajax_cancelAmendRequest(amendId);
				}
			}
		},
		cancellation: {
			confirm: function(message, bookingId) {
				if (confirm(message)) {
					xajax_cancelBooking(bookingId);
				}
			}
		}
	},
	tracker: {
		event: function(category, action, label, value) {
			try {
				label = label || null;
				value = value || null;
				pageTracker._trackEvent(category, label);
			} catch (error) {
				if (console) console.log(error);
			}
		},
		page: function(page) {
			try {
				pageTracker._trackPageview(page);
			} catch (error) {
				if (console) console.log(error);
			}
		}
	},
	redirect: {
		goToMyAccount: function(baseUrl) {
			window.location.href = baseUrl;
		}
	},
	search: {
		map: null,
		vehicles: null,
		init: function() {
			if (!$('search_form')) return;
			$('search_form').observe('submit', wc.search.handleSubmit);
			if ($('search_results_pagination') && $('search_results_pagination').empty()) {
				$('search_results_pagination').hide()
			}
		},
		checkDatesAreConsistent: function(date) {
			if (wc.search.getStartTimestamp() > wc.search.getEndTimestamp()) {
				var newEndTimestamp = wc.search.getStartTimestamp() + 24*60*60;
				var newEndDate = new Date(newEndTimestamp * 1000);
				var newEndDateString = newEndDate.format('d/m/Y H:i');
				$('enddate').setValue(newEndDateString);
			}
		},
		getStartTimestamp: function() {
			return Date.fromString($F('startdate'))/1000;
		},
		getEndTimestamp: function() {
			return Date.fromString($F('enddate'))/1000;
		},
		handleSubmit: function(event) {
			// Check search query
			var query = $F('q');
			if (/^\s*[a-zA-Z][a-zA-Z0-9]{1,3}\s*(\d[a-zA-Z]{2})?\s*$/.test(query)) {
				var trimmedQuery = $j.trim(query);
				$j('#q').val((trimmedQuery.toUpperCase()));
			}
			if ($j.trim(query) == "" || query == tao.form.tips.defaultText.get('q')) {
				Swc.Error('Please enter a search term!');
				event.stop();
				return;
			}
			// Check dates
			var datetimeRegex = /^\d{1,2} \w+ \d{4} \d{1,2}:\d{2}$/;
			var eleStartDatetime = $('startdate');
			if (!datetimeRegex.test($F(eleStartDatetime)) || isNaN(wc.search.getStartTimestamp())) {
				eleStartDatetime.setValue('From...');
			}
			var eleEndDatetime = $('enddate');
			if (!datetimeRegex.test($F(eleEndDatetime)) || isNaN(wc.search.getEndTimestamp())) {
				var startDate = new Date();
				eleEndDatetime.setValue('To...');
			}

			// Check dates are in correct order
			if (wc.search.getStartTimestamp() > wc.search.getEndTimestamp()) {
				Swc.Error('The drop off date must be later than the pick-up date');
				event.stop();
			}

						// Check date range is not longer than 3 months
						var rangeInSeconds = wc.search.getEndTimestamp() - wc.search.getStartTimestamp();
						if (rangeInSeconds > 200*60*60*24) {
				Swc.Error('You cannot book a vehicle for more than 200 days');
				event.stop();
						}
		},
		getDefaultStartTime: function() {
			return tao.date.getNextDatetimeByHour(9).format('d/m/Y h:mma');
		},
		getDefaultEndTime: function(offsetDatetime) {
			return tao.date.getNextDatetimeByHour(18, offsetDatetime).format('d/m/Y h:mma');
		},
		sendNotificationRequest: function() {
			var isValid = true;
			isValid &= tao.form.validateElement($('search_notification_name'), 'required', "Please enter your name");
			isValid &= tao.form.validateElement($('search_notification_postcode'), 'postcode', "Please enter a valid postcode");
			isValid &= tao.form.validateElement($('search_notification_email'), 'emailAddress', "Please enter a valid email address");
			if (isValid) {
				xajax_recordNotificationRequest(xajax.getFormValues($('search_notification_form')));
			}
		},
		loadHeatMap: function(locations) {
			var mapOptions = {
					scrollwheel: false,
					zoom: 13,
					mapTypeId: google.maps.MapTypeId.ROADMAP
				};
				wc.search.map = new google.maps.Map(document.getElementById("search_results_google_map"), mapOptions);

				locations.each(function(pair){
					var location = pair.value;
					var options = {
							'radius': Math.log(location.numVehicles)*10000,
							'center': location.position,
							'fillColor': '#2ECEF4',
							'strokeColor': '#2E86F4',
							'strokeWeight': '1',
							'fillOpacity': 0.5,
							'title': location.city,
							'zIndex': Math.max(100 - location.numVehicles, 0)
					};
					var circle = new google.maps.Circle(options);
					google.maps.event.addListener(circle, 'click', function() {
							window.location = 'hire-cars-in-' + location.city + '?google-map=yes';
						});
					circle.setMap(wc.search.map);
				});
				wc.search.fitGoogleMapToVehicles(wc.search.map, locations);
		},
		loadGoogleMap: function(vehicles, zoomLevel) {
			var mapOptions = {
					scrollwheel: false,
					zoom: zoomLevel || 13,
					mapTypeId: google.maps.MapTypeId.ROADMAP,
					mapTypeControl: false,
					scaleControl: false,
					streetViewControl: false
				};
				var map = new google.maps.Map(document.getElementById("search_results_google_map"), mapOptions);
				var default_image = '/images/icons/map_markers/';
				var markers = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','blank'];
				var marker_index = 0;
				var eager_image		= '/images/icons/map_markers/eager.png';
				wc.search.markers = [];

				$j.each(vehicles, function(index, vehicle){
					var image;
					if (vehicle.hasEagerOwner == 'Yes') {
          				image = 'eager';
					} else {
					    image = marker_index < markers.length ? markers[marker_index++] : markers[markers.length-1];
					}
					var marker = new google.maps.Marker({
						position: vehicle.position,
						icon: '/images/icons/map_markers/' + image + '.png',
						title:vehicle.makeAndModel
					});

					google.maps.event.addListener(marker, 'click', function() {
                      var li = $j('li[data-vehicle-id=' + vehicle.id + ']');
                      li.trigger('mouseenter');
                      $j.scrollTo(li.offset()['top'] - 100);
                    });


					marker.setMap(map);

					wc.search.markers.push({
					    id: vehicle.id,
					    marker: marker,
					    image: image,
					    position: vehicle.position
					});
				});
				wc.search.fitGoogleMapToVehicles(map, vehicles);
				wc.search.initListEvents();
				wc.search.map = map;
				wc.search.vehicles = vehicles;
		},
		getMinLatitude: function(vehicles) {
			return Math.min.apply(null,$j.map(vehicles,function(vehicle){return vehicle.position.lat();}));
		},
		getMinLongitude: function(vehicles) {
			return Math.min.apply(null,$j.map(vehicles,function(vehicle){return vehicle.position.lng();}));
		},
		getMaxLatitude: function(vehicles) {
			return Math.max.apply(null,$j.map(vehicles,function(vehicle){return vehicle.position.lat();}));
		},
		getMaxLongitude: function(vehicles) {
			return Math.max.apply(null,$j.map(vehicles,function(vehicle){return vehicle.position.lng();}));
		},
		showVehicleInfo: function(vehicleId) {
			var standardBoxHeight = 155;
			var standardBoxTopOffset = 180;
			$$('div[class=search_results_google_map_row]').each(function(row){row.hide();});
			var vehicleInfo = $j('#search_results_google_map_row_'+vehicleId);
			var newTopOffset = standardBoxTopOffset - (vehicleInfo.height() - standardBoxHeight);
			vehicleInfo.find('.vehicle').css('top', newTopOffset + 'px');
			vehicleInfo.show();
			wc.search.vehicles.each(function(index, vehicle){
				if (vehicle.id == vehicleId) {
					wc.search.map.panTo(vehicle.position);
					return;
				}

				});
		},
		hideVehicleInfo: function(vehicleId) {
			$$('div[class=search_results_google_map_row]').each(function(row){row.hide();})
		},
		initListEvents: function() {
			$j('#search_results .vehicle').mouseover(function() {
				wc.search.showVehicleInfo($j(this).find('.vehicle_id').text());
			});
			$j('#search_results .vehicle').mouseout(function() {
				//wc.search.hideVehicleInfo($j(this).find('.vehicle_id').text());
			});

		},
		fitGoogleMapToVehicles: function(map, vehicles) {
			if (vehicles.size() > 1) {
				var bounds = new google.maps.LatLngBounds(vehicles[0].position);
				for (var i=1; i < vehicles.length; i++) {
					bounds.extend(vehicles[i].position);
				}

				map.fitBounds(bounds);
				google.maps.event.addListenerOnce(map, 'zoom_changed', function() {
				 	map.setZoom(map.getZoom() + 1);
				});
			} else {
				map.setCenter(vehicles[0].position);
			}
		}
	},
	payment: {
		accountNumberRegEx: /^(\d{8})$/,
		sortCodeRegEx: /^(\d{2})$/,
		getCard: function() {
			var validForm = true;
			//validForm &= tao.form.validateElement($('card_type'), 'required', 'Please select a card type');
			//validForm &= tao.form.validateElement($('card_number'), 'cardNumber', 'Please enter a valid card number');
			//validForm &= tao.form.validateElement($('card_holder_name'), 'required', 'Please enter a name');
			//validForm &= tao.form.validateElement($('security_number'), 'securityNumber', 'Please enter a security number');
			//var startDate = null;
			if (!$F('start_month').empty() && !$F('start_year').empty()) {
				startDate = $F('start_month')+'/'+$F('start_year');
			}
			//validForm &= tao.form.validateElement($('expiry_month'), 'required', 'Please choose an expiry date');
			var expiryDate = $F('expiry_month')+'/'+$F('expiry_year');
			//if ($F('issue_number') !== "") {
			//	validForm &= tao.form.validateElement($('issue_number'), /^\d{1,2}$/, "This is not a valid issue number");
			//}
			var saveDetails = '';
			if ($('save_details')) {
				saveDetails = $F('save_details');
			}
			if (validForm) {
				var card = new Hash({
//					'type': $F('card_type'),
					'number': $F('card_number').gsub(/\D/, ''),
//					'name': $F('card_holder_name').strip(),
					'securityNumber': $F('security_number').gsub(/\D/, ''),
									'issueNumber': $F('issue_number') ? $F('issue_number') : null,
									'startDate': (startDate) ? startDate : null,
									'expiryDate': expiryDate,
									'saveDetails': saveDetails == 'on'? true: false
							});
				return card;
			} else {
				return undefined;
			}
		}
	},
	social: {
		tweetMaxLength: 140,
		init: function() {
			wc.social.postItNote.init();
			wc.social.connector.init();
			//wc.social.urlShortner.init();
		},
		connector: {
			tweetMaxLength: 140,
			init: function() {
				$j('#registration-tweet-text').keyup(function() {
									if($j('#registration-tweet-text').val().length > wc.social.tweetMaxLength) {
											$j('#registration-tweet-text').val($j('#registration-tweet-text').val().substr(0, wc.social.tweetMaxLength));
									}
									$j('#chars_left').text(wc.social.tweetMaxLength - $j('#registration-tweet-text').val().length);
				});
				if ( $j('#chars_left').length > 0) {
					$j('#chars_left').text(wc.social.tweetMaxLength - $j('#registration-tweet-text').val().length);
				}
			},
			expandFacebookFriends : function() {
				$j('ul.facebook-friends > li').show();
			},
			tweet: function(text) {
				$j('#registration-tweet-edit').hide();
				xajax_tweet(text);
			},
			toggleTweetOnBooking: function() {
				if ($j('#tweet-bookings:checked').val()) {
					xajax_setSocialSetting('TweetBookings', 'Yes');
				} else {
					xajax_setSocialSetting('TweetBookings', 'No');
				}
			},
			toggleFacebookOnBooking: function() {
				if ($j('#tweet-bookings:checked').val()) {
					xajax_setSocialSetting('FacebookBookings', 'Yes');
				} else {
					xajax_setSocialSetting('FacebookBookings', 'No');
				}
			},
			toggleTweetAvailability: function() {
				if ($j('#tweet-bookings:checked').val()) {
					xajax_setSocialSetting('TweetAvailability', 'Yes');
				} else {
					xajax_setSocialSetting('TweetAvailability', 'No');
				}
			},
			toggleFacebookAvailability: function() {
				if ($j('#tweet-bookings:checked').val()) {
					xajax_setSocialSetting('FacebookAvailability', 'Yes');
				} else {
					xajax_setSocialSetting('FacebookAvailability', 'No');
				}
			},
					twitterDeauthorise: function() {
				if (confirm('This will unlink your Twitter account from WhipCar. Continue?')) {
					xajax_deauthoriseTwitter();
				}
					}
		},
		inviter: {
			send: function() {
				var checkboxValues = checkboxHandler.getSelectedValues($('contact-list-form'));
				xajax_sendInvite(checkboxValues);
			}
		},
		urlShortner: {
			init: function() {
				var key = 'R_791928a2cefc6c7849d3363278046f49';
				var urlShortnerScript = new Element('script', {
						type: 'text/javascript',
						src: 'http://bit.ly/javascript-api.js?version=latest&login=whipcar&apiKey=' + key
				});
				$$('head')[0].appendChild(urlShortnerScript);
				urlShortnerScript.onload = function () {
					BitlyCB.postItShortenResponse = function(data) {
						wc.social.rpx.composePostItSocialMessage(data);
					}
				}
			}
		},
		rpx: {
			url : 'www.whipcar.com',
			init: function() {
				var rpxJsHost = (("https:" == document.location.protocol) ? "https://" : "http://static.");
				var rpxScript = new Element('script', {
						type: 'text/javascript',
						src: rpxJsHost + 'rpxnow.com/js/lib/rpx.js'
				});
				$$('head')[0].appendChild(rpxScript);
				rpxScript.onload = function () {
					RPXNOW.init({
						appId: 'dcdihdlnlmdgimdcoiok',
							xdReceiver: '/rpx_xdcomm.html'});
				}
			},
			postItInvoke: function(link) {
				wc.social.rpx.url = link;
				RPXNOW.loadAndRun(['Social'], function () {
					wc.social.rpx.composePostItSocialMessage();
				});
			},
			composePostItSocialMessage: function() {
					var activity = new RPXNOW.Social.Activity(
						'Enter your Facebook and/or twitter account details above and we\'ll send this note to your friends and followers',
						$F('body'),
						wc.social.rpx.url
					);
					activity.addActionLink('Read my note', wc.social.rpx.url);
					activity.setTitle('WhipCar.com - Rent the Car Next Door.');
					RPXNOW.Social.publishActivity(activity,
						{
							finishCallback: wc.social.postItNote.save,
							urlShortening: true
						});
			}
		},
		postItNote: {
			init: function() {
				if($$('.links_to')) {
					$$('.links_to').invoke('observe', 'change', function(event){
						if($j('#links_to_vehicle').is(':checked')) {
							$j('#vehicle_id').removeAttr('disabled');
						} else {
							$j('#vehicle_id').attr('disabled', 'disabled');
						}
					});
				}
			},
			openPopup: function() {
				$j('#postit_add_popup').toggle();
			},
			formInit: function(maxLength) {
				$j('#body').keyup(function() {
									if($j('#body').val().length > maxLength) {
											$j('#body').val($j('#body').val().substr(0, maxLength));
									}
									$j('#chars_left').text(maxLength - $j('#body').val().length);
							});
			},
			submit: function(link) {
				wc.social.postItNote.save();
				wc.social.rpx.postItInvoke(link);
				$j('#postit_add_popup').toggle();
			},
			save: function() {
				var isValid = true;
				isValid &= tao.form.validateElement($('body'), 'required', "Please enter some note contents");
				if (isValid) {
					xajax_savePostItNote(xajax.getFormValues($('post_it_edit')));
				}
			}
		}
	},
	owner: {
		init: function() {
			$$('.earn_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('earn_help_content')));
			$$('.response_time_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('response_time_help_content')));

			if ($('owner_vehicle_images_file')) {
				$('owner_vehicle_images_file').observe('change', wc.owner.addVehicleImage);
			}

			if (
				(/\/owner-sign-up.*/.test(location.pathname)) ||
				(/\/owner-register.*/.test(location.pathname)) ||
				(/\/vehicle-details\/.*\?wizard/.test(location.pathname+location.search)) ||
				(/\/vehicle-availability\/.*\?wizard/.test(location.pathname+location.search)) ||
				(/\/validate-owner\/.*\?wizard/.test(location.pathname+location.search))
			) {
				$('body').addClassName('owner_page');
				$('body').addClassName('wizard');
			} else if (
				(/\/vehicle-details.*/.test(location.pathname)) ||
				(/\/vehicle-availability.*/.test(location.pathname)) ||
				(/\/validate-owner.*/.test(location.pathname))
			) {
				$('my_account_steps_image').hide();
				$('signup_helper_wizard').hide();
			}

			$$('input[name=PrivacySetting]').invoke('observe', 'change', function(event){
				xajax_changePrivacySettings(xajax.getFormValues('owner_overview_form'));
			});

			//if (!$('owner_signup_form')) return;
			//wc.owner.widgetInit();

		},
		widgetInit: function() {
			var postcodeDefault	 = 'Your postcode';
			var postcodeError		 = 'Invalid postcode';
			var emailDefault		 = 'Your email address';
			var emailError		 = 'Invalid email'
				var emailExistsError = 'Email address already exists';
			var plateDefault		 = 'Car\'s number plate';
			var plateError		 = 'Invalid car plate';

			$j('#owner_signup_postcode').focus(function(){
				if ($j(this).val() == postcodeDefault
				 || $j(this).val() == postcodeError) {
					$j(this).val('');
				}
			});
			$j('#owner_signup_postcode').blur(function(){
				if ($j(this).val() == '') {
					$j(this).val(postcodeDefault);
				}
			});
			$j('#owner_signup_email').focus(function(){
				if ($j(this).val() == emailDefault
				 || $j(this).val() == emailError
				 || $j(this).val() == emailExistsError) {
					$j(this).val('');
				}
			});
			$j('#owner_signup_email').blur(function(){
				if ($j(this).val() == '') {
					$j(this).val(emailDefault);
				}
			});
			$j('#owner_signup_plate').focus(function(){
				if ($j(this).val() == plateDefault
				 || $j(this).val() == plateError) {
					$j(this).val('');
				}
			});
			$j('#owner_signup_plate').blur(function(){
				if ($j(this).val() == '') {
					$j(this).val(plateDefault);
				}
			});
		},
		validateSignUpForm: function(event) {
			// Track event even if it fails
			if(!$('whipcar-earnings-widget')) {
				wc.tracker.event('owner', 'value-vehicle');
			}
			/*['owner_signup_plate', 'owner_signup_postcode'].each(function(id){
				if ($F(id) != tao.form.tips.defaultText.get(id)) {
					$(id).setValue($F(id).toUpperCase());
				}
			});
			validForm = true;
			validForm &= tao.form.validateElement($('owner_signup_plate'), 'vehicleRegistration', 'Please enter a valid number plate');
			validForm &= tao.form.validateElement($('owner_signup_postcode'), 'postcode', 'Please enter a post code');
			validForm &= tao.form.validateElement($('owner_signup_email'), 'emailAddress', 'Please enter a valid email');
			validForm &= tao.form.validateElement($('owner_terms_agree'), 'checked', 'You must agree to the terms and conditions');
			if (!validForm) {
				if (event) event.stop();
			}*/
		},
		validateRegistrationElement: function(element, validationFn, errorMessage, className) {
			validForm = tao.form.validateElement(element, validationFn, errorMessage, className);
			if (!validForm && element && wc.owner.firstInvalidRegistrationElement) {
				Effect.ScrollTo(element, {offset: -100});
				wc.owner.firstInvalidRegistrationElement = false;
			}
			return validForm;
		},
		firstInvalidRegistrationElement: true,
		register: function() {
			validForm = true;
			validForm &= wc.owner.validateRegistrationElement($('owner_register_firstname'), 'required', 'Please enter a first name');
			validForm &= wc.owner.validateRegistrationElement($('owner_register_lastname'), 'required', 'Please enter a last name');
			validForm &= wc.owner.validateRegistrationElement($('owner_register_email'), 'emailAddress', 'Please enter a valid email address');
			validForm &= wc.owner.validateRegistrationElement($('owner_register_about'), 'required', 'Please complete the "about you" section');
			validForm &= wc.owner.validateRegistrationElement($('owner_register_username'), wc.user.usernameRegEx, 'Please enter a username (up to 16 characters long)');
			validPassword = wc.owner.validateRegistrationElement($('owner_register_password'), 'password', 'Please choose a password of 6 characters or more');
						if (validPassword) validPassword &= wc.owner.validateRegistrationElement($('owner_register_password'), function(password){return !['password', 'password123'].member(password);}, 'This password is too obvious - please choose another');
						//validPassword &= wc.owner.validateRegistrationElement($('owner_register_password_confirm'), function(){return $F('owner_register_password') == $F('owner_register_password_confirm');}, 'Please ensure your confirmation password matches your main password');
						validForm &= validPassword;

			validForm &= wc.owner.validateRegistrationElement($('owner_register_mobile'), 'phoneNumber', 'Please enter a valid mobile');
			var addressFormOpen = !!$('address_line1');
			if (addressFormOpen) {
				validForm &= wc.owner.validateRegistrationElement($('address_line1'), 'required', 'Please enter the first line of your address');
				validForm &= wc.owner.validateRegistrationElement($('address_line3'), 'required', 'Please enter the town or city of your address');
				validForm &= wc.owner.validateRegistrationElement($('address_postcode'), 'postcode', 'Please enter a valid postcode');
			} else {
				if (!$('owner_register_address')) {
					alert('Please enter your address manually');
					validForm = false;
				} else {
					validForm &= wc.owner.validateRegistrationElement($('owner_register_address'), function(ele){return addressFormOpen;}, 'Please select an address or enter one manually');
				}
			}
			if (validForm) {


				xajax_registerUser(xajax.getFormValues($('register_user_form')));
			} else {
				wc.owner.firstInvalidRegistrationElement = true;
			}


		},
		validateNewAddress: function() {
			var address = wc.shortlist.getAddress();
			var card = wc.payment.getCard();
			if (card && address) {
				xajax_validateNewAddress(card.toJSON(), address.toJSON());
			}
		},
		validateBankCard: function() {
			var card = wc.payment.getCard();
			if (card) {
				xajax_validateCard(card.toJSON());
			}
		},
		addVehicleImage: function() {
			xajax.upload('addVehicleImage', 'owner_vehicle_images');
			$('owner_vehicle_images').submit();
		},
		decrementRate: function(inputEle, effectiveRateEle, successRate) {
			var newRate = Math.max(0, parseFloat($F(inputEle)) - 1);
			var newEffectiveRate = wc.owner.calculateEffectiveRate(newRate, successRate);
			inputEle.setValue(newRate);
			effectiveRateEle.update(newEffectiveRate);
		},
		incrementRate: function(inputEle, effectiveRateEle, successRate) {
			var newRate = parseFloat($F(inputEle)) + 1;
			var newEffectiveRate = wc.owner.calculateEffectiveRate(newRate, successRate);
			inputEle.setValue(newRate);
			effectiveRateEle.update(newEffectiveRate);
		},
		calculateEffectiveRate: function(grossRate, successPercentage) {
			return (grossRate * (1 - successPercentage)).toFixed(2);
		},
		changeVehicleImage: function(vehicleImageId) {
			$('search_results_google_map2').hide();
			$('car_main_image').show();
			$('car_main_image').src = $F('car_profile_image_'+vehicleImageId);
				$$('.banner').first().setStyle({'top': '7px'});
				$$('.banner').first().setStyle({'left': '0px'});
				$$('.banner span').first().update('Rent this car from &pound;' + $F('car_profile_hourly_rate') + ' an hour!');
		},
		changeVehicleImageToMap: function(latitude, longitude) {
			$('car_main_image').hide();
			$('search_results_google_map2').show();
			var mapOptions = {
					scrollwheel: false,
					zoom: 16,
					mapTypeId: google.maps.MapTypeId.ROADMAP
				};
				var map = new google.maps.Map(document.getElementById("search_results_google_map2"), mapOptions);
				var location = new google.maps.LatLng(latitude, longitude);
				map.setCenter(location);
				$$('.banner').first().setStyle({'top': '193px'});
				$$('.banner').first().setStyle({'left': '-5px'});
				$$('.banner span').first().update('Full location available after booking');
		}
	},
	driver: {
		init: function() {
			$$('.csv_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('csv_help_content')));
			if ($('driver_sign_up_step_four')) wc.driver.registration.initStepFour();
		},
		registration: {
			initStepFour: function() {
				$j('.when_simple').click(function() {
									$j('#when').val($j(this).val());
							});
							$j('#when_3').click(function() {
							 updateCustomDatetime();
							});

							$j('.when_datetime').keyup(function() {
							 $j('#when_3').attr('checked', 'checked');
							 updateCustomDatetime();
							});
			},
			updateCustomDatetime: function() {
				$j('#when').val( 'Call on: ' + $j('#call_date').val() + ' ' + $j('#call_time').val());
			}
		},
		validateAge: function(eleAge) {
			return $F(eleAge) >= 21;
		},
		validateStepOne: function(event) {
			var isFormValid = true;
			isFormValid &= tao.form.validateElement($('email_address'), 'emailAddress', 'Please enter a valid email address');
			isFormValid &= tao.form.validateElement($('password'), 'password', 'Please choose a password with more than 6 letters');
			//isFormValid &= tao.form.validateElement($('confirm_password'), function(){return $F('password') == $F('confirm_password');}, 'Please ensure your password matches your confirmation password');
			var isAgeValid = tao.form.validateElement($('age'), 'required', 'Please enter your age');
			if (isAgeValid) {
				isAgeValid = tao.form.validateElement($('age'), wc.driver.validateAge, 'You must be 21 or over to join Whipcar');
			}
			isFormValid &= isAgeValid;

			if (!$('terms').checked) {
														Swc.Error('You must agree to the terms and conditions to continue');
														isFormValid = false;
			}
			if (!isFormValid) {
				console.log('fail');
				if (tao.form.errorMessages.length > 0) {
					Swc.Error(tao.form.errorMessages.join('<br />'));
				}
			} else {
				console.log('success');
				$j('#driver_sign_up_form').submit();
			}
		},
		validateStepTwo: function(event) {
			isFormValid = tao.form.validateElement($('postcode'), function(){return !!$('address_line1');}, 'Please enter a postcode and look-up your address');
			isFormValid &= tao.form.validateElement($('address_line1'), 'required', 'Please enter the first line of your address');
			isFormValid &= tao.form.validateElement($('address_postcode'), 'required', 'Please enter your postcode');
			isFormValid &= tao.form.validateElement($('first_name'), 'required', 'Please enter a first name');
			isFormValid &= tao.form.validateElement($('last_name'), 'required', 'Please enter a surname');
			isFormValid &= tao.form.validateElement($('username'), wc.user.usernameRegEx, 'Please choose a valid username (up to 16 characters long, only letters and numbers allowed)');
			if ($$('#address_options input.radio').length > 0) {
				isFormValid &= tao.form.validateRadioButtons('address_id', 'Please choose an address');
			}

			var mobileNumber = $('mobile_number');
			mobileNumber.setValue($F(mobileNumber).gsub(/\D/, ''));
			isMobileNumberValid = tao.form.validateElement(mobileNumber, 'mobileNumber', 'Please enter a valid mobile number');
			if (isMobileNumberValid) {
				isMobileNumberValid &= tao.form.validateElement(mobileNumber, /^(07|(00)?44)/, 'You must enter a UK mobile number');
				isMobileNumberValid &= tao.form.validateElement(mobileNumber, /^[\d() ]{11,}/, 'You must enter a valid UK mobile number');
			}


			isFormValid &= isMobileNumberValid;

			if (!isFormValid) {
				//Swc.Error(tao.form.errorMessages.join('<br />'));
			} else {
				$j('#driver_sign_up_form').submit();
			}
		},
		validateStepThree: function(event) {
			var validForm = true;
						validForm &= tao.form.validateElement($('card_number'), 'cardNumber', 'Please enter a valid card number');
						validForm &= tao.form.validateElement($('security_number'), 'securityNumber', 'Please enter a security number');

						validForm &= tao.form.validateElement($('start_month'), 'required', 'Please choose an start date');
						validForm &= tao.form.validateElement($('start_year'), 'required', 'Please choose an start date');

						var startDate = null;
			if (!$F('start_month').empty() && !$F('start_year').empty()) {
				startDate = $F('start_month')+'/'+$F('start_year');
			}

			validForm &= tao.form.validateElement($('expiry_month'), 'required', 'Please choose an expiry date');
						validForm &= tao.form.validateElement($('expiry_year'), 'required', 'Please choose an expiry date');

						var expiryDate = null;
						if (!$F('expiry_month').empty() && !$F('expiry_year').empty()) {
				expiryDate = $F('expiry_month')+'/'+$F('expiry_year');
			}

						if ($F('issue_number') !== "") {
				validForm &= tao.form.validateElement($('issue_number'), /^\d{1,2}$/, "This is not a valid issue number");
			}

						if (validForm) {
								var card = new Hash({
					'number': $F('card_number').gsub(/\D/, ''),
					'securityNumber': $F('security_number').gsub(/\D/, ''),
									'issueNumber': $F('issue_number') ? $F('issue_number') : null,
									'startDate': (startDate) ? startDate : null,
									'expiryDate': expiryDate
							});
			} else {
				card = undefined;
			}

			if (card) {
								$j('#driver_sign_up_form').submit();
			} else {
				// error
			}

		},
		validateStepFour: function(event) {

			// CC validation here

			if (!isFormValid) {
				Swc.Error(tao.form.errorMessages.join('<br />'));
			} else {
				$j('#driver_sign_up_step_four').submit();
			}
		},
		saveProfile: function() {
			xajax_saveDriverProfile((Object.toJSON($('driver_profile_form').serialize({hash:true}))));
		}
	},
	user: {
		usernameRegEx: /^\w{1,16}$/,
		init: function() {
			var no_bookings = $("indicator_my-bookings");
			var no_messages = $("indicator_my-messages");

			xajax_getNotification();

			if (no_bookings && no_bookings.innerHTML == "0") {
					no_bookings.style.display = 'none';
			}

			if (no_messages && no_messages.innerHTML == "0") {
					no_messages.style.display = 'none';
			}

			// if (/\/my-messages.*/.test(location.pathname)) {
			// 	$('tab_my-messages').addClassName('active');
			// }
			// if (/\/my-bookings.*/.test(location.pathname)) {
			// 	$('tab_my-bookings').addClassName('active');
			// }
			// if (/\/market-your-car.*/.test(location.pathname)) {
			// 	$('tab_market-car').addClassName('active');
			// }
			// if (/\/my-vehicle.*/.test(location.pathname) || /\/vehicle-availability.*/.test(location.pathname) || /\/vehicle-details.*/.test(location.pathname)) {
			// 	if ($('tab_my-vehicle')) $('tab_my-vehicle').addClassName('active');
			// }
			// if (/\/my-details.*/.test(location.pathname)) {
			// 	$('tab_my-detailsshortlist').addClassName('active');
			// }
			// if (/\/my-message-settings.*/.test(location.pathname)) {
			// 	$('tab_preferences').addClassName('active');
			// }
			$$('.privacy_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('privacy_help_content')));
		},
		signIn: function() {
			xajax_signIn($F('sign_in_email_address'), $F('sign_in_password'), $F('sign_in_referrer'), $F('remember_me'));
		},
		passwordReminder: function() {
			xajax_sendPasswordReminder($F('password_reminder_email_address'));

				},
				passwordReset: function() {
						var validPassword = tao.form.validateElement($('reset_password'), 'password', 'Please choose a password of 6 characters or more');
						validPassword &= tao.form.validateElement($('reset_confirm_password'), function(){return $F('reset_password') == $F('reset_confirm_password');}, 'Please ensure your confirmation password matches your main password');
						if (validPassword) {
								xajax_userResetPassword($F('user-id'), $F('hash'), $F('reset_password'));
						}
				},
				saveDispatchOptions: function() {
					xajax_saveUserDispatchOptions(xajax.getFormValues('user_dispatch_options'));
				},
				saveDetails: function() {
					var isFormValid =	 tao.form.validateElement($('user_profile_email'), 'emailAddress', 'Please enter a valid email address');
			isFormValid &= tao.form.validateElement($('user_profile_mobile'), 'required', 'Please enter a mobile number');
			var mobileNumber = $('user_profile_mobile');
			mobileNumber.setValue($F(mobileNumber).gsub(/\D/, ''));

			isMobileNumberValid = tao.form.validateElement(mobileNumber, 'mobileNumber', 'Please enter a valid mobile number');
			if (isMobileNumberValid) {
				isMobileNumberValid &= tao.form.validateElement(mobileNumber, /^(07|(00)?44)/, 'You must enter a UK mobile number');
			}
			isFormValid &= isMobileNumberValid;

			if (isFormValid) {
							xajax_saveDetails(xajax.getFormValues($('user_profile_form')));
						}
				},
				saveAddressDetails: function() {
						var isFormValid = tao.form.validateElement('postcode', function(){return !!$('address_line1');}, 'Please enter a postcode and look-up your address');
						isFormValid &= tao.form.validateElement($('address_line1'), 'required', 'Please enter an address');
						isFormValid &= tao.form.validateElement($('address_postcode'), 'postcode', 'Please enter a valid postcode');
						if (isFormValid) {
								xajax_saveAddressDetails(xajax.getFormValues($('user_profile_address_details_form')));
						} else {
								Swc.Error(tao.form.errorMessages.join('<br />'));
						}
				},
				saveBankAccountDetails: function() {
					var isFormValid = tao.form.validateElement($('user_profile_account_number'), wc.payment.accountNumberRegEx, 'Please enter a valid account number');
					isFormValid &= tao.form.validateElement($('user_profile_sort_code_part_one'), wc.payment.sortCodeRegEx, 'Please enter a valid sort code');
					isFormValid &= tao.form.validateElement($('user_profile_sort_code_part_two'), wc.payment.sortCodeRegEx, 'Please enter a valid sort code');
			isFormValid &= tao.form.validateElement($('user_profile_sort_code_part_three'), wc.payment.sortCodeRegEx, 'Please enter a valid sort code');

			if (isFormValid) {
							xajax_saveBankAccountDetails(xajax.getFormValues($('user_profile_bank_account_details_form')));
						}
				},
				savePassword: function() {
					var isFormValid = tao.form.validateElement($('user_profile_password'), 'password', 'Please choose a password of 6 characters or more');
					isFormValid &= tao.form.validateElement($('user_profile_password_confirm'), function(){return $F('user_profile_password') == $F('user_profile_password_confirm');}, 'Please ensure your confirmation password matches your main password');
			if (isFormValid) {
							xajax_savePassword(xajax.getFormValues($('user_profile_password_form')));
						}
				},
				deleteAccount: function() {
					if (confirm("Are you sure you want to delete your account?")) {
						xajax_deleteAccount(xajax.getFormValues($('user_profile_delete_form')));
					}
				},
		registerAddressSelect: function() {
			$('address_selected').observe('change', wc.user.handleAddressSelect);
			$$('.address_lookup').each(Element.show);
		},
    registerAddressSelectUpdate: function() {
			$('address_selected').observe('change', wc.user.handleAddressSelectUpdate);
		},
		handleAddressSelect: function(event) {
			var addressId = $F('address_selected');
			if (addressId !== 0) {
				xajax_lookUpAddress(addressId);
				$$('.address_lookup').each(Element.hide);
				$j("input[name='saveAddress']").removeAttr("disabled");
			}
		},
    handleAddressSelectUpdate: function(event) {
			var addressId = $F('address_selected');
			if (addressId !== 0) {
				xajax_lookUpAddressUpdate(addressId);
				$$('.address_lookup').each(Element.hide);
				$j("input[name='saveAddress']").removeAttr("disabled");
			}
		},
		lookUpPostcode: function() {
			var postcode = $('postcode');
			postcode.setValue($F(postcode).strip().toUpperCase());
			xajax_lookUpPostCode($F(postcode), 'wc.user.registerAddressSelect');
		},
		lookUpPostcodeForRegistration: function(v) {
			var postcode = $('postcode');
			postcode.setValue($F(postcode).strip().toUpperCase());
			xajax_lookUpPostCode($F(postcode), v);
			xajax_updateRegistrationMap($F(postcode));
		},
    lookUpPostcodeForRegistrationUpdate: function(v) {
        var postcode = $('npostcode');
        postcode.setValue($F(postcode).strip().toUpperCase());
        xajax_lookUpPostCode($F(postcode), v);
    },
		makePayment: function(chargeId) {
				try {
					showLoader();
								 } catch (error) {}
								 var address = wc.shortlist.getAddress();
								 if ($j('.new_card').is(':not(:visible)')) {
										 var cardNumber = $F('saved_card_number');
										 if (cardNumber !== "0") {
											 xajax_submitPaymentWithSavedCard(cardNumber, chargeId);
												 return;
										 } else if ($j('div#new-credit-card').css('display') == "none") {
												 Swc.Error("You must either select a pre-registered card or add a new one before proceeding.");
												 hideLoader();
												 return;
										 }
								 }
								 var card = wc.payment.getCard();
								 if (card) {
										 xajax_submitPayment(card.toJSON(), chargeId);
								 }
		},
				saveCard: function() {
						var card = wc.payment.getCard();
						$j('div#new-credit-card').hide();
						if (card) {
										xajax_submitCard(card.toJSON());
						} else {
							hideLoader();
						}
		},
		favourite: {
			add: function(userId) {
				$j('.favourite_' + userId).addClass('is_favourite');
				$j('.favourite_' + userId).text('Added to favourites');
			},
			remove: function(userId) {
				$j('.favourite_' + userId).removeClass('is_favourite');
				$j('.favourite_' + userId).text('Add to favourites');
			}
		},
		invite: {
			add: function(userId) {
				$j('.invite_' + userId).toggleClass('is_invited');
				$j('.invite_' + userId).text('Invited');
			},
			remove: function(userId) {
				$j('.invite_' + userId).toggleClass('is_invited');
				$j('.invite_' + userId).text('Invite');
			}
		},
		toggleBlock: function(userId){
			xajax_toggleBlock(userId);
		}
	},
	cserv: {
		init: function() {
				$$('table.cserv-results tbody tr:nth-child(even)').each(function(ele){
						ele.addClassName('colored');
				});
				$$('[id=cserv_driver_fine_reason]').invoke('observe', 'change', wc.cserv.toggleInputFields);
		},
		sendUserMessage: function(userId) {
			isFormValid	 = tao.form.validateElement($('user_message_subject'), 'required', "Please enter a subject");
			isFormValid &= tao.form.validateElement($('user_message_body'), 'required', "Please enter a message body");
			if(isFormValid) xajax_sendUserMessage(userId, $F('user_message_subject'), $F('user_message_body'));
		},
		updateUserDetails: function() {
			xajax_updateUserDetails($H($('user_details').serialize({hash:true})).toJSON());
		},
		updateUserAddress: function() {
			xajax_updateUserAddress($H($('user_address').serialize({hash:true})).toJSON());
		},
		updateDriverStatus: function() {
			var isFormValid = true;
			if ($$('.driver-action').find(function(ele){return !!ele.checked;}).getValue() == 'accept') {
							if($$('.license-type').find(function(ele){return !!ele.checked;}).getValue() == 'UK'){
									isFormValid &= tao.form.validateElement($('license-number'), 'drivingLicense', 'This is not a valid license number');
							} else {
									isFormValid &= tao.form.validateElement($('license-number'), 'required', 'This is not a valid license number');
							}
							isFormValid &= tao.form.validateElement($('date-of-birth'), 'englishdate', 'Please enter a date of birth (dd/mm/yyyy)');
			}
			isFormValid &= tao.form.validateElement($('message'), 'required', "Please enter a message");
			if (isFormValid) xajax_updateDriverStatus($H($('action_form').serialize({hash:true})).toJSON());
		},
		updateDriverLicense: function() {
			var isFormValid = true;
						isFormValid &= tao.form.validateElement($('license-number-update'), 'required', 'This is not a valid license number');
						if ($('license-type-update') != "UK") {
								isFormValid &= tao.form.validateElement($('date-of-birth-update'), 'englishdate', 'Please enter a date of birth (dd/mm/yyyy)');
						}
			if (isFormValid) xajax_updateDriverStatus($H($('license_update_form').serialize({hash:true})).toJSON());
		},
		addNote: function() {
			xajax_addAccountNote($H($('action_form').serialize({hash:true})).toJSON());
		},
		addBookingNote: function() {
			xajax_addBookingNote($H($('action_form').serialize({hash:true})).toJSON());
		},
		saveCsvNotes: function() {
			xajax_saveCsvNotes($H($('action_form').serialize({hash:true})).toJSON());
		},
		showMessage: function(ele) {
			$('message_item_container').update(ele.innerHTML);
		},
		addUserManualCharge: function() {
			xajax_addUserManualCharge($H($('action_form').serialize({hash:true})).toJSON());
		},
		cancelBooking: function(event) {
			if (confirm("This will cancel the booking, are you sure?")) {
				xajax_cancelBooking(xajax.getFormValues('cserv_booking_cancellation-form'));
			}
		},
		updateAmendCost: function() {
			var isFormValid = tao.form.validateElement($('cserv_booking_extension_start_date'), /^\d{2}\/\d{2}\/\d{4}$/, 'Please enter a valid start date (dd/mm/yyyy)');
			isFormValid &= tao.form.validateElement($('cserv_booking_extension_start_time'), /^\d{1,2}:\d{2}$/, 'Please enter a start time in the format HH:mm');
			isFormValid &= tao.form.validateElement($('cserv_booking_extension_end_date'), /^\d{2}\/\d{2}\/\d{4}$/, 'Please enter a valid end date (dd/mm/yyyy)');
			isFormValid &= tao.form.validateElement($('cserv_booking_extension_end_time'), /^\d{1,2}:\d{2}$/, 'Please enter an end time in the format HH:mm');
			if (isFormValid) {
				xajax_updateAmendCost(xajax.getFormValues('cserv_booking_extension_form'));
			}
		},
		amendBooking: function(event) {

				var isFormValid = tao.form.validateElement($('cserv_booking_extension_start_date'), /^\d{2}\/\d{2}\/\d{4}$/, 'Please enter a valid start date (dd/mm/yyyy)');
				isFormValid &= tao.form.validateElement($('cserv_booking_extension_start_time'), /^\d{1,2}:\d{2}$/, 'Please enter a start time in the format HH:mm');
				isFormValid &= tao.form.validateElement($('cserv_booking_extension_end_date'), /^\d{2}\/\d{2}\/\d{4}$/, 'Please enter a valid end date (dd/mm/yyyy)');
				isFormValid &= tao.form.validateElement($('cserv_booking_extension_end_time'), /^\d{1,2}:\d{2}$/, 'Please enter an end time in the format HH:mm');
				if (isFormValid) {
					if(confirm('Are you sure you want to amend this booking?')) {
						xajax_extendBookingWithNewDatetimes(xajax.getFormValues('cserv_booking_extension_form'));
					}
				}
		},
		confirmExtensionWithNewDatetimes: function(message) {
			if (confirm(message)) {
				xajax_extendBookingWithNewDatetimes(xajax.getFormValues('cserv_booking_extension_form'), 0);
			}
		},
		extendBookingWithDuration: function(event) {
			var isFormValid = tao.form.validateElement($('cserv_booking_extension_num_hours'), /^\d{1,2}$/, 'Please choose the number of hours to extend the booking by (up to 99 hours allowed)');
			if (isFormValid) {
				xajax_extendBookingWithDuration(xajax.getFormValues('cserv_booking_extension_form'));
			}
		},
		confirmExtensionWithDuration: function(message) {
			if (confirm(message)) {
				xajax_extendBookingWithDuration(xajax.getFormValues('cserv_booking_extension_form'), 0);
			}
		},
		fineOwner: function(amount) {
			if(wc.cserv.validateFineDriverForm()
			&& confirm('This is going to take a fine of ' + amount + 'GBP from the Owner. Proceed?')) {
				xajax_fineOwner(xajax.getFormValues('cserv_owner_fine_form'));
			}
		},
		getOwnerFineCost: function() {
			xajax_getOwnerFineCost(xajax.getFormValues('cserv_owner_fine_form'));
		},
		getRefundAmountForDriver: function(formName) {
			xajax_getRefundAmountForDriver(xajax.getFormValues(formName), formName);
		},
		refundDriver: function(formName, amount) {
			if(confirm('This is going to give a refund of ' + amount + 'GBP to the Driver. Proceed?')) {
				xajax_refundDriver(xajax.getFormValues(formName));
			}
		},
		validateFineDriverForm: function() {
			var isFormValid = true;
			if ($('cserv_driver_fine_form_number_of_hours_div').visible()) {
				isFormValid = tao.form.validateElement($('cserv_driver_fine_form_number_of_hours'), 'required', 'Please enter an amount');
			} else if ($('cserv_driver_fine_form_external_fine_amount_div').visible()) {
				isFormValid = tao.form.validateElement($('cserv_driver_fine_form_external_fine_amount'), 'required', 'Please enter an amount');
			}
			return isFormValid;
		},
		fineDriver: function(amount) {
			if(wc.cserv.validateFineDriverForm()
			&& confirm('This is going to take a fine of ' + amount + 'GBP from the Driver. Proceed?')) {
				xajax_fineDriver(xajax.getFormValues('cserv_driver_fine_form'));
			}
		},
		getDriverFineCost: function() {
			if (wc.cserv.validateFineDriverForm()) {
				xajax_getDriverFineCost(xajax.getFormValues('cserv_driver_fine_form'));
			}
		},
		manualDebit: {
			init : function() {
				$j('.amount').keyup(function() {
					$j('#manual-debit-total').text(($F('AdminFee')*1)+($F('CostRecovery')*1));
				});
			},
			debit: function() {
				var isFormValid = tao.form.validateElement($('CostRecovery'), 'required', 'Please enter an amount');
				isFormValid &= tao.form.validateElement($('AdminFee'), 'required', 'Please enter an amount');
				isFormValid &= tao.form.validateElement($('Reason'), 'required', 'Please enter an amount');
				if (isFormValid) {
					if (confirm("This will take payment from the selected user, are you sure?")) {
						xajax_manualDebit(xajax.getFormValues('cserv_manual_debit_form'));
					}
				}
			}
		},
		refund: function() {
			var isFormValid = tao.form.validateElement($('Amount'), 'required', 'Please enter an amount');
			isFormValid &= tao.form.validateElement($('Reason'), 'required', 'Please enter an amount');
			if (isFormValid) {
				if (confirm("This will refund the selected user, are you sure?")) {
					xajax_refund(xajax.getFormValues('cserv_refund_form'));
				}
			}
		},
		fullyRefund: function(transactionReference, userId, bookingId, amount) {
			var reason = 'Full refund through the transactions panel';
			if (confirm("This will fully refund this transaction, are you sure?")) {
					xajax_refundTransaction(transactionReference, userId, bookingId, amount, reason);
			}
		},
		toggleInputFields: function(event) {
			wc.cserv.hideInputFields();
			var reason = $F(event.element());
			if (reason == 'DriverLateForDropOff') {
				$('cserv_driver_fine_form_number_of_hours_div').show();
			} else if (reason == 'DriverIncurredExternalFine') {
				$('cserv_driver_fine_form_external_fine_amount_div').show();
			}
		},
		hideInputFields: function() {
			$('cserv_driver_fine_form_number_of_hours_div').hide();
			$('cserv_driver_fine_form_external_fine_amount_div').hide();
		},
		generateBookingsReport: function() {
			var dateRegex = /^\d{2}-\d{2}-\d{4}( \d{2}:\d{2})*$/;
			var isFormValid = tao.form.validateElement($('booking_report_startdate'), dateRegex, 'Please enter a valid date (dd-mm-yyyy)');
			isFormValid &= tao.form.validateElement($('booking_report_enddate'), dateRegex, 'Please enter a valid date (dd-mm-yyyy)');
			if (isFormValid) {
				xajax_generateBookingsReport(xajax.getFormValues('finance_report_form'));
			}
		},
		generateManualTransactionsReport: function() {
			var dateRegex = /^\d{2}-\d{2}-\d{4}( \d{2}:\d{2})*$/;
			var isFormValid = tao.form.validateElement($('manual_transactions_report_startdate'), dateRegex, 'Please enter a valid date (dd-mm-yyyy)');
			isFormValid &= tao.form.validateElement($('manual_transactions_report_enddate'), dateRegex, 'Please enter a valid date (dd-mm-yyyy)');
			if (isFormValid) {
				xajax_generateManualTransactionsReport(xajax.getFormValues('manual_transactions_report_form'));
			}
		},
		setOwnersPackStatus: function(userId, status) {
			xajax_setOwnersPackStatus(userId, status);
		},
		sendAccidentReport: function(bookingId) {
			var isFormValid = tao.form.validateElement($('incident_caller_name'), 'required', 'Please enter a caller name');
			isFormValid &= tao.form.validateElement($('incident_caller_number'), 'required', 'Please enter a caller number');
			isFormValid &= tao.form.validateElement($('incident_time'), 'required', 'Please enter an incident time');
			isFormValid &= tao.form.validateElement($('incident_description'), 'required', 'Please enter a description');
			if (isFormValid) {
				xajax_sendAccidentReport(bookingId, xajax.getFormValues('incident_report_form'));
			}
		},
		sendBreakdownReport: function(bookingId) {
			var isFormValid = tao.form.validateElement($('incident_caller_name'), 'required', 'Please enter a caller name');
			isFormValid &= tao.form.validateElement($('incident_caller_number'), 'required', 'Please enter a caller number');
			isFormValid &= tao.form.validateElement($('incident_location'), 'required', 'Please enter a location');
			isFormValid &= tao.form.validateElement($('action_required'), 'required', 'Please enter a requested action');
			if (isFormValid) {
				xajax_sendBreakdownReport(bookingId, xajax.getFormValues('incident_report_form'));
			}
		},
		voucher: {
			toggleEndDate: function() {

				if($j('#forever').hasClass('checked')) {
					$j('#forever').removeClass('checked');
					$j('#end_date').attr('disabled', '');
				}
				else {
					$j('#end_date').attr('disabled', 'disabled');
					$j('#forever').addClass('checked');
				}
			},
			save: function() {
				var isValid = true;
				isValid &= tao.form.validateElement($('voucher_code'), 'required', "Please enter a code");
				isValid &= tao.form.validateElement($('start_date'), 'required', "Please enter a start date");
				isValid &= tao.form.validateElement($('end_date'), 'required', "Please enter an end date");
				isValid &= tao.form.validateElement($('discount'), 'required', "Please enter a discount");
				isValid &= tao.form.validateElement($('start_date'), /^\d{2}\/\d{2}\/\d{2}$/, 'Please enter a valid start date (dd/mm/yyyy)');
				if( !$j('#forever').hasClass('checked') ) {
					isValid &= tao.form.validateElement($('end_date'), /^\d{2}\/\d{2}\/\d{2}$/, 'Please enter a valid start date (dd/mm/yyyy)');
				}
				if (isValid) {
					xajax_saveVoucher(xajax.getFormValues($('voucher_edit')));
				}
			}
		}
	},
	vehicle: {
		init: function() {
			wc.vehicle.availability.init();
		},
		book: function(vehicleId, eleStartDate, eleEndDate) {
			var startDate = $F(eleStartDate).gsub(/(\d+)(am|pm)/,"#{1}:00 #{2}");
			var endDate = $F(eleEndDate).gsub(/(\d+)(am|pm)/,"#{1}:00 #{2}");
			var startDatetime = Date.fromString(startDate)/1000;
			var endDatetime = Date.fromString(endDate)/1000;
			if (isNaN(startDatetime) || isNaN(endDatetime)) {
				Swc.Error('Please enter some dates');
				return;
			}
			// Check dates are in correct order
			if (startDatetime > endDatetime) {
				Swc.Error('Start date is after end date');
				return;
			}
			// Track event
			// tao.analytics.event('Shortlists', 'AddVehicle', "Vehicle #"+vehicleId, vehicleId);
			xajax_addToShortlist(vehicleId, startDate, endDate);
		},
		availability: {
			init: function() {
				$$('.all_day').invoke('observe', 'click', wc.vehicle.availability.toggleAllDaySetting);
				$$('.part_day').invoke('observe', 'click', wc.vehicle.availability.togglePartDaySetting);
			},
			setDayAvailability: function(day, availability) {
				if ($j('#user_availability_calendar')) {
					weekdays = $j('.' + day);
					weekdays.attr('class', 'day_name ' + day + ' ' + availability);
				}
			},
			toggleDayAvailability: function(caller) {
				var dayDiv = $j(caller);
				if (dayDiv.hasClass('Available') || dayDiv.hasClass('PartiallyAvailable')) {
					dayDiv.removeClass('Available');
					dayDiv.removeClass('PartiallyAvailable');
					dayDiv.addClass('NotAvailable');
				} else if (dayDiv.hasClass('NotAvailable')) {
					dayDiv.removeClass('NotAvailable');
					dayDiv.addClass('Available');
				}
			},
			toggleAllDaySetting: function(event) {
				var day = $j(event.findElement('div.button')).parent('.day_column').attr('id').substr(0,3);
				var button = event.findElement('div.button');
						if (!button.hasClassName('selected')) {
							button.addClassName('selected');
							button.up().select('div.part_day').each(function(ele){
										ele.addClassName('selected');
							});
							wc.vehicle.availability.setDayAvailability(day, 'Available');
						} else {
								button.removeClassName('selected');
								button.up().select('div.part_day').each(function(ele){
										ele.removeClassName('selected');
							});
								wc.vehicle.availability.setDayAvailability(day, 'NotAvailable');
						}
			},
			togglePartDaySetting: function(event) {
				var day = $j(event.findElement('div.button')).parent('.day_column').attr('id').substr(0,3);
				var button = event.findElement('div.button');
				if (!button.hasClassName('selected')) {
								button.addClassName('selected');
						} else {
							button.removeClassName('selected');
						}
				var areAllPartsSelected = button.up()
															.select('.part_day')
															.findAll(function(ele){return ele.hasClassName('selected');})
															.length == 3;
				var areNoPartsSelected = button.up()
												.select('.part_day')
												.findAll(function(ele){return !ele.hasClassName('selected');})
												.length == 3;
				if (areAllPartsSelected) {
					button.previous('.all_day').addClassName('selected');
					wc.vehicle.availability.setDayAvailability(day, 'Available');
						} else if(areNoPartsSelected) {
					wc.vehicle.availability.setDayAvailability(day, 'NotAvailable');
						} else {
							button.previous('.all_day').removeClassName('selected');
							wc.vehicle.availability.setDayAvailability(day, 'PartiallyAvailable');
						}
			},
			save: function() {
				var weekly_availability_data = new Hash();
					$$('.day_column').each(function(ele){
							var day_name = ele.identify();
							var windows = [];
							var all_day_button = ele.select('div.all_day').first();
							if (all_day_button.hasClassName('selected')) {
									windows.push(wc.vehicle.availability.getWindow(all_day_button));
							} else {
								ele.select('div.part_day').each(function(ele){
									if (!ele.hasClassName('selected')) return;
									slot = wc.vehicle.availability.getWindow(ele);
									if (slot) windows.push(slot);
								});
							}
							weekly_availability_data.set(day_name, windows);
					});
				if ($j('#user_availability_calendar')) {
					var daily_availability_data = new Hash();
					var i = 0;
					$$('.day_name').each(function(ele) {
						var availability;
						var date;
						if (ele.hasClassName('Available') ) {
							availability = 'Available';
						} else if (ele.hasClassName('NotAvailable')) {
							availability = 'NotAvailable';
						}
						if (availability) {
							daily_availability_data.set(ele.id, availability);
						}
					});
					xajax_saveVehicleAvailability(weekly_availability_data.toJSON(), daily_availability_data.toJSON());
				} else {
					xajax_saveVehicleAvailability(weekly_availability_data.toJSON());
				}
			},
			getWindow: function(ele) {
				var startTime = wc.vehicle.availability.getWindowStartTime(ele);
				var endTime = wc.vehicle.availability.getWindowEndTime(ele);
				return (startTime && endTime) ? [startTime, endTime] : null;
			},
			getWindowStartTime: function(ele) {
				return ele.classNames().inject(null, function(startTime, className) {
					if (/^start_/.test(className)) {
						startTime = className.match(/\d+$/).first();
					}
					return startTime;
				});
			},
			getWindowEndTime: function(ele) {
				return ele.classNames().inject(null, function(endTime, className) {
					if (/^end_/.test(className)) {
						endTime = className.match(/\d+$/).first();
					}
					return endTime;
				});
			}
		}
	},
	popup: {
		show: function(event) {
			var text = $A(arguments).length > 0 ? $A(arguments)[1].innerHTML : 'No help available';
			var popupEle = wc.popup.get();
			popupEle.update(text).show();
			tao.position.nextToClick(popupEle, event.pointerX()+10, event.pointerY());
		},
		get: function() {
			var id = 'wc_popup';
			var ele = $(id);
			if (!ele) {
				ele = new Element('div', {'id': id}).setStyle({
					'position': 'absolute',
					'width': '300px'
				});
				$$('body').first().insert(ele);
			}
			return ele;
		}
	},
	howItWorks: {
		init: function() {
			$$('#how_it_works a').invoke('observe', 'mouseover', wc.howItWorks.handleMouseOver);
			$$('#how_it_works').invoke('observe', 'mouseout', wc.howItWorks.handleMouseOut);
		},
		bindClickEvents: function() {
			$$('#how_it_works a.how_it_works_details_link').invoke('observe', 'click', wc.howItWorks.showDetails);
		},
		showDetails: function(event) {
			var element = event.findElement('a');
			var copyId = element.identify().gsub(/_link/, '');
			$('how_it_works_details').update($(copyId).innerHTML);
			//Cufon.refresh();
			Effect.ScrollTo($('how_it_works_details'));
		},
		handleMouseOver: function(event) {
			var element = event.findElement('a');
			if (!element) return;
			var copyId = element.identify()+'_copy';
			wc.howItWorks.displayCopyByElement(element, $(copyId).innerHTML);
		},
		handleMouseOut: function(event) {
			var elementAfter = event.relatedTarget;
			if (!elementAfter || !!elementAfter.up('#how_it_works')) return;
			$('how_it_works_popup').hide();
		},
		displayCopyByElement: function(element, copyHtml) {
			var parent = $('how_it_works');
			var popup = $('how_it_works_popup');
			popup.update(copyHtml).show();
			//Cufon.refresh();
			wc.howItWorks.bindClickEvents();
			var positionTop = element.positionedOffset()[1];
			var positionLeft = parent.getDimensions().width/2 - popup.getDimensions().width/2 ;
			popup.setStyle({
				top: String(positionTop)+'px',
				left: String(positionLeft)+'px'
			});
		}
	},
	faq: {
		init: function(el) {
			if (!el.length) {return false;}
			this.questions = el.find('h5.question').toggle(wc.faq.show, wc.faq.hide);
			this.questions.each(function() {
				var question = jQuery(this);
				question.data('answer', question.next('.answer').hide());
			});

			if (location.hash) {
				var target = jQuery(location.hash);
				if (target) target.click();
			}
		},
		show: function() {
			jQuery(this).data('answer').show();
			jQuery(this).toggleClass('open');
			return false;
		},
		hide: function() {
			jQuery(this).data('answer').hide();
			jQuery(this).toggleClass('open');
			return false;
		}
	},
	shortlist: {
		init: function() {
			$$('input[name=shortlist_excess]').invoke('observe', 'click', wc.shortlist.updateTotals);
			$$('.rate_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('rate_help_content')));
			$$('.insurance_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('insurance_help_content')));
			$$('.transaction_fee_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('transaction_fee_help_content')));
			$$('.voucher_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('voucher_help_content')));
			$$('.additional_driver_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('additional_driver_help_content')));
			$$('.excess_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('excess_help_content')));
			$$('.total_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('total_help_content')));
			$$('.message_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('message_help_content')));
			$$('.csv_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('csv_help_content')));
			$$('.late_bookings_help_link').invoke('observe', 'click', wc.popup.show.bindAsEventListener({}, $('late_bookings_help_content')));
			wc.shortlist.voucher.init();
			wc.shortlist.additionalDriver.init();
		},
		secondChanceRequest: {
			accept: function() {
				var isFormValid = true;
				if (!$('terms').checked) {
											Swc.Error('You must agree to the terms and conditions to continue');
											isFormValid = false;
				}
				if (isFormValid) {
					xajax_acceptSecondChanceRequest();
				}
			},
			decline: function() {
				xajax_rejectSecondChanceRequest();
			}
		},
		voucher: {
			init: function() {
				if ($('voucher_code')) $('voucher_code').observe('focus', function(){
					if ($F('voucher_code') == 'Enter your code...') {
						$('voucher_code').setValue('');
					}
				});
			},
			apply: function() {
				xajax_applyVoucher($F('voucher_code'));
			}
		},
		additionalDriver : {
			init: function() {
				if ($('additional_driver_username')) $('additional_driver_username').observe('focus', function(){
					if ($F('additional_driver_username') == 'driver\'s username...') {
						$('additional_driver_username').setValue('');
					}
				});
			},
			apply: function() {
				xajax_applyAdditionalDriver($F('additional_driver_username'));
			}
		},
		add: function (vehicleId, eleStartDate, eleEndDate) {
			var startDate = $F(eleStartDate).gsub(/(\d+)(am|pm)/,"#{1}:00 #{2}");
			var endDate = $F(eleEndDate).gsub(/(\d+)(am|pm)/,"#{1}:00 #{2}");
			var startDatetime = Date.fromString(startDate)/1000;
			var endDatetime = Date.fromString(endDate)/1000;
			if (isNaN(startDatetime) || isNaN(endDatetime)) {
				Swc.Error('Please enter some dates');
				return;
			}
			// Check dates are in correct order
			if (startDatetime > endDatetime) {
				Swc.Error('Start date is after end date');
				return;
			}
			// Track event
			// tao.analytics.event('Shortlists', 'AddVehicle', "Vehicle #"+vehicleId, vehicleId);
			xajax_addToShortlist(vehicleId, startDate, endDate);
		},
		remove: function (vehicleId) {
			xajax_removeFromShortlist(vehicleId);
		},
		toggleBasket: function() {
			var path = '/images/icons/basket_arrow_up.png';
			if ($j('#basket_expand_button').attr('src') == '/images/icons/basket_arrow_up.png') {
				path = '/images/icons/basket_arrow_down.png';
			}
			$j('#basket_expand_button').attr('src', path);
			$j('#expandable_basket').toggle();
		},
		getShortlistSubtotals: function(excessCharge) {
			var subtotals = new Array();
			var transactionFee = parseFloat($F('shortlist_transaction_fee'));
			$$('input[name=HireChargesIncludingInsurance]').each(function(s){
				subtotals.push(parseFloat($F(s.identify())));
			});
			for(i=0; i<subtotals.length; i++) {
				subtotals[i] += excessCharge + transactionFee;
			}
			return subtotals;
		},
		updateTotals: function(event) {
			if(event.element().checked) {
				xajax_addExcessToShortlistItems();
			} else {
				xajax_removeExcessFromShortlistItems();
			}
		},
		submit: function() {
			if ($F('shortlist_submission_terms')) {
				try {
					showLoader();
				} catch (error) {}
				var address = wc.shortlist.getAddress();
				if ($('saved_card_number')) {
					var cardNumber = $F('saved_card_number');
					if (cardNumber !== "0") {
						xajax_submitShortlistWithSavedCard($F('shortlist_message'), cardNumber);
						return;
					} else if ($j('div#new-credit-card').css('display') == "none") {
						Swc.Error("You must either select a pre-registered card or add a new one before proceeding.");
						hideLoader();
						return;
					}
				}
				var card = wc.payment.getCard();
				if (card) {
					if (address) {
						xajax_submitShortlist($F('shortlist_message'), card.toJSON(), address.toJSON());
					} else {
						xajax_submitShortlist($F('shortlist_message'), card.toJSON());
					}
				} else {
										// Scroll to top failing element
										Effect.ScrollTo($('saved_card_number'));
					hideLoader();
				}
			} else {
				Swc.Error("You must agree with the terms and conditions");
			}
		},
		accept: function() {
			if($F('shortlist_response_terms')) {
				showLoader();
				xajax_acceptShortlist();
			} else {
				Swc.Error("You must agree with the terms and conditions");
			}
		},
		decline: function() {
			if (confirm('Are you sure you want to decline this booking request?')) {
				xajax_rejectShortlist('', $j('input[name=decline_reason]:radio:checked').val());
			}
		},
		getAddress: function() {
			var postCodeRegex = /^\s*[a-zA-Z][a-zA-Z0-9]{1,3}\s*(\d[a-zA-Z]{2})?\s*$/;
			var validForm = tao.form.validateElement($('address_line1'), 'required', 'Please enter the first line of your address');
			validForm &= tao.form.validateElement($('address_line3'), 'required', 'Please a town or city');
			validForm &= tao.form.validateElement($('address_postcode'), 'postcode', 'Please enter a valid postcode');
			if (validForm) {
				var address = new Hash({
					'addressLine1': $F('address_line1'),
					'addressLine2': $F('address_line2'),
					'addressLine3': $F('address_line3'),
					'postCode': $F('address_postcode')
							});
				return address;
			} else {
				return null;
			}
		}
	},
	comms: {
		sendPopupMessage: function (recipientId) {
			xajax_sendPopupMessage($F('compose_message_subject'),$F('compose_message_body').gsub(/\n/, '<br />'), recipientId);
		},
		sendAbuseReportMessage: function (reportedUserId) {
			var isFormValid = tao.form.validateElement($('compose_message_body'), 'required', 'Please enter some text');
			if (isFormValid) {
				xajax_sendReportAbuseMessage($F('compose_message_body').gsub(/\n/, '<br />'), reportedUserId);
			}
		},
		sendMessage: function () {
			xajax_sendMessage($F('compose_message_subject'),$F('compose_message_body').gsub(/\n/, '<br />'));
		},
		deleteMessage: function (messageId) {
			if(confirm('Are you sure you want to delete this message?')) {
				xajax_deleteMessage(messageId);
			}
		},
		toggleCheckAll: function(caller) {
			var checkboxes = $$("#messages_form input[type=checkbox]");
			checkboxes.each(function(box){
				box.checked = caller.checked;
			});
		},
		deleteSelected: function() {
			if(confirm('Are you sure you want to delete these messages? (this will delete all selected messages)')) {
				var checkboxes = $$("#messages_form input[type=checkbox]");
				xajax_deleteSelectedMessages($H($('messages_form').serialize({hash:true})).toJSON());
			}
		}
	},
	seo: {
		init: function() {
			$('keyword_form').observe('submit', wc.seo.addKeyword );
			$('location_form').observe('submit', wc.seo.addLocation );
		},
		closeButtonCloseOriginal : null,
		enableEditors: function() {
			if(wc.seo.closeButtonCloseOriginal == null) {
				wc.seo.closeButtonCloseOriginal = $$('#divPopupCloseButton a').first().onclick;
			}
			$$('#divPopupCloseButton a').first().onclick = function() {
				Tiny.disable('resultsText');
				Tiny.disable('noResultsText');
				wc.seo.closeButtonCloseOriginal();
			};
			Tiny.enable('resultsText', 'HtmlContent');
			Tiny.enable('noResultsText', 'HtmlContent');
		},
		addKeyword: function(e) {
			var isFormValid = tao.form.validateElement($('keywordTerm'), 'required', 'Please enter a keyword');
			if (isFormValid) {
				xajax_addKeyword($('keywordTerm').value, $('keywordLink').value);
				$('keywordTerm').value = '';
			}
			else {
				e.stop();
			}
		},
		addLocation: function(e) {
			var isFormValid = tao.form.validateElement($('locationLocation'), 'required', 'Please enter a location');
			if (isFormValid) {
				xajax_addLocation($F('locationLocation'), $F('locationMap'), $F('locationLongMap'), $F('locationLatMap'));
				$('locationLocation').value = '';
			}
			else {
				e.stop();
			}
		},
		deleteKeyword: function(keywordId) {
			if(confirm('Are you sure you want to delete this keyword?')) {
				xajax_deleteKeyword(keywordId);
			}
		},
		deleteLocation: function(location) {
			if(confirm('Are you sure you want to delete this location map?')) {
				xajax_deleteLocation(location);
			}
		},
		deleteDescription: function(descriptionId) {
			if(confirm('Are you sure you want to delete this description?')) {
				xajax_deleteDescription(descriptionId);
			}
		}
	},
	geo: {
		init: function() {
			if (location.search.search(/\\?location/) == -1) return;
			if (navigator.geolocation) {
				navigator.geolocation.getCurrentPosition(wc.geo.handleUserLocation, wc.geo.handleNoUserLocation);
			} else if (google.gears) {
				var geo = google.gears.factory.create('beta.geolocation');
					geo.getCurrentPosition(wc.geo.handleUserLocation, wc.geo.handleNoUserLocation);
			}
		},
		handleUserLocation: function(position) {
			xajax_displayUserLocationHelp(position.coords.latitude, position.coords.longitude);
		},
		handleNoUserLocation: function(position) {

		}
	},
	notify: function(message) {
		Swc.Notify(message, {className: 'whipcar_notification', sticky: true});
	}
};
document.observe("dom:loaded", function() {
	wc.init();
});

/*
 * Checkbox Handling
 */
var checkboxHandler = {

	// Returns the selected values from a given list of checkboxes
		getSelectedValues: function(form) {
			return $(form).select('input[type=checkbox]').findAll(function(ele){
					return ele.checked;
			}).pluck('value');
	},
	// Deselects all checkboxes within an element
	deselectAll: function(form) {
			return form.select('input[type=checkbox]').each(function(ele){
				 ele.checked = false;
			});
	},
	// Selects all checkboxes within an element
	selectAll: function(form) {
			return form.select('input[type=checkbox]').each(function(ele){
				 ele.checked = true;
			});
	}
}


/*
Content Toggler
*/

function toggleContent(showContent) {
		var ele = document.getElementById(showContent);
		if (ele.style.display == "block") {
				ele.style.display = "none";
		} else {
				ele.style.display = "block";
		}
}

function toggleAdvancedSearch(showSearchContent, switchSearchLink) {
	var ele = document.getElementById(showSearchContent);
	var text = document.getElementById(switchSearchLink);
	if(ele.style.display == "block") {
		ele.style.display = "none";
		text.innerHTML = "Show advanced search";
		}
	else {
		ele.style.display = "block";
		text.innerHTML = "Close advanced search";
	}
}

/* External Links */
function externalLinks() {
	 if (!document.getElementsByTagName) return;
	 var anchors = document.getElementsByTagName("a");
	 for (var i=0; i<anchors.length; i++) {
		 var anchor = anchors[i];
		 if (anchor.getAttribute("href") &&
				 anchor.getAttribute("rel") == "external")
			 anchor.target = "_blank";
	 }
	}
window.onload = externalLinks;

function disableEnterKey(e)
{
		 var key;
		 if (window.event) {
					key = window.event.keyCode; //IE
		 } else {
					key = e.which; //firefox
		 }
		 return (key != 13);
};


// LOADING SCREEN
function showLoader() {
		return;
		var divLoader = 'divLoader';
		var divDimmer = 'divDimmer';

		if( typeof( window.innerWidth ) == 'number' ) {
				// Non-IE
				document.getElementById(divDimmer).style.height = document.body.parentNode.scrollHeight + 'px';
				document.getElementById(divDimmer).style.width	= document.body.parentNode.scrollWidth	+ 'px';
				document.getElementById(divDimmer).style.position = 'fixed';
		} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
				// IE 6+ in 'standards compliant mode'
				var myHeight = Math.max(document.body.parentNode.scrollHeight, document.documentElement.clientHeight);
				var myWidth	 = Math.max(document.body.parentNode.scrollWidth, document.documentElement.clientWidth);
				document.getElementById(divDimmer).style.height = myHeight + 'px';
				document.getElementById(divDimmer).style.width	= myWidth	 + 'px';
		} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
				// IE 4 compatible (quirk mode)
				document.getElementById(divDimmer).style.height = (document.body.parentNode.scrollHeight-20) + 'px';
				document.getElementById(divDimmer).style.width	= (document.body.parentNode.scrollWidth-20)	 + 'px';
		}

		document.getElementById(divDimmer).style.display = 'block';
		document.getElementById(divLoader).style.display = 'block';
}

function hideLoader() {
	if ($('divDimmer')) $('divDimmer').hide();
	if ($('divLoader')) $('divLoader').hide();
}

Date.prototype.format=function(format){var returnStr='';var replace=Date.replaceChars;for(var i=0;i<format.length;i++){var curChar=format.charAt(i);if(i-1>=0&&format.charAt(i-1)=="\\"){returnStr+=curChar;}else if(replace[curChar]){returnStr+=replace[curChar].call(this);}else if(curChar!="\\"){returnStr+=curChar;}}return returnStr;};Date.replaceChars={shortMonths:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],longMonths:['January','February','March','April','May','June','July','August','September','October','November','December'],shortDays:['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],longDays:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],d:function(){return(this.getDate()<10?'0':'')+this.getDate();},D:function(){return Date.replaceChars.shortDays[this.getDay()];},j:function(){return this.getDate();},l:function(){return Date.replaceChars.longDays[this.getDay()];},N:function(){return this.getDay()+1;},S:function(){return(this.getDate()%10==1&&this.getDate()!=11?'st':(this.getDate()%10==2&&this.getDate()!=12?'nd':(this.getDate()%10==3&&this.getDate()!=13?'rd':'th')));},w:function(){return this.getDay();},z:function(){var d=new Date(this.getFullYear(),0,1);return Math.ceil((this-d)/86400000);},W:function(){var d=new Date(this.getFullYear(),0,1);return Math.ceil((((this-d)/86400000)+d.getDay()+1)/7);},F:function(){return Date.replaceChars.longMonths[this.getMonth()];},m:function(){return(this.getMonth()<9?'0':'')+(this.getMonth()+1);},M:function(){return Date.replaceChars.shortMonths[this.getMonth()];},n:function(){return this.getMonth()+1;},t:function(){var d=new Date();return new Date(d.getFullYear(),d.getMonth(),0).getDate()},L:function(){var year=this.getFullYear();return(year%400==0||(year%100!=0&&year%4==0));},o:function(){var d=new Date(this.valueOf());d.setDate(d.getDate()-((this.getDay()+6)%7)+3);return d.getFullYear();},Y:function(){return this.getFullYear();},y:function(){return(''+this.getFullYear()).substr(2);},a:function(){return this.getHours()<12?'am':'pm';},A:function(){return this.getHours()<12?'AM':'PM';},B:function(){return Math.floor((((this.getUTCHours()+1)%24)+this.getUTCMinutes()/60+this.getUTCSeconds()/3600)*1000/24);},g:function(){return this.getHours()%12||12;},G:function(){return this.getHours();},h:function(){return((this.getHours()%12||12)<10?'0':'')+(this.getHours()%12||12);},H:function(){return(this.getHours()<10?'0':'')+this.getHours();},i:function(){return(this.getMinutes()<10?'0':'')+this.getMinutes();},s:function(){return(this.getSeconds()<10?'0':'')+this.getSeconds();},u:function(){var m=this.getMilliseconds();return(m<10?'00':(m<100?'0':''))+m;},e:function(){return"Not Yet Supported";},I:function(){return"Not Yet Supported";},O:function(){return(-this.getTimezoneOffset()<0?'-':'+')+(Math.abs(this.getTimezoneOffset()/60)<10?'0':'')+(Math.abs(this.getTimezoneOffset()/60))+'00';},P:function(){return(-this.getTimezoneOffset()<0?'-':'+')+(Math.abs(this.getTimezoneOffset()/60)<10?'0':'')+(Math.abs(this.getTimezoneOffset()/60))+':00';},T:function(){var m=this.getMonth();this.setMonth(0);var result=this.toTimeString().replace(/^.+ \(?([^\)]+)\)?$/,'$1');this.setMonth(m);return result;},Z:function(){return-this.getTimezoneOffset()*60;},c:function(){return this.format("Y-m-d\\TH:i:sP");},r:function(){return this.toString();},U:function(){return this.getTime()/1000;}};

(function($) {
		wc.pressArticles = {
			init: function() {
				var self = this;
				this.articles = $('#press-page .article').not(':first').hide().end();
				this.articleThumbnails = $('#articles-nav')
											.find('li a')
											.click(function() {
												var tabId = this.hash.substr(1);
												self.changeTab(tabId);
												return false;
											});
			},
			changeTab: function(tabId) {
				this.articles.filter('#' + tabId).show().end().not('#' + tabId).hide();
			}
		}

		$j(function(){
			swc.notifier.error = swc.notifier.notifyError;
			$j.jGrowl.defaults.position = 'top-left';
		});
})(jQuery);

// new style modal forms
jQuery(function() {
	jQuery.modalBox();
});


// Form stuff
jQuery(function() {

	// Input hint text
	jQuery("label.inlined + input.input_text").each(function(input) {

		jQuery("window").load(function () {
			setTimeout(function() {
				if (!input.value.empty()) {
					input.prev('label.inlined').addClassName('has_text');
				}
			}, 200);
		});

		jQuery(this).focus(function () {
			jQuery(this).prev("label.inlined").addClass("focus");
		});

		jQuery(this).keypress(function () {
			jQuery(this).prev("label.inlined").addClass("has_text").removeClass("focus");
		});

		$(this).blur(function () {
			if (jQuery(this).val() == "") {
				jQuery(this).prev("label.inlined").removeClass("has_text").removeClass("focus");
			}
		});

	});

});
