{$ax['no_way']}

\n"; exit; } function checkTheme(&$themeDefs) { //check & complete theme global $defSaS, $set; $diffArr = array_diff_key($themeDefs,$defSaS); foreach ($diffArr as $k => $v) { //delete unknown keys-value pairs unset($themeDefs[$k]); } $diffArr = array_diff_key($defSaS,$themeDefs); foreach ($diffArr as $k => $v) { //add missing keys-value pairs if ($k[0] != '0') { $themeDefs[$k] = $defSaS[$k]; } } if (empty($themeDefs['THEME'])) { $themeDefs['THEME'] = $set['calendarTitle']; } } function validateTheme(&$themeDefs) {//validate theme - non-color values $errArr = array(); foreach ($themeDefs as $key => &$value) { $value = trim($value); if ($key[0] == 'F') { //font family $errArr[$key] = !preg_match('%^(([a-z]{3,20}|"[a-z\s]{3,20}"),\s*){1,2}[a-z-]{3,20}$%i',$value) ? " class='inputError'" : ''; } elseif ($key[0] == 'P') { //font size px $errArr[$key] = !preg_match('%^1[0-9]$%',$value) ? " class='inputError'" : ''; } elseif ($key[0] == 'M') { //font size em $errArr[$key] = !preg_match('%^(0\.[5-9]|1(\.[0-9])?)$%',$value) ? " class='inputError'" : ''; } elseif ($key == 'sTbSw') { //shadow $errArr[$key] = !preg_match('%^[0-1]$%',$value) ? " class='inputError'" : ''; } elseif ($key == 'sCtOf') { //content offset $errArr[$key] = !preg_match('%^\d\d?$%',$value) ? " class='inputError'" : ''; } } return $errArr; } function getTheme($themeFile) { //get theme from file $themeDefs = array(); $styles = file($themeFile,FILE_SKIP_EMPTY_LINES); foreach($styles as $style) { $style = trim($style); if (preg_match('~^"([A-Za-z0-9]{5})"\s?=>\s?"(.{3,})",~',trim($style),$matches)) { $themeDefs[$matches[1]] = $matches[2]; } } checkTheme($themeDefs); //check against master $defSaS - unset unknown / add missing return $themeDefs; } function putTheme($themeDefs,$targetFile) { //put theme in file global $lcV, $defSaS, $set, $ax; if (empty($themeDefs['THEME'])) { $themeDefs['THEME'] = $set['calendarTitle']; } $themeFile = " $value) { if ($key[0] == '0') { //comment if ($key[2] == '0') { //heading $themeFile .= "\n\n/*====== {$value} ======*/\n"; } else { $themeFile .= "\n//{$value}\n"; } continue; } $value = array_key_exists($key,$themeDefs) ? $themeDefs[$key] : $value; $k4 = 'sty_'.substr($key,1,4); $themeFile .= "\"{$key}\" => \"{$value}\",".($k4 != 'sty_HEME' ? " //{$ax[$k4]}" : '')."\n"; } $nob = file_put_contents("./css/{$targetFile}",$themeFile.");\n?>"); return $nob ? true : false; } function loadTheme() { //load theme from database $themeDefs = array(); $stH = stPrep("SELECT name,value FROM `styles`"); stExec($stH,null); while ($row = $stH->fetch(PDO::FETCH_ASSOC)) { $themeDefs[$row['name']] = $row['value']; } checkTheme($themeDefs); //check against master $defSaS - unset unknown / add missing return $themeDefs; } function storeTheme($themeDefs) { //store theme in database createDbTable("stylesX",1); //create temp table dbTransaction('begin'); $stH = stPrep("INSERT INTO `stylesX` (`name`,`value`) VALUES (?,?)"); foreach($themeDefs as $key => $value) { stExec($stH,array($key,$value)); } dbTransaction('commit'); $stH = dbQuery("SELECT COUNT(*) FROM `stylesX`"); $row = $stH->fetch(PDO::FETCH_NUM); if ($row[0] != count($themeDefs)) { return false; } $stH = null; //release statement handle dbQuery("DROP TABLE `styles`"); dbQuery("ALTER TABLE `stylesX` RENAME TO `styles`"); return true; } //program start //initialize $e = array(); //error array $errors = 0; //number of errors $buDone = isset($_POST['buD']) ? $_POST['buD'] : false; //backup done? $fSaS = array(); //init if (isset($_POST['prev']) or isset($_POST['save']) or isset($_POST['bkup']) or isset($_POST['close'])) { //fill pSaS array with form field styles foreach ($defSaS as $key => $void) { //get posted styles & settings if ($key[0] == '0') { continue; } //skip comment $fSaS[$key] = trim($_POST[$key]); } } else { $fSaS = loadTheme(); //load theme from database } $e = validateTheme($fSaS); foreach ($e as $value) { if (!empty($value)) $errors++; } //init $prevBut = $ax['sty_preview_theme']; $prevTit = $ax['sty_preview_theme_title']; if (isset($_POST['prev']) and !$errors) { //create preview theme file and show in calendar if (empty($_SESSION['theme'])) { putTheme($fSaS,'lctheme_prev.php'); $_SESSION['theme'] = 'lctheme_prev.php'; //use lctheme_prev file $msg = $ax['sty_theme_previewed']; $prevBut = $ax['sty_stop_preview']; $prevTit = $ax['sty_stop_preview_title']; } else { unset($_SESSION['theme']); //back to db version } echo "\n\n"; //refresh calendar } if (isset($_POST['save']) and !$errors) { //save/store posted theme if (!$buDone) { //first Save since page opened: backup $tempTheme = loadTheme(); //load theme from database putTheme($tempTheme,'theme'.date('Ymd-His').'.abak'); //save theme to bak file $buDone = true; //backup made } storeTheme($fSaS); //store in db $_SESSION['theme'] = ''; //set $_SESSION['theme'] to force a refresh of styles (see header.php) echo "\n\n"; //refresh calendar $msg = $ax['sty_theme_saved']; } if (isset($_POST['bkup']) and !$errors) { //backup current theme file $tempTheme = loadTheme(); //load theme from database $fName = 'theme'.date('Ymd-His').'.mbak'; putTheme($tempTheme,$fName); //save theme to bak file $buDone = true; //backup made $msg = $ax['sty_theme_backedup'].' '.$fName; } if (!empty($_POST['rest']) and !$errors) { //restore theme from file if (strtolower(substr($_POST['rest'],0,6)) == 'luxcal') { //restore LuxCal defaults $fSaS = array(); checkTheme($fSaS); //fill with $defSaS } else { //restore from theme file $fName = "./css/{$_POST['rest']}"; $fSaS = getTheme($fName); } $msg = $ax['sty_theme_restored1'].' '.$_POST['rest'].'. '.$ax['sty_theme_restored2']; } if (!empty($_POST['close'])) { //close window $tempSaS = loadTheme(); //load theme from database $diff = array_diff_assoc($tempSaS,$fSaS); //compare db and sceen values if (!$diff) { echo "\n\n"; //close } else { echo "\n\n"; //warn } } if ($errors) { $msg = "{$ax['sty_number_of_errors']}: {$errors} ({$ax['sty_bgnd_highlighted']})"; } $eClass = $errors ? 'error' : 'warning'; echo "

".(($msg) ? $msg : $ax['sty_css_intro'])."

\n"; //display form fields echo "
"; //display buttons echo "
  "; if (empty($_SESSION['theme'])) { //no preview mode echo "  \n"; echo "  \n"; $fNames = array(); //init $dirScan = scandir('./css'); foreach($dirScan as $fName) { if (substr($fName,0,5) == 'theme') { $fNames[] = $fName; } } echo "  \n"; echo "\n"; } echo "

{$ax['sty_theme_title']}:
"; echo "
"; echo "
{$ax['sty_general']}
{$ax['sty_bgtx_colors']}{$ax['sty_background']}{$ax['sty_text']}{$ax['sty_example']}
{$ax['sty_XXXX']}:
{$ax['sty_TBAR']}:
{$ax['sty_BHAR']}:
{$ax['sty_BUTS']}:
{$ax['sty_DROP']}:
{$ax['sty_XWIN']}:
{$ax['sty_INBX']}:
{$ax['sty_OVBX']}:
{$ax['sty_FFLD']}:
{$ax['sty_CONF']}:
{$ax['sty_WARN']}:
{$ax['sty_ERRO']}:
{$ax['sty_HLIT']}:
 
{$ax['sty_bord_colors']}{$ax['sty_color']}{$ax['sty_example']}
{$ax['sty_XXXX']}:
{$ax['sty_OVBX']}:
{$ax['sty_BUTH']}:
{$ax['sty_fontfam_sizes']} (10-19px / 0.5-1.9em)
{$ax['sty_FXXX']}:
{$ax['sty_SXXX']}: px
{$ax['sty_TBAR']}: px
{$ax['sty_PGTL']}: px
{$ax['sty_THDL']}: px
{$ax['sty_THDM']}: em
{$ax['sty_DTHD']}: em
{$ax['sty_SNHD']}: em
{$ax['sty_OVBX']}: em
{$ax['sty_FFLD']}: em
{$ax['sty_BUTS']}: em
{$ax['sty_PWIN']}: em
{$ax['sty_SMAL']}: em
 
{$ax['sty_miscel']}
{$ax['sty_TbSw']}:
{$ax['sty_CtOf']} (0-99): px
\n"; echo "
{$ax['sty_grid_views']}
{$ax['sty_bgtx_colors']}{$ax['sty_background']}{$ax['sty_text']}{$ax['sty_example']}
{$ax['sty_GCTH']}:
{$ax['sty_GTFD']}:
{$ax['sty_GWTC']}:
{$ax['sty_GWD1']}:
{$ax['sty_GWD2']}:
{$ax['sty_GWE1']}:
{$ax['sty_GWE2']}:
{$ax['sty_GOUT']}:
{$ax['sty_GTOD']}:
{$ax['sty_GSEL']}:
{$ax['sty_LINK']}:
{$ax['sty_CHBX']}:
 
{$ax['sty_bord_colors']}{$ax['sty_color']}{$ax['sty_example']}
{$ax['sty_GTOD']}:
{$ax['sty_GSEL']}:
{$ax['sty_font_sizes']} (0.5-1.9em)
{$ax['sty_EVTI']}: em
\n"; echo "
{$ax['sty_hover_boxes']}
{$ax['sty_bgtx_colors']}{$ax['sty_background']}{$ax['sty_text']}{$ax['sty_example']}
{$ax['sty_HNOR']}:
{$ax['sty_HPRI']}:
{$ax['sty_HREP']}:
 
{$ax['sty_bord_colors']}{$ax['sty_color']}{$ax['sty_example']}
{$ax['sty_HNOR']}:
{$ax['sty_HPRI']}:
{$ax['sty_HREP']}:
{$ax['sty_font_sizes']} (0.5-1.9em)
{$ax['sty_POPU']}: em
\n"; ?>