/**
 * filters i18n configurations for the current page
 */
function qtranxf_parse_page_config($config, $url_path, $url_query)
{
    global $q_config;
    //$q_config['i18n-log-dir'] = WP_CONTENT_DIR.'/i18n-config'; //qtranxf_dbg
    if (isset($q_config['i18n-log-dir'])) {
        if (!file_exists($q_config['i18n-log-dir'])) {
            if (!mkdir($q_config['i18n-log-dir'])) {
                unset($q_config['i18n-log-dir']);
            }
        }
        if (isset($q_config['i18n-log-dir'])) {
            qtranxf_write_config_log($config, 'all-pages');
        }
    }
    //qtranxf_dbg_log('qtranxf_parse_page_config: $url_path: "'.$url_path.'"; $url_query: "'.$url_query.'"');
    //qtranxf_dbg_log('qtranxf_parse_page_config: $config: ', $config);
    $page_configs = array();
    foreach ($config as $pgkey => $pgcfg) {
        $d = isset($pgcfg['preg_delimiter']) ? $pgcfg['preg_delimiter'] : '!';
        $matched = qtranxf_match_page($pgcfg, $url_path, $url_query, $d);
        //qtranxf_dbg_log('qtranxf_parse_page_config: $pgcfg: ', $pgcfg);
        //qtranxf_dbg_log('qtranxf_parse_page_config: $matched: ', $matched);
        if ($matched === false) {
            continue;
        }
        $post_type_key = '';
        if (isset($pgcfg['post_type'])) {
            if (is_string($pgcfg['post_type'])) {
                $post_type_key = $d . $pgcfg['post_type'] . $d;
                unset($pgcfg['post_type']);
            } else {
                $post_type_key = serialize($pgcfg['post_type']);
                foreach ($pgcfg['post_type'] as $k => $item) {
                    $pgcfg['post_type'][$k] = $d . $item . $d;
                }
            }
        }
        if (!isset($page_configs[$post_type_key])) {
            $page_configs[$post_type_key] = array();
        }
        $page_config =& $page_configs[$post_type_key];
        foreach ($pgcfg as $key => $cfg) {
            if (empty($cfg)) {
                continue;
            }
            if ($key === 'anchors') {
                //Anchor elements are defined by id only.
                //Merge unique id values only:
                foreach ($cfg as $k => $anchor) {
                    $id = qtranxf_standardize_config_anchor($anchor);
                    if (is_null($id)) {
                        continue;
                    }
                    if (!is_string($id)) {
                        $id = $k;
                    }
                    if (!isset($page_config['anchors'])) {
                        $page_config['anchors'] = array();
                    }
                    $page_config['anchors'][$id] = $anchor;
                }
            } else {
                if ($key === 'forms') {
                    if (!isset($page_config['forms'])) {
                        $page_config['forms'] = array();
                    }
                    foreach ($cfg as $form_id => $pgcfg_form) {
                        if (!isset($pgcfg_form['fields'])) {
                            continue;
                        }
                        // convert obsolete format for 'fields'
                        foreach ($pgcfg_form['fields'] as $k => $f) {
                            if (!isset($f['id'])) {
                                continue;
                            }
                            $id = $f['id'];
                            unset($f['id']);
                            $pgcfg_form['fields'][$id] = $f;
                            if ($id !== $k) {
                                unset($pgcfg_form['fields'][$k]);
                            }
                        }
                        //figure out obsolete id of form/collection
                        if (is_string($form_id)) {
                            $id = $form_id;
                        } else {
                            if (isset($pgcfg_form['form']['id'])) {
                                $id = $pgcfg_form['form']['id'];
                                unset($pgcfg_form['form']['id']);
                                if (empty($pgcfg_form['form'])) {
                                    unset($pgcfg_form['form']);
                                }
                            } else {
                                $id = '';
                            }
                        }
                        if (!isset($page_config['forms'][$id])) {
                            $page_config['forms'][$id] = $pgcfg_form;
                        } else {
                            $page_config['forms'][$id] = qtranxf_merge_config($page_config['forms'][$id], $pgcfg_form);
                        }
                    }
                } else {
                    if (!isset($page_config[$key])) {
                        $page_config[$key] = $cfg;
                    } else {
                        $page_config[$key] = qtranxf_merge_config($page_config[$key], $cfg);
                    }
                }
            }
        }
    }
    //qtranxf_dbg_log('qtranxf_parse_page_config: $page_configs: ', $page_configs);
    foreach ($page_configs as $post_type_key => &$page_config) {
        if (!empty($post_type_key)) {
            //qtranxf_dbg_log('qtranxf_parse_page_config: $post_type_key="'.$post_type_key.'"; page_config: ', $page_config);
            if (!empty($page_config)) {
                //clean up 'fields'
                if (!empty($page_config['forms'])) {
                    foreach ($page_config['forms'] as $form_id => $frm) {
                        if (!isset($frm['fields'])) {
                            continue;
                        }
                        foreach ($frm['fields'] as $k => $f) {
                            if (qtranxf_set_field_jquery($f)) {
                                $page_config['forms'][$form_id]['fields'][$k] = $f;
                            }
                        }
                    }
                }
                foreach ($page_config as $k => $cfg) {
                    if (empty($cfg)) {
                        unset($page_config[$k]);
                    }
                }
            }
        }
        if (empty($page_config)) {
            unset($page_configs[$post_type_key]);
        }
    }
    if (isset($q_config['i18n-log-dir'])) {
        qtranxf_write_config_log($page_configs, 'by-post-type', $url_path, $url_query);
    }
    return $page_configs;
}
/**
 * @since 3.4
 */
