name() ? true : false; $username = $usrcp->name() ? $usrcp->name() : $lang['GUST']; //our default charset $charset = 'utf-8'; $side_menu = [ 1 => ['name' => 'profile', 'title' => $lang['PROFILE'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'profile.html' : 'ucp.php?go=profile'), 'show' => $user_is], 2 => ['name' => 'fileuser', 'title' => $lang['YOUR_FILEUSER'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'fileuser.html' : 'ucp.php?go=fileuser'), 'show' => $config['enable_userfile'] && user_can('access_fileuser')], 3 => $user_is ? ['name' => 'logout', 'title' => $lang['LOGOUT'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'logout.html' : 'ucp.php?go=logout'), 'show' => true] : ['name' => 'login', 'title' => $lang['LOGIN'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'login.html' : 'ucp.php?go=login'), 'show' => true], 4 => ['name' => 'register', 'title' => $lang['REGISTER'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'register.html' : 'ucp.php?go=register'), 'show' => ! $user_is && $config['register']], ]; $top_menu = [ 1 => ['name' => 'index', 'title' => $lang['INDEX'], 'url' => $config['siteurl'], 'show' => true], 2 => ['name' => 'rules', 'title' => $lang['RULES'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'rules.html' : 'go.php?go=rules'), 'show' => true], 3 => ['name' => 'guide', 'title' => $lang['GUIDE'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'guide.html' : 'go.php?go=guide'), 'show' => true], 4 => ['name' => 'stats', 'title' => $lang['STATS'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'stats.html' : 'go.php?go=stats'), 'show' => $config['allow_stat_pg'] && user_can('access_stats')], 5 => ['name' => 'report', 'title' => $lang['REPORT'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'report.html' : 'go.php?go=report'), 'show' => user_can('access_report')], 6 => ['name' => 'call', 'title' => $lang['CALL'], 'url' => $config['siteurl'] . ($config['mod_writer'] ? 'call.html' : 'go.php?go=call'), 'show' => user_can('access_call')], ]; //check for extra header $extras['header'] = empty($extras['header']) ? false : $extras['header']; is_array($plugin_run_result = Plugins::getInstance()->run('Saaheader_links_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook //assign some variables $tpl->assign('dir', $lang['DIR']); $tpl->assign('title', $title); $tpl->assign('side_menu', $side_menu); $tpl->assign('top_menu', $top_menu); $tpl->assign('go_current', g('go', 'str', 'index')); $tpl->assign('go_back_browser', $lang['GO_BACK_BROWSER']); $tpl->assign('H_FORM_KEYS_LOGIN', kleeja_add_form_key('login')); $tpl->assign('action_login', $config['siteurl'] . 'ucp.php?go=login' . (ig('return') ? '&return=' . g('return') : '')); $tpl->assign('EXTRA_CODE_META', $extra); $default_avatar = $STYLE_PATH . 'images/user_avater.png'; if ($user_is) { $tpl->assign('user_avatar', 'https://www.gravatar.com/avatar/' . md5(strtolower(trim($userinfo['mail']))) . '?s=100&d=' . urlencode($default_avatar)); } else { $tpl->assign('user_avatar', $default_avatar); } $tpl->assign('is_embedded', ig('embedded')); $header = $tpl->display('header'); if ($config['siteclose'] == '1' && user_can('enter_acp') && ! defined('IN_ADMIN')) { //add notification bar $header = preg_replace('/]*)>/i', "\n\n

" . $lang['NOTICECLOSED'] . "

