Вход Регистрация
Файл: wordpress/wp-admin/js/nav-menu.js
Строк: 1720
<?php
/**
 * WordPress Administration Navigation Menu
 * Interface JS functions
 *
 * @version 2.0.0
 *
 * @package WordPress
 * @subpackage Administration
 */

/* global menus, postboxes, columns, isRtl, navMenuL10n, ajaxurl */

var wpNavMenu;

(function($) {

    var 
api;

    
api wpNavMenu = {

        
options : {
            
menuItemDepthPerLevel 30// Do not use directly. Use depthToPx and pxToDepth instead.
            
globalMaxDepth 11
        
},

        
menuList undefined,    // Set in init.
        
targetList undefined// Set in init.
        
menusChanged false,
        
isRTL: !! ( 'undefined' != typeof isRtl && isRtl ),
        
negateIfRTL: ( 'undefined' != typeof isRtl && isRtl ) ? -1,

        
// Functions that run on init.
        
init : function() {
            
api.menuList = $('#menu-to-edit');
            
api.targetList api.menuList;

            
this.jQueryExtensions();

            
this.attachMenuEditListeners();

            
this.setupInputWithDefaultTitle();
            
this.attachQuickSearchListeners();
            
this.attachThemeLocationsListeners();

            
this.attachTabsPanelListeners();

            
this.attachUnsavedChangesListener();

            if ( 
api.menuList.length )
                
this.initSortables();

            if ( 
menus.oneThemeLocationNoMenus )
                $( 
'#posttype-page' ).addSelectedToMenuapi.addMenuItemToBottom );

            
this.initManageLocations();

            
this.initAccessibility();

            
this.initToggles();

            
this.initPreviewing();
        },

        
jQueryExtensions : function() {
            
// jQuery extensions
            
$.fn.extend({
                
menuItemDepth : function() {
                    var 
margin api.isRTL this.eq(0).css('margin-right') : this.eq(0).css('margin-left');
                    return 
api.pxToDepthmargin && -!= margin.indexOf('px') ? margin.slice(0, -2) : );
                },
                
updateDepthClass : function(currentprev) {
                    return 
this.each(function(){
                        var 
= $(this);
                        
prev prev || t.menuItemDepth();
                        $(
this).removeClass('menu-item-depth-'prev )
                            .
addClass('menu-item-depth-'current );
                    });
                },
                
shiftDepthClass : function(change) {
                    return 
this.each(function(){
                        var 
= $(this),
                            
depth t.menuItemDepth();
                        $(
this).removeClass('menu-item-depth-'depth )
                            .
addClass('menu-item-depth-'+ (depth change) );
                    });
                },
                
childMenuItems : function() {
                    var 
result = $();
                    
this.each(function(){
                        var 
= $(this), depth t.menuItemDepth(), next t.next();
                        while( 
next.length && next.menuItemDepth() > depth ) {
                            
result result.addnext );
                            
next next.next();
                        }
                    });
                    return 
result;
                },
                
shiftHorizontally : function( dir ) {
                    return 
this.each(function(){
                        var 
= $(this),
                            
depth t.menuItemDepth(),
                            
newDepth depth dir;

                        
// Change .menu-item-depth-n class
                        
t.moveHorizontallynewDepthdepth );
                    });
                },
                
moveHorizontally : function( newDepthdepth ) {
                    return 
this.each(function(){
                        var 
= $(this),
                            
children t.childMenuItems(),
                            
diff newDepth depth,
                            
subItemText t.find('.is-submenu');

                        
// Change .menu-item-depth-n class
                        
t.updateDepthClassnewDepthdepth ).updateParentMenuItemDBId();

                        
// If it has children, move those too
                        
if ( children ) {
                            
children.each(function() {
                                var 
= $(this),
                                    
thisDepth t.menuItemDepth(),
                                    
newDepth thisDepth diff;
                                
t.updateDepthClass(newDepththisDepth).updateParentMenuItemDBId();
                            });
                        }

                        
// Show "Sub item" helper text
                        
if (=== newDepth)
                            
subItemText.hide();
                        else
                            
subItemText.show();
                    });
                },
                
updateParentMenuItemDBId : function() {
                    return 
this.each(function(){
                        var 
item = $(this),
                            
input item.find'.menu-item-data-parent-id' ),
                            
depth parseIntitem.menuItemDepth(), 10 ),
                            
parentDepth depth 1,
                            
parent item.prevAll'.menu-item-depth-' parentDepth ).first();

                        if ( 
=== depth ) { // Item is on the top level, has no parent
                            
input.val(0);
                        } else { 
// Find the parent item, and retrieve its object id.
                            
input.valparent.find'.menu-item-data-db-id' ).val() );
                        }
                    });
                },
                
hideAdvancedMenuItemFields : function() {
                    return 
this.each(function(){
                        var 
that = $(this);
                        $(
'.hide-column-tog').not(':checked').each(function(){
                            
that.find('.field-' + $(this).val() ).addClass('hidden-field');
                        });
                    });
                },
                
/**
                 * Adds selected menu items to the menu.
                 *
                 * @param jQuery metabox The metabox jQuery object.
                 */
                
addSelectedToMenu : function(processMethod) {
                    if ( 
=== $('#menu-to-edit').length ) {
                        return 
false;
                    }

                    return 
this.each(function() {
                        var 
= $(this), menuItems = {},
                            
checkboxes = ( menus.oneThemeLocationNoMenus && === t.find'.tabs-panel-active .categorychecklist li input:checked' ).length ) ? t.find'#page-all li input[type="checkbox"]' ) : t.find'.tabs-panel-active .categorychecklist li input:checked' ),
                            
