<?xml version="1.0"?>
<!--
   Copyright 2004 The Apache Software Foundation
  
   Licensed 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.
-->
<!-- $Id$ -->
<!--
Skin configuration file. This file contains details of your project, which will
be used to configure the chosen Forrest skin.
-->

<!DOCTYPE skinconfig [

  <!ENTITY % links.att 'name CDATA #REQUIRED'>
  <!ENTITY % link.att 'name CDATA #REQUIRED href CDATA #REQUIRED'>
  <!ELEMENT skinconfig (disable-search?, disable-print-link?, disable-pdf-link?,
  disable-xml-link?, disable-compliance-links?, searchsite-domain?, searchsite-name?,
  project-name, project-url, project-logo, group-name?, group-url?, group-logo?,
  host-url?, host-logo?, year?, vendor?, trail?, toc?, credits?)*>
  <!ELEMENT credits (credit*)>
  <!ELEMENT credit (name, url, image?, width?, height?)>
  <!-- id uniquely identifies the tool, and role indicates its function -->
  <!ATTLIST credit id   CDATA #IMPLIED
                   role CDATA #IMPLIED>
  <!ELEMENT disable-search (#PCDATA)>
  <!ELEMENT disable-print-link (#PCDATA)>
  <!ELEMENT disable-pdf-link (#PCDATA)>
  <!ELEMENT disable-xml-link (#PCDATA)>    
  <!ELEMENT disable-compliance-links (#PCDATA)>   
  <!ELEMENT searchsite-domain (#PCDATA)>
  <!ELEMENT searchsite-name (#PCDATA)>  
  <!ELEMENT project-name (#PCDATA)>
  <!ELEMENT project-url (#PCDATA)>
  <!ELEMENT project-logo (#PCDATA)>
  <!ELEMENT group-name (#PCDATA)>
  <!ELEMENT group-url (#PCDATA)>
  <!ELEMENT group-logo (#PCDATA)>
  <!ELEMENT host-url (#PCDATA)>
  <!ELEMENT host-logo (#PCDATA)>
  <!ELEMENT year (#PCDATA)>
  <!ELEMENT vendor (#PCDATA)>
  <!ELEMENT trail (link1, link2, link3)>
  <!ELEMENT link1 EMPTY>
  <!-- Seems we can't use param entity refs until this is DTDified -->
  <!ATTLIST link1 name CDATA #REQUIRED href CDATA #IMPLIED>
  <!ELEMENT link2 EMPTY>
  <!ATTLIST link2 name CDATA #REQUIRED href CDATA #IMPLIED>
  <!ELEMENT link3 EMPTY>
  <!ATTLIST link3 name CDATA #REQUIRED href CDATA #IMPLIED>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT url (#PCDATA)>
  <!ELEMENT image (#PCDATA)>
  <!ELEMENT width (#PCDATA)>
  <!ELEMENT height (#PCDATA)>
  <!ELEMENT toc EMPTY>
  <!ATTLIST toc level CDATA #IMPLIED>
  ]>

<skinconfig>
  <!-- Do we want to disable the Google search box? -->
  <disable-search>true</disable-search>
  <!-- Do we want to disable the print link? -->
  <disable-print-link>true</disable-print-link>  
  <!-- Do we want to disable the PDF link? -->
  <disable-pdf-link>true</disable-pdf-link>
  <!-- Do we want to disable the xml source link? -->
  <disable-xml-link>true</disable-xml-link>
  <!-- Do we want to disable w3c compliance links? -->
  <disable-compliance-links>true</disable-compliance-links>

  <searchsite-domain>jakarta.apache.org</searchsite-domain>  
  <searchsite-name>Jakarta</searchsite-name>  

  <!-- mandatory project logo
       skin: forrest-site renders it at the top -->
  <project-name>Jakarta Tapestry Project</project-name>
  <project-url>http://jakarta.apache.org/tapestry/</project-url>
  <project-logo>images/Tapestry-Banner.png</project-logo>
  <!-- Alternative static image:
  <project-logo>images/project-logo.gif</project-logo> -->

  <!-- optional group logo
       skin: forrest-site renders it at the top-left corner -->
  <group-name>The Apache Jakarta Project</group-name>
  <group-url>http://jakarta.apache.org/</group-url>
  <group-logo>images/jakarta.png</group-logo>
  <!-- Alternative static image:
  <group-logo>images/group-logo.gif</group-logo> -->

  <!-- optional host logo (e.g. sourceforge logo)
       skin: forrest-site renders it at the bottom-left corner -->
  <host-url></host-url>
  <host-logo></host-logo>

  <!-- The following are used to construct a copyright statement -->
  <year>2005</year>
  <vendor>The Apache Software Foundation</vendor>

  <!-- Some skins use this to form a 'breadcrumb trail' of links. If you don't
  want these, set the attributes to blank. The DTD purposefully requires them.
  -->
  <trail>
    <link1 name="Apache" href="http://www.apache.org/"/>
    <link2 name="Jakarta" href="http://jakarta.apache.org/"/>
    <link3 name="Tapestry" href="http://jakarta.apache.org/tapestry/"/>
  </trail>

  <!-- Configure how many "section" levels need to be included in the
  generated Table of Contents (TOC). By default, if no toc element is provided
  below, then 2 levels are included. Level 0 does not generate any TOC at all.
  -->
  <toc level="3"/>

  <!-- Credits are typically rendered as a set of small clickable images in the
  page footer -->
  <credits>
    <credit>
      <name>Built with Apache Forrest</name>
      <url>http://xml.apache.org/forrest/</url>
      <image>images/built-with-forrest-button.png</image>
      <width>88</width>
      <height>31</height>
    </credit>
    <!-- A credit with @role='pdf' will have its name and url displayed in the
    PDF page's footer. -->
  </credits>

</skinconfig>