\n", $header); } is_array($plugin_run_result = Plugins::getInstance()->run('Saaheader_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook header('Content-type: text/html; charset=UTF-8'); header('Cache-Control: private, no-cache="set-cookie"'); header('Pragma: no-cache'); header('x-frame-options: SAMEORIGIN'); header('x-xss-protection: 1; mode=block'); header('X-Content-Type-Options: nosniff'); echo $header; flush(); } /** * print kleeja footer */ function Saafooter() { global $tpl, $SQL, $starttm, $config, $usrcp, $lang, $olang; global $do_gzip_compress, $script_encoding, $errorpage, $extras, $userinfo; //show stats .. $page_stats = ''; if ($config['statfooter'] != 0 || defined('DEV_STAGE')) { $hksys = ! defined('STOP_PLUGINS') ? 'Enabled' : 'Disabled'; $endtime = get_microtime(); $loadtime = number_format($endtime - $starttm, 4); $queries_num = $SQL->query_num; $time_sql = round($SQL->query_num / $loadtime); $page_url = preg_replace(['/([\&\?]+)debug/i', '/&/i'], ['', '&'], kleeja_get_page()); $link_dbg = user_can('enter_acp') && defined('DEV_STAGE') ? '[ Debug Info ... ]' : ''; $page_stats = "[ Generation Time: $loadtime Sec - Queries: $queries_num - Hook System: $hksys ] " . $link_dbg; } $tpl->assign('page_stats', $page_stats); //if admin, show admin in the bottom of all page $tpl->assign('admin_page', (user_can('enter_acp') ? '' . $lang['ADMINCP'] . '' : '')); //assign cron $tpl->assign('run_queue', 'queue'); // if google analytics, new version //http://www.google.com/support/googleanalytics/bin/answer.py?answer=55488&topic=11126 $googleanalytics = ''; if (strlen($config['googleanalytics']) > 4) { $googleanalytics .= '' . "\n"; $googleanalytics .= '' . "\n"; } $tpl->assign('googleanalytics', $googleanalytics); $extras['footer'] = empty($extras['footer']) ? false : $extras['footer']; is_array($plugin_run_result = Plugins::getInstance()->run('Saafooter_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook $footer = $tpl->display('footer'); is_array($plugin_run_result = Plugins::getInstance()->run('print_Saafooter_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook echo $footer; //page analysis if (ig('debug') && user_can('enter_acp')) { kleeja_debug(); } //at end, close sql connections $SQL->close(); } /** * return file size in a readable format * @param int $size in bytes * @return string */ function readable_size($size) { $sizes = [' B', ' KB', ' MB', ' GB', ' TB', 'PB', ' EB']; $ext = $sizes[0]; for ($i=1; (($i < count($sizes)) && ($size >= 1024)); $i++) { $size = $size / 1024; $ext = $sizes[$i]; } $result = round($size, 2) . $ext; is_array($plugin_run_result = Plugins::getInstance()->run('func_readable_size', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $result; } /** * show an error message * * @param $message * @param string $title * @param bool $exit * @param bool|string $redirect a link to redirect after showing the message, or false * @param int $rs delay in seconds if redirect parameter is set * @param string $extra_code_header to append a code to head tag * @param string $style is err or info, set by default, no need to fill */ function kleeja_err($message, $title = '', $exit = true, $redirect = false, $rs = 2, $extra_code_header = '', $style = 'err') { global $text, $tpl, $SQL; is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_err_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook // assign {text} in err template $text = $message . ($redirect ? redirect($redirect, false, $exit, $rs, true) : ''); //header Saaheader($title, $extra_code_header); //show tpl echo $tpl->display($style); //footer Saafooter(); if ($exit) { $SQL->close(); exit(); } } /** * show an information message * * @param $message * @param string $title * @param bool $exit * @param bool|string $redirect a link to redirect after showing the message, or false * @param int $rs delay in seconds if redirect parameter is set * @param string $extra_code_header to append a code to head tag */ function kleeja_info($message, $title='', $exit = true, $redirect = false, $rs = 5, $extra_code_header = '') { is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_info_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook kleeja_err($message, $title, $exit, $redirect, $rs, $extra_code_header, 'info'); } /** * Show debug information */ function kleeja_debug() { global $SQL,$do_gzip_compress, $all_plg_hooks; is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_debug_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook $debug_output = ''; //get memory usage if (function_exists('memory_get_usage')) { if ($memory_usage = memory_get_usage()) { $base_memory_usage = 0; $memory_usage -= $base_memory_usage; $memory_usage = ($memory_usage >= 1048576) ? round((round($memory_usage / 1048576 * 100) / 100), 2) . ' MB' : (($memory_usage >= 1024) ? round((round($memory_usage / 1024 * 100) / 100), 2) . ' KB' : $memory_usage . ' BYTES'); $debug_output = 'Memory Usage : ' . $memory_usage . ''; } } //then show it echo '
'; echo '


