{$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 "