summaryrefslogtreecommitdiff
path: root/rt/webrt/Ticket
diff options
context:
space:
mode:
Diffstat (limited to 'rt/webrt/Ticket')
-rw-r--r--rt/webrt/Ticket/Attachment/dhandler27
-rwxr-xr-xrt/webrt/Ticket/Create.html199
-rwxr-xr-xrt/webrt/Ticket/Display.html152
-rwxr-xr-xrt/webrt/Ticket/Elements/AddWatchers54
-rwxr-xr-xrt/webrt/Ticket/Elements/EditBasics62
-rwxr-xr-xrt/webrt/Ticket/Elements/EditDates46
-rw-r--r--rt/webrt/Ticket/Elements/EditKeywordSelects45
-rwxr-xr-xrt/webrt/Ticket/Elements/EditLinks109
-rwxr-xr-xrt/webrt/Ticket/Elements/EditPeople37
-rwxr-xr-xrt/webrt/Ticket/Elements/EditWatchers46
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowBasics29
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowDates54
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowDependencies18
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowHistory43
-rw-r--r--rt/webrt/Ticket/Elements/ShowKeywordSelects26
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowLinks61
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowMemberOf12
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowMembers22
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowPeople12
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowReferences27
-rw-r--r--rt/webrt/Ticket/Elements/ShowRequestor35
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowSummary61
-rwxr-xr-xrt/webrt/Ticket/Elements/ShowTransaction162
-rwxr-xr-xrt/webrt/Ticket/Elements/Tabs126
-rwxr-xr-xrt/webrt/Ticket/Elements/ToolBar3
-rwxr-xr-xrt/webrt/Ticket/History.html30
-rwxr-xr-xrt/webrt/Ticket/Modify.html39
-rwxr-xr-xrt/webrt/Ticket/ModifyAll.html124
-rwxr-xr-xrt/webrt/Ticket/ModifyDates.html26
-rwxr-xr-xrt/webrt/Ticket/ModifyLinks.html31
-rwxr-xr-xrt/webrt/Ticket/ModifyPeople.html38
-rwxr-xr-xrt/webrt/Ticket/Update.html110
32 files changed, 1866 insertions, 0 deletions
diff --git a/rt/webrt/Ticket/Attachment/dhandler b/rt/webrt/Ticket/Attachment/dhandler
new file mode 100644
index 000000000..0d646cc0b
--- /dev/null
+++ b/rt/webrt/Ticket/Attachment/dhandler
@@ -0,0 +1,27 @@
+<%perl>
+ my ($ticket, $trans,$attach, $filename);
+ my $arg = $m->dhandler_arg; # get rest of path
+ if ($arg =~ '^(\d+)/(\d+)') {
+ $trans = $1;
+ $attach = $2;
+ }
+ else {
+ Abort("Corrupted attachment URL.");
+ }
+ my $AttachmentObj = new RT::Attachment($session{'CurrentUser'});
+ $AttachmentObj->Load($attach) || Abort("Attachment '$attach' could not be loaded");
+
+
+ unless ($AttachmentObj->id) {
+ Abort("Bad attachment id. Couldn't find attachment '$attach'\n");
+ }
+ unless ($AttachmentObj->TransactionId() == $trans ) {
+ Abort("Bad transaction number for attachment. $trans should be".$AttachmentObj->TransactionId() ."\n");
+
+ }
+ my $content_type = $AttachmentObj->ContentType || 'text/plain';
+ SetContentType($content_type);
+ $m->out($AttachmentObj->Content);
+ $m->abort;
+</%perl>
+
diff --git a/rt/webrt/Ticket/Create.html b/rt/webrt/Ticket/Create.html
new file mode 100755
index 000000000..2c61de03a
--- /dev/null
+++ b/rt/webrt/Ticket/Create.html
@@ -0,0 +1,199 @@
+%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Attic/Create.html,v 1.1 2002-08-12 06:17:09 ivan Exp $
+%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com>
+
+<& /Elements/Header, Title => "Create a new ticket" &>
+<& /Elements/Tabs, current_toptab => "Ticket/Create.html" &>
+<FORM ACTION="Display.html" METHOD="POST" ENCTYPE="multipart/form-data">
+<INPUT TYPE=HIDDEN Name="id" VALUE="new">
+<A NAME="top">
+
+
+[<a class="currenttab">Show basics</a>] [<A HREF="#detail">Show details</a>]
+<BR>
+<& /Elements/TitleBoxStart, contentbg => "#cccccc", title => "Create a new ticket"&>
+<div align=right><input type=submit value="Create"></div>
+<TABLE border=0 cellpadding=0 cellspacing=0>
+<TR><TD>Queue</TD>
+<TD><% $QueueObj->Name %>
+<INPUT TYPE=HIDDEN NAME=Queue Value="<%$QueueObj->Name%>">
+</TD>
+<TD>Status:
+</TD>
+<TD>
+<& /Elements/SelectStatus, Name => "Status", Default=> 'new' &>
+</TD>
+<TD>
+Owner:
+</TD>
+<TD>
+<& /Elements/SelectOwner, Name => "ValueOfOwner", QueueObj => $QueueObj &>
+</TD>
+</TR>
+<TR>
+<TD>
+Requestors:
+</TD>
+<TD COLSPAN=5>
+<INPUT Name="Requestors" Value="<%$session{CurrentUser}->EmailAddress%>" SIZE=40>
+</TD>
+</TR>
+<TR>
+<TD>
+Cc:
+</TD>
+<TD COLSPAN=5>
+ <INPUT NAME="Cc" SIZE=40>
+</TD>
+</TR>
+<TR>
+<TD>
+Admin Cc:
+</TD>
+<TD COLSPAN=5>
+ <INPUT NAME="AdminCc" SIZE=40>
+</TD>
+</TR>
+<TR>
+<TD>
+Subject:
+</TD>
+<TD COLSPAN=5>
+<INPUT Name="Subject" SIZE=60 MAXSIZE=100 value="">
+</TD>
+</TR>
+<TR>
+<TD>
+Attach file:
+</TD>
+<TD COLSPAN=5>
+<INPUT TYPE=FILE NAME="Attach">
+</TD>
+</TR>
+<TR>
+<TD COLSPAN=6>
+Describe the issue below:<br>
+<& /Elements/MessageBox, QuoteTransaction => $QuoteTransaction &>
+
+<BR>
+</TD>
+</TR>
+<TR>
+<TD ALIGN=RIGHT COLSPAN=2>
+</TD>
+</TR>
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit, Label => "Create"&>
+
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+
+<A NAME="detail">
+ [<A HREF="#top">Show basics</a>] [<a class="currenttab">Show details</a>]
+<BR>
+<TABLE WIDTH="100%" BORDER=0>
+<TR>
+<TD WIDTH="50%" VALIGN=TOP>
+
+ <& /Elements/TitleBoxStart, title => 'The Basics',
+ title_class=> 'inverse',
+ color => "#993333" &>
+<TABLE BORDER=0>
+<TR><TD ALIGN=RIGHT>Priority:</TD><TD><input size=3 name="InitialPriority" value="<%$QueueObj->InitialPriority%>"></TD></TR>
+<TR><TD ALIGN=RIGHT>Final Priority:</TD><TD><input size=3 name="FinalPriority" value="<%$QueueObj->FinalPriority%>"></TD></TR>
+<TR><TD ALIGN=RIGHT>Time Worked:</TD><TD><input size=3 name="TimeWorked"></TD></TR>
+<TR><TD ALIGN=RIGHT>Time Left:</TD><TD><input size=3 name="TimeLeft"></TD></TR>
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<BR>
+<BR>
+
+
+ <& /Elements/TitleBoxStart,
+ title_class=> 'inverse',
+ title => "Keyword Selections", color => "#993300"
+ &>
+<TABLE BORDER=0>
+% while ( my $KeywordSelect = $KeywordSelects->Next ) {
+% my $Descendents = $KeywordSelect->KeywordObj->Descendents;
+ <TR><TD ALIGN=RIGHT>
+ <% $KeywordSelect->Name %></TD><TD>
+ <INPUT TYPE="hidden" NAME="KeywordSelectMagic<% $KeywordSelect->id %>" VALUE="1">
+ <SELECT NAME="KeywordSelect-<% $KeywordSelect->id %>"
+ <% $KeywordSelect->Single ? "" : " MULTIPLE " %> SIZE=5>
+%#
+%# All of this cruft is so we have a 'no keyword' selector for single
+%# keywords that's only selected when there's no value.
+%
+% foreach my $kid ( keys %{$Descendents} ) {
+ <OPTION VALUE="<% $kid %>"><% $Descendents->{$kid} %></OPTION>
+% }
+% if ( $KeywordSelect->Single) {
+<OPTION VALUE="" SELECTED>(empty)</OPTION>
+% }
+ </SELECT>
+ </TD></TR>
+% }
+
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+
+</TD>
+
+<TD VALIGN="TOP">
+<& /Elements/TitleBoxStart, title => "Dates",
+ title_class=> 'inverse',
+ color => "#663366" &>
+
+<TABLE BORDER=0>
+<TR><TD ALIGN=RIGHT>Starts:</TD><TD><input size=10 name="Starts"></TD></TR>
+<TR><TD ALIGN=RIGHT>Due:</TD><TD><input size=10 name="Due"></TD></TR>
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<BR>
+<& /Elements/TitleBoxStart, title => 'Relationships',
+ title_class=> 'inverse',
+ titleright => '', color=> "#336633" &>
+
+<i>(Enter ticket ids or URLs, seperated with spaces)</i>
+<TABLE BORDER=0>
+<TR><TD ALIGN=RIGHT>Depends on</TD><TD><input size=10 name="new-DependsOn"></TD></TR>
+<TR><TD ALIGN=RIGHT>Depended on by</TD><TD><input size=10 name="DependsOn-new"></TD></TR>
+<TR><TD ALIGN=RIGHT>Parents</TD><TD><input size=10 name="new-MemberOf"></TD></TR>
+<TR><TD ALIGN=RIGHT>Children</TD><TD><input size=10 name="MemberOf-new"></TD></TR>
+<TR><TD ALIGN=RIGHT>Refers to</TD><TD><input size=10 name="new-RefersTo"></TD></TR>
+<TR><TD ALIGN=RIGHT>Referred to by</TD><TD><input size=10 name="RefersTo-new"></TD></TR>
+
+
+</TABLE>
+<& /Elements/TitleBoxEnd &>
+<BR>
+
+</TD>
+</TR>
+</TABLE>
+<& /Elements/Submit, Label => "Create"&>
+</FORM>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
+
+<%INIT>
+my $QueueObj = new RT::Queue($session{'CurrentUser'});
+$QueueObj->Load($Queue) || Abort("Queue could not be loaded.");
+my $KeywordSelects = $QueueObj->KeywordSelects;
+
+</%INIT>
+
+<%ARGS>
+$DependsOn => undef
+$DependedOnBy => undef
+$MemberOf => undef
+$QuoteTransaction => undef
+$Queue => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Display.html b/rt/webrt/Ticket/Display.html
new file mode 100755
index 000000000..cb0dc2501
--- /dev/null
+++ b/rt/webrt/Ticket/Display.html
@@ -0,0 +1,152 @@
+%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Attic/Display.html,v 1.1 2002-08-12 06:17:09 ivan Exp $
+%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com>
+
+<& /Elements/Header, Title => "Ticket #".$Ticket->Id ." ".$Ticket->Subject &>
+<& /Ticket/Elements/Tabs, Ticket => $Ticket, current_tab => 'Ticket/Display.html?id='.$Ticket->id &>
+
+<& /Elements/ListActions, actions => \@Actions &>
+
+<& /Ticket/Elements/ShowSummary, Ticket => $Ticket &>
+
+
+<BR>
+<& /Ticket/Elements/ShowHistory ,
+ Ticket => $Ticket,
+ Collapsed => $ARGS{'Collapsed'},
+ ShowHeaders => $ARGS{'ShowHeaders'} &>
+
+
+<%ARGS>
+$id => undef
+$Create => undef
+$ShowHeaders => undef
+$Collapsed => undef
+</%ARGS>
+
+<%INIT>
+
+
+ my ($linkid, $message, $tid, $Ticket, @Actions);
+
+$Ticket = new RT::Ticket($session{'CurrentUser'});
+
+unless ($id) {
+ Abort('No ticket specified');
+}
+
+if ($ARGS{'id'} eq 'new') {
+ # {{{ Create a new ticket
+
+ my $Queue = new RT::Queue($session{'CurrentUser'});
+ unless ($Queue->Load($ARGS{'Queue'})) {
+ Abort('Queue not found');
+ }
+
+ unless ($Queue->CurrentUserHasRight('CreateTicket')) {
+ Abort('You have no permission to create tickets in that queue.');
+ }
+
+ my $due = new RT::Date($session{'CurrentUser'});
+ $due->Set(Format => 'unknown', Value => $ARGS{'Due'});
+ my $starts = new RT::Date($session{'CurrentUser'});
+ $starts->Set(Format => 'unknown', Value => $ARGS{'Starts'});
+
+
+ my @Requestors = split(/,/,$ARGS{'Requestors'});
+ my @Cc = split(/,/,$ARGS{'Cc'});
+ my @AdminCc = split(/,/,$ARGS{'AdminCc'});
+
+ my $MIMEObj = MakeMIMEEntity( Subject => $ARGS{'Subject'},
+ From => $ARGS{'From'},
+ Cc => $ARGS{'Cc'},
+ Body => $ARGS{'Content'},
+ AttachmentFieldName => 'Attach');
+
+
+ my %create_args = (
+ Queue=>$ARGS{Queue},
+ Owner=>$ARGS{ValueOfOwner},
+ InitialPriority=> $ARGS{InitialPriority},
+ FinalPriority=> $ARGS{FinalPriority},
+ TimeLeft => $ARGS{TimeLeft},
+ TimeWorked => $ARGS{TimeWorked},
+ Requestor=> \@Requestors,
+ Cc => \@Cc,
+ AdminCc => \@AdminCc,
+ Subject=>$ARGS{Subject},
+ Status=>$ARGS{Status},
+ Due => $due->ISO,
+ Starts => $starts->ISO,
+ MIMEObj => $MIMEObj
+ );
+
+
+ # we need to get any KeywordSelect-<integer> fields into %create_args..
+ grep { $_ =~ /^KeywordSelect-/ && {$create_args{$_} = $ARGS{$_}}} %ARGS;
+
+ my ($id, $Trans, $ErrMsg)= $Ticket->Create(%create_args);
+ unless ($id && $Trans) {
+ Abort($ErrMsg);
+ }
+ my @linktypes = qw( DependsOn MemberOf RefersTo );
+
+ foreach my $linktype (@linktypes) {
+ foreach my $luri (split (/ /,$ARGS{"new-$linktype"})) {
+ $luri =~ s/\s*$//; # Strip trailing whitespace
+ my ($val, $msg) = $Ticket->AddLink( Target => $luri,
+ Type => $linktype);
+ push @Actions, $msg;
+ }
+
+ foreach my $luri (split (/ /,$ARGS{"$linktype-new"})) {
+ my ($val, $msg) = $Ticket->AddLink( Base => $luri,
+ Type => $linktype);
+
+ push @Actions, $msg;
+ }
+ }
+ # don't try to change queue to the current queue
+ delete $ARGS{'Queue'};
+
+ push(@Actions, $ErrMsg);
+ unless ($Ticket->CurrentUserHasRight('ShowTicket')) {
+ Abort("No permission to view newly created ticket #".$Ticket->id.".");
+ }
+ # }}}
+}
+
+else {
+ $Ticket = LoadTicket($ARGS{'id'});
+ unless ($Ticket->CurrentUserHasRight('ShowTicket')) {
+ Abort("No permission to view ticket");
+ }
+
+
+if (defined $ARGS{'Action'}) {
+ if ($ARGS{'Action'} =~ /^(Steal|Kill|Take|SetTold)$/) {
+ my $action = $1;
+ my ($res, $msg)=$Ticket->$action();
+ push(@Actions, $msg);
+ }
+}
+ $ARGS{'UpdateContent'} =~ s/\r\n/\n/g;
+
+ if ($ARGS{'UpdateContent'} &&
+ $ARGS{'UpdateContent'} ne '' &&
+ $ARGS{'UpdateContent'} ne "-- \n" .
+ $session{'CurrentUser'}->UserObj->Signature
+ ) {
+ ProcessUpdateMessage(ARGSRef=>\%ARGS,
+ Actions=>\@Actions,
+ TicketObj=>$Ticket);
+ }
+#Process status updates
+my @BasicActions = ProcessTicketBasics(ARGSRef => \%ARGS, TicketObj=>$Ticket);
+
+push (@Actions, @BasicActions);
+}
+</%INIT>
+
+
+
+
diff --git a/rt/webrt/Ticket/Elements/AddWatchers b/rt/webrt/Ticket/Elements/AddWatchers
new file mode 100755
index 000000000..053cff122
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/AddWatchers
@@ -0,0 +1,54 @@
+<BR>
+<%$msg%><br>
+
+Add new watchers:<br>
+
+<table>
+% if ($Users) {
+<tr><td>
+Type
+</td><td>
+Username
+</td></tr>
+% while (my $u = $Users->Next ) {
+<tr><td><&/Elements/SelectWatcherType, Name => "WatcherTypeUser".$u->Id &></td><td><%$u->Name%> (<%$u->RealName%>)</td></tr>
+% }
+% }
+
+<tr><td>
+Type
+</td><td>
+Email
+</td></tr>
+<tr><td>
+<&/Elements/SelectWatcherType, Name => "WatcherTypeEmail1" &>
+</td><td>
+<input name="WatcherAddressEmail1" size=15>
+</td></tr>
+<tr><td>
+<&/Elements/SelectWatcherType, Name => "WatcherTypeEmail2" &>
+</td><td>
+<input name="WatcherAddressEmail2" size=15>
+</td></tr>
+<tr><td>
+<&/Elements/SelectWatcherType, Name => "WatcherTypeEmail3" &>
+</td><td>
+<input name="WatcherAddressEmail3" size=15>
+</td></tr>
+</table>
+
+<%INIT>
+my ($msg, $Users);
+if ($UserString) {
+ $Users = new RT::Users($session{'CurrentUser'});
+ $Users->Limit(FIELD => $UserField,
+ VALUE => $UserString,
+ OPERATOR => $UserOp);
+ }
+</%INIT>
+
+<%ARGS>
+$UserField => 'Name'
+$UserOp => '='
+$UserString => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/EditBasics b/rt/webrt/Ticket/Elements/EditBasics
new file mode 100755
index 000000000..12142879e
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/EditBasics
@@ -0,0 +1,62 @@
+<TABLE>
+<TR>
+<TD COLSPAN=6>
+ Subject<BR>
+ <input name=Subject value="<%$TicketObj->Subject|h%>" SIZE=50>
+</TD>
+</TR>
+<TR>
+<TD>
+<& /Elements/ShadedBox,
+ title => 'Status',
+ content => $SelectStatus
+&>
+</TD>
+<TD>
+
+<& /Elements/ShadedBox,
+ title => 'Time Worked',
+ content => "<input name=TimeWorked value=\"".$TicketObj->TimeWorked."\" SIZE=5>"
+&>
+
+</TD>
+<TD>
+<& /Elements/ShadedBox,
+ title => 'Time Left',
+ content => "<input name=TimeLeft value=\"".$TicketObj->TimeLeft."\" SIZE=5>"
+&>
+</TD>
+<TD>
+<& /Elements/ShadedBox,
+ title => 'Priority',
+ content => "<input name=Priority value=\"".$TicketObj->Priority."\" SIZE=3>"
+&>
+
+</TD>
+<TD>
+<& /Elements/ShadedBox,
+ title => 'Final Priority',
+ content => "<input name=FinalPriority value=\"".$TicketObj->FinalPriority."\" SIZE=3>"
+&>
+
+
+</TD>
+<TD>
+<& /Elements/ShadedBox,
+ title => 'Queue',
+ content => "$SelectQueue"
+ &>
+</TD>
+</TR>
+</TABLE>
+
+<%INIT>
+#It's hard to do this inline, so we'll preload the html of the selectstatus in here.
+my $SelectStatus = $m->scomp("/Elements/SelectStatus", Name => 'Status', Default=> $TicketObj->Status);
+my $SelectQueue = $m->scomp("/Elements/SelectQueue", Name => 'Queue', Default =>$TicketObj->QueueObj->Id);
+
+</%INIT>
+<%ARGS>
+
+$TicketObj => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/EditDates b/rt/webrt/Ticket/Elements/EditDates
new file mode 100755
index 000000000..f04130bde
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/EditDates
@@ -0,0 +1,46 @@
+<TABLE>
+<TR>
+<TD>
+Starts:
+</TD>
+<TD>
+<& /Elements/SelectDate, menu_prefix => 'Starts', current => 0 &>
+ (<% $TicketObj->StartsObj->AsString %>)
+</TD>
+</TR>
+<TR>
+<TD>
+Started:
+</TD>
+<TD>
+<& /Elements/SelectDate, menu_prefix => 'Started', current => 0 &> (<%$TicketObj->StartedObj->AsString %>)
+
+
+
+</TD>
+</TR>
+
+<TR>
+<TD>
+Last Contact:
+</TD>
+<TD>
+<& /Elements/SelectDate, menu_prefix => 'Told', current => 0 &> (<% $TicketObj->ToldObj->AsString %>)
+
+</TD>
+</TR>
+<TR>
+<TD>
+Due:
+</TD>
+<TD>
+
+<& /Elements/SelectDate, menu_prefix => 'Due', current => 0 &> (<% $TicketObj->DueObj->AsString %>)
+</TD>
+</TR>
+
+</TABLE>
+<%ARGS>
+$TicketObj => undef
+</%ARGS>
+
diff --git a/rt/webrt/Ticket/Elements/EditKeywordSelects b/rt/webrt/Ticket/Elements/EditKeywordSelects
new file mode 100644
index 000000000..34ade9f25
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/EditKeywordSelects
@@ -0,0 +1,45 @@
+
+<TABLE>
+ <TR>
+% while ( my $KeywordSelect = $KeywordSelects->Next ) {
+% my $CurrentKeywords = $TicketObj->KeywordsObj($KeywordSelect->id);
+% my $Descendents = $KeywordSelect->KeywordObj->Descendents;
+ <TD VALIGN=TOP>
+ <% $KeywordSelect->Name %>
+ <BR>
+ <INPUT TYPE="hidden" NAME="KeywordSelectMagic<% $KeywordSelect->id %>" VALUE="1">
+ <SELECT NAME="KeywordSelect<% $KeywordSelect->id %>"
+ <% $KeywordSelect->Single ? "" : " MULTIPLE " %> SIZE=5>
+%#
+%#
+%# All of this cruft is so we have a 'no keyword' selector for single
+%# keywords that's only selected when there's no value.
+%
+% my $selected_keywords = 0;
+% foreach my $kid ( keys %{$Descendents} ) {
+% my $selected = 0;
+% if ($CurrentKeywords->HasEntry($kid)) { $selected_keywords++; $selected=1;}
+ <OPTION VALUE="<% $kid %>"
+ <% $selected && 'SELECTED'%>>
+ <% $Descendents->{$kid} %>
+ </OPTION>
+% }
+% if ( $KeywordSelect->Single) {
+<OPTION VALUE="" <% ($selected_keywords == 0) && 'SELECTED' %> >(empty)</OPTION>
+% }
+ </SELECT>
+ </TD>
+% }
+ </TR>
+
+</TABLE>
+
+
+<%INIT>
+my $KeywordSelects = $TicketObj->QueueObj->KeywordSelects;
+</%INIT>
+
+<%ARGS>
+$TicketObj => undef
+</%ARGS>
+
diff --git a/rt/webrt/Ticket/Elements/EditLinks b/rt/webrt/Ticket/Elements/EditLinks
new file mode 100755
index 000000000..b0296fce1
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/EditLinks
@@ -0,0 +1,109 @@
+%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Elements/Attic/EditLinks,v 1.1 2002-08-12 06:17:09 ivan Exp $
+%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com>
+
+
+<TABLE>
+<TR>
+<TD VALIGN=TOP>
+<h3>New Relationships</h3>
+<i>Enter tickets or URIs to link tickets to. Seperate multiple entries with spaces.</i><br>
+<TABLE>
+<TR><TD>Merge into:</TD><TD><input name="<%$Ticket->Id%>-MergeInto"> <i>(only one ticket)</i></TD></TR>
+<TR><TD>Depends on:</TD><TD><input name="<%$Ticket->Id%>-DependsOn"></TD></TR>
+<TR><TD>Depended on by:</TD><TD><input name="DependsOn-<%$Ticket->Id%>"></TD></TR>
+<TR><TD>Parents:</TD><TD><input name="<%$Ticket->Id%>-MemberOf"></TD></TR>
+<TR><TD>Children:</TD><TD> <input name="MemberOf-<%$Ticket->Id%>"></TD></TR>
+<TR><TD>Refers to:</TD><TD><input name="<%$Ticket->Id%>-RefersTo"></TD></TR>
+<TR><TD>Referred to by:</TD><TD> <input name="RefersTo-<%$Ticket->Id%>"></TD></TR>
+</TABLE>
+</TD>
+<TD VALIGN=TOP WIDTH=50%>
+<h3>Current Relationships</h3>
+<i>(Check boxes to delete)</i><br>
+
+Depends on:<BR>
+<UL>
+% while (my $link = $Ticket->DependsOn->Next) {
+% my $member = $link->TargetObj;
+<LI>
+<INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>">
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+
+% }
+</UL>
+
+Depended on by:<BR>
+<UL>
+% while (my $link = $Ticket->DependedOnBy->Next) {
+% my $member = $link->BaseObj;
+<LI>
+<INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-">
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+% }
+</UL>
+
+Parents:<BR>
+<UL>
+% while (my $link = $Ticket->MemberOf->Next) {
+% my $member = $link->TargetObj;
+<LI>
+<INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>">
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+
+% }
+</UL>
+
+Children:<BR>
+<UL>
+% while (my $link = $Ticket->Members->Next) {
+<LI>
+<INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-">
+% my $member = $link->BaseObj;
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+% }
+</UL>
+
+
+Refers to:<BR>
+<UL>
+% while (my $link = $Ticket->RefersTo->Next) {
+<LI>
+<INPUT TYPE=CHECKBOX NAME="DeleteLink--<%$link->Type%>-<%$link->Target%>">
+% if ($link->TargetIsLocal) {
+% my $member = $link->TargetObj;
+
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+<A HREF="<%$link->TargetAsHREF%>"><%$link->Target%></A>
+% }
+%}
+</UL>
+
+Referred to by:<BR>
+<UL>
+% while (my $link = $Ticket->ReferredToBy->Next) {
+<LI>
+<INPUT TYPE=CHECKBOX NAME="DeleteLink-<%$link->Base%>-<%$link->Type%>-">
+% if ($link->BaseIsLocal) {
+% my $member = $link->BaseObj;
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+<A HREF="<%$link->BaseAsHREF%>"><%$link->Base%></A>
+%}
+% }
+</UL>
+
+
+</TD>
+</TR>
+</TABLE>
+
+
+
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/EditPeople b/rt/webrt/Ticket/Elements/EditPeople
new file mode 100755
index 000000000..4f69af970
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/EditPeople
@@ -0,0 +1,37 @@
+
+<TABLE>
+<TR>
+<TD VALIGN=TOP>
+
+<h3>New watchers</h3>
+Find people whose<BR>
+<& /Elements/SelectUsers &>
+<input type=submit name="OnlySearchForPeople" value="Go!">
+
+<& AddWatchers, Ticket => $Ticket, UserString => $UserString,
+ UserOp => $UserOp, UserField => $UserField &>
+</TD><TD VALIGN=TOP>
+<h3>Owner</h3>
+Owner: <& /Elements/SelectOwner, Name => 'Owner', QueueObj => $Ticket->QueueObj, TicketObj => $Ticket, Default => $Ticket->OwnerObj->Id &>
+<h3>Current watchers</h3>
+(Check box to delete)<br>
+
+Requestors:
+<& EditWatchers, TicketObj => $Ticket, Type => 'requestors' &>
+
+Cc:
+<& EditWatchers, TicketObj => $Ticket, Type => 'cc' &>
+
+Administrative Cc:
+<& EditWatchers, TicketObj => $Ticket, Type => 'admincc' &>
+
+</TD>
+</TR>
+</TABLE>
+
+<%ARGS>
+$UserField => undef
+$UserOp => undef
+$UserString => undef
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/EditWatchers b/rt/webrt/Ticket/Elements/EditWatchers
new file mode 100755
index 000000000..00185e8f9
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/EditWatchers
@@ -0,0 +1,46 @@
+%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Elements/Attic/EditWatchers,v 1.1 2002-08-12 06:17:09 ivan Exp $
+%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com>
+
+<ul>
+
+%# Print out a placeholder if there are none.
+%if ($watchers->Count == 0 ) {
+<li><i>none</i>
+% }
+
+
+%while (my $watcher=$watchers->Next) {
+<li>
+<INPUT TYPE=CHECKBOX NAME="DelWatcher<%$watcher->id%>" UNCHECKED>
+%#If there's a principal backing this user, lets give a link to their
+%# account
+%if ($watcher->IsUser) {
+<a href="<%$RT::WebPath%>/Admin/Users/Modify.html?id=<%$watcher->OwnerObj->id%>">
+<%$watcher->OwnerObj->RealName%></a>:
+%} else {
+Email address:
+%}
+<i><%$watcher->Email%></i>
+%}
+</ul>
+<%INIT>
+my ($watchers, $watcher, $set);
+if ($Type =~ /^request/i) {
+ $watchers = $TicketObj->Requestors;
+ }
+elsif ($Type =~ /^admin/i) {
+ $watchers = $TicketObj->AdminCc;
+ }
+elsif ($Type =~ /^cc/i) {
+ $watchers = $TicketObj->Cc;
+ }
+else { $watchers = $TicketObj->Watchers;
+ }
+</%INIT>
+<%ARGS>
+$TicketObj => undef
+$Type => undef
+</%ARGS>
+
+
+
diff --git a/rt/webrt/Ticket/Elements/ShowBasics b/rt/webrt/Ticket/Elements/ShowBasics
new file mode 100755
index 000000000..97c84c9d0
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowBasics
@@ -0,0 +1,29 @@
+ <TABLE WIDTH="100%">
+ <TR>
+ <TD VALIGN=TOP WIDTH="20%">
+ <& /Elements/ShadedBox, title => 'Id' , content => $Ticket->Id &>
+ </TD>
+ <TD VALIGN=TOP WIDTH="20%"> <& /Elements/ShadedBox, title => 'Status' , content => $Ticket->Status &>
+ </TD>
+ <TD VALIGN=TOP WIDTH="20%">
+ <& /Elements/ShadedBox, title => 'Worked' , content => $TimeWorked ." min" &>
+ </TD>
+ <TD VALIGN=TOP WIDTH="20%">
+ <& /Elements/ShadedBox, title => 'Priority', content=> $Ticket->Priority."/".$Ticket->FinalPriority &>
+ </TD>
+ <TD VALIGN=TOP WIDTH="20%">
+ <& /Elements/ShadedBox, title => 'Queue', content=> $Ticket->QueueObj->Name &>
+ </TD>
+
+
+ </TR>
+ </TABLE>
+<%INIT>
+my $TimeWorked = $Ticket->TimeWorked;
+if ($Ticket->TimeLeft > 0 ) {
+ $TimeWorked = $Ticket->TimeWorked."/".$Ticket->TimeLeft;
+}
+</%INIT>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowDates b/rt/webrt/Ticket/Elements/ShowDates
new file mode 100755
index 000000000..e17e31355
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowDates
@@ -0,0 +1,54 @@
+<TABLE>
+<TR>
+<TD>
+Created:
+</TD>
+<TD>
+<% $Ticket->CreatedObj->AsString %>
+</TD>
+</TR>
+<TR>
+<TD>
+Starts:
+</TD>
+<TD>
+<% $Ticket->StartsObj->AsString %> <BR>
+</TD>
+</TR>
+<TR>
+<TD>
+Started:
+</TD>
+<TD>
+<% $Ticket->StartedObj->AsString %>
+</TD>
+</TR>
+
+<TR>
+<TD>
+<a href="Display.html?id=<%$Ticket->id%>&Action=SetTold">Last Contact</a>:
+</TD>
+<TD>
+<% $Ticket->ToldObj->AsString %>
+</TD>
+</TR>
+<TR>
+<TD>
+Due:
+</TD>
+<TD><% $Ticket->DueObj->AsString %>
+</TD>
+</TR>
+<TR>
+<TD>
+Updated:
+</TD>
+<TD>
+<A HREF="#lasttrans">
+<% $Ticket->LastUpdated ? ($Ticket->LastUpdatedAsString ." by ".$Ticket->LastUpdatedByObj->Name) : "Never" | h %></a>
+</TD>
+</TR>
+</TABLE>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowDependencies b/rt/webrt/Ticket/Elements/ShowDependencies
new file mode 100755
index 000000000..488652f83
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowDependencies
@@ -0,0 +1,18 @@
+Depends on:<BR>
+% while (my $Link = $Ticket->DependsOn->Next) {
+% my $member = $Link->TargetObj;
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+ <br>
+% }
+Depended on by:<BR>
+% while (my $Link = $Ticket->DependedOnBy->Next) {
+% my $member = $Link->TargetObj;
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+ <br>
+% }
+
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowHistory b/rt/webrt/Ticket/Elements/ShowHistory
new file mode 100755
index 000000000..155eaaabd
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowHistory
@@ -0,0 +1,43 @@
+<TABLE BORDER=0 width="100%">
+<TR>
+<TD ALIGN=LEFT>
+% if ($ShowTitle) {
+<font size=+3>History</font>
+% }
+&nbsp;</TD>
+<TD align=right><font size=-1>Display mode:
+% if ($ShowHeaders == $Ticket->Id) {
+[<A HREF="<%$URIFile%>?id=<%$Ticket->id%>">Brief headers</a>]
+<b>[Full headers]</b>
+% } else {
+<b>[Brief headers]</b>
+[<A HREF="<%$URIFile%>?ShowHeaders=<%$Ticket->Id%>&id=<%$Ticket->id%>">Full headers</a>]
+% }
+</font>
+</TD>
+</TR>
+</TABLE>
+
+<TABLE WIDTH=100% CELLSPACING=0 CELLPADDING=2 BORDER=0>
+% while (my $Transaction = $Transactions->Next) {
+% $i++;
+% if ($Transactions->IsLast) {
+ <a name="lasttrans"></a>
+% }
+ <& ShowTransaction, Ticket => $Ticket, Transaction => $Transaction, ShowHeaders => $ShowHeaders, Collapsed => $Collapsed, RowNum => $i &>
+% }
+</TABLE>
+<%INIT>
+
+my $Transactions = $Ticket->Transactions;
+my $i;
+
+
+</%INIT>
+<%ARGS>
+$URIFile => 'Display.html'
+$Ticket => undef
+$ShowHeaders => undef
+$Collapsed => undef
+$ShowTitle => 1
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowKeywordSelects b/rt/webrt/Ticket/Elements/ShowKeywordSelects
new file mode 100644
index 000000000..4f8a1786b
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowKeywordSelects
@@ -0,0 +1,26 @@
+<TABLE>
+% while ( my $KeywordSelect = $KeywordSelects->Next ) {
+ <TR>
+ <TD VALIGN=TOP>
+ <% $KeywordSelect->Name %><BR>
+ </TD>
+ <TD VALIGN=TOP>
+ <UL>
+% my $Keywords = $Ticket->KeywordsObj($KeywordSelect->Id);
+% while (my $Keyword = $Keywords->Next) {
+ <li><% $Keyword->KeywordObj->RelativePath($KeywordSelect->KeywordObj) |n %></li>
+
+% }
+ </ul>
+ </TD>
+ </TR>
+% }
+</TABLE>
+
+<%INIT>
+my $KeywordSelects = $Ticket->QueueObj->KeywordSelects;
+</%INIT>
+
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowLinks b/rt/webrt/Ticket/Elements/ShowLinks
new file mode 100755
index 000000000..49795959e
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowLinks
@@ -0,0 +1,61 @@
+Depends on:<BR>
+<UL>
+% while (my $Link = $Ticket->DependsOn->Next) {
+% my $member = $Link->TargetObj;
+<LI><a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+
+% }
+</UL>
+
+Depended on by:<BR>
+<UL>
+% while (my $Link = $Ticket->DependedOnBy->Next) {
+% my $member = $Link->BaseObj;
+<LI><a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+% }
+</UL>
+Parents:<BR>
+<UL>
+% while (my $Link = $Ticket->MemberOf->Next) {
+% my $member = $Link->TargetObj;
+<LI><a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%>
+[<%$member->Status%>]
+
+% }
+</UL>
+
+Children:<BR>
+<& /Ticket/Elements/ShowMembers, Ticket => $Ticket &>
+<BR>
+Refers to:<BR>
+<UL>
+% while (my $Link = $Ticket->RefersTo->Next) {
+<LI>
+% if ($Link->TargetIsLocal) {
+% my $member = $Link->TargetObj;
+
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+<A HREF="<%$Link->TargetAsHREF%>"><%$Link->Target%></A>
+% }
+%}
+</UL>
+
+Referred to by:<BR>
+<UL>
+% while (my $Link = $Ticket->ReferredToBy->Next) {
+<LI>
+% if ($Link->BaseIsLocal) {
+% my $member = $Link->BaseObj;
+<a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+<A HREF="<%$Link->BaseAsHREF%>"><%$Link->Base%></A>
+%}
+% }
+</UL>
+
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowMemberOf b/rt/webrt/Ticket/Elements/ShowMemberOf
new file mode 100755
index 000000000..df5dc92b0
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowMemberOf
@@ -0,0 +1,12 @@
+<UL>
+% my $memberof = $Ticket->MemberOf;
+% while (my $member_of = $memberof->Next) {
+<LI><a href="/Ticket/Display.html?id=<%$member_of->Id%>"><%$member_of->Id%></a>: <%$member_of->Subject%> [<%$member_of->Status%>]
+% }
+</UL>
+
+<%INIT>
+</%INIT>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowMembers b/rt/webrt/Ticket/Elements/ShowMembers
new file mode 100755
index 000000000..0a6f12377
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowMembers
@@ -0,0 +1,22 @@
+% if ($members->Count) {
+<UL>
+% while (my $link = $members->Next) {
+% my $member= $link->BaseObj;
+<LI><a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: <%$member->Subject%> [<%$member->Status%>]<br>
+% if ($depth < 8) {
+<&/Ticket/Elements/ShowMembers, Ticket => $member, depth => ($depth+1) &>
+% }
+% }
+</UL>
+% }
+
+<%INIT>
+
+my $members = $Ticket->Members;
+
+</%INIT>
+
+<%ARGS>
+$Ticket => undef
+$depth => 1
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowPeople b/rt/webrt/Ticket/Elements/ShowPeople
new file mode 100755
index 000000000..ff35f484d
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowPeople
@@ -0,0 +1,12 @@
+Owner<BR>
+&nbsp;<B><%$Ticket->OwnerObj->Name%></B><BR>
+Requestors<BR>
+&nbsp;<B><%$Ticket->RequestorsAsString%></B><BR>
+Cc<BR>
+&nbsp;<B><%$Ticket->CcAsString%></B><BR>
+AdminCc<BR>
+&nbsp;<B><%$Ticket->AdminCcAsString%></B>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
+
diff --git a/rt/webrt/Ticket/Elements/ShowReferences b/rt/webrt/Ticket/Elements/ShowReferences
new file mode 100755
index 000000000..37e2fdece
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowReferences
@@ -0,0 +1,27 @@
+<UL>
+% while (my $Link = $Ticket->RefersTo->Next) {
+<LI>
+% if ($Link->TargetIsLocal) {
+% my $member = $Link->TargetObj;
+
+<a href="/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+<A HREF="<%$Link->TargetAsHREF%>"><%$Link->Target%></A>
+% }
+%}
+
+
+
+% while (my $Link = $Ticket->ReferredToBy->Next) {
+<LI>
+% if ($Link->BaseIsLocal) {
+% my $member = $Link->BaseObj;
+<a href="/Ticket/Display.html?id=<%$member->Id%>"><%$member->Id%></a>: (<%$member->OwnerObj->Name%>) <%$member->Subject%> [<%$member->Status%>]<br>
+% } else {
+<A HREF="<%$Link->BaseAsHREF%>"><%$Link->Base%></A>
+%}
+% }
+</UL>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowRequestor b/rt/webrt/Ticket/Elements/ShowRequestor
new file mode 100644
index 000000000..fcbe71df1
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowRequestor
@@ -0,0 +1,35 @@
+<%PERL>
+my $people = $Ticket->Requestors;
+while (my $requestor=$people->Next) {
+if (($requestor->Owner ) && (my $user=$requestor->OwnerObj)) {
+my $name=$user->RealName || $user->EmailAddress;
+my $tickets = new RT::Tickets($session{'CurrentUser'});
+$tickets->LimitRequestor(VALUE => $user->EmailAddress);
+$tickets->LimitStatus( VALUE => 'open');
+$tickets->LimitStatus( VALUE => 'new');
+$tickets->RowsPerPage(25);
+$tickets->OrderBy(FIELD => 'Priority',
+ ORDER => 'DESC');
+</%PERL>
+
+% unless ($user->Privileged) {
+<& /Elements/TitleBoxStart,
+ title => "<a class='inverse' href=\"$RT::WebPath/Admin/Users/Modify.html?id=".$user->id."\">More about $name</a>" &>
+
+Comments about this user:<BR>
+<B><% ($user->Comments || "No comment entered about this user") %></B><BR>
+
+This user's 25 highest priority tickets:<BR>
+<UL>
+%while (my $w=$tickets->Next) {
+<LI><%$w->Id%>: <a href="<%$RT::WebPath%>/Ticket/Display.html?id=<%$w->id%>"><%$w->Subject%></a> (<%$w->Status%>)
+%}
+</UL>
+<& /Elements/TitleBoxEnd &>
+
+% }
+% }
+%}
+<%ARGS>
+$Ticket=>undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ShowSummary b/rt/webrt/Ticket/Elements/ShowSummary
new file mode 100755
index 000000000..b80ceb4fd
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowSummary
@@ -0,0 +1,61 @@
+ <TABLE WIDTH="100%" >
+ <TR>
+ <TD VALIGN=TOP >
+ <& /Elements/TitleBoxStart, title => 'The Basics',
+ title_href =>"$RT::WebPath/Ticket/Modify.html?id=".$Ticket->Id,
+ title_class=> 'inverse',
+ color => "#993333" &>
+ <& /Ticket/Elements/ShowBasics, Ticket => $Ticket &>
+ <& /Elements/TitleBoxEnd &>
+
+ <BR>
+
+ <& /Elements/TitleBoxStart,
+ title_href =>"$RT::WebPath/Ticket/Modify.html?id=".$Ticket->Id,
+ title_class=> 'inverse',
+ title => "Keyword Selections", color => "#993300"
+ &>
+ <& /Ticket/Elements/ShowKeywordSelects, Ticket => $Ticket &>
+ <& /Elements/TitleBoxEnd &>
+
+
+
+ <BR>
+ <& /Elements/TitleBoxStart, title => 'Relationships',
+ title_href => "$RT::WebPath/Ticket/ModifyLinks.html?id=".$Ticket->Id,
+ title_class=> 'inverse',
+ titleright => '', color=> "#336633" &>
+ <& /Ticket/Elements/ShowLinks, Ticket => $Ticket &>
+ <& /Elements/TitleBoxEnd &>
+ </TD>
+ <BR>
+ <TD VALIGN=TOP >
+
+ <& /Elements/TitleBoxStart, title => "Dates",
+ title_href =>"$RT::WebPath/Ticket/ModifyDates.html?id=".$Ticket->Id,
+ title_class=> 'inverse',
+ color => "#663366" &>
+ <& /Ticket/Elements/ShowDates, Ticket => $Ticket &>
+ <& /Elements/TitleBoxEnd &>
+ <BR>
+ <& /Elements/TitleBoxStart, title => 'People',
+ title_href =>"$RT::WebPath/Ticket/ModifyPeople.html?id=".$Ticket->Id,
+ title_class=> 'inverse',
+ color => "#333399" &>
+ <& /Ticket/Elements/ShowPeople, Ticket => $Ticket &>
+ <& /Elements/TitleBoxEnd &>
+ <BR>
+
+ <& /Ticket/Elements/ShowRequestor, Ticket => $Ticket &>
+
+
+ </TD>
+ </TR>
+ </TABLE>
+<%ARGS>
+$Ticket => undef
+</%ARGS>
+
+
+
+
diff --git a/rt/webrt/Ticket/Elements/ShowTransaction b/rt/webrt/Ticket/Elements/ShowTransaction
new file mode 100755
index 000000000..a0da008b3
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ShowTransaction
@@ -0,0 +1,162 @@
+<TR bgcolor="<%$rowbgcolor%>">
+<TD bgcolor="<%$bgcolor%>"><A NAME="#<%$Transaction->Id%>"></A>&nbsp&nbsp;</TD>
+<TD>&nbsp&nbsp;</TD>
+<TD><font size=-2><% $transdate|n %></font>&nbsp;</TD>
+<TD ALIGN="LEFT"><b><%$Transaction->CreatorObj->Name%> - <%$TicketString%> <%$Transaction->BriefDescription%>
+
+</b></TD>
+<TD><%$TimeTaken%>&nbsp;</TD>
+<TD ALIGN="RIGHT"><font size=-1><%$titlebar_commands|n%></font></TD>
+</TR>
+<%PERL>
+
+unless ($Collapsed) {
+ $attachments->GotoFirstItem;
+ while (my $message=$attachments->Next) {
+ #we don't want to show any empty transactions, unless they have kids
+ next unless (length $message->Content || $message->Children->Count);
+ my ($headers, $content);
+
+ </%PERL>
+
+
+<%PERL>
+ if ($message->Parent == 0) {
+ if ($ShowHeaders == $Ticket->Id) {
+ $headers = $message->Headers;
+ } else {
+ $headers = $message->NiceHeaders;
+ }
+ chomp $headers;
+ $headers .= "\n\n" if ($headers);
+ }
+ # 13456 is a random # of about the biggest size we want to see inline text
+ my $MAX_INLINE_BODY = 13456;
+ if ($message->ContentType =~ m{^(text/plain|message|text$)}i &&
+ length($message->Content)< $MAX_INLINE_BODY ) {
+
+ $content = $message->Content;
+
+ my $wrapper = new Text::Wrapper (columns=>85);
+ $content = $wrapper->wrap($content);
+ $content =~ s/&/&amp;/g;
+ $content =~ s/</&lt;/g;
+ $content =~ s/>/&gt;/g;
+ $content =~ s!((?:http|https|ftp|mailto):\S*?)([\s"']|&gt;|\.[\n])!<A HREF=\"$1\" TARGET=new>$1</A>$2!g;
+
+
+ }
+ else {
+ $content = "&nbsp;";
+ }
+
+</%PERL>
+<TR BGCOLOR="<%$rowbgcolor%>">
+ <TD BGCOLOR="<%$bgcolor%>">&nbsp;&nbsp;</TD>
+ <TD>&nbsp&nbsp;</TD>
+ <TD COLSPAN=3 VALIGN=TOP>
+ <PRE>
+<%$headers%><%$content|n%>
+</PRE>
+ </TD>
+ <TD VALIGN=TOP ALIGN=RIGHT>
+
+% if ($message->Parent == 0 ) {
+<BR>
+% }
+<%PERL>
+my $size = length($message->Content());
+
+if ($size) {
+ if ($size > 1024) {
+ $size = int($size/102.4)/10 . "k";
+ }
+ else {
+ $size = $size ."b";
+ }
+</%PERL>
+<font size=-1><A HREF="Attachment/<%$Transaction->Id%>/<%$message->Id%>/<%$message->Filename%>">Download <%$message->Filename|| '(untitled)'%></a> <% $size %></font>
+% }
+</TD>
+</TR>
+% }
+% }
+
+
+
+<%ARGS>
+$Ticket => undef
+$Transaction => undef
+$ShowHeaders => undef
+$Collapsed => undef
+$ShowTitleBarCommands => 1
+$RowNum => 1
+</%ARGS>
+
+<%INIT>
+
+
+my ($TimeTaken, $TicketString, $bgcolor, $rowbgcolor);
+
+my $transdate = $Transaction->CreatedAsString();
+$transdate =~ s/\s/&nbsp;/g;
+
+if ($RowNum % 2) {
+ $rowbgcolor="#cccccc";
+} else {
+ $rowbgcolor="#ffffff";
+}
+
+if ($Transaction->Type =~ /^(Create|Correspond|Comment$)/) {
+ if ($Transaction->IsInbound) {
+ $bgcolor="#336699";
+ }
+ else {
+ $bgcolor="#339999";
+ }
+} elsif (($Transaction->Field =~ /^Owner$/) or
+ ($Transaction->Type =~ /^(AddWatcher|DelWatcher)$/)) {
+ $bgcolor="#333399";
+
+} elsif ($Transaction->Type =~ /^(AddLink|DeleteLink)$/) {
+ $bgcolor="#336633";
+} elsif ($Transaction->Type =~ /^(Status|Set|Keyword|Told)$/) {
+ if ($Transaction->Field =~ /^(Told|Starts|Started|Due)$/) {
+ $bgcolor="#663366";
+ }
+ else {
+ $bgcolor="#993333";
+ }
+}
+else {
+ $bgcolor="#cccccc";
+}
+
+if ($Ticket->Id != $Transaction->Ticket) {
+ $TicketString = "Ticket ".$Transaction->Ticket .": ";
+}
+
+if ($Transaction->TimeTaken > 0) {
+ $TimeTaken = $Transaction->TimeTaken." min"
+}
+my $attachments = $Transaction->Attachments;
+
+my $titlebar_commands='&nbsp;';
+
+# If the transaction has anything attached to it at all
+if ($Transaction->Message->First && $ShowTitleBarCommands) {
+ if ($Transaction->TicketObj->CurrentUserHasRight('ReplyToTicket')) {
+ $titlebar_commands .=
+ "[<a href=\"Update.html?id=".
+ $Transaction->Ticket . "&QuoteTransaction=".$Transaction->Id.
+ "&Action=Respond\">Reply</a>]&nbsp;";
+ }
+ if ($Transaction->TicketObj->CurrentUserHasRight('CommentOnTicket')) {
+ $titlebar_commands .=
+ "[<a href=\"Update.html?id=".$Transaction->Ticket.
+ "&QuoteTransaction=".$Transaction->Id.
+ "&Action=Comment\">Comment</a>]";
+ }
+}
+
+</%INIT>
diff --git a/rt/webrt/Ticket/Elements/Tabs b/rt/webrt/Ticket/Elements/Tabs
new file mode 100755
index 000000000..8cce197de
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/Tabs
@@ -0,0 +1,126 @@
+<& /Elements/Tabs, tabs => $tabs, actions => $actions, current_tab => $current_tab, tabs_scalar => $tabs_scalar &>
+<%INIT>
+
+ my $id = $Ticket->id();
+ my $tabs_scalar = '';
+ my $tabs = {
+ A => { title => 'Display',
+ path => "Ticket/Display.html?id=".$id,
+ },
+
+ Ab => { title => 'History',
+ path => "Ticket/History.html?id=".$id,
+ },
+ B => { title => 'Basics',
+ path => "Ticket/Modify.html?id=".$id,
+ },
+
+ C => { title => 'Dates',
+ path => "Ticket/ModifyDates.html?id=".$id,
+ },
+
+ D => { title => 'People',
+ path => "Ticket/ModifyPeople.html?id=".$id,
+ },
+ E => { title => 'Links',
+ path => "Ticket/ModifyLinks.html?id=".$id,
+ },
+ F => { title => 'Jumbo',
+ path => "Ticket/ModifyAll.html?id=".$id,
+ },
+
+ };
+
+my $actions;
+if ($Ticket->CurrentUserHasRight('ModifyTicket') or
+ $Ticket->CurrentUserHasRight('CommentOnTicket')) {
+ $actions->{'Comment'} =
+ {
+ title => 'Comment',
+ path => "Ticket/Update.html?Action=Comment&id=".$id,
+ }
+ };
+
+if ($Ticket->CurrentUserHasRight('ModifyTicket') or
+ $Ticket->CurrentUserHasRight('ReplyToTicket')) {
+ $actions->{'Reply'} =
+ {
+ title => 'Reply',
+ path => "Ticket/Update.html?Action=Respond&id=".$id,
+ }
+ };
+
+if ($Ticket->CurrentUserHasRight('OwnTicket')) {
+ if ($Ticket->OwnerObj->id == $RT::Nobody->id) {
+ $actions->{'Take'} =
+ {
+ path => "Ticket/Display.html?Action=Take&id=".$id,
+ title => 'Take'
+ };
+ }
+ elsif ( $Ticket->OwnerObj->id != $session{CurrentUser}->id) {
+ $actions->{'Steal'} =
+ {
+ path => "Ticket/Display.html?Action=Steal&id=".$id,
+ title => 'Steal'
+ };
+ }
+}
+
+if ($Ticket->CurrentUserHasRight('ModifyTicket')) {
+ if ($Ticket->Status ne 'resolved') {
+ $actions->{'Resolve'} =
+ {
+
+ path => "Ticket/Update.html?Action=Comment&DefaultStatus=resolved&id=".$id,
+ title => 'Resolve'
+ };
+ }
+ if ($Ticket->Status ne 'open') {
+ $actions->{'Open'} =
+ {
+ path => "Ticket/Display.html?Status=open&id=". $id,
+ title => 'Open'
+ };
+ }
+}
+
+
+
+
+if (defined $session{'tickets'}) {
+ my $items = $session{'tickets'}->ItemsArrayRef();
+ my @indexs = grep(($items->[$_]->id == $Ticket->Id), 0 .. $#{$items});
+
+ if ($items->[0]) {
+
+ if ($items->[$indexs[0]]->id == $Ticket->Id) {
+ # Don't display prev links if we're on the first ticket
+ if ( $items->[0]->id != $Ticket->id ) {
+ $tabs_scalar .= '[<A HREF="Display.html?id='.
+ $items->[0]->id.
+ '">&lt;&lt; First</a>] ';
+ $tabs_scalar .= '[<A HREF="Display.html?id='.
+ $items->[$indexs[0]-1]->id.
+ '">&lt; Prev</a>] ';
+ }
+ # Don't display next links if we're on the last ticket
+ if ( $Ticket->id != $items->[-1]->id ) {
+ $tabs_scalar .= '[<A HREF="Display.html?id='.
+ $items->[$indexs[0]+1]->id.
+ '">Next &gt;</a>] ';
+ $tabs_scalar .= '[<A HREF="Display.html?id='.
+ $items->[-1]->id.
+ '">Last &gt;&gt</a>]';
+ }
+ $tabs_scalar .= "<BR><BR>";
+ }
+ }
+}
+</%INIT>
+
+
+<%ARGS>
+$Ticket => undef
+$current_tab => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/Elements/ToolBar b/rt/webrt/Ticket/Elements/ToolBar
new file mode 100755
index 000000000..108e2f784
--- /dev/null
+++ b/rt/webrt/Ticket/Elements/ToolBar
@@ -0,0 +1,3 @@
+<%ARGS>
+$Ticket => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/History.html b/rt/webrt/Ticket/History.html
new file mode 100755
index 000000000..e0a5fe15a
--- /dev/null
+++ b/rt/webrt/Ticket/History.html
@@ -0,0 +1,30 @@
+%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Attic/History.html,v 1.1 2002-08-12 06:17:09 ivan Exp $
+%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com>
+
+<& /Elements/Header, Title => "Ticket History #".$Ticket->Id ." ".$Ticket->Subject &>
+<& /Ticket/Elements/Tabs, Ticket => $Ticket, current_tab => 'Ticket/History.html?id='.$Ticket->id &>
+
+<BR>
+
+<& /Ticket/Elements/ShowHistory , Ticket => $Ticket, ShowHeaders => $ARGS{'ShowHeaders'}, URIFile => 'History.html' &>
+
+
+<%ARGS>
+$id => undef
+</%ARGS>
+
+<%INIT>
+
+
+
+my $Ticket = LoadTicket ($id);
+
+unless ($Ticket->CurrentUserHasRight('ShowTicket')) {
+ Abort("No permission to view ticket");
+}
+
+</%INIT>
+
+
+
+
diff --git a/rt/webrt/Ticket/Modify.html b/rt/webrt/Ticket/Modify.html
new file mode 100755
index 000000000..7a8a79216
--- /dev/null
+++ b/rt/webrt/Ticket/Modify.html
@@ -0,0 +1,39 @@
+<& /Elements/Header, Title => 'Modify ticket #'.$TicketObj->Id &>
+<& /Ticket/Elements/Tabs, Ticket => $TicketObj, current_tab => "Ticket/Modify.html?id=".$TicketObj->Id &>
+
+<& /Elements/ListActions, actions => \@results &>
+<FORM METHOD=POST ACTION="Modify.html">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$TicketObj->Id%>">
+
+<& /Elements/TitleBoxStart, title => 'Modify ticket #'.$TicketObj->Id,
+ color=> "#993333", width => "100%" &>
+<& Elements/EditBasics, TicketObj => $TicketObj &>
+<& /Elements/TitleBoxEnd &>
+
+<& /Elements/TitleBoxStart, title => 'Keywords', color =>"#993333"&>
+<& Elements/EditKeywordSelects, TicketObj=>$TicketObj &>
+<& /Elements/TitleBoxEnd &>
+
+<& /Elements/Submit, Label => 'Save Changes', Caption => "If you've updated anything above, be sure to", color => "#993333" &>
+</form>
+<%INIT>
+
+my $TicketObj = LoadTicket($id);
+
+my @results = ProcessTicketBasics(TicketObj => $TicketObj, ARGSRef => \%ARGS);
+my @okresults = ProcessTicketObjectKeywords(TicketObj => $TicketObj, ARGSRef => \%ARGS);
+
+push (@results, @okresults);
+
+# TODO: display the results, even if we can't display the ticket
+
+unless ($TicketObj->CurrentUserHasRight('ShowTicket')) {
+ Abort("No permission to view ticket");
+}
+
+</%INIT>
+
+
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/ModifyAll.html b/rt/webrt/Ticket/ModifyAll.html
new file mode 100755
index 000000000..ad913739d
--- /dev/null
+++ b/rt/webrt/Ticket/ModifyAll.html
@@ -0,0 +1,124 @@
+<& /Elements/Header, Title => "Ticket #".$Ticket->Id ." Jumbo update: ".$Ticket->Subject &>
+<& /Ticket/Elements/Tabs, Ticket => $Ticket , current_tab => "Ticket/ModifyAll.html?id=".$Ticket->Id &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM METHOD=POST ACTION="ModifyAll.html" ENCTYPE="multipart/form-data">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>">
+
+
+<& /Elements/TitleBoxStart, title => 'Modify ticket #'.$Ticket->Id, color=> "#993333", width => "100%" &>
+<& Elements/EditBasics, TicketObj => $Ticket &>
+<& /Elements/TitleBoxEnd &>
+
+<BR>
+
+<& /Elements/TitleBoxStart, title => 'Dates', width => "100%", color => "#663366" &>
+<& Elements/EditDates, TicketObj => $Ticket &>
+<& /Elements/TitleBoxEnd &>
+
+<BR>
+
+<& /Elements/TitleBoxStart, title => 'Keywords', color =>"#993333"&>
+<& Elements/EditKeywordSelects, TicketObj=>$Ticket &>
+<& /Elements/TitleBoxEnd &>
+
+<BR>
+
+<& /Elements/TitleBoxStart, title => 'People',width => "100%", color=> "#333399" &>
+<& Elements/EditPeople, Ticket => $Ticket, UserField => $UserField, UserString => $UserString, UserOp => $UserOp &>
+<& /Elements/TitleBoxEnd &>
+
+<BR>
+
+<& /Elements/TitleBoxStart, title => 'Relationships', color => "#336633"&>
+<& Elements/EditLinks, Ticket => $Ticket &>
+<& /Elements/TitleBoxEnd &>
+
+<BR>
+
+<& /Elements/TitleBoxStart, title => 'Update ticket' &>
+<hr>
+Update Type: <select name="UpdateType">
+% if ($CanComment) {
+ <option value="private" >Comments (Not sent to requestors)</option>
+% }
+% if ($CanRespond) {
+ <option value="response">Response to requestors</option>
+% }
+</select>
+<br>
+
+Subject: <input name="UpdateSubject" size=60 value=""> <br>
+Attach: <input name="UpdateAttachment" type=file> <br>
+<& /Elements/MessageBox, Name=>"UpdateContent", QuoteTransaction=>$ARGS{QuoteTransaction} &>
+<& /Elements/TitleBoxEnd &>
+
+
+<& /Elements/Submit, Label => 'Save Changes', Caption => "If you've updated anything above, be sure to", color => "#333399" &>
+</form>
+
+<%INIT>
+
+
+
+my $Ticket = LoadTicket($id);
+
+my $CanRespond = 0;
+my $CanComment = 0;
+
+
+$CanRespond = 1 if ( $Ticket->CurrentUserHasRight('ReplyToTicket') or
+ $Ticket->CurrentUserHasRight('ModifyTicket') );
+
+$CanComment = 1 if ( $Ticket->CurrentUserHasRight('CommentOnTicket') or
+ $Ticket->CurrentUserHasRight('ModifyTicket') );
+
+
+my (@wresults, @results, @okresults, @dresults, @lresults);
+
+unless ($OnlySearchForPeople) {
+ @wresults = ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS);
+ @results = ProcessTicketBasics( TicketObj => $Ticket, ARGSRef => \%ARGS);
+ @okresults = ProcessTicketObjectKeywords(TicketObj => $Ticket, ARGSRef => \%ARGS);
+
+ @dresults = ProcessTicketDates( TicketObj => $Ticket, ARGSRef => \%ARGS);
+ @lresults = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS);
+
+ $ARGS{'UpdateContent'} =~ s/\r\n/\n/g;
+
+ if ($ARGS{'UpdateContent'} &&
+ $ARGS{'UpdateContent'} ne '' &&
+ $ARGS{'UpdateContent'} ne "-- \n" .
+ $session{'CurrentUser'}->UserObj->Signature
+ ) {
+ ProcessUpdateMessage(TicketObj => $Ticket,
+ ARGSRef=>\%ARGS,
+ Actions=>\@results);
+ }
+}
+push @results, @wresults;
+push @results, @dresults;
+push @results, @lresults;
+push @results, @okresults;
+
+# If they've gone and moved the ticket to somewhere they can't see, etc...
+# TODO: display the results, even if we can't display the ticket.
+
+unless ($Ticket->CurrentUserHasRight('ShowTicket')) {
+ Abort("No permission to view ticket");
+}
+
+
+</%INIT>
+
+
+
+<%ARGS>
+$OnlySearchForPeople => undef
+$UserField => undef
+$UserOp => undef
+$UserString => undef
+$id => undef
+</%ARGS>
+
diff --git a/rt/webrt/Ticket/ModifyDates.html b/rt/webrt/Ticket/ModifyDates.html
new file mode 100755
index 000000000..b2ecb68fb
--- /dev/null
+++ b/rt/webrt/Ticket/ModifyDates.html
@@ -0,0 +1,26 @@
+<& /Elements/Header, Title => 'Modify dates for #'. $TicketObj->Id &>
+<& /Ticket/Elements/Tabs, Ticket => $TicketObj, current_tab => "Ticket/ModifyDates.html?id=".$TicketObj->Id &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM METHOD=POST ACTION="ModifyDates.html">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$TicketObj->Id%>">
+<& /Elements/TitleBoxStart, title => 'Modify dates for ticket #'.$TicketObj->Id, width => "100%", color => "#663366" &>
+
+<& Elements/EditDates, TicketObj => $TicketObj &>
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit, color => "#663366" &>
+</form>
+
+
+<%INIT>
+
+my $TicketObj = LoadTicket($id);
+my @results = ProcessTicketDates( TicketObj => $TicketObj, ARGSRef => \%ARGS);
+
+</%INIT>
+
+
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/ModifyLinks.html b/rt/webrt/Ticket/ModifyLinks.html
new file mode 100755
index 000000000..14c939d43
--- /dev/null
+++ b/rt/webrt/Ticket/ModifyLinks.html
@@ -0,0 +1,31 @@
+%# $Header: /home/cvs/cvsroot/freeside/rt/webrt/Ticket/Attic/ModifyLinks.html,v 1.1 2002-08-12 06:17:09 ivan Exp $
+%# Copyright 1996-2000 Jesse Vincent <jesse@fsck.com>
+
+<& /Elements/Header, Title => "Link ticket ".$Ticket->Id &>
+<& /Ticket/Elements/Tabs, Ticket => $Ticket, current_tab => "Ticket/ModifyLinks.html?id=".$Ticket->Id &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<form action="ModifyLinks.html" method="post">
+<input type="hidden" name="id" value="<%$Ticket->id%>">
+
+<& /Elements/TitleBoxStart, title => 'Edit Relationships', color => "#336633"&>
+<& Elements/EditLinks, Ticket => $Ticket &>
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit, color => "#336633", Caption=> 'Save changes' &>
+</form>
+
+
+
+
+<%INIT>
+
+my $Ticket = LoadTicket($id);
+my @results = ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS);
+
+</%INIT>
+
+
+<%ARGS>
+$id => undef
+</%ARGS>
diff --git a/rt/webrt/Ticket/ModifyPeople.html b/rt/webrt/Ticket/ModifyPeople.html
new file mode 100755
index 000000000..fecf09192
--- /dev/null
+++ b/rt/webrt/Ticket/ModifyPeople.html
@@ -0,0 +1,38 @@
+<& /Elements/Header, Title => 'Modify people related to ticket # ' . $Ticket->id &>
+<& /Ticket/Elements/Tabs, Ticket => $Ticket , current_tab => "Ticket/ModifyPeople.html?id=".$Ticket->Id &>
+
+<& /Elements/ListActions, actions => \@results &>
+
+<FORM METHOD=POST ACTION="ModifyPeople.html">
+<INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>">
+<& /Elements/TitleBoxStart, title => 'Modify people related to ticket #'.$Ticket->Id, width => "100%", color=> "#333399" &>
+<& Elements/EditPeople, Ticket => $Ticket, UserField => $UserField, UserString => $UserString, UserOp => $UserOp &>
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit, Label => 'Save Changes', Caption => "If you've updated anything above, be sure to", color => "#333399" &>
+</form>
+
+<%INIT>
+
+my (@results, @wresults);
+
+my $Ticket = LoadTicket($id);
+
+# if we're trying to search for watchers and nothing else
+unless ($OnlySearchForPeople) {
+ @results = ProcessTicketBasics( TicketObj => $Ticket, ARGSRef => \%ARGS);
+ @wresults = ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS);
+}
+
+push @results, @wresults;
+</%INIT>
+
+
+
+<%ARGS>
+$OnlySearchForPeople => undef
+$UserField => undef
+$UserOp => undef
+$UserString => undef
+$id => undef
+</%ARGS>
+
diff --git a/rt/webrt/Ticket/Update.html b/rt/webrt/Ticket/Update.html
new file mode 100755
index 000000000..be2266663
--- /dev/null
+++ b/rt/webrt/Ticket/Update.html
@@ -0,0 +1,110 @@
+<& /Elements/Header, Title=> $title &>
+<& /Ticket/Elements/Tabs, Ticket => $Ticket &>
+<& /Elements/TitleBoxStart, title => "Update ticket" &>
+
+<FORM ACTION="Display.html" NAME="TicketUpdate"
+ METHOD=POST enctype="multipart/form-data">
+
+<TABLE>
+<TR><TD>
+<a href="ModifyPeople.html?id=<%$Ticket->Id%>">Ticket watchers</A></TD><TD align=right>
+Requestor:
+</TD><TD>
+<b><% $Ticket->RequestorsAsString %></b>
+</TD></TR>
+<TR><TD>&nbsp;</TD><TD align=right>
+Cc:
+</TD><TD>
+<b><% $Ticket->CcAsString %></b>
+</TD></TR>
+<TR><TD>&nbsp;</TD><TD align=right>
+AdminCc:
+</TD><TD>
+<b><% $Ticket->AdminCcAsString %></b>
+</TD></TR>
+</TR>
+</TABLE>
+<hr>
+
+<TABLE BORDER=0>
+
+<tr><td align=right>Status:</td>
+<td>
+<& /Elements/SelectStatus, Name=>"Status", Default => $DefaultStatus &>
+Owner:
+<& /Elements/SelectOwner, Name=>"Owner", Default => $Ticket->OwnerObj->Id(), QueueObj => $Ticket->QueueObj, TicketObj => $Ticket &>
+Worked: <input size=4 name="UpdateTimeWorked"> minutes</td></tr>
+<tr><td align=right>Update Type:</td>
+<td><select name="UpdateType">
+% if ($CanComment) {
+ <option value="private" <%$CommentDefault%>>Comments (Not sent to requestors)</option>
+% }
+% if ($CanRespond) {
+ <option value="response" <%$ResponseDefault%>>Response to requestors</option>
+% }
+</select>
+</td></tr>
+<tr><td align=right>Subject:</td><td> <input name="UpdateSubject" size=60 value="<%$Ticket->Subject()%>"></td></tr>
+<tr><td align=right>Cc:</td><td> <input name="UpdateCc" size=60><BR>
+<i><font size=-2>(Sends a carbon-copy of this update to a comma-delimited list
+of email addresses. Does <b>not</b> change who will receive future updates.)</font></i>
+</td></tr>
+<tr><td align=right>Bcc:</td><td> <input name="UpdateBcc" size=60><BR>
+<i><font size=-2>(Sends a blind carbon-copy of this update to a comma-delimited list
+of email addresses. Does <b>not</b> change who will receive future updates.)</font></i>
+</td></tr>
+<tr><td align=right>Attach:</td><td><input name="UpdateAttachment" type="file"></td></tr>
+</table>
+<& /Elements/MessageBox, Name=>"UpdateContent", QuoteTransaction=>$ARGS{QuoteTransaction} &>
+ <INPUT TYPE=HIDDEN NAME=id VALUE="<%$Ticket->Id%>"><br>
+
+
+
+
+<& /Elements/TitleBoxEnd &>
+<& /Elements/Submit &>
+ </FORM>
+
+
+
+<%INIT>
+
+my $CanRespond = 0;
+my $CanComment = 0;
+my $title;
+
+my $Ticket = LoadTicket($id);
+
+
+if ($DefaultStatus eq 'resolved') {
+ $title = "Resolve";
+} else {
+ $title = "Update";
+}
+
+$title .= " ticket #" . $Ticket->id . " (" .$Ticket->Subject.")";
+
+# Things needed in the template - we'll do the processing here, just
+# for the convinience:
+my $CommentDefault=$Action eq "Comment" ? "SELECTED" : "";
+my $ResponseDefault=$Action eq "Respond" ? "SELECTED" : "";
+
+$DefaultStatus = $Ticket->Status() unless ($DefaultStatus);
+
+$CanRespond = 1 if ( $Ticket->CurrentUserHasRight('ReplyToTicket') or
+ $Ticket->CurrentUserHasRight('ModifyTicket') );
+
+$CanComment = 1 if ( $Ticket->CurrentUserHasRight('CommentOnTicket') or
+ $Ticket->CurrentUserHasRight('ModifyTicket') );
+
+
+
+
+
+</%INIT>
+
+<%ARGS>
+$id => undef
+$Action => undef
+$DefaultStatus => undef
+</%ARGS>