/**
 *	get fields from wp-options
 */
function jcf_field_settings_get($id = '', $select_from_db = false)
{
    $option_name = jcf_fields_get_option_name();
    $jcf_read_settings = jcf_get_read_settings();
    if (empty($select_from_db) && $jcf_read_settings != JCF_CONF_SOURCE_DB) {
        $jcf_settings = jcf_get_all_settings_from_file();
        $post_type = str_replace('jcf_fields-', '', $option_name);
        $field_settings = $jcf_settings['field_settings'][$post_type];
    } else {
        $field_settings = jcf_get_options($option_name);
    }
    if (!empty($id)) {
        return @$field_settings[$id];
    }
    return $field_settings;
}
/**
 *	callback function for hook "add_meta_boxes"
 *	call add_meta_box for each fieldset
 */
function jcf_post_load_custom_fields($post_type = '')
{
    // set global post type
    jcf_set_post_type($post_type);
    // get read settings
    $jcf_read_settings = jcf_get_read_settings();
    // get fieldsets
    if ($jcf_read_settings == JCF_CONF_SOURCE_DB) {
        $fieldsets = jcf_fieldsets_get();
        $field_settings = jcf_field_settings_get();
    } else {
        $jcf_settings = jcf_get_all_settings_from_file();
        $fieldsets = $jcf_settings['fieldsets'][$post_type];
        $field_settings = $jcf_settings['field_settings'][$post_type];
    }
    if (!empty($fieldsets)) {
        // remove fieldsets without fields
        foreach ($fieldsets as $f_id => $fieldset) {
            // check $enabled; add custom js/css for components
            foreach ($fieldset['fields'] as $field_id => $enabled) {
                if (!$enabled) {
                    unset($fieldset['fields'][$field_id]);
                    continue;
                }
                $field_obj = jcf_init_field_object($field_id, $fieldset['id']);
                $field_obj->do_add_js();
                $field_obj->do_add_css();
            }
            // if all fields disabled -> remove fieldset
            if (empty($fieldset['fields'])) {
                unset($fieldsets[$f_id]);
            }
        }
        if (!empty($field_obj)) {
            unset($field_obj);
        }
        if (empty($fieldsets)) {
            return false;
        }
        // add custom styles and scripts
        add_action('admin_print_styles', 'jcf_edit_post_styles');
        add_action('admin_print_scripts', 'jcf_edit_post_scripts');
        foreach ($fieldsets as $f_id => $fieldset) {
            add_meta_box('jcf_fieldset-' . $f_id, $fieldset['title'], 'jcf_post_show_custom_fields', $post_type, 'advanced', 'default', array($fieldset));
        }
    }
}
/**
 * update order fieldsets
 * @param array $keys Fieldsets keys
 */
function jcf_fieldsets_order($keys = array())
{
    $option_name = jcf_fieldsets_get_option_name();
    $new_fieldsets = array();
    $jcf_read_settings = jcf_get_read_settings();
    if ($jcf_read_settings != JCF_CONF_SOURCE_DB) {
        $jcf_settings = jcf_get_all_settings_from_file();
        $post_type = jcf_get_post_type();
        foreach ($keys as $key) {
            $new_fieldsets[$key] = $jcf_settings['fieldsets'][$post_type][$key];
            unset($jcf_settings['fieldsets'][$post_type][$key]);
        }
        $jcf_settings['fieldsets'][$post_type] = $new_fieldsets;
        jcf_save_all_settings_in_file($jcf_settings);
    } else {
        $fieldsets = jcf_get_options($option_name);
        foreach ($keys as $key) {
            $new_fieldsets[$key] = $fieldsets[$key];
            unset($fieldsets[$key]);
        }
        jcf_update_options($option_name, $new_fieldsets);
    }
}
/**
 * export fields from form callback
 */
