/**
  * Create the metaboxes for the available widgets
  *
  * @param $post_type
  * @param $post
  */
 public static function action_add_meta_boxes($post_type, $post)
 {
     global $_wp_post_type_features;
     $add_metas = false;
     if ($custom_meta_groups = array_keys(array_intersect_key($_wp_post_type_features[$post_type], Voce_Meta_API::GetInstance()->groups))) {
         foreach ($custom_meta_groups as $group_id) {
             if (count(Voce_Meta_API::GetInstance()->groups[$group_id]->fields)) {
                 foreach (Voce_Meta_API::GetInstance()->groups[$group_id]->fields as $field) {
                     if (!empty($field->field_type) && 'widget' == $field->field_type) {
                         $add_metas = true;
                         break 2;
                     }
                 }
             }
         }
     }
     if (!$add_metas) {
         return;
     }
     $location = apply_filters('voce_post_meta_widgets_widget_choices_location', 'side', $post_type, $post);
     $priority = apply_filters('voce_post_meta_widgets_widget_choices_priority', 'low', $post_type, $post);
     $callback = array(__CLASS__, 'sidebar_admin_metabox');
     add_meta_box('sidebar_admin', 'Sidebar Admin', $callback, $post_type, $location, $priority);
     $callback = array(__CLASS__, 'hidden_widgets_metabox');
     add_meta_box('voce_widgets_hidden', 'Widgets Hidden', $callback, $post_type, $location, $priority, $post);
 }
    /**
     * Public callback function to display HTML meta form field
     * @param object $field
     * @param string $value
     * @param int $post_id
     */
    function voce_date_field_display($field, $value, $post_id)
    {
        $defaults = array('max_date' => '', 'min_date' => '', 'max_date_field' => '', 'min_date_field' => '', 'default_text' => 'Select Date', 'default_date' => '', 'year_range' => '');
        $args = wp_parse_args($field->args, $defaults);
        $input_pattern = '<input type="text" class="datepicker" id="%s-formatted" data-default_text="%s" data-default_date="%s" data-max_date="%s" data-min_date="%s" data-max_date_field="%s" data-min_date_field="%s" data-year_range="%s" readonly />';
        ?>
	<p>
		<?php 
        voce_field_label_display($field);
        ?>
		<?php 
        printf($input_pattern, $field->get_input_id(), esc_attr($args['default_text']), esc_attr($args['default_date']), esc_attr($args['max_date']), esc_attr($args['min_date']), esc_attr($args['max_date_field']), esc_attr($args['min_date_field']), esc_attr($args['year_range']));
        ?>
		<input class="hidden" type="hidden" id="<?php 
        echo $field->get_input_id();
        ?>
" name="<?php 
        echo $field->get_name();
        ?>
" value="<?php 
        echo esc_attr($value);
        ?>
"  />
		<a href="#" class="submitdelete deletion voce-date-clear">Clear</a>
		<?php 
        echo !empty($field->description) ? '<br><span class="description">' . wp_kses($field->description, Voce_Meta_API::GetInstance()->description_allowed_html) . '</span>' : '';
        ?>
	</p>
	<?php 
    }
 /**
  * @method __call
  * @param string $name
  * @param array $func_args
  * @return null
  */
 public function __call($name, $func_args)
 {
     if (strpos($name, 'add_field_') === 0) {
         $type = substr($name, 10);
         $api = Voce_Meta_API::GetInstance();
         if (isset($api->type_mapping[$type])) {
             $mapping = $api->type_mapping[$type];
             $field_args = isset($func_args[2]) ? $func_args[2] : array();
             $field_args = wp_parse_args($field_args, $mapping['args']);
             return $this->add_field($mapping['class'], $func_args[0], $func_args[1], $field_args);
         }
         return null;
     }
 }