<?xml version="1.0"?>
<!DOCTYPE document [
	<!ENTITY bull "&#x2022;">
	<!ENTITY mdash "&#x2014;">
	<!ENTITY nbsp "&#x00A0;">
]>
<xsl:stylesheet
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:xhtml="http://www.w3.org/1999/xhtml"
	version="1.0">

	<xsl:template name="distance">
		<xsl:param name="meters" select="1"/>
		<xsl:choose>
			<xsl:when test="$meters &lt; 1">
				<xsl:value-of select="$meters * 100"/> cm
			</xsl:when>
			<xsl:when test="$meters &lt; 1000">
				<xsl:value-of select="$meters"/> m
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$meters div 1000"/> km
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template name="distance-cm">
		<xsl:param name="cm" select="100"/>
		<xsl:call-template name="distance">
			<xsl:with-param name="meters" select="$cm div 100"/>
		</xsl:call-template>
	</xsl:template>

	<xsl:template name="metric">
		<xsl:param name="value" select="1"/>
		<xsl:choose>
			<xsl:when test="$value &lt; 1000">
				<xsl:value-of select="$value"/>
			</xsl:when>
			<xsl:when test="$value &gt; 1000000000">
				<xsl:value-of select="floor($value div 1000000000)"/>B
			</xsl:when>
			<xsl:when test="$value &gt; 1000000">
				<xsl:value-of select="floor($value div 1000000)"/>M
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="floor($value div 1000)"/>k
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template name="time">
		<xsl:param name="rounds" select="1"/>
		<xsl:choose>
			<xsl:when test="$rounds=1">1 round</xsl:when>
			<xsl:when test="$rounds &lt; 10"><xsl:value-of select="$rounds"/> rounds</xsl:when>
			<xsl:when test="$rounds &lt; 600"><xsl:value-of select="round($rounds div 10)"/> min</xsl:when>
			<xsl:when test="$rounds &lt;= 7200"><xsl:value-of select="round($rounds div 600)"/> hours</xsl:when>
			<xsl:when test="$rounds &lt; 403200"><xsl:value-of select="round($rounds div 14400)"/> days</xsl:when>
			<xsl:otherwise><xsl:value-of select="round($rounds div 403200)"/> months</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template name="exp">
		<xsl:param name="mantissa" select="1"/>
		<xsl:param name="exponent" select="0"/>

		<xsl:variable name="partial">
			<xsl:if test="$exponent &gt; 0">
				<xsl:call-template name="exp">
					<xsl:with-param name="mantissa" select="$mantissa"/>
					<xsl:with-param name="exponent" select="$exponent - 1"/>
				</xsl:call-template>
			</xsl:if>
		</xsl:variable>
		<xsl:choose>
			<xsl:when test="$exponent = 0">
				<xsl:value-of select="1"/>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$mantissa*$partial"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

	<xsl:template name="progression">
		<xsl:param name="type" select="'fast'"/>
		<xsl:param name="rank" select="0"/>
		<xsl:param name="base" select="0"/>

		<xsl:variable name="r">
			<xsl:choose>
				<xsl:when test="$type = 'time'">
					<xsl:choose>
						<xsl:when test="$rank + $base = 1">1</xsl:when>
						<xsl:when test="$rank + $base = 2">5</xsl:when>
						<xsl:when test="$rank + $base = 3">10</xsl:when>
						<xsl:when test="$rank + $base = 4">100</xsl:when>
						<xsl:when test="$rank + $base = 5">600</xsl:when>
						<xsl:when test="$rank + $base = 6">7200</xsl:when>
						<xsl:when test="$rank + $base = 7">14400</xsl:when>
						<xsl:when test="$rank + $base = 8">100800</xsl:when>
						<xsl:when test="$rank + $base = 9">403200</xsl:when>
						<xsl:when test="$rank + $base = 10">2419200</xsl:when>
					</xsl:choose>
				</xsl:when>
				<xsl:otherwise>
					<xsl:call-template name="exp">
						<xsl:with-param name="mantissa">
							<xsl:choose>
								<xsl:when test="$type = 'fast'">
									<xsl:value-of select="10"/>
								</xsl:when>
								<xsl:when test="$type = 'medium'">
									<xsl:value-of select="3.16227766"/>
								</xsl:when>
								<xsl:when test="$type = 'slow'">
									<xsl:value-of select="2"/>
								</xsl:when>
								<xsl:when test="$type = 'time'">
									<!-- 5.15972 ^ 10 = 6.0000 months -->
									<xsl:value-of select="5.15972"/>
								</xsl:when>
							</xsl:choose>
						</xsl:with-param>

						<xsl:with-param name="exponent" select="-1+$rank+$base"/>
					</xsl:call-template>
				</xsl:otherwise>
			</xsl:choose>
		</xsl:variable>

		<!-- clean up "medium" prog -->
		<xsl:choose>
			<xsl:when test="$type = 'medium' and (($rank + $base) mod 2 = 0)">
				<xsl:value-of select="round($r*0.948683298)"/>
			</xsl:when>
			<xsl:otherwise><xsl:value-of select="round($r)"/></xsl:otherwise>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>
