﻿var redirectURL = 'http://quote.insureandgo.com/',
    resellerId = '1',
    affiliateId = '1234567890',
    errorMessage;

function setSelectListToValue(value, selectId) {
    var i,
        si,
        v,
        args = setSelectListToValue.arguments;
    if ((obj = document.getElementById(args[1])) != null) {
        v = args[0];
        for (i = 0; i < obj.length; i++) {
            if (obj.options[i].value == v) {
                si = i;
            }
        }
        obj.selectedIndex = si;
    }

    window.onload = function () { setUpPage(value); };
}

function addDays(d, days) {
    var d1 = new Date(d.getTime() + days * 24 * 60 * 60 * 1000);
    var d2 = new Date(d1.getFullYear(), d1.getMonth(), d1.getDate());

    return d2;
}

function getSelectValue(el) {
    return document.getElementById(el).options[document.getElementById(el).selectedIndex].value;
}

function isDate(dateStr) {
    var datePat = /^(\d{2})(\/)(\d{2})(\/)(\d{4})$/,
        matchArray = dateStr.match(datePat),
        isleap,
        day,
        month,
        year;

    if (matchArray === null) {
        errorMessage = "Please enter dates in the format dd/mm/yyyy.";
        return false;
    }

    day = matchArray[1];
    month = matchArray[3];
    year = matchArray[5];

    if (month < 1 || month > 12) {
        errorMessage = "Month must be between 01 and 12.";
        return false;
    }

    if (day < 1 || day > 31) {
        errorMessage = "Day must be between 1 and 31.";
        return false;
    }

    if ((month === 4 || month === 6 || month === 9 || month === 11) && day === 31) {
        switch (month) {
            case 4: errorMessage = "April doesn`t have 31 days!"; break;
            case 6: errorMessage = "June doesn`t have 31 days!"; break;
            case 9: errorMessage = "September doesn`t have 31 days!"; break;
            case 11: errorMessage = "November doesn`t have 31 days!"; break;
        }

        return false;
    }

    if (month === 2) {
        isleap = (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0));
        if (day > 29 || (day === 29 && !isleap)) {
            errorMessage = "February " + year + " doesn`t have " + day + " days!";
            return false;
        }
    }

    return true;
}

function changeDateSlashesToHyphensForUrl(d) {
    var splitter = d.split('/');
    return splitter[0] + '-' + splitter[1] + '-' + splitter[2];
}

function getDestinationOption(i) {
    switch (i) {
        case 1: return "Europe (exc. Algeria, Israel, Jordan, Libya & Lebanon)";
        case 3: return "Australia and New Zealand";
        case 2: return "Worldwide (exc. USA & Canada)";
        case 4: return "Worldwide (inc. USA & Canada)";
        case 0: return "Your home area, England, Scotland, Wales or N. Ireland";
    }
}

function addDestinationOptions(list) {
    for (var i = 0; i < list.length; i++) {
        document.getElementById('ddDestination').options[i] = new Option(getDestinationOption(list[i]), list[i], (list[i] === 1), false);
    }
}

function populateDestinations(policytype) {
    document.getElementById('ddDestination').options.length = 0;

    switch (policytype) {
        case "4": addDestinationOptions([1, 3, 2, 4]); break;
        case "1": addDestinationOptions([1, 4]); break;
        default: addDestinationOptions([1, 3, 2, 4, 0]); break;
    }
}

function addLeadingZero(i) {
    if (i.toString().length < 2) {
        return '0' + i;
    }

    return i;
}

function formatDate(dt) {
    var dd = dt.getDate(),
        mm = dt.getMonth() + 1,
        yyyy = dt.getFullYear();

    return addLeadingZero(dd) + '/' + addLeadingZero(mm) + '/' + yyyy;
}

function populateCoverDates(policytype) {
    var endDate = document.getElementById('txtCoverEndDate'),
        today = new Date();

    document.getElementById('txtCoverStartDate').value = formatDate(today);

    switch (policytype) {
        case "4":
        case "3":
            today = addDays(today, 30);
            break;
        case "1":
            today.setFullYear(today.getFullYear() + 1);
            today = addDays(today, -1);
            break;
        default:
            today = addDays(today, 2);
            break;
    }

    endDate.value = formatDate(today);
}

