<input type="hidden" name="<% $NamePrefix %>Queue" value="<% $QueueObj->id %>" />
<input type="hidden" name="<% $NamePrefix %>Status" value="<% $ARGS{ $NamePrefix .'Status' } || $QueueObj->Lifecycle->DefaultOnCreate %>" />

<div class="ticket-create-basics">
<&| /Widgets/TitleBox, title => loc("Basics"), class => 'ticket-info-basics' &>
<table width="100%" border="0">

% unless ( $SkipField{'Owner'} || $HideField{'Owner'} ) {
<tr><td class="label"><&|/l&>Owner</&>:</td>
<td class="value"><& /Elements/SelectOwner,
    Name     => $NamePrefix ."Owner",
    QueueObj => $QueueObj,
    Default  => $value_cb->('Owner') || $session{'CurrentUser'}->Id,
&></td></tr>
% }

% unless ( $SkipField{'TimeFields'} ) {
<tr>
    <td class="label"><&|/l&>Time Worked</&>:</td>
    <td><table><tr>
    <td class="value"><& /Elements/EditTimeValue,
        Name => $NamePrefix .'TimeWorked',
        Default => $value_cb->('TimeWorked') || '',
    &></td>
    <td class="label"><&|/l&>Time Left</&>:</td>
    <td class="value"><& /Elements/EditTimeValue,
        Name => $NamePrefix .'TimeLeft',
        Default => $value_cb->('TimeLeft') || '',
    &></td>
    </tr></table></td>
</tr>
% }

% unless ( $SkipField{'DateFields'} ) {
<tr><td>&nbsp;</td><td valign="top"><&| /Widgets/TitleBox,
    title => loc("Dates"),
    class=> 'ticket-info-dates',
&><table>

<tr><td class="label"><&|/l&>Starts</&>:</td>
<td class="value"><& /Elements/SelectDate, Name => $NamePrefix .'Starts', Default => $value_cb->('Starts') || '' &></td></tr>

<tr><td class="label"><&|/l&>Due</&>:</td>
<td class="value"><& /Elements/SelectDate, Name => $NamePrefix .'Due', Default => $value_cb->('Due') || '' &></td></tr>

</table></&></td></tr>
% }

% if ( ($QueueObj || $TicketObj) && !$SkipField{'CustomFields'} ) {
<& /RTIR/Elements/EditCustomFields,
    %ARGS,
    TicketObj  => undef,
    NamePrefix => $NamePrefix,
    QueueObj   => $QueueObj,
    DefaultsFrom => $TicketObj,
    CFIDPrefix => $NamePrefix,
&>
% }

</table></&></div>

<div class="ticket-create-details">
<&| /Widgets/TitleBox,
    title => loc("Launch Investigation"),
    class => 'ticket-info-message',
&>
<table width="100%" border="0">

% unless ( $SkipField{'Requestors'} || $HideField{'Requestors'} ) {
<tr><td class="label"><&|/l&>Correspondents</&>:</td>
<td class="value"><& /Elements/EmailInput,
    Name => $NamePrefix .'Requestors', Default => $value_cb->('Requestors'), Size => undef,
&></td></tr>
% $m->callback( CallbackName => 'AfterRequestors', ARGSRef => \%ARGS );
% }

% unless ( $SkipField{'Cc'} || $HideField{'Cc'} ) {
<tr><td class="label"><&|/l&>Cc</&>:</td>
<td class="value"><& /Elements/EmailInput,
    Name => $NamePrefix .'Cc', Default => $value_cb->('Cc'), Size => undef,
&></td></tr>
<tr><td>&nbsp;</td><td class="comment">
<i><font size="-2"><&|/l&>(Sends a carbon-copy of this update to a comma-delimited list of
email addresses. These people <b>will</b> receive future updates.)</&></font></i>
</td></tr>
% }

% unless ( $SkipField{'AdminCc'} && $HideField{'AdminCc'} ) {
<tr><td class="label"><&|/l&>Admin Cc</&>:</td>
<td class="value"><& /Elements/EmailInput,
    Name => $NamePrefix .'Cc', Default => $value_cb->('Cc'), Size => undef,
&></td></tr>
<tr><td>&nbsp;</td><td class="comment">
<i><font size="-2"><&|/l&>(Sends a carbon-copy of this update to a comma-delimited list of administrative
email addresses. These people <b>will</b> receive future updates.)</&></font></i>
</td></tr>
% }

% unless ( $SkipField{'Subject'} || $HideField{'Subject'} ) {
<tr><td class="label"><&|/l&>Subject</&>:</td>
<td class="value">
<input type="text" name="<% $NamePrefix %>Subject" size="60" maxsize="100" value="<% $value_cb->('Subject') %>" />
</td></tr>
% }

% if ( !$SkipField{'SignEncrypt'} && RT->Config->Get('GnuPG')->{'Enable'} ) {
<tr><td>&nbsp;</td><td>
<% loc('Sign')%> <& /Widgets/Form/Boolean:InputOnly,
    Name => $NamePrefix .'Sign',
    CurrentValue => $ARGS{ $NamePrefix .'Sign' },
&>
&nbsp;&nbsp;&nbsp;
<% loc('Encrypt')%> <& /Widgets/Form/Boolean:InputOnly,
    Name => $NamePrefix .'Encrypt',
    CurrentValue => $ARGS{ $NamePrefix .'Encrypt' },
&>
</td></tr>
% }

