## OpenCA Command
## (c) 1998-2003 by Massimiliano Pala and OpenCA Group
## (c) Copyright 2003-2004 The OpenCA Project
##
##   File Name: genMenu
##       Brief: generate a menu page
## Description: generate a menu based on the webinterface and the
##	        link chosen
##  Parameters: iface,on

use strict;

sub cmdGenMenu {

	my $iface 	= getRequired ('CgiServerName');
	my $on 		= ($query->param('on') or "1");
	my $root	= "interface_menus";

	my ( $page, $file, $twig, $configfile );
	my ( $id, $name, $space, $logo_left, $logo_right, $style );
	my ( $on_template, $off_template, $menu_tabs );
	my ( $item_template, $menu_items );
	my ( $item_name, $item_link, $item_target );
        my ( @xpath, @counter ) = ( (), () );
	my ( $ht_prefix, $cgi_prefix, $row );

	# Templates
	# 2004-12-17 Martin Bartosch: does not seem to be used
	# my $menu_template = qq{ <div class="menu">@menu@</div> };

        ## get the appropriate menu
        my $menus = $xml_cache->get_xpath_count(
                        FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => "${root}/interface");
	my ($menu, $menu_class);
        for (my $i=0; $i < $menus; $i++) {
            next if ($xml_cache->get_xpath(
                        FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => [ "${root}/interface", "name" ],
                        COUNTER  => [ $i, 0 ]) !~ /${iface}/);
            $menu = $i;
            last;
        }

        ## Now do everything...
        $ht_prefix  = $xml_cache->get_xpath(
                        FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => [ "${root}/interface", "htdocs_prefix" ],
                        COUNTER  => [ $menu, 0 ]);
        $cgi_prefix = $xml_cache->get_xpath(
                        FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => [ "${root}/interface", "cgi_prefix" ],
                        COUNTER  => [ $menu, 0 ]);
        $logo_left  = $xml_cache->get_xpath(
                        FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => [ "${root}/interface", "logo_left" ],
                        COUNTER  => [ $menu, 0 ]);
	$logo_left  =~ s/&lt;/\</g;
	$logo_left  =~ s/&gt;/\>/g;
        $logo_right = $xml_cache->get_xpath(
                        FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => [ "${root}/interface", "logo_right" ],
                        COUNTER  => [ $menu, 0 ]);
	$logo_right  =~ s/&lt;/\</g;
	$logo_right  =~ s/&gt;/\>/g;
	@xpath      = ( "${root}/interface", "menu" );
        @counter    = ( $menu, 0 );
        my @id_path = $query->param ('id');
        my @id_scan = ();

	if( $#id_path < 0 ) {
		push( @id_path, 1 );
	}

        my $table = "";
	my $level = 0;
        foreach my $h_id (@id_path) {
            ($row, @counter [scalar @counter]) = buildMenuRow (
                                            XPATH   => [ @xpath ],
                                            COUNTER => [ @counter ],
                                            HTDOCS  => $ht_prefix,
                                            CGI     => $cgi_prefix,
                                            ID      => $h_id,
					    LEVEL   => $level,
                                            ID_PATH => \@id_scan);
            @xpath [scalar @xpath] = 'item';
            push @id_scan, $h_id;
	    $table .= $row;
	    $level++;
        }
        ($row, @counter [scalar @counter]) = buildMenuRow (
                                        XPATH   => [ @xpath ],
                                        COUNTER => [ @counter ],
                                        HTDOCS  => $ht_prefix,
                                        CGI     => $cgi_prefix,
                                        ID      => "",
					LEVEL	=> $level,
                                        ID_PATH => \@id_scan);
	$table .= $row;

	## Insert Right Values
        $table = $query->subVar( $table, '__HTDOCS_PREFIX__', $ht_prefix);
	$table = $query->subVar( $table, '@IMGDIR@', "$ht_prefix/images" );

        $logo_left = $query->subVar($logo_left,'__HTDOCS_PREFIX__',$ht_prefix);
        $logo_right= $query->subVar($logo_right,'__HTDOCS_PREFIX__',$ht_prefix);

        return libSendMenu ($table, $logo_left, $logo_right);
}