[Page Analysis]
'; echo '

 

'; echo '

General Information :

'; echo '

Gzip : ' . ($do_gzip_compress !=0 ? 'Enabled' : 'Disabled') . '

'; echo '

Queries Number : ' . $SQL->query_num . '

'; echo '

Hook System : ' . ((! defined('STOP_PLUGINS')) ? 'Enabled' : 'Disabled') . '

'; echo '

' . $debug_output . '

'; echo '

 

'; echo '

SQL Information :

'; if (! empty($SQL->debugr)) { foreach ($SQL->debugr as $key=>$val) { echo '
Query # [' . ($key) . '] '; echo '
'; echo 'Duration :' . $val[1] . ''; echo '
'; echo '

'; } } else { echo '

NO SQLs

'; } echo '

 

Plugins Information :

'; echo '
    '; if (sizeof(Plugins::getInstance()->getDebugInfo()) > 0) { echo '
    '; } else { echo '

    ...

    '; } echo '
'; echo '
'; } /** * Show error of critical problem * * @param string $error_title title * @param string $msg_text content * @param bool $error is it an error or an info message */ function big_error($error_title, $msg_text, $error = true) { global $SQL; echo '' . "\n"; echo '' . "\n"; echo '' . "\n"; echo '' . "\n"; echo '' . htmlspecialchars($error_title) . '' . "\n"; echo '' . "\n"; echo '' . "\n"; echo '' . "\n\t"; echo '
' . "\n"; echo "\n\t\t

Kleeja " . ($error ? 'error' : 'information message') . ':


' . "\n"; echo "\n\t\t [ " . $error_title . ' ]

' . "\n\t\t" . $msg_text . "\n\t"; echo "\n\t\t" . '

