PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 3.2.1
Adminify – White Label, Admin Menu Editor, Login Customizer v3.2.1
4.3.1 4.3.0 4.2.26 4.2.25 4.2.24 4.2.23 4.2.22 4.2.21 4.2.20 4.2.19 4.2.18 4.2.17 4.2.16 4.2.15 4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 4.1.17 All 164 releases
adminify / Libs / adminify-framework / assets / js / main.js

main.js in Adminify – White Label, Admin Menu Editor, Login Customizer 3.2.1, at Libs/adminify-framework/assets/js/main.js

3,488 lines 100.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /**
2 *
3 * -----------------------------------------------------------
4 *
5 * Adminify Framework
6 * A Simple and Lightweight WordPress Option Framework
7 *
8 * -----------------------------------------------------------
9 *
10 */
11 ;(function( $, window, document, undefined ) {
12 'use strict';
13
14 //
15 // Constants
16 //
17 var ADMINIFY = ADMINIFY || {};
18
19 ADMINIFY.funcs = {};
20
21 ADMINIFY.vars = {
22 onloaded: false,
23 $body: $('body'),
24 $window: $(window),
25 $document: $(document),
26 $form_warning: null,
27 is_confirm: false,
28 form_modified: false,
29 code_themes: [],
30 is_rtl: $('body').hasClass('rtl'),
31 };
32
33 //
34 // Helper Functions
35 //
36 ADMINIFY.helper = {
37
38 //
39 // Generate UID
40 //
41 uid: function( prefix ) {
42 return ( prefix || '' ) + Math.random().toString(36).substr(2, 9);
43 },
44
45 // Quote regular expression characters
46 //
47 preg_quote: function( str ) {
48 return (str+'').replace(/(\[|\])/g, "\\$1");
49 },
50
51 //
52 // Reneme input names
53 //
54 name_nested_replace: function( $selector, field_id ) {
55
56 var checks = [];
57 var regex = new RegExp(ADMINIFY.helper.preg_quote(field_id +'[\\d+]'), 'g');
58
59 $selector.find(':radio').each(function() {
60 if ( this.checked || this.orginal_checked ) {
61 this.orginal_checked = true;
62 }
63 });
64
65 $selector.each( function( index ) {
66 $(this).find(':input').each(function() {
67 this.name = this.name.replace(regex, field_id +'['+ index +']');
68 if ( this.orginal_checked ) {
69 this.checked = true;
70 }
71 });
72 });
73
74 },
75
76 //
77 // Debounce
78 //
79 debounce: function( callback, threshold, immediate ) {
80 var timeout;
81 return function() {
82 var context = this, args = arguments;
83 var later = function() {
84 timeout = null;
85 if ( !immediate ) {
86 callback.apply(context, args);
87 }
88 };
89 var callNow = ( immediate && !timeout );
90 clearTimeout( timeout );
91 timeout = setTimeout( later, threshold );
92 if ( callNow ) {
93 callback.apply(context, args);
94 }
95 };
96 },
97
98 };
99
100 //
101 // Custom clone for textarea and select clone() bug
102 //
103 $.fn.adminify_clone = function() {
104
105 var base = $.fn.clone.apply(this, arguments),
106 clone = this.find('select').add(this.filter('select')),
107 cloned = base.find('select').add(base.filter('select'));
108
109 for( var i = 0; i < clone.length; ++i ) {
110 for( var j = 0; j < clone[i].options.length; ++j ) {
111
112 if ( clone[i].options[j].selected === true ) {
113 cloned[i].options[j].selected = true;
114 }
115
116 }
117 }
118
119 this.find(':radio').each( function() {
120 this.orginal_checked = this.checked;
121 });
122
123 return base;
124
125 };
126
127 //
128 // Expand All Options
129 //
130 $.fn.adminify_expand_all = function() {
131 return this.each( function() {
132 $(this).on('click', function( e ) {
133
134 e.preventDefault();
135 $('.adminify-wrapper').toggleClass('adminify-show-all');
136 $('.adminify-section').adminify_reload_script();
137 $(this).find('.fa').toggleClass('fa-indent').toggleClass('fa-outdent');
138
139 });
140 });
141 };
142
143 //
144 // Options Navigation
145 //
146 $.fn.adminify_nav_options = function() {
147 return this.each( function() {
148
149 var $nav = $(this),
150 $window = $(window),
151 $wpwrap = $('#wpwrap'),
152 $links = $nav.find('a'),
153 $last;
154
155 $window.on('hashchange adminify.hashchange', function() {
156
157 var hash = window.location.hash.replace('#tab=', '');
158 var slug = hash ? hash : $links.first().attr('href').replace('#tab=', '');
159 var $link = $('[data-tab-id="'+slug+'"]');
160
161 if ( $link.length ) {
162
163 $link.closest('.adminify-tab-item').addClass('adminify-tab-expanded').siblings().removeClass('adminify-tab-expanded');
164
165 if( $link.next().is('ul') ) {
166
167 $link = $link.next().find('li').first().find('a');
168 slug = $link.data('tab-id');
169
170 }
171
172 $links.removeClass('adminify-active');
173 $link.addClass('adminify-active');
174
175 if ( $last ) {
176 $last.addClass('hidden');
177 }
178
179 var $section = $('[data-section-id="'+slug+'"]');
180
181 $section.removeClass('hidden');
182 $section.adminify_reload_script();
183
184 $('.adminify-section-id').val( $section.index()+1 );
185
186 $last = $section;
187
188 if ( $wpwrap.hasClass('wp-responsive-open') ) {
189 $('html, body').animate({scrollTop:($section.offset().top-50)}, 200);
190 $wpwrap.removeClass('wp-responsive-open');
191 }
192
193 }
194
195 }).trigger('adminify.hashchange');
196
197 });
198 };
199
200 //
201 // Metabox Tabs
202 //
203 $.fn.adminify_nav_metabox = function() {
204 return this.each( function() {
205
206 var $nav = $(this),
207 $links = $nav.find('a'),
208 $sections = $nav.parent().find('.adminify-section'),
209 $last;
210
211 $links.each( function( index ) {
212
213 $(this).on('click', function( e ) {
214
215 e.preventDefault();
216
217 var $link = $(this);
218
219 $links.removeClass('adminify-active');
220 $link.addClass('adminify-active');
221
222 if ( $last !== undefined ) {
223 $last.addClass('hidden');
224 }
225
226 var $section = $sections.eq(index);
227
228 $section.removeClass('hidden');
229 $section.adminify_reload_script();
230
231 $last = $section;
232
233 });
234
235 });
236
237 $links.first().trigger('click');
238
239 });
240 };
241
242 //
243 // Metabox Page Templates Listener
244 //
245 $.fn.adminify_page_templates = function() {
246 if ( this.length ) {
247
248 $(document).on('change', '.editor-page-attributes__template select, #page_template', function() {
249
250 var maybe_value = $(this).val() || 'default';
251
252 $('.adminify-page-templates').removeClass('adminify-metabox-show').addClass('adminify-metabox-hide');
253 $('.adminify-page-'+maybe_value.toLowerCase().replace(/[^a-zA-Z0-9]+/g,'-')).removeClass('adminify-metabox-hide').addClass('adminify-metabox-show');
254
255 });
256
257 }
258 };
259
260 //
261 // Metabox Post Formats Listener
262 //
263 $.fn.adminify_post_formats = function() {
264 if ( this.length ) {
265
266 $(document).on('change', '.editor-post-format select, #formatdiv input[name="post_format"]', function() {
267
268 var maybe_value = $(this).val() || 'default';
269
270 // Fallback for classic editor version
271 maybe_value = ( maybe_value === '0' ) ? 'default' : maybe_value;
272
273 $('.adminify-post-formats').removeClass('adminify-metabox-show').addClass('adminify-metabox-hide');
274 $('.adminify-post-format-'+maybe_value).removeClass('adminify-metabox-hide').addClass('adminify-metabox-show');
275
276 });
277
278 }
279 };
280
281 //
282 // Search
283 //
284 $.fn.adminify_search = function() {
285 return this.each( function() {
286
287 var $this = $(this),
288 $input = $this.find('input');
289
290 $input.on('change keyup', function() {
291
292 var value = $(this).val(),
293 $wrapper = $('.adminify-wrapper'),
294 $section = $wrapper.find('.adminify-section'),
295 $fields = $section.find('> .adminify-field:not(.adminify-depend-on)'),
296 $titles = $fields.find('> .adminify-title, .adminify-search-tags');
297
298 if ( value.length > 3 ) {
299
300 $fields.addClass('adminify-metabox-hide');
301 $wrapper.addClass('adminify-search-all');
302
303 $titles.each( function() {
304
305 var $title = $(this);
306
307 if ( $title.text().match( new RegExp('.*?' + value + '.*?', 'i') ) ) {
308
309 var $field = $title.closest('.adminify-field');
310
311 $field.removeClass('adminify-metabox-hide');
312 $field.parent().adminify_reload_script();
313
314 }
315
316 });
317
318 } else {
319
320 $fields.removeClass('adminify-metabox-hide');
321 $wrapper.removeClass('adminify-search-all');
322
323 }
324
325 });
326
327 });
328 };
329
330 //
331 // Sticky Header
332 //
333 $.fn.adminify_sticky = function() {
334 return this.each( function() {
335
336 var $this = $(this),
337 $window = $(window),
338 $inner = $this.find('.adminify-header-inner'),
339 padding = parseInt( $inner.css('padding-left') ) + parseInt( $inner.css('padding-right') ),
340 offset = 32,
341 scrollTop = 0,
342 lastTop = 0,
343 ticking = false,
344 stickyUpdate = function() {
345
346 var offsetTop = $this.offset().top,
347 stickyTop = Math.max(offset, offsetTop - scrollTop ),
348 winWidth = $window.innerWidth();
349
350 if ( stickyTop <= offset && winWidth > 782 ) {
351 $inner.css({width: $this.outerWidth()-padding});
352 $this.css({height: $this.outerHeight()}).addClass( 'adminify-sticky' );
353 } else {
354 $inner.removeAttr('style');
355 $this.removeAttr('style').removeClass( 'adminify-sticky' );
356 }
357
358 },
359 requestTick = function() {
360
361 if ( !ticking ) {
362 requestAnimationFrame( function() {
363 stickyUpdate();
364 ticking = false;
365 });
366 }
367
368 ticking = true;
369
370 },
371 onSticky = function() {
372
373 scrollTop = $window.scrollTop();
374 requestTick();
375
376 };
377
378 $window.on( 'scroll resize', onSticky);
379
380 onSticky();
381
382 });
383 };
384
385 //
386 // Dependency System
387 //
388 $.fn.adminify_dependency = function() {
389 return this.each( function() {
390
391 var $this = $(this),
392 $fields = $this.children('[data-controller]');
393
394 if( $fields.length ) {
395
396 var normal_ruleset = $.adminify_deps.createRuleset(),
397 global_ruleset = $.adminify_deps.createRuleset(),
398 normal_depends = [],
399 global_depends = [];
400
401 $fields.each( function() {
402
403 var $field = $(this),
404 controllers = $field.data('controller').split('|'),
405 conditions = $field.data('condition').split('|'),
406 values = $field.data('value').toString().split('|'),
407 is_global = $field.data('depend-global') ? true : false,
408 ruleset = ( is_global ) ? global_ruleset : normal_ruleset;
409
410 $.each(controllers, function( index, depend_id ) {
411
412 var value = values[index] || '',
413 condition = conditions[index] || conditions[0];
414
415 ruleset = ruleset.createRule('[data-depend-id="'+ depend_id +'"]', condition, value);
416
417 ruleset.include($field);
418
419 if ( is_global ) {
420 global_depends.push(depend_id);
421 } else {
422 normal_depends.push(depend_id);
423 }
424
425 });
426
427 });
428
429 if ( normal_depends.length ) {
430 $.adminify_deps.enable($this, normal_ruleset, normal_depends);
431 }
432
433 if ( global_depends.length ) {
434 $.adminify_deps.enable(ADMINIFY.vars.$body, global_ruleset, global_depends);
435 }
436
437 }
438
439 });
440 };
441
442 //
443 // Field: accordion
444 //
445 $.fn.adminify_field_accordion = function() {
446 return this.each( function() {
447
448 var $titles = $(this).find('.adminify-accordion-title');
449
450 $titles.on('click', function() {
451
452 var $title = $(this),
453 $icon = $title.find('.adminify-accordion-icon'),
454 $content = $title.next();
455
456 if ( $icon.hasClass('fa-angle-right') ) {
457 $icon.removeClass('fa-angle-right').addClass('fa-angle-down');
458 } else {
459 $icon.removeClass('fa-angle-down').addClass('fa-angle-right');
460 }
461
462 if ( !$content.data( 'opened' ) ) {
463
464 $content.adminify_reload_script();
465 $content.data( 'opened', true );
466
467 }
468
469 $content.toggleClass('adminify-accordion-open');
470
471 });
472
473 });
474 };
475
476 //
477 // Field: backup
478 //
479 $.fn.adminify_field_backup = function() {
480 return this.each( function() {
481
482 if ( window.wp.customize === undefined ) { return; }
483
484 var base = this,
485 $this = $(this),
486 $body = $('body'),
487 $import = $this.find('.adminify-import'),
488 $reset = $this.find('.adminify-reset');
489
490 base.notificationOverlay = function() {
491
492 if ( wp.customize.notifications && wp.customize.OverlayNotification ) {
493
494 // clear if there is any saved data.
495 if ( !wp.customize.state('saved').get() ) {
496 wp.customize.state('changesetStatus').set('trash');
497 wp.customize.each( function( setting ) { setting._dirty = false; });
498 wp.customize.state('saved').set(true);
499 }
500
501 // then show a notification overlay
502 wp.customize.notifications.add( new wp.customize.OverlayNotification('adminify_field_backup_notification', {
503 type: 'default',
504 message: '&nbsp;',
505 loading: true
506 }));
507
508 }
509
510 };
511
512 $reset.on('click', function( e ) {
513
514 e.preventDefault();
515
516 if ( ADMINIFY.vars.is_confirm ) {
517
518 base.notificationOverlay();
519
520 window.wp.ajax.post('adminify-reset', {
521 unique: $reset.data('unique'),
522 nonce: $reset.data('nonce')
523 })
524 .done( function( response ) {
525 window.location.reload(true);
526 })
527 .fail( function( response ) {
528 alert( response.error );
529 wp.customize.notifications.remove('adminify_field_backup_notification');
530 });
531
532 }
533
534 });
535
536 $import.on('click', function( e ) {
537
538 e.preventDefault();
539
540 if ( ADMINIFY.vars.is_confirm ) {
541
542 base.notificationOverlay();
543
544 window.wp.ajax.post( 'adminify-import', {
545 unique: $import.data('unique'),
546 nonce: $import.data('nonce'),
547 data: $this.find('.adminify-import-data').val()
548 }).done( function( response ) {
549 window.location.reload(true);
550 }).fail( function( response ) {
551 alert( response.error );
552 wp.customize.notifications.remove('adminify_field_backup_notification');
553 });
554
555 }
556
557 });
558
559 });
560 };
561
562 //
563 // Field: background
564 //
565 $.fn.adminify_field_background = function() {
566 return this.each( function() {
567 $(this).find('.adminify--background-image').adminify_reload_script();
568 });
569 };
570
571 //
572 // Field: code_editor
573 //
574 $.fn.adminify_field_code_editor = function() {
575 return this.each( function() {
576
577 if ( typeof CodeMirror !== 'function' ) { return; }
578
579 var $this = $(this),
580 $textarea = $this.find('textarea'),
581 $inited = $this.find('.CodeMirror'),
582 data_editor = $textarea.data('editor');
583
584 if ( $inited.length ) {
585 $inited.remove();
586 }
587
588 var interval = setInterval(function () {
589 if ( $this.is(':visible') ) {
590
591 var code_editor = CodeMirror.fromTextArea( $textarea[0], data_editor );
592
593 // load code-mirror theme css.
594 if ( data_editor.theme !== 'default' && ADMINIFY.vars.code_themes.indexOf(data_editor.theme) === -1 ) {
595
596 var $cssLink = $('<link>');
597
598 $('#adminify-codemirror-css').after( $cssLink );
599
600 $cssLink.attr({
601 rel: 'stylesheet',
602 id: 'adminify-codemirror-'+ data_editor.theme +'-css',
603 href: data_editor.cdnURL +'/theme/'+ data_editor.theme +'.min.css',
604 type: 'text/css',
605 media: 'all'
606 });
607
608 ADMINIFY.vars.code_themes.push(data_editor.theme);
609
610 }
611
612 CodeMirror.modeURL = data_editor.cdnURL +'/mode/%N/%N.min.js';
613 CodeMirror.autoLoadMode(code_editor, data_editor.mode);
614
615 code_editor.on( 'change', function( editor, event ) {
616 $textarea.val( code_editor.getValue() ).trigger('change');
617 });
618
619 clearInterval(interval);
620
621 }
622 });
623
624 });
625 };
626
627 //
628 // Field: date
629 //
630 $.fn.adminify_field_date = function() {
631 return this.each( function() {
632
633 var $this = $(this),
634 $inputs = $this.find('input'),
635 settings = $this.find('.adminify-date-settings').data('settings'),
636 wrapper = '<div class="adminify-datepicker-wrapper"></div>';
637
638 var defaults = {
639 showAnim: '',
640 beforeShow: function(input, inst) {
641 $(inst.dpDiv).addClass('adminify-datepicker-wrapper');
642 },
643 onClose: function( input, inst ) {
644 $(inst.dpDiv).removeClass('adminify-datepicker-wrapper');
645 },
646 };
647
648 settings = $.extend({}, settings, defaults);
649
650 if ( $inputs.length === 2 ) {
651
652 settings = $.extend({}, settings, {
653 onSelect: function( selectedDate ) {
654
655 var $this = $(this),
656 $from = $inputs.first(),
657 option = ( $inputs.first().attr('id') === $(this).attr('id') ) ? 'minDate' : 'maxDate',
658 date = $.datepicker.parseDate( settings.dateFormat, selectedDate );
659
660 $inputs.not(this).datepicker('option', option, date );
661
662 }
663 });
664
665 }
666
667 $inputs.each( function() {
668
669 var $input = $(this);
670
671 if ( $input.hasClass('hasDatepicker') ) {
672 $input.removeAttr('id').removeClass('hasDatepicker');
673 }
674
675 $input.datepicker(settings);
676
677 });
678
679 });
680 };
681
682 //
683 // Field: datetime
684 //
685 $.fn.adminify_field_datetime = function() {
686 return this.each( function() {
687
688 var $this = $(this),
689 $inputs = $this.find('input'),
690 settings = $this.find('.adminify-datetime-settings').data('settings');
691
692 settings = $.extend({}, settings, {
693 onReady: function( selectedDates, dateStr, instance) {
694 $(instance.calendarContainer).addClass('adminify-flatpickr');
695 },
696 });
697
698 if ( $inputs.length === 2 ) {
699 settings = $.extend({}, settings, {
700 onChange: function( selectedDates, dateStr, instance) {
701 if ( $(instance.element).data('type') === 'from' ) {
702 $inputs.last().get(0)._flatpickr.set( 'minDate', selectedDates[0] );
703 } else {
704 $inputs.first().get(0)._flatpickr.set( 'maxDate', selectedDates[0] );
705 }
706 },
707 });
708 }
709
710 $inputs.each( function() {
711 $(this).flatpickr(settings);
712 });
713
714 });
715 };
716
717 //
718 // Field: fieldset
719 //
720 $.fn.adminify_field_fieldset = function() {
721 return this.each( function() {
722 $(this).find('.adminify-fieldset-content').adminify_reload_script();
723 });
724 };
725
726 //
727 // Field: gallery
728 //
729 $.fn.adminify_field_gallery = function() {
730 return this.each( function() {
731
732 var $this = $(this),
733 $edit = $this.find('.adminify-edit-gallery'),
734 $clear = $this.find('.adminify-clear-gallery'),
735 $list = $this.find('ul'),
736 $input = $this.find('input'),
737 $img = $this.find('img'),
738 wp_media_frame;
739
740 $this.on('click', '.adminify-button, .adminify-edit-gallery', function( e ) {
741
742 var $el = $(this),
743 ids = $input.val(),
744 what = ( $el.hasClass('adminify-edit-gallery') ) ? 'edit' : 'add',
745 state = ( what === 'add' && !ids.length ) ? 'gallery' : 'gallery-edit';
746
747 e.preventDefault();
748
749 if ( typeof window.wp === 'undefined' || ! window.wp.media || ! window.wp.media.gallery ) { return; }
750
751 // Open media with state
752 if ( state === 'gallery' ) {
753
754 wp_media_frame = window.wp.media({
755 library: {
756 type: 'image'
757 },
758 frame: 'post',
759 state: 'gallery',
760 multiple: true
761 });
762
763 wp_media_frame.open();
764
765 } else {
766
767 wp_media_frame = window.wp.media.gallery.edit( '[gallery ids="'+ ids +'"]' );
768
769 if ( what === 'add' ) {
770 wp_media_frame.setState('gallery-library');
771 }
772
773 }
774
775 // Media Update
776 wp_media_frame.on( 'update', function( selection ) {
777
778 $list.empty();
779
780 var selectedIds = selection.models.map( function( attachment ) {
781
782 var item = attachment.toJSON();
783 var thumb = ( item.sizes && item.sizes.thumbnail && item.sizes.thumbnail.url ) ? item.sizes.thumbnail.url : item.url;
784
785 $list.append('<li><img src="'+ thumb +'"></li>');
786
787 return item.id;
788
789 });
790
791 $input.val( selectedIds.join( ',' ) ).trigger('change');
792 $clear.removeClass('hidden');
793 $edit.removeClass('hidden');
794
795 });
796
797 });
798
799 $clear.on('click', function( e ) {
800 e.preventDefault();
801 $list.empty();
802 $input.val('').trigger('change');
803 $clear.addClass('hidden');
804 $edit.addClass('hidden');
805 });
806
807 });
808
809 };
810
811 //
812 // Field: group
813 //
814 $.fn.adminify_field_group = function() {
815 return this.each( function() {
816
817 var $this = $(this),
818 $fieldset = $this.children('.adminify-fieldset'),
819 $group = $fieldset.length ? $fieldset : $this,
820 $wrapper = $group.children('.adminify-cloneable-wrapper'),
821 $hidden = $group.children('.adminify-cloneable-hidden'),
822 $max = $group.children('.adminify-cloneable-max'),
823 $min = $group.children('.adminify-cloneable-min'),
824 title_by = $wrapper.data('title-by'),
825 title_prefix = $wrapper.data('title-by-prefix'),
826 field_id = $wrapper.data('field-id'),
827 is_number = Boolean( Number( $wrapper.data('title-number') ) ),
828 max = parseInt( $wrapper.data('max') ),
829 min = parseInt( $wrapper.data('min') );
830
831 // clear accordion arrows if multi-instance
832 if ( $wrapper.hasClass('ui-accordion') ) {
833 $wrapper.find('.ui-accordion-header-icon').remove();
834 }
835
836 var update_title_numbers = function( $selector ) {
837 $selector.find('.adminify-cloneable-title-number').each( function( index ) {
838 $(this).html( ( $(this).closest('.adminify-cloneable-item').index()+1 ) + '.' );
839 });
840 };
841
842 $wrapper.accordion({
843 header: '> .adminify-cloneable-item > .adminify-cloneable-title',
844 collapsible : true,
845 active: false,
846 animate: false,
847 heightStyle: 'content',
848 icons: {
849 'header': 'adminify-cloneable-header-icon fas fa-angle-right',
850 'activeHeader': 'adminify-cloneable-header-icon fas fa-angle-down'
851 },
852 activate: function( event, ui ) {
853
854 var $panel = ui.newPanel;
855 var $header = ui.newHeader;
856
857 if ( $panel.length && !$panel.data( 'opened' ) ) {
858
859 var $title = $header.find('.adminify-cloneable-value');
860 var inputs = [];
861
862 $.each(title_by, function( key, title_key ) {
863 inputs.push($panel.find( '[data-depend-id="'+ title_key +'"]' ));
864 });
865
866 $.each(inputs, function( key, $input ) {
867
868 $input.on('change keyup adminify.keyup', function() {
869
870 var titles = [];
871
872 $.each(inputs, function( key, $input ) {
873
874 var input_value = $input.val();
875
876 if ( input_value ) {
877 titles.push( input_value );
878 }
879
880 });
881
882 if ( titles.length ) {
883 $title.text( titles.join( title_prefix ) );
884 }
885
886 }).trigger('adminify.keyup');
887
888 });
889
890 $panel.adminify_reload_script();
891 $panel.data( 'opened', true );
892 $panel.data( 'retry', false );
893
894 } else if ( $panel.data( 'retry' ) ) {
895
896 $panel.adminify_reload_script_retry();
897 $panel.data( 'retry', false );
898
899 }
900
901 }
902 });
903
904 $wrapper.sortable({
905 axis: 'y',
906 handle: '.adminify-cloneable-title,.adminify-cloneable-sort',
907 helper: 'original',
908 cursor: 'move',
909 placeholder: 'widget-placeholder',
910 start: function( event, ui ) {
911
912 $wrapper.accordion({ active:false });
913 $wrapper.sortable('refreshPositions');
914 ui.item.children('.adminify-cloneable-content').data('retry', true);
915
916 },
917 update: function( event, ui ) {
918
919 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-cloneable-item'), field_id );
920 $wrapper.adminify_customizer_refresh();
921
922 if ( is_number ) {
923 update_title_numbers($wrapper);
924 }
925
926 },
927 });
928
929 $group.children('.adminify-cloneable-add').on('click', function( e ) {
930
931 e.preventDefault();
932
933 var count = $wrapper.children('.adminify-cloneable-item').length;
934
935 $min.hide();
936
937 if ( max && (count+1) > max ) {
938 $max.show();
939 return;
940 }
941
942 var $cloned_item = $hidden.adminify_clone(true);
943
944 $cloned_item.removeClass('adminify-cloneable-hidden');
945
946 $cloned_item.find(':input[name!="_pseudo"]').each( function() {
947 this.name = this.name.replace( '___', '' ).replace( field_id +'[0]', field_id +'['+ count +']' );
948 });
949
950 $wrapper.append($cloned_item);
951 $wrapper.accordion('refresh');
952 $wrapper.accordion({active: count});
953 $wrapper.adminify_customizer_refresh();
954 $wrapper.adminify_customizer_listen({closest: true});
955
956 if ( is_number ) {
957 update_title_numbers($wrapper);
958 }
959
960 });
961
962 var event_clone = function( e ) {
963
964 e.preventDefault();
965
966 var count = $wrapper.children('.adminify-cloneable-item').length;
967
968 $min.hide();
969
970 if ( max && (count+1) > max ) {
971 $max.show();
972 return;
973 }
974
975 var $this = $(this),
976 $parent = $this.parent().parent(),
977 $cloned_helper = $parent.children('.adminify-cloneable-helper').adminify_clone(true),
978 $cloned_title = $parent.children('.adminify-cloneable-title').adminify_clone(),
979 $cloned_content = $parent.children('.adminify-cloneable-content').adminify_clone(),
980 $cloned_item = $('<div class="adminify-cloneable-item" />');
981
982 $cloned_item.append($cloned_helper);
983 $cloned_item.append($cloned_title);
984 $cloned_item.append($cloned_content);
985
986 $wrapper.children().eq($parent.index()).after($cloned_item);
987
988 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-cloneable-item'), field_id );
989
990 $wrapper.accordion('refresh');
991 $wrapper.adminify_customizer_refresh();
992 $wrapper.adminify_customizer_listen({closest: true});
993
994 if ( is_number ) {
995 update_title_numbers($wrapper);
996 }
997
998 };
999
1000 $wrapper.children('.adminify-cloneable-item').children('.adminify-cloneable-helper').on('click', '.adminify-cloneable-clone', event_clone);
1001 $group.children('.adminify-cloneable-hidden').children('.adminify-cloneable-helper').on('click', '.adminify-cloneable-clone', event_clone);
1002
1003 var event_remove = function( e ) {
1004
1005 e.preventDefault();
1006
1007 var count = $wrapper.children('.adminify-cloneable-item').length;
1008
1009 $max.hide();
1010 $min.hide();
1011
1012 if ( min && (count-1) < min ) {
1013 $min.show();
1014 return;
1015 }
1016
1017 $(this).closest('.adminify-cloneable-item').remove();
1018
1019 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-cloneable-item'), field_id );
1020
1021 $wrapper.adminify_customizer_refresh();
1022
1023 if ( is_number ) {
1024 update_title_numbers($wrapper);
1025 }
1026
1027 };
1028
1029 $wrapper.children('.adminify-cloneable-item').children('.adminify-cloneable-helper').on('click', '.adminify-cloneable-remove', event_remove);
1030 $group.children('.adminify-cloneable-hidden').children('.adminify-cloneable-helper').on('click', '.adminify-cloneable-remove', event_remove);
1031
1032 });
1033 };
1034
1035 //
1036 // Field: icon
1037 //
1038 $.fn.adminify_field_icon = function() {
1039 return this.each( function() {
1040
1041 var $this = $(this);
1042
1043 $this.on('click', '.adminify-icon-add', function( e ) {
1044
1045 e.preventDefault();
1046
1047 var $button = $(this);
1048 var $modal = $('#adminify-modal-icon');
1049
1050 $modal.removeClass('hidden');
1051
1052 ADMINIFY.vars.$icon_target = $this;
1053
1054 if ( !ADMINIFY.vars.icon_modal_loaded ) {
1055
1056 $modal.find('.adminify-modal-loading').show();
1057
1058 window.wp.ajax.post( 'adminify-get-icons', {
1059 nonce: $button.data('nonce')
1060 }).done( function( response ) {
1061
1062 $modal.find('.adminify-modal-loading').hide();
1063
1064 ADMINIFY.vars.icon_modal_loaded = true;
1065
1066 var $load = $modal.find('.adminify-modal-load').html( response.content );
1067
1068 $load.on('click', 'i', function( e ) {
1069
1070 e.preventDefault();
1071
1072 var icon = $(this).attr('title');
1073
1074 ADMINIFY.vars.$icon_target.find('.adminify-icon-preview i').removeAttr('class').addClass(icon);
1075 ADMINIFY.vars.$icon_target.find('.adminify-icon-preview').removeClass('hidden');
1076 ADMINIFY.vars.$icon_target.find('.adminify-icon-remove').removeClass('hidden');
1077 ADMINIFY.vars.$icon_target.find('input').val(icon).trigger('change');
1078
1079 $modal.addClass('hidden');
1080
1081 });
1082
1083 $modal.on('change keyup', '.adminify-icon-search', function() {
1084
1085 var value = $(this).val(),
1086 $icons = $load.find('i');
1087
1088 $icons.each( function() {
1089
1090 var $elem = $(this);
1091
1092 if ( $elem.attr('title').search( new RegExp( value, 'i' ) ) < 0 ) {
1093 $elem.hide();
1094 } else {
1095 $elem.show();
1096 }
1097
1098 });
1099
1100 });
1101
1102 $modal.on('click', '.adminify-modal-close, .adminify-modal-overlay', function() {
1103 $modal.addClass('hidden');
1104 });
1105
1106 }).fail( function( response ) {
1107 $modal.find('.adminify-modal-loading').hide();
1108 $modal.find('.adminify-modal-load').html( response.error );
1109 $modal.on('click', function() {
1110 $modal.addClass('hidden');
1111 });
1112 });
1113 }
1114
1115 });
1116
1117 $this.on('click', '.adminify-icon-remove', function( e ) {
1118 e.preventDefault();
1119 $this.find('.adminify-icon-preview').addClass('hidden');
1120 $this.find('input').val('').trigger('change');
1121 $(this).addClass('hidden');
1122 });
1123
1124 });
1125 };
1126
1127 //
1128 // Field: map
1129 //
1130 $.fn.adminify_field_map = function() {
1131 return this.each( function() {
1132
1133 if ( typeof L === 'undefined' ) { return; }
1134
1135 var $this = $(this),
1136 $map = $this.find('.adminify--map-osm'),
1137 $search_input = $this.find('.adminify--map-search input'),
1138 $latitude = $this.find('.adminify--latitude'),
1139 $longitude = $this.find('.adminify--longitude'),
1140 $zoom = $this.find('.adminify--zoom'),
1141 map_data = $map.data( 'map' );
1142
1143 var mapInit = L.map( $map.get(0), map_data);
1144
1145 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
1146 attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
1147 }).addTo(mapInit);
1148
1149 var mapMarker = L.marker(map_data.center,{draggable: true}).addTo(mapInit);
1150
1151 var update_latlng = function( data ) {
1152 $latitude.val( data.lat );
1153 $longitude.val( data.lng );
1154 $zoom.val( mapInit.getZoom() );
1155 };
1156
1157 mapInit.on( 'click', function ( data ) {
1158 mapMarker.setLatLng( data.latlng );
1159 update_latlng( data.latlng );
1160 });
1161
1162 mapInit.on( 'zoom', function () {
1163 update_latlng( mapMarker.getLatLng() );
1164 });
1165
1166 mapMarker.on( 'drag', function () {
1167 update_latlng( mapMarker.getLatLng() );
1168 });
1169
1170 if ( ! $search_input.length ) {
1171 $search_input = $( '[data-depend-id="'+ $this.find('.adminify--address-field').data( 'address-field' ) +'"]' );
1172 }
1173
1174 var cache = {};
1175
1176 $search_input.autocomplete({
1177 source: function ( request, response ) {
1178
1179 var term = request.term;
1180
1181 if ( term in cache ) {
1182 response( cache[term] );
1183 return;
1184 }
1185
1186 $.get( 'https://nominatim.openstreetmap.org/search', {
1187 format: 'json',
1188 q: term,
1189 }, function( results ) {
1190
1191 var data;
1192
1193 if ( results.length ) {
1194 data = results.map( function( item ) {
1195 return {
1196 value: item.display_name,
1197 label: item.display_name,
1198 lat: item.lat,
1199 lon: item.lon
1200 };
1201 }, 'json');
1202 } else {
1203 data = [{
1204 value: 'no-data',
1205 label: 'No Results.'
1206 }];
1207 }
1208
1209 cache[term] = data;
1210 response(data);
1211
1212 });
1213
1214 },
1215 select: function ( event, ui ) {
1216
1217 if ( ui.item.value === 'no-data' ) { return false; }
1218
1219 var latLng = L.latLng( ui.item.lat, ui.item.lon );
1220
1221 mapInit.panTo( latLng );
1222 mapMarker.setLatLng( latLng );
1223 update_latlng( latLng );
1224
1225 },
1226 create: function (event, ui) {
1227 $(this).autocomplete('widget').addClass('adminify-map-ui-autocomplate');
1228 }
1229 });
1230
1231 var input_update_latlng = function() {
1232
1233 var latLng = L.latLng( $latitude.val(), $longitude.val() );
1234
1235 mapInit.panTo( latLng );
1236 mapMarker.setLatLng( latLng );
1237
1238 };
1239
1240 $latitude.on('change', input_update_latlng );
1241 $longitude.on('change', input_update_latlng );
1242
1243 });
1244 };
1245
1246 function removeTags(str) {
1247 if ((str===null) || (str===''))
1248 return false;
1249 else
1250 str = str.toString();
1251
1252 return str.replace( /(<([^>]+)>)/ig, '');
1253 }
1254
1255 //
1256 // Field: link
1257 //
1258 $.fn.adminify_field_link = function() {
1259 return this.each( function() {
1260
1261 var $this = $(this),
1262 $link = $this.find('.adminify--link'),
1263 $add = $this.find('.adminify--add'),
1264 $edit = $this.find('.adminify--edit'),
1265 $remove = $this.find('.adminify--remove'),
1266 $result = $this.find('.adminify--result'),
1267 uniqid = ADMINIFY.helper.uid('adminify-wplink-textarea-');
1268
1269 $add.on('click', function( e ) {
1270
1271 e.preventDefault();
1272
1273 window.wpLink.open(uniqid);
1274
1275 });
1276
1277 $edit.on('click', function( e ) {
1278
1279 e.preventDefault();
1280
1281 $add.trigger('click');
1282
1283 $('#wp-link-url').val( removeTags( $this.find('.adminify--url').val() ) );
1284 $('#wp-link-text').val( removeTags( $this.find('.adminify--text').val() ) );
1285 $('#wp-link-target').prop('checked', ($this.find('.adminify--target').val() === '_blank'));
1286
1287 });
1288
1289 $remove.on('click', function( e ) {
1290
1291 e.preventDefault();
1292
1293 $this.find('.adminify--url').val('').trigger('change');
1294 $this.find('.adminify--text').val('');
1295 $this.find('.adminify--target').val('');
1296
1297 $add.removeClass('hidden');
1298 $edit.addClass('hidden');
1299 $remove.addClass('hidden');
1300 $result.parent().addClass('hidden');
1301
1302 });
1303
1304 $link.attr('id', uniqid).on('change', function() {
1305
1306 var atts = window.wpLink.getAttrs(),
1307 href = removeTags( atts.href ),
1308 text = removeTags( $('#wp-link-text').val() ),
1309 target = ( atts.target ) ? atts.target : '';
1310
1311 $this.find('.adminify--url').val(href).trigger('change');
1312 $this.find('.adminify--text').val(text);
1313 $this.find('.adminify--target').val(target);
1314
1315 $result.html('{url:"'+href+'", text:"'+text+'", target:"'+target+'"}');
1316
1317 $add.addClass('hidden');
1318 $edit.removeClass('hidden');
1319 $remove.removeClass('hidden');
1320 $result.parent().removeClass('hidden');
1321
1322 });
1323
1324 });
1325
1326 };
1327
1328 //
1329 // Field: media
1330 //
1331 $.fn.adminify_field_media = function() {
1332 return this.each( function() {
1333
1334 var $this = $(this),
1335 $upload_button = $this.find('.adminify--button'),
1336 $remove_button = $this.find('.adminify--remove'),
1337 $library = $upload_button.data('library') && $upload_button.data('library').split(',') || '',
1338 $auto_attributes = ( $this.hasClass('adminify-assign-field-background') ) ? $this.closest('.adminify-field-background').find('.adminify--auto-attributes') : false,
1339 wp_media_frame;
1340
1341 $upload_button.on('click', function( e ) {
1342
1343 e.preventDefault();
1344
1345 if ( typeof window.wp === 'undefined' || ! window.wp.media || ! window.wp.media.gallery ) {
1346 return;
1347 }
1348
1349 if ( wp_media_frame ) {
1350 wp_media_frame.open();
1351 return;
1352 }
1353
1354 wp_media_frame = window.wp.media({
1355 library: {
1356 type: $library
1357 }
1358 });
1359
1360 wp_media_frame.on( 'select', function() {
1361
1362 var thumbnail;
1363 var attributes = wp_media_frame.state().get('selection').first().attributes;
1364 var preview_size = $upload_button.data('preview-size') || 'thumbnail';
1365
1366 if ( $library.length && $library.indexOf(attributes.subtype) === -1 && $library.indexOf(attributes.type) === -1 ) {
1367 return;
1368 }
1369
1370 $this.find('.adminify--id').val( attributes.id );
1371 $this.find('.adminify--width').val( attributes.width );
1372 $this.find('.adminify--height').val( attributes.height );
1373 $this.find('.adminify--alt').val( attributes.alt );
1374 $this.find('.adminify--title').val( attributes.title );
1375 $this.find('.adminify--description').val( attributes.description );
1376
1377 if ( typeof attributes.sizes !== 'undefined' && typeof attributes.sizes.thumbnail !== 'undefined' && preview_size === 'thumbnail' ) {
1378 thumbnail = attributes.sizes.thumbnail.url;
1379 } else if ( typeof attributes.sizes !== 'undefined' && typeof attributes.sizes.full !== 'undefined' ) {
1380 thumbnail = attributes.sizes.full.url;
1381 } else if ( attributes.type === 'image' ) {
1382 thumbnail = attributes.url;
1383 } else {
1384 thumbnail = attributes.icon;
1385 }
1386
1387 if ( $auto_attributes ) {
1388 $auto_attributes.removeClass('adminify--attributes-hidden');
1389 }
1390
1391 $remove_button.removeClass('hidden');
1392
1393 $this.find('.adminify--preview').removeClass('hidden');
1394 $this.find('.adminify--src').attr('src', thumbnail);
1395 $this.find('.adminify--thumbnail').val( thumbnail );
1396 $this.find('.adminify--url').val( attributes.url ).trigger('change');
1397
1398 });
1399
1400 wp_media_frame.open();
1401
1402 });
1403
1404 $remove_button.on('click', function( e ) {
1405
1406 e.preventDefault();
1407
1408 if ( $auto_attributes ) {
1409 $auto_attributes.addClass('adminify--attributes-hidden');
1410 }
1411
1412 $remove_button.addClass('hidden');
1413 $this.find('input').val('');
1414 $this.find('.adminify--preview').addClass('hidden');
1415 $this.find('.adminify--url').trigger('change');
1416
1417 });
1418
1419 });
1420
1421 };
1422
1423 //
1424 // Field: repeater
1425 //
1426 $.fn.adminify_field_repeater = function() {
1427 return this.each( function() {
1428
1429 var $this = $(this),
1430 $fieldset = $this.children('.adminify-fieldset'),
1431 $repeater = $fieldset.length ? $fieldset : $this,
1432 $wrapper = $repeater.children('.adminify-repeater-wrapper'),
1433 $hidden = $repeater.children('.adminify-repeater-hidden'),
1434 $max = $repeater.children('.adminify-repeater-max'),
1435 $min = $repeater.children('.adminify-repeater-min'),
1436 field_id = $wrapper.data('field-id'),
1437 max = parseInt( $wrapper.data('max') ),
1438 min = parseInt( $wrapper.data('min') );
1439
1440 $wrapper.children('.adminify-repeater-item').children('.adminify-repeater-content').adminify_reload_script();
1441
1442 $wrapper.sortable({
1443 axis: 'y',
1444 handle: '.adminify-repeater-sort',
1445 helper: 'original',
1446 cursor: 'move',
1447 placeholder: 'widget-placeholder',
1448 update: function( event, ui ) {
1449
1450 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-repeater-item'), field_id );
1451 $wrapper.adminify_customizer_refresh();
1452 ui.item.adminify_reload_script_retry();
1453
1454 }
1455 });
1456
1457 $repeater.children('.adminify-repeater-add').on('click', function( e ) {
1458
1459 e.preventDefault();
1460
1461 var count = $wrapper.children('.adminify-repeater-item').length;
1462
1463 $min.hide();
1464
1465 if ( max && (count+1) > max ) {
1466 $max.show();
1467 return;
1468 }
1469
1470 var $cloned_item = $hidden.adminify_clone(true);
1471
1472 $cloned_item.removeClass('adminify-repeater-hidden');
1473
1474 $cloned_item.find(':input[name!="_pseudo"]').each( function() {
1475 this.name = this.name.replace( '___', '' ).replace( field_id +'[0]', field_id +'['+ count +']' );
1476 });
1477
1478 $wrapper.append($cloned_item);
1479 $cloned_item.children('.adminify-repeater-content').adminify_reload_script();
1480 $wrapper.adminify_customizer_refresh();
1481 $wrapper.adminify_customizer_listen({closest: true});
1482
1483 });
1484
1485 var event_clone = function( e ) {
1486
1487 e.preventDefault();
1488
1489 var count = $wrapper.children('.adminify-repeater-item').length;
1490
1491 $min.hide();
1492
1493 if ( max && (count+1) > max ) {
1494 $max.show();
1495 return;
1496 }
1497
1498 var $this = $(this),
1499 $parent = $this.parent().parent().parent(),
1500 $cloned_content = $parent.children('.adminify-repeater-content').adminify_clone(),
1501 $cloned_helper = $parent.children('.adminify-repeater-helper').adminify_clone(true),
1502 $cloned_item = $('<div class="adminify-repeater-item" />');
1503
1504 $cloned_item.append($cloned_content);
1505 $cloned_item.append($cloned_helper);
1506
1507 $wrapper.children().eq($parent.index()).after($cloned_item);
1508
1509 $cloned_item.children('.adminify-repeater-content').adminify_reload_script();
1510
1511 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-repeater-item'), field_id );
1512
1513 $wrapper.adminify_customizer_refresh();
1514 $wrapper.adminify_customizer_listen({closest: true});
1515
1516 };
1517
1518 $wrapper.children('.adminify-repeater-item').children('.adminify-repeater-helper').on('click', '.adminify-repeater-clone', event_clone);
1519 $repeater.children('.adminify-repeater-hidden').children('.adminify-repeater-helper').on('click', '.adminify-repeater-clone', event_clone);
1520
1521 var event_remove = function( e ) {
1522
1523 e.preventDefault();
1524
1525 var count = $wrapper.children('.adminify-repeater-item').length;
1526
1527 $max.hide();
1528 $min.hide();
1529
1530 if ( min && (count-1) < min ) {
1531 $min.show();
1532 return;
1533 }
1534
1535 $(this).closest('.adminify-repeater-item').remove();
1536
1537 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-repeater-item'), field_id );
1538
1539 $wrapper.adminify_customizer_refresh();
1540
1541 };
1542
1543 $wrapper.children('.adminify-repeater-item').children('.adminify-repeater-helper').on('click', '.adminify-repeater-remove', event_remove);
1544 $repeater.children('.adminify-repeater-hidden').children('.adminify-repeater-helper').on('click', '.adminify-repeater-remove', event_remove);
1545
1546 });
1547 };
1548
1549 //
1550 // Field: slider
1551 //
1552 $.fn.adminify_field_slider = function() {
1553 return this.each( function() {
1554
1555 var $this = $(this),
1556 $input = $this.find('input'),
1557 $slider = $this.find('.adminify-slider-ui'),
1558 data = $input.data(),
1559 value = $input.val() || 0;
1560
1561 if ( $slider.hasClass('ui-slider') ) {
1562 $slider.empty();
1563 }
1564
1565 $slider.slider({
1566 range: 'min',
1567 value: value,
1568 min: data.min || 0,
1569 max: data.max || 100,
1570 step: data.step || 1,
1571 slide: function( e, o ) {
1572 $input.val( o.value ).trigger('change');
1573 }
1574 });
1575
1576 $input.on('keyup', function() {
1577 $slider.slider('value', $input.val());
1578 });
1579
1580 });
1581 };
1582
1583 //
1584 // Field: sortable
1585 //
1586 $.fn.adminify_field_sortable = function() {
1587 return this.each( function() {
1588
1589 var $sortable = $(this).find('.adminify-sortable');
1590
1591 $sortable.sortable({
1592 axis: 'y',
1593 helper: 'original',
1594 cursor: 'move',
1595 placeholder: 'widget-placeholder',
1596 update: function( event, ui ) {
1597 $sortable.adminify_customizer_refresh();
1598 }
1599 });
1600
1601 $sortable.find('.adminify-sortable-content').adminify_reload_script();
1602
1603 });
1604 };
1605
1606 //
1607 // Field: sorter
1608 //
1609 $.fn.adminify_field_sorter = function() {
1610 return this.each( function() {
1611
1612 var $this = $(this),
1613 $enabled = $this.find('.adminify-enabled'),
1614 $has_disabled = $this.find('.adminify-disabled'),
1615 $disabled = ( $has_disabled.length ) ? $has_disabled : false;
1616
1617 $enabled.sortable({
1618 connectWith: $disabled,
1619 placeholder: 'ui-sortable-placeholder',
1620 update: function( event, ui ) {
1621
1622 var $el = ui.item.find('input');
1623
1624 if ( ui.item.parent().hasClass('adminify-enabled') ) {
1625 $el.attr('name', $el.attr('name').replace('disabled', 'enabled'));
1626 } else {
1627 $el.attr('name', $el.attr('name').replace('enabled', 'disabled'));
1628 }
1629
1630 $this.adminify_customizer_refresh();
1631
1632 }
1633 });
1634
1635 if ( $disabled ) {
1636
1637 $disabled.sortable({
1638 connectWith: $enabled,
1639 placeholder: 'ui-sortable-placeholder',
1640 update: function( event, ui ) {
1641 $this.adminify_customizer_refresh();
1642 }
1643 });
1644
1645 }
1646
1647 });
1648 };
1649
1650 //
1651 // Field: spinner
1652 //
1653 $.fn.adminify_field_spinner = function() {
1654 return this.each( function() {
1655
1656 var $this = $(this),
1657 $input = $this.find('input'),
1658 $inited = $this.find('.ui-button'),
1659 data = $input.data();
1660
1661 if ( $inited.length ) {
1662 $inited.remove();
1663 }
1664
1665 $input.spinner({
1666 min: data.min || 0,
1667 max: data.max || 100,
1668 step: data.step || 1,
1669 create: function( event, ui ) {
1670 if ( data.unit ) {
1671 $input.after('<span class="ui-button adminify--unit">'+ data.unit +'</span>');
1672 }
1673 },
1674 spin: function (event, ui ) {
1675 $input.val(ui.value).trigger('change');
1676 }
1677 });
1678
1679 });
1680 };
1681
1682 //
1683 // Field: switcher
1684 //
1685 $.fn.adminify_field_switcher = function() {
1686 return this.each( function() {
1687
1688 var $switcher = $(this).find('.adminify--switcher');
1689
1690 $switcher.on('click', function() {
1691
1692 var value = 0;
1693 var $input = $switcher.find('input');
1694
1695 if ( $switcher.hasClass('adminify--active') ) {
1696 $switcher.removeClass('adminify--active');
1697 } else {
1698 value = 1;
1699 $switcher.addClass('adminify--active');
1700 }
1701
1702 $input.val(value).trigger('change');
1703
1704 });
1705
1706 });
1707 };
1708
1709 //
1710 // Field: tabbed
1711 //
1712 $.fn.adminify_field_tabbed = function() {
1713 return this.each( function() {
1714
1715 var $this = $(this),
1716 $links = $this.find('.adminify-tabbed-nav a'),
1717 $contents = $this.find('.adminify-tabbed-content');
1718
1719 $contents.eq(0).adminify_reload_script();
1720
1721 $links.on( 'click', function( e ) {
1722
1723 e.preventDefault();
1724
1725 var $link = $(this),
1726 index = $link.index(),
1727 $content = $contents.eq(index);
1728
1729 $link.addClass('adminify-tabbed-active').siblings().removeClass('adminify-tabbed-active');
1730 $content.adminify_reload_script();
1731 $content.removeClass('hidden').siblings().addClass('hidden');
1732
1733 });
1734
1735 });
1736 };
1737
1738 //
1739 // Field: typography
1740 //
1741 $.fn.adminify_field_typography = function() {
1742 return this.each(function () {
1743
1744 var base = this;
1745 var $this = $(this);
1746 var loaded_fonts = [];
1747 var webfonts = adminify_typography_json.webfonts;
1748 var googlestyles = adminify_typography_json.googlestyles;
1749 var defaultstyles = adminify_typography_json.defaultstyles;
1750
1751 //
1752 //
1753 // Sanitize google font subset
1754 base.sanitize_subset = function( subset ) {
1755 subset = subset.replace('-ext', ' Extended');
1756 subset = subset.charAt(0).toUpperCase() + subset.slice(1);
1757 return subset;
1758 };
1759
1760 //
1761 //
1762 // Sanitize google font styles (weight and style)
1763 base.sanitize_style = function( style ) {
1764 return googlestyles[style] ? googlestyles[style] : style;
1765 };
1766
1767 //
1768 //
1769 // Load google font
1770 base.load_google_font = function( font_family, weight, style ) {
1771
1772 if ( font_family && typeof WebFont === 'object' ) {
1773
1774 weight = weight ? weight.replace('normal', '') : '';
1775 style = style ? style.replace('normal', '') : '';
1776
1777 if ( weight || style ) {
1778 font_family = font_family +':'+ weight + style;
1779 }
1780
1781 if ( loaded_fonts.indexOf( font_family ) === -1 ) {
1782 WebFont.load({ google: { families: [font_family] } });
1783 }
1784
1785 loaded_fonts.push( font_family );
1786
1787 }
1788
1789 };
1790
1791 //
1792 //
1793 // Append select options
1794 base.append_select_options = function( $select, options, condition, type, is_multi ) {
1795
1796 $select.find('option').not(':first').remove();
1797
1798 var opts = '';
1799
1800 $.each( options, function( key, value ) {
1801
1802 var selected;
1803 var name = value;
1804
1805 // is_multi
1806 if ( is_multi ) {
1807 selected = ( condition && condition.indexOf(value) !== -1 ) ? ' selected' : '';
1808 } else {
1809 selected = ( condition && condition === value ) ? ' selected' : '';
1810 }
1811
1812 if ( type === 'subset' ) {
1813 name = base.sanitize_subset( value );
1814 } else if ( type === 'style' ){
1815 name = base.sanitize_style( value );
1816 }
1817
1818 opts += '<option value="'+ value +'"'+ selected +'>'+ name +'</option>';
1819
1820 });
1821
1822 $select.append(opts).trigger('adminify.change').trigger('chosen:updated');
1823
1824 };
1825
1826 base.init = function () {
1827
1828 //
1829 //
1830 // Constants
1831 var selected_styles = [];
1832 var $typography = $this.find('.adminify--typography');
1833 var $type = $this.find('.adminify--type');
1834 var $styles = $this.find('.adminify--block-font-style');
1835 var unit = $typography.data('unit');
1836 var line_height_unit = $typography.data('line-height-unit');
1837 var exclude_fonts = $typography.data('exclude') ? $typography.data('exclude').split(',') : [];
1838
1839 //
1840 //
1841 // Chosen init
1842 if ( $this.find('.adminify--chosen').length ) {
1843
1844 var $chosen_selects = $this.find('select');
1845
1846 $chosen_selects.each( function() {
1847
1848 var $chosen_select = $(this),
1849 $chosen_inited = $chosen_select.parent().find('.chosen-container');
1850
1851 if ( $chosen_inited.length ) {
1852 $chosen_inited.remove();
1853 }
1854
1855 $chosen_select.chosen({
1856 allow_single_deselect: true,
1857 disable_search_threshold: 15,
1858 width: '100%'
1859 });
1860
1861 });
1862
1863 }
1864
1865 //
1866 //
1867 // Font family select
1868 var $font_family_select = $this.find('.adminify--font-family');
1869 var first_font_family = $font_family_select.val();
1870
1871 // Clear default font family select options
1872 $font_family_select.find('option').not(':first-child').remove();
1873
1874 var opts = '';
1875
1876 $.each(webfonts, function( type, group ) {
1877
1878 // Check for exclude fonts
1879 if ( exclude_fonts && exclude_fonts.indexOf(type) !== -1 ) { return; }
1880
1881 opts += '<optgroup label="' + group.label + '">';
1882
1883 $.each(group.fonts, function( key, value ) {
1884
1885 // use key if value is object
1886 value = ( typeof value === 'object' ) ? key : value;
1887 var selected = ( value === first_font_family ) ? ' selected' : '';
1888 opts += '<option value="'+ value +'" data-type="'+ type +'"'+ selected +'>'+ value +'</option>';
1889
1890 });
1891
1892 opts += '</optgroup>';
1893
1894 });
1895
1896 // Append google font select options
1897 $font_family_select.append(opts).trigger('chosen:updated');
1898
1899 //
1900 //
1901 // Font style select
1902 var $font_style_block = $this.find('.adminify--block-font-style');
1903
1904 if ( $font_style_block.length ) {
1905
1906 var $font_style_select = $this.find('.adminify--font-style-select');
1907 var first_style_value = $font_style_select.val() ? $font_style_select.val().replace(/normal/g, '' ) : '';
1908
1909 //
1910 // Font Style on on change listener
1911 $font_style_select.on('change adminify.change', function( event ) {
1912
1913 var style_value = $font_style_select.val();
1914
1915 // set a default value
1916 if ( !style_value && selected_styles && selected_styles.indexOf('normal') === -1 ) {
1917 style_value = selected_styles[0];
1918 }
1919
1920 // set font weight, for eg. replacing 800italic to 800
1921 var font_normal = ( style_value && style_value !== 'italic' && style_value === 'normal' ) ? 'normal' : '';
1922 var font_weight = ( style_value && style_value !== 'italic' && style_value !== 'normal' ) ? style_value.replace('italic', '') : font_normal;
1923 var font_style = ( style_value && style_value.substr(-6) === 'italic' ) ? 'italic' : '';
1924
1925 $this.find('.adminify--font-weight').val( font_weight );
1926 $this.find('.adminify--font-style').val( font_style );
1927
1928 });
1929
1930 //
1931 //
1932 // Extra font style select
1933 var $extra_font_style_block = $this.find('.adminify--block-extra-styles');
1934
1935 if ( $extra_font_style_block.length ) {
1936 var $extra_font_style_select = $this.find('.adminify--extra-styles');
1937 var first_extra_style_value = $extra_font_style_select.val();
1938 }
1939
1940 }
1941
1942 //
1943 //
1944 // Subsets select
1945 var $subset_block = $this.find('.adminify--block-subset');
1946 if ( $subset_block.length ) {
1947 var $subset_select = $this.find('.adminify--subset');
1948 var first_subset_select_value = $subset_select.val();
1949 var subset_multi_select = $subset_select.data('multiple') || false;
1950 }
1951
1952 //
1953 //
1954 // Backup font family
1955 var $backup_font_family_block = $this.find('.adminify--block-backup-font-family');
1956
1957 //
1958 //
1959 // Font Family on Change Listener
1960 $font_family_select.on('change adminify.change', function( event ) {
1961
1962 // Hide subsets on change
1963 if ( $subset_block.length ) {
1964 $subset_block.addClass('hidden');
1965 }
1966
1967 // Hide extra font style on change
1968 if ( $extra_font_style_block.length ) {
1969 $extra_font_style_block.addClass('hidden');
1970 }
1971
1972 // Hide backup font family on change
1973 if ( $backup_font_family_block.length ) {
1974 $backup_font_family_block.addClass('hidden');
1975 }
1976
1977 var $selected = $font_family_select.find(':selected');
1978 var value = $selected.val();
1979 var type = $selected.data('type');
1980
1981 if ( type && value ) {
1982
1983 // Show backup fonts if font type google or custom
1984 if ( ( type === 'google' || type === 'custom' ) && $backup_font_family_block.length ) {
1985 $backup_font_family_block.removeClass('hidden');
1986 }
1987
1988 // Appending font style select options
1989 if ( $font_style_block.length ) {
1990
1991 // set styles for multi and normal style selectors
1992 var styles = defaultstyles;
1993
1994 // Custom or gogle font styles
1995 if ( type === 'google' && webfonts[type].fonts[value][0] ) {
1996 styles = webfonts[type].fonts[value][0];
1997 } else if ( type === 'custom' && webfonts[type].fonts[value] ) {
1998 styles = webfonts[type].fonts[value];
1999 }
2000
2001 selected_styles = styles;
2002
2003 // Set selected style value for avoid load errors
2004 var set_auto_style = ( styles.indexOf('normal') !== -1 ) ? 'normal' : styles[0];
2005 var set_style_value = ( first_style_value && styles.indexOf(first_style_value) !== -1 ) ? first_style_value : set_auto_style;
2006
2007 // Append style select options
2008 base.append_select_options( $font_style_select, styles, set_style_value, 'style' );
2009
2010 // Clear first value
2011 first_style_value = false;
2012
2013 // Show style select after appended
2014 $font_style_block.removeClass('hidden');
2015
2016 // Appending extra font style select options
2017 if ( type === 'google' && $extra_font_style_block.length && styles.length > 1 ) {
2018
2019 // Append extra-style select options
2020 base.append_select_options( $extra_font_style_select, styles, first_extra_style_value, 'style', true );
2021
2022 // Clear first value
2023 first_extra_style_value = false;
2024
2025 // Show style select after appended
2026 $extra_font_style_block.removeClass('hidden');
2027
2028 }
2029
2030 }
2031
2032 // Appending google fonts subsets select options
2033 if ( type === 'google' && $subset_block.length && webfonts[type].fonts[value][1] ) {
2034
2035 var subsets = webfonts[type].fonts[value][1];
2036 var set_auto_subset = ( subsets.length < 2 && subsets[0] !== 'latin' ) ? subsets[0] : '';
2037 var set_subset_value = ( first_subset_select_value && subsets.indexOf(first_subset_select_value) !== -1 ) ? first_subset_select_value : set_auto_subset;
2038
2039 // check for multiple subset select
2040 set_subset_value = ( subset_multi_select && first_subset_select_value ) ? first_subset_select_value : set_subset_value;
2041
2042 base.append_select_options( $subset_select, subsets, set_subset_value, 'subset', subset_multi_select );
2043
2044 first_subset_select_value = false;
2045
2046 $subset_block.removeClass('hidden');
2047
2048 }
2049
2050 } else {
2051
2052 // Clear Styles
2053 $styles.find(':input').val('');
2054
2055 // Clear subsets options if type and value empty
2056 if ( $subset_block.length ) {
2057 $subset_select.find('option').not(':first-child').remove();
2058 $subset_select.trigger('chosen:updated');
2059 }
2060
2061 // Clear font styles options if type and value empty
2062 if ( $font_style_block.length ) {
2063 $font_style_select.find('option').not(':first-child').remove();
2064 $font_style_select.trigger('chosen:updated');
2065 }
2066
2067 }
2068
2069 // Update font type input value
2070 $type.val(type);
2071
2072 }).trigger('adminify.change');
2073
2074 //
2075 //
2076 // Preview
2077 var $preview_block = $this.find('.adminify--block-preview');
2078
2079 if ( $preview_block.length ) {
2080
2081 var $preview = $this.find('.adminify--preview');
2082
2083 // Set preview styles on change
2084 $this.on('change', ADMINIFY.helper.debounce( function( event ) {
2085
2086 $preview_block.removeClass('hidden');
2087
2088 var font_family = $font_family_select.val(),
2089 font_weight = $this.find('.adminify--font-weight').val(),
2090 font_style = $this.find('.adminify--font-style').val(),
2091 font_size = $this.find('.adminify--font-size').val(),
2092 font_variant = $this.find('.adminify--font-variant').val(),
2093 line_height = $this.find('.adminify--line-height').val(),
2094 text_align = $this.find('.adminify--text-align').val(),
2095 text_transform = $this.find('.adminify--text-transform').val(),
2096 text_decoration = $this.find('.adminify--text-decoration').val(),
2097 text_color = $this.find('.adminify--color').val(),
2098 word_spacing = $this.find('.adminify--word-spacing').val(),
2099 letter_spacing = $this.find('.adminify--letter-spacing').val(),
2100 custom_style = $this.find('.adminify--custom-style').val(),
2101 type = $this.find('.adminify--type').val();
2102
2103 if ( type === 'google' ) {
2104 base.load_google_font(font_family, font_weight, font_style);
2105 }
2106
2107 var properties = {};
2108
2109 if ( font_family ) { properties.fontFamily = font_family; }
2110 if ( font_weight ) { properties.fontWeight = font_weight; }
2111 if ( font_style ) { properties.fontStyle = font_style; }
2112 if ( font_variant ) { properties.fontVariant = font_variant; }
2113 if ( font_size ) { properties.fontSize = font_size + unit; }
2114 if ( line_height ) { properties.lineHeight = line_height + line_height_unit; }
2115 if ( letter_spacing ) { properties.letterSpacing = letter_spacing + unit; }
2116 if ( word_spacing ) { properties.wordSpacing = word_spacing + unit; }
2117 if ( text_align ) { properties.textAlign = text_align; }
2118 if ( text_transform ) { properties.textTransform = text_transform; }
2119 if ( text_decoration ) { properties.textDecoration = text_decoration; }
2120 if ( text_color ) { properties.color = text_color; }
2121
2122 $preview.removeAttr('style');
2123
2124 // Customs style attribute
2125 if ( custom_style ) { $preview.attr('style', custom_style); }
2126
2127 $preview.css(properties);
2128
2129 }, 100 ) );
2130
2131 // Preview black and white backgrounds trigger
2132 $preview_block.on('click', function() {
2133
2134 $preview.toggleClass('adminify--black-background');
2135
2136 var $toggle = $preview_block.find('.adminify--toggle');
2137
2138 if ( $toggle.hasClass('fa-toggle-off') ) {
2139 $toggle.removeClass('fa-toggle-off').addClass('fa-toggle-on');
2140 } else {
2141 $toggle.removeClass('fa-toggle-on').addClass('fa-toggle-off');
2142 }
2143
2144 });
2145
2146 if ( !$preview_block.hasClass('hidden') ) {
2147 $this.trigger('change');
2148 }
2149
2150 }
2151
2152 };
2153
2154 base.init();
2155
2156 });
2157 };
2158
2159 //
2160 // Field: upload
2161 //
2162 $.fn.adminify_field_upload = function() {
2163 return this.each( function() {
2164
2165 var $this = $(this),
2166 $input = $this.find('input'),
2167 $upload_button = $this.find('.adminify--button'),
2168 $remove_button = $this.find('.adminify--remove'),
2169 $preview_wrap = $this.find('.adminify--preview'),
2170 $preview_src = $this.find('.adminify--src'),
2171 $library = $upload_button.data('library') && $upload_button.data('library').split(',') || '',
2172 wp_media_frame;
2173
2174 $upload_button.on('click', function( e ) {
2175
2176 e.preventDefault();
2177
2178 if ( typeof window.wp === 'undefined' || ! window.wp.media || ! window.wp.media.gallery ) {
2179 return;
2180 }
2181
2182 if ( wp_media_frame ) {
2183 wp_media_frame.open();
2184 return;
2185 }
2186
2187 wp_media_frame = window.wp.media({
2188 library: {
2189 type: $library
2190 },
2191 });
2192
2193 wp_media_frame.on( 'select', function() {
2194
2195 var src;
2196 var attributes = wp_media_frame.state().get('selection').first().attributes;
2197
2198 if ( $library.length && $library.indexOf(attributes.subtype) === -1 && $library.indexOf(attributes.type) === -1 ) {
2199 return;
2200 }
2201
2202 $input.val(attributes.url).trigger('change');
2203
2204 });
2205
2206 wp_media_frame.open();
2207
2208 });
2209
2210 $remove_button.on('click', function( e ) {
2211 e.preventDefault();
2212 $input.val('').trigger('change');
2213 });
2214
2215 $input.on('change', function( e ) {
2216
2217 var $value = $input.val();
2218
2219 if ( $value ) {
2220 $remove_button.removeClass('hidden');
2221 } else {
2222 $remove_button.addClass('hidden');
2223 }
2224
2225 if ( $preview_wrap.length ) {
2226
2227 if ( $.inArray( $value.split('.').pop().toLowerCase(), ['jpg', 'jpeg', 'gif', 'png', 'svg', 'webp'] ) !== -1 ) {
2228 $preview_wrap.removeClass('hidden');
2229 $preview_src.attr('src', $value);
2230 } else {
2231 $preview_wrap.addClass('hidden');
2232 }
2233
2234 }
2235
2236 });
2237
2238 });
2239
2240 };
2241
2242 //
2243 // Field: wp_editor
2244 //
2245 $.fn.adminify_field_wp_editor = function() {
2246 return this.each( function() {
2247
2248 if ( typeof window.wp.editor === 'undefined' || typeof window.tinyMCEPreInit === 'undefined' || typeof window.tinyMCEPreInit.mceInit.adminify_wp_editor === 'undefined' ) {
2249 return;
2250 }
2251
2252 var $this = $(this),
2253 $editor = $this.find('.adminify-wp-editor'),
2254 $textarea = $this.find('textarea');
2255
2256 // If there is wp-editor remove it for avoid dupliated wp-editor conflicts.
2257 var $has_wp_editor = $this.find('.wp-editor-wrap').length || $this.find('.mce-container').length;
2258
2259 if ( $has_wp_editor ) {
2260 $editor.empty();
2261 $editor.append($textarea);
2262 $textarea.css('display', '');
2263 }
2264
2265 // Generate a unique id
2266 var uid = ADMINIFY.helper.uid('adminify-editor-');
2267
2268 $textarea.attr('id', uid);
2269
2270 // Get default editor settings
2271 var default_editor_settings = {
2272 tinymce: window.tinyMCEPreInit.mceInit.adminify_wp_editor,
2273 quicktags: window.tinyMCEPreInit.qtInit.adminify_wp_editor
2274 };
2275
2276 // Get default editor settings
2277 var field_editor_settings = $editor.data('editor-settings');
2278
2279 // Callback for old wp editor
2280 var wpEditor = wp.oldEditor ? wp.oldEditor : wp.editor;
2281
2282 if ( wpEditor && wpEditor.hasOwnProperty('autop') ) {
2283 wp.editor.autop = wpEditor.autop;
2284 wp.editor.removep = wpEditor.removep;
2285 wp.editor.initialize = wpEditor.initialize;
2286 }
2287
2288 // Add on change event handle
2289 var editor_on_change = function( editor ) {
2290 editor.on('change keyup', function() {
2291 var value = ( field_editor_settings.wpautop ) ? editor.getContent() : wp.editor.removep(editor.getContent());
2292 $textarea.val(value).trigger('change');
2293 });
2294 };
2295
2296 // Extend editor selector and on change event handler
2297 default_editor_settings.tinymce = $.extend( {}, default_editor_settings.tinymce, { selector: '#'+ uid, setup: editor_on_change } );
2298
2299 // Override editor tinymce settings
2300 if ( field_editor_settings.tinymce === false ) {
2301 default_editor_settings.tinymce = false;
2302 $editor.addClass('adminify-no-tinymce');
2303 }
2304
2305 // Override editor quicktags settings
2306 if ( field_editor_settings.quicktags === false ) {
2307 default_editor_settings.quicktags = false;
2308 $editor.addClass('adminify-no-quicktags');
2309 }
2310
2311 // Wait until :visible
2312 var interval = setInterval(function () {
2313 if ( $this.is(':visible') ) {
2314 window.wp.editor.initialize(uid, default_editor_settings);
2315 clearInterval(interval);
2316 }
2317 });
2318
2319 // Add Media buttons
2320 if ( field_editor_settings.media_buttons && window.adminify_media_buttons ) {
2321
2322 var $editor_buttons = $editor.find('.wp-media-buttons');
2323
2324 if ( $editor_buttons.length ) {
2325
2326 $editor_buttons.find('.adminify-shortcode-button').data('editor-id', uid);
2327
2328 } else {
2329
2330 var $media_buttons = $(window.adminify_media_buttons);
2331
2332 $media_buttons.find('.adminify-shortcode-button').data('editor-id', uid);
2333
2334 $editor.prepend( $media_buttons );
2335
2336 }
2337
2338 }
2339
2340 });
2341
2342 };
2343
2344 //
2345 // Confirm
2346 //
2347 $.fn.adminify_confirm = function() {
2348 return this.each( function() {
2349 $(this).on('click', function( e ) {
2350
2351 var confirm_text = $(this).data('confirm') || window.adminify_vars.i18n.confirm;
2352 var confirm_answer = confirm( confirm_text );
2353
2354 if ( confirm_answer ) {
2355 ADMINIFY.vars.is_confirm = true;
2356 ADMINIFY.vars.form_modified = false;
2357 } else {
2358 e.preventDefault();
2359 return false;
2360 }
2361
2362 });
2363 });
2364 };
2365
2366 $.fn.serializeObject = function() {
2367
2368 var obj = {};
2369
2370 $.each( this.serializeArray(), function(i,o){
2371 var n = o.name,
2372 v = o.value;
2373
2374 obj[n] = obj[n] === undefined ? v
2375 : $.isArray( obj[n] ) ? obj[n].concat( v )
2376 : [ obj[n], v ];
2377 });
2378
2379 return obj;
2380
2381 };
2382
2383 //
2384 // Options Save
2385 //
2386 $.fn.adminify_save = function() {
2387 return this.each( function() {
2388
2389 var $this = $(this),
2390 $buttons = $('.adminify-save'),
2391 $panel = $('.adminify-options'),
2392 flooding = false,
2393 timeout;
2394
2395 $this.on('click', function( e ) {
2396
2397 if ( !flooding ) {
2398
2399 var $text = $this.data('save'),
2400 $value = $this.val();
2401
2402 $buttons.attr('value', $text);
2403
2404 if ( $this.hasClass('adminify-save-ajax') ) {
2405
2406 e.preventDefault();
2407
2408 $panel.addClass('adminify-saving');
2409 $buttons.prop('disabled', true);
2410
2411 window.wp.ajax.post( 'adminify_'+ $panel.data('unique') +'_ajax_save', {
2412 data: $('#adminify-form').serializeJSONADMINIFY()
2413 })
2414 .done( function( response ) {
2415
2416 // clear errors
2417 $('.adminify-error').remove();
2418
2419 if ( Object.keys( response.errors ).length ) {
2420
2421 var error_icon = '<i class="adminify-label-error adminify-error">!</i>';
2422
2423 $.each(response.errors, function( key, error_message ) {
2424
2425 var $field = $('[data-depend-id="'+ key +'"]'),
2426 $link = $('a[href="#tab='+ $field.closest('.adminify-section').data('section-id') +'"]' ),
2427 $tab = $link.closest('.adminify-tab-item');
2428
2429 $field.closest('.adminify-fieldset').append( '<p class="adminify-error adminify-error-text">'+ error_message +'</p>' );
2430
2431 if ( !$link.find('.adminify-error').length ) {
2432 $link.append( error_icon );
2433 }
2434
2435 if ( !$tab.find('.adminify-arrow .adminify-error').length ) {
2436 $tab.find('.adminify-arrow').append( error_icon );
2437 }
2438
2439 });
2440
2441 }
2442
2443 $panel.removeClass('adminify-saving');
2444 $buttons.prop('disabled', false).attr('value', $value);
2445 flooding = false;
2446
2447 ADMINIFY.vars.form_modified = false;
2448 ADMINIFY.vars.$form_warning.hide();
2449
2450 clearTimeout(timeout);
2451
2452 var $result_success = $('.adminify-form-success');
2453 $result_success.empty().append(response.notice).fadeIn('fast', function() {
2454 timeout = setTimeout( function() {
2455 $result_success.fadeOut('fast');
2456 }, 1000);
2457 });
2458
2459 })
2460 .fail( function( response ) {
2461 alert( response.error );
2462 });
2463
2464 } else {
2465
2466 ADMINIFY.vars.form_modified = false;
2467
2468 }
2469
2470 }
2471
2472 flooding = true;
2473
2474 });
2475
2476 });
2477 };
2478
2479 //
2480 // Option Framework
2481 //
2482 $.fn.adminify_options = function() {
2483 return this.each( function() {
2484
2485 var $this = $(this),
2486 $content = $this.find('.adminify-content'),
2487 $form_success = $this.find('.adminify-form-success'),
2488 $form_warning = $this.find('.adminify-form-warning'),
2489 $save_button = $this.find('.adminify-header .adminify-save');
2490
2491 ADMINIFY.vars.$form_warning = $form_warning;
2492
2493 // Shows a message white leaving theme options without saving
2494 if ( $form_warning.length ) {
2495
2496 window.onbeforeunload = function() {
2497 return ( ADMINIFY.vars.form_modified ) ? true : undefined;
2498 };
2499
2500 $content.on('change keypress', ':input', function() {
2501 if ( !ADMINIFY.vars.form_modified ) {
2502 $form_success.hide();
2503 $form_warning.fadeIn('fast');
2504 ADMINIFY.vars.form_modified = true;
2505 }
2506 });
2507
2508 }
2509
2510 if ( $form_success.hasClass('adminify-form-show') ) {
2511 setTimeout( function() {
2512 $form_success.fadeOut('fast');
2513 }, 1000);
2514 }
2515
2516 $(document).keydown(function (event) {
2517 if ( ( event.ctrlKey || event.metaKey ) && event.which === 83 ) {
2518 $save_button.trigger('click');
2519 event.preventDefault();
2520 return false;
2521 }
2522 });
2523
2524 });
2525 };
2526
2527 //
2528 // Taxonomy Framework
2529 //
2530 $.fn.adminify_taxonomy = function() {
2531 return this.each( function() {
2532
2533 var $this = $(this),
2534 $form = $this.parents('form');
2535
2536 if ( $form.attr('id') === 'addtag' ) {
2537
2538 var $submit = $form.find('#submit'),
2539 $cloned = $this.find('.adminify-field').adminify_clone();
2540
2541 $submit.on( 'click', function() {
2542
2543 if ( !$form.find('.form-required').hasClass('form-invalid') ) {
2544
2545 $this.data('inited', false);
2546
2547 $this.empty();
2548
2549 $this.html( $cloned );
2550
2551 $cloned = $cloned.adminify_clone();
2552
2553 $this.adminify_reload_script();
2554
2555 }
2556
2557 });
2558
2559 }
2560
2561 });
2562 };
2563
2564 //
2565 // Shortcode Framework
2566 //
2567 $.fn.adminify_shortcode = function() {
2568
2569 var base = this;
2570
2571 base.shortcode_parse = function( serialize, key ) {
2572
2573 var shortcode = '';
2574
2575 $.each(serialize, function( shortcode_key, shortcode_values ) {
2576
2577 key = ( key ) ? key : shortcode_key;
2578
2579 shortcode += '[' + key;
2580
2581 $.each(shortcode_values, function( shortcode_tag, shortcode_value ) {
2582
2583 if ( shortcode_tag === 'content' ) {
2584
2585 shortcode += ']';
2586 shortcode += shortcode_value;
2587 shortcode += '[/'+ key +'';
2588
2589 } else {
2590
2591 shortcode += base.shortcode_tags( shortcode_tag, shortcode_value );
2592
2593 }
2594
2595 });
2596
2597 shortcode += ']';
2598
2599 });
2600
2601 return shortcode;
2602
2603 };
2604
2605 base.shortcode_tags = function( shortcode_tag, shortcode_value ) {
2606
2607 var shortcode = '';
2608
2609 if ( shortcode_value !== '' ) {
2610
2611 if ( typeof shortcode_value === 'object' && !$.isArray( shortcode_value ) ) {
2612
2613 $.each(shortcode_value, function( sub_shortcode_tag, sub_shortcode_value ) {
2614
2615 // sanitize spesific key/value
2616 switch( sub_shortcode_tag ) {
2617
2618 case 'background-image':
2619 sub_shortcode_value = ( sub_shortcode_value.url ) ? sub_shortcode_value.url : '';
2620 break;
2621
2622 }
2623
2624 if ( sub_shortcode_value !== '' ) {
2625 shortcode += ' ' + sub_shortcode_tag + '="' + sub_shortcode_value.toString() + '"';
2626 }
2627
2628 });
2629
2630 } else {
2631
2632 shortcode += ' ' + shortcode_tag + '="' + shortcode_value.toString() + '"';
2633
2634 }
2635
2636 }
2637
2638 return shortcode;
2639
2640 };
2641
2642 base.insertAtChars = function( _this, currentValue ) {
2643
2644 var obj = ( typeof _this[0].name !== 'undefined' ) ? _this[0] : _this;
2645
2646 if ( obj.value.length && typeof obj.selectionStart !== 'undefined' ) {
2647 obj.focus();
2648 return obj.value.substring( 0, obj.selectionStart ) + currentValue + obj.value.substring( obj.selectionEnd, obj.value.length );
2649 } else {
2650 obj.focus();
2651 return currentValue;
2652 }
2653
2654 };
2655
2656 base.send_to_editor = function( html, editor_id ) {
2657
2658 var tinymce_editor;
2659
2660 if ( typeof tinymce !== 'undefined' ) {
2661 tinymce_editor = tinymce.get( editor_id );
2662 }
2663
2664 if ( tinymce_editor && !tinymce_editor.isHidden() ) {
2665 tinymce_editor.execCommand( 'mceInsertContent', false, html );
2666 } else {
2667 var $editor = $('#'+editor_id);
2668 $editor.val( base.insertAtChars( $editor, html ) ).trigger('change');
2669 }
2670
2671 };
2672
2673 return this.each( function() {
2674
2675 var $modal = $(this),
2676 $load = $modal.find('.adminify-modal-load'),
2677 $content = $modal.find('.adminify-modal-content'),
2678 $insert = $modal.find('.adminify-modal-insert'),
2679 $loading = $modal.find('.adminify-modal-loading'),
2680 $select = $modal.find('select'),
2681 modal_id = $modal.data('modal-id'),
2682 nonce = $modal.data('nonce'),
2683 editor_id,
2684 target_id,
2685 gutenberg_id,
2686 sc_key,
2687 sc_name,
2688 sc_view,
2689 sc_group,
2690 $cloned,
2691 $button;
2692
2693 $(document).on('click', '.adminify-shortcode-button[data-modal-id="'+ modal_id +'"]', function( e ) {
2694
2695 e.preventDefault();
2696
2697 $button = $(this);
2698 editor_id = $button.data('editor-id') || false;
2699 target_id = $button.data('target-id') || false;
2700 gutenberg_id = $button.data('gutenberg-id') || false;
2701
2702 $modal.removeClass('hidden');
2703
2704 // single usage trigger first shortcode
2705 if ( $modal.hasClass('adminify-shortcode-single') && sc_name === undefined ) {
2706 $select.trigger('change');
2707 }
2708
2709 });
2710
2711 $select.on( 'change', function() {
2712
2713 var $option = $(this);
2714 var $selected = $option.find(':selected');
2715
2716 sc_key = $option.val();
2717 sc_name = $selected.data('shortcode');
2718 sc_view = $selected.data('view') || 'normal';
2719 sc_group = $selected.data('group') || sc_name;
2720
2721 $load.empty();
2722
2723 if ( sc_key ) {
2724
2725 $loading.show();
2726
2727 window.wp.ajax.post( 'adminify-get-shortcode-'+ modal_id, {
2728 shortcode_key: sc_key,
2729 nonce: nonce
2730 })
2731 .done( function( response ) {
2732
2733 $loading.hide();
2734
2735 var $appended = $(response.content).appendTo($load);
2736
2737 $insert.parent().removeClass('hidden');
2738
2739 $cloned = $appended.find('.adminify--repeat-shortcode').adminify_clone();
2740
2741 $appended.adminify_reload_script();
2742 $appended.find('.adminify-fields').adminify_reload_script();
2743
2744 });
2745
2746 } else {
2747
2748 $insert.parent().addClass('hidden');
2749
2750 }
2751
2752 });
2753
2754 $insert.on('click', function( e ) {
2755
2756 e.preventDefault();
2757
2758 if ( $insert.prop('disabled') || $insert.attr('disabled') ) { return; }
2759
2760 var shortcode = '';
2761 var serialize = $modal.find('.adminify-field:not(.adminify-depend-on)').find(':input:not(.ignore)').serializeObjectADMINIFY();
2762
2763 switch ( sc_view ) {
2764
2765 case 'contents':
2766 var contentsObj = ( sc_name ) ? serialize[sc_name] : serialize;
2767 $.each(contentsObj, function( sc_key, sc_value ) {
2768 var sc_tag = ( sc_name ) ? sc_name : sc_key;
2769 shortcode += '['+ sc_tag +']'+ sc_value +'[/'+ sc_tag +']';
2770 });
2771 break;
2772
2773 case 'group':
2774
2775 shortcode += '[' + sc_name;
2776 $.each(serialize[sc_name], function( sc_key, sc_value ) {
2777 shortcode += base.shortcode_tags( sc_key, sc_value );
2778 });
2779 shortcode += ']';
2780 shortcode += base.shortcode_parse( serialize[sc_group], sc_group );
2781 shortcode += '[/' + sc_name + ']';
2782
2783 break;
2784
2785 case 'repeater':
2786 shortcode += base.shortcode_parse( serialize[sc_group], sc_group );
2787 break;
2788
2789 default:
2790 shortcode += base.shortcode_parse( serialize );
2791 break;
2792
2793 }
2794
2795 shortcode = ( shortcode === '' ) ? '['+ sc_name +']' : shortcode;
2796
2797 if ( gutenberg_id ) {
2798
2799 var content = window.adminify_gutenberg_props.attributes.hasOwnProperty('shortcode') ? window.adminify_gutenberg_props.attributes.shortcode : '';
2800 window.adminify_gutenberg_props.setAttributes({shortcode: content + shortcode});
2801
2802 } else if ( editor_id ) {
2803
2804 base.send_to_editor( shortcode, editor_id );
2805
2806 } else {
2807
2808 var $textarea = (target_id) ? $(target_id) : $button.parent().find('textarea');
2809 $textarea.val( base.insertAtChars( $textarea, shortcode ) ).trigger('change');
2810
2811 }
2812
2813 $modal.addClass('hidden');
2814
2815 });
2816
2817 $modal.on('click', '.adminify--repeat-button', function( e ) {
2818
2819 e.preventDefault();
2820
2821 var $repeatable = $modal.find('.adminify--repeatable');
2822 var $new_clone = $cloned.adminify_clone();
2823 var $remove_btn = $new_clone.find('.adminify-repeat-remove');
2824
2825 var $appended = $new_clone.appendTo( $repeatable );
2826
2827 $new_clone.find('.adminify-fields').adminify_reload_script();
2828
2829 ADMINIFY.helper.name_nested_replace( $modal.find('.adminify--repeat-shortcode'), sc_group );
2830
2831 $remove_btn.on('click', function() {
2832
2833 $new_clone.remove();
2834
2835 ADMINIFY.helper.name_nested_replace( $modal.find('.adminify--repeat-shortcode'), sc_group );
2836
2837 });
2838
2839 });
2840
2841 $modal.on('click', '.adminify-modal-close, .adminify-modal-overlay', function() {
2842 $modal.addClass('hidden');
2843 });
2844
2845 });
2846 };
2847
2848 //
2849 // WP Color Picker
2850 //
2851 if ( typeof Color === 'function' ) {
2852
2853 Color.prototype.toString = function() {
2854
2855 if ( this._alpha < 1 ) {
2856 return this.toCSS('rgba', this._alpha).replace(/\s+/g, '');
2857 }
2858
2859 var hex = parseInt( this._color, 10 ).toString( 16 );
2860
2861 if ( this.error ) { return ''; }
2862
2863 if ( hex.length < 6 ) {
2864 for (var i = 6 - hex.length - 1; i >= 0; i--) {
2865 hex = '0' + hex;
2866 }
2867 }
2868
2869 return '#' + hex;
2870
2871 };
2872
2873 }
2874
2875 ADMINIFY.funcs.parse_color = function( color ) {
2876
2877 var value = color.replace(/\s+/g, ''),
2878 trans = ( value.indexOf('rgba') !== -1 ) ? parseFloat( value.replace(/^.*,(.+)\)/, '$1') * 100 ) : 100,
2879 rgba = ( trans < 100 ) ? true : false;
2880
2881 return { value: value, transparent: trans, rgba: rgba };
2882
2883 };
2884
2885 $.fn.adminify_color = function() {
2886 return this.each( function() {
2887
2888 var $input = $(this),
2889 picker_color = ADMINIFY.funcs.parse_color( $input.val() ),
2890 palette_color = window.adminify_vars.color_palette.length ? window.adminify_vars.color_palette : true,
2891 $container;
2892
2893 // Destroy and Reinit
2894 if ( $input.hasClass('wp-color-picker') ) {
2895 $input.closest('.wp-picker-container').after($input).remove();
2896 }
2897
2898 $input.wpColorPicker({
2899 palettes: palette_color,
2900 change: function( event, ui ) {
2901
2902 var ui_color_value = ui.color.toString();
2903
2904 $container.removeClass('adminify--transparent-active');
2905 $container.find('.adminify--transparent-offset').css('background-color', ui_color_value);
2906 $input.val(ui_color_value).trigger('change');
2907
2908 },
2909 create: function() {
2910
2911 $container = $input.closest('.wp-picker-container');
2912
2913 var a8cIris = $input.data('a8cIris'),
2914 $transparent_wrap = $('<div class="adminify--transparent-wrap">' +
2915 '<div class="adminify--transparent-slider"></div>' +
2916 '<div class="adminify--transparent-offset"></div>' +
2917 '<div class="adminify--transparent-text"></div>' +
2918 '<div class="adminify--transparent-button">transparent <i class="fas fa-toggle-off"></i></div>' +
2919 '</div>').appendTo( $container.find('.wp-picker-holder') ),
2920 $transparent_slider = $transparent_wrap.find('.adminify--transparent-slider'),
2921 $transparent_text = $transparent_wrap.find('.adminify--transparent-text'),
2922 $transparent_offset = $transparent_wrap.find('.adminify--transparent-offset'),
2923 $transparent_button = $transparent_wrap.find('.adminify--transparent-button');
2924
2925 if ( $input.val() === 'transparent' ) {
2926 $container.addClass('adminify--transparent-active');
2927 }
2928
2929 $transparent_button.on('click', function() {
2930 if ( $input.val() !== 'transparent' ) {
2931 $input.val('transparent').trigger('change').removeClass('iris-error');
2932 $container.addClass('adminify--transparent-active');
2933 } else {
2934 $input.val( a8cIris._color.toString() ).trigger('change');
2935 $container.removeClass('adminify--transparent-active');
2936 }
2937 });
2938
2939 $transparent_slider.slider({
2940 value: picker_color.transparent,
2941 step: 1,
2942 min: 0,
2943 max: 100,
2944 slide: function( event, ui ) {
2945
2946 var slide_value = parseFloat( ui.value / 100 );
2947 a8cIris._color._alpha = slide_value;
2948 $input.wpColorPicker( 'color', a8cIris._color.toString() );
2949 $transparent_text.text( ( slide_value === 1 || slide_value === 0 ? '' : slide_value ) );
2950
2951 },
2952 create: function() {
2953
2954 var slide_value = parseFloat( picker_color.transparent / 100 ),
2955 text_value = slide_value < 1 ? slide_value : '';
2956
2957 $transparent_text.text(text_value);
2958 $transparent_offset.css('background-color', picker_color.value);
2959
2960 $container.on('click', '.wp-picker-clear', function() {
2961
2962 a8cIris._color._alpha = 1;
2963 $transparent_text.text('');
2964 $transparent_slider.slider('option', 'value', 100);
2965 $container.removeClass('adminify--transparent-active');
2966 $input.trigger('change');
2967
2968 });
2969
2970 $container.on('click', '.wp-picker-default', function() {
2971
2972 var default_color = ADMINIFY.funcs.parse_color( $input.data('default-color') ),
2973 default_value = parseFloat( default_color.transparent / 100 ),
2974 default_text = default_value < 1 ? default_value : '';
2975
2976 a8cIris._color._alpha = default_value;
2977 $transparent_text.text(default_text);
2978 $transparent_slider.slider('option', 'value', default_color.transparent);
2979
2980 if ( default_color.value === 'transparent' ) {
2981 $input.removeClass('iris-error');
2982 $container.addClass('adminify--transparent-active');
2983 }
2984
2985 });
2986
2987 }
2988 });
2989 }
2990 });
2991
2992 });
2993 };
2994
2995 //
2996 // ChosenJS
2997 //
2998 $.fn.adminify_chosen = function() {
2999 return this.each( function() {
3000
3001 var $this = $(this),
3002 $inited = $this.parent().find('.chosen-container'),
3003 is_sortable = $this.hasClass('adminify-chosen-sortable') || false,
3004 is_ajax = $this.hasClass('adminify-chosen-ajax') || false,
3005 is_multiple = $this.attr('multiple') || false,
3006 set_width = is_multiple ? '100%' : 'auto',
3007 set_options = $.extend({
3008 allow_single_deselect: true,
3009 disable_search_threshold: 10,
3010 width: set_width,
3011 no_results_text: window.adminify_vars.i18n.no_results_text,
3012 }, $this.data('chosen-settings'));
3013
3014 if ( $inited.length ) {
3015 $inited.remove();
3016 }
3017
3018 // Chosen ajax
3019 if ( is_ajax ) {
3020
3021 var set_ajax_options = $.extend({
3022 data: {
3023 type: 'post',
3024 nonce: '',
3025 },
3026 allow_single_deselect: true,
3027 disable_search_threshold: -1,
3028 width: '100%',
3029 min_length: 3,
3030 type_delay: 500,
3031 typing_text: window.adminify_vars.i18n.typing_text,
3032 searching_text: window.adminify_vars.i18n.searching_text,
3033 no_results_text: window.adminify_vars.i18n.no_results_text,
3034 }, $this.data('chosen-settings'));
3035
3036 $this.ADMINIFYAjaxChosen(set_ajax_options);
3037
3038 } else {
3039
3040 $this.chosen(set_options);
3041
3042 }
3043
3044 // Chosen keep options order
3045 if ( is_multiple ) {
3046
3047 var $hidden_select = $this.parent().find('.adminify-hide-select');
3048 var $hidden_value = $hidden_select.val() || [];
3049
3050 $this.on('change', function(obj, result) {
3051
3052 if ( result && result.selected ) {
3053 $hidden_select.append( '<option value="'+ result.selected +'" selected="selected">'+ result.selected +'</option>' );
3054 } else if ( result && result.deselected ) {
3055 $hidden_select.find('option[value="'+ result.deselected +'"]').remove();
3056 }
3057
3058 // Force customize refresh
3059 if ( window.wp.customize !== undefined && $hidden_select.children().length === 0 && $hidden_select.data('customize-setting-link') ) {
3060 window.wp.customize.control( $hidden_select.data('customize-setting-link') ).setting.set('');
3061 }
3062
3063 $hidden_select.trigger('change');
3064
3065 });
3066
3067 // Chosen order abstract
3068 $this.ADMINIFYChosenOrder($hidden_value, true);
3069
3070 }
3071
3072 // Chosen sortable
3073 if ( is_sortable ) {
3074
3075 var $chosen_container = $this.parent().find('.chosen-container');
3076 var $chosen_choices = $chosen_container.find('.chosen-choices');
3077
3078 $chosen_choices.bind('mousedown', function( event ) {
3079 if ( $(event.target).is('span') ) {
3080 event.stopPropagation();
3081 }
3082 });
3083
3084 $chosen_choices.sortable({
3085 items: 'li:not(.search-field)',
3086 helper: 'orginal',
3087 cursor: 'move',
3088 placeholder: 'search-choice-placeholder',
3089 start: function(e,ui) {
3090 ui.placeholder.width( ui.item.innerWidth() );
3091 ui.placeholder.height( ui.item.innerHeight() );
3092 },
3093 update: function( e, ui ) {
3094
3095 var select_options = '';
3096 var chosen_object = $this.data('chosen');
3097 var $prev_select = $this.parent().find('.adminify-hide-select');
3098
3099 $chosen_choices.find('.search-choice-close').each( function() {
3100 var option_array_index = $(this).data('option-array-index');
3101 $.each(chosen_object.results_data, function(index, data) {
3102 if ( data.array_index === option_array_index ){
3103 select_options += '<option value="'+ data.value +'" selected>'+ data.value +'</option>';
3104 }
3105 });
3106 });
3107
3108 $prev_select.children().remove();
3109 $prev_select.append(select_options);
3110 $prev_select.trigger('change');
3111
3112 }
3113 });
3114
3115 }
3116
3117 });
3118 };
3119
3120 //
3121 // Helper Checkbox Checker
3122 //
3123 $.fn.adminify_checkbox = function() {
3124 return this.each( function() {
3125
3126 var $this = $(this),
3127 $input = $this.find('.adminify--input'),
3128 $checkbox = $this.find('.adminify--checkbox');
3129
3130 $checkbox.on('click', function() {
3131 $input.val( Number( $checkbox.prop('checked') ) ).trigger('change');
3132 });
3133
3134 });
3135 };
3136
3137 //
3138 // Siblings
3139 //
3140 $.fn.adminify_siblings = function() {
3141 return this.each( function() {
3142
3143 var $this = $(this),
3144 $siblings = $this.find('.adminify--sibling'),
3145 multiple = $this.data('multiple') || false;
3146
3147 $siblings.on('click', function() {
3148
3149 var $sibling = $(this);
3150
3151 if ( multiple ) {
3152
3153 if ( $sibling.hasClass('adminify--active') ) {
3154 $sibling.removeClass('adminify--active');
3155 $sibling.find('input').prop('checked', false).trigger('change');
3156 } else {
3157 $sibling.addClass('adminify--active');
3158 $sibling.find('input').prop('checked', true).trigger('change');
3159 }
3160
3161 } else {
3162
3163 $this.find('input').prop('checked', false);
3164 $sibling.find('input').prop('checked', true).trigger('change');
3165 $sibling.addClass('adminify--active').siblings().removeClass('adminify--active');
3166
3167 }
3168
3169 });
3170
3171 });
3172 };
3173
3174 //
3175 // Help Tooltip
3176 //
3177 $.fn.adminify_help = function() {
3178 return this.each( function() {
3179
3180 var $this = $(this),
3181 $tooltip,
3182 offset_left;
3183
3184 $this.on({
3185 mouseenter: function() {
3186
3187 $tooltip = $( '<div class="adminify-tooltip"></div>' ).html( $this.find('.adminify-help-text').html() ).appendTo('body');
3188 offset_left = ( ADMINIFY.vars.is_rtl ) ? ( $this.offset().left + 24 ) : ( $this.offset().left - $tooltip.outerWidth() );
3189
3190 $tooltip.css({
3191 top: $this.offset().top - ( ( $tooltip.outerHeight() / 2 ) - 14 ),
3192 left: offset_left,
3193 });
3194
3195 },
3196 mouseleave: function() {
3197
3198 if ( $tooltip !== undefined ) {
3199 $tooltip.remove();
3200 }
3201
3202 }
3203
3204 });
3205
3206 });
3207 };
3208
3209 //
3210 // Customize Refresh
3211 //
3212 $.fn.adminify_customizer_refresh = function() {
3213 return this.each( function() {
3214
3215 var $this = $(this),
3216 $complex = $this.closest('.adminify-customize-complex');
3217
3218 if ( $complex.length ) {
3219
3220 var unique_id = $complex.data('unique-id');
3221
3222 if ( unique_id === undefined ) {
3223 return;
3224 }
3225
3226 var $input = $complex.find(':input'),
3227 option_id = $complex.data('option-id'),
3228 obj = $input.serializeObjectADMINIFY(),
3229 data = ( ! $.isEmptyObject(obj) && obj[unique_id] && obj[unique_id][option_id] ) ? obj[unique_id][option_id] : '',
3230 control = window.wp.customize.control(unique_id +'['+ option_id +']');
3231
3232 // clear the value to force refresh.
3233 control.setting._value = null;
3234
3235 control.setting.set( data );
3236
3237 } else {
3238
3239 $this.find(':input').first().trigger('change');
3240
3241 }
3242
3243 $(document).trigger('adminify-customizer-refresh', $this);
3244
3245 });
3246 };
3247
3248 //
3249 // Customize Listen Form Elements
3250 //
3251 $.fn.adminify_customizer_listen = function( options ) {
3252
3253 var settings = $.extend({
3254 closest: false,
3255 }, options );
3256
3257 return this.each( function() {
3258
3259 if ( window.wp.customize === undefined ) { return; }
3260
3261 var $this = ( settings.closest ) ? $(this).closest('.adminify-customize-complex') : $(this),
3262 $input = $this.find(':input'),
3263 unique_id = $this.data('unique-id'),
3264 option_id = $this.data('option-id');
3265
3266 if ( unique_id === undefined ) {
3267 return;
3268 }
3269
3270 $input.on('change keyup adminify.change', function() {
3271
3272 var obj = $this.find(':input').serializeObjectADMINIFY();
3273 var val = ( !$.isEmptyObject(obj) && obj[unique_id] && obj[unique_id][option_id] ) ? obj[unique_id][option_id] : '';
3274
3275 window.wp.customize.control( unique_id +'['+ option_id +']' ).setting.set( val );
3276
3277 });
3278
3279 });
3280 };
3281
3282 //
3283 // Customizer Listener for Reload JS
3284 //
3285 $(document).on('expanded', '.control-section', function() {
3286
3287 var $this = $(this);
3288
3289 if ( $this.hasClass('open') && !$this.data('inited') ) {
3290
3291 var $fields = $this.find('.adminify-customize-field');
3292 var $complex = $this.find('.adminify-customize-complex');
3293
3294 if ( $fields.length ) {
3295 $this.adminify_dependency();
3296 $fields.adminify_reload_script({dependency: false});
3297 $complex.adminify_customizer_listen();
3298 }
3299
3300 $this.data('inited', true);
3301
3302 }
3303
3304 });
3305
3306 //
3307 // Window on resize
3308 //
3309 ADMINIFY.vars.$window.on('resize adminify.resize', ADMINIFY.helper.debounce( function( event ) {
3310
3311 var window_width = navigator.userAgent.indexOf('AppleWebKit/') > -1 ? ADMINIFY.vars.$window.width() : window.innerWidth;
3312
3313 if ( window_width <= 782 && !ADMINIFY.vars.onloaded ) {
3314 $('.adminify-section').adminify_reload_script();
3315 ADMINIFY.vars.onloaded = true;
3316 }
3317
3318 }, 200)).trigger('adminify.resize');
3319
3320 //
3321 // Widgets Framework
3322 //
3323 $.fn.adminify_widgets = function() {
3324 return this.each( function() {
3325
3326 $(document).on('widget-added widget-updated', function( event, $widget ) {
3327
3328 var $fields = $widget.find('.adminify-fields');
3329
3330 if ( $fields.length ) {
3331 $fields.adminify_reload_script();
3332 }
3333
3334 });
3335
3336 $(document).on('click', '.widget-top', function( event ) {
3337
3338 var $fields = $(this).parent().find('.adminify-fields');
3339
3340 if ( $fields.length ) {
3341 $fields.adminify_reload_script();
3342 }
3343
3344 });
3345
3346 $('.widgets-sortables, .control-section-sidebar').on('sortstop', function( event, ui ) {
3347 ui.item.find('.adminify-fields').adminify_reload_script_retry();
3348 });
3349
3350 });
3351 };
3352
3353 //
3354 // Nav Menu Options Framework
3355 //
3356 $.fn.adminify_nav_menu = function() {
3357 return this.each( function() {
3358
3359 var $navmenu = $(this);
3360
3361 $navmenu.on('click', 'a.item-edit', function() {
3362 $(this).closest('li.menu-item').find('.adminify-fields').adminify_reload_script();
3363 });
3364
3365 $navmenu.on('sortstop', function( event, ui ) {
3366 ui.item.find('.adminify-fields').adminify_reload_script_retry();
3367 });
3368
3369 });
3370 };
3371
3372 //
3373 // Retry Plugins
3374 //
3375 $.fn.adminify_reload_script_retry = function() {
3376 return this.each( function() {
3377
3378 var $this = $(this);
3379
3380 if ( $this.data('inited') ) {
3381 $this.children('.adminify-field-wp_editor').adminify_field_wp_editor();
3382 }
3383
3384 });
3385 };
3386
3387 //
3388 // Reload Plugins
3389 //
3390 $.fn.adminify_reload_script = function( options ) {
3391
3392 var settings = $.extend({
3393 dependency: true,
3394 }, options );
3395
3396 return this.each( function() {
3397
3398 var $this = $(this);
3399
3400 // Avoid for conflicts
3401 if ( !$this.data('inited') ) {
3402
3403 // Field plugins
3404 $this.children('.adminify-field-accordion').adminify_field_accordion();
3405 $this.children('.adminify-field-backup').adminify_field_backup();
3406 $this.children('.adminify-field-background').adminify_field_background();
3407 $this.children('.adminify-field-code_editor').adminify_field_code_editor();
3408 $this.children('.adminify-field-date').adminify_field_date();
3409 $this.children('.adminify-field-datetime').adminify_field_datetime();
3410 $this.children('.adminify-field-fieldset').adminify_field_fieldset();
3411 $this.children('.adminify-field-gallery').adminify_field_gallery();
3412 $this.children('.adminify-field-group').adminify_field_group();
3413 $this.children('.adminify-field-icon').adminify_field_icon();
3414 $this.children('.adminify-field-link').adminify_field_link();
3415 $this.children('.adminify-field-media').adminify_field_media();
3416 $this.children('.adminify-field-map').adminify_field_map();
3417 $this.children('.adminify-field-repeater').adminify_field_repeater();
3418 $this.children('.adminify-field-slider').adminify_field_slider();
3419 $this.children('.adminify-field-sortable').adminify_field_sortable();
3420 $this.children('.adminify-field-sorter').adminify_field_sorter();
3421 $this.children('.adminify-field-spinner').adminify_field_spinner();
3422 $this.children('.adminify-field-switcher').adminify_field_switcher();
3423 $this.children('.adminify-field-tabbed').adminify_field_tabbed();
3424 $this.children('.adminify-field-typography').adminify_field_typography();
3425 $this.children('.adminify-field-upload').adminify_field_upload();
3426 $this.children('.adminify-field-wp_editor').adminify_field_wp_editor();
3427
3428 // Field colors
3429 $this.children('.adminify-field-border').find('.adminify-color').adminify_color();
3430 $this.children('.adminify-field-background').find('.adminify-color').adminify_color();
3431 $this.children('.adminify-field-color').find('.adminify-color').adminify_color();
3432 $this.children('.adminify-field-color_group').find('.adminify-color').adminify_color();
3433 $this.children('.adminify-field-link_color').find('.adminify-color').adminify_color();
3434 $this.children('.adminify-field-typography').find('.adminify-color').adminify_color();
3435
3436 // Field chosenjs
3437 $this.children('.adminify-field-select').find('.adminify-chosen').adminify_chosen();
3438
3439 // Field Checkbox
3440 $this.children('.adminify-field-checkbox').find('.adminify-checkbox').adminify_checkbox();
3441
3442 // Field Siblings
3443 $this.children('.adminify-field-button_set').find('.adminify-siblings').adminify_siblings();
3444 $this.children('.adminify-field-image_select').find('.adminify-siblings').adminify_siblings();
3445 $this.children('.adminify-field-palette').find('.adminify-siblings').adminify_siblings();
3446
3447 // Help Tooptip
3448 $this.children('.adminify-field').find('.adminify-help').adminify_help();
3449
3450 if ( settings.dependency ) {
3451 $this.adminify_dependency();
3452 }
3453
3454 $this.data('inited', true);
3455
3456 $(document).trigger('adminify-reload-script', $this);
3457
3458 }
3459
3460 });
3461 };
3462
3463 //
3464 // Document ready and run scripts
3465 //
3466 $(document).ready( function() {
3467
3468 $('.adminify-save').adminify_save();
3469 $('.adminify-options').adminify_options();
3470 $('.adminify-sticky-header').adminify_sticky();
3471 $('.adminify-nav-options').adminify_nav_options();
3472 $('.adminify-nav-metabox').adminify_nav_metabox();
3473 $('.adminify-taxonomy').adminify_taxonomy();
3474 $('.adminify-page-templates').adminify_page_templates();
3475 $('.adminify-post-formats').adminify_post_formats();
3476 $('.adminify-shortcode').adminify_shortcode();
3477 $('.adminify-search').adminify_search();
3478 $('.adminify-confirm').adminify_confirm();
3479 $('.adminify-expand-all').adminify_expand_all();
3480 $('.adminify-onload').adminify_reload_script();
3481 $('#widgets-editor').adminify_widgets();
3482 $('#widgets-right').adminify_widgets();
3483 $('#menu-to-edit').adminify_nav_menu();
3484
3485 });
3486
3487 })( jQuery, window, document );
3488