## 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.
##
#macro ( topMenu $menus )
#**##foreach( $menu in $menus )
#**##if ( $menu.name )
      <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown">$menu.name <b class="caret"></b></a>
        <ul class="dropdown-menu">
#*    *##foreach( $item in $menu.items )
#*      *##if ($item.items.size() > 0)
            <li class="dropdown-submenu">
#*            *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*            *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
#*            *##topLink( $currentItemHref $item.name $item.target )

              <ul class="dropdown-menu">
#*            *##foreach($subitem in $item.items)
#*              *##set ( $currentItemHref = $PathTool.calculateLink( $subitem.href, $relativePath ) )
#*              *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
                  <li>#topLink( $currentItemHref $subitem.name $subitem.target )</li>
#*            *##end
              </ul>
            </li>
#*      *##else
#*        *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*        *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
            <li>#topLink( $currentItemHref $item.name $item.target )</li>
#*      *##end
#*    *##end
        </ul>
      </li>
#**##end
#**##end
#end
##
#macro ( topLink $href $name $target )
#**##set ( $linkTitle = ' title="' + $name + '"' )
#**##if( $target )
#*  *##set ( $linkTarget = ' target="' + $target + '"' )
#**##else
#*  *##set ( $linkTarget = "" )
#**##end
#**#<a href="$href"$linkTarget title="$name">$name</a>##
#end
##
#macro ( topLinks $links )
#**##set ( $counter = 0 )
#**##foreach( $item in $links )
#*  *##set ( $counter = $counter + 1 )
#*  *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*  *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
    <li>#topLink( $currentItemHref $item.name $item.target )</li>
