$.fn.visible = function () {
    this.css('visibility', 'visible');
}

$.fn.invisible = function () {
    this.css('visibility', 'hidden');
}

$.fn.isVisible = function () {
    return this.css('visibility') == 'visible' ? true : false;
}
$.fn.toggleVisibility = function () {
    var vis = this.css('visibility') == 'visible' ? 'hidden' : 'visible';
    this.css('visibility', vis);
}

$.fn.isDisplayed = function () {
    return this.css('display') != 'none' ? true : false;
}
$.fn.toggleDisplay = function (display) {
    if (display == undefined) display = 'block';
    var d = this.css('display') != 'none' ? 'none' : display;
    this.css('display', d);
}

$.fn.onEnterKey = function(func) {
    this.keypress(function(e) {
        var code = (e.keyCode ? e.keyCode : e.which);
        if (code == 13) func();
    });
}

/* Tankstream functions */
if (!this.TS) {
    TS = function () { };
}

/* string functions */
TS.string = function () { };
TS.string.padLeft = function(the_string, pad_with, length)
{
    the_string += '';
    if(the_string.length < length)
    {
        while( the_string.length < length )
        {
            the_string = pad_with + the_string;
        }
    }
    return the_string;
}
TS.string.padRight = function(the_string, pad_with, length)
{
    the_string += '';
    if(the_string.length < length)
    {
        while( the_string.length < length )
        {
            the_string = the_string + pad_with;
        }
    }
    return the_string;
}

TS.string.emptyDiv = $('<div/>');
TS.string.htmlEncode = function (value) {
    if (value == null) return '';
    return TS.string.emptyDiv.text(value).html();
}
TS.string.htmlQuot = function (value) {
    if (value == null) return '';
    return value.replace('\"', '&quot;');
}
TS.string.htmlDecode = function (value) {
    if (value == null) return '';
    return TS.string.emptyDiv.html(value).text();
}

TS.string.formatFloat = function (number, places) {
    if (number == null || number == '') return '';
    number += '';
    var index = number.indexOf('.');
    var numLength = number.length;

    if (index < 0) {
        if(places != 0) number = TS.string.padRight(number + ".", "0", numLength + places + 1);
    }
    else {
        var numPlaces = numLength - (index + 1);
        var neededPlaces = places - numPlaces;

        if (numPlaces < places) {
            number = TS.string.padRight(number, "0", numLength + neededPlaces);
        }
        else if (numPlaces == places) {
            // do nothing
        }
        else {
            number = TS.math.toFixed(number, places);
        }
    }
    return number;
}

TS.string.currency = function (amount) {
    if (amount == null) amount = 0.0;
    amount = amount.toString().replace(/\$|\,/g, '');
    if (isNaN(amount))
        amount = "0";
    var sign = (amount == (amount = Math.abs(amount)));
    amount = Math.floor(amount * 100 + 0.50000000001);
    var cents = amount % 100;
    amount = Math.floor(amount / 100).toString();
    if (cents < 10)
        cents = "0" + cents;
    for (var i = 0; i < Math.floor((amount.length - (1 + i)) / 3); i++)
        amount = amount.substring(0, amount.length - (4 * i + 3)) + ',' + amount.substring(amount.length - (4 * i + 3));    
    return (((sign) ? '' : '-') + '$ ' + amount + '.' + cents);
}

TS.math = function () { };
TS.math.toFixed = function (number, precision) {
    var power = Math.pow(10, precision || 0);
    return Math.round(number * power) / power;    
}

/* date functions */
TS.date = function () { };
TS.date.format = function () { };
TS.date.format.Australia = 0; // dd/mm/yyyy
TS.date.format.America = 1;  // mm/dd/yyyy
TS.date.format.Asia = 2; //yyyy/mm/dd
TS.date.currentFormat = TS.date.format.Australia;
TS.date.currentDelimiter = '/';

TS.date.toShortString = function (the_date, show_time, format, delimiter) {
    if (the_date == null) return '';
    if (show_time == undefined) show_time = false;
    if (format == undefined) format = TS.date.currentFormat;
    if (delimiter == undefined) delimiter = TS.date.currentDelimiter;
    var date_string = '';
    var d, m, y;
    d = TS.string.padLeft(the_date.getDate(), '0', 2);
    m = TS.string.padLeft(the_date.getMonth() + 1, '0', 2);
    y = the_date.getFullYear();
    switch (format) {
        case TS.date.format.America:
            date_string = m + delimiter + d + delimiter + y;
            break;
        case TS.date.format.Asia:
            date_string = y + delimiter + m + delimiter + d;
            break;
        default:
            date_string = d + delimiter + m + delimiter + y;
            break;
    }
    if (show_time) date_string += ' ' + TS.date.formatTime(the_date, false);
    return date_string;
}

