%# BEGIN BPS TAGGED BLOCK {{{
%#
%# COPYRIGHT:
%#
%# This software is Copyright (c) 1996-2013 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 }}}
<%ARGS>
$Format => RT->Config->Get('DefaultAssetSearchResultFormat')

%types => ()

$Face => undef
$Size => undef
$Link => undef
$Title => undef

$AddCol => undef
$RemoveCol => undef
$ColUp => undef
$ColDown => undef

$SelectDisplayColumns => undef
$CurrentDisplayColumns => undef
</%ARGS>
<%init>
# This can't be in a <once> block, because otherwise we return the
# same \@fields every request, and keep tacking more CustomFields onto
# it -- and it grows per request.

# All the things we can display in the format string by default
my @fields = qw(
    id TypeName Name Description
    Status ExtendedStatus
);

push @fields, RTx::AssetTracker::Type->RoleGroupTypes();

push @fields, qw(
    CreatedBy LastUpdatedBy

    Created     CreatedRelative
    LastUpdated LastUpdatedRelative
);

push @fields, RTx::AssetTracker::Asset::LINKORDER();

push @fields, qw(
    IP
) if RT->Config->Get('EnableIP');

push @fields, qw(
    NEWLINE
    NBSP
); # loc_qw

$m->callback( CallbackOnce => 1, CallbackName => 'SetFieldsOnce', Fields => \@fields );

my $CustomFields = RT::CustomFields->new( $session{'CurrentUser'});
foreach my $id (keys %types) {
    # Gotta load up the $type object, since types get stored by name now.
    my $type = RTx::AssetTracker::Type->new($session{'CurrentUser'});
    $type->Load($id);
    $CustomFields->LimitToAssetType($type->Id) if $type->Id;
}
$CustomFields->LimitToGlobalAsset;

while ( my $CustomField = $CustomFields->Next ) {
    push @fields, "CustomField.{" . $CustomField->Name . "}";
}

$m->callback( Fields => \@fields, ARGSRef => \%ARGS );

my ( @seen);

$Format ||= RT->Config->Get('DefaultAssetSearchResultFormat');
my @format = split( /,\s*/, $Format );
foreach my $field (@format) {
    my %column = ();
    $field =~ s/'(.*)'/$1/;
    my ( $prefix, $suffix );
    if ( $field =~ m/(.*)__(.*)__(.*)/ ) {
        $prefix = $1;
        $suffix = $3;
        $field  = $2;
    }
    $field = "<blank>" if !$field;
    $column{Prefix} = $prefix;
    $column{Suffix} = $suffix;
    $field =~ s/\s*(.*)\s*/$1/;
    $column{Column} = $field;
    push @seen, \%column;
}

if ( $RemoveCol ) {
    # we do this regex match to avoid a non-numeric warning
    my ($index) = $CurrentDisplayColumns =~ /^(\d+)/;
    my $column = $seen[$index];
    if ( defined($index) ) {
        delete $seen[$index];
        my @temp = @seen;
        @seen = ();
        foreach my $element (@temp) {
            next unless $element;
            push @seen, $element;
        }
    }
}
elsif ( $AddCol ) {
    if ( defined $SelectDisplayColumns ) {
        my $selected = $SelectDisplayColumns;
        my @columns;
        if (ref($selected) eq 'ARRAY') {
            @columns = @$selected;
        } else {
            push @columns, $selected;
        }
        foreach my $col (@columns) {
            my %column = ();
            $column{Column} = $col;

            if ( $Face eq "Bold" ) {
                $column{Prefix} .= "<b>";
                $column{Suffix} .= "</b>";
            }
            if ( $Face eq "Italic" ) {
                $column{Prefix} .= "<i>";
                $column{Suffix} .= "</i>";
            }
            if ($Size) {
                $column{Prefix} .= "<" . $m->interp->apply_escapes( $Size,  'h' ) . ">";
                $column{Suffix} .= "</" . $m->interp->apply_escapes( $Size, 'h' ) . ">";
            }
            if ( $Link eq "Display" ) {
                $column{Prefix} .= q{<a HREF="__WebPath__/AssetTracker/Asset/Display.html?id=__id__">};
                $column{Suffix} .= "</a>";
            }

            if ($Title) {
                $column{Suffix} .= "/TITLE:" . $m->interp->apply_escapes( $Title, 'h' );
            }
            push @seen, \%column;
        }
    }
}
elsif ( $ColUp ) {
    my $index = $CurrentDisplayColumns;
    if ( defined $index && ( $index - 1 ) >= 0 ) {
        my $column = $seen[$index];
        $seen[$index]       = $seen[ $index - 1 ];
        $seen[ $index - 1 ] = $column;
        $CurrentDisplayColumns     = $index - 1;
    }
}
elsif ( $ColDown ) {
    my $index = $CurrentDisplayColumns;
    if ( defined $index && ( $index + 1 ) < scalar @seen ) {
        my $column = $seen[$index];
        $seen[$index]       = $seen[ $index + 1 ];
        $seen[ $index + 1 ] = $column;
        $CurrentDisplayColumns     = $index + 1;
    }
}


my @format_string;
foreach my $field (@seen) {
    next unless $field;
    my $row = "'";
    $row .= $field->{'Prefix'} if defined $field->{'Prefix'};
    $row .= "__$field->{'Column'}__"
      unless ( $field->{'Column'} eq "<blank>" );
    $row .= $field->{'Suffix'} if defined $field->{'Suffix'};
    $row .= "'";
    push( @format_string, $row );
}

$Format = join(",\n", @format_string);


return($Format, \@fields, \@seen);

</%init>