function qtranxf_load_config_all($json_files, $custom_config)
{
    global $q_config;
    $nerr = isset($q_config['url_info']['errors']) ? count($q_config['url_info']['errors']) : 0;
    $cfg = qtranxf_load_config_files($json_files);
    $cfg = qtranxf_merge_config($cfg, $custom_config);
    $cfg = qtranxf_standardize_i18n_config($cfg);
    // store the errors permanently until an admin fixes them,
    // otherwise admin may not realise that not all configurations are loaded.
    if (!empty($q_config['url_info']['errors']) && $nerr != count($q_config['url_info']['errors'])) {
        //new errors occurred
        $errs = array_slice($q_config['url_info']['errors'], $nerr);
        update_option('qtranslate_config_errors', $errs);
    } else {
        delete_option('qtranslate_config_errors');
    }
    return $cfg;
}
function qtranxf_get_admin_page_config_post_type($post_type)
{
    global $q_config, $pagenow;
    static $page_config;
    //cache
    if (!is_null($page_config)) {
        //qtranxf_dbg_log('qtranxf_get_admin_page_config_post_type: cached: '.$pagenow.'; post_type: ', $post_type);
        return $page_config;
    }
    if ($q_config['editor_mode'] == QTX_EDITOR_MODE_RAW) {
        //qtranxf_dbg_log('qtranxf_get_admin_page_config_post_type: QTX_EDITOR_MODE_RAW: '.$pagenow.'; post_type: ', $post_type);
        $page_config = array();
        return $page_config;
    }
    if (!empty($q_config['post_type_excluded'])) {
        switch ($pagenow) {
            case 'post.php':
            case 'post-new.php':
                if (in_array($post_type, $q_config['post_type_excluded'])) {
                    //qtranxf_dbg_log('qtranxf_get_admin_page_config_post_type: post_type_excluded: pagenow: '.$pagenow.'; post_type: ', $post_type);
                    $page_config = array();
                    return $page_config;
                }
            default:
                break;
        }
    }
    //qtranxf_dbg_log('qtranxf_get_admin_page_config_post_type: pagenow: '.$pagenow.'; post_type: ', $post_type);
    $page_configs = qtranxf_get_admin_page_config();
    //$page_configs = apply_filters('i18n_admin_config_post_type', $page_configs, $post_type);
    //qtranxf_dbg_log('qtranxf_get_admin_page_config_post_type: $page_configs: ', $page_configs);
    $page_config = isset($page_configs['']) ? $page_configs[''] : array();
    if ($post_type) {
        foreach ($page_configs as $k => $cfg) {
            if (empty($k)) {
                continue;
            }
            if (isset($cfg['post_type'])) {
                $cfg_post_type = $cfg['post_type'];
                unset($cfg['post_type']);
            } else {
                $cfg_post_type = $k;
            }
            $matched = qtranxf_match_post_type($cfg_post_type, $post_type);
            //qtranxf_dbg_log('qtranxf_get_admin_page_config_post_type: $cfg: ', $cfg);
            //qtranxf_dbg_log('qtranxf_get_admin_page_config_post_type: $matched: ', $matched);
            if ($matched === false) {
                continue;
            }
            if (is_null($matched)) {
                $page_config = array();
                break;
            }
            $page_config = qtranxf_merge_config($page_config, $cfg);
        }
    }
    //qtranxf_dbg_log('qtranxf_get_admin_page_config_post_type: $page_config: ', $page_config);
    unset($page_config['filters']);
    if (!empty($page_config)) {
        //clean up empty items
        if (!empty($page_config['forms'])) {
            foreach ($page_config['forms'] as $form_id => &$frm) {
                if (!isset($frm['fields'])) {
                    continue;
                }
                foreach ($frm['fields'] as $k => $f) {
                    if (isset($f['encode']) && $f['encode'] == 'none') {
                        //unset($page_config['forms'][$form_id]['fields'][$k]);
                        unset($frm['fields'][$k]);
                    }
                    if ($post_type && !empty($f['post-type-excluded']) && preg_match('/' . $f['post-type-excluded'] . '/', $post_type)) {
                        unset($frm['fields'][$k]);
                    }
                }
                foreach ($frm as $k => $token) {
                    if (empty($token)) {
                        unset($frm[$k]);
                    }
                }
                if (empty($frm)) {
                    unset($page_config['forms'][$form_id]);
                }
            }
        }
        foreach ($page_config as $k => $cfg) {
            if (empty($cfg)) {
                unset($page_config[$k]);
            }
        }
    }
    if (!empty($page_config)) {
        $page_config['js'] = array();
        if (isset($page_config['js-conf'])) {
            foreach ($page_config['js-conf'] as $k => $js) {
                if (!isset($js['handle'])) {
                    $js['handle'] = $k;
                }
                $page_config['js'][] = $js;
            }
            unset($page_config['js-conf']);
        }
        $page_config['js'][] = array('handle' => 'qtranslate-admin-common', 'src' => './admin/js/common.min.js');
        if (isset($page_config['js-exec'])) {
            foreach ($page_config['js-exec'] as $k => $js) {
                if (!isset($js['handle'])) {
                    $js['handle'] = $k;
                }
                $page_config['js'][] = $js;
            }
            unset($page_config['js-exec']);
        }
        //make src to be relative to WP_CONTENT_DIR
        //$bnm = 'plugins/'.qtranxf_plugin_dirname();
        $bnm = qtranxf_plugin_dirname_from_wp_content();
        $content_dir = trailingslashit(WP_CONTENT_DIR);
        foreach ($page_config['js'] as $k => $js) {
            if (!isset($js['src'])) {
                continue;
            }
            $src = $js['src'];
            if ($src[0] == '.' && ($src[1] == '/' || $src[1] == DIRECTORY_SEPARATOR)) {
                $page_config['js'][$k]['src'] = $bnm . substr($src, 1);
            } else {
                if (file_exists($content_dir . $src)) {
                    continue;
                }
                //from WP_CONTENT_DIR as expected
                $fp = dirname($bnm) . '/' . $src;
                //from 'plugins' folder
                if (file_exists($content_dir . $fp)) {
                    $page_config['js'][$k]['src'] = $fp;
                    continue;
                }
                $fp = $bnm . '/' . $src;
                //from this plugin folder
                if (file_exists($content_dir . $fp)) {
                    $page_config['js'][$k]['src'] = $fp;
                    continue;
                }
                if (file_exists($src)) {
                    //absolute path was given
                    if (qtranxf_startsWith($src, $content_dir)) {
                        $fp = substr($src, strlen($content_dir));
                        $page_config['js'][$k]['src'] = $fp;
                        continue;
                    }
                }
                unset($page_config['js'][$k]);
                qtranxf_error_log(sprintf(__('Could not find script file "%s" for handle "%s".', 'qtranslate'), $src, $js['handle']));
            }
        }
    }
    /*
     * Customize the $page_config for this admin request.
     * @param (array) $page_config 'admin_config', filtered for the current page.
     * @param (string) $pagenow value of WordPress global variable $pagenow.
     * @param (string) $url_query query part of URL without '?', sanitized version of $_SERVER['QUERY_STRING'].
     * @param (string) $post_type type of post serving on the current page, or null if not applicable.
     */
    //$page_config = apply_filters('i18n_admin_page_config', $page_config, $pagenow, $url_query, $post_type);
    //qtranxf_dbg_log('qtranxf_get_admin_page_config_post_type: $pagenow='.$pagenow.'; $url_query='.$q_config['url_info']['query'].'; $post_type='.$post_type.'; $page_config: ',qtranxf_json_encode($page_config));
    qtranxf_write_config_log($page_config, '', $pagenow, '', $post_type);
    return $page_config;
}