jQuery(function($) { // @todo: this is only needed for WordPress earlier than 3.2? setTimeout(function() { jQuery("#toplevel_page_admin-menu-tree-page-tree_main").addClass("wp-menu-open"); }, 100); // search/filter pages $("li.admin-menu-tree-page-filter input").keyup(function(e) { var ul = $(this).closest("ul.admin-menu-tree-page-tree"); ul.find("li").hide(); ul.find("li.admin-menu-tree-page-tree_headline,li.admin-menu-tree-page-filter").show(); var s = $(this).val(); var selector = "li:AminMenuTreePageContains('"+s+"')"; var hits = ul.find(selector); if (hits.length > 0 || s != "") { ul.find("div.admin-menu-tree-page-filter-reset").fadeIn("fast"); ul.unhighlight(); } if (s == "") { ul.find("div.admin-menu-tree-page-filter-reset").fadeOut("fast"); } ul.highlight(s); hits.show(); // hits can be childs of hidden li:s, so we must show the parents of the hits too hits.each(function(i, elm) { var parent = elm.parentNode; if (parent) { parent = $(parent); // ul -> div -> ul parent.parent().parent().addClass("admin-menu-tree-page-view-opened").removeClass("admin-menu-tree-page-view-closed"); parent.show(); } }); // if no hits: tell the user so we have less confusion. confusion is bad. var nohits_div = ul.find("div.admin-menu-tree-page-filter-nohits"); if (hits.length == 0) { nohits_div.show(); } else { nohits_div.hide(); } }); // clear/reset filter and show all pages again $("div.admin-menu-tree-page-filter-reset").click(function() { var $t = $(this); var ul = $t.closest("ul.admin-menu-tree-page-tree"); ul.find("li").fadeIn("fast"); $t.fadeOut("fast"); $t.closest("li.admin-menu-tree-page-filter").find("input").val("").focus(); ul.unhighlight(); ul.find("div.admin-menu-tree-page-filter-nohits").hide(); }); // label = hide in and focus input $("li.admin-menu-tree-page-filter label, li.admin-menu-tree-page-filter input").click(function() { var $t = $(this); $t.closest("li.admin-menu-tree-page-filter").find("label").hide(); $t.closest("li.admin-menu-tree-page-filter").find("input").focus(); }); var trees = jQuery("ul.admin-menu-tree-page-tree"); // add links to expand/collapse trees.find("li.admin-menu-tree-page-view-has-childs > div").after("
"); trees.find("div.admin-menu-tree-page-expand").live("click", function(e) { e.preventDefault(); var $t = $(this); var $li = $t.closest("li"); var $a = $li.find("a:first"); var $ul = $li.find("ul:first"); var isOpen = false; if ($ul.is(":visible")) { $ul.slideUp(function() { $li.addClass("admin-menu-tree-page-view-closed").removeClass("admin-menu-tree-page-view-opened"); }); } else { $ul.slideDown(function() { $li.addClass("admin-menu-tree-page-view-opened").removeClass("admin-menu-tree-page-view-closed"); }); isOpen = true; } var post_id = $a.attr("href").match(/\?post=([\d]+)/)[1]; var array_pos = $.inArray(post_id, admin_menu_tree_page_view_opened_posts); if (array_pos > -1) { // did exist in cookie admin_menu_tree_page_view_opened_posts = admin_menu_tree_page_view_opened_posts.splice(array_pos+1, 1); } // array now has not our post_id. so add it if visible/open if (isOpen) { admin_menu_tree_page_view_opened_posts.push(post_id); } admin_menu_tree_page_view_save_opened_posts(); }); // mouse over to show edit-box $("ul.admin-menu-tree-page-tree li div.amtpv-linkwrap:first-child").live("mouseenter mouseleave", function(e) { var t = $(this); var li = t.closest("li"); var popupdiv = li.find("div.amtpv-editpopup:first"); var linkwrap = li.find("div.amtpv-linkwrap:first") //var popup_linkwrap = popupdiv.closest("div.amtpv-linkwrap"); if (e.type == "mouseenter" || e.type == "mouseover") { var ul = t.closest("ul.admin-menu-tree-page-tree"); // don't show if another one is in edit mode if (ul.find("div.amtpv-editpopup-is-working").length > 0) { } else { ul.find("div.amtpv-editpopup").removeClass("amtpv-editpopup-hover"); ul.find("div.amtpv-linkwrap").removeClass("amtpv-linkwrap-hover"); popupdiv.addClass("amtpv-editpopup-hover"); linkwrap.addClass("amtpv-linkwrap-hover"); } } else if (e.type == "mouseleave" || e.type == "mouseout") { // don't hide if related target is the shadow of the menu, aka #adminmenushadow var do_hide = true; if (e.relatedTarget && e.relatedTarget.id == "adminmenushadow") { do_hide = false; } // also don't hide if wrap div has .amtpv-editpopup-is-working if (linkwrap.hasClass("amtpv-editpopup-is-working")) { do_hide = false; } if (do_hide) { popupdiv.removeClass("amtpv-editpopup-hover"); linkwrap.removeClass("amtpv-linkwrap-hover"); } } }); $("div.amtpv-editpopup").live("mouseenter mouseleave", function(e) { var t = $(this); var li = t.closest("li"); var popupdiv = li.find("div.amtpv-editpopup:first"); var linkwrap = li.find("div.amtpv-linkwrap:first") if (e.type == "mouseenter" || e.type == "mouseover") { t.addClass("amtpv-editpopup-hover-hover"); } else if (e.type == "mouseleave" || e.type == "mouseout") { if (linkwrap.hasClass("amtpv-editpopup-is-working")) { } else { t.removeClass("amtpv-editpopup-hover-hover"); } } }); // don't allow clicks directly on .amtpv-editpopup. it's kinda confusing $("div.amtpv-editpopup").live("click", function(e) { //e.preventDefault(); }); // edit/view links $("div.amtpv-editpopup-edit, div.amtpv-editpopup-view").live("click",function(e) { e.preventDefault(); var t = $(this); var link = t.data("link"); var new_win = false; if ( ($.client.os == "Mac" && (e.metaKey || e.shiftKey)) || ($.client.os != "Mac" && e.ctrlKey) ) { new_win = true; } if (new_win) { window.open(link); } else { document.location = link; } }); // add links $("div.amtpv-editpopup-add-after, div.amtpv-editpopup-add-inside").live("click", function(e) { var t = $(this); var post_id = t.closest("a").data("post-id"); var popup = t.closest("div.amtpv-editpopup"); var popup_linkwrap = popup.closest("div.amtpv-linkwrap"); var editpopup_add = popup.find("div.amtpv-editpopup-add"); var editpopup_editview = popup.find("div.amtpv-editpopup-editview"); // hide all divs // @todo: should put all in one div, and hide just that one popup.find("> div").hide(); // add class that tell us that we are in "adding-mode"/"working-mode" popup_linkwrap.addClass("amtpv-editpopup-is-working"); var type = "after"; if (t.hasClass("amtpv-editpopup-add-inside")) { type = "inside"; } // remove possibly previous added add-stuff popup.find("form.amtpv-editpopup-addpages").remove(); var add_pages = $("
") .addClass("amtpv-editpopup-addpages") .insertAfter(editpopup_add) ; add_pages.append( "
Add new page(s)
" ); add_pages.append( $("") ); // var type = popup.find(".amtpv-editpopup-addpages-type").val(); if (type=="after") { add_pages.append( $("
") ); add_pages.append( $("
") ); //add_pages.append( $("
")); add_pages.append( $("
or cancel
")); add_pages.find(".amtpv-editpopup-addpages-name").focus(); add_pages.find("ul.amtpv-editpopup-addpages-names-ul").sortable({ "xaxis": "y", "containment": 'parent', "forceHelperSize": true, "forcePlaceholderSize": true, "handle": "span:first", "placeholder": "ui-state-highlight" }); return; }); // add new page-link // @TODO: $("div.amtpv-editpopup-addpages-addpage a").live("click", function(e) { e.preventDefault(); var t = $(this); var newelm = $("
  • "); t.parent().prev("ul.amtpv-editpopup-addpages-names-ul").append( newelm ); newelm.find("input").focus(); }); // when typing in the input, add another input if we are at the last input // this way we don't have to click that "add page" button. less clicks = more productive. $("input.amtpv-editpopup-addpages-name").live("keyup", function(e) { // check if this is the last li var t = $(this); var ul = t.closest("ul"); var li = t.closest("li"); // if this input is the last one, and we have entered something, add another one var isLast = (li.index() == ul.find("li").length-1); if (isLast && t.val() != "") { var newelm = $(""); ul.append( newelm ); newelm.slideDown("fast"); } }); // cancel-link $("a.amtpv-editpopup-addpages-cancel").live("click", function() { var t = $(this); var popup = t.closest("div.amtpv-editpopup"); var linkwrap = popup.closest("div.amtpv-linkwrap"); popup.find(".amtpv-editpopup-addpages").hide().remove(); popup.find("> div").show(); linkwrap.removeClass("amtpv-editpopup-is-working"); }); // woho, add da pages! $("form.amtpv-editpopup-addpages").live("submit", function(e) { // fetch all .amtpv-editpopup-addpages-name for this popup e.preventDefault(); var t = $(this); var post_id = t.closest("div.amtpv-linkwrap").data("post-id"); var popup = t.closest("div.amtpv-editpopup"); var names = popup.find(".amtpv-editpopup-addpages-name"); var arr_names = []; names.each(function(i, elm) { var name = $.trim($(elm).val()); if (name) { arr_names.push( $(elm).val() ); } }); // we must at least have one name // @todo: make this a bit better looking if (arr_names.length == 0) { alert("Please enter a name for the new page"); return false; } popup.find("div.amtpv-editpopup-addpages-submit input").val("Adding..."); // detect after or inside // var type = popup.find(".amtpv-editpopup-addpages-type").val(); var type = popup.find("input[name=amtpv-editpopup-addpages-position]:checked").val(); // post status var post_status = popup.find("#amtpv-editpopup-addpages-publish-select").val(); var data = { "action": 'admin_menu_tree_page_view_add_page', "pageID": post_id, "type": type, "page_titles": arr_names, "post_type": "page", "post_status": post_status }; jQuery.post(ajaxurl, data, function(response) { if (response != "0") { var new_win = false; //if ( ($.client.os == "Mac" && (e.metaKey || e.shiftKey)) || ($.client.os != "Mac" && e.ctrlKey) ) { // new_win = true; //} //return; if (new_win) { window.open(response); } else { document.location = response; } } }); }); }); function admin_menu_tree_page_view_save_opened_posts() { jQuery.cookie('admin-menu-tree-page-view-open-posts', admin_menu_tree_page_view_opened_posts.join(",")); } // array with all post ids that are open var admin_menu_tree_page_view_opened_posts = jQuery.cookie('admin-menu-tree-page-view-open-posts') || ""; admin_menu_tree_page_view_opened_posts = admin_menu_tree_page_view_opened_posts.split(","); if (admin_menu_tree_page_view_opened_posts[0] == "") { // admin_menu_tree_page_view_opened_posts = []; } // http://stackoverflow.com/questions/187537/is-there-a-case-insensitive-jquery-contains-selector jQuery.expr[':'].AminMenuTreePageContains = function(a,i,m){ return (a.textContent || a.innerText || "").toLowerCase().indexOf(m[3].toLowerCase())>=0; };