(function($){ if (typeof _ == 'undefined') babel.Translations.load({}).install(); $.fn.addAnchor = function(title) { title = title || _("Link here"); return this.filter("*[id]").each(function() { $(" \u00B6").attr("href", "#" + this.id) .attr("title", title).appendTo(this); }); }; $.fn.checked = function(checked) { if (checked == undefined) { // getter if (!this.length) return false; return this.get(0).checked; } else { // setter return this.each(function() { this.checked = checked; }); } }; // Add a Select All checkbox to each thead in the table. $.fn.addSelectAllCheckboxes = function() { var $table = this; if ($("tr td.sel", $table).length > 0) { $("tr th.sel", $table).append( $('').attr({ title: _("Toggle group") }).click(function() { $("tr td.sel input", $(this).closest("thead, tbody").next()) .prop("checked", this.checked).change(); }) ); $("tr td.sel", $table).click(function() { var $tbody = $(this).closest("tbody"); var $checkboxes = $("tr td.sel input", $tbody); var num_selected = $checkboxes.filter(":checked").length; var none_selected = num_selected === 0; var all_selected = num_selected === $checkboxes.length; $("tr th.sel input", $tbody.prev()) .prop({"checked": all_selected, "indeterminate": !(none_selected || all_selected)}); }); } }; $.fn.exclusiveOnClick = function(selector) { var $container = $(this); $container.on("click", selector, function(event) { if (!event.metaKey && !event.altKey) return; var clicked; if (this.tagName === "LABEL") { if (this.htmlFor) { clicked = document.getElementById(this.htmlFor); } else { clicked = this.children[0]; } } else { clicked = this; } var $clicked = $(clicked); $container.find(":checkbox").not(clicked).prop("checked", false); $clicked.prop("checked", true); }).mousedown(function(event) { if (event.metaKey || event.altKey) { event.preventDefault(); // Prevent border on Firefox. } }); }; // Conditionally disable the submit button. Returns a jQuery object. $.fn.disableSubmit = function(determinant) { determinant = $(determinant); var subject = $(this); var isDisabled; if (determinant.is("input:checkbox")) { isDisabled = function () { return determinant.filter(":checked").length === 0; } } else if (determinant.is("input:file")) { isDisabled = function () { return !determinant.val(); } } else { return subject; } function toggleDisabled() { subject.prop("disabled", isDisabled); if (subject.prop("disabled")) { subject.attr("title", _("At least one item must be selected")) } else { subject.removeAttr("title"); } } determinant.change(toggleDisabled); toggleDisabled(); return subject; }; $.fn.enable = function(enabled) { if (enabled == undefined) enabled = true; return this.each(function() { this.disabled = !enabled; var label = $(this).parents("label"); if (!label.length && this.id) { label = $("label[for='" + this.id + "']"); } if (!enabled) { label.addClass("disabled"); } else { label.removeClass("disabled"); } }); }; $.fn.getAbsolutePos = function() { return this.map(function() { var left = this.offsetLeft; var top = this.offsetTop; var parent = this.offsetParent; while (parent) { left += parent.offsetLeft; top += parent.offsetTop; parent = parent.offsetParent; } return {left: left, top: top}; }); }; $.fn.scrollToTop = function() { return this.each(function() { scrollTo(0, $(this).getAbsolutePos()[0].top); return false; }); }; // Disable the form's submit action after the submit button is pressed by // replacing it with a handler that cancels the action. The handler is // removed when navigating away from the page so that the action will // be enabled when using the back button to return to the page. $.fn.disableOnSubmit = function() { this.click(function() { var form = $(this).closest("form"); if (form.hasClass("trac-submit-is-disabled")) { form.on("submit.prevent-submit", function() { return false; }); $(window).on("unload", function() { form.off("submit.prevent-submit"); }); } else { form.addClass("trac-submit-is-disabled"); $(window).on("unload", function() { form.removeClass("trac-submit-is-disabled"); }) } }); }; $.loadStyleSheet = function(href, type) { type = type || "text/css"; $(function() { var link; $("link[rel=stylesheet]").each(function() { if (this.getAttribute("href") === href) { if (this.disabled) this.disabled = false; link = this; return false; } }); if (link !== undefined) return; if (document.createStyleSheet) { // MSIE document.createStyleSheet(href); } else { $("") .appendTo("head"); } }); }; // {script.src: [listener1, listener2, ...]} var readyListeners = {}; $.documentReady = function(listener) { var script = document.currentScript; if (script === undefined) { script = $("head script"); script = script[script.length - 1]; } if (script) { var href = script.getAttribute("src"); if (!(href in readyListeners)) readyListeners[href] = []; var listeners = readyListeners[href]; listeners.push(listener); } $(listener); }; $.loadScript = function(href, type) { var script; $("head script").each(function() { if (this.getAttribute("src") === href) { script = this; return false; } }); if (script !== undefined) { // Call registered ready listeners $.each(readyListeners[href] || [], function(idx, listener) { listener.call(document, $); }); } else { // Don't use $("