re = /menu-item[([^]]*)/;

                        
processMethod processMethod || api.addMenuItemToBottom;

                        
// If no items are checked, bail.
                        
if ( !checkboxes.length )
                            return 
false;

                        
// Show the ajax spinner
                        
t.find'.spinner' ).addClass'is-active' );

                        
// Retrieve menu item data
                        
$(checkboxes).each(function(){
                            var 
= $(this),
                                
listItemDBIDMatch re.exect.attr('name') ),
                                
listItemDBID 'undefined' == typeof listItemDBIDMatch[1] ? parseInt(listItemDBIDMatch[1], 10);

                            if ( 
this.className && -!= this.className.indexOf('add-to-top') )
                                
processMethod api.addMenuItemToTop;
                            
menuItems[listItemDBID] = t.closest('li').getItemData'add-menu-item'listItemDBID );
                        });

                        
// Add the items
                        
api.addItemToMenu(menuItemsprocessMethod, function(){
                            
// Deselect the items and hide the ajax spinner
                            
checkboxes.removeAttr('checked');
                            
t.find'.spinner' ).removeClass'is-active' );
                        });
                    });
                },
                
getItemData : function( itemTypeid ) {
                    
itemType itemType || 'menu-item';

                    var 
itemData = {}, i,
                    
fields = [
                        
'menu-item-db-id',
                        
'menu-item-object-id',
                        
'menu-item-object',
                        
'menu-item-parent-id',
                        
'menu-item-position',
                        
'menu-item-type',
                        
'menu-item-title',
                        
'menu-item-url',
                        
'menu-item-description',
                        
'menu-item-attr-title',
                        
'menu-item-target',
                        
'menu-item-classes',
                        
'menu-item-xfn'
                    
];

                    if( !
id && itemType == 'menu-item' ) {
                        
id this.find('.menu-item-data-db-id').val();
                    }

                    if( !
id ) return itemData;

                    
this.find('input').each(function() {
                        var 
field;
                        
fields.length;
                        while ( 
i-- ) {
                            if( 
itemType == 'menu-item' )
                                
field fields[i] + '[' id ']';
                            else if( 
itemType == 'add-menu-item' )
                                
field 'menu-item[' id '][' fields[i] + ']';

                            if (
                                
this.name &&
                                
field == this.name
                            
) {
                                
itemData[fields[i]] = this.value;
                            }
                        }
                    });

                    return 
itemData;
                },
                
setItemData : function( itemDataitemTypeid ) { // Can take a type, such as 'menu-item', or an id.
                    
itemType itemType || 'menu-item';

                    if( !
id && itemType == 'menu-item' ) {
                        
id = $('.menu-item-data-db-id'this).val();
                    }

                    if( !
id ) return this;

                    
this.find('input').each(function() {
                        var 
= $(this), field;
                        $.
eachitemData, function( attrval ) {
                            if( 
itemType == 'menu-item' )
                                
field attr '[' id ']';
                            else if( 
itemType == 'add-menu-item' )
                                
field 'menu-item[' id '][' attr ']';

                            if ( 
field == t.attr('name') ) {
                                
t.valval );
                            }
                        });
                    });
                    return 
this;
                }
            });
        },

        
countMenuItems : function( depth ) {
            return $( 
'.menu-item-depth-' depth ).length;
        },

        
moveMenuItem : function( $thisdir ) {

            var 
itemsnewItemPositionnewDepth,
                
menuItems = $( '#menu-to-edit li' ),
                
menuItemsCount menuItems.length,
                
thisItem $this.parents'li.menu-item' ),
                
thisItemChildren thisItem.childMenuItems(),
                
thisItemData thisItem.getItemData(),
                
thisItemDepth parseIntthisItem.menuItemDepth(), 10 ),
                
thisItemPosition parseIntthisItem.index(), 10 ),
                
nextItem thisItem.next(),
                
nextItemChildren nextItem.childMenuItems(),
                
nextItemDepth parseIntnextItem.menuItemDepth(), 10 ) + 1,
                
prevItem thisItem.prev(),
                
prevItemDepth parseIntprevItem.menuItemDepth(), 10 ),
                
prevItemId prevItem.getItemData()['menu-item-db-id'];

            switch ( 
dir ) {
            case 
'up':
                
newItemPosition thisItemPosition 1;

                
// Already at top
                
if ( === thisItemPosition )
                    break;

                
// If a sub item is moved to top, shift it to 0 depth
                
if ( === newItemPosition && !== thisItemDepth )
                    
thisItem.moveHorizontally0thisItemDepth );

                
// If prev item is sub item, shift to match depth
                
if ( !== prevItemDepth )
                    
thisItem.moveHorizontallyprevItemDepththisItemDepth );

                
// Does this item have sub items?
                
if ( thisItemChildren ) {
                    
items thisItem.addthisItemChildren );
                    
// Move the entire block
                    
items.detach().insertBeforemenuItems.eqnewItemPosition ) ).updateParentMenuItemDBId();
                } else {
                    
thisItem.detach().insertBeforemenuItems.eqnewItemPosition ) ).updateParentMenuItemDBId();
                }
                break;
            case 
'down':
                
// Does this item have sub items?
                
if ( thisItemChildren ) {
                    
items thisItem.addthisItemChildren ),
                        
nextItem menuItems.eqitems.length thisItemPosition ),
                        
nextItemChildren !== nextItem.childMenuItems().length;

                    if ( 
nextItemChildren ) {
                        
newDepth parseIntnextItem.menuItemDepth(), 10 ) + 1;
                        
thisItem.moveHorizontallynewDepththisItemDepth );
                    }

                    
// Have we reached the bottom?
                    
