/**
 * Register and enqueue a style with a closure.
 *
 * @see wp_enqueue_script() for detail about $handle, $path, $deps, $ver, and $media.
 * @see FM_GLOBAL_ASSET_VERSION for detail about the fallback value of $ver.
 * @see fieldmanager_get_baseurl() for detail about base URL.
 *
 * @param string $handle Stylesheet name.
 * @param string $path Path to the file inside of the Fieldmanager base URL.
 * @param array $deps Stylesheet dependencies. Default empty array.
 * @param string|bool Stylesheet version. Default none.
 * @param string $media Media for this stylesheet. Default 'all'.
 * @param bool $admin Unused.
 */
function fm_add_style($handle, $path, $deps = array(), $ver = false, $media = 'all', $admin = true)
{
    if (!is_admin()) {
        return;
    }
    if (!$ver) {
        $ver = FM_GLOBAL_ASSET_VERSION;
    }
    $add_script = function () use($handle, $path, $deps, $ver, $media) {
        wp_register_style($handle, fieldmanager_get_baseurl() . $path, $deps, $ver, $media);
        wp_enqueue_style($handle);
    };
    add_action('admin_enqueue_scripts', $add_script);
    add_action('wp_enqueue_scripts', $add_script);
}
 /**
  * Output the Javascript required for validation, if any fields require it
  *
  * @access public
  */
 public function add_validation()
 {
     // Iterate through the fields and output the required Javascript
     $rules = array();
     $messages = array();
     foreach ($this->fields as $field) {
         // Add the rule string to an array
         $rule = $this->value_to_js($field, $this->rules);
         if (!empty($rule)) {
             $rules[] = $rule;
             // Add the message to an array, if it exists
             $message = $this->value_to_js($field, $this->messages);
             if (!empty($message)) {
                 $messages[] = $message;
             }
         }
     }
     // Create final rule string
     if (!empty($rules)) {
         $rules_js = $this->array_to_js($rules, "rules");
         $messages_js = $this->array_to_js($messages, "messages");
         // Add a comma and newline if messages is not empty
         if (!empty($messages_js)) {
             $rules_js .= ",\n";
         }
         // Fields that should always be ignored
         $ignore[] = ".fm-autocomplete";
         $ignore[] = "input[type='button']";
         $ignore[] = ":hidden";
         // Certain fields need to be ignored depending on the context
         switch ($this->context) {
             case "post":
                 $ignore[] = "#active_post_lock";
                 break;
         }
         // Add JS for fields to ignore
         $ignore_js = implode(", ", $ignore);
         // Add the Fieldmanager validation script and CSS
         // This is not done via the normal enqueue process since there is no way to know at that point if any fields will require validation
         // Doing this here avoids loading JS/CSS for validation if not in use
         echo "<link rel='stylesheet' id='fm-validation-css' href='" . fieldmanager_get_baseurl() . "css/fieldmanager-validation.css' />\n";
         echo "<script type='text/javascript' src='" . fieldmanager_get_baseurl() . "js/validation/fieldmanager-validation.js?ver=0.3'></script>\n";
         // Add the jQuery validation script
         echo "<script type='text/javascript' src='" . fieldmanager_get_baseurl() . "js/validation/jquery.validate.min.js'></script>\n";
         // Add the ignore, rules and messages to final validate method with form ID, wrap in script tags and output
         echo sprintf("\t<script type='text/javascript'>\n\t\t( function( \$ ) {\n\t\t\$( document ).ready( function () {\n\t\t\tvar validator = \$( '#%s' ).validate( {\n\t\t\t\tinvalidHandler: function( event, validator ) { fm_validation.invalidHandler( event, validator ); },\n\t\t\t\tsubmitHandler: function( form ) { fm_validation.submitHandler( form ); },\n\t\t\t\terrorClass: \"fm-js-error\",\n\t\t\t\tignore: \"%s\",\n%s%s\n\t\t\t} );\n\t\t} );\n\t\t} )( jQuery );\n\t</script>\n", esc_attr($this->form_id), $ignore_js, $rules_js, $messages_js);
     }
 }