#*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 *#

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
## Content Stylesheet for Site
    ## Defined variables
    #set ($lightbg = "#ffffff")
    #set ($lightfg = "#ffffff")
    #set ($darkfg = "#000000")
    #set ($active = "#ffcc00")
    #set ($blue4 = "#B2C4E0")
    #set ($blue3 = "#294563")
    #set ($blue2 = "#4C6C8F")
    #set ($blue1 = "#CFDCED")
    #set ($sourceborder = "#023264")
    #set ($pound = "#" )
    #set ($ssi = "include virtual=")
    #set ($adsurl = "/ads/buttonbar.html")
## start the processing
#document()
## end the processing

## This is where the common page macro's live

#macro ( isbn $isbn)
<p><b>Available from:</b><br>
    <a href="http://www.amazon.com/exec/obidos/tg/detail/-/$!isbn/apachesoftwar-20/" target="_blank">Amazon.com</a>
  | <a href="http://service.bfast.com/bfast/click?bfmid=2181&amp;bfmtype=book&amp;sourceid=41462544&amp;bfpid=$!isbn" target="_blank">Barnes &amp; Noble</a>
  | <a href="http://www.booksense.com/product/info.jsp?affiliateId=Apache&amp;isbn=$!isbn" target="_blank">Book Sense</a>
  | <a href="http://www.powells.com/cgi-bin/biblio?isbn=$!isbn&amp;partner_id=29693" target="_blank">Powells.com</a>
<br></p>
#end

#macro ( subsection $subsection)
      <h4 class="subsection">
        <a name="$escape.getText($subsection.getAttributeValue("name"))"></a>
        $subsection.getAttributeValue("name")
      </h4>
      #foreach ( $items in $subsection.getChildren() )
        #if ($items.getName().equals("img"))
          #image ($items)
        #elseif ($items.getName().equals("source"))
          #source ($items)
        #elseif ($items.getName().equals("table"))
          #table ($items)
        #elseif ($items.getName().equals("subsubsection"))
          #subsubsection ($items)
        #else
          $xmlout.outputString($items)
        #end
      #end
      #if ($subsection.getAttributeValue("isbn"))
        #set ($isbn = $subsection.getAttributeValue("isbn"))
        #isbn ($isbn)
      #end
#end

#macro ( subsubsection $subsubsection)
      <h5 class="subsection">
        <a name="$escape.getText($subsubsection.getAttributeValue("name"))"></a>
        *** $subsubsection.getAttributeValue("name") ***
      </h5>
      #foreach ( $items in $subsubsection.getChildren() )
        #if ($items.getName().equals("img"))
          #image ($items)
        #elseif ($items.getName().equals("source"))
          #source ($items)
        #elseif ($items.getName().equals("table"))
          #table ($items)
        #else
          $xmlout.outputString($items)
        #end
      #end
#end

#macro ( section $section)
    <h3 class="section">
      <a name="$escape.getText($section.getAttributeValue("name"))"></a>
      $section.getAttributeValue("name")
    </h3>
      #foreach ( $items in $section.getChildren() )
        #if ($items.getName().equals("img"))
          #image ($items)
        #elseif ($items.getName().equals("source"))
          #source ($items)
        #elseif ($items.getName().equals("table"))
          #table ($items)
        #elseif ($items.getName().equals("subsection"))
          #subsection ($items)
        #else
          $xmlout.outputString($items)
        #end
      #end
#end

## This is where the FAQ specific macro's live

#macro (toc $section)
      <h4 class="toc">$section.getAttributeValue("title")</h4>
        <ul>
    #foreach ($faq in $section.getChildren("faq") )
      #subtoc ($faq)
    #end
        </ul>
#end

#macro (subtoc $faq)
  #set ($id = $faq.getAttributeValue("id"))
      <li><a href="$pound$id">
  $xmlout.outputString($faq.getChild("question"), true)
      </a></li>
#end

#macro (answers $section)
  #foreach ($faq in $section.getChildren("faq") )
    #faq ($faq)
  #end
#end

#macro (faq $faq)
  #set ($id = $faq.getAttributeValue("id"))
    <p class="faq">
      <a name="$id"></a>
      $xmlout.outputString($faq.getChild("question"), true)
    </p>
    #foreach ($item in $faq.getChild("answer").getChildren())
      #if ($item.getName().equals("img"))
        #image ($item)
      #elseif ($item.getName().equals("source"))
        #source ($item)
      #elseif ($item.getName().equals("table"))
        #table ($item)
      #else
        $xmlout.outputString($item)
      #end
    #end
#end

#macro (document)
  #header()
  <div class="main">
  <div class="content">
    <h1 class="title">$root.getChild("properties").getChild("title").getText()</h1>
  #set ($allSections = $root.getChild("body").getChildren("section"))
  #foreach ( $section in $allSections )
    #section ($section)
  #end

  #if ($root.getChildren("faqsection").size() > 0)
    #set ($allFaqSections = $root.getChildren("faqsection"))
      <h3 class="section">Questions</h3>
    #foreach ( $faqSection in $allFaqSections )
      #toc ($faqSection)
    #end

      <h3 class="section">Answers</h3>
    #foreach ( $faqSection in $allFaqSections )
      #answers ($faqSection)
    #end
  #end
  </div>
  </div>

  #footer()
#end