if ( menuItemsCount === thisItemPosition items.length )
                        break;

                    
items.detach().insertAftermenuItems.eqthisItemPosition items.length ) ).updateParentMenuItemDBId();
                } else {
                    
// If next item has sub items, shift depth
                    
if ( !== nextItemChildren.length )
                        
thisItem.moveHorizontallynextItemDepththisItemDepth );

                    
// Have we reached the bottom
                    
if ( menuItemsCount === thisItemPosition )
                        break;
                    
thisItem.detach().insertAftermenuItems.eqthisItemPosition ) ).updateParentMenuItemDBId();
                }
                break;
            case 
'top':
                
// Already at top
                
if ( === thisItemPosition )
                    break;
                
// Does this item have sub items?
                
if ( thisItemChildren ) {
                    
items thisItem.addthisItemChildren );
                    
// Move the entire block
                    
items.detach().insertBeforemenuItems.eq) ).updateParentMenuItemDBId();
                } else {
                    
thisItem.detach().insertBeforemenuItems.eq) ).updateParentMenuItemDBId();
                }
                break;
            case 
'left':
                
// As far left as possible
                
if ( === thisItemDepth )
                    break;
                
thisItem.shiftHorizontally( -);
                break;
            case 
'right':
                
// Can't be sub item at top
                
if ( === thisItemPosition )
                    break;
                
// Already sub item of prevItem
                
if ( thisItemData['menu-item-parent-id'] === prevItemId )
                    break;
                
thisItem.shiftHorizontally);
                break;
            }
            
$this.focus();
            
api.registerChange();
            
api.refreshKeyboardAccessibility();
            
api.refreshAdvancedAccessibility();
        },

        
initAccessibility : function() {
            var 
menu = $( '#menu-to-edit' );

            
api.refreshKeyboardAccessibility();
            
api.refreshAdvancedAccessibility();

            
// Refresh the accessibility when the user comes close to the item in any way
            
menu.on'mouseenter.refreshAccessibility focus.refreshAccessibility touchstart.refreshAccessibility' '.menu-item' , function(){
                
api.refreshAdvancedAccessibilityOfItem( $( this ).find'.item-edit' ) );
            } );

            
// We have to update on click as well because we might hover first, change the item, and then click.
            
menu.on'click''.item-edit', function() {
                
api.refreshAdvancedAccessibilityOfItem( $( this ) );
            } );

            
// Links for moving items
            
menu.on'click''.menus-move', function ( ) {
                var 
$this = $( this ),
                    
dir $this.data'dir' );

                if ( 
'undefined' !== typeof dir ) {
                    
api.moveMenuItem( $( this ).parents'li.menu-item' ).find'a.item-edit' ), dir );
                }
                
e.preventDefault();
            });
        },

        
/**
         * refreshAdvancedAccessibilityOfItem( [itemToRefresh] )
         *
         * Refreshes advanced accessibility buttons for one menu item.
         * Shows or hides buttons based on the location of the menu item.
         *
         * @param  {object} itemToRefresh The menu item that might need its advanced accessibility buttons refreshed
         */
        
refreshAdvancedAccessibilityOfItem : function( itemToRefresh ) {

            
// Only refresh accessibility when necessary
            
if ( true !== $( itemToRefresh ).data'needs_accessibility_refresh' ) ) {
                return;
            }

            var 
thisLinkthisLinkTextprimaryItemsitemPositiontitle,
                
parentItemparentItemIdparentItemNamesubItems,
                
$this = $( itemToRefresh ),
                
menuItem $this.closest'li.menu-item' ).first(),
                
depth menuItem.menuItemDepth(),
                
isPrimaryMenuItem = ( === depth ),
                
itemName $this.closest'.menu-item-handle' ).find'.menu-item-title' ).text(),
                
position parseIntmenuItem.index(), 10 ),
                
prevItemDepth = ( isPrimaryMenuItem ) ? depth parseIntdepth 110 ),
                
prevItemNameLeft menuItem.prevAll('.menu-item-depth-' prevItemDepth).first().find'.menu-item-title' ).text(),
                
prevItemNameRight menuItem.prevAll('.menu-item-depth-' depth).first().find'.menu-item-title' ).text(),
                
totalMenuItems = $('#menu-to-edit li').length,
                
hasSameDepthSibling menuItem.nextAll'.menu-item-depth-' depth ).length;

                
menuItem.find'.field-move' ).toggletotalMenuItems ); 

            
// Where can they move this menu item?
            
if ( !== position ) {
                
thisLink menuItem.find'.menus-move-up' );
                
thisLink.prop'title'menus.moveUp ).css'display''inline' );
            }

            if ( 
!== position && isPrimaryMenuItem ) {
                
thisLink menuItem.find'.menus-move-top' );
                
thisLink.prop'title'menus.moveToTop ).css'display''inline' );
            }

            if ( 
position !== totalMenuItems && !== position ) {
                
thisLink menuItem.find'.menus-move-down' );
                
thisLink.prop'title'menus.moveDown ).css'display''inline' );
            }

            if ( 
=== position && !== hasSameDepthSibling ) {
                
thisLink menuItem.find'.menus-move-down' );
                
thisLink.prop'title'menus.moveDown ).css'display''inline' );
            }

            if ( ! 
isPrimaryMenuItem ) {
                
thisLink menuItem.find'.menus-move-left' ),
                
thisLinkText menus.outFrom.replace'%s'prevItemNameLeft );
                
