560 lines
14 KiB
PHP
560 lines
14 KiB
PHP
|
<?php
|
||
|
/*
|
||
|
HLstatsX Community Edition - Real-time player and clan rankings and statistics
|
||
|
Copyleft (L) 2008-20XX Nicholas Hastings (nshastings@gmail.com)
|
||
|
http://www.hlxcommunity.com
|
||
|
|
||
|
HLstatsX Community Edition is a continuation of
|
||
|
ELstatsNEO - Real-time player and clan rankings and statistics
|
||
|
Copyleft (L) 2008-20XX Malte Bayer (steam@neo-soft.org)
|
||
|
http://ovrsized.neo-soft.org/
|
||
|
|
||
|
ELstatsNEO is an very improved & enhanced - so called Ultra-Humongus Edition of HLstatsX
|
||
|
HLstatsX - Real-time player and clan rankings and statistics for Half-Life 2
|
||
|
http://www.hlstatsx.com/
|
||
|
Copyright (C) 2005-2007 Tobias Oetzel (Tobi@hlstatsx.com)
|
||
|
|
||
|
HLstatsX is an enhanced version of HLstats made by Simon Garner
|
||
|
HLstats - Real-time player and clan rankings and statistics for Half-Life
|
||
|
http://sourceforge.net/projects/hlstats/
|
||
|
Copyright (C) 2001 Simon Garner
|
||
|
|
||
|
This program is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU General Public License
|
||
|
as published by the Free Software Foundation; either version 2
|
||
|
of the License, or (at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||
|
|
||
|
For support and installation notes visit http://www.hlxcommunity.com
|
||
|
|
||
|
|
||
|
* Table
|
||
|
* Generates an HTML table.
|
||
|
*
|
||
|
* @package HLstatsX Community Edition
|
||
|
* @author Nicholas Hastings (nshastings@gmail.com)
|
||
|
* @copyright HLstatsX Community Edition
|
||
|
* @version 2008
|
||
|
* @access public
|
||
|
*/
|
||
|
class Table
|
||
|
{
|
||
|
var $columns;
|
||
|
var $keycol;
|
||
|
var $sort;
|
||
|
var $sortorder;
|
||
|
var $sort2;
|
||
|
var $page;
|
||
|
var $showranking;
|
||
|
var $numperpage;
|
||
|
var $var_page;
|
||
|
var $var_sort;
|
||
|
var $var_sortorder;
|
||
|
var $sorthash;
|
||
|
var $ajax;
|
||
|
|
||
|
var $columnlist;
|
||
|
var $startitem;
|
||
|
|
||
|
var $maxpagenumbers = 20;
|
||
|
|
||
|
|
||
|
function Table ($columns, $keycol, $sort_default, $sort_default2,
|
||
|
$showranking=false, $numperpage=50, $var_page='page',
|
||
|
$var_sort='sort', $var_sortorder='sortorder', $sorthash='',
|
||
|
$sort_default_order='desc', $ajax = false)
|
||
|
{
|
||
|
|
||
|
global $g_options;
|
||
|
|
||
|
$this->columns = $columns;
|
||
|
$this->keycol = $keycol;
|
||
|
$this->showranking = $showranking;
|
||
|
$this->numperpage = $numperpage;
|
||
|
$this->var_page = $var_page;
|
||
|
$this->var_sort = $var_sort;
|
||
|
$this->var_sortorder = $var_sortorder;
|
||
|
$this->sorthash = $sorthash;
|
||
|
$this->sort_default_order = $sort_default_order;
|
||
|
$this->ajax = ( $g_options['playerinfo_tabs'] ) ? $ajax : false;
|
||
|
|
||
|
$this->page = valid_request(intval($_GET[$var_page]), 1);
|
||
|
$this->sort = valid_request($_GET[$var_sort], 0);
|
||
|
$this->sortorder = valid_request($_GET[$var_sortorder], 0);
|
||
|
|
||
|
|
||
|
if ($this->page < 1)
|
||
|
{
|
||
|
$this->page = 1;
|
||
|
}
|
||
|
$this->startitem = ($this->page - 1) * $this->numperpage;
|
||
|
|
||
|
foreach ($columns as $col)
|
||
|
{
|
||
|
if ($col->sort != 'no')
|
||
|
{
|
||
|
$this->columnlist[] = $col->name;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if (!is_array($this->columnlist) || !in_array($this->sort, $this->columnlist))
|
||
|
{
|
||
|
$this->sort = $sort_default;
|
||
|
}
|
||
|
|
||
|
if ($this->sortorder != 'asc' && $this->sortorder != 'desc')
|
||
|
{
|
||
|
$this->sortorder = $this->sort_default_order;
|
||
|
}
|
||
|
|
||
|
if ($this->sort == $sort_default2)
|
||
|
{
|
||
|
$this->sort2 = $sort_default;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$this->sort2 = $sort_default2;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function start($numitems, $width=100, $align='center')
|
||
|
{
|
||
|
global $g_options, $game, $realgame, $db;
|
||
|
$numpages = ceil($numitems / $this->numperpage);
|
||
|
?>
|
||
|
|
||
|
<div class="subblock">
|
||
|
|
||
|
<table class="data-table">
|
||
|
|
||
|
<tr class="data-table-head">
|
||
|
<?php
|
||
|
$totalwidth = 0;
|
||
|
|
||
|
if ($this->showranking)
|
||
|
{
|
||
|
$totalwidth += 5;
|
||
|
echo "<td style=\"width:5%;text-align:right;\" class=\"fSmall\">Rank</td>\n";
|
||
|
}
|
||
|
|
||
|
foreach ($this->columns as $col)
|
||
|
{
|
||
|
$totalwidth += $col->width;
|
||
|
echo "<td style=\"width:$col->width%;text-align:$col->align;\" class=\"fSmall\">";
|
||
|
if ($col->sort != 'no')
|
||
|
{
|
||
|
echo getSortArrow($this->sort, $this->sortorder, $col->name,
|
||
|
$col->title, $this->var_sort, $this->var_sortorder,
|
||
|
$this->sorthash);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
echo $col->title;
|
||
|
}
|
||
|
echo "</td>\n";
|
||
|
}
|
||
|
?>
|
||
|
</tr>
|
||
|
|
||
|
<?php
|
||
|
if ($totalwidth != 100)
|
||
|
{
|
||
|
error("Warning: Column widths do not add to 100%! (=$totalwidth%)", false);
|
||
|
}
|
||
|
|
||
|
$rank = ($this->page - 1) * $this->numperpage + 1;
|
||
|
|
||
|
}
|
||
|
|
||
|
function draw ($result, $numitems, $width=100, $align='center')
|
||
|
{
|
||
|
global $g_options, $game, $realgame, $db;
|
||
|
$numpages = ceil($numitems / $this->numperpage);
|
||
|
?>
|
||
|
|
||
|
<div class="subblock" style="width:<?php echo $width; ?>%;text-align:<?php echo $align; ?>;">
|
||
|
|
||
|
<table class="data-table">
|
||
|
|
||
|
<tr class="data-table-head">
|
||
|
<?php
|
||
|
$totalwidth = 0;
|
||
|
|
||
|
if ($this->showranking)
|
||
|
{
|
||
|
$totalwidth += 5;
|
||
|
echo "<td style=\"width:5%;text-align=:right;\" class=\"fSmall\">Rank</td>\n";
|
||
|
}
|
||
|
|
||
|
foreach ($this->columns as $col)
|
||
|
{
|
||
|
$totalwidth += $col->width;
|
||
|
echo "<td style=\"width:$col->width%;text-align:$col->align;\" class=\"fSmall\">";
|
||
|
if ($col->sort != 'no')
|
||
|
{
|
||
|
echo getSortArrow($this->sort, $this->sortorder, $col->name,
|
||
|
$col->title, $this->var_sort, $this->var_sortorder,
|
||
|
$this->sorthash, $this->ajax);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
echo $col->title;
|
||
|
}
|
||
|
echo "</td>\n";
|
||
|
}
|
||
|
?>
|
||
|
</tr>
|
||
|
|
||
|
<?php
|
||
|
if ($totalwidth != 100)
|
||
|
{
|
||
|
error("Warning: Column widths do not add to 100%! (=$totalwidth%)", false);
|
||
|
}
|
||
|
|
||
|
$rank = ($this->page - 1) * $this->numperpage + 1;
|
||
|
|
||
|
while ($rowdata = $db->fetch_array($result))
|
||
|
{
|
||
|
echo "<tr>\n";
|
||
|
$i = 0;
|
||
|
|
||
|
if ($this->showranking)
|
||
|
{
|
||
|
$c = ($i % 2) + 1;
|
||
|
$i++;
|
||
|
echo "<td style=\"text-align:right;\" class=\"bg$c\">$rank</td>\n";
|
||
|
}
|
||
|
|
||
|
foreach ($this->columns as $col)
|
||
|
{
|
||
|
$c = ($i % 2) + 1;
|
||
|
$class="";
|
||
|
|
||
|
$cellbody = '';
|
||
|
$colval = $rowdata[$col->name];
|
||
|
|
||
|
if ($col->align != 'left')
|
||
|
{
|
||
|
$colalign = " style=\"text-align:$col->align;\"";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$colalign = "";
|
||
|
}
|
||
|
|
||
|
$class = "bg$c";
|
||
|
|
||
|
if (($col->icon) || ($col->flag))
|
||
|
{
|
||
|
$cellbody = ' ';
|
||
|
}
|
||
|
|
||
|
if ($col->link)
|
||
|
{
|
||
|
if (strpos($col->link, 'javascript:') === false) {
|
||
|
$link = str_ireplace('%k', urlencode($rowdata[$this->keycol]), $col->link);
|
||
|
$cellbody .= "<a href=\"" . $g_options['scripturl'] . "?$link\">";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$col->link = str_replace('\\\\', '', $col->link);
|
||
|
$link = str_ireplace('%k', $rowdata[$this->keycol], $col->link);
|
||
|
$cellbody .= "<a href=\"$link\">";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($col->icon)
|
||
|
{
|
||
|
$image = getImage("/$col->icon");
|
||
|
if ($image)
|
||
|
{
|
||
|
$cellbody .= '<img src="'.$image['url']. "\" class=\"tableicon\" alt=\"$col->icon\" />";
|
||
|
}
|
||
|
}
|
||
|
elseif ($col->flag)
|
||
|
{
|
||
|
#$link = ereg_replace("%f", $col->link);
|
||
|
if ($g_options['countrydata'] == 1) {
|
||
|
if ($rowdata['flag'] == '') {
|
||
|
$rowdata['flag'] = '0';
|
||
|
$alt_text = 'No Country';
|
||
|
} else {
|
||
|
$alt_text = ucfirst(strtolower($rowdata['country']));
|
||
|
}
|
||
|
|
||
|
$cellbody .= '<img src="' . getFlag($rowdata['flag'])."\" class=\"tableicon\" alt=\"$alt_text\" title=\"$alt_text\" />";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$col->flag = 'player';
|
||
|
$cellbody .= '<img src="' . IMAGE_PATH . "/$col->flag.gif\" class=\"tableicon\" alt=\"$col->icon.gif\" />";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
switch ($col->type)
|
||
|
{
|
||
|
case 'timestamp':
|
||
|
$cellbody = timestamp_to_str($colval);
|
||
|
break;
|
||
|
|
||
|
case 'roleimg':
|
||
|
$image = getImage("/games/$game/roles/".strtolower($colval));
|
||
|
// check if image exists for game -- otherwise check realgame
|
||
|
if ($image)
|
||
|
{
|
||
|
$cellbody .= '<img src="' . $image['url'] . '" alt="' . $col->fname[$colval] . '" title="' . $col->fname[$colval] . '" /> ';
|
||
|
}
|
||
|
elseif ($image = getImage("/games/$realgame/roles/".strtolower($colval)))
|
||
|
{
|
||
|
$cellbody .= '<img src="' . $image['url'] . '" alt="' . $col->fname[$colval] . '" title="' . $col->fname[$colval] . '" /> ';
|
||
|
}
|
||
|
|
||
|
if ($col->fname[$colval] != '')
|
||
|
{
|
||
|
$cellbody .= '<b>'.$col->fname[$colval].'</b>';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$cellbody .= '<b>'.ucwords(preg_replace('/_/', ' ', $colval)).'</b>';
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'weaponimg':
|
||
|
// Check if game has the image -- if not, failback to real game. If not, no image.
|
||
|
$image = getImage("/games/$realgame/weapons/".strtolower($colval));
|
||
|
if ($image)
|
||
|
{
|
||
|
$cellbody .= '<img src="' . $image['url'] . '" ' . $image['size'] . ' alt="'.$col->fname[$colval].'" title="'.$col->fname[$colval].'" />';
|
||
|
}
|
||
|
elseif ($image = getImage("/games/$realgame/weapons/".strtolower($colval)))
|
||
|
{
|
||
|
$cellbody .= '<img src="' . $image['url'] . '" ' . $image['size'] . ' alt="'.$col->fname[$colval].'" title="'.$col->fname[$colval].'" />';
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$cellbody .= '<b>' . (($col->fname[$colval] != '') ? $col->fname[$colval] : ucwords(preg_replace('/_/', ' ', $colval))) . '</b>';
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case 'bargraph':
|
||
|
$cellbody .= '<img src="' . IMAGE_PATH . '/bar';
|
||
|
if ($colval > 40)
|
||
|
$cellbody .= '6';
|
||
|
elseif ($colval > 30)
|
||
|
$cellbody .= '5';
|
||
|
elseif ($colval > 20)
|
||
|
$cellbody .= '4';
|
||
|
elseif ($colval > 10)
|
||
|
$cellbody .= '3';
|
||
|
elseif ($colval > 5)
|
||
|
$cellbody .= '2';
|
||
|
else
|
||
|
$cellbody .= '1';
|
||
|
|
||
|
$cellbody .= '.gif" style="width:';
|
||
|
if ($colval < 1)
|
||
|
$cellbody .= '1';
|
||
|
elseif ($colval > 100)
|
||
|
$cellbody .= '100';
|
||
|
else
|
||
|
$cellbody .= sprintf("%d", $colval + 0.5);
|
||
|
|
||
|
$cellbody .= "%;\" class=\"bargraph\" alt=\"$colval%\" />";
|
||
|
break;
|
||
|
case 'heatmap':
|
||
|
$heatmap = getImage("/games/$game/heatmaps/$colval-kill");
|
||
|
$heatmapthumb = getImage("/games/$game/heatmaps/$colval-kill-thumb");
|
||
|
|
||
|
if ($heatmap) {
|
||
|
$cellbody .= "<span style=\"text-align: center;\"><a href=\"" . $heatmap['url'] . "\" rel=\"boxed\"><img width=\"20\" height=\"16\" src=\"" . $heatmapthumb['url'] . "\" /></a></span>";
|
||
|
} else {
|
||
|
$cellbody .= " ";
|
||
|
}
|
||
|
break;
|
||
|
default:
|
||
|
if ($this->showranking && $rank == 1 && $i == 1)
|
||
|
$cellbody .= '<b>';
|
||
|
if ((is_numeric($colval)) && ($colval >= 1000))
|
||
|
$colval = number_format($colval);
|
||
|
$colval = nl2br(htmlspecialchars($colval, ENT_COMPAT));
|
||
|
|
||
|
if ($col->embedlink == 'yes')
|
||
|
{
|
||
|
$colval = preg_replace(array('/%A%([^ %]+)%/','/%\/A%/'), array("<a href=\"$1\">", '</a>'), $colval);
|
||
|
}
|
||
|
|
||
|
$cellbody .= $colval;
|
||
|
if ($this->showranking && $rank == 1 && $i == 1)
|
||
|
$cellbody .= '</b>';
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if ($col->link)
|
||
|
{
|
||
|
$cellbody .= '</a>';
|
||
|
}
|
||
|
|
||
|
if ($col->append)
|
||
|
{
|
||
|
$cellbody .= $col->append;
|
||
|
}
|
||
|
|
||
|
if ($col->skill_change) {
|
||
|
if ($rowdata['last_skill_change'] == '')
|
||
|
$rowdata['last_skill_change'] = 0;
|
||
|
if ($rowdata['last_skill_change'] == 0)
|
||
|
$cellbody .= " <img src=\"" . IMAGE_PATH
|
||
|
. "/t1.gif\" alt=\"".$rowdata['last_skill_change']." Points\" />";
|
||
|
elseif ($rowdata['last_skill_change'] > 0)
|
||
|
$cellbody .= " <img src=\"" . IMAGE_PATH
|
||
|
. "/t0.gif\" alt=\"".$rowdata['last_skill_change']." Points\" />";
|
||
|
elseif ($rowdata['last_skill_change'] < 0)
|
||
|
$cellbody .= " <img src=\"" . IMAGE_PATH
|
||
|
. "/t2.gif\" alt=\"".$rowdata['last_skill_change']." Points\" />";
|
||
|
}
|
||
|
|
||
|
echo "<td$colalign class=\"$class\">"
|
||
|
. $cellbody
|
||
|
. "</td>\n";
|
||
|
$i++;
|
||
|
}
|
||
|
|
||
|
echo "</tr>\n\n";
|
||
|
|
||
|
$rank++;
|
||
|
}
|
||
|
?>
|
||
|
</table>
|
||
|
</div><br /><br />
|
||
|
<?php
|
||
|
if ($numpages > 1)
|
||
|
{
|
||
|
?>
|
||
|
<div class="subblock" style="text-align:right;">
|
||
|
<span style="text-align:right;">
|
||
|
<?php
|
||
|
echo 'Page: ';
|
||
|
|
||
|
$start = $this->page - intval($this->maxpagenumbers / 2);
|
||
|
if ($start < 1) $start=1;
|
||
|
|
||
|
$end = $numpages;
|
||
|
if ($end > $this->maxpagenumbers + $start-1)
|
||
|
$end = $this->maxpagenumbers + $start-1;
|
||
|
|
||
|
if ($end - $start + 1 < $this->maxpagenumbers)
|
||
|
$start = $end - $this->maxpagenumbers + 1;
|
||
|
|
||
|
if ($start < 1) $start=1;
|
||
|
|
||
|
if ($start > 1)
|
||
|
{
|
||
|
if ($start > 2)
|
||
|
$this->_echoPageNumber(1, "First page", "", " ...");
|
||
|
else
|
||
|
$this->_echoPageNumber(1, 1);
|
||
|
}
|
||
|
|
||
|
for ($i=$start; $i <= $end; $i++)
|
||
|
{
|
||
|
if ($i == $this->page)
|
||
|
{
|
||
|
echo "<b>$i</b> ";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$this->_echoPageNumber($i, $i);
|
||
|
}
|
||
|
|
||
|
if ($i == $end && $i < $numpages)
|
||
|
{
|
||
|
if ($i < $numpages - 1)
|
||
|
$this->_echoPageNumber($numpages, "Last page", "... ");
|
||
|
else
|
||
|
$this->_echoPageNumber($numpages, 10);
|
||
|
}
|
||
|
}
|
||
|
?>
|
||
|
</span>
|
||
|
</div><br /><br />
|
||
|
<?php
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function _echoPageNumber ($number, $label, $prefix='', $postfix='')
|
||
|
{
|
||
|
global $g_options;
|
||
|
|
||
|
echo "$prefix<a href=\"" . $g_options['scripturl'] . '?'
|
||
|
. makeQueryString($this->var_page, $number);
|
||
|
if ($this->sorthash)
|
||
|
echo "#$this->sorthash";
|
||
|
|
||
|
if ($this->ajax)
|
||
|
echo "\" onclick=\"Tabs.refreshTab({'" . $this->var_page . "': " . $number . "}); return false;";
|
||
|
echo "\">$label</a>$postfix ";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// TableColumn
|
||
|
//
|
||
|
// Data structure for the properties of a column in a Table
|
||
|
//
|
||
|
|
||
|
class TableColumn
|
||
|
{
|
||
|
var $name;
|
||
|
var $title;
|
||
|
|
||
|
var $align = 'left';
|
||
|
var $width = 20;
|
||
|
var $icon;
|
||
|
var $link;
|
||
|
var $sort = 'yes';
|
||
|
var $type = 'text';
|
||
|
var $embedlink = 'no';
|
||
|
var $flag;
|
||
|
|
||
|
function TableColumn ($name, $title, $attrs="", $fname=null)
|
||
|
{
|
||
|
$this->name = $name;
|
||
|
$this->title= $title;
|
||
|
|
||
|
$allowed_attrs = array(
|
||
|
'align',
|
||
|
'width',
|
||
|
'icon',
|
||
|
'link',
|
||
|
'sort',
|
||
|
'append',
|
||
|
'type',
|
||
|
'embedlink',
|
||
|
'flag',
|
||
|
'skill_change',
|
||
|
'heatmap'
|
||
|
);
|
||
|
|
||
|
parse_str($attrs);
|
||
|
|
||
|
foreach ($allowed_attrs as $a)
|
||
|
{
|
||
|
if (isset($$a))
|
||
|
{
|
||
|
$this->$a = mystripslashes($$a);
|
||
|
}
|
||
|
}
|
||
|
$this->fname = $fname;
|
||
|
}
|
||
|
}
|