15require_once(
"AWLUtilities.php");
98 function __construct( $label, $target, $title=
"", $style=
"menu", $sortkey=1000 ) {
99 $this->label = $label;
100 $this->target = $target;
101 $this->title = $title;
102 $this->style = $style;
103 $this->attributes = array();
104 $this->active =
false;
105 $this->sortkey = $sortkey;
107 $this->rendered =
"";
108 $this->
self =& $this;
116 $r = sprintf(
'<a href="%s" class="%s" title="%s"%s>%s</a>',
117 $this->target, $this->style, htmlspecialchars($this->title),
"%%attributes%%",
118 htmlspecialchars($this->label), $this->style );
121 $attribute_values =
"";
122 foreach( $this->attributes AS $k => $v ) {
123 if ( substr($k, 0, 1) ==
'_' )
continue;
124 $attribute_values .=
' '.$k.
'="'.htmlspecialchars($v).
'"';
126 $r = str_replace(
'%%attributes%%', $attribute_values, $r );
128 $this->rendered = $r;
137 function Set( $attribute, $value ) {
138 $this->attributes[$attribute] = $value;
146 $this->active =
true;
147 if ( $style ) $this->style = $style;
154 $this->submenu_set = &$submenu_set;
162 return ( $this->active );
170 if ( is_string($test_pattern) && preg_match($test_pattern,$_SERVER[
'REQUEST_URI']) ) {
171 $this->
Active($active_style);
173 return ( $this->active );
185function _CompareMenuSequence( $a, $b ) {
186 dbg_error_log(
"MenuSet",
":_CompareMenuSequence: Comparing %d with %d", $a->sortkey, $b->sortkey);
187 return ($a->sortkey - $b->sortkey);
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 );
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);
388 foreach( $this->options AS $k => $v ) {
389 if ( $newlabel == $v->label )
return $k;
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;
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;
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) ) {
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();
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";