% unless ( $SkipField{'Content'} || $HideField{'Content'} ) {
<tr><td class="labeltop"><&|/l&>Message</&>:</td>
<td>
% if ( RT->Config->Get('ArticleOnTicketCreate')) {
<& /Articles/Elements/BeforeMessageBox, %ARGS, QueueObj => $QueueObj, MessageBoxName => $NamePrefix .'Content' &>
% }
% $m->callback( %ARGS, MessageBoxName => $NamePrefix .'Content',
%    CallbackPage => '/Ticket/Create.html', CallbackName => 'BeforeMessageBox' );
% my $content = $value_cb->('Content');
<& /Elements/MessageBox,
    Name             => $NamePrefix .'Content',
    Default          => $content,
    IncludeSignature => !$content,
    QuoteTransaction => $value_cb->('QuoteTransaction'),
&></td></tr>
% }

% unless ( $SkipField{'Attachments'} ) {
<& /RTIR/Create.html:AttachmentsForm &>
% }

</table></&></div>

<%ARGS>
$NamePrefix => ''
$QueueObj => undef
$TicketObj => undef
%HideField => ()
%SkipField => ()
</%ARGS>
<%INIT>
my $value_cb = sub {
    my $name = shift;
    my $full_name = $NamePrefix . $name;
    my $value;
    $value = $ARGS{     $full_name };
    $value = $ARGS{     $name } unless defined $value;
    $value = ''                 unless defined $value;
    return $value;
};

unless ( $QueueObj ) {
    if ( my $queue = $value_cb->('Queue') ) {
        $QueueObj = RT::Queue->new( $session{'CurrentUser'} );
        $QueueObj->Load( $queue );
    }
}

if ( RT->Config->Get('GnuPG')->{'Enable'} ) {
    foreach ( qw(Sign Encrypt) ) {
        $ARGS{ $NamePrefix . $_ } = $m->comp( '/Widgets/Form/Boolean:Process',
            Name => $NamePrefix . $_,
            DefaultValue => $QueueObj->$_,
            Arguments => \%ARGS,
        );
    }
}

</%INIT>

<%METHOD Process>
<%ARGS>
$NamePrefix => '',
$DefaultsNamePrefix => undef
</%ARGS>
<%INIT>
if ( defined $NamePrefix && length $NamePrefix ) {
    foreach my $k( keys %ARGS ) {
        next unless $k =~ /^\Q$NamePrefix\E(.*)$/;
        if ( defined $ARGS{ $k } && length $ARGS{ $k } ) {
            $ARGS{ $1 } = delete $ARGS{ $k };
        } else {
            delete $ARGS{ $k };
        }
    }
}
if ( $DefaultsNamePrefix && $DefaultsNamePrefix ne $NamePrefix ) {
    foreach my $k( keys %ARGS ) {
        next unless $k =~ /^\Q$DefaultsNamePrefix\E(.*)$/;
        if ( defined $ARGS{ $1 } && length $ARGS{ $1 } ) {
            delete $ARGS{ $k };
        } else {
            $ARGS{ $1 } = delete $ARGS{ $k };
        }
    }
}
delete $ARGS{'DefaultsNamePrefix'};
delete $ARGS{'NamePrefix'};

# deal with custom fields
if ( ($DefaultsNamePrefix||'') ne $NamePrefix ) {
    my $queue = RT::Queue->new( $session{'CurrentUser'} );
    unless ( $queue->Load( $ARGS{'Queue'} ) ) {
        Abort('Queue not found');
    }

    my $prefix = 'Object-RT::Ticket--CustomField-';

    my %cf_map;
    foreach my $k( keys %ARGS ) {
        next unless $k =~ /^\Q$prefix\E(\d+)(.*?)$/;
        my ($cf_id, $rest) = ($1, $2);

        unless ( exists $cf_map{ $cf_id } ) {
            my $src_cf = $queue->LoadCustomFieldByIdentifier($cf_id);
            unless ( $src_cf->id ) {
                $cf_map{ $cf_id } = 0;
                delete $ARGS{ $k };
                RT->Logger->error("Couldn't load CF #$cf_id");
                next;
            }

            my $dst_cf = do {
                my $cfs = $queue->TicketCustomFields;
                $cfs->Limit( FIELD => 'Name', VALUE => $src_cf->Name );
                $cfs->RowsPerPage(1);
                $cfs->First;
            };

            unless ( $dst_cf && $dst_cf->id ) {
                $cf_map{ $cf_id } = 0;
                delete $ARGS{ $k };
                RT->Logger->debug( $src_cf->Name .' is not applied. skipping.' );
                next;
            }
            $cf_map{ $cf_id } = $dst_cf->id;
        }

        if ( $cf_map{ $cf_id }
            && defined $ARGS{ $prefix . $cf_map{ $cf_id } . $rest } 
            && length $ARGS{ $prefix . $cf_map{ $cf_id } . $rest } )
        {
            $ARGS{ $prefix. $cf_map{ $cf_id } . $rest } =
                delete $ARGS{ $k };
        } else {
            delete $ARGS{ $k };
        }
    }
}

my ($Ticket, @results) = CreateTicket(
    Attachments => $session{'Attachments'},
    %ARGS,
);

delete $session{'Attachments'} if $Ticket;
return ($Ticket, @results);
</%INIT>
</%METHOD>
