(.*)<\/' . $tag . '>$/imU', $xml, $match);
		return $match[1];
	}
	function is_bot()
	{
		/* This function will check whether the visitor is a search engine robot */
		$botlist = array("Teoma", "alexa", "froogle", "Gigabot", "inktomi",
			"looksmart", "URL_Spider_SQL", "Firefly", "NationalDirectory",
			"Ask Jeeves", "TECNOSEEK", "InfoSeek", "WebFindBot", "girafabot",
			"crawler", "www.galaxy.com", "Googlebot", "Scooter", "Slurp",
			"msnbot", "appie", "FAST", "WebBug", "Spade", "ZyBorg", "rabaz",
			"Baiduspider", "Feedfetcher-Google", "TechnoratiSnoop", "Rankivabot",
			"Mediapartners-Google", "Sogou web spider", "WebAlta Crawler",
			"TweetmemeBot", "Butterfly", "Twitturls", "Me.dium", "Twiceler");
		foreach ($botlist as $bot)
		{
			if (strpos($_SERVER['HTTP_USER_AGENT'], $bot) !== false) return true;	// Is a bot
		}
		return false;	// Not a bot
	}
	if (empty($_REQUEST['action']) || is_bot()) die();
	switch ($_REQUEST['action'])
	{
		case 'online':
			$stringIp = $_SERVER['REMOTE_ADDR'];
			$intIp = ip2long($stringIp);
			// Checking wheter the visitor is already marked as being online:
			$counted = $AVE_DB->Query("
				SELECT 1
				FROM " . PREFIX . "_module_who_is_online
				WHERE ip = " . $intIp
			)->NumRows();
			if (! $counted)
			{
				// This user is not in the database, so we must fetch
				// the geoip data and insert it into the online table:
				if (! empty($_COOKIE['geoData']))
				{
					// A "geoData" cookie has been previously set by the script, so we will use it
					// Always escape any user input, including cookies:
					list($city, $countryName, $countryAbbrev) = explode('|', stripslashes(strip_tags($_COOKIE['geoData'])));
				}
				else
				{
					// Making an API call to Hostip:
					$xml = json_decode(file_get_contents('https://freegeoip.net/json/' . $stringIp), true);
					$city = $xml['city'];
					$countryName = $xml['country_name'];
					$countryAbbrev = $xml['country_code'];
					// Setting a cookie with the data, which is set to expire in a month:
					setcookie('geoData', $city . '|' . $countryName . '|' . $countryAbbrev, time()+60*60*24*30,'/');
				}
				//$countryName = str_replace('(Unknown Country?)', 'UNKNOWN', $countryName);
				// In case the Hostip API fails:
				if (! $countryName)
				{
					$countryName = 'UNKNOWN';
					$countryAbbrev = 'XX';
					$city = '(Unknown City?)';
				}
				$AVE_DB->Query("
					INSERT INTO " . PREFIX . "_module_who_is_online
					SET
						ip          = " . $intIp . ",
						city        = '" . addslashes($city) . "',
						country     = '" . addslashes($countryName) . "',
						countrycode = '" . addslashes($countryAbbrev) . "'
				");
			}
			else
			{
				// If the visitor is already online, just update the dt value of the row:
				$AVE_DB->Query("
					UPDATE " . PREFIX . "_module_who_is_online
					SET dt = NOW()
					WHERE ip = " . $intIp
				);
			}
			// Removing entries not updated in the last 10 minutes:
			$AVE_DB->Query("
				DELETE
				FROM " . PREFIX . "_module_who_is_online
				WHERE dt < SUBTIME(NOW(),'0 0:10:0')
			");
			// Counting all the online visitors:
			list($totalOnline) = $AVE_DB->Query("
				SELECT COUNT(*)
				FROM " . PREFIX . "_module_who_is_online
			")->FetchArray();
			// Outputting the number as plain text:
			echo $totalOnline;
			exit;
		case 'geodata':
			// Selecting the top 15 countries with the most visitors:
			$sql = $AVE_DB->Query("
				SELECT
					countryCode,
					country,
					COUNT(*) AS total
				FROM " . PREFIX . "_module_who_is_online
				GROUP BY countryCode
				ORDER BY total DESC
				LIMIT 15
			");
			while ($row = $sql->FetchRow())
			{
				echo '
				
					
					' . $row->country . '
					' . $row->total . '
				 
				';
			}
			exit;
	}
	exit;
}
?>