Visit Kleeja Website for more details.' . "\n\t"; echo '
' . "\n"; echo '' . "\n"; echo ''; @$SQL->close(); exit(); } /** * Redirect to a url * @param string $url * @param bool $header true for header location redirect or false for html meta * @param bool $exit halt after echoing the redirect code * @param int $sec delay in seconds * @param bool $return return the html code only * @return mixed * */ function redirect($url, $header = true, $exit = true, $sec = 0, $return = false) { global $SQL; is_array($plugin_run_result = Plugins::getInstance()->run('redirect_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook if (! headers_sent() && $header && ! $return) { header('Location: ' . str_replace(['&'], ['&'], $url)); } else { $gre = '' . ''; if ($return) { return $gre; } echo $gre; } if ($exit) { $SQL->close(); exit; } return null; } /** * * Prevent CSRF, * * This will generate security token for GET request * @param string $request_id * @return string */ function kleeja_add_form_key_get($request_id) { global $config; $return = 'formkey=' . substr(sha1($config['h_key'] . date('H-d-m') . $request_id), 0, 20); is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_add_form_key_get_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $return; } function kleeja_check_form_key_get($request_id) { global $config; $token = substr(sha1($config['h_key'] . date('H-d-m') . $request_id), 0, 20); $return = false; if ($token == g('formkey')) { $return = true; } is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_check_form_key_get_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $return; } /** * This will generate hidden fields for kleeja forms, csrf input * @param string $form_name * @return string */ function kleeja_add_form_key($form_name) { global $config; $now = time(); $return = '' . "\n"; is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_add_form_key_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $return; } /** * This will check csrf hidden fields that came from kleeja forms * @param string $form_name * @param int $require_time in seconds * @return bool */ function kleeja_check_form_key($form_name, $require_time = 300) { global $config; if (defined('IN_ADMIN')) { //we increase it for admin to be a double $require_time *= 2; } $return = false; if (ip('k_form_key') && ip('k_form_time')) { $key_was = trim(p('k_form_key')); $time_was = p('k_form_time', 'int'); $different = time() - $time_was; //check time that user spent in the form if ($different && (! $require_time || $require_time >= $different)) { if (sha1($config['h_key'] . $form_name . $time_was) === $key_was) { $return = true; } } } is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_check_form_key_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $return; } /** * Link generator * TODO to be edited * Files can be many links styles, so this will generate the current style of link * @param $pid * @param array $extra * @return string */ function kleeja_get_link ($pid, $extra = []) { global $config; $links = []; //to avoid problems $config['id_form'] = empty($config['id_form']) ? 'id' : $config['id_form']; $config['id_form_img'] = empty($config['id_form_img']) ? 'id' : $config['id_form_img']; //to prevent bug with rewrite if ($config['mod_writer'] && ! empty($extra['::NAME::'])) { if ( (($pid == 'image' || $pid == 'thumb') && $config['id_form_img'] != 'direct') || ($pid == 'file' && $config['id_form'] != 'direct') ) { $extra['::NAME::'] = str_replace('.', '-', $extra['::NAME::']); } } $file_link = [ 'id' => $config['mod_writer'] ? 'download::ID::.html' : 'do.php?id=::ID::', 'filename' => $config['mod_writer'] ? 'downloadf-::NAME::.html' : 'do.php?filename=::NAME::', 'direct' => '::DIR::/::NAME::', ]; $image_link = [ 'id' => $config['mod_writer'] ? 'image::ID::.html' : 'do.php?img=::ID::', 'filename' => $config['mod_writer'] ? 'imagef-::NAME::.html' : 'do.php?imgf=::NAME::', 'direct' => '::DIR::/::NAME::', ]; $thumb_link = [ 'id' => $config['mod_writer'] ? 'thumb::ID::.html' : 'do.php?thmb=::ID::', 'filename' => $config['mod_writer'] ? 'thumbf-::NAME::.html' : 'do.php?thmbf=::NAME::', 'direct' => '::DIR::/thumbs/::NAME::', ]; $del_link = $config['mod_writer'] ? 'del::CODE::.html' : 'go.php?go=del&cd=::CODE::'; $links['file'] = $file_link[$config['id_form']]; $links['image'] = $image_link[$config['id_form_img']]; $links['thumb'] = $thumb_link[$config['id_form_img']]; $links['del'] = $del_link; is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_get_link_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook $return_link = $config['siteurl'] . str_replace(array_keys($extra), array_values($extra), $links[$pid]); is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_get_link_func2', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $return_link; } /** * Uploading boxes * * Parse template of boxes and print them * @param string $box_name html block name from up_boxes.html file * @param array $extra variables to pass to the html block * @return mixed */ function get_up_tpl_box($box_name, $extra = []) { global $THIS_STYLE_PATH_ABS, $config; static $boxes; //prevent loads //also this must be cached in future if (empty($boxes)) { $tpl_path = $THIS_STYLE_PATH_ABS . 'up_boxes.html'; if (! file_exists($tpl_path)) { $depend_on = false; if (trim($config['style_depend_on']) != '') { $depend_on = $config['style_depend_on']; } else { $depend_on = 'default'; } $tpl_path = str_replace('/' . $config['style'] . '/', '/' . trim($depend_on) . '/', $tpl_path); } $tpl_code = file_get_contents($tpl_path); $tpl_code = preg_replace("/\n[\n\r\s\t]*/", '', $tpl_code);//remove extra spaces $matches = preg_match_all('#(.*?)#', $tpl_code, $match); $boxes = []; for ($i = 0; $i < $matches; $i++) { if (empty($match[1][$i])) { continue;//it's empty , let's leave it } $boxes[$match[1][$i]] = $match[2][$i]; } } //extra value $extra += [ 'siteurl' => $config['siteurl'], 'sitename' => $config['sitename'], ]; //return compiled value $return = $boxes[$box_name]; foreach ($extra as $var=>$val) { $return = preg_replace('/{' . $var . '}/', $val, $return); } /* * We add this hook here so you can substitute you own vars * and even add your own boxes to this template. */ is_array($plugin_run_result = Plugins::getInstance()->run('get_up_tpl_box_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $return; } /** * Extract info of a style * @param string $style_name * @return array|bool */ function kleeja_style_info($style_name) { $inf_path = PATH . 'styles/' . $style_name . '/info.txt'; //is info.txt exists or not if (! file_exists($inf_path)) { return false; } $inf_c = file_get_contents($inf_path); //some ppl will edit this file with notepad or even with office word :) $inf_c = str_replace(["\r\n", "\r"], ["\n", "\n"], $inf_c); //as lines $inf_l = @explode("\n", $inf_c); $inf_l = array_map('trim', $inf_l); $inf_r = []; foreach ($inf_l as $m) { //comments if (isset($m[0]) && $m[0] == '#' || trim($m) == '') { continue; } $t = array_map('trim', @explode('=', $m, 2)); // ':' mean something secondary as in sub-array if (strpos($t[0], ':') !== false) { $subInfo = explode(':', $t[0]); $t_t0 = array_map('trim', $subInfo); $inf_r[$t_t0[0]][$t_t0[1]] = $t[1]; } else { if (! empty($t[0])) { $inf_r[$t[0]] = empty($t[1]) ? '' : $t[1]; } } } is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_style_info_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $inf_r; } /** * Browser detection * returns whether or not the visiting browser is the one specified [part of kleeja style system] * i.e. is_browser('ie6') -> true or false * i.e. is_browser('ie, opera') -> true or false * @param string $b browser name, like mozilla * @return bool */ function is_browser($b) { //is there , which mean -OR- if (strpos($b, ',') !== false) { $e = explode(',', $b); foreach ($e as $n) { if (is_browser(trim($n))) { return true; } } return false; } //if no agent, let's take the worst case $u_agent = (! empty($_SERVER['HTTP_USER_AGENT'])) ? htmlspecialchars((string) $_SERVER['HTTP_USER_AGENT']) : (function_exists('getenv') ? getenv('HTTP_USER_AGENT') : ''); $t = trim(preg_replace('/[^a-z]/', '', $b)); $r = trim(preg_replace('/[a-z]/', '', $b)); $return = false; switch ($t) { case 'ie': $return = strpos(strtolower($u_agent), trim('msie ' . $r)) !== false ? true : false; break; case 'firefox': $return = strpos(str_replace('/', ' ', strtolower($u_agent)), trim('firefox ' . $r)) !== false ? true : false; break; case 'safari': $return = strpos(strtolower($u_agent), trim('safari/' . $r)) !== false ? true : false; break; case 'chrome': $return = strpos(strtolower($u_agent), trim('chrome ' . $r)) !== false ? true : false; break; case 'flock': $return = strpos(strtolower($u_agent), trim('flock ' . $r)) !== false ? true : false; break; case 'opera': $return = strpos(strtolower($u_agent), trim('opera ' . $r)) !== false ? true : false; break; case 'konqueror': $return = strpos(strtolower($u_agent), trim('konqueror/' . $r)) !== false ? true : false; break; case 'mozilla': $return = strpos(strtolower($u_agent), trim('gecko/' . $r)) !== false ? true : false; break; case 'webkit': $return = strpos(strtolower($u_agent), trim('applewebkit/' . $r)) !== false ? true : false; break; /** * Mobile Phones are so popular those days, so we have to support them ... * This is still in our test lab. * @see http://en.wikipedia.org/wiki/List_of_user_agents_for_mobile_phones **/ case 'mobile': $mobile_agents = ['iPhone;', 'iPod;', 'blackberry', 'Android', 'HTC' , 'IEMobile', 'LG/', 'LG-', 'LGE-', 'MOT-', 'Nokia', 'SymbianOS', 'nokia_', 'PalmSource', 'webOS', 'SAMSUNG-', 'SEC-SGHU', 'SonyEricsson', 'BOLT/', 'Mobile Safari', 'Fennec/', 'Opera Mini']; $return = false; foreach ($mobile_agents as $agent) { if (strpos($u_agent, $agent) !== false) { $return = true; break; } } break; } is_array($plugin_run_result = Plugins::getInstance()->run('is_browser_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $return; } /** * Send an answer for ajax request * @param int $code_number * @param string $content * @param string $menu */ function echo_ajax($code_number, $content, $menu = '') { global $SQL; $SQL->close(); exit(json_encode(['code' => $code_number, 'content' => $content, 'menu' => $menu])); } /** * Send an answer for ajax request [ARRAY] * @param array $array */ function echo_array_ajax($array) { global $SQL; $SQL->close(); exit(@json_encode($array)); } /** * show date in a human-readable-text * @param int $time timestamp * @param bool $human_time return a readable time, like today, 1 hour ago * @param bool $format date format like d-m-y * @return string */ function kleeja_date($time, $human_time = true, $format = false) { global $lang, $config; $time = intval($time); if (! defined('TIME_FORMAT')) { define('TIME_FORMAT', 'd-m-Y h:i a'); // to be moved to configs later } if (! empty($config['time_zone']) && strpos($config['time_zone'], '/') !== false) { if (strpos($config['time_zone'], 'Buraydah') !== false) { $config['time_zone'] = 'Asia/Riyadh'; } $timezone_offset = timezone_offset_get(new DateTimeZone($config['time_zone']), new DateTime); } else { $timezone_offset = intval($config['time_zone']) * 60 * 60; } if ((time() - $time) > (86400 * 9) || $format || ! $human_time) { $format = ! $format ? TIME_FORMAT : $format; $time = $time + $timezone_offset; return str_replace(['am', 'pm'], [$lang['TIME_AM'], $lang['TIME_PM']], gmdate($format, $time)); } $lengths = ['60','60','24','7','4.35','12','10']; $timezone_diff = (int) $config['time_zone'] * 60 * 60; $now = time() + $timezone_diff; $time = $time + $timezone_diff; $difference = $now > $time ? $now - $time : $time - $now; $tense = $now > $time ? $lang['W_AGO'] : $lang['W_FROM']; for ($j = 0; $difference >= $lengths[$j] && $j < sizeof($lengths)-1; $j++) { $difference /= $lengths[$j]; } $difference = round($difference); if ($difference != 1) { if ($difference == 2) { $return = $lang['W_PERIODS_DP_' . $j]; } else { $return = $difference . ' ' . ($difference > 10 ? $lang['W_PERIODS_' . $j] : $lang['W_PERIODS_P_' . $j]); } } else { $return = '1 ' . $lang['W_PERIODS_' . $j]; } $return = $now > $time ? $return . ' ' . $lang['W_AGO']: $lang['W_FROM'] . ' ' . $return; is_array($plugin_run_result = Plugins::getInstance()->run('kleeja_date_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $return; } /* * World Time Zones * @return array */ function time_zones() { static $regions = [ DateTimeZone::AFRICA, DateTimeZone::AMERICA, DateTimeZone::ASIA, DateTimeZone::ATLANTIC, DateTimeZone::AUSTRALIA, DateTimeZone::EUROPE, DateTimeZone::INDIAN, DateTimeZone::PACIFIC, ]; $timezones = []; foreach ($regions as $region) { foreach (timezone_identifiers_list($region) as $tz) { $timezones[$tz] = timezone_offset_get(new DateTimeZone($tz), new DateTime) / 3600; } } // for compatibility with earlier versions. $timezones['Asia/Buraydah'] = 3.01; asort($timezones); return $timezones; } /** * generate a config html field to insert to add as an acp option * @param string $name config name * @param string $type input type (text, yesno, select) * @param array $select_options in case of select type, provide options array ([[title=>value], [title=>value]] * @return string input html */ function configField($name, $type = 'text', $select_options = []) { switch ($type) { default: case 'text': return ''; case 'yesno': return ''; case 'select': $return_value = '' . "\n"; } } /** * Shorten A string * * @param string $text The strings to shorten * @param int $until * @return string Short string */ function shorten_text($text, $until = 30) { $until = $until < 4 ? 4 : $until; $chars_len = function_exists('mb_strlen') ? mb_strlen($text, 'UTF-8') : strlen($text); if ($chars_len >= $until) { $return = function_exists('mb_substr') ? (mb_substr($text, 0, $until-4, 'UTF-8') . ' ... ' . mb_substr($text, -4, null, 'UTF-8')) : substr($text, 0, $until-4) . ' ... ' . substr($text, -4); } else { $return = $text; } is_array($plugin_run_result = Plugins::getInstance()->run('shorten_text_func', get_defined_vars())) ? extract($plugin_run_result) : null; //run hook return $return; }