%# BEGIN BPS TAGGED BLOCK {{{
%#
%# COPYRIGHT:
%#
%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC
%#                                          <sales@bestpractical.com>
%#
%# (Except where explicitly superseded by other copyright notices)
%#
%#
%# LICENSE:
%#
%# This work is made available to you under the terms of Version 2 of
%# the GNU General Public License. A copy of that license should have
%# been provided with this software, but in any event can be snarfed
%# from www.gnu.org.
%#
%# This work is distributed in the hope that it will be useful, but
%# WITHOUT ANY WARRANTY; without even the implied warranty of
%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
%# General Public License for more details.
%#
%# You should have received a copy of the GNU General Public License
%# along with this program; if not, write to the Free Software
%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
%# 02110-1301 or visit their web page on the internet at
%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
%#
%#
%# CONTRIBUTION SUBMISSION POLICY:
%#
%# (The following paragraph is not intended to limit the rights granted
%# to you to modify and distribute this software under the terms of
%# the GNU General Public License and is only of importance to you if
%# you choose to contribute your changes and enhancements to the
%# community by submitting them to Best Practical Solutions, LLC.)
%#
%# By intentionally submitting any modifications, corrections or
%# derivatives to this work, or any other work intended for use with
%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
%# you are the copyright holder for those contributions and you grant
%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
%# royalty-free, perpetual, license to use, copy, create derivative
%# works based on those contributions, and sublicense and distribute
%# those contributions and any derivatives thereof.
%#
%# END BPS TAGGED BLOCK }}}
<& /Elements/PageLayout, show_menu => $show_menu &>
<a name="skipnav" id="skipnav" accesskey="8"></a>
<%INIT>

my $request_path = $HTML::Mason::Commands::r->path_info;

my $query_string = sub {
    my %args = @_;
    my $u    = URI->new();
    $u->query_form(%args);
    return $u->query;
};