thisLink.prop'title'menus.moveOutFrom.replace'%s'prevItemNameLeft ) ).textthisLinkText ).css'display''inline' );
            }

            if ( 
!== position ) {
                if ( 
menuItem.find'.menu-item-data-parent-id' ).val() !== menuItem.prev().find'.menu-item-data-db-id' ).val() ) {
                    
thisLink menuItem.find'.menus-move-right' ),
                    
thisLinkText menus.under.replace'%s'prevItemNameRight );
                    
thisLink.prop'title'menus.moveUnder.replace'%s'prevItemNameRight ) ).textthisLinkText ).css'display''inline' );
                }
            }

            if ( 
isPrimaryMenuItem ) {
                
primaryItems = $( '.menu-item-depth-0' ),
                
itemPosition primaryItems.indexmenuItem ) + 1,
                
totalMenuItems primaryItems.length,

                
// String together help text for primary menu items
                
title menus.menuFocus.replace'%1$s'itemName ).replace'%2$d'itemPosition ).replace'%3$d'totalMenuItems );
            } else {
                
parentItem menuItem.prevAll'.menu-item-depth-' parseIntdepth 110 ) ).first(),
                
parentItemId parentItem.find'.menu-item-data-db-id' ).val(),
                
parentItemName parentItem.find'.menu-item-title' ).text(),
                
subItems = $( '.menu-item .menu-item-data-parent-id[value="' parentItemId '"]' ),
                
itemPosition = $( subItems.parents('.menu-item').get().reverse() ).indexmenuItem ) + 1;

                
// String together help text for sub menu items
                
title menus.subMenuFocus.replace'%1$s'itemName ).replace'%2$d'itemPosition ).replace'%3$s'parentItemName );
            }

            
$this.prop('title'title).htmltitle );

            
// Mark this item's accessibility as refreshed
            
$this.data'needs_accessibility_refresh'false );
        },

        
/**
         * refreshAdvancedAccessibility
         *
         * Hides all advanced accessibility buttons and marks them for refreshing.
         */
        
refreshAdvancedAccessibility : function() {

            
// Hide all links by default
            
$( '.menu-item-settings .field-move a' ).hide();

            
// Mark all menu items as unprocessed
            
$( '.item-edit' ).data'needs_accessibility_refresh'true );

            
// All open items have to be refreshed or they will show no links
            
$( '.menu-item-edit-active .item-edit' ).each( function() {
                
api.refreshAdvancedAccessibilityOfItemthis );
            } );
        },

        
refreshKeyboardAccessibility : function() {
            $( 
'.item-edit' ).off'focus' ).on'focus', function(){
                $(
this).off'keydown' ).on'keydown', function(e){

                    var 
arrows,
                        
$this = $( this ),
                        
thisItem $this.parents'li.menu-item' ),
                        
thisItemData thisItem.getItemData();

                    
// Bail if it's not an arrow key
                    
if ( 37 != e.which && 38 != e.which && 39 != e.which && 40 != e.which )
                        return;

                    
// Avoid multiple keydown events
                    
$this.off('keydown');

                    
// Bail if there is only one menu item
                    
if ( === $('#menu-to-edit li').length )
                        return;

                    
// If RTL, swap left/right arrows
                    
arrows = { '38''up''40''down''37''left''39''right' };
                    if ( $(
'body').hasClass('rtl') )
                        
arrows = { '38' 'up''40' 'down''39' 'left''37' 'right' };

                    switch ( 
arrows[e.which] ) {
                    case 
'up':
                        
api.moveMenuItem$this'up' );
                        break;
                    case 
'down':
                        
api.moveMenuItem$this'down' );
                        break;
                    case 
'left':
                        
api.moveMenuItem$this'left' );
                        break;
                    case 
'right':
                        
api.moveMenuItem$this'right' );
                        break;
                    }
                    
// Put focus back on same menu item
                    
$( '#edit-' thisItemData['menu-item-db-id'] ).focus();
                    return 
false;
                });
            });
        },

        
initPreviewing : function() {
            
// Update the item handle title when the navigation label is changed.
            
$( '#menu-to-edit' ).on'change input''.edit-menu-item-title', function(e) {
                var 
input = $( e.currentTarget ), titletitleEl;
                
title input.val();
                
titleEl input.closest'.menu-item' ).find'.menu-item-title' );
                
// Don't update to empty title.
                
if ( title ) {
                    
titleEl.texttitle ).removeClass'no-title' );
                } else {
                    
titleEl.textnavMenuL10n.untitled ).addClass'no-title' );
                }
            } );
        },

        
initToggles : function() {
            
// init postboxes
            
postboxes.add_postbox_toggles('nav-menus');

            
// adjust columns functions for menus UI
            
columns.useCheckboxesForHidden();
            
columns.checked = function(field) {
                $(
'.field-' field).removeClass('hidden-field');
            };
            
columns.unchecked = function(field) {
                $(
'.field-' field).addClass('hidden-field');
            };
            
// hide fields
            
api.menuList.hideAdvancedMenuItemFields();

            $(
'.hide-postbox-tog').click(function () {
                var 
hidden = $( '.accordion-container li.accordion-section' ).filter(':hidden').map(function() { return this.id; }).get().join(',');
                $.
post(ajaxurl, {
                    
action'closed-postboxes',
                    
hiddenhidden,
                    
closedpostboxesnoncejQuery('#closedpostboxesnonce').val(),
                    
page'nav-menus'
                
});
            });
        },

        
