function resize_main_div() { // Resize main_div to exactly take up remaining vertical space. var div = $('#main_div'); div.height(Math.max(200, div.height() + $(window).height() - $('body').height())); } $(function () { resize_main_div(); $(window).resize(resize_main_div); $('#zephyr-type-tabs a').on('shown', function (e) { resize_main_div(); }); }); $(function() { $('#zephyr-type-tabs a[href="#class-message"]').on('shown', function (e) { $('#class-message input:not(:hidden):first').focus().select(); }); $('#zephyr-type-tabs a[href="#personal-message"]').on('shown', function (e) { $('#personal-message input:not(:hidden):first').focus().select(); }); }); $.ajaxSetup({ beforeSend: function(xhr, settings) { function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = jQuery.trim(cookies[i]); // Does this cookie string begin with the name we want? if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { // Only send the token to relative URLs i.e. locally. xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); } } }); $(function() { var status_classes = 'alert-error alert-success alert-info'; var send_status = $('#send-status'); var buttons = $('#class-message, #personal-message').find('input[type="submit"]'); var options = { beforeSubmit: function (form, _options) { send_status.removeClass(status_classes) .addClass('alert-info') .text('Sending') .stop(true).fadeTo(0,1); buttons.attr('disabled', 'disabled'); }, success: function (resp, statusText, xhr, form) { form.find('textarea').val(''); send_status.removeClass(status_classes) .addClass('alert-success') .text('Sent message') .stop(true).fadeTo(0,1).delay(1000).fadeOut(1000); buttons.removeAttr('disabled'); }, error: function() { send_status.removeClass(status_classes) .addClass('alert-error') .text('Error sending message') .stop(true).fadeTo(0,1); buttons.removeAttr('disabled'); } }; send_status.hide(); $("#class-message form").ajaxForm(options); $("#personal-message form").ajaxForm(options); }); selected_tag = '
▶
' function textarea_in_focus() { return $("#class").is(":focus") || $("#instance").is(":focus") || $("#new_zephyr").is(":focus") || $("#new_personal_zephyr").is(":focus") || $("#recipient").is(":focus"); } $(document).keydown(function(event) { if (event.keyCode == 38 || event.keyCode == 40) { // down or up arrow // Remove focus from zephyr creation. $("#new_zephyr").blur(); $("#new_personal_zephyr").blur(); p = $("#selected"); tr = $(p).closest("tr"); td = $(p).closest("td"); if (event.keyCode == 40) { // down arrow // There are probably more verbose but more efficient ways to do this. next_zephyr = tr.nextAll(":not(:hidden):first"); } else { // up arrow next_zephyr = tr.prevAll(":not(:hidden):first"); } if (next_zephyr.length != 0) { // We are not at the bottom or top of the zephyrs. next_zephyr.children("td:first").html(selected_tag); td.empty(); // Clear the previous arrow. $.post("update", {pointer: next_zephyr.attr("id")}); if ($(next_zephyr).offset().top < $("#main_div").offset().top) { $("#main_div").scrollTop($("#main_div").scrollTop() - 75); } if ($(next_zephyr).offset().top + $(next_zephyr).height() > $("#main_div").offset().top + $("#main_div").height()) { $("#main_div").scrollTop($("#main_div").scrollTop() + 75); } } } else if ((event.keyCode == 82) && !textarea_in_focus()) { // 'r' keypress, for responding to a zephyr var parent = $("#selected").parents("tr"); var zephyr_class = parent.find("span.zephyr_class").text(); var instance = parent.find("span.zephyr_instance").text(); $("#class").val(zephyr_class); $("#instance").val(instance); $("#new_zephyr").focus(); event.preventDefault(); } }); function scroll_to_zephyr(target_zephyr, old_offset) { // target_zephyr is an id. // old_offset is how far from the top of the scroll area the // zephyr was before any narrowing or unnarrowing happened. var height_above_zephyr = 0; $("#table tr:lt(" + $("#" + target_zephyr).index() + ")").each(function() { if (!$(this).is(":hidden")) { height_above_zephyr += $(this).height(); } }); $("#main_div").scrollTop(height_above_zephyr + old_offset); } function hide_personals() { $("span.zephyr_personal_recipient").each( function() { $(this).parents("tr").hide(); } ); } function narrow_personals(target_zephyr) { var old_top = $("#main_div").offset().top - $("#" + target_zephyr).offset().top; $("span.zephyr_personal_recipient").each( function() { $(this).parents("tr").show(); } ); $("span.zephyr_class").each( function() { $(this).parents("tr").hide(); } ); $("#selected").closest("td").empty(); $("#" + target_zephyr).children("td:first").html(selected_tag); $.post("update", {pointer: target_zephyr}); scroll_to_zephyr(target_zephyr, old_top); $("#unhide").removeAttr("disabled"); $("#narrow_indicator").html("Showing personals"); } function narrow(class_name, target_zephyr) { // We want the zephyr on which the narrow happened to stay in the same place if possible. var old_top = $("#main_div").offset().top - $("#" + target_zephyr).offset().top; $("span.zephyr_class").each( function() { if ($(this).text() != class_name) { $(this).parents("tr").hide(); } else { // If you've narrowed on an instance and then click on the class, that should unhide the other instances on that class. $(this).parents("tr").show(); } } ); hide_personals(); $("#selected").closest("td").empty(); $("#" + target_zephyr).children("td:first").html(selected_tag); $.post("update", {pointer: target_zephyr}); // Try to keep the zephyr in the same place on the screen after narrowing. scroll_to_zephyr(target_zephyr, old_top); $("#unhide").removeAttr("disabled"); $("#narrow_indicator").html("Showing " + class_name + ""); } function narrow_instance(class_name, instance, target_zephyr) { var old_top = $("#main_div").offset().top - $("#" + target_zephyr).offset().top; $("tr").each( function() { if (($(this).find("span.zephyr_class").text() != class_name) || ($(this).find("span.zephyr_instance").text() != instance)) { $(this).hide(); } } ); hide_personals(); $("#selected").closest("td").empty(); $("#" + target_zephyr).children("td:first").html(selected_tag); $.post("update", {pointer: target_zephyr}); // Try to keep the zephyr in the same place on the screen after narrowing. scroll_to_zephyr(target_zephyr, old_top); $("#unhide").removeAttr("disabled"); $("#narrow_indicator").html("Showing " + class_name + " " + instance + ""); } function prepare_personal(username) { $('#zephyr-type-tabs a[href="#personal-message"]').tab('show'); $("#recipient").val(username); $("#new_personal_zephyr").focus(); } function unhide() { $("tr").show(); p = $("#selected"); tr = $(p).closest("tr"); scroll_to_zephyr(tr.attr("id"), 0); $("#unhide").attr("disabled", "disabled"); $("#narrow_indicator").html(""); } function newline2br(content) { return content.replace(/\n/g, '