TS.date.formatTime = function (the_time, as_24_hour) {
    if (the_time.getDate == undefined) the_time = new Date(the_time);
    if (as_24_hour == undefined) as_24_hour = false;
    var time_string = '';
    var hours = the_time.getHours();
    var minutes = TS.string.padLeft(the_time.getMinutes(), '0', 2);
    var seconds = TS.string.padLeft(the_time.getSeconds(), '0', 2);
    if (as_24_hour) {
        time_string = TS.string.padLeft(hours, '0', 2) + ':' + minutes + ':' + seconds;
    }
    else {
        var a = 'AM';
        if (hours >= 12) {
            a = "PM";
            hours = hours - 12;
        }
        if (hours == 0) hours = 12;
        time_string = TS.string.padLeft(hours, '0', 2) + ':' + minutes + ':' + seconds + ' ' + a;
    }
    return time_string;
}

TS.date.parse = function (string_date, format, delimiter) {
    var date_val = null;
    string_date += '';
    if (format == undefined) format = TS.date.currentFormat;
    if (delimiter == undefined) delimiter = TS.date.currentDelimiter;
    // default pattern
    var reg_pattern = "^([1234567890]{1,2})" + delimiter + "([1234567890]{1,2})" + delimiter + "([1234567890]{2,4})";
    if (format == TS.date.format.Asian) reg_pattern = "^[1234567890]{2,4}" + delimiter + "[1234567890]{1,2}" + delimiter + "[1234567890]{1,2}";
    var the_reg = new RegExp(reg_pattern);
    var result = the_reg.exec(string_date);
    if (result == null) return null;

    var day, month, year;

    switch (format) {
        case TS.date.format.America:
            day = parseFloat(result[2]);
            month = parseFloat(result[1]) - 1;
            year = parseFloat(result[3]);
            break;
        case TS.date.format.Asia:
            day = parseFloat(result[3]);
            month = parseFloat(result[2]) - 1;
            year = parseFloat(result[1]);
            break;
        default:
            day = parseFloat(result[1]);
            month = parseFloat(result[2]) - 1;
            year = parseFloat(result[3]);
            break;
    }

    date_val = new Date(year, month, day);
    if (date_val.getDate() != day || date_val.getMonth() != month || date_val.getFullYear() != year) return null;      

    // time
    reg_pattern = "^([1234567890]{1,2}):([1234567890]{1,2}):{0,1}([1234567890]{0,2}) {0,1}(AM|PM){0,1}$"
    the_reg = new RegExp(reg_pattern);
    result = the_reg.exec(string_date);
    if (result != null) {
        var hours = parseInt(result[1],10);
        var minutes = parseInt(result[2],10);
        var seconds = parseInt(result[3],10);
        var suffix = result[4];

        if (isNaN(seconds)) seconds = 0;
        if (suffix == 'PM' && hours < 12) hours += 12

        date_val.setHours(hours);
        date_val.setMinutes(minutes);
        date_val.setSeconds(seconds);

        if (date_val.getHours() != hours || date_val.getMinutes() != minutes || date_val.getSeconds() != seconds) return null;
    }

    return date_val;
}

TS.date.getDateDiff = function (date1, date2) {
    var dif = date1.setHours(0, 0, 0, 0) - date2.setHours(0, 0, 0, 0);
    var oneDay = 1000 * 60 * 60 * 24;
    return Math.ceil(dif / oneDay);
}

TS.date.compare = function(date1,date2) {
  var dif = TS.date.getDateDiff(date1, date2);  
  if(dif == 0) return 0;  
  return dif > 0 ? 1 : -1;
}

/* User interface functions */
TS.ui = function () { };

TS.ui.getGroupValue = function (name) {
    return $("input[name='" + name + "']:checked").val();
}

// validation methods
TS.validation = function () { };

TS.validation.isValid = true;
TS.validation.messages = [];

TS.validation.clear = function () {
    TS.validation.isValid = true;
    TS.validation.messages = [];
}

TS.validation.addFailure = function (msg) {
    TS.validation.isValid = false;
    TS.validation.messages.push(msg);
}

