-#
-# Copyright (C) 2009-2010 the original author or authors.
-# See the notice.md file distributed with this work for additional
-# information regarding copyright ownership.
-#
-# 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.
-#

-@ var body: String
-@ var title : String = "Apache Karaf ${project.version} Guide"
- response.setContentType("text/html")

-# Only include the console if it's available and the engine is in dev mode.
- val include_console = engine.isDevelopmentMode && engine.resourceLoader.exists("/org/fusesource/scalate/console/console_head.scaml")

!!! Basic
%html(lang="en")
  %head
    %meta(http-equiv="Content-Type" content="text/html; charset=utf-8")
    %meta(name="description" content="description goes here")
    %meta(name="keywords" content="keywords,goes,here")
    %meta(name="author" content="The Apache Karaf Team")

    - if (include_console)
      = include("/org/fusesource/scalate/console/console_head.scaml")

    %link(href={uri("/css/style.css")} rel="stylesheet" type="text/css")
    %link(href={uri("/css/pygmentize.css")} rel="stylesheet" type="text/css")

    - if (include_console)
      %link(href={uri("/css/scalate/console.css")} rel="stylesheet" type="text/css")

    %title
      = title
  
  %body
    %table{:width => "100%", :cellpadding => "0", :cellspacing => "0"}
      %tr{:width => "100%"}
        %td#cell-0-0{:colspan => "2"}
          &nbsp;
        %td#cell-0-1
          &nbsp;
        %td#cell-0-2{:colspan => "2"}
          &nbsp;
      %tr{:width => "100%"}
        %td#cell-1-0
          &nbsp;
        %td#cell-1-1
          &nbsp;
        %td#cell-1-2
          %div{:style => "padding: 5px;"}
            #banner
              = include("/_banner.ssp")
            #top-menu
              %table{:border => "0", :cellpadding => "1", :cellspacing => "0", :width => "100%"}
                %tr
                  %td
                    %div{:align => "left"}
                  %td
                    %div{:align => "right"}
                      = include("/_quicklinks.ssp")
        %td#cell-1-3
          &nbsp;
        %td#cell-1-4
          &nbsp;
      %tr{:width => "100%"}
        %td#cell-2-0{:colspan => "2"}
          &nbsp;
        %td#cell-2-1
          %table
            %tr{:height => "100%", :valign => "top"}
              %td{:height => "100%"}
                #wrapper-menu-page-right
                  #wrapper-menu-page-top
                    #wrapper-menu-page-bottom
                      #menu-page
                        = include("/_navigation.conf")
              %td{:height =>"100%", :width => "100%"}
                .wiki-content
                  !~~ body
        %td#cell-2-2{:colspan => "2"}
          &nbsp;
      %tr{:width => "100%"}
        %td#cell-3-0
          &nbsp;
        %td#cell-3-1
          &nbsp;
        %td#cell-3-2
          #footer
            #site-footer
              &copy; 2008-2011 The Apache Software Foundation
              %br
              Apache Karaf, Karaf, Apache, the Apache feather logo, and the Apache Karaf project logo are trademarks of The Apache Software Foundation.
        %td#cell-3-3
          &nbsp;
        %td#cell-3-4
          &nbsp;
      %tr{:width => "100%"}
        %td#cell-4-0{:colspan => "2"}
          &nbsp;
        %td#cell-4-1
          &nbsp;
        %td#cell-4-2{:colspan => "2"}
          &nbsp;
    - if (include_console)
      = include("/org/fusesource/scalate/console/console.scaml")