#**##end
#end
##
#macro ( link $href $name $target $img $position $alt $border $width $height $icon)
#**##set ( $linkTitle = ' title="' + $name + '"' )
#**##if( $target )
#*  *##set ( $linkTarget = ' target="' + $target + '"' )
#**##else
#*  *##set ( $linkTarget = "" )
#**##end
#**##if ( $decoration.isLink( $href ) )
#*  *##set ( $linkClass = ' class="externalLink"' )
#**##else
#*  *##set ( $linkClass = "" )
#**##end
#**##if ( $img )
#*  *##if ( $position == "left" )
#*    *#<a href="$href"$linkClass$linkTarget$linkTitle>#image($img $alt $border $width $height)$name</a>##
#*  *##else
#*    *#<a href="$href"$linkClass$linkTarget$linkTitle>$name #image($img $alt $border $width $height)</a>##
#*  *##end
#**##else
#*  *#<a href="$href"$linkClass$linkTarget$linkTitle>##
#*  *##if($icon)
#*    *#<span class="$icon"></span>##
#*  *##end
#*  *#$name</a>##
#**##end
#end
##
#macro ( image $img $alt $border $width $height )
#**##if( $img )
#*  *##if ( !$decoration.isLink( $img ) )
#*    *##set ( $imgSrc = $PathTool.calculateLink( $img, $relativePath ) )
#*    *##set ( $imgSrc = $imgSrc.replaceAll( '\\', '/' ) )
#*    *##set ( $imgSrc = ' src="' + $imgSrc + '"' )
#*  *##else
#*    *##set ( $imgSrc = ' src="' + $img + '"' )
#*  *##end
#*  *##if( $alt )
#*    *##set ( $imgAlt = ' alt="' + $alt + '"' )
#*  *##else
#*    *##set ( $imgAlt = ' alt=""' )
#*  *##end
#*  *##if( $border )
#*    *##set ( $imgBorder = ' border="' + $border + '"' )
#*  *##else
#*    *##set ( $imgBorder = "" )
#*  *##end
#*  *##if( $width )
#*    *##set ( $imgWidth = ' width="' + $width + '"' )
#*  *##else
#*    *##set ( $imgWidth = "" )
#*  *##end
#*  *##if( $height )
#*    *##set ( $imgHeight = ' height="' + $height + '"' )
#*  *##else
#*    *##set ( $imgHeight = "" )
#*  *##end
<img class="imageLink"$imgSrc$imgAlt$imgBorder$imgWidth$imgHeight/>##
#**##end
#end
##
#macro ( banner $banner $id )
#**##if ( $banner )
#*  *##if( $banner.href )
#*    *##set ( $hrf = $banner.href )
#*    *##if ( !$decoration.isLink( $hrf ) )
#*      *##set ( $hrf = $PathTool.calculateLink( $hrf, $relativePath ) )
#*      *##set ( $hrf = $hrf.replaceAll( '\\', '/' ) )
#*      *##if ( ( $hrf == '' ) )
#*        *##set ( $hrf = './' )
#*      *##end
#*    *##end
#*    *#<a href="$hrf" id="$id"#if( $banner.alt ) title="$banner.alt"#end>##
#*  *##else
#*    *#<div id="$id">##
#*  *##end
##
#*  *##if( $banner.src )
#*    *##set ( $src = $banner.src )
#*    *##if ( !$decoration.isLink( $src ) )
#*      *##set ( $src = $PathTool.calculateLink( $src, $relativePath ) )
#*      *##set ( $src = $src.replaceAll( '\\', '/' ) )
#*    *##end
#*    *##if ( $banner.alt )
#*      *##set ( $alt = ' alt="' + $banner.alt + '"' )
#*    *##elseif ( $banner.name )
#*      *##set ( $alt = ' alt="' + $banner.name + '"' )
#*    *##else
#*      *##set ( $alt = ' alt=""' )
#*    *##end
#*    *##if( $banner.border )
#*      *##set ( $imgBorder = ' border="' + $banner.border + '"' )
#*    *##else
#*      *##set ( $imgBorder = "" )
#*    *##end
#*    *##if( $banner.width )
#*      *##set ( $imgWidth = ' width="' + $banner.width + '"' )
#*    *##else
#*      *##set ( $imgWidth = "" )
#*    *##end
#*    *##if( $banner.height )
#*      *##set ( $imgHeight = ' height="' + $banner.height + '"' )
#*    *##else
#*      *##set ( $imgHeight = "" )
#*    *##end
#*    *##if( $banner.title )
#*      *##set ( $bannerTitle=' title="' + $banner.title + '"' )
#*    *##else
#*      *##set ( $bannerTitle="" )
#*    *##end
#*    *#<img src="$src" $alt$bannerTitle$imgBorder$imgWidth$imgHeight/>##
#*  *##else
#*    *#<h2>$banner.name</h2>
#*  *##end
##
#*  *##if( $banner.href )
#*    *#</a>##
#*  *##else
#*    *#</div>
#*  *##end
#**##end
#end
##
#macro ( links $links )
#**##set ( $counter = 0 )
#**### MSKINS-41
#**##set ( $begin = $links.size() - 1 )
#**##foreach( $index in [$begin..0] )
#*  *##set ( $item = $links.get( $index ) )
#*  *##set ( $counter = $counter + 1 )
#*  *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*  *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
##
      <li class="pull-right">##
#*  *##if ( $counter > 0 && $counter < $links.size() )
#*  *#<span class="divider">|</span>
#*  *##end
#*  *##link( $currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height false)
#*  *#</li>
#**##end
#end
##
#macro ( breadcrumbs $breadcrumbs $cssClass )
#**##set ( $breadcrumbDivider = $decoration.getCustomValue( 'fluidoSkin.breadcrumbDivider', '/' ) )
#**##foreach( $item in $breadcrumbs )
#*  *##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#*  *##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
#*  *##if ( ( $currentItemHref == '' ) )
#*    *##set ( $currentItemHref = './' )
#*  *##end
##
      <li class="$cssClass">##
#*  *##link( $currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height false )
#*  *#<span class="divider">$breadcrumbDivider</span>##
#*  *#</li>
#**##end
#**### add Edit button if content is editable
#**##if( $decoration.edit && $docRenderingContext.editable )
#*  *##set ( $edit = ' <a href="' + $docRenderingContext.getDoxiaSourcePath( $decoration.edit ) + '"><img src="' + $relativePath + '/images/accessories-text-editor.png" title="Edit" /></a>' )
#**##end
#**##if ( $shortTitle )
    <li class="active $cssClass">$shortTitle$!edit</li>
