$(function() {
    
    // Defaults (un)highlight methods
    $.validator.setDefaults({
        highlight: function(element, errorClass, validClass) {
            if (element.type == 'checkbox' || element.type == 'radio') {
                var inputs = $('input[name="' + element.name + '"]');
                inputs.each(function() {
                    $('label[for="' + this.id + '"]').addClass(errorClass).removeClass(validClass);
                });
                $(element).parents('.form-row').find('> label').addClass(errorClass).removeClass(validClass);
            } else {
                $(element).addClass(errorClass).removeClass(validClass);
                $(element.form).find("label[for=" + element.id + "]").addClass(errorClass);
            }
        },
        unhighlight: function(element, errorClass, validClass) {
            if (element.type == 'checkbox' || element.type == 'radio') {
                var inputs = $('input[name="' + element.name + '"]');
                inputs.each(function() {
                    $('label[for="' + this.id + '"]').removeClass(errorClass).addClass(validClass);
                });
                $(element).parents('.form-row').find('> label').removeClass(errorClass).addClass(validClass);
            } else {
                $(element).removeClass(errorClass).addClass(validClass);
                $(element.form).find("label[for=" + element.id + "]").removeClass(errorClass);
            }
        },
        errorPlacement: function (error, element) {
            if (this.errorClass == 'form-error') {
                element.parents('.form-row').after(error);
            } else {
                error.insertAfter(element);
            }
        }
    });
    
    // Default required message
    $.validator.messages.required = 'Dit is een verplicht veld.';
    $.validator.messages.rangelength = $.validator.format('Gebruik minimaal {0} en maximaal {1} tekens.');
    
    // Validation methods
    $.validator.addMethod('regexp', function(value, element, param) {
        return this.optional(element) || value.match(param);
    }, 'This value doesn\'t match the acceptable pattern.');
    
    $.validator.addMethod('dutchbankaccount', function (value, element) {
        if (!value.length) return true;
        account=value.replace(/\D/, ''); 
        if (account.length >= 3 && account.length <= 7) return true;
        var sum = 0;
        for (i = 1; i < 10; i++) {
            num = account.charAt(i - 1);
            sum += num * (10 - i)
        }
        if (sum % 11 == 0 && account.length == 9) return true;
        return false;
    }, 'Het rekeningnummer is ongeldig.');

    $.validator.addMethod('email', function (value, element) {
        if (!value.length) return true;
        var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
        if (reg.test(value) != false) return true;
        return false;
    }, 'Het e-mailadres is ongeldig.');

    $.validator.addMethod('url', function (value, element) {
        if (!value.length) return true;
        var reg = /^(https?:\/\/)?([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})\/?$/;
        if (reg.test(value) != false) return true;
        return false;
    }, 'Het URL is ongeldig.');

    $.validator.addMethod('greaterThan', function (value, element, param) {
        return value >= $(param).val();
    }, 'Uw sluitingstijd kan niet v&oacute;&oacute;r uw openingstijd liggen.');

    $.validator.addMethod('smallerThan', function (value, element, param) {
        return value <= $(param).val();
    }, 'Uw sluitingstijd kan niet v&oacute;&oacute;r uw openingstijd liggen.');

    /**
     * Validations itself
     **/
    // Add collapsible effect to all forms
    $('form > a.collapsible').bind('click', function(e) {
        e.preventDefault();
        $(this).toggleClass('open');
        $(this).next().toggle();
    });

    /* USER FORM */
    if ($('#member-postal-code').attr('name')) $('#member-postal-code').mask('9999 aa');
    
    function showHideMemberSubtypes() {
        $('#member-type-other-row, #member-type-dealer, #member-type-dealer-label, #member-subtype-row, #member-type-architect, #member-type-architect-label').hide();

        if ($('#member-form #member-type-id').val() == 99) $('#member-type-other-row').show();
        else if ($('#member-form #member-type-id').val() == 6) $('#member-subtype-row, #member-type-dealer, #member-type-dealer-label').show();
        else if ($('#member-form #member-type-id').val() == 7) $('#member-subtype-row, #member-type-architect, #member-type-architect-label').show();
    }
    $('#member-form #member-type-id').change(function() {
        $('#member-type-dealer input, #member-type-architect input').prop('checked', false);
        showHideMemberSubtypes();
    });
    showHideMemberSubtypes();

    $('#member-form').validate({
        rules: {
            member_type_id: {
                required: true
            },
            member_type_other: {
                required: {
                    depends: function (e) {
                        return $('#member-type-id').val() == 99; // Other 
                    }
                }
            },
            member_subtype_id: {
                required: {
                    depends: function (e) {
                        return $('#member-type-id').val() == 6 || $('#member-type-id').val() == 7; // Showroom / Architect
                    }
                }
            },
            member_name: {
                required: true,
                regexp: /^([A-Za-z0-9_-]{3,20})$/,
                remote: {
                    url: '/aanmelden/beschikbare-gebruikersnaam',
                    type: 'post'
                }
            },
            member_email: {
                required: true,
                email: true,
                remote: {
                    url: '/aanmelden/beschikbare-email',
                    type: 'post'
                }
            },
            member_passwd: {
                required: true,
                minlength: 5
            },
            member_passwd_confirm: {
                required: true,
                minlength: 5,
                equalTo: '#member-passwd'
            },
            captcha: {
                required: true,
                remote: {
                    url: '/captcha/validate',
                    type: 'post'
                }
            },
            member_welke_conditions: {
                required: true
            }
        },
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            member_name: {
                regexp: 'Gebruik alleen letters en nummers (3-20 karakters).',
                remote: 'Deze naam is al in gebruik.'
            },
            member_email: {
                email: 'Vul een geldig e-mailadres in.',
                remote: 'Dit e-mailadres is al in gebruik.'
            },
            member_passwd: {
                minlength: 'Gebruik minimaal 5 tekens.'
            },
            member_passwd_confirm: {
                equalTo: 'De wachtwoorden komen niet overeen.',
                minlength: 'Gebruik minimaal 5 tekens.'
            },
            captcha: {
                remote: 'Typ in wat je ziet komt niet overeen.'
            }
        }
    });

    $('#member-edit-form').validate({
        rules: {
            member_name: {
                required: true,
                regexp: /^([A-Za-z0-9_-]{3,20})$/,
                remote: {
                    url: '/aanmelden/beschikbare-gebruikersnaam',
                    type: 'post'
                }
            },
            member_email: {
                required: true,
                email: true,
                remote: {
                    url: '/aanmelden/beschikbare-email',
                    type: 'post'
                }
            },
            member_passwd: {
                required: {
                    depends: function(e) {
                        return $('div.form-row > div#change-password:visible').length != 0;
                    }
                },
                minlength: 5
            },
            member_passwd_confirm: {
                required: {
                    depends: function(e) {
                        return $('div.form-row > div#change-password:visible').length != 0;
                    }
                },
                minlength: 5,
                equalTo: '#member-passwd'
            },
            member_passwd_current: {
                required: {
                    depends: function(e) {
                        return $('div.form-row > div#change-password:visible').length != 0;
                    }
                },
                minlength: 5
            },
            member_website: {
                required: false,
                url: true
            }
        },
        groups: {
            member_passwd: 'member_passwd member_passwd_confirm member_passwd_current'
        },
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            member_name: {
                regexp: 'Gebruik alleen letters en nummers (3-20 karakters).',
                remote: 'Deze naam is al in gebruik.'
            },
            member_email: {
                email: 'Vul een geldig e-mailadres in.',
                remote: 'Dit e-mailadres is al in gebruik.'
            },
            member_passwd: {
                minlength: 'Gebruik minimaal 5 tekens.'
            },
            member_passwd_confirm: {
                equalTo: 'De wachtwoorden komen niet overeen.',
                minlength: 'Gebruik minimaal 5 tekens.'
            },
            member_website: {
               url: 'Vul een geldig website adres in.'
            }
        }
    });

    /* SHARE PAGE FORM*/
    $('#sharepage-form').validate({
        errorLabelContainer: '#sharepage-form .form-error-container',
        errorElement: 'span',
        messages: {
            sharepage_name: 'Je vriend naam is een verplicht veld.', 
            sharepage_email: {
                required: 'Je vriend e-mailadres is een verplicht veld.',
                email: 'Vul een geldig e-mailadres in.'
            },
            sharepage_subject: 'Je dient een onderwerp in te vullen.',
            sharepage_message: 'Je dient een boodschap in te vullen.',
            captcha: 'Typ het woord in dat je ziet.'
        },
        wrapper: 'li'
    });

    /*  USER LOGIN FORM */
    $('#feedback-form').validate({
        errorLabelContainer: '#feedback-form .form-error-container',
        errorElement: 'span',
        messages: {
            feedback_name: 'Uw naam is een verplicht veld.', 
            feedback_email: {
                required: 'Uw e-mailadres is een verplicht veld.',
                email: 'Vul een geldig e-mailadres in.'
            },
            feedback_message: 'U dient een bericht in te vullen voordat u feedback kunt geven.',
            captcha: '"Typ het woord in dat je ziet" is een verplicht veld.'
        },
        wrapper: 'li'
    });

    /*  LOGIN FORM */
    $('#member-login-form').validate({
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            email: {
                required: 'Dit is een verplicht veld.',
                email: 'Vul een geldig e-mailadres in.'
            },
            passwd: 'Dit is een verplicht veld.' 
        }
    });

    /* COMPANY REGISTRATION FORM */
    function showHideCompanySubtypes() {
        $('#company-type-other-row, #company-subtype-row').next().each(function() {
            if ($(this).is('.form-error')) $(this).remove();
        });
        $('#company-type-other-row, #company-type-dealer, #company-type-dealer-label, #company-subtype-row, #company-type-architect, #company-type-architect-label').hide();

        if ($('form.company-form #company-type-id').val() == 99) $('#company-type-other-row').show();
        else if ($('form.company-form #company-type-id').val() == 2) $('#company-subtype-row, #company-type-dealer, #company-type-dealer-label').show();
        else if ($('form.company-form #company-type-id').val() == 3) $('#company-subtype-row, #company-type-architect, #company-type-architect-label').show();
    }
    $('form.company-form #company-type-id').change(function() {
        $('#company-type-dealer input, #company-type-architect input').prop('checked', false);
        showHideCompanySubtypes();
    });
    showHideCompanySubtypes();
    
    $('#company-form').validate({
        rules: {
            company_name: {
                required: true
            },
            company_seo: {
                required: true,
                regexp: /^([A-Za-z0-9_-]{3,20})$/,
                remote: {
                    url: '/company/beschikbare-seo',
                    type: 'post'
                }
            },
            company_postal_code1: {
                required: true,
                regexp: /[0-9]{4}/
            },
            company_postal_code2: {
                required: true,
                regexp: /[a-z]{2}/i
            },
            company_house_number: {
                required: true
            },
            company_website: {
                required: true,
                url: true
            },
            company_email: {
                required: true,
                email: true
            },
            company_type_id: {
                required: true
            },
            company_type_other: {
                required: {
                    depends: function (e) {
                        return $('#company-type-id').val() == 99; // Other 
                    }
                }
            },
            'company_subtype_id[]': {
                required: {
                    depends: function (e) {
                        return $('#company-type-id').val() == 2 || $('#company-type-id').val() == 3; // Showroom / Architect
                    }
                }
            }
        },
        groups: {
            company_postal_code: 'company_postal_code2 company_postal_code1 company_house_number_extra company_house_number'
        },
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            company_seo: {
                regexp: 'Gebruik alleen letters en nummers (3-20 karakters).',
                remote: 'Deze naam is al in gebruik.'
            },
            company_postal_code1: {
                regexp: 'Geen geldige postcode/huisnummer combinatie opgegeven.'
            },
            company_postal_code2: {
                regexp: 'Geen geldige postcode/huisnummer combinatie opgegeven.'
            },
            company_website: {
               url: 'Vul een geldig website adres in.'
            },
            company_email: {
               email: 'Vul een geldig algemeen e-mailadres in.'
            }
        }
    });

    $('#company-edit-form').validate({
        rules: {
            company_name: {
                required: true
            },
            company_seo: {
                required: true,
                regexp: /^([A-Za-z0-9_-]{3,20})$/,
                remote: {
                    url: '/company/beschikbare-seo',
                    type: 'post'
                }
            },
            company_postal_code1: {
                required: true,
                regexp: /[0-9]{4}/
            },
            company_postal_code2: {
                required: true,
                regexp: /[a-z]{2}/i
            },
            company_house_number: {
                required: true
            },
            company_website: {
                required: true,
                url: true
            },
            company_facebook: {
                regexp: /^(https?:\/\/)?(www\.)?facebook\.com\/([A-Za-z0-9_\-\.])+\/?$/
            },
            company_twitter: {
                regexp: /^(https?:\/\/)?(www\.)?twitter\.com\/([A-Za-z0-9_\-\.])+\/?$/
            },
            company_youtube: {
                regexp: /^(https?:\/\/)?(www\.)?youtube\.com\//
            },
            company_email: {
                required: true,
                email: true
            },
            company_type_id: {
                required: true
            },
            company_type_other: {
                required: {
                    depends: function (e) {
                        return $('#company-type-id').val() == 99; // Other 
                    }
                }
            },
            'company_subtype_id[]': {
                required: {
                    depends: function (e) {
                        return $('#company-type-id').val() == 2 || $('#company-type-id').val() == 3; // Showroom / Architect
                    }
                }
            }
        },
        groups: {
            company_postal_code: 'company_postal_code2 company_postal_code1 company_house_number_extra company_house_number'
        },
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            company_seo: {
                regexp: 'Gebruik alleen letters en nummers (3-20 karakters).',
                remote: 'Deze naam is al in gebruik.'
            },
            company_postal_code1: {
                regexp: 'Geen geldige postcode/huisnummer combinatie opgegeven.'
            },
            company_postal_code2: {
                regexp: 'Geen geldige postcode/huisnummer combinatie opgegeven.'
            },
            company_website: {
               url: 'Vul een geldig website adres in.'
            },
            company_facebook: {
               regexp: 'Vul een geldig facebook adres in.'
            },
            company_twitter: {
               regexp: 'Vul een geldig twitter adres in.'
            },
            company_youtube: {
               regexp: 'Vul een geldig youtube adres in.'
            },
            company_email: {
               email: 'Vul een geldig algemeen e-mailadres in.'
            }
        }
    });

    if ($('form.company-form').length) {
        var fields = $('#company-postal-code1, #company-postal-code2, #company-house-number');
        fields.bind('blur', function(e) {
            $('#address-not-found').remove();
            var valid = true;
            fields.each(function() {
                valid = valid && ($(this).is('.valid') || !$(this).is('.error')) && $(this).val().length;
            });
            if (!valid) {
                return;
            }
    
            company_load_postal_code();
        });
    
        function company_load_postal_code() {
            var params = {
                zip: $('#company-postal-code1').val() + ' ' + $('#company-postal-code2').val(),
                houseNumber: $('#company-house-number').val()
            };
            $.post('/api/postal_code', params, function(data) {
                if (data.indexOf(';') == false) {
                    return;
                }
                var splits = data.split(';');
                if (splits.length != 2) {
                    return;
                }
                if (splits[0] == 'error') {
                    $('#company-street').val('');
                    $('#company-city').val('');
                    var warning = $('<div class="form-error" id="address-not-found">De postcode-huisnummer combinatie is niet bekend in onze database dus vul je adresgegevens in.</div>');
                    $('#company-street, #company-city, #company-country')
                        .addClass('required')
                        .removeClass('disabled')
                        .prop('disabled', false);
                    $('#company-street').focus();
                    fields.unbind('blur');
                
                    $('#company-postal-code1').parent().after(warning);
                } else {
                    $('#company-street').val(splits[0]);
                    $('#company-city').val(splits[1]);
                }
            });
        }
    }
    
    /* COMPANY INVITE MEMBER FORM */
    $('#company-invite-member-form').validate({
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            email: {
                email: 'Vul een geldig e-mailadres in.'
            }
        }
    });

    $('#welke-widget-step2-form').validate({
        errorLabelContainer: '#welke-widget-step2-form .form-error-container',
        errorElement: 'span',
        invalidHandler: function (form, validator) {
            if (validator.numberOfInvalids()) $('#welke-widget-step2-form .submit-error').show();
            else $('#welke-widget-step2-form .submit-error').hide();
        },
        messages: {
            'widget_domain_id[]': 'U dient eerst WELKE. productgroepen toe te voegen.',
            'widget_product_brand_id[]': 'U dient eerst merken toe te voegen.',
            'widget_photo_id[]': 'U dient eerst WELKE. inspiratie toe te voegen.'
        },
        wrapper: 'li'
    });

    $('#welke-widget-step4-form').validate({
        rules: {
            subscription_account: {
                dutchbankaccount: true
            }
        },
        errorLabelContainer: '#welke-widget-step4-form .form-error-container',
        errorElement: 'span',
        invalidHandler: function (form, validator) {
            if (validator.numberOfInvalids()) $('#welke-widget-step4-form .submit-error').show();
            else $('#welke-widget-step4-form .submit-error').hide();
        },
        messages: {
            subscription_account: {
                required: 'Het rekeningnummer is een verplicht veld.',
                dutchbankaccount: 'Het rekeningnummer is ongeldig.'
            },
            subscription_name: '"te name van" is een verplicht veld.',
            widget_terms_of_use: 'U dient akkoord te gaan met de Algemene Voorwaarden.'
        },
        wrapper: 'li'
    });

    $('#welke-widget-step5-form').validate({
        errorLabelContainer: '#welke-widget-step5-form .form-error-container',
        errorElement: 'span',
        invalidHandler: function (form, validator) {
            if (validator.numberOfInvalids()) $('#welke-widget-step5-form .submit-error').show();
            else $('#welke-widget-step5-form .submit-error').hide();
        },
        messages: {
            widget_website: 'U dient hier de website in te vullen waar uw widget geplaatst wordt.'
        },
        wrapper: 'li'
    });

    $('#welke-widget-edit-form').validate({
        errorLabelContainer: '#welke-widget-edit-form .form-error-container',
        errorElement: 'span',
        invalidHandler: function (form, validator) {
            if (validator.numberOfInvalids()) $('#welke-widget-edit-form .submit-error').show();
            else $('#welke-widget-edit-form .submit-error').hide();
        },
        messages: {
            widget_website: 'website is een verplicht veld.',
            widget_website_warning: 'U dient de checkbox aan te vinken om het websiteadres te kunnen wijzigen',
            widget_width: 'breedte is een verplicht veld.',
            widget_height: 'lengte is een verplicht veld.'
        },
        wrapper: 'li'
    });


    // BROCHURE
    if ($('#brochure-order-postal-code1').attr('name')) $('#brochure-order-postal-code1').mask('9999');
    if ($('#brochure-order-postal-code2').attr('name')) $('#brochure-order-postal-code2').mask('aa');

    $('section.brochure-form form').validate({
        rules: {
            brochure_order_title: {
                required: true
            },
            brochure_order_title: {
                required: true
            },
            brochure_order_firstname: {
                required: true
            },
            brochure_order_lastname: {
                required: true
            },
            brochure_order_postal_code1: {
                required: true,
                digits: true,
                minlength: 4,
                maxlength: 4
            },
            brochure_order_postal_code2: {
                required: true,
                minlength: 2,
                maxlength: 2
            },
            brochure_order_house_number: {
                required: true
            },
            brochure_order_email: {
                required: true,
                email: true
            },
            brochure_order_email_confirm: {
                required: true,
                email: true,
                equalTo: '#brochure-order-email'
            },
            brochure_order_welke_newsletter: {
                required: true
            },
            captcha: {
                required: true
            }
        },
        groups: {
            brochure_order_address: 'brochure_order_postal_code1 brochure_order_postal_code2  brochure_order_house_number brochure_order_house_number_extra'
        },
        //errorLabelContainer: '#brochure-order-form .form-error-container',
        errorPlacement: function (error, element) {
            switch (element.attr('name')) {
                case 'brochure_order_title':
                case 'brochure_order_firstname':
                case 'brochure_order_lastname':
                case 'brochure_order_house_number':
                case 'brochure_order_house_number_extra':
                case 'brochure_order_street':
                case 'brochure_order_city':
                case 'brochure_order_country':
                case 'brochure_order_phone1':
                case 'brochure_order_phone2':
                case 'brochure_order_email':
                case 'brochure_order_email_confirm':
                case 'brochure_order_welke_newsletter':
                    error.appendTo('section.brochure-form .form-error-container.error-1');
                break;

                case 'captcha':
                    error.appendTo('section.brochure-form .form-error-container.error-2');
                break;

            }
        },
        errorElement: 'span',
        invalidHandler: function (form, validator) {
            if (validator.numberOfInvalids()) $('section.brochure-form .submit-error').show();
            else $('section.brochure-form .submit-error').hide();
        },
        messages: {
            brochure_order_title: 'Dhr./Mevr. is een verplicht veld.',
            brochure_order_firstname: 'Voorletter is een verplicht veld.',
            brochure_order_lastname: 'Achternaam is een verplicht veld.',
            brochure_order_postal_code1: {
                required: 'Postcode is een verplicht veld.',
                digits: 'Postcode is een verplicht veld.',
                minlength: 'Postcode is een verplicht veld.',
                maxlength: 'Postcode is een verplicht veld.'
            },
            brochure_order_postal_code2: {
                required: 'Postcode is een verplicht veld.',
                minlength: 'Postcode is een verplicht veld.',
                maxlength: 'Postcode is een verplicht veld.'
            },
            brochure_order_house_number: {
                required: 'Huisnummer is een verplicht veld.'
            },
            brochure_order_street: {
                required: 'Straat is een verplicht veld.'
            },
            brochure_order_city: {
                required: 'Woonplaats is een verplicht veld.'
            },
            brochure_order_country: {
                required: 'Land is een verplicht veld.'
            },
            brochure_order_email: {
                required: 'Je e-mailadres is een verplicht veld.',
                email: 'Vul een geldig e-mailadres in.'
            },
            brochure_order_email_confirm: {
                required: 'Je e-mailadres (nogmaals) is een verplicht veld.',
                equalTo: 'De door je ingevulde e-mailadressen komen niet overeen.'
            },
            brochure_order_opt_in: 'Je dient de checkbox aan te vinken',
            brochure_order_welke_newsletter: 'Je dient de checkbox aan te vinken',
            brochure_order_partner_newsletter: 'Je dient de checkbox aan te vinken',
            captcha: 'Captcha is een verplicht veld.'
        },
        wrapper: 'li'
    });
    
    // MAGAZINE
    if ($('#magazine-order-postal-code1').attr('name')) $('#magazine-order-postal-code1').mask('9999');
    if ($('#magazine-order-postal-code2').attr('name')) $('#magazine-order-postal-code2').mask('aa');
    if ($('#magazine-order-delivery-postal-code1').attr('name')) $('#magazine-order-delivery-postal-code1').mask('9999');
    if ($('#magazine-order-delivery-postal-code2').attr('name')) $('#magazine-order-delivery-postal-code2').mask('aa');
    
    $.validator.addMethod('deliveryRequired', function(value, element) {
        if (!$('#magazine-order-different-address').is(':checked'))
            return $(element).parents('fieldset').length;
        return !this.optional(element);
    }, '');
    $('#magazine-order-different-address').click(function() {
        $('#magazine-order-delivery').hide();
        if ($(this).is(':checked')) {
            $('#magazine-order-delivery').show();
        }
    });
    $('#magazine-order-payment-method, #magazine-order-payment-method-1').click(function() {
        $('#magazine-order-payment-id').removeClass('required');
        if ($('#magazine-order-payment-method').is(':checked')) {
            $('#magazine-order-payment-id').addClass('required');
        }
        
        $('#magazine-order-account').removeClass('required');
        $('#magazine-order-direct-debit-authorized').removeClass('required');
        if ($('#magazine-order-payment-method-1').is(':checked')) {
            $('#magazine-order-account').addClass('required');
            $('#magazine-order-direct-debit-authorized').addClass('required');
        }
    });

    $('section.magazine-form form').validate({
        rules: {
            magazine_order_title: {
                required: true
            },
            magazine_order_title: {
                required: true
            },
            magazine_order_firstname: {
                required: true
            },
            magazine_order_lastname: {
                required: true
            },
            magazine_order_postal_code1: {
                required: true,
                digits: true,
                minlength: 4,
                maxlength: 4
            },
            magazine_order_postal_code2: {
                required: true,
                minlength: 2,
                maxlength: 2
            },
            magazine_order_house_number: {
                required: true
            },
            magazine_order_phone1: {
                required: true,
                digits: true,
                minlength: 2,
                maxlength: 4
            },
            magazine_order_phone2: {
                required: true,
                digits: true,
                minlength: 6,
                maxlength: 8
            },
            magazine_order_email: {
                required: true,
                email: true
            },
            magazine_order_email_confirm: {
                required: true,
                email: true,
                equalTo: '#magazine-order-email'
            },
            magazine_order_delivery_postal_code1: {
                digits: true,
                minlength: 4,
                maxlength: 4
            },
            magazine_order_delivery_postal_code2: {
                minlength: 2,
                maxlength: 2
            },
            magazine_order_payment_method: {
                required: true
            },
            magazine_order_account: {
                dutchbankaccount: true
            },
            captcha: {
                required: true
            }
        },
        groups: {
            magazine_order_address: 'magazine_order_postal_code1 magazine_order_postal_code2  magazine_order_house_number magazine_order_house_number_extra',
            magazine_order_phone: 'magazine_order_phone1 magazine_order_phone2',
            magazine_order_delivery_address: 'magazine_order_delivery_postal_code1 magazine_order_delivery_postal_code2  magazine_order_delivery_house_number magazine_order_delivery_house_number_extra'
        },
        //errorLabelContainer: '#magazine-order-form .form-error-container',
        errorPlacement: function (error, element) {
            switch (element.attr('name')) {
                case 'magazine_order_title':
                case 'magazine_order_firstname':
                case 'magazine_order_lastname':
                case 'magazine_order_postal_code1':
                case 'magazine_order_postal_code2':
                case 'magazine_order_house_number':
                case 'magazine_order_house_number_extra':
                case 'magazine_order_street':
                case 'magazine_order_city':
                case 'magazine_order_country':
                case 'magazine_order_email':
                case 'magazine_order_email_confirm':
                    error.appendTo('section.magazine-form .form-error-container.error-1');
                break;
                
                case 'magazine_order_delivery_title':
                case 'magazine_order_delivery_firstname':
                case 'magazine_order_delivery_lastname':
                case 'magazine_order_delivery_postal_code1':
                case 'magazine_order_delivery_postal_code2':
                case 'magazine_order_delivery_house_number':
                case 'magazine_order_delivery_house_number_extra':
                case 'magazine_order_delivery_street':
                case 'magazine_order_delivery_city':
                case 'magazine_order_delivery_country':
                    error.appendTo('section.magazine-form .form-error-container.error-2');
                break;
                
                case 'magazine_order_payment_method':
                case 'magazine_order_payment_id':
                case 'magazine_order_account':
                case 'magazine_order_direct_debit_authorized':
                case 'magazine_order_media_mij_terms':
                    error.appendTo('section.magazine-form .form-error-container.error-4');
                break;

                case 'captcha':
                    error.appendTo('section.magazine-form .form-error-container.error-5');
                break;
            }
        },
        errorElement: 'span',
        invalidHandler: function (form, validator) {
            if (validator.numberOfInvalids()) $('section.magazine-form .submit-error').show();
            else $('section.magazine-form .submit-error').hide();
        },
        messages: {
            magazine_order_title: 'Dhr./Mevr. is een verplicht veld.',
            magazine_order_firstname: 'Voorletter is een verplicht veld.',
            magazine_order_lastname: 'Achternaam is een verplicht veld.',
            magazine_order_postal_code1: {
                required: 'Postcode is een verplicht veld.',
                digits: 'Postcode is een verplicht veld.',
                minlength: 'Postcode is een verplicht veld.',
                maxlength: 'Postcode is een verplicht veld.'
            },
            magazine_order_postal_code2: {
                required: 'Postcode  is een verplicht veld.',
                minlength: 'Postcode is een verplicht veld.',
                maxlength: 'Postcode is een verplicht veld.'
            },
            magazine_order_house_number: {
                required: 'Huisnummer is een verplicht veld.'
            },
            magazine_order_street: {
                required: 'Straat is een verplicht veld.'
            },
            magazine_order_city: {
                required: 'Woonplaats is een verplicht veld.'
            },
            magazine_order_country: {
                required: 'Land is een verplicht veld.'
            },
            magazine_order_email: {
                required: 'Je e-mailadres is een verplicht veld.',
                email: 'Vul een geldig e-mailadres in.'
            },
            magazine_order_email_confirm: {
                required: 'Je e-mailadres (nogmaals) is een verplicht veld.',
                equalTo: 'De door je ingevulde e-mailadressen komen niet overeen.'
            },
            magazine_order_delivery_title: 'Dhr./Mevr. is een verplicht veld.',
            magazine_order_delivery_firstname: 'Voorletter is een verplicht veld.',
            magazine_order_delivery_lastname: 'Achternaam is een verplicht veld.',
            magazine_order_delivery_postal_code1: {
                deliveryRequired: 'Postcode is een verplicht veld.',
                digits: 'Postcode is een verplicht veld.',
                minlength: 'Postcode is een verplicht veld.',
                maxlength: 'Postcode is een verplicht veld.'
            },
            magazine_order_delivery_postal_code2: {
                deliveryRequired: 'Postcode  is een verplicht veld.',
                minlength: 'Postcode is een verplicht veld.',
                maxlength: 'Postcode is een verplicht veld.'
            },
            magazine_order_delivery_house_number: {
                deliveryRequired: 'Huisnummer is een verplicht veld.'
            },
            magazine_order_delivery_street: {
                deliveryRequired: 'Straat is een verplicht veld.'
            },
            magazine_order_delivery_city: {
                deliveryRequired: 'Woonplaats is een verplicht veld.'
            },
            magazine_order_delivery_country: {
                deliveryRequired: 'Land is een verplicht veld.'
            },
            magazine_order_payment_method: {
                required: 'Betaalwijze is een verplicht veld.'
            },
            magazine_order_payment_id: {
                required: 'iDeal is een verplicht veld.'
            },
            magazine_order_account: {
                required: 'Rekeningnummer is een verplicht veld.',
                dutchbankaccount: 'Wij herkennen dit rekeningnummer niet, controleer of je het correct hebt ingevuld.'
            },
            magazine_order_direct_debit_authorized: 'Je dient de checkbox aan te vinken',
            magazine_order_media_mij_terms: 'Je dient de checkbox aan te vinken',
            magazine_order_opt_in: 'Je dient de checkbox aan te vinken',
            magazine_order_welke_newsletter: 'Je dient de checkbox aan te vinken',
            magazine_order_partner_newsletter: 'Je dient de checkbox aan te vinken',
            captcha: '"Typ het woord in dat je ziet" is een verplicht veld.'
        },
        wrapper: 'li'
    });

    $('#magazine-unsubscribe-form').validate({
        rules: {
            magazine_unsubscribe_name: {
                required: true
            },
            magazine_unsubscribe_email: {
                required: true,
                email: true
            },
            magazine_unsubscribe_email_confirm: {
                required: true,
                email: true,
                equalTo: '#magazine-unsubscribe-email'
            },
            captcha: {
                required: true
            }
        },
        errorPlacement: function (error, element) {
            switch (element.attr('name')) {
                case 'magazine_unsubscribe_name':
                case 'magazine_unsubscribe_email':
                case 'magazine_unsubscribe_email_confirm':
                    error.appendTo('#magazine-unsubscribe-form .form-error-container.error-1');
                break;

                case 'captcha':
                    error.appendTo('#magazine-unsubscribe-form .form-error-container.error-2');
                break;
            }
        },
        errorElement: 'span',
        invalidHandler: function (form, validator) {
            if (validator.numberOfInvalids()) $('#magazine-unsubscribe-form .submit-error').show();
            else $('#magazine-unsubscribe-form .submit-error').hide();
        },
        messages: {
            magazine_unsubscribe_name: 'Je naam is een verplicht veld.',
            magazine_unsubscribe_email: {
                required: 'Je e-mailadres is een verplicht veld.',
                email: 'Vul een geldig e-mailadres in.'
            },
            magazine_unsubscribe_email_confirm: {
                required: 'Je e-mailadres (nogmaals) is een verplicht veld.',
                equalTo: 'De door je ingevulde e-mailadressen komen niet overeen.'
            },
            captcha: '"Typ het woord in dat je ziet" is een verplicht veld.'
        },
        wrapper: 'li'
    });
    
    $('section.blog-comment form').validate({
        rules: {
            comment_name: {
                required: true
            },
            comment_email: {
                required: true,
                email: true
            },
            comment_comment: {
                required: true
            },
            captcha: {
                required: true
            }
        },
        errorLabelContainer: 'section.blog-comment .form-error-container',
        errorElement: 'span',
        invalidHandler: function (form, validator) {
            if (validator.numberOfInvalids()) $('section.blog-comment .submit-error').show();
            else $('section.blog-commentn.magazine-form .submit-error').hide();
        },
        messages: {
            comment_name: 'Je naam is een verplicht veld.',
            comment_email: {
                required: 'Je e-mailadres is een verplicht veld.',
                email: 'Vul een geldig e-mailadres in.'
            },
            comment_comment: '"Schrijf hier je reactie" is een verplicht veld.',
            captcha: '"Typ het woord in dat je ziet" is een verplicht veld.'
        },
        wrapper: 'li'
    });

    $('#photo-lookbook-add-form').validate({
        rules: {
            description: {
                required: true
            },
            lookbook_id: {
                required: {
                    depends: function (e) {
                        return $('#new-lookbook-0').prop('checked') == true;
                    }
                },
                remote: {
                    url: '/photo/beschikbare-lookbook',
                    type: 'post',
                    data: {
                        false_positive: function() {
                            // Have to do it because I could not find how create a dependency to it
                            return $('#new-lookbook-0').prop('checked') == false ? 1 : 0;
                        },
                        photo_id: function() {
                            return $('#photo_id').val();
                        }
                    }
                }
            },
            lookbook_name: {
                required: {
                    depends: function (e) {
                        return $('#new-lookbook-1').prop('checked') == true;
                    }
                },
                remote: {
                    url: '/lookbook/beschikbare-naam',
                    type: 'post'
                }
            },
            lookbook_description: {
                required: {
                    depends: function (e) {
                        return $('#new-lookbook-1').prop('checked') == true;
                    }
                }
            }
        },
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            lookbook_id: {
                remote: 'Deze foto staat al in dit lookbook.'
            },
            lookbook_name: {
                remote: 'Deze naam is al in gebruik.'
            }
        }
    });

    $('#lookbook-edit-form').validate({
        rules: {
            lookbook_name : {
                required: true,
                remote: {
                    url: '/lookbook/beschikbare-naam',
                    type: 'post',
                    data: {
                        lookbook_id: function() {
                            return $('#lookbook-id').val();
                        }
                    }
                }
            },
            lookbook_description: {
                required: true
            }
        },
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            lookbook_name: {
                remote: 'Deze naam is al in gebruik.'
            }
        }
    });

    $('#photo-lookbook-edit-form').validate({
        rules: {
            description: {
                required: true
            }
        },
        errorElement: 'div',
        errorClass: 'form-error'
    });

    $('#photo-add-info-form, #photo-edit-form').validate({
        rules: {
            photo_name: {
                required: true,
                remote: {
                    url: '/photo/beschikbare-naam',
                    type: 'post',
                    data: {
                        photo_id: function() {
                            return $('#photo-id').val();
                        }
                    }
                }
            },
            lookbook_id: {
                required: {
                    depends: function(e) {
                        return $('#new-lookbook-0').prop('checked') == true;
                    }
                }
            },
            lookbook_name: {
                required: {
                    depends: function(e) {
                        return $('#new-lookbook-1').prop('checked') == true;
                    }
                },
                remote: {
                    url: '/lookbook/beschikbare-naam',
                    type: 'post'
                }
            },
            lookbook_description: {
                required: {
                    depends: function(e) {
                        return $('#new-lookbook-1').prop('checked') == true;
                    }
                }
            },
            photo_type_id: {
                required: true
            },
            photo_description: {
                required: true
            },
            photo_style_id: {
                required: true
            },
            photo_color_count: {
                min: 1
            }
        },
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            photo_name: {
                remote: 'Deze naam is al in gebruik.'
            },
            lookbook_name: {
                remote: 'Deze naam is al in gebruik.'
            },
            photo_color_count: {
                min: 'Dit is een verplicht veld.'
            }
        }
    });
    
    $('#photo-clipper-form').validate({
        rules: {
            photo_name: {
                required: true,
                maxlength: 80,
                remote: {
                    url: '/photo/beschikbare-naam',
                    type: 'post'
                }
            },
            lookbook_id: {
                required: {
                    depends: function(e) {
                        return $('#new-lookbook-0').prop('checked') == true;
                    }
                }
            },
            lookbook_name: {
                required: {
                    depends: function(e) {
                        return $('#new-lookbook-1').prop('checked') == true;
                    }
                },
                remote: {
                    url: '/lookbook/beschikbare-naam',
                    type: 'post'
                }
            },
            photo_type_id: {
                required: true
            },
            photo_description: {
                required: true
            },
            photo_style_id: {
                required: true
            }
        },
        errorElement: 'div',
        errorClass: 'form-error',
        messages: {
            photo_name: {
                remote: 'Deze naam is al in gebruik.',
                maxlength: 'Gebruik maximaal 80 tekens.'
            },
            lookbook_name: {
                remote: 'Deze naam is al in gebruik.'
            }
        }
    });
    
    $('#photo-comment-form').validate({
        rules: {
            photo_comment: {
                required: true
            }
        }
    });
});

