PluginProbe
QuadMenu – Mega Menu / 1.8.9
QuadMenu – Mega Menu v1.8.9
3.3.8 3.3.7 3.3.6 trunk 1.8.4 1.8.5 1.8.7 1.8.8 1.8.9 1.9.0 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 All 88 releases
quadmenu / assets / backend / js / quadmenu-admin.js

quadmenu-admin.js in QuadMenu – Mega Menu 1.8.9, at assets/backend/js/quadmenu-admin.js

1,720 lines 51.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /* ========================================================================
2 * Bootstrap: modal.js v3.3.7
3 * http://getbootstrap.com/javascript/#modals
4 * ========================================================================
5 * Copyright 2011-2016 Twitter, Inc.
6 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7 * ======================================================================== */
8
9
10 +function ($) {
11 'use strict';
12
13 // MODAL CLASS DEFINITION
14 // ======================
15
16 var QuadMenuModal = function (element, options) {
17 this.options = options
18 this.$body = $(document.body)
19 this.$element = $(element)
20 this.$dialog = this.$element.find('.modal-dialog')
21 this.$backdrop = null
22 this.isShown = null
23 this.originalBodyPad = null
24 this.scrollbarWidth = 0
25 this.ignoreBackdropClick = false
26
27 if (this.options.remote) {
28 this.$element
29 .find('.modal-content')
30 .load(this.options.remote, $.proxy(function () {
31 this.$element.trigger('loaded.quadmenu.modal')
32 }, this))
33 }
34 }
35
36 QuadMenuModal.VERSION = '3.3.7'
37
38 QuadMenuModal.TRANSITION_DURATION = 300
39 QuadMenuModal.BACKDROP_TRANSITION_DURATION = 150
40
41 QuadMenuModal.DEFAULTS = {
42 backdrop: true,
43 keyboard: true,
44 show: true
45 }
46
47 QuadMenuModal.prototype.toggle = function (_relatedTarget) {
48 return this.isShown ? this.hide() : this.show(_relatedTarget)
49 }
50
51 QuadMenuModal.prototype.show = function (_relatedTarget) {
52 var that = this
53 var e = $.Event('show.quadmenu.modal', {relatedTarget: _relatedTarget})
54
55 this.$element.trigger(e)
56
57 if (this.isShown || e.isDefaultPrevented())
58 return
59
60 this.isShown = true
61
62 this.checkScrollbar()
63 this.setScrollbar()
64 this.$body.addClass('modal-open')
65
66 this.escape()
67 this.resize()
68
69 this.$element.on('click.dismiss.quadmenu.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
70
71 this.$dialog.on('mousedown.dismiss.quadmenu.modal', function () {
72 that.$element.one('mouseup.dismiss.quadmenu.modal', function (e) {
73 if ($(e.target).is(that.$element))
74 that.ignoreBackdropClick = true
75 })
76 })
77
78 this.backdrop(function () {
79 var transition = $.support.transition && that.$element.hasClass('fade')
80
81 if (!that.$element.parent().length) {
82 that.$element.appendTo(that.$body) // don't move modals dom position
83 }
84
85 that.$element
86 .show()
87 .scrollTop(0)
88
89 that.adjustDialog()
90
91 if (transition) {
92 that.$element[0].offsetWidth // force reflow
93 }
94
95 that.$element.addClass('in')
96
97 that.enforceFocus()
98
99 var e = $.Event('shown.quadmenu.modal', {relatedTarget: _relatedTarget})
100
101 transition ?
102 that.$dialog // wait for modal to slide in
103 .one('bsTransitionEnd', function () {
104 that.$element.trigger('focus').trigger(e)
105 })
106 .emulateTransitionEnd(QuadMenuModal.TRANSITION_DURATION) :
107 that.$element.trigger('focus').trigger(e)
108 })
109 }
110
111 QuadMenuModal.prototype.hide = function (e) {
112 if (e)
113 e.preventDefault()
114
115 e = $.Event('hide.quadmenu.modal')
116
117 this.$element.trigger(e)
118
119 if (!this.isShown || e.isDefaultPrevented())
120 return
121
122 this.isShown = false
123
124 this.escape()
125 this.resize()
126
127 $(document).off('focusin.quadmenu.modal')
128
129 this.$element
130 .removeClass('in')
131 .off('click.dismiss.quadmenu.modal')
132 .off('mouseup.dismiss.quadmenu.modal')
133
134 this.$dialog.off('mousedown.dismiss.quadmenu.modal')
135
136 $.support.transition && this.$element.hasClass('fade') ?
137 this.$element
138 .one('bsTransitionEnd', $.proxy(this.hideQuadMenuModal, this))
139 .emulateTransitionEnd(QuadMenuModal.TRANSITION_DURATION) :
140 this.hideQuadMenuModal()
141 }
142
143 QuadMenuModal.prototype.enforceFocus = function () {
144 $(document)
145 .off('focusin.quadmenu.modal') // guard against infinite focus loop
146 .on('focusin.quadmenu.modal', $.proxy(function (e) {
147 if (document !== e.target &&
148 this.$element[0] !== e.target &&
149 !this.$element.has(e.target).length) {
150 this.$element.trigger('focus')
151 }
152 }, this))
153 }
154
155 QuadMenuModal.prototype.escape = function () {
156 if (this.isShown && this.options.keyboard) {
157 this.$element.on('keydown.dismiss.quadmenu.modal', $.proxy(function (e) {
158 e.which == 27 && this.hide()
159 }, this))
160 } else if (!this.isShown) {
161 this.$element.off('keydown.dismiss.quadmenu.modal')
162 }
163 }
164
165 QuadMenuModal.prototype.resize = function () {
166 if (this.isShown) {
167 $(window).on('resize.quadmenu.modal', $.proxy(this.handleUpdate, this))
168 } else {
169 $(window).off('resize.quadmenu.modal')
170 }
171 }
172
173 QuadMenuModal.prototype.hideQuadMenuModal = function () {
174 var that = this
175 this.$element.hide()
176 this.backdrop(function () {
177 that.$body.removeClass('modal-open')
178 that.resetAdjustments()
179 that.resetScrollbar()
180 that.$element.trigger('hidden.quadmenu.modal')
181 })
182 }
183
184 QuadMenuModal.prototype.removeBackdrop = function () {
185 this.$backdrop && this.$backdrop.remove()
186 this.$backdrop = null
187 }
188
189 QuadMenuModal.prototype.backdrop = function (callback) {
190 var that = this
191 var animate = this.$element.hasClass('fade') ? 'fade' : ''
192
193 if (this.isShown && this.options.backdrop) {
194 var doAnimate = $.support.transition && animate
195
196 this.$backdrop = $(document.createElement('div'))
197 .addClass('modal-backdrop ' + animate)
198 .appendTo(this.$body)
199
200 this.$element.on('click.dismiss.quadmenu.modal', $.proxy(function (e) {
201 if (this.ignoreBackdropClick) {
202 this.ignoreBackdropClick = false
203 return
204 }
205 if (e.target !== e.currentTarget)
206 return
207 this.options.backdrop == 'static'
208 ? this.$element[0].focus()
209 : this.hide()
210 }, this))
211
212 if (doAnimate)
213 this.$backdrop[0].offsetWidth // force reflow
214
215 this.$backdrop.addClass('in')
216
217 if (!callback)
218 return
219
220 doAnimate ?
221 this.$backdrop
222 .one('bsTransitionEnd', callback)
223 .emulateTransitionEnd(QuadMenuModal.BACKDROP_TRANSITION_DURATION) :
224 callback()
225
226 } else if (!this.isShown && this.$backdrop) {
227 this.$backdrop.removeClass('in')
228
229 var callbackRemove = function () {
230 that.removeBackdrop()
231 callback && callback()
232 }
233 $.support.transition && this.$element.hasClass('fade') ?
234 this.$backdrop
235 .one('bsTransitionEnd', callbackRemove)
236 .emulateTransitionEnd(QuadMenuModal.BACKDROP_TRANSITION_DURATION) :
237 callbackRemove()
238
239 } else if (callback) {
240 callback()
241 }
242 }
243
244 // these following methods are used to handle overflowing modals
245
246 QuadMenuModal.prototype.handleUpdate = function () {
247 this.adjustDialog()
248 }
249
250 QuadMenuModal.prototype.adjustDialog = function () {
251 var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
252
253 this.$element.css({
254 paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
255 paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
256 })
257 }
258
259 QuadMenuModal.prototype.resetAdjustments = function () {
260 this.$element.css({
261 paddingLeft: '',
262 paddingRight: ''
263 })
264 }
265
266 QuadMenuModal.prototype.checkScrollbar = function () {
267 var fullWindowWidth = window.innerWidth
268 if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
269 var documentElementRect = document.documentElement.getBoundingClientRect()
270 fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
271 }
272 this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
273 this.scrollbarWidth = this.measureScrollbar()
274 }
275
276 QuadMenuModal.prototype.setScrollbar = function () {
277 var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
278 this.originalBodyPad = document.body.style.paddingRight || ''
279 if (this.bodyIsOverflowing)
280 this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
281 }
282
283 QuadMenuModal.prototype.resetScrollbar = function () {
284 this.$body.css('padding-right', this.originalBodyPad)
285 }
286
287 QuadMenuModal.prototype.measureScrollbar = function () { // thx walsh
288 var scrollDiv = document.createElement('div')
289 scrollDiv.className = 'modal-scrollbar-measure'
290 this.$body.append(scrollDiv)
291 var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
292 this.$body[0].removeChild(scrollDiv)
293 return scrollbarWidth
294 }
295
296
297 // MODAL PLUGIN DEFINITION
298 // =======================
299
300 function Plugin(option, _relatedTarget) {
301 return this.each(function () {
302 var $this = $(this)
303 var data = $this.data('bs.modal')
304 var options = $.extend({}, QuadMenuModal.DEFAULTS, $this.data(), typeof option == 'object' && option)
305
306 if (!data)
307 $this.data('bs.modal', (data = new QuadMenuModal(this, options)))
308 if (typeof option == 'string')
309 data[option](_relatedTarget)
310 else if (options.show)
311 data.show(_relatedTarget)
312 })
313 }
314
315 var old = $.fn.modal
316
317 $.fn.modal = Plugin
318 $.fn.modal.Constructor = QuadMenuModal
319
320
321 // MODAL NO CONFLICT
322 // =================
323
324 $.fn.modal.noConflict = function () {
325 $.fn.modal = old
326 return this
327 }
328
329
330 // MODAL DATA-API
331 // ==============
332
333 $(document).on('click.quadmenu.modal.data-api', '[data-quadmenu="modal"]', function (e) {
334 var $this = $(this)
335 var href = $this.attr('href')
336 var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
337 var option = $target.data('bs.modal') ? 'toggle' : $.extend({remote: !/#/.test(href) && href}, $target.data(), $this.data())
338
339 if ($this.is('a'))
340 e.preventDefault()
341
342 $target.one('show.quadmenu.modal', function (showEvent) {
343 if (showEvent.isDefaultPrevented())
344 return // only register focus restorer if modal will actually get shown
345 $target.one('hidden.quadmenu.modal', function () {
346 $this.is(':visible') && $this.trigger('focus')
347 })
348 })
349 Plugin.call($target, option, this)
350 })
351
352 }(jQuery);
353
354 /* ========================================================================
355 * Bootstrap: tab.js v3.3.7
356 * http://getbootstrap.com/javascript/#tabs
357 * ========================================================================
358 * Copyright 2011-2016 Twitter, Inc.
359 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
360 * ======================================================================== */
361
362
363 +function ($) {
364 'use strict';
365
366 // TAB CLASS DEFINITION
367 // ====================
368
369 var QuadMenuTab = function (element) {
370 // jscs:disable requireDollarBeforejQueryAssignment
371 this.element = $(element)
372 // jscs:enable requireDollarBeforejQueryAssignment
373 }
374
375 QuadMenuTab.VERSION = '3.3.7'
376
377 QuadMenuTab.TRANSITION_DURATION = 150
378
379 QuadMenuTab.prototype.show = function () {
380 var $this = this.element
381 var $ul = $this.closest('ul:not(.dropdown-menu)')
382 var selector = $this.data('target')
383
384 if (!selector) {
385 selector = $this.attr('href')
386 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
387 }
388
389 if ($this.parent('li').hasClass('active'))
390 return
391
392 var $previous = $ul.find('.active:last a')
393 var hideEvent = $.Event('hide.quadmenu.tab', {
394 relatedTarget: $this[0]
395 })
396 var showEvent = $.Event('show.quadmenu.tab', {
397 relatedTarget: $previous[0]
398 })
399
400 $previous.trigger(hideEvent)
401 $this.trigger(showEvent)
402
403 if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented())
404 return
405
406 var $target = $(selector)
407
408 this.activate($this.closest('li'), $ul)
409 this.activate($target, $target.parent(), function () {
410 $previous.trigger({
411 type: 'hidden.quadmenu.tab',
412 relatedTarget: $this[0]
413 })
414 $this.trigger({
415 type: 'shown.quadmenu.tab',
416 relatedTarget: $previous[0]
417 })
418 })
419 }
420
421 QuadMenuTab.prototype.activate = function (element, container, callback) {
422 var $active = container.find('> .active')
423 var transition = callback
424 && $.support.transition
425 && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length)
426
427 function next() {
428 $active
429 .removeClass('active')
430 .find('> .dropdown-menu > .active')
431 .removeClass('active')
432 .end()
433 .find('[data-quadmenu="tab"]')
434 .attr('aria-expanded', false)
435
436 element
437 .addClass('active')
438 .find('[data-quadmenu="tab"]')
439 .attr('aria-expanded', true)
440
441 if (transition) {
442 element[0].offsetWidth // reflow for transition
443 element.addClass('in')
444 } else {
445 element.removeClass('fade')
446 }
447
448 if (element.parent('.dropdown-menu').length) {
449 element
450 .closest('li.dropdown')
451 .addClass('active')
452 .end()
453 .find('[data-quadmenu="tab"]')
454 .attr('aria-expanded', true)
455 }
456
457 callback && callback()
458 }
459
460 $active.length && transition ?
461 $active
462 .one('bsTransitionEnd', next)
463 .emulateTransitionEnd(QuadMenuTab.TRANSITION_DURATION) :
464 next()
465
466 $active.removeClass('in')
467 }
468
469
470 // TAB PLUGIN DEFINITION
471 // =====================
472
473 function Plugin(option) {
474 return this.each(function () {
475 var $this = $(this)
476 var data = $this.data('bs.tab')
477
478 if (!data)
479 $this.data('bs.tab', (data = new QuadMenuTab(this)))
480 if (typeof option == 'string')
481 data[option]()
482 })
483 }
484
485 var old = $.fn.tab
486
487 $.fn.tab = Plugin
488 $.fn.tab.Constructor = QuadMenuTab
489
490
491 // TAB NO CONFLICT
492 // ===============
493
494 $.fn.tab.noConflict = function () {
495 $.fn.tab = old
496 return this
497 }
498
499
500 // TAB DATA-API
501 // ============
502
503 var clickHandler = function (e) {
504 e.preventDefault()
505 Plugin.call($(this), 'show')
506 }
507
508 $(document)
509 .on('click.quadmenu.tab.data-api', '[data-quadmenu="tab"]', clickHandler)
510 .on('click.quadmenu.tab.data-api', '[data-quadmenu="pill"]', clickHandler)
511
512 }(jQuery);
513
514 /* ========================================================================
515 * Bootstrap: transition.js v3.3.7
516 * http://getbootstrap.com/javascript/#transitions
517 * ========================================================================
518 * Copyright 2011-2016 Twitter, Inc.
519 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
520 * ======================================================================== */
521
522
523 +function ($) {
524 'use strict';
525
526 // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
527 // ============================================================
528
529 function transitionEnd() {
530 var el = document.createElement('bootstrap')
531
532 var transEndEventNames = {
533 WebkitTransition: 'webkitTransitionEnd',
534 MozTransition: 'transitionend',
535 OTransition: 'oTransitionEnd otransitionend',
536 transition: 'transitionend'
537 }
538
539 for (var name in transEndEventNames) {
540 if (el.style[name] !== undefined) {
541 return {end: transEndEventNames[name]}
542 }
543 }
544
545 return false // explicit for ie8 ( ._.)
546 }
547
548 // http://blog.alexmaccaw.com/css-transitions
549 $.fn.emulateTransitionEnd = function (duration) {
550 var called = false
551 var $el = this
552 $(this).one('bsTransitionEnd', function () {
553 called = true
554 })
555 var callback = function () {
556 if (!called)
557 $($el).trigger($.support.transition.end)
558 }
559 setTimeout(callback, duration)
560 return this
561 }
562
563 $(function () {
564 $.support.transition = transitionEnd()
565
566 if (!$.support.transition)
567 return
568
569 $.event.special.bsTransitionEnd = {
570 bindType: $.support.transition.end,
571 delegateType: $.support.transition.end,
572 handle: function (e) {
573 if ($(e.target).is(this))
574 return e.handleObj.handler.apply(this, arguments)
575 }
576 }
577 })
578
579 }(jQuery);
580
581 (function ($) {
582
583 var menuItems = {}, xhr;
584 $.fn.serializeArrayAll = function () {
585 var rCRLF = /\r?\n/g;
586 return this.map(function () {
587 return this.elements ? jQuery.makeArray(this.elements) : this;
588 }).map(function (i, elem) {
589 var val = jQuery(this).val();
590 if (val == null) {
591 return val == null
592 //next 2 lines of code look if it is a checkbox and set the value to blank
593 //if it is unchecked
594 } else if (this.type == "checkbox" && this.checked == false) {
595 return {name: this.name, value: this.checked ? this.value : ''}
596 //next lines are kept from default jQuery implementation and
597 //default to all checkboxes = on
598 } else {
599 return jQuery.isArray(val) ?
600 jQuery.map(val, function (val, i) {
601 return {name: elem.name, value: val.replace(rCRLF, "\r\n")};
602 }) :
603 {name: elem.name, value: val.replace(rCRLF, "\r\n")};
604 }
605 }).get();
606 };
607 $.fn.extend({
608 quadmenuItemData: function (itemType, id) {
609 itemType = itemType || 'menu-item';
610 var itemData = {}, i,
611 fields = [
612 'menu-item-db-id',
613 'menu-item-object-id',
614 'menu-item-object',
615 'menu-item-parent-id',
616 'menu-item-position',
617 'menu-item-type',
618 'menu-item-title',
619 'menu-item-url',
620 'menu-item-description',
621 'menu-item-attr-title',
622 'menu-item-target',
623 'menu-item-classes',
624 'menu-item-xfn',
625 'menu-item-columns',
626 'menu-item-quadmenu',
627 'menu-item-quadmenu-widget',
628 ];
629 if (!id && itemType == 'menu-item') {
630 id = this.find('.menu-item-data-db-id').val();
631 }
632
633 if (!id)
634 return itemData;
635 this.find('input').each(function () {
636 var field;
637 i = fields.length;
638 while (i--) {
639 if (itemType == 'menu-item')
640 field = fields[i] + '[' + id + ']';
641 else if (itemType == 'add-menu-item')
642 field = 'menu-item[' + id + '][' + fields[i] + ']';
643 if (
644 this.name &&
645 field == this.name
646 ) {
647 itemData[fields[i]] = this.value;
648 }
649 }
650 });
651 return itemData;
652 }
653 });
654 var add_submit_events = function (submit) {
655
656 submit.on('click', function (e) {
657 e.preventDefault();
658 var menuItems = {},
659 $parent = submit.closest($(submit.data('menu_item_parent'))),
660 $spinner = $parent.find('.spinner');
661
662 if ($.isArray(submit.data('menu_item_quadmenu'))) {
663
664 $.each(submit.data('menu_item_quadmenu'), function (i, setting) {
665
666 menuItems[i] = {
667 'menu-item-status': 'publish',
668 'menu-item-title': submit.data('menu_item_title').replace(/\%/g, submit.parent().siblings().length),
669 'menu-item-url': submit.data('menu_item_url'),
670 'menu-item-type': submit.data('menu_item_type'),
671 'menu-item-quadmenu': setting['quadmenu'],
672 'menu-item-columns': setting['columns'],
673 'menu-item-parent-id': submit.data('menu_item_parent_id'),
674 };
675
676 });
677
678 } else {
679
680 menuItems[ -1] = {
681 'menu-item-status': 'publish',
682 'menu-item-title': submit.data('menu_item_title').replace(/\%/g, submit.parent().siblings().length),
683 'menu-item-url': submit.data('menu_item_url'),
684 'menu-item-type': submit.data('menu_item_type'),
685 'menu-item-quadmenu': submit.data('menu_item_quadmenu'),
686 'menu-item-parent-id': submit.data('menu_item_parent_id'),
687 };
688 }
689
690 add_nav_menu_item($spinner, $parent, menuItems);
691 });
692 };
693 var add_action_events = function (action) {
694
695 $('.quadmenu-columns').on('click', function (e) {
696 if (!$(e.target).closest('.quadmenu-column.open').length) {
697 $('.quadmenu-column').removeClass('open');
698 }
699 });
700
701 action.on('click', '.edit:first', function (e) {
702 e.preventDefault();
703 e.stopPropagation();
704 action.toggleClass('open');
705 $('.quadmenu-column-item').not(action).removeClass('open');
706 //$('.quadmenu-column').not(action).removeClass('open');
707 });
708
709 action.on('click', '.remove:first', function (e) {
710
711 var $form = $('form', action);
712 $.ajax({
713 type: 'POST',
714 url: ajaxurl,
715 data: $.param($form.serializeArrayAll()) + '&' + $.param({
716 menu_id: $('#menu').val(),
717 menu_item_id: $form.data('menu_item_id'),
718 action: 'quadmenu_delete_nav_menu_item',
719 nonce: quadmenu.nonce}
720 ),
721 beforeSend: function () {
722 action.addClass('saving');
723 },
724 complete: function () {
725 action.removeClass('saving').fadeOut().remove();
726 },
727 success: function (response) {
728
729 console.log(response.data);
730 action.trigger('remove.quadmenu.item', [action]);
731 },
732 });
733 });
734 return action;
735 };
736 var add_width_events = function (item) {
737
738 if (item.hasClass('quadmenu-tab-pane-width')) {
739
740 var width = $('.quadmenu-setting-width', item),
741 float = $('.quadmenu-setting-dropdown', item);
742
743 if ($('#menu-item-stretch').val() !== '') {
744 width.hide();
745 float.hide();
746 }
747
748 item.on('change', '.menu-item-stretch', function (e) {
749
750 if ($(this).val() == '') {
751 width.fadeIn();
752 float.fadeIn();
753 } else {
754 width.fadeOut();
755 float.fadeOut();
756 }
757
758 });
759
760 }
761
762 };
763
764 var add_title_events = function (item) {
765
766 item.on('keyup', '.menu-item-title', function (e) {
767
768 var id = $(this).closest('form').data('menu_item_id'),
769 title = $(this).val(),
770 change = $('#quadmenu-title-' + id + '> span', item).add('#menu-to-edit > #menu-item-' + id + ' > .menu-item-bar > .menu-item-handle > .item-title > .menu-item-title');
771
772 setTimeout(function () {
773 change.text(title);
774 }, 200);
775 });
776 };
777 var add_ajax_settings = function (modal) {
778
779 modal.on('show.quadmenu.tab', 'li', function (e) {
780
781 var $tabs = $(this),
782 $target = $($(e.target).attr('href')),
783 $spinner = $target.find('.spinner').first();
784 if ($target.data('loading') || $target.data('loaded') || !$tabs.data('menu_item_panel'))
785 return;
786 $.ajax({
787 type: 'POST',
788 url: ajaxurl,
789 data: $.param({
790 menu_id: $('#menu').val(),
791 menu_item_id: $tabs.data('menu_item_id'),
792 menu_item_panel: $tabs.data('menu_item_panel'),
793 action: 'quadmenu_add_nav_menu_item_panel',
794 nonce: quadmenu.nonce
795 }),
796 beforeSend: function () {
797 $target.data('loading', true);
798 $spinner.addClass('is-active');
799 },
800 complete: function () {
801 $target.removeData('loading');
802 $spinner.removeClass('is-active');
803 },
804 success: function (response) {
805
806 if (response.success !== true) {
807 alert(response.data);
808 return;
809 }
810
811 var $response = $(response.data);
812 $target.data('loaded', true);
813 $target.append($response);
814 add_modal_events($target);
815 add_icon_events($target);
816 add_width_events($target);
817 add_title_events($target);
818 add_media_events($target);
819 add_background_events($target);
820 add_sortable_events($target);
821 // modal.on(event, '.class', is working and triggered twice)
822 // $('.class', modal).on(event is working
823 },
824 });
825 });
826 }
827
828 var add_media_events = function (modal) {
829
830 var media_uploader = null;
831
832 $('.menu-item-media-upload', modal).on('click', function (e) {
833 e.preventDefault();
834
835 var $upload = $(this);
836
837 var $wrapper = $(this).closest('.field-wrapper'),
838 $preview = $(this).siblings('.edit-menu-item-media-thumbnail'),
839 $background_thumbnail_id = $(this).siblings('.edit-menu-item-media-thumbnail-id');
840
841 if (media_uploader) {
842 media_uploader.open();
843 return;
844 }
845
846 media_uploader = wp.media.frames.media_uploader = wp.media({
847 button: {
848 text: quadmenu.add_background,
849 close: true
850 },
851 library: {
852 type: 'image'
853 },
854 multiple: false // Set to true to allow multiple files to be selected
855 });
856
857 media_uploader.on('open', function () {
858
859 var selection = media_uploader.state().get('selection');
860 var selected = $background_thumbnail_id.val();
861 if (selected) {
862 selection.add(wp.media.attachment(selected));
863 }
864
865 });
866
867 media_uploader.on('select', function () {
868
869 var json = media_uploader.state().get('selection').first().toJSON(),
870 url = typeof json.sizes.thumbnail !== 'undefined' ? json.sizes.full.url : json.url,
871 src = typeof json.sizes.thumbnail !== 'undefined' ? json.sizes.thumbnail.url : json.url;
872
873 $wrapper.addClass('active');
874 $preview.html('<img src="' + src + '" width="50" height="50" >');
875 $background_thumbnail_id.val(json.id).data('src', url).trigger('change');
876
877 $upload.trigger('change');
878 });
879 media_uploader.open();
880 });
881 $('.menu-item-media-clear', modal).on('click', function (e) {
882 e.preventDefault();
883 var $wrapper = $(this).closest('.field-wrapper'),
884 $css = $('.field-background', modal),
885 $preview = $(this).siblings('.edit-menu-item-media-thumbnail'),
886 $background_thumbnail_id = $(this).siblings('.edit-menu-item-media-thumbnail-id');
887
888 $wrapper.removeClass('active');
889 $preview.html('');
890 $background_thumbnail_id.val('').removeData('src').trigger('change');
891
892 $css.removeAttr('style');
893 return false;
894 });
895 };
896 var add_background_events = function (modal) {
897
898 var $background = $('.quadmenu-setting-background .field-background', modal);
899 $('.edit-menu-item-background-opacity', modal).on('change', function (e) {
900 e.preventDefault();
901 $background.css('opacity', $(this).val() / 100);
902 });
903 $('.edit-menu-item-background-origin', modal).on('change', function (e) {
904 e.preventDefault();
905 $background.css('background-origin', $(this).val());
906 });
907 $('.edit-menu-item-background-position', modal).on('change', function (e) {
908 e.preventDefault();
909 $background.css('background-position', $(this).val());
910 });
911 $('.edit-menu-item-background-size', modal).on('change', function (e) {
912 e.preventDefault();
913 $background.css('background-size', $(this).val());
914 });
915 $('.edit-menu-item-background-repeat', modal).on('change', function (e) {
916 e.preventDefault();
917 $background.css('background-repeat', $(this).val());
918 });
919 $('.edit-menu-item-media-thumbnail-id', modal).on('change', function (e) {
920 e.preventDefault();
921 if (!$(this).data('src'))
922 return;
923 $background.css('background-image', 'url(' + $(this).data('src') + ')');
924 });
925 };
926 var add_icon_events = function (item) {
927
928 $('.quadmenu-setting-icon, .quadmenu-setting-login, .quadmenu-setting-logout', item).each(function () {
929
930 var $setting = $(this),
931 $button = $setting.find('.button-icon'),
932 $input = $('.menu-item-icon, .menu-item-login, .menu-item-logout', $setting),
933 $icon = $setting.find('.quadmenu-icons-scroll .icon'),
934 $search = $setting.find('input[type="search"]');
935 $search.on('keyup', function (e) {
936 e.preventDefault();
937 setTimeout(function () {
938 var icon_query = $search.val();
939 if (icon_query !== '') {
940 $icon.css({'display': 'none'});
941 $icon.filter('[class*="' + icon_query + '"]').css({'display': 'block'});
942 } else {
943 $icon.removeAttr('style');
944 }
945 }, 600);
946 });
947 $icon.on('click', function (e) {
948 e.preventDefault();
949 $(this).addClass('selected').siblings().removeClass('selected');
950 var icon_class = $(this).find('i').attr('class');
951 $input.add($search).val(icon_class).trigger('change');
952 $button.find('i').removeClass().addClass(icon_class);
953 });
954 $button.add($search).on('click', function (e) {
955 $search.val('').trigger('keyup');
956 });
957 });
958
959 item.on('change', '.menu-item-icon', function (e) {
960
961 var id = $(this).closest('form').data('menu_item_id'),
962 icon = $(this).val(),
963 change = $('#quadmenu-title-' + id, item);
964 setTimeout(function () {
965 change.find('i').removeClass().addClass(icon);
966 }, 200);
967 });
968
969 };
970 var add_column_events = function (column) {
971
972 column.on('change', '.quadmenu-setting-width', function (e) {
973
974 e.preventDefault();
975 var width = $(this);
976 setTimeout(function () {
977 var options = width.find('option:selected');
978 var cols = $.map(options, function (option) {
979
980 if (option.value)
981 return option.value;
982 });
983 //var regex = /(\s)*(col-.*?)(?=\s)/g;
984 //column[0].className = column[0].className.replace(regex, '');
985
986 column.removeClass(column.data('columns'));
987
988 column.addClass(cols.join(' ')).data('columns', cols.join(' '));
989 }, 400);
990 });
991 column.on('click', '.contract:first', function (e) {
992
993 var current = column.find('select#menu-item-columns-width-sm > option:selected');
994 if (current.prev().length) {
995 current.prev().prop('selected', true).trigger('change');
996 }
997
998 });
999 column.on('click', '.expand:first', function (e) {
1000
1001 var current = column.find('select#menu-item-columns-width-sm > option:selected');
1002 if (current.next().length) {
1003 current.next().prop('selected', true).trigger('change');
1004 }
1005
1006 });
1007 column.on('click', '.add-quadmenu-column-item', function (e) {
1008
1009 var current = $(this);
1010
1011 current.addClass('selected');
1012
1013 $('.quadmenu-column-item').not($('.quadmenu-column-item', $(this))).removeClass('open');
1014
1015 $('.add-quadmenu-column-item').not(this).removeClass('selected');
1016
1017 $('#menu-settings-column li').each(function () {
1018
1019 var clone = $(this).find('.submit-add-to-quadmenu-column-inside'),
1020 button = $(this).find('.submit-add-to-menu, .submit-add-to-quadmenu');
1021
1022 $('#quadmenu_custom_nav_widgets').addClass('active');
1023
1024 if (!clone.length) {
1025 var clone = button.clone();
1026 clone.val(quadmenu.add_to_column);
1027 clone.removeClass('submit-add-to-menu submit-add-to-quadmenu button-secondary').addClass('submit-add-to-quadmenu-column-inside button-primary');
1028 button.before(clone);
1029 }
1030
1031 clone.data('menu_item_parent_id', current.data('menu_item_parent_id'));
1032
1033 });
1034
1035 $('#menu-settings-column li').addClass('current-column').find('li input:checked').prop('checked', false);
1036 });
1037 return column;
1038 };
1039 var add_widget_events = function (widget) {
1040
1041 widget.on('change.quadmenu.settings', 'form', function (e) {
1042 e.preventDefault();
1043 e.stopPropagation();
1044
1045 return false;
1046 });
1047
1048 widget.on('submit', 'form', function (e) {
1049 e.preventDefault();
1050 e.stopPropagation();
1051 var $form = $(this);
1052
1053 $.ajax({
1054 // Should be POST to save widget settings
1055 type: 'POST',
1056 url: ajaxurl,
1057 data: $.param($form.serializeArrayAll()) + '&' + $.param({
1058 action: 'quadmenu_save_widget',
1059 menu_id: $('#menu').val(),
1060 menu_item_id: $form.data('menu_item_id'),
1061 nonce: quadmenu.nonce}
1062 ),
1063 beforeSend: function () {
1064 widget.addClass('saving');
1065 },
1066 complete: function () {
1067 widget.removeClass('saving');
1068 },
1069 success: function (response) {
1070
1071 wpNavMenu.menusChanged = false;
1072 console.log(response.data);
1073 },
1074 });
1075 });
1076 widget.on('click', '.edit:first', function (e) {
1077
1078 var $widget = widget.find('.widget'),
1079 $form = widget.find('form');
1080
1081 if (!$widget.hasClass('open') && !$widget.data('loaded')) {
1082
1083 $.ajax({
1084 type: 'POST',
1085 url: ajaxurl,
1086 data: $.param({
1087 menu_id: $('#menu').val(),
1088 menu_item_id: $form.data('menu_item_id'),
1089 widget: widget.data('widget'),
1090 widget_id: widget.data('widget_id'),
1091 action: 'quadmenu_form_widget',
1092 nonce: quadmenu.nonce
1093 }),
1094 beforeSend: function () {
1095 widget.addClass('saving');
1096 },
1097 complete: function () {
1098 widget.removeClass('saving');
1099 },
1100 success: function (response) {
1101
1102 if (response.success !== true) {
1103 alert(response.data);
1104 return;
1105 }
1106
1107 var $response = $(response.data);
1108 $form.html($response);
1109 $widget.toggleClass('open').data('loaded', true);
1110 setTimeout(function () {
1111 $(document).trigger('widget-added', [$widget]);
1112 }, 200);
1113 },
1114 });
1115
1116 }
1117 });
1118 };
1119 var add_sortable_events = function (modal) {
1120
1121 $('.sortable-area', modal).each(function () {
1122
1123 var $sortable = $(this);
1124 $sortable.sortable({
1125 forcePlaceholderSize: true,
1126 items: $sortable.data('sortable-items') || false,
1127 handle: $sortable.data('sortable-handle') || false,
1128 connectWith: $sortable.data('sortable-connect') || false,
1129 placeholder: $sortable.data('drop-area') || 'drop-area',
1130 over: function (event, ui) {
1131 $(this).closest('.quadmenu-column').addClass('hover');
1132 },
1133 out: function (event, ui) {
1134 $(this).closest('.quadmenu-column').removeClass('hover');
1135 },
1136 update: function (event, ui) {
1137
1138 if (this === ui.item.parent()[0]) {
1139
1140 if (ui.sender == null) {
1141
1142 var c = $(this),
1143 t = $(ui.item);
1144 $($sortable.data('sortable-items'), c).each(function (i, el) {
1145 menuItems[$(this).data('menu_item_id')] = {
1146 'menu-item-position': i,
1147 'menu-item-parent-id': c.data('menu_item_parent_id')
1148 };
1149 });
1150 $.ajax({
1151 type: 'POST',
1152 url: ajaxurl,
1153 data: {
1154 action: 'quadmenu_update_nav_menu_item',
1155 nonce: quadmenu.nonce,
1156 menu_id: $('#menu').val(),
1157 'menu-item': menuItems
1158 },
1159 beforeSend: function () {
1160 t.addClass('saving');
1161 },
1162 complete: function () {
1163 t.removeClass('saving');
1164 },
1165 success: function (response) {
1166 console.log(response.data);
1167 }
1168 });
1169 }
1170 }
1171 },
1172 receive: function (event, ui) {
1173
1174 var c = $(this),
1175 t = $(ui.item);
1176 c.find('> li').each(function (i, el) {
1177 menuItems[$(this).data('menu_item_id')] = {
1178 'menu-item-position': i,
1179 'menu-item-parent-id': c.data('menu_item_parent_id')
1180 };
1181 });
1182 $.ajax({
1183 type: 'POST',
1184 url: ajaxurl,
1185 data: {
1186 action: 'quadmenu_update_nav_menu_item',
1187 nonce: quadmenu.nonce,
1188 menu_id: $('#menu').val(),
1189 'menu-item': menuItems
1190 },
1191 beforeSend: function () {
1192 t.addClass('saving');
1193 },
1194 success: function (response) {
1195 t.removeClass('saving');
1196 }
1197 });
1198 },
1199 start: function (event, ui) {
1200 ui.item.data('start_pos', ui.item.index());
1201 ui.placeholder.css({'height': ui.item.outerHeight() + 'px', 'width': ui.item.width() + 'px'});
1202 },
1203 stop: function (event, ui) {
1204 // clean up
1205 ui.item.removeAttr('style');
1206 var start_pos = ui.item.data('start_pos');
1207 if (start_pos !== ui.item.index()) {
1208 //$columns.trigger('reorder_columns');
1209 }
1210 }
1211 });
1212 });
1213 }
1214
1215 var add_save_events = function (panel) {
1216
1217 var $modal = $('#quadmenu-settings');
1218
1219 panel.on('change.quadmenu.settings', 'form', function (e) {
1220 e.preventDefault();
1221 var $form = $(this);
1222 $.ajax({
1223 type: 'POST',
1224 url: ajaxurl,
1225 data: $.param($form.serializeArrayAll()) + '&' + $.param({
1226 menu_id: $('#menu').val(),
1227 menu_item_id: $form.data('menu_item_id'),
1228 action: 'quadmenu_save_nav_menu_item_settings',
1229 nonce: quadmenu.nonce}
1230 ),
1231 beforeSend: function () {
1232 $modal.addClass('saving');
1233 },
1234 complete: function () {
1235 $modal.removeClass('saving');
1236 },
1237 success: function (response) {
1238 console.log(response.data);
1239
1240 wpNavMenu.menusChanged = false;
1241
1242 $form.trigger('save.quadmenu.settings', [$form.data('menu_item_id'), $form.serializeArrayAll()]);
1243 }
1244 });
1245 });
1246 };
1247
1248 var add_modal_events = function (modal) {
1249
1250 var $tabs = $('.quadmenu-tabs', modal),
1251 $columns = $('.quadmenu-columns', modal);
1252
1253 $('.quadmenu-tab, .quadmenu-panel', $tabs).each(function (i, tab) {
1254 add_action_events($(tab));
1255 });
1256 $('.quadmenu-column', $columns).each(function (i, column) {
1257 add_action_events($(column));
1258 add_column_events($(column));
1259 });
1260 $('.quadmenu-column-item', $columns).each(function (i, item) {
1261 add_action_events($(item));
1262 });
1263 $('.quadmenu-widget', $columns).each(function (i, widget) {
1264 add_widget_events($(widget));
1265 });
1266 $('.submit-add-to-quadmenu-column, .submit-add-to-quadmenu-tab, .submit-add-to-quadmenu-panel', modal).each(function (i, add) {
1267 add_submit_events($(add));
1268 });
1269 };
1270 var add_nav_menu_item = function (spinner, div, menuItems) {
1271
1272 var $spinner = $(spinner),
1273 $div = $(div);
1274
1275 if (!$div.length)
1276 return false;
1277
1278 $.ajax({
1279 type: 'POST',
1280 url: ajaxurl,
1281 data: {
1282 action: 'quadmenu_add_nav_menu_item',
1283 nonce: quadmenu.nonce,
1284 //menu_item_depth: $div.data('menu_item_depth') || 0,
1285 menu_id: $('#menu').val(),
1286 'menu-item': menuItems
1287 },
1288 beforeSend: function () {
1289 $spinner.addClass('is-active');
1290 },
1291 complete: function () {
1292 $spinner.removeClass('is-active');
1293 },
1294 success: function (response) {
1295
1296 if (response.success !== true) {
1297 //console.log(response.data);
1298 alert(response.data);
1299 return;
1300 }
1301
1302 var $response = $('<ul>' + response.data + '</ul>');
1303 $('.quadmenu-tab, .quadmenu-panel, .quadmenu-column, .quadmenu-column-item', $response).each(function () {
1304 add_action_events($(this));
1305 add_icon_events($(this));
1306 add_sortable_events($(this));
1307 if ($(this).hasClass('quadmenu-widget')) {
1308 add_widget_events($(this));
1309 }
1310 if ($(this).hasClass('quadmenu-column')) {
1311 add_column_events($(this));
1312 }
1313 //add_save_events($(this));
1314 });
1315 $('.submit-add-to-quadmenu-column, .submit-add-to-quadmenu-tab, .submit-add-to-quadmenu-panel', $response).each(function () {
1316 add_submit_events($(this));
1317 });
1318 $div.append($response.contents()).trigger('add.quadmenu.item', [$div]);
1319 },
1320 });
1321 };
1322 // Submit
1323 // -------------------------------------------------------------------------
1324
1325 $(document).on('click.quadmenu.submit', '.submit-add-to-quadmenu, .submit-add-to-quadmenu-column-inside', function (e) {
1326 e.preventDefault();
1327
1328 var t = $(this),
1329 menuItems = {},
1330 $panel = $('#' + e.target.id.replace(/submit-/, '')),
1331 $spinner = t.parent().find('.spinner'),
1332 $checked = $panel.find('.tabs-panel-active .categorychecklist li input:checked');
1333
1334 var menu_item_parent_id = t.data('menu_item_parent_id') || false,
1335 $div = menu_item_parent_id ? $('#quadmenu-column-items-' + menu_item_parent_id) : $('#menu-to-edit');
1336
1337 if (!$div.length)
1338 return false;
1339
1340 if (e.target.id && 'submit-customlinkdiv' == e.target.id) {
1341
1342 var url = $('#custom-menu-item-url').val(),
1343 label = $('#custom-menu-item-name').val();
1344 if ('' === url || 'http://' == url) {
1345 $('#customlinkdiv').addClass('form-invalid');
1346 return false;
1347 }
1348
1349 menuItems[ -1] = {
1350 'menu-item-status': 'publish',
1351 'menu-item-type': 'custom',
1352 'menu-item-url': url,
1353 'menu-item-title': label,
1354 'menu-item-parent-id': menu_item_parent_id,
1355 }
1356
1357
1358 } else if (e.target.id && -1 != e.target.id.indexOf('submit-') && $checked.length) {
1359
1360 $checked.each(function () {
1361 var t = $(this),
1362 re = /menu-item\[([^\]]*)/,
1363 listItemDBIDMatch = re.exec(t.attr('name')),
1364 listItemDBID = 'undefined' == typeof listItemDBIDMatch[1] ? 0 : parseInt(listItemDBIDMatch[1], 10);
1365 menuItems[listItemDBID] = t.closest('li').quadmenuItemData('add-menu-item', listItemDBID);
1366 menuItems[listItemDBID]['menu-item-status'] = 'publish';
1367 menuItems[listItemDBID]['menu-item-parent-id'] = menu_item_parent_id;
1368 });
1369 } else {
1370 return false;
1371 }
1372
1373 add_nav_menu_item($spinner, $div, menuItems);
1374 });
1375 // Custom Events
1376 // -------------------------------------------------------------------------
1377
1378 $(document).on('click', function (e) {
1379
1380 if (!$(e.target).is('.add-quadmenu-column-item') && !$(e.target).is('.submit-add-to-quadmenu-column-inside') && !$(e.target).closest('#menu-settings-column').length) {
1381 $('.add-quadmenu-column-item').removeClass('selected');
1382 $('#menu-settings-column li').removeClass('current-column');
1383 $('#quadmenu_custom_nav_widgets').removeClass('active').removeClass('open');
1384 }
1385 });
1386 $(document).on('click.quadmenu.dropdown', '.dropdown', function (e) {
1387
1388 $(this).addClass('open');
1389 $('.dropdown').not($(this)).removeClass('open');
1390 });
1391 $(document).on('shown.quadmenu.modal', '#modal_icons', function (e) {
1392
1393 add_icon_events($(this));
1394 var $modal = $(this),
1395 $save = $modal.find('.save'),
1396 $item = $(e.relatedTarget);
1397
1398 $modal.data('target', $item.attr('id'));
1399
1400 $save.on('click', function (e) {
1401 e.preventDefault();
1402 var icon = $('.menu-item-icon', $modal).val();
1403
1404 if (!$modal.data('target'))
1405 return;
1406 var $target = $('input#' + $modal.data('target')),
1407 $replace = $target.closest('.redux-field'),
1408 $h3 = $replace.find('h3'),
1409 $i = $h3.find('i');
1410
1411 $target.val(icon);
1412
1413 if ($i.length) {
1414 $i.remove();
1415 }
1416
1417 $h3.prepend('<i class="' + icon + '"></i>');
1418
1419 $modal.modal('hide');
1420 });
1421 });
1422 $(document).on('add.quadmenu.item', function (e, current) {
1423 current.find('.open').not(':last').removeClass('open');
1424 });
1425 $(document).on('remove.quadmenu.item', function (e, current) {
1426
1427 e.preventDefault();
1428 e.stopPropagation();
1429
1430 if (!current.hasClass('quadmenu-panel') && !current.hasClass('quadmenu-tab'))
1431 return;
1432
1433 var tab = current.closest('.dropdown'),
1434 ul = current.closest('.quadmenu-tabs');
1435
1436 if (!tab.length)
1437 return;
1438
1439 tab.fadeOut().remove();
1440
1441 setTimeout(function () {
1442 ul.find('.dropdown').removeClass('open').first().addClass('open');
1443 }, 200);
1444 });
1445 // Settings
1446 // -------------------------------------------------------------------------
1447
1448 $(document).on('mouseenter mouseleave', '#menu-to-edit > li.menu-item', function (e) {
1449
1450 var $li = $(this);
1451
1452 if ($li.hasClass('menu-item-quadmenu'))
1453 return;
1454
1455 if ($li.hasClass('menu-item-invalid'))
1456 return;
1457
1458 $li.addClass('menu-item-quadmenu menu-item-' + $('input.menu-item-data-object', $li).val());
1459
1460 var button = $('<span>').addClass('quadmenu_open').html(quadmenu.add_name),
1461 spinner = $('<span>').addClass('spinner');
1462
1463 $('.item-title', $li).append(button).append(spinner);
1464 });
1465
1466 $(document).on('save.quadmenu.settings', '.quadmenu-tab-pane-default', function (e, id, fields) {
1467 $(fields).each(function (i, field) {
1468 $('#edit-' + field.name + '-' + id).val(field.value).trigger('change');
1469 });
1470 });
1471 $(document).on('click.quadmenu.close', '.quadmenu_close', function (e) {
1472
1473 var $menu = $('#menu-management'),
1474 $settings = $('#quadmenu-settings');
1475 $settings.remove();
1476 $menu.removeClass('open');
1477 });
1478 $(document).on('click.quadmenu.open', '.quadmenu_open', function (e) {
1479 e.preventDefault();
1480 var $li = $(this).closest('li'),
1481 $spinner = $(this).parent().find('.spinner'),
1482 menu_item_id = $li.find('.menu-item-settings input.menu-item-data-db-id').val(),
1483 menu_item_depth = parseInt($li.prop('class').match(/menu-item-depth-([0-9]+)/)[1]);
1484 var $menu = $('#menu-management'),
1485 $modal = $('#post-body', $menu);
1486 if (xhr && xhr.readyState != 4)
1487 xhr.abort();
1488 if ($li.data('openning'))
1489 return false;
1490 xhr = $.ajax({
1491 type: 'POST',
1492 url: ajaxurl,
1493 data: {
1494 menu_id: $('#menu').val(),
1495 menu_item_id: menu_item_id,
1496 menu_item_depth: menu_item_depth,
1497 action: 'quadmenu_add_nav_menu_item_settings',
1498 nonce: quadmenu.nonce,
1499 },
1500 beforeSend: function () {
1501 $spinner.addClass('is-active');
1502 $li.addClass('opening').data('openning', true);
1503 },
1504 complete: function () {
1505 $spinner.removeClass('is-active');
1506 $li.removeClass('openning').removeData('openning');
1507
1508 if (wp.textWidgets !== undefined) {
1509 wp.textWidgets.widgetControls = {};
1510 }
1511
1512 if (wp.mediaWidgets !== undefined) {
1513 wp.mediaWidgets.widgetControls = {};
1514 }
1515
1516 if (wp.customHtmlWidgets !== undefined) {
1517 wp.customHtmlWidgets.widgetControls = {};
1518 }
1519
1520 },
1521 success: function (response) {
1522
1523 if (response.success !== true) {
1524 console.log(response);
1525 return;
1526 }
1527
1528 $menu.addClass('open');
1529 $modal.prepend(response.data);
1530 add_ajax_settings($modal);
1531 add_save_events($modal);
1532 add_modal_events($modal);
1533 add_icon_events($modal);
1534 add_width_events($modal);
1535 add_title_events($modal);
1536 add_media_events($modal);
1537 add_background_events($modal);
1538 add_sortable_events($modal);
1539 // modal.on(event, '.class', is working and triggered twice)
1540 // $('.class', modal).on(event not working
1541 $('html,body').animate({scrollTop: $('#nav-menu-header').offset().top}, 'slow');
1542 }
1543 });
1544 });
1545
1546 // Customizer
1547 /* -------------------------------------------------------------------------
1548
1549 $(document).on('click.quadmenu.open', '.quadmenu_modal', function (e) {
1550 e.preventDefault();
1551
1552 var $li = $(this).closest('li'),
1553 $spinner = $(this).parent().find('.spinner'),
1554 menu_item_id = $li.find('.menu-item-settings input.menu-item-data-db-id').val(),
1555 menu_item_depth = parseInt($li.prop('class').match(/menu-item-depth-([0-9]+)/)[1]);
1556
1557 var $modal = $('#quadmenu_modal .modal-body');
1558
1559 if (xhr && xhr.readyState != 4)
1560 xhr.abort();
1561
1562 if ($li.data('openning'))
1563 return false;
1564
1565 xhr = $.ajax({
1566 type: 'POST',
1567 url: ajaxurl,
1568 data: {
1569 menu_id: $('#menu').val(),
1570 menu_item_id: menu_item_id,
1571 menu_item_depth: menu_item_depth,
1572 action: 'quadmenu_add_nav_menu_item_settings',
1573 nonce: quadmenu.nonce,
1574 },
1575 beforeSend: function () {
1576 $spinner.addClass('is-active');
1577 $li.addClass('opening').data('openning', true);
1578 },
1579 complete: function () {
1580 $spinner.removeClass('is-active');
1581 $li.removeClass('openning').removeData('openning');
1582 },
1583 success: function (response) {
1584
1585 if (response.success !== true) {
1586 console.log(response);
1587 return;
1588 }
1589
1590 $modal.prepend(response.data);
1591 $modal.modal('show');
1592 add_ajax_settings($modal);
1593 add_save_events($modal);
1594 add_modal_events($modal);
1595 add_icon_events($modal);
1596 add_width_events($modal);
1597 add_title_events($modal);
1598 add_media_events($modal);
1599 add_background_events($modal);
1600 add_sortable_events($modal);
1601 }
1602 });
1603 });*/
1604
1605 // Themes
1606 // -------------------------------------------------------------------------
1607
1608 //$(document).on('change', '#quadmenu_nav_menu_themes input.menu-item-checkbox', function (e) {
1609 /*$(document).on('change', '#quadmenu_nav_menu_themes', function (e) {
1610 e.preventDefault();
1611
1612 var $current = $(this);
1613
1614 $.ajax({
1615 type: 'POST',
1616 url: ajaxurl,
1617 data: $.param($("[name^='quadmenu_themes']:checked").serializeArrayAll()) + '&' + $.param({
1618 menu_id: $('#menu').val(),
1619 action: 'quadmenu_change_nav_menu_theme',
1620 nonce: quadmenu.nonce
1621 }),
1622 beforeSend: function () {
1623 },
1624 complete: function () {
1625 },
1626 success: function (response) {
1627
1628 if (response.success !== true) {
1629 alert(response.data);
1630 return;
1631 }
1632 }
1633 });
1634
1635 });*/
1636
1637 $(document).on('click', 'ul.redux-group-menu > li', function (e) {
1638 e.preventDefault();
1639
1640 var $current = $(this);
1641
1642 if (!$current.hasClass('active'))
1643 return;
1644
1645 var current_class = $current.attr('class').match(/quadmenu_theme_[\w-]*\b/);
1646
1647 if (current_class) {
1648
1649 var current_theme = current_class.toString().replace('quadmenu_theme_', '');
1650
1651 $('#quadmenu_duplicate_theme').data('theme', current_theme).fadeIn();
1652
1653 $('#quadmenu_delete_theme').data('theme', current_theme).fadeIn();
1654
1655 return;
1656 }
1657
1658 $('#quadmenu_duplicate_theme').fadeOut();
1659
1660 $('#quadmenu_delete_theme').fadeOut();
1661
1662 });
1663
1664 $(document).on('click', '#quadmenu_add_theme ,#quadmenu_delete_theme', function (e) {
1665 e.preventDefault();
1666
1667 var $this = $(this),
1668 $spinner = $(this).parent().parent().find('.spinner'),
1669 current_theme = $this.data('theme');
1670
1671 $.ajax({
1672 type: 'POST',
1673 url: ajaxurl,
1674 data: {
1675 action: $this.attr('id'),
1676 nonce: quadmenu.nonce,
1677 current_theme: current_theme,
1678 },
1679 beforeSend: function () {
1680 $spinner.addClass('is-active');
1681 },
1682 complete: function () {
1683 $spinner.removeClass('is-active');
1684 },
1685 success: function (response) {
1686
1687 if (response.success !== true) {
1688 alert(response.data);
1689 return;
1690 }
1691
1692 window.location.href = response.data;
1693 }
1694 });
1695 });
1696
1697 // Redux
1698 // -------------------------------------------------------------------------
1699 $(window).on('load', function (e) {
1700
1701 if ($('#last_tab').val() !== '') {
1702 $('ul.redux-group-menu > li.' + $('#last_tab').val() + ' > a').click();
1703 return;
1704 }
1705
1706 $('li.redux-group-tab-link-li.empty_section').remove();
1707
1708 $('.current_theme select').on('change rightnow', function (e) {
1709
1710 var $replace = $(this).closest('.redux-group-tab').find('span.current_theme');
1711
1712 $replace.empty().append($(this).val());
1713
1714 }).triggerHandler('rightnow');
1715
1716 });
1717
1718 $('.redux-container-border .redux-color-init .redux-color').data('alpha', true);
1719
1720 })(jQuery);