(function ($) { // Fade in action status message background color $.fn.gallery_show_message = function() { return this.each(function(i){ $(this).hide().fadeIn(3000) }); }; // Make the height of all items the same as the tallest item within the set $.fn.equal_heights = function() { var tallest_height = 0; $(this).each(function(){ if ($(this).height() > tallest_height) { tallest_height = $(this).height(); } }); return $(this).height(tallest_height); }; // Vertically align a block element's content $.fn.gallery_valign = function(container) { return this.each(function(i){ if (container == null) { container = 'div'; } var el = $(this).find(".g-valign"); if (!el.length) { $(this).html("<" + container + " class=\"g-valign\">" + $(this).html() + ""); el = $(this).children(container + ".g-valign"); } var elh = $(el).height(); var ph = $(this).height(); var nh = (ph - elh) / 2; if (nh < 1) { var nh = 0; } $(el).css('margin-top', nh); }); }; // Get the viewport size $.gallery_get_viewport_size = function() { return { width : function() { return $(window).width(); }, height : function() { return $(window).height(); } }; }; /** * Toggle the processing indicator, both large and small * @param elementID Target ID, including #, to apply .g-loading-size */ $.fn.gallery_show_loading = function() { return this.each(function(i){ var size; switch ($(this).attr("id")) { case "#g-dialog": case "#g-panel": size = "large"; break; default: size = "small"; break; } $(this).toggleClass("g-loading-" + size); }); }; /** * Reduce the width of an image if it's wider than its parent container * @param elementID The image container's ID */ $.fn.gallery_fit_photo = function() { return this.each(function(i) { var container_width = $(this).width(); var photo = $(this).gallery_get_photo(); var photo_width = photo.width(); if (container_width < photo_width) { var proportion = container_width / photo_width; photo.width(container_width); photo.height(proportion * photo.height()); } }); }; /** * Get a thumbnail or resize photo within a container * @param elementID The image container's ID * @return object */ $.fn.gallery_get_photo = function() { var photo = $(this).find("img,object").filter(function() { return this.id.match(/g-(photo|movie)-id-\d+/); }); return photo; }; /** * Get the sum of an element's height, margin-top, and margin-bottom * @param elementID the element's ID * @return int */ $.fn.gallery_height = function() { var ht = $(this).height(); var mt = parseInt($(this).css("margin-top")); var mb = parseInt($(this).css("margin-bottom")); return ht + parseInt(mt) + parseInt(mb); }; // Add hover state to buttons $.fn.gallery_hover_init = function() { $(".ui-state-default").hover( function(){ $(this).addClass("ui-state-hover"); }, function(){ $(this).removeClass("ui-state-hover"); } ); }; // Ajax handler for replacing an image, used in Ajax thumbnail rotation $.gallery_replace_image = function(data, img_selector) { $(img_selector).attr({src: data.src, width: data.width, height: data.height}); $(img_selector).trigger("gallery.change"); }; // Initialize context menus $.fn.gallery_context_menu = function() { if ($(".g-context-menu li").length) { var hover_target = $(this).find(".g-context-menu"); if (hover_target.attr("context_menu_initialized")) { return; } var list = $(hover_target).find("ul"); hover_target.find("*").removeAttr('title'); list.hide(); hover_target.hover( function() { list.stop(false, true).slideDown("fast"); $(this).find(".g-dialog-link").gallery_dialog(); $(this).find(".g-ajax-link").gallery_ajax(); }, function() { list.stop(true, true).slideUp("slow"); } ); hover_target.attr("context_menu_initialized", 1); } }; // Size a container to fit within the browser window $.gallery_auto_fit_window = function(imageWidth, imageHeight) { var size = $.gallery_get_viewport_size(); var width = size.width() - 6, height = size.height() - 6; var ratio = width / imageWidth; imageWidth *= ratio; imageHeight *= ratio; /* after scaling the width, check that the height fits */ if (imageHeight > height) { ratio = height / imageHeight; imageWidth *= ratio; imageHeight *= ratio; } // handle the case where the calculation is almost zero (2.14e-14) return { top: Math.round((height - imageHeight) / 2), left: Math.round((width - imageWidth) / 2), width: Math.round(imageWidth), height: Math.round(imageHeight) }; }; // Initialize a short form. Short forms may contain only one text input. $.fn.gallery_short_form = function() { return this.each(function(i){ var label = $(this).find("label:first"); var input = $(this).find("input[type=text]:first"); var button = $(this).find("input[type=submit]"); $(".g-short-form").addClass("ui-helper-clearfix"); // Place button's on the left for RTL languages if ($(".rtl").length) { $(".g-short-form input[type=text]").addClass("ui-corner-right"); $(".g-short-form input[type=submit]").addClass("ui-state-default ui-corner-left"); } else { $(".g-short-form input[type=text]").addClass("ui-corner-left"); $(".g-short-form input[type=submit]").addClass("ui-state-default ui-corner-right"); } // Set the input value equal to label text if (input.val() == "") { input.val(label.html()); button.enable(false); } // Attach event listeners to the input input.bind("focus", function(e) { // Empty input value if it equals it's label if ($(this).val() == label.html()) { $(this).val(""); } button.enable(true); }); input.bind("blur", function(e){ // Reset the input value if it's empty if ($(this).val() == "") { $(this).val(label.html()); button.enable(false); } }); }); }; // Augment jQuery autocomplete to expect the first response line to // be a tag that protects against UTF-7 attacks. $.fn.gallery_autocomplete = function(url, options) { // Drop the first response - it should be a meta tag options.parse = function(data) { var parsed = []; var rows = data.split("\n"); if (rows[0].indexOf(" tag in first line of autocomplete response'; } rows.shift(); // drop tag for (var i=0; i < rows.length; i++) { var row = $.trim(rows[i]); if (row) { row = row.split("|"); parsed[parsed.length] = { data: row, value: row[0], result: row[0] }; } } return parsed; }; $(this).autocomplete(url, options); }; })(jQuery);