initSortables : function() {
            var 
currentDepth 0originalDepthminDepthmaxDepth,
                
prevnextprevBottomnextThresholdhelperHeighttransport,
                
menuEdge api.menuList.offset().left,
                
body = $('body'), maxChildDepth,
                
menuMaxDepth initialMenuMaxDepth();

            if( 
!== $( '#menu-to-edit li' ).length )
                $( 
'.drag-instructions' ).show();

            
// Use the right edge if RTL.
            
menuEdge += api.isRTL api.menuList.width() : 0;

            
api.menuList.sortable({
                
handle'.menu-item-handle',
                
placeholder'sortable-placeholder',
                
start: function(eui) {
                    var 
heightwidthparentchildrentempHolder;

                    
// handle placement for rtl orientation
                    
if ( api.isRTL )
                        
ui.item[0].style.right 'auto';

                    
transport ui.item.children('.menu-item-transport');

                    
// Set depths. currentDepth must be set before children are located.
                    
originalDepth ui.item.menuItemDepth();
                    
updateCurrentDepth(uioriginalDepth);

                    
// Attach child elements to parent
                    // Skip the placeholder
                    
parent = ( ui.item.next()[0] == ui.placeholder[0] ) ? ui.item.next() : ui.item;
                    
children parent.childMenuItems();
                    
transport.appendchildren );

                    
// Update the height of the placeholder to match the moving item.
                    
height transport.outerHeight();
                    
// If there are children, account for distance between top of children and parent
                    
height += ( height ) ? (ui.placeholder.css('margin-top').slice(0, -2) * 1) : 0;
                    
height += ui.helper.outerHeight();
                    
helperHeight height;
                    
height -= 2// Subtract 2 for borders
                    
ui.placeholder.height(height);

                    
// Update the width of the placeholder to match the moving item.
                    
maxChildDepth originalDepth;
                    
children.each(function(){
                        var 
depth = $(this).menuItemDepth();
                        
maxChildDepth = (depth maxChildDepth) ? depth maxChildDepth;
                    });
                    
width ui.helper.find('.menu-item-handle').outerWidth(); // Get original width
                    
width += api.depthToPx(maxChildDepth originalDepth); // Account for children
                    
width -= 2// Subtract 2 for borders
                    
ui.placeholder.width(width);

                    
// Update the list of menu items.
                    
tempHolder ui.placeholder.next();
                    
tempHolder.css'margin-top'helperHeight 'px' ); // Set the margin to absorb the placeholder
                    
ui.placeholder.detach(); // detach or jQuery UI will think the placeholder is a menu item
                    
$(this).sortable'refresh' ); // The children aren't sortable. We should let jQ UI know.
                    
ui.item.afterui.placeholder ); // reattach the placeholder.
                    
tempHolder.css('margin-top'0); // reset the margin

                    // Now that the element is complete, we can update...
                    
updateSharedVars(ui);
                },
                
stop: function(eui) {
                    var 
childrensubMenuTitle,
                        
depthChange currentDepth originalDepth;

                    
// Return child elements to the list
                    
children transport.children().insertAfter(ui.item);

                    
// Add "sub menu" description
                    
subMenuTitle ui.item.find'.item-title .is-submenu' );
                    if ( 
currentDepth )
                        
subMenuTitle.show();
                    else
                        
subMenuTitle.hide();

                    
// Update depth classes
                    
if ( !== depthChange ) {
                        
ui.item.updateDepthClasscurrentDepth );
                        
children.shiftDepthClassdepthChange );
                        
updateMenuMaxDepthdepthChange );
                    }
                    
// Register a change
                    
api.registerChange();
                    
// Update the item data.
                    
ui.item.updateParentMenuItemDBId();

                    
// address sortable's incorrectly-calculated top in opera
                    
ui.item[0].style.top 0;

                    
// handle drop placement for rtl orientation
                    
if ( api.isRTL ) {
                        
ui.item[0].style.left 'auto';
                        
ui.item[0].style.right 0;
                    }

                    
api.refreshKeyboardAccessibility();
                    
api.refreshAdvancedAccessibility();
                },
                
change: function(eui) {
                    
// Make sure the placeholder is inside the menu.
                    // Otherwise fix it, or we're in trouble.
                    
if( ! ui.placeholder.parent().hasClass('menu') )
                        (
prev.length) ? prev.afterui.placeholder ) : api.menuList.prependui.placeholder );

                    
updateSharedVars(ui);
                },
                
sort: function(eui) {
                    var 
offset ui.helper.offset(),
                        
edge api.isRTL offset.left ui.helper.width() : offset.left,
                        
depth api.negateIfRTL api.pxToDepthedge menuEdge );
                    
// Check and correct if depth is not within range.
                    // Also, if the dragged element is dragged upwards over
                    // an item, shift the placeholder to a child position.
                    
if ( depth maxDepth || offset.top prevBottom depth maxDepth;
                    else if ( 
depth minDepth depth minDepth;

                    if( 
depth != currentDepth )
                        
updateCurrentDepth(uidepth);

                    
// If we overlap the next element, manually shift downwards
                    
if( nextThreshold && offset.top helperHeight nextThreshold ) {
                        
next.afterui.placeholder );
                        
updateSharedVarsui );
                        $( 
this ).sortable'refreshPositions' );
                    }
                }
            });

            function 
updateSharedVars(ui) {
                var 
depth;

                
prev ui.placeholder.prev();
                
next ui.placeholder.next();

                
// Make sure we don't select the moving item.
                
if( prev[0] == ui.item[0] ) prev prev.prev();
                if( 
next[0] == ui.item[0] ) next next.next();

                
prevBottom = (prev.length) ? prev.offset().top prev.height() : 0;
                
nextThreshold = (next.length) ? next.offset().top next.height() / 0;
                
minDepth = (next.length) ? next.menuItemDepth() : 0;

                if( 
prev.length )
                    
maxDepth = ( (depth prev.menuItemDepth() + 1) > api.options.globalMaxDepth ) ? api.options.globalMaxDepth depth;
                else
                    
maxDepth 0;
            }

            function 
