15 require_once(
"AWLUtilities.php");
92 function __construct( $label, $target, $title=
"", $style=
"menu", $sortkey=1000 ) {
93 $this->label = $label;
94 $this->target = $target;
95 $this->title = $title;
96 $this->style = $style;
97 $this->attributes = array();
98 $this->active =
false;
99 $this->sortkey = $sortkey;
101 $this->rendered =
"";
102 $this->
self =& $this;
110 $r = sprintf(
'<a href="%s" class="%s" title="%s"%s>%s</a>',
111 $this->target, $this->style, htmlspecialchars($this->title),
"%%attributes%%",
112 htmlspecialchars($this->label), $this->style );
115 $attribute_values =
"";
116 foreach( $this->attributes AS $k => $v ) {
117 if ( substr($k, 0, 1) ==
'_' )
continue;
118 $attribute_values .=
' '.$k.
'="'.htmlspecialchars($v).
'"';
120 $r = str_replace(
'%%attributes%%', $attribute_values, $r );
122 $this->rendered = $r;
131 function Set( $attribute, $value ) {
132 $this->attributes[$attribute] = $value;
140 $this->active =
true;
141 if ( $style ) $this->style = $style;
148 $this->submenu_set = &$submenu_set;
156 return ( $this->active );
164 if ( is_string($test_pattern) && preg_match($test_pattern,$_SERVER[
'REQUEST_URI']) ) {
165 $this->
Active($active_style);
167 return ( $this->active );
179 function _CompareMenuSequence( $a, $b ) {
180 dbg_error_log(
"MenuSet",
":_CompareMenuSequence: Comparing %d with %d", $a->sortkey, $b->sortkey);
181 return ($a->sortkey - $b->sortkey);
267 var $has_active_options;
276 function __construct( $div_id, $main_class =
'', $active_class =
'active' ) {
277 $this->options = array();
278 $this->main_class = $main_class;
279 $this->active_class = $active_class;
280 $this->div_id = $div_id;
295 function &
AddOption( $label, $target, $title=
"", $active=
false, $sortkey=
null, $external=
false ) {
296 if ( !isset($sortkey) ) {
297 $sortkey = (isset($this->last_sortkey) ? $this->last_sortkey + 100 : 1000);
299 $this->last_sortkey = $sortkey;
300 if ( version_compare(phpversion(),
'5.0') < 0) {
301 $new_option =
new MenuOption( $label, $target, $title, $this->main_class, $sortkey );
304 $new_option =
new MenuOption( $label, $target, $title, $this->main_class, $sortkey );
306 if ( ($old_option = $this->
_OptionExists( $label )) ===
false ) {
307 $this->options[] = &$new_option ;
310 dbg_error_log(
"MenuSet",
":AddOption: Replacing existing option # $old_option ($label)");
311 $this->options[$old_option] = &$new_option;
313 if ( is_bool($active) && $active ==
false && $_SERVER[
'REQUEST_URI'] == $target ) {
315 $new_option->Active( $this->active_class );
317 else if ( is_bool($active) && $active ) {
319 $new_option->Active( $this->active_class );
321 else if ( is_string($active) && preg_match($active,$_SERVER[
'REQUEST_URI']) ) {
323 $new_option->Active( $this->active_class );
326 if ( $external ==
true ) $new_option->Set(
'target',
'_blank');
341 function &
AddSubMenu( &$submenu_set, $label, $target, $title=
"", $active=
false, $sortkey=2000 ) {
342 $new_option =& $this->
AddOption( $label, $target, $title, $active, $sortkey );
343 $submenu_set->parent = &$new_option ;
344 $new_option->AddSubmenu( $submenu_set );
355 if ( isset($this->has_active_options) ) {
356 return $this->has_active_options;
358 foreach( $this->options AS $k => $v ) {
359 if ( $v->IsActive() ) {
373 return count($this->options);
382 foreach( $this->options AS $k => $v ) {
383 if ( $newlabel == $v->label )
return $k;
396 $this->has_active_options =
false;
397 foreach( $this->options AS $k => $v ) {
398 if ( isset($v->submenu_set) && $v->submenu_set->_HasActive() ) {
400 $this->options[$k]->Active( $this->active_class );
401 $this->has_active_options =
true;
414 if ( $this->has_active_options )
return;
415 foreach( $this->options AS $k => $v ) {
416 if ( isset($v->submenu_set) && $v->submenu_set->_HasActive() ) {
418 $this->options[$k]->Active( $this->active_class );
419 $this->has_active_options =
true;
420 return $this->has_active_options;
424 foreach( $this->options AS $k => $v ) {
425 if ( isset($v->submenu_set) && $v->submenu_set->MakeSomethingActive($test_pattern) ) {
427 $this->options[$k]->Active( $this->active_class );
428 $this->has_active_options =
true;
429 return $this->has_active_options;
432 if ( $this->options[$k]->MaybeActive( $test_pattern, $this->active_class ) ) {
433 $this->has_active_options =
true;
434 return $this->has_active_options;
449 dbg_error_log(
"MenuSet",
":_CompareSequence: Comparing %d with %d", $a->sortkey, $b->sortkey);
450 return ($a->sortkey - $b->sortkey);
462 function Render( $submenus_inline =
false ) {
463 if ( !isset($this->has_active_options) ) {
466 $options = $this->options;
467 usort($options,
"_CompareMenuSequence");
468 $render_sub_menus =
false;
469 $r =
"<div id=\"$this->div_id\">\n";
470 foreach( $options AS $k => $v ) {
472 if ( $v->IsActive() && isset($v->submenu_set) && $v->submenu_set->Size() > 0 ) {
473 $render_sub_menus = $v->submenu_set;
474 if ( $submenus_inline )
475 $r .= $render_sub_menus->Render();
479 if ( !$submenus_inline && $render_sub_menus !=
false ) {
480 $r .= $render_sub_menus->Render();
498 $class =
"submenu" . $depth;
502 $options = $this->options;
503 usort($options,
"_CompareMenuSequence");
505 $r =
"<div id=\"$this->div_id\" class=\"$class\">\n<ul>\n";
506 foreach( $options AS $k => $v ) {
507 if ( $skip_empty && isset($v->submenu_set) && $v->submenu_set->Size() < 1 )
continue;
508 $r .=
"<li>".$v->Render();
509 if ( isset($v->submenu_set) && $v->submenu_set->Size() > 0 ) {
510 $r .= $v->submenu_set->RenderAsCSS($depth+1);
514 $r .=
"</ul></div>\n";