Detagging last release revision to merge in theme manager from Scribus 1.1.2
authorDan
Mon, 18 Feb 2008 16:28:27 -0500
changeset 431 ceff43bbc3d3
parent 430 ec90736b9cb9 (diff)
parent 429 36cec40d981a (current diff)
child 432 02d320f94ca6
child 433 c892b2013d3e
Detagging last release revision to merge in theme manager from Scribus
.hgtags
includes/pageutils.php
language/english/admin.json
language/english/core.json
language/english/user.json
plugins/PrivateMessages.php
plugins/SpecialAdmin.php
plugins/SpecialGroups.php
--- a/.hgtags	Mon Feb 18 16:18:27 2008 -0500
+++ b/.hgtags	Mon Feb 18 16:28:27 2008 -0500
@@ -13,4 +13,3 @@
 d409d7fcf6f8bc638e0282101fb823ccf3e29e59 release
 3395ecddd831ee2f0229ab3b4a1c9d69f0ab73d7 release
 d1a95497b68f765f6ca4ed816d07b20b13cee692 rebrand
-921bae9104b0dbef9bb09749c9fe7765fa305c4d release
--- a/includes/clientside/css/enano-shared.css	Mon Feb 18 16:18:27 2008 -0500
+++ b/includes/clientside/css/enano-shared.css	Mon Feb 18 16:28:27 2008 -0500
@@ -656,3 +656,60 @@
 div.nobordertop * {
   border-top-width: 0px;
 }
+
+/* Theme buttons in admin CP */
+
+div.themebutton {
+  width: 216px;
+  float: left;
+  background-position: center center;
+  background-repeat: no-repeat;
+  margin-right: 10px;
+  padding: 5px;
+  border: 1px solid #F0F0F0;
+}
+
+div.themebutton_theme_disabled {
+  background-color: #D84308;
+}
+
+div.themebutton_theme_system {
+  display: none;
+}
+
+div.themebutton a.tb-inner {
+  opacity: 0;
+  filter: alpha(opacity=0);
+  display: block;
+  height: 110px;
+  padding-top: 40px;
+  text-align: center;
+  font-size: 40px;
+  text-decoration: none;
+}
+div.themebutton_theme_system a.tb-inner {
+  font-size: 28px;
+  height: 100px;
+  padding-top: 50px;
+}
+div.themebutton a.tb-inner:hover {
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+  background-color: #ffffff;
+}
+div.themebutton a.tb-inner span.themename {
+  font-size: 8pt;
+  color: #606060;
+  display: block;
+}
+
+div.themebutton div.status {
+  opacity: 0.75;
+  filter: alpha(opacity=75);
+  background-image: url(../../../images/loading-big.gif);
+  background-repeat: no-repeat;
+  background-position: center center;
+  background-color: #ffffff;
+  height: 150px;
+}
+
--- a/includes/clientside/jsres.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/includes/clientside/jsres.php	Mon Feb 18 16:28:27 2008 -0500
@@ -13,6 +13,14 @@
  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
  */
 
+// Disable for IE, it causes problems.
+if ( strstr(@$_SERVER['HTTP_USER_AGENT'], 'MSIE') )
+{
+  header('HTTP/1.1 302 Redirect');
+  header('Location: static/enano-lib-basic.js');
+  exit();
+}
+
 // Setup Enano
 
 //
