| 
<?php
 if (!isset($adminindex)) {
 die("Abort." . __FILE__);
 }
 
 $oCfg=new confighandler("config_user");
 // $aUserCfg=$oCfg->get();
 $aTC = array();
 
 // ----------------------------------------------------------------------
 // actions
 // ----------------------------------------------------------------------
 
 if($sAppAction){
 $aResult=array();
 switch ($sAppAction){
 
 case 'updateconfig':
 $aRawCfg=json_decode($_POST['rawdata'], 1);
 if(!is_array($aRawCfg)){
 $oMsg->add($aLangTxt['AdminMessageSettings-update-error-no-json'] . '<button class="btn" onclick="javascript:history.back();">back</button>', 'error');
 } else {
 if (!$oCfg->set($aRawCfg)){
 $oMsg->add($aLangTxt['AdminMessageSettings-update-error'], 'error');
 } else {
 $oMsg->add($aLangTxt['AdminMessageSettings-update-ok'], 'success');
 }
 }
 break;
 
 default:
 $oMsg->add("SKIP: action $sAppAction is not implemented (yet).", 'error');
 }
 }
 
 // RESCAN CONFIG - repeated in inc_config.php
 $aUserCfg=$oCfg->get("config_user");
 $aCfg = array_merge($aDefaultCfg, $aUserCfg);
 
 
 foreach(array_keys($aUserCfg) as $sKey){
 if (!array_key_exists($sKey, $aDefaultCfg)){
 $oMsg->add(sprintf($aLangTxt['AdminMessageSettings-wrong-key'], $sKey) . " <pre>'$sKey': ".  json_encode($aUserCfg[$sKey])."</pre>", 'warning');
 }
 }
 
 
 // ----------------------------------------------------------------------
 // 2 tabs for raw data
 // ----------------------------------------------------------------------
 
 foreach (array(
 "config_user" => array("edit" => true),
 // "internal-config_default" => array("edit" => false),
 ) as $sCfgfile => $aSettings) {
 $myvar = $sCfgfile;
 $sData = file_get_contents(dirname(__DIR__) . '../../config/' . $sCfgfile . '.json');
 $sOut=$aSettings['edit']
 ? '<form class="form" method="post" action="'.getNewQs(array()).'">'
 . '<input name="appaction" value="updateconfig" type="hidden">'
 . '<input name="appconfig" value="'.$sCfgfile.'" type="hidden">'
 . '<textarea id="ta" name="rawdata" class="form-control raw" rows="15">' . htmlentities($sData) . '</textarea><br>'
 . '<button class="btn btn-primary" title="'.$aLangTxt['ActionOKHint'].'"'
 . '>'.$aCfg['icons']['actionOK'].$aLangTxt['ActionOK'].'</button>'
 . '</form>'
 : '<pre>' . htmlentities($sData) . '</pre>'
 ;
 
 $aTC[] = array(
 'tab' => $aCfg['icons']['tab_'.$myvar] . $myvar,
 'content' => '<h4>' . $aCfg['icons']['tab_'.$myvar] . $sCfgfile . '</h4>
 <div class="subh3">'
 . '<div class="hintbox">'
 . $aLangTxt['AdminHintRaw-' . $sCfgfile]
 . '</div>'
 . $sOut
 . '</div>
 '
 );
 
 }
 
 // ----------------------------------------------------------------------
 // tab settings that shows overrides
 // ----------------------------------------------------------------------
 $aCfgUser = $oCfg->get("config_user");
 
 
 // $myvar = 'overrides';
 $sTableId='tblCompareSettings';
 $sTable = '<table class="table datatable" id="'.$sTableId.'" style="width: 100%;"><thead>'
 . '<tr>'
 . '<th>' . $aLangTxt['AdminMenuSettings-var'] . '</th>'
 . '<th>' . $aLangTxt['AdminMenuSettings-description'] . '</th>'
 . '<th>' . $aLangTxt['AdminMenuSettings-uservalue'] . '</th>'
 . '<th>' . $aLangTxt['AdminMenuSettings-default'] . '</th>'
 . '</tr>'
 . '</thead>'
 . '<tbody>';
 foreach ($aDefaultCfg as $sKey => $val) {
 $value = '';
 $sClass = "default";
 $bHasUserCfg=array_key_exists($sKey, $aCfgUser);
 // genenerate new config
 $aNewCfg=$aCfgUser;
 
 if ($bHasUserCfg) {
 $sClass = "user";
 $value = $aCfgUser[$sKey];
 unset($aNewCfg[$sKey]);
 $sFormButton='<button class="btn btn-default" title="'.$aLangTxt['ActionResetToDefaultsHint'].' '.$sKey.'"'
 . '>'.$aCfg['icons']['actionReset'].$aLangTxt['ActionResetToDefaults'].'</button>';
 } else {
 $aNewCfg[$sKey]=$val;
 $sFormButton='<button class="btn btn-default" title="'.$aLangTxt['ActionAdd'].' '.$sKey.'"'
 . '>'.$aCfg['icons']['actionAdd'].$aLangTxt['ActionAdd'].'</button>';
 }
 if (!isset($aLangTxt['cfg-' . $sKey])) {
 $sClass = "error";
 }
 
 $sNewCfg=json_encode($aNewCfg);
 
 $sTable.='<tr class="' . $sClass . '">' . "\n"
 . '<td>' . $sKey . '</td>' . "\n"
 . '<td>' . (isset($aLangTxt['cfg-' . $sKey]) ? $aLangTxt['cfg-' . $sKey] : $aLangTxt['cfg-wrongitem'] ) . '</td>' . "\n"
 
 // --- show user config value
 . '<td>' . ($bHasUserCfg ? '<pre class="active">' . htmlentities(json_encode($aCfgUser[$sKey], (defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : false ))) . '</pre>' : '-' ) . '</td>' . "\n"
 
 // --- show default config and button
 . '<td><pre' . (!$bHasUserCfg ? ' class="default"': '' )
 . '>"'.$sKey.'": '.htmlentities(json_encode($val, (defined('JSON_PRETTY_PRINT') ? JSON_PRETTY_PRINT : false )))
 .($sNewCfg
 ?  '<form class="form" method="post" action="'.getNewQs(array()).'">'
 . '<input name="appaction" value="updateconfig" type="hidden">'
 . '<input name="appconfig" value="'.$sCfgfile.'" type="hidden">'
 . '<textarea id="ta" name="rawdata" class="form-control raw" rows="15" style="display: none;">' . htmlentities($sNewCfg) . '</textarea><br>'
 . $sFormButton
 . '</form>'
 : ''
 )
 . '</pre>'
 . '</td>' . "\n"
 . '</tr>' . "\n"
 ;
 }
 $sTable.='<tbody></table><div style="clear: both;"></div>';
 $aOptions = array_merge($aCfg['datatableOptions'], array(
 "bPaginate"=>false,"bLengthChange"=>false,"bFilter"=>true,"bSort"=>false,"bAutoWidth"=>false,"bStateSave"=>false
 ));
 
 // $sJsOnReady = '$("#' . $sTableId . '").dataTable('.json_encode($aOptions, 1).');';
 
 $aTC[] = array(
 'tab' => $aCfg['icons']['tab_Compare'] . $aLangTxt['AdminMenuSettingsCompare'],
 'content' => '<h4>' . $aCfg['icons']['tab_Compare'] . $aLangTxt["AdminMenuSettingsCompare"] . '</h4>
 <div class="subh3">'
 . '<div class="hintbox">'
 . $aLangTxt['AdminHintSettingsCompare']
 . '</div>'
 . $sTable
 . '</div>'
 );
 
 // ----------------------------------------------------------------------
 // output
 // ----------------------------------------------------------------------
 
 echo $oDatarenderer->renderTabbedContent($aTC);
 
 
 |