my $build_main_nav = sub {

    my $home = Menu->child( home => title => loc('Homepage'), path => '/' );
    my @dashboards = $m->comp("/Dashboards/Elements/ListOfDashboards");
    my $limit      = 7;

    my $more = 0;
    if ( @dashboards > $limit ) {
        $more = 1;
        splice @dashboards, $limit;
    }

    my $position = 0;

    my $dashes = Menu()->child('home');
    if (@dashboards) {
        for my $dash (@dashboards) {
            $home->child( 'dashboard-' . $dash->id, title => $dash->Name,
                       path => '/Dashboards/' . $dash->id . '/' . $dash->Name,);
        }

        $dashes->child( more => title => loc('All Dashboards'), path  => 'Dashboards/index.html' );
    }
    my $dashboard = RT::Dashboard->new( $session{CurrentUser} );
    if ( $dashboard->CurrentUserCanCreateAny ) {
        $dashes->child('dashboard_create' => title => loc('New Dashboard') => path => "/Dashboards/Modify.html?Create=1" );
    }

    my $tickets = Menu->child( search => title => loc('Tickets'), path => '/Search/Build.html' );
    $tickets->child( simple => title => loc('Simple Search') => path => "/Search/Simple.html" );
    $tickets->child( new => title => loc('New Search') => path => "/Search/Build.html?NewQuery=1" );

    my $tools = Menu->child(  tools => title => loc('Tools'), path => '/Tools/index.html' );


    my $articles = $tools->child( articles => title => loc('Articles') => path => "/Articles/index.html");
    $articles->child( articles => title => loc('Overview') => path => "/Articles/index.html" );
    $articles->child( search   => title => loc('Search') => path => "/Articles/Article/Search.html" );
    $articles->child( topics   => title => loc('Topics') => path => "/Articles/Topics.html" );




    $tools->child( my_day => title => loc('My Day'), path   => '/Tools/MyDay.html',
                   description => loc('Easy updating of your open tickets') );

    if ( RT->Config->Get('EnableReminders') )
    {
        $tools->child( my_reminders => title => loc('My Reminders'), path => '/Tools/MyReminders.html',
                       description => loc('Easy viewing of your reminders') );
    }

    $tools->child( offline => title => loc('Offline'), path    => '/Tools/Offline.html',
                   description => loc('Create tickets offline') );

    if ( $session{'CurrentUser'}->HasRight( Right => 'ShowApprovalsTab', Object => RT->System ) )
    {
        $tools->child( approval => title => loc('Approval'), path     => '/Approvals/',
                       description => loc('My Approvals') );
    }


my $build_admin_menu = sub {
        my $admin = $tools->child( config => title => loc('Configuration'), path   => '/Admin/', sort_order => 99 );
        if ( $session{'CurrentUser'}->HasRight( Object => RT->System, Right => 'AdminUsers' ) ) {
            my $users = $admin->child( users => title => loc('Users'), path => '/Admin/Users/', description => loc('Manage users and passwords') );
            $users->child( select => title => loc('Select'), path   => "/Admin/Users/" );
            $users->child( create => title => loc('Create'), path => "/Admin/Users/Modify.html?Create=1" );
        }
        my $groups = $admin->child( loc('Groups'), path => '/Admin/Groups/', description => loc('Manage groups and group membership') );

        $groups->child( select => title => loc('Select'), path => "/Admin/Groups/" );
        $groups->child( create => title => loc('Create'), path => "/Admin/Groups/Modify.html?Create=1" );

        my $queues = $admin->child( queues => title => loc('Queues'), path => '/Admin/Queues/', description => loc('Manage queues and queue-specific properties') );
        $queues->child( select => title => loc('Select'), path => "/Admin/Queues/" );
        $queues->child( create => title => loc('Create'), path => "/Admin/Queues/Modify.html?Create=1" );

        if ( $session{'CurrentUser'}->HasRight( Object => RT->System, Right => 'AdminCustomField' ) ) {
            my $cfs = $admin->child( 'custom-fields' => title => loc('Custom Fields'), path => '/Admin/CustomFields/', description => loc('Manage custom fields and custom field values') );
            $cfs->child( select => title => loc('Select'), path   => "/Admin/CustomFields/" );
            $cfs->child( create => title => loc('Create'), path => "/Admin/CustomFields/Modify.html?Create=1" );
        }

        my $admin_global = $admin->child( global => title => loc('Global'), path   => '/Admin/Global/', description => loc('Manage properties and configuration which apply to all queues') );

        my $scrips = $admin_global->child( scrips => title => loc('Scrips'), path => '/Admin/Global/Scrips.html', description => loc('Modify scrips which apply to all queues') );
        $scrips->child( select => title => loc('Select'), path => "/Admin/Global/Scrips.html" );
        $scrips->child( create => title => loc('Create'), path => "/Admin/Global/Scrip.html?Create=1" );
        my $templates = $admin_global->child( loc('Templates'), path => '/Admin/Global/Templates.html', description => loc('Edit system templates') );
        $templates->child( select => title => loc('Select'), path => "/Admin/Global/Templates.html" );
        $templates->child( create => title => loc('Create'), path => "/Admin/Global/Template.html?Create=1" );

        my $cfadmin = $admin_global->child( 'custom-fields' => title => loc('Custom Fields'),
                                            path => '/Admin/Global/CustomFields/index.html',
                                            description => loc('Modify global custom fields') );
        {
            $cfadmin->child( users => title => loc('Users') => text => loc('Select custom fields for all users'),
                             path => '/Admin/Global/CustomFields/Users.html');

            $cfadmin->child( groups => title => loc('Groups') => text => loc('Select custom fields for all user groups'),
                          path => '/Admin/Global/CustomFields/Groups.html');

            $cfadmin->child( queues => title => loc('Queues') => text => loc('Select custom fields for all queues'),
                             path => '/Admin/Global/CustomFields/Queues.html');

            $cfadmin->child( tickets => title => loc('Tickets') => text => loc('Select custom fields for tickets in all queues'),
                    path => '/Admin/Global/CustomFields/Queue-Tickets.html');

            $cfadmin->child( transactions => title => loc('Ticket Transactions') => text =>
                    loc( 'Select custom fields for transactions on tickets in all queues'),
                path => '/Admin/Global/CustomFields/Queue-Transactions.html');
            $cfadmin->child( 'custom-fields' => title => loc('Articles') => text =>
                    loc('Select Custom Fields for Articles in all Classes'),
                    path => '/Admin/Global/CustomFields/Class-Article.html');

        }

        my $article_admin = $admin->child( articles => title => loc('Articles') => path => "/Admin/Articles/index.html" );
        my $class_admin = $article_admin->child(classes => title => loc('Classes'), path => '/Admin/Articles/Classes/');
        $class_admin->child(select => title => loc('Select') => path => '/Admin/Articles/Classes/',
                            description => 'Modify and Create Classes' );
        $class_admin->child(create => title => loc('Create') => path => '/Admin/Articles/Classes/Modify.html?Create=1',
                            description => 'Modify and Create Custom Fields for Articles' );


        my $cfs = $article_admin->child( 'custom-fields' => title => loc('Custom Fields'), path => '/Admin/CustomFields/index.html?'.$m->comp('/Elements/QueryString', type => 'RT::Class-RT::Article') );
        $cfs->child( select => title => loc('Select'), path => '/Admin/CustomFields/index.html?'.$m->comp('/Elements/QueryString', type => 'RT::Class-RT::Article') );
        $cfs->child( create => title => loc('Create'), path => '/Admin/CustomFields/Modify.html?'.$m->comp("/Elements/QueryString", Create=>1, LookupType=> "RT::Class-RT::Article" ));

        $admin_global->child( 'group-rights' => title => loc('Group Rights'), path => '/Admin/Global/GroupRights.html',
                              description => loc('Modify global group rights') );
        $admin_global->child( 'user-rights' => title => loc('User Rights'), path => '/Admin/Global/UserRights.html',
                              description => loc('Modify global user rights') );
        $admin_global->child( 'my-rt' => title => loc('RT at a glance'), path => '/Admin/Global/MyRT.html',
                              description => loc('Modify the default "RT at a glance" view') );

        my $admin_tools = $admin->child( tools => title => loc('Tools'), path => '/Admin/Tools/', description => loc('Use other RT administrative tools') );
        $admin_tools->child( configuration => title => loc('System Configuration'), path => '/Admin/Tools/Configuration.html',
                             description => loc('Detailed information about your RT setup') );
        $admin_tools->child( theme => title => loc('Theme'), path => '/Admin/Tools/Theme.html',
                              description => loc('Customize the look of your RT') );
        if (RT->Config->Get('StatementLog')
            && $session{'CurrentUser'}->HasRight( Right => 'SuperUser', Object => RT->System )) {
           $admin_tools->child( 'sql-queries' => title => loc('SQL Queries'), path => '/Admin/Tools/Queries.html',
                                description => loc('Browse the SQL queries made in this process') );
        }
        $admin_tools->child( shredder => title => loc('Shredder'), path => '/Admin/Tools/Shredder',
                             description => loc('Permanently wipeout data from RT'));

    if ( $request_path =~ m{^/Admin/(Queues|Users|Groups|CustomFields)} ) {
        my $type = $1;
        my $tabs = PageMenu();

        my %labels = (
            Queues       => loc("Queues"),
            Users        => loc("Users"),
            Groups       => loc("Groups"),
            CustomFields => loc("Custom Fields"),

                     );

        my $section;
        if ( $request_path =~ m{^/Admin/$type/?(?:index.html)?$}
             || (    $request_path =~ m{^/Admin/$type/(?:Modify.html)$}
                  && $m->request_args->{'Create'} )
           )

        {
            $section = $tabs;

        } else {
            $section = $tabs->child( select => title => $labels{$type},
                                     path => "/Admin/$type/" );
        }

        $section->child( select => title => loc('Select'),
                         path   => "/Admin/$type/" );
        $section->child( create => title => loc('Create'),
                         path => "/Admin/$type/Modify.html?Create=1" );
    }

    if ( $request_path =~ m{^/Admin/Queues} ) {
        if ( $m->request_args->{'id'} && $m->request_args->{'id'} =~ /^\d+$/ 
                ||
              $m->request_args->{'Queue'} && $m->request_args->{'Queue'} =~ /^\d+$/ 
                ) {
            my $id = $m->request_args->{'Queue'} || $m->request_args->{'id'};
            my $queue_obj = RT::Queue->new( $session{'CurrentUser'} );
            $queue_obj->Load($id);

            my $queue = PageMenu();
            $queue->child( basics => title => loc('Basics'), path => "/Admin/Queues/Modify.html?id=" . $id );
            $queue->child( people => title => loc('Watchers'), path => "/Admin/Queues/People.html?id=" . $id );
            my $templates = $queue->child(templates => title => loc('Templates'),
                              path => "/Admin/Queues/Templates.html?id=" . $id);

            $templates->child(select => title => loc('Select'), path => "/Admin/Queues/Templates.html?id=".$id);
            $templates->child( create => title => loc('Create'), path => "/Admin/Queues/Template.html?Create=1;Queue=".$id);

            my $scrips = $queue->child( scrips => title => loc('Scrips'), path => "/Admin/Queues/Scrips.html?id=" . $id);

            $scrips->child( select => title => loc('Select'), path => "/Admin/Queues/Scrips.html?id=" . $id );
            $scrips->child( create => title => loc('Create'), path => "/Admin/Queues/Scrip.html?Create=1;Queue=" . $id);

            my $ticket_cfs = $queue->child( 'ticket-custom-fields' => title => loc('Ticket Custom Fields'),
                  path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket&id=' . $id );

            my $txn_cfs = $queue->child( 'transaction-custom-fields' => title => loc('Transaction Custom Fields'),
                path => '/Admin/Queues/CustomFields.html?SubType=RT::Ticket-RT::Transaction&id='.$id );

            $queue->child( 'group-rights' => title => loc('Group Rights'), path => "/Admin/Queues/GroupRights.html?id=".$id );
            $queue->child( 'user-rights' => title => loc('User Rights'), path => "/Admin/Queues/UserRights.html?id=" . $id );


                $m->callback( CallbackName => 'PrivilegedQueue',
                              queue_id => $id, page_menu => $queue);

        }
    }
    if ( $request_path =~ m{^/Admin/Users} ) {
        if ( $m->request_args->{'id'} && $m->request_args->{'id'} =~ /^\d+$/ ) {
            my $id = $m->request_args->{'id'};
            my $obj = RT::User->new( $session{'CurrentUser'} );
            $obj->Load($id);
            my $tabs = PageMenu();
            $tabs->child( basics => title => loc('Basics'), path => "/Admin/Users/Modify.html?id=" . $id );
            $tabs->child( memberships => title => loc('Memberships'), path => "/Admin/Users/Memberships.html?id=" . $id );
            $tabs->child( history => title => loc('History'), path => "/Admin/Users/History.html?id=" . $id );
            $tabs->child( 'my-rt' => title => loc('RT at a glance'), path => "/Admin/Users/MyRT.html?id=" . $id );
            if ( RT->Config->Get('GnuPG')->{'enable'} ) {
                $tabs->child( pgp => title => loc('GnuPG'), path => "/Admin/Users/GnuPG.html?id=" . $id );
            }
        }

    }

    if ( $request_path =~ m{^/Admin/Groups} ) {
        if ( $m->request_args->{'id'} && $m->request_args->{'id'} =~ /^\d+$/ ) {
            my $id = $m->request_args->{'id'};
            my $obj = RT::Group->new( $session{'CurrentUser'} );
            $obj->Load($id);
            my $tabs = PageMenu();
            $tabs->child( basics => title => loc('Basics') => path => "/Admin/Groups/Modify.html?id=" . $obj->id );
            $tabs->child( members => title => loc('Members') => path => "/Admin/Groups/Members.html?id=" . $obj->id );
            $tabs->child( 'group-rights' => title => loc('Group Rights') => path => "/Admin/Groups/GroupRights.html?id=" . $obj->id );
            $tabs->child( 'user-rights' => title => loc('User Rights') => path => "/Admin/Groups/UserRights.html?id=" . $obj->id );
            $tabs->child( history => title => loc('History') => path => "/Admin/Groups/History.html?id=" . $obj->id );
        }
    }

    if ( $request_path =~ m{^/Admin/CustomFields/} ) {
        if ( $m->request_args->{'id'} && $m->request_args->{'id'} =~ /^\d+$/ ) {
            my $id = $m->request_args->{'id'};
            my $obj = RT::CustomField->new( $session{'CurrentUser'} );
            $obj->Load($id);
            my $tabs = PageMenu();

            $tabs->child( basics => title => loc('Basics') => path => "/Admin/CustomFields/Modify.html?id=".$id );
            $tabs->child( 'group-rights' => title => loc('Group Rights') => path => "/Admin/CustomFields/GroupRights.html?id=" . $id );
            $tabs->child( 'user-rights' => title => loc('User Rights') => path => "/Admin/CustomFields/UserRights.html?id=" . $id );

            $tabs->child( 'applies-to' => title => loc('Applies to'), path => "/Admin/CustomFields/Objects.html?id=" . $id );

        }

    }

    if ( $request_path =~ m{^/Admin/Global/(Scrip|Template)s?\.html} ) {
        my $type = $1;
        my $tabs = PageMenu();

        my %labels = (
            Scrip       => loc('Scrips'),
            Template    => loc('Templates')
        );

        # With only two elements, swapping between dropdown and menu is kinda dumb
        # In the glorious future this should be cleaner.

        $tabs->child( select => title => loc('Select'),
                      path   => "/Admin/Global/${type}s.html" );
        $tabs->child( create => title => loc('Create'),
                      path   => "/Admin/Global/${type}.html?Create=1" );

    }

    if ( $request_path =~ m{^/Admin/Articles/Classes/} ) {
        my $tabs = PageMenu();
        if ( my $id = $m->request_args->{'id'} ) {
            my $obj = RT::CustomField->new( $session{'CurrentUser'} );
            $obj->Load($id);

            my $section = $tabs->child( select => title => loc("Classes"), path => "/Admin/Articles/Classes/" );
            $section->child( select => title => loc('Select'), path => "/Admin/Articles/Classes/" );
            $section->child( create => title => loc('Create'), path => "/Admin/Articles/Classes/Modify.html?Create=1" );

            $tabs->child( basics => title => loc('Basics') => path => "/Admin/Articles/Classes/Modify.html?id=".$id, );
            $tabs->child( topics => title => loc('Topics') => path => "/Admin/Articles/Classes/Topics.html?id=".$id, );
            $tabs->child( 'custom-fields'  => title => loc('Custom Fields') => path => '/Admin/Articles/Classes/CustomFields.html?id='.$id, );
            $tabs->child( 'group-rights' => title => loc('Group Rights') => path => "/Admin/Articles/Classes/GroupRights.html?id=".$id, );
            $tabs->child( 'user-rights'  => title => loc('User Rights') => path => "/Admin/Articles/Classes/UserRights.html?id=".$id, );
            $tabs->child( 'applies-to'  => title => loc('Applies to') =>  path => "/Admin/Articles/Classes/Objects.html?id=$id", );
        } else {
            $tabs->child( select => title => loc('Select'), path => "/Admin/Articles/Classes/" );
            $tabs->child( create => title => loc('Create'), path => "/Admin/Articles/Classes/Modify.html?Create=1" );

        }
    }

    };


    if ( $session{'CurrentUser'}->HasRight( Right => 'ShowConfigTab', Object => RT->System ) )
    {
        $build_admin_menu->();
    }




    my $about_me = Menu->child( 'preferences' => title =>
                        loc( 'Logged in as <span class="current-user">[_1]</span>', $session{'CurrentUser'}->Name),
                    escape_title => 0,
                    sort_order   => 99
    );


    if ( $session{'CurrentUser'}->UserObj
         && $session{'CurrentUser'}->HasRight( Right  => 'ModifySelf', Object => RT->System )) {
        my $settings = $about_me->child( settings => title => loc('Settings'), path => '/Prefs/Other.html', );
        $settings->child( options => title => loc('Options'), path     => '/Prefs/Other.html', );
        $settings->child( about_me => title => loc('About me'), path     => '/User/Prefs.html', );
        $settings->child( search_options => title => loc('Search options'), path => '/Prefs/SearchOptions.html', );
        $settings->child( myrt => title => loc('RT at a glance'), path => '/Prefs/MyRT.html', );
        $settings->child( quicksearch => title => 'Quick search' => title => loc('Quick search'), path => '/Prefs/Quicksearch.html');

        my $search_menu = $settings->child( 'saved-searches' => title => 'Saved Searches' );
        my $searches = [ $m->comp( "/Search/Elements/SearchesForObject",
                          Object => RT::System->new( $session{'CurrentUser'} )) ];
        my $i = 0;

        for my $search (@$searches) {
            $search_menu->child( "search-" . $i++, title => $search->[0], path  => "/Prefs/Search.html?"
                          . $query_string->( name => ref( $search->[1] ) . '-' . $search->[1]->Id),);

        }
    }
    if ( $session{'CurrentUser'}->Name
         && (   !RT->Config->Get('WebExternalAuth')
              || RT->Config->Get('WebFallbackToInternalAuth') )) {
        $about_me->child( logout => title => loc('Logout'), path   => '/NoAuth/Logout.html' );
    }
    if ( $request_path =~ m{^/Dashboards/(\d+)?}) {
        if ( my $id = ( $1 || $m->request_args->{'id'} ) ) {
            my $obj = RT::Dashboard->new( $session{'CurrentUser'} );
            $obj->LoadById($id);
            if ( $obj and $obj->id ) {
                my $tabs = PageMenu;
                $tabs->child( basics => title => loc('Basics'), path => "/Dashboards/Modify.html?id=" . $obj->id);
                $tabs->child(content => title => loc('Content'), path => "/Dashboards/Queries.html?id=" . $obj->id);
                $tabs->child( subscription => title => loc('Subscription'),
                        path => "/Dashboards/Subscription.html?id=" . $obj->id
                ) if $obj->CurrentUserCanSubscribe;
                $tabs->child( show => title => loc('Show'), path => "/Dashboards/" . $obj->id . "/" . $obj->Name)
            }
        }
    }


    if ( $request_path =~ m{^/Ticket/} ) {
        if ( ( $m->request_args->{'id'} || '' ) =~ /^(\d+)$/ ) {
            my $id  = $1;
            my $obj = RT::Ticket->new( $session{'CurrentUser'} );
            $obj->Load($id);

            my $actions = PageMenu()->child( actions => title => loc('Actions'), sort_order  => 95 );
            my $tabs = PageMenu();
            $tabs->child( bookmark => raw_html => $m->scomp( '/Ticket/Elements/Bookmark', id => $id ),
                sort_order => 99
            );

            $tabs->child( display => title => loc('Display') => path => "/Ticket/Display.html?id=" . $id );

            $tabs->child( history => title => loc('History') => path => "/Ticket/History.html?id=" . $id );

            my %can = %{ $obj->CurrentUser->PrincipalObj->HasRights( Object => $obj ) };
            $can{'_ModifyOwner'} = $can{'OwnTicket'} || $can{'TakeTicket'} || $can{'StealTicket'};
            my $can = sub {
                unless ($_[0] eq 'ExecuteCode') {
                    return $can{$_[0]} || $can{'SuperUser'};
                } else {
                    return !RT->Config->Get('DisallowExecuteCode')
                        && ( $can{'ExecuteCode'} || $can{'SuperUser'} );
                }
            };

            # comment out until we can do it for an individual custom field
            #if ( $can->('ModifyTicket') || $can->('ModifyCustomField') ) {
            $tabs->child( basics => title => loc('Basics'), path => "/Ticket/Modify.html?id=" . $id, );

            #}

            if ( $can->('ModifyTicket') || $can->('_ModifyOwner') || $can->('Watch') || $can->('WatchAsAdminCc') ) {
                $tabs->child( people => title => loc('People'), path => "/Ticket/ModifyPeople.html?id=" . $id,);
            }

            if ( $can->('ModifyTicket') ) {
                $tabs->child( dates => title => loc('Dates'), path => "/Ticket/ModifyDates.html?id=" . $id, );
                $tabs->child( links => title => loc('Links'), path => "/Ticket/ModifyLinks.html?id=" . $id, );
            }

            #if ( $can->('ModifyTicket') || $can->('ModifyCustomField') || $can->('_ModifyOwner') ) {
            $tabs->child( jumbo => title => loc('Jumbo'), path => "/Ticket/ModifyAll.html?id=" . $id, );
            #}

            if ( RT->Config->Get('EnableReminders') ) {
                $tabs->child( reminders => title => loc('Reminders'), path => "/Ticket/Reminders.html?id=" . $id, );
            }

            if ( $can->('ModifyTicket') or $can->('ReplyToTicket') ) {
                $actions->child( reply => title => loc('Reply'), path => "/Ticket/Update.html?Action=Respond;id=" . $id,);
            }

            if ( $can->('ModifyTicket') or $can->('CommentOnTicket') ) {
                $actions->child( comment => title => loc('Comment'), path => "/Ticket/Update.html?Action=Comment;id=" . $id);
            }

            if ( $can->('ForwardMessage') ) {
                $actions->child( forward => title => loc('Forward'), path => "/Ticket/Forward.html?id=" . $id, );
            }

            my $current   = $obj->Status;
            my $lifecycle = $obj->QueueObj->Lifecycle;
            my $i         = 1;
            foreach my $info ( $lifecycle->Actions($current) ) {
                my $next = $info->{'to'};
                next unless $lifecycle->IsTransition( $current => $next );

                my $check = $lifecycle->CheckRight( $current => $next );
                next unless $can->($check);


                my $action = $info->{'update'} || '';


                my $url = '/Ticket/';
                if ($action) {

                    $url .= "Update.html?" . $query_string->(Action => $action,
                                           DefaultStatus => $next,
                                           id            => $id
                                         );
                } else {
                    $url .= "Display.html?" . $query_string->( Status => $next, id => $id );
                }
                $actions->child( loc( $info->{'label'} || ucfirst($next) ) => path => $url);
            }

            if ( $can->('OwnTicket') ) {
                if ( $obj->OwnerObj->Id == RT->Nobody->id
                     && ( $can->('ModifyTicket') or $can->('TakeTicket') ) ) {
                    $actions->child( take => path => "/Ticket/Display.html?Action=Take;id=" . $id, title => loc('Take'));
                }

                elsif (    $obj->OwnerObj->id != RT->Nobody->id
                        && $obj->OwnerObj->id != $session{CurrentUser}->id
                        && ( $can->('ModifyTicket') or $can->('StealTicket') ) ) {
                    $actions->child( steal => title => loc('Steal'), path => "/Ticket/Display.html?Action=Steal;id=" . $id,);
                }
            }

            # TODO needs a "Can extract article into a class applied to this queue" check
            $actions->child( 'extract-article' => title => loc('Extract Article') => 
                             path => "/Articles/Article/ExtractIntoClass.html?Ticket=".$obj->id );

            if ( defined $session{"tickets"} ) {
                # we have to update session data if we get new ItemMap
                my $updatesession = 1 unless ( $session{"tickets"}->{'item_map'} );

                my $item_map = $session{"tickets"}->ItemMap;

                if ($updatesession) {
                    $session{"tickets"}->PrepForSerialization();
                }

                my $search = Menu()->child('search');
                # Don't display prev links if we're on the first ticket
                if ( $item_map->{$id}->{prev} ) {
                    $search->child( 'first', title => ' ' . loc('First'), escape_title => 0, class => "nav",
                                    path => "/Ticket/Display.html?id=" . $item_map->{first});
                    $search->child( prev => title => '< ' . loc('Prev') => class => "nav",
                                    path => "/Ticket/Display.html?id=" . $item_map->{$id}->{prev});
                }
                # Don't display next links if we're on the last ticket
                if ( $item_map->{$id}->{next} ) {
                    $search->child( next       => title => loc('Next') . ' >' => class => "nav",
                                    path => "/Ticket/Display.html?id=" . $item_map->{$id}->{next});
                    $search->child( last        => title => loc('Last') . ' >>' => class => "nav",
                                    path => "/Ticket/Display.html?id=" . $item_map->{last});
                }
            }
        }
    }
    if ( $request_path =~ m{^/(?:Ticket|Search)/} && $request_path !~ m{^/Search/Simple\.html}) {
        my $search = Menu()->child('search');
        my $args      = '';
        my $has_query = '';
        my $current_search = $session{"CurrentSearchHash"} || {};
        my $search_id = $m->request_args->{'SavedSearchLoad'} || $m->request_args->{'SavedSearchId'} || $search->{'SearchId'} || '';

        $has_query = 1 if ( $m->request_args->{'Query'} or $current_search->{'Query'} );

        my %query_args = (
            SavedSearchId => ( $search_id eq 'new' ) ? undef : $search_id,
            SavedChartSearchId => $m->request_args->{'SavedChartSearchId'} || $current_search->{SavedChartSearchId},
            Query => $m->request_args->{'Query'} || $current_search->{'Query'},
            Format => $m->request_args->{'Format'} || $current_search->{'Format'},
            OrderBy => $m->request_args->{'OrderBy'} || $current_search->{'OrderBy'} ||'',
            Order => $m->request_args->{'Order'} || $current_search->{'Order'} ||'',
            Page => $m->request_args->{'Page'} || $current_search->{'Page'},
            RowsPerPage => ( defined $m->request_args->{'RowsPerPage'}
                             ? $m->request_args->{'RowsPerPage'}
                             : $current_search->{'RowsPerPage'})
                         );
        for my $field (qw(Order OrderBy)) {
            if ( ref( $query_args{$field} ) eq 'ARRAY' ) {
                $query_args{$field} = join( "|", @{ $query_args{$field} } );
            } elsif (not defined $query_args{$field}) {
                delete $query_args{$field};
            }
        }

        $args = "?" . ($QueryString || $query_string->(%query_args));


        my $current_search_menu;
        if ( $request_path =~ m{^/Ticket} ) {
            $current_search_menu = $search->child( current_search => title => loc('Current Search') );
            $current_search_menu->path("/Search/Results.html$args") if $has_query;
        } else {
            $current_search_menu = PageMenu();
        }

        $current_search_menu->child( edit_search => title => loc('Edit Search') =>
                                     path => "/Search/Build.html" . ( ($has_query) ? $args : '' ) );
        $current_search_menu->child( loc('Advanced') => path => "/Search/Edit.html$args" );
        if ($has_query) {
            $current_search_menu->child( results => title => loc('Show Results') => path => "/Search/Results.html$args" );
        }

        if ( $has_query ) {
            $current_search_menu->child( bulk => title => loc('Bulk Update') => path => "/Search/Bulk.html$args" );
            $current_search_menu->child( chart => title => loc('Chart'),
                                         path => "/Search/Chart.html$args" );

            my $more = $current_search_menu->child( more => title => loc('Feeds') );
            
            $more->child(
                                   spreadsheet => title => loc('Spreadsheet'),
                                   path => "/Search/Results.tsv$args" );

            my $RSSQueryString = "?"
                . $query_string->( Query   => $query_args{Query},
                                   Order   => $query_args{Order},
                                   OrderBy => $query_args{OrderBy}
                                 );
            my $RSSPath = join '/', map $m->interp->apply_escapes( $_, 'u' ),
                $session{'CurrentUser'}->UserObj->Name,
                $session{'CurrentUser'}
                ->UserObj->GenerateAuthString(   $query_args{Query}
                                               . $query_args{Order}
                                               . $query_args{OrderBy} );

            $more->child( rss => title => loc('RSS') => path => "/NoAuth/rss/$RSSPath/$RSSQueryString");
            my $ical_path = join '/', map $m->interp->apply_escapes($_, 'u'),
                $session{'CurrentUser'}->UserObj->Name,
                $session{'CurrentUser'}->UserObj->GenerateAuthString( $query_args{Query} ),
                $query_args{Query};
            $more->child( ical => title => loc('iCal') => path => '/NoAuth/iCal/'.$ical_path);

            if ($request_path =~ m{^/Search/Results.html}
                &&                        #XXX TODO better abstraction
                $session{'CurrentUser'}->HasRight( Right => 'SuperUser', Object => RT->System )) {
                my $shred_args = $query_string->(
                    search          => 1,
                    plugin          => 'Tickets',
                    'Tickets:query' => $query_args{'Query'},
                    'Tickets:limit' => $query_args{'Rows'},
                );

                $more->child( 'shredder' => title => loc('Shredder'),
                                path => 'Admin/Tools/Shredder/?' . $shred_args);
            }

        }
    }

    if ( $request_path =~ m{^/Article/} ) {
        if ( $m->request_args->{'id'} && $m->request_args->{'id'} =~ /^\d+$/ ) {
            my $id = $m->request_args->{'id'};
            my $tabs = PageMenu();

            $tabs->child( display => title => loc('Display') => path => "/Articles/Article/Display.html?id=".$id, );
            $tabs->child( history => title => loc('History') => path => "/Articles/Article/History.html?id=".$id, );
            $tabs->child( modify => title => loc('Modify') => path => "/Articles/Article/Edit.html?id=".$id, );
            $tabs->child( delete => title => loc('Delete') => path => "/Articles/Article/Delete.html?id=".$id, );
        }
    }

    if ( $request_path =~ m{^/Articles/} ) {
        my $tabs = PageMenu();
        $tabs->child( search => path => "/Articles/Article/Search.html", title     => loc("Search") );
        $tabs->child( create => path => "/Articles/Article/PreCreate.html", title     => loc("New Article" ) );
        if ( ( $m->request_args->{'id'} || '' ) =~ /^(\d+)$/ ) {
            my $id  = $1;
            my $obj = RT::Article->new( $session{'CurrentUser'} );
            $obj->Load($id);

            $tabs->child( display => title => "Display", path => "/Articles/Article/Display.html?id=" . $id );
            $tabs->child( history => title => loc('History'), path => '/Articles/Article/History.html?id=' . $id );

            if ( $obj->CurrentUserHasRight('ModifyArticle') ) {
                $tabs->child(modify => title => loc('Modify'), path => '/Articles/Article/Edit.html?id=' . $id );
            }
            if ( $obj->CurrentUserHasRight('DeleteArticle') ) {
                $tabs->child(delete => title => loc('Delete'), path => '/Articles/Article/Delete.html?id=' . $id );
            }
        }

    }

    if ( $request_path =~ /^\/(?:index.html|$)/ ) {
        PageMenu()->child( edit => title => loc('Edit'), path => '/Prefs/MyRT.html' );
    }

    PageWidgets()->child( simple_search => raw_html => $m->scomp('SimpleSearch') );
    PageWidgets()->child( create_ticket => raw_html => $m->scomp('CreateTicket') );

    $m->callback( CallbackName => 'Privileged' );
};

my $build_selfservice_nav = sub {
    my $queues = RT::Queues->new( $session{'CurrentUser'} );
    $queues->UnLimit;

    my $queue_count = 0;
    my $queue_id    = 1;

    while ( my $queue = $queues->Next ) {
        next unless $queue->CurrentUserHasRight('CreateTicket');
        $queue_id = $queue->id;
        $queue_count++;
        last if ( $queue_count > 1 );
    }


    my $tickets = Menu->child(tickets => title =>loc('Tickets'));
    $tickets->child( open => title => loc('Open tickets'), path => '/SelfService/', );
    $tickets->child( closed => title => loc('Closed tickets'), path => '/SelfService/Closed.html', );
    if ( $queue_count > 1 ) {
        $tickets->child( new => title => loc('New ticket'), path => '/SelfService/CreateTicketInQueue.html' );
    } else {
        $tickets->child( new => title => loc('New ticket'), path => '/SelfService/Create.html?Queue=' . $queue_id );
    }


    my $about_me = Menu->child( 'preferences' => title =>
                        loc( 'Logged in as <span class="current-user">[_1]</span>', $session{'CurrentUser'}->Name),
                    escape_title => 0,
                    sort_order   => 99
    );

    if ( $session{'CurrentUser'}->HasRight( Right => 'ModifySelf', Object => RT->System ) ) {
        $about_me->child( prefs => title => loc('Preferences'), path  => '/SelfService/Prefs.html' );
    }

    if ( $session{'CurrentUser'}->Name
         && (   !RT->Config->Get('WebExternalAuth')
              || RT->Config->Get('WebFallbackToInternalAuth') )) {
        $about_me->child( logout => title => loc('Logout'), path   => '/NoAuth/Logout.html' );
    }

    if ($session{'CurrentUser'}->HasRight( Right => 'ShowArticle', Object => RT->System )) {
        PageWidgets->child( 'goto-article' => raw_html => $m->scomp('/SelfService/Elements/SearchArticle') );
    }

    PageWidgets->child( goto => raw_html => $m->scomp('/SelfService/Elements/GotoTicket') );

    $m->callback( CallbackName => 'SelfService' );
};



if ( $request_path !~ m{^/SelfService/} ) {
    $build_main_nav->();
} else {
    $build_selfservice_nav->();
}




</%INIT>
<%ARGS>
$show_menu => 1
$QueryString => ''
</%ARGS>