#**##else
    <li class="active $cssClass">$title$!edit</li>
#**##end
#end
##
#macro ( displayTree $display $item )
#**##if ( $item && $item.items && $item.items.size() > 0 )
#*  *##foreach( $subitem in $item.items )
#*    *##set ( $subitemHref = $PathTool.calculateLink( $subitem.href, $relativePath ) )
#*    *##set ( $subitemHref = $subitemHref.replaceAll( '\\', '/' ) )
##
#*    *##if ( $alignedFileName == $subitemHref )
#*      *##set ( $display = true )
#*    *##end
##
#*    *##displayTree( $display $subitem )
#*  *##end
#**##end
#end
##
#macro ( menuItem $item $indent )
#**##set ( $collapseClass = "none" )
#**##set ( $currentItemHref = $PathTool.calculateLink( $item.href, $relativePath ) )
#**##set ( $currentItemHref = $currentItemHref.replaceAll( '\\', '/' ) )
##
#**##if ( $item && $item.items && $item.items.size() > 0 )
#*  *##if ( $item.collapse == false )
#*    *##set ( $collapseClass = "icon-chevron-down" )
#*  *##else
#*    *### By default collapsed
#*    *##set ( $collapseClass = "icon-chevron-right" )
#*  *##end
##
#*  *##set ( $display = false )
#*  *##displayTree( $display $item )
##
#*  *##if ( $alignedFileName == $currentItemHref || $display )
#*    *##set ( $collapseClass = "icon-chevron-down" )
#*  *##end
#**##end
##
#**##if ( $alignedFileName == $currentItemHref )
$indent    <li class="active">##
#**##else
$indent    <li>##
#**##end
##
#**##if ( $item.img )
#*  *##if ( $item.position == "left" )
#*    *##if ( $alignedFileName == $currentItemHref )
#*      *#<a href="#">#image($item.img $item.alt $item.border $item.width $item.height) $item.name</a>##
#*    *##else
#*      *##link($currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height false)
#*    *##end
#*  *##else
#*    *##if ( $alignedFileName == $currentItemHref )
#*      *#<a href="#">$item.name #image($item.img $item.alt $item.border $item.width $item.height)</a>##
#*    *##else
#*      *##link($currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height false)
#*    *##end
#*  *##end
#**##else
#*  *##if ( $alignedFileName == $currentItemHref )
#*    *#<a href="#"><span class="$collapseClass"></span>$item.name</a>##
#*  *##else
#*    *##link( $currentItemHref $item.name $item.target $item.img $item.position $item.alt $item.border $item.width $item.height $collapseClass)
#*  *##end
#**##end
#**##if ( $item && $item.items && $item.items.size() > 0 )
#*  *##if ( $collapseClass == "icon-chevron-down" )

$indent     <ul class="nav nav-list">
#*    *##foreach( $subitem in $item.items )
#*      *##menuItem( $subitem "$indent  " )
#*    *##end
$indent     </ul>##
#*  *##end
#**##end
#**#</li>
#end
##
#macro ( mainMenu $menus )
  <ul class="nav nav-list">
#**##foreach( $menu in $menus )
#**##if ( $menu.name )
#*  *##if ( $menu.img )
#*    *##if( $menu.position )
#*      *##set ( $position = $menu.position )
#*    *##else
#*      *##set ( $position = "left" )
#*    *##end
##
#*    *##if ( !$decoration.isLink( $menu.img ) )
#*      *##set ( $src = $PathTool.calculateLink( $menu.img, $relativePath ) )
#*      *##set ( $src = $src.replaceAll( '\\', '/' ) )
#*      *##set ( $src = ' src="' + $src + '"' )
#*    *##else
#*      *##set ( $src = ' src="' + $menu.img + '"' )
#*    *##end
##
#*    *##if( $menu.alt )
#*      *##set ( $alt = ' alt="' + $menu.alt + '"' )
#*    *##else
#*      *##set ( $alt = ' alt="' + $menu.name + '"' )
#*    *##end
##
#*    *##if( $menu.border )
#*      *##set ( $border = ' border="' + $menu.border + '"' )
#*    *##else
#*      *##set ( $border = ' border="0"' )
#*    *##end
##
#*    *##if( $menu.width )
#*      *##set ( $width = ' width="' + $menu.width + '"' )
#*    *##else
#*      *##set ( $width = "" )
#*    *##end
#*    *##if( $menu.height )
#*      *##set ( $height = ' height="' + $menu.height + '"' )
#*    *##else
#*      *##set ( $height = "" )
#*    *##end
##
#*    *##set ( $img = '<img class="imageLink"' + $src + $alt + $border + $width + $height + "/>" )
##
#*    *##if ( $position == "left" )
   <li class="nav-header">$img $menu.name</li>
