<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:cif="cif">
    <xsl:param name="xslShowHelp" select="cif:xslShowHelp"/>
    <xsl:strip-space elements="*"/>
    
    <xsl:param name="decimal-format">US</xsl:param>
    <xsl:decimal-format name="US" decimal-separator="." grouping-separator="," />
    <xsl:variable name="decimal-format-pattern">
      <xsl:choose>
          <xsl:when test="$decimal-format='US'">#,###.0000</xsl:when>
      </xsl:choose>
    </xsl:variable>

    <xsl:output method="text" media-type="text/plain" encoding="iso-8859-1"/>
    <xsl:template match="/">
        <xsl:variable name="gridOut" select="cif:SetGridOut(number(InRoads/@outputGridScaleFactor))"/>
        <xsl:choose>
            <xsl:when test="$xslShowHelp = 'true'">
                <xsl:call-template name="StyleSheetHelp"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:for-each select="InRoads">
                    <xsl:text/>
                    <xsl:for-each select="GeometryProject">
                        <xsl:for-each select="HorizontalAlignment">
                            <xsl:text>&#xd;Beginning alignment </xsl:text><xsl:value-of select="@name"/>
                            <xsl:text> description</xsl:text>
                            <xsl:text>&#xd;============================================================</xsl:text>
                            <xsl:text>&#xd; &#xd;</xsl:text>
                            <xsl:apply-templates select="//HorizontalLine | //HorizontalCircle"/>
                            <xsl:text>&#xd; &#xd;============================================================</xsl:text>
                            <xsl:text>&#xd;Ending alignment </xsl:text><xsl:value-of select="@name"/>
                            <xsl:text> description&#xd; </xsl:text>
                        </xsl:for-each>
                    </xsl:for-each>
                </xsl:for-each>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!-- Horizontal Linear Data -->
    <xsl:template match="HorizontalLine">
        <xsl:if test="Start/@pointType = 'POB'">
           <xsl:value-of select="cif:pointType(string(Start/@pointType))"/>
           <xsl:text> (</xsl:text>
           <xsl:choose>
               <xsl:when test="Start/@name">
                   <xsl:value-of select="string(Start/@name)"/>
               </xsl:when>
               <xsl:otherwise>
                   <xsl:value-of select="concat('    ', '    ')"/>
               </xsl:otherwise>
           </xsl:choose>
           <xsl:text>)</xsl:text>

           <xsl:text>   N </xsl:text>
           <xsl:value-of select="format-number(cif:ordinateFormat(number(Start/@northing)), $decimal-format-pattern, $decimal-format)"/>
           <xsl:text>   E </xsl:text>
           <xsl:value-of select="format-number(cif:ordinateFormat(number(Start/@easting)), $decimal-format-pattern, $decimal-format)"/>
           <xsl:text> Sta </xsl:text>
           <xsl:value-of select="cif:stationFormat(number(Start/station/@externalStation), string(Start/station/@externalStationName))"/>
           <xsl:text>&#xd; </xsl:text>

           <xsl:if test="End/@pointType != 'POE'">
               <xsl:text>&#xd;Course from </xsl:text>
               <xsl:value-of select="cif:pointType(string(Start/@pointType))"/>
               <xsl:text> to </xsl:text>

               <xsl:value-of select="cif:pointType(string(following-sibling::*[1]/Start/@pointType))"/>
               <xsl:text> </xsl:text>

               <xsl:value-of select="string(cif:directionFormat(number(@direction)))"/>
               <xsl:text> Dist </xsl:text>
               <xsl:value-of select="format-number(cif:distanceFormat(number(@length)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>
               <xsl:text>&#xd; </xsl:text>
           </xsl:if>
        </xsl:if>
        
        <xsl:if test="End/@pointType != 'POE' and Start/@pointType != 'PI' and Start/@pointType != 'POB'">
            <xsl:text>&#xd;Course from </xsl:text>
            <xsl:value-of select="cif:pointType(string(Start/@pointType))"/>
            <xsl:text> to </xsl:text>
            
            <xsl:value-of select="cif:pointType(string(End/@pointType))"/>
            <xsl:text> </xsl:text>
            
            <xsl:value-of select="string(cif:directionFormat(number(@direction)))"/>
            <xsl:text> Dist </xsl:text>
            <xsl:value-of select="format-number(cif:distanceFormat(number(@length)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>
            <xsl:text>&#xd; </xsl:text>            
        </xsl:if>

        <xsl:if test="Start/@pointType = 'PI'">
            <xsl:if test="StationEquation">
                <xsl:for-each select="StationEquation">
                    <xsl:text>&#xd;                                                                           End Region </xsl:text>
                    <xsl:value-of select="substring(string(@backEquation), string-length(string(@backEquation)) -1)" />
                    <xsl:text>&#xd;Equation: Sta </xsl:text>
                    <xsl:value-of select="cif:stationFormat(number(@backStation), string(@backEquation))"/>
                    <xsl:text> (BK) = Sta </xsl:text>
                    <xsl:value-of select="cif:stationFormat(number(@aheadStation), string(@aheadEquation))"/>
                    <xsl:text> (AH) ----------------</xsl:text>
                    <xsl:text>&#xd;                                                                           Begin Region </xsl:text>
                    <xsl:value-of select="substring(string(@aheadEquation), string-length(string(@aheadEquation)) - 1)" />
                    <xsl:text>&#xd; </xsl:text>
                </xsl:for-each>
            </xsl:if>

            <xsl:if test="End/@pointType != 'POE'"> 
                <xsl:text>&#xd;Point </xsl:text>
                <xsl:value-of select="cif:pointType(string(Start/@pointType))"/>
                
                <xsl:text>   N </xsl:text>
                <xsl:value-of select="format-number(cif:ordinateFormat(number(Start/@northing)), $decimal-format-pattern, $decimal-format)"/>
                
                <xsl:text>   E </xsl:text>
                <xsl:value-of select="format-number(cif:ordinateFormat(number(Start/@easting)), $decimal-format-pattern, $decimal-format)"/>
                
                <xsl:text> Sta </xsl:text>
                <xsl:value-of select="cif:stationFormat(number(Start/station/@externalStation), string(Start/station/@externalStationName))"/>
                <xsl:text>&#xd; </xsl:text>
                
                <xsl:text>&#xd;Course from </xsl:text>
                <xsl:value-of select="cif:pointType(string(preceding-sibling::*[1]/End/@pointType))"/>
                <xsl:text> to </xsl:text>
                
                <xsl:value-of select="cif:pointType(string(following-sibling::*[1]/Start/@pointType))"/>
                <xsl:text> </xsl:text>
                
                <xsl:value-of select="string(cif:directionFormat(number(following-sibling::*[1]/@direction)))"/>
                <xsl:text> Dist </xsl:text>
                <xsl:value-of select="format-number(cif:distanceFormat(number(@length)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>
                <xsl:text>&#xd; </xsl:text>
            </xsl:if>
            
            <xsl:if test="End/@pointType = 'POE'">
                <xsl:text>&#xd;Point </xsl:text>
                <xsl:value-of select="cif:pointType(string(Start/@pointType))"/>
                
                <xsl:text>   N </xsl:text>
                <xsl:value-of select="format-number(cif:ordinateFormat(number(Start/@northing)), $decimal-format-pattern, $decimal-format)"/>
                
                <xsl:text>   E </xsl:text>
                <xsl:value-of select="format-number(cif:ordinateFormat(number(Start/@easting)), $decimal-format-pattern, $decimal-format)"/>
                
                <xsl:text> Sta </xsl:text>
                <xsl:value-of select="cif:stationFormat(number(Start/station/@externalStation), string(Start/station/@externalStationName))"/>
                <xsl:text>&#xd; </xsl:text>
            </xsl:if>
        </xsl:if>

        <xsl:if test="position() = last()">
            <xsl:text>&#xd;Course from </xsl:text>
            <xsl:value-of select="cif:pointType(string(Start/@pointType))"/>
            <xsl:text> to </xsl:text>
            
            <xsl:value-of select="cif:pointType(string(End/@pointType))"/>
            <xsl:text> </xsl:text>
            
            <xsl:value-of select="string(cif:directionFormat(number(@direction)))"/>
            <xsl:text> Dist </xsl:text>
            <xsl:value-of select="format-number(cif:distanceFormat(number(@length)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>
            <xsl:text>&#xd; &#xd; </xsl:text>
            
            <xsl:value-of select="cif:pointType(string(End/@pointType))"/>
            <xsl:text> (</xsl:text>
            <xsl:choose>
                <xsl:when test="End/@name">
                    <xsl:value-of select="string(End/@name)"/>
                </xsl:when>
                <xsl:otherwise><xsl:value-of select="concat('    ', '    ')"/></xsl:otherwise>
            </xsl:choose>
            <xsl:text>)</xsl:text>
            <xsl:text>   N </xsl:text>
            <xsl:value-of select="format-number(cif:ordinateFormat(number(End/@northing)), $decimal-format-pattern, $decimal-format)"/>
            <xsl:text>   E </xsl:text>
            <xsl:value-of select="format-number(cif:ordinateFormat(number(End/@easting)), $decimal-format-pattern, $decimal-format)"/>
            <xsl:text> Sta </xsl:text>
            <xsl:value-of select="cif:stationFormat(number(End/station/@externalStation), string(End/station/@externalStationName))"/>
        </xsl:if>
    </xsl:template>


    <!-- Horizontal Circular Data -->
    <xsl:template match="HorizontalCircle">
    
        <xsl:text>&#xd;            Curve Data</xsl:text>
        <xsl:text>&#xd;           *----------*</xsl:text>
        <xsl:text>&#xd;P.I. Station </xsl:text>
        <xsl:value-of select="cif:stationFormat(number(PI/station/@externalStation), string(PI/station/@externalStationName))"/>
        <xsl:text>   N </xsl:text>
        <xsl:value-of select="format-number(cif:ordinateFormat(number(PI/@northing)), $decimal-format-pattern, $decimal-format)"/>
        <xsl:text>   E </xsl:text>
        <xsl:value-of select="format-number(cif:ordinateFormat(number(PI/@easting)), $decimal-format-pattern, $decimal-format)"/>

        <xsl:text>&#xd;Delta = </xsl:text>
        <xsl:value-of select="cif:angularFormat(number(@delta), 30)"/>
          <xsl:if test="@rotationDirection='cw'"><xsl:text> (RT)</xsl:text></xsl:if>
          <xsl:if test="@rotationDirection='ccw'"><xsl:text> (LT)</xsl:text></xsl:if>
        <xsl:text>&#xd;Degree = </xsl:text>
        <xsl:value-of select="cif:angularFormat(number(@degreeOfCurve))"/>

        <xsl:if test="@tangentLength != -1.">
          <xsl:text>&#xd;Tangent = </xsl:text>
          <xsl:value-of select="format-number(cif:distanceFormat(number(@tangentLength)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>
        </xsl:if>
        <xsl:text>&#xd;Length = </xsl:text>
        <xsl:value-of select="format-number(cif:distanceFormat(number(@length)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>

        <xsl:if test="@tangentLength != -1.">
          <xsl:text>&#xd;Radius = </xsl:text>
          <xsl:value-of select="format-number(cif:distanceFormat(number(@radius)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>
          <xsl:text>&#xd;External = </xsl:text>
          <xsl:value-of select="format-number(cif:distanceFormat(number(@externalDistance)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>
          <xsl:text>&#xd;Long Chord = </xsl:text>
          <xsl:value-of select="format-number(cif:distanceFormat(number(@chord)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>
          <xsl:text>&#xd;Middle Ordinate = </xsl:text>
          <xsl:value-of select="format-number(cif:distanceFormat(number(@middleOrdinate)), $decimal-format-pattern, $decimal-format)"/><xsl:text>'</xsl:text>
        </xsl:if>

        <xsl:text>&#xd;P.C. Station </xsl:text>
        <xsl:value-of select="cif:stationFormat(number(Start/station/@externalStation), string(Start/station/@externalStationName))"/>
        <xsl:text>   N </xsl:text>
        <xsl:value-of select="format-number(cif:ordinateFormat(number(Start/@northing)), $decimal-format-pattern, $decimal-format)"/>
        <xsl:text>   E </xsl:text>
        <xsl:value-of select="format-number(cif:ordinateFormat(number(Start/@easting)), $decimal-format-pattern, $decimal-format)"/>

        <xsl:text>&#xd;P.T. Station </xsl:text>
        <xsl:value-of select="cif:stationFormat(number(End/station/@externalStation), string(Start/station/@externalStationName))"/>
        <xsl:text>   N </xsl:text>
        <xsl:value-of select="format-number(cif:ordinateFormat(number(End/@northing)), $decimal-format-pattern, $decimal-format)"/>
        <xsl:text>   E </xsl:text>
        <xsl:value-of select="format-number(cif:ordinateFormat(number(End/@easting)), $decimal-format-pattern, $decimal-format)"/>

        <xsl:text>&#xd;C.C</xsl:text>
        <xsl:text>   N </xsl:text>
        <xsl:value-of select="format-number(cif:ordinateFormat(number(Center/@northing)), $decimal-format-pattern, $decimal-format)"/>
        <xsl:text>   E </xsl:text>
        <xsl:value-of select="format-number(cif:ordinateFormat(number(Center/@easting)), $decimal-format-pattern, $decimal-format)"/>
        <xsl:text>&#xd; </xsl:text>

        <xsl:if test="StationEquation">
            <xsl:for-each select="StationEquation">
              <xsl:if test="cif:distanceFormat(number(End/station/@internalStation) - number(following-sibling::*[1]/Start/station/@internalStation)) != 0">
              <xsl:value-of select="cif:distanceFormat(number(End/station/@internalStation))"/>
                <xsl:text>&#xd;                                                                           End Region </xsl:text>
                <xsl:value-of select="substring(string(@backEquation), string-length(string(@backEquation)) -1)" />
                <xsl:text>&#xd;Equation: Sta </xsl:text>
                <xsl:value-of select="cif:stationFormat(number(@backStation), string(@backEquation))"/>
                <xsl:text> (BK) = Sta </xsl:text>
                <xsl:value-of select="cif:stationFormat(number(@aheadStation), string(@aheadEquation))"/>
                <xsl:text> (AH) ----------------</xsl:text>
                <xsl:text>&#xd;                                                                           Begin Region </xsl:text>
                <xsl:value-of select="substring(string(@aheadEquation), string-length(string(@aheadEquation)) - 1)" />
                <xsl:text>&#xd; </xsl:text>
              </xsl:if>
            </xsl:for-each>

            <xsl:text>&#xd;Point </xsl:text>
            <xsl:value-of select="cif:pointType(string(End/@pointType))"/>

            <xsl:text>   N </xsl:text>
            <xsl:value-of select="format-number(cif:ordinateFormat(number(End/@northing)), $decimal-format-pattern, $decimal-format)"/>

            <xsl:text>   E </xsl:text>
            <xsl:value-of select="format-number(cif:ordinateFormat(number(End/@easting)), $decimal-format-pattern, $decimal-format)"/>

            <xsl:text> Sta </xsl:text>
            <xsl:value-of select="cif:stationFormat(number(End/station/@externalStation), string(End/station/@externalStationName))"/>
            <xsl:text>&#xd; </xsl:text>
        </xsl:if>

    </xsl:template>

    <xsl:template name="StyleSheetHelp">
        <xsl:text>Notes&#xd;&#xd;</xsl:text>
        <xsl:text>    You must select at least one Civil horizontal element&#xd;</xsl:text>
        <xsl:text>to get results from this report.&#xd;&#xd;</xsl:text>
        <xsl:text>    Note:  This report is not suitable for alignments&#xd;</xsl:text>
        <xsl:text>    containing spirals.&#xd;&#xd;</xsl:text>
    </xsl:template>
</xsl:stylesheet>
