summaryrefslogtreecommitdiff
path: root/lib/gallery.common.js
diff options
context:
space:
mode:
authorNathan Kinkade <nath@nkinka.de>2013-03-19 16:41:42 +0000
committerNathan Kinkade <nath@nkinka.de>2013-03-19 16:41:42 +0000
commit3908e37d965fa76ea774e76ddf42365a872a5f27 (patch)
tree457e1a1e465f83855eee96ba287cd91f1623395c /lib/gallery.common.js
parent711651f727e093cc7357a6bbff6bd992fd6dfd80 (diff)
parent1eab94f6062b5f54ea5d9db01d968e7195f3de9d (diff)
Merge branch 'master' of git://github.com/gallery/gallery3
Diffstat (limited to 'lib/gallery.common.js')
-rw-r--r--lib/gallery.common.js114
1 files changed, 80 insertions, 34 deletions
diff --git a/lib/gallery.common.js b/lib/gallery.common.js
index 755218f5..f5dee958 100644
--- a/lib/gallery.common.js
+++ b/lib/gallery.common.js
@@ -26,9 +26,9 @@
}
var el = $(this).find(".g-valign");
if (!el.length) {
- $(this).html("<" + container + " class=\"g-valign\">" + $(this).html() +
- "</" + container + ">");
- el = $(this).children(container + ".g-valign");
+ $(this).html("<" + container + " class=\"g-valign\">" + $(this).html() +
+ "</" + container + ">");
+ el = $(this).children(container + ".g-valign");
}
var elh = $(el).height();
var ph = $(this).height();
@@ -133,23 +133,28 @@
$.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;
+ if (hover_target.hasClass("g-context-menu-initialized")) {
+ return;
}
var list = $(hover_target).find("ul");
+
hover_target.find("*").removeAttr('title');
+ hover_target.find(".g-dialog-link").gallery_dialog();
+ hover_target.find(".g-ajax-link").gallery_ajax();
list.hide();
+
hover_target.hover(
+ // The stop arguments below ensure that when we leave an item with an expanded context
+ // menu then *quickly* come back, we neither freeze mid-slide nor flicker.
function() {
- list.stop(true, true).slideDown("fast");
- $(this).find(".g-dialog-link").gallery_dialog();
- $(this).find(".g-ajax-link").gallery_ajax();
+ list.stop(false, true).slideDown("fast");
},
function() {
- list.stop(true, true).slideUp("slow");
+ list.stop(true, false).slideUp("slow");
}
);
- hover_target.attr("context_menu_initialized", 1);
+
+ hover_target.addClass("g-context-menu-initialized");
}
};
@@ -197,26 +202,29 @@
$(".g-short-form input[type=submit]").addClass("ui-state-default ui-corner-right");
}
+ // Add the hover effect to the buttons
+ $.fn.gallery_hover_init();
+
// Set the input value equal to label text
if (input.val() == "") {
input.val(label.html());
- button.enable(false);
+ button.attr("disabled", true);
}
// Attach event listeners to the input
- input.bind("focus", function(e) {
+ input.on("focus", function(e) {
// Empty input value if it equals it's label
if ($(this).val() == label.html()) {
$(this).val("");
}
- button.enable(true);
+ button.attr("disabled", false);
});
- input.bind("blur", function(e){
+ input.on("blur", function(e) {
// Reset the input value if it's empty
if ($(this).val() == "") {
$(this).val(label.html());
- button.enable(false);
+ button.attr("disabled", true);
}
});
});
@@ -225,29 +233,67 @@
// 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]
- };
+ var autocomplete_options = {
+ source: function(request, response) {
+ var split = function(val) {
+ return val.split(/,\s*/);
+ };
+
+ var extract_last = function(term) {
+ return split(term).pop();
+ };
+
+ var ajax_options = {
+ dataType: "json",
+ url: url,
+ success: function(data) {
+ response(data);
+ },
+ data: {
+ term: request.term
+ },
+ dataFilter: function(data, dataType) {
+ // Drop the <meta> tag
+ return data.substring(data.indexOf("\n") + 1);
+ }
+ };
+
+ if ("multiple" in options) {
+ $.extend(ajax_options, {
+ data: {
+ term: extract_last(request.term)
+ }
+ });
}
+
+ $.ajax(ajax_options, response);
}
- return parsed;
};
- $(this).autocomplete(url, options);
+ if ("multiple" in options) {
+ var split = function(val) {
+ return val.split(/,\s*/);
+ };
+ $.extend(autocomplete_options, {
+ focus: function(event, ui) {
+ var terms = split(this.value);
+ terms.pop();
+ terms.push(ui.item.value);
+ this.value = terms.join(", ");
+ return false;
+ },
+ select: function(event, ui) {
+ var terms = split(this.value);
+ terms.pop();
+ terms.push(ui.item.value);
+ terms.push("");
+ this.value = terms.join(", ");
+ return false;
+ }
+ });
+ }
+
+ $(this).autocomplete(autocomplete_options);
};
})(jQuery);