(function($) { $.organize = { micro_thumb_draggable: { handle: ".ui-selected", distance: 10, cursorAt: { left: -10, top: -10}, appendTo: "#g-organize-content-pane", helper: function(event, ui) { var selected = $(".ui-draggable.ui-selected img"); if (selected.length) { var set = $('
') .css({ zIndex: 2000, width: 80, height: Math.ceil(selected.length / 5) * 16 }); selected.each(function(i) { var row = parseInt(i / 5); var j = i - (row * 5); var o = $(this).offset(); var copy = $(this).clone() .css({ width: $(this).width(), height: $(this).height(), display: "block", margin: 0, position: 'absolute', outline: '5px solid #fff', left: o.left - event.pageX, top: o.top - event.pageY }) .appendTo(set) .animate({ width: 10, height: 10, outlineWidth: 1, margin: 1, left: (20 * j), top: (row * 20) }, 500); }); return set; } return null; }, start: function(event, ui) { $("#g-organize-microthumb-grid .ui-selected").hide(); }, drag: function(event, ui) { var top = $("#g-organize-microthumb-grid").offset().top; var height = $("#g-organize-microthumb-grid").height(); var scrollTop = $("#g-organize-microthumb-grid").scrollTop(); if (ui.offset.top > height + top - 20) { scrollTop += 100; } else if (ui.offset.top < top + 20) { scrollTop = Math.max(0, scrollTop - 100); } $("#g-organize-microthumb-grid").scrollTop(scrollTop); } }, content_droppable: { accept: "*", tolerance: "pointer", greedy: true, drop: function(event, ui) { $(".g-mouse-drag-over").removeClass("g-mouse-drag-over"); var target = $("#g-organize-drop-target-marker").data("drop_position"); $.organize.do_drop({ url: rearrange_url .replace("__TARGET_ID__", target.id) .replace("__BEFORE__", target.position ? "before" : "after"), source: $(ui.helper).children("img") }); } }, branch_droppable: { accept: "*", tolerance: "pointer", greedy: true, drop: function(event, ui) { if ($(event.target).hasClass("g-view-only")) { $("#g-organize-drop-target-marker").remove(); $(".ui-selected").show(); } else { $.organize.do_drop({ url: move_url.replace("__ALBUM_ID__", $(event.target).attr("ref")), source: $(ui.helper).children("img") }); } } }, do_drop: function(options) { $("#g-organize-microthumb-grid").selectable("destroy"); var source_ids = []; $(options.source).each(function(i) { source_ids.push($(this).attr("ref")); }); if (source_ids.length) { var loading = $('
 
') .css({bottom: 5, opacity: .5, left: 0, position: "absolute", right: 0, top: 0, zIndex: 2000 }); $("#g-organize-microthumb-grid").append(loading); $.post(options.url, { "source_ids[]": source_ids }, function(data) { $.organize._refresh(data); $(".g-dialog-loading-large").remove(); }, "json"); } }, _refresh: function(data) { if (data.tree) { $("#g-organize-album-tree").html(data.tree); } if (data.grid) { $("#g-organize-microthumb-grid").html(data.grid); $("#g-organize-sort-column").attr("value", data.sort_column); $("#g-organize-sort-order").attr("value", data.sort_order); } $.organize.set_handlers(); }, grid_mouse_leave_handler: function(event) { if ($(".g-drag-helper").length && $("#g-organize-drop-target-marker").length) { $("#g-organize-drop-target-marker").remove(); } }, grid_mouse_move_handler: function(event) { if ($(".g-drag-helper").length) { var organizeData = $("#g-organize").data("organizeData"); var thumbGrid = $("#g-organize-microthumb-grid"); var visibleCells = $(".g-organize-microthumb-grid-cell:visible"); var scrollTop = thumbGrid.scrollTop(); var item = $(".g-mouse-drag-over"); if (item.length == 0) { console.log("no item"); var itemColumn = Math.floor((event.pageX - thumbGrid.offset().left) / organizeData.width); itemColumn = organizeData.rtl ? organizeData.width - itemColumn : itemColumn; var itemRow = Math.floor((event.pageY + scrollTop - thumbGrid.offset().top) / organizeData.height); var itemIndex = Math.min(itemRow * organizeData.columns + itemColumn, visibleCells.length - 1); item = visibleCells.get(itemIndex); } var before = event.pageX < ($(item).offset().left + $(item).width() / 2); var left = $(item).position().left + (before ? 0 : organizeData.width) - 3; var top = $(item).position().top + 6 + scrollTop; if ($("#g-organize-drop-target-marker").length) { $("#g-organize-drop-target-marker").remove(); } var set = $('
') .css({zIndex: 2000, width: 2, height: 112, borderWidth: 1, borderStyle: "solid", position: "absolute", top: top, left: left }) .data("drop_position", {id: $(item).attr("ref"), position: organizeData.rtl ? !before : before}); thumbGrid.append(set); } return true; }, /** * Dynamically initialize the organize dialog when it is displayed */ init: function(data) { var self = this; // Deal with ui.jquery bug: http://dev.jqueryui.com/ticket/4475 (target 1.8?) $(".sf-menu li.sfHover ul").css("z-index", 68); $("#g-dialog").dialog("option", "zIndex", 70); $("#g-dialog").bind("dialogopen", function(event, ui) { var outerHeight = $(".g-organize-microthumb-grid-cell").outerHeight(true); var outerWidth = $(".g-organize-microthumb-grid-cell").outerWidth(true); var gridInnerWidth = $("#g-organize-microthumb-grid").innerWidth() - 2 * parseFloat($("#g-organize-microthumb-grid").css("paddingLeft")); $("#g-organize") .height($("#g-dialog").innerHeight() - 20) .data("organizeData", { rtl: $("body").hasClass("rtl"), height: outerHeight, width: outerWidth, columns: Math.floor(gridInnerWidth / outerWidth) }); }); $("#g-dialog").bind("dialogclose", function(event, ui) { window.location.reload(); }); $("#g-organize-close").click(function(event) { $("#g-dialog").dialog("close"); }); $("#g-organize-sort-column,#g-organize-sort-order").change(function(event) { $.organize.resort($("#g-organize-sort-column").attr("value"), $("#g-organize-sort-order").attr("value")); }); $.organize.set_handlers(); }, set_handlers: function() { $("#g-organize-microthumb-grid") .selectable({filter: ".g-organize-microthumb-grid-cell"}) .mousemove($.organize.grid_mouse_move_handler) .mouseleave($.organize.grid_mouse_leave_handler) .droppable($.organize.content_droppable); $(".g-organize-microthumb-grid-cell") // need to manually add this class in case we care calling with additional elements .addClass("ui-selectee") .mouseleave(function(event) { if ($(".g-drag-helper").length) { $(this).removeClass("g-mouse-drag-over"); } }) .mouseenter(function(event) { $(".g-mouse-drag-over").removeClass("g-mouse-drag-over"); if ($(".g-drag-helper").length) { $(this).addClass("g-mouse-drag-over"); } }) .draggable($.organize.micro_thumb_draggable); $(".g-organize-album").droppable($.organize.branch_droppable); $(".g-organize-album-text").click($.organize.show_album); $("#g-organize-album-tree .ui-icon-plus,#g-organize-album-tree .ui-icon-minus").click($.organize.toggle_branch); }, toggle_branch: function(event) { event.preventDefault(); var target = $(event.currentTarget); var branch = $(target).parent(); var id = $(event.currentTarget).parent().attr("ref"); if ($(target).hasClass("ui-icon-plus")) { // Expanding if (!branch.find("ul").length) { $.get(tree_url.replace("__ALBUM_ID__", id), { }, function(data) { branch.replaceWith(data); $.organize.set_handlers(); }); } else { branch.find("ul:eq(0)").slideDown(); } } else { // Contracting branch.find("ul:eq(0)").slideUp(); } $(target).toggleClass("ui-icon-plus"); $(target).toggleClass("ui-icon-minus"); }, /** * When the text of a selection is clicked, then show that albums contents */ show_album: function(event) { event.preventDefault(); if ($(event.currentTarget).hasClass("ui-state-focus")) { return; } var parent = $(event.currentTarget).parents(".g-organize-branch"); if ($(parent).hasClass("g-view-only")) { return; } $("#g-organize-microthumb-grid").selectable("destroy"); var id = $(event.currentTarget).attr("ref"); $(".g-organize-album-text.ui-state-focus").removeClass("ui-state-focus"); $(".g-organize-album-text[ref=" + id + "]").addClass("ui-state-focus"); var url = $("#g-organize-microthumb-grid").attr("ref").replace("__ITEM_ID__", id).replace("__OFFSET__", 0); $.get(url, {}, function(data) { $("#g-organize-microthumb-grid").html(data.grid); $("#g-organize-sort-column").attr("value", data.sort_column); $("#g-organize-sort-order").attr("value", data.sort_order); $.organize.set_handlers(); }, "json"); }, /** * Change the sort order. */ resort: function(column, dir) { var url = sort_order_url .replace("__ALBUM_ID__", $("#g-organize-album-tree .ui-state-focus").attr("ref")) .replace("__COL__", column) .replace("__DIR__", dir); $.get(url, {}, function(data) { $("#g-organize-microthumb-grid").html(data.grid); $("#g-organize-sort-column").attr("value", data.sort_column); $("#g-organize-sort-order").attr("value", data.sort_order); $.organize.set_handlers(); }, "json"); } }; })(jQuery);