You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@forrest.apache.org by je...@apache.org on 2003/06/03 14:17:38 UTC

cvs commit: xml-forrest/src/resources/skins/forrest-css/xslt/html book2menu.xsl document2html.xsl site2xhtml.xsl tab2menu.xsl

jefft       2003/06/03 05:17:38

  Added:       src/resources/skins/forrest-css/css page.css
               src/resources/skins/forrest-css/images bottom-left.png
                        bottom-right.png chapter.gif chapter_open.gif
                        content-bg.gif current.gif icon_doc_lrg.gif
                        icon_doc_sml.gif icon_error_lrg.gif
                        icon_error_sml.gif icon_folder_lrg.gif
                        icon_folder_sml.gif icon_help_sml.gif
                        icon_info_lrg.gif icon_info_sml.gif
                        icon_success_lrg.gif icon_success_sml.gif
                        icon_warning_lrg.gif icon_warning_sml.gif label.gif
                        nav-bottom.png navbullet-selected.png navbullet.png
                        page.gif pdfdoc.gif printer.gif printer.png
                        search-bottom.png singlepage.gif spacer.gif
                        tab-top.png top-left.png top-right.png
                        valid-html401.png vcss.png xmldoc.gif
               src/resources/skins/forrest-css/scripts
                        breadcrumbs-optimized.js breadcrumbs.js
               src/resources/skins/forrest-css/xslt/fo document2fo.xsl
               src/resources/skins/forrest-css/xslt/html book2menu.xsl
                        document2html.xsl site2xhtml.xsl tab2menu.xsl
  Log:
  CSS version of forrest-site skin.  Thanks to Tom Klaasen for creating it, and
  Miles Elam for the CSS/HTML design.
  
  Revision  Changes    Path
  1.1                  xml-forrest/src/resources/skins/forrest-css/css/page.css
  
  Index: page.css
  ===================================================================
  /* Apache Forrest CSS */
      body {
        background-color: white;
        font-family: arial, helvetica, sans-serif;
        margin: 0px;
        padding: 0px;
      }
      form {
        padding: 0px;
        margin: 0px;
      }
      a:link {
        color: #0F3660;
      }
      a:visited {
        color: #009999;
      }
      a:active {
        color: #000066;
      }
      a:hover {
        color: #000066;
      }
      .textonly {
        display: none;
      }
      #toplinks {
        background-color: #CDDEEE;
        font-size: 80%;
        margin: 0px;
        min-height: 18px;
        padding-bottom: 0.2em;
        padding-top: 2px;
        padding-left: 5px;
      }
      body>#toplinks {
        padding-bottom: 0em;
      }
      #quicklinks {
        display: none;
      }
      #mainheader {
        background-color: #294563;
        border-top: 2px solid #4A6D8B;
        border-bottom: 0.6em solid #4A6D8B;
        text-align: center;
      }
      #grouplogolink {
        display: block;
        left: 0px;
        position: absolute;
        top: 18px;
        width: 220px;
      }
      #grouplogolink/* Hide from Mac IE 5 */ {
        display: inline;
        float: left;
        left: auto;
        position: relative;
        top: auto;
        width: auto;
      }
      #grouplogo {
        border: 0px;
      }
      #projectlogo {
        border: 0px;
        margin-bottom: 1.5em;
      }
      #search {
        background: #4A6D8B url('images/search-bottom.png') no-repeat bottom left;
        border: 0px;
        display: block;
        margin: 0px;
        padding: 10px;
        padding-right: 0px;
        position: absolute;
        right: 10px;
        text-align: left;
        width: 190px;
        top: 22px;
        voice-family: "\"}\"";
        voice-family: inherit;
        top: 18px;
      }
      #mainheader>#search/* Hide from Mac IE 5 */ {
        float: right;
        margin-right: 10px;
        min-width: 170px;
        padding-right: 10px;
        position: static;
        right: auto;
        top: auto;
        width: auto;
      }
      #search * {
        font-size: 70%;
      }
      .searchtext {
        color: white;
        display: block;
        font-size: 100%;
      }
      .query {
        width: 10em;
      }
      .content {
        background: white url('images/content-bg.gif') repeat-x top;
        padding-bottom: 2em;
        padding-left: 14em;
        padding-right: 10px;
        padding-top: 30px;
        voice-family: "\"}\"";
        voice-family: inherit;
        padding-left: 13.5em;
      }
      body>.content { /* Be nice to Opera */
        padding-left: 13.5em;
      }
      .content * {
        position: relative;
        z-index: 2;
      }
      #printable {
        display: block;
        font-size: 70%;
        float: right;
        text-align: center;
      }
      #printable img {
        border: 0px;
        display: block;
      }
      #printable>img/* Hide from Mac IE 5.x */ {
        display: inline;
      }
      #nav {
        xbackground: url('images/nav-bottom.png') no-repeat bottom right;
        left: 10px;
        padding-bottom: 10px;
        padding-top: 10px;
        position: absolute;
        top: 71px;
        z-index: 1;
      }
      #nav/* Hide from Mac IE 5.x */ {
        top: 78px;
      }
      #categories {
        border-bottom: 10px solid #4A6B8D;
        font-size: 80%;
        height: 2.15em;
        margin: 0px;
        padding: 0px;
        position: relative;
        z-index: 1;
      }
      .category {
        display: block;
        float: left;
        margin: 0em;
        margin-right: 0.3em;
        min-width: 65px;
        padding: 0.2em;
        padding-left: 0.5em;
        text-align: center;
        width: 5.25em;
      }
      .category/* Hide from Mac IE 5.x */ {
        padding-left: 0em;
        padding-right: 0em;
      }
      span.category {
        background: #4A6D8B url('images/tab-top.png') no-repeat top left;
        color: white;
        font-weight: bold;
        padding-bottom: 0.5em;
        padding-top: 0.5em;
      }
      a.category {
        background: #B4C6E6 url('images/tab-top.png') no-repeat top left;
        font-weight: normal;
        padding-top: 0.25em;
        margin-top: 0.5em;
      }
      .navsection {
        background: #4A6D8B;
        border-left: 1px solid #294462;
        border-right: 1px solid #294462;
        display: block;
        font-size: 90%;
        margin: 0px;
        padding-bottom: 0.9em;
        padding-left: 1.5em;
        width: 13.6em;
        voice-family: "\"}\"";
        voice-family: inherit;
        width: 11em;
      }
      #nav>.navsection { /* Be nice to Opera */
        width: 11em;
      }
      .navsectionheader {
        color: #CDDEEE;
        font-size: 90%;
        margin: 0px;
      }
      .navsectionheader/* Hide from Mac IE 5.x */ {
        font-size: 100%;
      }
      .navitem {
        display: block;
        margin-left: 5px;
        padding-left: 15px;
      }
      .navsection>.navitem {
        display: list-item;
        margin-left: 20px;
        padding-left: 0px;
      }
      span.navitem {
        background: url('images/navbullet-selected.png') no-repeat center left;
        color: #FFCC00;
      }
      .navsection>span.navitem {
        background: inherit;
        list-style-type: disc;
      }
      a.navitem {
        background: url('images/navbullet.png') no-repeat center left;
        color: white;
        list-style-type: circle;
        text-decoration: none;
      }
      .navsection>a.navitem {
        background: inherit;
        list-style-type: circle;
      }
      a.navitem:visited {
        color: white;
      }
      a.navitem:hover {
        background: url('images/navbullet-selected.png') no-repeat center left;
        color: #FFCC00;
      }
      .navsection>a.navitem:hover {
        background: inherit;
        list-style-type: disc;
      }
      #footer {
        background-color: #CDDEEE;
        border-top: 1px solid #294462;
        font-size: 80%;
        padding-bottom: 5px;
        text-align: center;
      }
      #revision:before {
        content: " -- "
      }
      #validation {
        display: block;
        margin-top: 5px;
      }
      #validation img {
        border: 0px;
      }
  
      .extratab {
        display: none;
      }
  	.author {
  		text-align: right;
  		font-size: x-small;
  		font-style: italic;
  	}
  	.note, .warning, .fixme {
  		border-top: 3px solid #900;
  		border-bottom: 3px solid #900;
  		border-left: 3px solid #900;
  		border-right: 3px solid #900;
  		background-image: url(images/icon_error_lrg.gif);
  		background-repeat: no-repeat;
  		background-position: 0 1.33em;
  		margin: 1.33em 0;
  		padding: .33em 0 .67em 36px;
  		min-height: 32px;
  	}
  	.fixme {
  		background-image: url(images/icon_warning_lrg.gif);
  		border-color: #c60;
  	}
  	.note {
  		background-image: url(images/icon_info_lrg.gif);
  		border-color: #069;
  	}
  	
  	.codefrag {
  		font-family: courier;
  	}
  
  @media print {
  
    body, html {
      background-color: white;
    }
  
    acronym, abbr {
      border: 0px;
    }
  
    a {
      color: black !important;
      text-decoration: none;
    }
  
    p a:after {
      content: "(" attr(href) ")";
    }
  
    p abbr:after, p acronym:after {
      content: "(" attr(title) ")";
    }
  
    #nav {
      display: none;
    }
  
    #printable {
      display: none;
    }
  
    .content {
      background: white;
      padding: 0em !important;
    }
  
    #search {
      display: none;
    }
  
    #toplinks {
      display: none;
    }
  
    #footer {
      background: white;
    }
  
    #validation {
      display: none;
    }
  
  }
  
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/bottom-left.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/bottom-right.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/chapter.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/chapter_open.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/content-bg.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/current.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_doc_lrg.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_doc_sml.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_error_lrg.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_error_sml.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_folder_lrg.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_folder_sml.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_help_sml.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_info_lrg.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_info_sml.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_success_lrg.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_success_sml.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_warning_lrg.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/icon_warning_sml.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/label.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/nav-bottom.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/navbullet-selected.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/navbullet.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/page.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/pdfdoc.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/printer.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/printer.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/search-bottom.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/singlepage.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/spacer.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/tab-top.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/top-left.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/top-right.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/valid-html401.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/vcss.png
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/images/xmldoc.gif
  
  	<<Binary file>>
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/scripts/breadcrumbs-optimized.js
  
  Index: breadcrumbs-optimized.js
  ===================================================================
  var PREPREND_CRUMBS=new Array();
  PREPREND_CRUMBS.push(new Array("Apache","http://www.apache.org/"));
  PREPREND_CRUMBS.push(new Array("Jakarta","http://jakarta.apache.org/"));
  var DISPLAY_SEPARATOR=" &gt; ";
  var DISPLAY_PREPREND="";
  var DISPLAY_POSTPREND=":";
  var CSS_CLASS_CRUMB="breadcrumb";
  var CSS_CLASS_TRAIL="breadcrumbTrail";
  var CSS_CLASS_SEPARATOR="crumbSeparator";
  var FILE_EXTENSIONS=new Array( ".html", ".htm", ".jsp", ".php", ".php3", ".php4" );
  var PATH_SEPARATOR="/";
  
  function sc(s) {
  	var l=s.toLowerCase();
  	return l.substr(0,1).toUpperCase()+l.substr(1);
  }
  function getdirs() {
  	var t=document.location.pathname.split(PATH_SEPARATOR);
  	var lc=t[t.length-1];
  	for(var i=0;i < FILE_EXTENSIONS.length;i++)
  	{
  		if(lc.indexOf(FILE_EXTENSIONS[i]))
  			return t.slice(1,t.length-1); }
  	return t.slice(1,t.length);
  }
  function getcrumbs( d )
  {
  	var pre = "/";
  	var post = "/";
  	var c = new Array();
  	if( d != null )
  	{
  		for(var i=0;i < d.length;i++) {
  			pre+=d[i]+postfix;
  			c.push(new Array(d[i],pre)); }
  	}
  	if(PREPREND_CRUMBS.length > 0 )
  		return PREPREND_CRUMBS.concat( c );
  	return c;
  }
  function gettrail( c )
  {
  	var h=DISPLAY_PREPREND;
  	for(var i=0;i < c.length;i++)
  	{
  		h+='<a href="'+c[i][1]+'" >'+sc(c[i][0])+'</a>';
  		if(i!=(c.length-1))
  			h+=DISPLAY_SEPARATOR; }
  	return h+DISPLAY_POSTPREND;
  }
  
  function gettrailXHTML( c )
  {
  	var h='<span class="'+CSS_CLASS_TRAIL+'">'+DISPLAY_PREPREND;
  	for(var i=0;i < c.length;i++)
  	{
  		h+='<a href="'+c[i][1]+'" class="'+CSS_CLASS_CRUMB+'">'+sc(c[i][0])+'</a>';
  		if(i!=(c.length-1))
  			h+='<span class="'+CSS_CLASS_SEPARATOR+'">'+DISPLAY_SEPARATOR+'</span>'; }
  	return h+DISPLAY_POSTPREND+'</span>';
  }
  
  if(document.location.href.toLowerCase().indexOf("http://")==-1)
  	document.write(gettrail(getcrumbs()));
  else
  	document.write(gettrail(getcrumbs(getdirs())));
  
  
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/scripts/breadcrumbs.js
  
  Index: breadcrumbs.js
  ===================================================================
  /*
  
   ============================================================================
                     The Apache Software License, Version 1.1
   ============================================================================
  
   Copyright (C) @skinconfig.year@ The Apache Software Foundation. All rights reserved.
  
   Redistribution and use in source and binary forms, with or without modifica-
   tion, are permitted provided that the following conditions are met:
  
   1. Redistributions of  source code must  retain the above copyright  notice,
      this list of conditions and the following disclaimer.
  
   2. Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
  
   3. The end-user documentation included with the redistribution, if any, must
      include  the following  acknowledgment:  "This product includes  software
      developed  by the  Apache Software Foundation  (http://www.apache.org/)."
      Alternately, this  acknowledgment may  appear in the software itself,  if
      and wherever such third-party acknowledgments normally appear.
  
   4. The names "Apache Forrest" and "Apache Software Foundation"
      must not be used to endorse or promote products derived from this  software
      without  prior written permission. For written permission, please contact
      apache@apache.org.
  
   5. Products  derived from this software may not  be called "Apache", nor may
      "Apache" appear  in their name,  without prior written permission  of the
      Apache Software Foundation.
  
   THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
   This software  consists of voluntary contributions made  by many individuals
   on  behalf of the Apache Software  Foundation. For more  information on the
   Apache Software Foundation, please see <http://www.apache.org/>.
  
  */
  
  /**
   * This script, when included in a html file, builds a neat breadcrumb trail
   * based on its url. That is, if it doesn't contains bugs (I'm relatively
   * sure it does).
   *
   * Typical usage:
   * <script type="text/javascript" language="JavaScript" src="breadcrumbs.js"></script>
   *
   *@author     <a href="mailto:leosimons@apache.org">Leo Simons</a> (main author)
   *@author     <a href="mailto:nicolaken@apache.org">Nicola Ken Barozzi</a> (integration in skin)
   *@created    July 12, 2002
   *@version    1.0
   */
  
  /* ========================================================================
  	CONSTANTS
     ======================================================================== */
  
  /**
   * Two-dimensional array containing extra crumbs to place at the front of
   * the trail. Specify first the name of the crumb, then the URI that belongs
   * to it. You'll need to modify this for every domain or subdomain where
   * you use this script (you can leave it as an empty array if you wish)
   */
  var PREPREND_CRUMBS = new Array();
     if(!("@skinconfig.trail.link1.name@"=="")){
       PREPREND_CRUMBS.push( new Array( "@skinconfig.trail.link1.name@", "@skinconfig.trail.link1.href@" ) );
     }
     if(!("@skinconfig.trail.link2.name@"=="")){
       PREPREND_CRUMBS.push( new Array( "@skinconfig.trail.link2.name@", "@skinconfig.trail.link2.href@" ) );
     }
     if(!("@skinconfig.trail.link3.name@"=="")){
       PREPREND_CRUMBS.push( new Array( "@skinconfig.trail.link3.name@", "@skinconfig.trail.link3.href@" ) );
     }
  
  /**
   * String to include between crumbs:
   */
  var DISPLAY_SEPARATOR = " &gt; ";
  /**
   * String to include at the beginning of the trail
   */
  var DISPLAY_PREPREND = "";
  /**
   * String to include at the end of the trail
   */
  var DISPLAY_POSTPREND = "";
  
  /**
   * CSS Class to use for a single crumb:
   */
  var CSS_CLASS_CRUMB = "breadcrumb";
  
  /**
   * CSS Class to use for the complete trail:
   */
  var CSS_CLASS_TRAIL = "breadcrumbTrail";
  
  /**
   * CSS Class to use for crumb separator:
   */
  var CSS_CLASS_SEPARATOR = "crumbSeparator";
  
  /**
   * Array of strings containing common file extensions. We use this to
   * determine what part of the url to ignore (if it contains one of the
   * string specified here, we ignore it).
   */
  var FILE_EXTENSIONS = new Array( ".html", ".htm", ".jsp", ".php", ".php3", ".php4" );
  
  /**
   * String that separates parts of the breadcrumb trail from each other.
   * When this is no longer a slash, I'm sure I'll be old and grey.
   */
  var PATH_SEPARATOR = "/";
  
  /* ========================================================================
  	UTILITY FUNCTIONS
     ======================================================================== */
  /**
   * Capitalize first letter of the provided string and return the modified
   * string.
   */
  function sentenceCase( string )
  {        return string;
  	//var lower = string.toLowerCase();
  	//return lower.substr(0,1).toUpperCase() + lower.substr(1);
  }
  
  /**
   * Returns an array containing the names of all the directories in the
   * current document URL
   */
  function getDirectoriesInURL()
  {
  	var trail = document.location.pathname.split( PATH_SEPARATOR );
  
  	// check whether last section is a file or a directory
  	var lastcrumb = trail[trail.length-1];
  	for( var i = 0; i < FILE_EXTENSIONS.length; i++ )
  	{
  		if( lastcrumb.indexOf( FILE_EXTENSIONS[i] ) )
  		{
  			// it is, remove it and send results
  			return trail.slice( 1, trail.length-1 );
  		}
  	}
  
  	// it's not; send the trail unmodified
  	return trail.slice( 1, trail.length );
  }
  
  /* ========================================================================
  	BREADCRUMB FUNCTIONALITY
     ======================================================================== */
  /**
   * Return a two-dimensional array describing the breadcrumbs based on the
   * array of directories passed in.
   */
  function getBreadcrumbs( dirs )
  {
  	var prefix = "/";
  	var postfix = "/";
  
  	// the array we will return
  	var crumbs = new Array();
  
  	if( dirs != null )
  	{
  		for( var i = 0; i < dirs.length; i++ )
  		{
  			prefix += dirs[i] + postfix;
  			crumbs.push( new Array( dirs[i], prefix ) );
  		}
  	}
  
  	// preprend the PREPREND_CRUMBS
  	if(PREPREND_CRUMBS.length > 0 )
  	{
  		return PREPREND_CRUMBS.concat( crumbs );
  	}
  
  	return crumbs;
  }
  
  /**
   * Return a string containing a simple text breadcrumb trail based on the
   * two-dimensional array passed in.
   */
  function getCrumbTrail( crumbs )
  {
  	var xhtml = DISPLAY_PREPREND;
  
  	for( var i = 0; i < crumbs.length; i++ )
  	{
  		xhtml += '<a class="toplink" href="' + crumbs[i][1] + '" >';
  		xhtml += sentenceCase( crumbs[i][0] ) + '</a>';
  		if( i != (crumbs.length-1) )
  		{
  			xhtml += DISPLAY_SEPARATOR;
  		}
  	}
  
  	xhtml += DISPLAY_POSTPREND;
  
  	return xhtml;
  }
  
  /**
   * Return a string containing an XHTML breadcrumb trail based on the
   * two-dimensional array passed in.
   */
  function getCrumbTrailXHTML( crumbs )
  {
  	var xhtml = '<span class="' + CSS_CLASS_TRAIL  + '">';
  	xhtml += DISPLAY_PREPREND;
  
  	for( var i = 0; i < crumbs.length; i++ )
  	{
  		xhtml += '<a href="' + crumbs[i][1] + '" class="' + CSS_CLASS_CRUMB + '">';
  		xhtml += sentenceCase( crumbs[i][0] ) + '</a>';
  		if( i != (crumbs.length-1) )
  		{
  			xhtml += '<span class="' + CSS_CLASS_SEPARATOR + '">' + DISPLAY_SEPARATOR + '</span>';
  		}
  	}
  
  	xhtml += DISPLAY_POSTPREND;
  	xhtml += '</span>';
  
  	return xhtml;
  }
  
  /* ========================================================================
  	PRINT BREADCRUMB TRAIL
     ======================================================================== */
  
  // check if we're local; if so, only print the PREPREND_CRUMBS
  if( document.location.href.toLowerCase().indexOf( "http://" ) == -1 )
  {
  	document.write( getCrumbTrail( getBreadcrumbs() ) );
  }
  else
  {
  	document.write( getCrumbTrail( getBreadcrumbs( getDirectoriesInURL() ) ) );
  }
  
  
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/xslt/fo/document2fo.xsl
  
  Index: document2fo.xsl
  ===================================================================
  <?xml version="1.0"?>
  
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                  xmlns:fo="http://www.w3.org/1999/XSL/Format"
                  version="1.0">
  
  <xsl:import href="../../../common/xslt/fo/document2fo.xsl"/>
  
  </xsl:stylesheet>
  
  
  
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/xslt/html/book2menu.xsl
  
  Index: book2menu.xsl
  ===================================================================
  <?xml version="1.0"?>
  <!--
  book2menu.xsl generates the HTML menu.  See the imported book2menu.xsl for
  details.
  
  $Id: book2menu.xsl,v 1.1 2003/06/03 12:17:38 jefft Exp $
  -->
  
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
    <xsl:import href="../../../common/xslt/html/book2menu.xsl"/>
  
    <xsl:template match="book">
      <div class="menu">
        <ul>
          <xsl:apply-templates select="menu"/>
        </ul>
      </div>
    </xsl:template>
  
    <xsl:template match="menu">
      <li>
        <font color="#000000"><xsl:value-of select="@label"/></font>
        <ul>
          <xsl:apply-templates/>
        </ul>
      </li>
    </xsl:template>
  
    <xsl:template match="menu-item">
      <li>
        <xsl:apply-imports/>
      </li>
    </xsl:template>
    
    <xsl:template name="selected">
      <span class="sel">
        <font color="#ffcc00">
          <xsl:value-of select="@label"/>
        </font>
      </span>
    </xsl:template>
  
    <xsl:template name="print-external">
      <font color="#ffcc00">
        <xsl:apply-imports/>
      </font>
    </xsl:template>
    
  </xsl:stylesheet>
  
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/xslt/html/document2html.xsl
  
  Index: document2html.xsl
  ===================================================================
  <?xml version="1.0"?>
  <!--
  This stylesheet contains the majority of templates for converting documentv11
  to HTML.  It renders XML as HTML in this form:
  
    <div class="content">
     ...
    </div>
  
  ..which site2xhtml.xsl then combines with HTML from the index (book2menu.xsl)
  and tabs (tab2menu.xsl) to generate the final HTML.
  
  $Id: document2html.xsl,v 1.1 2003/06/03 12:17:38 jefft Exp $
  -->
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
    <xsl:import href="../../../common/xslt/html/document2html.xsl"/>
  
    <xsl:template match="document">
  
      <div class="content">
        <xsl:call-template name="pdflink"/>
        <xsl:if test="normalize-space(header/title)!=''">
                <h1><xsl:value-of select="header/title"/></h1>
        </xsl:if>
        
        <xsl:if test="normalize-space(header/subtitle)!=''">
          <h3>
            <xsl:value-of select="header/subtitle"/>
          </h3>
        </xsl:if>
  
        <xsl:apply-templates select="body"/>
  
        <xsl:if test="header/authors">
          <div class="author">
              <xsl:for-each select="header/authors/person">
                <xsl:choose>
                  <xsl:when test="position()=1">by </xsl:when>
                  <xsl:otherwise>, </xsl:otherwise>
                </xsl:choose>
                <xsl:value-of select="@name"/>
              </xsl:for-each>
          </div>
        </xsl:if>
  
      </div>
    </xsl:template>
  
    <xsl:template match="body">
      <xsl:if test="section and not($notoc='true')">
        <ul>
          <xsl:for-each select="section">
          	<li>
          		<a>
  		        	<xsl:attribute name="href">
  		                <xsl:text>#</xsl:text><xsl:call-template name="generate-id"/>
  		            </xsl:attribute>
  		            <xsl:value-of select="title"/>
  	            </a>
  		        <xsl:if test="section">
  		        	<ul>
  		                <xsl:for-each select="section">
  		                  <li>
  			                  <a>
  			                      <xsl:attribute name="href">
  			                        <xsl:text>#</xsl:text><xsl:call-template name="generate-id"/>
  			                      </xsl:attribute>
  			                      <xsl:value-of select="title"/>
  			                  </a>
  		                  </li>
  		                </xsl:for-each>
  		            </ul>
  		        </xsl:if>
            	</li>
          </xsl:for-each>
        </ul>
      </xsl:if>
      <xsl:apply-templates/>
    </xsl:template>
  
    <xsl:template name="generate-id">
      <xsl:choose>
        <xsl:when test="@id">
          <xsl:value-of select="@id"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="generate-id(.)"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:template>
  
    <xsl:template match="@id">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="section">
      <xsl:apply-templates select="@id"/>
  
      <xsl:variable name = "level" select = "count(ancestor::section)+1" />
  
      <xsl:choose>
        <xsl:when test="$level=1">
          <h2><xsl:value-of select="title"/></h2>
          <xsl:apply-templates/>  
        </xsl:when>
        <xsl:when test="$level=2">
          <div class="level2title"><xsl:value-of select="title"/></div>
          <div class="section"><xsl:apply-templates select="*[not(self::title)]"/></div>
        </xsl:when>
        <!-- If a faq, answer sections will be level 3 (1=Q/A, 2=part) -->
        <xsl:when test="$level=3 and $notoc='true'">
          <h4><xsl:value-of select="title"/></h4>
          <div align="right"><a href="#{@id}-menu">^</a></div>
          <div style="margin-left: 15px">
            <xsl:apply-templates select="*[not(self::title)]"/>
          </div>
        </xsl:when>
        <xsl:when test="$level=3">
          <h4><xsl:value-of select="title"/></h4>
          <xsl:apply-templates select="*[not(self::title)]"/>
  
        </xsl:when>
  
        <xsl:otherwise>
          <h5><xsl:value-of select="title"/></h5>
          <xsl:apply-templates select="*[not(self::title)]"/>
        </xsl:otherwise>
      </xsl:choose>
  
    </xsl:template>  
  
    <xsl:template match="note | warning | fixme">
      <xsl:apply-templates select="@id"/>
      <div class="frame {local-name()}">
        <div class="label">
          <xsl:choose>
            <xsl:when test="local-name() = 'note'">Note</xsl:when>
            <xsl:when test="local-name() = 'warning'">Warning</xsl:when>
            <xsl:otherwise>Fixme (
                 <xsl:value-of select="@author"/>
  
                 )</xsl:otherwise>
          </xsl:choose>
        </div>
        <div class="framecontent">
          <xsl:apply-templates/>
        </div>
      </div>
    </xsl:template>
  
    <xsl:template match="link">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="jump">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="fork">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="p[@xml:space='preserve']">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="source">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="anchor">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="icon">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="code">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="figure">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="table">
      <xsl:apply-imports/>
    </xsl:template>
  
    <xsl:template match="title">
      <!-- do not show title elements, they are already in other places-->
    </xsl:template>
    
    <!-- Generates the PDF link -->
    <xsl:template name="pdflink">
    	<a href="{$filename-noext}.pdf" id="printable"><img src="{$skin-img-dir}/pdfdoc.gif"
        alt="PDF"/>PDF version</a>
    </xsl:template>
    
  
  </xsl:stylesheet>
  
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/xslt/html/site2xhtml.xsl
  
  Index: site2xhtml.xsl
  ===================================================================
  <?xml version="1.0"?>
  <!--
  site2xhtml.xsl is the final stage in HTML page production.  It merges HTML from
  document2html.xsl, tab2menu.xsl and book2menu.xsl, and adds the site header,
  footer, searchbar, css etc.  As input, it takes XML of the form:
  
  <site>
    <div class="menu">
      ...
    </div>
    <div class="tab">
      ...
    </div>
    <div class="content">
      ...
    </div>
  </site>
  
  $Id: site2xhtml.xsl,v 1.1 2003/06/03 12:17:38 jefft Exp $
  -->
  
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
    <xsl:import href="../../../common/xslt/html/site2xhtml.xsl"/>
  
    <xsl:variable name="header-color" select="'#FFFFFF'"/>
    <xsl:variable name="header-color2" select="'#a5b6c6'"/>
    <xsl:variable name="menu-border" select="'#F7F7F7'"/>
    <xsl:variable name="background-bars" select="'#CFDCED'"/>
  
  
    <xsl:template match="site">
      <html>
        <head>
          <title><xsl:value-of select="div[@class='content']/div[@class='pagetitle']"/></title>
          <link rel="stylesheet" href="{$root}skin/page.css" type="text/css"/>
  		 <link rel="shortcut icon" href="{$root}favicon.ico" />		 
        </head>
        <body>
        	<div id="toplinks">
  			<script type="text/javascript" language="JavaScript" src="{$root}skin/breadcrumbs.js"></script>
  		</div>
  		
          <!-- ================= start Banner ================== -->
          <form method="get" action="http://www.google.com/search">
  			<div id="mainheader">
  	          <!-- ================= start Group Logo ================== -->
  	          <xsl:if test="$config/group-url">
  	  	      	<xsl:call-template name="renderlogo">
  		        	<xsl:with-param name="name" select="$config/group-name"/>
  		            <xsl:with-param name="url" select="$config/group-url"/>
  		            <xsl:with-param name="logo" select="$config/group-logo"/>
  		            <xsl:with-param name="root" select="$root"/>
  		            <xsl:with-param name="imgid">grouplogo</xsl:with-param>
  		            <xsl:with-param name="linkid">grouplogolink</xsl:with-param>
  		            <xsl:with-param name="height">65</xsl:with-param>
  		            <xsl:with-param name="width">220</xsl:with-param>
  		          </xsl:call-template>
  		      </xsl:if>
  	          <!-- ================= end Group Logo ================== -->
  	          <span class="textonly"> - </span>
  	          <!-- ================= start Search ================== -->
  	          <xsl:if test="not($config/disable-search) or
  	                $config/disable-search='false' and $config/searchsite-domain and
  	                $config/searchsite-name">
  	              <span id="search">
  		              <input type="hidden" name="as_sitesearch" value="{$config/searchsite-domain}"/>
  		              <input type="text" class="query" name="as_q"/>
  		              <input type="submit" value="Search"/>
  		              <br />
  		              <span class="searchtext">
  		                the <xsl:value-of select="$config/searchsite-name"/> site
  		              </span>
  		          </span>
  	          </xsl:if>
  			  <!-- ================= end Search ================== -->
  			  <span class="textonly"> - </span>
  	          <!-- ================= start Project Logo ================== -->
  	          <xsl:if test="$config/project-url">
  	              <xsl:call-template name="renderlogo">
  	                <xsl:with-param name="name" select="$config/project-name"/>
  	                <xsl:with-param name="url" select="$config/project-url"/>
  	                <xsl:with-param name="logo" select="$config/project-logo"/>
  	                <xsl:with-param name="root" select="$root"/>
  		            <xsl:with-param name="imgid">projectlogo</xsl:with-param>
  		            <xsl:with-param name="linkid">projectlogolink</xsl:with-param>
  		            <xsl:with-param name="height">65</xsl:with-param>
  		            <xsl:with-param name="width">220</xsl:with-param>
  	              </xsl:call-template>
  	          </xsl:if>
  	          <!-- ================= end Project Logo ================== -->
  	        </div>    
  		</form>
  		
  		<hr class="textonly"/>
  
          <!-- ================= start Content================== -->
          <xsl:apply-templates select="div[@class='content']"/>
          <!-- ================= end Content================== -->
  
  		<hr class="textonly"/>
  
  		<div id="nav">
  	        <!-- ================= start Tabs ================== -->
  	        <xsl:apply-templates select="div[@id='tabs']"/>
  	        <!-- ================= end Tabs ================== -->
  	
  	        <!-- ================= end Banner ================== -->
  	
  	        <div class="navsection">
  	        	<xsl:for-each select = "div[@class='menu']/ul/li">
  	              <xsl:call-template name = "innermenuli" />
  	            </xsl:for-each>
  	        </div>
  	    </div>
  
  		<p class="textonly"/>
  		<hr class="textonly"/>
  
          <!-- ================= start Footer ================== -->
          <div id="footer">
  			<a href="{$skin-img-dir}/label.gif"/>
  			<a href="{$skin-img-dir}/page.gif"/>
  			<a href="{$skin-img-dir}/chapter.gif"/>
  			<a href="{$skin-img-dir}/chapter_open.gif"/>
  			<a href="{$skin-img-dir}/current.gif"/>
  			<a href="/favicon.ico"/>
  	
  			<span id="copyright">Copyright &#169;
  				<xsl:value-of select="$config/year"/>&#160;<xsl:value-of
  			  select="$config/vendor"/> All rights reserved.
  			</span>
  			<br class="textonly"/>
  			<span id="revision"><script language="JavaScript" type="text/javascript"><![CDATA[<!--
  			  document.write(" - "+"Last Published: " + document.lastModified);
  			  //  -->]]></script>
  			</span>
  			<br class="textonly"/>
  	
  	        <xsl:if test="$config/host-logo and not($config/host-logo = '')">
  	          <div class="host">
  	            <img src="{$root}skin/images/spacer.gif" width="10" height="1" alt=""/>
  	            <xsl:call-template name="renderlogo">
  	              <xsl:with-param name="name" select="$config/host-name"/>
  	              <xsl:with-param name="url" select="$config/host-url"/>
  	              <xsl:with-param name="logo" select="$config/host-logo"/>
  	              <xsl:with-param name="root" select="$root"/>
  	            </xsl:call-template>
  	          </div>
  	        </xsl:if>
  	
  			<span id="validation">
  	        	<xsl:call-template name="compliancy-logos"/>
  		        <xsl:if test="$filename = 'index.html' and $config/credits">
  		            <xsl:for-each select="$config/credits/credit[not(@role='pdf')]">
  		              <xsl:variable name="name" select="name"/>
  		              <xsl:variable name="url" select="url"/>
  		              <xsl:variable name="image" select="image"/>
  		              <xsl:variable name="width" select="width"/>
  		              <xsl:variable name="height" select="height"/>
  		              <a href="{$url}">
  		                <img alt="{$name} logo" border="0">
  		                  <xsl:attribute name="src">
  		                    <xsl:if test="not(starts-with($image, 'http://'))"><xsl:value-of select="$root"/></xsl:if>
  		                    <xsl:value-of select="$image"/>
  		                  </xsl:attribute>
  		                  <xsl:if test="$width"><xsl:attribute name="width"><xsl:value-of select="$width"/></xsl:attribute></xsl:if>
  		                  <xsl:if test="$height"><xsl:attribute name="height"><xsl:value-of select="$height"/></xsl:attribute></xsl:if>
  		                </img>
  		                <img src="{$spacer}" border="0" alt="" width="5" height="1" />
  		              </a>
  		            </xsl:for-each>
  		        </xsl:if>
  		    </span>
  	    </div>
          <!-- ================= end Footer ================== -->
        </body>
      </html>
    </xsl:template>
  
  
    <xsl:template name="innermenuli">
      <h3 class="navsectionheader"><xsl:value-of select="font"/><span class="textonly">:</span></h3>
    	<xsl:for-each select= "ul/li">
  		<xsl:choose>
          	<xsl:when test="a">
              	<a href="{a/@href}" class="navitem"><xsl:value-of select="a" /></a>
              </xsl:when>
              <xsl:when test="span/@class='sel'">
                  <span class="navitem"><xsl:value-of select="span" /></span>
              </xsl:when>
              <xsl:otherwise>
                <xsl:call-template name = "innermenuli" />
              </xsl:otherwise>
            </xsl:choose>
            <span class="textonly">-</span>
    	</xsl:for-each>
    </xsl:template>
  
    <xsl:template name="renderlogo">
      <xsl:param name="name"/>
      <xsl:param name="url"/>
      <xsl:param name="logo"/>
      <xsl:param name="width"/>
      <xsl:param name="height"/>
      <xsl:param name="root"/>
      <xsl:param name="linkid"/>
      <xsl:param name="imgid"/>
      <a href="{$url}">
      	<xsl:if test="$linkid and not($linkid = '')">
      		<xsl:attribute name="id">
      			<xsl:value-of select="$linkid"/>
      		</xsl:attribute>
      	</xsl:if>
        	<xsl:choose>
          	<xsl:when test="$logo and not($logo = '')">
            		<img alt="{$name}">
              		<xsl:attribute name="src">
  		      			<xsl:if test="not(starts-with($logo, 'http://'))">
  		      				<xsl:value-of select="$root"/>
  		      			</xsl:if>
  	              		<xsl:value-of select="$logo"/>
              		</xsl:attribute>
              		<xsl:if test="$width">
                			<xsl:attribute name="width">
                				<xsl:value-of select="$width"/>
                			</xsl:attribute>
              		</xsl:if>
              		<xsl:if test="$height">
                			<xsl:attribute name="height">
                				<xsl:value-of select="$height"/>
                			</xsl:attribute>
              		</xsl:if>
              		<xsl:if test="$imgid and not ($imgid='')">
              			<xsl:attribute name="id">
              				<xsl:value-of select="$imgid" />
              			</xsl:attribute>
              		</xsl:if>
  	  			</img>
          	</xsl:when>
         		<xsl:otherwise><xsl:value-of select="$name"/></xsl:otherwise>
  		</xsl:choose>
      </a>
    </xsl:template>
    
    <xsl:template match="node()|@*" priority="-1">
      <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates/>
      </xsl:copy>
    </xsl:template>
     
  
  </xsl:stylesheet>
  
  
  
  1.1                  xml-forrest/src/resources/skins/forrest-css/xslt/html/tab2menu.xsl
  
  Index: tab2menu.xsl
  ===================================================================
  <?xml version="1.0"?>
  <!--
  This stylesheet generates 'tabs' at the top left of the Forrest skin.  Tabs are
  visual indicators that a certain subsection of the URI space is being browsed.
  For example, if we had tabs with paths:
  
  Tab1:  ''
  Tab2:  'community'
  Tab3:  'community/howto'
  Tab4:  'community/howto/xmlform/index.html'
  
  Then if the current path was 'community/howto/foo', Tab3 would be highlighted.
  The rule is: the tab with the longest path that forms a prefix of the current
  path is enabled.
  
  The output of this stylesheet is HTML of the form:
      <div class="tab">
        ...
      </div>
  
  which is then merged by site2xhtml.xsl
  
  $Id: tab2menu.xsl,v 1.1 2003/06/03 12:17:38 jefft Exp $
  -->
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
    <xsl:import href="../../../common/xslt/html/tab2menu.xsl"/>
  
    <xsl:template match="tabs">
    	<div id="tabs">
      	<h2 id="categories">
            <xsl:call-template name="base-tabs"/>
          </h2>
  	</div>       
    </xsl:template>
  
    <xsl:template name="pre-separator">
    </xsl:template>
  
    <xsl:template name="post-separator">
    </xsl:template>
  
    <xsl:template name="separator">
      <span class="textonly">-</span>
    </xsl:template>
  
    <xsl:template name="selected">
      <span class="category"><xsl:value-of select="@label"/></span>
    </xsl:template>
  
    <xsl:template name="not-selected">
      <a class="category">
        <xsl:attribute name="href">
          <xsl:call-template name="calculate-tab-href">
            <xsl:with-param name="tab" select="."/>
            <xsl:with-param name="path" select="$path"/>
          </xsl:call-template>
        </xsl:attribute>
        <xsl:value-of select="@label"/>
      </a>           
    </xsl:template>
  
  </xsl:stylesheet>