#*    *##else
   <li class="nav-header">$menu.name $img</li>
#*    *##end
#*  *##else
   <li class="nav-header">$menu.name</li>
#*  *##end
#**##end
#**##if ( $menu.items && $menu.items.size() > 0 )
#*  *##foreach( $item in $menu.items )
#*    *##menuItem( $item '' )
#*  *##end
#**##end
#**##end
  </ul>
#end
##
#macro ( copyright )
#**##if ( $project )
#*  *##if ( ${project.organization} && ${project.organization.name} )
#*    *##set ( $period = "" )
#*  *##else
#*    *##set ( $period = "." )
#*  *##end
##
#*  *##set ( $currentYear = ${currentDate.year} + 1900 )
##
#*  *##if ( ${project.inceptionYear} && ( ${project.inceptionYear} != ${currentYear.toString()} ) )
      ${project.inceptionYear}&#x2013;${currentYear}${period}##
#*  *##else
      ${currentYear}${period}##
#*  *##end
##
#*  *##if ( ${project.organization} )
#*    *##if ( ${project.organization.name} && ${project.organization.url} )
#*      *#<a href="$project.organization.url">${project.organization.name}</a>.
#*    *##elseif ( ${project.organization.name} )
#*      *#${project.organization.name}.
#*    *##end
#*  *##end
#**##end
#end
##
#macro ( publishDate $position $decorationPublishDate $version )
#**##if ( $publishDate )
#*  *##set ( $dateValue = $dateFormat.format( $publishDate ) )
#**##elseif ( $decoration.custom.getChild( 'publishDate' ) )
#*  *##set ( $dateValue = $decoration.custom.getChild( 'publishDate' ).getValue() )
#**##else
#*  *##set ( $dateValue = $dateFormat.format( $currentDate ) )
#**##end
##
#**##set ( $datePosition = $decorationPublishDate.position )
#**##set ( $versionPosition = $version.position )
##
#**##set ( $breadcrumbs = $decoration.body.breadcrumbs )
#**##set ( $links = $decoration.body.links )
##
#**##if ( $datePosition.equalsIgnoreCase( "right" ) && ( $versionPosition.equalsIgnoreCase( "right" ) || !$topBarEnabled
                                                                                                         && $decoration.body.links
                                                                                                         && $decoration.body.links.size() > 0) )
#*  *##set ( $prefix = '<span class="divider">|</span> ' )
#**##else
#*  *##set ( $prefix = "" )
#**##end
##
#**##if ( $datePosition.equalsIgnoreCase( $position ) )
#*  *##if ( ( $datePosition.equalsIgnoreCase( "right" ) ) || ( $datePosition.equalsIgnoreCase( "bottom" ) ) )
        <li id="publishDate" class="pull-right">$prefix$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateValue</li>
#*    *##if ( $versionPosition.equalsIgnoreCase( $position ) )
          <li id="projectVersion" class="pull-right">##
#*      *##if ( !$topBarEnabled
              && $decoration.body.links
              && $decoration.body.links.size() > 0 )
#*        *#<span class="divider">|</span>##
#*      *##end
#*      *#$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}##
#*      *#</li>
#*    *##end
#*  *##elseif ( ( $datePosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $datePosition.equalsIgnoreCase( "navigation-top" ) ) )
      <div id="lastPublished">
        <span id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateValue</span>
#*    *##if ( $versionPosition.equalsIgnoreCase( $position ) )
        <span class="divider">|</span> <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
#*    *##end
      </div>
