Files
gallery3/lib/gallery.common.js
Bharat Mediratta c51b6ab38d Fix full size dimensions after rotating an image on the photo view page.
The photo view page caches the dimensions of the full size and then
renders it in Javascript.  But after rotation, those dimensions are no
longer valid.  Create a new function on the items controller that
returns the appropriate dimensions, then add a hook on
$.gallery_replace_image and implement the hook on the photo view page
to have it make an async call to get the new dimensions.

Fixes ticket #1317
2010-09-04 15:54:07 -07:00

221 lines
6.4 KiB
JavaScript

(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';
}
$(this).html("<" + container + " class=\"g-valign\">" + $(this).html() + "</" + container + ">");
var el = $(this).children(container + ".g-valign");
var elh = $(el).height();
var ph = $(this).height();
var nh = (ph - elh) / 2;
$(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, thumb) {
$(thumb).attr({src: data.src, width: data.width, height: data.height});
if (typeof gallery_image_replaced_hook == 'function') {
gallery_image_replaced_hook(data, thumb);
}
};
// Initialize context menus
$.fn.gallery_context_menu = function() {
if ($(".g-context-menu li").length) {
var hover_target = ".g-context-menu";
var in_progress = 0;
$(hover_target + " *").removeAttr('title');
$(hover_target + " ul").hide();
$(hover_target).hover(
function() {
if (in_progress == 0) {
$(this).find("ul").slideDown("fast", function() { in_progress = 1; });
$(this).find(".g-dialog-link").gallery_dialog();
$(this).find(".g-ajax-link").gallery_ajax();
}
},
function() {
$(this).find("ul").slideUp("slow", function() { in_progress = 0; });
}
);
}
};
// 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: Number((height - imageHeight) / 2),
left: Number((width - imageWidth) / 2),
width: Number(imageWidth),
height: Number(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);
}
});
});
};
})(jQuery);