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;
 | |
| 	}
 | |
| }
 |