uri = $_GET['uri']; } # standard canonical $this->canonical = WEBSITE_CANONICAL . '/' . $this->uri; $this->route = $route; # create a view pointer (should be passed along with construction) $this->view = new $view_name($this); $this->directory = "mvc/" . $this->route['controller'] . "/"; # template used $this->template = (!empty($this->route['passed_params']['template'])) ? $this->route['passed_params']['template'] : "index.html"; # this is used for login require_once $_SERVER["DOCUMENT_ROOT"] . '/amf/library/Am/Lite.php'; # merge the params $this->appendParams($route['passed_params']); # if you are logged in, we can adjust the navigation if (Am_Lite::getInstance()->isLoggedIn()) { $user = Am_Lite::getInstance()->getUser(); $this->login = $user['login']; $name_f = $user['name_f']; $name_l = $user['name_l']; $added = $user['added']; $last_login = $user['last_login']; $last_ip = $user['last_ip']; $is_locked = $user['is_locked']; $is_approved = $user['is_approved']; $this->email = $user['email']; $this->user = $user; $this->getUserPlan($this->login); } else { $this->user = ""; $this->product_string = "none"; } $checked = " "; # check if not a coins page if ($this->route['controller'] != 'coin') { if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') $url = "https://"; else $url = "http://"; $url .= $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; # $url = $_SERVER['HTTP_REFERER']; setcookie('back', $url, time() + 3600000, "/"); # if we have a where clause, we need to add the coin data # check what columns we are seeing if (!isset($_COOKIE["cpt_page"])) { setcookie('cpt_page', 1, time() + 3600000, "/"); # this is a hack to fix it for this page iteration, so we can use the data $_COOKIE['cpt_page'] = 1; } $page = $_COOKIE['cpt_page']; if ($this->route['pattern'] == 'price' || $this->route['pattern'] == 'prices') { $select_options = $gCrypto->doGetOptions($page); $this->switch_page_string = "

Cryptocurrency Price Listing by Market Cap