function onNoOfTravellersChanged() {
    var numberOfTravellers = getSelectValue('ddlNoOfTravellers'),
        i,
        travellerDiv;

    if (numberOfTravellers < 1) { numberOfTravellers = 1; }
    if (numberOfTravellers > 10) { numberOfTravellers = 10; }

    for (i = 1; i <= 10; i++) {
        travellerDiv = document.getElementById("div_travellerAge_" + i);

        travellerDiv.style.display = (i <= numberOfTravellers) ? "block" : "none";
    }
}

function formatAgesToCommaDelimitedString() {
    var holder = document.getElementById('tb_travellerAge_1').value,
        i,
        tb;

    for (i = 2; i <= getSelectValue('ddlNoOfTravellers'); i++) {
        tb = document.getElementById('tb_travellerAge_' + i).value;

        if (tb != '') { holder += ',' + tb; }
    }

    return holder;
}

function getAgeRangesByPolicyType(main) {
    var ageArray = [0, 75],
        policytype = getSelectValue('ddPolicyType');

    if (main) { ageArray[0] = 18; }

    switch (policytype) {
        case '5': ageArray[0] = 66; break;
        case '4': ageArray[1] = 65; break;
        case '3': ageArray[1] = 65; break;
    }

    return ageArray;
}

function validateTextBox(div, tb, ageArray) {
    var inputAge = parseInt(tb.value, 10);

    if (div.style.display != "block") { return true; }

    if (!isNaN(inputAge)) {
        if (inputAge >= ageArray[0]) {
            errorMessage = (inputAge > 75)
                         ? "Sorry, we can't give you a quote online if any traveller in your group is aged over 75. Please call us on the number above and we can arrange cover for you."
                         : "All additional travellers must be aged " + ageArray[1] + " or under."

            return inputAge <= ageArray[1];
        }
        else {
            errorMessage = "All additional travellers must be aged " + ageArray[0] + " or over.";
        }
    }
    else { errorMessage = "Please enter all traveller ages as a valid number."; }

    return false;
}

function validateAdditionalTravellerAges() {
    var ageArray = getAgeRangesByPolicyType(false);

    for (var i = 2; i <= 10; i++) {
        if (!validateTextBox(document.getElementById('div_travellerAge_' + i), document.getElementById('tb_travellerAge_' + i), ageArray)) {
            return false;
        }
    }

    return true;
}

function validateMainTravellerAge() {
    var ageArray = getAgeRangesByPolicyType(true),
        inputAge = parseInt(document.getElementById('tb_travellerAge_1').value, 10);

    if (!isNaN(inputAge)) {
        if (inputAge >= ageArray[0]) {
            errorMessage = (inputAge > 75)
                         ? "Sorry, we can't give you a quote online if any traveller in your group is aged over 75. Please call us on the number above and we can arrange cover for you."
                         : "The main traveller must be aged " + ageArray[1] + " or under."

            return inputAge <= ageArray[1];
        }

        errorMessage = "The main traveller must be aged " + ageArray[0] + " or over.";
    }
    else { errorMessage = "Please enter all traveller ages as a valid number."; }

    return false;
}

function getDateFromInput(i) {
    var splitter = i.split("/");
    var d = new Date(splitter[2], splitter[1] - 1, splitter[0]);

    return d;
}