function jcf_ajax_export_fields_form()
{
    $jcf_read_settings = jcf_get_read_settings();
    if ($jcf_read_settings != JCF_CONF_SOURCE_DB) {
        $jcf_settings = jcf_get_all_settings_from_file();
    } else {
        $jcf_settings = jcf_get_all_settings_from_db();
    }
    $post_types = !empty($jcf_settings['post_types']) ? $jcf_settings['post_types'] : jcf_get_post_types();
    $fieldsets = $jcf_settings['fieldsets'];
    $field_settings = $jcf_settings['field_settings'];
    $registered_fields = jcf_get_registered_fields();
    // load template
    header('Content-Type: text/html; charset=utf-8');
    include JCF_ROOT . '/templates/export.tpl.php';
    exit;
}
/**
 *	Function for update saving method
 *	@return string Return read method from file or database
 */
function jcf_update_read_settings()
{
    $current_value = jcf_get_read_settings();
    $new_value = $_POST['jcf_read_settings'];
    if (MULTISITE && ($_POST['jcf_multisite_setting'] != JCF_CONF_MS_NETWORK && $new_value == JCF_CONF_SOURCE_FS_GLOBAL)) {
        jcf_add_admin_notice('error', __('<strong>Settings storage update FAILED!</strong>. Your MultiSite Settings do not allow to set global storage in FileSystem', JCF_TEXTDOMAIN));
        return $current_value;
    } else {
        if (!empty($current_value)) {
            // if need to copy settings from db to FS
            if (!empty($_POST['jcf_keep_settings'])) {
                if (in_array($new_value, array(JCF_CONF_SOURCE_FS_GLOBAL, JCF_CONF_SOURCE_FS_THEME))) {
                    $file = jcf_get_settings_file_path($new_value);
                    if (jcf_clone_db_settings_to_fs($file, $new_value)) {
                        jcf_add_admin_notice('notice', __('<strong>Database settings has been imported</strong> to file system.', JCF_TEXTDOMAIN));
                        $saved = update_site_option('jcf_read_settings', $new_value);
                    } else {
                        jcf_add_admin_notice('error', __('<strong>Database settings import to file system FAILED!</strong>. Revert settings storage to Database.', JCF_TEXTDOMAIN));
                    }
                }
            } else {
                $saved = update_site_option('jcf_read_settings', $new_value);
            }
        } else {
            $saved = add_site_option('jcf_read_settings', $new_value);
        }
        if ($saved) {
            jcf_add_admin_notice('notice', __('<strong>Settings storage</strong> configurations has been updated.', JCF_TEXTDOMAIN));
        }
        return $saved ? $new_value : $current_value;
    }
}
/**
 *	Fields UI page
 */
function jcf_admin_fields_page($post_type)
{
    jcf_set_post_type($post_type->name);
    $jcf_read_settings = jcf_get_read_settings();
    if ($jcf_read_settings == JCF_CONF_SOURCE_DB) {
        $fieldsets = jcf_fieldsets_get();
        $field_settings = jcf_field_settings_get();
    } else {
        $jcf_settings = jcf_get_all_settings_from_file();
        $fieldsets = $jcf_settings['fieldsets'][$post_type->name];
        $field_settings = $jcf_settings['field_settings'][$post_type->name];
    }
    // load template
    include JCF_ROOT . '/templates/fields_ui.tpl.php';
}
 /**
  * delete field from collection
  */
 public function delete_field($field_id)
 {
     $option_name = jcf_fields_get_option_name();
     $jcf_read_settings = jcf_get_read_settings();
     if ($jcf_read_settings != JCF_CONF_SOURCE_DB) {
         $jcf_settings = jcf_get_all_settings_from_file();
         $post_type = jcf_get_post_type();
         $fieldset = $jcf_settings['fieldsets'][$post_type][$this->fieldset_id];
         $field_settings = $jcf_settings['field_settings'][$post_type];
         if (isset($field_settings[$this->id]['fields'][$field_id])) {
             unset($field_settings[$this->id]['fields'][$field_id]);
         }
         $jcf_settings['fieldsets'][$post_type][$this->fieldset_id] = $fieldset;
         $jcf_settings['field_settings'][$post_type] = $field_settings;
         jcf_save_all_settings_in_file($jcf_settings);
     } else {
         $field_settings = jcf_get_options($option_name);
         if (isset($field_settings[$this->id]['fields'][$field_id])) {
             unset($field_settings[$this->id]['fields'][$field_id]);
         }
         jcf_update_options($option_name, $field_settings);
     }
 }