$select_options   
"; } # home page else if ($this->route['pattern'] == 'alerts' || $this->route['pattern'] == 'crypto-screener' || $this->route['pattern'] == 'crypto-heatmap' || $this->route['pattern'] == 'account' || $this->route['pattern'] == 'coin-list' || $this->route['pattern'] == 'altcoins') { $title = $this->route['passed_params']['page_title']; $sub_title = $this->route['passed_params']['page_subtitle']; $this->switch_page_string = "
"; } } # main pages else { # if we have a where clause, we need to add the coin data # check what columns we are seeing if (!isset($_COOKIE["cpt_page"])) { setcookie('cpt_page', 1, time() + 3600000, "/"); # this is a hack to fix it for this page iteration, so we can use the data $_COOKIE['cpt_page'] = 1; } $page = $_COOKIE['cpt_page']; # do not sow these options on regular pages # $select_options = $gCrypto->doGetOptions($page); $this->switch_page_string = ""; } foreach ($this->params as $key => $value) { $this->appendTags(array("{{" . $key . "}}" => $value)); } } public function isLoggedIn() { if (empty($this->user)) { return false; } return true; } public function appendParams($params) { $this->params = array_merge($this->params, $params); } public function prependTags($tags) { $this->tags = $tags + $this->tags; } public function appendTags($tags) { $this->tags = array_merge($this->tags, $tags); } # check for popup and append the old way - this public function checkAppendPopup() { global $gMysql; global $gPopupLookUp; global $version; if (isset($this->route['passed_params']['pUpdate'])) { # go through all popup connotations if (array_key_exists($this->route['passed_params']['pUpdate'], $gPopupLookUp) == true) { # appends a popup $this->appendTags(array("{{announcement_string}}" => "")); $this->appendTags(array("" => $gPopupLookUp[$this->route['passed_params']['pUpdate']]['html'])); return; } } $this->appendTags(array("" => "")); $this->appendTags(array("0" => $version)); } # gets the template public function getTemplate() { $fn = DOCUMENT_ROOT . $this->directory . $this->template; if (!file_exists($fn)) { $fn = DOCUMENT_ROOT . $this->template; if (!file_exists($fn)) { echo "getTemplate Error: File not found: $fn"; exit; } } return $fn; } # gets the header public function getHeader() { return "templates/" . $this->params['header']; } # gets the footer public function getFooter() { return "templates/" . $this->params['footer']; } # renders all the crypto for a page (order by etc) - in fact, this can send all the data and only update the id's prices and position 1d's every 15min # so you dont even need to rebuild the table - do it all in JS # we could build smaller width tables based on preferences, or leave some data out when the page is drawn # we could start with a default settings for viewed tables public function render_crypto() { global $gMysql; global $gCrypto; global $gCache; AddCommentOnly(""); AddCommentOnly(""); AddCommentOnly(""); AddComment("render_crypto() "); # if we have a where clause, we need to add the coin data # check what columns we are seeing if (!isset($_COOKIE["cpt_page"])) { setcookie('cpt_page', 1, time() + 3600000, "/"); # this is a hack to fix it for this page iteration, so we can use the data $_COOKIE['cpt_page'] = 1; } $page = $_COOKIE['cpt_page']; $select_options = $gCrypto->doGetOptions($page); # get the sql statement # $strSQL = $gCrypto->getRenderSQL($page, false); # $tags = $gCrypto->doRenderCrypto($strSQL, true); # $strSQL = Chart_Class::getCoinsSQL("","","",100); # $strSQL = $gCrypto->getRenderSQL(1); $query = strtoupper(GetVariableString('query', $_POST, 0)); $orderby = GetVariableString('id', $_POST, 0); $dir = GetVariableString('dir', $_POST, 0); $category = GetVariableString('category', $_POST, 0); $category = $gCrypto->getSetCookie("category", "category"); $orderby = $gCrypto->getSetCookie("orderby", "orderby"); $dir = $gCrypto->getSetCookie("dir", "dir"); $query = $gCrypto->getSetCookie("query", "query"); $gCrypto->setCookie("category", ""); $strSQL = Chart_Class::getCoinsSQL($query, "", $dir, 100, "", "", ""); $tags = Chart_Class::doRenderCrypto($strSQL, true); $categories = [ ['slug' => 'all', 'label' => 'All'], ['slug' => 'artificial-intelligence', 'label' => 'AI'], ['slug' => 'real-world-assets-rwa', 'label' => 'RWA'], ['slug' => 'depin', 'label' => 'DePin'], ['slug' => 'meme', 'label' => 'Meme'], ['slug' => 'the-boy-s-club', 'label' => 'BoysClub'], ['slug' => 'cat-themed-coins', 'label' => 'Cats'], ['slug' => 'pump-fun', 'label' => 'PumpFun'], ['slug' => 'politifi', 'label' => 'Political'], ['slug' => 'solana-ecosystem', 'label' => 'Sol'], ['slug' => 'sui-ecosystem', 'label' => 'Sui'], ['slug' => 'dexscreener', 'label' => 'Dexscreener Coins'], ]; $htmlOutput = "
\n"; $htmlOutput .= "
\n"; foreach ($categories as $cat) { $slug = htmlspecialchars($cat['slug'], ENT_QUOTES, 'UTF-8'); $label = htmlspecialchars($cat['label'], ENT_QUOTES, 'UTF-8'); $activeClass = ($slug === $category) ? ' active' : ''; // Add active class if the category matches $htmlOutput .= " \n"; } $htmlOutput .= "
\n"; $htmlOutput .= "
\n"; $futures = $gCrypto->getSetCookie("futures", "futures", 0); $futures_dropdown = $gCrypto->getSelectBox("futures", $futures, CRYPTO_FUTURES, "", "", " form-select form-select-sm cpt-text-smaller py-2 "); $current_page = $gCrypto->getSetCookie("current_page", "current_page", 0); $current_page_dropdown = $gCrypto->getSelectBox("current_page", 1, CRYPTO_PAGE, "", "", " form-select form-select-sm cpt-text-smaller py-2 "); $options_narratives = Market_Class::getNarrativesMenu($category); // Example usage: $timeframes = ['1h', '24h', '7d']; $sentiment_bars = Market_Class::buildSentimentBars($timeframes, $category); # adds additional tags $more_tags = array( "{{plan_id}}" => $this->plan_id, "{{futures_dropdown}}" => $futures_dropdown, "{{category_tags}}" => $htmlOutput, "{{options_narratives}}" => $options_narratives, "{{sentiment_bars}}" => $sentiment_bars, "{{current_page_dropdown}}" => $current_page_dropdown, ); $this->appendTags($tags); $this->appendTags($more_tags); $this->render(); } # prepare the contents of the page public function renderlist() { return; global $gMysql; global $gCrypto; $limit = (isset($_GET['limit'])) ? $_GET['limit'] : 100; $page = (isset($_GET['page'])) ? $_GET['page'] : 1; $links = (isset($_GET['links'])) ? $_GET['links'] : 5; $strSQL = "select * from crypto_market_cap where c_symbol not in (" . CRYPTO_EXCLUDED_SYMBOLS_STRING . ") order by market_cap DESC"; $gPaginator = new Paginator_Library($strSQL); $paged_data = $gPaginator->getData($page, $limit); $total = $gPaginator->getTotal(); $coin_list = " # Coin Price Market Cap 24hr Volume 1d "; for ($index = 0; $index < count($paged_data->data); $index++) { $market_cap_rank = $paged_data->data[$index]['market_cap_rank']; $c_id = $paged_data->data[$index]['c_id']; # eg 'bitcoin' $c_symbol = $paged_data->data[$index]['c_symbol']; # eg 'bitcoin' $img = "/app/images/coins/" . strtolower($c_symbol) . "_thumb.png"; #$market_data['c_image_thumb']; $name = $paged_data->data[$index]['c_name']; $link = "$name image $name"; $price_formatted = $paged_data->data[$index]['price_formatted']; if (!empty($paged_data->data[$index]['market_cap'])) { $market_cap = $gCrypto->formatPrice($paged_data->data[$index]['market_cap']); } else { $market_cap = "---"; } $volume_24h = $gCrypto->formatPrice($paged_data->data[$index]['24hour_volume']); $pc_1d = $paged_data->data[$index]['1d_pc'] . "%"; $coin_list .= ""; $coin_list .= "$market_cap_rank"; $coin_list .= "$link"; $coin_list .= "$price_formatted"; # test to see if this column is set $coin_list .= "$market_cap"; $coin_list .= "$volume_24h"; $plus_minus = $gCrypto->getPlusMinus($paged_data->data[$index]['1d_pc']); $coin_list .= "$pc_1d"; $coin_list .= ""; $index++; } $coin_list .= ""; $page_links = $gPaginator->createSearchLinks($links, 'pagination pagination-sm', ""); $this->params['page_meta_title'] = str_replace("{{page_num}}", $page, $this->params['page_meta_title']); $this->params['page_subtitle'] = str_replace("{{page_num}}", $page, $this->params['page_subtitle']); $this->params['page_title'] = str_replace("{{page_num}}", $page, $this->params['page_title']); $this->tags["Disclaimer for Crypto Price Alerting. "] = $this->params['page_title']; $this->tags["Disclaimer for Crypto Price Alerting. "] = $this->params['page_meta_title']; if ($page > 1) { $this->canonical = WEBSITE_CANONICAL . '/' . $this->uri . "?page=$page"; } # adds additional tags $tags = array( "{{coin_list}}" => $coin_list, "{{page_links}}" => $page_links, "{{page_num}}" => $page, ); $this->appendTags($tags); $this->render(); } # prepare the contents of the page public function renderAltcoins() { global $gMysql; global $gCrypto; $limit = (isset($_GET['limit'])) ? $_GET['limit'] : 10; $page = (isset($_GET['page'])) ? $_GET['page'] : 1; $links = (isset($_GET['links'])) ? $_GET['links'] : 5; $strSQL = "select * from crypto_market_cap where c_symbol not in (" . CRYPTO_EXCLUDED_SYMBOLS_STRING . ") order by market_cap DESC"; $gPaginator = new Paginator_Library($strSQL); $paged_data = $gPaginator->getData($page, $limit); $total = $gPaginator->getTotal(); $coin_list = ""; for ($index = 0; $index < count($paged_data->data); $index++) { $symbol = $paged_data->data[$index]['c_symbol']; $c_id = $paged_data->data[$index]['c_id']; $c_image = $paged_data->data[$index]['c_image_thumb']; $c_image = "/app/images/coins/" . strtolower($symbol) . "_thumb.png"; #$market_data['c_image_thumb']; $c_name = ucfirst($c_id); if (($info = $gCrypto->updateCoinGecko($symbol, 3)) == NULL) { $info = $gMysql->queryItem("select info from crypto_coins where c_id='$c_id'", __FILE__, __LINE__); } else { AddComment("Added:$c_id to altcoin list"); $num++; } if (strlen($info) < 10) { continue; } $button_tabs = $this->getCoinButtons($c_id); # now build glossary $coin_list .= "

