Customize the interfaces and colors for RahuNAS
[drupal-theme-rahunas+rootcandy] / rootcandy / template.php
1 <?php
2 // $Id: template.php,v 1.36.2.19 2009/03/31 13:06:15 sign Exp $
3
4 function _rootcandy_admin_links() {
5   global $user;
6   if ($user->uid) {
7     $links[] = '<a href="'. url('user') .'" class="user-name">'. $user->name .'</a>';
8     $links[] = '<a href="'. url('logout') .'">'. t('Logout') .'</a>';
9     $links = implode(' | ', $links);
10
11     return $links;
12   }
13 }
14
15 function rootcandy_body_class($left = NULL, $right = NULL) {
16   $class = '';
17   if ($left != '' AND $right) {
18     $class = 'sidebars';
19   }
20   else if ($left != '' AND $right == '') {
21     $class = 'sidebar-left';
22   }
23   else if ($left == '' AND $right != '') {
24     $class = 'sidebar-right';
25   }
26
27   // Add classes describing the menu trail of the page.
28   $class .= rootcandy_get_page_classes();
29
30   if (isset($class)) {
31     print ' class="'. $class .'"';
32   }
33 }
34
35 function _rootcandy_admin_navigation() {
36   $path = base_path() . path_to_theme();
37   $base = path_to_theme();
38
39   /**
40    *
41    */
42   // get users role
43   global $user;
44
45   if ($user->uid != 1) {
46     // get sorted roles
47     $role_weights = theme_get_setting('role-weight');
48     if ($role_weights) {
49       $filter_out = array_keys($user->roles);
50       $roles = array_intersect(array_flip($role_weights), $filter_out);
51       ksort($roles);
52       $keys = array_keys($roles);
53       $role = $roles[$keys[0]];
54
55       $rootcandy_navigation = theme_get_setting('rootcandy_navigation_source_'.$role);
56     }
57   }
58   else {
59     $rootcandy_navigation = '_rootcandy_default_navigation';
60   }
61
62   if (!$rootcandy_navigation) {
63     if (!$user->uid) {
64       $menu_tree[] = array('href' => 'user/login', 'title' => t('User login'));
65     }
66   }
67   elseif ($rootcandy_navigation == '_rootcandy_default_navigation') {
68     // build default menu
69     $menu_tree[] = array('href' => 'rahunas', 'title' => t('Dashboard'));
70     $menu_tree[] = array('href' => 'rahunas/user', 'title' => t('Users'));
71     $menu_tree[] = array('href' => 'rahunas/online', 'title' => t('Online Users'));
72     $menu_tree[] = array('href' => 'admin/content', 'title' => t('Content'));
73     if (variable_get('node_admin_theme', '0')) {
74       $menu_tree[] = array('href' => 'node/add', 'title' => t('Create content'));
75     }
76     //$menu_tree[] = array('href' => 'admin/build', 'title' => t('Building'));
77     //$menu_tree[] = array('href' => 'admin/settings', 'title' => t('Configuration'));
78     $menu_tree[] = array('href' => 'rahunas/report', 'title' => t('Reports'));
79     //$menu_tree[] = array('href' => 'admin/help', 'title' => t('Help'));
80   }
81   else {
82     $menu_tree = menu_navigation_links($rootcandy_navigation);
83   }
84
85   if ($menu_tree) {
86     $size = theme_get_setting('rootcandy_navigation_icons_size');
87     $icons_disabled = theme_get_setting('rootcandy_navigation_icons');
88     $class = ' class = i'.$size;
89     $output = '<ul'.$class.'>';
90
91     $custom_icons = rootcandy_custom_icons();
92     if (!isset($custom_icons)) {
93       $custom_icons = '';
94     }
95
96     $match = _rootcandy_besturlmatch($_GET['q'],$menu_tree);
97     foreach ($menu_tree as $key => $item) {
98       $id = '';
99       $icon = '';
100       $class= '';
101       // icons
102       if (!$icons_disabled) {
103         $size = theme_get_setting('rootcandy_navigation_icons_size');
104         if (!isset($size)) $size = 24;
105         $arg = explode("/", $item['href']);
106         $icon = _rootcandy_icon($arg, $size, 'admin', $custom_icons);
107         if ($icon) $icon = $icon .'<br />';
108       }
109       if ($key == $match) {
110         $id = ' id="current"';
111         if (!$icons_disabled && $size) {
112           $id = ' id="current-'. $size .'"';
113         }
114       }
115       $output .= '<li'. $id . $class .'><a href="'. url($item['href']) .'">'. $icon . $item['title'] .'</a>';
116       $output .= '</li>';
117     }
118     $output .= '</ul>';
119   }
120
121   return $output;
122 }
123
124 function _rootcandy_besturlmatch($needle, $menuitems) {
125   $lastmatch = null;
126   $lastmatchlen = 0;
127   $urlparts = explode('/', $needle);
128   $partcount = count($urlparts);
129
130   foreach($menuitems as $key => $menuitem) {
131     $href = $menuitem['href'];
132     $menuurlparts = explode('/', $href);
133     $matches = _rootcandy_countmatches($urlparts, $menuurlparts);
134     if (($matches > $lastmatchlen) || (($matches == $lastmatchlen) && (($lastmatch && strlen($menuitems[$lastmatch]['href'])) > strlen($href)) )) {
135       $lastmatchlen = $matches;
136       $lastmatch = $key;
137     }
138   }
139   return $lastmatch;
140 }
141
142 /**
143  * Override or insert PHPTemplate variables into the templates.
144  */
145 function rootcandy_preprocess_page(&$vars) {
146   // get secondary links
147   $vars['tabs2'] = menu_secondary_local_tasks();
148
149   // color.module integration
150   if (module_exists('color')) {
151     _color_page_alter($vars);
152   }
153
154   if (arg(0) == 'admin' || (variable_get('test',1) AND ((arg(0) == 'node' AND is_numeric(arg(1)) AND arg(2) == 'edit') || (arg(0) == 'node' AND arg(1) == 'add')))) {
155     $vars['go_home'] = '<a href="'.url().'">'.t('Go Back to Homepage').'</a>';
156   }
157
158   // get theme settings
159   $vars['hide_header'] = theme_get_setting('rootcandy_header_display');
160
161   // append legal notice
162   $vars['closure'] .= '<div id="legal-notice">Theme created by <a href="http://sotak.co.uk" target="_blank">Marek Sotak</a></div>';
163
164   $vars['hide_content'] = '';
165
166   // dashboard
167   if (arg(0) == 'admin' AND !arg(1)) {
168     if (!theme_get_setting('rootcandy_dashboard_display')) {
169       $vars['dashboard'] = 1;
170       // display help and messages in regions
171       switch (theme_get_setting('rootcandy_dashboard_help')) {
172         case 'left':
173           $vars['dashboard_left'] = $vars['help'] . $vars['dashboard_left'];
174           unset ($vars['help']);
175           break;
176         case 'right':
177           $vars['dashboard_right'] = $vars['help'] . $vars['dashboard_right'];
178           unset ($vars['help']);
179           break;
180       }
181
182       switch (theme_get_setting('rootcandy_dashboard_messages')) {
183         case 'left':
184           $vars['dashboard_left'] = $vars['messages'] . $vars['dashboard_left'];
185           unset ($vars['messages']);
186           break;
187         case 'right':
188           $vars['dashboard_right'] = $vars['messages'] . $vars['dashboard_right'];
189           unset ($vars['messages']);
190           break;
191       }
192     }
193     if (theme_get_setting('rootcandy_dashboard_content_display')) {
194       $vars['hide_content'] = theme_get_setting('rootcandy_dashboard_content_display');
195     }
196   }
197 }
198
199 /**
200  * Returns the rendered local tasks. The default implementation renders
201  * them as tabs. Overridden to split the secondary tasks.
202  *
203  * @ingroup themeable
204  */
205 function rootcandy_menu_local_tasks() {
206   return menu_primary_local_tasks();
207 }
208
209 function _rootcandy_icon($name, $size = '16', $subdir = '', $icons = '') {
210   if ($subdir != $name[0])
211     $subdir = $name[0];  
212
213   $url = implode("/", $name);
214   $name = implode("-", $name);
215   $path = path_to_theme();
216   if ($subdir) {
217     $subdir = $subdir .'/';
218   }
219
220   if (isset($icons[$url])) {
221     $icon = $icons[$url];
222   }
223   else {
224     $icon = $path .'/icons/i'. $size .'/'. $subdir . $name .'.png';
225   }
226
227   $output = theme('image', $icon);
228
229   if (!$output) {
230     $icon = $path .'/icons/i'. $size .'/misc/unknown.png';
231     $output = theme('image', $icon);
232   }
233
234   return $output;
235 }
236
237 function rootcandy_custom_icons() {
238   $custom_icons = theme_get_setting('rootcandy_navigation_custom_icons');
239   if (isset($custom_icons)) {
240     $list = explode("\n",$custom_icons);
241     $list = array_map('trim', $list);
242     $list = array_filter($list, 'strlen');
243     foreach ($list as $opt) {
244       // Sanitize the user input with a permissive filter.
245       $opt = rootcandy_filter_xss($opt);
246       if (strpos($opt, '|') !== FALSE) {
247         list($key, $value) = explode('|', $opt);
248         $icons[$key] = $value ? $value : $key;
249       }
250       else {
251         $icons[$opt] = $opt;
252       }
253     }
254   }
255   if (isset($icons)) {
256     return $icons;
257   }
258 }
259
260 function rootcandy_filter_xss($string) {
261   return filter_xss($string);
262 }
263
264 /**
265  * Read the theme settings' default values from the .info and save them into the database.
266  *
267  * @param $theme
268  *   The actual name of theme that is being checked.
269  */
270 function rootcandy_settings_init($theme) {
271   $themes = list_themes();
272
273   // Get the default values from the .info file.
274   $defaults = $themes[$theme]->info['settings'];
275
276   // Get the theme settings saved in the database.
277   $settings = theme_get_settings($theme);
278   // Don't save the toggle_node_info_ variables.
279   if (module_exists('node')) {
280     foreach (node_get_types() as $type => $name) {
281       unset($settings['toggle_node_info_'. $type]);
282     }
283   }
284   // Save default theme settings.
285   variable_set(
286     str_replace('/', '_', 'theme_'. $theme .'_settings'),
287     array_merge($defaults, $settings)
288   );
289   // Force refresh of Drupal internals.
290   theme_get_setting('', TRUE);
291 }
292
293 /*
294  * In addition to initializing the theme settings during HOOK_theme(), init them
295  * when viewing/resetting the admin/build/themes/settings/THEME forms.
296  */
297 if (arg(0) == 'admin' && arg(2) == 'themes' && arg(4)) {
298   global $theme_key;
299   rootcandy_settings_init($theme_key);
300 }
301
302 function rootcandy_get_page_classes($path = NULL) {
303   if (!isset($path)) $path = $_GET['q'];
304   if ($path) {
305     $classes = '';
306     $menu_item = explode('/', $path);
307     if (count($menu_item)) {
308       foreach ($menu_item as $key => $page) {
309         $menu_item[$key] = strtr($page, '-', '_');
310       }
311
312       do {
313         $classes .= ' '. implode('-', $menu_item);
314         array_pop($menu_item);
315       } while (count($menu_item));
316     }
317   }
318
319   return $classes;
320 }
321
322 function rootcandy_breadcrumb($breadcrumb) {
323   if (!empty($breadcrumb)) {
324     /*
325      * Modern browsers (Firefox 1.5 and above, Internet Explorer 5.0 and above,
326      * Safari not checked) would automatically change the double-arrows (») to
327      * the other direction once it detects a right-to-left page. So no need to
328      * reverse the array, and no need to use reversed-direction arrows.
329      */
330     return '<div class="breadcrumb">'. implode(' » ', $breadcrumb) .'</div>';
331   }
332 }
333
334 function _rootcandy_links($links, $attributes = array('class' => 'links')) {
335   $output = '';
336
337   if (count($links) > 0) {
338     $output = '<ul'. drupal_attributes($attributes) .'>';
339
340     $num_links = count($links);
341     $i = 1;
342
343     foreach ($links as $key => $link) {
344       $class = $key;
345
346       // Add first, last and active classes to the list of links to help out themers.
347       if ($i == 1) {
348         $class .= ' first';
349       }
350       if ($i == $num_links) {
351         $class .= ' last';
352       }
353
354       $check_path = $_GET['q'];
355       $check_path = explode("/", $check_path);
356       $q_path = $check_path[0] .'/'. $check_path[1] .'/'. $check_path[2];
357       if (isset($link['href']) && ($link['href'] == $q_path || ($link['href'] == '<front>' && drupal_is_front_page()))) {
358         $class .= ' active';
359       }
360       $output .= '<li'. drupal_attributes(array('class' => $class)) .'>';
361
362       if (isset($link['href'])) {
363         // Pass in $link as $options, they share the same keys.
364         $output .= l($link['title'], $link['href'], $link);
365       }
366       else if (!empty($link['title'])) {
367         // Some links are actually not links, but we wrap these in <span> for adding title and class attributes
368         if (empty($link['html'])) {
369           $link['title'] = check_plain($link['title']);
370         }
371         $span_attributes = '';
372         if (isset($link['attributes'])) {
373           $span_attributes = drupal_attributes($link['attributes']);
374         }
375         $output .= '<span'. $span_attributes .'>'. $link['title'] .'</span>';
376       }
377
378       $i++;
379       $output .= "</li>\n";
380     }
381
382     $output .= '</ul>';
383   }
384
385   return $output;
386 }
387
388 function rootcandy_menu_item_link($link) {
389   if($link['href'] == 'admin'){
390     $link['title'] = t('Dashboard');
391   }
392
393   return theme_menu_item_link($link);
394 }
395
396 function _rootcandy_countmatches($arrayone, $arraytwo) {
397   $matches = 0;
398   foreach($arraytwo as $i => $part) {
399     if (!isset($arrayone[$i])) break;
400     if ($arrayone[$i] == $part) $matches = $i+1;
401   }
402   return $matches;
403 }