## ====================================================================
##  The Apache Software License, Version 1.1
## 
##  Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
##  reserved.
## 
##  Redistribution and use in source and binary forms, with or without
##  modification, 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" and "Apache Software Foundation" and
##     "Apache Turbine" 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",
##     "Apache Turbine", 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 (INCLUDING, 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/>.
##
## @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
## @version $Id$

##
## Build the <head> ... </head> tag of a web page with VelocityOnly Layout
## 

#macro (TurbineHtmlHead)
<head>
  #if ($!page.Title)
    <title>$page.Title</title>
  #end
  #if ($page.MetaTags.size() > 0)
    #foreach($metaTag in $page.MetaTags.keySet())
      <meta name="$metaTag" content="$page.MetaTags.get($metaTag)">
    #end
  #end
  #if ($page.HttpEquivs.size() > 0)
    #foreach($httpEquiv in $page.HttpEquivs.keySet())
      <meta http-equiv="$httpEquiv" content="$page.HttpEquivs.get($httpEquiv)">
    #end
  #end
  #if ($page.StyleSheets.size() > 0)
    #foreach( $styleSheet in $page.StyleSheets )
      <link rel="stylesheet" href="$styleSheet.Url"
        #if($!styleSheet.Type)  type="$styleSheet.Type"   #end
        #if($!styleSheet.Media) media="$styleSheet.Media" #end
        #if($!styleSheet.Title) title="$styleSheet.Title" #end
      >
    #end
  #end
  #if ($page.Styles.size() > 0)
      <style type="text/css">
    #foreach( $style in $page.Styles )
        $!style
    #end
      </style>
  #end
  #if ($page.Scripts.size() > 0)
    #foreach( $script in $page.Scripts )
      <script type="text/javascript" src="$script" language="JavaScript"></script>
    #end
  #end
</head>
#end

##
## Build the Tags for the Body start tag of a web page with VelocityOnly Layout
## <body #TurbineHtmlBodyAttributes() >
## 

#macro (TurbineHtmlBodyAttributes)
#if ($page.BodyAttributes.size() > 0)
    #foreach( $attributeName in $page.BodyAttributes.keySet() )
      $attributeName = "$page.BodyAttributes.get($attributeName)"
    #end
#end
#end