#*  *##elseif ( $datePosition.equalsIgnoreCase("left") )
        <li id="publishDate">$i18n.getString( "site-renderer", $locale, "template.lastpublished" ): $dateValue##
#*    *##if ( $versionPosition.equalsIgnoreCase( $position ) || $breadcrumbs && $breadcrumbs.size() > 0)
#*      *#<span class="divider">|</span>
#*    *##end
#*    *#</li>
#*    *##if ( $versionPosition.equalsIgnoreCase( $position ) )
          <li id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}##
#*      *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*        *#<span class="divider">|</span>##
#*      *##end
#*      *#</li>
#*    *##end
#*    *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*      *##breadcrumbs( $breadcrumbs "" )
#*    *##end
#*  *##end
#**##elseif ( $versionPosition.equalsIgnoreCase( $position ) )
#*  *##if ( $versionPosition.equalsIgnoreCase( "right" ) )
      <li id="projectVersion" class="pull-right">$prefix$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</li>
#*  *##elseif ( $versionPosition.equalsIgnoreCase( "bottom" ) )
      <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
#*  *##elseif ( ( $versionPosition.equalsIgnoreCase( "navigation-bottom" ) ) || ( $versionPosition.equalsIgnoreCase( "navigation-top" ) ) )
      <div id="lastPublished">
        <span id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}</span>
      </div>
#*  *##elseif ( $versionPosition.equalsIgnoreCase("left") )
        <li id="projectVersion">$i18n.getString( "site-renderer", $locale, "template.version" ): ${project.version}##
#*      *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*        *#<span class="divider">|</span>##
#*      *##end
#*    *#</li>
#*    *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*      *##breadcrumbs( $breadcrumbs "")
#*    *##end
#*  *##end
#**##elseif ( $position.equalsIgnoreCase( "left" ) )
#*  *##if ( $breadcrumbs && $breadcrumbs.size() > 0 )
#*    *##breadcrumbs( $breadcrumbs "" )
#*  *##end
#**##end
#end
##
#macro ( builtByLogo $poweredBy )
#**##if( $poweredBy )
#**##foreach ($item in $poweredBy)
#*  *##if( $item.href )
#*    *##set ( $href = $PathTool.calculateLink( $item.href, $relativePath ) )
#*    *##set ( $href = $href.replaceAll( '\\', '/' ) )
#*  *##else
#*    *##set ( $href="https://maven.apache.org/" )
#*  *##end
##
#*  *##if( $item.name )
#*    *##set ( $name = $item.name )
#*  *##else
#*    *##set ( $name = $i18n.getString( "site-renderer", $locale, "template.builtby" )  )
#*    *##set ( $name = "${name} Maven"  )
#*  *##end
##
#*  *##if( $item.img )
#*    *##set ( $img = $item.img )
#*  *##else
#*    *##set ( $img = "images/logos/maven-feather.png" )
#*  *##end
##
#*  *##if ( !$decoration.isLink( $img ) )
#*    *##set ( $img = $PathTool.calculateLink( $img, $relativePath ) )
#*    *##set ( $img = $img.replaceAll( '\\', '/' ) )
#*  *##end
##
#*  *##if( $item.alt )
#*    *##set ( $alt = ' alt="' + $item.alt + '"' )
#*  *##else
#*    *##set ( $alt = ' alt="' + $name + '"' )
#*  *##end
##
#*  *##if( $item.border )
#*    *##set ( $border = ' border="' + $item.border + '"' )
#*  *##else
#*    *##set ( $border = "" )
#*  *##end
##
#*  *##if( $item.width )
#*    *##set ( $width = ' width="' + $item.width + '"' )
#*  *##else
#*    *##set ( $width = "" )
#*  *##end
#*  *##if( $item.height )
#*    *##set ( $height = ' height="' + $item.height + '"' )
#*  *##else
#*    *##set ( $height = "" )
#*  *##end
##
#*  *#<a href="$href" title="$name" class="builtBy">##
#*    *#<img class="builtBy" $alt src="$img" $border $width $height />##
#*  *#</a>
#**##end
#**##if( $poweredBy.isEmpty() )
#*  *#<a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">##
#*    *#<img class="builtBy" alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" src="$relativePath/images/logos/maven-feather.png" />##
#*  *#</a>
#**##end
#**##else
#**#<a href="http://maven.apache.org/" title="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" class="poweredBy">##
#*  *#<img class="builtBy" alt="$i18n.getString( "site-renderer", $locale, "template.builtby" ) Maven" src="$relativePath/images/logos/maven-feather.png" />##
#**#</a>
#**##end
#end
##
#macro ( piwik )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.piwik.piwikUrl' )
        && $decoration.getCustomChild( 'fluidoSkin.piwik.idsite' ) )
