-#
-# 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 ${karaf.version} Guides"
- 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")
