/*
get year, month, day from birthday "dd-mm-yyyy" or "ddmmyyyy"
*/
function getDateFromBirthday(birthday) {
    var day;
    var month;
    var year;

    if (birthday.indexOf('-') > 0) {
        var myDate = birthday.split('-');

        day = parseInt(myDate[0], 10);
        month = parseInt(myDate[1], 10);
        year = parseInt(myDate[2], 10);
    } else {
        day = parseInt(birthday.substring(0, 2),10);
        month = parseInt(birthday.substring(2, 4),10);
        year = parseInt(birthday.substring(4, 8),10);
    }

    return {
        day: day,
        month: month,
        year: year
    };
}

/*
get age 
*/
function getAge(birthday) {
    var date = new Date();
    var day = date.getDate();
    var month = date.getMonth() + 1;
    var year = date.getFullYear();

    var myDate = getDateFromBirthday(birthday);
    var myDay = myDate.day;
    var myMonth = myDate.month;
    var myYear = myDate.year;

    var age = year - myYear;
    if (myMonth > month || (myMonth == month && myDay > day)) {
        age = age - 1;
    }

    return age;
}

/*
birthday not allow future date
*/
function validateBirthday(birthday) {
    return getAge(birthday) >= 0;
}

/*
Less than 18years old
*/
function isLT18Y(birthday) {
    var age = getAge(birthday);
    return age >= 0 && age < 18;
}

function isGT18Y(birthday) {
    var age = getAge(birthday);
    return age >= 18;
}

(function($) {
    $.validator.addMethod("housenumber", function(value, element) {
        return this.optional(element) || /^[a-zA-Z0-9]{0,6}$/.test(value);
    }, "ongeldig");

    $.validator.addMethod("postcode", function(value, element) {
        return this.optional(element) || /^([0-9]{4}(\s)?[a-zA-Z]{2})?$/.test(value);
    }, "ongeldig");

    $.validator.addMethod("telephone", function(value, element) {
        return this.optional(element) || /^(\+)?([0-9\s\-]{5,12})?$/.test(value);
    }, "ongeldig");

    $.validator.addMethod("bsn", function(value, element) {
        return this.optional(element) || /^([0-9]{9})?$/.test(value); ;
    }, "ongeldig");

    $.validator.addMethod("validatecode", function(value, element) {
        return this.optional(element) || /^([a-zA-Z0-9]{5})$/.test(value);
    }, "ongeldig");


    $.validator.addMethod("dateNL", function(value, element) { // dd-mm-yyyy or ddmmyyyy
        if (this.optional(element)) return true;
        var valid = /^(((0?[1-9])|([12][0-9])|(3[01]))-((0?[1-9])|(1[012]))-(((19)|(20))[0-9]{2}))?$/.test(value) || /^(((0[1-9])|([12][0-9])|(3[01]))((0[1-9])|(1[012]))(((19)|(20))[0-9]{2}))?$/.test(value);
        if (!valid) return false;
        var dmy = getDateFromBirthday(value);
        var d = new Date();
        d.setFullYear(dmy.year);
        d.setMonth(dmy.month - 1, dmy.day);
        valid = valid && (d.getMonth() == (dmy.month - 1));
        if (valid)
            $(element).val(dmy.day + "-" + dmy.month + "-" + dmy.year);
        return valid;
    }, "ongeldig");

    $.validator.addMethod("birthdayNL", function(value, element) { // dd-mm-yyyy or ddmmyyyy
        var valid = this.optional(element) || $.validator.methods.dateNL.call(this, value, element);
        valid = valid && validateBirthday(value);
        if (valid) {
            var myDate = getDateFromBirthday(value);
            $(element).val(myDate.day + "-" + myDate.month + "-" + myDate.year);
        }

        return valid;
    }, "U heeft een niet geldige geboortedatum ingevoerd.");

    $.validator.addMethod("lt18", function(value, element) { // dd-mm-yyyy or dd mm yyyy
        var valid = this.optional(element) || ($.validator.methods.birthdayNL.call(this, value, element) && isLT18Y(value));
        if (valid) {
            var myDate = getDateFromBirthday(value);
            $(element).val(myDate.day + "-" + myDate.month + "-" + myDate.year);
        }

        return valid;
    }, "De geboortedatum van het kind is niet geldig. Opgegeven kinderen moeten jonger zijn dan 18 jaar.");

    $.validator.addMethod("gt18", function(value, element) { // dd-mm-yyyy or dd mm yyyy
        var valid = this.optional(element) || ($.validator.methods.birthdayNL.call(this, value, element) && isGT18Y(value));
        if (valid) {
            var myDate = getDateFromBirthday(value);
            $(element).val(myDate.day + "-" + myDate.month + "-" + myDate.year);
        }

        return valid;
    }, "De geboortedatum van de volwassene is niet geldig. Opgegeven volwassenen moeten ouder zijn dan 18 jaar.");

    $.validator.addMethod("not_child", function(value, element) { // dd-mm-yyyy or dd mm yyyy
        var valid = this.optional(element) || ($.validator.methods.birthdayNL.call(this, value, element) && isGT18Y(value));
        if (valid) {
            var myDate = getDateFromBirthday(value);
            $(element).val(myDate.day + "-" + myDate.month + "-" + myDate.year);
        }

        return valid;
    }, "Kinderen kunnen alleen gratis meeverzekerd worden. Mocht u een premie voor een kind willen betalen neem dan <a href='/Over-Yarden/Contact/contactformulier' style='color:white'>contact op met Yarden</a>.");

    $.validator.addMethod("currencyNL", function(value, element) { // dd-mm-yyyy
        if (this.optional(element)) return true;
        return !isNaN(parseFloat(value.replace(/\u20AC/, '').replace(/\./g, '').replace(',', '.')));
    }, "ongeldig");

    $.validator.addMethod("effectiveDateNL", function(value, element) { // mm-yyyy
        return this.optional(element) || /^(((0?[1-9])|(1[012]))-(((19)|(20))[0-9]{2}))?$/.test(value);
    }, "ongeldig");

    $.validator.addMethod("persoonsnummer", function(value, element) { // mm-yyyy
        return this.optional(element) || /^([0-9]{0,10})$/.test(value);
    }, "ongeldig");

    $.validator.addMethod("foto", function(value, element) {
        return this.optional(element) || /^(.+\.(gif|jpg|png))$/i.test(value);
    }, "ongeldig");

    $.validator.addMethod("banknumber", function(value, element) {
        if (this.optional(element)) return true;
        var valid = /^(\d{3,7}|\d{9})$/i.test(value);
        if (!valid) return false;
        if (value.length == 9) {
            var total = 0;
            for (var i = 0; i < 9; i++) {
                total += parseInt(value.substr(i, 1)) * (9 - i);
            }
            if ((total % 11) != 0) return false;
        }
        return true;
    }, "ongeldig");

    $.extend(jQuery.validator.messages, {
        required: "verplicht",
        email: "ongeldig",
        equalTo: "onjuist"
    });

})(jQuery); 
