source: trunk/global.php@ 428

Last change on this file since 428 was 428, checked in by chronos, 13 years ago
  • Přidáno: Stránka obecné správy dat.
  • Přidáno: Zobrazení seznamu položek se zobrazením s obsluhou dle typu položky.
  • Property svn:executable set to *
File size: 16.7 KB
Line 
1<?php
2
3$ConfigFileName = dirname(__FILE__).'/config.php';
4
5if(file_exists($ConfigFileName)) include_once($ConfigFileName);
6 else die('Nenalezen konfigurační soubor '.$ConfigFileName.'!');
7include_once('database.php');
8//include('error.php');
9include_once('code.php');
10include_once('Mail.php');
11include_once('module.php');
12include_once('forms.php');
13include_once('page.php');
14include_once('file.php');
15include_once('log.php');
16include_once('user.php');
17include_once('aktuality/news.php');
18include_once('webcam/webcam.php');
19include_once('finance/bills.php');
20include_once('finance/finance.php');
21include_once('Common/Types/Type.php');
22
23$PrefixMultipliers = array
24(
25 'Binary' => array
26 (
27 'BaseIndex' => 0,
28 'Definition' => array
29 (
30 array('', '', pow(2, 0)),
31 array('Ki', 'kibi', pow(2, 10)),
32 array('Mi', 'mebi', pow(2, 20)),
33 array('Gi', 'gibi', pow(2, 30)),
34 array('Ti', 'tebi', pow(2, 40)),
35 array('Pi', 'pebi', pow(2, 50)),
36 array('Ei', 'exbi', pow(2, 60)),
37 array('Zi', 'zebi', pow(2, 70)),
38 array('Yi', 'yobi', pow(2, 80)),
39 ),
40 ),
41 'Decimal' => array
42 (
43 'BaseIndex' => 8,
44 'Definition' => array
45 (
46 array('y', 'yocto', pow(10, -24)),
47 array('z', 'zepto', pow(10, -21)),
48 array('a', 'atto', pow(10, -18)),
49 array('f', 'femto', pow(10, -15)),
50 array('p', 'piko', pow(10, -12)),
51 array('n', 'nano', pow(10, -9)),
52 array('u', 'mikro', pow(10, -6)),
53 array('m', 'mili', pow(10, -3)),
54 array('', '', pow(10, 0)),
55 array('k', 'kilo', pow(10, 3)),
56 array('M', 'mega', pow(10, 6)),
57 array('G', 'giga', pow(10, 9)),
58 array('T', 'tera', pow(10, 12)),
59 array('P', 'peta', pow(10, 15)),
60 array('E', 'exa', pow(10, 18)),
61 array('Z', 'zetta', pow(10, 21)),
62 array('Y', 'yotta', pow(10, 24)),
63 ),
64 ),
65 'Time' => array
66 (
67 'BaseIndex' => 8,
68 'Definition' => array
69 (
70 array('ys', 'yoctosekunda', pow(10, -24)),
71 array('zs', 'zeptosekunda', pow(10, -21)),
72 array('as', 'attosekunda', pow(10, -18)),
73 array('fs', 'femtosekunda', pow(10, -15)),
74 array('ps', 'pikosekunda', pow(10, -12)),
75 array('ns', 'nanosekunda', pow(10, -9)),
76 array('us', 'mikrosekunda', pow(10, -6)),
77 array('ms', 'milisekunda', pow(10, -3)),
78 array('s', 'sekunda', 1),
79 array('minut', 'minuta', 60),
80 array('hodin', 'hodina', 60 * 60) ,
81 array('dnů', 'den', 24 * 60 * 60),
82 array('týdnů', 'týden', 7 * 24 * 60 * 60),
83 array('měsíců', 'měsíc', 30 * 24 * 60 * 60),
84 array('roků', 'rok', 364 * 24 * 60 * 60),
85 array('desetiletí', 'desetiletí', 10 * 364 * 24 * 60 * 60),
86 array('stalatí', 'staletí', 100 * 364 * 24 * 60 * 60),
87 array('tisíciletí', 'tisiciletí', 10000 * 364 * 24 * 60 * 60),
88 ),
89 ),
90);
91
92class System extends Module
93{
94 var $Modules = array();
95
96 function ModulePresent($Name)
97 {
98 return(array_key_exists($Name, $this->Modules));
99 }
100
101 function AddModule($Module)
102 {
103 global $Database;
104
105 //echo('Přidávám modul '.get_class($Module).'<br />');
106 $Module->System = &$this;
107 $Module->Database = &$Database;
108 $this->Modules[get_class($Module)] = $Module;
109 }
110
111 function AddEmailToQueue($To, $Subject, $Content, $From, $AttachmentFileId = '')
112 {
113 $Values = array('Address' => $To,
114 'Subject' => $Subject, 'Content' => $Content, 'Time' => 'NOW()',
115 'From' => $From);
116 if($AttachmentFileId != '') $Values['AttachmentFile'] = $AttachmentFileId;
117 $this->Database->insert('EmailQueue', $Values);
118 }
119
120 function ProcessEmailQueue()
121 {
122 $Mail = new Mail();
123 $Output = '';
124 $DbResult = $this->Database->select('EmailQueue', '*', 'Archive=0');
125 while($DbRow = $DbResult->fetch_assoc())
126 {
127 $Mail->AddTo($DbRow['To']);
128 $Mail->Subject = $DbRow['Subject'];
129 $Mail->From = $DbRow['From'];
130 $Mail->AddBody(strip_tags($DbRow['Content']), 'text/plain');
131 $Mail->AddBody($DbRow['Content'], 'text/html');
132 if($DbRow['AttachmentFile'] != 'NULL')
133 {
134 $DbResult2 = $this->Dataase->select('File', '*', 'Id='.$DbRow['AttachmentFile']);
135 $File = $DbResult2->fetch_assoc();
136 $Mail->AttachFile($this->Config['Web']['FileRootFolder'].$File['DrivePath'], $File['MimeType']);
137 }
138 $Mail->Send();
139 $this->Database->update('EmailQueue', 'Id='.$DbRow['Id'], array('Archive' => 1));
140 $this->Modules['Log']->NewRecord('System', 'SendEmail', $DbRow['Id']);
141 $Output .= 'To: '.$DbRow['Address'].' Subject: '.$DbRow['Subject'].'<br />';
142 }
143 return($Output);
144 }
145
146 function HumanDate($Time)
147 {
148 return(date('j.n.Y', $Time));
149 }
150
151 function TruncateDigits($Value, $Digits = 4)
152 {
153 for($II = 2; $II > -6; $II--)
154 {
155 if($Value >= pow(10, $II))
156 {
157 if($Digits < ($II + 1)) $RealDigits = $II + 1; else $RealDigits = $Digits;
158 $Value = round($Value / pow(10, $II - $RealDigits + 1)) * pow(10, $II - $RealDigits + 1);
159 break;
160 }
161 }
162 return($Value);
163 }
164
165 function AddPrefixMultipliers($Value, $Unit, $Digits = 4, $PrefixType = 'Decimal')
166 {
167 global $PrefixMultipliers;
168
169 $Negative = ($Value < 0);
170 $Value = abs($Value);
171 if(($Unit == '') and ($PrefixType != 'Time'))
172 return($this->TruncateDigits($Value, $Digits));
173
174 $I = $PrefixMultipliers[$PrefixType]['BaseIndex'];
175 if($Value == 0) return($Value.' '.$PrefixMultipliers[$PrefixType]['Definition'][$I][0].$Unit);
176
177 if($Value > 1)
178 {
179 while((($I + 1) <= count($PrefixMultipliers[$PrefixType]['Definition'])) and (($Value / $PrefixMultipliers[$PrefixType]['Definition'][$I + 1][2]) > 1))
180 $I = $I + 1;
181 } else
182 if($Value < 1)
183 {
184 while((($I - 1) >= 0) and (($Value / $PrefixMultipliers[$PrefixType]['Definition'][$I][2]) < 1))
185 $I = $I - 1;
186 }
187 $Value = $Value / $PrefixMultipliers[$PrefixType]['Definition'][$I][2];
188
189 // Truncate digits count
190 $Value = $this->TruncateDigits($Value, $Digits);
191 if($Negative) $Value = -$Value;
192 return($Value.' '.$PrefixMultipliers[$PrefixType]['Definition'][$I][0].$Unit);
193 }
194
195 function Link($Target)
196 {
197 global $Config;
198
199 return($Config['Web']['RootFolder'].$Target);
200 }
201}
202
203function GlobalInit()
204{
205 global $Config, $Database, $System, $ScriptTimeStart, $ConfigFileName, $Mail, $Type;
206
207 $ScriptTimeStart = GetMicrotime();
208 // SQL injection hack protection
209 foreach($_POST as $Index => $Item) $_POST[$Index] = addslashes($Item);
210 foreach($_GET as $Index => $Item) $_GET[$Index] = addslashes($Item);
211
212 if(isset($_SERVER['REMOTE_ADDR'])) session_start();
213
214 $Database = new Database($Config['Database']['Host'], $Config['Database']['User'], $Config['Database']['Password'], $Config['Database']['Database']);
215 $Database->Prefix = $Config['Database']['Prefix'];
216 $Database->charset($Config['Database']['Charset']);
217 $Database->ShowSQLError = $Config['Web']['ShowSQLError'];
218 $Database->ShowSQLQuery = $Config['Web']['ShowSQLQuery'];
219
220 $System = new System();
221 $System->Config = $Config;
222 $System->Database = &$Database;
223 $System->AddModule(new Log());
224 $System->AddModule(new User());
225 if(isset($_SERVER['REMOTE_ADDR'])) $System->Modules['User']->Check();
226 $System->AddModule(new News());
227 $System->AddModule(new Webcam());
228 $System->AddModule(new Bill());
229 $System->AddModule(new Finance());
230 $System->Modules['Finance']->LoadMonthParameters(0);
231
232 $Type = new Type($System);
233}
234
235$MonthNames = array('', 'Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec');
236
237$UnitNames = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB');
238
239function HumanSize($Value)
240{
241 global $UnitNames;
242
243 $UnitIndex = 0;
244 while($Value > 1024)
245 {
246 $Value = round($Value / 1024, 3);
247 $UnitIndex++;
248 }
249 return($Value.' '.$UnitNames[$UnitIndex]);
250}
251
252function GetMicrotime()
253{
254 list($Usec, $Sec) = explode(' ', microtime());
255 return ((float)$Usec + (float)$Sec);
256}
257
258function ShowArray($Pole)
259{
260 echo('<pre style="font-size: 8pt;">');
261 print_r($Pole);
262 echo('</pre>');
263}
264
265function TimeToMysqlDateTime($Time)
266{
267 return(date('Y-m-d H:i:s', $Time));
268}
269
270function MysqlDateTimeToTime($Time)
271{
272 $Parts = explode(' ', $Time);
273 $DateParts = explode('-', $Parts[0]);
274 $TimeParts = explode(':', $Parts[1]);
275 $Result = mktime($TimeParts[0], $TimeParts[1], $TimeParts[2], $DateParts[1], $DateParts[2], $DateParts[0]);
276 return($Result);
277}
278
279function MysqlDateToTime($Time)
280{
281 return(MysqlDateTimeToTime($Time.' 0:0:0'));
282}
283
284function HumanDate($Time)
285{
286 $Date = explode(' ', $Time);
287 $Parts = explode('-', $Date[0]);
288 if($Date != '0000-00-00') return(($Parts[2]*1).'.'.($Parts[1]*1).'.'.$Parts[0]);
289 else return('&nbsp;');
290}
291
292// Zobrazení číselný seznamu stránek
293function PagesList($URL, $Page, $TotalCount, $CountPerPage)
294{
295 $Count = ceil($TotalCount / $CountPerPage);
296 $Around = 10;
297 $Result = '';
298 if($Count>1)
299 {
300 if($Page>0)
301 {
302 $Result.= '<a href="'.$URL.'0">&lt;&lt;</a> ';
303 $Result.= '<a href="'.$URL.($Page-1).'">&lt;</a> ';
304 }
305 $PagesMax = $Count-1;
306 $PagesMin = 0;
307 if($PagesMax>($Page+$Around)) $PagesMax = $Page+$Around;
308 if($PagesMin<($Page-$Around))
309 {
310 $Result.= ' .. ';
311 $PagesMin = $Page-$Around;
312 }
313 for($i=$PagesMin;$i<=$PagesMax;$i++)
314 {
315 if($i==$Page) $Result.= '<strong>';
316 $Result.= '<a href="'.$URL.$i.'">'.($i+1).'</a> ';
317 if($i==$Page) $Result.= '</strong>';
318 }
319 if($PagesMax<($Count-1)) $Result .= ' .. ';
320 if($Page<($Count-1))
321 {
322 $Result.= '<a href="'.$URL.($Page+1).'">&gt;</a> ';
323 $Result.= '<a href="'.$URL.($Count-1).'">&gt;&gt;</a>';
324 }
325 }
326 return($Result);
327}
328
329function GetQueryStringArray($QueryString)
330{
331 $Result = array();
332 $Parts = explode('&', $QueryString);
333 foreach($Parts as $Part)
334 {
335 if($Part != '')
336 {
337 if(!strpos($Part, '=')) $Part .= '=';
338 $Item = explode('=', $Part);
339 $Result[$Item[0]] = $Item[1];
340 }
341 }
342 return($Result);
343}
344
345function SetQueryStringArray($QueryStringArray)
346{
347 $Parts = array();
348 foreach($QueryStringArray as $Index => $Item)
349 {
350 $Parts[] = $Index.'='.$Item;
351 }
352 return(implode('&', $Parts));
353}
354
355function GetPageList($TotalCount)
356{
357 global $System;
358
359 $QueryItems = GetQueryStringArray($_SERVER['QUERY_STRING']);
360
361 $Result = '';
362 if(array_key_exists('all', $QueryItems))
363 {
364 $PageCount = 1;
365 $ItemPerPage = $TotalCount;
366 } else
367 {
368 $ItemPerPage = $System->Config['Web']['ItemsPerPage'];
369 $Around = round($System->Config['Web']['VisiblePagingItems'] / 2);
370 $PageCount = floor($TotalCount / $ItemPerPage) + 1;
371 }
372
373 if(!array_key_exists('Page', $_SESSION)) $_SESSION['Page'] = 0;
374 if(array_key_exists('page', $_GET)) $_SESSION['Page'] = $_GET['page'] * 1;
375 if($_SESSION['Page'] < 0) $_SESSION['Page'] = 0;
376 if($_SESSION['Page'] >= $PageCount) $_SESSION['Page'] = $PageCount - 1;
377 $CurrentPage = $_SESSION['Page'];
378
379
380 $Result .= 'Počet položek: <strong>'.$TotalCount.'</strong> &nbsp; Stránky: ';
381
382 $Result = '';
383 if($PageCount > 1)
384 {
385 if($CurrentPage > 0)
386 {
387 $QueryItems['page'] = 0;
388 $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">&lt;&lt;</a> ';
389 $QueryItems['page'] = ($CurrentPage - 1);
390 $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">&lt;</a> ';
391 }
392 $PagesMax = $PageCount - 1;
393 $PagesMin = 0;
394 if($PagesMax > ($CurrentPage + $Around)) $PagesMax = $CurrentPage + $Around;
395 if($PagesMin < ($CurrentPage - $Around))
396 {
397 $Result.= ' ... ';
398 $PagesMin = $CurrentPage - $Around;
399 }
400 for($i = $PagesMin; $i <= $PagesMax; $i++)
401 {
402 if($i == $CurrentPage) $Result.= '<strong>'.($i + 1).'</strong> ';
403 else {
404 $QueryItems['page'] = $i;
405 $Result .= '<a href="?'.SetQueryStringArray($QueryItems).'">'.($i + 1).'</a> ';
406 }
407 }
408 if($PagesMax < ($PageCount - 1)) $Result .= ' ... ';
409 if($CurrentPage < ($PageCount - 1))
410 {
411 $QueryItems['page'] = ($CurrentPage + 1);
412 $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">&gt;</a> ';
413 $QueryItems['page'] = ($PageCount - 1);
414 $Result.= '<a href="?'.SetQueryStringArray($QueryItems).'">&gt;&gt;</a>';
415 }
416 }
417 $QueryItems['all'] = '1';
418 if($PageCount > 1) $Result.= ' <a href="?'.SetQueryStringArray($QueryItems).'">Vše</a>';
419
420 $Result = '<div style="text-align: center">'.$Result.'</div>';
421 return(array('SQLLimit' => ' LIMIT '.$CurrentPage * $ItemPerPage.', '.$ItemPerPage,
422 'Page' => $CurrentPage,
423 'Output' => $Result,
424 ));
425}
426
427$OrderDirSQL = array('ASC', 'DESC');
428$OrderArrowImage = array('sort_asc.png', 'sort_desc.png');
429
430function GetOrderTableHeader($Columns, $DefaultColumn, $DefaultOrder = 0)
431{
432 global $OrderDirSQL, $OrderArrowImage, $Config, $System;
433
434 if(array_key_exists('OrderCol', $_GET)) $_SESSION['OrderCol'] = $_GET['OrderCol'];
435 if(array_key_exists('OrderDir', $_GET)) $_SESSION['OrderDir'] = $_GET['OrderDir'];
436 if(!array_key_exists('OrderCol', $_SESSION)) $_SESSION['OrderCol'] = $DefaultColumn;
437 if(!array_key_exists('OrderDir', $_SESSION)) $_SESSION['OrderDir'] = $DefaultOrder;
438
439 // Check OrderCol
440 $Found = false;
441 foreach($Columns as $Column)
442 {
443 if($Column['Name'] == $_SESSION['OrderCol'])
444 {
445 $Found = true;
446 break;
447 }
448 }
449 if($Found == false)
450 {
451 $_SESSION['OrderCol'] = $DefaultColumn;
452 $_SESSION['OrderDir'] = $DefaultOrder;
453 }
454 // Check OrderDir
455 if(($_SESSION['OrderDir'] != 0) and ($_SESSION['OrderDir'] != 1)) $_SESSION['OrderDir'] = 0;
456
457 $Result = '';
458 $QueryItems = GetQueryStringArray($_SERVER['QUERY_STRING']);
459 foreach($Columns as $Index => $Column)
460 {
461 $QueryItems['OrderCol'] = $Column['Name'];
462 $QueryItems['OrderDir'] = 1 - $_SESSION['OrderDir'];
463 if($Column['Name'] == $_SESSION['OrderCol']) $ArrowImage = '<img style="vertical-align: middle; border: 0px;" src="'.$System->Link('/images/'.$OrderArrowImage[$_SESSION['OrderDir']]).'" alt="order arrow">';
464 else $ArrowImage = '';
465 if($Column['Name'] == '') $Result .= '<th>'.$Column['Title'].'</th>';
466 else $Result .= '<th><a href="?'.SetQueryStringArray($QueryItems).'">'.$Column['Title'].$ArrowImage.'</a></th>';
467 }
468 return(array(
469 'SQL' => ' ORDER BY `'.$_SESSION['OrderCol'].'` '.$OrderDirSQL[$_SESSION['OrderDir']],
470 'Output' => '<tr>'.$Result.'</tr>',
471 'Column' => $_SESSION['OrderCol'],
472 'Direction' => $_SESSION['OrderDir'],
473 ));
474}
475
476function GetRemoteAddress()
477{
478 if(array_key_exists('HTTP_X_FORWARDED_FOR',$_SERVER)) $IP = $_SERVER['HTTP_X_FORWARDED_FOR'] ;
479 else if(array_key_exists('REMOTE_ADDR', $_SERVER)) $IP = $_SERVER['REMOTE_ADDR'];
480 else $IP = '0.0.0.0';
481 return($IP);
482}
483
484function IsInternetAddr()
485{
486 $RemoteAddr = GetRemoteAddress();
487 $RemoteAddr = explode('.', $RemoteAddr);
488// return(!(($RemoteAddr[0] == 10) and ($RemoteAddr[1] == 145)));
489 return(!(($RemoteAddr[0] == 10)));
490}
491
492function GetMemberByIP($IP)
493{
494 global $Database;
495
496 $DbResult = $Database->query('SELECT Id FROM Member WHERE (SELECT Member FROM NetworkDevice WHERE (SELECT Device FROM NetworkInterface WHERE LocalIP = "'.$IP.'") = NetworkDevice.Id) = Member.Id');
497 if($DbResult->num_rows > 0)
498 {
499 $DbRow = $DbResult->fetch_assoc();
500 return($DbRow['Id']);
501 } else return('');
502}
503
504function RemoveDiacritic($Text)
505{
506 return(str_replace(
507 array('á', 'č', 'ď', 'é', 'ě', 'í', 'ľ', 'ň', 'ó', 'ř', 'š', 'ť', 'ú', 'ů', 'ý', 'ž', 'Á', 'Č', 'Ď', 'É', 'Ě', 'Í', 'Ľ', 'Ň', 'Ó', 'Ř', 'Š', 'Ť', 'Ú', 'Ů', 'Ý', 'Ž'),
508 array('a', 'c', 'd', 'e', 'e', 'i', 'l', 'n', 'o', 'r', 's', 't', 'u', 'u', 'y', 'z', 'A', 'C', 'D', 'E', 'E', 'I', 'L', 'N', 'O', 'R', 'S', 'T', 'U', 'U', 'Y', 'Z'),
509 $Text));
510}
511
512function RouterOSIdent($Name)
513{
514 return(strtr(strtolower(trim($Name)), array(' ' => '-', '.' => '', '(' => '-', ')' => '-',
515 'č' => 'c', 'š' => 's', 'ě' => 'e', 'ř' => 'r', 'ž' => 'z', 'ý' => 'y', 'á' => 'a', 'í' => 'i', 'é' => 'e', 'ů' => 'u', 'ú' => 'u', 'ď' => 'd', 'ť' => 't', 'ň' => 'n', 'ó' => 'o',
516 'Č' => 'c', 'Š' => 's', 'Ě' => 'e', 'Ř' => 'r', 'Ž' => 'z', 'Ý' => 'y', 'Á' => 'a', 'Í' => 'i', 'É' => 'e', 'Ů' => 'u', 'Ú' => 'u', 'Ď' => 'd', 'Ť' => 't', 'Ň' => 'n', 'Ó' => 'o',
517)));
518}
519
520function NotBlank($Text)
521{
522 if($Text == '') return('&nbsp');
523 else return($Text);
524}
525
526function strip_cdata($string)
527{
528 preg_match_all('/<!\[cdata\[(.*?)\]\]>/is', $string, $matches);
529 return str_replace($matches[0], $matches[1], $string);
530}
531
532function html2txt($document)
533{
534 $search = array('@<script[^>]*?>.*?</script>@si', // Strip out javascript
535 '@<[\/\!]*?[^<>]*?>@si', // Strip out HTML tags
536 '@<style[^>]*?>.*?</style>@siU', // Strip style tags properly
537 '@<![\s\S]*?--[ \t\n\r]*>@' // Strip multi-line comments including CDATA
538 );
539 $text = preg_replace($search, '', $document);
540 return $text;
541}
542
543GlobalInit();
544
545?>
Note: See TracBrowser for help on using the repository browser.