updateCurrentDepth(uidepth) {
                
ui.placeholder.updateDepthClassdepthcurrentDepth );
                
currentDepth depth;
            }

            function 
initialMenuMaxDepth() {
                if( ! 
body[0].className ) return 0;
                var 
match body[0].className.match(/menu-max-depth-(d+)/);
                return 
match && match[1] ? parseIntmatch[1], 10 ) : 0;
            }

            function 
updateMenuMaxDepthdepthChange ) {
                var 
depthnewDepth menuMaxDepth;
                if ( 
depthChange === ) {
                    return;
                } else if ( 
depthChange ) {
                    
depth maxChildDepth depthChange;
                    if( 
depth menuMaxDepth )
                        
newDepth depth;
                } else if ( 
depthChange && maxChildDepth == menuMaxDepth ) {
                    while( ! $(
'.menu-item-depth-' newDepthapi.menuList).length && newDepth )
                        
newDepth--;
                }
                
// Update the depth class.
                
body.removeClass'menu-max-depth-' menuMaxDepth ).addClass'menu-max-depth-' newDepth );
                
menuMaxDepth newDepth;
            }
        },

        
initManageLocations : function () {
            $(
'#menu-locations-wrap form').submit(function(){
                
window.onbeforeunload null;
            });
            $(
'.menu-location-menus select').on('change', function () {
                var 
editLink = $(this).closest('tr').find('.locations-edit-menu-link');
                if ($(
this).find('option:selected').data('orig'))
                    
editLink.show();
                else
                    
editLink.hide();
            });
        },

        
attachMenuEditListeners : function() {
            var 
that this;
            $(
'#update-nav-menu').bind('click', function(e) {
                if ( 
e.target && e.target.className ) {
                    if ( -
!= e.target.className.indexOf('item-edit') ) {
                        return 
that.eventOnClickEditLink(e.target);
                    } else if ( -
!= e.target.className.indexOf('menu-save') ) {
                        return 
that.eventOnClickMenuSave(e.target);
                    } else if ( -
!= e.target.className.indexOf('menu-delete') ) {
                        return 
that.eventOnClickMenuDelete(e.target);
                    } else if ( -
!= e.target.className.indexOf('item-delete') ) {
                        return 
that.eventOnClickMenuItemDelete(e.target);
                    } else if ( -
!= e.target.className.indexOf('item-cancel') ) {
                        return 
that.eventOnClickCancelLink(e.target);
                    }
                }
            });
            $(
'#add-custom-links input[type="text"]').keypress(function(e){
                if ( 
e.keyCode === 13 ) {
                    
e.preventDefault();
                    $( 
'#submit-customlinkdiv' ).click();
                }
            });
        },

        
/**
         * An interface for managing default values for input elements
         * that is both JS and accessibility-friendly.
         *
         * Input elements that add the class 'input-with-default-title'
         * will have their values set to the provided HTML title when empty.
         */
        
setupInputWithDefaultTitle : function() {
            var 
name 'input-with-default-title';

            $(
'.' name).each( function(){
                var 
$t = $(this), title $t.attr('title'), val $t.val();
                
$t.datanametitle );

                if( 
'' === val $t.valtitle );
                else if ( 
title == val ) return;
                else 
$t.removeClassname );
            }).
focus( function(){
                var 
$t = $(this);
                if( 
$t.val() == $t.data(name) )
                    
$t.val('').removeClassname );
            }).
blur( function(){
                var 
$t = $(this);
                if( 
'' === $t.val() )
                    
$t.addClassname ).val$t.data(name) );
            });

            $( 
'.blank-slate .input-with-default-title' ).focus();
        },

        
attachThemeLocationsListeners : function() {
            var 
loc = $('#nav-menu-theme-locations'), params = {};
            
params.action 'menu-locations-save';
            
params['menu-settings-column-nonce'] = $('#menu-settings-column-nonce').val();
            
loc.find('input[type="submit"]').click(function() {
                
loc.find('select').each(function() {
                    
params[this.name] = $(this).val();
                });
                
loc.find'.spinner' ).addClass'is-active' );
                $.
postajaxurlparams, function() {
                    
loc.find'.spinner' ).removeClass'is-active' );
                });
                return 
false;
            });
        },

        
attachQuickSearchListeners : function() {
            var 
searchTimer;

            $(
'.quick-search').keypress(function(e){
                var 
= $(this);

                if( 
13 == e.which ) {
                    
api.updateQuickSearchResults);
                    return 
false;
                }

                if( 
searchTimer clearTimeout(searchTimer);

                
searchTimer setTimeout(function(){
                    
api.updateQuickSearchResults);
                }, 
400);
            }).
attr('autocomplete','off');
        },

        
updateQuickSearchResults : function(input) {
            var 
panelparams,
            
minSearchLength 2,
            
input.val();

            if( 
q.length minSearchLength ) return;

            
panel input.parents('.tabs-panel');
            
params = {
                
'action''menu-quick-search',
                
'response-format''markup',
                
'menu': $('#menu').val(),
                
'menu-settings-column-nonce': $('#menu-settings-column-nonce').val(),
                
'q'q,
                
'type'input.attr('name')
            };

            $( 
'.spinner'panel ).addClass'is-active' );

            $.
postajaxurlparams, function(menuMarkup) {
                
api.processQuickSearchQueryResponse(menuMarkupparamspanel);
            });
        },

        
addCustomLink : function( processMethod ) {
            var 
url = $('#custom-menu-item-url').val(),
                
label = $('#custom-menu-item-name').val();

            
processMethod processMethod || api.addMenuItemToBottom;

            if ( 
'' === url || 'http://' == url )
                return 
false;

            
// Show the ajax spinner
            
$( '.customlinkdiv .spinner' ).addClass'is-active' );
            
