function setupValidity() {
    // remove any visible validity modals
    $('.validity-modal-msg').remove();

    // setup validity
    $.validity.setup({ outputMode:"modal" });	
            
    // let's extend patterns to provide for canadian postal codes
    $.extend($.validity.patterns, {
      canadianPostal: /^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$/,
      europeanDate: /^(\d{1,4})-([01]\d)-([012]\d|30|31)$/,
      americanDate: /^([01]\d)\/([012]\d|30|31)\/(\d{1,4})$/
    });
    
    // provide a way to force-require checkboxes
    $.fn.requireCheckboxChecked = function(msg) {
        // let's use our hack into the core.. who needs black boxing :)
        var validate = $.validity.expose('validate'); 

        return validate ? validate(
            this,
            function(obj) {
                var $obj = $(obj);
                return $obj.is(':checkbox') && $obj.is(':checked');
            },
                msg || "This field is required."
        ) : this;
    };

    $('#school_form').validity(function(){
      $('.required:visible').require();
      $('.required:checkbox:visible').requireCheckboxChecked(); // allow for requiring checkboxes
      $('.required.zip').require().match("zip");
      $('.required.phone').require().match("phone");
      $('.required.canadianPostal').require().match("canadianPostal");
      $('.required.europeanDate').require().match("europeanDate");
      $('.required.americanDate').require().match("americanDate");
      $('.required.email').require().match("email");
      
        // trigger confirmation modal, only after validation is successful
        //if ($.validity.report && $.validity.report.valid && !$('#school_form').hasClass('modal_confirmed')) {
        //    $.validity.report.valid = false; // hack to stop form submit, while we show modal
        //    $('#school_form').trigger('modal_activate');
        //}
    });
}


$(document).ready(function(){ setupValidity(); });

