Пример #1
0
function search_output()
{
    global $db, $opt;
    global $distance_unit, $startat, $count, $sql, $sqlLimit;
    $encoding = 'UTF-8';
    $xmlLine = "\t<cache>\n\t\t<name><![CDATA[{cachename}]]></name>\n\t\t<owner id=\"{ownerid}\"><![CDATA[{owner}]]></owner>\n\t\t<id>{cacheid}</id>\n\t\t<waypoint>{waypoint}</waypoint>\n\t\t<hidden>{time}</hidden>\n\t\t<status id=\"{statusid}\">{status}</status>\n\t\t<lon value=\"{lonvalue}\">{lon}</lon>\n\t\t<lat value=\"{latvalue}\">{lat}</lat>\n\t\t<distance unit=\"" . $distance_unit . "\">{distance}</distance>\n\t\t<type id=\"{typeid}\">{type}</type>\n\t\t<difficulty>{difficulty}</difficulty>\n\t\t<terrain>{terrain}</terrain>\n\t\t<size id=\"{sizeid}\">{container}</size>\n\t\t<country id=\"{countryid}\">{country}</country>\n\t\t<link><![CDATA[" . $opt['page']['default_absolute_url'] . "viewcache.php?wp={waypoint}]]></link>\n\t\t<desc><![CDATA[{shortdesc}]]></desc>\n\t\t<hints><![CDATA[{hints}]]></hints>\n\t</cache>\n";
    // create temporary table
    sql_temp_table_slave('searchtmp');
    sql_slave('CREATE TEMPORARY TABLE &searchtmp SELECT SQL_BUFFER_RESULT SQL_CALC_FOUND_ROWS ' . $sql . $sqlLimit);
    $resultcount = sql_value_slave('SELECT FOUND_ROWS()', 0);
    $rsCount = sql_slave('SELECT COUNT(*) `count` FROM &searchtmp');
    $rCount = sql_fetch_array($rsCount);
    mysql_free_result($rsCount);
    // start output
    if (!$db['debug']) {
        header("Content-type: application/xml; charset=" . $encoding);
        //header("Content-Disposition: attachment; filename=" . $sFilebasename . ".txt");
        echo "<?xml version=\"1.0\" encoding=\"" . $encoding . "\"?>\n";
        echo "<result>\n";
        echo "\t<docinfo>\n";
        echo "\t\t<results>" . $rCount['count'] . "</results>\n";
        echo "\t\t<startat>" . $startat . "</startat>\n";
        echo "\t\t<perpage>" . $count . "</perpage>\n";
        echo "\t\t<total>" . $resultcount . "</total>\n";
        echo "\t</docinfo>\n";
    }
    $rs = sql_slave("SELECT &searchtmp.`cache_id` `cacheid`,\n                    &searchtmp.`longitude` `longitude`,\n                    &searchtmp.`latitude` `latitude`,\n                    `caches`.`wp_oc` `waypoint`,\n                    `caches`.`date_hidden` `date_hidden`,\n                    `caches`.`name` `name`,\n                    `caches`.`country` `countrycode`,\n                    `caches`.`terrain` `terrain`,\n                    `caches`.`difficulty` `difficulty`,\n                    `caches`.`desc_languages` `desc_languages`,\n                    `cache_size`.`name` `size`,\n                    `cache_size`.`id` `size_id`,\n                    `cache_type`.`name` `type`,\n                    `cache_type`.`id` `type_id`,\n                    `cache_status`.`name` `status`,\n                    `cache_status`.`id` `status_id`,\n                    `user`.`username` `username`,\n                    `user`.`user_id` `user_id`,\n                    `cache_desc`.`desc` `desc`,\n                    `cache_desc`.`short_desc` `short_desc`,\n                    `cache_desc`.`hint` `hint`,\n                    `cache_desc`.`desc_html` `html`,\n                    &searchtmp.`distance` `distance`,\n                    `sys_trans_text`.`text` `country`\n         FROM &searchtmp\n         INNER JOIN `caches` ON &searchtmp.`cache_id`=`caches`.`cache_id`\n         INNER JOIN `user` ON &searchtmp.`user_id`=`user`.`user_id`\n         INNER JOIN `cache_desc`\n             ON `caches`.`cache_id`=`cache_desc`.`cache_id` \n             AND `caches`.`default_desclang`=`cache_desc`.`language`\n         INNER JOIN `cache_type` ON `caches`.`type`=`cache_type`.`id`\n         INNER JOIN `cache_status` ON `caches`.`status`=`cache_status`.`id`\n         INNER JOIN `cache_size` ON `caches`.`size`=`cache_size`.`id`\n         LEFT JOIN `countries` ON `countries`.`short`=`caches`.`country`\n         LEFT JOIN `sys_trans_text` ON `sys_trans_text`.`trans_id`=`countries`.`trans_id`\n         AND `sys_trans_text`.`lang`='&1'", $opt['template']['locale']);
    while ($r = sql_fetch_array($rs)) {
        if (strlen($r['desc_languages']) > 2) {
            $r = get_locale_desc($r);
        }
        $thisline = $xmlLine;
        $lat = sprintf('%01.5f', $r['latitude']);
        $thisline = str_replace('{lat}', help_latToDegreeStr($lat), $thisline);
        $thisline = str_replace('{latvalue}', $lat, $thisline);
        $lon = sprintf('%01.5f', $r['longitude']);
        $thisline = str_replace('{lon}', help_lonToDegreeStr($lon), $thisline);
        $thisline = str_replace('{lonvalue}', $lon, $thisline);
        $time = date('d.m.Y', strtotime($r['date_hidden']));
        $thisline = str_replace('{time}', $time, $thisline);
        $thisline = str_replace('{waypoint}', $r['waypoint'], $thisline);
        $thisline = str_replace('{cacheid}', $r['cacheid'], $thisline);
        $thisline = str_replace('{cachename}', filterevilchars($r['name']), $thisline);
        $thisline = str_replace('{country}', text_xmlentities($r['country']), $thisline);
        $thisline = str_replace('{countryid}', $r['country'], $thisline);
        if ($r['hint'] == '') {
            $thisline = str_replace('{hints}', '', $thisline);
        } else {
            $thisline = str_replace('{hints}', str_rot13_gc(decodeEntities(filterevilchars(strip_tags($r['hint'])))), $thisline);
        }
        $thisline = str_replace('{shortdesc}', filterevilchars($r['short_desc']), $thisline);
        if ($r['html'] == 0) {
            $thisline = str_replace('{htmlwarn}', '', $thisline);
            $thisline = str_replace('{desc}', filterevilchars(strip_tags($r['desc'])), $thisline);
        } else {
            $thisline = str_replace('{htmlwarn}', ' (Text converted from HTML)', $thisline);
            $thisline = str_replace('{desc}', html2txt(filterevilchars($r['desc'])), $thisline);
        }
        $thisline = str_replace('{type}', $r['type'], $thisline);
        $thisline = str_replace('{typeid}', $r['type_id'], $thisline);
        $thisline = str_replace('{container}', $r['size'], $thisline);
        $thisline = str_replace('{sizeid}', $r['size_id'], $thisline);
        $thisline = str_replace('{status}', $r['status'], $thisline);
        $thisline = str_replace('{statusid}', $r['status_id'], $thisline);
        $difficulty = sprintf('%01.1f', $r['difficulty'] / 2);
        $thisline = str_replace('{difficulty}', $difficulty, $thisline);
        $terrain = sprintf('%01.1f', $r['terrain'] / 2);
        $thisline = str_replace('{terrain}', $terrain, $thisline);
        $thisline = str_replace('{owner}', filterevilchars($r['username']), $thisline);
        $thisline = str_replace('{ownerid}', filterevilchars($r['user_id']), $thisline);
        $thisline = str_replace('{distance}', text_xmlentities(sprintf("%01.1f", $r['distance'])), $thisline);
        $thisline = lf2crlf($thisline);
        if (!$db['debug']) {
            echo $thisline;
        }
    }
    mysql_free_result($rs);
    sql_drop_temp_table_slave('searchtmp');
    if (!$db['debug']) {
        echo "</result>\n";
    }
}
Пример #2
0
function search_output()
{
    global $opt, $translate, $txt_record;
    global $converted_from_html;
    global $phpzip, $bUseZip;
    $txtLine = $txt_record;
    $txtLogs = "<===================>\n{username} / {date} / {type}\n\n{text}\n";
    $rs = sql_slave("SELECT SQL_BUFFER_RESULT\n            &searchtmp.`cache_id` `cacheid`,\n            &searchtmp.`longitude` `longitude`,\n            &searchtmp.`latitude` `latitude`,\n            `caches`.`wp_oc` `waypoint`,\n            `caches`.`date_hidden` `date_hidden`,\n            `caches`.`name` `name`,\n            `caches`.`terrain` `terrain`,\n            `caches`.`difficulty` `difficulty`,\n            `caches`.`desc_languages` `desc_languages`,\n            `caches`.`needs_maintenance`,\n            `caches`.`listing_outdated`,\n            IFNULL(`stt_country`.`text`,`countries`.`en`) AS `country`,\n            IFNULL(`stt_size`.`text`,`cache_size`.`name`) `size`,\n            IFNULL(`stt_type`.`text`,`cache_type`.`en`) `type`,\n            IFNULL(`stt_status`.`text`,`cache_status`.`name`) `status`,\n            `user`.`username` `username`,\n            `cache_desc`.`desc` `desc`,\n            `cache_desc`.`short_desc` `short_desc`,\n            `cache_desc`.`language` `desc_language`,\n            `cache_desc`.`hint` `hint`,\n            `cache_desc`.`desc_html` `html`,\n            `user`.`user_id`,\n            `user`.`username`,\n            `user`.`data_license`\n         FROM\n            &searchtmp\n            INNER JOIN `caches` ON &searchtmp.`cache_id`=`caches`.`cache_id`\n            INNER JOIN `cache_desc`\n                ON `cache_desc`.`cache_id`=`caches`.`cache_id`\n                AND `caches`.`default_desclang`=`cache_desc`.`language`\n             INNER JOIN `cache_type` ON `cache_type`.`id`=`caches`.`type`\n             INNER JOIN `cache_size` ON `cache_size`.`id`=`caches`.`size`\n             INNER JOIN `cache_status` ON `cache_status`.`id`=`caches`.`status`\n             INNER JOIN `user` ON `user`.`user_id`=`caches`.`user_id`\n             LEFT JOIN `countries` ON `countries`.`short`=`caches`.`country`\n             LEFT JOIN `sys_trans_text` `stt_type` ON `stt_type`.`trans_id`=`cache_type`.`trans_id` AND `stt_type`.`lang`='&1'\n             LEFT JOIN `sys_trans_text` `stt_size` ON `stt_size`.`trans_id`=`cache_size`.`trans_id` AND `stt_size`.`lang`='&1'\n             LEFT JOIN `sys_trans_text` `stt_status` ON `stt_status`.`trans_id`=`cache_status`.`trans_id` AND `stt_status`.`lang`='&1'\n             LEFT JOIN `sys_trans_text` `stt_country` ON `stt_country`.`trans_id`=`countries`.`trans_id` AND `stt_country`.`lang`='&1'", $opt['template']['locale']);
    while ($r = sql_fetch_array($rs)) {
        if (strlen($r['desc_languages']) > 2) {
            $r = get_locale_desc($r);
        }
        $thisline = $txtLine;
        $lat = sprintf('%01.5f', $r['latitude']);
        $thisline = mb_ereg_replace('{lat}', help_latToDegreeStr($lat), $thisline);
        $lon = sprintf('%01.5f', $r['longitude']);
        $thisline = mb_ereg_replace('{lon}', help_lonToDegreeStr($lon), $thisline);
        $time = date('d.m.Y', strtotime($r['date_hidden']));
        $thisline = mb_ereg_replace('{time}', $time, $thisline);
        $thisline = mb_ereg_replace('{waypoint}', $r['waypoint'], $thisline);
        $thisline = mb_ereg_replace('{cacheid}', $r['cacheid'], $thisline);
        $thisline = mb_ereg_replace('{cachename}', $r['name'], $thisline);
        $thisline = mb_ereg_replace('{country}', $r['country'], $thisline);
        if ($r['hint'] == '') {
            $thisline = mb_ereg_replace('{hints}', '', $thisline);
        } else {
            $thisline = mb_ereg_replace('{hints}', str_rot13_gc(decodeEntities(strip_tags($r['hint']))), $thisline);
        }
        $thisline = mb_ereg_replace('{shortdesc}', $r['short_desc'], $thisline);
        $license = getLicenseDisclaimer($r['user_id'], $r['username'], $r['data_license'], $r['cacheid'], $opt['template']['locale'], true, false, true);
        if ($license != "") {
            $license = "\r\n\r\n{$license}";
        }
        if ($r['html'] == 0) {
            $thisline = mb_ereg_replace('{htmlwarn}', '', $thisline);
            $thisline = mb_ereg_replace('{desc}', decodeEntities(strip_tags($r['desc'])) . $license, $thisline);
        } else {
            $thisline = mb_ereg_replace('{htmlwarn}', " ({$converted_from_html})", $thisline);
            $thisline = mb_ereg_replace('{desc}', html2txt($r['desc']) . $license, $thisline);
        }
        $thisline = mb_ereg_replace('{type}', $r['type'], $thisline);
        $thisline = mb_ereg_replace('{container}', $r['size'], $thisline);
        $thisline = mb_ereg_replace('{status}', $r['status'], $thisline);
        $difficulty = sprintf('%01.1f', $r['difficulty'] / 2);
        $thisline = mb_ereg_replace('{difficulty}', $difficulty, $thisline);
        $terrain = sprintf('%01.1f', $r['terrain'] / 2);
        $thisline = mb_ereg_replace('{terrain}', $terrain, $thisline);
        $thisline = mb_ereg_replace('{siteurl}', $opt['page']['default_absolute_url'], $thisline);
        $thisline = mb_ereg_replace('{owner}', $r['username'], $thisline);
        $flags = array();
        if ($r['needs_maintenance'] > 0 || $r['listing_outdated']) {
            if ($r['needs_maintenance'] > 0) {
                $flags[] = 'geocache needs maintenance';
            }
            if ($r['listing_outdated'] > 0) {
                $flags[] = 'description is outdated';
            }
        } else {
            $flags[] = 'ok';
        }
        foreach ($flags as &$flag) {
            $flag = $translate->t($flag, '', basename(__FILE__), __LINE__);
        }
        $thisline = mb_ereg_replace('{condition}', implode(', ', $flags), $thisline);
        // logs ermitteln
        $logentries = '';
        $rsLogs = sql_slave("SELECT\n                `cache_logs`.`id`,\n                `cache_logs`.`text_html`,\n                IFNULL(`stt`.`text`, `log_types`.`en`) `type`,\n                `cache_logs`.`date`,\n                `cache_logs`.`text`,\n                `user`.`username`\n             FROM `cache_logs`\n             JOIN `user` ON `cache_logs`.`user_id`=`user`.`user_id`\n             JOIN `log_types` ON `cache_logs`.`type`=`log_types`.`id`\n             LEFT JOIN `sys_trans_text` `stt` ON `stt`.`trans_id`=`log_types`.`trans_id` AND `stt`.`lang`='&2'\n             WHERE `cache_logs`.`cache_id`=&1\n             ORDER BY\n                `cache_logs`.`order_date` DESC,\n                `cache_logs`.`date_created` DESC,\n                `cache_logs`.`id` DESC\n             LIMIT 20", $r['cacheid'], $opt['template']['locale']);
        while ($rLog = sql_fetch_array($rsLogs)) {
            $thislog = $txtLogs;
            $thislog = mb_ereg_replace('{id}', $rLog['id'], $thislog);
            $dateformat = "d.m.Y H:i";
            if (substr($rLog['date'], 11) == "00:00:00") {
                $dateformat = "d.m.Y";
            }
            $thislog = mb_ereg_replace('{date}', date($dateformat, strtotime($rLog['date'])), $thislog);
            $thislog = mb_ereg_replace('{username}', $rLog['username'], $thislog);
            $logtype = $rLog['type'];
            $thislog = mb_ereg_replace('{type}', $logtype, $thislog);
            if ($rLog['text_html'] == 0) {
                $thislog = mb_ereg_replace('{text}', decodeEntities(strip_tags($rLog['text'])), $thislog);
            } else {
                $thislog = mb_ereg_replace('{text}', html2txt($rLog['text']), $thislog);
            }
            $logentries .= $thislog . "\n";
        }
        $thisline = mb_ereg_replace('{logs}', $logentries, $thisline);
        $thisline = lf2crlf($thisline);
        if (!$bUseZip) {
            echo $thisline;
        } else {
            $phpzip->add_data($r['waypoint'] . '.txt', $thisline);
        }
    }
    mysql_free_result($rs);
}
Пример #3
0
function search_output()
{
    global $opt, $login, $translate;
    global $cache_note_text;
    $server_domain = $opt['page']['domain'];
    $server_address = $opt['page']['default_absolute_url'];
    $server_name = $opt['page']['sitename'];
    $gpxHead = '<?xml version="1.0" encoding="utf-8"?>
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.0" creator="' . $server_name . ' - ' . $server_address . '" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd http://www.groundspeak.com/cache/1/0/1 http://www.groundspeak.com/cache/1/0/1/cache.xsd" xmlns="http://www.topografix.com/GPX/1/0">
  <name>Cache listing generated from ' . $server_name . '</name>
  <desc>This is a waypoint file generated from ' . $server_name . '{wpchildren}</desc>
  <author>Opencaching.de</author>
  <email>' . text_xmlentities($opt['mail']['contact']) . '</email>
  <url>' . $server_domain . '</url>
  <urlname>' . $opt['page']['slogan'] . '</urlname>
  <time>{time}</time>
  <keywords>cache, geocache, opencaching, waypoint</keywords>
';
    $gpxLine = '  <wpt lat="{lat}" lon="{lon}">
    <time>{time}</time>
    <name>{waypoint}</name>
    <desc>{cachename}</desc>
    <src>' . $server_domain . '</src>
    <url>' . $server_address . 'viewcache.php?cacheid={cacheid}</url>
    <urlname>{cachename}</urlname>
    <sym>{sym}</sym>
    <type>Geocache|{type}</type>
    <groundspeak:cache id="{cacheid}" {status} xmlns:groundspeak="http://www.groundspeak.com/cache/1/0/1">
      <groundspeak:name>{cachename}</groundspeak:name>
      <groundspeak:placed_by>{owner}</groundspeak:placed_by>
      <groundspeak:owner id="{userid}">{owner}</groundspeak:owner>
      <groundspeak:type>{type}</groundspeak:type>
      <groundspeak:container>{container}</groundspeak:container>
      <groundspeak:attributes>
{attributes}      </groundspeak:attributes>
      <groundspeak:difficulty>{difficulty}</groundspeak:difficulty>
      <groundspeak:terrain>{terrain}</groundspeak:terrain>
      <groundspeak:country>{country}</groundspeak:country>
      <groundspeak:state>{state}</groundspeak:state>
      <groundspeak:short_description html="True">{shortdesc}</groundspeak:short_description>
      <groundspeak:long_description html="True">{desc}&lt;br /&gt;{images}</groundspeak:long_description>
{hints}      <groundspeak:logs>
{logs}      </groundspeak:logs>
      <groundspeak:travelbugs>
{geokrety}      </groundspeak:travelbugs>
    </groundspeak:cache>
  </wpt>
{cache_waypoints}';
    /* Ocprop:
     *    <wpt\s+lat=\"([0-9\-\+\.]+)\"\s+lon=\"([0-9\-\+\.]+)\">
     *    <time>(.*?)<\/time>
     *      (Date: ^([0-9]{4})\-([0-9]{2})\-([0-9]{2})T[0-9\:\-\.]+(Z)?$/s)
     *    <name>(.*?)<\/name>
     *    <url>http:\/\/www\.opencaching\.de\/viewcache\.php\?cacheid=([0-9]+)<\/url>
     *    <sym>(.*?)<\/sym>
     *    <groundspeak:cache\s+id=\"[0-9]+\"\s+available=\"(True|False)\"\s+archived=\"(True|False)\"
     *    <groundspeak:name>(.*?)<\/groundspeak:name>
     *    <groundspeak:placed_by>(.*?)<\/groundspeak:placed_by>
     *    <groundspeak:owner id="([0-9])+">(.*?)<\/groundspeak:owner>
     *    <groundspeak:type>(.*?)<\/groundspeak:type>
     *    <groundspeak:container>(.*?)<\/groundspeak:container>
     *    <groundspeak:difficulty>(.*?)<\/groundspeak:difficulty>
     *    <groundspeak:terrain>(.*?)<\/groundspeak:terrain>
     *    <groundspeak:country>(.*?)<\/groundspeak:country>
     *    <groundspeak:state>(.*?)<\/groundspeak:state>
     *    <groundspeak:short_description html="(.*?)".*?>(.*?)<\/groundspeak:short_description>
     *    <groundspeak:long_description html="(.*?)".*?>(.*?)<\/groundspeak:long_description>
     *    <groundspeak:encoded_hints>(.*?)<\/groundspeak:encoded_hints>
     */
    $gpxAttributes = '           <groundspeak:attribute id="{attrib_id}" inc="{attrib_inc}">{attrib_name}</groundspeak:attribute>';
    $gpxLog = '      <groundspeak:log id="{id}">
        <groundspeak:date>{date}</groundspeak:date>
        <groundspeak:type>{type}</groundspeak:type>
        <groundspeak:finder id="{userid}">{username}</groundspeak:finder>
        <groundspeak:text encoded="False">{text}</groundspeak:text>
      </groundspeak:log>';
    $gpxGeokrety = '        <groundspeak:travelbug id="{gkid}" ref="{gkref}">
          <groundspeak:name>{gkname}</groundspeak:name>
        </groundspeak:travelbug>';
    $gpxWaypoints = '  <wpt lat="{wp_lat}" lon="{wp_lon}">
    <time>{time}</time>
    <name>{name}</name>
    <cmt>{comment}</cmt>
    <desc>{desc}</desc>
    <url>' . $server_address . 'viewcache.php?cacheid={cacheid}</url>
    <urlname>{parent} {cachename}</urlname>
    <sym>{type}</sym>
    <type>Waypoint|{type}</type>
    <gsak:wptExtension xmlns:gsak="http://www.gsak.net/xmlv1/4">
      <gsak:Parent>{parent}</gsak:Parent>
    </gsak:wptExtension>
  </wpt>
';
    $gpxFoot = '</gpx>';
    $gpxTimeFormat = 'Y-m-d\\TH:i:s\\Z';
    $gpxStatus[0] = 'available="False" archived="False"';
    // other (unavailable, not archived)
    $gpxStatus[1] = 'available="True" archived="False"';
    //available, not archived
    $gpxStatus[2] = 'available="False" archived="False"';
    //unavailable, not archived
    $gpxStatus[3] = 'available="False" archived="True"';
    //unavailable, archived
    $gpxStatus[6] = 'available="False" archived="True"';
    //locked, visible
    $gpxContainer[0] = 'Other';
    $gpxContainer[2] = 'Micro';
    $gpxContainer[3] = 'Small';
    $gpxContainer[4] = 'Regular';
    $gpxContainer[5] = 'Large';
    $gpxContainer[6] = 'Large';
    $gpxContainer[7] = 'Virtual';
    $gpxContainer[8] = 'Micro';
    // cache types known by gpx
    $gpxType[0] = 'Unknown Cache';
    $gpxType[2] = 'Traditional Cache';
    $gpxType[3] = 'Multi-cache';
    $gpxType[4] = 'Virtual Cache';
    $gpxType[5] = 'Webcam Cache';
    $gpxType[6] = 'Event Cache';
    // unknown ... converted
    $gpxType[7] = 'Unknown Cache';
    $gpxType[8] = 'Unknown Cache';
    $gpxType[10] = 'Traditional Cache';
    $gpxLogType[0] = 'Other';
    $gpxLogType[1] = 'Found it';
    $gpxLogType[2] = 'Didn\'t find it';
    $gpxLogType[3] = 'Write note';
    $gpxLogType[7] = 'Attended';
    $gpxLogType[8] = 'Will attend';
    $gpxLogType[9] = 'Archive';
    $gpxLogType[10] = 'Owner Maintenance';
    $gpxLogType[11] = 'Temporarily Disable Listing';
    $gpxLogType[13] = 'Archive';
    $gpxLogType[14] = 'Archive';
    $gpxSymNormal = 'Geocache';
    $gpxSymFound = 'Geocache Found';
    $childwphandler = new HandlerChildWp();
    $children = '';
    $rs = sql('SELECT &searchtmp.`cache_id` `cacheid` FROM &searchtmp');
    while ($r = sql_fetch_array($rs)) {
        if (count($childwphandler->getChildWps($r['cacheid']))) {
            $children = ' (HasChildren)';
            break;
        }
    }
    mysql_free_result($rs);
    $gpxHead = mb_ereg_replace('{wpchildren}', $children, $gpxHead);
    $gpxHead = mb_ereg_replace('{time}', date($gpxTimeFormat, time()), $gpxHead);
    append_output($gpxHead);
    $user_id = $login->userid;
    $rs = sql_slave("SELECT SQL_BUFFER_RESULT\n            &searchtmp.`cache_id` `cacheid`,\n            &searchtmp.`longitude` `longitude`,\n            &searchtmp.`latitude` `latitude`,\n            `caches`.`wp_oc` `waypoint`,\n            `caches`.`date_hidden` `date_hidden`,\n            `caches`.`name` `name`,\n            `caches`.`country` `country`,\n            `caches`.`terrain` `terrain`,\n            `caches`.`difficulty` `difficulty`,\n            `caches`.`desc_languages` `desc_languages`,\n            `caches`.`size` `size`,\n            `caches`.`type` `type`,\n            `caches`.`status` `status`,\n            `caches`.`user_id` `userid`,\n            `caches`.`needs_maintenance`,\n            `caches`.`listing_outdated`,\n            `countries`.`name` AS `country_name`,\n            `cache_location`.`adm2` `state`,\n            `cache_desc`.`desc` `desc`,\n            `cache_desc`.`short_desc` `short_desc`,\n            `cache_desc`.`hint` `hint`,\n            `cache_desc`.`language` `desc_language`,\n            `user`.`username` `username`,\n            `user`.`data_license`,\n            IFNULL(`stat_cache_logs`.`found`, 0) `found`\n         FROM &searchtmp\n         INNER JOIN `caches` ON &searchtmp.`cache_id`=`caches`.`cache_id`\n         INNER JOIN `countries` ON `caches`.`country`=`countries`.`short`\n         INNER JOIN `user` ON &searchtmp.`user_id`=`user`.`user_id`\n         INNER JOIN `cache_desc`\n            ON `caches`.`cache_id`=`cache_desc`.`cache_id`\n            AND `caches`.`default_desclang`=`cache_desc`.`language`\n         LEFT JOIN `cache_location` ON &searchtmp.`cache_id`=`cache_location`.`cache_id`\n         LEFT JOIN `stat_cache_logs`\n            ON &searchtmp.`cache_id`=`stat_cache_logs`.`cache_id`\n            AND `stat_cache_logs`.`user_id`='&1'", $user_id);
    while ($r = sql_fetch_array($rs)) {
        if (strlen($r['desc_languages']) > 2) {
            $r = get_locale_desc($r);
        }
        $thisline = $gpxLine;
        $lat = sprintf('%01.5f', $r['latitude']);
        $thisline = mb_ereg_replace('{lat}', $lat, $thisline);
        $lon = sprintf('%01.5f', $r['longitude']);
        $thisline = mb_ereg_replace('{lon}', $lon, $thisline);
        $time = date($gpxTimeFormat, strtotime($r['date_hidden']));
        $thisline = mb_ereg_replace('{time}', $time, $thisline);
        $thisline = mb_ereg_replace('{waypoint}', $r['waypoint'], $thisline);
        $thisline = mb_ereg_replace('{cacheid}', $r['cacheid'], $thisline);
        $thisline = mb_ereg_replace('{cachename}', text_xmlentities($r['name']), $thisline);
        $thisline = mb_ereg_replace('{country}', text_xmlentities($r['country_name']), $thisline);
        $thisline = mb_ereg_replace('{state}', text_xmlentities($r['state']), $thisline);
        if ($r['hint'] == '') {
            $thisline = mb_ereg_replace('{hints}', '', $thisline);
        } else {
            // Ocprop:  <groundspeak:encoded_hints>(.*?)<\/groundspeak:encoded_hints>
            $hint = html_entity_decode(strip_tags($r['hint']), ENT_COMPAT, "UTF-8");
            $thisline = mb_ereg_replace('{hints}', '      <groundspeak:encoded_hints>' . text_xmlentities($hint) . '</groundspeak:encoded_hints>', $thisline);
        }
        $thisline = mb_ereg_replace('{shortdesc}', text_xmlentities($r['short_desc']), $thisline);
        $desc = $r['desc'];
        $desc = str_replace(' src="images/uploads/', ' src="' . $server_address . 'images/uploads/', $desc);
        if ($r['listing_outdated']) {
            $desc = "<p style='color:#c00000'><strong>" . $translate->t('This geocache description may be outdated.', '', basename(__FILE__), __LINE__) . '</strong> ' . $translate->t('See the log entries for more information.', '', basename(__FILE__), __LINE__) . "</p>\n" . $desc;
        }
        $license = getLicenseDisclaimer($r['userid'], $r['username'], $r['data_license'], $r['cacheid'], $opt['template']['locale'], true, true);
        if ($license != "") {
            $desc .= "<p><em>{$license}</em></p>\n";
        }
        $desc .= get_desc_npas($r['cacheid']);
        $thisline = mb_ereg_replace('{desc}', text_xmlentities(decodeEntities($desc)), $thisline);
        $thisline = mb_ereg_replace('{images}', text_xmlentities(getPictures($r['cacheid'], $server_address)), $thisline);
        if (isset($gpxType[$r['type']])) {
            $thisline = mb_ereg_replace('{type}', $gpxType[$r['type']], $thisline);
        } else {
            $thisline = mb_ereg_replace('{type}', $gpxType[0], $thisline);
        }
        if (isset($gpxContainer[$r['size']])) {
            $thisline = mb_ereg_replace('{container}', $gpxContainer[$r['size']], $thisline);
        } else {
            $thisline = mb_ereg_replace('{container}', $gpxContainer[0], $thisline);
        }
        if (isset($gpxStatus[$r['status']])) {
            $thisline = mb_ereg_replace('{status}', $gpxStatus[$r['status']], $thisline);
        } else {
            $thisline = mb_ereg_replace('{status}', $gpxStatus[0], $thisline);
        }
        $sDiffDecimals = '';
        if ($r['difficulty'] % 2) {
            $sDiffDecimals = '.5';
        }
        $r['difficulty'] -= $r['difficulty'] % 2;
        $thisline = mb_ereg_replace('{difficulty}', $r['difficulty'] / 2 . $sDiffDecimals, $thisline);
        $sTerrDecimals = '';
        if ($r['terrain'] % 2) {
            $sTerrDecimals = '.5';
        }
        $r['terrain'] -= $r['terrain'] % 2;
        $thisline = mb_ereg_replace('{terrain}', $r['terrain'] / 2 . $sTerrDecimals, $thisline);
        $thisline = mb_ereg_replace('{owner}', text_xmlentities($r['username']), $thisline);
        $thisline = mb_ereg_replace('{userid}', $r['userid'], $thisline);
        if ($r['found'] > 0) {
            $thisline = mb_ereg_replace('{sym}', text_xmlentities($gpxSymFound), $thisline);
        } else {
            $thisline = mb_ereg_replace('{sym}', text_xmlentities($gpxSymNormal), $thisline);
        }
        // clear cache specific data
        $logentries = '';
        $cacheNote = false;
        $attribentries = '';
        $waypoints = '';
        $gkentries = '';
        // insert personal note
        if ($user_id != 0) {
            $cacheNote = getCacheNote($user_id, $r['cacheid']);
            if ($cacheNote) {
                $thislog = $gpxLog;
                $thislog = mb_ereg_replace('{id}', 0, $thislog);
                $thislog = mb_ereg_replace('{date}', date($gpxTimeFormat), $thislog);
                $thislog = mb_ereg_replace('{userid}', $user_id, $thislog);
                $thislog = mb_ereg_replace('{username}', text_xmlentities($login->username), $thislog);
                $thislog = mb_ereg_replace('{type}', $gpxLogType[3], $thislog);
                $thislog = mb_ereg_replace('{text}', text_xmlentities($cacheNote['note']), $thislog);
                $logentries .= $thislog . "\n";
            }
        }
        // fetch all logs of the current user, then the last 20 other logs
        for ($currentuser = $user_id != 0 ? 1 : 0; $currentuser >= 0; --$currentuser) {
            if ($currentuser) {
                $user_operator = '=';
                $limit = '';
            } else {
                $user_operator = '!=';
                $limit = ' LIMIT 20';
            }
            $rsLogs = sql_slave("\n                SELECT\n                    `cache_logs`.`id`,\n                    `cache_logs`.`type`,\n                    `cache_logs`.`date`,\n                    `cache_logs`.`text`,\n                    `cache_logs`.`needs_maintenance`,\n                    `cache_logs`.`listing_outdated`,\n                    `user`.`username`,\n                    `user`.`user_id`\n                FROM\n                    `cache_logs`,\n                    `user`\n                WHERE\n                    `cache_logs`.`user_id`=`user`.`user_id` AND\n                    `cache_logs`.`cache_id`='&1' AND\n                    `user`.`user_id`" . $user_operator . "'&2'\n                ORDER BY\n                    `cache_logs`.`order_date` DESC,\n                    `cache_logs`.`date_created` DESC,\n                    `cache_logs`.`id` DESC" . $limit, $r['cacheid'], $user_id);
            while ($rLog = sql_fetch_array($rsLogs)) {
                $thislog = $gpxLog;
                $thislog = mb_ereg_replace('{id}', $rLog['id'], $thislog);
                $thislog = mb_ereg_replace('{date}', date($gpxTimeFormat, strtotime($rLog['date'])), $thislog);
                $thislog = mb_ereg_replace('{userid}', $rLog['user_id'], $thislog);
                $thislog = mb_ereg_replace('{username}', text_xmlentities($rLog['username']), $thislog);
                if ($rLog['type'] == 3 && $rLog['needs_maintenance'] == 2) {
                    $logtype = 'Needs Maintenance';
                    // with capital M, other than cache attribute
                } elseif (isset($gpxLogType[$rLog['type']])) {
                    $logtype = $gpxLogType[$rLog['type']];
                } else {
                    $logtype = $gpxLogType[0];
                }
                $thislog = mb_ereg_replace('{type}', $logtype, $thislog);
                $logtext = decodeEntities($rLog['text']);
                if ($rLog['needs_maintenance'] > 0 || $rLog['listing_outdated'] > 0) {
                    $flags = [];
                    if ($rLog['needs_maintenance'] == 1) {
                        $flags[] = 'geocache is ok';
                    }
                    if ($rLog['needs_maintenance'] == 2) {
                        $flags[] = 'geocache needs maintenance';
                    }
                    if ($rLog['listing_outdated'] == 1) {
                        $flags[] = 'description is ok';
                    }
                    if ($rLog['listing_outdated'] == 2) {
                        $flags[] = 'description is outdated';
                    }
                    foreach ($flags as &$flag) {
                        $ft = $translate->t($flag, '', basename(__FILE__), __LINE__);
                        if (strstr($flag, 'is ok') == false) {
                            $flag = '<span style="color:#c00000">' . $ft . '</span>';
                        } else {
                            $flag = '<span style="color:#00c000">' . $ft . '</span>';
                        }
                    }
                    $logtext = "<p><i>" . implode(', ', $flags) . "</i></p>\n" . $logtext;
                }
                $thislog = mb_ereg_replace('{text}', text_xmlentities($logtext), $thislog);
                $logentries .= $thislog . "\n";
            }
        }
        mysql_free_result($rsLogs);
        $thisline = mb_ereg_replace('{logs}', $logentries, $thisline);
        // attributes
        $rsAttributes = sql_slave('
            SELECT `gc_id`, `gc_inc`, `gc_name`
            FROM `caches_attributes`
            INNER JOIN `cache_attrib`
                ON `cache_attrib`.`id`=`caches_attributes`.`attrib_id`
            WHERE `caches_attributes`.`cache_id`=&1', $r['cacheid']);
        $gc_ids = [];
        while ($rAttrib = sql_fetch_array($rsAttributes)) {
            // Multiple OC attributes can be mapped to one GC attribute, either with
            // the same "inc"s or with different. Both may disturb applications, so we
            // output each GC ID only once.
            if (!isset($gc_ids[$rAttrib['gc_id']])) {
                $thisattribute = mb_ereg_replace('{attrib_id}', $rAttrib['gc_id'], $gpxAttributes);
                $thisattribute = mb_ereg_replace('{attrib_inc}', $rAttrib['gc_inc'], $thisattribute);
                $thisattribute = mb_ereg_replace('{attrib_name}', text_xmlentities($rAttrib['gc_name']), $thisattribute);
                $attribentries .= $thisattribute . "\n";
                $gc_ids[$rAttrib['gc_id']] = true;
            }
        }
        mysql_free_result($rsAttributes);
        if ($r['needs_maintenance'] > 0) {
            $thisattribute = mb_ereg_replace('{attrib_id}', '42', $gpxAttributes);
            $thisattribute = mb_ereg_replace('{attrib_inc}', '1', $thisattribute);
            $thisattribute = mb_ereg_replace('{attrib_name}', 'Needs maintenance', $thisattribute);
            // with lowercase m, other than log type
            $attribentries .= $thisattribute . "\n";
        }
        $thisline = mb_ereg_replace('{attributes}', $attribentries, $thisline);
        // geokrety
        $rsGeokrety = sql_slave('
            SELECT
                `gk_item`.`id`,
                `gk_item`.`name`,
                `caches`.`wp_oc`
            FROM `gk_item`
            INNER JOIN `gk_item_waypoint`
                ON `gk_item`.`id`=`gk_item_waypoint`.`id`
            INNER JOIN `caches`
                ON `gk_item_waypoint`.`wp`=`caches`.`wp_oc`
            WHERE `caches`.`cache_id`=&1', $r['cacheid']);
        while ($rGK = sql_fetch_array($rsGeokrety)) {
            $thiskrety = $gpxGeokrety;
            $thiskrety = mb_ereg_replace('{gkid}', $rGK['id'], $thiskrety);
            $thiskrety = mb_ereg_replace('{gkref}', sprintf("GK%04X", $rGK['id']), $thiskrety);
            $thiskrety = mb_ereg_replace('{gkname}', text_xmlentities($rGK['name']), $thiskrety);
            $gkentries .= $thiskrety . "\n";
        }
        mysql_free_result($rsGeokrety);
        $thisline = mb_ereg_replace('{geokrety}', $gkentries, $thisline);
        // additional waypoints, including personal cache note
        $childWaypoints = $childwphandler->getChildWps($r['cacheid']);
        $n = 1;
        $digits = "%0" . strlen(count($childWaypoints)) . "d";
        foreach ($childWaypoints as $childWaypoint) {
            $thiswp = $gpxWaypoints;
            $thiswp = mb_ereg_replace('{wp_lat}', sprintf('%01.5f', $childWaypoint['latitude']), $thiswp);
            $thiswp = mb_ereg_replace('{wp_lon}', sprintf('%01.5f', $childWaypoint['longitude']), $thiswp);
            $thiswp = mb_ereg_replace('{time}', $time, $thiswp);
            $thiswp = mb_ereg_replace('{name}', $r['waypoint'] . '-' . sprintf($digits, $n), $thiswp);
            $thiswp = mb_ereg_replace('{cachename}', text_xmlentities($r['name']), $thiswp);
            $thiswp = mb_ereg_replace('{comment}', text_xmlentities($childWaypoint['description']), $thiswp);
            $thiswp = mb_ereg_replace('{desc}', text_xmlentities($childWaypoint['name']), $thiswp);
            switch ($childWaypoint['type']) {
                case 1:
                    $wp_typename = "Parking Area";
                    break;
                    // well-known garmin symbols
                // well-known garmin symbols
                case 2:
                    $wp_typename = "Flag, Green";
                    break;
                    // stage / ref point
                // stage / ref point
                case 3:
                    $wp_typename = "Flag, Blue";
                    break;
                    // path
                // path
                case 4:
                    $wp_typename = "Circle with X";
                    break;
                    // final
                // final
                case 5:
                    $wp_typename = "Diamond, Green";
                    break;
                    // point of interest
                // point of interest
                default:
                    $wp_typename = "Flag, Blue";
                    break;
                    // for the case new types are forgotten here ..
            }
            $thiswp = mb_ereg_replace('{type}', text_xmlentities($wp_typename), $thiswp);
            $thiswp = mb_ereg_replace('{parent}', $r['waypoint'], $thiswp);
            $thiswp = mb_ereg_replace('{cacheid}', $r['cacheid'], $thiswp);
            $waypoints .= $thiswp;
            ++$n;
        }
        if ($cacheNote && !empty($cacheNote['latitude']) && !empty($cacheNote['longitude'])) {
            $thiswp = $gpxWaypoints;
            $thiswp = mb_ereg_replace('{wp_lat}', sprintf('%01.5f', $cacheNote['latitude']), $thiswp);
            $thiswp = mb_ereg_replace('{wp_lon}', sprintf('%01.5f', $cacheNote['longitude']), $thiswp);
            $thiswp = mb_ereg_replace('{time}', $time, $thiswp);
            $thiswp = mb_ereg_replace('{name}', $r['waypoint'] . 'NOTE', $thiswp);
            $thiswp = mb_ereg_replace('{cachename}', text_xmlentities($r['name']), $thiswp);
            $thiswp = mb_ereg_replace('{comment}', text_xmlentities($cacheNote['note']), $thiswp);
            $thiswp = mb_ereg_replace('{desc}', text_xmlentities($cache_note_text), $thiswp);
            $thiswp = mb_ereg_replace('{type}', "Reference Point", $thiswp);
            $thiswp = mb_ereg_replace('{parent}', $r['waypoint'], $thiswp);
            $thiswp = mb_ereg_replace('{cacheid}', $r['cacheid'], $thiswp);
            $waypoints .= $thiswp;
        }
        $thisline = mb_ereg_replace('{cache_waypoints}', $waypoints, $thisline);
        append_output($thisline);
    }
    mysql_free_result($rs);
    append_output($gpxFoot);
}