image for $c_id$c_name ($symbol)


$info
$button_tabs




"; } $page_links = $gPaginator->createSearchLinks($links, 'pagination pagination-sm', ""); $this->params['page_meta_title'] = str_replace("{{page_num}}", $page, $this->params['page_meta_title']); $this->params['page_subtitle'] = str_replace("{{page_num}}", $page, $this->params['page_subtitle']); $this->params['page_title'] = str_replace("{{page_num}}", $page, $this->params['page_title']); $this->tags["Disclaimer for Crypto Price Alerting. "] = $this->params['page_title']; $this->tags["Disclaimer for Crypto Price Alerting. "] = $this->params['page_meta_title']; $this->tags["Disclaimer"] = $this->params['page_subtitle']; # adds additional tags $tags = array( "{{coin_list}}" => $coin_list, "{{page_links}}" => $page_links, "{{page_num}}" => $page, ); if ($page > 1) { $this->canonical = WEBSITE_CANONICAL . '/' . $this->uri . "?page=$page"; } $this->appendTags($tags); $this->render(); } /* # altcoin info public function doRenderCryptoInfo($max = 20) { global $gMysql; global $gCrypto; # this will be run for each coin in our for 365 days but a day at a time for each coin $strSQL = "select * from crypto_market_cap where c_symbol not in (" . CRYPTO_EXCLUDED_SYMBOLS_STRING . ") order by market_cap DESC"; $coin_array = $gMysql->selectToArray($strSQL, __FILE__, __LINE__); $num = 0; $string = ""; foreach ($coin_array as $data) { $symbol = $data['c_symbol']; $c_id = $data['c_id']; $c_image = $data['c_image_thumb']; $c_image = "/app/images/coins/" . strtolower($symbol) . "_thumb.png"; #$market_data['c_image_thumb']; $c_name = ucfirst($c_id); if (($info = $gCrypto->updateCoinGecko($symbol, 3)) == NULL) { $info = $gMysql->queryItem("select info from crypto_coins where c_id='$c_id'", __FILE__, __LINE__); } else { AddComment("Added:$c_id to altcoin list"); $num++; if ($num > $max) { return $string; } } if (strlen($info) < 10) { continue; } $button_tabs = $this->getCoinButtons($c_id); # now build glossary # $alert_button = " Alerts"; # $charts_button = " Charts"; $string .= "

