%# {{{ BEGIN BPS TAGGED BLOCK
%# 
%# COPYRIGHT:
%#  
%# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC 
%#                                          <jesse@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., 675 Mass Ave, Cambridge, MA 02139, USA.
%# 
%# 
%# 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/ListActions, actions => \@actions &>

<TABLE>
<TR>
<TD VALIGN=TOP>
<h2><%$caption%></h2>
</TD></TR></TABLE>
% if ($CustomFields->Count == 0 ) {
<P><i><&|/l&>(No custom fields)</&></i></P>
% } else {
<TABLE cellspacing=0 cellpadding=2>
% my $count;
% while (my $CustomFieldObj = $CustomFields->Next) { 
<TR>
  <TD valign="TOP">
% if ($CustomFieldObj->Name) {
    <A HREF="CustomField.html?Queue=<%$id%>&CustomField=<%$CustomFieldObj->id()%>"><b><%$CustomFieldObj->Name%></b></a><br>
% } else {
    <A HREF="CustomField.html?Queue=<%$id%>&CustomField=<%$CustomFieldObj->id()%>"><i>(<%loc("no name")%>)</i></a><br>
% }
    <%$CustomFieldObj->Description%>
  </TD>
  <TD valign="TOP">
    <i><% $CustomFieldObj->FriendlyType %></i>
  </TD>
%  # show 'move up' unless it's the first item
%  if ($count++) {
  <TD valign="TOP">
    <a href="CustomFields.html?id=<%$id%>&CustomField=<%$CustomFieldObj->id%>&Move=-1"><&|/l&>Move up</&></a>
%  } else {
  <TD valign="TOP" ALIGN=RIGHT>
%  }

%  # show 'move down' unless it's the last item
%  if (!$CustomFields->IsLast) {
%  $m->print(' | ') if $count > 1;
    <a href="CustomFields.html?id=<%$id%>&CustomField=<%$CustomFieldObj->id%>&Move=1"><&|/l&>Move down</&></a>
%  }
</TD>
</TR>
% }

</TABLE>
% }
<FORM METHOD=GET ACTION="CustomFields.html">
% if ($id) {
<INPUT TYPE="Hidden" NAME="id" VALUE="<%$id%>">
% }
<input type="checkbox" name="FindDisabledCustomFields"> <&|/l&>Include disabled custom fields in listing.</&>
<input type=submit value="<&|/l&>Go!</&>">
</FORM>


<%INIT>
my $CustomFields = RT::CustomFields->new($session{'CurrentUser'});
my $QueueObj = RT::Queue->new($session{'CurrentUser'});
my $caption;

if ($id)  {
        $QueueObj->Load($id);                        
}

if ($QueueObj->id) {
	$CustomFields->LimitToQueue($id);
}                                            
else {                                       
        $CustomFields->LimitToGlobal();
}                                           

if ($FindDisabledCustomFields) {
    $caption = loc("All Custom Fields");
    $CustomFields->{'find_disabled_rows'} = 1;
} else {
    $caption = loc("Enabled Custom Fields");
}

# {{{ deal with moving sortorder of custom fields
if ($CustomField and $Move) {
    my $SourceObj = RT::CustomField->new($session{'CurrentUser'});
    $SourceObj->Load($CustomField) || Abort(loc('No CustomField'));

    my $TargetObj;
    my $target_order = $SourceObj->SortOrder + $Move;
    while (my $CustomFieldObj = $CustomFields->Next) { 
	my $this_order = $CustomFieldObj->SortOrder;

	# if we have an exact match, finish the loop now
	($TargetObj = $CustomFieldObj, last) if $this_order == $target_order;

	# otherwise, we need to apropos toward the general direction
	# ... first, check the sign is correct
	next unless ($this_order - $SourceObj->SortOrder) * $Move > 0;

	# ... next, see if we already have a candidate
	if ($TargetObj) {
	    # ... if yes, compare the delta and choose the smaller one
	    my $orig_delta = abs($TargetObj->SortOrder - $target_order);
	    my $this_delta = abs($this_order - $target_order);
	    next if $orig_delta < $this_delta;
	}

	$TargetObj = $CustomFieldObj;
    }

    if ($TargetObj) {
	# swap their sort order
	my ($s, $t) = ($SourceObj->SortOrder, $TargetObj->SortOrder);
	$TargetObj->SetSortOrder($s);
	$SourceObj->SetSortOrder($t);
	# because order changed, we must redo search for subsequent uses
	$CustomFields->RedoSearch;
    }

    $CustomFields->GotoFirstItem;
}
# }}}

# {{{ now process the 'copy queue' action
my @actions;
if ($Source and $Source ne $id) {
    my $SourceQueue = RT::Queue->new($session{'CurrentUser'});
    $SourceQueue->Load($Source) || Abort(loc("Couldn't load queue"));
    my $SourceCustomFields = RT::CustomFields->new($session{'CurrentUser'});
    $SourceCustomFields->LimitToQueue($SourceQueue->id);

    # delete old fields
    foreach my $CustomFieldObj ( @{$CustomFields->ItemsArrayRef} ) { 
	$CustomFieldObj->Delete;
    }

    # add new fields
    while (my $SourceCustomFieldObj = $SourceCustomFields->Next) {
	my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'});
	my ($val, $msg) =  $CustomFieldObj->Create(
	    id => $SourceCustomFieldObj->id,
	    Queue => $id,
	    Name => $SourceCustomFieldObj->Name,
	    Type => $SourceCustomFieldObj->Type,
	    Description => $SourceCustomFieldObj->Description,
	);
	Abort(loc("Could not create CustomField") . ": $msg") unless ($val);
	push @actions, $msg;

	$CustomFieldObj->SetSortOrder($SourceCustomFieldObj->SortOrder);

	# add new values
	my $values = $SourceCustomFieldObj->Values();
	while (my $v = $values->Next) {
	    my ( $addval, $addmsg ) = $CustomFieldObj->AddValue(
		Name => $v->Name,
		Description => $v->Description,
		SortOrder => $v->SortOrder
	    );
	}
    }

    # because content changed, we must redo search for subsequent uses
    $CustomFields->RedoSearch;
    $CustomFields->GotoFirstItem;
}
# }}}

# {{{ deal with deleting existing custom fields
foreach my $key (keys %ARGS) {
  # {{{ if we're trying to delete the custom field
  if ($key =~ /^DeleteCustomField-(\d+)/) {
    my $id = $1;
    my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'});
    $CustomFieldObj->Load($id);
    my ($retval, $msg) = $CustomFieldObj->Delete;
    if ($retval) {
      push @actions, loc("Custom field deleted");
    }
    else {
      push @actions, $msg;
    }
  }
  # }}}
}
# }}}

</%INIT>
<%ARGS>
$id => 0
$title => undef
$Move => undef
$Source => undef
$CustomField => undef
$FindDisabledCustomFields => undef
</%ARGS>
