diff options
Diffstat (limited to 'lib/gallery.common.js')
| -rw-r--r-- | lib/gallery.common.js | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/lib/gallery.common.js b/lib/gallery.common.js new file mode 100644 index 0000000..061ffed --- /dev/null +++ b/lib/gallery.common.js @@ -0,0 +1,253 @@ +(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() + + "</" + container + ">"); + 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 <meta> 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("<meta") == -1) { + throw 'Missing <meta> tag in first line of autocomplete response'; + } + rows.shift(); // drop <META> 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); |
