"; } function fs_create_wiki_help_link($page_name, $width = 600, $height=600) { echo fs_get_wiki_help_link($page_name, $width, $height); } function fs_get_wiki_help_link($page_name, $width = 600, $height=600) { $img = fs_url("img/help.blue.png"); $page = FS_WIKI.$page_name; $open = sprintf("window.open ('%s', 'newwindow','height='+%s+',width='+%s+',toolbar=no,menubar=no,location=no, directories=no, status=no,resizable=yes,scrollbars=yes');",$page, $width,$height); return ""; } function fs_create_help_button($tooltip, $javascript, $width = 600, $height=600) { $img = fs_url("img/help.blue.png"); echo ""; } function fs_create_checkbox($data_id, $text, $default = 'false', $system_option = false) { echo fs_get_checkbox($data_id, $text, $default, $system_option); } function fs_get_checkbox($data_id, $text, $default = 'false', $system_option = false) { $current_value = $system_option ? fs_get_system_option($data_id, $default) : fs_get_option($data_id, $default); $current_value = $current_value == 'true' ? "checked=\"checked\"" : ""; $save = $system_option ? "saveSystemOption" : "saveOption"; return ""; } function fs_create_textfield($id, $update, $type, $initial_value = "", $size = 4, $localOption = false) { echo fs_get_textfield($id, $update, $type, $initial_value, $size, $localOption); } function fs_get_num_textfield($id, $update, $initial_value = "", $size = 4, $localOption = false) { return fs_get_textfield($id, $update, 'positive_integer', $initial_value, $size, $localOption); } function fs_get_textfield($id, $update, $type, $initial_value = "", $size = 4, $localOption = false) { $q = "\\\""; // inner inner quote if ($localOption) { $save = "\"saveLocalOption($q$id$q,$q$id$q,$q$type$q,$q$update$q)\""; } else { $save = "\"saveOption($q$id$q,$q$id$q,$q$type$q,$q$update$q)\""; } return ""; } function fs_get_date_selector_button($id, $select_js_callback = null) { $img = fs_url("img/date.png"); return "".fs_get_calendar_setup($id, $select_js_callback); } function fs_get_date_selector_text($id, $select_js_callback = null) { $value = fs_get_option($id, ''); return "".fs_get_calendar_setup($id, $select_js_callback); } function fs_get_calendar_setup($id, $select_js_callback = null) { $value = fs_get_option($id, ""); return ""; } function fs_create_date_selector_text($id, $select_js_callback = null) { echo fs_get_date_selector_text($id, $select_js_callback); } function fs_create_dropbox($items, $selected, $key, $onchange, $disabled = false) { $dis = $disabled ? "disabled='disabled'" : ""; $res = ""; return $res; } function fs_cfg_button($toggle_id) { ?> $v) { $res .= ""; } return $res; } function fs_get_users_manage_table() { $users = fs_get_users(); $res = ""; $nameH = fs_r('Name'); $emailH = fs_r("Email"); $sec = fs_r("Security level"); $res .= ""; if ($users === false) { echo fs_db_error(); } else if (count($users) > 0) { foreach($users as $user) { $id = $user->id; $name = $user->username; $email = $user->email; $sec = $user->security_level; if ($sec == SEC_ADMIN) { $secStr = fs_r("Admin"); } else if ($sec == SEC_USER) { $secStr = fs_r("User"); } else { $secStr = fs_r("Unknown"); } $text = ""; $res .= "$text\n"; } } $add_new = fs_r('Add a new user'); $res .= "
$nameH $emailH $sec
$name $email $secStr
$add_new
"; return $res; } function fs_get_sites_manage_table() { $sites_table_name_filter = fs_get_option("sites_table_name_filter", ""); $page_dropdown = fs_r("Page") . " : " . fs_create_sites_page_dropdown(); $page_number = fs_get_option("current_selected_site_page", "0"); $sites = fs_get_sites_page($page_number, $sites_table_name_filter); if ($sites === false) return fs_db_error(); $res = ""; $idH = fs_r('ID'); $nameH = fs_r('Name'); $typeH = fs_r("Type"); $views = fs_r("Page views"); $res .= ""; if (count($sites) > 0) { foreach($sites as $site) { $id = $site->id; $hits = fs_get_hit_count(null, $id); $name = $site->name; $type = $site->type; $typeStr = fs_get_site_type_str($type); $tip = fs_r('How to integrate with this site'); $text = ""; $res .= "$text\n"; } } $orphans = fs_get_orphan_site_ids(); if ($orphans === false) { $res .= fs_db_error(); } else { if (count($orphans) > 0) { foreach($orphans as $site) { $id = $site->id; $hits = fs_get_hit_count(null, $id); $name = fs_r("Orphaned hits"); $text = ""; $res .= "$text\n"; } } } $num_sites = fs_get_num_sites($sites_table_name_filter); $num_pages = ceil($num_sites / SITES_TAB_MAX_SITES_PER_PAGE); $next_page_num = $page_number + 1; $prev_page_num = $page_number - 1; $page_str = $num_pages > 0 ? sprintf(fs_r("Page %s of %s"), $page_number+1, $num_pages) : ""; $prev_style = $prev_page_num < 0 ? "style='display:none'" : "style=''"; $next_style = $next_page_num >=$num_pages ? "style='display:none'" : "style=''"; $prev = ""; $next = ""; $res .= ' '; $res .= "
$idH $nameH $typeH $views $page_dropdown
$id $name $typeStr $hits
$id $name $hits
'. $page_str .'
"; return $res; } function fs_create_sites_page_dropdown() { $selected = fs_get_option("current_selected_site_page", "0"); $sites_table_name_filter = fs_get_option("sites_table_name_filter", ""); $num_sites = fs_get_num_sites($sites_table_name_filter); $num_pages = ceil($num_sites / SITES_TAB_MAX_SITES_PER_PAGE); if ($selected >= $num_pages) { fs_update_option("current_selected_site_page", 0); $selected = 0; } $arr = array(); for($i = 0;$i < $num_pages;$i++) { $start = $i * SITES_TAB_MAX_SITES_PER_PAGE + 1; if ($start > $num_sites) break; $end = min( ($i+1) * SITES_TAB_MAX_SITES_PER_PAGE, $num_sites); $arr[] = fs_mkPair($i, $i+1); } $onchange = 'FS.setSitesTablePageNumber($F(\'current_selected_site_page_dropbox\'))'; return fs_create_dropbox($arr,$selected,'current_selected_site_page_dropbox',$onchange); } function fs_get_site_type_options($selected = null) { $a = array(); $a[] = FS_SITE_TYPE_GENERIC; $a[] = FS_SITE_TYPE_HTML; $a[] = FS_SITE_TYPE_WORDPRESS; $a[] = FS_SITE_TYPE_DJANGO; $a[] = FS_SITE_TYPE_DRUPAL; $a[] = FS_SITE_TYPE_GALLERY2; $a[] = FS_SITE_TYPE_GREGARIUS; $a[] = FS_SITE_TYPE_JOOMLA; $a[] = FS_SITE_TYPE_MEDIAWIKI; $a[] = FS_SITE_TYPE_TRAC; $res = ''; foreach($a as $v) { $str = fs_get_site_type_str($v); $res .= ""; } return $res; } function fs_get_site_type_str($type) { switch($type) { case FS_SITE_TYPE_GENERIC: return fs_r("Generic PHP site"); case FS_SITE_TYPE_WORDPRESS: return fs_r("Wordpress"); case FS_SITE_TYPE_DJANGO: return fs_r("Django"); case FS_SITE_TYPE_DRUPAL: return fs_r("Drupal"); case FS_SITE_TYPE_GREGARIUS: return fs_r("Gregarius"); case FS_SITE_TYPE_JOOMLA: return fs_r("Joomla"); case FS_SITE_TYPE_MEDIAWIKI: return fs_r("MediaWiki"); case FS_SITE_TYPE_TRAC: return fs_r("Trac"); case FS_SITE_TYPE_GALLERY2: return fs_r("Gallery2"); case FS_SITE_TYPE_HTML: return fs_r("Generic HTML site"); } return fs_r("Unknown"); } function fs_get_timezone_list() { $zones = file(FS_ABS_PATH.'/php/timezones.txt'); $current_tz = fs_get_option('firestats_user_timezone','system'); $res = ''; foreach($zones as $zone) { $zone = trim($zone); if ($zone[0] == '#') continue; if ($current_tz != $zone) { $res .= "\n"; } else { $res .= "\n"; } } return $res; } function fs_get_languages_list() { // an array of files to ignore. // in case of a mistake in the locale name, after fixing the file name upgrading users will have // duplicate files. // files in the following array are excluded. $ignore = array("firestats-sw_SE.po"); $current_lang = fs_get_option('current_language'); $dir = FS_ABS_PATH.'/i18n'; $dh = opendir($dir); $res = 'English'; $list = array(); while (false !== ($filename = readdir($dh))) { if (fs_ends_with($filename, '.po') && !in_array($filename, $ignore)) { $r = sscanf($filename,"firestats-%s"); if (isset($r[0])) { $code = $r[0]; $len = strlen($code); $code = substr($code, 0, $len - 3); $name = fs_get_lang_name($dir.'/'.$filename); $d = new stdClass; $d->valid = true; $d->code = $code; $d->lname = $name; $list[] = $d; } else { $d = new stdClass; $d->valid = false; $d->fname = $filename; $list[] = $d; } } } $foo = create_function('$a, $b', ' if ($a->valid && $b->valid) { return strcmp($a->lname,$b->lname); } else { if (!$a->valid && !$b->valid) return 0; if ($a->valid && !$b->valid) return -1; if (!$a->valid && $b->valid) return 1; return 0; } '); uasort($list,$foo); foreach($list as $lang) { if ($lang->valid) { $code = $lang->code; $name = $lang->lname; $res .= ""; } else { $filename = $lang->fname; $res .= ""; } } return $res; } function fs_get_sites_list() { $user_id = fs_current_user_id(); if ($user_id === false) return "ERROR : unknown user_id"; $selector_mode = fs_site_selector_mode(); $user_sites = fs_get_user_sites_array($user_id); if ($selector_mode == FS_SITE_SELECTOR_MODE_BY_USERS_SITES_TABLE) { if (count($user_sites) == 0) { return fs_r("You are not allowed to view the statistics of any site, please contact your system administrator"); } else { if ($user_sites[0] == -1) // special case, allowed to access all sites. { $site_ids = null; } else { $site_ids = fs_implode(",", $user_sites); } } } else if ($selector_mode == FS_SITE_SELECTOR_MODE_ADMIN_ONLY) { if (fs_is_admin()) { $site_ids = null; // meaning all sites } else { return ""; // don't even show the selector } } $sites= fs_get_sites($site_ids); if (count($sites) < 2) return ''; $all = fs_r("All"); $str = fs_r('Show statistics from').""; return $str; } // replace special url character with xml friendly escape codes. function fs_xmlentities ( $string ) { return str_replace ( array ( '&', '"', "'", '<', '>'), array ( '&' , '"', ''' , '<' , '>'), $string ); } function fs_format_link($url, $link_text = null, $max_length = null, $break_at = 30, $tooltip = null) { if ($url == "unknown") { return fs_r('unknown'); } else { // if the url is relative, make it absoulte. $full_url = fs_get_absolute_url($url); $relative = fs_get_relative_url($full_url); if ($link_text == null) { $link_text = $relative; } // for the display, use the relative and line splited version. $text = fs_prepare_string($link_text, $break_at, "
",$max_length); // ' tends to mess up the url, encode it. (not using full urlencode because this really makes a mess in this case). $url = str_replace (array ( '\''),array ( '%27'),$full_url); if (!$tooltip) { return "$text"; } else { return "$text"; } } } function fs_get_referer_link($entry) { $url = $entry->referer; if ($entry->search_terms != null) { require_once(FS_ABS_PATH.'/php/searchengines.php'); $imgtag = fs_get_search_engine_img_tag(fs_get_search_engines(true),$entry->search_engine_id); return "$imgtag $entry->search_terms"; } else { $text = $entry->referrer_title; return fs_format_link($url, $text, 150, 30); } } function fs_get_url_link($entry) { return fs_format_link($entry->url, $entry->url_title, 150); } function fs_get_current_whois_provider_url() { $name = fs_get_option('whois_provider','ARIN'); $providers = fs_get_whois_providers(); return isset($providers[$name]) ? $providers[$name] : ''; } function fs_get_whois_link($entry) { $ip = fs_ip_to_string($entry->ip_int1, $entry->ip_int2); // if provider is not specified just return the ip address as is. $whois = fs_get_current_whois_provider_url(); if (empty($whois)) return $ip; $url = sprintf("$whois",$ip); return "$ip"; } function fs_get_records_table() { require_once(dirname(__FILE__).'/ip2country.php'); $res = ""; $entries = fs_getentries(); if ($entries === false) { return fs_db_error(); } else if ($entries) { $i = 0; $res = ''; foreach ($entries as $entry) { $i++; $res .= ' '; } // for loop } else { $res .= fs_r('No data yet, go get some hits'); } $res .= '
'.fs_r('IP') .' '.fs_r('TimeStamp') .' '.fs_r('URL') .' '.fs_r('Referrer') .' '.fs_r('Image') .' '.fs_r('UserAgent') .'
'.fs_get_whois_link($entry).' '.$entry->time.' '.fs_get_url_link($entry).' '.fs_get_referer_link($entry).' '.fs_pri_browser_images($entry->useragent).fs_get_country_flag_url($entry->country_code, true).' '.fs_prepare_string($entry->useragent, 50).'
'; return $res; } function fs_wordwrap($text,$break_at,$sep) { if ($break_at <= 0) die("none positive break point"); $nbytes = strlen($text); $x = 0; $char_num = 0; $res = ""; while($x < $nbytes) { $w = fs_next_utf8_char_width($text,$x); if ($w == -1) $w = 1; $res .= substr($text, $x, $w); $x += $w; $char_num++; if ($char_num == $break_at) { $res .= $sep; $char_num = 0; } } return $res; } function fs_prepare_string($text, $break_at = null, $newline = "
", $max_length = null) { $text = urldecode($text); $break = $break_at != null; if ($break) { // since encode will encode our line breaks if we insert it now // we are doing a little trick here: // first put a place holder for the line break $text = fs_wordwrap($text, $break_at,"{_SEP_}"); } if ($max_length != null) { if (strlen($text) > $max_length) { $text = substr($text,0, $max_length); $text .= "..."; } } // fix up any magic characters in the url. $text = str_replace (array ( '<', '>'),array ( '<' , '>'),$text); if ($break) { // now we can replace the \255 by a line break. $text = str_replace(array("{_SEP_}"),array($newline),$text); } return $text; } function fs_get_browsers_tree($days_ago = NULL) { if (!$days_ago) $days_ago = fs_browsers_tree_days_ago(); return fs_get_stats_tree(fs_get_browser_statistics($days_ago),'browsers_tree_id'); } function fs_get_os_tree($days_ago = NULL) { if (!$days_ago) $days_ago = fs_os_tree_days_ago(); return fs_get_stats_tree(fs_get_os_statistics($days_ago),'os_tree_id'); } function fs_get_stats_tree($stats, $id) { if ($stats === false) { return fs_db_error(); } if (is_string($stats)) { return "
$stats
"; } $stats_data = $stats; $res = "
"; if (!$stats_data) // no data yet { $res .= fs_r('No data yet, go get some hits'); } else { foreach ($stats_data as $code => $stats) { $img=isset($stats['image']) ? $stats['image'] : ""; $name=$stats['name']; $count=$stats['count']; $browser_percent=sprintf("%.1f",$stats['percent']); $res .= "\n"; } } $res .= "
"; return $res; } function fs_get_excluded_ips_list() { $list = fs_get_excluded_ips(); if ($list === false) return fs_db_error(); $c = count($list); $res = "\n"; return $res; } function fs_get_excluded_urls_list() { $list = fs_get_excluded_urls(); if ($list === false) return fs_db_error(); $c = count($list); $res = "\n"; return $res; } function fs_get_excluded_users_list() { $users = fs_wp_get_users(); if ($users === false) return fs_db_error(); $excluded_users=explode(",",fs_get_local_option('firestats_excluded_users','')); $c = count($users); $res = ''; if ($c == 0) { $res .= fs_r('Empty'); } else { foreach($users as $u) { $user_id = $u['id']; $user_name = $u['name']; $in = in_array($u['id'],$excluded_users); $checked = $in ? "checked='checked'" : ""; $res .= "
"; } } return $res; } function fs_get_bot_list() { $list = fs_get_bots(); if ($list === false) return fs_db_error(); $c = count($list); $res = ""; return $res; } function fs_get_search_engine_img_tag(&$engines_ht,$engine_id) { if (isset($engines_ht[$engine_id])) { $engine = $engines_ht[$engine_id]; $name = $engine->name; $img = fs_url("img/engines/".$engine->logo_icon); return "$name image"; } else return ''; } function fs_get_search_term_breakdown($id,$search_term) { $max_num = fs_get_max_search_terms(); $search_terms_date_type = fs_get_option("search_terms_date_type",90); if (is_numeric($search_terms_date_type)) { $terms = fs_get_recent_search_terms($max_num, $search_terms_date_type,$search_term); } else if ($search_terms_date_type == 'ever') { $terms = fs_get_recent_search_terms($max_num, null,$search_term); } else if ($search_terms_date_type == 'time_range') { $start_date = fs_format_sql_date("_search_terms_start"); if (!$start_date) return "missing search_terms_start"; $end_date = fs_format_sql_date("search_terms_end"); if (!$end_date) return "missing search_terms_end"; $terms = fs_get_recent_search_terms_range($max_num, true, strtotime($start_date),strtotime($end_date),true,ORDER_BY_HIGH_COUNT_FIRST,$search_term); } else { return "ERROR: Unexpected search_terms_date_type"; } $id = "search_term_$search_term"; $res = "\n"; if ($terms !== FALSE && count($terms) > 0) { require_once(FS_ABS_PATH.'/php/searchengines.php'); $engines_ht = fs_get_search_engines(true); foreach ($terms as $line) { $imgtag = fs_get_search_engine_img_tag($engines_ht,$line->search_engine_id); $terms = fs_format_link($line->referer, $line->search_terms, null, null); $search_terms = "$terms (‎$line->c)"; $res .= "
  • $imgtag $search_terms
  • "; } } else { if ($terms === FALSE) { $res .= fs_db_error(); } else { $res .= fs_r('No data yet, go get some hits'); } } return $res."\n"; } function fs_get_search_terms_tree() { $error = ''; $max_num = fs_get_max_search_terms(); $search_terms_date_type = fs_get_option("search_terms_date_type",90); if (is_numeric($search_terms_date_type)) { $terms = fs_get_recent_search_terms($max_num, $search_terms_date_type); } else if ($search_terms_date_type == 'ever') { $terms = fs_get_recent_search_terms($max_num, null); } else if ($search_terms_date_type == 'time_range') { $start_date = fs_format_sql_date("search_terms_start"); $end_date = fs_format_sql_date("search_terms_end"); if (!$end_date || !$start_date) { if (!$start_date) { $error = fs_r("Start date is missing"); } else if (!$end_date) { $error = fs_r("End date is missing"); } } else { $terms = fs_get_recent_search_terms_range($max_num, true, strtotime($start_date),strtotime($end_date), true); } } else { $error = "ERROR: Unexpected search_terms_date_type"; } $res ="
    \n"; if ($error == '' && (isset($terms) && $terms !== false) && count($terms) > 0) { require_once(FS_ABS_PATH.'/php/searchengines.php'); $engines_ht = fs_get_search_engines(true); $please_wait = fs_r("Please wait..."); $res .= "\n"; } else { if ($error != '') { $res .= $error; } else if ($terms === FALSE) { $res .= fs_db_error(); } else { $res .= fs_r('No data yet, go get some hits'); } } $res .= "
    \n"; return $res; } function fs_get_recent_referers_table($max_num = null, $days_ago = null, $site_id = true, $order_by = null) { if (!$max_num) { $max_num = fs_get_max_referers_num(); } if (!$days_ago) { $days_ago = fs_get_recent_referers_days_ago(); } if (!$order_by) { $order_by = fs_get_option("recent_referrers_order_by", ORDER_BY_FIRST_SEEN); } $show_days_ago = $order_by == ORDER_BY_FIRST_SEEN; $refs = fs_get_recent_referers($max_num, $days_ago, $site_id, $order_by); if($refs === false) { return fs_db_error(); } $res = ""; if (!$refs) // no data yet { $res .= ""; } else { $last_days_ago = null; $row_count = 0; $now = time(); foreach($refs as $r) { $count = $r->refcount; $add_time = $r->add_time; $url = fs_xmlentities(urldecode($r->url)); $page_title = $r->title; if (!empty($page_title)) { $line_source = $page_title; } else { $line_source = $url; } $line = substr($line_source, 0,80); if(strlen($line_source) != strlen($line)) $line .= "..."; $title = sprintf(fs_r('%d hits from %s'),$count,$url); if (!$show_days_ago) { $res .= ""; $res .= ""; $res .= ""; } else { $hit_days_ago = floor(($now - $add_time)/(60*60*24)); if ($last_days_ago == null) { $last_days_ago = $hit_days_ago; $days_count = 0; } else if ($last_days_ago != $hit_days_ago) { $last_days_ago = $hit_days_ago; $days_count++; } $alternate = $days_count % 2 == 1; $time_since = fs_time_since($add_time); $res .= ''; $res .= ""; $res .= ""; $res .= ""; } } } $res .= "
    ".fs_r('No data yet, go get some hits')."
    "; $res .= "$line ($count)\n"; $res .= "
    "; $res .= "$line\n"; $res .= ""; $res .= "$time_since\n"; $res .= "
    "; return $res; } function fs_get_popular_pages_tree($max_num = null, $days_ago = null, $type = null, $show_count = true, $target = '_blank') { if (!$max_num) { $max_num = fs_get_max_popular_num(); } if (!$days_ago) { $days_ago = fs_get_recent_popular_pages_days_ago(); } $urls = fs_get_popular_pages($max_num, $days_ago, true, $type); if($urls === false) return fs_db_error(); $res = ''; if (!$urls) // no data yet { $res .= fs_r('No data yet, go get some hits'); } else { $res .= " \n"; } return $res; } function fs_get_country_codes_percentage($num_limit, $days_ago) { require_once(dirname(__FILE__).'/ip2country.php'); $codes = fs_get_country_codes($days_ago); if ($codes === false) return false; if (count($codes) == 0) return array(); $total = 0; foreach ($codes as $code) { $total += $code->c; } $t = 0; $res = array(); $tp = 0; foreach ($codes as $code) { if ($t == $num_limit) break; $t++; $percentage = $code->c / (float)$total * 100; $code->percentage = $percentage; $intcode = $code->country_code; $code->name = fs_get_country_name($intcode, true); $code->img = fs_get_country_flag_url($intcode, true); $res[] = $code; $tp += $percentage; } if ($tp < 100) { $last = new stdClass; $last->percentage = 100 - $tp; $last->name = fs_r('Others'); $last->img = fs_get_flag_img_tag($last->name, fs_url("img/others.png")); $res[] = $last; } return $res; } function fs_get_countries_list() { $countries = fs_get_country_codes_percentage(fs_get_max_countries_num(), fs_countries_list_days_ago()); if($countries === false) return fs_db_error(); $res = ''; if (count($countries) == 0 ) { $res .= fs_r('No data yet, go get some hits'); } else { $res = ""; } return $res; } function fs_format_sql_date($option_key) { $t = fs_get_option($option_key); if (empty($t)) return false; $s = sscanf($t,"%d/%d/%d"); return $s[2].'-'.$s[1].'-'.$s[0]; } function fs_output_sysinfo_information() { $sysinfo = fs_r('System information'); $you_can_help = fs_r('You can help by sending anonymous system information that will help make better decisions about new features')."."; $line1 = fs_r('The information will be sent anonymously, but a unique identifier will be sent to prevent duplicate entries from the same FireStats'); echo "

    $sysinfo

    $you_can_help
    $line1."; } /** * if user agrees to send system information and the last sent info is outdated outputs a bunch of stuff that sends sysinfo without interrupting */ function fs_output_send_info_form() { if (fs_is_admin() && fs_get_system_option("user_agreed_to_send_system_information") == 'true' && fs_last_sent_info_outdated()) {?>
    $v) { ?>
    <?php fs_e('FireStats');?>
    \n"; require($page); } else { echo $page; } echo "\n"; require(FS_ABS_PATH."/php/footer.php"); ?>
    \n"; require($page); } else { echo $page; } echo "\n"; require(FS_ABS_PATH."/php/footer.php"); ?>