function makeTreeCollapsible(tab) { /*** Tree toggles in logfiles. ***/ /* Set the appearance of the toggle depending on whether the corresponding subtree is initially shown or hidden. */ tab.find(".tree-toggle").map(function() { if ($(this).siblings("ul:hidden").length == 0) { $(this).text("-"); } else { $(this).text("+"); } }); /* When a toggle is clicked, show or hide the subtree. */ tab.find(".tree-toggle").click(function() { if ($(this).siblings("ul:hidden").length != 0) { $(this).siblings("ul").show(); $(this).text("-"); } else { $(this).siblings("ul").hide(); $(this).text("+"); } }); /* Implementation of the expand all link. */ tab.find(".tree-expand-all").click(function() { tab.find(".tree-toggle", $(this).parent().siblings(".tree")).map(function() { $(this).siblings("ul").show(); $(this).text("-"); }); }); /* Implementation of the collapse all link. */ tab.find(".tree-collapse-all").click(function() { tab.find(".tree-toggle", $(this).parent().siblings(".tree")).map(function() { $(this).siblings("ul").hide(); $(this).text("+"); }); }); } $(document).ready(function() { $("table.clickable-rows").click(function(event) { if ($(event.target).closest("a").length) return; link = $(event.target).parents("tr").find("a.row-link"); if (link.length == 1) window.location = link.attr("href"); }); bootbox.setDefaults({ animate: false }); /* Enable popovers (and allow table and teletype elements in them). */ $.fn.popover.Constructor.Default.whiteList.table = []; $.fn.popover.Constructor.Default.whiteList.thead = [] $.fn.popover.Constructor.Default.whiteList.tbody = []; $.fn.popover.Constructor.Default.whiteList.tr = []; $.fn.popover.Constructor.Default.whiteList.th = []; $.fn.popover.Constructor.Default.whiteList.td = []; $.fn.popover.Constructor.Default.whiteList.tt = []; $(".hydra-popover").popover({}); /* Activates tab according to URL anchor. */ if (window.location.hash) { setTimeout(function () { $('.nav-tabs > .nav-item:not(.dropdown) a[href="' + window.location.hash + '"]').trigger('show.bs.tab'); }, 0); $('.nav-tabs > .nav-item:not(.dropdown) a[href="' + window.location.hash + '"]').tab('show'); } $('.nav-tabs').each(function() { if ($('.nav-item:not(.dropdown) a.active',this).length == 0) $('.nav-item:not(.dropdown) a',this).first().tab('show'); }); $('.nav-tabs > .nav-item:not(.dropdown) a[href^="#"]').on('click', function() { history.replaceState(null, null, window.location.href.split("#")[0] + $(this).attr("href")); }); /* Automatically set Bootstrap radio buttons from hidden form controls. */ $('div[data-toggle="buttons-radio"] input[type="hidden"]').map(function(){ $('button[value="' + $(this).val() + '"]', $(this).parent()).addClass('active'); }); /* Automatically update hidden form controls from Bootstrap radio buttons. */ $('div[data-toggle="buttons-radio"] .btn').click(function(){ $('input', $(this).parent()).val($(this).val()); }); $(".star").click(function(event) { var star = $(this); var active = star.text() != '★'; requestJSON({ url: star.attr("data-post"), data: active ? "star=1" : "star=0", type: 'POST', success: function(res) { if (active) { star.text('★'); } else { star.text('☆'); } } }); }); /* Makes dates more user friendly. */ // Friendly date format var DATE_FORMAT = "YYYY-MM-DD HH:mm:ss"; // Local timezone offset to display. var tz = moment().format("Z"); $("time.date").each(function(i, el) { var el = $(el); var localTime = moment(el.data("timestamp"), "%X"); var hydraTime = el.attr("title"); if (el.hasClass("is-absolute")) { el.attr( "title", [ "Adjusted to local time (" + tz + ")", "Other timezones:", " UTC: " + localTime.clone().utc().format(DATE_FORMAT), " As Hydra reported: " + hydraTime, ].join("\n")); el.text(localTime.format(DATE_FORMAT)); el.addClass("is-local"); } else if (el.hasClass("is-relative")) { el.attr( "title", [ "Local (" + tz + "): " + localTime.format(DATE_FORMAT), "UTC: " + localTime.clone().utc().format(DATE_FORMAT), "As Hydra reported: " + hydraTime, ].join("\n")); el.addClass("is-local"); } }); }); var tabsLoaded = {}; function makeLazyTab(tabName, uri, callback) { $('.nav-tabs').bind('show.bs.tab', function(e) { var pattern = /#.+/gi; var id = e.target.toString().match(pattern)[0]; if (id == '#' + tabName && !tabsLoaded[id]) { tabsLoaded[id] = 1; $('#' + tabName).load(uri, function(response, status, xhr) { var lazy = xhr.getResponseHeader("X-Hydra-Lazy") === "Yes"; var tab = $('#' + tabName); if (status == "error" && !lazy) { tab.html("