/** * Output a navigation menu * @static */ function OutputMenu($menu, $start_level, $source_menu = false) { global $page, $GP_MENU_LINKS, $GP_MENU_CLASS, $gp_menu, $gp_titles; if ($source_menu === false) { $source_menu =& $gp_menu; } $search = array('{$href_text}', '{$attr}', '{$label}', '{$title}'); $replace = array(); if (count($menu) == 0) { echo '<div class="emtpy_menu"></div>'; //an empty <ul> is not valid xhtml gpOutput::ResetMenuGlobals(); return; } //$GP_MENU_LINKS = '<a href="{$href_text}" {$attr}><span class="sub-t">{$label}</span></a>'; //<a href="/rocky/index.php/Misson_&_Principles" title="Misson & Principles" >Misson & Principles</a> $link_format = '<a href="{$href_text}" title="{$title}"{$attr}>{$label}</a>'; if (!empty($GP_MENU_LINKS)) { $link_format = $GP_MENU_LINKS; } $result = array(); $prev_level = $start_level; $page_title_full = common::GetUrl($page->title); $source_keys = array_keys($source_menu); $source_values = array_values($source_menu); $open = false; $li_count = array(); //get parent page $parent_page = false; $parents = common::Parents($page->gp_index, $source_menu); if (count($parents)) { $parent_page = $parents[0]; } $class = 'menu_top'; if (!empty($GP_MENU_CLASS)) { $class = $GP_MENU_CLASS; } $result[] = '<ul class="' . $class . '">'; foreach ($source_keys as $source_index => $menu_key) { $attr = $class = $attr_li = $class_li = ''; $menu_info = $source_values[$source_index]; $this_level = $menu_info['level']; //the next entry $next_info = false; if (isset($source_values[$source_index + 1])) { $next_info = $source_values[$source_index + 1]; } //create link if in $menu if (isset($menu[$menu_key])) { //ordered or "indexed" classes if ($page->menu_css_ordered) { for ($i = $prev_level; $i > $this_level; $i--) { unset($li_count[$i]); } if (!isset($li_count[$this_level])) { $li_count[$this_level] = 0; } else { $li_count[$this_level]++; } $class_li = 'li_' . $li_count[$this_level]; } if ($page->menu_css_indexed) { $class_li .= ' li_title_' . $menu_key; } //selected classes if ($this_level < $next_info['level']) { $class .= ' haschildren'; } if (isset($menu_info['url']) && ($menu_info['url'] == $page->title || $menu_info['url'] == $page_title_full)) { $class .= ' selected'; $class_li .= ' selected_li'; } elseif ($menu_key == $page->gp_index) { $class .= ' selected'; $class_li .= ' selected_li'; } elseif (in_array($menu_key, $parents)) { $class .= ' childselected'; $class_li .= ' childselected_li'; } if (!empty($class)) { $attr = ' class="' . trim($class) . '"'; } if (!empty($class_li)) { $attr_li = ' class="' . trim($class_li) . '"'; } //current is a child of the previous if ($this_level > $prev_level) { if (!$open) { $result[] = '<li' . $attr_li . '>'; //only needed if the menu starts below the start_level } while ($this_level > $prev_level) { $result[] = '<ul>'; $result[] = '<li>'; $prev_level++; } array_pop($result); //remove the last <li> //current is higher than the previous } elseif ($this_level < $prev_level) { while ($this_level < $prev_level) { $result[] = '</li>'; $result[] = '</ul>'; $prev_level--; } if ($open) { $result[] = '</li>'; } } elseif ($open) { $result[] = '</li>'; } $replace = array(); //external if (isset($menu_info['url'])) { if (empty($menu_info['title_attr'])) { $menu_info['title_attr'] = strip_tags($menu_info['label']); } if (isset($menu_info['new_win'])) { $attr .= ' target="_blank"'; } $replace[] = $menu_info['url']; $replace[] = $attr; $replace[] = $menu_info['label']; $replace[] = $menu_info['title_attr']; //internal link } else { if (!empty($gp_titles[$menu_key]['rel'])) { $attr .= ' rel="' . $gp_titles[$menu_key]['rel'] . '"'; } $title = common::IndexToTitle($menu_key); $replace[] = common::GetUrl($title); $replace[] = $attr; $replace[] = common::GetLabel($title); $replace[] = common::GetBrowserTitle($title); } $result[] = '<li' . $attr_li . '>' . str_replace($search, $replace, $link_format); $prev_level = $this_level; $open = true; } } while ($start_level <= $prev_level) { $result[] = '</li>'; $result[] = '</ul>'; $prev_level--; } //$test = implode("\n",$result); //$test = htmlspecialchars($test); //echo nl2br($test); //echo '<hr/>'; echo implode('', $result); //don't separate by spaces so css inline can be more functional gpOutput::ResetMenuGlobals(); return; }