var ctrl = document.getElementById('$layout_def_control_id'); if (ctrl) ctrl.focus(); HTML_CTRL_SELECT; } } // In the 'content' or 'body' section, these functions are called // just before closing off the content. Handy for things like the // above. $layout_footer_funcs = array(); function register_footer_renderer($func) { global $layout_footer_funcs; if (!in_array($func, $layout_footer_funcs)) $layout_footer_funcs[] = $func; } function render_footer_renderers() { global $layout_footer_funcs; foreach($layout_footer_funcs as $fnc) $fnc(); } // The Layout registry. $layouts = array(); function register_layout($layout) { global $layouts; $layout['layout_dir'] = $GLOBALS['module_basedir']; $layouts[$layout['name']] = $layout; } function layout_basedir($layout) { global $layouts; return isset($layouts[$layout]) ? $layouts[$layout]['layout_dir'] : NULL; } // load the layout mods. if ($uselayout) source_foreach_mod("init.php", "layouts"); function get_active_layout() { global $layouts; if (has_session() && isset($_SESSION['layout']) && isset($layouts[$_SESSION['layout']])) return $layouts[$_SESSION['layout']]; $def_layout = get_config('default_layout', NULL); if (isset($layouts[$def_layout])) return $layouts[$def_layout]; reset($layouts); return current($layouts); } function render_sidenav_menu_traverse($opt_name, $opt, $path, $rpath, $depth, $full) { if (!$full && !isset($opt['sel']) || @$opt['hidden'] || !may_traverse_submenu($opt)) return; if (isset($opt['submenu'])) { render_sidenav_menu($opt['submenu'], array_merge($path, array($opt_name)), isset($opt['sel']) ? $rpath : [], $depth+1, $full); } elseif (isset($opt['submenu_func'])) { render_sidenav_menu($opt['submenu_func'](@$opt['ctx']), array_merge($path, array($opt_name)), isset($opt['sel']) ? $rpath : [], $depth+1, $full); } elseif (isset($opt['multimenu']) || isset($opt['multimenu_func'])) { if (isset($opt['multimenu'])) $mmenu =& $opt['multimenu']; else $mmenu = $opt['multimenu_func'](@$opt['ctx']); if (!$mmenu) return; $pc = array_shift($rpath); if ($pc) { render_sidenav_menu($mmenu[$pc], array_merge($path, [$opt_name, $pc]), isset($opt['sel']) ? $rpath : [], $depth+1, $full); } else foreach ($mmenu as $pc => $m) { render_sidenav_menu($m, array_merge($path, [$opt_name, $pc]), [], $depth+1,$full); } } } function render_sidenav_menu($menu, $path, $rpath, $depth = -1, $full = false) { if ($depth > 0 && function_exists('layout_render_max_depth') && $depth > layout_render_max_depth() || !$menu) return; if (isset($menu["head"])) layout_render_nav_head($menu['head']); $path_str = root_uri(); if (sizeof($path) > 0) $path_str .= implode("/", $path).'/'; $nc = array_shift($rpath); if ($nc && isset($menu[$nc])) $menu[$nc]['sel'] = 1; foreach ($menu as $opt_name => $opt) { if (!is_array($opt)) /* for options such as head */ continue; if(isset($opt['txt']) && (!@$opt['hidden'] || @$opt['hidden'] == "notsel" && isset($opt['sel']))) { if (isset($opt['uri'])) { $link_dst = $opt['uri']; } else if ($opt_name == "home" && !$path) { $link_dst = $path_str ? $path_str : "."; } else { $link_dst = $path_str.$opt_name.'/'; } layout_render_nav_item(htmlentities($link_dst), $opt, $depth+0); } if ($depth > 0) render_sidenav_menu_traverse($opt_name, $opt, $path, $opt_name == $nc ? $rpath : [], $depth, $full); } if ($depth <= 0 && $nc) render_sidenav_menu_traverse($nc, $menu[$nc], $path, $rpath, -1, $full); } function generic_page_menu($submenu) { echo '

Pick a menu option:

'; echo ''; } ?>