xref: /plugin/statistics/admin.php (revision 441bfb8ee3582ca9d573b9b5250f86e11c783c41)
11878f16fSAndreas Gohr<?php
21878f16fSAndreas Gohr/**
31878f16fSAndreas Gohr * statistics plugin
41878f16fSAndreas Gohr *
51878f16fSAndreas Gohr * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
66b6f8822SAndreas Gohr * @author     Andreas Gohr <gohr@splitbrain.org>
71878f16fSAndreas Gohr */
81878f16fSAndreas Gohr
91878f16fSAndreas Gohr// must be run within Dokuwiki
101878f16fSAndreas Gohrif(!defined('DOKU_INC')) die();
111878f16fSAndreas Gohr
122998b1f6SAndreas Gohr
131878f16fSAndreas Gohr/**
141878f16fSAndreas Gohr * All DokuWiki plugins to extend the admin function
151878f16fSAndreas Gohr * need to inherit from this class
161878f16fSAndreas Gohr */
171878f16fSAndreas Gohrclass admin_plugin_statistics extends DokuWiki_Admin_Plugin {
18a901d721SAndreas Gohr    public    $dblink = null;
19a901d721SAndreas Gohr    protected $opt    = '';
20a901d721SAndreas Gohr    protected $from   = '';
21a901d721SAndreas Gohr    protected $to     = '';
22a901d721SAndreas Gohr    protected $start  = '';
23a901d721SAndreas Gohr    protected $tlimit = '';
24a901d721SAndreas Gohr
25a901d721SAndreas Gohr    /**
26a901d721SAndreas Gohr     * Available statistic pages
27a901d721SAndreas Gohr     */
28a901d721SAndreas Gohr    protected $pages  = array('dashboard','page','referer','newreferer',
295bccfe87SAndreas Gohr                              'outlinks','searchengines','searchphrases',
305bccfe87SAndreas Gohr                              'searchwords', 'internalsearchphrases',
315bccfe87SAndreas Gohr                              'internalsearchwords','browsers','os',
325bccfe87SAndreas Gohr                              'countries','resolution');
331878f16fSAndreas Gohr
341878f16fSAndreas Gohr    /**
356b6f8822SAndreas Gohr     * Initialize the helper
366b6f8822SAndreas Gohr     */
376b6f8822SAndreas Gohr    public function __construct() {
386b6f8822SAndreas Gohr        $this->hlp = plugin_load('helper','statistics');
396b6f8822SAndreas Gohr    }
406b6f8822SAndreas Gohr
416b6f8822SAndreas Gohr    /**
421878f16fSAndreas Gohr     * Access for managers allowed
431878f16fSAndreas Gohr     */
446b6f8822SAndreas Gohr    public function forAdminOnly(){
451878f16fSAndreas Gohr        return false;
461878f16fSAndreas Gohr    }
471878f16fSAndreas Gohr
481878f16fSAndreas Gohr    /**
491878f16fSAndreas Gohr     * return sort order for position in admin menu
501878f16fSAndreas Gohr     */
516b6f8822SAndreas Gohr    public function getMenuSort() {
526b6f8822SAndreas Gohr        return 350;
531878f16fSAndreas Gohr    }
541878f16fSAndreas Gohr
551878f16fSAndreas Gohr    /**
561878f16fSAndreas Gohr     * handle user request
571878f16fSAndreas Gohr     */
586b6f8822SAndreas Gohr    public function handle() {
59264f1744SAndreas Gohr        $this->opt = preg_replace('/[^a-z]+/','',$_REQUEST['opt']);
60a901d721SAndreas Gohr        if(!in_array($this->opt,$this->pages)) $this->opt = 'dashboard';
61a901d721SAndreas Gohr
6295eb68e6SAndreas Gohr        $this->start = (int) $_REQUEST['s'];
63e8699bceSAndreas Gohr        $this->setTimeframe($_REQUEST['f'],$_REQUEST['t']);
64e8699bceSAndreas Gohr    }
6595eb68e6SAndreas Gohr
66e8699bceSAndreas Gohr    /**
67e8699bceSAndreas Gohr     * set limit clause
68e8699bceSAndreas Gohr     */
696b6f8822SAndreas Gohr    public function setTimeframe($from,$to){
70264f1744SAndreas Gohr        // fixme add better sanity checking here:
71e8699bceSAndreas Gohr        $from = preg_replace('/[^\d\-]+/','',$from);
72e8699bceSAndreas Gohr        $to   = preg_replace('/[^\d\-]+/','',$to);
73e8699bceSAndreas Gohr        if(!$from) $from = date('Y-m-d');
74e8699bceSAndreas Gohr        if(!$to)   $to   = date('Y-m-d');
75264f1744SAndreas Gohr
76264f1744SAndreas Gohr        //setup limit clause
772ee939eeSAndreas Gohr        $tlimit = "A.dt >= '$from 00:00:00' AND A.dt <= '$to 23:59:59'";
78e8699bceSAndreas Gohr        $this->tlimit = $tlimit;
79e8699bceSAndreas Gohr        $this->from   = $from;
80e8699bceSAndreas Gohr        $this->to     = $to;
811878f16fSAndreas Gohr    }
821878f16fSAndreas Gohr
831878f16fSAndreas Gohr    /**
8479b4a855SAndreas Gohr     * Output the Statistics
851878f16fSAndreas Gohr     */
861878f16fSAndreas Gohr    function html() {
871d2d78ccSAndreas Gohr        echo '<div id="plugin__statistics">';
88264f1744SAndreas Gohr        echo '<h1>Access Statistics</h1>';
89264f1744SAndreas Gohr        $this->html_timeselect();
90*441bfb8eSAndreas Gohr        tpl_flush();
91264f1744SAndreas Gohr
9279b4a855SAndreas Gohr        $method = 'html_'.$this->opt;
9379b4a855SAndreas Gohr        if(method_exists($this,$method)){
94a901d721SAndreas Gohr            echo '<div class="plg_stats_'.$this->opt.'">';
95a901d721SAndreas Gohr            echo '<h2>'.$this->getLang($this->opt).'</h2>';
9679b4a855SAndreas Gohr            $this->$method();
97a901d721SAndreas Gohr            echo '</div>';
9814d99ec0SAndreas Gohr        }
991d2d78ccSAndreas Gohr        echo '</div>';
10014d99ec0SAndreas Gohr    }
10114d99ec0SAndreas Gohr
1026b6f8822SAndreas Gohr    /**
1036b6f8822SAndreas Gohr     * Return the TOC
1046b6f8822SAndreas Gohr     *
1056b6f8822SAndreas Gohr     * @return array
1066b6f8822SAndreas Gohr     */
10747ffcf7dSAndreas Gohr    function getTOC(){
10847ffcf7dSAndreas Gohr        $toc = array();
109a901d721SAndreas Gohr        foreach($this->pages as $page){
11047ffcf7dSAndreas Gohr            $toc[] = array(
11147ffcf7dSAndreas Gohr                    'link'  => '?do=admin&amp;page=statistics&amp;opt='.$page.'&amp;f='.$this->from.'&amp;t='.$this->to,
11247ffcf7dSAndreas Gohr                    'title' => $this->getLang($page),
11347ffcf7dSAndreas Gohr                    'level' => 1,
11447ffcf7dSAndreas Gohr                    'type'  => 'ul'
11547ffcf7dSAndreas Gohr            );
11647ffcf7dSAndreas Gohr        }
11747ffcf7dSAndreas Gohr        return $toc;
1189da6395dSAndreas Gohr    }
1199da6395dSAndreas Gohr
120dc7b1e5eSAndreas Gohr
121dc7b1e5eSAndreas Gohr    function html_graph($name,$width,$height){
122dc7b1e5eSAndreas Gohr        $url = DOKU_BASE.'lib/plugins/statistics/img.php?img='.$name.
123dc7b1e5eSAndreas Gohr               '&amp;f='.$this->from.'&amp;t='.$this->to;
124dc7b1e5eSAndreas Gohr        echo '<img src="'.$url.'" class="graph" width="'.$width.'" height="'.$height.'"/>';
125dc7b1e5eSAndreas Gohr    }
126dc7b1e5eSAndreas Gohr
127dc7b1e5eSAndreas Gohr
1286b6f8822SAndreas Gohr    /**
1296b6f8822SAndreas Gohr     * Outputs pagination links
1306b6f8822SAndreas Gohr     *
1316b6f8822SAndreas Gohr     * @fixme does this still work?
1326b6f8822SAndreas Gohr     *
1336b6f8822SAndreas Gohr     * @param type $limit
1346b6f8822SAndreas Gohr     * @param type $next
1356b6f8822SAndreas Gohr     */
1362507f8e0SAndreas Gohr    function html_pager($limit,$next){
1372507f8e0SAndreas Gohr        echo '<div class="plg_stats_pager">';
1382507f8e0SAndreas Gohr
1392507f8e0SAndreas Gohr        if($this->start > 0){
1402507f8e0SAndreas Gohr            $go = max($this->start - $limit, 0);
1412507f8e0SAndreas Gohr            echo '<a href="?do=admin&amp;page=statistics&amp;opt='.$this->opt.'&amp;f='.$this->from.'&amp;t='.$this->to.'&amp;s='.$go.'" class="prev">previous page</a>';
1422507f8e0SAndreas Gohr        }
1432507f8e0SAndreas Gohr
1442507f8e0SAndreas Gohr        if($next){
1452507f8e0SAndreas Gohr            $go = $this->start + $limit;
1462507f8e0SAndreas Gohr            echo '<a href="?do=admin&amp;page=statistics&amp;opt='.$this->opt.'&amp;f='.$this->from.'&amp;t='.$this->to.'&amp;s='.$go.'" class="next">next page</a>';
1472507f8e0SAndreas Gohr        }
1482507f8e0SAndreas Gohr        echo '</div>';
1492507f8e0SAndreas Gohr    }
1502507f8e0SAndreas Gohr
151264f1744SAndreas Gohr    /**
152264f1744SAndreas Gohr     * Print the time selection menu
153264f1744SAndreas Gohr     */
15414d99ec0SAndreas Gohr    function html_timeselect(){
1556985b606SAndreas Gohr        $today   = date('Y-m-d');
1566985b606SAndreas Gohr        $last1   = date('Y-m-d',time()-(60*60*24));
1576985b606SAndreas Gohr        $last7   = date('Y-m-d',time()-(60*60*24*7));
1586985b606SAndreas Gohr        $last30  = date('Y-m-d',time()-(60*60*24*30));
15914d99ec0SAndreas Gohr
160264f1744SAndreas Gohr        echo '<div class="plg_stats_timeselect">';
1616985b606SAndreas Gohr        echo '<span>'.$this->getLang('time_select').'</span> ';
162264f1744SAndreas Gohr
163264f1744SAndreas Gohr        echo '<form action="" method="get">';
164264f1744SAndreas Gohr        echo '<input type="hidden" name="do" value="admin" />';
165264f1744SAndreas Gohr        echo '<input type="hidden" name="page" value="statistics" />';
166264f1744SAndreas Gohr        echo '<input type="hidden" name="opt" value="'.$this->opt.'" />';
167264f1744SAndreas Gohr        echo '<input type="text" name="f" value="'.$this->from.'" class="edit" />';
168264f1744SAndreas Gohr        echo '<input type="text" name="t" value="'.$this->to.'" class="edit" />';
169264f1744SAndreas Gohr        echo '<input type="submit" value="go" class="button" />';
17014d99ec0SAndreas Gohr        echo '</form>';
171264f1744SAndreas Gohr
1726985b606SAndreas Gohr        echo '<ul>';
1736985b606SAndreas Gohr        foreach(array('today','last1','last7','last30') as $time){
1746985b606SAndreas Gohr            echo '<li>';
1756985b606SAndreas Gohr            echo '<a href="?do=admin&amp;page=statistics&amp;opt='.$this->opt.'&amp;f='.$$time.'&amp;t='.$today.'">';
1766985b606SAndreas Gohr            echo $this->getLang('time_'.$time);
1776985b606SAndreas Gohr            echo '</a>';
1786985b606SAndreas Gohr            echo '</li>';
1796985b606SAndreas Gohr        }
1806985b606SAndreas Gohr        echo '</ul>';
1816985b606SAndreas Gohr
182264f1744SAndreas Gohr        echo '</div>';
18314d99ec0SAndreas Gohr    }
18414d99ec0SAndreas Gohr
18514d99ec0SAndreas Gohr
186f5f32cbfSAndreas Gohr    /**
187f5f32cbfSAndreas Gohr     * Print an introductionary screen
188f5f32cbfSAndreas Gohr     */
18914d99ec0SAndreas Gohr    function html_dashboard(){
190878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_dashboard').'</p>';
1912812a751SAndreas Gohr
1922812a751SAndreas Gohr        // general info
1932812a751SAndreas Gohr        echo '<div class="plg_stats_top">';
1946b6f8822SAndreas Gohr        $result = $this->hlp->Query()->aggregate($this->tlimit);
1951d2d78ccSAndreas Gohr
1961d2d78ccSAndreas Gohr        echo '<ul class="left">';
1971d2d78ccSAndreas Gohr        foreach(array('pageviews','sessions','visitors','users','logins') as $name){
198eabe0d07SAndreas Gohr            echo '<li><div class="li">'.sprintf($this->getLang('dash_'.$name),$result[$name]).'</div></li>';
199eabe0d07SAndreas Gohr        }
2002812a751SAndreas Gohr        echo '</ul>';
2011d2d78ccSAndreas Gohr
2021d2d78ccSAndreas Gohr        echo '<ul class="left">';
2031d2d78ccSAndreas Gohr        foreach(array('bouncerate','timespent','avgpages','newvisitors','registrations') as $name){
2041d2d78ccSAndreas Gohr            echo '<li><div class="li">'.sprintf($this->getLang('dash_'.$name),$result[$name]).'</div></li>';
2051d2d78ccSAndreas Gohr        }
2061d2d78ccSAndreas Gohr        echo '</ul>';
2071d2d78ccSAndreas Gohr
208dc7b1e5eSAndreas Gohr        $this->html_graph('trend',700,280);
2092812a751SAndreas Gohr        echo '</div>';
2102812a751SAndreas Gohr
21114d99ec0SAndreas Gohr
21287d5e44bSAndreas Gohr        // top pages today
213264f1744SAndreas Gohr        echo '<div>';
214dc7b1e5eSAndreas Gohr        echo '<h2>'.$this->getLang('dash_mostpopular').'</h2>';
2156b6f8822SAndreas Gohr        $result = $this->hlp->Query()->pages($this->tlimit,$this->start,15);
2162812a751SAndreas Gohr        $this->html_resulttable($result);
2172507f8e0SAndreas Gohr        echo '<a href="?do=admin&amp;page=statistics&amp;opt=page&amp;f='.$this->from.'&amp;t='.$this->to.'" class="more">more</a>';
218264f1744SAndreas Gohr        echo '</div>';
21987d5e44bSAndreas Gohr
22087d5e44bSAndreas Gohr        // top referer today
221264f1744SAndreas Gohr        echo '<div>';
222dc7b1e5eSAndreas Gohr        echo '<h2>'.$this->getLang('dash_newincoming').'</h2>';
2236b6f8822SAndreas Gohr        $result = $this->hlp->Query()->newreferer($this->tlimit,$this->start,15);
2242812a751SAndreas Gohr        $this->html_resulttable($result);
2252507f8e0SAndreas Gohr        echo '<a href="?do=admin&amp;page=statistics&amp;opt=newreferer&amp;f='.$this->from.'&amp;t='.$this->to.'" class="more">more</a>';
226264f1744SAndreas Gohr        echo '</div>';
22754f6c432SAndreas Gohr
22829dea504SAndreas Gohr        // top searches today
229264f1744SAndreas Gohr        echo '<div>';
230dc7b1e5eSAndreas Gohr        echo '<h2>'.$this->getLang('dash_topsearch').'</h2>';
2316b6f8822SAndreas Gohr        $result = $this->hlp->Query()->searchphrases($this->tlimit,$this->start,15);
23229dea504SAndreas Gohr        $this->html_resulttable($result);
23329dea504SAndreas Gohr        echo '<a href="?do=admin&amp;page=statistics&amp;opt=searchphrases&amp;f='.$this->from.'&amp;t='.$this->to.'" class="more">more</a>';
234264f1744SAndreas Gohr        echo '</div>';
23514d99ec0SAndreas Gohr    }
23614d99ec0SAndreas Gohr
237c67866d1SAndreas Gohr    function html_countries(){
238878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_countries').'</p>';
239878be5c9SAndreas Gohr        $this->html_graph('countries',400,200);
2406b6f8822SAndreas Gohr        $result = $this->hlp->Query()->countries($this->tlimit,$this->start,150);
2412507f8e0SAndreas Gohr        $this->html_resulttable($result,'',150);
2429da6395dSAndreas Gohr    }
2439da6395dSAndreas Gohr
2449da6395dSAndreas Gohr    function html_page(){
245878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_page').'</p>';
2466b6f8822SAndreas Gohr        $result = $this->hlp->Query()->pages($this->tlimit,$this->start,150);
2472507f8e0SAndreas Gohr        $this->html_resulttable($result,'',150);
2489da6395dSAndreas Gohr    }
2499da6395dSAndreas Gohr
2504f41a2ccSAndreas Gohr    function html_browsers(){
251878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_browsers').'</p>';
252878be5c9SAndreas Gohr        $this->html_graph('browsers',400,200);
2536b6f8822SAndreas Gohr        $result = $this->hlp->Query()->browsers($this->tlimit,$this->start,150,true);
2542507f8e0SAndreas Gohr        $this->html_resulttable($result,'',150);
25575fa767dSAndreas Gohr    }
25675fa767dSAndreas Gohr
257bd4217d3SAndreas Gohr    function html_os(){
258878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_os').'</p>';
259878be5c9SAndreas Gohr        $this->html_graph('os',400,200);
2606b6f8822SAndreas Gohr        $result = $this->hlp->Query()->os($this->tlimit,$this->start,150,true);
2612507f8e0SAndreas Gohr        $this->html_resulttable($result,'',150);
262bd4217d3SAndreas Gohr    }
263bd4217d3SAndreas Gohr
2649da6395dSAndreas Gohr    function html_referer(){
2656b6f8822SAndreas Gohr        $result = $this->hlp->Query()->aggregate($this->tlimit);
2662812a751SAndreas Gohr
2672812a751SAndreas Gohr        $all    = $result['search']+$result['external']+$result['direct'];
2682812a751SAndreas Gohr
26994023548SAndreas Gohr        if($all){
270878be5c9SAndreas Gohr            printf('<p>'.$this->getLang('intro_referer').'</p>',
271878be5c9SAndreas Gohr                   $all,$result['direct'],(100*$result['direct']/$all),
2722812a751SAndreas Gohr                   $result['search'],(100*$result['search']/$all),$result['external'],
2732812a751SAndreas Gohr                   (100*$result['external']/$all));
27494023548SAndreas Gohr        }
2752812a751SAndreas Gohr
2766b6f8822SAndreas Gohr        $result = $this->hlp->Query()->referer($this->tlimit,$this->start,150);
2772507f8e0SAndreas Gohr        $this->html_resulttable($result,'',150);
2789da6395dSAndreas Gohr    }
2799da6395dSAndreas Gohr
280e7a2f1e0SAndreas Gohr    function html_newreferer(){
281878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_newreferer').'</p>';
282e7a2f1e0SAndreas Gohr
2836b6f8822SAndreas Gohr        $result = $this->hlp->Query()->newreferer($this->tlimit,$this->start,150);
2842507f8e0SAndreas Gohr        $this->html_resulttable($result,'',150);
285e7a2f1e0SAndreas Gohr    }
286e7a2f1e0SAndreas Gohr
287e25286daSAndreas Gohr    function html_outlinks(){
288878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_outlinks').'</p>';
2896b6f8822SAndreas Gohr        $result = $this->hlp->Query()->outlinks($this->tlimit,$this->start,150);
290e25286daSAndreas Gohr        $this->html_resulttable($result,'',150);
291e25286daSAndreas Gohr    }
292e25286daSAndreas Gohr
29312dcdeccSAndreas Gohr    function html_searchphrases(){
294878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_searchphrases').'</p>';
2955bccfe87SAndreas Gohr        $result = $this->hlp->Query()->searchphrases(true,$this->tlimit,$this->start,150);
29612dcdeccSAndreas Gohr        $this->html_resulttable($result,'',150);
29712dcdeccSAndreas Gohr    }
29812dcdeccSAndreas Gohr
29912dcdeccSAndreas Gohr    function html_searchwords(){
300878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_searchwords').'</p>';
3015bccfe87SAndreas Gohr        $result = $this->hlp->Query()->searchwords(true,$this->tlimit,$this->start,150);
3025bccfe87SAndreas Gohr        $this->html_resulttable($result,'',150);
3035bccfe87SAndreas Gohr    }
3045bccfe87SAndreas Gohr
3055bccfe87SAndreas Gohr    function html_internalsearchphrases(){
306878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_internalsearchphrases').'</p>';
3075bccfe87SAndreas Gohr        $result = $this->hlp->Query()->searchphrases(false,$this->tlimit,$this->start,150);
3085bccfe87SAndreas Gohr        $this->html_resulttable($result,'',150);
3095bccfe87SAndreas Gohr    }
3105bccfe87SAndreas Gohr
3115bccfe87SAndreas Gohr    function html_internalsearchwords(){
312878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_internalsearchwords').'</p>';
3135bccfe87SAndreas Gohr        $result = $this->hlp->Query()->searchwords(false,$this->tlimit,$this->start,150);
31412dcdeccSAndreas Gohr        $this->html_resulttable($result,'',150);
31512dcdeccSAndreas Gohr    }
31612dcdeccSAndreas Gohr
31712dcdeccSAndreas Gohr    function html_searchengines(){
318878be5c9SAndreas Gohr        echo '<p>'.$this->getLang('intro_searchengines').'</p>';
3196b6f8822SAndreas Gohr        $result = $this->hlp->Query()->searchengines($this->tlimit,$this->start,150);
32012dcdeccSAndreas Gohr        $this->html_resulttable($result,'',150);
32112dcdeccSAndreas Gohr    }
32212dcdeccSAndreas Gohr
323e25286daSAndreas Gohr
324c73e16f1SAndreas Gohr    function html_resolution(){
325307baf3fSAndreas Gohr
326307baf3fSAndreas Gohr        echo '<img src="'.DOKU_BASE.'lib/plugins/statistics/img.php?img=resolution&amp;f='.$this->from.'&amp;t='.$this->to.'" />';
327c73e16f1SAndreas Gohr
328c73e16f1SAndreas Gohr        echo '<p>While the data above gives you some info about the resolution your visitors use, it does not tell you
329c73e16f1SAndreas Gohr              much about about the real size of their browser windows. The graphic below shows the size distribution of
330c73e16f1SAndreas Gohr              the view port (document area) of your visitor\'s browsers. Please note that this data can not be logged
331c73e16f1SAndreas Gohr              in all browsers. Because users may resize their browser window while browsing your site the statistics may
332c73e16f1SAndreas Gohr              be flawed. Take it with a grain of salt.</p>';
333c73e16f1SAndreas Gohr
334307baf3fSAndreas Gohr        echo '<img src="'.DOKU_BASE.'lib/plugins/statistics/img.php?img=viewport&amp;f='.$this->from.'&amp;t='.$this->to.'" />';
335307baf3fSAndreas Gohr
336307baf3fSAndreas Gohr        $result = $this->hlp->Query()->resolution($this->tlimit,$this->start,150);
337307baf3fSAndreas Gohr        $this->html_resulttable($result,'',150);
338307baf3fSAndreas Gohr
339307baf3fSAndreas Gohr
340c73e16f1SAndreas Gohr    }
3419da6395dSAndreas Gohr
3429da6395dSAndreas Gohr
34314d99ec0SAndreas Gohr    /**
34414d99ec0SAndreas Gohr     * Display a result in a HTML table
34514d99ec0SAndreas Gohr     */
3462507f8e0SAndreas Gohr    function html_resulttable($result,$header='',$pager=0){
34714d99ec0SAndreas Gohr        echo '<table>';
3482812a751SAndreas Gohr        if(is_array($header)){
34914d99ec0SAndreas Gohr            echo '<tr>';
35014d99ec0SAndreas Gohr            foreach($header as $h){
35114d99ec0SAndreas Gohr                echo '<th>'.hsc($h).'</th>';
35214d99ec0SAndreas Gohr            }
35314d99ec0SAndreas Gohr            echo '</tr>';
3542812a751SAndreas Gohr        }
35514d99ec0SAndreas Gohr
3562507f8e0SAndreas Gohr        $count = 0;
3572ee939eeSAndreas Gohr        if(is_array($result)) foreach($result as $row){
35814d99ec0SAndreas Gohr            echo '<tr>';
35914d99ec0SAndreas Gohr            foreach($row as $k => $v){
3602812a751SAndreas Gohr                echo '<td class="plg_stats_X'.$k.'">';
36114d99ec0SAndreas Gohr                if($k == 'page'){
36214d99ec0SAndreas Gohr                    echo '<a href="'.wl($v).'" class="wikilink1">';
36314d99ec0SAndreas Gohr                    echo hsc($v);
36414d99ec0SAndreas Gohr                    echo '</a>';
36514d99ec0SAndreas Gohr                }elseif($k == 'url'){
36654f6c432SAndreas Gohr                    $url = hsc($v);
36783b63546SAndreas Gohr                    $url = preg_replace('/^https?:\/\/(www\.)?/','',$url);
3682812a751SAndreas Gohr                    if(strlen($url) > 45){
3692812a751SAndreas Gohr                        $url = substr($url,0,30).' &hellip; '.substr($url,-15);
37054f6c432SAndreas Gohr                    }
37114d99ec0SAndreas Gohr                    echo '<a href="'.$v.'" class="urlextern">';
37254f6c432SAndreas Gohr                    echo $url;
37314d99ec0SAndreas Gohr                    echo '</a>';
3745bccfe87SAndreas Gohr                }elseif($k == 'ilookup'){
3755bccfe87SAndreas Gohr                    echo '<a href="'.wl('',array('id'=>$v,'do'=>'search')).'">Search</a>';
37629dea504SAndreas Gohr                }elseif($k == 'lookup'){
37729dea504SAndreas Gohr                    echo '<a href="http://www.google.com/search?q='.rawurlencode($v).'">';
37829dea504SAndreas Gohr                    echo '<img src="'.DOKU_BASE.'lib/plugins/statistics/ico/search/google.png" alt="lookup in Google" border="0" />';
37929dea504SAndreas Gohr                    echo '</a> ';
38029dea504SAndreas Gohr
38129dea504SAndreas Gohr                    echo '<a href="http://search.yahoo.com/search?p='.rawurlencode($v).'">';
38229dea504SAndreas Gohr                    echo '<img src="'.DOKU_BASE.'lib/plugins/statistics/ico/search/yahoo.png" alt="lookup in Yahoo" border="0" />';
38329dea504SAndreas Gohr                    echo '</a> ';
38429dea504SAndreas Gohr
38529dea504SAndreas Gohr                    echo '<a href="http://search.msn.com/results.aspx?q='.rawurlencode($v).'">';
38629dea504SAndreas Gohr                    echo '<img src="'.DOKU_BASE.'lib/plugins/statistics/ico/search/msn.png" alt="lookup in MSN Live" border="0" />';
38729dea504SAndreas Gohr                    echo '</a> ';
38829dea504SAndreas Gohr
38912dcdeccSAndreas Gohr                }elseif($k == 'engine'){
39012dcdeccSAndreas Gohr                    include_once(dirname(__FILE__).'/inc/search_engines.php');
39112dcdeccSAndreas Gohr                    echo $SearchEnginesHashLib[$v];
39275fa767dSAndreas Gohr                }elseif($k == 'bflag'){
3932998b1f6SAndreas Gohr                    echo '<img src="'.DOKU_BASE.'lib/plugins/statistics/ico/browser/'.strtolower(preg_replace('/[^\w]+/','',$v)).'.png" alt="'.hsc($v).'" />';
394bd4217d3SAndreas Gohr                }elseif($k == 'osflag'){
3952998b1f6SAndreas Gohr                    echo '<img src="'.DOKU_BASE.'lib/plugins/statistics/ico/os/'.strtolower(preg_replace('/[^\w]+/','',$v)).'.png" alt="'.hsc($v).'" />';
39675fa767dSAndreas Gohr                }elseif($k == 'cflag'){
39775fa767dSAndreas Gohr                    echo '<img src="'.DOKU_BASE.'lib/plugins/statistics/ico/flags/'.hsc($v).'.png" alt="'.hsc($v).'" width="18" height="12" />';
39814d99ec0SAndreas Gohr                }elseif($k == 'html'){
39914d99ec0SAndreas Gohr                    echo $v;
40014d99ec0SAndreas Gohr                }else{
40114d99ec0SAndreas Gohr                    echo hsc($v);
40214d99ec0SAndreas Gohr                }
40314d99ec0SAndreas Gohr                echo '</td>';
40414d99ec0SAndreas Gohr            }
40514d99ec0SAndreas Gohr            echo '</tr>';
4062507f8e0SAndreas Gohr
4072507f8e0SAndreas Gohr            if($pager && ($count == $pager)) break;
4082507f8e0SAndreas Gohr            $count++;
40914d99ec0SAndreas Gohr        }
41014d99ec0SAndreas Gohr        echo '</table>';
4112507f8e0SAndreas Gohr
4122507f8e0SAndreas Gohr        if($pager) $this->html_pager($pager,count($result) > $pager);
4131878f16fSAndreas Gohr    }
4141878f16fSAndreas Gohr
4151878f16fSAndreas Gohr}
416