fsf changes, meant to be rebased on upstream
[squirrelmail.git] / templates / default / message_list.tpl
... / ...
CommitLineData
1<?php
2
3/**
4 * message_list.tpl
5 *
6 * Template for viewing a messages list
7 *
8 * The following variables are available in this template:
9//FIXME: need to clean (and document) this list, it is just a dump of the array keys of $t
10 * $sTemplateID
11 * $icon_theme_path
12 * $javascript_on
13 * $delayed_errors
14 * $frames
15 * $lang
16 * $page_title
17 * $header_tags
18 * $plugin_output
19 * $header_sent
20 * $body_tag_js
21 * $shortBoxName
22 * $provider_link
23 * $frame_top
24 * $urlMailbox
25 * $startMessage
26 * $hide_sm_attributions
27 * $uri
28 * $text
29 * $onclick
30 * $class
31 * $id
32 * $target
33 * $color
34 * $form_name
35 * $form_id
36 * $page_selector
37 * $page_selector_max
38 * $messagesPerPage
39 * $showall
40 * $end_msg
41 * $align
42 * $iNumberOfMessages
43 * $aOrder
44 * $aFormElements
45 * $sort
46 * $pageOffset
47 * $baseurl
48 * $aMessages
49 * $trash_folder
50 * $sent_folder
51 * $draft_folder
52 * $thread_link_uri
53 * $thread_name
54 * $php_self
55 * $mailbox
56 * $enablesort
57 * $icon_theme
58 * $use_icons
59 * $alt_index_colors
60 * $fancy_index_highlite
61 * $aSortSupported
62 * $show_label_columns
63 * $compact_paginator
64 * $aErrors
65 * $checkall
66 * $preselected
67 * $show_personal_names boolean When turned on, all email
68 * address fields should display
69 * the personal name and use the
70 * email address as a tool tip;
71 * When turned off, this logic
72 * should be inverted
73 * $accesskey_mailbox_toggle_selected The access key to use for the toggle all checkbox
74 * $accesskey_mailbox_thread The access key to use for the Thread/Unthread links
75 *
76 * @copyright 1999-2022 The SquirrelMail Project Team
77 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
78 * @version $Id$
79 * @package squirrelmail
80 * @subpackage templates
81 */
82
83
84/** add required includes */
85include_once(SM_PATH . 'functions/template/message_list_util.php');
86
87
88/* retrieve the template vars */
89extract($t);
90
91
92if (!empty($plugin_output['mailbox_index_before'])) echo $plugin_output['mailbox_index_before'];
93
94
95/**
96 * Calculate string "Viewing message x to y (z total)"
97 */
98$msg_cnt_str = '';
99if ($pageOffset < $end_msg) {
100 $msg_cnt_str = sprintf(_("Viewing Messages: %s to %s (%s total)"),
101 '<em>' . $pageOffset . '</em>',
102 '<em>' . $end_msg . '</em>',
103 $iNumberOfMessages);
104} else if ($pageOffset == $end_msg) {
105 $msg_cnt_str = sprintf(_("Viewing Message: %s (%s total)"),
106 '<em>' . $pageOffset . '</em>',
107 $iNumberOfMessages);
108}
109
110
111/**
112 * All icon functionality is now handled through $icon_theme_path.
113 * $icon_theme_path will contain the path to the user-selected theme. If it is
114 * NULL, the user and/or admin have turned off icons.
115 */
116
117
118?>
119<div id="message_list">
120<form id="<?php echo $form_name;?>" name="<?php echo $form_name;?>" method="post" action="<?php echo $php_self;?>">
121<input type="hidden" name="smtoken" value="<?php echo sm_generate_security_token(); ?>" />
122<table class="table_empty" cellspacing="0">
123 <tr>
124 <td>
125 <table class="table_standard" cellspacing="0">
126 <tr>
127 <td>
128 <table class="table_empty" cellspacing="0">
129 <tr>
130 <td class="links_paginator">
131<!-- paginator and thread link string -->
132 <?php
133 /**
134 * The following line gets the output from a separate
135 * template altogether (called "paginator.tpl").
136 * $this is the Template class object.
137 */
138 $paginator_str = $this->fetch('paginator.tpl');
139 echo $paginator_str . '<small>[<a href="' . $thread_link_uri
140 . ($accesskey_mailbox_thread != 'NONE'
141 ? '" accesskey="' . $accesskey_mailbox_thread . '">'
142 : '">')
143 . $thread_name . '</a>]</small>&nbsp;&nbsp;';
144 if (!empty($plugin_output['mailbox_paginator_after'])) echo $plugin_output['mailbox_paginator_after'];
145 ?>
146<!-- end paginator and thread link string -->
147 </td>
148<!-- message count string -->
149 <td class="message_count"><?php echo $msg_cnt_str; ?></td>
150<!-- end message count string -->
151 </tr>
152 </table>
153 </td>
154 </tr>
155<?php
156 if (count($aFormElements)) {
157?>
158<!-- start message list form control -->
159 <tr class="message_list_controls">
160 <td>
161 <?php
162 /**
163 * The following line gets the output from a separate
164 * template altogether (called "message_list_controls.tpl").
165 * $this is the Template class object.
166 */
167 $message_list_controls = $this->fetch('message_list_controls.tpl');
168 echo $message_list_controls ."\n"; ?>
169 </td>
170 </tr>
171<!-- end message list form control -->
172<?php
173 } // if (count($aFormElements))
174?>
175 </table>
176<?php if (!empty($plugin_output['mailbox_form_before'])) echo $plugin_output['mailbox_form_before']; ?>
177 </td>
178 </tr>
179 <tr><td class="spacer"></td></tr>
180 <tr>
181 <td>
182 <table class="table_messageListWrapper" cellspacing="0">
183 <tr>
184 <td>
185 <table class="table_messageList" cellspacing="0">
186<!-- table header start -->
187<?php
188/*
189 * As an FYI, Firefox on Windows seems to have an issue w/ putting wierd breaks while
190 * rendering this table if we use THEAD and TH tags. No other browser or platform has
191 * this issue. We will use TR/TD w/ another CSS class to work around this.
192 */
193?>
194
195 <tr class="headerRow">
196
197<?php
198 $aWidth = calcMessageListColumnWidth($aOrder);
199 foreach($aOrder as $iCol) {
200?>
201
202 <td style="width:<?php echo $aWidth[$iCol]; ?>%">
203
204<?php
205 $colNameText = '';
206 switch ($iCol) {
207 case SQM_COL_CHECK:
208 if ($javascript_on) {
209 $checked = ($checkall ? ' checked="checked" ' : '');
210 $accesskey = ($accesskey_mailbox_toggle_selected == 'NONE' ? ''
211 : ' accesskey="' . $accesskey_mailbox_toggle_selected . '" ');
212 echo '<input type="checkbox" name="toggleAll" id="toggleAll" title="'
213 . _("Toggle All") . '" onclick="toggle_all(\''
214 . $form_name . '\', \'msg\', ' . $fancy_index_highlite
215 . '); return false;" ' . $checked . $accesskey . '/>' . "\n";
216 } else {
217 $link = $baseurl
218 . "&amp;startMessage=$pageOffset&amp;checkall="
219 . ($checkall ? '0' : '1');
220 echo "<a href=\"$link\">" . _("All") . '</a>';
221 }
222 break;
223 case SQM_COL_FROM:
224 // was: echo '<label for="toggleAll">' . _("From") . "</label>\n";
225 $colNameText = _("From");
226 break;
227 case SQM_COL_DATE:
228 // was: echo _("Date") . "\n";
229 $colNameText = _("Date");
230 break;
231 case SQM_COL_SUBJ:
232 // was: echo _("Subject") . "\n";
233 $colNameText = _("Subject");
234 break;
235 case SQM_COL_FLAGS:
236 echo getIcon($icon_theme_path, 'msg_new.png', '&nbsp;', _("Message Flags")) . "\n";
237 break;
238 case SQM_COL_SIZE:
239 // echo _("Size") . "\n";
240 $colNameText = _("Size");
241 break;
242 case SQM_COL_PRIO:
243 echo getIcon($icon_theme_path, 'prio_high.png', '!', _("Priority")) . "\n";
244 break;
245 case SQM_COL_ATTACHMENT:
246 echo getIcon($icon_theme_path, 'attach.png', '+', _("Attachment")) . "\n";
247 break;
248 case SQM_COL_INT_DATE:
249 // was: echo _("Received") . "\n";
250 $colNameText = _("Received");
251 break;
252 case SQM_COL_TO:
253 // was: echo '<label for="toggleAll">' . _("To") . "</label>\n";
254 $colNameText = _("To");
255 break;
256 case SQM_COL_CC: echo _("Cc") . "\n"; break;
257 case SQM_COL_BCC: echo _("Bcc") . "\n"; break;
258 default: break;
259 }
260 // add the sort buttons
261 if (isset($aSortSupported[$iCol])) {
262 if ($sort == $aSortSupported[$iCol][0]) {
263 $newsort = $aSortSupported[$iCol][1];
264 $img = 'up_pointer.png';
265 $text_icon = '&#8679;'; // U+21E7 UPWARDS WHITE ARROW
266 } else if ($sort == $aSortSupported[$iCol][1]) {
267 $newsort = 0;
268 $img = 'down_pointer.png';
269 $text_icon = '&#8681;'; // U+21E9 DOWNWARDS WHITE ARROW
270 } else {
271 $newsort = $aSortSupported[$iCol][0];
272 $img = 'sort_none.png';
273 $text_icon = '&#9723;'; // U+25FB WHITE MEDIUM SQUARE
274 }
275 /* Now that we have everything figured out, show the actual button. */
276 echo " <a href=\"$baseurl&amp;startMessage=1&amp;srt=$newsort\" style=\"text-decoration:none;color:inherit\">";
277 }
278 echo $colNameText;
279 if (isset($aSortSupported[$iCol])) {
280 echo ' ' . getIcon($icon_theme_path, $img, $text_icon, _("Click here to change the sorting of the message list")) . "\n</a>";
281 }
282?>
283 </td>
284<?php
285 }
286?>
287 </tr>
288<!-- end table header -->
289
290<!-- Message headers start -->
291<?php
292
293 $i = 0;
294 $iColCnt = count($aOrder);
295 $sLine = '';
296
297
298 // this stuff does the auto row highlighting on mouseover
299 //
300 if (!empty($plugin_output['checkbox_javascript_onclick'])) $checkbox_javascript_onclick = $plugin_output['checkbox_javascript_onclick'];
301 else $checkbox_javascript_onclick = '';
302
303 if ($javascript_on && $fancy_index_highlite) {
304 $checkbox_javascript = ' onclick="this.checked = !this.checked; ' . $checkbox_javascript_onclick . '"';
305 } else if (!empty($checkbox_javascript_onclick)) {
306 $checkbox_javascript = ' onclick="' . $checkbox_javascript_onclick . '"';
307 } else {
308 $checkbox_javascript = '';
309 }
310
311
312 /**
313 * main message iteration loop
314 */
315 foreach ($aMessages as $iUid => $aMsg) {
316
317 echo $sLine;
318
319
320/**
321* Display message header row in messages list
322*
323*/
324
325 $aColumns = $aMsg['columns'];
326
327
328 /**
329 * Check the flags and set a class var.
330 */
331 if (isset($aColumns[SQM_COL_FLAGS])) {
332 $aFlags = $aColumns[SQM_COL_FLAGS]['value'];
333 $sFlags = getFlagIcon($aFlags, $icon_theme_path);
334
335 /* add the flag string to the value index */
336 $aColumns[SQM_COL_FLAGS]['value'] = $sFlags;
337 }
338 /**
339 * Check the priority column
340 */
341 if (isset($aColumns[SQM_COL_PRIO])) {
342 $sValue = getPriorityIcon($aColumns[SQM_COL_PRIO]['value'], $icon_theme_path);
343 $aColumns[SQM_COL_PRIO]['value'] = $sValue;
344 }
345
346 /**
347 * Check the attachment column
348 */
349 if (isset($aColumns[SQM_COL_ATTACHMENT])) {
350 $sValue = getAttachmentIcon($aColumns[SQM_COL_ATTACHMENT]['value'], $icon_theme_path);
351 $aColumns[SQM_COL_ATTACHMENT]['value'] = $sValue;
352 }
353
354 $class = (($checkall || in_array($iUid, $preselected)) && $javascript_on && $fancy_index_highlite ? 'clicked_even' : 'even');
355 $non_clicked_class = 'even';
356
357 /**
358 * If alternating row colors is set, adapt the CSS class
359 */
360 if (isset($alt_index_colors) && $alt_index_colors) {
361 if (!($i % 2)) {
362 $class = (($checkall || in_array($iUid, $preselected)) && $javascript_on && $fancy_index_highlite ? 'clicked_odd' : 'odd');
363 $non_clicked_class = 'odd';
364 }
365
366 }
367
368 /**
369 * Message Highlighting Functionality
370 */
371 if (isset($aMsg['row']['color']))
372 {
373 if (($checkall || in_array($iUid, $preselected)) && $javascript_on && $fancy_index_highlite) {
374//FIXME: would be best not to use $color directly here; want to move this to be a CSS style-defined value only, but the problem is that this CSS class is being defined on the fly right here
375 $bgcolor = $color[16];
376 $class = 'clicked_misc'.$i;
377 } else {
378 $bgcolor = $aMsg['row']['color'];
379 $class = 'misc'.$i;
380 }
381 $non_clicked_class = 'misc'.$i;
382 $non_clicked_bgcolor = $aMsg['row']['color'];
383 }
384 else
385 {
386 $bgcolor = '';
387 $non_clicked_bgcolor = '';
388 }
389
390 $row_extra = '';
391
392 // this stuff does the auto row highlighting on mouseover
393 //
394 if ($javascript_on && $fancy_index_highlite) {
395 $row_extra = ' onmouseover="rowOver(\''.$form_id . '_msg' . $i.'\');" onmouseout="setPointer(this, ' . $i . ', \'out\', \'' . $non_clicked_class . '\', \'mouse_over\', \'clicked\');" onmousedown="setPointer(this, ' . $i . ', \'click\', \'' . $non_clicked_class . '\', \'mouse_over\', \'clicked\');"';
396 }
397 // this does the auto-checking of the checkbox no matter
398 // where on the row you click
399 //
400 $javascript_auto_click = '';
401 $row_click_extra = '';
402 if (!empty($plugin_output['row_click_extra'])) $row_click_extra = $plugin_output['row_click_extra'];
403 if ($javascript_on && $fancy_index_highlite) {
404 // include the form_id in order to show multiple messages lists. Otherwise id isn't unique
405 $javascript_auto_click = " onmousedown=\"row_click('$form_id"."_msg$i', event, '$form_name', 'msg[' + $i + ']', '$row_click_extra')\"";
406 }
407
408
409/*
410 * Message Highlighting requires a unique CSS class declaration for proper
411 * mouseover functionality. There is no harm in doing this when the mouseover
412 * functionality is disabled
413 */
414if ($class != 'even' && $class != 'odd'
415 && $class != 'clicked_even' && $class != 'clicked_odd')
416{
417?>
418<style type="text/css">
419<!--
420.table_messageList tr.<?php echo $class; ?> { background:<?php echo $bgcolor; ?> }
421-->
422</style>
423<?php
424}
425if ($non_clicked_class != 'even' && $non_clicked_class != 'odd'
426 && $non_clicked_class != 'clicked_even' && $non_clicked_class != 'clicked_odd')
427{
428?>
429<style type="text/css">
430<!--
431.table_messageList tr.<?php echo $non_clicked_class; ?> { background:<?php echo $non_clicked_bgcolor; ?> }
432-->
433</style>
434<?php
435}
436
437
438?>
439<tr <?php echo (empty($class) ? '' : 'class="'.$class.'" '); echo $row_extra;?>>
440<?php
441 // flag style mumbo jumbo
442 $sPre = $sEnd = '';
443 if (isset($aColumns[SQM_COL_FLAGS])) {
444 if (!in_array('seen',$aFlags) || !$aFlags['seen']) {
445 $sPre = '<span class="unread">'; $sEnd = '</span>';
446 }
447 if (in_array('deleted',$aFlags) && $aFlags['deleted']) {
448 $sPre = '<span class="deleted">' . $sPre;
449 $sEnd .= '</span>';
450 } else {
451 if (in_array('flagged',$aFlags) && $aFlags['flagged']) {
452 $sPre = '<span class="flagged">' . $sPre;
453 $sEnd .= '</span>';
454 }
455 }
456 }
457 /**
458 * Because the order of the columns and which columns to show is a user preference
459 * we have to do some php coding to display the columns in the right order
460 */
461 foreach ($aOrder as $iCol) {
462 if (in_array($iCol, $show_label_columns)) {
463 $sLabelStart = '<label for="'.$form_id."_msg$i\">";
464 $sLabelEnd = '</label>';
465 } else {
466 $sLabelStart = '';
467 $sLabelEnd = '';
468 }
469 $aCol = (isset($aColumns[$iCol])) ? $aColumns[$iCol] : array();
470 $title = (isset($aCol['title'])) ? $aCol['title'] : '';
471 $link = (isset($aCol['link'])) ? $aCol['link'] : '';
472 $link_extra = (isset($aCol['link_extra'])) ? $aCol['link_extra'] : '';
473 $onclick = (isset($aCol['onclick'])) ? $aCol['onclick'] : '';
474 $value = (isset($aCol['value'])) ? $aCol['value'] : '';
475 $target = (isset($aCol['target'])) ? $aCol['target'] : '';
476 if (!$show_personal_names
477 && !empty($title)
478 && ($iCol == SQM_COL_FROM
479 || $iCol == SQM_COL_TO
480 || $iCol == SQM_COL_CC
481 || $iCol == SQM_COL_BCC)) {
482 // swap title and value
483 $tmp = $title;
484 $title = $value;
485 $value = $tmp;
486 }
487 if ($iCol !== SQM_COL_CHECK) {
488 $value = $sLabelStart.$sPre.$value.$sEnd.$sLabelEnd;
489 }
490
491
492 switch ($iCol) {
493 case SQM_COL_CHECK:
494 $checked = (($checkall || in_array($iUid, $preselected)) ? ' checked="checked" ' : '');
495 if ($javascript_on) {
496 echo '<td class="col_check"'. $javascript_auto_click. '>' ?>
497 <input type="checkbox" name="<?php echo "msg[$i]";?>" id="<?php echo $form_id."_msg$i";?>" value="<?php echo $iUid;?>" <?php echo $checkbox_javascript . $checked;?> /></td>
498 <?php
499 } else {
500 echo '<td class="col_check">';
501 echo "<input type=\"checkbox\" name=\"msg[".$i."]\" id=\"".$form_id."_msg$i\" value=\"$iUid\" $checked/></td>";
502 }
503 break;
504 case SQM_COL_SUBJ:
505 $indent = $aCol['indent'];
506 $sText = " <td class=\"col_subject\" $javascript_auto_click>";
507 if ($align['left'] == 'left') {
508 $sText .= str_repeat('&nbsp;&nbsp;',$indent);
509 }
510 $sText .= "<a href=\"$link\"";
511 if ($target) { $sText .= " target=\"$target\""; }
512 if ($title) { $sText .= " title=\"$title\""; }
513 if ($onclick) { $sText .= " onclick=\"$onclick\""; }
514 if ($link_extra) { $sText .= " $link_extra"; }
515 if ($javascript_on && $fancy_index_highlite) {
516 $sText .= " onmousedown=\"row_click('$form_id"."_msg$i', event, '$form_name', 'msg[' + $i + ']', '$row_click_extra'); setPointer(this." . (empty($bold) ? '' : 'parentNode.') .
517 'parentNode.parentNode, ' . $i . ', \'click\', \''. $non_clicked_class. '\', \'mouse_over\', \'clicked\');"';
518 }
519 $sText .= ">"
520 . $value . '</a>';
521 if ($align['left'] == 'right') {
522 $sText .= str_repeat('&nbsp;&nbsp;',$indent);
523 }
524 echo $sText."</td>\n";
525 break;
526 case SQM_COL_SIZE:
527 case SQM_COL_FLAGS:
528 $sText = " <td class=\"col_flags\" $javascript_auto_click>"
529 . "$value</td>\n";
530 echo $sText;
531 break;
532 case SQM_COL_INT_DATE:
533 case SQM_COL_DATE:
534 $sText = " <td class=\"col_date\" $javascript_auto_click";
535 if ($title) {$sText .= " title=\"$title\"";}
536 $sText .= ">" . $value. "</td>\n";
537 echo $sText;
538 break;
539 default:
540 $sText = " <td class=\"col_text\" $javascript_auto_click";
541 if ($link) {
542 $sText .= "><a href=\"$link\"";
543 if ($target) { $sText .= " target=\"$target\"";}
544 if ($title) { $sText .= " title=\"$title\"" ;}
545 $sText .= ">";
546 } else {
547 if ($title) {$sText .= " title=\"$title\"";}
548 $sText .= ">";
549 }
550 $sText .= $value;
551 if ($link) { $sText .= '</a>';}
552 echo $sText."</td>\n";
553 break;
554 }
555 }
556
557 echo '</tr>';
558 $sLine = "<tr><td colspan=\"$iColCnt\" class=\"spacer\"></td></tr>\n";
559 ++$i;
560
561/*
562 * End displaying row part
563 */
564 }
565
566?>
567<!-- Message headers end -->
568 </table>
569 </td>
570 </tr>
571 </table>
572 </td>
573 </tr>
574 <tr><td class="spacer"></td></tr>
575 <tr>
576 <td>
577 <table class="table_standard" cellspacing="0">
578 <tr>
579 <td>
580 <table class="table_empty" cellspacing="0">
581 <tr>
582 <td class="links_paginator"><?php
583 /**
584 * The following line gets the output from a separate
585 * template altogether (called "paginator.tpl").
586 * $this is the Template class object.
587 */
588 $paginator_str = $this->fetch('paginator.tpl');
589 echo $paginator_str;
590 if (!empty($plugin_output['mailbox_paginator_after'])) echo $plugin_output['mailbox_paginator_after'];
591 ?></td>
592 <td class="message_count"><?php echo $msg_cnt_str; ?></td>
593 </tr>
594 </table>
595 </td>
596 </tr>
597 </table>
598 </td>
599 </tr>
600 <tr>
601 <td align="right">
602<?php if (!empty($plugin_output['mailbox_index_after'])) echo $plugin_output['mailbox_index_after']; ?>
603 </td>
604 </tr>
605 </table>
606</form>
607</div>
608
609<?php if (!$hide_sm_attributions): ?>
610<p class="sqm_squirrelcopyright">&copy; <?php echo SM_COPYRIGHT ?> The SquirrelMail Project Team - <a href="about.php">About SquirrelMail</a></p>
611<?php endif; ?>