Added Alt-n and Alt-p accesskeys
[clearscm.git] / maps / bin / detail.cgi
1 #!/usr/bin/perl
2 #################################################################################
3 # File:         $RCSfile: detail.cgi,v $
4 # Revision:     $Revision: 1.1 $
5 # Description:  Displays list of email addresses based on report type.
6 # Author:       Andrew@DeFaria.com
7 # Created:      Fri Nov 29 14:17:21  2002
8 # Modified:     $Date: 2013/06/12 14:05:47 $
9 # Language:     perl
10 #
11 # (c) Copyright 2000-2006, Andrew@DeFaria.com, all rights reserved.
12 #
13 ################################################################################use strict;
14 use warnings;
15
16 use MIME::Words qw(:all);
17 use FindBin;
18 $0 = $FindBin::Script;
19
20 use lib $FindBin::Bin;
21
22 use MAPS;
23 use MAPSLog;
24 use MAPSUtil;
25 use MAPSWeb;
26 use CGI qw (:standard *table start_td end_td start_Tr end_Tr start_div end_div);
27 use CGI::Carp 'fatalsToBrowser';
28
29 my $type   = param ('type');
30 my $next   = param ('next');
31 my $lines  = param ('lines');
32 my $date   = param ('date');
33
34 $date ||= '';
35
36 my $userid;
37 my $current;
38 my $last;
39 my $prev;
40 my $total;
41 my $table_name = 'detail';
42
43 my %types = (
44   'blacklist'   => [
45     'Blacklist report',
46     'The following blacklisted users attempted to email you'
47   ],
48   'whitelist'   => [
49     'Delivered report',
50     'Delivered email from the following users'
51   ],
52   'nulllist'    => [
53     'Discarded report',
54     'Discarded messages from the following users'
55   ],
56   'error'       => [
57     'Error report',
58     'Errors detected'
59   ],
60   'mailloop'    => [
61     'MailLoop report',
62     'Automatically detected mail loops from the following users'
63   ],
64   'registered'  => [
65     'Registered report',
66     'The following users have recently registered'
67   ],
68   'returned'    => [
69     'Returned report',
70     'Sent Register reply to the following users'
71   ]
72 );
73
74 sub MakeButtons {
75   my $type = shift;
76
77   my $prev_button = $prev >= 0 ?
78     a ({-href      => "detail.cgi?type=$type;date=$date;next=$prev",
79         -accesskey => 'p',
80     }, '<img src=/maps/images/previous.gif border=0 alt=Previous align=middle>') : '';
81   my $next_button = ($next + $lines) < $total ?
82     a {-href      => "detail.cgi?type=$type;date=$date;next=" . ($next + $lines),
83        -accesskey => 'n',
84     }, '<img src=/maps/images/next.gif border=0 alt=Next align=middle>' : '';
85
86   my $buttons = $prev_button;
87
88   if ($type eq 'whitelist') {
89     $buttons = $buttons .
90       submit ({-name    => 'action',
91                -value   => 'Blacklist Marked',
92                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
93       submit ({-name    => 'action',
94                -value   => 'Nulllist Marked',
95                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
96       submit ({-name    => 'action',
97                -value   => 'Reset Marks',
98                -onClick => 'return ClearAll (document.detail);'});
99   } elsif ($type eq 'blacklist') {
100     $buttons = $buttons .
101       submit ({-name    => 'action',
102                -value   => 'Whitelist Marked',
103                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
104       submit ({-name    => 'action',
105                -value   => 'Nulllist Marked',
106                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
107       submit ({-name    => 'action',
108                -value   => 'Reset Marks',
109                -onClick => 'return ClearAll (document.detail);'});
110   } elsif ($type eq 'nulllist') {
111     $buttons = $buttons .
112       submit ({-name    => 'action',
113                -value   => 'Whitelist Marked',
114                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
115       submit ({-name    => 'action',
116                -value   => 'Blacklist Marked',
117                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
118       submit ({-name    => 'action',
119                -value   => 'Reset Marks',
120                -onClick => 'return ClearAll (document.detail);'});
121   } else {
122     $buttons = $buttons .
123       submit ({-name    => 'action',
124                -value   => 'Whitelist Marked',
125                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
126       submit ({-name    => 'action',
127                -value   => 'Blacklist Marked',
128                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
129       submit ({-name    => 'action',
130                -value   => 'Nulllist Marked',
131                -onClick => 'return CheckAtLeast1Checked (document.detail);'}) .
132       submit ({-name    => 'action',
133                -value   => 'Reset Marks',
134                -onClick => 'return ClearAll (document.detail);'});
135   } # if
136
137   return $buttons . $next_button;
138 } # MakeButtons
139
140 sub PrintTable {
141   my ($type) = @_;
142
143   my $current = $next + 1;
144
145   print div {-align => 'center'}, b (
146     '(' . $current . '-' . $last . ' of ' . $total . ')');
147   print start_form {
148     -method => 'post',
149     -action => 'processaction.cgi',
150     -name   => 'detail'
151   };
152   print start_table ({-align        => 'center',
153                       -id           => $table_name,
154                       -border       => 0,
155                       -cellspacing  => 0,
156                       -cellpadding  => 0,
157                       -width        => '100%'}) . "\n";
158
159   my $buttons = MakeButtons $type;
160
161   print start_div {-class => 'toolbar'};
162   print
163     Tr [
164       td {-class  => 'tablebordertopleft',
165           -valign => 'middle'},
166       td {-class  => 'tablebordertopright',
167           -valign => 'middle',
168           -align  => 'center'}, $buttons,
169     ];
170   print end_div;
171
172   foreach my $sender (ReturnSenders $userid, $type, $next, $lines, $date) {
173     my @msgs = ReturnMessages $userid, $sender;
174
175     $next++;
176     print
177       start_Tr {-valign => 'middle'};
178     print
179       td {-class => 'tableborder'}, small ($next,
180         checkbox {-name  => "action$next",
181                   -label => ''}),
182           hidden ({-name     => "email$next",
183                    -default => $sender});
184     print
185       start_td {-align => 'left'};
186     print
187       start_table {-class       => 'tablerightdata',
188                    -cellpadding => 2,
189                    -callspacing => 0,
190                    -border      => 0,
191                    -width       => '100%',
192                    -bgcolor     => '#d4d0c8'};
193     print
194       td {-class => 'tablelabel',
195           -valign => 'middle',
196           -width  => '40'}, 'Sender:',
197       td {-class  => 'sender',
198           -valign => 'middle'},
199       a {-href    => "mailto:$sender"}, $sender;
200     print
201       end_table;
202
203     my $messages = 1;
204
205     foreach (@msgs) {
206       my $msg_date = pop @{$_};
207       my $subject  = pop @{$_};
208
209       if ($date eq substr ($msg_date, 0, 10)) {
210         $msg_date = b font {-color => 'green'}, SQLDatetime2UnixDatetime $msg_date;
211       } else {
212         $msg_date = SQLDatetime2UnixDatetime $msg_date;
213       } # if
214
215       $subject = $subject eq '' ? '&lt;Unspecified&gt;' : $subject;
216       $subject = decode_mimewords ($subject);
217       $subject =~ s/\>/&gt;/g;
218       $subject =~ s/\</&lt;/g;
219
220       print
221         start_table {-class       => 'tablerightdata',
222                      -cellpadding => 2,
223                      -cellspacing => 2,
224                      -border      => 0,
225                      -width       => '100%'};
226       my $msg_nbr = $messages;
227       print
228         Tr [
229           td {-class   => 'msgnbr',
230               -valign  => 'middle',
231               -rowspan => 2,
232               -width   => '2%'}, $messages++,
233           td {-class   => 'tablelabel',
234               -valign  => 'middle',
235               -width   => '45'}, 'Subject:',
236           td {-class   => 'subject',
237               -valign  => 'middle',
238               -bgcolor => '#ffffff'},
239            a {-href    => "display.cgi?sender=$sender;msg_nbr=$msg_nbr"}, $subject,
240           td {-class   => 'date',
241               -width   => '130',
242               -valign  => 'middle'}, $msg_date
243         ];
244       print end_table;
245     } # foreach
246     print end_td;
247     print end_Tr;
248   } # foreach
249
250   print start_div {-class => 'toolbar'};
251   print
252     Tr [
253       td {-class  => 'tableborderbottomleft',
254           -valign => 'middle'},
255       td {-class  => 'tableborderbottomright',
256           -valign => 'middle'},
257       $buttons
258     ];
259   print end_div;
260   print end_table;
261   print end_form;
262 } # PrintTable
263
264 # Main
265 my @scripts = ('ListActions.js');
266
267 my $heading_date =$date ne '' ? ' on ' . FormatDate ($date) : '';
268
269 $userid = Heading (
270   'getcookie',
271   '',
272   (ucfirst ($type) . ' Report'),
273   $types {$type} [0],
274   $types {$type} [1] . $heading_date,
275   $table_name,
276   @scripts
277 );
278
279 $userid ||= $ENV{USER};
280
281 SetContext $userid;
282 NavigationBar $userid;
283
284 unless ($lines) {
285   my %options = GetUserOptions $userid;
286   $lines = $options{'Page'};
287 } # unless
288
289 if ($date eq '') {
290   $condition .= "userid = '$userid' and type = '$type'";
291 } else {
292   my $sod = $date . ' 00:00:00';
293   my $eod = $date . ' 23:59:59';
294
295   $condition .= "userid = '$userid' and type = '$type' "
296               . "and timestamp > '$sod' and timestamp < '$eod' ";
297 } # if
298
299 $total = MAPSDB::count_distinct ('log', 'sender', $condition);
300
301 $next ||= 0;
302
303 $last = $next + $lines < $total ? $next + $lines : $total;
304
305 if (($next - $lines) > 0) {
306   $prev = $next - $lines;
307 } else {
308   $prev = $next eq 0 ? -1 : 0;
309 } # if
310
311 PrintTable $type;
312
313 Footing $table_name;
314
315 exit;