<?php
function getIndexOpen($index, $vals) {
$IndexOpen = array();
$j=0;
for ($i=0; $i<count($index); $i++) {
if ($vals[$index[$i]]['type'] == 'open') {
$IndexOpen[$j] = $index[$i];
$j++;
}
}
return($IndexOpen);
}
function getIndexClose($index, $vals) {
$IndexClose = array();
$j=0;
for ($i=0; $i<count($index); $i++) {
if ($vals[$index[$i]]['type'] == 'close') {
$IndexClose[$j] = $index[$i];
$j++;
}
}
return($IndexClose);
}
function getIndexComplete($index, $vals) {
$IndexComplete = array();
$j=0;
for ($i=0; $i<count($index); $i++) {
if ($vals[$index[$i]]['type'] == 'complete') {
$IndexComplete[$j] = $index[$i];
$j++;
}
}
return($IndexComplete);
}
function getIndexOpenComplete($index, $vals) {
$IndexOpenComplete = array();
$j=0;
for ($i=0; $i<count($index); $i++) {
if (($vals[$index[$i]]['type'] == 'complete')||($vals[$index[$i]]['type'] == 'open')) {
$IndexOpenComplete[$j] = $index[$i];
$j++;
}
}
return($IndexOpenComplete);
}
function getLapPositions($lapIndexOpen, $posIndexOpen, $vals, &$latitudes, &$longitudes) {
$la = 0; $lo = 0; $pos = 0;
for ($j = 0; $j < count($lapIndexOpen); $j++) {
while ($posIndexOpen[$pos]<$lapIndexOpen[$j])
$pos++;
$latitudes[$la] = $vals[$posIndexOpen[$pos]+1][value];
$longitudes[$lo] = $vals[$posIndexOpen[$pos]+3][value];
$la++;
$lo++;
// echo "latitudes[".$la."]=".$latitudes[$la].", longitudes[".$lo."]=".$longitudes[$lo]."<br>";
}
// Finish
$latitudes[$la] = $vals[$posIndexOpen[count($posIndexOpen)-1]+1][value];
$longitudes[$lo] = $vals[$posIndexOpen[count($posIndexOpen)-1]+3][value];
// echo "latitudes[".$la."]=".$latitudes[$la].", longitudes[".$lo."]=".$longitudes[$lo]."<br>";
}
function tcx2posts($tcxfile, &$latitudes, &$longitudes) {
if (!($fp = fopen($tcxfile, "r"))) {
die("could not open XML input");
}
$contents = fread($fp, filesize($tcxfile));
$p = xml_parser_create();
$res = xml_parse_into_struct($p, $contents, $vals, $index);
if ($res == 0)
echo "Couldn't parse ".$tcxfile."<br>";
xml_parser_free($p);
$lapIndex = $index[LAP];
$lapIndexOpen = getIndexOpen($lapIndex, $vals);
$lapIndexClose = getIndexClose($lapIndex, $vals);
$posIndex = $index[POSITION];
$posIndexOpen = getIndexOpen($posIndex, $vals);
$posIndexClose = getIndexClose($posIndex, $vals);
getLapPositions($lapIndexOpen, $posIndexOpen, $vals, $latitudes, $longitudes);
}
function getTcxLapTimes($index, $vals, &$laps, &$starttime) {
$la = 1; $lo = 1;
$lappt = array();
$starttimefound = 0;
$lastpt = 0;
for ($j = 0; $j <= count($index); $j++) {
if ((($vals[$index[$j]]['type'] == 'open')&&($vals[$index[$j]]['tag'] == 'LAP'))||$firstpoint) {
$level = $vals[$index[$j]]['level'];
$open = 1;
$i = 1;
$foundname = 0;
$c=0;
$firstpoint = 1;
while ($open) {
if ((($vals[$index[$j]+$i][tag]=='LAP')&&($vals[$index[$j]+$i][type]=='close')&&($vals[$index[$j]+$i][level]==$level))||!$firstpoint)
break;
if ($vals[$index[$j]+$i][tag]=='TIME') {
list($date, $timez) = split("T", $vals[$index[$j]+$i][value]);
list($year, $month, $day) = split("-", $date);
list($time, $dummy) = split("Z", $timez);
list($hour, $minute, $second) = split(":", $time);
if (!$starttimefound) {
$starttime = mktime($hour, $minute, $second, $month, $day, $year);
$starttimefound = 1;
$lappt[0] = 0;
}
else
$lappt[0] = mktime($hour, $minute, $second, $month, $day, $year)-$starttime;
$c++;
}
if ($vals[$index[$j]+$i][tag]=='LATITUDEDEGREES') {
$lappt[2] = $vals[$index[$j]+$i][value];
$c++;
}
if ($vals[$index[$j]+$i][tag]=='LONGITUDEDEGREES') {
$lappt[1] = $vals[$index[$j]+$i][value];
$c++;
}
if ($c==3) {
$laps[] = $lappt;
// echo $lappt[0].", ".$lappt[1].", ".$lappt[2].", ".$lappt[3]."<br>";
$firstpoint = 0;
}
$i++;
}
}
}
}
function getTcxRoute($tptIndex, $vals, &$route, &$starttime) {
$la = 1; $lo = 1;
$trpt = array();
$firstpoint = 1;
$nrlappoints = 0;
$timebefore = -1;
for ($j = 0; $j <= count($tptIndex); $j++) {
if (($vals[$index[$j]]['type'] == 'open')&&($vals[$index[$j]]['tag'] == 'LAP'))
$nrlappoints = 0;
if (($vals[$tptIndex[$j]]['type'] == 'open')&&($vals[$tptIndex[$j]]['tag'] == 'TRACKPOINT')) {
$level = $vals[$tptIndex[$j]]['level'];
$open = 1;
$i = 1;
$foundname = 0;
$c=0;
while ($open) {
if (($vals[$tptIndex[$j]+$i][tag]=='TRACKPOINT')&&($vals[$tptIndex[$j]+$i][type]=='close')&&($vals[$tptIndex[$j]+$i][level]==$level))
break;
if ($vals[$tptIndex[$j]+$i][tag]=='TIME') {
list($date, $timez) = split("T", $vals[$tptIndex[$j]+$i][value]);
list($year, $month, $day) = split("-", $date);
list($time, $dummy) = split("Z", $timez);
list($hour, $minute, $second) = split(":", $time);
if ($firstpoint) {
$starttime = mktime($hour, $minute, $second, $month, $day, $year);
$trpt[0] = 0;
}
else
$trpt[0] = mktime($hour, $minute, $second, $month, $day, $year)-$starttime;
$c++;
}
if ($vals[$tptIndex[$j]+$i][tag]=='LATITUDEDEGREES') {
$trpt[2] = $vals[$tptIndex[$j]+$i][value];
$c++;
}
if ($vals[$tptIndex[$j]+$i][tag]=='LONGITUDEDEGREES') {
$trpt[1] = $vals[$tptIndex[$j]+$i][value];
$c++;
}
$i++;
}
if ($c==3) {
$nrlappoints++;
if ($nrlappoints==1)
$trpt[3] = "yes";
else
$trpt[3] = "no";
if ($timebefore != $trpt[0])
$route[] = $trpt;
$firstpoint = 0;
$timebefore = $trpt[0];
}
}
}
}
function tcx2routelaps($tcxfile, &$route, &$laps, &$starttime) {
if (!($fp = fopen($tcxfile, "r"))) {
die("could not open XML input");
}
$contents = fread($fp, filesize($tcxfile));
$p = xml_parser_create();
$res = xml_parse_into_struct($p, $contents, $vals, $index);
if ($res == 0)
echo "Couldn't parse ".$tcxfile."<br>";
xml_parser_free($p);
$tptIndex = $index[TRACKPOINT];
getTcxRoute($tptIndex, $vals, $route, $starttime);
$lapindex = $index[LAP];
getTcxLapTimes($lapindex, $vals, $laps, $starttime);
$j=0;
for ($i = 0; $i<count($laps); $i++) {
while ($j<count($route)) {
if ($route[$j][0] == $laps[$i][0]) {
$route[$j][3] = "yes";
break;
}
$j++;
}
}
$lappt[0] = $route[count($route)-1][0];
$lappt[1] = $route[count($route)-1][1];
$lappt[2] = $route[count($route)-1][2];
$route[count($route)-1][3]="yes";
$laps[] = $lappt;
}
function getWptPositions($wptOpenIndexComplete, $vals, &$latitudes, &$longitudes) {
$la = 1; $lo = 1;
for ($j = 0; $j <= count($wptOpenIndexComplete); $j++) {
if (($vals[$wptOpenIndexComplete[$j]]['type'] == 'open')&&($vals[$wptOpenIndexComplete[$j]]['tag'] == 'WPT')) {
$level = $vals[$wptOpenIndexComplete[$j]]['level'];
$open = 1;
$i = 1;
$foundname = 0;
while ($open) {
if (($vals[$wptOpenIndexComplete[$j]+$i][tag]=='WPT')&&($vals[$wptOpenIndexComplete[$j]+$i][type]=='close')&&($vals[$wptOpenIndexComplete[$j]+$i][level]==$level))
break;
if ($vals[$wptOpenIndexComplete[$j]+$i][tag]=='NAME') {
if ($vals[$wptOpenIndexComplete[$j]+$i][value]=="Start") {
$latitudes[0] = $vals[$wptOpenIndexComplete[$j]][attributes][LAT];
$longitudes[0] = $vals[$wptOpenIndexComplete[$j]][attributes][LON];
$foundname = 1;
}
else if ($vals[$wptOpenIndexComplete[$j]+$i][value]=="Finish") {
$finishlat = $vals[$wptOpenIndexComplete[$j]][attributes][LAT];
$finishlon = $vals[$wptOpenIndexComplete[$j]][attributes][LON];
$foundname = 1;
}
}
$i++;
}
if (!$foundname) {
$latitudes[$la] = $vals[$wptOpenIndexComplete[$j]][attributes][LAT];
$longitudes[$lo] = $vals[$wptOpenIndexComplete[$j]][attributes][LON];
$la++;
$lo++;
}
}
if ($vals[$wptOpenIndexComplete[$j]]['type'] == 'complete') {
$latitudes[$la] = $vals[$wptOpenIndexComplete[$j]][attributes][LAT];
$longitudes[$lo] = $vals[$wptOpenIndexComplete[$j]][attributes][LON];
$la++;
$lo++;
}
}
if (!isset($latitudes[0]))
$latitudes[0] = 100;
if (!isset($longitudes[0]))
$longitudes[0] = 100;
if (!isset($finishlat))
$latitudes[$la] = 100;
if (!isset($finishlon))
$longitudes[$lo] = 100;
}
function gpx2posts($gpxfile, &$latitudes, &$longitudes) {
if (!($fp = fopen($gpxfile, "r"))) {
die("could not open gpx file");
}
$contents = fread($fp, filesize($gpxfile));
$p = xml_parser_create();
$res = xml_parse_into_struct($p, $contents, $vals, $index);
if ($res == 0)
echo "Couldn't parse ".$gpxfile."<br>";
xml_parser_free($p);
$wptIndex = $index[WPT];
$wptIndexOpenComplete = getIndexOpenComplete($wptIndex, $vals);
getWptPositions($wptIndexOpenComplete, $vals, $latitudes, $longitudes);
}
function frwdtxt2route($frwdtxtfile, &$route, &$starttime) {
$nrlappoints = 0;
if (!($fp = fopen($frwdtxtfile, "r"))) {
die("could not open frwd text file");
}
$i=0;
if ($fp) {
$firstpoint = 1;
while (!feof($fp)) {
$buffer = fgets($fp, 4096);
if (strstr($buffer, "Starttid")) {
list($dummy1, $day, $monthstr, $year, $time, $dummy2) = explode(" ", $buffer);
switch ($monthstr) {
case "januari": $month = 1; break;
case "februari": $month = 2; break;
case "mars": $month = 3; break;
case "april": $month = 4; break;
case "maj": $month = 5; break;
case "juni": $month = 6; break;
case "juli": $month = 7; break;
case "augusti": $month = 8; break;
case "september": $month = 9; break;
case "oktober": $month = 10; break;
case "november": $month = 11; break;
case "december": $month = 12; break;
}
list($hour, $minute, $second) = explode(":", $time);
$starttime = mktime($hour, $minute, $second, $month, $day, $year);
}
if (strstr($buffer, "Yes")) {
//echo $buffer;
$nrval = 15;
//$nrval = sscanf($buffer, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t", $time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc);
list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = preg_split ("/\s+/", $buffer);
$nrlappoints=0;
$firstpoint=0;
} else if (!$firstpoint) {
$nrval = 14;
//$nrval = sscanf($buffer, "%s\t\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t", $time, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc);
list($time, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = preg_split ("/\s+/", $buffer);
}
if ((!$firstpoint)&&($nrval>=14)) {
//echo $lat." ".$long."<br>";
$latarray = explode(",", $lat);
$longarray = explode(",", $long);
$latdeg = floor($latarray[0]/100);
$latmin = fmod($latarray[0], 100);
$latmin = ($latmin+$latarray[1]/10000)/60;
$latitude=$latdeg+$latmin;
$longdeg = floor($longarray[0]/100);
$longmin = fmod($longarray[0], 100);
$longmin = ($longmin+$longarray[1]/10000)/60;
$longitude = $longdeg+$longmin;
$nrlappoints++;
if ($nrlappoints==1)
$route[] = array($time, $longitude, $latitude, "yes");
else
$route[] = array($time, $longitude, $latitude, "no");
$i++;
}
}
fclose($fp);
}
}
function frwdtxt2laps($frwdtxtfile, &$laps) {
if (!($fp = fopen($frwdtxtfile, "r"))) {
die("could not open frwd text file");
}
$i=0;
if ($fp) {
while (!feof($fp)) {
$buffer = fgets($fp, 4096);
if (strstr($buffer, "Yes")) {
//echo $buffer;
//list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = sscanf($buffer, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\%s\t%s\t%s\t%s\t%s\t");
list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = preg_split ("/\s+/", $buffer);
//echo $lat." ".$long."<br>";
$latarray = explode(",", $lat);
$longarray = explode(",", $long);
$latdeg = floor($latarray[0]/100);
$latmin = fmod($latarray[0], 100);
$latmin = ($latmin+$latarray[1]/10000)/60;
$latitude = $latdeg+$latmin;
$longdeg = floor($longarray[0]/100);
$longmin = fmod($longarray[0], 100);
$longmin = ($longmin+$longarray[1]/10000)/60;
$longitude = $longdeg+$longmin;
$laps[] = array($time, $longitude, $latitude);
$i++;
}
}
fclose($fp);
}
}
function frwdtxt2routelaps($frwdtxtfile, &$route, &$laps, &$starttime) {
if (!($fp = fopen($frwdtxtfile, "r")))
die("could not open frwd text file");
frwdtxt2route($frwdtxtfile, &$route, &$starttime);
frwdtxt2laps($frwdtxtfile, &$laps);
}
function frwdtxt2posts($frwdtxtfile, &$latitudes, &$longitudes) {
if (!($fp = fopen($frwdtxtfile, "r"))) {
die("could not open frwd text file");
}
$i=0;
if ($fp) {
while (!feof($fp)) {
$buffer = fgets($fp, 4096);
if (strstr($buffer, "Yes")) {
//echo $buffer;
//list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = sscanf($buffer, "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\%s\t%s\t%s\t%s\t%s\t");
list($time, $lap, $nsm, $ewm, $lat, $long, $mh, $kmh, $dist, $pulse, $temp, $press, $sv, $te, $epoc) = preg_split ("/\s+/", $buffer);
//echo $lat." ".$long."<br>";
$latarray = explode(",", $lat);
$longarray = explode(",", $long);
$latdeg = floor($latarray[0]/100);
$latmin = fmod($latarray[0], 100);
$latmin = ($latmin+$latarray[1]/10000)/60;
$latitudes[$i]=$latdeg+$latmin;
$longdeg = floor($longarray[0]/100);
$longmin = fmod($longarray[0], 100);
$longmin = ($longmin+$longarray[1]/10000)/60;
$longitudes[$i]=$longdeg+$longmin;
$i++;
}
}
fclose($fp);
}
}
function to_posts($file, $type) {
if (is_uploaded_file($file)) {
switch ($type) {
case "tcx":
tcx2posts($file, $latitudes, $longitudes);
break;
case "frwd":
frwdtxt2posts($file, $latitudes, $longitudes);
break;
case "gpx":
gpx2posts($file, $latitudes, $longitudes);
break;
default: return(false); break;
}
if ($longitudes[0] == 100)
$_POST["startx"] = "";
else
$_POST["startx"] = $longitudes[0];
if ($latitudes[0] == 100)
$_POST["starty"] = "";
else
$_POST["starty"] = $latitudes[0];
$_POST["nrposts"] = count($longitudes)-2;
for ($i=0; $i<$_POST["nrposts"]; $i++) {
$_POST['post'][$i][x] = $longitudes[$i+1];
$_POST["post"][$i][y] = $latitudes[$i+1];
}
if ($longitudes[count($longitudes)-1]==100) {
$_POST["finishx"] = "";
}
else
$_POST["finishx"] = $longitudes[count($longitudes)-1];
if ($latitudes[count($latitudes)-1]==100)
$_POST["finishy"] = "";
else
$_POST["finishy"] = $latitudes[count($latitudes)-1];
return(true);
}
return(false);
}
function nrspaces($nrspaces) {
$indentstr = "";
for ($i=0; $i<$nrspaces; $i++) {
$indentstr .= " ";
}
return($indentstr);
}
function convert_to_tcx($starttime, $waypoints, $route, $filename) {
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename="'.$filename.'"');
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n";
echo "<TrainingCenterDatabase xmlns=\"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.garmin.com/xmlschemas/ActivityExtension/v2 http://www.garmin.com/xmlschemas/ActivityExtensionv2.xsd http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd\">\n";
echo "<Activities>\n";
echo " <Activity Sport=\"Running\">\n";
$starttimestamp = date("Y-m-d\TH:i:s\Z", $starttime);
echo " <Id>".$starttimestamp."</Id>\n";
$lapstr = nrspaces(4)."<Lap StartTime=\"".$starttimestamp."\">\n";
$distancelap = 0;
$timelap = 0;
$totaldistance = 0;
$wptsartime = explode(":", $waypoints);
$routeartime = explode(":", $route);
$firstpoint = new Point();
$secondpoint = new Point();
$routept = explode(",", $routeartime[0]);
$firstpoint->lon = $routept[1];
$firstpoint->lat = $routept[2];
$nrspaces = 6; // used to get nicer look
$trackstrlap = nrspaces($nrspaces)."<Track>\n";
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<Trackpoint>\n";
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<Time>".$starttimestamp."</Time>\n";
$trackstrlap .= nrspaces($nrspaces)."<Position>\n";
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n";
$trackstrlap .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Position>\n";
$trackstrlap .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Trackpoint>\n";
$nrspaces -= 2;
for ($i=1; $i<count($routeartime); $i++) {
$routept = explode(",", $routeartime[$i]);
$secondpoint->lon = $routept[1];
$secondpoint->lat = $routept[2];
$line = new Line($firstpoint, $secondpoint);
$totaldistance += $line->getLength()*1000;
$firstpoint->lon = $routept[1];
$firstpoint->lat = $routept[2];
if ($routept[3] != "yes") {
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<Trackpoint>\n";
$timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]);
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n";
$trackstrlap .= nrspaces($nrspaces)."<Position>\n";
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n";
$trackstrlap .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Position>\n";
$trackstrlap .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Trackpoint>\n";
$nrspaces -= 2;
}
else {
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<Trackpoint>\n";
$timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]);
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n";
$trackstrlap .= nrspaces($nrspaces)."<Position>\n";
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n";
$trackstrlap .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Position>\n";
$trackstrlap .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Trackpoint>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Track>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Lap>\n";
$distlap = $totaldistance-$distancelap;
$distancelap = $totaldistance;
$timel = $routept[0]-$timelap;
$timelap = $routept[0];
$nrspaces += 2;
$lapstr .= nrspaces($nrspaces)."<TotalTimeSeconds>".sprintf("%.7f", $timel)."</TotalTimeSeconds>\n";
$lapstr .= nrspaces($nrspaces)."<DistanceMeters>".$distlap."</DistanceMeters>\n";
$lapstr .= nrspaces($nrspaces)."<MaximumSpeed>0</MaximumSpeed>\n";
$lapstr .= nrspaces($nrspaces)."<Calories>0</Calories>\n";
$lapstr .= nrspaces($nrspaces)."<Intensity>Active</Intensity>\n";
$lapstr .= nrspaces($nrspaces)."<TriggerMethod>Manual</TriggerMethod>\n";
echo $lapstr.$trackstrlap;
$nrspaces -= 2;
$lapstr = nrspaces($nrspaces)."<Lap StartTime=\"".$timestamp."\">\n";
$nrspaces += 2;
$trackstrlap = nrspaces($nrspaces)."<Track>\n";
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<Trackpoint>\n";
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n";
$trackstrlap .= nrspaces($nrspaces)."<Position>\n";
$nrspaces += 2;
$trackstrlap .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n";
$trackstrlap .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Position>\n";
$trackstrlap .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n";
$nrspaces -= 2;
$trackstrlap .= nrspaces($nrspaces)."</Trackpoint>\n";
$nrspaces -= 2;
}
}
$nrspaces -= 2;
echo "\n";
echo nrspaces($nrspaces)."</Activity>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Activities>\n";
echo nrspaces($nrspaces)."<Author xsi:type=\"Application_t\">\n";
$nrspaces += 2;
echo nrspaces($nrspaces)."<Name>FROG</Name>\n";
echo nrspaces($nrspaces)."<Build>\n";
$nrspaces += 2;
echo nrspaces($nrspaces)."<Version>\n";
$nrspaces += 2;
echo nrspaces($nrspaces)."<VersionMajor>1</VersionMajor>\n";
echo nrspaces($nrspaces)."<VersionMinor>0</VersionMinor>\n";
echo nrspaces($nrspaces)."<BuildMajor>1</BuildMajor>\n";
echo nrspaces($nrspaces)."<BuildMinor>0</BuildMinor>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Version>\n";
echo nrspaces($nrspaces)."<Type>Release</Type>\n";
$buildtime = date("Y-m-d\TH:i:s\Z");
echo nrspaces($nrspaces)."<Time>".$buildtime."</Time>\n";
echo nrspaces($nrspaces)."<Builder>frog</Builder>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Build>\n";
if (isset($_SESSION["lang"]))
echo nrspaces($nrspaces)."<LangID>".$_SESSION["lang"]."</LangID>\n";
else
echo nrspaces($nrspaces)."<LangID>sv</LangID>\n";
echo nrspaces($nrspaces)."<PartNumber>006-A0119-00</PartNumber>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Author>\n";
$nrspaces -= 2;
echo "\n";
echo nrspaces($nrspaces)."</TrainingCenterDatabase>";
}
function convert_to_tcx_course($starttime, $waypoints, $route, $filename) {
$nrspaces=0;
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename="'.$filename.'"');
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n";
echo "<TrainingCenterDatabase xmlns=\"http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.garmin.com/xmlschemas/ActivityExtension/v2 http://www.garmin.com/xmlschemas/ActivityExtensionv2.xsd http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd\">\n";
$nrspaces+=2;
echo "\n";
echo nrspaces($nrspaces)."<Courses>\n";
$nrspaces+=2;
echo nrspaces($nrspaces)."<Course>\n";
$nrspaces+=2;
$starttimestamp = date("Y-m-d\TH:i:s\Z", $starttime);
echo nrspaces($nrspaces)."<Name>".substr($filename, 0, 15)."</Name>\n";
$nrspaceslap = $nrspaces;
$lapstrar = array();
$lapstr = nrspaces($nrspaceslap)."<Lap>\n";
$distancelap = 0;
$timelap = 0;
$totaldistance = 0;
$wptsartime = explode(":", $waypoints);
$routeartime = explode(":", $route);
$firstpoint = new Point();
$secondpoint = new Point();
$routept = explode(",", $routeartime[0]);
$firstpoint->lon = $routept[1];
$firstpoint->lat = $routept[2];
$trackstr = nrspaces($nrspaces)."<Track>\n";
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<Trackpoint>\n";
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<Time>".$starttimestamp."</Time>\n";
$trackstr .= nrspaces($nrspaces)."<Position>\n";
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n";
$trackstr .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n";
$nrspaces -= 2;
$trackstr .= nrspaces($nrspaces)."</Position>\n";
$trackstr .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n";
$nrspaces -= 2;
$trackstr .= nrspaces($nrspaces)."</Trackpoint>\n";
$nrspaces -= 2;
for ($i=1; $i<count($routeartime); $i++) {
$routept = explode(",", $routeartime[$i]);
$secondpoint->lon = $routept[1];
$secondpoint->lat = $routept[2];
$line = new Line($firstpoint, $secondpoint);
$totaldistance += $line->getLength()*1000;
$firstpoint->lon = $routept[1];
$firstpoint->lat = $routept[2];
if ($routept[3] != "yes") {
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<Trackpoint>\n";
$timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]);
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n";
$trackstr .= nrspaces($nrspaces)."<Position>\n";
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n";
$trackstr .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n";
$nrspaces -= 2;
$trackstr .= nrspaces($nrspaces)."</Position>\n";
$trackstr .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n";
$nrspaces -= 2;
$trackstr .= nrspaces($nrspaces)."</Trackpoint>\n";
$nrspaces -= 2;
}
else {
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<Trackpoint>\n";
$timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]);
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n";
$trackstr .= nrspaces($nrspaces)."<Position>\n";
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n";
$trackstr .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n";
$nrspaces -= 2;
$trackstr .= nrspaces($nrspaces)."</Position>\n";
$trackstr .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n";
$nrspaces -= 2;
$trackstr .= nrspaces($nrspaces)."</Trackpoint>\n";
$distlap = $totaldistance-$distancelap;
$distancelap = $totaldistance;
$timel = $routept[0]-$timelap;
$timelap = $routept[0];
$nrspaceslap += 2;
$lapstr .= nrspaces($nrspaceslap)."<TotalTimeSeconds>".sprintf("%.7f", $timel)."</TotalTimeSeconds>\n";
$lapstr .= nrspaces($nrspaceslap)."<DistanceMeters>".$distlap."</DistanceMeters>\n";
$lapstr .= nrspaces($nrspaceslap)."<Intensity>Active</Intensity>\n";
$nrspaceslap -= 2;
$lapstr .= nrspaces($nrspaceslap)."</Lap>\n";
$lapstrar[] = $lapstr;
//echo $lapstr.$trackstrlap;
$lapstr = nrspaces($nrspaceslap)."<Lap>\n";
$trackstr .= nrspaces($nrspaces)."<Trackpoint>\n";
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<Time>".$timestamp."</Time>\n";
$trackstr .= nrspaces($nrspaces)."<Position>\n";
$nrspaces += 2;
$trackstr .= nrspaces($nrspaces)."<LatitudeDegrees>".$routept[2]."</LatitudeDegrees>\n";
$trackstr .= nrspaces($nrspaces)."<LongitudeDegrees>".$routept[1]."</LongitudeDegrees>\n";
$nrspaces -= 2;
$trackstr .= nrspaces($nrspaces)."</Position>\n";
$trackstr .= nrspaces($nrspaces)."<DistanceMeters>".$totaldistance."</DistanceMeters>\n";
$nrspaces -= 2;
$trackstr .= nrspaces($nrspaces)."</Trackpoint>\n";
$nrspaces -= 2;
}
}
for ($i=0; $i<count($lapstrar); $i++)
echo $lapstrar[$i];
echo $trackstr;
echo nrspaces($nrspaces)."</Track>\n";
echo "\n";
echo nrspaces($nrspaces)."<Creator xsi:type=\"Application_t\">\n";
$nrspaces += 2;
echo nrspaces($nrspaces)."<Name>FROG</Name>\n";
echo nrspaces($nrspaces)."<Build>\n";
$nrspaces += 2;
echo nrspaces($nrspaces)."<Version>\n";
$nrspaces += 2;
echo nrspaces($nrspaces)."<VersionMajor>1</VersionMajor>\n";
echo nrspaces($nrspaces)."<VersionMinor>0</VersionMinor>\n";
echo nrspaces($nrspaces)."<BuildMajor>1</BuildMajor>\n";
echo nrspaces($nrspaces)."<BuildMinor>0</BuildMinor>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Version>\n";
echo nrspaces($nrspaces)."<Type>Release</Type>\n";
$buildtime = date("Y-m-d\TH:i:s\Z");
echo nrspaces($nrspaces)."<Time>".$buildtime."</Time>\n";
echo nrspaces($nrspaces)."<Builder>frog</Builder>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Build>\n";
if (isset($_SESSION["lang"]))
echo nrspaces($nrspaces)."<LangID>".$_SESSION["lang"]."</LangID>\n";
else
echo nrspaces($nrspaces)."<LangID>sv</LangID>\n";
echo nrspaces($nrspaces)."<PartNumber>006-A0119-00</PartNumber>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Creator>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Course>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Courses>\n";
echo "\n\n";
echo nrspaces($nrspaces)."<Author xsi:type=\"Application_t\">\n";
$nrspaces += 2;
echo nrspaces($nrspaces)."<Name>FROG</Name>\n";
echo nrspaces($nrspaces)."<Build>\n";
$nrspaces += 2;
echo nrspaces($nrspaces)."<Version>\n";
$nrspaces += 2;
echo nrspaces($nrspaces)."<VersionMajor>1</VersionMajor>\n";
echo nrspaces($nrspaces)."<VersionMinor>0</VersionMinor>\n";
echo nrspaces($nrspaces)."<BuildMajor>1</BuildMajor>\n";
echo nrspaces($nrspaces)."<BuildMinor>0</BuildMinor>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Version>\n";
echo nrspaces($nrspaces)."<Type>Release</Type>\n";
$buildtime = date("Y-m-d\TH:i:s\Z");
echo nrspaces($nrspaces)."<Time>".$buildtime."</Time>\n";
echo nrspaces($nrspaces)."<Builder>frog</Builder>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Build>\n";
if (isset($_SESSION["lang"]))
echo nrspaces($nrspaces)."<LangID>".$_SESSION["lang"]."</LangID>\n";
else
echo nrspaces($nrspaces)."<LangID>sv</LangID>\n";
echo nrspaces($nrspaces)."<PartNumber>006-A0119-00</PartNumber>\n";
$nrspaces -= 2;
echo nrspaces($nrspaces)."</Author>\n";
$nrspaces -= 2;
echo "\n";
echo nrspaces($nrspaces)."</TrainingCenterDatabase>";
}
function convert_to_gpx($starttime, $route, $filename) {
header('Content-Type: text/plain');
header('Content-Disposition: attachment; filename="'.$filename.'"');
$starttimestamp = date("Y-m-d\TH:i:s\Z", $starttime);
$routeartime = explode(":", $route);
$nrspaceswpt = 2;
$wptstr = "";
$nrspacestrk = 2;
$trkstr = nrspaces($nrspacestrk)."<trk>\n";
$nrspacestrk += 2;
$trkstr .= nrspaces($nrspacestrk)."<name>".$filename."</name>\n";
$trkstr .= nrspaces($nrspacestrk)."<trkseg>\n";
$nrspacestrk += 2;
for ($i=0; $i<count($routeartime); $i++) {
$routept = explode(",", $routeartime[$i]);
$timestamp = date("Y-m-d\TH:i:s\Z", $starttime+$routept[0]);
$trkstr .= nrspaces($nrspacestrk)."<trkpt lon=\"".$routept[1]."\" lat=\"".$routept[2]."\">\n";
$nrspacestrk += 2;
$trkstr .= nrspaces($nrspacestrk)."<time>".$timestamp."</time>\n";
$nrspacestrk -= 2;
$trkstr .= nrspaces($nrspacestrk)."</trkpt>\n";
if ($routept[3] == "yes") {
$wptstr .= nrspaces($nrspaceswpt)."<wpt lon=\"".$routept[1]."\" lat=\"".$routept[2]."\">\n";
$nrspaceswpt += 2;
$wptstr .= nrspaces($nrspaceswpt)."<time>".$timestamp."</time>\n";
if ($i==0)
$wptstr .= nrspaces($nrspaceswpt)."<name>Start</name>\n";
if ($i==(count($routeartime)-1))
$wptstr .= nrspaces($nrspaceswpt)."<name>Finish</name>\n";
$nrspaceswpt -= 2;
$wptstr .= nrspaces($nrspaceswpt)."</wpt>\n";
}
}
$nrspacestrk -= 2;
$trkstr .= nrspaces($nrspacestrk)."</trkseg>\n";
$nrspacestrk -= 2;
$trkstr .= nrspaces($nrspacestrk)."</trk>\n";
echo "<gpx xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" version=\"1.1\" creator=\"FROG\" xmlns=\"http://www.topografix.com/GPX/1/1\">\n\n";
echo $wptstr."\n".$trkstr."\n</gpx>";
}
function getGpxRoute($tptIndex, $vals, $wpt, &$route, &$starttime) {
$starttimefound = 0;
$wptind = 0;
for ($j = 0; $j <= count($tptIndex); $j++) {
if (($vals[$tptIndex[$j]][type] == 'open')&&($vals[$tptIndex[$j]][tag] == 'TRKPT')) {
$i = 1;
$trpt[1] = $vals[$tptIndex[$j]][attributes][LON];
$trpt[2] = $vals[$tptIndex[$j]][attributes][LAT];
while ($open) {
if (($vals[$tptIndex[$j+$i]][type] == 'close')&&($vals[$tptIndex[$j+$i]][tag] == 'TRKPT'))
break;
if ($vals[$tptIndex[$j+$i]][tag] == 'TIME') {
list($date, $timez) = split("T", $vals[$index[$j]+$i][value]);
list($year, $month, $day) = split("-", $date);
list($time, $dummy) = split("Z", $timez);
list($hour, $minute, $second) = split(":", $time);
if (!$starttimefound) {
$starttime = mktime($hour, $minute, $second, $month, $day, $year);
$starttimefound = 1;
$trpt[0] = 0;
}
else
$trpt[0] = mktime($hour, $minute, $second, $month, $day, $year)-$starttime;
if ($wpt[$wptind] == $trpt[0]) {
$wptind++;
$trpt[2] = "yes";
}
else
$trpt[2] = "no";
break;
}
}
$route[] = $trpt;
}
}
}
function getGpxWptTimes($wptOpenIndexComplete, $vals, &$starttime, &$wpt) {
$firsttime = 1;
for ($j = 0; $j < count($wptOpenIndexComplete); $j++) {
if (($vals[$wptOpenIndexComplete[$j]]['type'] == 'open')&&($vals[$wptOpenIndexComplete[$j]]['tag'] == 'WPT')) {
$level = $vals[$index[$j]]['level'];
$wptpt[1] = $vals[$wptOpenIndexComplete[$j]][attributes][LON];
$wptpt[2] = $vals[$wptOpenIndexComplete[$j]][attributes][LAT];
$i = 1;
$open = 1;
while ($open) {
if (($vals[$wptOpenIndexComplete[$j]+$i][tag]=='WPT')&&($vals[$wptOpenIndexComplete[$j]+$i][type]=='close')&&($vals[$wptOpenIndexComplete[$j]+$i][level]==$level))
break;
if ($vals[$wptOpenIndexComplete[$j]+$i][tag]=='TIME') {
list($date, $timez) = split("T", $vals[$wptOpenIndexComplete[$j]+$i][value]);
list($year, $month, $day) = split("-", $date);
list($time, $dummy) = split("Z", $timez);
list($hour, $minute, $second) = split(":", $time);
if ($firsttime) {
$starttime = mktime($hour, $minute, $second, $month, $day, $year);
$wptpt[0] = 0;
$firsttime = 0;
}
else
$wptpt[0] = mktime($hour, $minute, $second, $month, $day, $year)-$starttime;
$open = 0;
}
$i++;
}
}
$wpt[] = $wptpt;
}
}
function gpx2routelaps($gpxfile, &$route, &$wpt, &$starttime) {
if (!($fp = fopen($gpxfile, "r")))
die("could not open gpx file");
$contents = fread($fp, filesize($gpxfile));
$p = xml_parser_create();
$res = xml_parse_into_struct($p, $contents, $vals, $index);
if ($res == 0)
echo "Couldn't parse ".$gpxfile."<br>";
xml_parser_free($p);
$wptIndex = $index[WPT];
$wptIndexOpenComplete = getIndexOpenComplete($wptIndex, $vals);
getGpxWptTimes($wptIndexOpenComplete, $vals, &$starttime, &$wpt);
$tptIndex = $index[TRKPT];
getGpxRoute($tptIndex, $vals, $wpt, &$route, &$starttime);
}
?>