$(document).ready(function() {
  // AJAX field validation
  $('input:not([type="submit"]):not([type="button"])').live('blur', function() {
    var $form = $(this).closest('form');
    var $field = $(this);
    
    // Field level validate settings override form level settings
    var validate_field = true;
    if(!_.isUndefined($form.attr('validate') && !_.isEmpty($form.attr('validate'))))  { validate_field = false; }
    if(!_.isUndefined($field.attr('validate') && !_.isEmpty($field.attr('validate')))){ validate_field = false; }
    if(!validate_field) { return; }
    
    // Skip validation if empty val
    if(_.isEmpty($field.val())) { return; }
    
    $field.addClass('processing');
    $.ajax({
      url: '/validate/index/field/',
      type: 'post',
      dataType: 'json',
      data: {
        form_module     : $form.attr('form_module'),
        form_controller : $form.attr('form_controller'),
        form_name       : $form.attr('form_name'),
        field_name      : $field.attr('name'),
        val             : $field.val()
      },
      complete: function() {
        $field.removeClass('processing')
      },
      success: function(data) {
        if(_.isNull(data.valid)) { $field.removeClass('invalid').removeClass('valid'); }
        else if(data.valid) { $field.removeClass('invalid').addClass('valid'); }
        else { $field.removeClass('valid').addClass('invalid'); }
      }
    });
  });
});