TS.validation.alertFailure = function () {
    var msg = 'Please correct the following issues and resubmit: \n';
    for (var i = 0, ii = TS.validation.messages.length; i < ii; i++) {
        msg += '   - ' + TS.validation.messages[i] + '\n';
    }
    alert(msg);
}

TS.validation.formatFailures = function (messages) {
    var msg = '';
    for (var i = 0, ii = messages.length; i < ii; i++) {
        msg += messages[i] + '<br />';
    }
    return msg;
}

TS.validation.isSupplied = function (id) {
    return jQuery.trim($('#' + id).val()) != '';
}

TS.validation.isChecked = function (id) {
    return $('#' + id).is(':checked');
}

TS.validation.isGroupChecked = function (name) {
    var id = $("input[@name=" + name + "]:checked").attr('id');
    return id != null;
}

TS.validation.checkTextLength = function (id, max_length, min_length) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') return true;
    if (val.length > max_length) return false;
    if (min_length != undefined) return val.length > min_length;    
    return true;
}

TS.validation.isPlainText = function (id, required, min_length, max_length) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    if (min_length != undefined) {
        if (val.length < min_length) return false;
    }
    if (max_length != undefined) {
        if (val.length > max_length) return false;
    }
    return TS.validation.isPlainTextValue(val);
}

TS.validation.isPlainTextExtended = function (id, required, min_length, max_length) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    if (min_length != undefined) {
        if (val.length < min_length) return false;
    }
    if (max_length != undefined) {
        if (val.length > max_length) return false;
    }
    return TS.validation.isPlainTextExtendedValue(val);
}

TS.validation.isPlainTextValue = function (val) {
    return TS.utils.doRegExp(val, "^[_a-zA-Z0-9 !`+=;:,%&{}\\*\\^\\r\\n\\t\\(\\)\\?\\-\\.\\$\\/\\[\\]'\"‘’“”]*$") != null;
}

TS.validation.isPlainTextExtendedValue = function (val) {
    return TS.utils.doRegExp(val, "^[_a-zA-Z0-9 !`+=;:,%&{}\\*\\^\\r\\n\\t\\(\\)\\?\\-\\.\\$\\/\\[\\]'\"‘’“”À-ÿ°]*$") != null;
}

TS.validation.testTextField = function(id,required,friendly_title,use_extended) {
    var val = jQuery.trim($('#' + id).val());
     if (val == '') {
        if (required) TS.validation.addFailure('\'' + friendly_title + '\' has not been supplied.');
     }
     else {
         var test = use_extended == true ? TS.validation.isPlainTextValue(val) : TS.validation.isPlainTextExtendedValue(val);
        if(!test) TS.validation.addFailure('\'' + friendly_title + '\' contains invalid characters.');
     }
}

TS.validation.isHTMLText = function (id, required, min_length, max_length) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    if (min_length != undefined) {
        if (val.length < min_length) return false;
    }
    if (max_length != undefined) {
        if (val.length > max_length) return false;
    }
    return TS.validation.isHTMLTextValue(val);
}

TS.validation.isHTMLTextValue = function (val) {
    if (TS.utils.doRegExp(val, "^[_a-zA-Z0-9 !`+=;:,%&{}<>\\*\\^\\r\\n\\t\\(\\)\\?\\-\\.\\$\\/\\[\\]'\"‘’“”]*$") == null) return false;
    if (TS.utils.doRegExp(val, "<scr+|:script+|<obj+|<app+|<emb+|<form+|<input+|onmouse+|onload+|onunload+|onsubmit+|onclick+|onblur+|javascript:+", true) != null) return false;
    return true;
}

TS.validation.isEmail = function (id, required) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    return TS.utils.doRegExp(val, "^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?$") != null;
}

TS.validation.isInteger = function (id, required, min_value, max_value) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    var num = parseInt(val);
    if (isNaN(num)) return false;
    if (TS.utils.doRegExp(val, "^[-]{0,1}[0-9]{0,}$") == null) return false;
    if (min_value != undefined) {
        if (num < min_value) return false;
    }
    if (max_value != undefined) {
        if (num > max_value) return false;
    }
    return true;
}