#*  *##set ( $piwikUrl =  $decoration.getCustomValue( 'fluidoSkin.piwik.piwikUrl' ) )
#*  *##set ( $idsite =  $decoration.getCustomValue( 'fluidoSkin.piwik.idsite' ) )
##
    <!-- Piwik -->
    <script>
    var pkBaseURL = (("https:" == document.location.protocol) ? "https://$piwikUrl/" : "http://$piwikUrl/");
    document.write(unescape("%3Cscript src='" + pkBaseURL + "piwik.js'%3E%3C/script%3E"));
    </script><script>
    try {
    var piwikTracker = Piwik.getTracker(pkBaseURL + "piwik.php", $idsite);
    piwikTracker.trackPageView();
    piwikTracker.enableLinkTracking();
    } catch( err ) {}
    </script><noscript><p><img src="http://$piwikUrl/piwik.php?idsite=$idsite" style="border:0" alt=""/></p></noscript>
    <!-- End Piwik Tag -->
#**##end
#end
##
#macro ( googleAnalytics $accountId )
#**##if( $accountId && $accountId != "" )
    <!-- Google Analytics -->
    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
       (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
            m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
      ga('create', '$accountId', 'auto');
      ga('send', 'pageview');
#**##if( $decoration.getCustomValue( 'fluidoSkin.googleAnalytics.anonymizeIp', 'true' ) == 'true' )
      ga('set', 'anonymizeIp', true);
#**##end
#**##if( $decoration.getCustomValue( 'fluidoSkin.googleAnalytics.forceSSL', 'true' ) == 'true' )
      ga('set', 'forceSSL', true);
#**##end
    </script>
#**##end
#end
##
#macro ( googleSearch $top )
<form id="search-form" action="https://www.google.com/search" method="get" #if ( $top ) class="navbar-search pull-right" #end>
#**##if( $decoration.getCustomChild( 'fluidoSkin.googleSearch.sitesearch' ) )
#*  *##set( $sitesearchValue = $decoration.getCustomValue( 'fluidoSkin.googleSearch.sitesearch' ) )
#**##else
#*  *##set( $startIndex = $project.url.indexOf("://") + 3 )
#*  *##set( $sitesearchValue = $project.url.substring( $startIndex, $project.url.length() ) )
#**##end
  <input value="$sitesearchValue" name="sitesearch" type="hidden"/>
  <input class="search-query" name="q" id="query" type="text" />
</form>
<script>asyncJs( 'https://cse.google.com/brand?form=search-form' )</script>
#end
##
#macro ( forkMeOnGitHub )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.gitHub.projectId' ) )
##
#*  *##set ( $gitHubProjectId = $decoration.getCustomValue( 'fluidoSkin.gitHub.projectId' ) )
##
#*  *##set ( $leftRibbon = { "red" : "forkme_left_red_aa0000.png", "green" : "forkme_left_green_007200.png", "black" : "forkme_left_darkblue_121621.png", "darkblue" : "forkme_left_darkblue_121621.png", "orange" : "forkme_left_orange_ff7600.png", "gray" : "forkme_left_gray_6d6d6d.png" } )
#*  *##set ( $rightRibbon = { "red" : "forkme_right_red_aa0000.png", "green" : "forkme_right_green_007200.png", "black" : "forkme_right_darkblue_121621.png", "darkblue" : "forkme_right_darkblue_121621.png", "orange" : "forkme_right_orange_ff7600.png", "gray" : "forkme_right_gray_6d6d6d.png" } )
##
#*  *##set ( $ribbon = $leftRibbon )
#*  *##set ( $ribbonOrientation = 'left' )
#*  *##if ( $decoration.getCustomValue( 'fluidoSkin.gitHub.ribbonOrientation', '' ).equalsIgnoreCase( 'right' ) )
#*    *##set ( $ribbonOrientation = 'right' )
#*    *##set ( $ribbon = $rightRibbon )
#*  *##end
##
#*  *##set ( $ribbonColor = 'red' )
#*  *##set ( $definedRibbonColor = $decoration.getCustomChild( 'fluidoSkin.gitHub.ribbonColor' ) )
##
#*  *##if ( $definedRibbonColor
            && ( $definedRibbonColor.getValue().equalsIgnoreCase( "red" )
            || $definedRibbonColor.getValue().equalsIgnoreCase( "green" )
            || $definedRibbonColor.getValue().equalsIgnoreCase( "black" )
            || $definedRibbonColor.getValue().equalsIgnoreCase( "orange" )
            || $definedRibbonColor.getValue().equalsIgnoreCase( "gray" ) ) )
