frm = new e_form(); //enable inner tabindex counter
if (isset($_POST['upload'])) {
$this -> themeUpload();
}
$this -> themeArray = $this -> getThemes();
foreach($_POST as $key => $post)
{
if(strstr($key,"preview"))
{
// $this -> id = str_replace("preview_", "", $key);
$this -> id = key($post);
$this -> themePreview();
}
if(strstr($key,"selectmain"))
{
// $this -> id = str_replace("selectmain_", "", $key);
$this -> id = key($post);
$this -> setTheme();
}
if(strstr($key,"selectadmin"))
{
$this -> id = key($post);
$this -> setAdminTheme();
$this -> refreshPage('admin');
}
}
if(isset($_POST['submit_adminstyle']))
{
$this -> id = $_POST['curTheme'];
$this -> setAdminStyle();
}
if(isset($_POST['submit_style']))
{
$this -> id = $_POST['curTheme'];
$this -> setStyle();
$this -> SetCustomPages($_POST['custompages']);
}
}
function getThemes($mode=FALSE)
{
$themeArray = array();
$tloop = 1;
$handle = opendir(e_THEME);
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != ".." && $file != "CVS" && $file != "templates" && is_dir(e_THEME.$file) && is_readable(e_THEME.$file."/theme.php") )
{
if($mode == "id")
{
$themeArray[$tloop] = $file;
}
else
{
$themeArray[$file]['id'] = $tloop;
}
$tloop++;
$STYLESHEET = FALSE;
if(!$mode)
{
$handle2 = opendir(e_THEME.$file."/");
while (false !== ($file2 = readdir($handle2))) // Read files in theme directory
{
if ($file2 != "." && $file2 != ".." && $file != "CVS" && !is_dir(e_THEME.$file."/".$file2))
{
$themeArray[$file]['files'][] = $file2;
if(strstr($file2, "preview."))
{
$themeArray[$file]['preview'] = e_THEME.$file."/".$file2;
}
if(strstr($file2, "css") && !strstr($file2, "menu.css") && strpos($file2, "e_") !== 0 && strpos($file2, "admin_") !== 0)
{
/* get information string for css file */
$fp=fopen(e_THEME.$file."/".$file2, "r");
$cssContents = fread ($fp, filesize(e_THEME.$file."/".$file2));
fclose($fp);
$nonadmin = preg_match('/\* Non-Admin(.*?)\*\//', $cssContents) ? true : false;
preg_match('/\* info:(.*?)\*\//', $cssContents, $match);
$match[1]=varset($match[1],'');
$themeArray[$file]['css'][] = array("name" => $file2, "info" => $match[1], "nonadmin" => $nonadmin);
if($STYLESHEET)
{
$themeArray[$file]['multipleStylesheets'] = TRUE;
}
else
{
$STYLESHEET = TRUE;
}
}
}
} // end while..
closedir($handle2);
// Load Theme information and merge with existing array. theme.xml (0.8 themes) is given priority over theme.php (0.7).
if(in_array("theme.xml",$themeArray[$file]['files']) )
{
$themeArray[$file] = array_merge($themeArray[$file], $this->parse_theme_xml($file));
}
elseif(in_array("theme.php",$themeArray[$file]['files']))
{
$themeArray[$file] = array_merge($themeArray[$file], $this->parse_theme_php($file));
}
}
}
}
closedir($handle);
/*
echo "
";
echo "";
print_r($themeArray['jayya']);
echo " ";
echo " | ";
echo "";
print_r($themeArray['e107v4a']);
echo " ";
echo " |
";*/
return $themeArray;
}
function themeUpload()
{
if (!$_POST['ac'] == md5(ADMINPWCHANGE)) {
exit;
}
global $ns;
extract($_FILES);
if(!is_writable(e_THEME))
{
$ns->tablerender(TPVLAN_16, TPVLAN_20);
}
else
{
require_once(e_HANDLER."upload_handler.php");
$fileName = $file_userfile['name'][0];
$fileSize = $file_userfile['size'][0];
$fileType = $file_userfile['type'][0];
if(strstr($file_userfile['type'][0], "gzip")) {
$fileType = "tar";
} else if (strstr($file_userfile['type'][0], "zip")) {
$fileType = "zip";
} else {
$ns->tablerender(TPVLAN_16, TPVLAN_17);
require_once("footer.php");
exit;
}
if ($fileSize) {
$uploaded = file_upload(e_THEME);
$archiveName = $uploaded[0]['name'];
if($fileType == "zip") {
require_once(e_HANDLER."pclzip.lib.php");
$archive = new PclZip(e_THEME.$archiveName);
$unarc = ($fileList = $archive -> extract(PCLZIP_OPT_PATH, e_THEME, PCLZIP_OPT_SET_CHMOD, 0666));
} else {
require_once(e_HANDLER."pcltar.lib.php");
$unarc = ($fileList = PclTarExtract($archiveName, e_THEME));
}
if(!$unarc) {
if($fileType == "zip") {
$error = TPVLAN_46." '".$archive -> errorName(TRUE)."'";
} else {
$error = TPVLAN_47.PclErrorString().", ".TPVLAN_48.intval(PclErrorCode());
}
$ns->tablerender(TPVLAN_16, TPVLAN_18." ".$archiveName." ".$error);
require_once("footer.php");
exit;
}
$folderName = substr($fileList[0]['stored_filename'], 0, (strpos($fileList[0]['stored_filename'], "/")));
$ns->tablerender(TPVLAN_16, "".TPVLAN_19."
");
@unlink(e_THEME.$archiveName);
}
}
}
function showThemes($mode='main')
{
global $ns, $pref;
echo "\n";
}
function renderThemeInfo($theme)
{
// TO-DO : This SHOULD be loaded by ajax before release.
global $pref;
$author = ($theme['email'] ? "".$theme['author']."" : $theme['author']);
$website = ($theme['website'] ? "".$theme['website']."" : "");
$preview = "".($theme['preview'] ? "" : "")."";
$text = "".TPVLAN_7."
";
$text .= $author ? "".TPVLAN_4.": | ".$author." |
" : "";
$text .= $website ? "".TPVLAN_5.": | ".$website." |
" : "";
$text .= $theme['date'] ? "".TPVLAN_6.": | ".$theme['date']." |
" : "";
$text .= "".TPVLAN_49.": |
XHTML ";
$text .= ($theme['xhtmlcompliant']) ? ADMIN_TRUE_ICON : ADMIN_FALSE_ICON;
$text .= " CSS ";
$text .= ($theme['csscompliant']) ? ADMIN_TRUE_ICON : ADMIN_FALSE_ICON;
$text .= " |
";
if($theme['layouts']) // New in 0.8 WORK IN PROGRESS ----
{
$itext .= "
".TPVLAN_50.": |
|
";
}
$text .= "".TPVLAN_22.": | ";
foreach($theme['css'] as $val)
{
$text .= $val['name']." ";
}
$text .= " |
";
$text .= $itext."
";
$text .= "";
return $text;
}
function renderThemeConfig() // process custom theme configuration - TODO.
{
global $frm;
$confile = e_THEME.$this->id."/".$this->id."_config.php";
if(is_readable($confile))
{
include_once($confile);
if(function_exists($this->id."_config"))
{
$var = call_user_func($this->id."_config");
foreach($var as $val)
{
$text .= "".$val['caption'].": | ".$val['html']." |
";
}
return $text;
}
}
}
function setThemeConfig()
{
$confile = e_THEME.$this->id."/".$this->id."_config.php";
include($confile);
if(function_exists($this->id."_process"))
{
$text = call_user_func($this->id."_process");
}
return $text;
}
function renderTheme($mode=FALSE, $theme)
{
/*
mode = 0 :: normal
mode = 1 :: selected site theme
mode = 2 :: selected admin theme
*/
global $ns, $pref;
$author = ($theme['email'] ? "".$theme['author']."" : $theme['author']);
$website = ($theme['website'] ? "".$theme['website']."" : "");
$preview = "".($theme['preview'] ? "" : "")."";
$previewbutton = (!$mode ? " " : "");
$main_icon = ($pref['sitetheme'] != $theme['path']) ? "\n" : ADMIN_TRUE_ICON;
$info_icon = "\n";
$preview_icon = "\n";
$admin_icon = ($pref['admintheme'] != $theme['path']) ? "\n" : ADMIN_TRUE_ICON;
$newpreview = "".($theme['preview'] ? "" : "")."";
if(!$mode) // Choose a Theme to Install.
{
// styles NEED to be put into style.css
$borderStyle = (($pref['sitetheme'] == $theme['path']) || ($pref['admintheme'] == $theme['path'])) ? "border:1px solid black" : "border:1px dotted silver;background-color:#DDDDDD";
$text = "
".$newpreview."
".$theme['name']." ".$theme['version']."
\n\n\n".$main_icon.$admin_icon.$info_icon.$preview_icon."\n\n
\n".$this->renderThemeInfo($theme)."
";
return $text;
}
$this->id = $theme['path'];
$menuPresetCount = 0;
foreach($theme['layouts'] as $key=>$val)
{
if($val['menuPresets'])
{
$menuPresetCount++;
}
}
$text = "
".$theme['name']."
";
if($mode == 2) // admin
{
$mainid = "selectmain[".$theme['id']."]";
$text .= $this->frm->admin_button('submit_adminstyle', TPVLAN_35, 'update');
$text .= $this->frm->admin_button($mainid, TPVLAN_10, 'submit');
}
else // main
{
$adminid = "selectadmin[".$theme['id']."]";
$text .= $this->frm->admin_button('submit_style', TPVLAN_35, 'update');
$text .= $this->frm->admin_button($adminid, TPVLAN_32, 'submit');
}
$text .= "";
$text .= "
\n";
return $text;
}
function renderPlugins($val)
{
$tmp = explode(",",$val);
$tmp = array_filter($tmp);
foreach($tmp as $plug)
{
$plug = trim($plug);
if(plugInstalled($plug))
{
$text .= $plug." ".ADMIN_TRUE_ICON;
}
else
{
$text .= "".$plug." ".ADMIN_FALSE_ICON;
}
$text .= " ";
}
return $text;
}
function refreshPage($page=e_QUERY)
{
header("Location: ".e_SELF."?".$page);
exit;
}
function themePreview()
{
echo "\n";
exit;
}
function showPreview()
{
include_lan(e_LANGUAGEDIR.e_LANGUAGE."/admin/lan_theme.php");
$text = "
".TPVLAN_1.".
";
global $ns;
$ns->tablerender(TPVLAN_2, $text);
}
function setTheme()
{
global $pref, $e107cache, $ns, $sql;
$themeArray = $this -> getThemes("id");
$pref['sitetheme'] = $themeArray[$this -> id];
$pref['themecss'] ='style.css';
$pref['sitetheme_deflayout'] = $this->findDefault($themeArray[$this -> id]);
$pref['sitetheme_layouts'] = is_array($this->themeArray[$pref['sitetheme']]['layouts']) ? $this->themeArray[$pref['sitetheme']]['layouts'] : array();
$pref['sitetheme_custompages'] = $this->themeArray[$pref['sitetheme']]['custompages'];
$sql -> db_Delete("menus", "menu_layout !='' ");
$e107cache->clear_sys();
save_prefs();
$this->theme_adminlog('01',$pref['sitetheme'].', '.$pref['themecss']);
$ns->tablerender("Admin Message", "
".TPVLAN_3." '".$themeArray[$this -> id]."'.
");
}
function findDefault($theme)
{
if(varset($_POST['layout_default']))
{
return $_POST['layout_default'];
}
$l = $this->themeArray[$theme];
if($l['layouts'])
{
foreach($l['layouts'] as $key=>$val)
{
if(isset($val['@attributes']['default']) && ($val['@attributes']['default'] == "true"))
{
return $key;
}
}
}
}
function setAdminTheme()
{
global $pref, $e107cache, $ns;
$themeArray = $this -> getThemes("id");
$pref['admintheme'] = $themeArray[$this -> id];
$pref['admincss'] = file_exists(THEME.'admin_style.css') ? 'admin_style.css' : 'style.css';
$e107cache->clear_sys();
save_prefs();
$this->theme_adminlog('02',$pref['admintheme'].', '.$pref['admincss']);
$ns->tablerender("Admin Message", "
".TPVLAN_40." '".$themeArray[$this -> id]."'.
");
// $this->showThemes('admin');
}
function setStyle()
{
global $pref, $e107cache, $ns, $sql;
$pref['themecss'] = $_POST['themecss'];
$pref['image_preload'] = $_POST['image_preload'];
$pref['sitetheme_deflayout'] = $_POST['layout_default'];
$e107cache->clear_sys();
save_prefs();
$custom_message = $this -> setThemeConfig();
$this->theme_adminlog('03',$pref['image_preload'].', '.$pref['themecss']);
$ns->tablerender(TPVLAN_36, "
".TPVLAN_37.".
".$custom_message."
");
}
function setAdminStyle()
{
global $pref, $e107cache, $ns;
$pref['admincss'] = $_POST['admincss'];
$pref['adminstyle'] = $_POST['adminstyle'];
$e107cache->clear_sys();
save_prefs();
$this->theme_adminlog('04',$pref['adminstyle'].', '.$pref['admincss']);
$ns->tablerender(TPVLAN_36, "
".TPVLAN_43.".
");
}
function SetCustomPages($array)
{
global $pref;
$key = key($array);
$pref['sitetheme_custompages'][$key] = array_filter(explode(" ",$array[$key]));
if($pref['sitetheme_deflayout'] == 'legacyCustom')
{
$pref['sitetheme_custompages']['legacyCustom'] = array();
}
save_prefs();
}
// Log event to admin log
function theme_adminlog($msg_num='00', $woffle='')
{
global $pref, $admin_log;
// if (!varset($pref['admin_log_log']['admin_banlist'],0)) return;
$admin_log->log_event('THEME_'.$msg_num,$woffle,E_LOG_INFORMATIVE,'');
}
function parse_theme_php($path)
{
$fp=fopen(e_THEME.$path."/theme.php", "r");
$themeContents = fread ($fp, filesize(e_THEME.$path."/theme.php"));
fclose($fp);
preg_match('/themename(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['name'] = varset($match[3],'');
preg_match('/themeversion(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['version'] = varset($match[3],'');
preg_match('/themeauthor(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['author'] = varset($match[3],'');
preg_match('/themeemail(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['email'] = varset($match[3],'');
preg_match('/themewebsite(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['website'] = varset($match[3],'');
preg_match('/themedate(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['date'] = varset($match[3],'');
preg_match('/themeinfo(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['info'] = varset($match[3],'');
preg_match('/xhtmlcompliant(\s*?=\s*?)(\S*?);/si', $themeContents, $match);
$xhtml = strtolower($match[2]);
$themeArray['xhtmlcompliant'] = ($xhtml == "true" ? true : false);
preg_match('/csscompliant(\s*?=\s*?)(\S*?);/si', $themeContents, $match);
$css = strtolower($match[2]);
$themeArray['csscompliant'] = ($css == "true" ? true : false);
/* preg_match('/CUSTOMPAGES(\s*?=\s*?)("|\')(.*?)("|\');/si', $themeContents, $match);
$themeArray['custompages'] = array_filter(explode(" ",$match[3]));*/
$themeContentsArray = explode("\n",$themeContents);
if (!$themeArray['name'])
{
unset($themeArray);
}
// echo "
".$path."
";
$lays['legacyDefault']['@attributes'] = array('title'=>'Default','preview'=>'','previewFull'=>'','plugins'=>'', 'default'=>'true');
foreach($themeContentsArray as $line)
{
if(strstr($line,"CUSTOMPAGES"))
{
eval(str_replace("$","\$",$line));
}
}
if(is_array($CUSTOMPAGES))
{
foreach($CUSTOMPAGES as $key=>$val)
{
$themeArray['custompages'][$key] = explode(" ",$val);
}
}
elseif($CUSTOMPAGES)
{
$themeArray['custompages']['legacyCustom'] = explode(" ",$CUSTOMPAGES);
$lays['legacyCustom']['@attributes'] = array('title'=>'Custom','preview'=>'','previewFull'=>'','plugins'=>'');
}
$themeArray['path'] = $path;
$themeArray['layouts'] = $lays;
return $themeArray;
}
function parse_theme_xml($path)
{
global $tp;
// loadLanFiles($path, 'admin'); // Look for LAN files on default paths
require_once(e_HANDLER.'xml_class.php');
$xml = new xmlClass;
$vars = $xml->loadXMLfile(e_THEME.$path.'/theme.xml', true, true);
$vars['name'] = varset($vars['@attributes']['name']);
$vars['version'] = varset($vars['@attributes']['version']);
$vars['date'] = varset($vars['@attributes']['date']);
$vars['compatibility'] = varset($vars['@attributes']['compatibility']);
$vars['email'] = varset($vars['author']['@attributes']['email']);
$vars['website'] = varset($vars['author']['@attributes']['url']);
$tmp = varset($vars['author']['@attributes']['name']);
$vars['author'] = $tmp;
$vars['info'] = $vars['description'];
$vars['xhtmlcompliant'] = (strtolower($vars['compliance']['@attributes']['xhtml']) == 'true' ? 1 : 0);
$vars['csscompliant'] = (strtolower($vars['compliance']['@attributes']['css']) == 'true' ? 1 : 0);
$vars['path'] = $path;
$vars['@attributes']['default'] = (strtolower($vars['@attributes']['default'])=='true') ? 1 : 0;
unset($vars['authorEmail'],$vars['authorUrl'],$vars['xhtmlCompliant'],$vars['cssCompliant'],$vars['description']);
// Compile layout information into a more usable format.
foreach($vars['layouts'] as $layout)
{
if(is_array($layout[0]))
{
foreach($layout as $key=>$val)
{
$name = $val['@attributes']['name'];
unset($val['@attributes']['name']);
$lays[$name] = $val;
if(isset($val['customPages']))
{
$custom[$name] = array_filter(explode(" ",$val['customPages']));
}
}
}
else
{
$name = $layout['@attributes']['name'];
unset($layout['@attributes']['name']);
$lays[$name] = $layout;
if(isset($val['customPages']))
{
$custom[$name] = array_filter(explode(" ",$layout['customPages']));
}
}
}
$vars['layouts'] = $lays;
$vars['path'] = $path;
$vars['custompages'] = $custom;
return $vars;
}
}
?>