1 |
joku |
63 |
<?php |
2 |
|
|
/* This file is part of BBClone (A PHP based Web Counter on Steroids) |
3 |
|
|
* |
4 |
|
|
* SVN FILE $Id$ |
5 |
|
|
* |
6 |
|
|
* Copyright (C) 2001-2014, the BBClone Team (see doc/authors.txt for details) |
7 |
|
|
* |
8 |
|
|
* This program is free software: you can redistribute it and/or modify |
9 |
|
|
* it under the terms of the GNU General Public License as published by |
10 |
|
|
* the Free Software Foundation, either version 3 of the License, or |
11 |
|
|
* (at your option) any later version. |
12 |
|
|
* |
13 |
|
|
* This program is distributed in the hope that it will be useful, |
14 |
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 |
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 |
|
|
* GNU General Public License for more details. |
17 |
|
|
* |
18 |
|
|
* See doc/copying.txt for details |
19 |
|
|
*/ |
20 |
|
|
|
21 |
|
|
///////////////////////// |
22 |
|
|
// HTML Output Builder // |
23 |
|
|
///////////////////////// |
24 |
|
|
|
25 |
|
|
// Include BBClone hits in Stats (see config, enabled by default) |
26 |
|
|
if ($BBC_HITS == 1) { |
27 |
|
|
if (!defined("_BBCLONE_DIR")) {define("_BBCLONE_DIR", "./");} |
28 |
|
|
if (!defined("COUNTER")) { |
29 |
|
|
define("COUNTER", _BBCLONE_DIR."mark_page.php"); |
30 |
|
|
if (is_readable(COUNTER)) include_once(COUNTER); |
31 |
|
|
} |
32 |
|
|
} |
33 |
|
|
|
34 |
|
|
class bbc_html { |
35 |
|
|
var $lang_tab, $lng, $server; |
36 |
|
|
|
37 |
|
|
function get_lng() { |
38 |
|
|
if (_BBC_PHP < 410) global $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_SERVER_VARS; |
39 |
|
|
|
40 |
|
|
global $BBC_LANGUAGE; |
41 |
|
|
|
42 |
|
|
// Get variables depending on PHP version |
43 |
|
|
$get = ((_BBC_PHP < 410) ? !empty($HTTP_GET_VARS['lng']) : !empty($_GET['lng'])) ? |
44 |
|
|
((_BBC_PHP < 410) ? $HTTP_GET_VARS['lng'] : $_GET['lng']) : ""; |
45 |
|
|
$post = ((_BBC_PHP < 410) ? !empty($HTTP_POST_VARS['lng']) : !empty($_POST['lng'])) ? |
46 |
|
|
((_BBC_PHP < 410) ? $HTTP_POST_VARS['lng'] : $_POST['lng']) : ""; |
47 |
|
|
$aclng = ((_BBC_PHP < 410) ? !empty($HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE']) : |
48 |
|
|
!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) ? ((_BBC_PHP < 410) ? |
49 |
|
|
$HTTP_SERVER_VARS['HTTP_ACCEPT_LANGUAGE'] : $_SERVER['HTTP_ACCEPT_LANGUAGE']) : ""; |
50 |
|
|
|
51 |
|
|
if ($get && preg_match(":^[\w\-]{1,5}:", $get)) $this->lng = $get; |
52 |
|
|
elseif ($post && (preg_match(":^[\w\-]{1,5}:", $post))) $this->lng = $post; |
53 |
|
|
elseif ($aclng && (preg_match(":^[\w\-]{1,5}:", $aclng))) { |
54 |
|
|
|
55 |
|
|
$this->lng = (($comma = strpos($aclng, ",")) !== false) ? substr($aclng, 0, $comma) : $aclng; |
56 |
|
|
$this->lng = ((($dash = strpos($this->lng, "-")) !== false) && (!isset($this->lang_tab[$this->lng]))) ? |
57 |
|
|
substr($this->lng, 0, $dash) : $this->lng; |
58 |
|
|
} |
59 |
|
|
else $this->lng = $BBC_LANGUAGE; |
60 |
|
|
|
61 |
|
|
return (isset($this->lang_tab[$this->lng]) ? $this->lng : $BBC_LANGUAGE); |
62 |
|
|
} |
63 |
|
|
|
64 |
|
|
function set_title() { |
65 |
|
|
global $BBC_TIMESTAMP, $BBC_TIME_OFFSET, $BBC_TITLEBAR, $translation; |
66 |
|
|
|
67 |
|
|
$conv = array( |
68 |
|
|
"%DATE" => date_format_translated($translation['global_day_format'], ($BBC_TIMESTAMP + ($BBC_TIME_OFFSET * 60))), |
69 |
|
|
"%SERVER" => $this->server |
70 |
|
|
); |
71 |
|
|
if (empty($BBC_TITLEBAR)) { |
72 |
|
|
$BBC_TITLEBAR = $translation['global_titlebar']; |
73 |
|
|
}; |
74 |
|
|
return strtr($BBC_TITLEBAR, $conv); |
75 |
|
|
} |
76 |
|
|
|
77 |
|
|
function last_reset() { |
78 |
|
|
global $translation, $access; |
79 |
|
|
$timestamp = isset($access['time']['reset']) ? $access['time']['reset'] : ""; |
80 |
|
|
return "<p align=\"center\"><i>".$translation['global_last_reset'].": ".date_format_translated($translation['global_day_format'], $timestamp) |
81 |
|
|
.".</i></p>\n"; |
82 |
|
|
} |
83 |
|
|
|
84 |
|
|
function bbc_html() { |
85 |
|
|
if (_BBC_PHP < 410) global $HTTP_SERVER_VARS; |
86 |
|
|
|
87 |
|
|
global $translation; |
88 |
|
|
|
89 |
|
|
$this->lang_tab = array( |
90 |
matthys |
150 |
"ar" => "العربية", // Arabic |
91 |
matthys |
137 |
"bs" => "Bosanski", // Bosnian |
92 |
|
|
"bg" => "български", // Bulgarian |
93 |
|
|
"ca" => "Català", // Catalan |
94 |
|
|
"cs" => "Čeština", // Czech |
95 |
|
|
"da" => "Dansk", // Danish |
96 |
joku |
153 |
"de" => "Deutsch", // German |
97 |
matthys |
146 |
"en" => "English", // English << DEFAULT |
98 |
matthys |
137 |
"fr" => "Français", // French |
99 |
|
|
"fi" => "Suomi", // Finnish |
100 |
|
|
"el" => "Ελληνικά", // Greek |
101 |
joku |
153 |
"es" => "Español", // Spanish |
102 |
matthys |
137 |
"et" => "Eesti keel", // Estonian |
103 |
|
|
"hu" => "Magyar", // Hungarian |
104 |
|
|
"id" => "Bahasa Indonésia", // Indonesian |
105 |
|
|
"it" => "Italiano", // Italian |
106 |
|
|
"ja" => "日本語", // Japanese |
107 |
matthys |
150 |
"ko" => "한국어", // Korean |
108 |
matthys |
137 |
"lt" => "Lietuvių", // Lithuanian |
109 |
|
|
"mk" => "Македонски", // Macedonian |
110 |
|
|
"nb" => "Norsk Bokmål", // Norwegian Bokmål |
111 |
joku |
153 |
"nl" => "Nederlands", // Dutch |
112 |
matthys |
137 |
"pl" => "Polski", // Polish |
113 |
joku |
144 |
"pt" => "Português", // Portuguese |
114 |
matthys |
146 |
"pt-br" => "Português Brasil", // Brazilian Portuguese |
115 |
|
|
"ro" => "Română", // Romanian |
116 |
matthys |
137 |
"ru" => "Русский", // Russian |
117 |
matthys |
150 |
"sk" => "Slovenčina", // Slovak |
118 |
|
|
"sl" => "Slovenski", // Slovenian |
119 |
joku |
63 |
"sv" => "Swedish", |
120 |
|
|
"th" => "Thai", |
121 |
|
|
"tr" => "Turkish", |
122 |
|
|
"uk" => "Ukrainian" |
123 |
joku |
153 |
"zh-cn" => "Chinese Simp", |
124 |
|
|
"zh-tw" => "Chinese Trad", |
125 |
joku |
63 |
); |
126 |
|
|
$this->lng = $this->get_lng(); |
127 |
|
|
$this->server = ((_BBC_PHP < 410) ? !empty($HTTP_SERVER_VARS['SERVER_NAME']) : !empty($_SERVER['SERVER_NAME'])) ? |
128 |
|
|
htmlspecialchars(((_BBC_PHP < 410) ? $HTTP_SERVER_VARS['SERVER_NAME'] : $_SERVER['SERVER_NAME']), |
129 |
|
|
ENT_QUOTES) : "noname"; |
130 |
|
|
} |
131 |
|
|
|
132 |
|
|
// Generates BBClone Config details |
133 |
|
|
function show_config($varname, $booleanflag = 0) { |
134 |
|
|
|
135 |
|
|
global $translation, $$varname; |
136 |
|
|
|
137 |
|
|
return "<tr class=\"morethan_row hover_white\">\n" |
138 |
|
|
// Variable name |
139 |
|
|
."<td align=\"left\" class=\"config-cell\">\n" |
140 |
|
|
."<b>\$$varname</b>\n" |
141 |
|
|
."</td>\n" |
142 |
|
|
// Explaination |
143 |
|
|
."<td align=\"left\" class=\"config-cell text-wrap\">\n" |
144 |
|
|
.$translation["config_".$varname]."\n" |
145 |
|
|
."</td>\n" |
146 |
|
|
// Variable value |
147 |
|
|
."<td align=\"left\" class=\"config-cell\">\n" |
148 |
|
|
."<b>".(!empty($$varname) ? ($booleanflag==1 ? $translation['global_yes'] : $$varname) : $translation['global_no'])."</b>\n" |
149 |
|
|
."</td></tr>\n"; |
150 |
|
|
} |
151 |
|
|
|
152 |
|
|
// Begin of all BBClone HTML documents |
153 |
|
|
function html_begin() { |
154 |
|
|
global $BBC_VERSION, $BBC_EXT_LOOKUP, $BBC_IMAGES_PATH, $BBC_CSS_PATH, $BBC_CSS_FILE, $translation; |
155 |
|
|
|
156 |
|
|
// Work around for default charset in Apache 2 (Thanks Martin Halachev!) |
157 |
|
|
if (!headers_sent()) header("Content-type: text/html; charset=".$translation['global_charset']); |
158 |
|
|
|
159 |
|
|
return "<?xml version=\"1.0\" encoding=\"".$translation['global_charset']."\"?>\n" |
160 |
|
|
."<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n" |
161 |
|
|
."\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" |
162 |
|
|
."<html xmlns=\"http://www.w3.org/1999/xhtml\">\n" |
163 |
|
|
."<head>\n" |
164 |
|
|
."<title>BBClone $BBC_VERSION $BBC_EXT_LOOKUP</title>\n" |
165 |
|
|
."<link rel=\"shortcut icon\" href=\"".$BBC_IMAGES_PATH."favicon.ico\" />\n" |
166 |
|
|
."<link rel=\"stylesheet\" href=\"".$BBC_CSS_PATH.$BBC_CSS_FILE."\" type=\"text/css\" />\n" |
167 |
|
|
."<meta http-equiv=\"cache-control\" content=\"no-cache\" />\n" |
168 |
|
|
."<meta http-equiv=\"pragma\" content=\"no-cache\" />\n" |
169 |
|
|
."<meta http-equiv=\"content-Script-Type\" content=\"text/javasript\" />\n" |
170 |
|
|
."<meta http-equiv=\"content-Style-Type\" content=\"text/css\" />\n" |
171 |
|
|
."<meta http-equiv=\"content-type\" content=\"text/html; charset=".$translation['global_charset']."\" />\n" |
172 |
|
|
."<meta name=\"robots\" content=\"none\" />\n" |
173 |
|
|
."<meta name=\"description\" content=\"BBClone ".$BBC_VERSION." - A PHP based Web Counter on Steroids\" />\n" |
174 |
|
|
."</head>\n" |
175 |
|
|
."<body>\n" |
176 |
|
|
// BBClone copyright notice: Removal or modification of the copyright holder |
177 |
|
|
// will void any support by the BBClone team and may be a reason to deny |
178 |
|
|
// access to the BBClone site if detected. |
179 |
|
|
."<!--\n" |
180 |
|
|
."This is BBClone $BBC_VERSION\n" |
181 |
|
|
."Homebase: http://www.bbclone.de/\n" |
182 |
joku |
94 |
."Copyright: 2001-2014 The BBClone Team\n" |
183 |
joku |
63 |
."License: GNU/GPL, version 3 or later\n" |
184 |
|
|
."-->\n"; |
185 |
|
|
} |
186 |
|
|
|
187 |
|
|
// Navigation Bar (both top and bottom) |
188 |
|
|
function topbar($lang_sel = 1, $on_bottom = 0) { |
189 |
|
|
if (_BBC_PHP < 410) global $HTTP_SERVER_VARS; |
190 |
|
|
|
191 |
|
|
global $BBC_IMAGES_PATH, $BBC_MAINSITE, $BBC_SHOW_CONFIG, $translation; |
192 |
|
|
|
193 |
|
|
$self = basename((_BBC_PHP < 410) ? $HTTP_SERVER_VARS['PHP_SELF'] : $_SERVER['PHP_SELF']); |
194 |
|
|
$self = htmlspecialchars(str_replace("index.php", ".", $self), ENT_QUOTES); |
195 |
|
|
$url_lng = !empty($this->lang_tab[$this->lng]) ? "?lng=".$this->lng."" : ""; |
196 |
|
|
// Navigation Buttons |
197 |
|
|
$navbar = array( |
198 |
|
|
"main" => array( "url" => $BBC_MAINSITE, "title" => $translation['navbar_main_site'], "icon" => "navbar_main.png" ), |
199 |
|
|
"config" => array( "url" => "show_config.php", "title" => !empty($BBC_SHOW_CONFIG)? $translation['navbar_configuration'] : "", "icon" => "navbar_config.png" ), |
200 |
|
|
"global" => array( "url" => "show_global.php", "title" => $translation['navbar_global_stats'], "icon" => "navbar_global.png" ), |
201 |
|
|
"detailed" => array( "url" => "show_detailed.php", "title" => $translation['navbar_detailed_stats'], "icon" => "navbar_detailed.png" ), |
202 |
|
|
"time" => array( "url" => "show_time.php", "title" => $translation['navbar_time_stats'], "icon" => "navbar_time.png" ) |
203 |
|
|
); |
204 |
|
|
// Language Selector |
205 |
|
|
$str = (empty($lang_sel) ? "" : "<form method=\"post\" action=\"$self\">\n") |
206 |
|
|
."<table ".(empty($on_bottom) ? "class=\"navbar\"" : "class=\"navbar bottom\"")."><tr><td>\n"; |
207 |
|
|
|
208 |
|
|
$sep = ""; |
209 |
|
|
// Create Navigation Buttons |
210 |
|
|
foreach (array_keys($navbar) as $menu_key) { |
211 |
|
|
$url = $navbar[$menu_key]['url']; |
212 |
|
|
$title = $navbar[$menu_key]['title']; |
213 |
|
|
$icon = $navbar[$menu_key]['icon']; |
214 |
|
|
$selected_class = (basename($_SERVER['SCRIPT_NAME']) == $url ? " selected" : ""); |
215 |
|
|
if ( basename($_SERVER['SCRIPT_NAME']) == "index.php" && $menu_key == "global") { |
216 |
|
|
$selected_class = " selected"; |
217 |
|
|
} |
218 |
|
|
if (empty($title)){ |
219 |
|
|
continue; |
220 |
|
|
} |
221 |
|
|
$str .= "<a class=\"navbar".$selected_class."\" href=\"$url".($menu_key != "main" ? $url_lng : "")."\"><img src=\"".$BBC_IMAGES_PATH.$icon."\" alt=\"icon\" /> $title</a> \n"; |
222 |
|
|
} |
223 |
|
|
// Create Language Selector |
224 |
|
|
if (!empty($lang_sel)) { |
225 |
|
|
$str .= " <img src=\"".$BBC_IMAGES_PATH."navbar_lng.png\" alt=\"".$translation['navbar_language']."\" title=\"".$translation['navbar_language']."\" /> \n" |
226 |
|
|
."<select name=\"lng\" onchange=\"if (this.selectedIndex>0){location.href='$self?lng=' + " |
227 |
|
|
."this.options[this.selectedIndex].value;}\">\n" |
228 |
|
|
."<option value=\"\"".(empty($this->lng) ? " selected=\"selected\"" : "").">".$translation['navbar_language']."</option>\n"; |
229 |
|
|
|
230 |
|
|
foreach ($this->lang_tab as $lang_id => $lang_name) { |
231 |
|
|
$str .= "<option value=\"$lang_id\"".(($this->lng == $lang_id) ? " selected=\"selected\"" : "") |
232 |
|
|
.">$lang_name</option>\n"; |
233 |
|
|
} |
234 |
|
|
$lang_tab_lng = empty($this->lang_tab[$this->lng]) ? "" : $this->lang_tab[$this->lng]; |
235 |
|
|
$str .= "</select>\n" |
236 |
|
|
." <noscript><input type=\"submit\" value=\"".$translation['navbar_go']."\" /></noscript>\n"; |
237 |
|
|
} |
238 |
|
|
|
239 |
|
|
$str .= "</td></tr></table>\n" |
240 |
|
|
.((!empty($on_bottom)) ? "" : |
241 |
|
|
"<table class=\"titlebar\">\n" |
242 |
|
|
."<tr><td class=\"title\">\n" |
243 |
|
|
.$this->set_title()."\n" |
244 |
|
|
."</td></tr></table>\n") |
245 |
|
|
.(empty($lang_sel) ? "" : "</form>\n"); |
246 |
|
|
|
247 |
|
|
return $str; |
248 |
|
|
} |
249 |
|
|
|
250 |
|
|
// Color explanation |
251 |
|
|
function color_explain() { |
252 |
|
|
global $BBC_MAXTIME, $BBC_MAXVISIBLE, $translation; |
253 |
|
|
|
254 |
|
|
return "<p><i>".$translation['dstat_visible_rows'].": $BBC_MAXVISIBLE | \n" |
255 |
|
|
."<span class=\"lessthan_row\"> ".$translation['dstat_last_visit']." < $BBC_MAXTIME ".$translation['misc_second_unit']." </span> | \n" |
256 |
|
|
."<span class=\"morethan_row\"> ".$translation['dstat_last_visit']." > $BBC_MAXTIME ".$translation['misc_second_unit']." </span> | \n" |
257 |
|
|
."<span class=\"robot_row\"> ".$translation['dstat_robots']." </span> | \n" |
258 |
|
|
."<span class=\"my_visit_row\"> ".$translation['dstat_my_visit']." </span></i></p>\n"; |
259 |
|
|
} |
260 |
|
|
|
261 |
|
|
// Determine the color style of the connection |
262 |
|
|
function connect_color_class($connect) { |
263 |
|
|
global $BBC_MAXTIME, $BBC_TIMESTAMP, $BBC_TIME_OFFSET; |
264 |
|
|
if (_BBC_PHP < 410) global $HTTP_SERVER_VARS; |
265 |
|
|
|
266 |
|
|
// It was you |
267 |
|
|
if (((_BBC_PHP < 410) ? $HTTP_SERVER_VARS["REMOTE_ADDR"] : $_SERVER["REMOTE_ADDR"]) == $connect['ip']) return 'my_visit_row'; |
268 |
|
|
// else, it was an access within $BBC_TIME_OFFSET |
269 |
|
|
elseif ((($BBC_TIMESTAMP + ($BBC_TIME_OFFSET * 60)) - $connect['time']) < $BBC_MAXTIME) return "lessthan_row"; |
270 |
|
|
// else, it is red if it is a robot |
271 |
|
|
elseif (!empty($connect['robot'])) return "robot_row"; |
272 |
|
|
// or blue if something else |
273 |
|
|
else return "morethan_row"; |
274 |
|
|
} |
275 |
|
|
|
276 |
|
|
// BBClone copyright notice |
277 |
|
|
function copyright() { |
278 |
|
|
global $BBC_IMAGES_PATH, $BBC_VERSION, $BBC_EXT_LOOKUP, $translation; |
279 |
|
|
|
280 |
|
|
// Get Build No |
281 |
|
|
if (is_readable("build.inc")) $BBC_BUILDNO = file_get_contents("build.inc"); |
282 |
|
|
else $BBC_BUILDNO = ""; |
283 |
|
|
|
284 |
|
|
return "<p><a href=\"http://www.bbclone.de/\">BBClone ".$BBC_VERSION." ".$BBC_EXT_LOOKUP."</a> © ".$translation['global_bbclone_copyright'] |
285 |
|
|
." <a href=\"http://www.gnu.org/copyleft/gpl.html\">GPL</a>\n" |
286 |
|
|
." <a href=\"http://validator.w3.org/check?url=referer\">" |
287 |
|
|
."<img src=\"".$BBC_IMAGES_PATH."valid-xhtml10.png\" class=\"validicon\" alt=\"Valid XHTML 1.0!\" title=\"Valid XHTML 1.0!\" /></a>\n" |
288 |
|
|
." <a href=\"http://jigsaw.w3.org/css-validator/check/referer\">" |
289 |
|
|
."<img src=\"".$BBC_IMAGES_PATH."valid-css.png\" class=\"validicon\" alt=\"Valid CSS!\" title=\"Valid CSS!\" /></a>\n" |
290 |
|
|
." <a href=\"http://tidy.sourceforge.net\">" |
291 |
|
|
."<img src=\"".$BBC_IMAGES_PATH."valid-tidy.png\" class=\"validtidy\" alt=\"Valid HTML Tidy!\" title=\"Valid HTML Tidy!\" /></a></p>\n" |
292 |
|
|
; |
293 |
|
|
} |
294 |
|
|
|
295 |
|
|
// End of all BBClone HTML documents |
296 |
|
|
function html_end() { |
297 |
|
|
return "</body>\n" |
298 |
|
|
."</html>\n"; |
299 |
|
|
} |
300 |
|
|
} |
301 |
joku |
94 |
?> |