<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>
  <title>{{ page.title }}</title>
  <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />

  <link rel="stylesheet" href="{{ site.url }}/style/style.css" type="text/css" media="screen" />
  <link rel="stylesheet" href="{{ site.url }}/style/toc.css" type="text/css" media="screen" />
  <link rel="stylesheet" href="{{ site.url }}/style/docs/code.css" type="text/css" media="screen" />

    <script type="text/javascript" src="https://www.google.com/jsapi"></script>
  
	<!-- Sidebar/ToC Scripts and CSS -->
	<script src="{{ site.url }}/style/js/jquery/jquery-1.7.1.min.js"></script>
	<script src="{{ site.url }}/style/js/jquery/jquery-ui-1.8.18.custom.min.js"></script>
	<link rel="stylesheet" type="text/css" href="{{ site.url }}/style/js/jquery/smoothness/jquery-ui-1.8.18.custom.css" />
	
	<script type="text/javascript" src="{{ site.url }}/style/js/superfish.js"></script>
	
<!-- Clipboard support -->
<script src="{{ site.url }}/style/js/zeroclipboard/ZeroClipboard.js"></script>
<style type="text/css">
.clipboard_container { float: right; padding: 8px; }
.clipboard_button {
    background-image: url("{{ site.url }}/style/icons/clipboard-green-normal.png");
    background-size: 18px 21px;
    width: 18px; height: 21px;
}
.clipboard_button.hover  { background-image: url("{{ site.url }}/style/icons/clipboard-green-hover.png"); }
.clipboard_button.active  { background-image: url("{{ site.url }}/style/icons/clipboard-green-click.png"); }'
</style>
<script type="text/javascript"> <!-- clipboard -->
ZeroClipboard.setMoviePath( '{{ site.url }}/style/js/zeroclipboard/ZeroClipboard.swf' );
</script>
<script type="text/javascript"> <!-- clipboard positioning -->
$(document).ready(function() {
  $('<div class="clipboard_container" title="Copy to Clipboard">'+
    '<div class="clipboard_button"/>'+
  '</div>').insertBefore($('div.highlight'))
  $('div.clipboard_container').each(function(index) {
    var clipboard = new ZeroClipboard.Client();
    clipboard.glue( $(this).find(":first")[0], $(this)[0] );
    var target = $(this).next();
    var txt = target.text().trim();
    if (target.find('code.bash')) {
      txt = txt.replace(/^[^%$]*[%$] /, "").replace(new RegExp('\n[^%$]*[%$] ','g'), "\n");
    }
    clipboard.setText(txt);
  });
});
</script>

    <script type="text/javascript">
        // initialise menu delay
        jQuery(function(){
            jQuery('ul#mainmenu').superfish({ 
                autoArrows:  false,  // disable generation of arrow mark-up 
                dropShadows: false,  // disable drop shadows 
                disableHI:   true,   // set to true to disable hoverIntent detection 
                delay:       500,    // the delay in milliseconds that the mouse can remain outside a submenu without it closing 
                speed:       'fast', 
            });
        });
    </script>

<script type="text/javascript"> <!-- search -->
	$(function() {
		$('#simple_google')
			.submit(function() {
				$('input[name="q"]').val("site:" + document.location.hostname + " " + $('input[name="brooklyn-search"]').val());
			return true;
			});
		$('input[name="brooklyn-search"]').focus(function() {
				if ($(this).val() === $(this).attr('placeholder')) {
					$(this).val('');
				}
			})
			.blur(function() {
				if ($(this).val() === '') {
					$(this).val($(this).attr('placeholder'));
				}
			})
			.blur();
    });
</script>

<script type="text/javascript"> <!-- analytics -->
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-30530918-1']);
_gaq.push(['_trackPageview']);

(function() {
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
</script>

</head>

<body>

    <ul id="shortcuts" title="Accessibility shortcuts menu">
        <li><a href="#maincontent">Skip to main content</a></li>
    </ul>
   

<div id="container">

    <div id="header">
    
        <div id="identity">
            <a href="http://brooklyncentral.github.com/" rel="home">Brooklyn</a>
        </div>
        
        <ul id="quicklinks">
            <li><a href="{{site.url}}/meta/versions.html">{{ site.brooklyn-version }}</a></li>
            <li><a href="{{site.url}}/start/download.html">Download</a></li>
            <li><a href="https://github.com/brooklyncentral">GitHub</a></li>
            <li><a href="https://twitter.com/#!/search?q=brooklyncentral">Twitter</a></li>
            <li><a href="{{site.url}}/meta/contact.html">Contact</a></li>
        </ul>

        <div id="menubar">  

{% include topbar.html %}                    

            <form method="get" id="simple_google" class="searchform" action="http://www.google.com/search" method="get">
                <input type="text" class="searchinput" name="brooklyn-search" placeholder="Search: type &amp; hit enter" />
                <input type="hidden" name="q" value="" />
            </form>
            
        </div>
                
    </div><!--header-->
    
    <div id="contentcontainer">
    
        <div id="maincontent">

{% include breadcrumbs.html %}

<h1 id="header_title">{{ page.title }}</h1>
    
{{ content }}

        </div><!--maincontent-->
        
      <div id="sidebar">
      
{% include sidebar.html %}

      </div>

    </div><!--contentcontainer-->
        
    <div id="footer">
        <p id="copyright">
            <b>brooklyn is distributed under the Apache License v2.0.</b><br/>
            brooklyn is a registered trademark of Cloudsoft Corporation.<br/>
            &copy; 2012 Cloudsoft Corporation.
        </p>
    </div><!--footer -->

</div><!--container-->

</body>
</html>
