<?xml version="1.0" encoding="UTF-8"?>
<!--
    Create a page listing all the services that are listed

    This is usually used with the command:
        xsltproc -o DocPage.php ThisFile.xsl DocPage.xml
-->
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:s="http://psepr.org/schemas/servcomp/servicedef-1.0.xsd" 
	xmlns:r="http://psepr.org/schemas/servcomp/revisions-1.0.xsd"
	xmlns:h="http://www.w3.org/1999/xhtml" 
	xmlns:foaf="http://xmlns.com/foaf/0.1/"
    >

<xsl:output 
    method="html" 
    encoding="utf-8"
    indent="yes" 
    />

<xsl:template match="/chapter">

<!-- HTML HEADER -->
<xsl:call-template name="htmlHeader"/>

<!-- BUILD INDEX -->
<xsl:call-template name="buildIndex"/>

<!-- BUILD DOCUMENT BODY -->
<xsl:call-template name="buildBody"/>

<!-- BUILD REVISION HISTORY -->
<xsl:call-template name="buildRevisions"/>

<!-- HTML FOOTER -->
<xsl:call-template name="htmlFooter"/>

</xsl:template>

<!-- =================================================================== -->
<!-- BUILD INDEX -->
<xsl:template name="buildIndex">
    <h2>Contents</h2>
    <xsl:apply-templates select="/chapter/contents" mode="index"/>
    <hr width="80%" align="center" />
</xsl:template>

<xsl:template match="contents" mode="index">
    <ul class="IndexList">
        <xsl:for-each select="section">
            <li class="IndexList">
            <xsl:element name="a">
                <xsl:attribute name="href">
                    <xsl:text>#</xsl:text><xsl:value-of select="tag"/>
                </xsl:attribute>
                <xsl:attribute name="class">
                    <xsl:text>IndexList</xsl:text>
                </xsl:attribute>
                <xsl:number level="multiple" count="section" format="1.1.1 "/>
                <xsl:value-of select="title"/>
            </xsl:element>
            <!-- optionally include 'updated' date if it appears in XML -->
            <xsl:if test="updated">
                <xsl:element name="span">
                    <xsl:attribute name="class">
                        <xsl:text>IndexUpdated</xsl:text>
                    </xsl:attribute>
                    <xsl:text> (updated </xsl:text>
                    <xsl:value-of select="updated"/>
                    <xsl:text>)</xsl:text>
                </xsl:element>
            </xsl:if>
            </li>
            <xsl:apply-templates select="contents" mode="index"/>
        </xsl:for-each>
    </ul>
</xsl:template>

<!-- =================================================================== -->
<!-- BUILD BODY  -->
<xsl:template name="buildBody">
    <xsl:apply-templates select="contents/section" mode="body"/>
</xsl:template>

<xsl:template match="section" mode="body">
    <xsl:variable name="level" select="count(ancestor::section)"/>
    <xsl:element name="a">
        <xsl:attribute name="name">
            <xsl:value-of select="tag"/>
        </xsl:attribute>
    </xsl:element>
    <xsl:element name="div">
        <xsl:attribute name="class">
            <xsl:text>Level</xsl:text><xsl:value-of select="$level + 1"/>
        </xsl:attribute>
        <h2>
            <xsl:number level="multiple" count="section" format="1.1.1 "/>
            <xsl:value-of select="title"/>
        </h2>
        <xsl:apply-templates select="contents" mode="body"/>
    </xsl:element>
</xsl:template>

<!-- a special 'ref' element that refers to a section in a chapter
         <ref c="DOC" t="TAG">TEXT</ref>
     becomes
         <a href="DOC.php#TAG">TEXT</a>
-->
<xsl:template match="ref" mode="body">
    <xsl:element name="a">
        <xsl:attribute name="href">
            <xsl:if test="@c">
                <xsl:value-of select="@c"/><xsl:text>.php</xsl:text>
            </xsl:if>
            <xsl:text>#</xsl:text><xsl:value-of select="@t"/>
        </xsl:attribute>
        <xsl:apply-templates mode="body"/>
    </xsl:element>
</xsl:template>

<!-- create anchors for any keyword tags in the body
    These tags are referenced by <kref>'s
        <ktag>TAG</ktag>
    becomes
        <a name="TAG">TAG</a>
-->
<xsl:template match="ktag" mode="body">
    <xsl:element name="a">
        <xsl:attribute name="name">
            <xsl:value-of select="child::node()"/>
        </xsl:attribute>
        <xsl:value-of select="child::node()"/>
    </xsl:element>
</xsl:template>

<!-- =================================================================== -->
<!-- Construct for the table of events in the arch doc -->
<xsl:template match="eventList" mode="body">
    <xsl:variable name="attributeClass" select="attributeClass"/>
    <xsl:variable name="valueClass" select="valueClass"/>
    <xsl:apply-templates select="event" mode="event">
        <xsl:with-param name="attributeClass" select="$attributeClass"/>
        <xsl:with-param name="valueClass" select="$valueClass"/>
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="event" mode="event">
    <xsl:param name="attributeClass"/>
    <xsl:param name="valueClass"/>
    <xsl:element name="tr">
        <xsl:choose>
            <xsl:when test="ev-description">
                <xsl:element name="td">
                    <xsl:attribute name="colspan">2</xsl:attribute>
                    <xsl:apply-templates select="ev-description" mode="event"/>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="buildEvent">
                    <xsl:with-param name="attributeClass" select="$attributeClass"/>
                    <xsl:with-param name="valueClass" select="$valueClass"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:element>