image for $c_id$c_name ($symbol)


$info
$button_tabs




"; } return $string; } */ # gets the tabs for these altcoins public function getCoinButtons($c_id) { global $gMysql; # if in binance $binance = $gMysql->queryItem("select count(*) from crypto_market_cap where link_binance like '%_USDT%' and c_symbol not in (" . CRYPTO_EXCLUDED_SYMBOLS_STRING . ") and c_id='$c_id' ", __FILE__, __LINE__); $string = ""; $string .= " Charts "; # only do the pages as per foreach (CRYPTO_ALERTS_TYPE_LIST as $id => $page) { # if we have binance and page is tech, show, else skip $page_link = $page['page']; $page_name = $page['name']; $technical = $page['tech']; $icon = $page['icon']; # if we have carte blance with binance, or we are a legit price-based technical if ($binance == 1 || $technical == 0) { # dont have the coin in this one.. unless we pre-populate if ($id != CRYPTO_ALERTS_TYPE_LISTING) { $string .= " $page_name "; } } } return $string; } # prepare the contents of the page public function render() { global $gMenu_array; global $gCrypto; global $gMysql; # the page name for querying the database (but it can be hardcoded as a passed_param) $this->pattern = (isset($this->params['pattern'])) ? $this->params['pattern'] : $this->route['pattern']; $this->page_title = (!empty($this->params['page_title'])) ? $this->params['page_title'] : ""; $this->page_meta_description = (!empty($this->params['page_meta_description'])) ? $this->params['page_meta_description'] : ""; $this->page_meta_keywords = (!empty($this->params['page_meta_keywords'])) ? $this->params['page_meta_keywords'] : ""; $this->page_meta_title = (!empty($this->params['page_meta_title'])) ? $this->params['page_meta_title'] : ""; $this->page_meta_name = (!empty($this->params['page_meta_name'])) ? $this->params['page_meta_name'] : $this->params['page_meta_title']; $this->page_meta_image = (!empty($this->params['page_meta_image'])) ? $this->params['page_meta_image'] : ""; $menu_string = $this->createStandardMenu($gMenu_array, $this->route['pattern']); $notifications_string = ""; # for all checkboxes, make sure we have ability if ($data = $this->getUserAccount($this->login, $this->email)) { $notifications_string = $this->getNotificationString($data); $alerts_string = $this->getAlertsString($data); } # we shouldnt need a pre-rendered list - just the headers if ($this->route['pattern'] != 'price') { $strSQL = " select * from crypto_market_cap where id=-1"; $coins_list = Chart_Class::doRenderCrypto($strSQL, true); } else { $coins_list = array(); } /* $data_array = $gMysql->selectToArray("select * from crypto_update group by szDateTime order by szDateTime desc limit 1", __FILE__, __LINE__); $dxy = $data_array[0]['dxy']; $dxy_string = ""; $fear_string = ""; $data_array = array_reverse($data_array); for ($i=0;$i<3; $i++) { if ($data_array[$i]['dxy'] > $data_array[$i+1]['dxy'] ) { $dxy_string .= " "; } else if ($data_array[$i]['dxy'] < $data_array[$i+1]['dxy'] ) { $dxy_string .= " "; } else { $dxy_string .= " "; } if ($data_array[$i]['feargreed_value'] < $data_array[$i+1]['feargreed_value'] ) { $fear_string .= " "; } else if ($data_array[$i]['feargreed_value'] > $data_array[$i+1]['feargreed_value'] ) { $fear_string .= " "; } else { $fear_string .= " "; } } $last_dxy = $data_array[1]['dxy']; $pc_moved = round($gCrypto->percentageChange($last_dxy, $dxy), 1); $dxy_class = $gCrypto->getPlusMinus($pc_moved); $dxy_string = "DXY: $" . $dxy . "$dxy_string ,   "; $btc_dominance = round($data_array[0]['btc_dominance'], 1); $last_btc_dominance = $data_array[1]['btc_dominance']; $pc_moved = round($gCrypto->percentageChange($last_btc_dominance, $btc_dominance), 1); $btc_dominance_class = $gCrypto->getPlusMinus($pc_moved); $btc_dominance_string = ""; #"BTC DOM: $" . $btc_dominance . "%,  "; $fear = $data_array[0]['feargreed_value']; $fear_name = $data_array[0]['feargreed_name']; $last_fear = $data_array[1]['feargreed_value']; $pc_moved = round($gCrypto->percentageChange($fear, $last_fear), 1); $fear_class = $gCrypto->getPlusMinus($pc_moved); $fear_string = " Fear Greed Index: " . $fear_name . "  $fear".$fear_string.""; $fear_string = " Fear/Greed: " . $fear_name . "  ($fear)"; $fear_greed = $data_array[0]['dxy']; $last_fear_greed = $data_array[1]['dxy']; $market_cap = $gCrypto->formatPrice($data_array[0]['market_cap']); $title = $this->route['passed_params']['page_title']; $sub_title = $this->route['passed_params']['page_subtitle']; # $gas_data = $gMysql->queryRow("select * from crypto_gas order by szDateTime desc limit 1", __FILE__, __LINE__); #$gas_prices = $gMysql->selectToArray("select * from crypto_gas order by price asc", __FILE__, __LINE__); # $gas_price = number_format($gas_data['price'],2); # $gas = round($gas_data['gas'],1); # $class = categorizePrice($gas); #we will have green/amber/red or blue/green/amber/red # $gas_string = " # $gas gwei ($$gas_price)"; */ # adds additional tags $tags = array( "" => $market_cap, "" => $title, "" => $dxy_string, "" => $btc_dominance_string, "" => $fear_string, "Disclaimer for Crypto Price Alerting " => stripNonAlphaNumericSpaces($this->page_title), "Disclaimer for Crypto Price Alerting. " => $this->page_meta_name, # "{{meta_subtitle}}" => $this->subtitle, "" => $this->page_meta_image, "Disclaimer for Crypto Price Alerting. " => $this->page_meta_title, "Disclaimer - Crypto Price Alerting for Bitcoin, Eth and Crypto price alerts and analysis, charts, BTC alerts by Discord, Email, WhatsApp and more" => $this->page_meta_description, "" => $this->page_meta_keywords, "https://cryptopricealerting.com/disclaimer" => $this->canonical, "https://cryptopricealerting.com" => WEBSITE_CANONICAL, "" => $this->credits, "" => $this->alerts, "" => $menu_string, "" => $notifications_string, "" => $this->switch_page_string, ); $this->prependTags($coins_list); $this->appendTags($tags); # check for popup and append the old way $this->checkAppendPopup(); # sets the templates used for the view (we can do this in the router) $this->view->render(); } # returns the plan id public function getUserPlan($login) { global $gMysql; $user_id = $this->user['user_id']; $data = $gMysql->queryRow("SELECT expire_date,product_id FROM am_access where user_id = '$user_id' and product_id !=2 and expire_date > NOW() order by expire_date,invoice_item_id desc limit 1 ", __FILE__, __LINE__, CACHE_CACHE_TIME_HUGE); if ($data) { $this->plan_id = $data['product_id']; $this->product_string = $gMysql->queryItem("select am_product.title as product_title,am_billing_plan.title as sub_title,terms from am_billing_plan,am_product where am_product.product_id=am_billing_plan.product_id and am_billing_plan.plan_id='$this->plan_id'", __FILE__, __LINE__); $date = date("F j, Y", strtotime($data['expire_date'])); $this->product_string .= " ( ends " . $date . " )"; # # a proper rebill date # if ($rebill_date != "") # { # $this->product_string .= " - ". $data['terms']; # } } else { $this->product_string = "Free (limited plan)"; } } # check and set user public function getUserAccount($login, $email) { global $gMysql; # grab the user if (($data = $gMysql->queryRow("select * from crypto_user where login='$login'", __FILE__, __LINE__, CACHE_CACHE_TIME_HUGE)) != NULL) { # make sure we have one alert item selected if (empty($data['alerts_email']) && empty($data['alerts_sms']) && empty($data['alerts_whatsapp']) && empty($data['alerts_telegram']) && empty($data['alerts_discord'])) { # $gMysql->update("update crypto_user set alerts_email='yes' where login='$login'", __FILE__, __LINE__); $data = $gMysql->queryRow("select * from crypto_user where login='$login'", __FILE__, __LINE__, CACHE_CACHE_TIME_HUGE); } # login should # AddComment("getUserAccount error: user:$login does not exist in dbase, so login again to rectify"); # gotoURL("/amf/login"); # exit; } return $data; } # public function getAlertsString($data) { $alerts_string = ""; # now to see if checked $alerts_string .= empty($data['alerts_email']) ? "" : " Email,"; $alerts_string .= empty($data['alerts_sms']) ? "" : " SMS,"; $alerts_string .= empty($data['alerts_telegram']) ? "" : " checked"; $alerts_string .= empty($data['alerts_discord']) ? "" : " checked"; $alerts_string .= empty($data['alerts_browser']) ? "" : " checked"; # $alerts_string = rtrim($alerts_string, ","); return $alerts_string; } # must be logged in for this! public function getNotificationString($data) { $disabled_phone = empty($data['phone']) ? "disabled" : " "; $disabled_discord = empty($data['discord']) ? "disabled" : " "; $disabled_telegram = empty($data['telegram']) ? "disabled" : " "; $disabled_browser = empty($data['browser']) ? "disabled" : " "; # now to see if checked $checkbox_email = empty($data['alerts_email']) ? "" : " checked"; $checkbox_phone = empty($data['alerts_sms']) ? "" : " checked"; $checkbox_telegram = empty($data['alerts_telegram']) ? "" : " checked"; $checkbox_discord = empty($data['alerts_discord']) ? "" : " checked"; $checkbox_browser = empty($data['alerts_browser']) ? "" : " checked"; $checkbox_whatsapp = empty($data['alerts_whatsapp']) ? "" : " checked"; $checkbox_timezone = empty($data['timezone']) ? "" : " checked"; $starttime = $data['starttime']; $endtime = $data['endtime']; $notifications_string = "

Notifications (global)

"; return $notifications_string; } public function createStandardMenu($data_array, $current_link = "", $bUppercaseHeader = false, $bPullRight = true) { # slight position change if ($bPullRight == true) { $menu_string = "