/* * @todo Trap resize of dialog and resize the child areas (tree, grid and edit form) */ var url; var paused = false; var task = null; var transitItems = []; var heightMicroThumbPanel; // ************************************************************************** // JQuery UI Widgets // Draggable var draggable = { handle: ".gMicroThumbContainer.ui-selected", revert: true, zindex: 2000, distance: 10, helper: function(event, ui) { if (!$(event.currentTarget).hasClass("ui-selected")) { $(event.currentTarget).addClass("ui-selected"); setDrawerButtonState(); } $("#gMicroThumbPanel").append("
"); var beginTop = event.pageY; var beginLeft = event.pageX; var zindex = $(".gMicroThumbContainer").draggable("option", "zindex"); $("#gDragHelper").css('top', event.pageY - 22.5); $("#gDragHelper").css('left', event.pageX + 22.5); var placeHolder = $(this).clone(); $(placeHolder).attr("id", "gPlaceHolder"); $(placeHolder).css("visibility", "hidden"); $(placeHolder).removeClass("ui-selected"); $(placeHolder).removeClass("ui-draggable"); $(this).after(placeHolder); $("li.ui-selected").each(function(i) { var clone = $(this).clone(); $(clone).attr("id", "drag_clone_" + $(this).attr("ref")); $("#gDragHelper ul").append(clone); $(clone).css("position", "absolute"); $(clone).css("top", beginTop); $(clone).css("left", beginLeft); $(clone).css("z-index", zindex--); $(this).hide(); var children = $(clone).find(".gMicroThumb .gThumbnail"); var width = new String(children.css("width")).replace(/[^0-9]/g,"") * .5; var height = new String(children.css("height")).replace(/[^0-9]/g,"") * .5; var marginTop = new String(children.css("margin-top")).replace(/[^\.0-9]/g,"") * .5; children.attr("width", width); children.attr("height", height); children.css("margin-top", marginTop); if (i < 9) { beginTop -= 5; beginLeft += 5; } }); return $("#gDragHelper"); }, stop: function(event, ui) { $("#gDragHelper li").each(function(i) { $("#thumb_" + $(this).attr("ref")).show(); }); $(".gMicroThumbContainer.ui-selected").css("z-index", null); $("#gDragHelper").remove(); $("#gPlaceHolder").remove(); } }; // Thumbnail Grid Droppable var thumbDroppable = { tolerance: "pointer", over: function(event, ui) { $("#gPlaceHolder").show(); }, out: function(event, ui) { $("#gPlaceHolder").hide(); }, drop: function(event, ui) { $("#gDragHelper").hide(); $("#gPlaceHolder").hide(); var newOrder = ""; $("#gMicroThumbGrid .gMicroThumbContainer").each(function(i) { if ($(this).attr("id") == "gPlaceHolder") { $("#gDragHelper li").each(function(i) { newOrder += "&item[]=" + $(this).attr("ref"); }); } else if ($(this).css("display") != "none") { newOrder += "&item[]=" + $(this).attr("ref"); } else { // If its not displayed then its one of the ones being moved so ignore. } }); $("#gDragHelper li").each(function(i) { $("#gPlaceHolder").before($("#thumb_" + $(this).attr("ref")).show()); }); $.ajax({ data: newOrder, dataType: "json", success: operationCallback, type: "POST", url: get_organize_url("organize/startTask/rearrange", {item_id: item_id}) }); } }; // Album Tree Droppable var treeDroppable = { tolerance: "pointer", greedy: true, hoverClass: "gBranchDroppable", drop: function(event, ui) { $("#gDragHelper").hide(); var targetItemId = $(this).attr("ref"); if ($(this).hasClass("gBranchSelected")) { $("#gMessage").empty().append(INVALID_DROP_TARGET); ui.draggable.trigger("stop", event); return false; } var postData = serializeItemIds("#gDragHelper li"); var okToMove = true; $("#gDragHelper li").each(function(i) { okToMove &= targetItemId != $(this).attr("ref"); }); if (!okToMove) { $("#gMessage").empty().append(INVALID_DROP_TARGET); ui.draggable.trigger("stop", event); return false; } $("#gDragHelper li").each(function(i) { $("#thumb_" + $(this).attr("ref")).remove(); }); $.ajax({ data: postData, dataType: "json", success: operationCallback, type: "POST", url: get_organize_url("organize/startTask/move", {item_id: targetItemId}) }); return true; } }; // Selectable var selectable = { filter: ".gMicroThumbContainer", selected: function(event, ui) { setDrawerButtonState(); }, unselected: function(event, ui) { setDrawerButtonState(); }, stop: function(event, ui) { getEditForm(); } }; // ************************************************************************** // Event Handlers // MicroThumbContainer mouseup var onMicroThumbContainerMouseup = function(event) { // For simplicity always remove the ui-selected class. If it was unselected // it will get added back $(this).toggleClass("ui-selected"); setDrawerButtonState(); if ($("#gMicroThumbGrid li.ui-selected").length > 0) { getEditForm(); } }; // MicroThumbContainer mousemove var onMicroThumbContainerMousemove = function(event) { if ($("#gDragHelper").length > 0 && $(this).attr("id") != "gPlaceHolder") { if (event.pageX < $(this).offset().left + $(this).width() / 2) { $(this).before($("#gPlaceHolder")); } else { $(this).after($("#gPlaceHolder")); } var container = $("#gMicroThumbPanel").get(0); var scrollHeight = container.scrollHeight; var scrollTop = container.scrollTop; var height = $(container).height(); if (event.pageY > height + scrollTop) { container.scrollTop = this.offsetTop; } else if (event.pageY < scrollTop) { container.scrollTop -= height; } } }; // Handle click events on the buttons on the drawer handle function drawerHandleButtonsClick(event) { event.preventDefault(); if (!$(this).attr("disabled")) { var operation = $(this).attr("ref"); switch (operation) { case "edit": case "close": $("#gOrganizeEditDrawerPanel").animate( {"height": "toggle", "display": "block"}, {duration: "fast", complete: function() { setSelectedThumbs(); if (operation == "close") { $("#gOrganizeEditHandleButtonsLeft a[ref='edit']").css("display", "inline-block"); $("#gOrganizeEditHandleButtonsLeft a[ref='close']").css("display", "none"); $("#gOrganizeEditHandleButtonsMiddle a").css("display", "none"); } else { $("#gOrganizeEditHandleButtonsLeft a[ref='edit']").css("display", "none"); $("#gOrganizeEditHandleButtonsLeft a[ref='close']").css("display", "inline-block"); $("#gOrganizeEditHandleButtonsMiddle a").css("display", "inline-block"); } }, step: function() { $("#gMicroThumbPanel").height(heightMicroThumbPanel - $(this).height()); } }); break; case "select-all": $("#gMicroThumbGrid li").addClass("ui-selected"); $("#gMicroThumbSelectAll").hide(); $("#gMicroThumbUnselectAll").show(); setDrawerButtonState(); getEditForm(); break; case "unselect-all": $("#gMicroThumbGrid li").removeClass("ui-selected"); $("#gMicroThumbSelectAll").show(); $("#gMicroThumbUnselectAll").hide(); setDrawerButtonState(); break; case "done": $("#gDialog").dialog("close"); break; case "submit": var currentTab = $("#gOrganizeEditForm").tabs("option", "selected"); var form = $("#pane-"+currentTab+" form"); var url = $(form).attr("action") .replace("__FUNCTION__", $(form).attr("ref")); $.ajax({ data: $(form).serialize(), dataType: "json", success: function (data, textStatus) { $("#pane-"+currentTab).children("form").replaceWith(data.form); if (data.message) { $("#gMessage").empty().append("
" + data.message + "
"); } }, type: "POST", url: url }); break; case "reset": currentTab = $("#gOrganizeEditForm").tabs("option", "selected"); form = $("#pane-"+currentTab+" form"); $.ajax({ data: serializeItemIds("#gMicroThumbPanel li.ui-selected"), dataType: "html", success: function (data, textStatus) { $("#pane-"+currentTab + " form").replaceWith(data); }, type: "GET", url: $(form).attr("action").replace("__FUNCTION__", "reset_" + $(form).attr("ref")) }); break; case "delete": if (!confirm(CONFIRM_DELETE)) { break; } default: $.ajax({ data: serializeItemIds("#gMicroThumbPanel li.ui-selected"), dataType: "json", success: operationCallback, type: "POST", url: get_organize_url("organize/startTask/" + operation, {item_id: item_id}) }); break; } } }; // ************************************************************************** // AJAX Callbacks // MicroThumbContainer click var getMicroThumbsCallback = function(json, textStatus) { if (json.count > 0) { $("#gMicroThumbGrid").append(json.data); retrieveMicroThumbs(); $(".gMicroThumbContainer").mouseup(onMicroThumbContainerMouseup); $(".gMicroThumbContainer").mousemove(onMicroThumbContainerMousemove); $(".gMicroThumbContainer").draggable(draggable); } }; var operationCallback = function (data, textStatus) { var done = false; if (!paused) { createProgressDialog(data.runningMsg); task = data.task; task.pauseMsg = data.pauseMsg; task.resumeMsg = data.resumeMsg; done = data.task.done; } $(".gMicroThumbContainer").draggable("disable"); paused = false; while (!done && !paused) { $.ajax({async: false, success: function(data, textStatus) { $(".gProgressBar").progressbar("value", data.task.percent_complete); done = data.task.done; if (data.task.post_process.reload) { $.each(data.task.post_process.reload, function() { var selector = "#gMicroThumb-" + this.id + " img"; $(selector).attr("height", this.height); $(selector).attr("width", this.width); $(selector).attr("src", this.src); $(selector).css("margin-top", this.marginTop); }); } if (data.task.post_process.remove) { $.each(data.task.post_process.remove, function() { $("#thumb_" + this.id).remove(); }); } }, error: function(XMLHttpRequest, textStatus, errorThrown) { paused = true; displayAjaxError(XMLHttpRequest.responseText); }, dataType: "json", type: "POST", url: get_organize_url("organize/runTask", {task_id: task.id}) }); } if (!paused) { $("#gOrganizeProgressDialog").dialog("destroy").remove(); $.ajax({async: false, success: function(data, textStatus) { setDrawerButtonState(); task = null; $("#gMessage").empty().append("
" + data.task.status + "
"); }, dataType: "json", type: "POST", url: get_organize_url("organize/finishTask", {task_id: task.id}) }); } $(".gMicroThumbContainer").draggable("enable"); }; // ************************************************************************** /** * Dynamically initialize the organize dialog when it is displayed */ function organize_dialog_init() { var size = getViewportSize(); heightMicroThumbPanel = size.height() - 100; var width = size.width() - 100; // Deal with ui.jquery bug: http://dev.jqueryui.com/ticket/4475 $(".sf-menu li.sfHover ul").css("z-index", 70); $("#gDialog").dialog("option", "width", width); $("#gDialog").dialog("option", "height", heightMicroThumbPanel); $("#gDialog").dialog("open"); if ($("#gDialog h1").length) { $("#gDialog").dialog('option', 'title', $("#gDialog h1:eq(0)").html()); } else if ($("#gDialog fieldset legend").length) { $("#gDialog").dialog('option', 'title', $("#gDialog fieldset legend:eq(0)").html()); } $("#gDialog").bind("organize_close", function(target) { $.gallery_reload(); }); heightMicroThumbPanel -= 2 * parseFloat($("#gDialog").css("padding-top")); heightMicroThumbPanel -= 2 * parseFloat($("#gDialog").css("padding-bottom")); heightMicroThumbPanel -= $("#gMicroThumbPanel").position().top; heightMicroThumbPanel -= $("#gDialog #ft").height(); heightMicroThumbPanel -= $("#gOrganizeEditDrawerHandle").height(); heightMicroThumbPanel = Math.round(heightMicroThumbPanel); $("#gMicroThumbPanel").height(heightMicroThumbPanel); $("#gOrganizeTreeContainer").height(heightMicroThumbPanel); $(".gOrganizeBranch .ui-icon").click(organizeToggleChildren); $(".gBranchText").droppable(treeDroppable); $(".gBranchText").click(organizeOpenFolder); retrieveMicroThumbs(item_id); //showLoading("#gDialog"); $("#gMicroThumbPanel").droppable(thumbDroppable); $("#gMicroThumbPanel").selectable(selectable); $("#gOrganizeEditDrawerHandle a").click(drawerHandleButtonsClick); } function retrieveMicroThumbs() { var offset = $("#gMicroThumbGrid li").length; if (url == null) { var grid_width = $("#gMicroThumbPanel").width(); url = $("#gMicroThumbPanel").attr("ref"); url = url.replace("__WIDTH__", grid_width); url = url.replace("__HEIGHT__", heightMicroThumbPanel); } var url_data = url.replace("__OFFSET__", offset); url_data = url_data.replace("__ITEM_ID__", item_id); $.getJSON(url_data, getMicroThumbsCallback); } function organizeToggleChildren(event) { var id = $(this).attr("ref"); var span_children = $("#gOrganizeChildren-" + id); if ($(this).hasClass("ui-icon-plus")) { $(this).removeClass("ui-icon-plus"); $(this).addClass("ui-icon-minus"); $("#gOrganizeChildren-" + id).removeClass("gBranchCollapsed"); } else { $(this).removeClass("ui-icon-minus"); $(this).addClass("ui-icon-plus"); $("#gOrganizeChildren-" + id).addClass("gBranchCollapsed"); } event.preventDefault(); } function organizeOpenFolder(event) { var selected = $(".gBranchSelected"); if ($(selected).attr("id") != $(this).attr("id")) { $(selected).removeClass("gBranchSelected"); $(this).addClass("gBranchSelected"); item_id = $(this).attr("ref"); $("#gMicroThumbGrid").empty(); retrieveMicroThumbs(); } event.preventDefault(); } function get_organize_url(uri, parms) { var url = rearrangeUrl; url = url.replace("__URI__", uri); url = url.replace("__ITEM_ID__", !parms.item_id ? "" : parms.item_id); url += (parms.item_id && parms.task_id) ? "/" : ""; url = url.replace("__TASK_ID__", !parms.task_id ? "" : parms.task_id); return url; } /** * Set the enabled/disabled state of the buttons. The album cover is only enabled if * there is only 1 image selected */ function setDrawerButtonState() { $("#gOrganizeFormThumbStack").empty(); $("#gOrganizeEditForm").empty(); var selectedCount = $("#gMicroThumbGrid li.ui-selected").length; if (selectedCount) { $("#gOrganizeEditHandleButtonsLeft a").removeAttr("disabled"); $("#gOrganizeEditHandleButtonsLeft a").removeClass("ui-state-disabled"); if (selectedCount > 1) { $("#gOrganizeEditHandleButtonsLeft a[ref='albumCover']").attr("disabled", true); $("#gOrganizeEditHandleButtonsLeft a[ref='albumCover']").addClass("ui-state-disabled"); } setSelectedThumbs(); } else { if ($("#gOrganizeEditDrawerPanel::visible").length) { $("#gOrganizeEditHandleButtonsLeft a[ref='close']").trigger("click"); } $("#gOrganizeEditHandleButtonsLeft a").attr("disabled", true); $("#gOrganizeEditHandleButtonsLeft a").addClass("ui-state-disabled"); } } function setSelectedThumbs() { if (!$("#gOrganizeEditDrawerPanel::visible").length) { return; } var position = $("#gOrganizeFormThumbStack").position(); var beginLeft = position.left; var beginTop = 50; var zindex = 2000; $("li.ui-selected").each(function(i) { var clone = $(this).clone(); $(clone).attr("id", "edit_clone_" + $(this).attr("ref")); $("#gOrganizeFormThumbStack").append(clone); $(clone).removeClass("ui-draggable"); $(clone).removeClass("ui-selected"); $(clone).css("margin-top", beginTop); $(clone).css("left", beginLeft); $(clone).css("z-index", zindex--); if (i < 9) { beginTop -= 5; beginLeft += 5; } }); } function getEditForm() { if ($("#gMicroThumbGrid li.ui-selected").length > 0) { var postData = serializeItemIds("li.ui-selected"); var url_data = get_organize_url("organize/editForm", {}) + postData; $.get(url_data, function(data, textStatus) { $("#gOrganizeEditForm").tabs("destroy"); $("#gOrganizeEditForm").html(data); if ($("#gOrganizeEditForm ul li").length) { $("#gOrganizeEditForm").tabs(); $("#gOrganizeEditHandleButtonsMiddle a").removeAttr("disabled"); $("#gOrganizeEditHandleButtonsMiddle a").removeClass("ui-state-disabled"); } else { $("#gOrganizeEditHandleButtonsMiddle a").attr("disabled", true); $("#gOrganizeEditHandleButtonsMiddle a").addClass("ui-state-disabled"); } }); } else { $("#gOrganizeEditForm").tabs("destroy"); $("#gOrganizeEditForm").empty(); } } function serializeItemIds(selector) { var postData = ""; $(selector).each(function(i) { postData += "&item[]=" + $(this).attr("ref"); }); return postData; } function submitCurrentForm(event) { console.log("submitCurrentForm"); return false; } function resetCurrentForm(event) { console.log("resetCurrentForm"); return false; } function createProgressDialog(title) { $("body").append("
" + "
" + "" + "" + "" + "
"); $("#gOrganizeProgressDialog").dialog({ autoOpen: true, autoResize: false, modal: true, resizable: false, title: title }); $(".gProgressBar").progressbar(); $("#gOrganizeTaskPause").click(function(event) { paused = true; $("#gOrganizeTaskPause").hide(); $("#gOrganizeTaskResume").show(); $("#gOrganizeTaskCancel").show(); $("#gMessage").empty().append(task.pauseMsg); }); $("#gOrganizeTaskResume").click(function(event) { $("#gOrganizeTaskPause").show(); $("#gOrganizeTaskResume").hide(); $("#gOrganizeTaskCancel").hide(); $("#gMessage").empty().append(task.resumeMsg); operationCallback(); //startRearrangeCallback(); }); $("#gOrganizeTaskCancel").click(function(event) { $("#gOrganizeTaskPause").show(); $("#gOrganizeTaskResume").hide(); $("#gOrganizeTaskCancel").hide(); $.ajax({async: false, success: function(data, textStatus) { task = null; paused = false; transitItems = []; $("#gMessage").empty().append("
" + data.task.status + "
"); $("#gOrganizeProgressDialog").dialog("destroy").remove(); }, dataType: "json", type: "POST", url: get_organize_url("organize/cancelTask", {task_id: task.id}) }); }); } // ************************************************************************** // Functions that should probably be in a gallery namespace function getViewportSize() { return { width : function() { return window.innerWidth || document.documentElement && document.documentElement.clientWidth || document.body.clientWidth; }, height : function() { return window.innerHeight || document.documentElement && document.documentElement.clientHeight || document.body.clientHeight; } }; } function displayAjaxError(error) { $("body").append("
" + error + "
"); $("#gAjaxError").dialog({ autoOpen: true, autoResize: false, modal: true, resizable: true, width: 610, height: $("#gDialog").height() }); }