</xsl:template>

<xsl:template name="buildEvent" mode="event">
    <xsl:param name="attributeClass"/>
    <xsl:param name="valueClass"/>
    <xsl:element name="td">
        <xsl:if test="channel">
            <xsl:element name="table">
                <xsl:attribute name="cellpadding">0px</xsl:attribute>
                <xsl:element name="tr">
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$attributeClass"/>
                        </xsl:attribute>
                        <xsl:text>channel:</xsl:text>
                    </xsl:element>
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$valueClass"/>
                        </xsl:attribute>
                        <xsl:value-of select="channel"/>
                    </xsl:element>
                </xsl:element>
                <xsl:element name="tr">
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$attributeClass"/>
                        </xsl:attribute>
                        <xsl:text>service:</xsl:text>
                    </xsl:element>
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$valueClass"/>
                        </xsl:attribute>
                        <xsl:value-of select="service"/>
                    </xsl:element>
                </xsl:element>
                <xsl:element name="tr">
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$attributeClass"/>
                        </xsl:attribute>
                        <xsl:text>payload:</xsl:text>
                    </xsl:element>
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$valueClass"/>
                        </xsl:attribute>
                        <xsl:value-of select="payload"/>
                    </xsl:element>
                </xsl:element>
                <xsl:element name="tr">
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$attributeClass"/>
                        </xsl:attribute>
                        <xsl:text>field:</xsl:text>
                    </xsl:element>
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$valueClass"/>
                        </xsl:attribute>
                        <xsl:value-of select="field"/>
                    </xsl:element>
                </xsl:element>
                <xsl:element name="tr">
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$attributeClass"/>
                        </xsl:attribute>
                        <xsl:text>value:</xsl:text>
                    </xsl:element>
                    <xsl:element name="td">
                        <xsl:attribute name="class">
                            <xsl:value-of select="$valueClass"/>
                        </xsl:attribute>
                        <xsl:choose>
                            <xsl:when test="value/avpairs">
                                <xsl:apply-templates select="value/avpairs" mode="event"/>
                            </xsl:when>
                            <xsl:otherwise>
                                <xsl:apply-templates select="value" mode="event"/>
                            </xsl:otherwise>
                        </xsl:choose>
                    </xsl:element>
                </xsl:element>
            </xsl:element>
        </xsl:if>
    </xsl:element>
    <xsl:element name="td">
        <xsl:value-of select="description" mode="event"/>
    </xsl:element>
</xsl:template>

<xsl:template match="avpairs" mode="event">
    <xsl:for-each select="av">
        <xsl:element name="div">
            <xsl:value-of select="child::node()"/>
        </xsl:element>
    </xsl:for-each>
</xsl:template>

<xsl:template match="description" mode="event">
    <xsl:copy-of select="child::node()"/>
</xsl:template>

<xsl:template match="ev-description" mode="event">
    <xsl:copy-of select="child::node()"/>
</xsl:template>

<!-- =================================================================== -->
<xsl:template match="s:description">
    <xsl:apply-templates mode="desc"/>
</xsl:template>

<xsl:template match="*" mode="body">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates select="@*|node()" mode="body"/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*" mode="body">
    <xsl:attribute name="{local-name()}">
        <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>

<!-- =================================================================== -->
<!-- COPY HTML THAT IS NOT COPIED ABOVE -->
<!--
<xsl:template match="@*|node()" mode="body">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" mode="body"/>
    </xsl:copy>
</xsl:template>
-->

<!-- =================================================================== -->
<!-- BUILD REVISION HISTORY  -->
<xsl:template name="buildRevisions">
    <xsl:apply-templates select="//r:revisions"/>
</xsl:template>

<xsl:template match="r:revisions">
    <hr align="center" width="80%" />
    <h2>Revision History</h2>
    <table border="1" width="80%">
        <xsl:apply-templates select="r:revision"/>
    </table>
</xsl:template>

<xsl:template match="r:revision">
    <tr>
        <td><xsl:value-of select="r:version"/></td>
        <td><xsl:value-of select="r:date"/></td>
        <td><xsl:value-of select="r:person"/></td>
        <td><xsl:value-of select="r:changes"/></td>
    </tr>
</xsl:template>

<!-- =================================================================== -->
<!-- OUTPUT THE PHP FILE HEADER -->
<xsl:template name="htmlHeader">
<xsl:text disable-output-escaping="yes">&lt;?php
  // DO NOT EDIT THIS FILE - BUILT BY SCRIPTS
  require '../phpinc/header.php';
  $PageTitle="PsEPR/DSMT Service Listing";
  $StyleSheet="docs.css";
  preamble();
?&gt;
</xsl:text>
</xsl:template>

<!-- =================================================================== -->
<!-- OUTPUT PHP FILE FOOTER -->
<xsl:template name="htmlFooter">
    <xsl:text disable-output-escaping="yes">
&lt;?php postamble(); ?&gt;
</xsl:text>
</xsl:template>

</xsl:stylesheet>

