273 var $has_active_options;
282 function __construct( $div_id, $main_class =
'', $active_class =
'active' ) {
283 $this->options = array();
284 $this->main_class = $main_class;
285 $this->active_class = $active_class;
286 $this->div_id = $div_id;
301 function &AddOption( $label, $target, $title=
"", $active=
false, $sortkey=
null, $external=
false ) {
302 if ( !isset($sortkey) ) {
303 $sortkey = (isset($this->last_sortkey) ? $this->last_sortkey + 100 : 1000);
305 $this->last_sortkey = $sortkey;
306 if ( version_compare(phpversion(),
'5.0') < 0) {
307 $new_option =
new MenuOption( $label, $target, $title, $this->main_class, $sortkey );
310 $new_option =
new MenuOption( $label, $target, $title, $this->main_class, $sortkey );
312 if ( ($old_option = $this->_OptionExists( $label )) ===
false ) {
313 $this->options[] = &$new_option ;
316 dbg_error_log(
"MenuSet",
":AddOption: Replacing existing option # $old_option ($label)");
317 $this->options[$old_option] = &$new_option;
319 if ( is_bool($active) && $active ==
false && $_SERVER[
'REQUEST_URI'] == $target ) {
321 $new_option->Active( $this->active_class );
323 else if ( is_bool($active) && $active ) {
325 $new_option->Active( $this->active_class );
327 else if ( is_string($active) && preg_match($active,$_SERVER[
'REQUEST_URI']) ) {
329 $new_option->Active( $this->active_class );
332 if ( $external ==
true ) $new_option->Set(
'target',
'_blank');
347 function &AddSubMenu( &$submenu_set, $label, $target, $title=
"", $active=
false, $sortkey=2000 ) {
348 $new_option =& $this->AddOption( $label, $target, $title, $active, $sortkey );
349 $submenu_set->parent = &$new_option ;
350 $new_option->AddSubmenu( $submenu_set );
360 function _HasActive( ) {
361 if ( isset($this->has_active_options) ) {
362 return $this->has_active_options;
364 foreach( $this->options AS $k => $v ) {
365 if ( $v->IsActive() ) {
379 return count($this->options);
386 function _OptionExists( $newlabel ) {
388 foreach( $this->options AS $k => $v ) {
389 if ( $newlabel == $v->label )
return $k;
401 function LinkActiveSubMenus( ) {
402 $this->has_active_options =
false;
403 foreach( $this->options AS $k => $v ) {
404 if ( isset($v->submenu_set) && $v->submenu_set->_HasActive() ) {
406 $this->options[$k]->Active( $this->active_class );
407 $this->has_active_options =
true;
419 function MakeSomethingActive( $test_pattern ) {
420 if ( $this->has_active_options )
return;
421 foreach( $this->options AS $k => $v ) {
422 if ( isset($v->submenu_set) && $v->submenu_set->_HasActive() ) {
424 $this->options[$k]->Active( $this->active_class );
425 $this->has_active_options =
true;
426 return $this->has_active_options;
430 foreach( $this->options AS $k => $v ) {
431 if ( isset($v->submenu_set) && $v->submenu_set->MakeSomethingActive($test_pattern) ) {
433 $this->options[$k]->Active( $this->active_class );
434 $this->has_active_options =
true;
435 return $this->has_active_options;
438 if ( $this->options[$k]->MaybeActive( $test_pattern, $this->active_class ) ) {
439 $this->has_active_options =
true;
440 return $this->has_active_options;
454 function _CompareSequence( $a, $b ) {
455 dbg_error_log(
"MenuSet",
":_CompareSequence: Comparing %d with %d", $a->sortkey, $b->sortkey);
456 return ($a->sortkey - $b->sortkey);
468 function Render( $submenus_inline =
false ) {
469 if ( !isset($this->has_active_options) ) {
470 $this->LinkActiveSubMenus();
472 $options = $this->options;
473 usort($options,
"_CompareMenuSequence");
474 $render_sub_menus =
false;
475 $r =
"<div id=\"$this->div_id\">\n";
476 foreach( $options AS $k => $v ) {
478 if ( $v->IsActive() && isset($v->submenu_set) && $v->submenu_set->Size() > 0 ) {
479 $render_sub_menus = $v->submenu_set;
480 if ( $submenus_inline )
481 $r .= $render_sub_menus->Render();
485 if ( !$submenus_inline && $render_sub_menus !=
false ) {
486 $r .= $render_sub_menus->Render();
500 function RenderAsCSS( $depth = 0, $skip_empty =
true ) {
501 $this->LinkActiveSubMenus();
504 $class =
"submenu" . $depth;
508 $options = $this->options;
509 usort($options,
"_CompareMenuSequence");
511 $r =
"<div id=\"$this->div_id\" class=\"$class\">\n<ul>\n";
512 foreach( $options AS $k => $v ) {
513 if ( $skip_empty && isset($v->submenu_set) && $v->submenu_set->Size() < 1 )
continue;
514 $r .=
"<li>".$v->Render();
515 if ( isset($v->submenu_set) && $v->submenu_set->Size() > 0 ) {
516 $r .= $v->submenu_set->RenderAsCSS($depth+1);
520 $r .=
"</ul></div>\n";