source: trunk/admin/history.php @ 2033

Last change on this file since 2033 was 1992, checked in by rub, 18 years ago

Issue 0000684: History [Search] - Add a thumbnail display

o Display choice can be selected
o Display choice is saved on on cookie
o Small improvement picture link (hoverbox on all the link, alt&title on classic mode)
o New cookie functions and use

Enhance computing method of script_basename function.

http://forum.phpwebgallery.net/viewtopic.php?pid=58258#p58258

Merge BSF 1988:1989 into branch-1_7

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 21.7 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | PhpWebGallery - a PHP based picture gallery                           |
4// | Copyright (C) 2002-2003 Pierrick LE GALL - pierrick@phpwebgallery.net |
5// | Copyright (C) 2003-2007 PhpWebGallery Team - http://phpwebgallery.net |
6// +-----------------------------------------------------------------------+
7// | file          : $Id: history.php 1992 2007-05-01 13:57:52Z rub $
8// | last update   : $Date: 2007-05-01 13:57:52 +0000 (Tue, 01 May 2007) $
9// | last modifier : $Author: rub $
10// | revision      : $Revision: 1992 $
11// +-----------------------------------------------------------------------+
12// | This program is free software; you can redistribute it and/or modify  |
13// | it under the terms of the GNU General Public License as published by  |
14// | the Free Software Foundation                                          |
15// |                                                                       |
16// | This program is distributed in the hope that it will be useful, but   |
17// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
18// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
19// | General Public License for more details.                              |
20// |                                                                       |
21// | You should have received a copy of the GNU General Public License     |
22// | along with this program; if not, write to the Free Software           |
23// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
24// | USA.                                                                  |
25// +-----------------------------------------------------------------------+
26
27/**
28 * Display filtered history lines
29 */
30
31// +-----------------------------------------------------------------------+
32// |                              functions                                |
33// +-----------------------------------------------------------------------+
34
35// +-----------------------------------------------------------------------+
36// |                           initialization                              |
37// +-----------------------------------------------------------------------+
38
39if (!defined('PHPWG_ROOT_PATH'))
40{
41  die('Hacking attempt!');
42}
43
44include_once(PHPWG_ROOT_PATH.'admin/include/functions.php');
45include_once(PHPWG_ROOT_PATH.'admin/include/functions_history.inc.php');
46
47if (isset($_GET['start']) and is_numeric($_GET['start']))
48{
49  $page['start'] = $_GET['start'];
50}
51else
52{
53  $page['start'] = 0;
54}
55
56$types = array('none', 'picture', 'high', 'other');
57$display_thumbnails = array('no_display_thumbnail', 'display_thumbnail_classic', 'display_thumbnail_hoverbox');
58
59// +-----------------------------------------------------------------------+
60// | Check Access and exit when user status is not ok                      |
61// +-----------------------------------------------------------------------+
62
63check_status(ACCESS_ADMINISTRATOR);
64
65// +-----------------------------------------------------------------------+
66// | Build search criteria and redirect to results                         |
67// +-----------------------------------------------------------------------+
68
69$page['errors'] = array();
70$search = array();
71
72if (isset($_POST['submit']))
73{
74  // dates
75  if (!empty($_POST['start_year']))
76  {
77    $search['fields']['date-after'] = sprintf(
78      '%d-%02d-%02d',
79      $_POST['start_year'],
80      $_POST['start_month'],
81      $_POST['start_day']
82      );
83  }
84
85  if (!empty($_POST['end_year']))
86  {
87    $search['fields']['date-before'] = sprintf(
88      '%d-%02d-%02d',
89      $_POST['end_year'],
90      $_POST['end_month'],
91      $_POST['end_day']
92      );
93  }
94
95  $search['fields']['types'] = $_POST['types'];
96
97  $search['fields']['user'] = $_POST['user'];
98
99  if (!empty($_POST['image_id']))
100  {
101    $search['fields']['image_id'] = intval($_POST['image_id']);
102  }
103 
104  if (!empty($_POST['filename']))
105  {
106    $search['fields']['filename'] = str_replace(
107      '*',
108      '%',
109      mysql_escape_string($_POST['filename'])
110      );
111  }
112
113  $search['fields']['display_thumbnail'] = $_POST['display_thumbnail'];
114  // Display choise are also save to one cookie
115  pwg_set_cookie_var('history_display_thumbnail', $_POST['display_thumbnail']);
116
117  // TODO manage inconsistency of having $_POST['image_id'] and
118  // $_POST['filename'] simultaneously
119 
120  // echo '<pre>'; print_r($search); echo '</pre>';
121 
122  if (!empty($search))
123  {
124    // register search rules in database, then they will be available on
125    // thumbnails page and picture page.
126    $query ='
127INSERT INTO '.SEARCH_TABLE.'
128  (rules)
129  VALUES
130  (\''.serialize($search).'\')
131;';
132    pwg_query($query);
133
134    $search_id = mysql_insert_id();
135   
136    redirect(
137      PHPWG_ROOT_PATH.'admin.php?page=history&search_id='.$search_id
138      );
139  }
140  else
141  {
142    array_push($page['errors'], $lang['search_one_clause_at_least']);
143  }
144}
145
146// +-----------------------------------------------------------------------+
147// |                             template init                             |
148// +-----------------------------------------------------------------------+
149
150$template->set_filename('history', 'admin/history.tpl');
151
152// TabSheet initialization
153history_tabsheet();
154
155$base_url = PHPWG_ROOT_PATH.'admin.php?page=history';
156
157$template->assign_vars(
158  array(
159    'U_HELP' => PHPWG_ROOT_PATH.'popuphelp.php?page=history',
160
161    'F_ACTION' => PHPWG_ROOT_PATH.'admin.php?page=history'
162    )
163  );
164
165$template->assign_vars(
166  array(
167    'TODAY_DAY'   => date('d', time()),
168    'TODAY_MONTH' => date('m', time()),
169    'TODAY_YEAR'  => date('Y', time()),
170    )
171  );
172
173// +-----------------------------------------------------------------------+
174// |                             history lines                             |
175// +-----------------------------------------------------------------------+
176
177if (isset($_GET['search_id'])
178    and $page['search_id'] = (int)$_GET['search_id'])
179{
180  // what are the lines to display in reality ?
181  $query = '
182SELECT rules
183  FROM '.SEARCH_TABLE.'
184  WHERE id = '.$page['search_id'].'
185;';
186  list($serialized_rules) = mysql_fetch_row(pwg_query($query));
187
188  $page['search'] = unserialize($serialized_rules);
189
190  if (isset($_GET['user_id']))
191  {
192    if (!is_numeric($_GET['user_id']))
193    {
194      die('user_id GET parameter must be an integer value');
195    }
196
197    $page['search']['fields']['user'] = $_GET['user_id'];
198   
199    $query ='
200INSERT INTO '.SEARCH_TABLE.'
201  (rules)
202  VALUES
203  (\''.serialize($page['search']).'\')
204;';
205    pwg_query($query);
206
207    $search_id = mysql_insert_id();
208   
209    redirect(
210      PHPWG_ROOT_PATH.'admin.php?page=history&search_id='.$search_id
211      );
212  }
213
214 
215  if (isset($page['search']['fields']['filename']))
216  {
217    $query = '
218SELECT
219    id
220  FROM '.IMAGES_TABLE.'
221  WHERE file LIKE \''.$page['search']['fields']['filename'].'\'
222;';
223    $page['search']['image_ids'] = array_from_query($query, 'id');
224  }
225 
226  // echo '<pre>'; print_r($page['search']); echo '</pre>';
227 
228  $clauses = array();
229
230  if (isset($page['search']['fields']['date-after']))
231  {
232    array_push(
233      $clauses,
234      "date >= '".$page['search']['fields']['date-after']."'"
235      );
236  }
237
238  if (isset($page['search']['fields']['date-before']))
239  {
240    array_push(
241      $clauses,
242      "date <= '".$page['search']['fields']['date-before']."'"
243      );
244  }
245
246  if (isset($page['search']['fields']['types']))
247  {
248    $local_clauses = array();
249   
250    foreach ($types as $type) {
251      if (in_array($type, $page['search']['fields']['types'])) {
252        $clause = 'image_type ';
253        if ($type == 'none')
254        {
255          $clause.= 'IS NULL';
256        }
257        else
258        {
259          $clause.= "= '".$type."'";
260        }
261       
262        array_push($local_clauses, $clause);
263      }
264    }
265   
266    if (count($local_clauses) > 0)
267    {
268      array_push(
269        $clauses,
270        implode(' OR ', $local_clauses)
271        );
272    }
273  }
274
275  if (isset($page['search']['fields']['user'])
276      and $page['search']['fields']['user'] != -1)
277  {
278    array_push(
279      $clauses,
280      'user_id = '.$page['search']['fields']['user']
281      );
282  }
283
284  if (isset($page['search']['fields']['image_id']))
285  {
286    array_push(
287      $clauses,
288      'image_id = '.$page['search']['fields']['image_id']
289      );
290  }
291 
292  if (isset($page['search']['fields']['filename']))
293  {
294    if (count($page['search']['image_ids']) == 0)
295    {
296      // a clause that is always false
297      array_push($clauses, '1 = 2 ');
298    }
299    else
300    {
301      array_push(
302        $clauses,
303        'image_id IN ('.implode(', ', $page['search']['image_ids']).')'
304        );
305    }
306  }
307 
308  $clauses = prepend_append_array_items($clauses, '(', ')');
309
310  $where_separator =
311    implode(
312      "\n    AND ",
313      $clauses
314      );
315 
316  $query = '
317SELECT
318    date,
319    time,
320    user_id,
321    IP,
322    section,
323    category_id,
324    tag_ids,
325    image_id,
326    image_type
327  FROM '.HISTORY_TABLE.'
328  WHERE '.$where_separator.'
329;';
330
331  // LIMIT '.$page['start'].', '.$conf['nb_logs_page'].'
332
333  $result = pwg_query($query);
334
335  $page['nb_lines'] = mysql_num_rows($result);
336 
337  $history_lines = array();
338  $user_ids = array();
339  $username_of = array();
340  $category_ids = array();
341  $image_ids = array();
342  $tag_ids = array();
343 
344  while ($row = mysql_fetch_assoc($result))
345  {
346    $user_ids[$row['user_id']] = 1;
347
348    if (isset($row['category_id']))
349    {
350      $category_ids[$row['category_id']] = 1;
351    }
352
353    if (isset($row['image_id']))
354    {
355      $image_ids[$row['image_id']] = 1;
356    }
357
358    if (isset($row['tag_ids']))
359    {
360      foreach (explode(',', $row['tag_ids']) as $tag_id)
361      {
362        array_push($tag_ids, $tag_id);
363      }
364    }
365
366    array_push(
367      $history_lines,
368      $row
369      );
370  }
371
372  // prepare reference data (users, tags, categories...)
373  if (count($user_ids) > 0)
374  {
375    $query = '
376SELECT '.$conf['user_fields']['id'].' AS id
377     , '.$conf['user_fields']['username'].' AS username
378  FROM '.USERS_TABLE.'
379  WHERE id IN ('.implode(',', array_keys($user_ids)).')
380;';
381    $result = pwg_query($query);
382
383    $username_of = array();
384    while ($row = mysql_fetch_array($result))
385    {
386      $username_of[$row['id']] = $row['username'];
387    }
388  }
389
390  if (count($category_ids) > 0)
391  {
392    $query = '
393SELECT id, uppercats
394  FROM '.CATEGORIES_TABLE.'
395  WHERE id IN ('.implode(',', array_keys($category_ids)).')
396;';
397    $uppercats_of = simple_hash_from_query($query, 'id', 'uppercats');
398
399    $name_of_category = array();
400   
401    foreach ($uppercats_of as $category_id => $uppercats)
402    {
403      $name_of_category[$category_id] = get_cat_display_name_cache(
404        $uppercats
405        );
406    }
407  }
408
409  if (count($image_ids) > 0)
410  {
411    $query = '
412SELECT
413    id,
414    IF(name IS NULL, file, name) AS label,
415    filesize,
416    high_filesize,
417    file,
418    path,
419    tn_ext
420  FROM '.IMAGES_TABLE.'
421  WHERE id IN ('.implode(',', array_keys($image_ids)).')
422;';
423    // $label_of_image = simple_hash_from_query($query, 'id', 'label');
424    $label_of_image = array();
425    $filesize_of_image = array();
426    $high_filesize_of_image = array();
427    $file_of_image = array();
428    $path_of_image = array();
429    $tn_ext_of_image = array();
430
431    $result = pwg_query($query);
432    while ($row = mysql_fetch_array($result))
433    {
434      $label_of_image[ $row['id'] ] = $row['label'];
435
436      if (isset($row['filesize']))
437      {
438        $filesize_of_image[ $row['id'] ] = $row['filesize'];
439      }
440
441      if (isset($row['high_filesize']))
442      {
443        $high_filesize_of_image[ $row['id'] ] = $row['high_filesize'];
444      }
445
446      $file_of_image[ $row['id'] ] = $row['file'];
447      $path_of_image[ $row['id'] ] = $row['path'];
448      $tn_ext_of_image[ $row['id'] ] = $row['tn_ext'];
449    }
450
451    // echo '<pre>'; print_r($high_filesize_of_image); echo '</pre>';
452  }
453
454  if (count($tag_ids) > 0)
455  {
456    $tag_ids = array_unique($tag_ids);
457
458    $query = '
459SELECT
460    id,
461    name
462  FROM '.TAGS_TABLE.'
463  WHERE id IN ('.implode(', ', $tag_ids).')
464;';
465    $name_of_tag = array();
466
467    $result = pwg_query($query);
468    while ($row = mysql_fetch_array($result))
469    {
470      $name_of_tag[ $row['id'] ] = $row['name'];
471    }
472  }
473 
474  $i = 0;
475  $first_line = $page['start'] + 1;
476  $last_line = $page['start'] + $conf['nb_logs_page'];
477
478  $summary['total_filesize'] = 0;
479  $summary['guests_IP'] = array();
480
481  foreach ($history_lines as $line)
482  {
483    // FIXME when we watch the representative of a non image element, it is
484    // the not the representative filesize that is counted (as it is
485    // unknown) but the non image element filesize. Proposed solution: add
486    // #images.representative_filesize and add 'representative' in the
487    // choices of #history.image_type.
488   
489    if (isset($line['image_type']))
490    {
491      if ($line['image_type'] == 'high')
492      {
493        if (isset($high_filesize_of_image[$line['image_id']]))
494        {
495          $summary['total_filesize']+=
496            $high_filesize_of_image[$line['image_id']];
497        }
498      }
499      else
500      {
501        if (isset($filesize_of_image[$line['image_id']]))
502        {
503          $summary['total_filesize']+=
504            $filesize_of_image[$line['image_id']];
505        }
506      }
507    }
508
509    if ($line['user_id'] == $conf['guest_id'])
510    {
511      if (!isset($summary['guests_IP'][ $line['IP'] ]))
512      {
513        $summary['guests_IP'][ $line['IP'] ] = 0;
514      }
515     
516      $summary['guests_IP'][ $line['IP'] ]++;
517    }
518   
519    $i++;
520   
521    if ($i < $first_line or $i > $last_line)
522    {
523      continue;
524    }
525
526    $user_string = '';
527    if (isset($username_of[$line['user_id']]))
528    {
529      $user_string.= $username_of[$line['user_id']];
530    }
531    else
532    {
533      $user_string.= $line['user_id'];
534    }
535    $user_string.= '&nbsp;<a href="';
536    $user_string.= PHPWG_ROOT_PATH.'admin.php?page=history';
537    $user_string.= '&amp;search_id='.$page['search_id'];
538    $user_string.= '&amp;user_id='.$line['user_id'];
539    $user_string.= '">+</a>';
540
541    $tags_string = '';
542    if (isset($line['tag_ids']))
543    {
544      $tags_string = preg_replace(
545        '/(\d+)/e',
546        '$name_of_tag["$1"]',
547        str_replace(
548          ',',
549          ', ',
550          $line['tag_ids']
551          )
552        );
553    }
554
555    $image_string = '';
556    if (isset($line['image_id']))
557    {
558      $picture_url = make_picture_url(
559        array(
560          'image_id' => $line['image_id'],
561          )
562        );
563
564      $element = array(
565           'id' => $line['image_id'],
566           'file' => $file_of_image[$line['image_id']],
567           'path' => $path_of_image[$line['image_id']],
568           'tn_ext' => $tn_ext_of_image[$line['image_id']],
569           );
570
571      $image_title = '('.$line['image_id'].')';
572
573      if (isset($label_of_image[$line['image_id']]))
574      {
575        $image_title.= ' '.$label_of_image[$line['image_id']];
576      }
577      else
578      {
579        $image_title.= ' unknown filename';
580      }
581
582      $image_string = '';
583
584      switch ($page['search']['fields']['display_thumbnail'])
585      {
586        case 'no_display_thumbnail':
587        {
588          $image_string= '<a href="'.$picture_url.'">'.$image_title.'</a>';
589          break;
590        }
591        case 'display_thumbnail_classic':
592        {
593          $image_string =
594            '<a class="thumbnail" href="'.$picture_url.'">'
595            .'<span><img src="'.get_thumbnail_url($element)
596            .'" alt="'.$image_title.'" title="'.$image_title.'">'
597            .'</span></a>';
598          break;
599        }
600        case 'display_thumbnail_hoverbox':
601        {
602          $image_string =
603            '<a class="over" href="'.$picture_url.'">'
604            .'<span><img src="'.get_thumbnail_url($element)
605            .'" alt="'.$image_title.'" title="'.$image_title.'">'
606            .'</span>'.$image_title.'</a>';
607          break;
608        }
609      }
610    }
611   
612    $template->assign_block_vars(
613      'detail',
614      array(
615        'DATE'      => $line['date'],
616        'TIME'      => $line['time'],
617        'USER'      => $user_string,
618        'IP'        => $line['IP'],
619        'IMAGE'     => $image_string,
620        'TYPE'      => $line['image_type'],
621        'SECTION'   => $line['section'],
622        'CATEGORY'  => isset($line['category_id'])
623          ? ( isset($name_of_category[$line['category_id']])
624                ? $name_of_category[$line['category_id']]
625                : 'deleted '.$line['category_id'] )
626          : '',
627        'TAGS'       => $tags_string,
628        'T_CLASS'   => ($i % 2) ? 'row1' : 'row2',
629        )
630      );
631  }
632
633  $summary['nb_guests'] = 0;
634  if (count(array_keys($summary['guests_IP'])) > 0)
635  {
636    $summary['nb_guests'] = count(array_keys($summary['guests_IP']));
637
638    // we delete the "guest" from the $username_of hash so that it is
639    // avoided in next steps
640    unset($username_of[ $conf['guest_id'] ]);
641  }
642 
643  $summary['nb_members'] = count($username_of);
644
645  $member_strings = array();
646  foreach ($username_of as $user_id => $user_name)
647  {
648    $member_string = $user_name.'&nbsp;<a href="';
649    $member_string.= PHPWG_ROOT_PATH.'admin.php?page=history';
650    $member_string.= '&amp;search_id='.$page['search_id'];
651    $member_string.= '&amp;user_id='.$user_id;
652    $member_string.= '">+</a>';
653
654    $member_strings[] = $member_string;
655  }
656 
657  $template->assign_block_vars(
658    'summary',
659    array(
660      'NB_LINES' => l10n_dec(
661        '%d line filtered', '%d lines filtered',
662        $page['nb_lines']
663        ),
664      'FILESIZE' => $summary['total_filesize'].' KB',
665      'USERS' => l10n_dec(
666        '%d user', '%d users',
667        $summary['nb_members'] + $summary['nb_guests']
668        ),
669      'MEMBERS' => sprintf(
670        l10n_dec('%d member', '%d members', $summary['nb_members']).': %s',
671        implode(
672          ', ',
673          $member_strings
674          )
675        ),
676      'GUESTS' => l10n_dec(
677        '%d guest', '%d guests',
678        $summary['nb_guests']
679        ),
680      )
681    );
682}
683
684// +-----------------------------------------------------------------------+
685// |                            navigation bar                             |
686// +-----------------------------------------------------------------------+
687
688if (isset($page['search_id']))
689{
690  $navbar = create_navigation_bar(
691    PHPWG_ROOT_PATH.'admin.php'.get_query_string_diff(array('start')),
692    $page['nb_lines'],
693    $page['start'],
694    $conf['nb_logs_page']
695    );
696
697  $template->assign_block_vars(
698    'navigation',
699    array(
700      'NAVBAR' => $navbar
701      )
702    );
703}
704
705// +-----------------------------------------------------------------------+
706// |                             filter form                               |
707// +-----------------------------------------------------------------------+
708
709$form = array();
710
711if (isset($page['search']))
712{
713  if (isset($page['search']['fields']['date-after']))
714  {
715    $tokens = explode('-', $page['search']['fields']['date-after']);
716   
717    $form['start_year']  = (int)$tokens[0];
718    $form['start_month'] = (int)$tokens[1];
719    $form['start_day']   = (int)$tokens[2];
720  }
721
722  if (isset($page['search']['fields']['date-before']))
723  {
724    $tokens = explode('-', $page['search']['fields']['date-before']);
725
726    $form['end_year']  = (int)$tokens[0];
727    $form['end_month'] = (int)$tokens[1];
728    $form['end_day']   = (int)$tokens[2];
729  }
730
731  $form['types'] = $page['search']['fields']['types'];
732
733  if (isset($page['search']['fields']['user']))
734  {
735    $form['user'] = $page['search']['fields']['user'];
736  }
737  else
738  {
739    $form['user'] = null;
740  }
741
742  $form['image_id'] = @$page['search']['fields']['image_id'];
743  $form['filename'] = @$page['search']['fields']['filename'];
744
745  $form['display_thumbnail'] = @$page['search']['fields']['display_thumbnail'];
746}
747else
748{
749  // by default, at page load, we want the selected date to be the current
750  // date
751  $form['start_year']  = $form['end_year']  = date('Y');
752  $form['start_month'] = $form['end_month'] = date('n');
753  $form['start_day']   = $form['end_day']   = date('j');
754  $form['types'] = $types;
755  // Hoverbox by default
756  $form['display_thumbnail'] =
757    pwg_get_cookie_var('history_display_thumbnail', $display_thumbnails[2]);
758}
759
760// start date
761get_day_list('start_day', @$form['start_day']);
762get_month_list('start_month', @$form['start_month']);
763// end date
764get_day_list('end_day', @$form['end_day']);
765get_month_list('end_month', @$form['end_month']);
766
767$template->assign_vars(
768  array(
769    'START_YEAR' => @$form['start_year'],
770    'END_YEAR'   => @$form['end_year'],
771    'IMAGE_ID' => @$form['image_id'],
772    'FILENAME' => @$form['filename'],
773    )
774  );
775
776foreach ($types as $option)
777{
778  $selected = '';
779 
780  if (in_array($option, $form['types']))
781  {
782    $selected = 'selected="selected"';
783  }
784 
785  $template->assign_block_vars(
786    'types_option',
787    array(
788      'VALUE' => $option,
789      'CONTENT' => l10n($option),
790      'SELECTED' => $selected,
791      )
792    );
793}
794
795$template->assign_block_vars(
796  'user_option',
797  array(
798    'VALUE'=> -1,
799    'CONTENT' => '------------',
800    'SELECTED' => ''
801    )
802  );
803
804$query = '
805SELECT
806    '.$conf['user_fields']['id'].' AS id,
807    '.$conf['user_fields']['username'].' AS username
808  FROM '.USERS_TABLE.'
809  ORDER BY username ASC
810;';
811$result = pwg_query($query);
812
813while ($row = mysql_fetch_array($result))
814{
815  $selected = '';
816
817  if (isset($form['user'])
818      and $row['id'] == $form['user'])
819  {
820    $selected = 'selected="selected"';
821  }
822 
823  $template->assign_block_vars(
824    'user_option',
825    array(
826      'VALUE' => $row['id'],
827      'CONTENT' => $row['username'],
828      'SELECTED' => $selected,
829      )
830    );
831}
832
833foreach ($display_thumbnails as $display_thumbnail)
834{
835  $selected = '';
836 
837  if ($display_thumbnail === $form['display_thumbnail'])
838  {
839    $selected = 'selected="selected"';
840  }
841 
842  $template->assign_block_vars(
843    'display_thumbnail',
844    array(
845      'VALUE' => $display_thumbnail,
846      'CONTENT' => l10n($display_thumbnail),
847      'SELECTED' => $selected,
848      )
849    );
850}
851
852// +-----------------------------------------------------------------------+
853// |                           html code display                           |
854// +-----------------------------------------------------------------------+
855
856$template->assign_var_from_handle('ADMIN_CONTENT', 'history');
857?>
Note: See TracBrowser for help on using the repository browser.