this.addLinkToMenuurllabelprocessMethod, function() {
                
// Remove the ajax spinner
                
$( '.customlinkdiv .spinner' ).removeClass'is-active' );
                
// Set custom link form back to defaults
                
$('#custom-menu-item-name').val('').blur();
                $(
'#custom-menu-item-url').val('http://');
            });
        },

        
addLinkToMenu : function(urllabelprocessMethodcallback) {
            
processMethod processMethod || api.addMenuItemToBottom;
            
callback callback || function(){};

            
api.addItemToMenu({
                
'-1': {
                    
'menu-item-type''custom',
                    
'menu-item-url'url,
                    
'menu-item-title'label
                
}
            }, 
processMethodcallback);
        },

        
addItemToMenu : function(menuItemprocessMethodcallback) {
            var 
menu = $('#menu').val(),
                
nonce = $('#menu-settings-column-nonce').val(),
                
params;

            
processMethod processMethod || function(){};
            
callback callback || function(){};

            
params = {
                
'action''add-menu-item',
                
'menu'menu,
                
'menu-settings-column-nonce'nonce,
                
'menu-item'menuItem
            
};

            $.
postajaxurlparams, function(menuMarkup) {
                var 
ins = $('#menu-instructions');

                
menuMarkup = $.trimmenuMarkup ); // Trim leading whitespaces
                
processMethod(menuMarkupparams);

                
// Make it stand out a bit more visually, by adding a fadeIn
                
$( 'li.pending' ).hide().fadeIn('slow');
                $( 
'.drag-instructions' ).show();
                if( ! 
ins.hasClass'menu-instructions-inactive' ) && ins.siblings().length )
                    
ins.addClass'menu-instructions-inactive' );

                
callback();
            });
        },

        
/**
         * Process the add menu item request response into menu list item.
         *
         * @param string menuMarkup The text server response of menu item markup.
         * @param object req The request arguments.
         */
        
addMenuItemToBottom : function( menuMarkup ) {
            $(
menuMarkup).hideAdvancedMenuItemFields().appendToapi.targetList );
            
api.refreshKeyboardAccessibility();
            
api.refreshAdvancedAccessibility();
        },

        
addMenuItemToTop : function( menuMarkup ) {
            $(
menuMarkup).hideAdvancedMenuItemFields().prependToapi.targetList );
            
api.refreshKeyboardAccessibility();
            
api.refreshAdvancedAccessibility();
        },

        
attachUnsavedChangesListener : function() {
            $(
'#menu-management input, #menu-management select, #menu-management, #menu-management textarea, .menu-location-menus select').change(function(){
                
api.registerChange();
            });

            if ( 
!== $('#menu-to-edit').length || !== $('.menu-location-menus select').length ) {
                
window.onbeforeunload = function(){
                    if ( 
api.menusChanged )
                        return 
navMenuL10n.saveAlert;
                };
            } else {
                
// Make the post boxes read-only, as they can't be used yet
                
$( '#menu-settings-column' ).find'input,select' ).end().find'a' ).attr'href''#' ).unbind'click' );
            }
        },

        
registerChange : function() {
            
api.menusChanged true;
        },

        
attachTabsPanelListeners : function() {
            $(
'#menu-settings-column').bind('click', function(e) {
                var 
selectAreaMatchpanelIdwrapperitems,
                    
target = $(e.target);

                if ( 
target.hasClass('nav-tab-link') ) {

                    
panelId target.data'type' );

                    
wrapper target.parents('.accordion-section-content').first();

                    
// upon changing tabs, we want to uncheck all checkboxes
                    
$('input'wrapper).removeAttr('checked');

                    $(
'.tabs-panel-active'wrapper).removeClass('tabs-panel-active').addClass('tabs-panel-inactive');
                    $(
'#' panelIdwrapper).removeClass('tabs-panel-inactive').addClass('tabs-panel-active');

                    $(
'.tabs'wrapper).removeClass('tabs');
                    
target.parent().addClass('tabs');

                    
// select the search bar
                    
$('.quick-search'wrapper).focus();

                    
e.preventDefault();
                } else if ( 
target.hasClass('select-all') ) {
                    
selectAreaMatch = /#(.*)$/.exec(e.target.href);
                    
if ( selectAreaMatch && selectAreaMatch[1] ) {
                        
items = $('#' selectAreaMatch[1] + ' .tabs-panel-active .menu-item-title input');
                        if( 
items.length === items.filter(':checked').length )
                            
items.removeAttr('checked');
                        else
                            
items.prop('checked'true);
                        return 
false;
                    }
                } else if ( 
target.hasClass('submit-add-to-menu') ) {
                    
api.registerChange();

                    if ( 
e.target.id && 'submit-customlinkdiv' == e.target.id )
                        
api.addCustomLinkapi.addMenuItemToBottom );
                    else if ( 
e.target.id && -!= e.target.id.indexOf('submit-') )
                        $(
'#' e.target.id.replace(/submit-/, '')).addSelectedToMenuapi.addMenuItemToBottom );
                    return 
false;
                } else if ( 
target.hasClass('page-numbers') ) {
                    $.
postajaxurle.target.href.replace(/.*?/, '').replace(/action=([^&]*)/, '') + '&action=menu-get-metabox',
                        function( 
resp ) {
                            if ( -
== resp.indexOf('replace-id') )
                                return;

                            var 
metaBoxData = $.parseJSON(resp),
                            
toReplace document.getElementById(metaBoxData['replace-id']),
                            
placeholder document.createElement('div'),
                            
wrap document.createElement('div');

                            if ( ! 
metaBoxData.markup || ! toReplace )
                                return;

                            
wrap.innerHTML metaBoxData.markup metaBoxData.markup '';

                            
toReplace.parentNode.insertBeforeplaceholdertoReplace );
                            
placeholder.parentNode.removeChildtoReplace );

                            
placeholder.parentNode.insertBeforewrapplaceholder );

                            
placeholder.parentNode.removeChildplaceholder );

                        }
                    );

                    return 
