// Copyright 2012 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. /* A little code to ease navigation of these documents. * * On window load we: * + Bind search box hint placeholder show/hide events (bindSearchEvents) * + Generate a table of contents (generateTOC) * + Bind foldable sections (bindToggles) * + Bind links to foldable sections (bindToggleLinks) */ (function() { 'use strict'; function bindSearchEvents() { var search = $('#search'); if (search.length === 0) { return; // no search box } function clearInactive() { if (search.is('.inactive')) { search.val(''); search.removeClass('inactive'); } } function restoreInactive() { if (search.val() !== '') { return; } search.val(search.attr('placeholder')); search.addClass('inactive'); } search.on('focus', clearInactive); search.on('blur', restoreInactive); restoreInactive(); } /* Generates a table of contents: looks for h2 and h3 elements and generates * links. "Decorates" the element with id=="nav" with this table of contents. */ function generateTOC() { if ($('#manual-nav').length > 0) { return; } var nav = $('#nav'); if (nav.length === 0) { return; } var toc_items = []; $(nav).nextAll('h2, h3').each(function() { var node = this; if (node.id == '') node.id = 'tmp_' + toc_items.length; var link = $('').attr('href', '#' + node.id).text($(node).text()); var item; if ($(node).is('h2')) { item = $('
'); } else { // h3 item = $('
'); } item.append(link); toc_items.push(item); }); if (toc_items.length <= 1) { return; } var dl1 = $('
'); var dl2 = $('
'); var split_index = (toc_items.length / 2) + 1; if (split_index < 8) { split_index = toc_items.length; } for (var i = 0; i < split_index; i++) { dl1.append(toc_items[i]); } for (/* keep using i */; i < toc_items.length; i++) { dl2.append(toc_items[i]); } var tocTable = $('').appendTo(nav); var tocBody = $('').appendTo(tocTable); var tocRow = $('').appendTo(tocBody); // 1st column $('
').appendTo(tocRow).append(dl1); // 2nd column $('').appendTo(tocRow).append(dl2); } function bindToggle(el) { $('.toggleButton', el).click(function() { if ($(el).is('.toggle')) { $(el).addClass('toggleVisible').removeClass('toggle'); } else { $(el).addClass('toggle').removeClass('toggleVisible'); } }); } function bindToggles(selector) { $(selector).each(function(i, el) { bindToggle(el); }); } function bindToggleLink(el, prefix) { $(el).click(function() { var href = $(el).attr('href'); var i = href.indexOf('#'+prefix); if (i < 0) { return; } var id = '#' + prefix + href.slice(i+1+prefix.length); if ($(id).is('.toggle')) { $(id).find('.toggleButton').first().click(); } }); } function bindToggleLinks(selector, prefix) { $(selector).each(function(i, el) { bindToggleLink(el, prefix); }); } function setupDropdownPlayground() { if (!$('#page').is('.wide')) { return; // don't show on front page } var button = $('#playgroundButton'); var div = $('#playground'); var setup = false; button.toggle(function() { button.addClass('active'); div.show(); if (setup) { return; } setup = true; playground({ 'codeEl': $('.code', div), 'outputEl': $('.output', div), 'runEl': $('.run', div), 'fmtEl': $('.fmt', div), 'shareEl': $('.share', div), 'shareRedirect': 'http://play.golang.org/p/' }); }, function() { button.removeClass('active'); div.hide(); }); button.show(); $('#menu').css('min-width', '+=60'); } function setupInlinePlayground() { 'use strict'; // Set up playground when each element is toggled. $('div.play').each(function (i, el) { // Set up playground for this example. var setup = function() { var code = $('.code', el); playground({ 'codeEl': code, 'outputEl': $('.output', el), 'runEl': $('.run', el), 'fmtEl': $('.fmt', el), 'shareEl': $('.share', el), 'shareRedirect': 'http://play.golang.org/p/' }); // Make the code textarea resize to fit content. var resize = function() { code.height(0); var h = code[0].scrollHeight; code.height(h+20); // minimize bouncing. code.closest('.input').height(h); }; code.on('keydown', resize); code.on('keyup', resize); code.keyup(); // resize now. }; // If example already visible, set up playground now. if ($(el).is(':visible')) { setup(); return; } // Otherwise, set up playground when example is expanded. var built = false; $(el).closest('.toggle').click(function() { // Only set up once. if (!built) { setup(); built = true; } }); }); } // fixFocus tries to put focus to div#page so that keyboard navigation works. function fixFocus() { var page = $('div#page'); var topbar = $('div#topbar'); page.css('outline', 0); // disable outline when focused page.attr('tabindex', -1); // and set tabindex so that it is focusable $(window).resize(function (evt) { // only focus page when the topbar is at fixed position (that is, it's in // front of page, and keyboard event will go to the former by default.) // by focusing page, keyboard event will go to page so that up/down arrow, // space, etc. will work as expected. if (topbar.css('position') == "fixed") page.focus(); }).resize(); } function toggleHash() { var hash = $(window.location.hash); if (hash.is('.toggle')) { hash.find('.toggleButton').first().click(); } } function addPlusButtons() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/platform.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); } $(document).ready(function() { bindSearchEvents(); generateTOC(); bindToggles(".toggle"); bindToggles(".toggleVisible"); bindToggleLinks(".exampleLink", "example_"); bindToggleLinks(".overviewLink", ""); bindToggleLinks(".examplesLink", ""); bindToggleLinks(".indexLink", ""); setupDropdownPlayground(); setupInlinePlayground(); fixFocus(); toggleHash(); addPlusButtons(); // godoc.html defines window.initFuncs in the tag, and root.html and // codewalk.js push their on-page-ready functions to the list. // We execute those functions here, to avoid loading jQuery until the page // content is loaded. for (var i = 0; i < window.initFuncs.length; i++) window.initFuncs[i](); }); })();