#set ($stylebase = "https://struts.apache.org")
<!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. 
-->
<html>
<head>
    <link type="text/css" rel="stylesheet" href="$stylebase/css/default.css">
    <style type="text/css">
        .dp-highlighter {
            width:95% !important;
        }
    </style>
    <style type="text/css">
        .footer {
            background-image:      url('$confluenceUri/images/border/border_bottom.gif');
            background-repeat:     repeat-x;
            background-position:   left top;
            padding-top:           4px;
            color:                 #666;
        }
    </style>
#if($page.hasCode)
    <link href='$stylebase/highlighter/style/shCoreStruts.css' rel='stylesheet' type='text/css' />
    <link href='$stylebase/highlighter/style/shThemeStruts.css' rel='stylesheet' type='text/css' />
    <script src='$stylebase/highlighter/js/shCore.js' type='text/javascript'></script>
    <script src='$stylebase/highlighter/js/shBrushPlain.js' type='text/javascript'></script>
    <script src='$stylebase/highlighter/js/shBrushXml.js' type='text/javascript'></script>
    <script src='$stylebase/highlighter/js/shBrushJava.js' type='text/javascript'></script>
    <script src='$stylebase/highlighter/js/shBrushJScript.js' type='text/javascript'></script>
    <script src='$stylebase/highlighter/js/shBrushGroovy.js' type='text/javascript'></script>
    <script src='$stylebase/highlighter/js/shBrushBash.js' type='text/javascript'></script>
    <script src='$stylebase/highlighter/js/shBrushCss.js' type='text/javascript'></script>
    <script type="text/javascript">
        SyntaxHighlighter.defaults['toolbar'] = false;
        SyntaxHighlighter.all();
    </script>
#end
    <script type="text/javascript" language="javascript">
        var hide = null;
        var show = null;
        var children = null;

        function init() {
            /* Search form initialization */
            var form = document.forms['search'];
            if (form != null) {
                form.elements['domains'].value = location.hostname;
                form.elements['sitesearch'].value = location.hostname;
            }

            /* Children initialization */
            hide = document.getElementById('hide');
            show = document.getElementById('show');
            children = document.all != null ?
                    document.all['children'] :
                    document.getElementById('children');
            if (children != null) {
                children.style.display = 'none';
                show.style.display = 'inline';
                hide.style.display = 'none';
            }
        }

        function showChildren() {
            children.style.display = 'block';
            show.style.display = 'none';
            hide.style.display = 'inline';
        }

        function hideChildren() {
            children.style.display = 'none';
            show.style.display = 'inline';
            hide.style.display = 'none';
        }
    </script>
    <title>$page.title</title>
</head>
<body onload="init()">
<table border="0" cellpadding="2" cellspacing="0" width="100%">
    <tr class="topBar">
        <td align="left" valign="middle" class="topBarDiv" align="left" nowrap>
            &nbsp;$exporter.breadcrumbs($page)
        </td>
        <td align="right" valign="middle" nowrap>
            <form name="search" action="https://www.google.com/search" method="get">
                <input type="hidden" name="ie" value="UTF-8" />
                <input type="hidden" name="oe" value="UTF-8" />
                <input type="hidden" name="domains" value="" />
                <input type="hidden" name="sitesearch" value="" />
                <input type="text" name="q" maxlength="255" value="" />
                <input type="submit" name="btnG" value="Google Search" />
            </form>
        </td>
    </tr>
</table>

<div id="PageContent">
    <div class="pageheader" style="padding: 6px 0px 0px 0px;">
        <!-- We'll enable this once we figure out how to access (and save) the logo resource -->
        <!--img src="/wiki/images/confluence_logo.gif" style="float: left; margin: 4px 4px 4px 10px;" border="0"-->
        <div style="margin: 0px 10px 0px 10px" class="smalltext">$page.space.name</div>
        <div style="margin: 0px 10px 8px 10px"  class="pagetitle">$page.title</div>

        <div class="greynavbar" align="right" style="padding: 2px 10px; margin: 0px;">
            <a href="$confluenceUri/pages/editpage.action?pageId=$page.id">
                <img src="$confluenceUri/images/icons/notep_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Edit Page"></a>
            <a href="$confluenceUri/pages/editpage.action?pageId=$page.id">Edit Page</a>
            &nbsp;
            <a href="$confluenceUri/pages/listpages.action?key=$page.spaceKey">
                <img src="$confluenceUri/images/icons/browse_space.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Browse Space"></a>
            <a href="$confluenceUri/pages/listpages.action?key=$page.spaceKey">Browse Space</a>
            &nbsp;
            <a href="$confluenceUri/pages/createpage.action?spaceKey=$page.spaceKey&fromPageId=$page.id">
                <img src="$confluenceUri/images/icons/add_page_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add Page"></a>
            <a href="$confluenceUri/pages/createpage.action?spaceKey=$page.spaceKey&fromPageId=$page.id">Add Page</a>
            &nbsp;
            <a href="$confluenceUri/pages/createblogpost.action?spaceKey=$page.spaceKey&fromPageId=$page.id">
                <img src="$confluenceUri/images/icons/add_blogentry_16.gif"
                     height="16" width="16" border="0" align="absmiddle" title="Add News"></a>
            <a href="$confluenceUri/pages/createblogpost.action?spaceKey=$page.spaceKey&fromPageId=$page.id">Add News</a>
        </div>
    </div>

    <div class="pagecontent">
        <div class="wiki-content">
            $body
        </div>

        #if ($page.hasChildren())
            <div class="tabletitle">
                Children
            <span class="smalltext" id="show" style="display: inline;">
              <a href="javascript:showChildren()">Show Children</a></span>
            <span class="smalltext" id="hide" style="display: none;">
              <a href="javascript:hideChildren()">Hide Children</a></span>
            </div>
            <div class="greybox" id="children" style="display: none;">
                #set ($children = $page.children)
                #foreach ($child in $children)
                    $page.link($child)
                    <span class="smalltext">($child.space.name)</span>
                    <br>
                #end
            </div>
        #end

    </div>
</div>
<div class="footer">
    Generated by CXF SiteExporter
</div>
</body>
</html>
