<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:rx="http://www.renderx.com/XSL/Extensions" version="1.0">
    <!-- *********** params ********* -->
    <xsl:param name="horizontal-spacing" select="15"/>
    <xsl:param name="vertical-spacing" select="10"/>
    <xsl:param name="card-width" select="80"/>
    <xsl:param name="card-height" select="40.64"/>
    <xsl:param name="page-height" select="297"/>
    <xsl:param name="page-width" select="210"/>
    <!-- *********** variables ********* -->
    <xsl:variable name="available-width" select="$page-width - 20"/>
    <xsl:variable name="available-height" select="$page-height - 20"/>
    <!-- **************************************************** -->
    <!-- ******************** templates ********************* -->
    <!-- **************************************************** -->
    <xsl:template match="business_card">
        <fo:root>
            <fo:layout-master-set>
                <fo:simple-page-master master-name="MainPage" page-width="210mm" page-height="297mm">
                    <fo:region-body margin="10mm"/>
                    <fo:region-before extent="10mm"/>
                    <fo:region-after extent="10mm"/>
                </fo:simple-page-master>
                <fo:page-sequence-master master-name="Repeat-MainPages">
                    <fo:repeatable-page-master-reference master-reference="MainPage"/>
                </fo:page-sequence-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="Repeat-MainPages">
                <!-- page numbers -->
                <fo:static-content flow-name="xsl-region-after">
                    <fo:block text-align="center" font-size="10pt">&#x2014; <fo:page-number/> &#x2014;</fo:block>
                </fo:static-content>
                <fo:flow flow-name="xsl-region-body">
                    <fo:block font-size="12pt" font-family="Helvetica">
                        <xsl:call-template name="put-table">
                            <xsl:with-param name="x" select="count-x"/>
                            <xsl:with-param name="y" select="count-y"/>
                            <xsl:with-param name="v-spacing" select="$vertical-spacing"/>
                            <xsl:with-param name="h-spacing" select="$horizontal-spacing"/>
                            <xsl:with-param name="h-card" select="$card-height"/>
                            <xsl:with-param name="w-card" select="$card-width"/>
                            <xsl:with-param name="h-page" select="$available-height"/>
                            <xsl:with-param name="w-page" select="$available-width"/>
                            <xsl:with-param name="cell-content-node" select="info"/>
                        </xsl:call-template>
                    </fo:block>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>
    <!-- ====================================== -->
    <xsl:template match="info">
        <fo:table width="{$card-width}mm" border="1pt solid black">
            <fo:table-column column-width="{$card-width}mm"/>
            <fo:table-body>
                <fo:table-row height="{$card-height}mm">
                    <fo:table-cell width="{$card-width}mm">
                        <fo:block>
                            <fo:block text-align="center" font-size="8pt" font-weight="bold" padding-top="2mm" font-style="italic">
                                <xsl:apply-templates select="title"/>
                            </fo:block>
                            <fo:block text-align="left" margin-left="2mm">
                                <fo:external-graphic src="url('{logo}')" content-height="15mm"/>
                            </fo:block>
                            <fo:block font-size="9pt" margin-left="35mm" text-align="left" font-weight="bold">
                                <fo:block>
                                    <xsl:apply-templates select="address"/>
                                </fo:block>
                                <fo:block space-after="2mm">
                                    Tel. <xsl:apply-templates select="phone"/>
                                </fo:block>
                                <fo:block>
                                    <xsl:apply-templates select="site"/>
                                </fo:block>
                                <fo:block>
                                    E-mail: <xsl:apply-templates select="e-mail"/>
                                </fo:block>
                            </fo:block>
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
    </xsl:template>
    <!-- ################################################### -->
    <!-- ############### auxiliary templates ############### -->
    <!-- ################################################### -->
    <xsl:template name="put-table">
        <xsl:param name="x" select="1"/>
        <xsl:param name="y" select="1"/>
        <xsl:param name="v-spacing"/>
        <xsl:param name="h-spacing"/>
        <xsl:param name="w-card"/>
        <xsl:param name="h-card"/>
        <xsl:param name="w-page"/>
        <xsl:param name="h-page"/>
        <xsl:param name="cell-content-node"/>
        <fo:table>
            <xsl:call-template name="define-columns">
                <xsl:with-param name="columns-qty" select="$x"/>
                <xsl:with-param name="spacing" select="$h-spacing"/>
                <xsl:with-param name="w-card" select="$w-card"/>
                <xsl:with-param name="w-page" select="$w-page"/>
            </xsl:call-template>
            <fo:table-body>
                <xsl:call-template name="put-rows">
                    <xsl:with-param name="rows-qty" select="$y"/>
                    <xsl:with-param name="cells-qty" select="$x"/>
                    <xsl:with-param name="v-spacing" select="$v-spacing"/>
                    <xsl:with-param name="h-spacing" select="$h-spacing"/>
                    <xsl:with-param name="cell-content-node" select="$cell-content-node"/>
                </xsl:call-template>
            </fo:table-body>
        </fo:table>
    </xsl:template>
    <!-- ====================================== -->
    <xsl:template name="define-columns">
        <xsl:param name="columns-qty"/>
        <xsl:param name="spacing"/>
        <xsl:param name="w-card"/>
        <xsl:param name="w-page"/>
        <xsl:choose>
            <xsl:when test="$columns-qty = 0"/>
            <xsl:otherwise>
                <fo:table-column column-width="{floor($w-page div ($w-card + $spacing))}mm"/>
                <xsl:call-template name="define-columns">
                    <xsl:with-param name="columns-qty" select="$columns-qty - 1"/>
                    <xsl:with-param name="spacing" select="$spacing"/>
                    <xsl:with-param name="w-card" select="$w-card"/>
                    <xsl:with-param name="w-page" select="$w-page"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <!-- ====================================== -->
    <xsl:template name="put-rows">
        <xsl:param name="rows-qty"/>
        <xsl:param name="cells-qty"/>
        <xsl:param name="v-spacing"/>
        <xsl:param name="h-spacing"/>
        <xsl:param name="cell-content-node"/>
        <xsl:choose>
            <xsl:when test="$rows-qty = 0"/>
            <xsl:otherwise>
                <fo:table-row>
                    <xsl:call-template name="put-cells">
                        <xsl:with-param name="cells-qty" select="$cells-qty"/>
                        <xsl:with-param name="v-spacing" select="$v-spacing"/>
                        <xsl:with-param name="h-spacing" select="$h-spacing"/>
                        <xsl:with-param name="cell-content-node" select="$cell-content-node"/>
                    </xsl:call-template>
                </fo:table-row>
                <xsl:call-template name="put-rows">
                    <xsl:with-param name="rows-qty" select="$rows-qty - 1"/>
                    <xsl:with-param name="cells-qty" select="$cells-qty"/>
                    <xsl:with-param name="v-spacing" select="$v-spacing"/>
                    <xsl:with-param name="h-spacing" select="$h-spacing"/>
                    <xsl:with-param name="cell-content-node" select="$cell-content-node"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <!-- ====================================== -->
    <xsl:template name="put-cells">
        <xsl:param name="cells-qty"/>
        <xsl:param name="v-spacing"/>
        <xsl:param name="h-spacing"/>
        <xsl:param name="cell-content-node"/>
        <xsl:choose>
            <xsl:when test="$cells-qty = 0"/>
            <xsl:otherwise>
                <fo:table-cell border="1pt dotted red" text-align="center">
                    <fo:block margin-left="{$h-spacing div 2}mm" margin-right="{$h-spacing div 2}mm"
                        margin-top="{$v-spacing div 2}mm" margin-bottom="{$v-spacing div 2}mm" text-align="center">
                        <xsl:apply-templates select="$cell-content-node"/>
                    </fo:block>
                </fo:table-cell>
                <xsl:call-template name="put-cells">
                    <xsl:with-param name="cells-qty" select="$cells-qty - 1"/>
                    <xsl:with-param name="v-spacing" select="$v-spacing"/>
                    <xsl:with-param name="h-spacing" select="$h-spacing"/>
                    <xsl:with-param name="cell-content-node" select="$cell-content-node"/>
                </xsl:call-template>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>