TS.validation.isFloat = function (id, required, min_value, max_value, max_places) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    var num = parseFloat(val);
    if (isNaN(num)) return false;
    if (TS.utils.doRegExp(val, "^-{0,1}[0-9,]{1,}[.]{0,1}[0-9]{0,}$") == null) return false;
    if (min_value != undefined) {
        if (num < min_value) return false;
    }
    if (max_value != undefined) {
        if (num > max_value) return false;
    }
    if (max_places == undefined) return true;
    return TS.utils.doRegExp(val, "^-{0,1}[0-9,]{1,}[.]{0,1}[0-9]{0," + max_places + "}$") != null;
}

TS.validation.isPhoneNumber = function (id, required) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    return TS.utils.doRegExp(val, "^(\\+)?(\\(?\\d{1,4}\\)?[ -]?)?\\d{1,4}([ -]?\\d{2,4}){1,}$") != null;
}

TS.validation.isAlphaNumeric = function (id, required) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    return TS.utils.doRegExp(val, "^[0-9a-zA-Z]{1,}$") != null;
}

TS.validation.AmericanExpress = 0;
TS.validation.DinersClub = 1;
TS.validation.Mastercard = 2;
TS.validation.Visa = 3;

TS.validation.isCreditCardNumber = function (id, required, type) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    var sval = (val + '');
    var lgth = (sval + '').length;

    var total = 0;
    var sDigit = '';
    var cDigit = 0;
    var even = false;
    var tlength = 0;
    for (var i = lgth - 1; i >= 0; i--) {
        sDigit = sval.charAt(i);
        cDigit = parseInt(sDigit, 10);
        if (isNaN(cDigit)) {
            if (sDigit != ' ' && sDigit != '-') return false;
        }
        else {
            if (even) {
                cDigit *= 2;
                if (cDigit > 9) cDigit -= 9;
            }
            total += cDigit;
            even = !even;
            tlength++;
        }
    }
    if (tlength != 13 && tlength != 15 & tlength != 16) return false;
    if (type != undefined) {
        if (!TS.validation.isValidCreditCardType(val, tlength, type)) return false;
    }
    return (total % 10 == 0);
}

TS.validation.isValidCreditCardType = function(val,significantLength,type)
{
    val = val + '';
        
    switch(type)
    {
        case TS.validation.AmericanExpress:
            return (significantLength == 15 && (val.substring(0,2) == '34' || val.substring(0,2) == '37'));

        case TS.validation.DinersClub:
            return significantLength == 13;

        case TS.validation.Mastercard:
            return (significantLength == 16 && val.substring(0,1) == '5' );

        case TS.validation.Visa:
            return ((significantLength == 13 || significantLength == 16) &&  val.substring(0,1) == '4');
    }
    return true;
}

TS.validation.isDate = function (id, required) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }
    return TS.date.parse(val) != null;
}

TS.validation.isDateAfter = function (to_id, from_id) {
    var toVal = jQuery.trim($('#' + to_id).val());
    var fromVal = jQuery.trim($('#' + from_id).val());
    var toDate = TS.date.parse(toVal);
    var fromDate = TS.date.parse(fromVal);    
    if (fromDate == null || toDate == null) return true;        
    return TS.date.compare(toDate,fromDate) == 1;
}

TS.validation.isIntGreater = function (higher_id, lower_id) {
    var highVal = $('#' + higher_id).val();
    var lowVal = $('#' + lower_id).val();
    if(highVal == '' || lowVal == '') return true;
    highVal = parseInt(highVal,10);
    lowVal = parseInt(lowVal,10);
    if (isNaN(highVal) || isNaN(lowVal)) return true;
    return highVal > lowVal;
}

TS.validation.isTime = function (id, use24HourTime, required) {
    var val = jQuery.trim($('#' + id).val());
    if (val == '') {
        if (required) return false;
        if (!required) return true;
    }

    var reg_pattern = "^([012]?[1234567890]+):([0-5][0-9]):?([0-5][0-9])?$";
    var the_reg = new RegExp(reg_pattern);
    var result = the_reg.exec(val);

    if (result != null) {
        var hours = parseInt(result[1], 10);
        var minutes = parseInt(result[2], 10);
        var seconds = parseInt(result[3], 10);

        if (isNaN(seconds)) seconds = 0;

        if (use24HourTime) {
            if (hours > 23) return false;
        }
        else {
            if (hours > 12) return false;
        }
        if (hours < 1) return false;
        if (minutes > 59 || minutes < 0) return false;
        if (seconds > 59 || seconds < 0) return false;

        return true;
    }
    return false;
}

/* utility methods */
TS.utils = function() { }
TS.utils.doRegExp = function( value, pattern, ignore_case ) {
	var regXp;
	regXp = (ignore_case == true) ? new RegExp(pattern, "i") : new RegExp(pattern);
	regXp.global = true;
	return regXp.exec(value);
}


