<!--
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.
-->

<!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">


{{ content }}


<script src="{{ site.path.style }}/js/zeroclipboard/ZeroClipboard.min.js"></script>

<script language="JavaScript" type="application/javascript">
    fix_padding_function = function () { 
        $('body').css('padding-top', parseInt($('#header').css("height"))+10);
        $('body').css('padding-bottom', parseInt($('#footer').css("height"))+10);
    };
    $(window).resize(fix_padding_function);
    $(window).load(fix_padding_function);
    
    $(function () {
        $('[data-toggle="tooltip"]').tooltip({ delay: { show: 600, hide: 100 }})
    });
    
/* generate anchors for headers, a la github and http://blog.parkermoore.de/2014/08/01/header-anchor-links-in-vanilla-javascript-for-github-pages-and-jekyll/ */
var anchorForId = function (id, text) {
  var anchor = document.createElement("a");
  anchor.className = "header-link";
  anchor.href      = "#" + id;
  anchor.innerHTML = "<i class=\"fa fa-link\"></i>";
  return anchor;
};

var linkifyAnchors = function (level, containingElement) {
  var headers = contentBlock.find("h" + level);
  for (var h = 0; h < headers.length; h++) {
    var header = headers[h];
    if (typeof header.id !== "undefined" && header.id !== "") {
      header.appendChild(anchorForId(header.id, $(header).text()));
    }
  }
};

$(function () {
    contentBlock = $("#content_container");
    if (!contentBlock) return;
    for (var level = 1; level <= 6; level++) {
      linkifyAnchors(level, contentBlock);
    }
});

<!-- Clipboard support -->
  ZeroClipboard.config({ moviePath: '{{ site.path.style }}/js/zeroclipboard/ZeroClipboard.swf' });

$(function() {
  $('div.highlight').prepend(
  $('<div class="clipboard_container" title="Copy to Clipboard">'+
    '<div class="fa clipboard_button">'+
    '<div class="on-active"><div>Copied to Clipboard</div></div>'+
  '</div></div>'));
  $('div.clipboard_container').each(function(index) {
    var clipboard = new ZeroClipboard();
    clipboard.clip( $(this).find(":first")[0], $(this)[0] );
    var target = $(this).next();
    var txt = target.text().trim();
    if (target.find('code.bash')) {
      // Strip out bash prompts from the start of each line (i.e. '$' or '%' characters
      // at the very start, or immediately following any newline). Correctly handles continuation
      // lines, where a leading '$' or '%' is *not* a prompt character.
      txt = txt.replace(/(^|[^\\]\n)[$%] /g, "$1");
    }
    clipboard.on( 'dataRequested', function (client, args) {
      client.setText( txt );
    });
  });
});

<!-- 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();
    });


 <!-- 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);
    })();


<!-- page warning (for archive pages) -->
{% comment %}
TODO insert the warning html at generation-time (jekyll) rather than runtime (JS)
{% endcomment %}
{% if page.path contains 'guide/' %} 
    $(function() {
        if (document.location.pathname.replace(/^\/([^\/]*).*$/, '$1') === "v"){
            var thisversion = document.location.pathname.split("/")[2],
                msg = "";
            if (thisversion != 'latest' && (!$.cookie('brooklyn_versions') || 
                    (($.inArray('ALL', $.cookie('brooklyn_versions').split(",")) === -1) &&
                    ($.inArray(thisversion, $.cookie('brooklyn_versions').split(",")) === -1))) ){
                msg += "<div class='warning_banner_image'><img src='{{ site.path.style }}/img/warning.png'/></div>";
                msg += "<p>You are browsing the archive site for version <strong>"+thisversion+"</strong>.</p>";
                if (thisversion.indexOf("SNAPSHOT") >= 0) {
                  msg += "<p>Note that SNAPSHOT versions have not been voted on and are not endorsed by the Apache Software Foundation.</p>";
                  msg += "<p>Do you understand and accept the risks?</p>";
                } else {
                  msg += "<p>Is this deliberate?</p>";
                }
                msg += "<center><p class='warning_banner_buttons'>";
                msg += "<a href = 'javascript:void(0);' onclick=\"set_user_version('"+thisversion+"');\">Yes, hide this warning</a>";
                msg += "<a href = '{{ site.path.v }}/latest/'>No, take me to the latest version guide</a>";
                msg += "<a href = '{{ site.path.website }}/meta/versions.html'>Show all versions</a>";
                msg += "</p></center>"
                            
                $('#page_notes').html(msg);
                $('#page_notes').fadeIn('slow');
            }
        }
    });
{% endif %}
    function get_user_versions() {
        return $.cookie("brooklyn_versions") ? $.cookie("brooklyn_versions").split(",") : [];
    };
    function set_user_version(version) {
        var version_cookie = get_user_versions();
        version_cookie.push(version);
        $.cookie('brooklyn_versions', version_cookie, { expires: 365, path: '/' });
        $('#page_notes').fadeOut();
        event.preventDefault ? event.preventDefault() : event.returnValue = false;
    };
    function set_user_versions_all() {
        var version_cookie = get_user_versions();
        version_cookie.push("ALL");
        $.cookie('brooklyn_versions', version_cookie, { expires: 365, path: '/' });
        $('#page_notes').fadeOut();
        event.preventDefault ? event.preventDefault() : event.returnValue = false;
    };
    function clear_user_versions() {
        $.removeCookie('brooklyn_versions', { path: '/' });
        $('#page_notes').fadeIn('slow');
        event.preventDefault ? event.preventDefault() : event.returnValue = false;
    };

</script>

</body>

</html>