#*    *##set ( $ribbonColor = $definedRibbonColor.getValue().toLowerCase() )
#*  *##end
##
    <a href="https://github.com/$gitHubProjectId">
      <img style="position: absolute; top: 0; $ribbonOrientation: 0; border: 0; z-index: 10000;"
        src="https://s3.amazonaws.com/github/ribbons/$ribbon.get( $ribbonColor )"
        alt="Fork me on GitHub">
    </a>
#**##end
#end
##
## activate profile background image if custom.fluidoSkin.profile value set to "retired", "pre-release" or "sandbox"
#macro ( prjProfile )
#**##set ( $profile = $decoration.getCustomValue( 'fluidoSkin.profile', '' ) )
#**##if ( $profile.equalsIgnoreCase( "retired" )
          || $profile.equalsIgnoreCase( "pre-release" )
          || $profile.equalsIgnoreCase( "sandbox" ) )
      <style type="text/css">body{background-image: url('$relativePath/images/profiles/${profile}.png');}</style>
#**##end
#end
##
#macro ( facebookLike $sideBarEnabled )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.facebookLike' ) && $project.url )
##  ## kindly hardcoded
##
#*  *##set( $layout = 'box_count' )
#*  *##if( !$sideBarEnabled )
#*    *##set( $layout = 'button_count' )
#*  *##end
##
#*  *##set( $colorscheme = 'light' )
#*  *##if( !$sideBarEnabled )
#*    *##set( $colorscheme = 'dark' )
#*  *##end
##
#*  *##set( $frameWidth = 'width:48px; height:63px' )
#*  *##if( !$sideBarEnabled )
#*    *##set( $frameWidth = 'width:100px; height:20px' )
#*  *##end
##
    <iframe src="https://www.facebook.com/plugins/like.php?href=$project.url&send=false&layout=$layout&show-faces=false&action=like&colorscheme=$colorscheme"
        style="border:none; $frameWidth; margin-top: 10px;" #if( !$sideBarEnabled ) class="pull-right" #end></iframe>
#**##end
#end
##
#macro ( followTwitter $sideBarEnabled )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.twitter.user' ) )
#*  *##set( $user = $decoration.getCustomValue( 'fluidoSkin.twitter.user' ) )
#*  *##set( $showUser = $decoration.getCustomValue( 'fluidoSkin.twitter.showUser', '' ).equalsIgnoreCase( 'true' ) )
#*  *##set( $showFollowers = $decoration.getCustomValue( 'fluidoSkin.twitter.showFollowers', '' ).equalsIgnoreCase( 'true' ) )
##
#*  *##if ( $sideBarEnabled )
#*    *##set( $dataSize = "medium" )
#*    *##set( $dataAlign = "left" )
    <div id="twitter">
#*  *##else
#*    *##set( $dataSize = "large" )
#*    *##set( $dataAlign = "right" )
    <ul class="nav pull-right"><li>
#*  *##end
##
    <a href="https://twitter.com/${user}" class="twitter-follow-button" data-show-count="${showFollowers}" data-align="${dataAlign}" data-size="${dataSize}" data-show-screen-name="${showUser}" data-lang="${locale}">Follow ${user}</a>
    <script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script>