/*-------------------- Eurodrive functions --------------------*/
if (!this.Eurodrive) {
    Eurodrive = function () { };
}

Eurodrive.menu = function () { }
Eurodrive.menu.setup = function (maj_num, min_num) {
    /*$('#mainNav ul li').each(function (index) {
        $(this).click(function (e) { Eurodrive.menu.clickMenu(index); return true; });
    });*/
    //Eurodrive.menu.clickMenu(maj_num);
    // selected minor page    
    if (min_num > -1) $('#min' + maj_num + ' > li:eq(' + min_num + ')').addClass('selected');
}
Eurodrive.menu.footerSetup = function () {
    // setup sitemap toggle
    $('#sitemap').toggle(function () { $('#sitemapFooter').show(); $(window).scrollTop($(document).height()); return false; },
			   		      function () { $('#sitemapFooter').hide(); return false; }
	);
}
Eurodrive.menu.clickMenu = function (index) {
    /*$('#mainNav ul li').each(function (ind) {
        if (ind == index) {
            $(this).addClass('selected');
        }
        else {
            $(this).removeClass('selected');
        }
        $('#min' + ind).hide();
    });
    $('#min' + index).show();*/
}

Eurodrive.videoLoaded = false;
Eurodrive.toggleVideoWindow = function () {
    if (!Eurodrive.videoLoaded) {
        $('#frVideo').attr('src', 'video.aspx');
        Eurodrive.videoLoaded = true;
    }
    if ($('#videoWindow').isDisplayed()) {
        var f = document.getElementById('frVideo');
        if (f.contentWindow) f.contentWindow.stop();
    }
    $('#videoWindow').toggleDisplay('block');
}

Eurodrive.BookNow = function () { }

Eurodrive.BookNow.DateFrom = 0;
Eurodrive.BookNow.DateTo = 1;
Eurodrive.BookNow.ExclusionDays = 21;
Eurodrive.BookNow.MinimumDays = 21;
Eurodrive.BookNow.MaximumDays = 170;
Eurodrive.BookNow.ModelDays = [];
Eurodrive.BookNow.DepotDays = [];

Eurodrive.BookNow.setup = function (exclusion_days, min_days, max_days) {
    Eurodrive.BookNow.ExclusionDays = exclusion_days || 21;
    Eurodrive.BookNow.MinimumDays = min_days || 21;
    Eurodrive.BookNow.MaximumDays = max_days || 175;
    $('#infoShow').click(Eurodrive.BookNow.toggleDelivery);
    $('#deliveryInfo h2').click(Eurodrive.BookNow.toggleDelivery);
    $('#calFromBtn').click(function () { Eurodrive.BookNow.toggleCalendar(Eurodrive.BookNow.DateFrom); return false; });
    $('#calToBtn').click(function () { Eurodrive.BookNow.toggleCalendar(Eurodrive.BookNow.DateTo); return false; });
    $('#calendarWindow h2').click(Eurodrive.BookNow.toggleCalendar);

    $('#DeliveryCentre').change(Eurodrive.BookNow.hideCalendar);
    $('#ReturnCentre').change(Eurodrive.BookNow.hideCalendar);
    $('#resetBtn').click(function () { return Eurodrive.BookNow.reset() });
    $('#bookingForm').submit(function () { return Eurodrive.BookNow.isValid(); });
}

Eurodrive.BookNow.toggleDelivery = function () { $('#deliveryInfo').toggleVisibility(); return false; }

Eurodrive.BookNow.toggleCalendar = function (dateType) {
    var w = $('#calendarWindow');
    if (w.isVisible()) {
        w.css('visibility', 'hidden');
    }
    else {
        var deliveryCentre = $('#DeliveryCentre').val() || '';
        var returnCentre = $('#ReturnCentre').val() || '';

        if (dateType == Eurodrive.BookNow.DateFrom) {
            // check centers
            if (deliveryCentre == '') {
                alert('Please select a Delivery centre before you select a delivery date.');
                return false;
            }

        }
        else if (dateType == Eurodrive.BookNow.DateTo) {
            // check centers
            if (returnCentre == '') {
                alert('Please select a Return centre before you select a return date.');
                return false;
            }
        }

        // get return date
        var deliveryDate = $('#DeliveryDate').val() || '';
        if (deliveryDate != '') deliveryDate = TS.date.toShortString(TS.date.parse(deliveryDate), false, TS.date.format.Asia);

        // get delivery date
        var returnDate = $('#ReturnDate').val() || '';
        if (returnDate != '') returnDate = TS.date.toShortString(TS.date.parse(returnDate), false, TS.date.format.Asia);

        var modelID = $('#CarSelector').val() || '';

        var link = 'calendar.aspx?type=' + escape(dateType) + "&ddate=" + escape(deliveryDate) + "&rdate=" + escape(returnDate) + "&delivery=" + escape(deliveryCentre) +
            "&return=" + escape(returnCentre) + "&model=" + escape(modelID);

        $('#frCalendar').attr('src', link);
        w.css('visibility', 'visible');
    }
    return false;
}

