source: trunk/index.php@ 13

Last change on this file since 13 was 13, checked in by chronos, 6 years ago
  • Added: Use HTML viewport to better support mobile devices screen resolution.
File size: 28.4 KB
Line 
1<?php
2
3include_once('Database.php');
4include_once('Config.php');
5include_once('Global.php');
6include_once('Run.php');
7include_once('PrefixMultiplier.php');
8
9session_start();
10
11class Application
12{
13 var $NoFullPage = false;
14
15 function Link($URL)
16 {
17 return($this->Config['BaseURL'].$URL);
18 }
19
20 function Run()
21 {
22
23 }
24}
25
26class MyApplication extends Application
27{
28 var $Database;
29 var $Config;
30
31 function __construct()
32 {
33 }
34
35 function ShowMenu()
36 {
37 $Output = '<div>'.
38 '<a href="'.$this->Link('/').'">Summary</a> '.
39 '<a href="'.$this->Link('/runners').'">Runners</a> '.
40 '<a href="'.$this->Link('/teams').'">Teams</a> '.
41 '<a href="'.$this->Link('/families').'">Families</a>'.
42 '</div>';
43 return($Output);
44 }
45
46 function ProcessURL()
47 {
48 if(array_key_exists('REDIRECT_QUERY_STRING', $_SERVER))
49 $PathString = $_SERVER['REDIRECT_QUERY_STRING'];
50 else $PathString = '';
51 if(substr($PathString, -1, 1) == '/') $PathString = substr($PathString, 0, -1);
52 $PathItems = explode('/', $PathString);
53 if(array_key_exists('REQUEST_URI', $_SERVER) and (strpos($_SERVER['REQUEST_URI'], '?') !== false))
54 $_SERVER['QUERY_STRING'] = substr($_SERVER['REQUEST_URI'], strpos($_SERVER['REQUEST_URI'], '?') + 1);
55 else $_SERVER['QUERY_STRING'] = '';
56 parse_str($_SERVER['QUERY_STRING'], $_GET);
57 return($PathItems);
58 }
59
60 // Query: text from name
61 // Page: index of page, one page is 30 items
62 // Category: '', all, men, women, kids, families, teams
63 // TeamId: id of team
64 // Count: number of items per page, default 30
65 function QueryRunners($Category, $Page = 0, $TeamId = null, $Query = null, $StartNumber = null, $Count = null)
66 {
67 $URL = 'http://leaderboard.teribear.cz/Home/GetRunners?category='.$Category;
68 if ($Page != 0) $URL .= '&page='.$Page;
69 if ($TeamId != null) $URL .= '&teamId='.$TeamId;
70 if ($Count != null) $URL .= '&count='.$Count;
71 if ($Query != null) $URL .= '&query='.$Query;
72 if ($StartNumber != null) $URL .= '&startNumber='.$StartNumber;
73 $Content = file_get_contents($URL);
74 $JSON = json_decode($Content, true);
75 //print_r($JSON);
76 return $JSON;
77 }
78
79 function ShowEmpty()
80 {
81 $this->Database->query('DELETE FROM RunnerStat');
82 $this->Database->query('DELETE FROM Runner');
83 $this->Database->query('DELETE FROM TeamStat');
84 $this->Database->query('DELETE FROM Team');
85 }
86
87 function ShowSync()
88 {
89 $ItemsPerPage = 30;
90 $MaxCount = 450 * 30;
91
92 // Load all runners
93 $DbResult = $this->Database->query('SELECT MAX(Id) AS Id FROM Runner');
94 $DbRow = $DbResult->fetch_assoc();
95 $NextRunnerId = $DbRow['Id'] + 1;
96
97 $Runners = array();
98 $DbResult = $this->Database->query('SELECT Runner.Id, Runner.ChipNumber, '.
99 '(SELECT RunnerStat.Distance FROM RunnerStat WHERE (RunnerStat.Runner = Runner.Id) ORDER BY RunnerStat.Distance DESC LIMIT 1) AS Distance FROM Runner');
100 while ($DbRow = $DbResult->fetch_assoc())
101 {
102 $Runners[$DbRow['ChipNumber']] = $DbRow;
103 }
104
105 // Load all teams
106 $DbResult = $this->Database->query('SELECT MAX(Id) AS Id FROM Team');
107 $DbRow = $DbResult->fetch_assoc();
108 $NextTeamId = $DbRow['Id'] + 1;
109
110 $Teams = array();
111 $DbResult = $this->Database->query('SELECT Team.Id, Team.WebId, '.
112 '(SELECT TeamStat.Distance FROM TeamStat WHERE (TeamStat.Team = Team.Id) ORDER BY TeamStat.Distance DESC LIMIT 1) AS Distance FROM Team');
113 while ($DbRow = $DbResult->fetch_assoc())
114 {
115 $Teams[$DbRow['WebId']] = $DbRow;
116 }
117
118 $Time = time();
119 for ($i = 0; $i < 2; $i++)
120 {
121 $Queries = array();
122 $Page = $i * $MaxCount / $ItemsPerPage;
123 $Response = $this->QueryRunners('all', $Page, null, null, null, $MaxCount);
124 foreach ($Response['items'] as $Item)
125 {
126 if (($Item['Type'] == 'child') or ($Item['Type'] == 'woman') or ($Item['Type'] == 'man'))
127 {
128 if (!array_key_exists($Item['ChipNumber'], $Runners))
129 {
130 if ($Item['TeamId'] == null)
131 {
132 $TeamId = null;
133 } else
134 {
135 if (!array_key_exists($Item['TeamId'], $Teams))
136 {
137 $TeamId = $NextTeamId;
138 $Queries[] = $this->Database->GetInsert('Team', array(
139 'Id' => $TeamId,
140 'Name' => '',
141 'WebId' => $Item['TeamId'],
142 ));
143 $Teams[$Item['TeamId']] = array('Id' => $TeamId, 'Distance' => -1);
144 $NextTeamId++;
145 } else
146 $TeamId = $Teams[$Item['TeamId']]['Id'];
147 }
148
149 $Gender = 0;
150 if ($Item['Type'] == 'man') $Gender = 1;
151 if ($Item['Type'] == 'woman') $Gender = 2;
152 if ($Item['Type'] == 'child') $Gender = 3;
153 $RunnerId = $NextRunnerId;
154 $Queries[] = $this->Database->GetInsert('Runner', array(
155 'Id' => $RunnerId,
156 'Name' => $Item['Name'],
157 'Gender' => $Gender,
158 'Team' => $TeamId,
159 'ChipNumber' => $Item['ChipNumber'],
160 ));
161 $Runners[$Item['ChipNumber']] = array('Id' => $RunnerId, 'Distance' => -1);
162 $NextRunnerId++;
163 } else
164 $RunnerId = $Runners[$Item['ChipNumber']]['Id'];
165
166 if ($Runners[$Item['ChipNumber']]['Distance'] < $Item['OverallDistance'])
167 $Queries[] = $this->Database->GetInsert('RunnerStat', array(
168 'Time' => TimeToMysqlDateTime($Time),
169 'Runner' => $RunnerId,
170 'Distance' => $Item['OverallDistance'],
171 'Rank' => $Item['Pos'],
172 'Money' => $Item['Money'],
173 ));
174 } else
175 if (($Item['Type'] == 'team') or ($Item['Type'] == 'rodina'))
176 {
177 if (!array_key_exists($Item['GroupId'], $Teams))
178 {
179 if ($Item['Type'] == 'rodina') $IsFamily = 1;
180 else $IsFamily = 0;
181 $Queries[] = $this->Database->GetInsert('Team', array(
182 'Id' => $NextTeamId,
183 'Name' => $Item['Name'],
184 'WebId' => $Item['GroupId'],
185 'IsFamily' => $IsFamily,
186 ));
187 $TeamId = $NextTeamId;
188 $Teams[$Item['GroupId']] = array('Id' => $NextTeamId, 'Distance' => -1);
189 $NextTeamId++;
190 } else
191 $TeamId = $Teams[$Item['GroupId']]['Id'];
192
193 if ($Teams[$Item['GroupId']]['Distance'] < $Item['OverallDistance'])
194 $Queries[] = $this->Database->GetInsert('TeamStat', array(
195 'Time' => TimeToMysqlDateTime($Time),
196 'Team' => $TeamId,
197 'Distance' => $Item['OverallDistance'],
198 'Rank' => $Item['Pos'],
199 'Money' => $Item['Money'],
200 ));
201 }
202 }
203 //print_r($Queries);
204 $this->Database->Transaction($Queries);
205 }
206 }
207
208 function ShowFamilies()
209 {
210 $Output = '';
211 $Output .= '<div class="page-title">Families</div>';
212
213 $Where = 'IsFamily=1';
214
215 $DbResult = $this->Database->query('SELECT COUNT(*) FROM `Team` WHERE '.$Where);
216 $DbRow = $DbResult->fetch_row();
217 $PageList = GetPageList($DbRow[0]);
218
219 $Output .= '<div id="list_content">';
220 $Output .= $PageList['Output'];
221 $TableColumns = array(
222 array('Name' => 'Name', 'Title' => 'Name'),
223 array('Name' => 'RunnersCount', 'Title' => 'Runners'),
224 array('Name' => 'Distance', 'Title' => 'Distance'),
225 array('Name' => 'Money', 'Title' => 'Money'),
226 array('Name' => 'DistanceRunner', 'Title' => 'Distance per runner'),
227 array('Name' => 'MoneyRunner', 'Title' => 'Money per runner'),
228 array('Name' => 'Rank', 'Title' => 'Rank'),
229 );
230 $Order = GetOrderTableHeader($TableColumns, 'Distance', 1);
231 $Output .= '<table class="WideTable">';
232 $Output .= $Order['Output'];
233 $DbResult = $this->Database->select('Team', '*, '.
234 '(SELECT COUNT(*) FROM Runner WHERE Runner.Team=Team.Id) AS RunnersCount, '.
235 '(SELECT TeamStat.Distance FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY TeamStat.Time DESC LIMIT 1) AS Distance, '.
236 '(SELECT TeamStat.Money FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY Time DESC LIMIT 1) AS Money, '.
237 '(SELECT TeamStat.Time FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY Time DESC LIMIT 1) AS Time, '.
238 '(SELECT TeamStat.Rank FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY Time DESC LIMIT 1) AS Rank, '.
239 'ROUND((SELECT TeamStat.Distance FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY TeamStat.Time DESC LIMIT 1) / (SELECT COUNT(*) FROM Runner WHERE Runner.Team=Team.Id), 1) AS DistanceRunner, '.
240 'ROUND((SELECT TeamStat.Money FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY Time DESC LIMIT 1) / (SELECT COUNT(*) FROM Runner WHERE Runner.Team=Team.Id)) AS MoneyRunner',
241 $Where.$Order['SQL'].$PageList['SQLLimit']);
242 while($Item = $DbResult->fetch_assoc())
243 {
244 if ($Item['Name'] == '') $Item['Name'] = 'Family '.$Item['WebId'];
245 $Output .= '<tr>'.
246 '<td><a href="'.$this->Link('/family/'.$Item['Id'].'/').'">'.$Item['Name'].'</a></td>'.
247 '<td>'.$Item['RunnersCount'].'</td>'.
248 '<td>'.$Item['Distance'].'</td>'.
249 '<td>'.$Item['Money'].'</td>'.
250 '<td>'.$Item['DistanceRunner'].'</td>'.
251 '<td>'.$Item['MoneyRunner'].'</td>'.
252 '<td>'.$Item['Rank'].'</td>'.
253 '</tr>';
254 }
255 $Output .= '</table>';
256 $Output .= $PageList['Output'];
257 $Output .= '</div>';
258
259 return($Output);
260 }
261
262 function ShowFamily()
263 {
264 $Output = '';
265
266 $TeamId = 1;
267 if ((count($this->PathItems) > 0) and ($this->PathItems[count($this->PathItems) - 1] != ''))
268 $TeamId = $this->PathItems[count($this->PathItems) - 1];
269 if (!is_numeric($TeamId)) die('FamilyId needs to be numeric');
270
271 $DbResult = $this->Database->query('SELECT * FROM Team WHERE Id='.$TeamId.' AND IsFamily=1');
272 $DbRow = $DbResult->fetch_assoc();
273 $Output .= '<div class="page-title">Family '.$DbRow['Name'].'</div>';
274
275
276 $Where = 'Team='.$TeamId;
277
278 $DbResult = $this->Database->query('SELECT COUNT(*) FROM `Runner` WHERE '.$Where);
279 $DbRow = $DbResult->fetch_row();
280 $PageList = GetPageList($DbRow[0]);
281
282 $Gender = array('', 'Male', 'Female', 'Child');
283 $Output .= '<div id="list_content">';
284 $Output .= $PageList['Output'];
285 $TableColumns = array(
286 array('Name' => 'Name', 'Title' => 'Name'),
287 array('Name' => 'Gender', 'Title' => 'Gender'),
288 array('Name' => 'Distance', 'Title' => 'Distance'),
289 array('Name' => 'Money', 'Title' => 'Money'),
290 array('Name' => 'Rank', 'Title' => 'Rank'),
291 array('Name' => 'Time', 'Title' => 'Last change'),
292 );
293 $Order = GetOrderTableHeader($TableColumns, 'Distance', 1);
294 $Output .= '<table class="WideTable">';
295 $Output .= $Order['Output'];
296 $DbResult = $this->Database->select('Runner', '*, '.
297 '(SELECT RunnerStat.Distance FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Distance'.
298 ', (SELECT RunnerStat.Money FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Money'.
299 ', (SELECT RunnerStat.Time FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Time'.
300 ', (SELECT RunnerStat.Rank FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Rank',
301 $Where.$Order['SQL'].$PageList['SQLLimit']);
302 while($MeetItem = $DbResult->fetch_assoc())
303 {
304 $Output .= '<tr>'.
305 '<td><a href="'.$this->Link('/runner/'.$MeetItem['Id'].'/').'">'.$MeetItem['Name'].'</a></td>'.
306 '<td>'.$Gender[$MeetItem['Gender']].'</td>'.
307 '<td>'.$MeetItem['Distance'].'</td>'.
308 '<td>'.$MeetItem['Money'].'</td>'.
309 '<td>'.$MeetItem['Rank'].'</td>'.
310 '<td>'.HumanDateTime(MysqlDateTimeToTime($MeetItem['Time'])).'</td>'.
311 '</tr>';
312 }
313 $Output .= '</table>';
314 $Output .= $PageList['Output'];
315 $Output .= '</div>';
316
317 return($Output);
318 }
319
320 function ShowTeams()
321 {
322 $Output = '';
323 $Output .= '<div class="page-title">Teams</div>';
324
325 //$Where = 'Name != ""';
326 $Where = 'IsFamily=0';
327
328 $DbResult = $this->Database->query('SELECT COUNT(*) FROM `Team` WHERE '.$Where);
329 $DbRow = $DbResult->fetch_row();
330 $PageList = GetPageList($DbRow[0]);
331
332 $Output .= '<div id="list_content">';
333 $Output .= $PageList['Output'];
334 $TableColumns = array(
335 array('Name' => 'Name', 'Title' => 'Name'),
336 array('Name' => 'RunnersCount', 'Title' => 'Runners'),
337 array('Name' => 'Distance', 'Title' => 'Distance'),
338 array('Name' => 'Money', 'Title' => 'Money'),
339 array('Name' => 'DistanceRunner', 'Title' => 'Distance per runner'),
340 array('Name' => 'MoneyRunner', 'Title' => 'Money per runner'),
341 array('Name' => 'Rank', 'Title' => 'Rank'),
342 );
343 $Order = GetOrderTableHeader($TableColumns, 'Distance', 1);
344 $Output .= '<table class="WideTable">';
345 $Output .= $Order['Output'];
346 $DbResult = $this->Database->select('Team', '*, '.
347 '(SELECT COUNT(*) FROM Runner WHERE Runner.Team=Team.Id) AS RunnersCount, '.
348 '(SELECT TeamStat.Distance FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY TeamStat.Time DESC LIMIT 1) AS Distance, '.
349 '(SELECT TeamStat.Money FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY Time DESC LIMIT 1) AS Money, '.
350 '(SELECT TeamStat.Time FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY Time DESC LIMIT 1) AS Time, '.
351 '(SELECT TeamStat.Rank FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY Time DESC LIMIT 1) AS Rank, '.
352 'ROUND((SELECT TeamStat.Distance FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY TeamStat.Time DESC LIMIT 1) / (SELECT COUNT(*) FROM Runner WHERE Runner.Team=Team.Id), 1) AS DistanceRunner, '.
353 'ROUND((SELECT TeamStat.Money FROM TeamStat WHERE TeamStat.Team=Team.Id ORDER BY Time DESC LIMIT 1) / (SELECT COUNT(*) FROM Runner WHERE Runner.Team=Team.Id)) AS MoneyRunner',
354 $Where.$Order['SQL'].$PageList['SQLLimit']);
355 while($Item = $DbResult->fetch_assoc())
356 {
357 if ($Item['Name'] == '') $Item['Name'] = 'Team '.$Item['WebId'];
358 $Output .= '<tr>'.
359 '<td><a href="'.$this->Link('/team/'.$Item['Id'].'/').'">'.$Item['Name'].'</a></td>'.
360 '<td>'.$Item['RunnersCount'].'</td>'.
361 '<td>'.$Item['Distance'].'</td>'.
362 '<td>'.$Item['Money'].'</td>'.
363 '<td>'.$Item['DistanceRunner'].'</td>'.
364 '<td>'.$Item['MoneyRunner'].'</td>'.
365 '<td>'.$Item['Rank'].'</td>'.
366 '</tr>';
367 }
368 $Output .= '</table>';
369 $Output .= $PageList['Output'];
370 $Output .= '</div>';
371
372 return($Output);
373 }
374
375 function ShowTeam()
376 {
377 $Output = '';
378
379 $TeamId = 1;
380 if ((count($this->PathItems) > 0) and ($this->PathItems[count($this->PathItems) - 1] != ''))
381 $TeamId = $this->PathItems[count($this->PathItems) - 1];
382 if (!is_numeric($TeamId)) die('TeamId needs to be numeric');
383
384 $DbResult = $this->Database->query('SELECT * FROM Team WHERE Id='.$TeamId);
385 $DbRow = $DbResult->fetch_assoc();
386 $Output .= '<div class="page-title">Team '.$DbRow['Name'].'</div>';
387
388
389 $Where = 'Team='.$TeamId;
390
391 $DbResult = $this->Database->query('SELECT COUNT(*) FROM `Runner` WHERE '.$Where);
392 $DbRow = $DbResult->fetch_row();
393 $PageList = GetPageList($DbRow[0]);
394
395 $Gender = array('', 'Male', 'Female', 'Child');
396 $Output .= '<div id="list_content">';
397 $Output .= $PageList['Output'];
398 $TableColumns = array(
399 array('Name' => 'Name', 'Title' => 'Name'),
400 array('Name' => 'Gender', 'Title' => 'Gender'),
401 array('Name' => 'Distance', 'Title' => 'Distance'),
402 array('Name' => 'Money', 'Title' => 'Money'),
403 array('Name' => 'Rank', 'Title' => 'Rank'),
404 array('Name' => 'Time', 'Title' => 'Last change'),
405 );
406 $Order = GetOrderTableHeader($TableColumns, 'Distance', 1);
407 $Output .= '<table class="WideTable">';
408 $Output .= $Order['Output'];
409 $DbResult = $this->Database->select('Runner', '*, '.
410 '(SELECT RunnerStat.Distance FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Distance'.
411 ', (SELECT RunnerStat.Money FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Money'.
412 ', (SELECT RunnerStat.Time FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Time'.
413 ', (SELECT RunnerStat.Rank FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Rank',
414 $Where.$Order['SQL'].$PageList['SQLLimit']);
415 while($MeetItem = $DbResult->fetch_assoc())
416 {
417 $Output .= '<tr>'.
418 '<td><a href="'.$this->Link('/runner/'.$MeetItem['Id'].'/').'">'.$MeetItem['Name'].'</a></td>'.
419 '<td>'.$Gender[$MeetItem['Gender']].'</td>'.
420 '<td>'.$MeetItem['Distance'].'</td>'.
421 '<td>'.$MeetItem['Money'].'</td>'.
422 '<td>'.$MeetItem['Rank'].'</td>'.
423 '<td>'.HumanDateTime(MysqlDateTimeToTime($MeetItem['Time'])).'</td>'.
424 '</tr>';
425 }
426 $Output .= '</table>';
427 $Output .= $PageList['Output'];
428 $Output .= '</div>';
429
430 return($Output);
431 }
432
433 function ShowRunners()
434 {
435 $Output = '';
436 $Output .= '<div class="page-title">Runners</div>';
437
438 $Where = '1';
439 $DbResult = $this->Database->query('SELECT COUNT(*) FROM `Runner` WHERE '.$Where);
440 $DbRow = $DbResult->fetch_row();
441 $PageList = GetPageList($DbRow[0]);
442
443 $Gender = array('', 'Male', 'Female', 'Child');
444 $Output .= '<div id="list_content">';
445 $Output .= $PageList['Output'];
446 $TableColumns = array(
447 array('Name' => 'Name', 'Title' => 'Name'),
448 array('Name' => 'Gender', 'Title' => 'Gender'),
449 array('Name' => 'Distance', 'Title' => 'Distance'),
450 array('Name' => 'Money', 'Title' => 'Money'),
451 array('Name' => 'Rank', 'Title' => 'Rank'),
452 array('Name' => 'Time', 'Title' => 'Last change'),
453 );
454 $Order = GetOrderTableHeader($TableColumns, 'Distance', 1);
455 $Output .= '<table class="WideTable">';
456 $Output .= $Order['Output'];
457 $DbResult = $this->Database->select('Runner', '*, '.
458 '(SELECT RunnerStat.Distance FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Distance'.
459 ', (SELECT RunnerStat.Money FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Money'.
460 ', (SELECT RunnerStat.Time FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Time'.
461 ', (SELECT RunnerStat.Rank FROM RunnerStat WHERE RunnerStat.Runner=Runner.Id ORDER BY Time DESC LIMIT 1) AS Rank',
462 $Where.$Order['SQL'].$PageList['SQLLimit']);
463 while($Item = $DbResult->fetch_assoc())
464 {
465 $Output .= '<tr>'.
466 '<td><a href="'.$this->Link('/runner/'.$Item['Id'].'/').'">'.$Item['Name'].'</a></td>'.
467 '<td>'.$Gender[$Item['Gender']].'</td>'.
468 '<td>'.$Item['Distance'].'</td>'.
469 '<td>'.$Item['Money'].'</td>'.
470 '<td>'.$Item['Rank'].'</td>'.
471 '<td>'.HumanDateTime(MysqlDateTimeToTime($Item['Time'])).'</td>'.
472 '</tr>';
473 }
474 $Output .= '</table>';
475 $Output .= $PageList['Output'];
476 $Output .= '</div>';
477
478 return($Output);
479 }
480
481 function ShowRunner()
482 {
483 $PrefixMultiplier = new PrefixMultiplier();
484 $Output = '';
485
486 $RunnerId = 1;
487 if ((count($this->PathItems) > 0) and ($this->PathItems[count($this->PathItems) - 1] != ''))
488 $RunnerId = $this->PathItems[count($this->PathItems) - 1];
489 if (!is_numeric($RunnerId)) die('Runner id needs to be numeric');
490
491 $DbResult = $this->Database->query('SELECT * FROM Runner WHERE Id='.$RunnerId);
492 $DbRow = $DbResult->fetch_assoc();
493 $Output .= '<div class="page-title">Runner '.$DbRow['Name'].'</div>';
494
495
496 $Where = 'RunnerStat.Runner='.$RunnerId;
497
498 // Show detailed stats
499 $Output .= '<div class="section-title">Detailed</div>';
500 $DbResult = $this->Database->query('SELECT COUNT(*) FROM `RunnerStat` WHERE '.$Where);
501 $DbRow = $DbResult->fetch_row();
502 $PageList = GetPageList($DbRow[0]);
503
504 $Output .= '<div id="list_content">';
505 $Output .= $PageList['Output'];
506 $TableColumns = array(
507 array('Name' => 'Time', 'Title' => 'Time'),
508 array('Name' => 'Distance', 'Title' => 'Distance [km]'),
509 array('Name' => 'Money', 'Title' => 'Money [Kč]'),
510 array('Name' => 'Rank', 'Title' => 'Rank'),
511 array('Name' => 'Duration', 'Title' => 'Duration'),
512 array('Name' => 'Length', 'Title' => 'Length [km]'),
513 array('Name' => 'Speed', 'Title' => 'Speed [km/hour]'),
514 );
515 $Order = GetOrderTableHeader($TableColumns, 'Time', 1);
516 $Output .= '<table class="WideTable">';
517 $Output .= $Order['Output'];
518 $DbResult = $this->Database->query('SELECT *'.
519 ', (SELECT TIME_TO_SEC(TIMEDIFF(RunnerStat.Time, B.Time)) FROM RunnerStat AS B WHERE (B.Time < RunnerStat.Time) AND (B.Runner = RunnerStat.Runner) ORDER BY B.Time DESC LIMIT 1) AS Duration'.
520 ', (SELECT RunnerStat.Distance - B.Distance FROM RunnerStat AS B WHERE (B.Time < RunnerStat.Time) AND (B.Runner = RunnerStat.Runner) ORDER BY B.Time DESC LIMIT 1) AS Length'.
521 ', NULL AS Speed'.
522 ' FROM RunnerStat'.
523 ' WHERE '.$Where.$Order['SQL'].$PageList['SQLLimit']);
524 while($MeetItem = $DbResult->fetch_assoc())
525 {
526 $Output .= '<tr>'.
527 '<td>'.HumanDateTime(MysqlDateTimeToTime($MeetItem['Time'])).'</td>'.
528 '<td>'.$MeetItem['Distance'].'</td>'.
529 '<td>'.$MeetItem['Money'].'</td>'.
530 '<td>'.$MeetItem['Rank'].'</td>';
531 if ($MeetItem['Duration'] != null) $Output .= '<td>'.$PrefixMultiplier->Add($MeetItem['Duration'], '', 4, 'Time').'</td>';
532 else $Output .= '<td>&nbsp;</td>';
533 $Output .= '<td>'.$MeetItem['Length'].'</td>';
534 if ($MeetItem['Duration'] > 0) $Output .= '<td>'.$PrefixMultiplier->Add($MeetItem['Length'] / $MeetItem['Duration'] * 3600, '', 4, 'Decimal').'</td>';
535 else $Output .= '<td>&nbsp;</td>';
536 $Output .= '</tr>';
537 }
538 $Output .= '</table>';
539 $Output .= $PageList['Output'];
540 $Output .= '</div><br/>';
541
542 // Show daily stats
543 $Where = '1';
544
545 $DailyTableMaxId = 'SELECT * FROM (SELECT MAX(Id) AS MaxId FROM `RunnerStat` AS T1 WHERE T1.Runner='.$RunnerId.' GROUP BY DATE(Time)) AS T2 LEFT JOIN RunnerStat AS T3 ON T3.Id=T2.MaxId';
546 $DailyTableMinId = 'SELECT * FROM (SELECT MIN(Id) AS MinId FROM `RunnerStat` AS T1 WHERE T1.Runner='.$RunnerId.' GROUP BY DATE(Time)) AS T2 LEFT JOIN RunnerStat AS T3 ON T3.Id=T2.MinId';
547 $DbResult = $this->Database->query('SELECT COUNT(*) FROM ('.$DailyTableMaxId.') AS B');
548 $DbRow = $DbResult->fetch_row();
549 $PageList = GetPageList($DbRow[0]);
550
551 $Output .= '<div class="section-title">Daily</div>';
552 $Output .= '<div id="list_content">';
553 $Output .= $PageList['Output'];
554 $TableColumns = array(
555 array('Name' => 'Time', 'Title' => 'Time'),
556 array('Name' => 'Distance', 'Title' => 'Distance [km]'),
557 array('Name' => 'Money', 'Title' => 'Money [Kč]'),
558 array('Name' => 'Rank', 'Title' => 'Rank'),
559 array('Name' => 'Duration', 'Title' => 'Duration'),
560 array('Name' => 'Length', 'Title' => 'Length [km]'),
561 array('Name' => 'Speed', 'Title' => 'Speed [km/hour]'),
562 );
563 $Order = GetOrderTableHeader($TableColumns, 'Time', 1);
564 $Output .= '<table class="WideTable">';
565 $Output .= $Order['Output'];
566 $DbResult = $this->Database->query('SELECT * '.
567 ', (SELECT T4.Distance - B.Distance + 1.5 FROM ('.$DailyTableMinId.') AS B WHERE (DATE(B.Time) = DATE(T4.Time)) AND (B.Runner = T4.Runner) ORDER BY B.Time DESC LIMIT 1) AS Length'.
568 ', (SELECT TIME_TO_SEC(TIMEDIFF(T4.Time, B.Time)) / (Length - 1.5) * Length FROM ('.$DailyTableMinId.') AS B WHERE (DATE(B.Time) = DATE(T4.Time)) AND (B.Runner = T4.Runner) ORDER BY B.Time DESC LIMIT 1) AS Duration'.
569 ', NULL AS Speed'.
570 ' FROM ('.$DailyTableMaxId.') AS T4'.
571 ' WHERE '.$Where.$Order['SQL'].$PageList['SQLLimit']);
572 while($MeetItem = $DbResult->fetch_assoc())
573 {
574 $Output .= '<tr>'.
575 '<td>'.HumanDateTime(MysqlDateTimeToTime($MeetItem['Time'])).'</td>'.
576 '<td>'.$MeetItem['Distance'].'</td>'.
577 '<td>'.$MeetItem['Money'].'</td>'.
578 '<td>'.$MeetItem['Rank'].'</td>';
579 if ($MeetItem['Duration'] != null) $Output .= '<td>'.$PrefixMultiplier->Add($MeetItem['Duration'], '', 4, 'Time').'</td>';
580 else $Output .= '<td>&nbsp;</td>';
581 $Output .= '<td>'.$MeetItem['Length'].'</td>';
582 if ($MeetItem['Duration'] > 0) $Output .= '<td>'.$PrefixMultiplier->Add($MeetItem['Length'] / $MeetItem['Duration'] * 3600, '', 4, 'Decimal').'</td>';
583 else $Output .= '<td>&nbsp;</td>';
584 $Output .= '</tr>';
585 }
586 $Output .= '</table>';
587 $Output .= $PageList['Output'];
588 $Output .= '</div>';
589
590 return($Output);
591 }
592
593 function ShowMain()
594 {
595 $Output = '';
596 $DbResult = $this->Database->select('Runner', 'COUNT(*) AS Total');
597 $DbRow = $DbResult->fetch_assoc();
598 $RunnersCount = $DbRow['Total'];
599
600 $Output = '';
601 $DbResult = $this->Database->select('Runner', 'COUNT(*) AS Total', 'Gender=1');
602 $DbRow = $DbResult->fetch_assoc();
603 $MenCount = $DbRow['Total'];
604
605 $Output = '';
606 $DbResult = $this->Database->select('Runner', 'COUNT(*) AS Total', 'Gender=2');
607 $DbRow = $DbResult->fetch_assoc();
608 $WomenCount = $DbRow['Total'];
609
610 $Output = '';
611 $DbResult = $this->Database->select('Runner', 'COUNT(*) AS Total', 'Gender=3');
612 $DbRow = $DbResult->fetch_assoc();
613 $KidsCount = $DbRow['Total'];
614
615 $DbResult = $this->Database->select('Team', 'COUNT(*) AS Total', 'IsFamily=0');
616 $DbRow = $DbResult->fetch_assoc();
617 $TeamsCount = $DbRow['Total'];
618
619 $DbResult = $this->Database->select('Team', 'COUNT(*) AS Total', 'IsFamily=1');
620 $DbRow = $DbResult->fetch_assoc();
621 $FamiliesCount = $DbRow['Total'];
622
623 $Output .= '<div class="page-title">Summary</div>';
624 $Output .= '<table class="WideTable">';
625 $Output .= '<tr><th>Category</th><th>Total count</th></tr>';
626 $Output .= '<tr><td>Runners</td><td>'.$RunnersCount.'</td></tr>';
627 $Output .= '<tr><td>Men</td><td>'.$MenCount.'</td></tr>';
628 $Output .= '<tr><td>Women</td><td>'.$WomenCount.'</td></tr>';
629 $Output .= '<tr><td>Kids</td><td>'.$KidsCount.'</td></tr>';
630 $Output .= '<tr><td>Teams</td><td>'.$TeamsCount.'</td></tr>';
631 $Output .= '<tr><td>Families</td><td>'.$FamiliesCount.'</td></tr>';
632 $Output .= '</table>';
633
634 return $Output;
635 }
636
637 function ShowPage($Content)
638 {
639 global $Config;
640
641 $Output = '<?xml version="1.0" encoding="'.$this->Config['Encoding'].'"?>'."\n".
642 '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'.
643 '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="cs" lang="cs">'.
644 '<head>'.
645 '<link rel="stylesheet" href="'.$this->Link('/style.css').'" type="text/css" media="all" />'.
646 '<meta http-equiv="content-type" content="application/xhtml+xml; charset='.$this->Config['Encoding'].'" />'.
647 '<meta name="viewport" content="width=device-width, initial-scale=1">'.
648 '<script src="'.$this->Link('/jquery.js').'"></script>';
649 $Output .= '<title>Teribear stats</title>'.
650 '</head><body>';
651 $Output .= $Content;
652 $Output .= '<br/><div class="footer">Contact: <a href="mailto:'.$Config['Contact'].'">'.$Config['Contact'].'</a> '.
653 '<a href="https://app.zdechov.net/teribear/">Source code</a></div>';
654 $Output .= '</body></html>';
655 return($Output);
656 }
657
658 function Run()
659 {
660 global $Config;
661
662 $this->Config = $Config;
663 $this->Database = new Database();
664 $this->Database->Connect($this->Config['Database']['Host'], $this->Config['Database']['User'],
665 $this->Config['Database']['Password'], $this->Config['Database']['Database']);
666 $this->Database->Prefix = $this->Config['Database']['Prefix'];
667 $this->Database->charset($this->Config['Database']['Charset']);
668 $this->PathItems = $this->ProcessURL();
669
670 $Output = '';
671
672 if(count($this->PathItems) > 0)
673 {
674 if($this->PathItems[0] == 'sync') $Output .= $this->ShowSync();
675 //else if($this->PathItems[0] == 'empty') $Output .= $this->ShowEmpty();
676 else if($this->PathItems[0] == 'runner') $Output .= $this->ShowRunner();
677 else if($this->PathItems[0] == 'runners') $Output .= $this->ShowRunners();
678 else if($this->PathItems[0] == 'team') $Output .= $this->ShowTeam();
679 else if($this->PathItems[0] == 'teams') $Output .= $this->ShowTeams();
680 else if($this->PathItems[0] == 'family') $Output .= $this->ShowFamily();
681 else if($this->PathItems[0] == 'families') $Output .= $this->ShowFamilies();
682 else $Output .= $this->ShowMain();
683 } else $Output .= $this->ShowMain();
684 if (!$this->NoFullPage)
685 {
686 $Output = $this->ShowMenu().$Output;
687 echo($this->ShowPage($Output));
688 } else echo($Output);
689 }
690}
691
692$Application = new MyApplication();
693$Application->Run();
Note: See TracBrowser for help on using the repository browser.