summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.htaccess2
-rw-r--r--database/database.mysql5
-rw-r--r--database/database.pgsql5
-rw-r--r--database/updates.inc31
-rw-r--r--includes/common.inc4
-rw-r--r--includes/file.inc2
-rw-r--r--includes/theme.inc207
-rw-r--r--misc/drupal.css5
-rw-r--r--modules/system.module426
-rw-r--r--modules/system/system.module426
-rw-r--r--themes/bluemarine/logo.pngbin0 -> 1767 bytes
-rw-r--r--themes/bluemarine/screenshot.pngbin0 -> 4136 bytes
-rw-r--r--themes/bluemarine/style.css (renamed from themes/xtemplate/default/xtemplate.css)690
-rw-r--r--themes/bluemarine/xtemplate.xtmpl (renamed from themes/xtemplate/default/xtemplate.xtmpl)262
-rw-r--r--themes/chameleon/background.pngbin0 -> 200 bytes
-rw-r--r--themes/chameleon/chameleon.theme306
-rw-r--r--themes/chameleon/common.css271
-rw-r--r--themes/chameleon/logo.pngbin0 -> 1762 bytes
-rw-r--r--themes/chameleon/marvin/logo.pngbin0 -> 1762 bytes
-rw-r--r--themes/chameleon/marvin/screenshot.pngbin0 -> 2800 bytes
-rw-r--r--themes/chameleon/marvin/style.css (renamed from themes/chameleon/marvin/chameleon.css)230
-rw-r--r--themes/chameleon/pure/background.pngbin225 -> 0 bytes
-rw-r--r--themes/chameleon/screenshot.pngbin0 -> 3450 bytes
-rw-r--r--themes/chameleon/style.css (renamed from themes/chameleon/pure/chameleon.css)185
-rw-r--r--themes/engines/xtemplate/xtemplate.engine (renamed from themes/xtemplate/xtemplate.theme)478
-rw-r--r--themes/engines/xtemplate/xtemplate.inc (renamed from themes/xtemplate/xtemplate.inc)960
-rw-r--r--themes/example/example.theme18
-rw-r--r--themes/pushbutton/arrow-next-hover.pngbin0 -> 168 bytes
-rw-r--r--themes/pushbutton/arrow-next.pngbin0 -> 168 bytes
-rw-r--r--themes/pushbutton/arrow-prev-hover.pngbin0 -> 192 bytes
-rw-r--r--themes/pushbutton/arrow-prev.pngbin0 -> 191 bytes
-rw-r--r--themes/pushbutton/arrow-up-hover.pngbin0 -> 192 bytes
-rw-r--r--themes/pushbutton/arrow-up.pngbin0 -> 191 bytes
-rw-r--r--themes/pushbutton/background.png (renamed from themes/xtemplate/pushbutton/background.png)bin2445 -> 2445 bytes
-rw-r--r--themes/pushbutton/forum-container.jpg (renamed from themes/xtemplate/pushbutton/forum-container.jpg)bin10722 -> 10722 bytes
-rw-r--r--themes/pushbutton/forum-link.png (renamed from themes/xtemplate/pushbutton/forum-link.png)bin711 -> 711 bytes
-rw-r--r--themes/pushbutton/header-a.jpg (renamed from themes/xtemplate/pushbutton/header-a.jpg)bin440 -> 440 bytes
-rw-r--r--themes/pushbutton/header-b.jpg (renamed from themes/xtemplate/pushbutton/header-b.jpg)bin5770 -> 5770 bytes
-rw-r--r--themes/pushbutton/icon-block.png (renamed from themes/xtemplate/pushbutton/icon-block.png)bin310 -> 310 bytes
-rw-r--r--themes/pushbutton/icon-comment.png (renamed from themes/xtemplate/pushbutton/icon-comment.png)bin317 -> 317 bytes
-rw-r--r--themes/pushbutton/logo-active.jpg (renamed from themes/xtemplate/pushbutton/logo-active.jpg)bin2466 -> 2466 bytes
-rw-r--r--themes/pushbutton/logo-background.jpg (renamed from themes/xtemplate/pushbutton/logo-background.jpg)bin950 -> 950 bytes
-rw-r--r--themes/pushbutton/logo-hover.jpg (renamed from themes/xtemplate/pushbutton/logo-hover.jpg)bin2712 -> 2712 bytes
-rw-r--r--themes/pushbutton/logo.png (renamed from themes/xtemplate/pushbutton/logo.png)bin103 -> 103 bytes
-rw-r--r--themes/pushbutton/screenshot.pngbin0 -> 7594 bytes
-rw-r--r--themes/pushbutton/style.css (renamed from themes/xtemplate/pushbutton/xtemplate.css)1059
-rw-r--r--themes/pushbutton/xtemplate.xtmpl (renamed from themes/xtemplate/pushbutton/xtemplate.xtmpl)304
-rw-r--r--themes/xtemplate/default/logo.pngbin2961 -> 0 bytes
-rw-r--r--themes/xtemplate/pushbutton/arrow-next-hover.pngbin213 -> 0 bytes
-rw-r--r--themes/xtemplate/pushbutton/arrow-next.pngbin213 -> 0 bytes
-rw-r--r--themes/xtemplate/pushbutton/arrow-prev-hover.pngbin224 -> 0 bytes
-rw-r--r--themes/xtemplate/pushbutton/arrow-prev.pngbin224 -> 0 bytes
-rw-r--r--themes/xtemplate/pushbutton/arrow-up-hover.pngbin239 -> 0 bytes
-rw-r--r--themes/xtemplate/pushbutton/arrow-up.pngbin239 -> 0 bytes
54 files changed, 3333 insertions, 2543 deletions
diff --git a/.htaccess b/.htaccess
index 442a5bd95..a42729b76 100644
--- a/.htaccess
+++ b/.htaccess
@@ -3,7 +3,7 @@
#
# Protect files and directories from prying eyes:
-<Files ~ "(\.(conf|inc|module|pl|sh|sql|theme)|Entries|Repositories|Root|scripts|updates)$">
+<Files ~ "(\.(conf|inc|module|pl|sh|sql|theme|engine|xtmpl)|Entries|Repositories|Root|scripts|updates)$">
order deny,allow
deny from all
</Files>
diff --git a/database/database.mysql b/database/database.mysql
index f5c3cc967..2964018fc 100644
--- a/database/database.mysql
+++ b/database/database.mysql
@@ -732,7 +732,8 @@ INSERT INTO system VALUES ('modules/node.module','node','module','',1,0,0);
INSERT INTO system VALUES ('modules/page.module','page','module','',1,0,0);
INSERT INTO system VALUES ('modules/story.module','story','module','',1,0,0);
INSERT INTO system VALUES ('modules/taxonomy.module','taxonomy','module','',1,0,0);
-INSERT INTO system VALUES ('themes/xtemplate/xtemplate.theme','xtemplate','theme','Internet explorer, Netscape, Opera',1,0,0);
+INSERT INTO system VALUES ('themes/bluemarine/xtemplate.xtmpl','bluemarine','theme','themes/engines/xtemplate/xtemplate.engine',1,0,0);
+INSERT INTO system VALUES ('themes/engines/xtemplate/xtemplate.engine','xtemplate','theme_engine','',1,0,0);
INSERT INTO users (uid, name, mail) VALUES ('0', '', '');
INSERT INTO users_roles (uid, rid) VALUES (0, 1);
@@ -743,7 +744,7 @@ INSERT INTO role (rid, name) VALUES (2, 'authenticated user');
INSERT INTO permission VALUES (2,'access comments, access content, post comments, post comments without approval',0);
REPLACE variable SET name='update_start', value='s:10:"2004-02-21;"';
-REPLACE variable SET name='theme_default', value='s:9:"xtemplate";';
+REPLACE variable SET name='theme_default', value='s:10:"bluemarine";';
REPLACE blocks SET module = 'user', delta = '0', status = '1';
REPLACE blocks SET module = 'user', delta = '1', status = '1';
diff --git a/database/database.pgsql b/database/database.pgsql
index e1103013f..0eaa8f0a1 100644
--- a/database/database.pgsql
+++ b/database/database.pgsql
@@ -717,10 +717,11 @@ INSERT INTO system VALUES ('modules/node.module','node','module','',1,0,0);
INSERT INTO system VALUES ('modules/page.module','page','module','',1,0,0);
INSERT INTO system VALUES ('modules/story.module','story','module','',1,0,0);
INSERT INTO system VALUES ('modules/taxonomy.module','taxonomy','module','',1,0,0);
-INSERT INTO system VALUES ('themes/xtemplate/xtemplate.theme','xtemplate','theme','Internet explorer, Netscape, Opera',1,0,0);
+INSERT INTO system VALUES ('themes/bluemarine/xtemplate.xtmpl','bluemarine','theme','themes/engines/xtemplate/xtemplate.engine',1,0,0);
+INSERT INTO system VALUES ('themes/engines/xtemplate/xtemplate.engine','xtemplate','theme_engine','',1,0,0);
INSERT INTO variable(name,value) VALUES('update_start', 's:10:"2004-02-21";');
-INSERT INTO variable(name,value) VALUES('theme_default','s:9:"xtemplate";');
+INSERT INTO variable(name,value) VALUES('theme_default','s:10:"bluemarine";');
INSERT INTO users(uid,name,mail) VALUES(0,'','');
INSERT INTO users_roles(uid,rid) VALUES(0, 1);
diff --git a/database/updates.inc b/database/updates.inc
index f7922c4ae..61186b6a1 100644
--- a/database/updates.inc
+++ b/database/updates.inc
@@ -74,7 +74,8 @@ $sql_updates = array(
"2004-08-10" => "update_100",
"2004-08-11" => "update_101",
"2004-08-12" => "update_102",
- "2004-08-17" => "update_103"
+ "2004-08-17" => "update_103",
+ "2004-08-19" => "update_104"
);
function update_32() {
@@ -1522,6 +1523,34 @@ function update_103() {
return $ret;
}
+function update_104() {
+ $ret = array();
+ if (variable_get('theme_default', 'xtemplate') == 'chameleon') {
+ $ret[] = update_sql("DELETE FROM {system} WHERE name = 'chameleon'");
+ $ret[] = update_sql("INSERT INTO system VALUES ('themes/chameleon/chameleon.theme','chameleon','theme','',1,0,0)");
+ $ret[] = update_sql("INSERT INTO system VALUES ('themes/chameleon/marvin/style.css','marvin','theme','themes/chameleon/chameleon.theme',1,0,0)");
+ if (variable_get("chameleon_stylesheet", "themes/chameleon/pure/chameleon.css") == "themes/chameleon/marvin/chameleon.css") {
+ variable_set('theme_default', 'chameleon/marvin');
+ }
+ else {
+ variable_set('theme_default', 'chameleon');
+ }
+ }
+ elseif (variable_get('theme_default', 'xtemplate') == 'xtemplate') {
+ $ret[] = update_sql("DELETE FROM {system} WHERE name = 'xtemplate'");
+ $ret[] = update_sql("INSERT INTO system VALUES ('themes/bluemarine/bluemarine.theme','bluemarine','theme','themes/engines/xtemplate/xtemplate.engine',1,0,0)");
+ $ret[] = update_sql("INSERT INTO system VALUES ('themes/pushbutton/pushbutton.theme','pushbutton','theme','themes/engines/xtemplate/xtemplate.engine',1,0,0)");
+ $ret[] = update_sql("INSERT INTO system VALUES ('themes/engines/xtemplate/xtemplate.engine','xtemplate','theme_engine','',1,0,0)");
+ if (variable_get('xtemplate_template', 'default') == 'pushbutton') {
+ variable_set('theme_default', 'pushbutton');
+ }
+ else {
+ variable_set('theme_default', 'bluemarine');
+ }
+ }
+ return $ret;
+}
+
function update_sql($sql) {
$edit = $_POST["edit"];
$result = db_query($sql);
diff --git a/includes/common.inc b/includes/common.inc
index f8e5654dd..30ca12e08 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -87,9 +87,7 @@ function drupal_get_html_head() {
$output = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n";
$output .= "<base href=\"$base_url/\" />\n";
- $output .= "<style type=\"text/css\" media=\"all\">\n";
- $output .= "@import url(misc/drupal.css);\n";
- $output .= "</style>\n";
+ $output .= theme('stylesheet_import', 'misc/drupal.css');
return $output . drupal_set_html_head();
}
diff --git a/includes/file.inc b/includes/file.inc
index 6b8fbf7fb..6eb0bfd3d 100644
--- a/includes/file.inc
+++ b/includes/file.inc
@@ -437,7 +437,7 @@ function file_scan_directory($dir, $mask, $nomask = array('.', '..', 'CVS'), $ca
}
elseif (ereg($mask, $file)) {
$name = basename($file);
- $files["$dir/$file"]->path = "$dir/$file";
+ $files["$dir/$file"]->filename = "$dir/$file";
$files["$dir/$file"]->name = substr($name, 0, strrpos($name, '.'));
if ($callback) {
$callback("$dir/$file");
diff --git a/includes/theme.inc b/includes/theme.inc
index 87ed363e6..08b02bfcd 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -33,16 +33,52 @@ function theme_help($section) {
* The name of the currently selected theme.
*/
function init_theme() {
- global $user;
+ global $user, $custom_theme, $theme_engine, $theme_key;
$themes = list_themes();
// Only select the user selected theme if it is available in the
// list of enabled themes.
- $theme = $user->theme && $themes[$user->theme] ? $user->theme : variable_get('theme_default', 0);
+ $theme = $user->theme && $themes[$user->theme] ? $user->theme : variable_get('theme_default', 'bluemarine');
- include_once($themes[$theme]->filename);
+ // Allow modules to override the present theme... only select custom theme
+ // if it is available in the list of enabled themes.
+ $theme = $custom_theme && $themes[$custom_theme] ? $custom_theme : $theme;
+ // Store the identifier for retrieving theme settings with.
+ $theme_key = $theme;
+
+ // If we're using a style, load its appropriate theme,
+ // which is stored in the style's description field.
+ // Also load the stylesheet using drupal_set_html_head().
+ // Otherwise, load the theme.
+ if (strpos($themes[$theme]->filename, '.css')) {
+ // File is a style; put it in the html_head buffer
+ // Set theme to its template/theme
+ drupal_set_html_head(theme('stylesheet_import', $themes[$theme]->filename));
+ $theme = $themes[$theme]->description;
+ }
+ else {
+ // File is a template/theme
+ // Put the css with the same name in html_head, if it exists
+ if (file_exists($stylesheet = dirname($themes[$theme]->filename) .'/style.css')) {
+ drupal_set_html_head(theme('stylesheet_import', $stylesheet));
+ }
+ }
+
+ if (strpos($themes[$theme]->filename, '.theme')) {
+ // file is a theme; include it
+ include_once($themes[$theme]->filename);
+ }
+ elseif (strpos($themes[$theme]->description, '.engine')) {
+ // file is a template; include its engine
+ include_once($themes[$theme]->description);
+ $theme_engine = basename($themes[$theme]->description, '.engine');
+ if (function_exists($theme_engine .'_init')) {
+ call_user_func($theme_engine .'_init', $themes[$theme]);
+ }
+ }
+
return $theme;
}
@@ -75,12 +111,41 @@ function list_themes($refresh = FALSE) {
}
/**
+ * Provides a list of currently available theme engines
+ *
+ * @param $refresh
+ * Whether to reload the list of themes from the database.
+ * @return
+ * An array of the currently available theme engines.
+ */
+function list_theme_engines($refresh = FALSE) {
+ static $list;
+
+ if ($refresh) {
+ unset($list);
+ }
+
+ if (!$list) {
+ $list = array();
+ $result = db_query("SELECT * FROM {system} where type = 'theme_engine' AND status = '1' ORDER BY name");
+ while ($engine = db_fetch_object($result)) {
+ if (file_exists($engine->filename)) {
+ $list[$engine->name] = $engine;
+ }
+ }
+ }
+
+ return $list;
+}
+
+/**
* Generate the themed representation of a Drupal object.
*
* All requests for themed functions must go through this function. It examines
* the request and routes it to the appropriate theme function. If the current
- * theme does not implement the requested function, then the base theme function
- * is called.
+ * theme does not implement the requested function, then the current theme
+ * engine is checked. If neither the engine nor theme implement the requested
+ * function, then the base theme function is called.
*
* For example, to retrieve the HTML that is output by theme_page($output), a
* module should call theme('page', $output).
@@ -94,14 +159,21 @@ function list_themes($refresh = FALSE) {
*/
function theme() {
global $theme;
+ global $theme_engine;
$args = func_get_args();
$function = array_shift($args);
- if (($theme != '') && (function_exists($theme .'_'. $function))) {
+ if (($theme != '') && function_exists($theme .'_'. $function)) {
+ // call theme function
return call_user_func_array($theme .'_'. $function, $args);
}
+ elseif (($theme != '') && isset($theme_engine) && function_exists($theme_engine .'_'. $function)) {
+ // call engine function
+ return call_user_func_array($theme_engine .'_'. $function, $args);
+ }
elseif (function_exists('theme_'. $function)){
+ // call Drupal function
return call_user_func_array('theme_'. $function, $args);
}
}
@@ -118,6 +190,113 @@ function path_to_theme() {
}
/**
+ * Retrieve an associative array containing the settings for a theme.
+ *
+ * The final settings are arrived at by merging the default settings,
+ * the site-wide settings, and the settings defined for the specific theme.
+ * If no $key was specified, only the site-wide theme defaults are retrieved.
+ *
+ * The default values for each of settings are also defined in this function.
+ * To add new settings, add their default values here, and then add form elements
+ * to system_theme_settings() in system.module.
+ *
+ * @param $key
+ * The template/style value for a given theme.
+ *
+ * @return
+ * An associative array containing theme settings.
+ */
+function drupal_get_theme_settings($key = NULL) {
+ $defaults = array(
+ 'primary_links' => '',
+ 'secondary_links' => l('edit secondary links', 'admin/themes/settings'),
+ 'mission' => '',
+ 'default_logo' => 1,
+ 'logo_path' => '',
+ 'toggle_logo' => 1,
+ 'toggle_name' => 1,
+ 'toggle_search' => 1,
+ 'toggle_slogan' => 0,
+ 'toggle_mission' => 1,
+ 'toggle_primary_links' => 1,
+ 'toggle_secondary_links' => 1,
+ 'toggle_node_user_picture' => 0,
+ 'toggle_comment_user_picture' => 0,
+ );
+
+ foreach (node_list() as $type) {
+ $defaults['toggle_node_info_' . $type] = 1;
+ }
+ $settings = array_merge($defaults, variable_get('theme_settings', array()));
+
+ if ($key) {
+ $settings = array_merge($settings, variable_get(str_replace('/', '_', 'theme_'. $key .'_settings'), array()));
+ }
+
+ return $settings;
+}
+
+/**
+ * Retrieve a setting for the current theme.
+ * This function is designed for use from within themes & engines
+ * to determine theme settings made in the admin interface.
+ *
+ * Caches values for speed (use $refresh = TRUE to refresh cache)
+ *
+ * @param $setting_name
+ * The name of the setting to be retrieved.
+ *
+ * @param $refresh
+ * Whether to reload the cache of settings.
+ *
+ * @return
+ * The value of the requested setting, NULL if the setting does not exist.
+ */
+function drupal_get_theme_setting($setting_name, $refresh = FALSE) {
+ global $theme_key;
+ static $settings;
+
+ if (empty($settings) || $refresh) {
+ $settings = drupal_get_theme_settings($theme_key);
+
+ $themes = list_themes();
+ $theme_object = $themes[$theme_key];
+
+ if ($settings['mission'] == '') {
+ $settings['mission'] = variable_get('site_mission', '');
+ }
+
+ if (!$settings['toggle_mission']) {
+ $settings['mission'] = '';
+ }
+
+ if ($settings['toggle_logo']) {
+ if ($settings['default_logo']) {
+ $settings['logo'] = dirname($theme_object->filename) .'/logo.png';
+ }
+ elseif ($settings['logo_path']) {
+ $settings['logo'] = $settings['logo_path'];
+ }
+ }
+
+ if ($settings['toggle_primary_links']) {
+ if (!$settings['primary_links']) {
+ $settings['primary_links'] = theme('links', link_page());
+ }
+ }
+ else {
+ $settings['primary_links'] = '';
+ }
+
+ if (!$settings['toggle_secondary_links']) {
+ $settings['secondary_links'] = '';
+ }
+ }
+
+ return isset($settings[$setting_name]) ? $settings[$setting_name] : NULL;
+}
+
+/**
* @defgroup themeable Themeable functions
* @{
*
@@ -477,6 +656,22 @@ function theme_mark() {
}
/**
+ * Import a stylesheet using @import.
+ *
+ * @param $stylesheet
+ * The filename to point the link at.
+ *
+ * @param $media
+ * The media type to specify for the stylesheet
+ *
+ * @return
+ * A string containing the HTML for the stylesheet import.
+ */
+function theme_stylesheet_import($stylesheet, $media = 'all') {
+ return '<style type="text/css" media="'. $media .'">@import "'. $stylesheet .'";</style>';
+}
+
+/**
* Return a themed list of items.
*
* @param $items
diff --git a/misc/drupal.css b/misc/drupal.css
index 1ac512cee..33c48d3a5 100644
--- a/misc/drupal.css
+++ b/misc/drupal.css
@@ -379,6 +379,11 @@ tr.light .form-item, tr.dark .form-item {
.node-form .poll-form fieldset {
display: block;
}
+img.screenshot {
+ border: 1px solid #808080;
+ display: block;
+ margin: 2px;
+}
#tracker td.replies {
text-align: center;
}
diff --git a/modules/system.module b/modules/system.module
index fc116064c..aa8964095 100644
--- a/modules/system.module
+++ b/modules/system.module
@@ -11,7 +11,12 @@ function system_help($section) {
case 'admin/settings':
return t('General configuration options for your site. Set up the name of the site, e-mail address used in mail-outs, clean URL options, caching, etc.');
case 'admin/themes':
- return t('Select which themes are available to your users and specify the default theme.');
+ return t('Select which themes are available to your users and specify the default theme. To configure site-wide display settings, click the "configure" task above. Alternately, to override these settings in a specific theme, click the "configure" link for the corresponding theme.');
+ case 'admin/themes/settings':
+ return t('These options control the default display settings for your entire site, across all themes. Unless they have been overridden by a specific theme, these settings will be used.');
+ case 'admin/themes/settings/'. arg(3):
+ $theme = array_pop(explode('.', arg(3), 2));
+ return t('These options control the display settings for the <code>%template</code> theme. When your site is displayed using this theme, these settings will be used. By clicking "Reset to defaults," you can choose to use the <a href="%global">global settings</a> for this theme.', array('%template' => $theme, '%global' => url('admin/themes/settings')));
case 'admin/modules':
return t("Modules are plugins for Drupal that extend its core functionality. Here you can select which modules are enabled. Click on the name of the module in the navigation menu for their individual configuration pages. Once a module is enabled, new <a href=\"%permissions\">permissions</a> might be made available. Modules can automatically be temporarily disabled to reduce server load when your site becomes extremely busy by checking throttle. The auto-throttle functionality must be enabled on the <a href=\"%throttle\">throttle configuration page</a> after having enabled the throttle module.", array('%permissions' => url('admin/user/configure/permission'), '%throttle' => url('admin/settings/throttle')));
case 'admin/help#system':
@@ -57,28 +62,35 @@ function system_menu() {
'type' => MENU_CALLBACK);
$access = user_access('administer site configuration');
+
// Themes:
$items[] = array('path' => 'admin/themes', 'title' => t('themes'),
'callback' => 'system_themes', 'access' => $access);
+
+ $items[] = array('path' => 'admin/themes/select', 'title' => t('select'),
+ 'callback' => 'system_themes', 'access' => $access,
+ 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1);
+
+ $items[] = array('path' => 'admin/themes/settings', 'title' => t('configure'),
+ 'callback' => 'system_theme_settings', 'access' => $access,
+ 'type' => MENU_LOCAL_TASK);
+
+ // Theme configuration subtabs
+ $items[] = array('path' => 'admin/themes/settings/global', 'title' => t('global settings'),
+ 'callback' => 'system_theme_settings', 'access' => $access,
+ 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1);
+
foreach (list_themes() as $theme) {
- // TODO: reenable 'forced refresh' once we move the menu_build() later
- // in the request. It added overhead with no benefit.
- // NOTE: refresh the list because some themes might have been enabled/disabled.
- include_once $theme->filename;
- $function = $theme->name .'_settings';
- if (function_exists($function)) {
- $items[] = array('path' => 'admin/themes/'. $theme->name, 'title' => $theme->name,
- 'callback' => 'system_configure_theme', 'access' => $access);
- }
+ $path = str_replace('/', '.', $theme->name);
+ $items[] = array('path' => 'admin/themes/settings/'. $path, 'title' => basename($theme->name),
+ 'callback' => 'system_theme_settings', 'access' => $access,
+ 'type' => MENU_LOCAL_TASK);
}
// Modules:
$items[] = array('path' => 'admin/settings', 'title' => t('settings'),
'callback' => 'system_site_settings', 'access' => $access);
foreach (module_list() as $name) {
- // TODO: reenable 'forced refresh' once we move the menu_build() later
- // in the request. It added overhead with no benefit.
- // NOTE: refresh the list because some modules might have been enabled/disabled.
if (module_hook($name, 'settings')) {
$items[] = array('path' => 'admin/settings/'. $name, 'title' => t($name));
}
@@ -96,12 +108,34 @@ function system_menu() {
*/
function system_user($type, $edit, &$user, $category = NULL) {
if ($type == 'form' && $category == 'account') {
- $options = '<option value="">'. t('Default theme') ."</option>\n";
if (count($themes = list_themes()) > 1) {
+ $rows = array();
foreach ($themes as $key => $value) {
- $options .= "<option value=\"$key\"". (($edit['theme'] == $key) ? ' selected="selected"' : '') .">$key - $value->description</option>\n";
+ $row = array();
+
+ // Screenshot column.
+ $screenshot = dirname($value->filename) .'/screenshot.png';
+ $row[] = file_exists($screenshot) ? theme('image', $screenshot, t('Screenshot for %theme theme', array('%theme' => $value->name)), '', 'class="screenshot"') : t('no screenshot');
+
+ // Information field.
+ $field = '<strong>'. basename($value->name) .'</strong>';
+ $row[] = $field;
+
+ // Reset to follow site default theme if user selects the site default
+ if ($key == variable_get('theme_default', 'bluemarine')) {
+ $key = '';
+ if ($edit['theme'] == variable_get('theme_default', 'bluemarine')) {
+ $edit['theme'] = '';
+ }
+ }
+
+ // Selected column.
+ $row[] = array('data' => form_radio('', 'theme', $key, ($edit['theme'] == $key) ? 1 : 0), 'align' => 'center');
+
+ $rows[] = $row;
}
- $data[] = array('title' => t('Theme settings'), 'data' => form_item(t('Theme'), "<select name=\"edit[theme]\">$options</select>", t('Selecting a different theme will change the look and feel of the site.')), 'weight' => 2);
+ $header = array(t('Screenshot'), t('Name'), t('Selected'));
+ $data[] = array('title' => t('Theme settings'), 'data' => form_item('', theme('table', $header, $rows), t('Selecting a different theme will change the look and feel of the site.')), 'weight' => 2);
}
if (variable_get('configurable_timezones', 1)) {
@@ -199,25 +233,48 @@ function system_view_general() {
return $output;
}
-function system_listing($type) {
- // Pick appropriate directory and filetype
- switch ($type) {
- case 'modules':
- $directory = 'modules';
- $type = 'module';
- break;
- case 'themes':
- default:
- $directory = 'themes';
- $type = 'theme';
- break;
+/**
+ * Inventory theme engines and insert entries for them into the system table
+ */
+function system_theme_engine_inventory($directory) {
+ $engines = array();
+
+ // Remove all theme engines from the system table
+ db_query('DELETE FROM {system} WHERE type = \'%s\'', 'theme_engine');
+
+ // Find theme engines in the directory and insert into database
+ $files = file_scan_directory($directory. '/engines', '\.engine$');
+
+ foreach ($files as $filename => $file) {
+ module_set_filename($file->name, $filename);
+ module_load($file->name);
+
+ $info->name = $file->name;
+ $info->filename = $file->filename;
+ $engines[$info->name] = $info;
+
+ db_query('INSERT INTO {system} (name, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, 'theme_engine', $filename, 1, 0, 0);
}
+ return $engines;
+}
+/**
+ * Retrieves an array of a particular type of files (specified by $type) in a particular $directory
+ * and their current status in the system table.
+ */
+function system_get_files($search, $type, $directory) {
// Find files in the directory.
- $files = file_scan_directory($directory, "\.$type$");
+ $files = file_scan_directory($directory, $search);
+ return $files;
+}
+
+/**
+ * Retrieves the current status of an array of files in the system table.
+ */
+function system_get_files_database(&$files, $type) {
// Extract current files from database.
- $result = db_query("SELECT filename, type, status, throttle FROM {system} WHERE type = '%s'", $type);
+ $result = db_query('SELECT filename, type, status, throttle FROM {system} WHERE type = \'%s\'', $type);
while ($file = db_fetch_object($result)) {
if (is_object($files[$file->filename])) {
foreach ($file as $key => $value) {
@@ -225,64 +282,186 @@ function system_listing($type) {
}
}
}
+}
- ksort($files);
+/**
+ * Obtains information about each theme in the $files array
+ * Also updates the system table
+ */
+function system_obtain_theme_info($files, $directory) {
+ foreach ($files as $filename => $file) {
+ if ($file->theme) {
+ // file is a style
+ $info->description = $file->theme;
+ $info->style = TRUE;
+ }
+
+ if (strpos($filename, '.theme')) {
+ // file is a theme
+ module_set_filename($file->name, $filename);
+ module_load($file->name);
+ $info->description = '';
+ $info->prefix = basename($filename, '.theme');
+ }
+ elseif ($info->style && !$file->engine) {
+ $info->prefix = $info->description;
+ }
+ else {
+ // file is a template
+ $info->description = $info->style ? $info->description : $file->engine;
+ $info->template = TRUE;
+ $info->prefix = basename($file->engine, '.engine');
+ }
+
+ $info->filename = $filename;
+ $info->path = pathinfo($info->filename);
+ $info->name = str_replace(array($directory .'/'), '', $info->path['dirname']);
+ $info->shortname = basename($info->name);
+ $info->screenshot = dirname($info->filename) .'/screenshot.png';
+
+ $info->status = $file->status;
- if ($type == 'module') {
- $required = array('modules/admin.module', 'modules/block.module', 'modules/filter.module', 'modules/system.module', 'modules/user.module', 'modules/watchdog.module');
- // the throttle mechanism requires additional modules always be enabled
- $throttle_required = array_merge($required, array('modules/statistics.module', 'modules/throttle.module'));
+ $themes[$info->name] = $info;
- $header = array(t('Name'), t('Description'), t('Status'), t('Throttle'));
+ // Update the contents of the system table:
+ db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $info->filename, 'theme');
+ db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'theme', $info->filename, $info->status, 0, 0);
}
- else {
- $required = array();
- $header = array(t('Name'), t('Description'), t('Enable'), t('Default'));
+ return $themes;
+}
+
+/**
+ * Collect data about all currently available themes
+ */
+function system_theme_data($directory) {
+ // Find theme engines
+ $engines = system_theme_engine_inventory($directory);
+
+ // Get current list of themes and their present status in the system table.
+ $files = system_get_files('\.theme$', 'theme', $directory);
+
+ // Add templates to the site listing
+ foreach ($engines as $engine) {
+ foreach (call_user_func($engine->name .'_templates', $directory) as $template) {
+ $template_files[$template->filename] = $template;
+ $template_files[$template->filename]->engine = $engine->filename;
+ foreach ($files as $file) {
+ // do not double-insert templates with theme files in their directory
+ if (dirname($template->filename) == dirname($file->filename)) {
+ unset($template_files[$template->filename]);
+ }
+ }
+ }
+ }
+ $files = array_merge($files, $template_files);
+
+ // Find styles in each theme's directory.
+ foreach ($files as $file) {
+ foreach (system_get_files("style.css$", 'theme', dirname($file->filename)) as $style) {
+ // do not double-insert themes with css files in their directory
+ if (dirname($style->filename) != dirname($file->filename)) {
+ $style_files[$style->filename] = $style;
+ $path = pathinfo($file->filename);
+ $style_files[$style->filename]->theme = str_replace(array($directory .'/'), '', $path['dirname']);
+ if ($file->engine) {
+ $style_files[$style->filename]->engine = $file->engine;
+ }
+ }
+ }
}
+ $files = array_merge($files, $style_files);
+
+ // Extract current files from database.
+ system_get_files_database($files, 'theme');
+
+ // Build an array of information about each theme for use in displaying the selection table.
+ return system_obtain_theme_info($files, $directory);
+}
+
+/**
+ * Generate a list of all the available theme/style combinations.
+ */
+function system_theme_listing() {
+ $directory = 'themes';
+
+ $themes = system_theme_data($directory);
+ ksort($themes);
+
+ foreach ($themes as $key => $info) {
+ $row = array();
+
+ // Screenshot column.
+ $row[] = file_exists($info->screenshot) ? theme('image', $info->screenshot, t('Screenshot for %theme theme', array('%theme' => $info->shortname)), '', 'class="screenshot"') : t('no screenshot');
+
+ // Information field.
+ $field = '<strong>'. $info->shortname .'</strong>';
+ $field .= '<br /><em>themes/'. $key .'</em>';
+ $row[] = $field;
+
+ // enabled, default, and operations columns
+ $row[] = array('data' => form_checkbox('', 'status]['. $info->filename, 1, $info->status), 'align' => 'center');
+ $row[] = array('data' => form_radio('', 'theme_default', $info->filename, (variable_get('theme_default', 'bluemarine') == $key) ? 1 : 0), 'align' => 'center');
+ if (function_exists($info->prefix .'_settings') || function_exists($info->prefix .'_features')) {
+ $row[] = array('data' => l(t('configure'), 'admin/themes/settings/'. str_replace('/', '.', $key)), 'align' => 'center');
+ }
+ else {
+ $row[] = '';
+ }
+ $rows[] = $row;
+ }
+
+ $header = array(t('Screenshot'), t('Name'), t('Enabled'), t('Default'), t('Operations'));
+ $output = form_hidden('type', 'theme');
+ $output .= theme('table', $header, $rows);
+ return $output;
+}
+
+/**
+ * Generate a list of all the available modules, as well as update the system list.
+ */
+function system_module_listing() {
+ $directory = 'modules';
+
+ // Get current list of modules
+ $files = system_get_files('\.module$', 'module', $directory);
+
+ // Extract current files from database.
+ system_get_files_database($files, 'module');
+
+ ksort($files);
+
+ $required = array('modules/admin.module', 'modules/block.module', 'modules/filter.module', 'modules/system.module', 'modules/user.module', 'modules/watchdog.module');
+ // the throttle mechanism requires additional modules always be enabled
+ $throttle_required = array_merge($required, array('modules/statistics.module', 'modules/throttle.module'));
+
+ $header = array(t('Name'), t('Description'), t('Status'), t('Throttle'));
foreach ($files as $filename => $file) {
module_set_filename($file->name, $filename);
module_load($file->name);
- if ($type == 'module') {
- $info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : $file->name;
- $info->description = module_invoke($file->name, 'help', 'admin/modules#description');
- // log the critical hooks implemented by this module
- $bootstrap = 0;
- foreach (bootstrap_hooks() as $hook) {
- if (module_hook($file->name, $hook)) {
- $bootstrap = 1;
- break;
- }
- }
- }
- elseif ($type == 'theme') {
- $info->name = $file->name;
- $info->description = module_invoke($file->name, 'help', 'admin/themes#description');
- $themes[] = $info->name;
-
- // Enable the default theme:
- if ($info->name == variable_get('theme_default', 0)) {
- $file->status = 1;
+ $info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : $file->name;
+ $info->description = module_invoke($file->name, 'help', 'admin/modules#description');
+ // log the critical hooks implemented by this module
+ $bootstrap = 0;
+ foreach (bootstrap_hooks() as $hook) {
+ if (module_hook($file->name, $hook)) {
+ $bootstrap = 1;
+ break;
}
}
// Update the contents of the system table:
- db_query("DELETE FROM {system} WHERE filename = '%s' AND type = '%s'", $filename, $type);
- db_query("INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $info->name, $info->description, $type, $filename, $file->status, $file->throttle, $bootstrap);
+ db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $filename, 'module');
+ db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'module', $filename, $file->status, $file->throttle, $bootstrap);
- $row = array($info->name, $info->description, array('data' => (in_array($filename, $required) ? form_hidden("status][$filename", 1) . t('required') : form_checkbox('', "status][$filename", 1, $file->status)), 'align' => 'center'));
- if ($type == 'module') {
- $row[] = array('data' => (in_array($filename, $throttle_required) ? form_hidden("throttle][$filename", 0) . t('required') : form_checkbox(NULL, "throttle][$filename", 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array('disabled' => 'disabled'))), 'align' => 'center');
- }
- else if ($type == 'theme') {
- $row[] = array('data' => form_radio('', 'theme_default', $info->name, (variable_get('theme_default', 0) == $info->name) ? 1 : 0), 'align' => 'center');
- }
+ $row = array($info->name, $info->description, array('data' => (in_array($filename, $required) ? form_hidden('status]['. $filename, 1) . t('required') : form_checkbox('', 'status]['. $filename, 1, $file->status)), 'align' => 'center'));
+ $row[] = array('data' => (in_array($filename, $throttle_required) ? form_hidden('throttle]['. $filename, 0) . t('required') : form_checkbox(NULL, 'throttle]['. $filename, 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array('disabled' => 'disabled'))), 'align' => 'center');
$rows[] = $row;
}
$output = theme('table', $header, $rows);
- $output .= form_hidden('type', $type);
+ $output .= form_hidden('type', 'module');
return $output;
}
@@ -294,10 +473,17 @@ function system_listing_save($edit = array()) {
if ($op == t('Save configuration')) {
db_query("UPDATE {system} SET status = 0 WHERE type = '%s'", $edit['type']);
foreach ($edit['status'] as $filename => $status) {
+ // Make certain that the default theme is enabled to avoid user error
+ if (($edit['type'] == 'theme') && ($edit['theme_default'] == $filename)) {
+ $status = 1;
+ }
+
db_query("UPDATE {system} SET status = %d, throttle = %d WHERE filename = '%s'", $status, $edit['throttle'][$filename], $filename);
}
if ($edit['type'] == 'theme') {
- variable_set('theme_default', $edit['theme_default']);
+ $path = pathinfo($edit['theme_default']);
+ $name = str_replace(array('themes/'), '', $path['dirname']);
+ variable_set('theme_default', $name);
}
cache_clear_all();
@@ -343,7 +529,7 @@ function system_settings_save() {
*/
function system_themes() {
system_listing_save();
- $form = system_listing('themes');
+ $form = system_theme_listing();
$form .= form_submit(t('Save configuration'));
print theme('page', form($form));
}
@@ -353,44 +539,102 @@ function system_themes() {
*/
function system_modules() {
system_listing_save();
- $form = system_listing('modules');
+ $form = system_module_listing();
$form .= form_submit(t('Save configuration'));
print theme('page', form($form));
}
/**
- * Menu callback; displays a theme's settings page.
+ * Menu callback; displays a module's settings page.
*/
-function system_configure_theme() {
+function system_site_settings($module = NULL) {
system_settings_save();
- $name = arg(2);
- $themes = list_themes();
- $theme = $themes[$name];
-
- if ($theme) {
- include_once "$theme->filename";
-
- $function = $theme->name .'_settings';
- if (function_exists($function)) {
- $form .= $function();
- }
+ if ($module) {
+ $form = module_invoke($module, 'settings');
+ }
+ else {
+ $form = system_view_general();
}
print theme('page', system_settings_form($form));
}
/**
- * Menu callback; displays a module's settings page.
+ * Menu callback; display theme configuration for entire site and individual themes.
*/
-function system_site_settings($module = NULL) {
+function system_theme_settings() {
system_settings_save();
-
- if ($module) {
- $form = module_invoke($module, 'settings');
+ // Default settings are defined in _theme_settings() in includes/theme.inc
+ $key = str_replace('.', '/', arg(3));
+ if ($key) {
+ $settings = drupal_get_theme_settings($key);
+ $var = str_replace('/', '_', 'theme_'. $key .'_settings');
+ $themes = system_theme_data('themes');
+ $features = function_exists($themes[$key]->prefix .'_features') ? call_user_func($themes[$key]->prefix .'_features') : array();
}
else {
- $form = system_view_general();
+ $settings = drupal_get_theme_settings('');
+ $var = 'theme_settings';
+ }
+
+ $form = '';
+
+ // Logo settings
+ if ((!$key) || in_array('logo', $features)) {
+ $group = form_checkbox(t('Use the default logo'), "$var][default_logo", 1, $settings['default_logo'], t('Check here if you want the theme to use the logo supplied with it.'));
+ $group .= form_textfield(t('Path to custom logo'), "$var][logo_path", $settings['logo_path'], 50, 60, t('The path to the file you would like to use as your logo file instead of the default logo.'));
+ $form = form_group(t('Logo image settings'), $group);
+ }
+
+ // System wide only settings.
+ if (!$key) {
+ // Menu settings
+ $group = form_textarea(t('Primary links'), "$var][primary_links", $settings['primary_links'], 70, 8, t('The HTML code for the primary links. If this field is empty, Drupal will automatically generate a set of links based on which modules are enabled.'));
+ $group .= form_textarea(t('Secondary links'), "$var][secondary_links", $settings['secondary_links'], 70, 8, t('The HTML code for the secondary links.'));
+ $form .= form_group(t('Menu Settings'), $group, t('Customize the menus that are displayed at the top and/or bottom of the page. This configuration screen is only available in the site wide display configuration.'));
+
+ // Toggle node display.
+ $group = '';
+ foreach (node_list() as $type) {
+ $group .= form_checkbox($type, "$var][toggle_node_info_$type", 1, $settings["toggle_node_info_$type"]);
+ }
+ $form .= form_group(t('Display post information on'), $group, t('Enable or disable the "submitted by Username on date" text when displaying posts of the above type'));
+ }
+
+ $group = '';
+
+ // Toggle settings
+ $toggles = array('toggle_name' => t('Site name'),
+ 'toggle_search' => t('Search box'),
+ 'toggle_slogan' => t('Site slogan'),
+ 'toggle_mission' => t('Mission statement'),
+ 'toggle_primary_links' => t('Primary links'),
+ 'toggle_secondary_links' => t('Secondary links'),
+ 'toggle_node_user_picture' => t('User pictures in posts'),
+ 'toggle_comment_user_picture' => t('User pictures in comments'));
+
+ foreach ($toggles as $name => $title) {
+ if ((!$key) || in_array($name, $features)) {
+ $group .= form_checkbox($title, "$var][$name", 1, $settings[$name]);
+ }
+ }
+ if ($group) {
+ $form .= form_group(t('Toggle display'), $group, t('Enable or disable the display of certain page elements.'));
+ }
+
+ if ($key) {
+ // Template-specific settings
+ $function = function_exists($themes[$key]->prefix .'_settings');
+ if (function_exists($function)) {
+ $group = $function();
+ if (strpos($themes[$key]->description, '.theme')) {
+ $form .= form_group(t('Theme-specific settings'), $group, t('These settings only exist for the %theme theme and all the styles based on it.', array('%theme' => $themes[$key]->prefix)));
+ }
+ else {
+ $form .= form_group(t('Engine-specific settings'), $group, t('These settings only exist for all the templates and styles based on the %engine theme engine.', array('%engine' => $themes[$key]->prefix)));
+ }
+ }
}
print theme('page', system_settings_form($form));
diff --git a/modules/system/system.module b/modules/system/system.module
index fc116064c..aa8964095 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -11,7 +11,12 @@ function system_help($section) {
case 'admin/settings':
return t('General configuration options for your site. Set up the name of the site, e-mail address used in mail-outs, clean URL options, caching, etc.');
case 'admin/themes':
- return t('Select which themes are available to your users and specify the default theme.');
+ return t('Select which themes are available to your users and specify the default theme. To configure site-wide display settings, click the "configure" task above. Alternately, to override these settings in a specific theme, click the "configure" link for the corresponding theme.');
+ case 'admin/themes/settings':
+ return t('These options control the default display settings for your entire site, across all themes. Unless they have been overridden by a specific theme, these settings will be used.');
+ case 'admin/themes/settings/'. arg(3):
+ $theme = array_pop(explode('.', arg(3), 2));
+ return t('These options control the display settings for the <code>%template</code> theme. When your site is displayed using this theme, these settings will be used. By clicking "Reset to defaults," you can choose to use the <a href="%global">global settings</a> for this theme.', array('%template' => $theme, '%global' => url('admin/themes/settings')));
case 'admin/modules':
return t("Modules are plugins for Drupal that extend its core functionality. Here you can select which modules are enabled. Click on the name of the module in the navigation menu for their individual configuration pages. Once a module is enabled, new <a href=\"%permissions\">permissions</a> might be made available. Modules can automatically be temporarily disabled to reduce server load when your site becomes extremely busy by checking throttle. The auto-throttle functionality must be enabled on the <a href=\"%throttle\">throttle configuration page</a> after having enabled the throttle module.", array('%permissions' => url('admin/user/configure/permission'), '%throttle' => url('admin/settings/throttle')));
case 'admin/help#system':
@@ -57,28 +62,35 @@ function system_menu() {
'type' => MENU_CALLBACK);
$access = user_access('administer site configuration');
+
// Themes:
$items[] = array('path' => 'admin/themes', 'title' => t('themes'),
'callback' => 'system_themes', 'access' => $access);
+
+ $items[] = array('path' => 'admin/themes/select', 'title' => t('select'),
+ 'callback' => 'system_themes', 'access' => $access,
+ 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1);
+
+ $items[] = array('path' => 'admin/themes/settings', 'title' => t('configure'),
+ 'callback' => 'system_theme_settings', 'access' => $access,
+ 'type' => MENU_LOCAL_TASK);
+
+ // Theme configuration subtabs
+ $items[] = array('path' => 'admin/themes/settings/global', 'title' => t('global settings'),
+ 'callback' => 'system_theme_settings', 'access' => $access,
+ 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -1);
+
foreach (list_themes() as $theme) {
- // TODO: reenable 'forced refresh' once we move the menu_build() later
- // in the request. It added overhead with no benefit.
- // NOTE: refresh the list because some themes might have been enabled/disabled.
- include_once $theme->filename;
- $function = $theme->name .'_settings';
- if (function_exists($function)) {
- $items[] = array('path' => 'admin/themes/'. $theme->name, 'title' => $theme->name,
- 'callback' => 'system_configure_theme', 'access' => $access);
- }
+ $path = str_replace('/', '.', $theme->name);
+ $items[] = array('path' => 'admin/themes/settings/'. $path, 'title' => basename($theme->name),
+ 'callback' => 'system_theme_settings', 'access' => $access,
+ 'type' => MENU_LOCAL_TASK);
}
// Modules:
$items[] = array('path' => 'admin/settings', 'title' => t('settings'),
'callback' => 'system_site_settings', 'access' => $access);
foreach (module_list() as $name) {
- // TODO: reenable 'forced refresh' once we move the menu_build() later
- // in the request. It added overhead with no benefit.
- // NOTE: refresh the list because some modules might have been enabled/disabled.
if (module_hook($name, 'settings')) {
$items[] = array('path' => 'admin/settings/'. $name, 'title' => t($name));
}
@@ -96,12 +108,34 @@ function system_menu() {
*/
function system_user($type, $edit, &$user, $category = NULL) {
if ($type == 'form' && $category == 'account') {
- $options = '<option value="">'. t('Default theme') ."</option>\n";
if (count($themes = list_themes()) > 1) {
+ $rows = array();
foreach ($themes as $key => $value) {
- $options .= "<option value=\"$key\"". (($edit['theme'] == $key) ? ' selected="selected"' : '') .">$key - $value->description</option>\n";
+ $row = array();
+
+ // Screenshot column.
+ $screenshot = dirname($value->filename) .'/screenshot.png';
+ $row[] = file_exists($screenshot) ? theme('image', $screenshot, t('Screenshot for %theme theme', array('%theme' => $value->name)), '', 'class="screenshot"') : t('no screenshot');
+
+ // Information field.
+ $field = '<strong>'. basename($value->name) .'</strong>';
+ $row[] = $field;
+
+ // Reset to follow site default theme if user selects the site default
+ if ($key == variable_get('theme_default', 'bluemarine')) {
+ $key = '';
+ if ($edit['theme'] == variable_get('theme_default', 'bluemarine')) {
+ $edit['theme'] = '';
+ }
+ }
+
+ // Selected column.
+ $row[] = array('data' => form_radio('', 'theme', $key, ($edit['theme'] == $key) ? 1 : 0), 'align' => 'center');
+
+ $rows[] = $row;
}
- $data[] = array('title' => t('Theme settings'), 'data' => form_item(t('Theme'), "<select name=\"edit[theme]\">$options</select>", t('Selecting a different theme will change the look and feel of the site.')), 'weight' => 2);
+ $header = array(t('Screenshot'), t('Name'), t('Selected'));
+ $data[] = array('title' => t('Theme settings'), 'data' => form_item('', theme('table', $header, $rows), t('Selecting a different theme will change the look and feel of the site.')), 'weight' => 2);
}
if (variable_get('configurable_timezones', 1)) {
@@ -199,25 +233,48 @@ function system_view_general() {
return $output;
}
-function system_listing($type) {
- // Pick appropriate directory and filetype
- switch ($type) {
- case 'modules':
- $directory = 'modules';
- $type = 'module';
- break;
- case 'themes':
- default:
- $directory = 'themes';
- $type = 'theme';
- break;
+/**
+ * Inventory theme engines and insert entries for them into the system table
+ */
+function system_theme_engine_inventory($directory) {
+ $engines = array();
+
+ // Remove all theme engines from the system table
+ db_query('DELETE FROM {system} WHERE type = \'%s\'', 'theme_engine');
+
+ // Find theme engines in the directory and insert into database
+ $files = file_scan_directory($directory. '/engines', '\.engine$');
+
+ foreach ($files as $filename => $file) {
+ module_set_filename($file->name, $filename);
+ module_load($file->name);
+
+ $info->name = $file->name;
+ $info->filename = $file->filename;
+ $engines[$info->name] = $info;
+
+ db_query('INSERT INTO {system} (name, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, 'theme_engine', $filename, 1, 0, 0);
}
+ return $engines;
+}
+/**
+ * Retrieves an array of a particular type of files (specified by $type) in a particular $directory
+ * and their current status in the system table.
+ */
+function system_get_files($search, $type, $directory) {
// Find files in the directory.
- $files = file_scan_directory($directory, "\.$type$");
+ $files = file_scan_directory($directory, $search);
+ return $files;
+}
+
+/**
+ * Retrieves the current status of an array of files in the system table.
+ */
+function system_get_files_database(&$files, $type) {
// Extract current files from database.
- $result = db_query("SELECT filename, type, status, throttle FROM {system} WHERE type = '%s'", $type);
+ $result = db_query('SELECT filename, type, status, throttle FROM {system} WHERE type = \'%s\'', $type);
while ($file = db_fetch_object($result)) {
if (is_object($files[$file->filename])) {
foreach ($file as $key => $value) {
@@ -225,64 +282,186 @@ function system_listing($type) {
}
}
}
+}
- ksort($files);
+/**
+ * Obtains information about each theme in the $files array
+ * Also updates the system table
+ */
+function system_obtain_theme_info($files, $directory) {
+ foreach ($files as $filename => $file) {
+ if ($file->theme) {
+ // file is a style
+ $info->description = $file->theme;
+ $info->style = TRUE;
+ }
+
+ if (strpos($filename, '.theme')) {
+ // file is a theme
+ module_set_filename($file->name, $filename);
+ module_load($file->name);
+ $info->description = '';
+ $info->prefix = basename($filename, '.theme');
+ }
+ elseif ($info->style && !$file->engine) {
+ $info->prefix = $info->description;
+ }
+ else {
+ // file is a template
+ $info->description = $info->style ? $info->description : $file->engine;
+ $info->template = TRUE;
+ $info->prefix = basename($file->engine, '.engine');
+ }
+
+ $info->filename = $filename;
+ $info->path = pathinfo($info->filename);
+ $info->name = str_replace(array($directory .'/'), '', $info->path['dirname']);
+ $info->shortname = basename($info->name);
+ $info->screenshot = dirname($info->filename) .'/screenshot.png';
+
+ $info->status = $file->status;
- if ($type == 'module') {
- $required = array('modules/admin.module', 'modules/block.module', 'modules/filter.module', 'modules/system.module', 'modules/user.module', 'modules/watchdog.module');
- // the throttle mechanism requires additional modules always be enabled
- $throttle_required = array_merge($required, array('modules/statistics.module', 'modules/throttle.module'));
+ $themes[$info->name] = $info;
- $header = array(t('Name'), t('Description'), t('Status'), t('Throttle'));
+ // Update the contents of the system table:
+ db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $info->filename, 'theme');
+ db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'theme', $info->filename, $info->status, 0, 0);
}
- else {
- $required = array();
- $header = array(t('Name'), t('Description'), t('Enable'), t('Default'));
+ return $themes;
+}
+
+/**
+ * Collect data about all currently available themes
+ */
+function system_theme_data($directory) {
+ // Find theme engines
+ $engines = system_theme_engine_inventory($directory);
+
+ // Get current list of themes and their present status in the system table.
+ $files = system_get_files('\.theme$', 'theme', $directory);
+
+ // Add templates to the site listing
+ foreach ($engines as $engine) {
+ foreach (call_user_func($engine->name .'_templates', $directory) as $template) {
+ $template_files[$template->filename] = $template;
+ $template_files[$template->filename]->engine = $engine->filename;
+ foreach ($files as $file) {
+ // do not double-insert templates with theme files in their directory
+ if (dirname($template->filename) == dirname($file->filename)) {
+ unset($template_files[$template->filename]);
+ }
+ }
+ }
+ }
+ $files = array_merge($files, $template_files);
+
+ // Find styles in each theme's directory.
+ foreach ($files as $file) {
+ foreach (system_get_files("style.css$", 'theme', dirname($file->filename)) as $style) {
+ // do not double-insert themes with css files in their directory
+ if (dirname($style->filename) != dirname($file->filename)) {
+ $style_files[$style->filename] = $style;
+ $path = pathinfo($file->filename);
+ $style_files[$style->filename]->theme = str_replace(array($directory .'/'), '', $path['dirname']);
+ if ($file->engine) {
+ $style_files[$style->filename]->engine = $file->engine;
+ }
+ }
+ }
}
+ $files = array_merge($files, $style_files);
+
+ // Extract current files from database.
+ system_get_files_database($files, 'theme');
+
+ // Build an array of information about each theme for use in displaying the selection table.
+ return system_obtain_theme_info($files, $directory);
+}
+
+/**
+ * Generate a list of all the available theme/style combinations.
+ */
+function system_theme_listing() {
+ $directory = 'themes';
+
+ $themes = system_theme_data($directory);
+ ksort($themes);
+
+ foreach ($themes as $key => $info) {
+ $row = array();
+
+ // Screenshot column.
+ $row[] = file_exists($info->screenshot) ? theme('image', $info->screenshot, t('Screenshot for %theme theme', array('%theme' => $info->shortname)), '', 'class="screenshot"') : t('no screenshot');
+
+ // Information field.
+ $field = '<strong>'. $info->shortname .'</strong>';
+ $field .= '<br /><em>themes/'. $key .'</em>';
+ $row[] = $field;
+
+ // enabled, default, and operations columns
+ $row[] = array('data' => form_checkbox('', 'status]['. $info->filename, 1, $info->status), 'align' => 'center');
+ $row[] = array('data' => form_radio('', 'theme_default', $info->filename, (variable_get('theme_default', 'bluemarine') == $key) ? 1 : 0), 'align' => 'center');
+ if (function_exists($info->prefix .'_settings') || function_exists($info->prefix .'_features')) {
+ $row[] = array('data' => l(t('configure'), 'admin/themes/settings/'. str_replace('/', '.', $key)), 'align' => 'center');
+ }
+ else {
+ $row[] = '';
+ }
+ $rows[] = $row;
+ }
+
+ $header = array(t('Screenshot'), t('Name'), t('Enabled'), t('Default'), t('Operations'));
+ $output = form_hidden('type', 'theme');
+ $output .= theme('table', $header, $rows);
+ return $output;
+}
+
+/**
+ * Generate a list of all the available modules, as well as update the system list.
+ */
+function system_module_listing() {
+ $directory = 'modules';
+
+ // Get current list of modules
+ $files = system_get_files('\.module$', 'module', $directory);
+
+ // Extract current files from database.
+ system_get_files_database($files, 'module');
+
+ ksort($files);
+
+ $required = array('modules/admin.module', 'modules/block.module', 'modules/filter.module', 'modules/system.module', 'modules/user.module', 'modules/watchdog.module');
+ // the throttle mechanism requires additional modules always be enabled
+ $throttle_required = array_merge($required, array('modules/statistics.module', 'modules/throttle.module'));
+
+ $header = array(t('Name'), t('Description'), t('Status'), t('Throttle'));
foreach ($files as $filename => $file) {
module_set_filename($file->name, $filename);
module_load($file->name);
- if ($type == 'module') {
- $info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : $file->name;
- $info->description = module_invoke($file->name, 'help', 'admin/modules#description');
- // log the critical hooks implemented by this module
- $bootstrap = 0;
- foreach (bootstrap_hooks() as $hook) {
- if (module_hook($file->name, $hook)) {
- $bootstrap = 1;
- break;
- }
- }
- }
- elseif ($type == 'theme') {
- $info->name = $file->name;
- $info->description = module_invoke($file->name, 'help', 'admin/themes#description');
- $themes[] = $info->name;
-
- // Enable the default theme:
- if ($info->name == variable_get('theme_default', 0)) {
- $file->status = 1;
+ $info->name = module_invoke($file->name, 'help', 'admin/modules#name') ? module_invoke($file->name, 'help', 'admin/modules#name') : $file->name;
+ $info->description = module_invoke($file->name, 'help', 'admin/modules#description');
+ // log the critical hooks implemented by this module
+ $bootstrap = 0;
+ foreach (bootstrap_hooks() as $hook) {
+ if (module_hook($file->name, $hook)) {
+ $bootstrap = 1;
+ break;
}
}
// Update the contents of the system table:
- db_query("DELETE FROM {system} WHERE filename = '%s' AND type = '%s'", $filename, $type);
- db_query("INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES ('%s', '%s', '%s', '%s', %d, %d, %d)", $info->name, $info->description, $type, $filename, $file->status, $file->throttle, $bootstrap);
+ db_query('DELETE FROM {system} WHERE filename = \'%s\' AND type = \'%s\'', $filename, 'module');
+ db_query('INSERT INTO {system} (name, description, type, filename, status, throttle, bootstrap) VALUES (\'%s\', \'%s\', \'%s\', \'%s\', %d, %d, %d)', $info->name, $info->description, 'module', $filename, $file->status, $file->throttle, $bootstrap);
- $row = array($info->name, $info->description, array('data' => (in_array($filename, $required) ? form_hidden("status][$filename", 1) . t('required') : form_checkbox('', "status][$filename", 1, $file->status)), 'align' => 'center'));
- if ($type == 'module') {
- $row[] = array('data' => (in_array($filename, $throttle_required) ? form_hidden("throttle][$filename", 0) . t('required') : form_checkbox(NULL, "throttle][$filename", 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array('disabled' => 'disabled'))), 'align' => 'center');
- }
- else if ($type == 'theme') {
- $row[] = array('data' => form_radio('', 'theme_default', $info->name, (variable_get('theme_default', 0) == $info->name) ? 1 : 0), 'align' => 'center');
- }
+ $row = array($info->name, $info->description, array('data' => (in_array($filename, $required) ? form_hidden('status]['. $filename, 1) . t('required') : form_checkbox('', 'status]['. $filename, 1, $file->status)), 'align' => 'center'));
+ $row[] = array('data' => (in_array($filename, $throttle_required) ? form_hidden('throttle]['. $filename, 0) . t('required') : form_checkbox(NULL, 'throttle]['. $filename, 1, $file->throttle, NULL, module_exist('throttle') ? NULL : array('disabled' => 'disabled'))), 'align' => 'center');
$rows[] = $row;
}
$output = theme('table', $header, $rows);
- $output .= form_hidden('type', $type);
+ $output .= form_hidden('type', 'module');
return $output;
}
@@ -294,10 +473,17 @@ function system_listing_save($edit = array()) {
if ($op == t('Save configuration')) {
db_query("UPDATE {system} SET status = 0 WHERE type = '%s'", $edit['type']);
foreach ($edit['status'] as $filename => $status) {
+ // Make certain that the default theme is enabled to avoid user error
+ if (($edit['type'] == 'theme') && ($edit['theme_default'] == $filename)) {
+ $status = 1;
+ }
+
db_query("UPDATE {system} SET status = %d, throttle = %d WHERE filename = '%s'", $status, $edit['throttle'][$filename], $filename);
}
if ($edit['type'] == 'theme') {
- variable_set('theme_default', $edit['theme_default']);
+ $path = pathinfo($edit['theme_default']);
+ $name = str_replace(array('themes/'), '', $path['dirname']);
+ variable_set('theme_default', $name);
}
cache_clear_all();
@@ -343,7 +529,7 @@ function system_settings_save() {
*/
function system_themes() {
system_listing_save();
- $form = system_listing('themes');
+ $form = system_theme_listing();
$form .= form_submit(t('Save configuration'));
print theme('page', form($form));
}
@@ -353,44 +539,102 @@ function system_themes() {
*/
function system_modules() {
system_listing_save();
- $form = system_listing('modules');
+ $form = system_module_listing();
$form .= form_submit(t('Save configuration'));
print theme('page', form($form));
}
/**
- * Menu callback; displays a theme's settings page.
+ * Menu callback; displays a module's settings page.
*/
-function system_configure_theme() {
+function system_site_settings($module = NULL) {
system_settings_save();
- $name = arg(2);
- $themes = list_themes();
- $theme = $themes[$name];
-
- if ($theme) {
- include_once "$theme->filename";
-
- $function = $theme->name .'_settings';
- if (function_exists($function)) {
- $form .= $function();
- }
+ if ($module) {
+ $form = module_invoke($module, 'settings');
+ }
+ else {
+ $form = system_view_general();
}
print theme('page', system_settings_form($form));
}
/**
- * Menu callback; displays a module's settings page.
+ * Menu callback; display theme configuration for entire site and individual themes.
*/
-function system_site_settings($module = NULL) {
+function system_theme_settings() {
system_settings_save();
-
- if ($module) {
- $form = module_invoke($module, 'settings');
+ // Default settings are defined in _theme_settings() in includes/theme.inc
+ $key = str_replace('.', '/', arg(3));
+ if ($key) {
+ $settings = drupal_get_theme_settings($key);
+ $var = str_replace('/', '_', 'theme_'. $key .'_settings');
+ $themes = system_theme_data('themes');
+ $features = function_exists($themes[$key]->prefix .'_features') ? call_user_func($themes[$key]->prefix .'_features') : array();
}
else {
- $form = system_view_general();
+ $settings = drupal_get_theme_settings('');
+ $var = 'theme_settings';
+ }
+
+ $form = '';
+
+ // Logo settings
+ if ((!$key) || in_array('logo', $features)) {
+ $group = form_checkbox(t('Use the default logo'), "$var][default_logo", 1, $settings['default_logo'], t('Check here if you want the theme to use the logo supplied with it.'));
+ $group .= form_textfield(t('Path to custom logo'), "$var][logo_path", $settings['logo_path'], 50, 60, t('The path to the file you would like to use as your logo file instead of the default logo.'));
+ $form = form_group(t('Logo image settings'), $group);
+ }
+
+ // System wide only settings.
+ if (!$key) {
+ // Menu settings
+ $group = form_textarea(t('Primary links'), "$var][primary_links", $settings['primary_links'], 70, 8, t('The HTML code for the primary links. If this field is empty, Drupal will automatically generate a set of links based on which modules are enabled.'));
+ $group .= form_textarea(t('Secondary links'), "$var][secondary_links", $settings['secondary_links'], 70, 8, t('The HTML code for the secondary links.'));
+ $form .= form_group(t('Menu Settings'), $group, t('Customize the menus that are displayed at the top and/or bottom of the page. This configuration screen is only available in the site wide display configuration.'));
+
+ // Toggle node display.
+ $group = '';
+ foreach (node_list() as $type) {
+ $group .= form_checkbox($type, "$var][toggle_node_info_$type", 1, $settings["toggle_node_info_$type"]);
+ }
+ $form .= form_group(t('Display post information on'), $group, t('Enable or disable the "submitted by Username on date" text when displaying posts of the above type'));
+ }
+
+ $group = '';
+
+ // Toggle settings
+ $toggles = array('toggle_name' => t('Site name'),
+ 'toggle_search' => t('Search box'),
+ 'toggle_slogan' => t('Site slogan'),
+ 'toggle_mission' => t('Mission statement'),
+ 'toggle_primary_links' => t('Primary links'),
+ 'toggle_secondary_links' => t('Secondary links'),
+ 'toggle_node_user_picture' => t('User pictures in posts'),
+ 'toggle_comment_user_picture' => t('User pictures in comments'));
+
+ foreach ($toggles as $name => $title) {
+ if ((!$key) || in_array($name, $features)) {
+ $group .= form_checkbox($title, "$var][$name", 1, $settings[$name]);
+ }
+ }
+ if ($group) {
+ $form .= form_group(t('Toggle display'), $group, t('Enable or disable the display of certain page elements.'));
+ }
+
+ if ($key) {
+ // Template-specific settings
+ $function = function_exists($themes[$key]->prefix .'_settings');
+ if (function_exists($function)) {
+ $group = $function();
+ if (strpos($themes[$key]->description, '.theme')) {
+ $form .= form_group(t('Theme-specific settings'), $group, t('These settings only exist for the %theme theme and all the styles based on it.', array('%theme' => $themes[$key]->prefix)));
+ }
+ else {
+ $form .= form_group(t('Engine-specific settings'), $group, t('These settings only exist for all the templates and styles based on the %engine theme engine.', array('%engine' => $themes[$key]->prefix)));
+ }
+ }
}
print theme('page', system_settings_form($form));
diff --git a/themes/bluemarine/logo.png b/themes/bluemarine/logo.png
new file mode 100644
index 000000000..e72da094e
--- /dev/null
+++ b/themes/bluemarine/logo.png
Binary files differ
diff --git a/themes/bluemarine/screenshot.png b/themes/bluemarine/screenshot.png
new file mode 100644
index 000000000..9c6a9097d
--- /dev/null
+++ b/themes/bluemarine/screenshot.png
Binary files differ
diff --git a/themes/xtemplate/default/xtemplate.css b/themes/bluemarine/style.css
index b165f3489..c72ee52d8 100644
--- a/themes/xtemplate/default/xtemplate.css
+++ b/themes/bluemarine/style.css
@@ -1,336 +1,354 @@
-/* $Id$ */
-
-/*
-** HTML elements
-*/
-body {
- margin: 0;
- padding: 0;
- color: #000;
- background-color: #fff;
- font: 76% Verdana, Arial, Helvetica, sans-serif;
-}
-tr.dark td, tr.light td {
- padding: 0.3em;
-}
-h1, h2, h3, h4, h5, h6 {
- margin: 0.5;
-}
-h1 {
- font-size: 1.3em;
-}
-h2 {
- font-size: 1.2em;
-}
-h3, h4, h5, h6 {
- font-size: 1.1em;
-}
-a {
- text-decoration: none;
- font-weight: bold;
-}
-a:link {
- color: #39c;
-}
-a:visited {
- color: #369;
-}
-a:hover {
- color: #39c;
- text-decoration: underline;
-}
-fieldset {
- border: 1px solid #ccc;
-}
-pre {
- background-color: #eee;
- padding: 0.75em 1.5em;
- font-size: 12px;
- border: 1px solid #ddd;
-}
-table {
- /* make <td> sizes relative to body size! */
- font-size: 1em;
-}
-.form-item label {
- font-size: 1em;
- color: #222;
-}
-.item-list .title {
- font-size: 1em;
- color: #222;
-}
-.links {
- margin-bottom: 0em;
-}
-.comment .links {
- margin-bottom: 0em;
-}
-
-/*
-** Page layout blocks / IDs
-*/
-#header, #content {
- width: 100%;
-}
-#header {
- background-color: #69c;
-}
-#logo {
- vertical-align: bottom;
- border: 0;
- font-weight: bold;
- font-size: 1.9em;
- color: #fff;
-}
-#logo img {
- display: block;
-}
-#menu {
- padding: 0.5em 0.5em 0 0.5em;
- text-align: right;
- vertical-align: middle;
-}
-#primary {
- font-size: 1.0em;
- padding: 0em 0.8em 0.5em 0;
- color: #9cf;
-}
-#primary a {
- font-weight: bold;
- color: #fff;
-}
-#secondary {
- padding: 0 1em 0.5em 0;
- font-size: 0.8em;
- color: #9cf;
-}
-#secondary a {
- font-weight: bold;
- color: #9cf;
-}
-#search .form-text, #search .form-submit {
- border: 1px solid #369;
- font-size: 1.1em;
-}
-#search .form-text {
- width: 8em;
- height: 1.4em;
- padding: 0 0.5em 0 0.5em;
- margin: 0 0 0.5em 0;
-}
-#search .form-submit {
- height: 1.5em;
-}
-#mission {
- background-color: #369;
- padding: 1.5em 2em;
- color: #fff;
-}
-#mission a, #mission a:visited {
- color: #9cf;
- font-weight: bold;
-}
-#main {
- /* padding in px not ex because IE messes up 100% width tables otherwise */
- padding: 10px;
-}
-#mission, .node .content, .comment .content {
- line-height: 1.4;
-}
-#help {
- font-size: 0.9em;
- margin-bottom: 1em;
-}
-.breadcrumb {
- margin-bottom: .5em;
-}
-.messages {
- background-color: #eee;
- border: 1px solid #ccc;
- padding: 0.3em;
- margin-bottom: 1em;
-}
-.error {
- border-color: red;
-}
-#sidebar-left, #sidebar-right {
- background-color: #ddd;
- width: 16em;
- /* padding in px not ex because IE messes up 100% width tables otherwise */
- padding: 10px;
- vertical-align: top;
-}
-#footer {
- background-color: #eee;
- padding: 1em;
- font-size: 0.8em;
-}
-
-/*
-** Common declarations for child classes of node, comment, block, box, etc.
-** If you want any of them styled differently for a specific parent, add
-** additional rules /with only the differing properties!/ to .parent .class.
-** See .comment .title for an example.
-*/
-.title, .title a {
- font-weight: bold;
- font-size: 1.3em;
- color: #777;
- margin: 0 auto 0 auto; /* decrease default margins for h<x>.title */
-}
-.submitted {
- color: #999;
- font-size: 0.8em;
-}
-.links {
- color: #999;
-}
-.links a {
- font-weight: bold;
-}
-.block, .box {
- padding: 0 0 1.5em 0;
-}
-.block {
- border-bottom: 1px solid #bbb;
- padding-bottom: 0.75em;
- margin-bottom: 1.5em;
-}
-.block .title {
- margin-bottom: .25em;
-}
-.box .title {
- font-size: 1.1em;
-}
-.node {
- margin: .5em 0 2em 0;
-}
-.sticky {
- padding: .5em;
- background-color: #eee;
- border: solid 1px #ddd;
-}
-.node .content, .comment .content {
- margin: .5em 0 .5em 0;
-}
-.node .taxonomy {
- color: #999;
- font-size: 0.8em;
- padding: 1.5em;
-}
-.node .picture {
- border: 1px solid #ddd;
- float: right;
- margin: 0.5em;
-}
-.comment {
- border: 1px solid #abc;
- padding: .5em;
- margin-bottom: 1em;
-}
-.comment .title a {
- font-size: 1.1em;
- font-weight: normal;
-}
-.comment .new {
- text-align: right;
- font-weight: bold;
- font-size: 0.8em;
- float: right;
- color: red;
-}
-.comment .picture {
- border: 1px solid #abc;
- float: right;
- margin: 0.5em;
-}
-
-/*
-** Module specific styles
-*/
-#aggregator .feed {
- background-color: #eee;
- border: 1px solid #ccc;
- padding: 1em;
- margin: 1em 0 1em 0;
-}
-#aggregator .news-item .source, #aggregator .news-item .categories, #aggregator .source, #aggregator .age {
- color: #999;
- font-style: italic;
- font-size: 0.9em;
-}
-#aggregator .title {
- margin-bottom: 0.5em;
- font-size: 1em;
-}
-#aggregator h3 {
- margin-top: 1em;
-}
-#forum table {
- width: 100%;
-}
-#forum td {
- padding: 0.5em 0.5em 0.5em 0.5em;
-}
-#forum td.forum, #forum td.posts {
- background-color: #eee;
-}
-#forum td.topics, #forum td.last-reply {
- background-color: #ddd;
-}
-#forum td.container {
- background-color: #ccc;
-}
-#forum td.container a {
- color: #555;
-}
-#forum td.statistics, #forum td.settings, #forum td.pager {
- height: 1.5em;
- border: 1px solid #bbb;
-}
-#forum td .name {
- color: #96c;
-}
-#forum td .links {
- padding-top: 0.7em;
- font-size: 0.9em;
-}
-#profile .profile {
- clear: both;
- border: 1px solid #abc;
- padding: .5em;
- margin: 1em 0em 1em 0em;
-}
-#profile .profile .name {
- padding-bottom: 0.5em;
-}
-.block-forum h3 {
- margin-bottom: .5em;
-}
-.calendar a {
- text-decoration: none;
-}
-.calendar td, .calendar th {
- padding: 0.4em 0;
- border-color: #888;
-}
-.calendar .day-today {
- background-color: #69c;
-}
-.calendar .day-today a {
- color: #fff;
-}
-.calendar .day-selected {
- background-color: #369;
- color: #fff;
-}
-.calendar .header-week {
- background-color: #ccc;
-}
-.calendar .day-blank {
- background-color: #ccc;
-}
-.calendar .row-week td a:hover {
- background-color: #fff; color: #000;
-}
+/* $Id$ */
+
+/*
+** HTML elements
+*/
+body {
+ margin: 0;
+ padding: 0;
+ color: #000;
+ background-color: #fff;
+ font: 76% Verdana, Arial, Helvetica, sans-serif;
+}
+tr.dark td, tr.light td {
+ padding: 0.3em;
+}
+h1, h2, h3, h4, h5, h6 {
+ margin: 0.5;
+}
+h1 {
+ font-size: 1.3em;
+}
+h2 {
+ font-size: 1.2em;
+}
+h3, h4, h5, h6 {
+ font-size: 1.1em;
+}
+a {
+ text-decoration: none;
+ font-weight: bold;
+}
+a:link {
+ color: #39c;
+}
+a:visited {
+ color: #369;
+}
+a:hover {
+ color: #39c;
+ text-decoration: underline;
+}
+fieldset {
+ border: 1px solid #ccc;
+}
+pre {
+ background-color: #eee;
+ padding: 0.75em 1.5em;
+ font-size: 12px;
+ border: 1px solid #ddd;
+}
+table {
+ /* make <td> sizes relative to body size! */
+ font-size: 1em;
+}
+.form-item label {
+ font-size: 1em;
+ color: #222;
+}
+.item-list .title {
+ font-size: 1em;
+ color: #222;
+}
+.links {
+ margin-bottom: 2em;
+}
+.comment .links {
+ margin-bottom: 0em;
+}
+
+/*
+** Page layout blocks / IDs
+*/
+#header, #content {
+ width: 100%;
+}
+#header {
+ background-color: #69c;
+}
+#logo {
+ vertical-align: middle;
+ border: 0;
+}
+#logo img {
+ float: left;
+ padding: 0em 1.0em 0em 1em;
+}
+#menu {
+ padding: 0.5em 0.5em 0 0.5em;
+ text-align: right;
+ vertical-align: middle;
+}
+#primary {
+ font-size: 1.0em;
+ padding: 0em 0.8em 0.5em 0;
+ color: #9cf;
+}
+#primary a {
+ font-weight: bold;
+ color: #fff;
+}
+#secondary {
+ padding: 0 1em 0.5em 0;
+ font-size: 0.8em;
+ color: #9cf;
+}
+#secondary a {
+ font-weight: bold;
+ color: #9cf;
+}
+#search .form-text, #search .form-submit {
+ border: 1px solid #369;
+ font-size: 1.1em;
+}
+#search .form-text {
+ width: 8em;
+ height: 1.4em;
+ padding: 0 0.5em 0 0.5em;
+ margin: 0 0 0.5em 0;
+}
+#search .form-submit {
+ height: 1.5em;
+}
+#mission {
+ background-color: #369;
+ padding: 1.5em 2em;
+ color: #fff;
+}
+#mission a, #mission a:visited {
+ color: #9cf;
+ font-weight: bold;
+}
+.site-name {
+ margin: 0.6em 0em 0em 0em;
+ padding: 0em;
+ font-size: 2em;
+}
+.site-name a:link, .site-name a:visited {
+ color: #fff;
+}
+.site-name a:hover {
+ color: #369;
+ text-decoration: none;
+}
+.site-slogan {
+ font-size: 1em;
+ color: #eee;
+ display: block;
+ margin: 0em 0em 0em 0em;
+ font-style: italic;
+ font-weight: bold;
+}
+#main {
+ /* padding in px not ex because IE messes up 100% width tables otherwise */
+ padding: 10px;
+}
+#mission, .node .content, .comment .content {
+ line-height: 1.4;
+}
+#help {
+ font-size: 0.9em;
+ margin-bottom: 1em;
+}
+.breadcrumb {
+ margin-bottom: .5em;
+}
+.messages {
+ background-color: #eee;
+ border: 1px solid #ccc;
+ padding: 0.3em;
+ margin-bottom: 1em;
+}
+.error {
+ border-color: red;
+}
+#sidebar-left, #sidebar-right {
+ background-color: #ddd;
+ width: 16em;
+ /* padding in px not ex because IE messes up 100% width tables otherwise */
+ padding: 10px;
+ vertical-align: top;
+}
+#footer {
+ background-color: #eee;
+ padding: 1em;
+ font-size: 0.8em;
+}
+
+/*
+** Common declarations for child classes of node, comment, block, box, etc.
+** If you want any of them styled differently for a specific parent, add
+** additional rules /with only the differing properties!/ to .parent .class.
+** See .comment .title for an example.
+*/
+.title, .title a {
+ font-weight: bold;
+ font-size: 1.3em;
+ color: #777;
+ margin: 0 auto 0 auto; /* decrease default margins for h<x>.title */
+}
+.submitted {
+ color: #999;
+ font-size: 0.8em;
+}
+.links {
+ color: #999;
+}
+.links a {
+ font-weight: bold;
+}
+.block, .box {
+ padding: 0 0 1.5em 0;
+}
+.block {
+ border-bottom: 1px solid #bbb;
+ padding-bottom: 0.75em;
+ margin-bottom: 1.5em;
+}
+.block .title {
+ margin-bottom: .25em;
+}
+.box .title {
+ font-size: 1.1em;
+}
+.node {
+ margin: .5em 0 1em 0;
+}
+.sticky {
+ padding: .5em;
+ background-color: #eee;
+ border: solid 1px #ddd;
+}
+.node .content, .comment .content {
+ margin: .5em 0 .5em 0;
+}
+.node .taxonomy {
+ color: #999;
+ font-size: 0.8em;
+ padding: 1.5em;
+}
+.node .picture {
+ border: 1px solid #ddd;
+ float: right;
+ margin: 0.5em;
+}
+.comment {
+ border: 1px solid #abc;
+ padding: .5em;
+ margin-bottom: 1em;
+}
+.comment .title a {
+ font-size: 1.1em;
+ font-weight: normal;
+}
+.comment .new {
+ text-align: right;
+ font-weight: bold;
+ font-size: 0.8em;
+ float: right;
+ color: red;
+}
+.comment .picture {
+ border: 1px solid #abc;
+ float: right;
+ margin: 0.5em;
+}
+
+/*
+** Module specific styles
+*/
+#aggregator .feed {
+ background-color: #eee;
+ border: 1px solid #ccc;
+ padding: 1em;
+ margin: 1em 0 1em 0;
+}
+#aggregator .news-item .source, #aggregator .news-item .categories, #aggregator .source, #aggregator .age {
+ color: #999;
+ font-style: italic;
+ font-size: 0.9em;
+}
+#aggregator .title {
+ margin-bottom: 0.5em;
+ font-size: 1em;
+}
+#aggregator h3 {
+ margin-top: 1em;
+}
+#forum table {
+ width: 100%;
+}
+#forum td {
+ padding: 0.5em 0.5em 0.5em 0.5em;
+}
+#forum td.forum, #forum td.posts {
+ background-color: #eee;
+}
+#forum td.topics, #forum td.last-reply {
+ background-color: #ddd;
+}
+#forum td.container {
+ background-color: #ccc;
+}
+#forum td.container a {
+ color: #555;
+}
+#forum td.statistics, #forum td.settings, #forum td.pager {
+ height: 1.5em;
+ border: 1px solid #bbb;
+}
+#forum td .name {
+ color: #96c;
+}
+#forum td .links {
+ padding-top: 0.7em;
+ font-size: 0.9em;
+}
+#profile .profile {
+ clear: both;
+ border: 1px solid #abc;
+ padding: .5em;
+ margin: 1em 0em 1em 0em;
+}
+#profile .profile .name {
+ padding-bottom: 0.5em;
+}
+.block-forum h3 {
+ margin-bottom: .5em;
+}
+.calendar a {
+ text-decoration: none;
+}
+.calendar td, .calendar th {
+ padding: 0.4em 0;
+ border-color: #888;
+}
+.calendar .day-today {
+ background-color: #69c;
+}
+.calendar .day-today a {
+ color: #fff;
+}
+.calendar .day-selected {
+ background-color: #369;
+ color: #fff;
+}
+.calendar .header-week {
+ background-color: #ccc;
+}
+.calendar .day-blank {
+ background-color: #ccc;
+}
+.calendar .row-week td a:hover {
+ background-color: #fff; color: #000;
+}
diff --git a/themes/xtemplate/default/xtemplate.xtmpl b/themes/bluemarine/xtemplate.xtmpl
index b75d4812a..9de7b62a2 100644
--- a/themes/xtemplate/default/xtemplate.xtmpl
+++ b/themes/bluemarine/xtemplate.xtmpl
@@ -1,125 +1,137 @@
-<!-- BEGIN: header --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
-
-<head>
- <title>{head_title}</title>
- {head}
- <link type="text/css" rel="stylesheet" href="{directory}/xtemplate.css" />
-</head>
-
-<body{onload_attributes}>
-
-<table border="0" cellpadding="0" cellspacing="0" id="header">
- <tr>
- <td id="logo">
- <a href="./">{logo}</a>
- </td>
- <td id="menu">
- <div id="secondary">{secondary_links}</div>
- <div id="primary">{primary_links}</div>
- <!-- BEGIN: search_box -->
- <form action="{search_url}" method="post">
- <div id="search">
- <input class="form-text" type="text" size="15" value="" name="keys" alt="{search_description}" />
- <input class="form-submit" type="submit" value="{search_button_text}" />
- </div>
- </form>
- <!-- END: search_box -->
- </td>
- </tr>
-</table>
-
-<table border="0" cellpadding="0" cellspacing="0" id="content">
- <tr>
- <!-- BEGIN: blocks -->
- <td id="sidebar-left">
- {blocks}
- </td>
- <!-- END: blocks -->
- <td valign="top">
- <!-- BEGIN: mission -->
- <div id="mission">{mission}</div>
- <!-- END: mission -->
- <div id="main">
- <!-- BEGIN: title -->
- {breadcrumb}
- <h1 class="title">{title}</h1>
- <!-- BEGIN: tabs -->
- <div class="tabs">{tabs}</div>
- <!-- END: tabs -->
- <!-- END: title -->
- <!-- BEGIN: help -->
- <div id="help">{help}</div>
- <!-- END: help -->
- <!-- BEGIN: message -->
- {message}
- <!-- END: message -->
-<!-- END: header -->
-
-<!-- BEGIN: node -->
- <div class="node {sticky}">
- <!-- BEGIN: picture -->
- {picture}
- <!-- END: picture -->
- <!-- BEGIN: title -->
- <h2 class="title"><a href="{link}">{title}</a></h2>
- <!-- END: title -->
- <span class="submitted">{submitted}</span>
- <!-- BEGIN: taxonomy -->
- <span class="taxonomy">{taxonomy}</span>
- <!-- END: taxonomy -->
- <div class="content">{content}</div>
- <!-- BEGIN: links -->
- <div class="links">&raquo; {links}</div>
- <!-- END: links -->
- </div>
-<!-- END: node -->
-
-<!-- BEGIN: comment -->
- <div class="comment">
- <!-- BEGIN: picture -->
- {picture}
- <!-- END: picture -->
- <h3 class="title">{title}</h3><!-- BEGIN: new --><span class="new">{new}</span><!-- END: new -->
- <div class="submitted">{submitted}</div>
- <div class="content">{content}</div>
- <!-- BEGIN: links -->
- <div class="links">&raquo; {links}</div>
- <!-- END: links -->
- </div>
-<!-- END: comment -->
-
-<!-- BEGIN: box -->
- <div class="box">
- <h2 class="title">{title}</h2>
- <div class="content">{content}</div>
- </div>
-<!-- END: box -->
-
-<!-- BEGIN: block -->
- <div class="block block-{module}" id="block-{module}-{delta}">
- <h2 class="title">{title}</h2>
- <div class="content">{content}</div>
- </div>
-<!-- END: block -->
-
-<!-- BEGIN: footer -->
- </div><!-- main -->
- </td>
- <!-- BEGIN: blocks -->
- <td id="sidebar-right">
- {blocks}
- </td>
- <!-- END: blocks -->
- </tr>
-</table>
-
-<!-- BEGIN: message -->
-<div id="footer">
- {footer_message}
-</div>
-<!-- END: message -->
-{footer}
-</body>
-</html>
-<!-- END: footer -->
+<!-- BEGIN: header --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+
+<head>
+ <title>{head_title}</title>
+ {head}
+</head>
+
+<body{onload_attributes}>
+
+<table border="0" cellpadding="0" cellspacing="0" id="header">
+ <tr>
+ <td id="logo">
+
+ <!-- BEGIN: logo -->
+ <a href="./" title="Home"><img src="{logo}" alt="Home" border="0" /></a>
+ <!-- END: logo -->
+
+ <!-- BEGIN: site_name -->
+ <h1 class='site-name'><a href="./" title="Home">{site_name}</a></h1>
+ <!-- END: site_name -->
+
+ <!-- BEGIN: site_slogan -->
+ <div class='site-slogan'>{site_slogan}</div>
+ <!-- END: site_slogan -->
+
+
+ </td>
+ <td id="menu">
+ <div id="secondary">{secondary_links}</div>
+ <div id="primary">{primary_links}</div>
+ <!-- BEGIN: search_box -->
+ <form action="{search_url}" method="post">
+ <div id="search">
+ <input class="form-text" type="text" size="15" value="" name="keys" alt="{search_description}" />
+ <input class="form-submit" type="submit" value="{search_button_text}" />
+ </div>
+ </form>
+ <!-- END: search_box -->
+ </td>
+ </tr>
+</table>
+
+<table border="0" cellpadding="0" cellspacing="0" id="content">
+ <tr>
+ <!-- BEGIN: blocks -->
+ <td id="sidebar-left">
+ {blocks}
+ </td>
+ <!-- END: blocks -->
+ <td valign="top">
+ <!-- BEGIN: mission -->
+ <div id="mission">{mission}</div>
+ <!-- END: mission -->
+ <div id="main">
+ <!-- BEGIN: title -->
+ {breadcrumb}
+ <h1 class="title">{title}</h1>
+ <!-- BEGIN: tabs -->
+ <div class="tabs">{tabs}</div>
+ <!-- END: tabs -->
+ <!-- END: title -->
+ <!-- BEGIN: help -->
+ <div id="help">{help}</div>
+ <!-- END: help -->
+ <!-- BEGIN: message -->
+ {message}
+ <!-- END: message -->
+<!-- END: header -->
+
+<!-- BEGIN: node -->
+ <div class="node {sticky}">
+ <!-- BEGIN: picture -->
+ {picture}
+ <!-- END: picture -->
+ <!-- BEGIN: title -->
+ <h2 class="title"><a href="{link}">{title}</a></h2>
+ <!-- END: title -->
+ <span class="submitted">{submitted}</span>
+ <!-- BEGIN: taxonomy -->
+ <span class="taxonomy">{taxonomy}</span>
+ <!-- END: taxonomy -->
+ <div class="content">{content}</div>
+ <!-- BEGIN: links -->
+ <div class="links">&raquo; {links}</div>
+ <!-- END: links -->
+ </div>
+<!-- END: node -->
+
+<!-- BEGIN: comment -->
+ <div class="comment">
+ <!-- BEGIN: picture -->
+ {picture}
+ <!-- END: picture -->
+ <h3 class="title">{title}</h3><!-- BEGIN: new --><span class="new">{new}</span><!-- END: new -->
+ <div class="submitted">{submitted}</div>
+ <div class="content">{content}</div>
+ <!-- BEGIN: links -->
+ <div class="links">&raquo; {links}</div>
+ <!-- END: links -->
+ </div>
+<!-- END: comment -->
+
+<!-- BEGIN: box -->
+ <div class="box">
+ <h2 class="title">{title}</h2>
+ <div class="content">{content}</div>
+ </div>
+<!-- END: box -->
+
+<!-- BEGIN: block -->
+ <div class="block block-{module}" id="block-{module}-{delta}">
+ <h2 class="title">{title}</h2>
+ <div class="content">{content}</div>
+ </div>
+<!-- END: block -->
+
+<!-- BEGIN: footer -->
+ </div><!-- main -->
+ </td>
+ <!-- BEGIN: blocks -->
+ <td id="sidebar-right">
+ {blocks}
+ </td>
+ <!-- END: blocks -->
+ </tr>
+</table>
+
+<!-- BEGIN: message -->
+<div id="footer">
+ {footer_message}
+</div>
+<!-- END: message -->
+{footer}
+</body>
+</html>
+<!-- END: footer -->
diff --git a/themes/chameleon/background.png b/themes/chameleon/background.png
new file mode 100644
index 000000000..194588a3a
--- /dev/null
+++ b/themes/chameleon/background.png
Binary files differ
diff --git a/themes/chameleon/chameleon.theme b/themes/chameleon/chameleon.theme
index 8af17edf0..955432532 100644
--- a/themes/chameleon/chameleon.theme
+++ b/themes/chameleon/chameleon.theme
@@ -1,153 +1,153 @@
-<?php
-// $Id$
-
-function chameleon_help($section) {
-
- $output = '';
-
- switch ($section) {
- case 'admin/themes#description':
- $output = t('A fast PHP theme with different stylesheets.');
- break;
- }
-
- return $output;
-}
-
-function chameleon_settings() {
-
- /*
- ** Compile a list of the available style sheets:
- */
-
- $fd = opendir('themes/chameleon');
- while ($file = readdir($fd)) {
- if (is_dir("themes/chameleon/$file") && !in_array($file, array('.', '..', 'CVS'))) {
- $files["themes/chameleon/$file/chameleon.css"] = "themes/chameleon/$file/chameleon.css";
- }
- }
- closedir($fd);
-
- $output = form_select(t('CSS stylesheet'), 'chameleon_stylesheet', variable_get('chameleon_stylesheet', 'themes/chameleon/pure/chameleon.css'), $files, t('Selecting a different stylesheet will change the look and feel of your site.'));
-
- return $output;
-}
-
-function chameleon_page($content, $title = NULL, $breadcrumb = NULL) {
- if (isset($title)) {
- drupal_set_title($title);
- }
-
- if (isset($breadcrumb)) {
- drupal_set_breadcrumb($breadcrumb);
- }
-
- $output = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
- $output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\">\n";
- $output .= "<head>\n";
- $output .= " <title>". ($title ? $title ." | ". variable_get("site_name", "drupal") : variable_get("site_name", "drupal") ." | ". variable_get("site_slogan", "")) ."</title>\n";
- $output .= drupal_get_html_head();
- $output .= " <link rel=\"stylesheet\" type=\"text/css\" href=\"themes/chameleon/common.css\" />\n";
- $output .= " <link rel=\"stylesheet\" type=\"text/css\" href=\"". variable_get("chameleon_stylesheet", "themes/chameleon/pure/chameleon.css") ."\" />\n";
- $output .= "</head>";
- $output .= "<body". theme_onload_attribute() .">\n";
- $output .= " <div id=\"header\">";
- $output .= " <h1 class=\"title\">". l(variable_get("site_name", "drupal"), ""). "</h1>";
- $output .= " </div>\n";
-
- $output .= " <table>\n";
- $output .= " <tr>\n";
-
- if ($blocks = theme_blocks("left")) {
- $output .= " <td id=\"sidebar-left\">$blocks</td>\n";
- }
-
- $output .= " <td id=\"main\">\n";
-
- if ($title = drupal_get_title()) {
- $output .= theme("breadcrumb", drupal_get_breadcrumb());
- $output .= "<h2>$title</h2>";
- }
-
- if ($tabs = theme('menu_local_tasks')) {
- $output .= $tabs;
- }
-
- if ($help = menu_get_active_help()) {
- $output .= "<div id=\"help\">$help</div><hr />";
- }
-
- $output .= theme_status_messages();
-
- $output .= "\n<!-- begin content -->\n";
- $output .= $content;
- $output .= "\n<!-- end content -->\n";
-
- if ($footer = variable_get('site_footer', '')) {
- $output .= " <div id=\"footer\">$footer</div>\n";
- }
-
- $output .= " </td>\n";
-
- if ($blocks = theme_blocks("right")) {
- $output .= " <td id=\"sidebar-right\">$blocks</td>\n";
- }
-
- $output .= " </tr>\n";
- $output .= " </table>\n";
-
- $output .= theme_closure();
- $output .= " </body>\n";
- $output .= "</html>\n";
-
- return $output;
-}
-
-function chameleon_node($node, $main = 0, $page = 0) {
-
- $output = "<div class=\"node\">\n";
-
- if (!$page) {
- $output .= " <h2 class=\"title\">". ($main ? l($node->title, "node/$node->nid") : $node->title) ."</h2>\n";
- }
-
- $output .= " <div class=\"content\">\n";
-
- if ($main && $node->teaser) {
- $output .= $node->teaser;
- }
- else {
- $output .= $node->body;
- }
-
- $output .= " </div>\n";
-
- $submitted = array(t("By %author at %date", array('%author' => format_name($node), '%date' => format_date($node->created, 'small'))));
-
- if (module_exist('taxonomy')) {
- $terms = taxonomy_link("taxonomy terms", $node);
- }
-
- if ($links = link_node($node, $main)) {
- $output .= " <div class=\"links\">". theme('links', array_merge($submitted, $terms, $links)) ."</div>\n";
- }
-
- $output .= "</div>\n";
-
- return $output;
-}
-
-function chameleon_comment($comment, $link = "") {
-
- $submitted = array(t('By %author at %date', array('%author' => format_name($comment), '%date' => format_date($comment->timestamp. 'small'))));
- $links = array($link);
-
- $output = "<div class=\"comment\">\n";
- $output .= " <h3 class=\"title\">". l($comment->subject, $_GET['q'], NULL, NULL, "comment-$comment->cid") ."</h3>\n";
- $output .= " <div class=\"content\">". $comment->comment ."</div>\n";
- $output .= " <div class=\"links\">". theme('links', array_merge($submitted, $links)) ."</div>\n";
- $output .= "</div>\n";
-
- return $output;
-}
-?>
+<?php
+// $Id$
+
+function chameleon_features() {
+ return array(
+ 'logo',
+ 'toggle_name',
+ 'toggle_search',
+ 'toggle_slogan',
+ 'toggle_primary_links',
+ 'toggle_secondary_links');
+}
+
+function chameleon_page($content, $title = NULL, $breadcrumb = NULL) {
+ if (isset($title)) {
+ drupal_set_title($title);
+ }
+
+ if (isset($breadcrumb)) {
+ drupal_set_breadcrumb($breadcrumb);
+ }
+
+ $output = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
+ $output .= "<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en\" xml:lang=\"en\">\n";
+ $output .= "<head>\n";
+ $output .= " <title>". ($title ? $title ." | ". variable_get("site_name", "drupal") : variable_get("site_name", "drupal") ." | ". variable_get("site_slogan", "")) ."</title>\n";
+ $output .= drupal_get_html_head();
+ $output .= " <link rel=\"stylesheet\" type=\"text/css\" href=\"themes/chameleon/common.css\" />\n";
+ $output .= "</head>";
+ $output .= "<body". theme_onload_attribute() .">\n";
+ $output .= " <div id=\"header\">";
+
+ if ($logo = drupal_get_theme_setting('logo')) {
+ $output .= " <a href=\"./\" title=\"Home\"><img src=\"$logo\" alt=\"Home\" /></a>";
+ }
+ if (drupal_get_theme_setting('toggle_name')) {
+ $output .= " <h1 class=\"site-name title\">". l(variable_get('site_name', 'drupal'), ""). "</h1>";
+ }
+ if (drupal_get_theme_setting('toggle_slogan')) {
+ $output .= " <div class=\"site-slogan\">". variable_get('site_slogan', '') ."</div>";
+ }
+
+ $output .= "</div>\n";
+
+ $primary_links = drupal_get_theme_setting('primary_links');
+ $secondary_links = drupal_get_theme_setting('secondary_links');
+ if ($primary_links || $secondary_links) {
+ $output .= ' <div class="navlinks">';
+ if ($primary_links) {
+ $output .= '<div class="primary">'. $primary_links .'</div>';
+ }
+ if ($secondary_links) {
+ $output .= '<div class="secondary">'. $secondary_links .'</div>';
+ }
+ $output .= " </div>\n";
+ }
+
+ $output .= " <table>\n";
+ $output .= " <tr>\n";
+
+ if ($blocks = theme_blocks("left")) {
+ $output .= " <td id=\"sidebar-left\">$blocks</td>\n";
+ }
+
+ $output .= " <td id=\"main\">\n";
+
+ if ($title = drupal_get_title()) {
+ $output .= theme("breadcrumb", drupal_get_breadcrumb());
+ $output .= "<h2>$title</h2>";
+ }
+
+ if ($tabs = theme('menu_local_tasks')) {
+ $output .= $tabs;
+ }
+
+ if ($help = menu_get_active_help()) {
+ $output .= "<div id=\"help\">$help</div><hr />";
+ }
+
+ $output .= theme_status_messages();
+
+ $output .= "\n<!-- begin content -->\n";
+ $output .= $content;
+ $output .= "\n<!-- end content -->\n";
+
+ if ($footer = variable_get('site_footer', '')) {
+ $output .= " <div id=\"footer\">$footer</div>\n";
+ }
+
+ $output .= " </td>\n";
+
+ if ($blocks = theme_blocks("right")) {
+ $output .= " <td id=\"sidebar-right\">$blocks</td>\n";
+ }
+
+ $output .= " </tr>\n";
+ $output .= " </table>\n";
+
+ $output .= theme_closure();
+ $output .= " </body>\n";
+ $output .= "</html>\n";
+
+ return $output;
+}
+
+function chameleon_node($node, $main = 0, $page = 0) {
+
+ $output = "<div class=\"node\">\n";
+
+ if (!$page) {
+ $output .= " <h2 class=\"title\">". ($main ? l($node->title, "node/$node->nid") : $node->title) ."</h2>\n";
+ }
+
+ $output .= " <div class=\"content\">\n";
+
+ if ($main && $node->teaser) {
+ $output .= $node->teaser;
+ }
+ else {
+ $output .= $node->body;
+ }
+
+ $output .= " </div>\n";
+
+ $submitted = drupal_get_theme_setting("toggle_node_info_$node->type") ? array(t("By %author at %date", array('%author' => format_name($node), '%date' => format_date($node->created, 'small')))) : array();
+
+ if (module_exist('taxonomy')) {
+ $terms = taxonomy_link("taxonomy terms", $node);
+ }
+
+ if ($links = link_node($node, $main)) {
+ $output .= " <div class=\"links\">". theme('links', array_merge($submitted, $terms, $links)) ."</div>\n";
+ }
+
+ $output .= "</div>\n";
+
+ return $output;
+}
+
+function chameleon_comment($comment, $link = "") {
+
+ $submitted = array(t('By %author at %date', array('%author' => format_name($comment), '%date' => format_date($comment->timestamp. 'small'))));
+ $links = array($link);
+
+ $output = "<div class=\"comment\">\n";
+ $output .= " <h3 class=\"title\">". l($comment->subject, $_GET['q'], NULL, NULL, "comment-$comment->cid") ."</h3>\n";
+ $output .= " <div class=\"content\">". $comment->comment ."</div>\n";
+ $output .= " <div class=\"links\">". theme('links', array_merge($submitted, $links)) ."</div>\n";
+ $output .= "</div>\n";
+
+ return $output;
+}
+?>
diff --git a/themes/chameleon/common.css b/themes/chameleon/common.css
index 7ed4e4ff8..057a0c15b 100644
--- a/themes/chameleon/common.css
+++ b/themes/chameleon/common.css
@@ -1,124 +1,147 @@
-/* $Id$ */
-
-/*
-** HTML elements
-*/
-a, a:link, a:active {
- font-weight: bold;
- text-decoration: none;
-}
-a:hover {
- text-decoration: underline;
-}
-body {
- margin: 0;
- padding: 3em;
- font-family: arial, helvetica, sans-serif;
- font-size: .9em;
- line-height: 1.3em;
-}
-blockquote {
- font-style: italic;
-}
-table {
- margin: 0;
- padding: .5em;
- border-collapse: collapse;
-}
-code, pre {
- font-size: 1em;
-}
-pre {
- font-size: 0.8em;
- padding: 1em;
- background: #eee;
-}
-li {
- padding-bottom: .3em;
-}
-h1, h2, h3, h4, h5, h6 {
- margin-bottom: .25em;
-}
-h1 {
- font-size: 1.3em;
-}
-h2 {
- font-size: 1.2em;
-}
-h3 {
- font-size: 1.1em;
-}
-h4, h5, h6 {
- font-size: 1em;
-}
-p {
- margin: 0 0 .5em 0;
-}
-br {
- line-height: 0.6em;
-}
-
-/*
-** Page layout blocks / IDs
-*/
-#header {
- margin-bottom: 2em;
-}
-#help {
- font-size: 0.8em;
-}
-#sidebar-left, #sidebar-right {
- vertical-align: top;
- padding: 10px;
-}
-#main {
- padding-left: 1em;
- padding-right: 1em;
- vertical-align: top;
- width: 60%;
-}
-#footer {
- font-size: 0.8em;
- padding-top: 2em;
- text-align: center;
-}
-
-/*
-** Common declarations for child classes of node, comment, block, box etc
-*/
-.title {
- margin: 0 0 .25em 0;
-}
-.content {
- margin: 0 0 .5em 0;
-}
-.links {
- font-size: 0.8em;
- line-height: 1.25em;
-}
-.block {
- width: 180px;
-}
-.messages {
- padding: 0.3em;
- margin: 0.5em 0em 0.5em 0em;
-}
-.status {
- border: 1px solid #3a3;
- color: #3a3;
-}
-.error, form-item input.error {
- border: 1px solid red;
- color: red;
-}
-
-/*
-** Module specific styles
-*/
-.form-item textarea {
- font-size: 1em;
-}
-#aggregator .feed {
- border: 1px solid gray;
- padding: 1em;
-}
+/* $Id$ */
+
+/*
+** HTML elements
+*/
+a, a:link, a:active {
+ font-weight: bold;
+ text-decoration: none;
+}
+a:hover {
+ text-decoration: underline;
+}
+body {
+ margin: 0;
+ padding: 3em;
+ font-size: .9em;
+ line-height: 1.3em;
+}
+blockquote {
+ font-style: italic;
+}
+table {
+ margin: 0;
+ padding: .5em;
+ border-collapse: collapse;
+}
+code, pre {
+ font-size: 1em;
+}
+pre {
+ font-size: 0.8em;
+ padding: 1em;
+ background: #eee;
+}
+li {
+ padding-bottom: .3em;
+}
+h1, h2, h3, h4, h5, h6 {
+ margin-bottom: .25em;
+}
+h1 {
+ font-size: 1.3em;
+}
+h2 {
+ font-size: 1.2em;
+}
+h3 {
+ font-size: 1.1em;
+}
+h4, h5, h6 {
+ font-size: 1em;
+}
+p {
+ margin: 0 0 .5em 0;
+}
+br {
+ line-height: 0.6em;
+}
+
+/*
+** Page layout blocks / IDs
+*/
+#header {
+ margin-bottom: 2em;
+}
+#help {
+ font-size: 0.8em;
+}
+#sidebar-left, #sidebar-right {
+ vertical-align: top;
+ padding: 10px;
+}
+#main {
+ padding-left: 1em;
+ padding-right: 1em;
+ vertical-align: top;
+}
+#footer {
+ font-size: 0.8em;
+ padding-top: 2em;
+ text-align: center;
+}
+
+/*
+** Common declarations for child classes of node, comment, block, box etc
+*/
+.title {
+ margin: 0 0 .25em 0;
+}
+.content {
+ margin: 0 0 .5em 0;
+}
+.links {
+ font-size: 0.8em;
+ line-height: 1.25em;
+}
+.block {
+ width: 180px;
+}
+.messages {
+ padding: 0.3em;
+ margin: 0.5em 0em 0.5em 0em;
+}
+.status {
+ border: 1px solid #3a3;
+ color: #3a3;
+}
+.error, form-item input.error {
+ border: 1px solid red;
+ color: red;
+}
+
+/*
+** Common navigation links added on the admin/themes/settings page
+*/
+.navlinks {
+ padding: 0em 0.5em 1.5em 0em;
+}
+.primary a {
+ font-size: 1.0em;
+ padding: 0em 0.5em 0em 0em;
+}
+.secondary a {
+ font-size: 0.9em;
+ padding: 0em 0.5em 0em 0em;
+}
+
+/*
+** Logo Image Positioning
+*/
+#header img {
+ float: left;
+ padding: 0em 2em 0em 0em;
+}
+#header {
+ clear: both;
+}
+/*
+** Module specific styles
+*/
+.form-item textarea {
+ font-size: 1em;
+}
+#aggregator .feed {
+ border: 1px solid gray;
+ padding: 1em;
+}
diff --git a/themes/chameleon/logo.png b/themes/chameleon/logo.png
new file mode 100644
index 000000000..320fa96ce
--- /dev/null
+++ b/themes/chameleon/logo.png
Binary files differ
diff --git a/themes/chameleon/marvin/logo.png b/themes/chameleon/marvin/logo.png
new file mode 100644
index 000000000..320fa96ce
--- /dev/null
+++ b/themes/chameleon/marvin/logo.png
Binary files differ
diff --git a/themes/chameleon/marvin/screenshot.png b/themes/chameleon/marvin/screenshot.png
new file mode 100644
index 000000000..b46b21cf5
--- /dev/null
+++ b/themes/chameleon/marvin/screenshot.png
Binary files differ
diff --git a/themes/chameleon/marvin/chameleon.css b/themes/chameleon/marvin/style.css
index e0c4a15a5..56587aef8 100644
--- a/themes/chameleon/marvin/chameleon.css
+++ b/themes/chameleon/marvin/style.css
@@ -1,114 +1,118 @@
-/* $Id$ */
-
-/*
-** HTML elements
-*/
-body {
- background: #fff url(druplicon-watermark.png) no-repeat top right;
-}
-a:link {
- color: #656
-}
-a:visited {
- color: #656
-}
-a:active {
- color: #ccc
-}
-h2 {
- background-color: #eaeaea;
- border: solid 1px #777;
- font-size: 1.1em;
- margin: 0.5em 0em 0.5em 0em;
- padding: 0.5em;
-}
-h2.title {
- background-color: #fff;
- border: solid 1px #888;
- margin-top: 1em;
-}
-p {
- margin: 0 1em 1em 0;
- padding: 0;
-}
-table {
- font-size: 1em;
-}
-
-/*
-** Page layout blocks / IDs
-*/
-#main {
- width: 80%;
-}
-
-/*
-** Common declarations for child classes of node, comment, block, box etc
-*/
-.node .submitted {
- color: #7c7c7c;
- font-size: 0.9em;
- float: left;
- padding: 0.5em 0em 0.5em 1em;
-}
-.node .taxonomy {
- color: #7c7c7c;
- font-size: 0.9em;
- float: right;
-}
-.node .content {
- clear: both;
- padding-left: 1em;
-}
-.node .links {
- padding: 1em;
-}
-.comment {
- border: solid 1px #777;
- margin: 0.5em 0 0.5em 0;
- padding: 0.5em;
-}
-.block {
- margin-bottom: 10px;
- font-size: 0.9em;
-}
-.block .content {
- border: solid 1px #888;
- border-top: none;
- margin: 0;
- padding: 5px;
-}
-.block h2.title {
- margin: 0;
-}
-
-/*
-** Module specific styles
-*/
-.item-list ul li {
- list-style-image: url(bullet.png);
-}
-.calendar .day-today {
- background-color: #ccc;
-}
-.calendar .day-selected {
- background-color: #bbb;
-}
-.calendar .header-month {
- background-color: #ddd;
-}
-.calendar .header-week {
- background-color: #ccc;
-}
-.calendar .day-blank {
- background-color: #ddd;
-}
-.calendar .day-link a {
- color: #000;
-}
-.calendar .row-week {
- color: #aaa;
-}
-.path, .path a, .path a:visited {
- color: #888;
+/* $Id$ */
+
+/*
+** HTML elements
+*/
+body {
+ background: #fff url(druplicon-watermark.png) no-repeat top right;
+ font-family: arial, helvetica, sans-serif;
+}
+a:link {
+ color: #656
+}
+a:visited {
+ color: #656
+}
+a:active {
+ color: #ccc
+}
+h2 {
+ background-color: #eaeaea;
+ border: solid 1px #777;
+ font-size: 1.1em;
+ margin: 0.5em 0em 0.5em 0em;
+ padding: 0.5em;
+}
+h2.title {
+ background-color: #fff;
+ border: solid 1px #888;
+ margin-top: 1em;
+}
+p {
+ margin: 0 1em 1em 0;
+ padding: 0;
+}
+table {
+ font-size: 1em;
+}
+
+/*
+** Page layout blocks / IDs
+*/
+#main {
+ width: 80%;
+}
+#header .title {
+ padding-top: .75em;
+}
+
+/*
+** Common declarations for child classes of node, comment, block, box etc
+*/
+.node .submitted {
+ color: #7c7c7c;
+ font-size: 0.9em;
+ float: left;
+ padding: 0.5em 0em 0.5em 1em;
+}
+.node .taxonomy {
+ color: #7c7c7c;
+ font-size: 0.9em;
+ float: right;
+}
+.node .content {
+ clear: both;
+ padding-left: 1em;
+}
+.node .links {
+ padding: 1em;
+}
+.comment {
+ border: solid 1px #777;
+ margin: 0.5em 0 0.5em 0;
+ padding: 0.5em;
+}
+.block {
+ margin-bottom: 10px;
+ font-size: 0.9em;
+}
+.block .content {
+ border: solid 1px #888;
+ border-top: none;
+ margin: 0;
+ padding: 5px;
+}
+.block h2.title {
+ margin: 0;
+}
+
+/*
+** Module specific styles
+*/
+.item-list ul li {
+ list-style-image: url(bullet.png);
+}
+.calendar .day-today {
+ background-color: #ccc;
+}
+.calendar .day-selected {
+ background-color: #bbb;
+}
+.calendar .header-month {
+ background-color: #ddd;
+}
+.calendar .header-week {
+ background-color: #ccc;
+}
+.calendar .day-blank {
+ background-color: #ddd;
+}
+.calendar .day-link a {
+ color: #000;
+}
+.calendar .row-week {
+ color: #aaa;
+}
+.path, .path a, .path a:visited {
+ color: #888;
} \ No newline at end of file
diff --git a/themes/chameleon/pure/background.png b/themes/chameleon/pure/background.png
deleted file mode 100644
index da99813fd..000000000
--- a/themes/chameleon/pure/background.png
+++ /dev/null
Binary files differ
diff --git a/themes/chameleon/screenshot.png b/themes/chameleon/screenshot.png
new file mode 100644
index 000000000..7c8bdee4f
--- /dev/null
+++ b/themes/chameleon/screenshot.png
Binary files differ
diff --git a/themes/chameleon/pure/chameleon.css b/themes/chameleon/style.css
index c399944ab..9f65ccc82 100644
--- a/themes/chameleon/pure/chameleon.css
+++ b/themes/chameleon/style.css
@@ -1,90 +1,95 @@
-/* $Id$ */
-
-/*
-** HTML elements
-*/
-a, a:link, a:active {
- color: #930;
-}
-a:visited {
- color: #630;
-}
-body {
- padding: 5em 0 0 3em;
- background-image: url(background.png);
- background-repeat: repeat-x;
- font-family: trebuchet ms, tahoma, verdana, arial, helvetica;
- border-top: 10px solid gray;
-}
-ul {
- list-style-type: disc;
-}
-
-/*
-** Page layout blocks / IDs
-*/
-#main {
- width: 500px;
-}
-#sidebar-left {
- border-right: 1px solid gray;
-}
-#sidebar-right {
- border-left: 1px solid gray;
-}
-
-/*
-** Common declarations for child classes of node, comment, block, box etc
-*/
-#header .title {
- font-size: 2em;
- font-weight: bold;
-}
-#header .title a,
-#header .title a:link,
-#header .title a:visited,
-#header .title a:active {
- text-decoration: none;
- color: #aaa;
-}
-#header .title a:hover {
- color: #930;
-}
-.node .title {
- font-size: 1.2em;
-}
-.node .title a,
-.node .title a:link,
-.node .title a:active,
-.node .title a:visited {
- text-decoration: none;
- font-weight: normal;
-}
-.node .title a:hover {
- text-decoration: underline;
-}
-.links {
- margin: 1em 0 3em 0;
- text-align: right;
- }
-.comment .content, .block .content, .menu {
- font-size: 0.9em;
-}
-.block {
- padding-bottom: 1em;
-}
-.block .title {
- font-size: 1em;
-}
-
-/*
-** Module specific styles
-*/
-.item-list ul li {
- list-style: square;
-}
-#aggregator .source {
- color: gray;
- font-style: italic;
- font-size: 0.9em;
-}
+/* $Id$ */
+
+/*
+** HTML elements
+*/
+a, a:link, a:active {
+ color: #930;
+}
+a:visited {
+ color: #630;
+}
+body {
+ padding: 5em 0 0 3em;
+ background-image: url(background.png);
+ background-repeat: repeat-x;
+ font-family: trebuchet ms, tahoma, verdana, arial, helvetica;
+ border-top: 10px solid gray;
+}
+ul {
+ list-style-type: disc;
+}
+
+/*
+** Page layout blocks / IDs
+*/
+#main {
+ width: 500px;
+}
+#sidebar-left {
+ border-right: 1px solid gray;
+}
+#sidebar-right {
+ border-left: 1px solid gray;
+}
+
+/*
+** Common declarations for child classes of node, comment, block, box etc
+*/
+#header .title {
+ font-size: 2em;
+ font-weight: bold;
+ padding-top: .75em;
+}
+#header .title a,
+#header .title a:link,
+#header .title a:visited,
+#header .title a:active {
+ text-decoration: none;
+ color: #aaa;
+}
+#header .title a:hover {
+ color: #930;
+}
+#header .site-slogan {
+ margin-top: -0.1em;
+ font-size: 0.8em;
+}
+.node .title {
+ font-size: 1.2em;
+}
+.node .title a,
+.node .title a:link,
+.node .title a:active,
+.node .title a:visited {
+ text-decoration: none;
+ font-weight: normal;
+}
+.node .title a:hover {
+ text-decoration: underline;
+}
+.links {
+ margin: 1em 0 3em 0;
+ text-align: right;
+ }
+.comment .content, .block .content, .menu {
+ font-size: 0.9em;
+}
+.block {
+ padding-bottom: 1em;
+}
+.block .title {
+ font-size: 1em;
+}
+
+/*
+** Module specific styles
+*/
+.item-list ul li {
+ list-style: square;
+}
+#aggregator .source {
+ color: gray;
+ font-style: italic;
+ font-size: 0.9em;
+}
diff --git a/themes/xtemplate/xtemplate.theme b/themes/engines/xtemplate/xtemplate.engine
index 1ef3a591c..fa91aa954 100644
--- a/themes/xtemplate/xtemplate.theme
+++ b/themes/engines/xtemplate/xtemplate.engine
@@ -1,245 +1,233 @@
-<?php
-// $Id$
-
-if (!class_exists("XTemplate")) {
- include_once("themes/xtemplate/xtemplate.inc");
-}
-$template_directory = variable_get('xtemplate_template', 'default');
-$GLOBALS["xtemplate"]->template = new XTemplate('xtemplate.xtmpl', 'themes/xtemplate/' . $template_directory);
-$GLOBALS["xtemplate"]->template->SetNullBlock(" "); // "" doesnt work!
-
-function xtemplate_settings() {
- /*
- ** Compile a list of the available style sheets:
- */
-
- $fd = opendir('themes/xtemplate');
- while ($file = readdir($fd)) {
- if (is_dir("themes/xtemplate/$file") && !in_array($file, array('.', '..', 'CVS'))) {
- $files[$file] = $file;
- }
- }
- closedir($fd);
-
- $template_directory = variable_get('xtemplate_template', 'default');
- $group = form_select(t('Template'), 'xtemplate_template', variable_get('xtemplate_template', 'default'), $files, t('Selecting a different template will change the look and feel of your site. To create a new template, create a new directory under <code>themes/xtemplate</code> and copy the contents of an existing template (e.g. <code>themes/xtemplate/default</code>) into it. The new template will automatically become available in the selection menu and will be identified by its directory name.'));
- $output = form_group(t('Template selection'), $group);
-
- $group = form_textarea(t('Logo'), 'xtemplate_logo', variable_get('xtemplate_logo', "<img src=\"themes/xtemplate/$template_directory/logo.png\" alt=\"Logo\" />"), 70, 4, t('The HTML code for displaying the logo.'));
- $group .= form_textarea(t('Primary links'), 'xtemplate_primary_links', variable_get('xtemplate_primary_links', l('edit primary links', 'admin/themes/xtemplate')), 70, 8, t('The HTML code for the primary links.'));
- $group .= form_textarea(t('Secondary links'), 'xtemplate_secondary_links', variable_get('xtemplate_secondary_links', l('edit secondary links', 'admin/themes/xtemplate')), 70, 8, t('The HTML code for the secondary links.'));
- $group .= form_textarea(t('Message on front page'), 'xtemplate_mission', variable_get('xtemplate_mission', 'edit mission'), 70, 6, t('This text will be displayed on the front page. It can be used to display a mission statement, announcement or site description.'));
- $group .= form_radios(t('Search box'), 'xtemplate_search_box', variable_get('xtemplate_search_box', 0), array(t('Disabled'), t('Enabled')), t('Show a search box in the upper right corner.'));
- $output .= form_group(t('Header settings'), $group);
-
- $group = form_checkbox(t('Display pictures with posts'), 'xtemplate_picture_node', 1, variable_get('xtemplate_picture_node', 0), t('Display individualized pictures identifying users with posts they start.'));
- $group .= form_checkbox(t('Display pictures with comments'), 'xtemplate_picture_comment', 1, variable_get('xtemplate_picture_comment', 0), t('Display individualized pictures identifying users with their comments.'));
- $output .= form_group(t('Avatar settings'), $group);
-
- return $output;
-}
-
-function xtemplate_help($section) {
-
- $output = '';
-
- switch ($section) {
- case 'admin/themes#description':
- $output = t('A template driven theme');
- break;
- }
-
- return $output;
-}
-
-function xtemplate_node($node, $main = 0, $page = 0) {
- global $xtemplate;
-
- $xtemplate->template->assign(array(
- "submitted" => t("Submitted by %a on %b.",
- array("%a" => format_name($node),
- "%b" => format_date($node->created))),
- "link" => url("node/$node->nid"),
- "title" => $node->title,
- "author" => format_name($node),
- "date" => format_date($node->created),
- "sticky" => ($main && $node->sticky) ? 'sticky' : '',
- "content" => ($main && $node->teaser) ? $node->teaser : $node->body));
-
- if ($page == 0) {
- $xtemplate->template->parse("node.title");
- }
-
- if ($picture = theme('user_picture', $node)) {
- $xtemplate->template->assign("picture", $picture);
- $xtemplate->template->parse("node.picture");
- }
-
- if (module_exist("taxonomy") && ($taxonomy = taxonomy_link("taxonomy terms", $node))) {
- $xtemplate->template->assign("taxonomy", theme_links($taxonomy));
- $xtemplate->template->parse("node.taxonomy");
- }
-
- if ($links = link_node($node, $main)) {
- $xtemplate->template->assign("links", theme_links($links));
- $xtemplate->template->parse("node.links");
- }
-
- $xtemplate->template->parse("node");
- $output = $xtemplate->template->text("node");
- $xtemplate->template->reset("node");
- return $output;
-}
-
-function xtemplate_comment($comment, $links = 0) {
- global $xtemplate;
-
- $xtemplate->template->assign(array (
- "new" => t("new"),
- "submitted" => t("Submitted by %a on %b.",
- array("%a" => format_name($comment),
- "%b" => format_date($comment->timestamp))),
- "title" => l($comment->subject, $_GET['q'], NULL, NULL, "comment-$comment->cid"),
- "author" => format_name($comment),
- "date" => format_date($comment->timestamp),
- "content" => $comment->comment
- ));
-
- if ($comment->new) {
- $xtemplate->template->parse("comment.new");
- }
-
- if ($picture = theme('user_picture', $comment)) {
- $xtemplate->template->assign("picture", $picture);
- $xtemplate->template->parse("comment.picture");
- }
-
- if ($links) {
- $xtemplate->template->assign("links", $links);
- $xtemplate->template->parse("comment.links");
- }
-
- $xtemplate->template->parse("comment");
- $output = $xtemplate->template->text("comment");
- $xtemplate->template->reset("comment");
-
- return $output;
-}
-
-function xtemplate_page($content, $title = NULL, $breadcrumb = NULL) {
- if (isset($title)) {
- drupal_set_title($title);
- }
- if (isset($breadcrumb)) {
- drupal_set_breadcrumb($breadcrumb);
- }
-
- global $xtemplate;
- $template_directory = variable_get('xtemplate_template', 'default');
-
- $xtemplate->template->assign(array(
- "head_title" => (drupal_get_title() ? drupal_get_title() ." | ". variable_get("site_name", "drupal") : variable_get("site_name", "drupal") ." | ". variable_get("site_slogan", "")),
- "site" => variable_get("site_name", "drupal"),
- "head" => drupal_get_html_head(),
- "directory" => "themes/xtemplate/$template_directory",
- "onload_attributes" => theme_onload_attribute(),
- "logo" => variable_get('xtemplate_logo', "<img src=\"themes/xtemplate/$template_directory/logo.png\" alt=\"Logo\" />"),
- "primary_links" => variable_get("xtemplate_primary_links", l("edit primary links", "admin/themes/xtemplate")),
- "secondary_links" => variable_get("xtemplate_secondary_links", l("edit secondary links", "admin/themes/xtemplate"))
- ));
-
- if ($tabs = theme('menu_local_tasks')) {
- $xtemplate->template->assign("tabs", $tabs);
- $xtemplate->template->parse("header.title.tabs");
- }
-
- if ($title = drupal_get_title()) {
- $xtemplate->template->assign("title", $title);
- $xtemplate->template->assign("breadcrumb", theme("breadcrumb", drupal_get_breadcrumb()));
- $xtemplate->template->parse("header.title");
- }
-
- if ($help = menu_get_active_help()) {
- $xtemplate->template->assign("help", $help);
- $xtemplate->template->parse("header.help");
- }
-
- if ($message = theme_status_messages()) {
- $xtemplate->template->assign("message", $message);
- $xtemplate->template->parse("header.message");
- }
-
- if (variable_get("xtemplate_search_box", 1)) {
- $xtemplate->template->assign(array(
- //"search" => search_form(),
- "search_url" => url("search"),
- "search_button_text" => t("Search"),
- "search_description" => t("Enter the terms you wish to search for.")
- ));
- $xtemplate->template->parse("header.search_box");
- }
-
- // only parse the mission block if we are on the frontpage ...
- if ($_GET["q"] == variable_get("site_frontpage", "node") && ($mission = variable_get("xtemplate_mission", "edit mission"))) {
- $xtemplate->template->assign("mission", $mission);
- $xtemplate->template->parse("header.mission");
- }
-
- if ($blocks = theme("blocks", "left")) {
- $xtemplate->template->assign("blocks", $blocks);
- $xtemplate->template->parse("header.blocks");
- }
-
- $xtemplate->template->parse("header");
- $output = $xtemplate->template->text("header");
-
- $output .= "\n<!-- begin content -->\n";
- $output .= $content;
- $output .= "\n<!-- end content -->\n";
-
- if ($blocks = theme("blocks", "right")) {
- $xtemplate->template->assign("blocks", $blocks);
- $xtemplate->template->parse("footer.blocks");
- }
-
- // only parse the footer block if site_footer is set
- if ($footer_message = variable_get("site_footer", FALSE)) {
- $xtemplate->template->assign("footer_message", $footer_message);
- $xtemplate->template->parse("footer.message");
- }
-
- $xtemplate->template->assign("footer", theme_closure());
- $xtemplate->template->parse("footer");
-
- $output .= $xtemplate->template->text("footer");
-
- return $output;
-}
-
-function xtemplate_block(&$block) {
- global $xtemplate;
-
- // create template variables for all block variables (module, delta, region, subject, content, ...)
- foreach ($block as $key => $value) {
- $xtemplate->template->assign($key == "subject" ? "title" : $key, $value); // TODO: standardize on 'title' (ie. rename all $block["subject"] to "title")
- }
- $xtemplate->template->parse("block");
- $output = $xtemplate->template->text("block");
- $xtemplate->template->reset("block");
- return $output;
-}
-
-function xtemplate_box($title, $content, $region = "main") {
- global $xtemplate;
-
- $xtemplate->template->assign(array(
- "title" => $title,
- "content" => $content));
-
- $xtemplate->template->parse("box");
- $output = $xtemplate->template->text("box");
- $xtemplate->template->reset("box");
- return $output;
-}
-
-?>
+<?php
+// $Id$
+
+// Initialize the xtemplate engine.
+function xtemplate_init($template) {
+ // We cannot use the theme() or path_to_theme() functions here
+ if (!class_exists('XTemplate')) {
+ include_once('themes/engines/xtemplate/xtemplate.inc');
+ }
+ $GLOBALS['xtemplate']->template = new XTemplate(basename($template->filename), dirname($template->filename));
+ $GLOBALS['xtemplate']->template->SetNullBlock(' '); // '' doesnt work!
+}
+
+function xtemplate_templates($directory) {
+ return file_scan_directory($directory, 'xtemplate.xtmpl$');
+}
+
+function xtemplate_features() {
+ return array(
+ 'logo',
+ 'toggle_name',
+ 'toggle_search',
+ 'toggle_slogan',
+ 'toggle_mission',
+ 'toggle_primary_links',
+ 'toggle_secondary_links',
+ 'toggle_node_user_picture',
+ 'toggle_comment_user_picture');
+}
+
+function xtemplate_node($node, $main = 0, $page = 0) {
+ global $xtemplate;
+
+ $xtemplate->template->assign(array(
+ "submitted" => drupal_get_theme_setting("toggle_node_info_$node->type") ?
+ t("Submitted by %a on %b.",
+ array("%a" => format_name($node),
+ "%b" => format_date($node->created))) : '',
+ "link" => url("node/$node->nid"),
+ "title" => $node->title,
+ "author" => format_name($node),
+ "date" => format_date($node->created),
+ "sticky" => ($main && $node->sticky) ? 'sticky' : '',
+ "content" => ($main && $node->teaser) ? $node->teaser : $node->body));
+
+ if ($page == 0) {
+ $xtemplate->template->parse("node.title");
+ }
+
+ if (drupal_get_theme_setting('toggle_node_user_picture') && $picture = theme('user_picture', $node)) {
+ $xtemplate->template->assign("picture", $picture);
+ $xtemplate->template->parse("node.picture");
+ }
+
+ if (module_exist("taxonomy") && ($taxonomy = taxonomy_link("taxonomy terms", $node))) {
+ $xtemplate->template->assign("taxonomy", theme_links($taxonomy));
+ $xtemplate->template->parse("node.taxonomy");
+ }
+
+ if ($links = link_node($node, $main)) {
+ $xtemplate->template->assign("links", theme_links($links));
+ $xtemplate->template->parse("node.links");
+ }
+
+ $xtemplate->template->parse("node");
+ $output = $xtemplate->template->text("node");
+ $xtemplate->template->reset("node");
+ return $output;
+}
+
+function xtemplate_comment($comment, $links = 0) {
+ global $xtemplate;
+
+ $xtemplate->template->assign(array (
+ "new" => t("new"),
+ "submitted" => t("Submitted by %a on %b.",
+ array("%a" => format_name($comment),
+ "%b" => format_date($comment->timestamp))),
+ "title" => l($comment->subject, $_GET['q'], NULL, NULL, "comment-$comment->cid"),
+ "author" => format_name($comment),
+ "date" => format_date($comment->timestamp),
+ "content" => $comment->comment
+ ));
+
+ if ($comment->new) {
+ $xtemplate->template->parse("comment.new");
+ }
+
+ if (drupal_get_theme_setting('toggle_comment_user_picture') && $picture = theme('user_picture', $comment)) {
+ $xtemplate->template->assign("picture", $picture);
+ $xtemplate->template->parse("comment.picture");
+ }
+
+ if ($links) {
+ $xtemplate->template->assign("links", $links);
+ $xtemplate->template->parse("comment.links");
+ }
+
+ $xtemplate->template->parse("comment");
+ $output = $xtemplate->template->text("comment");
+ $xtemplate->template->reset("comment");
+
+ return $output;
+}
+
+function xtemplate_page($content, $title = NULL, $breadcrumb = NULL) {
+ if (isset($title)) {
+ drupal_set_title($title);
+ }
+ if (isset($breadcrumb)) {
+ drupal_set_breadcrumb($breadcrumb);
+ }
+
+ global $xtemplate;
+
+ $xtemplate->template->assign(array(
+ "head_title" => (drupal_get_title() ? drupal_get_title() ." | ". variable_get("site_name", "drupal") : variable_get("site_name", "drupal") ." | ". variable_get("site_slogan", "")),
+ "head" => drupal_get_html_head(),
+ "onload_attributes" => theme_onload_attribute(),
+ "primary_links" => drupal_get_theme_setting('primary_links'),
+ "secondary_links" => drupal_get_theme_setting('secondary_links')
+ ));
+
+ if ($logo = drupal_get_theme_setting('logo')) {
+ $xtemplate->template->assign('logo', $logo);
+ $xtemplate->template->parse('header.logo');
+ }
+
+ if (drupal_get_theme_setting('toggle_name')) {
+ $xtemplate->template->assign('site_name', variable_get('site_name', ''));
+ $xtemplate->template->parse('header.site_name');
+ }
+
+ if (drupal_get_theme_setting('toggle_slogan')) {
+ $xtemplate->template->assign('site_slogan', variable_get('site_slogan', ''));
+ $xtemplate->template->parse('header.site_slogan');
+ }
+
+ if ($tabs = theme('menu_local_tasks')) {
+ $xtemplate->template->assign("tabs", $tabs);
+ $xtemplate->template->parse("header.title.tabs");
+ }
+
+ if ($title = drupal_get_title()) {
+ $xtemplate->template->assign("title", $title);
+ $xtemplate->template->assign("breadcrumb", theme("breadcrumb", drupal_get_breadcrumb()));
+ $xtemplate->template->parse("header.title");
+ }
+
+ if ($help = menu_get_active_help()) {
+ $xtemplate->template->assign("help", $help);
+ $xtemplate->template->parse("header.help");
+ }
+
+ if ($message = theme_status_messages()) {
+ $xtemplate->template->assign("message", $message);
+ $xtemplate->template->parse("header.message");
+ }
+
+ if (drupal_get_theme_setting('toggle_search')) {
+ $xtemplate->template->assign(array(
+ //"search" => search_form(),
+ "search_url" => url("search"),
+ "search_button_text" => t("Search"),
+ "search_description" => t("Enter the terms you wish to search for.")
+ ));
+ $xtemplate->template->parse("header.search_box");
+ }
+
+ // only parse the mission block if we are on the frontpage ...
+ if ($_GET["q"] == variable_get("site_frontpage", "node") && drupal_get_theme_setting('toggle_mission') && ($mission = drupal_get_theme_setting('mission'))) {
+ $xtemplate->template->assign("mission", $mission);
+ $xtemplate->template->parse("header.mission");
+ }
+
+ if ($blocks = theme("blocks", "left")) {
+ $xtemplate->template->assign("blocks", $blocks);
+ $xtemplate->template->parse("header.blocks");
+ }
+
+ $xtemplate->template->parse("header");
+ $output = $xtemplate->template->text("header");
+
+ $output .= "\n<!-- begin content -->\n";
+ $output .= $content;
+ $output .= "\n<!-- end content -->\n";
+
+ if ($blocks = theme("blocks", "right")) {
+ $xtemplate->template->assign("blocks", $blocks);
+ $xtemplate->template->parse("footer.blocks");
+ }
+
+ // only parse the footer block if site_footer is set
+ if ($footer_message = variable_get("site_footer", FALSE)) {
+ $xtemplate->template->assign("footer_message", $footer_message);
+ $xtemplate->template->parse("footer.message");
+ }
+
+ $xtemplate->template->assign("footer", theme_closure());
+ $xtemplate->template->parse("footer");
+
+ $output .= $xtemplate->template->text("footer");
+
+ return $output;
+}
+
+function xtemplate_block(&$block) {
+ global $xtemplate;
+
+ // create template variables for all block variables (module, delta, region, subject, content, ...)
+ foreach ($block as $key => $value) {
+ $xtemplate->template->assign($key == "subject" ? "title" : $key, $value); // TODO: standardize on 'title' (ie. rename all $block["subject"] to "title")
+ }
+ $xtemplate->template->parse("block");
+ $output = $xtemplate->template->text("block");
+ $xtemplate->template->reset("block");
+ return $output;
+}
+
+function xtemplate_box($title, $content, $region = "main") {
+ global $xtemplate;
+
+ $xtemplate->template->assign(array(
+ "title" => $title,
+ "content" => $content));
+
+ $xtemplate->template->parse("box");
+ $output = $xtemplate->template->text("box");
+ $xtemplate->template->reset("box");
+ return $output;
+}
+
+?>
diff --git a/themes/xtemplate/xtemplate.inc b/themes/engines/xtemplate/xtemplate.inc
index 6c89be93d..611ec2c8c 100644
--- a/themes/xtemplate/xtemplate.inc
+++ b/themes/engines/xtemplate/xtemplate.inc
@@ -1,480 +1,480 @@
-<?php
-
-class XTemplate {
-
-/*
- xtemplate class 0.3pre
- html generation with templates - fast & easy
- copyright (c) 2000-2001 Barnabas Debreceni [cranx@users.sourceforge.net]
-
- contributors:
- Ivar Smolin <okul@linux.ee> (14-march-2001)
- - made some code optimizations
- Bert Jandehoop <bert.jandehoop@users.info.wau.nl> (26-june-2001)
- - new feature to substitute template files by other templates
- - new method array_loop()
-
- !!! {FILE {VAR}} file variable interpolation may still be buggy !!!
-
- latest stable & CVS versions always available @
- http://sourceforge.net/projects/xtpl/
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public License
- version 2.1 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details at
- http://www.gnu.org/copyleft/lgpl.html
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- $Id$
-
-*/
-
-/***[ variables ]***********************************************************/
-
-var $filecontents=""; /* raw contents of template file */
-var $blocks=array(); /* unparsed blocks */
-var $parsed_blocks=array(); /* parsed blocks */
-var $preparsed_blocks=array(); /* preparsed blocks, for file includes */
-var $block_parse_order=array(); /* block parsing order for recursive parsing (sometimes reverse:) */
-var $sub_blocks=array(); /* store sub-block names for fast resetting */
-var $VARS=array(); /* variables array */
-var $FILEVARS=array(); /* file variables array */
-var $filevar_parent=array(); /* filevars' parent block */
-var $filecache=array(); /* file caching */
-
-var $tpldir=""; /* location of template files */
-var $FILES=null; /* file names lookup table */
-
-var $file_delim="/\{FILE\s*\"([^\"]+)\"\s*\}/m"; /* regexp for file includes */
-var $filevar_delim="/\{FILE\s*\{([A-Za-z0-9\._]+?)\}\s*\}/m"; /* regexp for file includes */
-var $filevar_delim_nl="/^\s*\{FILE\s*\{([A-Za-z0-9\._]+?)\}\s*\}\s*\n/m"; /* regexp for file includes w/ newlines */
-var $block_start_delim="<!-- "; /* block start delimiter */
-var $block_end_delim="-->"; /* block end delimiter */
-var $block_start_word="BEGIN:"; /* block start word */
-var $block_end_word="END:"; /* block end word */
-
-/* this makes the delimiters look like: <!-- BEGIN: block_name --> if you use my syntax. */
-
-var $NULL_STRING=array(""=>""); /* null string for unassigned vars */
-var $NULL_BLOCK=array(""=>""); /* null string for unassigned blocks */
-var $mainblock="main";
-var $ERROR="";
-var $AUTORESET=1; /* auto-reset sub blocks */
-
-/***[ constructor ]*********************************************************/
-
-
-function XTemplate ($file,$tpldir="",$files=null,$mainblock="main") {
- $this->tpldir = $tpldir;
- if (gettype($files)=="array")
- $this->FILES = $files;
- $this->mainblock=$mainblock;
- $this->filecontents=$this->r_getfile($file); /* read in template file */
- $this->blocks=$this->maketree($this->filecontents,""); /* preprocess some stuff */
- $this->filevar_parent=$this->store_filevar_parents($this->blocks);
- $this->scan_globals();
-}
-
-
-/***************************************************************************/
-/***[ public stuff ]********************************************************/
-/***************************************************************************/
-
-/***[ assign ]**************************************************************/
-/*
- assign a variable
-*/
-
-function assign ($name,$val="") {
- if (gettype($name)=="array")
- foreach ($name as $k=>$v)
- $this->VARS[$k]=$v;
- else
- $this->VARS[$name]=$val;
-}
-
-/***[ assign_file ]*********************************************************/
-/*
- assign a file variable
-*/
-
-function assign_file ($name,$val="") {
- if (gettype($name)=="array")
- foreach ($name as $k=>$v)
- $this->assign_file_($k,$v);
- else
- $this->assign_file_($name,$val);
-}
-
-function assign_file_ ($name,$val) {
- if (isset($this->filevar_parent[$name])) {
- if ($val!="") {
- $val=$this->r_getfile($val);
- foreach($this->filevar_parent[$name] as $parent) {
- if (isset($this->preparsed_blocks[$parent]) and !isset($this->FILEVARS[$name]))
- $copy=$this->preparsed_blocks[$parent];
- else if (isset($this->blocks[$parent]))
- $copy=$this->blocks[$parent];
- preg_match_all($this->filevar_delim,$copy,$res,PREG_SET_ORDER);
- foreach ($res as $v) {
- $copy=preg_replace("/".preg_quote($v[0])."/","$val",$copy);
- $this->preparsed_blocks=array_merge($this->preparsed_blocks,$this->maketree($copy,$parent));
- $this->filevar_parent=array_merge($this->filevar_parent,$this->store_filevar_parents($this->preparsed_blocks));
- }
- }
- }
- }
- $this->FILEVARS[$name]=$val;
-}
-
-/***[ parse ]***************************************************************/
-/*
- parse a block
-*/
-
-function parse ($bname) {
-
- if (isset($this->preparsed_blocks[$bname])) {
- $copy=$this->preparsed_blocks[$bname];
- }
- else if (isset($this->blocks[$bname]))
- $copy=$this->blocks[$bname];
- else
- $this->set_error ("parse: blockname [$bname] does not exist");
-
- /* from there we should have no more {FILE } directives */
- $copy=preg_replace($this->filevar_delim_nl,"",$copy);
-
- /* find & replace variables+blocks */
- preg_match_all("/\{([A-Za-z0-9\._]+?)}/",$copy,$var_array);
- $var_array=$var_array[1];
- foreach ($var_array as $k=>$v) {
- $sub=explode(".",$v);
- if ($sub[0]=="_BLOCK_") {
- unset($sub[0]);
- $bname2=implode(".",$sub);
- $var=$this->parsed_blocks[$bname2];
- $nul=(!isset($this->NULL_BLOCK[$bname2])) ? $this->NULL_BLOCK[""] : $this->NULL_BLOCK[$bname2];
- if ($var=="") {
- if ($nul=="") {
- $copy=preg_replace("/^\s*\{".$v."\}\s*\n*/m","",$copy);
- } else {
- $copy=preg_replace("/\{".$v."\}/","$nul",$copy);
- }
- } else {
- $var=trim($var);
- $copy=str_replace("\{$v}","$var",$copy);
- }
- } else {
- $var=$this->VARS;
- foreach ($sub as $v1)
- $var=$var[$v1];
- $nul=(!isset($this->NULL_STRING[$v])) ? ($this->NULL_STRING[""]) : ($this->NULL_STRING[$v]);
- $var=(!isset($var))?$nul:$var;
- if ($var=="")
- $copy=preg_replace("/^\s*\{".$v."\}\s*\n/m","",$copy);
- $copy=str_replace("\{$v}","$var",$copy);
- }
- }
- if (empty($this->parsed_blocks[$bname])) $this->parsed_blocks[$bname] = null; // eliminates incremental assign error, when using E_ALL error reporting
- $this->parsed_blocks[$bname].=$copy;
-
- /* reset sub-blocks */
- if ($this->AUTORESET && (!empty($this->sub_blocks[$bname]))) {
- reset($this->sub_blocks[$bname]);
- foreach ($this->sub_blocks[$bname] as $k=>$v)
- $this->reset($v);
- }
-}
-
-/***[ rparse ]**************************************************************/
-/*
- returns the parsed text for a block, including all sub-blocks.
-*/
-
-function rparse($bname) {
- if (!empty($this->sub_blocks[$bname])) {
- reset($this->sub_blocks[$bname]);
- foreach ($this->sub_blocks[$bname] as $k=>$v)
- if (!empty($v))
- $this->rparse($v);
- }
- $this->parse($bname);
-}
-
-/***[ insert_loop ]*********************************************************/
-/*
- inserts a loop ( call assign & parse )
-*/
-
-function insert_loop($bname,$var,$value="") {
- $this->assign($var,$value);
- $this->parse($bname);
-}
-
-/***[ array_loop ]*********************************************************/
-/*
- parses a block for every set of data in the values array
-*/
-
-function array_loop($bname, $var, &$values)
-{
- if (gettype($values)=="array")
- {
- foreach($values as $v)
- {
- $this->assign($var, $v);
- $this->parse($bname);
- }
- }
-}
-
-/***[ text ]****************************************************************/
-/*
- returns the parsed text for a block
-*/
-
-function text($bname) {
- return $this->parsed_blocks[isset($bname) ? $bname :$this->mainblock];
-}
-
-/***[ out ]*****************************************************************/
-/*
- prints the parsed text
-*/
-
-function out ($bname) {
- $length=strlen($this->text($bname));
- header("Content-Length: ".$length);
- echo $this->text($bname);
-}
-
-/***[ reset ]***************************************************************/
-/*
- resets the parsed text
-*/
-
-function reset ($bname) {
- $this->parsed_blocks[$bname]="";
-}
-
-/***[ parsed ]**************************************************************/
-/*
- returns true if block was parsed, false if not
-*/
-
-function parsed ($bname) {
- return (!empty($this->parsed_blocks[$bname]));
-}
-
-/***[ SetNullString ]*******************************************************/
-/*
- sets the string to replace in case the var was not assigned
-*/
-
-function SetNullString($str,$varname="") {
- $this->NULL_STRING[$varname]=$str;
-}
-
-/***[ SetNullBlock ]********************************************************/
-/*
- sets the string to replace in case the block was not parsed
-*/
-
-function SetNullBlock($str,$bname="") {
- $this->NULL_BLOCK[$bname]=$str;
-}
-
-/***[ set_autoreset ]*******************************************************/
-/*
- sets AUTORESET to 1. (default is 1)
- if set to 1, parse() automatically resets the parsed blocks' sub blocks
- (for multiple level blocks)
-*/
-
-function set_autoreset() {
- $this->AUTORESET=1;
-}
-
-/***[ clear_autoreset ]*****************************************************/
-/*
- sets AUTORESET to 0. (default is 1)
- if set to 1, parse() automatically resets the parsed blocks' sub blocks
- (for multiple level blocks)
-*/
-
-function clear_autoreset() {
- $this->AUTORESET=0;
-}
-
-/***[ scan_globals ]********************************************************/
-/*
- scans global variables
-*/
-
-function scan_globals() {
- reset($GLOBALS);
- foreach ($GLOBALS as $k=>$v)
- $GLOB[$k]=$v;
- $this->assign("PHP",$GLOB); /* access global variables as {PHP.HTTP_HOST} in your template! */
-}
-
-/******
-
- WARNING
- PUBLIC FUNCTIONS BELOW THIS LINE DIDN'T GET TESTED
-
-******/
-
-
-/***************************************************************************/
-/***[ private stuff ]*******************************************************/
-/***************************************************************************/
-
-/***[ maketree ]************************************************************/
-/*
- generates the array containing to-be-parsed stuff:
- $blocks["main"],$blocks["main.table"],$blocks["main.table.row"], etc.
- also builds the reverse parse order.
-*/
-
-
-function maketree($con,$parentblock="") {
- $blocks=array();
- $con2=explode($this->block_start_delim,$con);
- if (!empty($parentblock)) {
- $block_names=explode(".",$parentblock);
- $level=sizeof($block_names);
- } else {
- $block_names=array();
- $level=0;
- }
- foreach ($con2 as $k=>$v) {
- $patt="($this->block_start_word|$this->block_end_word)\s*(\w+)\s*$this->block_end_delim(.*)";
- if (preg_match_all("/$patt/ims",$v,$res,PREG_SET_ORDER)) {
- // $res[0][1] = BEGIN or END
- // $res[0][2] = block name
- // $res[0][3] = kinda content
- if ($res[0][1]==$this->block_start_word) {
- $parent_name=implode(".",$block_names);
- $block_names[++$level]=$res[0][2]; /* add one level - array("main","table","row")*/
- $cur_block_name=implode(".",$block_names); /* make block name (main.table.row) */
- $this->block_parse_order[]=$cur_block_name; /* build block parsing order (reverse) */
- if (empty($blocks[$cur_block_name])) $blocks[$cur_block_name] = null; // eliminates incremental assign error, when using E_ALL error reporting
- $blocks[$cur_block_name].=$res[0][3]; /* add contents */
- $blocks[$parent_name].="{_BLOCK_.$cur_block_name}"; /* add {_BLOCK_.blockname} string to parent block */
- $this->sub_blocks[$parent_name][]=$cur_block_name; /* store sub block names for autoresetting and recursive parsing */
- $this->sub_blocks[$cur_block_name][]=""; /* store sub block names for autoresetting */
- } else if ($res[0][1]==$this->block_end_word) {
- unset($block_names[$level--]);
- $parent_name=implode(".",$block_names);
- $blocks[$parent_name].=$res[0][3]; /* add rest of block to parent block */
- }
- } else { /* no block delimiters found */
- if ($k)
- $blocks[implode(".",$block_names)].=$this->block_start_delim;
- if (empty($blocks[implode(".",$block_names)])) $blocks[implode(".",$block_names)] = null; // eliminates incremental assign error, when using E_ALL error reporting
- $blocks[implode(".",$block_names)].=$v;
- }
- }
- return $blocks;
-}
-
-/***[ store_filevar_parents ]***********************************************/
-/*
- store container block's name for file variables
-*/
-
-function store_filevar_parents($blocks){
- $parents=array();
- foreach ($blocks as $bname=>$con) {
- preg_match_all($this->filevar_delim,$con,$res);
- foreach ($res[1] as $k=>$v)
- $parents[$v][]=$bname;
- }
- return $parents;
-}
-
-/***[ error stuff ]*********************************************************/
-/*
- sets and gets error
-*/
-
-function get_error() {
- return ($this->ERROR=="")?0:$this->ERROR;
-}
-
-
-function set_error($str) {
- $this->ERROR="<strong>[XTemplate]</strong>&nbsp;<i>".$str."</i>";
- trigger_error($this->get_error());
-}
-
-/***[ getfile ]*************************************************************/
-/*
- returns the contents of a file
-*/
-
-function getfile($file) {
- if (!isset($file)) {
- $this->set_error("!isset file name!");
- return "";
- }
-
- // check if filename is mapped to other filename
- if (isset($this->FILES))
- {
- if (isset($this->FILES[$file]))
- $file = $this->FILES[$file];
- }
- // prepend template dir
- if (!empty($this->tpldir))
- $file = $this->tpldir."/".$file;
-
- if (isset($this->filecache[$file]))
- $file_text=$this->filecache[$file];
- else {
- if (is_file($file)) {
- if (!($fh=fopen($file,"r"))) {
- $this->set_error("Cannot open file: $file");
- return "";
- }
-
- $file_text=fread($fh,filesize($file));
- fclose($fh);
- } else {
- $this->set_error("[$file] does not exist");
- $file_text="<strong>__XTemplate fatal error: file [$file] does not exist__</strong>";
- }
- $this->filecache[$file]=$file_text;
- }
- return $file_text;
-}
-
-/***[ r_getfile ]***********************************************************/
-/*
- recursively gets the content of a file with {FILE "filename.tpl"} directives
-*/
-
-
-function r_getfile($file) {
- $text=$this->getfile($file);
- while (preg_match($this->file_delim,$text,$res)) {
- $text2=$this->getfile($res[1]);
- $text=preg_replace("'".preg_quote($res[0])."'",$text2,$text);
- }
-
- return $text;
-}
-
-
-} /* end of XTemplate class. */
-?>
+<?php
+
+class XTemplate {
+
+/*
+ xtemplate class 0.3pre
+ html generation with templates - fast & easy
+ copyright (c) 2000-2001 Barnabas Debreceni [cranx@users.sourceforge.net]
+
+ contributors:
+ Ivar Smolin <okul@linux.ee> (14-march-2001)
+ - made some code optimizations
+ Bert Jandehoop <bert.jandehoop@users.info.wau.nl> (26-june-2001)
+ - new feature to substitute template files by other templates
+ - new method array_loop()
+
+ !!! {FILE {VAR}} file variable interpolation may still be buggy !!!
+
+ latest stable & CVS versions always available @
+ http://sourceforge.net/projects/xtpl/
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ version 2.1 as published by the Free Software Foundation.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details at
+ http://www.gnu.org/copyleft/lgpl.html
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ $Id$
+
+*/
+
+/***[ variables ]***********************************************************/
+
+var $filecontents=""; /* raw contents of template file */
+var $blocks=array(); /* unparsed blocks */
+var $parsed_blocks=array(); /* parsed blocks */
+var $preparsed_blocks=array(); /* preparsed blocks, for file includes */
+var $block_parse_order=array(); /* block parsing order for recursive parsing (sometimes reverse:) */
+var $sub_blocks=array(); /* store sub-block names for fast resetting */
+var $VARS=array(); /* variables array */
+var $FILEVARS=array(); /* file variables array */
+var $filevar_parent=array(); /* filevars' parent block */
+var $filecache=array(); /* file caching */
+
+var $tpldir=""; /* location of template files */
+var $FILES=null; /* file names lookup table */
+
+var $file_delim="/\{FILE\s*\"([^\"]+)\"\s*\}/m"; /* regexp for file includes */
+var $filevar_delim="/\{FILE\s*\{([A-Za-z0-9\._]+?)\}\s*\}/m"; /* regexp for file includes */
+var $filevar_delim_nl="/^\s*\{FILE\s*\{([A-Za-z0-9\._]+?)\}\s*\}\s*\n/m"; /* regexp for file includes w/ newlines */
+var $block_start_delim="<!-- "; /* block start delimiter */
+var $block_end_delim="-->"; /* block end delimiter */
+var $block_start_word="BEGIN:"; /* block start word */
+var $block_end_word="END:"; /* block end word */
+
+/* this makes the delimiters look like: <!-- BEGIN: block_name --> if you use my syntax. */
+
+var $NULL_STRING=array(""=>""); /* null string for unassigned vars */
+var $NULL_BLOCK=array(""=>""); /* null string for unassigned blocks */
+var $mainblock="main";
+var $ERROR="";
+var $AUTORESET=1; /* auto-reset sub blocks */
+
+/***[ constructor ]*********************************************************/
+
+
+function XTemplate ($file,$tpldir="",$files=null,$mainblock="main") {
+ $this->tpldir = $tpldir;
+ if (gettype($files)=="array")
+ $this->FILES = $files;
+ $this->mainblock=$mainblock;
+ $this->filecontents=$this->r_getfile($file); /* read in template file */
+ $this->blocks=$this->maketree($this->filecontents,""); /* preprocess some stuff */
+ $this->filevar_parent=$this->store_filevar_parents($this->blocks);
+ $this->scan_globals();
+}
+
+
+/***************************************************************************/
+/***[ public stuff ]********************************************************/
+/***************************************************************************/
+
+/***[ assign ]**************************************************************/
+/*
+ assign a variable
+*/
+
+function assign ($name,$val="") {
+ if (gettype($name)=="array")
+ foreach ($name as $k=>$v)
+ $this->VARS[$k]=$v;
+ else
+ $this->VARS[$name]=$val;
+}
+
+/***[ assign_file ]*********************************************************/
+/*
+ assign a file variable
+*/
+
+function assign_file ($name,$val="") {
+ if (gettype($name)=="array")
+ foreach ($name as $k=>$v)
+ $this->assign_file_($k,$v);
+ else
+ $this->assign_file_($name,$val);
+}
+
+function assign_file_ ($name,$val) {
+ if (isset($this->filevar_parent[$name])) {
+ if ($val!="") {
+ $val=$this->r_getfile($val);
+ foreach($this->filevar_parent[$name] as $parent) {
+ if (isset($this->preparsed_blocks[$parent]) and !isset($this->FILEVARS[$name]))
+ $copy=$this->preparsed_blocks[$parent];
+ else if (isset($this->blocks[$parent]))
+ $copy=$this->blocks[$parent];
+ preg_match_all($this->filevar_delim,$copy,$res,PREG_SET_ORDER);
+ foreach ($res as $v) {
+ $copy=preg_replace("/".preg_quote($v[0])."/","$val",$copy);
+ $this->preparsed_blocks=array_merge($this->preparsed_blocks,$this->maketree($copy,$parent));
+ $this->filevar_parent=array_merge($this->filevar_parent,$this->store_filevar_parents($this->preparsed_blocks));
+ }
+ }
+ }
+ }
+ $this->FILEVARS[$name]=$val;
+}
+
+/***[ parse ]***************************************************************/
+/*
+ parse a block
+*/
+
+function parse ($bname) {
+
+ if (isset($this->preparsed_blocks[$bname])) {
+ $copy=$this->preparsed_blocks[$bname];
+ }
+ else if (isset($this->blocks[$bname]))
+ $copy=$this->blocks[$bname];
+ else
+ $this->set_error ("parse: blockname [$bname] does not exist");
+
+ /* from there we should have no more {FILE } directives */
+ $copy=preg_replace($this->filevar_delim_nl,"",$copy);
+
+ /* find & replace variables+blocks */
+ preg_match_all("/\{([A-Za-z0-9\._]+?)}/",$copy,$var_array);
+ $var_array=$var_array[1];
+ foreach ($var_array as $k=>$v) {
+ $sub=explode(".",$v);
+ if ($sub[0]=="_BLOCK_") {
+ unset($sub[0]);
+ $bname2=implode(".",$sub);
+ $var=$this->parsed_blocks[$bname2];
+ $nul=(!isset($this->NULL_BLOCK[$bname2])) ? $this->NULL_BLOCK[""] : $this->NULL_BLOCK[$bname2];
+ if ($var=="") {
+ if ($nul=="") {
+ $copy=preg_replace("/^\s*\{".$v."\}\s*\n*/m","",$copy);
+ } else {
+ $copy=preg_replace("/\{".$v."\}/","$nul",$copy);
+ }
+ } else {
+ $var=trim($var);
+ $copy=str_replace("\{$v}","$var",$copy);
+ }
+ } else {
+ $var=$this->VARS;
+ foreach ($sub as $v1)
+ $var=$var[$v1];
+ $nul=(!isset($this->NULL_STRING[$v])) ? ($this->NULL_STRING[""]) : ($this->NULL_STRING[$v]);
+ $var=(!isset($var))?$nul:$var;
+ if ($var=="")
+ $copy=preg_replace("/^\s*\{".$v."\}\s*\n/m","",$copy);
+ $copy=str_replace("\{$v}","$var",$copy);
+ }
+ }
+ if (empty($this->parsed_blocks[$bname])) $this->parsed_blocks[$bname] = null; // eliminates incremental assign error, when using E_ALL error reporting
+ $this->parsed_blocks[$bname].=$copy;
+
+ /* reset sub-blocks */
+ if ($this->AUTORESET && (!empty($this->sub_blocks[$bname]))) {
+ reset($this->sub_blocks[$bname]);
+ foreach ($this->sub_blocks[$bname] as $k=>$v)
+ $this->reset($v);
+ }
+}
+
+/***[ rparse ]**************************************************************/
+/*
+ returns the parsed text for a block, including all sub-blocks.
+*/
+
+function rparse($bname) {
+ if (!empty($this->sub_blocks[$bname])) {
+ reset($this->sub_blocks[$bname]);
+ foreach ($this->sub_blocks[$bname] as $k=>$v)
+ if (!empty($v))
+ $this->rparse($v);
+ }
+ $this->parse($bname);
+}
+
+/***[ insert_loop ]*********************************************************/
+/*
+ inserts a loop ( call assign & parse )
+*/
+
+function insert_loop($bname,$var,$value="") {
+ $this->assign($var,$value);
+ $this->parse($bname);
+}
+
+/***[ array_loop ]*********************************************************/
+/*
+ parses a block for every set of data in the values array
+*/
+
+function array_loop($bname, $var, &$values)
+{
+ if (gettype($values)=="array")
+ {
+ foreach($values as $v)
+ {
+ $this->assign($var, $v);
+ $this->parse($bname);
+ }
+ }
+}
+
+/***[ text ]****************************************************************/
+/*
+ returns the parsed text for a block
+*/
+
+function text($bname) {
+ return $this->parsed_blocks[isset($bname) ? $bname :$this->mainblock];
+}
+
+/***[ out ]*****************************************************************/
+/*
+ prints the parsed text
+*/
+
+function out ($bname) {
+ $length=strlen($this->text($bname));
+ header("Content-Length: ".$length);
+ echo $this->text($bname);
+}
+
+/***[ reset ]***************************************************************/
+/*
+ resets the parsed text
+*/
+
+function reset ($bname) {
+ $this->parsed_blocks[$bname]="";
+}
+
+/***[ parsed ]**************************************************************/
+/*
+ returns true if block was parsed, false if not
+*/
+
+function parsed ($bname) {
+ return (!empty($this->parsed_blocks[$bname]));
+}
+
+/***[ SetNullString ]*******************************************************/
+/*
+ sets the string to replace in case the var was not assigned
+*/
+
+function SetNullString($str,$varname="") {
+ $this->NULL_STRING[$varname]=$str;
+}
+
+/***[ SetNullBlock ]********************************************************/
+/*
+ sets the string to replace in case the block was not parsed
+*/
+
+function SetNullBlock($str,$bname="") {
+ $this->NULL_BLOCK[$bname]=$str;
+}
+
+/***[ set_autoreset ]*******************************************************/
+/*
+ sets AUTORESET to 1. (default is 1)
+ if set to 1, parse() automatically resets the parsed blocks' sub blocks
+ (for multiple level blocks)
+*/
+
+function set_autoreset() {
+ $this->AUTORESET=1;
+}
+
+/***[ clear_autoreset ]*****************************************************/
+/*
+ sets AUTORESET to 0. (default is 1)
+ if set to 1, parse() automatically resets the parsed blocks' sub blocks
+ (for multiple level blocks)
+*/
+
+function clear_autoreset() {
+ $this->AUTORESET=0;
+}
+
+/***[ scan_globals ]********************************************************/
+/*
+ scans global variables
+*/
+
+function scan_globals() {
+ reset($GLOBALS);
+ foreach ($GLOBALS as $k=>$v)
+ $GLOB[$k]=$v;
+ $this->assign("PHP",$GLOB); /* access global variables as {PHP.HTTP_HOST} in your template! */
+}
+
+/******
+
+ WARNING
+ PUBLIC FUNCTIONS BELOW THIS LINE DIDN'T GET TESTED
+
+******/
+
+
+/***************************************************************************/
+/***[ private stuff ]*******************************************************/
+/***************************************************************************/
+
+/***[ maketree ]************************************************************/
+/*
+ generates the array containing to-be-parsed stuff:
+ $blocks["main"],$blocks["main.table"],$blocks["main.table.row"], etc.
+ also builds the reverse parse order.
+*/
+
+
+function maketree($con,$parentblock="") {
+ $blocks=array();
+ $con2=explode($this->block_start_delim,$con);
+ if (!empty($parentblock)) {
+ $block_names=explode(".",$parentblock);
+ $level=sizeof($block_names);
+ } else {
+ $block_names=array();
+ $level=0;
+ }
+ foreach ($con2 as $k=>$v) {
+ $patt="($this->block_start_word|$this->block_end_word)\s*(\w+)\s*$this->block_end_delim(.*)";
+ if (preg_match_all("/$patt/ims",$v,$res,PREG_SET_ORDER)) {
+ // $res[0][1] = BEGIN or END
+ // $res[0][2] = block name
+ // $res[0][3] = kinda content
+ if ($res[0][1]==$this->block_start_word) {
+ $parent_name=implode(".",$block_names);
+ $block_names[++$level]=$res[0][2]; /* add one level - array("main","table","row")*/
+ $cur_block_name=implode(".",$block_names); /* make block name (main.table.row) */
+ $this->block_parse_order[]=$cur_block_name; /* build block parsing order (reverse) */
+ if (empty($blocks[$cur_block_name])) $blocks[$cur_block_name] = null; // eliminates incremental assign error, when using E_ALL error reporting
+ $blocks[$cur_block_name].=$res[0][3]; /* add contents */
+ $blocks[$parent_name].="{_BLOCK_.$cur_block_name}"; /* add {_BLOCK_.blockname} string to parent block */
+ $this->sub_blocks[$parent_name][]=$cur_block_name; /* store sub block names for autoresetting and recursive parsing */
+ $this->sub_blocks[$cur_block_name][]=""; /* store sub block names for autoresetting */
+ } else if ($res[0][1]==$this->block_end_word) {
+ unset($block_names[$level--]);
+ $parent_name=implode(".",$block_names);
+ $blocks[$parent_name].=$res[0][3]; /* add rest of block to parent block */
+ }
+ } else { /* no block delimiters found */
+ if ($k)
+ $blocks[implode(".",$block_names)].=$this->block_start_delim;
+ if (empty($blocks[implode(".",$block_names)])) $blocks[implode(".",$block_names)] = null; // eliminates incremental assign error, when using E_ALL error reporting
+ $blocks[implode(".",$block_names)].=$v;
+ }
+ }
+ return $blocks;
+}
+
+/***[ store_filevar_parents ]***********************************************/
+/*
+ store container block's name for file variables
+*/
+
+function store_filevar_parents($blocks){
+ $parents=array();
+ foreach ($blocks as $bname=>$con) {
+ preg_match_all($this->filevar_delim,$con,$res);
+ foreach ($res[1] as $k=>$v)
+ $parents[$v][]=$bname;
+ }
+ return $parents;
+}
+
+/***[ error stuff ]*********************************************************/
+/*
+ sets and gets error
+*/
+
+function get_error() {
+ return ($this->ERROR=="")?0:$this->ERROR;
+}
+
+
+function set_error($str) {
+ $this->ERROR="<strong>[XTemplate]</strong>&nbsp;<i>".$str."</i>";
+ trigger_error($this->get_error());
+}
+
+/***[ getfile ]*************************************************************/
+/*
+ returns the contents of a file
+*/
+
+function getfile($file) {
+ if (!isset($file)) {
+ $this->set_error("!isset file name!");
+ return "";
+ }
+
+ // check if filename is mapped to other filename
+ if (isset($this->FILES))
+ {
+ if (isset($this->FILES[$file]))
+ $file = $this->FILES[$file];
+ }
+ // prepend template dir
+ if (!empty($this->tpldir))
+ $file = $this->tpldir."/".$file;
+
+ if (isset($this->filecache[$file]))
+ $file_text=$this->filecache[$file];
+ else {
+ if (is_file($file)) {
+ if (!($fh=fopen($file,"r"))) {
+ $this->set_error("Cannot open file: $file");
+ return "";
+ }
+
+ $file_text=fread($fh,filesize($file));
+ fclose($fh);
+ } else {
+ $this->set_error("[$file] does not exist");
+ $file_text="<strong>__XTemplate fatal error: file [$file] does not exist__</strong>";
+ }
+ $this->filecache[$file]=$file_text;
+ }
+ return $file_text;
+}
+
+/***[ r_getfile ]***********************************************************/
+/*
+ recursively gets the content of a file with {FILE "filename.tpl"} directives
+*/
+
+
+function r_getfile($file) {
+ $text=$this->getfile($file);
+ while (preg_match($this->file_delim,$text,$res)) {
+ $text2=$this->getfile($res[1]);
+ $text=preg_replace("'".preg_quote($res[0])."'",$text2,$text);
+ }
+
+ return $text;
+}
+
+
+} /* end of XTemplate class. */
+?>
diff --git a/themes/example/example.theme b/themes/example/example.theme
deleted file mode 100644
index d9a040f3e..000000000
--- a/themes/example/example.theme
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-// $Id$
-
-function example_help($section) {
-
- $output = "";
-
- switch ($section) {
- case 'admin/themes#description':
- $output = t("Internet explorer, Netscape, Opera, Lynx");
- break;
- }
-
- return $output;
-}
-
-
-?>
diff --git a/themes/pushbutton/arrow-next-hover.png b/themes/pushbutton/arrow-next-hover.png
new file mode 100644
index 000000000..e134d942f
--- /dev/null
+++ b/themes/pushbutton/arrow-next-hover.png
Binary files differ
diff --git a/themes/pushbutton/arrow-next.png b/themes/pushbutton/arrow-next.png
new file mode 100644
index 000000000..87bb67e50
--- /dev/null
+++ b/themes/pushbutton/arrow-next.png
Binary files differ
diff --git a/themes/pushbutton/arrow-prev-hover.png b/themes/pushbutton/arrow-prev-hover.png
new file mode 100644
index 000000000..2a3e05c4b
--- /dev/null
+++ b/themes/pushbutton/arrow-prev-hover.png
Binary files differ
diff --git a/themes/pushbutton/arrow-prev.png b/themes/pushbutton/arrow-prev.png
new file mode 100644
index 000000000..96b3fe260
--- /dev/null
+++ b/themes/pushbutton/arrow-prev.png
Binary files differ
diff --git a/themes/pushbutton/arrow-up-hover.png b/themes/pushbutton/arrow-up-hover.png
new file mode 100644
index 000000000..daf013108
--- /dev/null
+++ b/themes/pushbutton/arrow-up-hover.png
Binary files differ
diff --git a/themes/pushbutton/arrow-up.png b/themes/pushbutton/arrow-up.png
new file mode 100644
index 000000000..fce29251d
--- /dev/null
+++ b/themes/pushbutton/arrow-up.png
Binary files differ
diff --git a/themes/xtemplate/pushbutton/background.png b/themes/pushbutton/background.png
index 889e1cc9a..889e1cc9a 100644
--- a/themes/xtemplate/pushbutton/background.png
+++ b/themes/pushbutton/background.png
Binary files differ
diff --git a/themes/xtemplate/pushbutton/forum-container.jpg b/themes/pushbutton/forum-container.jpg
index 46ea78f2a..46ea78f2a 100644
--- a/themes/xtemplate/pushbutton/forum-container.jpg
+++ b/themes/pushbutton/forum-container.jpg
Binary files differ
diff --git a/themes/xtemplate/pushbutton/forum-link.png b/themes/pushbutton/forum-link.png
index 56c50b16e..56c50b16e 100644
--- a/themes/xtemplate/pushbutton/forum-link.png
+++ b/themes/pushbutton/forum-link.png
Binary files differ
diff --git a/themes/xtemplate/pushbutton/header-a.jpg b/themes/pushbutton/header-a.jpg
index 26b6c0122..26b6c0122 100644
--- a/themes/xtemplate/pushbutton/header-a.jpg
+++ b/themes/pushbutton/header-a.jpg
Binary files differ
diff --git a/themes/xtemplate/pushbutton/header-b.jpg b/themes/pushbutton/header-b.jpg
index 17ed8541c..17ed8541c 100644
--- a/themes/xtemplate/pushbutton/header-b.jpg
+++ b/themes/pushbutton/header-b.jpg
Binary files differ
diff --git a/themes/xtemplate/pushbutton/icon-block.png b/themes/pushbutton/icon-block.png
index c12933bef..c12933bef 100644
--- a/themes/xtemplate/pushbutton/icon-block.png
+++ b/themes/pushbutton/icon-block.png
Binary files differ
diff --git a/themes/xtemplate/pushbutton/icon-comment.png b/themes/pushbutton/icon-comment.png
index 9ef36deda..9ef36deda 100644
--- a/themes/xtemplate/pushbutton/icon-comment.png
+++ b/themes/pushbutton/icon-comment.png
Binary files differ
diff --git a/themes/xtemplate/pushbutton/logo-active.jpg b/themes/pushbutton/logo-active.jpg
index 67e89081c..67e89081c 100644
--- a/themes/xtemplate/pushbutton/logo-active.jpg
+++ b/themes/pushbutton/logo-active.jpg
Binary files differ
diff --git a/themes/xtemplate/pushbutton/logo-background.jpg b/themes/pushbutton/logo-background.jpg
index d47005fbb..d47005fbb 100644
--- a/themes/xtemplate/pushbutton/logo-background.jpg
+++ b/themes/pushbutton/logo-background.jpg
Binary files differ
diff --git a/themes/xtemplate/pushbutton/logo-hover.jpg b/themes/pushbutton/logo-hover.jpg
index 5e662f5df..5e662f5df 100644
--- a/themes/xtemplate/pushbutton/logo-hover.jpg
+++ b/themes/pushbutton/logo-hover.jpg
Binary files differ
diff --git a/themes/xtemplate/pushbutton/logo.png b/themes/pushbutton/logo.png
index 4d0a7e98d..4d0a7e98d 100644
--- a/themes/xtemplate/pushbutton/logo.png
+++ b/themes/pushbutton/logo.png
Binary files differ
diff --git a/themes/pushbutton/screenshot.png b/themes/pushbutton/screenshot.png
new file mode 100644
index 000000000..139e1a7db
--- /dev/null
+++ b/themes/pushbutton/screenshot.png
Binary files differ
diff --git a/themes/xtemplate/pushbutton/xtemplate.css b/themes/pushbutton/style.css
index 0cb54e511..8888443fa 100644
--- a/themes/xtemplate/pushbutton/xtemplate.css
+++ b/themes/pushbutton/style.css
@@ -1,520 +1,539 @@
-/* $Id$ */
-
-/*
-** HTML elements
-*/
-body {
- color: #000;
- background-color: #fff;
- margin: 0;
- padding: 0;
-}
-body, p, td, li, ul, ol {
- font-family: Verdana, Helvetica, Arial, sans-serif;
-}
-h1, h2, h3, h4, h5, h6 {
- font-family: "Trebuchet MS", Geneva, Arial, Helvetica, SunSans-Regular, Verdana, sans-serif;
- margin: 0;
-}
-h1 {
- color: #369;
- font-size: 1.6em;
-}
-img {
- display: block;
- border: 0;
-}
-tr.dark td, tr.light td {
- padding: 0.3em;
-}
-a:link {
- text-decoration: none;
- font-weight: bold;
- color: #ff8c00;
-}
-a:visited {
- text-decoration: none;
- font-weight: bold;
- color: #c96;
-}
-a:hover, a:active {
- font-weight: bold;
- color: #ff4500;
- text-decoration: underline;
-}
-fieldset {
- border: 1px solid #ccc;
-}
-p {
- margin: 0 0 1.3em 0;
- padding: 0;
-}
-blockquote {
- border-left: 4px solid #69c;
- padding: 0 15px 0 15px;
- margin: 25px 100px 25px 50px;
- color: #696969;
- text-align: left;
- font-size: 1.2em;
- line-height: 1.3em;
- font-family: "Trebuchet MS", Geneva, Arial, Helvetica, SunSans-Regular, Verdana, sans-serif;
-}
-pre {
- background-color: #eee;
- padding: 0.75em 1.5em;
- font-size: 1.2em;
- border: 1px solid #ddd;
-}
-.form-item {
- margin-top: 1em;
-}
-.form-item label {
- color: #369;
-}
-.item-list .title {
- color: #369;
- font-size: 0.85em;
-}
-
-/*
-** Page layout blocks / IDs
-*/
-#primary-menu {
- background-color: #e0edfb;
-}
-#primary-menu tr {
- background: transparent url(header-a.jpg) left bottom repeat;
-}
-td#home {
- background: transparent url(logo-background.jpg) left top repeat;
-}
-td#home a:link img, td#home a:visited img {
- background: transparent url(logo-active.jpg) repeat;
- width: 144px;
- height: 63px;
-}
-td#home a:hover img {
- background: transparent url(logo-hover.jpg) repeat;
- width: 144px;
- height: 63px;
-}
-.primary-links, .primary-links a:link, .primary-links a:visited {
- color: #369;
-}
-.primary-links a:hover {
- color: #000;
-}
-#primary-menu .primary-links {
- background: transparent url(header-b.jpg) left top no-repeat;
- font-size: 0.79em;
-}
-#primary-menu .primary-links h1, #primary-menu .primary-links h2, #primary-menu .primary-links h3 {
- font-size: 2.3em;
- color: #369;
-}
-#secondary-menu {
- background-color: #369;
- border-top: 3px solid #69c;
- border-bottom: 3px solid #69c;
-}
-.secondary-links, .secondary-links a:link, .secondary-links a:visited {
- color: #e4e9eb;
-}
-.secondary-links a:hover {
- color: #fff;
- text-decoration: underline;
-}
-#secondary-menu .secondary-links {
- font-size: 0.85em;
-}
-#content {
- background-color: #fff;
-}
-#contentstart {
- background-color: #fff;
-}
-#menu {
- padding: 0.5em 0.5em 0 0.5em;
- text-align: right;
- vertical-align: middle;
-}
-#search .form-text, #search .form-submit {
- border: 1px solid #369;
- font-size: 0.85em;
-}
-#search .form-text {
- width: 8em;
- height: 1.4em;
- padding: 0 0.5em 0 0.5em;
- margin: 0 0 0.5em 0;
-}
-#search .form-submit {
- height: 1.5em;
-}
-#mission {
- background-color: #fff;
- color: #696969;
- border-top: 2px solid #dcdcdc;
- border-bottom: 2px solid #dcdcdc;
- padding: 10px 10px 10px 10px;
- margin: 20px 35px 0px 35px;
- font-family: "Trebuchet MS", Geneva, Arial, Helvetica, SunSans-Regular, Verdana, sans-serif;
- font-size: 1.1em;
- font-weight: normal;
-}
-#main {
- /* padding in px not ex because IE messes up 100% width tables otherwise */
- padding: 30px 35px 50px 35px;
- background: transparent url(background.png) center center no-repeat;
-}
-#mission, .node .content, .comment .content {
- line-height: 1.4;
-}
-#help {
- font-size: 0.9em;
- margin-bottom: 1em;
-}
-.breadcrumb {
- margin-bottom: .5em;
-}
-.messages {
- background-color: #eee;
- border: 1px solid #ccc;
- padding: 0.3em;
- margin-bottom: 1em;
-}
-.error {
- border-color: red;
-}
-.nav {
- padding: 0px 0px 0px 0px;
- margin: 0px 0px 0px 0px;
-}
-#sidebar-left, #sidebar-right {
- font-size: 0.75em;
- width: 175px;
- /* padding in px not ex because IE messes up 100% width tables otherwise */
- padding: 25px 10px 75px 10px;
- vertical-align: top;
- background: #FFFAF0;
-}
-#sidebar-left {
- border-right: 3px solid #f5f5f5;
-}
-#sidebar-right {
- border-left: 3px solid #f5f5f5;
-}
-#sidebar-left li, #sidebar-right li {
- font-size: 1em;
-}
-.node .content {
- text-align: left;
- font-size: 0.85em;
- line-height: 1.3;
-}
-.comment .content {
- text-align: left;
- font-size: 0.85em;
- line-height: 1.3;
-}
-#footer-message {
- padding: 15px 100px 30px 100px;
- font-size: 0.85em;
- text-align: center;
- color: #aaa;
-}
-table#footer-menu {
- border-top: 3px solid #6699cc;
- border-bottom: 3px solid #6699cc;
- background-color: #369;
- color: #e4e9eb;
-}
-#footer-menu td {
- padding: 5px;
- font-size: 0.75em;
-}
-#footer-menu .primary-links, #footer-menu a:link, #footer-menu a:visited {
- color: #e4e9eb;
-}
-#footer-menu a:hover {
- color: #fff;
- text-decoration: underline;
-}
-#footer-menu .primary-links h1, #footer-menu .primary-links h2, #footer-menu .primary-links h3 {
- font-size: 1.3em;
- color: #e4e9eb;
-}
-/*
-** Common declarations for child classes of node, comment, block, box, etc.
-** If you want any of them styled differently for a specific parent, add
-** additional rules /with only the differing properties!/ to .parent .class.
-** See .comment .title for an example.
-*/
-#content .title, #content .title a {
- color: #369;
-}
-.content h1 {
- color: #369;
- font-size: 1.9em;
-}
-.content h2 {
- color: #58b;
- font-size: 1.7em;
-}
-.content h3 {
- color: #69c;
- font-size: 1.5em;
-}
-.content h4 {
- color: #8be;
- font-size: 1.3em;
-}
-.content h5 {
- color: #96c6f6;
- font-size: 1.15em;
-}
-.submitted {
- color: #999;
- font-size: 0.79em;
-}
-.links {
- color: #ff8c00;
- font-size: 0.8em;
- padding: 0px 0px 0px 0px;
- margin: 0px 0px 0px 0px;
-}
-.links a {
- font-weight: bold;
-}
-.box {
- padding: 0 0 1.5em 0;
-}
-.box {
- padding: 0px 0px 0px 0px;
- margin: 0px 0px 0px 0px;
-}
-.box h2 {
- font-size: 9px;
-}
-.block .title h3 {
- border-bottom: 2px solid #6699cc;
- color: #369;
- font-size: 18px;
- font-weight: bold;
- padding: 10px 5px 10px 30px;
- margin-bottom: .25em;
- background: transparent url(icon-block.png) left center no-repeat;
-}
-.block .content {
- padding: 5px 5px 5px 5px;
-}
-.block {
- margin-bottom: 1.5em;
-}
-.box .title {
- font-size: 1.1em;
-}
-.node {
- margin: .5em 0 2.5em 0;
-}
-.node .content, .comment .content {
- margin: .5em 0 .5em 0;
-}
-.node .taxonomy {
- color: #999;
- font-size: 0.83em;
- padding: 1.5em;
-}
-.node .picture {
- border: 1px solid #fff;
- float: right;
- margin: 0.5em;
-}
-.comment {
- border: 1px solid #abc;
- padding: .5em;
- margin-bottom: 1em;
-}
-.comment .title {
- font-size: 1em;
- padding: 10px 0px 12px 19px;
- background: transparent url(icon-comment.png) left center no-repeat;
-}
-.comment .new {
- font-weight: bold;
- font-size: 1em;
- margin-left: 2px;
- color: red;
-}
-.comment .picture {
- border: 1px solid #fff;
- float: right;
- margin: 10px;
-}
-.links {
- font-size: 0.75em;
-}
-.links .prev, .links .next, .links .up {
- font-size: 1.15em;
-}
-.titles .prev, .titles .next {
- font-size: 0.85em;
- font-weight: bold;
- color: #444;
-}
-.hide {
- display: none
-}
-.nav .links .next a:link {
- padding: 15px 15px 17px 0;
- background: transparent url(arrow-next.png) right center no-repeat;
-}
-.nav .links .next a:hover {
- padding: 15px 15px 17px 0;
- background: transparent url(arrow-next-hover.png) right center no-repeat;
-}
-.nav .links .prev a:link {
- padding: 15px 0 17px 15px;
- background: transparent url(arrow-prev.png) left center no-repeat;
-}
-.nav .links .prev a:hover {
- padding: 15px 0 17px 15px;
- background: transparent url(arrow-prev-hover.png) left center no-repeat;
-}
-.nav .links .up a:link {
- padding: 11px 0 15px 0;
- background: transparent url(arrow-up.png) center top no-repeat;
-}
-.nav .links .up a:hover {
- padding: 11px 0 15px 0;
- background: transparent url(arrow-up-hover.png) center top no-repeat;
-}
-
-/*
-** Module specific styles
-*/
-.content .active {
- color: #369;
-}
-#aggregator .feed {
- background-color: #eee;
- border: 1px solid #ccc;
- padding: 1em;
- margin: 1em 0 1em 0;
-}
-#aggregator .news-item .source {
- color: #999;
- font-style: italic;
- font-size: 0.85em;
-}
-#aggregator .title {
- font-size: 1em;
-}
-#aggregator h3 {
- margin-top: 1em;
-}
-#tracker th {
- text-align: center;
- background-color: #f5f5f5;
- border-bottom: 1px solid #ddd;
- border-right: 1px solid #ddd;
- border-left: 1px solid #fafafa;
-}
-#tracker th img {
- float: right;
-}
-#tracker tr.light, #tracker tr.dark {
- background-color: #fff;
-}
-#tracker td {
- vertical-align: top;
- padding: 1em 1em 1em 0;
- border-bottom: 1px solid #bbb;
-}
-#forum {
- margin: 15px 0 15px 0;
- background-color: #fff;
-}
-#forum table {
- width: 100%;
- border: 2px solid #69c;
-}
-#forum table tr th {
- text-align: center;
- background: #69c;
- color: #fff;
- font-size: 0.75em;
- border-bottom: 1px solid #aaa;
-}
-#forum table tr th a {
- color: #fff;
- text-decoration: underline;
-}
-#forum table tr th img {
- margin: 0;
-}
-#forum tr.dark {
- background: #e0edfb;
-}
-#forum tr.light {
- background: #fff;
-}
-#forum td {
- padding: 0.5em 0.5em 0.5em 0.5em;
-}
-#forum td.container {
- color: #000;
- background: #369 url(forum-container.jpg) right top no-repeat;
- border: 2px solid #69c;
-}
-#forum td.container a {
- color: #e4e9eb;
- padding: 20px 0 20px 35px;
- background: transparent url(forum-link.png) left center no-repeat;
-}
-#forum td.container a:visited {
- color: #e4e9eb;
-}
-#forum td.statistics, #forum td.settings, #forum td.pager {
- height: 1.5em;
- border: 1px solid #bbb;
-}
-#forum td .name {
- color: #96c;
-}
-#forum td .links {
- padding-top: 0.7em;
- font-size: 0.9em;
-}
-.block-forum h3 {
- margin-bottom: .5em;
-}
-.calendar a {
- text-decoration: none;
-}
-.calendar td, .calendar th {
- padding: 0.4em 0;
- border-color: #888;
-}
-.calendar .row-week td a {
- padding: 0.4em 0;
-}
-.calendar .day-today {
- background-color: #69c;
-}
-.calendar .day-today a {
- color: #fff;
-}
-.calendar .day-selected {
- background-color: #369;
- color: #fff;
-}
-.calendar .header-week {
- background-color: #ccc;
-}
-.calendar .day-blank {
- background-color: #ccc;
-}
-.calendar .row-week td a:hover {
- background-color: #fff; color: #000;
-}
+/* $Id$ */
+
+/*
+** HTML elements
+*/
+body {
+ color: #000;
+ background-color: #fff;
+ margin: 0;
+ padding: 0;
+}
+body, p, td, li, ul, ol {
+ font-family: Verdana, Helvetica, Arial, sans-serif;
+}
+h1, h2, h3, h4, h5, h6 {
+ font-family: "Trebuchet MS", Geneva, Arial, Helvetica, SunSans-Regular, Verdana, sans-serif;
+ margin: 0;
+}
+h1 {
+ color: #369;
+ font-size: 1.6em;
+}
+img {
+ display: block;
+ border: 0;
+}
+tr.dark td, tr.light td {
+ padding: 0.3em;
+}
+a:link {
+ text-decoration: none;
+ font-weight: bold;
+ color: #ff8c00;
+}
+a:visited {
+ text-decoration: none;
+ font-weight: bold;
+ color: #c96;
+}
+a:hover, a:active {
+ font-weight: bold;
+ color: #ff4500;
+ text-decoration: underline;
+}
+fieldset {
+ border: 1px solid #ccc;
+}
+p {
+ margin: 0 0 1.3em 0;
+ padding: 0;
+}
+blockquote {
+ border-left: 4px solid #69c;
+ padding: 0 15px 0 15px;
+ margin: 25px 100px 25px 50px;
+ color: #696969;
+ text-align: left;
+ font-size: 1.2em;
+ line-height: 1.3em;
+ font-family: "Trebuchet MS", Geneva, Arial, Helvetica, SunSans-Regular, Verdana, sans-serif;
+}
+pre {
+ background-color: #eee;
+ padding: 0.75em 1.5em;
+ font-size: 1.2em;
+ border: 1px solid #ddd;
+}
+.form-item {
+ margin-top: 1em;
+}
+.form-item label {
+ color: #369;
+}
+.item-list .title {
+ color: #369;
+ font-size: 0.85em;
+}
+
+/*
+** Page layout blocks / IDs
+*/
+#primary-menu {
+ background-color: #e0edfb;
+}
+#primary-menu tr {
+ background: transparent url(header-a.jpg) left bottom repeat;
+}
+td#home {
+ background: transparent url(logo-background.jpg) left top repeat;
+}
+td#home a:link img, td#home a:visited img {
+ background: transparent url(logo-active.jpg) repeat;
+ width: 144px;
+ height: 63px;
+}
+td#home a:hover img {
+ background: transparent url(logo-hover.jpg) repeat;
+ width: 144px;
+ height: 63px;
+}
+.primary-links, .primary-links a:link, .primary-links a:visited {
+ color: #369;
+}
+.primary-links a:hover {
+ color: #000;
+}
+#primary-menu .primary-links {
+ background: transparent url(header-b.jpg) left top no-repeat;
+ font-size: 0.79em;
+}
+#primary-menu .primary-links h1, #primary-menu .primary-links h2, #primary-menu .primary-links h3 {
+ font-size: 2.3em;
+ color: #369;
+}
+#secondary-menu {
+ background-color: #369;
+ border-top: 3px solid #69c;
+ border-bottom: 3px solid #69c;
+}
+.secondary-links, .secondary-links a:link, .secondary-links a:visited {
+ color: #e4e9eb;
+}
+.secondary-links a:hover {
+ color: #fff;
+ text-decoration: underline;
+}
+#secondary-menu .secondary-links {
+ font-size: 0.85em;
+}
+#content {
+ background-color: #fff;
+}
+#contentstart {
+ background-color: #fff;
+}
+#menu {
+ padding: 0.5em 0.5em 0 0.5em;
+ text-align: right;
+ vertical-align: middle;
+}
+#search .form-text, #search .form-submit {
+ border: 1px solid #369;
+ font-size: 0.85em;
+}
+#search .form-text {
+ width: 8em;
+ height: 1.4em;
+ padding: 0 0.5em 0 0.5em;
+ margin: 0 0 0.5em 0;
+}
+#search .form-submit {
+ height: 1.5em;
+}
+#mission {
+ background-color: #fff;
+ color: #696969;
+ border-top: 2px solid #dcdcdc;
+ border-bottom: 2px solid #dcdcdc;
+ padding: 10px 10px 10px 10px;
+ margin: 20px 35px 0px 35px;
+ font-family: "Trebuchet MS", Geneva, Arial, Helvetica, SunSans-Regular, Verdana, sans-serif;
+ font-size: 1.1em;
+ font-weight: normal;
+}
+#site-info {
+ background-color: #bdd3ea;
+ background-image: none;
+ font-family: "Trebuchet MS", Geneva, Arial, Helvetica, SunSans-Regular, Verdana, sans-serif;
+}
+.site-name {
+ font-size: 1.2em;
+}
+.site-name a:link, .site-name a:visited {
+ color: #fff;
+}
+.site-name a:hover {
+ color: #ff8c00;
+ text-decoration: none;
+}
+.site-slogan {
+ font-size: 0.8em;
+ font-weight: bold;
+}
+#main {
+ /* padding in px not ex because IE messes up 100% width tables otherwise */
+ padding: 30px 35px 50px 35px;
+ background: transparent url(background.png) center center no-repeat;
+}
+#mission, .node .content, .comment .content {
+ line-height: 1.4;
+}
+#help {
+ font-size: 0.9em;
+ margin-bottom: 1em;
+}
+.breadcrumb {
+ margin-bottom: .5em;
+}
+.messages {
+ background-color: #eee;
+ border: 1px solid #ccc;
+ padding: 0.3em;
+ margin-bottom: 1em;
+}
+.error {
+ border-color: red;
+}
+.nav {
+ padding: 0px 0px 0px 0px;
+ margin: 0px 0px 0px 0px;
+}
+#sidebar-left, #sidebar-right {
+ font-size: 0.75em;
+ width: 175px;
+ /* padding in px not ex because IE messes up 100% width tables otherwise */
+ padding: 25px 10px 75px 10px;
+ vertical-align: top;
+ background: #FFFAF0;
+}
+#sidebar-left {
+ border-right: 3px solid #f5f5f5;
+}
+#sidebar-right {
+ border-left: 3px solid #f5f5f5;
+}
+#sidebar-left li, #sidebar-right li {
+ font-size: 1em;
+}
+.node .content {
+ text-align: left;
+ font-size: 0.85em;
+ line-height: 1.3;
+}
+.comment .content {
+ text-align: left;
+ font-size: 0.85em;
+ line-height: 1.3;
+}
+#footer-message {
+ padding: 15px 100px 30px 100px;
+ font-size: 0.85em;
+ text-align: center;
+ color: #aaa;
+}
+table#footer-menu {
+ border-top: 3px solid #6699cc;
+ border-bottom: 3px solid #6699cc;
+ background-color: #369;
+ color: #e4e9eb;
+}
+#footer-menu td {
+ padding: 5px;
+ font-size: 0.75em;
+}
+#footer-menu .primary-links, #footer-menu a:link, #footer-menu a:visited {
+ color: #e4e9eb;
+}
+#footer-menu a:hover {
+ color: #fff;
+ text-decoration: underline;
+}
+#footer-menu .primary-links h1, #footer-menu .primary-links h2, #footer-menu .primary-links h3 {
+ font-size: 1.3em;
+ color: #e4e9eb;
+}
+/*
+** Common declarations for child classes of node, comment, block, box, etc.
+** If you want any of them styled differently for a specific parent, add
+** additional rules /with only the differing properties!/ to .parent .class.
+** See .comment .title for an example.
+*/
+#content .title, #content .title a {
+ color: #369;
+}
+.content h1 {
+ color: #369;
+ font-size: 1.9em;
+}
+.content h2 {
+ color: #58b;
+ font-size: 1.7em;
+}
+.content h3 {
+ color: #69c;
+ font-size: 1.5em;
+}
+.content h4 {
+ color: #8be;
+ font-size: 1.3em;
+}
+.content h5 {
+ color: #96c6f6;
+ font-size: 1.15em;
+}
+.submitted {
+ color: #999;
+ font-size: 0.79em;
+}
+.links {
+ color: #ff8c00;
+ font-size: 0.8em;
+ padding: 0px 0px 0px 0px;
+ margin: 0px 0px 0px 0px;
+}
+.links a {
+ font-weight: bold;
+}
+.box {
+ padding: 0 0 1.5em 0;
+}
+.box {
+ padding: 0px 0px 0px 0px;
+ margin: 0px 0px 0px 0px;
+}
+.box h2 {
+ font-size: 9px;
+}
+.block .title h3 {
+ border-bottom: 2px solid #6699cc;
+ color: #369;
+ font-size: 18px;
+ font-weight: bold;
+ padding: 10px 5px 10px 30px;
+ margin-bottom: .25em;
+ background: transparent url(icon-block.png) left center no-repeat;
+}
+.block .content {
+ padding: 5px 5px 5px 5px;
+}
+.block {
+ margin-bottom: 1.5em;
+}
+.box .title {
+ font-size: 1.1em;
+}
+.node {
+ margin: .5em 0 2.5em 0;
+}
+.node .content, .comment .content {
+ margin: .5em 0 .5em 0;
+}
+.node .taxonomy {
+ color: #999;
+ font-size: 0.83em;
+ padding: 1.5em;
+}
+.node .picture {
+ border: 1px solid #fff;
+ float: right;
+ margin: 0.5em;
+}
+.comment {
+ border: 1px solid #abc;
+ padding: .5em;
+ margin-bottom: 1em;
+}
+.comment .title {
+ font-size: 1em;
+ padding: 10px 0px 12px 19px;
+ background: transparent url(icon-comment.png) left center no-repeat;
+}
+.comment .new {
+ font-weight: bold;
+ font-size: 1em;
+ margin-left: 2px;
+ color: red;
+}
+.comment .picture {
+ border: 1px solid #fff;
+ float: right;
+ margin: 10px;
+}
+.links {
+ font-size: 0.75em;
+}
+.links .prev, .links .next, .links .up {
+ font-size: 1.15em;
+}
+.titles .prev, .titles .next {
+ font-size: 0.85em;
+ font-weight: bold;
+ color: #444;
+}
+.hide {
+ display: none
+}
+.nav .links .next a:link {
+ padding: 15px 15px 17px 0;
+ background: transparent url(arrow-next.png) right center no-repeat;
+}
+.nav .links .next a:hover {
+ padding: 15px 15px 17px 0;
+ background: transparent url(arrow-next-hover.png) right center no-repeat;
+}
+.nav .links .prev a:link {
+ padding: 15px 0 17px 15px;
+ background: transparent url(arrow-prev.png) left center no-repeat;
+}
+.nav .links .prev a:hover {
+ padding: 15px 0 17px 15px;
+ background: transparent url(arrow-prev-hover.png) left center no-repeat;
+}
+.nav .links .up a:link {
+ padding: 11px 0 15px 0;
+ background: transparent url(arrow-up.png) center top no-repeat;
+}
+.nav .links .up a:hover {
+ padding: 11px 0 15px 0;
+ background: transparent url(arrow-up-hover.png) center top no-repeat;
+}
+
+/*
+** Module specific styles
+*/
+.content .active {
+ color: #369;
+}
+#aggregator .feed {
+ background-color: #eee;
+ border: 1px solid #ccc;
+ padding: 1em;
+ margin: 1em 0 1em 0;
+}
+#aggregator .news-item .source {
+ color: #999;
+ font-style: italic;
+ font-size: 0.85em;
+}
+#aggregator .title {
+ font-size: 1em;
+}
+#aggregator h3 {
+ margin-top: 1em;
+}
+#tracker th {
+ text-align: center;
+ background-color: #f5f5f5;
+ border-bottom: 1px solid #ddd;
+ border-right: 1px solid #ddd;
+ border-left: 1px solid #fafafa;
+}
+#tracker th img {
+ float: right;
+}
+#tracker tr.light, #tracker tr.dark {
+ background-color: #fff;
+}
+#tracker td {
+ vertical-align: top;
+ padding: 1em 1em 1em 0;
+ border-bottom: 1px solid #bbb;
+}
+#forum {
+ margin: 15px 0 15px 0;
+ background-color: #fff;
+}
+#forum table {
+ width: 100%;
+ border: 2px solid #69c;
+}
+#forum table tr th {
+ text-align: center;
+ background: #69c;
+ color: #fff;
+ font-size: 0.75em;
+ border-bottom: 1px solid #aaa;
+}
+#forum table tr th a {
+ color: #fff;
+ text-decoration: underline;
+}
+#forum table tr th img {
+ margin: 0;
+}
+#forum tr.dark {
+ background: #e0edfb;
+}
+#forum tr.light {
+ background: #fff;
+}
+#forum td {
+ padding: 0.5em 0.5em 0.5em 0.5em;
+}
+#forum td.container {
+ color: #000;
+ background: #369 url(forum-container.jpg) right top no-repeat;
+ border: 2px solid #69c;
+}
+#forum td.container a {
+ color: #e4e9eb;
+ padding: 20px 0 20px 35px;
+ background: transparent url(forum-link.png) left center no-repeat;
+}
+#forum td.container a:visited {
+ color: #e4e9eb;
+}
+#forum td.statistics, #forum td.settings, #forum td.pager {
+ height: 1.5em;
+ border: 1px solid #bbb;
+}
+#forum td .name {
+ color: #96c;
+}
+#forum td .links {
+ padding-top: 0.7em;
+ font-size: 0.9em;
+}
+.block-forum h3 {
+ margin-bottom: .5em;
+}
+.calendar a {
+ text-decoration: none;
+}
+.calendar td, .calendar th {
+ padding: 0.4em 0;
+ border-color: #888;
+}
+.calendar .row-week td a {
+ padding: 0.4em 0;
+}
+.calendar .day-today {
+ background-color: #69c;
+}
+.calendar .day-today a {
+ color: #fff;
+}
+.calendar .day-selected {
+ background-color: #369;
+ color: #fff;
+}
+.calendar .header-week {
+ background-color: #ccc;
+}
+.calendar .day-blank {
+ background-color: #ccc;
+}
+.calendar .row-week td a:hover {
+ background-color: #fff; color: #000;
+}
diff --git a/themes/xtemplate/pushbutton/xtemplate.xtmpl b/themes/pushbutton/xtemplate.xtmpl
index 5e148eaac..a6e904332 100644
--- a/themes/xtemplate/pushbutton/xtemplate.xtmpl
+++ b/themes/pushbutton/xtemplate.xtmpl
@@ -1,141 +1,163 @@
-<!-- BEGIN: header --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
-<head>
- <title>{head_title}</title>
- {head}
- <style type="text/css" media="all">@import "{directory}/xtemplate.css";</style>
-</head>
-
-<body bgcolor="#ffffff" {onload_attributes}>
-
-<div class="hide"><a href="#content" title="Skip navigation." accesskey="2">Skip navigation</a>.</div>
-
-<table id="primary-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
- <tr>
- <td id="home" width="10%"><a href="./" title="Home"><img src="{directory}/logo.png" alt="Home" width="144" height="63" border="0" /></a></td>
- <td class="primary-links" width="90%" align="center" valign="middle">{primary_links}</td>
- </tr>
-</table>
-
-<table id="secondary-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
- <tr>
- <td class="secondary-links" width="75%" align="center" valign="middle">
- {secondary_links}
- </td>
- <td width="25%" align="center" valign="middle">
- <!-- BEGIN: search_box -->
- <form action="{search_url}" method="post">
- <div id="search">
- <input class="form-text" type="text" size="15" value="" name="keys" alt="{search_description}" />
- <input class="form-submit" type="submit" value="{search_button_text}" alt="submit" />
- </div>
- </form>
- <!-- END: search_box -->
- </td>
- </tr>
-</table>
-
-<table id="content" border="0" cellpadding="15" cellspacing="0" width="100%">
- <tr>
- <!-- BEGIN: blocks -->
- <td id="sidebar-left">
- {blocks}
- </td>
- <!-- END: blocks -->
- <td valign="top">
- <!-- BEGIN: mission -->
- <div id="mission">{mission}</div>
- <!-- END: mission -->
- <div id="main">
- <!-- BEGIN: title -->
- {breadcrumb}
- <h1 class="title">{title}</h1>
- <!-- BEGIN: tabs -->
- <div class="tabs">{tabs}</div>
- <!-- END: tabs -->
-
- <!-- END: title -->
- <!-- BEGIN: help -->
- <div id="help">{help}</div>
- <!-- END: help -->
- <!-- BEGIN: message -->
- {message}
- <!-- END: message -->
-<!-- END: header -->
-
-<!-- BEGIN: node -->
- <div class="node {sticky}">
- <!-- BEGIN: picture -->
- {picture}
- <!-- END: picture -->
- <!-- BEGIN: title -->
- <h1 class="title"><a href="{link}">{title}</a></h1>
- <!-- END: title -->
- <span class="submitted">{submitted}</span>
- <!-- BEGIN: taxonomy -->
- <span class="taxonomy">{taxonomy}</span>
- <!-- END: taxonomy -->
- <div class="content">{content}</div>
- <!-- BEGIN: links -->
- <div class="links">&raquo; {links}</div>
- <!-- END: links -->
- </div>
-<!-- END: node -->
-
-<!-- BEGIN: comment -->
- <div class="comment">
- <!-- BEGIN: picture -->
- {picture}
- <!-- END: picture -->
- <h3 class="title">{title}</h3>
- <div class="submitted">{submitted}<!-- BEGIN: new --><span class="new"> *{new}</span><!-- END: new --></div>
- <div class="content">{content}</div>
- <!-- BEGIN: links -->
- <div class="links">&raquo; {links}</div>
- <!-- END: links -->
- </div>
-<!-- END: comment -->
-
-<!-- BEGIN: box -->
- <div class="box">
- <h2 class="title">{title}</h2>
- <div class="content">{content}</div>
- </div>
-<!-- END: box -->
-
-<!-- BEGIN: block -->
- <div class="block block-{module}" id="block-{module}-{delta}">
- <div class="title"><h3>{title}</h3></div>
- <div class="content">{content}</div>
- </div>
-<!-- END: block -->
-
-<!-- BEGIN: footer -->
- </div><!-- main -->
- </td>
- <!-- BEGIN: blocks -->
- <td id="sidebar-right">
- {blocks}
- </td>
- <!-- END: blocks -->
- </tr>
-</table>
-
-<table id="footer-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
- <tr>
- <td align="center" valign="middle">
- <div class="primary-links">{primary_links}</div>
- <div class="secondary-links">{secondary_links}</div>
- </td>
- </tr>
-</table>
-
-<!-- BEGIN: message -->
-<div id="footer-message">
- {footer_message}
-</div>
-<!-- END: message -->
-{footer}
-</body>
-</html>
-<!-- END: footer -->
+<!-- BEGIN: header --><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+ <title>{head_title}</title>
+ {head}
+</head>
+
+<body bgcolor="#ffffff" {onload_attributes}>
+
+<div class="hide"><a href="#content" title="Skip navigation." accesskey="2">Skip navigation</a>.</div>
+
+<table id="primary-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td id="home" width="10%">
+
+ <!-- BEGIN: logo -->
+ <a href="./" title="Home"><img src="{logo}" alt="Home" width="144" height="63" border="0" /></a>
+ <!-- END: logo -->
+
+ </td>
+
+ <td id="site-info" width="20%">
+
+ <!-- BEGIN: site_name -->
+ <div class='site-name'><a href="./" title="Home">{site_name}</a></div>
+ <!-- END: site_name -->
+
+ <!-- BEGIN: site_slogan -->
+ <div class='site-slogan'>{site_slogan}</div>
+ <!-- END: site_slogan -->
+
+ </td>
+
+ <td class="primary-links" width="70%" align="center" valign="middle">
+
+ {primary_links}
+
+ </td>
+ </tr>
+</table>
+
+<table id="secondary-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td class="secondary-links" width="75%" align="center" valign="middle">
+ {secondary_links}
+ </td>
+ <td width="25%" align="center" valign="middle">
+ <!-- BEGIN: search_box -->
+ <form action="{search_url}" method="post">
+ <div id="search">
+ <input class="form-text" type="text" size="15" value="" name="keys" alt="{search_description}" />
+ <input class="form-submit" type="submit" value="{search_button_text}" alt="submit" />
+ </div>
+ </form>
+ <!-- END: search_box -->
+ </td>
+ </tr>
+</table>
+
+<table id="content" border="0" cellpadding="15" cellspacing="0" width="100%">
+ <tr>
+ <!-- BEGIN: blocks -->
+ <td id="sidebar-left">
+ {blocks}
+ </td>
+ <!-- END: blocks -->
+ <td valign="top">
+ <!-- BEGIN: mission -->
+ <div id="mission">{mission}</div>
+ <!-- END: mission -->
+ <div id="main">
+ <!-- BEGIN: title -->
+ {breadcrumb}
+ <h1 class="title">{title}</h1>
+ <!-- BEGIN: tabs -->
+ <div class="tabs">{tabs}</div>
+ <!-- END: tabs -->
+
+ <!-- END: title -->
+ <!-- BEGIN: help -->
+ <div id="help">{help}</div>
+ <!-- END: help -->
+ <!-- BEGIN: message -->
+ {message}
+ <!-- END: message -->
+<!-- END: header -->
+
+<!-- BEGIN: node -->
+ <div class="node {sticky}">
+ <!-- BEGIN: picture -->
+ {picture}
+ <!-- END: picture -->
+ <!-- BEGIN: title -->
+ <h1 class="title"><a href="{link}">{title}</a></h1>
+ <!-- END: title -->
+ <span class="submitted">{submitted}</span>
+ <!-- BEGIN: taxonomy -->
+ <span class="taxonomy">{taxonomy}</span>
+ <!-- END: taxonomy -->
+ <div class="content">{content}</div>
+ <!-- BEGIN: links -->
+ <div class="links">&raquo; {links}</div>
+ <!-- END: links -->
+ </div>
+<!-- END: node -->
+
+<!-- BEGIN: comment -->
+ <div class="comment">
+ <!-- BEGIN: picture -->
+ {picture}
+ <!-- END: picture -->
+ <h3 class="title">{title}</h3>
+ <div class="submitted">{submitted}<!-- BEGIN: new --><span class="new"> *{new}</span><!-- END: new --></div>
+ <div class="content">{content}</div>
+ <!-- BEGIN: links -->
+ <div class="links">&raquo; {links}</div>
+ <!-- END: links -->
+ </div>
+<!-- END: comment -->
+
+<!-- BEGIN: box -->
+ <div class="box">
+ <h2 class="title">{title}</h2>
+ <div class="content">{content}</div>
+ </div>
+<!-- END: box -->
+
+<!-- BEGIN: block -->
+ <div class="block block-{module}" id="block-{module}-{delta}">
+ <div class="title"><h3>{title}</h3></div>
+ <div class="content">{content}</div>
+ </div>
+<!-- END: block -->
+
+<!-- BEGIN: footer -->
+ </div><!-- main -->
+ </td>
+ <!-- BEGIN: blocks -->
+ <td id="sidebar-right">
+ {blocks}
+ </td>
+ <!-- END: blocks -->
+ </tr>
+</table>
+
+<table id="footer-menu" summary="Navigation elements." border="0" cellpadding="0" cellspacing="0" width="100%">
+ <tr>
+ <td align="center" valign="middle">
+ <div class="primary-links">{primary_links}</div>
+ <div class="secondary-links">{secondary_links}</div>
+ </td>
+ </tr>
+</table>
+
+<!-- BEGIN: message -->
+<div id="footer-message">
+ {footer_message}
+</div>
+<!-- END: message -->
+{footer}
+</body>
+</html>
+<!-- END: footer -->
diff --git a/themes/xtemplate/default/logo.png b/themes/xtemplate/default/logo.png
deleted file mode 100644
index 9df6543ea..000000000
--- a/themes/xtemplate/default/logo.png
+++ /dev/null
Binary files differ
diff --git a/themes/xtemplate/pushbutton/arrow-next-hover.png b/themes/xtemplate/pushbutton/arrow-next-hover.png
deleted file mode 100644
index 63ee4b62c..000000000
--- a/themes/xtemplate/pushbutton/arrow-next-hover.png
+++ /dev/null
Binary files differ
diff --git a/themes/xtemplate/pushbutton/arrow-next.png b/themes/xtemplate/pushbutton/arrow-next.png
deleted file mode 100644
index 93586270d..000000000
--- a/themes/xtemplate/pushbutton/arrow-next.png
+++ /dev/null
Binary files differ
diff --git a/themes/xtemplate/pushbutton/arrow-prev-hover.png b/themes/xtemplate/pushbutton/arrow-prev-hover.png
deleted file mode 100644
index ad681de2c..000000000
--- a/themes/xtemplate/pushbutton/arrow-prev-hover.png
+++ /dev/null
Binary files differ
diff --git a/themes/xtemplate/pushbutton/arrow-prev.png b/themes/xtemplate/pushbutton/arrow-prev.png
deleted file mode 100644
index a808494ab..000000000
--- a/themes/xtemplate/pushbutton/arrow-prev.png
+++ /dev/null
Binary files differ
diff --git a/themes/xtemplate/pushbutton/arrow-up-hover.png b/themes/xtemplate/pushbutton/arrow-up-hover.png
deleted file mode 100644
index 5ee595f11..000000000
--- a/themes/xtemplate/pushbutton/arrow-up-hover.png
+++ /dev/null
Binary files differ
diff --git a/themes/xtemplate/pushbutton/arrow-up.png b/themes/xtemplate/pushbutton/arrow-up.png
deleted file mode 100644
index 80f005bb8..000000000
--- a/themes/xtemplate/pushbutton/arrow-up.png
+++ /dev/null
Binary files differ