##
#*  *##if ( $sideBarEnabled )
    </div>
#*  *##else
    </li></ul>
#*  *##end
#**##end
#end
##
#macro ( ohloh )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.ohloh.projectId' ) )
#*  *##set ( $projectId = $decoration.getCustomValue( 'fluidoSkin.ohloh.projectId' ) )
##
#*  *##set( $widget = "users_logo.js" )
##
#*  *##if ( $decoration.getCustomChild( 'fluidoSkin.ohloh.widget' ) )
#*    *##set( $definedWidget = $decoration.getCustomValue( 'fluidoSkin.ohloh.widget' ) )
##
#*    *##if ( $definedWidget.equalsIgnoreCase( "users-logo" ) )
#*      *##set( $widget = "users_logo.js" )
#*    *##elseif ( $definedWidget.equalsIgnoreCase( "users-green" ) )
#*      *##set( $widget = "users.js?style=green" )
#*    *##elseif ( $definedWidget.equalsIgnoreCase( "users-red" ) )
#*    *##set( $widget = "users.js?style=red" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "users-blue" ) )
#*    *##set( $widget = "users.js?style=blue" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "users-gray" ) )
#*    *##set( $widget = "users.js?style=gray" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "users-rainbow" ) )
#*    *##set( $widget = "users.js?style=rainbow" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "users" ) )
#*    *##set( $widget = "users.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "thin-badge" ) )
#*    *##set( $widget = "thin_badge.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "partner-badge" ) )
#*    *##set( $widget = "partner_badge.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "languages" ) )
#*    *##set( $widget = "languages.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "factoids" ) )
#*    *##set( $widget = "factoids.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "cocomo" ) )
#*    *##set( $widget = "cocomo.js" )
#*  *##elseif ( $definedWidget.equalsIgnoreCase( "stats" ) )
#*    *##set( $widget = "basic_stats.js" )
#*  *##end
#**##end
##
    <div id="ohloh" class="pull-right">
      <script src="https://www.ohloh.net/p/${projectId}/widgets/project_${widget}"></script>
    </div>
  #end
#end
##
#macro ( flattrHead )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.flattr.thing' )
          && ( $decoration.getCustomChild( 'fluidoSkin.flattr.url' ) || $project.url ) )
    <script>
    /* <![CDATA[ */
        (function() {
            var s = document.createElement('script'), t = document.getElementsByTagName('script')[0];
            s.async = true;
            s.src = 'https://api.flattr.com/js/0.6/load.js?mode=auto';
            t.parentNode.insertBefore(s, t);
        })();
    /* ]]> */</script>
#**##end
#end
##
#macro ( flattrBody $sideBarEnabled )
#**##if ( $decoration.getCustomChild( 'fluidoSkin.flattr.thing' )
          && ( $decoration.getCustomChild( 'fluidoSkin.flattr.url' ) || $project.url ) )
#*  *##set ( $flattrThing = $decoration.getCustomValue( 'fluidoSkin.flattr.thing' ) )
#*  *##set ( $flattrUrl = $decoration.getCustomValue( 'fluidoSkin.flattr.url', $project.url ) )
##
#*  *##set ( $styleModifier = '' )
#*  *##if ( $decoration.getCustomValue( 'fluidoSkin.flattr.style', '' ).equalsIgnoreCase( 'compact' ) )
#*    *##set ( $styleModifier = 'rev="flattr;button:compact;"' )
#*  *##end
##
#*  *##if ( $sideBarEnabled )
    <div id="flattr">
#*  *##else
    <ul class="nav pull-right"><li>
#*  *##end
##
    <a class="FlattrButton" style="display:none;" $styleModifier href="$flattrUrl"></a>
    <noscript><a href="https://flattr.com/thing/$flattrThing" target="_blank">
    <img src="https://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" border="0" /></a></noscript>
##
#*  *##if ( $sideBarEnabled )
    </div>
#*  *##else
    </li></ul>
#*  *##end
#**##end
#end
##
#macro( generatedBy )
Apache Maven Doxia Site Renderer#if( $doxiaSiteRendererVersion ) $doxiaSiteRendererVersion#end##
#end
##