false;
                }
            });
        },

        
eventOnClickEditLink : function(clickedEl) {
            var 
settingsitem,
            
matchedSection = /#(.*)$/.exec(clickedEl.href);
            
if ( matchedSection && matchedSection[1] ) {
                
settings = $('#'+matchedSection[1]);
                
item settings.parent();
                if( 
!== item.length ) {
                    if( 
item.hasClass('menu-item-edit-inactive') ) {
                        if( ! 
settings.data('menu-item-data') ) {
                            
settings.data'menu-item-data'settings.getItemData() );
                        }
                        
settings.slideDown('fast');
                        
item.removeClass('menu-item-edit-inactive')
                            .
addClass('menu-item-edit-active');
                    } else {
                        
settings.slideUp('fast');
                        
item.removeClass('menu-item-edit-active')
                            .
addClass('menu-item-edit-inactive');
                    }
                    return 
false;
                }
            }
        },

        
eventOnClickCancelLink : function(clickedEl) {
            var 
settings = $( clickedEl ).closest'.menu-item-settings' ),
                
thisMenuItem = $( clickedEl ).closest'.menu-item' );
            
thisMenuItem.removeClass('menu-item-edit-active').addClass('menu-item-edit-inactive');
            
settings.setItemDatasettings.data('menu-item-data') ).hide();
            return 
false;
        },

        
eventOnClickMenuSave : function() {
            var 
locs '',
            
menuName = $('#menu-name'),
            
menuNameVal menuName.val();
            
// Cancel and warn if invalid menu name
            
if( !menuNameVal || menuNameVal == menuName.attr('title') || !menuNameVal.replace(/s+/, '') ) {
                
menuName.parent().addClass('form-invalid');
                return 
false;
            }
            
// Copy menu theme locations
            
$('#nav-menu-theme-locations select').each(function() {
                
locs += '<input type="hidden" name="' this.name '" value="' + $(this).val() + '" />';
            });
            $(
'#update-nav-menu').appendlocs );
            
// Update menu item position data
            
api.menuList.find('.menu-item-data-position').val( function(index) { return index 1; } );
            
window.onbeforeunload null;

            return 
true;
        },

        
eventOnClickMenuDelete : function() {
            
// Delete warning AYS
            
if ( window.confirmnavMenuL10n.warnDeleteMenu ) ) {
                
window.onbeforeunload null;
                return 
true;
            }
            return 
false;
        },

        
eventOnClickMenuItemDelete : function(clickedEl) {
            var 
itemID parseInt(clickedEl.id.replace('delete-'''), 10);
            
api.removeMenuItem( $('#menu-item-' itemID) );
            
api.registerChange();
            return 
false;
        },

        
/**
         * Process the quick search response into a search result
         *
         * @param string resp The server response to the query.
         * @param object req The request arguments.
         * @param jQuery panel The tabs panel we're searching in.
         */
        
processQuickSearchQueryResponse : function(respreqpanel) {
            var 
matchednewID,
            
takenIDs = {},
            
form document.getElementById('nav-menu-meta'),
            
pattern = /menu-item[([^]]*/,
            
$items = $('<div>').html(resp).find('li'),
            
$item;

            if( ! 
$items.length ) {
                $(
'.categorychecklist'panel).html'<li><p>' navMenuL10n.noResultsFound '</p></li>' );
                $( 
'.spinner'panel ).removeClass'is-active' );
                return;
            }

            
$items.each(function(){
                
$item = $(this);

                
// make a unique DB ID number
                
matched pattern.exec($item.html());

                if ( 
matched && matched[1] ) {
                    
newID matched[1];
                    while( 
form.elements['menu-item[' newID '][menu-item-type]'] || takenIDsnewID ] ) {
                        
newID--;
                    }

                    
takenIDs[newID] = true;
                    if ( 
newID != matched[1] ) {
                        
$item.html$item.html().replace(new RegExp(
                            
'menu-item\[' matched[1] + '\]''g'),
                            
'menu-item[' newID ']'
                        
) );
                    }
                }
            });

            $(
'.categorychecklist'panel).html$items );
            $( 
'.spinner'panel ).removeClass'is-active' );
        },

        
removeMenuItem : function(el) {
            var 
children el.childMenuItems();

            
el.addClass('deleting').animate({
                    
opacity 0,
                    
height0
                
}, 350, function() {
                    var 
ins = $('#menu-instructions');
                    
el.remove();
                    
children.shiftDepthClass( -).updateParentMenuItemDBId();
                    if ( 
=== $( '#menu-to-edit li' ).length ) {
                        $( 
'.drag-instructions' ).hide();
                        
ins.removeClass'menu-instructions-inactive' );
                    }
                    
api.refreshAdvancedAccessibility();
                });
        },

        
depthToPx : function(depth) {
            return 
depth api.options.menuItemDepthPerLevel;
        },

        
pxToDepth : function(px) {
            return 
Math.floor(px api.options.menuItemDepthPerLevel);
        }

    };

    $(
document).ready(function(){ wpNavMenu.init(); });

})(
jQuery);
?>
Онлайн: 1
Реклама