sub buildMenuRow {
    my $keys = { @_ };

    my $xpath      = $keys->{XPATH};
    my $counter    = $keys->{COUNTER};
    my $id         = $keys->{ID};
    my $level      = $keys->{LEVEL};
    my $id_path    = $keys->{ID_PATH};
    my $ht_prefix  = $keys->{HTDOCS};
    my $cgi_prefix = $keys->{CGI};

    my $row = "";
    my $row_class = "";
    my $menu_entity = "";
    my $item_name = "";
    my $item_id = "";
    my $item_link = "";
    my $item_class = "";
    my $item_target = "";

    my $items = $xml_cache->get_xpath_count (
                    FILENAME => getRequired ('MenuConfiguration'),
                    XPATH    => [ @{$xpath}, 'item' ],
                    COUNTER  => [ @{$counter} ]);

    for (my $i=0; $i < $items; $i++) {
	$item_link = "";
        my $item_name_c = $xml_cache->get_xpath (
                             FILENAME => getRequired ('MenuConfiguration'),
                             XPATH    => [ @{$xpath}, 'item', 'name' ],
                             COUNTER  => [ @{$counter}, $i, 0 ]);
	$item_name = gettext ( $item_name_c );
        if ($xml_cache->get_xpath_count (
                   FILENAME => getRequired ('MenuConfiguration'),
                   XPATH    => [ @{$xpath}, 'item', 'id' ],
                   COUNTER  => [ @{$counter}, $i ])
	   ) {
		foreach my $h (@{$id_path}) {
                	$item_link .= ";id=$h";
                	#$item_class .= "sub";
            	}
		$item_id = $xml_cache->get_xpath (
                	FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => [ @{$xpath}, 'item', 'id' ],
                        COUNTER  => [ @{$counter}, $i, 0 ]);
		if( $item_id ) {
            		$item_link .= ";id=".$item_id;
		}

		if( "$item_id" == "$id" ) {
            		$item_class = "tab_on";
		} else {
			$item_class = "tab_off";
		}
            	$item_link = "cmd=genMenu".$item_link;
		$item_target = "top";
            	if ($id eq $xml_cache->get_xpath (
                        FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => [ @{$xpath}, 'item', 'id' ],
                        COUNTER  => [ @{$counter}, $i, 0 ])
		   ) {
                	$menu_entity = $i;
            	}
        } else {
            $item_link = $xml_cache->get_xpath (
            		FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => [ @{$xpath}, 'item', 'link' ],
                        COUNTER  => [ @{$counter}, $i, 0 ]);
            $item_target = $xml_cache->get_xpath (
                        FILENAME => getRequired ('MenuConfiguration'),
                        XPATH    => [ @{$xpath}, 'item', 'target' ],
                        COUNTER  => [ @{$counter}, $i, 0 ]);
        }
        if ($item_link !~ /^(\/|http:|https:|ldap:|ldaps:|mailto:)/) {
            $item_link = "${cgi_prefix}${item_link}";
        }

	if( $level > 0 ) {
		$item_class = '';
		if($id) {
			$item_class = '';
		} elsif ( $level > 1 ) {
			$item_class = 'sub';
		}

		if( $item_link =~ /id=/i and "$id" == "$item_id" ) {
			$item_class .= 'submenu_item_on';
            	} else {
                	$item_class .= "submenu_item_off";
            	}
	}

	$row .= qq{ 
   		<a class="$item_class" href="$item_link" target="$item_target">
     			$item_name
   		</a>
		};
    }
	if( $level < 1 ) {
		$row_class = "menu_row";
	} elsif ( $level == 1 ) {
		$row_class = 'submenu_row';
	} else {
		if( $id ) {
			$row_class = 'submenu_row';
		} else {
			$row_class = 'subsubmenu_row';
		}
	}

	$row = qq{
		<tr><td>
			<div class="$row_class">
			   $row
			</div>
		</td></tr>
	};

    return ($row, $menu_entity);
}

1;

__END__;
