function qtranxf_admin_loadConfig()
{
    global $q_config, $qtranslate_options;
    qtranxf_admin_set_default_options($qtranslate_options);
    foreach ($qtranslate_options['admin']['int'] as $nm => $def) {
        qtranxf_load_option($nm, $def);
    }
    foreach ($qtranslate_options['admin']['bool'] as $nm => $def) {
        qtranxf_load_option_bool($nm, $def);
    }
    foreach ($qtranslate_options['admin']['str'] as $nm => $def) {
        qtranxf_load_option($nm, $def);
    }
    foreach ($qtranslate_options['admin']['text'] as $nm => $def) {
        qtranxf_load_option($nm, $def);
    }
    foreach ($qtranslate_options['admin']['array'] as $nm => $def) {
        qtranxf_load_option_array($nm, $def);
    }
    if (empty($q_config['admin_config'])) {
        require_once QTRANSLATE_DIR . '/admin/qtx_admin_options_update.php';
        qtranxf_update_i18n_config();
    }
    /**
     * Opportunity to load additional admin features.
     */
    do_action('qtranslate_admin_loadConfig');
    qtranxf_add_conf_filters();
}
function qtranxf_admin_loadConfig()
{
    global $q_config, $qtranslate_options;
    qtranxf_admin_set_default_options($qtranslate_options);
    foreach ($qtranslate_options['admin']['int'] as $nm => $def) {
        qtranxf_load_option($nm, $def);
    }
    foreach ($qtranslate_options['admin']['bool'] as $nm => $def) {
        qtranxf_load_option_bool($nm, $def);
    }
    foreach ($qtranslate_options['admin']['str'] as $nm => $def) {
        qtranxf_load_option($nm, $def);
    }
    foreach ($qtranslate_options['admin']['text'] as $nm => $def) {
        qtranxf_load_option($nm, $def);
    }
    foreach ($qtranslate_options['admin']['array'] as $nm => $def) {
        qtranxf_load_option_array($nm, $def);
    }
    if (empty($q_config['admin_config'])) {
        require_once QTRANSLATE_DIR . '/admin/qtx_admin_options_update.php';
        qtranxf_update_i18n_config();
    }
    // Set Admin Sections Names
    $q_config['admin_sections'] = array();
    $admin_sections =& $q_config['admin_sections'];
    $admin_sections['general'] = __('General', 'qtranslate');
    //General Settings
    $admin_sections['advanced'] = __('Advanced', 'qtranslate');
    //Advanced Settings
    do_action('qtranslate_admin_loadConfig');
    $admin_sections['integration'] = __('Integration', 'qtranslate');
    //Custom Integration
    $admin_sections['import'] = __('Import', 'qtranslate') . '/' . __('Export', 'qtranslate');
    $admin_sections['languages'] = __('Languages', 'qtranslate');
    //always last section
    qtranxf_add_admin_filters();
}
function qtranxf_loadConfig()
{
    global $qtranslate_options, $q_config;
    qtranxf_set_default_options($qtranslate_options);
    $q_config = array();
    qtranxf_load_option_func('default_language');
    qtranxf_load_option_array('enabled_languages');
    qtranxf_load_option_flag_location('flag_location');
    foreach ($qtranslate_options['front']['int'] as $nm => $def) {
        qtranxf_load_option($nm, $def);
    }
    //qtranxf_dbg_log('qtranxf_loadConfig: $q_config[use_strftime]: ',$q_config['use_strftime']);
    if ($q_config['use_strftime'] != QTX_DATE_WP && qtranxf_windows_os()) {
        $q_config['use_strftime'] = QTX_DATE_WP;
    }
    qtranxf_load_languages_enabled();
    foreach ($qtranslate_options['front']['bool'] as $nm => $def) {
        qtranxf_load_option_bool($nm, $def);
    }
    foreach ($qtranslate_options['front']['str'] as $nm => $def) {
        qtranxf_load_option($nm, $def);
    }
    foreach ($qtranslate_options['front']['text'] as $nm => $def) {
        qtranxf_load_option($nm, $def);
    }
    foreach ($qtranslate_options['front']['array'] as $nm => $def) {
        qtranxf_load_option_array($nm, $def);
    }
    qtranxf_load_option_array('term_name', array());
    if ($q_config['filter_options_mode'] == QTX_FILTER_OPTIONS_LIST) {
        qtranxf_load_option_array('filter_options', QTX_FILTER_OPTIONS_DEFAULT);
    }
    $url_mode = $q_config['url_mode'];
    // check for invalid permalink/url mode combinations
    if (qtranxf_is_permalink_structure_query()) {
        switch ($url_mode) {
            case QTX_URL_QUERY:
            case QTX_URL_DOMAIN:
            case QTX_URL_DOMAINS:
                break;
            default:
                $q_config['url_mode'] = $url_mode = QTX_URL_QUERY;
                break;
        }
    }
    switch ($url_mode) {
        case QTX_URL_DOMAINS:
            $q_config['domains'] = array();
            qtranxf_load_option_array('domains');
            //qtranxf_dbg_echo('domains loaded: ',$q_config['domains']);
            foreach ($q_config['enabled_languages'] as $lang) {
                if (isset($q_config['domains'][$lang])) {
                    continue;
                }
                $homeinfo = qtranxf_get_home_info();
                $q_config['domains'][$lang] = $lang . '.' . $homeinfo['host'];
            }
            $q_config['disable_client_cookies'] = true;
            $q_config['hide_default_language'] = false;
            break;
        case QTX_URL_QUERY:
        case QTX_URL_PATH:
            $q_config['disable_client_cookies'] = false;
            qtranxf_load_option_bool('disable_client_cookies');
            break;
        case QTX_URL_DOMAIN:
        default:
            $q_config['disable_client_cookies'] = true;
            break;
    }
    $ignore_file_types = get_option('qtranslate_ignore_file_types');
    $val = explode(',', QTX_IGNORE_FILE_TYPES);
    if (!empty($ignore_file_types)) {
        $vals = preg_split('/[\\s,]+/', strtolower($ignore_file_types), null, PREG_SPLIT_NO_EMPTY);
        foreach ($vals as $v) {
            if (empty($v)) {
                continue;
            }
            if (in_array($v, $val)) {
                continue;
            }
            $val[] = $v;
        }
    }
    $q_config['ignore_file_types'] = $val;
    if (empty($q_config['front_config'])) {
        //todo this should be granulated to load only what is needed
        require_once QTRANSLATE_DIR . '/admin/qtx_activation_hook.php';
        require_once QTRANSLATE_DIR . '/admin/qtx_admin_options_update.php';
        qtranxf_update_i18n_config();
    }
    /**
     * Opportunity to load additional front-end features.
     */
    do_action('qtranslate_loadConfig');
}
function qtranxf_updateSettings()
{
    global $qtranslate_options, $q_config;
    $errors =& $q_config['url_info']['errors'];
    // update front settings
    /**
     * Opportunity to prepare special custom settings update on sub-plugins
     */
    do_action('qtranslate_update_settings_pre');
    // special cases handling for front options
    qtranxf_updateSetting('default_language', QTX_LANGUAGE);
    //enabled_languages are not changed at this place
    qtranxf_updateSettingFlagLocation('flag_location');
    qtranxf_updateSettingIgnoreFileTypes('ignore_file_types');
    $_POST['language_name_case'] = isset($_POST['camel_case']) ? '0' : '1';
    // special cases handling for front options - end
    foreach ($qtranslate_options['front']['int'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_INTEGER, $def);
    }
    qtranxf_updateSettingDateI18N('date_i18n');
    foreach ($qtranslate_options['front']['bool'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_BOOLEAN, $def);
    }
    qtranxf_updateSetting('qtrans_compatibility', QTX_BOOLEAN);
    foreach ($qtranslate_options['front']['str'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_STRING, $def);
    }
    foreach ($qtranslate_options['front']['text'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_TEXT, $def);
    }
    foreach ($qtranslate_options['front']['array'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_ARRAY, $def);
    }
    qtranxf_updateSetting('filter_options', QTX_ARRAY);
    switch ($q_config['url_mode']) {
        case QTX_URL_DOMAIN:
        case QTX_URL_DOMAINS:
            $q_config['disable_client_cookies'] = true;
            break;
        case QTX_URL_QUERY:
        case QTX_URL_PATH:
        default:
            qtranxf_updateSetting('disable_client_cookies', QTX_BOOLEAN);
            break;
    }
    $domains = isset($q_config['domains']) ? $q_config['domains'] : array();
    foreach ($q_config['enabled_languages'] as $lang) {
        $id = 'language_domain_' . $lang;
        if (!isset($_POST[$id])) {
            continue;
        }
        $domain = preg_replace('#^/*#', '', untrailingslashit(trim($_POST[$id])));
        //qtranxf_dbg_log('qtranxf_updateSettings: domain['.$lang.']: ',$domain);
        $domains[$lang] = $domain;
    }
    if (!empty($domains) && (!isset($q_config['domains']) || !qtranxf_array_compare($q_config['domains'], $domains))) {
        $q_config['domains'] = $domains;
        qtranxf_update_option('domains');
    }
    // update admin settings
    //special cases handling for admin options
    if (isset($_POST['json_config_files'])) {
        //verify that files are loadable
        $json_config_files_post = sanitize_text_field(stripslashes($_POST['json_config_files']));
        $json_files = preg_split('/[\\s,]+/', $json_config_files_post, null, PREG_SPLIT_NO_EMPTY);
        if (empty($json_files)) {
            $_POST['config_files'] = array();
            unset($_POST['json_config_files']);
        } else {
            $nerr = isset($q_config['url_info']['errors']) ? count($q_config['url_info']['errors']) : 0;
            $cfg = qtranxf_load_config_files($json_files);
            if (!empty($q_config['url_info']['errors']) && $nerr != count($q_config['url_info']['errors'])) {
                //new errors occurred
                $_POST['json_config_files'] = implode(PHP_EOL, $json_files);
                remove_action('admin_notices', 'qtranxf_admin_notices_errors');
                if ($json_files == $q_config['config_files']) {
                    //option is not changed, apparently something happened to files, then make the error permanent
                    update_option('qtranslate_config_errors', array_slice($q_config['url_info']['errors'], $nerr));
                }
            } else {
                $_POST['config_files'] = implode(PHP_EOL, $json_files);
                unset($_POST['json_config_files']);
                delete_option('qtranslate_config_errors');
            }
        }
    }
    if (isset($_POST['json_custom_i18n_config'])) {
        //verify that JSON string can be parsed
        $cfg_json = sanitize_text_field(stripslashes($_POST['json_custom_i18n_config']));
        if (empty($cfg_json)) {
            $_POST['custom_i18n_config'] = array();
        } else {
            $cfg = json_decode($cfg_json, true);
            if ($cfg) {
                $_POST['custom_i18n_config'] = $cfg;
                unset($_POST['json_custom_i18n_config']);
            } else {
                $_POST['json_custom_i18n_config'] = stripslashes($_POST['json_custom_i18n_config']);
                $errors[] = sprintf(__('Cannot parse JSON code in the field "%s".', 'qtranslate'), __('Custom Configuration', 'qtranslate'));
            }
        }
    }
    if ($_POST['highlight_mode'] != QTX_HIGHLIGHT_MODE_CUSTOM_CSS) {
        $_POST['highlight_mode_custom_css'] = '';
    }
    if ($_POST['lsb_style'] != $q_config['lsb_style']) {
        $_POST['lsb_style_wrap_class'] = '';
        $_POST['lsb_style_active_class'] = '';
    }
    qtranxf_parse_post_type_excluded();
    //special cases handling for admin options - end
    do_action('qtranslate_update_settings_admin');
    foreach ($qtranslate_options['admin']['int'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_INTEGER, $def);
    }
    foreach ($qtranslate_options['admin']['bool'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_BOOLEAN, $def);
    }
    foreach ($qtranslate_options['admin']['str'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_STRING, $def);
    }
    foreach ($qtranslate_options['admin']['text'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_TEXT, $def);
    }
    foreach ($qtranslate_options['admin']['array'] as $nm => $def) {
        qtranxf_updateSetting($nm, QTX_ARRAY, $def);
    }
    if (empty($_POST['json_config_files'])) {
        //only update if config files parsed successfully
        qtranxf_update_i18n_config();
    }
    $q_config['i18n-cache'] = array();
    //clear i18n-config cache
    /**
     * Opportunity to update special custom settings on sub-plugins
     */
    do_action('qtranslate_update_settings');
}