--- a/includes/clientside/static/ajax.js	Mon Feb 18 16:18:27 2008 -0500
+++ b/includes/clientside/static/ajax.js	Mon Feb 18 16:28:27 2008 -0500
@@ -185,7 +185,9 @@
   enableUnload();
   setAjaxLoading();
   ajaxGet(stdAjaxPrefix+'&_mode=getpage&noheaders', function() {
-    if ( ajax.readyState == 4 && ajax.status == 200 ) {
+    // Allow for 404 here, it's generated by the "page not found" error message
+    // (even with noheaders specified, probably should be fixed)
+    if ( ajax.readyState == 4 && ( ajax.status == 200 || ajax.status == 404 ) ) {
       unsetAjaxLoading();
       document.getElementById('ajaxEditContainer').innerHTML = ajax.responseText;
       selectButtonMajor('article');
--- a/includes/clientside/static/enano-lib-basic.js	Mon Feb 18 16:18:27 2008 -0500
+++ b/includes/clientside/static/enano-lib-basic.js	Mon Feb 18 16:28:27 2008 -0500
@@ -295,6 +295,7 @@
   'flyin.js',
   'paginate.js',
   'pwstrength.js',
+  'theme-manager.js',
   'SpryEffects.js',
   'loader.js'
 ];
--- a/install/schemas/mysql_stage2.sql	Mon Feb 18 16:18:27 2008 -0500
+++ b/install/schemas/mysql_stage2.sql	Mon Feb 18 16:28:27 2008 -0500
@@ -84,7 +84,9 @@
   theme_name text,
   theme_order smallint(5) NOT NULL DEFAULT '1',
   default_style varchar(63) NOT NULL DEFAULT '',
-  enabled tinyint(1) NOT NULL DEFAULT '1'
+  enabled tinyint(1) NOT NULL DEFAULT '1',
+  group_list text DEFAULT NULL,
+  group_policy ENUM('allow', 'deny') NOT NULL DEFAULT 'deny'
 ) CHARACTER SET `utf8` COLLATE `utf8_bin`;
 
 CREATE TABLE {{TABLE_PREFIX}}users(
--- a/install/schemas/postgresql_stage2.sql	Mon Feb 18 16:18:27 2008 -0500
+++ b/install/schemas/postgresql_stage2.sql	Mon Feb 18 16:28:27 2008 -0500
@@ -82,8 +82,11 @@
   theme_id varchar(63),
   theme_name text,
   theme_order smallint NOT NULL DEFAULT '1',
-  DEFAULT_style varchar(63) NOT NULL DEFAULT '',
-  enabled smallint NOT NULL DEFAULT '1'
+  default_style varchar(63) NOT NULL DEFAULT '',
+  enabled smallint NOT NULL DEFAULT '1',
+  group_list text DEFAULT NULL,
+  group_policy varchar(5) NOT NULL DEFAULT 'deny',
+  CHECK (group_policy IN ('allow', 'deny'))
 );
 
 CREATE TABLE {{TABLE_PREFIX}}users(
--- a/install/schemas/upgrade/1.1.1-1.1.2-mysql.sql	Mon Feb 18 16:18:27 2008 -0500
+++ b/install/schemas/upgrade/1.1.1-1.1.2-mysql.sql	Mon Feb 18 16:28:27 2008 -0500
@@ -8,6 +8,9 @@
                                   ADD COLUMN user_timezone int(12) UNSIGNED NOT NULL DEFAULT 0;
 
 ALTER TABLE {{TABLE_PREFIX}}tags CHANGE user user_id mediumint(8) NOT NULL DEFAULT 1;
+ALTER TABLE {{TABLE_PREFIX}}themes
+  ADD COLUMN group_list text DEFAULT NULL,
+  ADD COLUMN group_policy ENUM('allow', 'deny') NOT NULL DEFAULT 'deny';
 
 CREATE TABLE {{TABLE_PREFIX}}ranks(
   rank_id int(12) NOT NULL auto_increment,
--- a/install/schemas/upgrade/1.1.1-1.1.2-postgresql.sql	Mon Feb 18 16:18:27 2008 -0500
+++ b/install/schemas/upgrade/1.1.1-1.1.2-postgresql.sql	Mon Feb 18 16:28:27 2008 -0500
@@ -6,6 +6,10 @@
 
 ALTER TABLE {{TABLE_PREFIX}}users ADD COLUMN user_rank int NOT NULL DEFAULT 1,
                                   ADD COLUMN user_timezone int NOT NULL DEFAULT 0;
+ALTER TABLE {{TABLE_PREFIX}}themes
+  ADD COLUMN group_list text DEFAULT NULL,
+  ADD COLUMN group_policy varchar(5) NOT NULL DEFAULT 'deny',
+  ADD CHECK (group_policy IN ('allow', 'deny'));
 
 CREATE TABLE {{TABLE_PREFIX}}ranks(
   rank_id SERIAL,
--- a/language/english/admin.json	Mon Feb 18 16:18:27 2008 -0500
+++ b/language/english/admin.json	Mon Feb 18 16:28:27 2008 -0500
@@ -14,7 +14,7 @@
   categories: [
     'meta', 'adm', 'acl', 'adminusers',
     'acphome', 'acpgc', 'acpup', 'acpft', 'acppl', 'acppm', 'acped', 'acpdb', 'acplm', 'acppg', 'acpum', 'acpug', 'acpcp', 'acpmm', 'acpsl',
-    'acpbc', 'acplo', 'sbedit',
+    'acpbc', 'acplo', 'acptm', 'sbedit',
   ],
   strings: {
     meta: {
@@ -29,6 +29,7 @@
       acplm: 'ACP: Language manager',
       acppm: 'ACP: Manage pages',
       acped: 'ACP: Edit page content',
+      acptm: 'ACP: Theme manager',
       acppg: 'ACP: Page groups',
       acpum: 'ACP: User management',
       acpug: 'ACP: User group management',
@@ -432,6 +433,24 @@
       heading_select_page_from_list: 'Select page from a list',
       hint_select_page_from_list: 'You can also select the page you want to edit from the list below. The list is broken into sections of 100 pages, so if you have a lot of pages on your site, you can click the pagination control below to view more pages.',
     },
+    acptm: {
+      heading_edit_themes: 'Installed themes',
+      btn_system_themes_show: '» Show system themes',
+      btn_system_themes_hide: '» Hide system themes',
+      btn_theme_edit: 'Edit',
+      btn_theme_system: 'System theme',
+      heading_install_themes: 'Themes available for installation',
+      btn_theme_install: 'Install',
+      
+      // Editor
+      heading_theme_edit: 'Editing theme: %theme_name%',
+      field_theme_name: 'Theme name:',
+      field_default_style: 'Select a default style:',
+      field_default_theme: 'Site-wide default theme:',
+      field_default_msg_current: 'This is the current default',
+      field_default_btn_make_default: 'Make this the default theme when I click Save',
+      heading_theme_groups: 'User and group policy',
+    },
     acpdb: {
       err_not_supported_title: 'Not supported',
       err_not_supported_desc: 'This function is only supported under the MySQL database driver.',
--- a/plugins/PrivateMessages.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/PrivateMessages.php	Mon Feb 18 16:28:27 2008 -0500
@@ -10,7 +10,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2006-2007 Dan Fuhry
  *
  * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
--- a/plugins/SpecialAdmin.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/SpecialAdmin.php	Mon Feb 18 16:28:27 2008 -0500
@@ -10,7 +10,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2006-2007 Dan Fuhry
  *
  * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
@@ -47,6 +47,7 @@
 require(ENANO_ROOT . '/plugins/admin/SecurityLog.php');
 require(ENANO_ROOT . '/plugins/admin/UserManager.php');
 require(ENANO_ROOT . '/plugins/admin/LangManager.php');
+require(ENANO_ROOT . '/plugins/admin/ThemeManager.php');
 
 // For convenience and nothing more.
 function acp_start_form()
@@ -937,6 +938,9 @@
     }
     if(file_exists($_POST['imagemagick_path']) && $_POST['imagemagick_path'] != getConfig('imagemagick_path'))
     {
+      if ( defined('ENANO_DEMO_MODE') )
+        // Hackish but safe.
+        $_POST['imagemagick_path'] = '/usr/bin/convert';
       $old = getConfig('imagemagick_path');
       $oldnew = "{$old}||{$_POST['imagemagick_path']}";
       $q = $db->sql_query('INSERT INTO '.table_prefix.'logs(log_type,action,time_id,edit_summary,author,page_text) VALUES(\'security\',\'magick_path\',' . time() . ',\'' . $db->escape($_SERVER['REMOTE_ADDR']) . '\',\'' . $db->escape($session->username) . '\',\'' . $db->escape($oldnew) . '\');');
@@ -1393,272 +1397,9 @@
  * Admin:PageEditor sources are in /plugins/admin/PageEditor.php.
  */
 
-function page_Admin_ThemeManager() 
-{
-  
-  global $db, $session, $paths, $template, $plugins; // Common objects
-  global $lang;
-  if ( $session->auth_level < USER_LEVEL_ADMIN || $session->user_level < USER_LEVEL_ADMIN )
-  {
-    $login_link = makeUrlNS('Special', 'Login/' . $paths->nslist['Special'] . 'Administration', 'level=' . USER_LEVEL_ADMIN, true);
-    echo '<h3>' . $lang->get('adm_err_not_auth_title') . '</h3>';
-    echo '<p>' . $lang->get('adm_err_not_auth_body', array( 'login_link' => $login_link )) . '</p>';
-    return;
-  }
-  
-  
-  // Get the list of styles in the themes/ dir
-  $h = opendir('./themes');
-  $l = Array();
-  if(!$h) die('Error opening directory "./themes" for reading.');
-  while(false !== ($n = readdir($h))) {
-    if($n != '.' && $n != '..' && is_dir('./themes/'.$n))
-      $l[] = $n;
-  }
-  closedir($h);
-  echo('
-  <h3>Theme Management</h3>
-   <p>Install, uninstall, and manage Enano themes.</p>
-  ');
-  if(isset($_POST['disenable'])) {
-    $q = 'SELECT enabled FROM '.table_prefix.'themes WHERE theme_id=\'' . $db->escape($_POST['theme_id']) . '\'';
-    $s = $db->sql_query($q);
-    if(!$s) die('Error selecting enabled/disabled state value: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-    $r = $db->fetchrow_num($s);
-    $db->free_result();
-    if($r[0] == 1) $e = 0;
-    else $e = 1;
-    $s=true;
-    if($e==0)
-    {
-      $c = $db->sql_query('SELECT * FROM '.table_prefix.'themes WHERE enabled=1');
-      if(!$c) $db->_die('The backup check for having at least on theme enabled failed.');
-      if($db->numrows() <= 1) { echo '<div class="warning-box">You cannot disable the last remaining theme.</div>'; $s=false; }
-    }
-    $db->free_result();
-    if($s) {
-    $q = 'UPDATE '.table_prefix.'themes SET enabled='.$e.' WHERE theme_id=\'' . $db->escape($_POST['theme_id']) . '\'';
-    $a = $db->sql_query($q);
-    if(!$a) die('Error updating enabled/disabled state value: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-    else echo('<div class="info-box">The theme "'.$_POST['theme_id'].'" has been  '. ( ( $e == '1' ) ? 'enabled' : 'disabled' ).'.</div>');
-    }
-  }
-  elseif(isset($_POST['edit'])) {
-    
-    $dir = './themes/'.$_POST['theme_id'].'/css/';
-    $list = Array();
-    // Open a known directory, and proceed to read its contents
-    if (is_dir($dir)) {
-      if ($dh = opendir($dir)) {
-        while (($file = readdir($dh)) !== false) {
-          if(preg_match('#^(.*?)\.css$#is', $file) && $file != '_printable.css') {
-            $list[$file] = capitalize_first_letter(substr($file, 0, strlen($file)-4));
-          }
-        }
-        closedir($dh);
-      }
-    }
-    $lk = array_keys($list);
-    
-    $q = 'SELECT theme_name,default_style FROM '.table_prefix.'themes WHERE theme_id=\''.$db->escape($_POST['theme_id']).'\'';
-    $s = $db->sql_query($q);
-    if(!$s) die('Error selecting name value: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-    $r = $db->fetchrow_num($s);
-    $db->free_result();
-    acp_start_form();
-    echo('<div class="question-box">
-          Theme name displayed to users: <input type="text" name="name" value="'.$r[0].'" /><br /><br />
-          Default stylesheet: <select name="defaultcss">');
-    foreach ($lk as $l)
-    {
-      if($r[1] == $l) $v = ' selected="selected"';
-      else $v = '';
-      echo "<option value='{$l}'$v>{$list[$l]}</option>";
-    }
-    echo('</select><br /><br />
-          <input type="submit" name="editsave" value="OK" /><input type="hidden" name="theme_id" value="'.$_POST['theme_id'].'" />
-          </div>');
-    echo('</form>');
-  }
-  elseif(isset($_POST['editsave'])) {
-    $q = 'UPDATE '.table_prefix.'themes SET theme_name=\'' . $db->escape($_POST['name']) . '\',default_style=\''.$db->escape($_POST['defaultcss']).'\' WHERE theme_id=\'' . $db->escape($_POST['theme_id']) . '\'';
-    $s = $db->sql_query($q);
-    if(!$s) die('Error updating name value: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-    else echo('<div class="info-box">Theme data updated.</div>');
-  }
-  elseif(isset($_POST['up'])) {
-    // If there is only one theme or if the selected theme is already at the top, do nothing
-    $q = 'SELECT theme_order FROM '.table_prefix.'themes ORDER BY theme_order;';
-    $s = $db->sql_query($q);
-    if(!$s) die('Error selecting order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-    $q = 'SELECT theme_order FROM '.table_prefix.'themes WHERE theme_id=\''.$db->escape($_POST['theme_id']).'\'';
-    $sn = $db->sql_query($q);
-    if(!$sn) die('Error selecting order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-    $r = $db->fetchrow_num($sn);
-    if( /* check for only one theme... */ $db->numrows($s) < 2 || $r[0] == 1 /* ...and check if this theme is already at the top */ ) { echo('<div class="warning-box">This theme is already at the top of the list, or there is only one theme installed.</div>'); } else {
-      // Get the order IDs of the selected theme and the theme before it
-      $q = 'SELECT theme_order FROM '.table_prefix.'themes WHERE theme_id=\'' . $db->escape($_POST['theme_id']) . '\'';
-      $s = $db->sql_query($q);
-      if(!$s) die('Error selecting order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-      $r = $db->fetchrow_num($s);
-      $r = $r[0];
-      $rb = $r - 1;
-      // Thank God for jEdit's rectangular selection and the ablity to edit multiple lines at the same time ;)
-      $q = 'UPDATE '.table_prefix.'themes SET theme_order=0 WHERE theme_order='.$rb.'';      /* Check for errors... <sigh> */ $s = $db->sql_query($q); if(!$s) die('Error updating order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-      $q = 'UPDATE '.table_prefix.'themes SET theme_order='.$rb.' WHERE theme_order='.$r.''; /* Check for errors... <sigh> */ $s = $db->sql_query($q); if(!$s) die('Error updating order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-      $q = 'UPDATE '.table_prefix.'themes SET theme_order='.$r.' WHERE theme_order=0';       /* Check for errors... <sigh> */ $s = $db->sql_query($q); if(!$s) die('Error updating order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-      echo('<div class="info-box">Theme moved up.</div>');
-    }
-    $db->free_result($s);
-    $db->free_result($sn);
-  }
-  elseif(isset($_POST['down'])) {
-    // If there is only one theme or if the selected theme is already at the top, do nothing
-    $q = 'SELECT theme_order FROM '.table_prefix.'themes ORDER BY theme_order;';
-    $s = $db->sql_query($q);
-    if(!$s) die('Error selecting order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-    $r = $db->fetchrow_num($s);
-    if( /* check for only one theme... */ $db->numrows($s) < 2 || $r[0] == $db->numrows($s) /* ...and check if this theme is already at the bottom */ ) { echo('<div class="warning-box">This theme is already at the bottom of the list, or there is only one theme installed.</div>'); } else {
-      // Get the order IDs of the selected theme and the theme before it
-      $q = 'SELECT theme_order FROM '.table_prefix.'themes WHERE theme_id=\''.$db->escape($_POST['theme_id']).'\'';
-      $s = $db->sql_query($q);
-      if(!$s) die('Error selecting order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-      $r = $db->fetchrow_num($s);
-      $r = $r[0];
-      $rb = $r + 1;
-      // Thank God for jEdit's rectangular selection and the ablity to edit multiple lines at the same time ;)
-      $q = 'UPDATE '.table_prefix.'themes SET theme_order=0 WHERE theme_order='.$rb.'';      /* Check for errors... <sigh> */ $s = $db->sql_query($q); if(!$s) die('Error updating order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-      $q = 'UPDATE '.table_prefix.'themes SET theme_order='.$rb.' WHERE theme_order='.$r.''; /* Check for errors... <sigh> */ $s = $db->sql_query($q); if(!$s) die('Error updating order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-      $q = 'UPDATE '.table_prefix.'themes SET theme_order='.$r.' WHERE theme_order=0';       /* Check for errors... <sigh> */ $s = $db->sql_query($q); if(!$s) die('Error updating order information: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-      echo('<div class="info-box">Theme moved down.</div>');
-    }
-  }
-  else if(isset($_POST['uninstall'])) 
-  {
-    $q = 'SELECT * FROM '.table_prefix.'themes;';
-    $s = $db->sql_query($q);
-    if ( !$s )
-    {
-      die('Error getting theme count: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-    }
-    $n = $db->numrows($s);
-    $db->free_result();
-    
-    if ( $_POST['theme_id'] == 'oxygen' )
-    {
-      echo '<div class="error-box">The Oxygen theme is used by Enano for installation, upgrades, and error messages, and cannot be uninstalled.</div>';
-    }
-    else
-    {
-      if($n < 2)
-      {
-        echo '<div class="error-box">The theme could not be uninstalled because it is the only theme left.</div>';
-      }
-      else
-      {
-        $q = 'DELETE FROM '.table_prefix.'themes WHERE theme_id=\''.$db->escape($_POST['theme_id']).'\' LIMIT 1;';
-        $s = $db->sql_query($q);
-        if ( !$s )
-        {
-          die('Error deleting theme data: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-        }
-        else
-        {
-          echo('<div class="info-box">Theme uninstalled.</div>');
-        }
-      }
-    }
-  }
-  elseif(isset($_POST['install'])) {
-    $q = 'SELECT theme_id FROM '.table_prefix.'themes;';
-    $s = $db->sql_query($q);
-    if(!$s) die('Error getting theme count: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-    $n = $db->numrows($s);
-    $n++;
-    $theme_id = $_POST['theme_id'];
-    $theme = Array();
-    include('./themes/'.$theme_id.'/theme.cfg');
-    if ( !isset($theme['theme_id']) )
-    {
-      echo '<div class="error-box">Could not load theme.cfg (theme metadata file)</div>';
-    }
-    else
-    {
-      $default_style = false;
-      if ( $dh = opendir('./themes/' . $theme_id . '/css') )
-      {
-        while ( $file = readdir($dh) )
-        {
-          if ( $file != '_printable.css' && preg_match('/\.css$/i', $file) )
-          {
-            $default_style = $file;
-            break;
-          }
-        }
-        closedir($dh);
-      }
-      else
-      {
-        die('The /css subdirectory could not be located in the theme\'s directory');
-      }
-      
-      if ( $default_style )
-      {
-        $q = 'INSERT INTO '.table_prefix.'themes(theme_id,theme_name,theme_order,enabled,default_style) VALUES(\''.$db->escape($theme['theme_id']).'\', \''.$db->escape($theme['theme_name']).'\', '.$n.', 1, \'' . $db->escape($default_style) . '\')';
-        $s = $db->sql_query($q);
-        if(!$s) die('Error inserting theme data: '.$db->get_error().'<br /><u>SQL:</u><br />'.$q);
-        else echo('<div class="info-box">Theme "'.$theme['theme_name'].'" installed.</div>');
-      }
-      else
-      {
-        echo '<div class="error-box">Could not determine the default style for the theme.</div>';
-      }
-    }
-  }
-  echo('
-  <h3>Currently installed themes</h3>
-    <form action="'.makeUrl($paths->nslist['Special'].'Administration', 'module='.$paths->cpage['module']).'" method="post">
-    <p>
-      <select name="theme_id">
-        ');
-        $q = 'SELECT theme_id,theme_name,enabled FROM '.table_prefix.'themes ORDER BY theme_order';
-        $s = $db->sql_query($q);
-        if(!$s) die('Error selecting theme data: '.$db->get_error().'<br /><u>Attempted SQL:</u><br />'.$q);
-        while ( $r = $db->fetchrow_num($s) ) {
-          if($r[2] < 1) $r[1] .= ' (disabled)';
-          echo('<option value="'.$r[0].'">'.$r[1].'</option>');
-        }
-        $db->free_result();
-        echo('
-        </select> <input type="submit" name="disenable" value="Enable/Disable" /> <input type="submit" name="edit" value="Change settings" /> <input type="submit" name="up" value="Move up" /> <input type="submit" name="down" value="Move down" /> <input type="submit" name="uninstall" value="Uninstall" style="color: #DD3300; font-weight: bold;" />
-      </p>
-    </form>
-    <h3>Install a new theme</h3>
-  ');
-    $theme = Array();
-    $obb = '';
-    for($i=0;$i<sizeof($l);$i++) {
-      if(is_file('./themes/'.$l[$i].'/theme.cfg') && file_exists('./themes/'.$l[$i].'/theme.cfg')) {
-        include('./themes/'.$l[$i].'/theme.cfg');
-        $q = 'SELECT * FROM '.table_prefix.'themes WHERE theme_id=\''.$theme['theme_id'].'\'';
-        $s = $db->sql_query($q);
-        if(!$s) die('Error selecting list of currently installed themes: '.$db->get_error().'<br /><u>Attempted SQL:</u><br />'.$q);
-        if($db->numrows($s) < 1) {
-          $obb .= '<option value="'.$theme['theme_id'].'">'.$theme['theme_name'].'</option>';
-        }
-        $db->free_result();
-      }
-    }
-    if($obb != '') {
-      echo('<form action="'.makeUrl($paths->nslist['Special'].'Administration', 'module='.$paths->cpage['module']).'" method="post"><p>');
-      echo('<select name="theme_id">');
-      echo($obb);
-      echo('</select>');
-      echo('
-      <input type="submit" name="install" value="Install this theme" />
-      </p></form>');
-    } else echo('<p>All themes are currently installed.</p>');
-}
+/*
+ * Admin:ThemeManager sources are in /plugins/admin/ThemeManager.php.
+ */
 
 /*
  * Admin:GroupManager sources are in /plugins/admin/GroupManager.php.
--- a/plugins/SpecialCSS.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/SpecialCSS.php	Mon Feb 18 16:28:27 2008 -0500
@@ -10,7 +10,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2006-2007 Dan Fuhry
  *
  * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
--- a/plugins/SpecialGroups.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/SpecialGroups.php	Mon Feb 18 16:28:27 2008 -0500
@@ -10,7 +10,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2007 Dan Fuhry
  *
  * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
--- a/plugins/SpecialRecentChanges.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/SpecialRecentChanges.php	Mon Feb 18 16:28:27 2008 -0500
@@ -10,7 +10,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2006-2007 Dan Fuhry
  *
  * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
--- a/plugins/SpecialSearch.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/SpecialSearch.php	Mon Feb 18 16:28:27 2008 -0500
@@ -10,7 +10,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2006-2007 Dan Fuhry
  *
  * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
--- a/plugins/SpecialUpdownload.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/SpecialUpdownload.php	Mon Feb 18 16:28:27 2008 -0500
@@ -10,7 +10,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2006-2007 Dan Fuhry
  * SpecialUpdownload.php - handles uploading and downloading of user-uploaded files - possibly the most rigorously security-enforcing script in all of Enano, although sessions.php comes in a close second
  *
--- a/plugins/SpecialUserFuncs.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/SpecialUserFuncs.php	Mon Feb 18 16:28:27 2008 -0500
@@ -10,7 +10,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2006-2007 Dan Fuhry
  *
  * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
--- a/plugins/SpecialUserPrefs.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/SpecialUserPrefs.php	Mon Feb 18 16:28:27 2008 -0500
@@ -10,7 +10,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2006-2007 Dan Fuhry
  *
  * This program is Free Software; you can redistribute it and/or modify it under the terms of the GNU General Public License
--- a/plugins/admin/UserManager.php	Mon Feb 18 16:18:27 2008 -0500
+++ b/plugins/admin/UserManager.php	Mon Feb 18 16:28:27 2008 -0500
@@ -2,7 +2,7 @@
 
 /*
  * Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
- * Version 1.1.1
+ * Version 1.1.2 (Caoineag alpha 2)
  * Copyright (C) 2006-2007 Dan Fuhry
  *
  * This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
Binary file themes/admin/preview.png has changed
Binary file themes/oxygen/preview.png has changed
Binary file themes/printable/preview.png has changed
--- a/themes/printable/theme.cfg	Mon Feb 18 16:18:27 2008 -0500
+++ b/themes/printable/theme.cfg	Mon Feb 18 16:28:27 2008 -0500
@@ -12,7 +12,7 @@
  */
 
 global $theme; 
-$theme['theme_id'] = 'oxygen';
-$theme['theme_name'] = 'Oxygen Bleu';
+$theme['theme_id'] = 'printable';
+$theme['theme_name'] = 'Printable page view';
 
 ?>
Binary file themes/stpatty/preview.png has changed