Eurodrive.BookNow.hideCalendar = function () {
    $('#DeliveryDate').val('');
    $('#ReturnDate').val('');
    $('#calendarWindow').css('visibility', 'hidden');
}

Eurodrive.BookNow.closeCalendar = function (o, type) {
    if (type == Eurodrive.BookNow.DateFrom) {
        $('#DeliveryDate').val(o);
    }
    else if( type == Eurodrive.BookNow.DateTo) {
        $('#ReturnDate').val(o);
    }
    Eurodrive.BookNow.toggleCalendar();
}

Eurodrive.BookNow.reset = function () {
    $('#DeliveryCentre').val('');
    $('#ReturnCentre').val('');
    $('#DeliveryDate').val('');
    $('#ReturnDate').val('');
    $('#CarSelector').val('');
    return false;
}

Eurodrive.BookNow.isValid = function () {
    TS.validation.clear();

    var deliveryCentre = jQuery.trim($('#DeliveryCentre').val());
    var returnCentre = jQuery.trim($('#ReturnCentre').val());

    var exclusionPeriod = Eurodrive.BookNow.ExclusionDays;
    var deliveryDepotMaximumDays = Eurodrive.BookNow.MaximumDays;

    if (deliveryCentre == '') {
        TS.validation.addFailure('Please select a Delivery Centre.');
    }
    else {
        var d = Eurodrive.BookNow.DepotDays[deliveryCentre];
        if (d != undefined) exclusionPeriod = d.del;
    }

    if (returnCentre == '') {
        TS.validation.addFailure('Please select a Return Centre.');
    }
    else {
        var d = Eurodrive.BookNow.DepotDays[returnCentre];
        if (d != undefined) deliveryDepotMaximumDays = d.max;
    }

    var fromVal = jQuery.trim($('#DeliveryDate').val());
    var toVal = jQuery.trim($('#ReturnDate').val());
    var fromDate = TS.date.parse(fromVal);
    var toDate = TS.date.parse(toVal);

    if (fromDate == null) TS.validation.addFailure('Please select a valid Delivery Date.');
    if (toDate == null) TS.validation.addFailure('Please select a valid Return Date.');

    if (!TS.validation.isSupplied('CarSelector')) TS.validation.addFailure('Please select a Car Model.');

    if (fromDate != null) {
        var now = new Date();
        var deliveryDays = TS.date.getDateDiff(fromDate, now);
        if (deliveryDays < exclusionPeriod) TS.validation.addFailure('Delivery Date must be at least ' + exclusionPeriod + ' days from today.');
    }

    if (fromDate != null && toDate != null) {
        var days = TS.date.getDateDiff(toDate, fromDate) + 1;

        if (days < 0) {
            TS.validation.addFailure('The Return Date must be after the Delivery Date.');
        }
        else {
            var modelVal = $('#CarSelector').val();

            var minDays = Eurodrive.BookNow.MinimumDays;
            var maxDays = Eurodrive.BookNow.MaximumDays;
            if (deliveryDepotMaximumDays < maxDays) maxDays = deliveryDepotMaximumDays;

            var m = Eurodrive.BookNow.ModelDays[modelVal];
            if (m != undefined) minDays = m;

            if (days < minDays) TS.validation.addFailure('Minimum period of rental is ' + minDays + ' days. You have selected ' + Math.abs(days) + ' days.');
            if (days > maxDays) TS.validation.addFailure('Maximum period of rental is ' + maxDays + ' days. You have selected ' + Math.abs(days) + ' days.');
        }

        var delivery = TS.date.getDateDiff(fromDate, new Date());
    }

    if (!TS.validation.isValid) TS.validation.alertFailure();
    return TS.validation.isValid;
}