function validateCoverDates() {
    if (!isDate(document.getElementById('txtCoverStartDate').value)) { return false; }

    if (!isDate(document.getElementById('txtCoverEndDate').value)) { return false; }

    var t = new Date(),
        today,
        todayPlusOneYear = new Date(),
        selectedStartDate = getDateFromInput(document.getElementById('txtCoverStartDate').value),
        selectedEndDate = getDateFromInput(document.getElementById('txtCoverEndDate').value),
        minDays,
        maxDays;

    today = new Date(t.getFullYear(), t.getMonth(), t.getDate());
    todayPlusOneYear.setFullYear(todayPlusOneYear.getFullYear() + 1);

    if (selectedStartDate < today) {
        errorMessage = "Your cover start date cannot be before today.";
        return false;
    }

    if (selectedStartDate > todayPlusOneYear) {
        errorMessage = "Your cover start date cannot be more than one year in advance.";
        return false;
    }

    if (selectedStartDate > selectedEndDate) {
        errorMessage = "Your cover start date cannot be after your cover end date";
        return false;
    }

    if (selectedEndDate < today) {
        errorMessage = "Your cover end date cannot be before today.";
        return false;
    }

    switch (getSelectValue('ddPolicyType')) {
        case '3': // long stay
        case '4': // backpackers
            minDays = 30; // 31 - 1
            maxDays = 539; // 540 -1 
            break;
        case '5': // over 65
            minDays = 2; // 3 - 1
            maxDays = 30; // 31 -1 
            break;
        default:
            minDays = 0; // 1 - 1
            maxDays = 364; // 365 -1 
            break;
    }

    if (getSelectValue('ddPolicyType') != '1') {
        if (addDays(selectedStartDate, minDays) > addDays(selectedEndDate, 0)) {
            errorMessage = "The minimum length of cover for this policy type is " + (minDays + 1) + " days";
            return false;
        }
        else if (addDays(selectedStartDate, maxDays) < addDays(selectedEndDate, 0)) {
            errorMessage = "The maximum length of cover for this policy type is " + (maxDays + 1) + " days";
            return false;
        }
    }

    return true;
}

function validatePromoCode() {
    var promoPat = /^[a-zA-Z0-9-\s]+$/,
        promo = document.getElementById('TextBoxPromoCode').value,
        matchArray = promo.match(promoPat);

    if (matchArray === null && promo != '') {
        errorMessage = "Please enter a valid promo code.";
        return false;
    }

    return true;
}

function successfullyValidated() {
    if (!validateMainTravellerAge()) { return false; }
    if (!validateAdditionalTravellerAges()) { return false; }
    if (!validateCoverDates()) { return false; }
    if (!validatePromoCode()) { return false; }

    return true;
}

function showHideEndDateAndPopulateCoverDates(policytype) {
    var isAmt = (policytype == '1'),
        amtImgUrl = 'url(/resources/images/quickquote/QQ_header2amt.png)',
        stImgUrl = 'url(/resources/images/quickquote/QQ_header2.png)';

    $('divCoverEndDate').style.display = isAmt ? "none" : "block";
    $('dateHeading').setStyle('background-image', (isAmt ? amtImgUrl : stImgUrl));
}

function setUpPage(policytype) {
    showHideEndDateAndPopulateCoverDates(policytype);
    populateCoverDates(policytype);
    populateDestinations(policytype);
}

function onPolicyTypeChange() {
    setUpPage(getSelectValue('ddPolicyType'));
}

function init() {
    setSelectListToValue('0', 'ddPolicyType');
    setUpPage('0');
    onNoOfTravellersChanged();
}

function btnNext_Click() {
    if (successfullyValidated()) {
        var pt = getSelectValue('ddPolicyType'),
            gt = getSelectValue('ddGroupType'),
            dt = getSelectValue('ddDestination'),
            numoft = getSelectValue('ddlNoOfTravellers'),
            jsd = changeDateSlashesToHyphensForUrl(document.getElementById('txtCoverStartDate').value),
            jed = changeDateSlashesToHyphensForUrl(document.getElementById('txtCoverEndDate').value),
            pc = document.getElementById('TextBoxPromoCode').value,
            holder;

        switch (pt) {
            case '1': holder = 'AMT/'; break;
            case '2': holder = 'WinterSports/'; break;
            case '3': holder = 'LongStay/'; break;
            case '4': holder = 'Backpackers/'; break;
            case '5': holder = 'Over65/'; break;
            case '6': holder = 'business/'; break;
            default: holder = ''; break;
        }

        holder += 'default.aspx?type=QQ' +
                 '&pt=' + pt +
                 '&grpt=' + gt +
                 '&dt=' + dt +
                 '&jsd=' + jsd +
                 '&jed=' + jed +
                 '&numoft=' + numoft +
                 '&travs=' + formatAgesToCommaDelimitedString() +
                 '&pc=' + pc +
                 '&rs=' + resellerId +
                 '&af=' + affiliateId;

        document.location.href = redirectURL + holder;
    } else {
        alert(errorMessage);
    }

    return false;
}

window.onload = function () { init(); };

