<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:date="http://exslt.org/dates-and-times"
  xmlns:math="http://exslt.org/math"
  xmlns:tcx="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2"
  xmlns:tcxv1="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v1"
  xmlns="http://earth.google.com/kml/2.0">

  <!-- $Id: tcx2kml.xsl,v 1.22 2009/02/08 17:42:35 devel Exp devel $ -->

  <xsl:param name="bblonmin">90</xsl:param>
  <xsl:param name="bblonmax">-90</xsl:param>
  <xsl:param name="bblatmin">180</xsl:param>
  <xsl:param name="bblatmax">-180</xsl:param>
  <xsl:param name="usemetric">1</xsl:param>
  <xsl:param name="altitude">0</xsl:param>

  <!-- unit1 is kilometers or miles -->
  <xsl:variable name="unit1multiplier">
    <xsl:choose>
      <xsl:when test="$usemetric=1">1000</xsl:when>
      <xsl:otherwise>1609.344</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="unit1name">
    <xsl:choose>
      <xsl:when test="$usemetric=1"><xsl:text>km</xsl:text></xsl:when>
      <xsl:otherwise><xsl:text>mi</xsl:text></xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <!-- unit2 is meters or feet -->
  <xsl:variable name="unit2multiplier">
    <xsl:choose>
      <xsl:when test="$usemetric=1">1</xsl:when>
      <xsl:otherwise>3.2808399</xsl:otherwise>
    </xsl:choose>
  </xsl:variable>
  <xsl:variable name="unit2name">
    <xsl:choose>
      <xsl:when test="$usemetric=1"><xsl:text>m</xsl:text></xsl:when>
      <xsl:otherwise><xsl:text>ft</xsl:text></xsl:otherwise>
    </xsl:choose>
  </xsl:variable>


  <xsl:key name="running" match="tcx:Activity[@Sport='Running']"
    use="tcx:Id/text()"/>

  <xsl:key name="biking" match="tcx:Activity[@Sport='Biking']"
    use="tcx:Id/text()"/>

  <xsl:key name="other" match="tcx:Activity[@Sport='Other']"
    use="tcx:Id/text()"/>

  <xsl:key name="multisport" match="tcx:Activity[@Sport='Multisport']"
    use="tcx:Id/text()"/>

  <xsl:key name="course" match="tcx:Course" use="tcx:Name/text()"/>

  <xsl:variable name="boilerplate">
    Garmin Training Center to KML Converter<br/>
    &#xA9; 2007-2009 by Jörn Clausen, joern at gmail dot com<br/><br/>
    See
    <blockquote>http://www.oe-files.de/oefiles/gmaps/tcx_to_kml_html</blockquote>
    for more information
  </xsl:variable>

  <xsl:template match="/">
    <kml>
      <Document>
        <name>Garmin Training Center</name>
        <xsl:choose>
          <xsl:when test="tcx:TrainingCenterDatabase">
            <xsl:choose>
              <xsl:when test="//tcx:Position">
                <Snippet/>
                <description>
                  <xsl:copy-of select="$boilerplate"/>
                </description>
                <open>1</open>
                <visibility>0</visibility>
                <Style id="track">
                  <LineStyle>
                    <color>ff00ffff</color>
                    <width>5</width>
                  </LineStyle>
                </Style>
                <Style id="heart">
                  <PolyStyle>
                    <color>7f0000ff</color>
                  </PolyStyle>
                </Style>
                <Style id="cadence">
                  <PolyStyle>
                    <color>7f00ff00</color>
                  </PolyStyle>
                </Style>
                <Style id="hiddenFolder">
                  <ListStyle>
                    <listItemType>checkHideChildren</listItemType>
                  </ListStyle>
                </Style>
                <Style id="distPoint">
                  <IconStyle>
                    <Icon>
                      <href>http://www.oe-files.de/ge/square.png</href>
                    </Icon>
                  </IconStyle>
                </Style>
                <Style id="coursePoint">
                  <IconStyle>
                    <Icon>
                      <href>http://www.oe-files.de/ge/flag.png</href>
                    </Icon>
                    <hotSpot x="0.5" y="0.1" xunits="fraction" yunits="fraction"/>
                  </IconStyle>
                </Style>
                <xsl:apply-templates/>
              </xsl:when>
              <xsl:otherwise>
                <description>
                  <xsl:copy-of select="$boilerplate"/>
                  <hr/>
                  <strong style="color: red;">The input file contained no
                    geographical data to display on a map.</strong>
                </description>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:when>
          <xsl:otherwise>
            <xsl:choose>
              <xsl:when test="tcxv1:TrainingCenterDatabase">
                <description>
                  <xsl:copy-of select="$boilerplate"/>
                  <hr/>
                  <strong style="color: red;">Sorry, your version of Training
                    Center is not supported. <a href="http://www.garmin.com/products/trainingcenter/">Please consider upgrading it.</a></strong>
                </description>
              </xsl:when>
              <xsl:otherwise>
                <description>
                  <xsl:copy-of select="$boilerplate"/>
                  <hr/>
                  <strong style="color: red;">The input file didn't look like
                    a Garmin Training Center Database. No data to
                    process.</strong>
                </description>
              </xsl:otherwise>
            </xsl:choose>
          </xsl:otherwise>
        </xsl:choose>
      </Document>
    </kml>
  </xsl:template>

  <xsl:template match="tcx:TrainingCenterDatabase">
    <!-- if Folder is empty, still process Activities and Courses -->
    <xsl:choose>
      <xsl:when test="tcx:Folders/node()">
        <xsl:apply-templates select="tcx:Folders"/>
      </xsl:when>
      <xsl:otherwise>
        <Folder>
          <name>Running</name>
          <open>1</open>
          <visibility>0</visibility>
          <xsl:apply-templates select="tcx:Activities/tcx:Activity[@Sport='Running']"/>
        </Folder>
        <Folder>
          <name>Biking</name>
          <open>1</open>
          <visibility>0</visibility>
          <xsl:apply-templates select="tcx:Activities/tcx:Activity[@Sport='Biking']"/>
        </Folder>
        <Folder>
          <name>Other</name>
          <open>1</open>
          <visibility>0</visibility>
          <xsl:apply-templates select="tcx:Activities/tcx:Activity[@Sport='Other']"/>
        </Folder>
        <Folder>
          <name>MultiSport</name>
          <open>1</open>
          <visibility>0</visibility>
          <xsl:apply-templates select="tcx:Activities/tcx:Activity[@Sport='MultiSport']"/>
        </Folder>
        <Folder>
          <name>Courses</name>
          <open>1</open>
          <visibility>0</visibility>
          <xsl:apply-templates select="tcx:Courses"/>
        </Folder>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="tcx:History|tcx:Courses">
    <Folder>
      <name><xsl:value-of select="name()"/></name>
      <open>1</open>
      <visibility>0</visibility>
      <xsl:apply-templates/>
    </Folder>
  </xsl:template>

  <xsl:template match="tcx:Workouts"/>

  <xsl:template match="tcx:Running|tcx:Biking|tcx:Other|tcx:MultiSport|tcx:Folder|tcx:CourseFolder">
    <Folder>
      <name><xsl:value-of select="@Name"/></name>
      <open>1</open>
      <visibility>0</visibility>
      <xsl:apply-templates/>
    </Folder>
  </xsl:template>

  <xsl:template match="tcx:Running//tcx:ActivityRef">
    <xsl:apply-templates select="key('running',tcx:Id/text())"/>
  </xsl:template>

  <xsl:template match="tcx:Biking//tcx:ActivityRef">
    <xsl:apply-templates select="key('biking',tcx:Id/text())"/>
  </xsl:template>

  <xsl:template match="tcx:Other//tcx:ActivityRef">
    <xsl:apply-templates select="key('other',tcx:Id/text())"/>
  </xsl:template>

  <xsl:template match="tcx:MultiSport//tcx:ActivityRef">
    <xsl:apply-templates select="key('multisport',tcx:Id/text())"/>
  </xsl:template>

  <xsl:template match="tcx:Activity[tcx:Lap/tcx:Track/tcx:Trackpoint/tcx:Position]">
    <xsl:if test="sum(tcx:Lap/tcx:DistanceMeters) &gt; 0">
      <Folder>
        <name>
          <xsl:value-of select="substring-before(tcx:Id,'T')"/>
          <xsl:text> (</xsl:text>
          <xsl:call-template name="distance">
            <xsl:with-param name="meters" select="sum(tcx:Lap/tcx:DistanceMeters)"/>
          </xsl:call-template>
          <xsl:text>)</xsl:text>
        </name>
        <Snippet/>
        <description>
          <div>Activity Summary</div>
          <table width="300">
            <tr>
              <td>Date:</td>
              <td><xsl:value-of select="substring-before(tcx:Id,'T')"/></td>
            </tr>
            <tr>
              <td>Time:</td>
              <td><xsl:value-of select="substring-after(tcx:Id,'T')"/></td>
            </tr>
            <tr>
              <td>Distance:</td>
              <td>
                <xsl:call-template name="distance">
                  <xsl:with-param name="meters" select="sum(tcx:Lap/tcx:DistanceMeters)"/>
                </xsl:call-template>
              </td>
            </tr>
            <tr>
              <td>Duration:</td>
              <td>
                <xsl:call-template name="date:duration">
                  <xsl:with-param name="seconds" select="sum(tcx:Lap/tcx:TotalTimeSeconds)"/>
                </xsl:call-template>
              </td>
            </tr>
            <tr>
              <td>Avg. Speed</td>
              <td>
                <xsl:call-template name="speed">
                  <xsl:with-param name="meters" select="sum(tcx:Lap/tcx:DistanceMeters)"/>
                  <xsl:with-param name="seconds" select="sum(tcx:Lap/tcx:TotalTimeSeconds)"/>
                </xsl:call-template>
              </td>
            </tr>
            <tr>
              <td>Calories:</td>
              <td>
                <xsl:value-of select="sum(tcx:Lap/tcx:Calories)"/>
                <xsl:text>cal</xsl:text>
              </td>
            </tr>
          </table>
          <xsl:if test="count(tcx:Lap) &gt; 1">
          <div>Lap Overview</div>
            <table width="500" border="1">
              <tr>
                <td>Lap</td>
                <td>Distance</td>
                <td>Time</td>
                <td>Avg. Speed</td>
                <td>Calories</td>
              </tr>
              <xsl:for-each select="tcx:Lap">
                <tr>
                  <td><xsl:value-of select="position()"/></td>
                  <td>
                    <xsl:call-template name="distance">
                      <xsl:with-param name="meters" select="tcx:DistanceMeters"/>
                    </xsl:call-template>
                  </td>
                  <td>
                    <xsl:call-template name="date:duration">
                      <xsl:with-param name="seconds" select="tcx:TotalTimeSeconds"/>
                    </xsl:call-template>
                  </td>
                  <td>
                    <xsl:call-template name="speed">
                      <xsl:with-param name="meters" select="tcx:DistanceMeters"/>
                      <xsl:with-param name="seconds" select="tcx:TotalTimeSeconds"/>
                    </xsl:call-template>
                  </td>
                  <td><xsl:value-of select="tcx:Calories"/><xsl:text>cal</xsl:text></td>
                </tr>
              </xsl:for-each>
            </table>
          </xsl:if>
        </description>
        <xsl:variable name="altmode">
          <xsl:choose>
            <xsl:when test="contains(tcx:Notes[1],'kml.altitude=real') or $altitude=1">
              <xsl:text>altitude</xsl:text>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>ground</xsl:text>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
        <xsl:choose>
          <xsl:when test="count(tcx:Lap) &gt; 1">
            <Folder>
              <name>Tracks</name>
              <xsl:apply-templates select="tcx:Lap" mode="activity">
                <xsl:with-param name="data">track</xsl:with-param>
                <xsl:with-param name="type">multi</xsl:with-param>
                <xsl:with-param name="altmode" select="$altmode"/>
              </xsl:apply-templates>
            </Folder>
          </xsl:when>
          <xsl:otherwise>
            <xsl:apply-templates select="tcx:Lap" mode="activity">
              <xsl:with-param name="data">track</xsl:with-param>
              <xsl:with-param name="type">single</xsl:with-param>
              <xsl:with-param name="altmode" select="$altmode"/>
            </xsl:apply-templates>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:if test="tcx:Lap/tcx:Track/tcx:Trackpoint/tcx:DistanceMeters">
          <Folder>
            <name>Distance Markers</name>
            <xsl:choose>
              <xsl:when test="count(tcx:Lap) &gt; 1">
                <xsl:apply-templates select="tcx:Lap" mode="distance">
                  <xsl:with-param name="type">multi</xsl:with-param>
                  <xsl:with-param name="altmode" select="$altmode"/>
                </xsl:apply-templates>
              </xsl:when>
              <xsl:otherwise>
                <xsl:apply-templates select="tcx:Lap" mode="distance">
                  <xsl:with-param name="type">single</xsl:with-param>
                  <xsl:with-param name="altmode" select="$altmode"/>
                </xsl:apply-templates>
              </xsl:otherwise>
            </xsl:choose>
          </Folder>
        </xsl:if>
        <xsl:if test="tcx:Lap/tcx:Track/tcx:Trackpoint/tcx:HeartRateBpm">
          <xsl:choose>
            <xsl:when test="count(tcx:Lap) &gt; 1">
              <Folder>
              <name>Heart Rate</name>
                <xsl:apply-templates select="tcx:Lap" mode="activity">
                  <xsl:with-param name="data">heart</xsl:with-param>
                  <xsl:with-param name="type">multi</xsl:with-param>
                </xsl:apply-templates>
              </Folder>
            </xsl:when>
            <xsl:otherwise>
              <xsl:apply-templates select="tcx:Lap" mode="activity">
                <xsl:with-param name="data">heart</xsl:with-param>
                <xsl:with-param name="type">single</xsl:with-param>
              </xsl:apply-templates>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:if>
        <xsl:if test="tcx:Lap/tcx:Track/tcx:Trackpoint/tcx:Cadence">
        <xsl:choose>
            <xsl:when test="count(tcx:Lap) &gt; 1">
              <Folder>
                <name>Cadence</name>
                <xsl:apply-templates select="tcx:Lap" mode="activity">
                  <xsl:with-param name="data">cadence</xsl:with-param>
                  <xsl:with-param name="type">multi</xsl:with-param>
                </xsl:apply-templates>
              </Folder>
            </xsl:when>
            <xsl:otherwise>
              <xsl:apply-templates select="tcx:Lap" mode="activity">
                <xsl:with-param name="data">cadence</xsl:with-param>
                <xsl:with-param name="type">single</xsl:with-param>
              </xsl:apply-templates>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:if>
      </Folder>
    </xsl:if>
  </xsl:template>

  <xsl:template match="tcx:CourseFolder//tcx:CourseNameRef">
    <xsl:apply-templates select="key('course',tcx:Id/text())"/>
  </xsl:template>

  <xsl:template match="tcx:Course[tcx:Track/tcx:Trackpoint/tcx:Position]">
    <Folder>
      <name>
        <xsl:value-of select="tcx:Name"/>
        <xsl:text> (</xsl:text>
        <xsl:call-template name="distance">
          <xsl:with-param name="meters" select="sum(tcx:Lap/tcx:DistanceMeters)"/>
        </xsl:call-template>
        <xsl:text>)</xsl:text>
      </name>
      <xsl:if test="tcx:Lap">
        <Snippet/>
        <description>
          <div>Course Summary</div>
          <table width="300">
            <tr>
              <td>Distance:</td>
              <td>
                <xsl:call-template name="distance">
                  <xsl:with-param name="meters" select="sum(tcx:Lap/tcx:DistanceMeters)"/>
                </xsl:call-template>
              </td>
            </tr>
            <tr>
              <td>Duration:</td>
              <td>
                <xsl:call-template name="date:duration">
                  <xsl:with-param name="seconds" select="sum(tcx:Lap/tcx:TotalTimeSeconds)"/>
                </xsl:call-template>
              </td>
            </tr>
            <tr>
              <td>Avg. Speed</td>
              <td>
                <xsl:call-template name="speed">
                  <xsl:with-param name="meters" select="sum(tcx:Lap/tcx:DistanceMeters)"/>
                  <xsl:with-param name="seconds" select="sum(tcx:Lap/tcx:TotalTimeSeconds)"/>
                </xsl:call-template>
              </td>
            </tr>
          </table>
          <xsl:if test="count(tcx:Lap) &gt; 1">
            <div>Lap Overview</div>
            <table width="500" border="1">
              <tr>
                <td>Lap</td>
                <td>Distance</td>
                <td>Time</td>
                <td>Avg. Speed</td>
              </tr>
              <xsl:for-each select="tcx:Lap">
                <tr>
                  <td><xsl:value-of select="position()"/></td>
                  <td>
                    <xsl:call-template name="distance">
                      <xsl:with-param name="meters" select="tcx:DistanceMeters"/>
                    </xsl:call-template>
                  </td>
                  <td>
                    <xsl:call-template name="date:duration">
                      <xsl:with-param name="seconds" select="tcx:TotalTimeSeconds"/>
                    </xsl:call-template>
                  </td>
                  <td>
                    <xsl:call-template name="speed">
                      <xsl:with-param name="meters" select="tcx:DistanceMeters"/>
                      <xsl:with-param name="seconds" select="tcx:TotalTimeSeconds"/>
                    </xsl:call-template>
                  </td>
                </tr>
              </xsl:for-each>
            </table>
          </xsl:if>
        </description>
      </xsl:if>
      <Placemark>
        <name>Track</name>
        <styleUrl>track</styleUrl>
        <LineString>
          <tessellate>1</tessellate>
          <altitudeMode>relativeToGround</altitudeMode>
          <coordinates>
            <xsl:apply-templates select="tcx:Track/tcx:Trackpoint[tcx:Position]">
              <xsl:with-param name="data">track</xsl:with-param>
            </xsl:apply-templates>
          </coordinates>
        </LineString>
      </Placemark>
      <xsl:apply-templates select="tcx:Lap" mode="course"/>
      <xsl:if test="tcx:Track/tcx:Trackpoint/tcx:DistanceMeters">
        <Folder>
          <name>Distance Markers</name>
          <xsl:apply-templates select="." mode="distance">
            <xsl:with-param name="type">single</xsl:with-param>
          </xsl:apply-templates>
        </Folder>
      </xsl:if>
      <xsl:if test="tcx:CoursePoint">
        <Folder>
          <visibility>0</visibility>
          <name>Course Points</name>
          <xsl:apply-templates select="tcx:CoursePoint"/>
        </Folder>
      </xsl:if>
    </Folder>
  </xsl:template>

  <xsl:template match="tcx:Lap" mode="activity">
    <xsl:param name="data">track</xsl:param>
    <xsl:param name="type">multi</xsl:param>
    <xsl:param name="altmode">ground</xsl:param>
    <Placemark>
      <name>
        <xsl:choose>
          <xsl:when test="$type='multi'">
            <xsl:text>Lap </xsl:text>
            <xsl:value-of select="position()"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:choose>
              <xsl:when test="$data='track'">Track</xsl:when>
              <xsl:when test="$data='heart'">Heart Rate</xsl:when>
              <xsl:when test="$data='cadence'">Cadence</xsl:when>
            </xsl:choose>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:text> (</xsl:text>
        <xsl:choose>
          <xsl:when test="$data='track'">
            <xsl:call-template name="speed">
              <xsl:with-param name="meters" select="tcx:DistanceMeters"/>
              <xsl:with-param name="seconds" select="tcx:TotalTimeSeconds"/>
            </xsl:call-template>
          </xsl:when>
          <xsl:when test="$data='heart'">
            <xsl:value-of select="tcx:Calories"/>
            <xsl:text>cal</xsl:text>
          </xsl:when>
          <xsl:when test="$data='cadence'">
            <xsl:value-of select="math:min(tcx:Track/tcx:Trackpoint/tcx:Cadence)"/>
            <xsl:text>-</xsl:text>
            <xsl:value-of select="math:max(tcx:Track/tcx:Trackpoint/tcx:Cadence)"/>
            <xsl:text>rpm</xsl:text>
          </xsl:when>
        </xsl:choose>
        <xsl:text>)</xsl:text>
      </name>
      <xsl:if test="$data!='track'">
        <visibility>0</visibility>
      </xsl:if>
      <styleUrl><xsl:value-of select="$data"/></styleUrl>
      <LineString>
        <tessellate>1</tessellate>
        <xsl:if test="$data='heart' or $data='cadence'">
          <extrude>1</extrude>
        </xsl:if>
        <xsl:choose>
          <xsl:when test="$altmode='altitude'">
            <altitudeMode>absolute</altitudeMode>
          </xsl:when>
          <xsl:otherwise>
            <altitudeMode>relativeToGround</altitudeMode>
          </xsl:otherwise>
        </xsl:choose>
        <coordinates>
          <xsl:choose>
            <xsl:when test="$data='track'">
              <xsl:apply-templates select="tcx:Track/tcx:Trackpoint[tcx:Position]">
                <xsl:with-param name="data" select="$data"/>
                <xsl:with-param name="altmode" select="$altmode"/>
              </xsl:apply-templates>
            </xsl:when>
            <xsl:when test="$data='heart'">
              <xsl:apply-templates select="tcx:Track/tcx:Trackpoint[tcx:HeartRateBpm/tcx:Value]">
                <xsl:with-param name="data" select="$data"/>
              </xsl:apply-templates>
            </xsl:when>
            <xsl:when test="$data='cadence'">
              <xsl:apply-templates select="tcx:Track/tcx:Trackpoint[tcx:Cadence]">
                <xsl:with-param name="data" select="$data"/>
              </xsl:apply-templates>
            </xsl:when>
          </xsl:choose>
        </coordinates>
      </LineString>
    </Placemark>
  </xsl:template>

  <xsl:template match="tcx:Lap|tcx:Course" mode="distance">
    <xsl:param name="type">multi</xsl:param>
    <xsl:param name="altmode">ground</xsl:param>
    <xsl:choose>
      <xsl:when test="$type='multi'">
        <Folder>
          <name>
            <xsl:text>Lap </xsl:text>
            <xsl:value-of select="position()"/>
          </name>
          <xsl:apply-templates select="tcx:Track/tcx:Trackpoint[tcx:DistanceMeters]" mode="distance">
            <xsl:with-param name="altmode" select="$altmode"/>
          </xsl:apply-templates>
        </Folder>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="tcx:Track/tcx:Trackpoint[tcx:DistanceMeters]" mode="distance">
          <xsl:with-param name="altmode" select="$altmode"/>
        </xsl:apply-templates>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="tcx:Trackpoint" mode="distance">
    <xsl:param name="altmode" select="ground"/>
    <xsl:variable name="thisdist" select="tcx:DistanceMeters"/>
    <xsl:variable name="thatdist" select="following-sibling::tcx:Trackpoint[tcx:DistanceMeters][1]/tcx:DistanceMeters"/>
    <xsl:if test="$thisdist and $thatdist">
      <xsl:if test="floor($thisdist div $unit1multiplier) != floor($thatdist div $unit1multiplier)">
        <xsl:variable name="floordist" select="floor($thatdist div $unit1multiplier)"/>
        <xsl:variable name="intdist" select="$floordist * $unit1multiplier"/>
        <xsl:variable name="thislon" select="tcx:Position/tcx:LongitudeDegrees"/>
        <xsl:variable name="thislat" select="tcx:Position/tcx:LatitudeDegrees"/>
        <xsl:variable name="thisalt" select="tcx:AltitudeMeters"/>
        <xsl:variable name="thatlon" select="following-sibling::tcx:Trackpoint[1]/tcx:Position/tcx:LongitudeDegrees"/>
        <xsl:variable name="thatlat" select="following-sibling::tcx:Trackpoint[1]/tcx:Position/tcx:LatitudeDegrees"/>
        <xsl:variable name="thatalt" select="following-sibling::tcx:Trackpoint[1]/tcx:AltitudeMeters"/>
        <xsl:variable name="lonsina" select="($thislon - $thatlon) div ($thisdist - $thatdist)"/>
        <xsl:variable name="intlon" select="$thislon - $lonsina * ($thisdist - $intdist)"/>
        <xsl:variable name="latsina" select="($thislat - $thatlat) div ($thisdist - $thatdist)"/>
        <xsl:variable name="intlat" select="$thislat - $latsina * ($thisdist - $intdist)"/>
        <xsl:variable name="intalt">
          <xsl:choose>
            <xsl:when test="$altmode='altitude'">
              <xsl:variable name="altsina" select="($thisalt - $thatalt) div ($thisdist - $thatdist)"/>
              <xsl:value-of select="$thisalt - $altsina * ($thisdist - $intdist)"/>
            </xsl:when>
            <xsl:otherwise>1</xsl:otherwise>
          </xsl:choose>
        </xsl:variable>
        <xsl:if test="$intlon and $intlat">
          <xsl:variable name="point">
            <xsl:call-template name="showPosition">
              <xsl:with-param name="lon" select="$intlon"/>
              <xsl:with-param name="lat" select="$intlat"/>
              <xsl:with-param name="alt" select="$intalt"/>
            </xsl:call-template>
          </xsl:variable>
          <xsl:if test="$point != ''">
            <Placemark>
              <visibility>0</visibility>
              <name><xsl:value-of select="$floordist"/><xsl:value-of select="$unit1name"/></name>
              <styleUrl>distPoint</styleUrl>
              <Point>
                <xsl:choose>
                  <xsl:when test="$altmode='altitude'">
                    <altitudeMode>absolute</altitudeMode>
                  </xsl:when>
                  <xsl:otherwise>
                    <altitudeMode>relativeToGround</altitudeMode>
                  </xsl:otherwise>
                </xsl:choose>
                <coordinates><xsl:value-of select="$point"/></coordinates>
              </Point>
            </Placemark>
          </xsl:if>
        </xsl:if>
      </xsl:if>
    </xsl:if>
  </xsl:template>

  <xsl:template match="tcx:Lap" mode="course">
    <Folder>
      <styleUrl>hiddenFolder</styleUrl>
      <visibility>0</visibility>
      <name>
        <xsl:text>Lap </xsl:text>
        <xsl:value-of select="position()"/>
        <xsl:text> (</xsl:text>
        <xsl:call-template name="distance">
          <xsl:with-param name="meters" select="tcx:DistanceMeters"/>
        </xsl:call-template>
        <xsl:text>)</xsl:text>
      </name>
      <xsl:if test="tcx:BeginPosition">
        <xsl:variable name="point">
          <xsl:call-template name="showPosition">
            <xsl:with-param name="lon" select="tcx:BeginPosition/tcx:LongitudeDegrees"/>
            <xsl:with-param name="lat" select="tcx:BeginPosition/tcx:LatitudeDegrees"/>
            <xsl:with-param name="alt">1</xsl:with-param>
          </xsl:call-template>
        </xsl:variable>
        <xsl:if test="$point != ''">
          <Placemark>
            <name>
              <xsl:text>Start Lap </xsl:text>
              <xsl:value-of select="position()"/>
            </name>
            <Point>
              <coordinates><xsl:value-of select="$point"/></coordinates>
            </Point>
          </Placemark>
        </xsl:if>
      </xsl:if>
      <xsl:if test="tcx:EndPosition">
        <xsl:variable name="point">
          <xsl:call-template name="showPosition">
            <xsl:with-param name="lon" select="tcx:EndPosition/tcx:LongitudeDegrees"/>
            <xsl:with-param name="lat" select="tcx:EndPosition/tcx:LatitudeDegrees"/>
            <xsl:with-param name="alt">1</xsl:with-param>
          </xsl:call-template>
        </xsl:variable>
        <xsl:if test="$point != ''">
          <Placemark>
            <name>
              <xsl:text>End Lap </xsl:text>
              <xsl:value-of select="position()"/>
            </name>
            <Point>
              <coordinates><xsl:value-of select="$point"/></coordinates>
            </Point>
          </Placemark>
        </xsl:if>
      </xsl:if>
    </Folder>
  </xsl:template>

  <xsl:template match="tcx:Trackpoint">
    <xsl:param name="data" select="track"/>
    <xsl:param name="altmode" select="ground"/>
    <xsl:call-template name="showPosition">
      <xsl:with-param name="lon" select="tcx:Position/tcx:LongitudeDegrees"/>
      <xsl:with-param name="lat" select="tcx:Position/tcx:LatitudeDegrees"/>
      <xsl:with-param name="alt">
        <xsl:choose>
          <xsl:when test="$altmode='altitude'">
            <xsl:value-of select="tcx:AltitudeMeters"/>
          </xsl:when>
          <xsl:when test="$data='heart'">
            <xsl:value-of select="tcx:HeartRateBpm/tcx:Value"/>
          </xsl:when>
          <xsl:when test="$data='cadence'">
            <xsl:value-of select="tcx:Cadence"/>
          </xsl:when>
          <xsl:otherwise>1</xsl:otherwise>
        </xsl:choose>
      </xsl:with-param>
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="tcx:CoursePoint">
    <xsl:variable name="point">
      <xsl:call-template name="showPosition">
        <xsl:with-param name="lon" select="tcx:Position/tcx:LongitudeDegrees"/>
        <xsl:with-param name="lat" select="tcx:Position/tcx:LatitudeDegrees"/>
      </xsl:call-template>
    </xsl:variable>
    <xsl:if test="$point != ''">
      <Placemark>
        <name><xsl:value-of select="tcx:Name"/></name>
        <styleUrl>coursePoint</styleUrl>
        <Point>
          <coordinates><xsl:value-of select="$point"/></coordinates>
        </Point>
      </Placemark>
    </xsl:if>
  </xsl:template>

  <xsl:template name="showPosition">
    <xsl:param name="lon"/>
    <xsl:param name="lat"/>
    <xsl:param name="alt">1</xsl:param>
    <xsl:if test="($lon &lt; $bblonmin or $lon &gt; $bblonmax) or ($lat &lt; $bblatmin or $lat &gt; $bblatmax)">
      <xsl:value-of select="$lon"/>
      <xsl:text>,</xsl:text>
      <xsl:value-of select="$lat"/>
      <xsl:text>,</xsl:text>
      <xsl:value-of select="$alt"/>
      <xsl:text> </xsl:text>
    </xsl:if>
  </xsl:template>



  <xsl:template name="date:duration">
    <!-- shamelessly stolen from Jeni Tennison at
    http://www.exslt.org/date/functions/duration/date.duration.template.xsl -->
    <xsl:param name="seconds"/>
    <xsl:variable name="duration">
      <xsl:variable name="day-s" select="60 * 60 * 24" />
      <xsl:variable name="hour-s" select="60 * 60" />
      <xsl:variable name="min-s" select="60" />
      <xsl:if test="$seconds &lt; 0">-</xsl:if>
      <xsl:variable name="s" select="$seconds * ((($seconds >= 0) * 2) - 1)" />
      <xsl:variable name="days" select="floor($s div $day-s)" />
      <xsl:variable name="hours" select="floor(($s - ($days * $day-s)) div $hour-s)" />
      <xsl:variable name="mins" select="floor(($s - ($days * $day-s) - ($hours * $hour-s)) div $min-s)" />
      <xsl:variable name="secs" select="$s - ($days * $day-s) - ($hours * $hour-s) - ($mins * $min-s)" />
      <xsl:if test="$days">
        <xsl:value-of select="$days" />
        <xsl:text>d </xsl:text>
      </xsl:if>
      <xsl:if test="$hours">
        <xsl:value-of select="$hours" />
        <xsl:text>h </xsl:text>
      </xsl:if>
      <xsl:if test="$mins">
        <xsl:value-of select="$mins" />
        <xsl:text>min </xsl:text>
      </xsl:if>
      <xsl:if test="$secs">
        <xsl:value-of select="round($secs)" />
        <xsl:text>sec</xsl:text>
      </xsl:if>
    </xsl:variable>
    <xsl:value-of select="$duration" />
  </xsl:template>

  <xsl:template name="distance">
    <xsl:param name="meters"/>
    <xsl:variable name="distance">
      <xsl:variable name="unit1" select="floor($meters div $unit1multiplier)"/>
      <xsl:variable name="unit2" select="round(($meters - $unit1 * $unit1multiplier) * $unit2multiplier)"/>
      <xsl:if test="$unit1">
        <xsl:value-of select="$unit1"/>
        <xsl:value-of select="$unit1name"/>
        <xsl:text> </xsl:text>
      </xsl:if>
      <xsl:if test="$unit2">
        <xsl:value-of select="$unit2"/>
        <xsl:value-of select="$unit2name"/>
      </xsl:if>
    </xsl:variable>
    <xsl:value-of select="$distance"/>
  </xsl:template>

  <xsl:template name="speed">
    <xsl:param name="meters"/>
    <xsl:param name="seconds"/>
    <xsl:variable name="speed">
      <xsl:variable name="speed-meters-per-second" select="$meters div $seconds"/>
      <xsl:variable name="speed-unit1-per-hour" select="format-number($speed-meters-per-second * 3600 div $unit1multiplier,'#.##') "/>
      <xsl:value-of select="$speed-unit1-per-hour"/>
      <xsl:value-of select="$unit1name"/>
      <xsl:text>/h</xsl:text>
    </xsl:variable>
    <xsl:value-of select="$speed"/>
  </xsl:template>

</xsl:stylesheet>
