PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 2.0.4
Adminify – White Label, Admin Menu Editor, Login Customizer v2.0.4
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 / lib / adminify-framework / assets / js / main.js

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

3,456 lines 99.5 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 field_id = $wrapper.data('field-id'),
825 is_number = Boolean( Number( $wrapper.data('title-number') ) ),
826 max = parseInt( $wrapper.data('max') ),
827 min = parseInt( $wrapper.data('min') );
828
829 // clear accordion arrows if multi-instance
830 if ( $wrapper.hasClass('ui-accordion') ) {
831 $wrapper.find('.ui-accordion-header-icon').remove();
832 }
833
834 var update_title_numbers = function( $selector ) {
835 $selector.find('.adminify-cloneable-title-number').each( function( index ) {
836 $(this).html( ( $(this).closest('.adminify-cloneable-item').index()+1 ) + '.' );
837 });
838 };
839
840 $wrapper.accordion({
841 header: '> .adminify-cloneable-item > .adminify-cloneable-title',
842 collapsible : true,
843 active: false,
844 animate: false,
845 heightStyle: 'content',
846 icons: {
847 'header': 'adminify-cloneable-header-icon fas fa-angle-right',
848 'activeHeader': 'adminify-cloneable-header-icon fas fa-angle-down'
849 },
850 activate: function( event, ui ) {
851
852 var $panel = ui.newPanel;
853 var $header = ui.newHeader;
854
855 if ( $panel.length && !$panel.data( 'opened' ) ) {
856
857 var $fields = $panel.children();
858 var $first = $fields.first().find(':input').first();
859 var $title = $header.find('.adminify-cloneable-value');
860
861 $first.on('change keyup', function( event ) {
862 $title.text($first.val());
863 });
864
865 $panel.adminify_reload_script();
866 $panel.data( 'opened', true );
867 $panel.data( 'retry', false );
868
869 } else if ( $panel.data( 'retry' ) ) {
870
871 $panel.adminify_reload_script_retry();
872 $panel.data( 'retry', false );
873
874 }
875
876 }
877 });
878
879 $wrapper.sortable({
880 axis: 'y',
881 handle: '.adminify-cloneable-title,.adminify-cloneable-sort',
882 helper: 'original',
883 cursor: 'move',
884 placeholder: 'widget-placeholder',
885 start: function( event, ui ) {
886
887 $wrapper.accordion({ active:false });
888 $wrapper.sortable('refreshPositions');
889 ui.item.children('.adminify-cloneable-content').data('retry', true);
890
891 },
892 update: function( event, ui ) {
893
894 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-cloneable-item'), field_id );
895 $wrapper.adminify_customizer_refresh();
896
897 if ( is_number ) {
898 update_title_numbers($wrapper);
899 }
900
901 },
902 });
903
904 $group.children('.adminify-cloneable-add').on('click', function( e ) {
905
906 e.preventDefault();
907
908 var count = $wrapper.children('.adminify-cloneable-item').length;
909
910 $min.hide();
911
912 if ( max && (count+1) > max ) {
913 $max.show();
914 return;
915 }
916
917 var $cloned_item = $hidden.adminify_clone(true);
918
919 $cloned_item.removeClass('adminify-cloneable-hidden');
920
921 $cloned_item.find(':input[name!="_pseudo"]').each( function() {
922 this.name = this.name.replace( '___', '' ).replace( field_id +'[0]', field_id +'['+ count +']' );
923 });
924
925 $wrapper.append($cloned_item);
926 $wrapper.accordion('refresh');
927 $wrapper.accordion({active: count});
928 $wrapper.adminify_customizer_refresh();
929 $wrapper.adminify_customizer_listen({closest: true});
930
931 if ( is_number ) {
932 update_title_numbers($wrapper);
933 }
934
935 });
936
937 var event_clone = function( e ) {
938
939 e.preventDefault();
940
941 var count = $wrapper.children('.adminify-cloneable-item').length;
942
943 $min.hide();
944
945 if ( max && (count+1) > max ) {
946 $max.show();
947 return;
948 }
949
950 var $this = $(this),
951 $parent = $this.parent().parent(),
952 $cloned_helper = $parent.children('.adminify-cloneable-helper').adminify_clone(true),
953 $cloned_title = $parent.children('.adminify-cloneable-title').adminify_clone(),
954 $cloned_content = $parent.children('.adminify-cloneable-content').adminify_clone(),
955 $cloned_item = $('<div class="adminify-cloneable-item" />');
956
957 $cloned_item.append($cloned_helper);
958 $cloned_item.append($cloned_title);
959 $cloned_item.append($cloned_content);
960
961 $wrapper.children().eq($parent.index()).after($cloned_item);
962
963 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-cloneable-item'), field_id );
964
965 $wrapper.accordion('refresh');
966 $wrapper.adminify_customizer_refresh();
967 $wrapper.adminify_customizer_listen({closest: true});
968
969 if ( is_number ) {
970 update_title_numbers($wrapper);
971 }
972
973 };
974
975 $wrapper.children('.adminify-cloneable-item').children('.adminify-cloneable-helper').on('click', '.adminify-cloneable-clone', event_clone);
976 $group.children('.adminify-cloneable-hidden').children('.adminify-cloneable-helper').on('click', '.adminify-cloneable-clone', event_clone);
977
978 var event_remove = function( e ) {
979
980 e.preventDefault();
981
982 var count = $wrapper.children('.adminify-cloneable-item').length;
983
984 $max.hide();
985 $min.hide();
986
987 if ( min && (count-1) < min ) {
988 $min.show();
989 return;
990 }
991
992 $(this).closest('.adminify-cloneable-item').remove();
993
994 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-cloneable-item'), field_id );
995
996 $wrapper.adminify_customizer_refresh();
997
998 if ( is_number ) {
999 update_title_numbers($wrapper);
1000 }
1001
1002 };
1003
1004 $wrapper.children('.adminify-cloneable-item').children('.adminify-cloneable-helper').on('click', '.adminify-cloneable-remove', event_remove);
1005 $group.children('.adminify-cloneable-hidden').children('.adminify-cloneable-helper').on('click', '.adminify-cloneable-remove', event_remove);
1006
1007 });
1008 };
1009
1010 //
1011 // Field: icon
1012 //
1013 $.fn.adminify_field_icon = function() {
1014 return this.each( function() {
1015
1016 var $this = $(this);
1017
1018 $this.on('click', '.adminify-icon-add', function( e ) {
1019
1020 e.preventDefault();
1021
1022 var $button = $(this);
1023 var $modal = $('#adminify-modal-icon');
1024
1025 $modal.removeClass('hidden');
1026
1027 ADMINIFY.vars.$icon_target = $this;
1028
1029 if ( !ADMINIFY.vars.icon_modal_loaded ) {
1030
1031 $modal.find('.adminify-modal-loading').show();
1032
1033 window.wp.ajax.post( 'adminify-get-icons', {
1034 nonce: $button.data('nonce')
1035 }).done( function( response ) {
1036
1037 $modal.find('.adminify-modal-loading').hide();
1038
1039 ADMINIFY.vars.icon_modal_loaded = true;
1040
1041 var $load = $modal.find('.adminify-modal-load').html( response.content );
1042
1043 $load.on('click', 'i', function( e ) {
1044
1045 e.preventDefault();
1046
1047 var icon = $(this).attr('title');
1048
1049 ADMINIFY.vars.$icon_target.find('.adminify-icon-preview i').removeAttr('class').addClass(icon);
1050 ADMINIFY.vars.$icon_target.find('.adminify-icon-preview').removeClass('hidden');
1051 ADMINIFY.vars.$icon_target.find('.adminify-icon-remove').removeClass('hidden');
1052 ADMINIFY.vars.$icon_target.find('input').val(icon).trigger('change');
1053
1054 $modal.addClass('hidden');
1055
1056 });
1057
1058 $modal.on('change keyup', '.adminify-icon-search', function() {
1059
1060 var value = $(this).val(),
1061 $icons = $load.find('i');
1062
1063 $icons.each( function() {
1064
1065 var $elem = $(this);
1066
1067 if ( $elem.attr('title').search( new RegExp( value, 'i' ) ) < 0 ) {
1068 $elem.hide();
1069 } else {
1070 $elem.show();
1071 }
1072
1073 });
1074
1075 });
1076
1077 $modal.on('click', '.adminify-modal-close, .adminify-modal-overlay', function() {
1078 $modal.addClass('hidden');
1079 });
1080
1081 }).fail( function( response ) {
1082 $modal.find('.adminify-modal-loading').hide();
1083 $modal.find('.adminify-modal-load').html( response.error );
1084 $modal.on('click', function() {
1085 $modal.addClass('hidden');
1086 });
1087 });
1088 }
1089
1090 });
1091
1092 $this.on('click', '.adminify-icon-remove', function( e ) {
1093 e.preventDefault();
1094 $this.find('.adminify-icon-preview').addClass('hidden');
1095 $this.find('input').val('').trigger('change');
1096 $(this).addClass('hidden');
1097 });
1098
1099 });
1100 };
1101
1102 //
1103 // Field: map
1104 //
1105 $.fn.adminify_field_map = function() {
1106 return this.each( function() {
1107
1108 if ( typeof L === 'undefined' ) { return; }
1109
1110 var $this = $(this),
1111 $map = $this.find('.adminify--map-osm'),
1112 $search_input = $this.find('.adminify--map-search input'),
1113 $latitude = $this.find('.adminify--latitude'),
1114 $longitude = $this.find('.adminify--longitude'),
1115 $zoom = $this.find('.adminify--zoom'),
1116 map_data = $map.data( 'map' );
1117
1118 var mapInit = L.map( $map.get(0), map_data);
1119
1120 L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
1121 attribution: '&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'
1122 }).addTo(mapInit);
1123
1124 var mapMarker = L.marker(map_data.center,{draggable: true}).addTo(mapInit);
1125
1126 var update_latlng = function( data ) {
1127 $latitude.val( data.lat );
1128 $longitude.val( data.lng );
1129 $zoom.val( mapInit.getZoom() );
1130 };
1131
1132 mapInit.on( 'click', function ( data ) {
1133 mapMarker.setLatLng( data.latlng );
1134 update_latlng( data.latlng );
1135 });
1136
1137 mapInit.on( 'zoom', function () {
1138 update_latlng( mapMarker.getLatLng() );
1139 });
1140
1141 mapMarker.on( 'drag', function () {
1142 update_latlng( mapMarker.getLatLng() );
1143 });
1144
1145 if ( ! $search_input.length ) {
1146 $search_input = $( '[data-depend-id="'+ $this.find('.adminify--address-field').data( 'address-field' ) +'"]' );
1147 }
1148
1149 var cache = {};
1150
1151 $search_input.autocomplete({
1152 source: function ( request, response ) {
1153
1154 var term = request.term;
1155
1156 if ( term in cache ) {
1157 response( cache[term] );
1158 return;
1159 }
1160
1161 $.get( 'https://nominatim.openstreetmap.org/search', {
1162 format: 'json',
1163 q: term,
1164 }, function( results ) {
1165
1166 var data;
1167
1168 if ( results.length ) {
1169 data = results.map( function( item ) {
1170 return {
1171 value: item.display_name,
1172 label: item.display_name,
1173 lat: item.lat,
1174 lon: item.lon
1175 };
1176 }, 'json');
1177 } else {
1178 data = [{
1179 value: 'no-data',
1180 label: 'No Results.'
1181 }];
1182 }
1183
1184 cache[term] = data;
1185 response(data);
1186
1187 });
1188
1189 },
1190 select: function ( event, ui ) {
1191
1192 if ( ui.item.value === 'no-data' ) { return false; }
1193
1194 var latLng = L.latLng( ui.item.lat, ui.item.lon );
1195
1196 mapInit.panTo( latLng );
1197 mapMarker.setLatLng( latLng );
1198 update_latlng( latLng );
1199
1200 },
1201 create: function (event, ui) {
1202 $(this).autocomplete('widget').addClass('adminify-map-ui-autocomplate');
1203 }
1204 });
1205
1206 var input_update_latlng = function() {
1207
1208 var latLng = L.latLng( $latitude.val(), $longitude.val() );
1209
1210 mapInit.panTo( latLng );
1211 mapMarker.setLatLng( latLng );
1212
1213 };
1214
1215 $latitude.on('change', input_update_latlng );
1216 $longitude.on('change', input_update_latlng );
1217
1218 });
1219 };
1220
1221 //
1222 // Field: link
1223 //
1224 $.fn.adminify_field_link = function() {
1225 return this.each( function() {
1226
1227 var $this = $(this),
1228 $link = $this.find('.adminify--link'),
1229 $add = $this.find('.adminify--add'),
1230 $edit = $this.find('.adminify--edit'),
1231 $remove = $this.find('.adminify--remove'),
1232 $result = $this.find('.adminify--result'),
1233 uniqid = ADMINIFY.helper.uid('adminify-wplink-textarea-');
1234
1235 $add.on('click', function( e ) {
1236
1237 e.preventDefault();
1238
1239 window.wpLink.open(uniqid);
1240
1241 });
1242
1243 $edit.on('click', function( e ) {
1244
1245 e.preventDefault();
1246
1247 $add.trigger('click');
1248
1249 $('#wp-link-url').val($this.find('.adminify--url').val());
1250 $('#wp-link-text').val($this.find('.adminify--text').val());
1251 $('#wp-link-target').prop('checked', ($this.find('.adminify--target').val() === '_blank'));
1252
1253 });
1254
1255 $remove.on('click', function( e ) {
1256
1257 e.preventDefault();
1258
1259 $this.find('.adminify--url').val('').trigger('change');
1260 $this.find('.adminify--text').val('');
1261 $this.find('.adminify--target').val('');
1262
1263 $add.removeClass('hidden');
1264 $edit.addClass('hidden');
1265 $remove.addClass('hidden');
1266 $result.parent().addClass('hidden');
1267
1268 });
1269
1270 $link.attr('id', uniqid).on('change', function() {
1271
1272 var atts = window.wpLink.getAttrs(),
1273 href = atts.href,
1274 text = $('#wp-link-text').val(),
1275 target = ( atts.target ) ? atts.target : '';
1276
1277 $this.find('.adminify--url').val(href).trigger('change');
1278 $this.find('.adminify--text').val(text);
1279 $this.find('.adminify--target').val(target);
1280
1281 $result.html('{url:"'+href+'", text:"'+text+'", target:"'+target+'"}');
1282
1283 $add.addClass('hidden');
1284 $edit.removeClass('hidden');
1285 $remove.removeClass('hidden');
1286 $result.parent().removeClass('hidden');
1287
1288 });
1289
1290 });
1291
1292 };
1293
1294 //
1295 // Field: media
1296 //
1297 $.fn.adminify_field_media = function() {
1298 return this.each( function() {
1299
1300 var $this = $(this),
1301 $upload_button = $this.find('.adminify--button'),
1302 $remove_button = $this.find('.adminify--remove'),
1303 $library = $upload_button.data('library') && $upload_button.data('library').split(',') || '',
1304 $auto_attributes = ( $this.hasClass('adminify-assign-field-background') ) ? $this.closest('.adminify-field-background').find('.adminify--auto-attributes') : false,
1305 wp_media_frame;
1306
1307 $upload_button.on('click', function( e ) {
1308
1309 e.preventDefault();
1310
1311 if ( typeof window.wp === 'undefined' || ! window.wp.media || ! window.wp.media.gallery ) {
1312 return;
1313 }
1314
1315 if ( wp_media_frame ) {
1316 wp_media_frame.open();
1317 return;
1318 }
1319
1320 wp_media_frame = window.wp.media({
1321 library: {
1322 type: $library
1323 }
1324 });
1325
1326 wp_media_frame.on( 'select', function() {
1327
1328 var thumbnail;
1329 var attributes = wp_media_frame.state().get('selection').first().attributes;
1330 var preview_size = $upload_button.data('preview-size') || 'thumbnail';
1331
1332 if ( $library.length && $library.indexOf(attributes.subtype) === -1 && $library.indexOf(attributes.type) === -1 ) {
1333 return;
1334 }
1335
1336 $this.find('.adminify--id').val( attributes.id );
1337 $this.find('.adminify--width').val( attributes.width );
1338 $this.find('.adminify--height').val( attributes.height );
1339 $this.find('.adminify--alt').val( attributes.alt );
1340 $this.find('.adminify--title').val( attributes.title );
1341 $this.find('.adminify--description').val( attributes.description );
1342
1343 if ( typeof attributes.sizes !== 'undefined' && typeof attributes.sizes.thumbnail !== 'undefined' && preview_size === 'thumbnail' ) {
1344 thumbnail = attributes.sizes.thumbnail.url;
1345 } else if ( typeof attributes.sizes !== 'undefined' && typeof attributes.sizes.full !== 'undefined' ) {
1346 thumbnail = attributes.sizes.full.url;
1347 } else if ( attributes.type === 'image' ) {
1348 thumbnail = attributes.url;
1349 } else {
1350 thumbnail = attributes.icon;
1351 }
1352
1353 console.log(attributes);
1354
1355 if ( $auto_attributes ) {
1356 $auto_attributes.removeClass('adminify--attributes-hidden');
1357 }
1358
1359 $remove_button.removeClass('hidden');
1360
1361 $this.find('.adminify--preview').removeClass('hidden');
1362 $this.find('.adminify--src').attr('src', thumbnail);
1363 $this.find('.adminify--thumbnail').val( thumbnail );
1364 $this.find('.adminify--url').val( attributes.url ).trigger('change');
1365
1366 });
1367
1368 wp_media_frame.open();
1369
1370 });
1371
1372 $remove_button.on('click', function( e ) {
1373
1374 e.preventDefault();
1375
1376 if ( $auto_attributes ) {
1377 $auto_attributes.addClass('adminify--attributes-hidden');
1378 }
1379
1380 $remove_button.addClass('hidden');
1381 $this.find('input').val('');
1382 $this.find('.adminify--preview').addClass('hidden');
1383 $this.find('.adminify--url').trigger('change');
1384
1385 });
1386
1387 });
1388
1389 };
1390
1391 //
1392 // Field: repeater
1393 //
1394 $.fn.adminify_field_repeater = function() {
1395 return this.each( function() {
1396
1397 var $this = $(this),
1398 $fieldset = $this.children('.adminify-fieldset'),
1399 $repeater = $fieldset.length ? $fieldset : $this,
1400 $wrapper = $repeater.children('.adminify-repeater-wrapper'),
1401 $hidden = $repeater.children('.adminify-repeater-hidden'),
1402 $max = $repeater.children('.adminify-repeater-max'),
1403 $min = $repeater.children('.adminify-repeater-min'),
1404 field_id = $wrapper.data('field-id'),
1405 max = parseInt( $wrapper.data('max') ),
1406 min = parseInt( $wrapper.data('min') );
1407
1408 $wrapper.children('.adminify-repeater-item').children('.adminify-repeater-content').adminify_reload_script();
1409
1410 $wrapper.sortable({
1411 axis: 'y',
1412 handle: '.adminify-repeater-sort',
1413 helper: 'original',
1414 cursor: 'move',
1415 placeholder: 'widget-placeholder',
1416 update: function( event, ui ) {
1417
1418 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-repeater-item'), field_id );
1419 $wrapper.adminify_customizer_refresh();
1420 ui.item.adminify_reload_script_retry();
1421
1422 }
1423 });
1424
1425 $repeater.children('.adminify-repeater-add').on('click', function( e ) {
1426
1427 e.preventDefault();
1428
1429 var count = $wrapper.children('.adminify-repeater-item').length;
1430
1431 $min.hide();
1432
1433 if ( max && (count+1) > max ) {
1434 $max.show();
1435 return;
1436 }
1437
1438 var $cloned_item = $hidden.adminify_clone(true);
1439
1440 $cloned_item.removeClass('adminify-repeater-hidden');
1441
1442 $cloned_item.find(':input[name!="_pseudo"]').each( function() {
1443 this.name = this.name.replace( '___', '' ).replace( field_id +'[0]', field_id +'['+ count +']' );
1444 });
1445
1446 $wrapper.append($cloned_item);
1447 $cloned_item.children('.adminify-repeater-content').adminify_reload_script();
1448 $wrapper.adminify_customizer_refresh();
1449 $wrapper.adminify_customizer_listen({closest: true});
1450
1451 });
1452
1453 var event_clone = function( e ) {
1454
1455 e.preventDefault();
1456
1457 var count = $wrapper.children('.adminify-repeater-item').length;
1458
1459 $min.hide();
1460
1461 if ( max && (count+1) > max ) {
1462 $max.show();
1463 return;
1464 }
1465
1466 var $this = $(this),
1467 $parent = $this.parent().parent().parent(),
1468 $cloned_content = $parent.children('.adminify-repeater-content').adminify_clone(),
1469 $cloned_helper = $parent.children('.adminify-repeater-helper').adminify_clone(true),
1470 $cloned_item = $('<div class="adminify-repeater-item" />');
1471
1472 $cloned_item.append($cloned_content);
1473 $cloned_item.append($cloned_helper);
1474
1475 $wrapper.children().eq($parent.index()).after($cloned_item);
1476
1477 $cloned_item.children('.adminify-repeater-content').adminify_reload_script();
1478
1479 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-repeater-item'), field_id );
1480
1481 $wrapper.adminify_customizer_refresh();
1482 $wrapper.adminify_customizer_listen({closest: true});
1483
1484 };
1485
1486 $wrapper.children('.adminify-repeater-item').children('.adminify-repeater-helper').on('click', '.adminify-repeater-clone', event_clone);
1487 $repeater.children('.adminify-repeater-hidden').children('.adminify-repeater-helper').on('click', '.adminify-repeater-clone', event_clone);
1488
1489 var event_remove = function( e ) {
1490
1491 e.preventDefault();
1492
1493 var count = $wrapper.children('.adminify-repeater-item').length;
1494
1495 $max.hide();
1496 $min.hide();
1497
1498 if ( min && (count-1) < min ) {
1499 $min.show();
1500 return;
1501 }
1502
1503 $(this).closest('.adminify-repeater-item').remove();
1504
1505 ADMINIFY.helper.name_nested_replace( $wrapper.children('.adminify-repeater-item'), field_id );
1506
1507 $wrapper.adminify_customizer_refresh();
1508
1509 };
1510
1511 $wrapper.children('.adminify-repeater-item').children('.adminify-repeater-helper').on('click', '.adminify-repeater-remove', event_remove);
1512 $repeater.children('.adminify-repeater-hidden').children('.adminify-repeater-helper').on('click', '.adminify-repeater-remove', event_remove);
1513
1514 });
1515 };
1516
1517 //
1518 // Field: slider
1519 //
1520 $.fn.adminify_field_slider = function() {
1521 return this.each( function() {
1522
1523 var $this = $(this),
1524 $input = $this.find('input'),
1525 $slider = $this.find('.adminify-slider-ui'),
1526 data = $input.data(),
1527 value = $input.val() || 0;
1528
1529 if ( $slider.hasClass('ui-slider') ) {
1530 $slider.empty();
1531 }
1532
1533 $slider.slider({
1534 range: 'min',
1535 value: value,
1536 min: data.min || 0,
1537 max: data.max || 100,
1538 step: data.step || 1,
1539 slide: function( e, o ) {
1540 $input.val( o.value ).trigger('change');
1541 }
1542 });
1543
1544 $input.on('keyup', function() {
1545 $slider.slider('value', $input.val());
1546 });
1547
1548 });
1549 };
1550
1551 //
1552 // Field: sortable
1553 //
1554 $.fn.adminify_field_sortable = function() {
1555 return this.each( function() {
1556
1557 var $sortable = $(this).find('.adminify-sortable');
1558
1559 $sortable.sortable({
1560 axis: 'y',
1561 helper: 'original',
1562 cursor: 'move',
1563 placeholder: 'widget-placeholder',
1564 update: function( event, ui ) {
1565 $sortable.adminify_customizer_refresh();
1566 }
1567 });
1568
1569 $sortable.find('.adminify-sortable-content').adminify_reload_script();
1570
1571 });
1572 };
1573
1574 //
1575 // Field: sorter
1576 //
1577 $.fn.adminify_field_sorter = function() {
1578 return this.each( function() {
1579
1580 var $this = $(this),
1581 $enabled = $this.find('.adminify-enabled'),
1582 $has_disabled = $this.find('.adminify-disabled'),
1583 $disabled = ( $has_disabled.length ) ? $has_disabled : false;
1584
1585 $enabled.sortable({
1586 connectWith: $disabled,
1587 placeholder: 'ui-sortable-placeholder',
1588 update: function( event, ui ) {
1589
1590 var $el = ui.item.find('input');
1591
1592 if ( ui.item.parent().hasClass('adminify-enabled') ) {
1593 $el.attr('name', $el.attr('name').replace('disabled', 'enabled'));
1594 } else {
1595 $el.attr('name', $el.attr('name').replace('enabled', 'disabled'));
1596 }
1597
1598 $this.adminify_customizer_refresh();
1599
1600 }
1601 });
1602
1603 if ( $disabled ) {
1604
1605 $disabled.sortable({
1606 connectWith: $enabled,
1607 placeholder: 'ui-sortable-placeholder',
1608 update: function( event, ui ) {
1609 $this.adminify_customizer_refresh();
1610 }
1611 });
1612
1613 }
1614
1615 });
1616 };
1617
1618 //
1619 // Field: spinner
1620 //
1621 $.fn.adminify_field_spinner = function() {
1622 return this.each( function() {
1623
1624 var $this = $(this),
1625 $input = $this.find('input'),
1626 $inited = $this.find('.ui-button'),
1627 data = $input.data();
1628
1629 if ( $inited.length ) {
1630 $inited.remove();
1631 }
1632
1633 $input.spinner({
1634 min: data.min || 0,
1635 max: data.max || 100,
1636 step: data.step || 1,
1637 create: function( event, ui ) {
1638 if ( data.unit ) {
1639 $input.after('<span class="ui-button adminify--unit">'+ data.unit +'</span>');
1640 }
1641 },
1642 spin: function (event, ui ) {
1643 $input.val(ui.value).trigger('change');
1644 }
1645 });
1646
1647 });
1648 };
1649
1650 //
1651 // Field: switcher
1652 //
1653 $.fn.adminify_field_switcher = function() {
1654 return this.each( function() {
1655
1656 var $switcher = $(this).find('.adminify--switcher');
1657
1658 $switcher.on('click', function() {
1659
1660 var value = 0;
1661 var $input = $switcher.find('input');
1662
1663 if ( $switcher.hasClass('adminify--active') ) {
1664 $switcher.removeClass('adminify--active');
1665 } else {
1666 value = 1;
1667 $switcher.addClass('adminify--active');
1668 }
1669
1670 $input.val(value).trigger('change');
1671
1672 });
1673
1674 });
1675 };
1676
1677 //
1678 // Field: tabbed
1679 //
1680 $.fn.adminify_field_tabbed = function() {
1681 return this.each( function() {
1682
1683 var $this = $(this),
1684 $links = $this.find('.adminify-tabbed-nav a'),
1685 $contents = $this.find('.adminify-tabbed-content');
1686
1687 $contents.eq(0).adminify_reload_script();
1688
1689 $links.on( 'click', function( e ) {
1690
1691 e.preventDefault();
1692
1693 var $link = $(this),
1694 index = $link.index(),
1695 $content = $contents.eq(index);
1696
1697 $link.addClass('adminify-tabbed-active').siblings().removeClass('adminify-tabbed-active');
1698 $content.adminify_reload_script();
1699 $content.removeClass('hidden').siblings().addClass('hidden');
1700
1701 });
1702
1703 });
1704 };
1705
1706 //
1707 // Field: typography
1708 //
1709 $.fn.adminify_field_typography = function() {
1710 return this.each(function () {
1711
1712 var base = this;
1713 var $this = $(this);
1714 var loaded_fonts = [];
1715 var webfonts = adminify_typography_json.webfonts;
1716 var googlestyles = adminify_typography_json.googlestyles;
1717 var defaultstyles = adminify_typography_json.defaultstyles;
1718
1719 //
1720 //
1721 // Sanitize google font subset
1722 base.sanitize_subset = function( subset ) {
1723 subset = subset.replace('-ext', ' Extended');
1724 subset = subset.charAt(0).toUpperCase() + subset.slice(1);
1725 return subset;
1726 };
1727
1728 //
1729 //
1730 // Sanitize google font styles (weight and style)
1731 base.sanitize_style = function( style ) {
1732 return googlestyles[style] ? googlestyles[style] : style;
1733 };
1734
1735 //
1736 //
1737 // Load google font
1738 base.load_google_font = function( font_family, weight, style ) {
1739
1740 if ( font_family && typeof WebFont === 'object' ) {
1741
1742 weight = weight ? weight.replace('normal', '') : '';
1743 style = style ? style.replace('normal', '') : '';
1744
1745 if ( weight || style ) {
1746 font_family = font_family +':'+ weight + style;
1747 }
1748
1749 if ( loaded_fonts.indexOf( font_family ) === -1 ) {
1750 WebFont.load({ google: { families: [font_family] } });
1751 }
1752
1753 loaded_fonts.push( font_family );
1754
1755 }
1756
1757 };
1758
1759 //
1760 //
1761 // Append select options
1762 base.append_select_options = function( $select, options, condition, type, is_multi ) {
1763
1764 $select.find('option').not(':first').remove();
1765
1766 var opts = '';
1767
1768 $.each( options, function( key, value ) {
1769
1770 var selected;
1771 var name = value;
1772
1773 // is_multi
1774 if ( is_multi ) {
1775 selected = ( condition && condition.indexOf(value) !== -1 ) ? ' selected' : '';
1776 } else {
1777 selected = ( condition && condition === value ) ? ' selected' : '';
1778 }
1779
1780 if ( type === 'subset' ) {
1781 name = base.sanitize_subset( value );
1782 } else if ( type === 'style' ){
1783 name = base.sanitize_style( value );
1784 }
1785
1786 opts += '<option value="'+ value +'"'+ selected +'>'+ name +'</option>';
1787
1788 });
1789
1790 $select.append(opts).trigger('adminify.change').trigger('chosen:updated');
1791
1792 };
1793
1794 base.init = function () {
1795
1796 //
1797 //
1798 // Constants
1799 var selected_styles = [];
1800 var $typography = $this.find('.adminify--typography');
1801 var $type = $this.find('.adminify--type');
1802 var $styles = $this.find('.adminify--block-font-style');
1803 var unit = $typography.data('unit');
1804 var line_height_unit = $typography.data('line-height-unit');
1805 var exclude_fonts = $typography.data('exclude') ? $typography.data('exclude').split(',') : [];
1806
1807 //
1808 //
1809 // Chosen init
1810 if ( $this.find('.adminify--chosen').length ) {
1811
1812 var $chosen_selects = $this.find('select');
1813
1814 $chosen_selects.each( function() {
1815
1816 var $chosen_select = $(this),
1817 $chosen_inited = $chosen_select.parent().find('.chosen-container');
1818
1819 if ( $chosen_inited.length ) {
1820 $chosen_inited.remove();
1821 }
1822
1823 $chosen_select.chosen({
1824 allow_single_deselect: true,
1825 disable_search_threshold: 15,
1826 width: '100%'
1827 });
1828
1829 });
1830
1831 }
1832
1833 //
1834 //
1835 // Font family select
1836 var $font_family_select = $this.find('.adminify--font-family');
1837 var first_font_family = $font_family_select.val();
1838
1839 // Clear default font family select options
1840 $font_family_select.find('option').not(':first-child').remove();
1841
1842 var opts = '';
1843
1844 $.each(webfonts, function( type, group ) {
1845
1846 // Check for exclude fonts
1847 if ( exclude_fonts && exclude_fonts.indexOf(type) !== -1 ) { return; }
1848
1849 opts += '<optgroup label="' + group.label + '">';
1850
1851 $.each(group.fonts, function( key, value ) {
1852
1853 // use key if value is object
1854 value = ( typeof value === 'object' ) ? key : value;
1855 var selected = ( value === first_font_family ) ? ' selected' : '';
1856 opts += '<option value="'+ value +'" data-type="'+ type +'"'+ selected +'>'+ value +'</option>';
1857
1858 });
1859
1860 opts += '</optgroup>';
1861
1862 });
1863
1864 // Append google font select options
1865 $font_family_select.append(opts).trigger('chosen:updated');
1866
1867 //
1868 //
1869 // Font style select
1870 var $font_style_block = $this.find('.adminify--block-font-style');
1871
1872 if ( $font_style_block.length ) {
1873
1874 var $font_style_select = $this.find('.adminify--font-style-select');
1875 var first_style_value = $font_style_select.val() ? $font_style_select.val().replace(/normal/g, '' ) : '';
1876
1877 //
1878 // Font Style on on change listener
1879 $font_style_select.on('change adminify.change', function( event ) {
1880
1881 var style_value = $font_style_select.val();
1882
1883 // set a default value
1884 if ( !style_value && selected_styles && selected_styles.indexOf('normal') === -1 ) {
1885 style_value = selected_styles[0];
1886 }
1887
1888 // set font weight, for eg. replacing 800italic to 800
1889 var font_normal = ( style_value && style_value !== 'italic' && style_value === 'normal' ) ? 'normal' : '';
1890 var font_weight = ( style_value && style_value !== 'italic' && style_value !== 'normal' ) ? style_value.replace('italic', '') : font_normal;
1891 var font_style = ( style_value && style_value.substr(-6) === 'italic' ) ? 'italic' : '';
1892
1893 $this.find('.adminify--font-weight').val( font_weight );
1894 $this.find('.adminify--font-style').val( font_style );
1895
1896 });
1897
1898 //
1899 //
1900 // Extra font style select
1901 var $extra_font_style_block = $this.find('.adminify--block-extra-styles');
1902
1903 if ( $extra_font_style_block.length ) {
1904 var $extra_font_style_select = $this.find('.adminify--extra-styles');
1905 var first_extra_style_value = $extra_font_style_select.val();
1906 }
1907
1908 }
1909
1910 //
1911 //
1912 // Subsets select
1913 var $subset_block = $this.find('.adminify--block-subset');
1914 if ( $subset_block.length ) {
1915 var $subset_select = $this.find('.adminify--subset');
1916 var first_subset_select_value = $subset_select.val();
1917 var subset_multi_select = $subset_select.data('multiple') || false;
1918 }
1919
1920 //
1921 //
1922 // Backup font family
1923 var $backup_font_family_block = $this.find('.adminify--block-backup-font-family');
1924
1925 //
1926 //
1927 // Font Family on Change Listener
1928 $font_family_select.on('change adminify.change', function( event ) {
1929
1930 // Hide subsets on change
1931 if ( $subset_block.length ) {
1932 $subset_block.addClass('hidden');
1933 }
1934
1935 // Hide extra font style on change
1936 if ( $extra_font_style_block.length ) {
1937 $extra_font_style_block.addClass('hidden');
1938 }
1939
1940 // Hide backup font family on change
1941 if ( $backup_font_family_block.length ) {
1942 $backup_font_family_block.addClass('hidden');
1943 }
1944
1945 var $selected = $font_family_select.find(':selected');
1946 var value = $selected.val();
1947 var type = $selected.data('type');
1948
1949 if ( type && value ) {
1950
1951 // Show backup fonts if font type google or custom
1952 if ( ( type === 'google' || type === 'custom' ) && $backup_font_family_block.length ) {
1953 $backup_font_family_block.removeClass('hidden');
1954 }
1955
1956 // Appending font style select options
1957 if ( $font_style_block.length ) {
1958
1959 // set styles for multi and normal style selectors
1960 var styles = defaultstyles;
1961
1962 // Custom or gogle font styles
1963 if ( type === 'google' && webfonts[type].fonts[value][0] ) {
1964 styles = webfonts[type].fonts[value][0];
1965 } else if ( type === 'custom' && webfonts[type].fonts[value] ) {
1966 styles = webfonts[type].fonts[value];
1967 }
1968
1969 selected_styles = styles;
1970
1971 // Set selected style value for avoid load errors
1972 var set_auto_style = ( styles.indexOf('normal') !== -1 ) ? 'normal' : styles[0];
1973 var set_style_value = ( first_style_value && styles.indexOf(first_style_value) !== -1 ) ? first_style_value : set_auto_style;
1974
1975 // Append style select options
1976 base.append_select_options( $font_style_select, styles, set_style_value, 'style' );
1977
1978 // Clear first value
1979 first_style_value = false;
1980
1981 // Show style select after appended
1982 $font_style_block.removeClass('hidden');
1983
1984 // Appending extra font style select options
1985 if ( type === 'google' && $extra_font_style_block.length && styles.length > 1 ) {
1986
1987 // Append extra-style select options
1988 base.append_select_options( $extra_font_style_select, styles, first_extra_style_value, 'style', true );
1989
1990 // Clear first value
1991 first_extra_style_value = false;
1992
1993 // Show style select after appended
1994 $extra_font_style_block.removeClass('hidden');
1995
1996 }
1997
1998 }
1999
2000 // Appending google fonts subsets select options
2001 if ( type === 'google' && $subset_block.length && webfonts[type].fonts[value][1] ) {
2002
2003 var subsets = webfonts[type].fonts[value][1];
2004 var set_auto_subset = ( subsets.length < 2 && subsets[0] !== 'latin' ) ? subsets[0] : '';
2005 var set_subset_value = ( first_subset_select_value && subsets.indexOf(first_subset_select_value) !== -1 ) ? first_subset_select_value : set_auto_subset;
2006
2007 // check for multiple subset select
2008 set_subset_value = ( subset_multi_select && first_subset_select_value ) ? first_subset_select_value : set_subset_value;
2009
2010 base.append_select_options( $subset_select, subsets, set_subset_value, 'subset', subset_multi_select );
2011
2012 first_subset_select_value = false;
2013
2014 $subset_block.removeClass('hidden');
2015
2016 }
2017
2018 } else {
2019
2020 // Clear Styles
2021 $styles.find(':input').val('');
2022
2023 // Clear subsets options if type and value empty
2024 if ( $subset_block.length ) {
2025 $subset_select.find('option').not(':first-child').remove();
2026 $subset_select.trigger('chosen:updated');
2027 }
2028
2029 // Clear font styles options if type and value empty
2030 if ( $font_style_block.length ) {
2031 $font_style_select.find('option').not(':first-child').remove();
2032 $font_style_select.trigger('chosen:updated');
2033 }
2034
2035 }
2036
2037 // Update font type input value
2038 $type.val(type);
2039
2040 }).trigger('adminify.change');
2041
2042 //
2043 //
2044 // Preview
2045 var $preview_block = $this.find('.adminify--block-preview');
2046
2047 if ( $preview_block.length ) {
2048
2049 var $preview = $this.find('.adminify--preview');
2050
2051 // Set preview styles on change
2052 $this.on('change', ADMINIFY.helper.debounce( function( event ) {
2053
2054 $preview_block.removeClass('hidden');
2055
2056 var font_family = $font_family_select.val(),
2057 font_weight = $this.find('.adminify--font-weight').val(),
2058 font_style = $this.find('.adminify--font-style').val(),
2059 font_size = $this.find('.adminify--font-size').val(),
2060 font_variant = $this.find('.adminify--font-variant').val(),
2061 line_height = $this.find('.adminify--line-height').val(),
2062 text_align = $this.find('.adminify--text-align').val(),
2063 text_transform = $this.find('.adminify--text-transform').val(),
2064 text_decoration = $this.find('.adminify--text-decoration').val(),
2065 text_color = $this.find('.adminify--color').val(),
2066 word_spacing = $this.find('.adminify--word-spacing').val(),
2067 letter_spacing = $this.find('.adminify--letter-spacing').val(),
2068 custom_style = $this.find('.adminify--custom-style').val(),
2069 type = $this.find('.adminify--type').val();
2070
2071 if ( type === 'google' ) {
2072 base.load_google_font(font_family, font_weight, font_style);
2073 }
2074
2075 var properties = {};
2076
2077 if ( font_family ) { properties.fontFamily = font_family; }
2078 if ( font_weight ) { properties.fontWeight = font_weight; }
2079 if ( font_style ) { properties.fontStyle = font_style; }
2080 if ( font_variant ) { properties.fontVariant = font_variant; }
2081 if ( font_size ) { properties.fontSize = font_size + unit; }
2082 if ( line_height ) { properties.lineHeight = line_height + line_height_unit; }
2083 if ( letter_spacing ) { properties.letterSpacing = letter_spacing + unit; }
2084 if ( word_spacing ) { properties.wordSpacing = word_spacing + unit; }
2085 if ( text_align ) { properties.textAlign = text_align; }
2086 if ( text_transform ) { properties.textTransform = text_transform; }
2087 if ( text_decoration ) { properties.textDecoration = text_decoration; }
2088 if ( text_color ) { properties.color = text_color; }
2089
2090 $preview.removeAttr('style');
2091
2092 // Customs style attribute
2093 if ( custom_style ) { $preview.attr('style', custom_style); }
2094
2095 $preview.css(properties);
2096
2097 }, 100 ) );
2098
2099 // Preview black and white backgrounds trigger
2100 $preview_block.on('click', function() {
2101
2102 $preview.toggleClass('adminify--black-background');
2103
2104 var $toggle = $preview_block.find('.adminify--toggle');
2105
2106 if ( $toggle.hasClass('fa-toggle-off') ) {
2107 $toggle.removeClass('fa-toggle-off').addClass('fa-toggle-on');
2108 } else {
2109 $toggle.removeClass('fa-toggle-on').addClass('fa-toggle-off');
2110 }
2111
2112 });
2113
2114 if ( !$preview_block.hasClass('hidden') ) {
2115 $this.trigger('change');
2116 }
2117
2118 }
2119
2120 };
2121
2122 base.init();
2123
2124 });
2125 };
2126
2127 //
2128 // Field: upload
2129 //
2130 $.fn.adminify_field_upload = function() {
2131 return this.each( function() {
2132
2133 var $this = $(this),
2134 $input = $this.find('input'),
2135 $upload_button = $this.find('.adminify--button'),
2136 $remove_button = $this.find('.adminify--remove'),
2137 $preview_wrap = $this.find('.adminify--preview'),
2138 $preview_src = $this.find('.adminify--src'),
2139 $library = $upload_button.data('library') && $upload_button.data('library').split(',') || '',
2140 wp_media_frame;
2141
2142 $upload_button.on('click', function( e ) {
2143
2144 e.preventDefault();
2145
2146 if ( typeof window.wp === 'undefined' || ! window.wp.media || ! window.wp.media.gallery ) {
2147 return;
2148 }
2149
2150 if ( wp_media_frame ) {
2151 wp_media_frame.open();
2152 return;
2153 }
2154
2155 wp_media_frame = window.wp.media({
2156 library: {
2157 type: $library
2158 },
2159 });
2160
2161 wp_media_frame.on( 'select', function() {
2162
2163 var src;
2164 var attributes = wp_media_frame.state().get('selection').first().attributes;
2165
2166 if ( $library.length && $library.indexOf(attributes.subtype) === -1 && $library.indexOf(attributes.type) === -1 ) {
2167 return;
2168 }
2169
2170 $input.val(attributes.url).trigger('change');
2171
2172 });
2173
2174 wp_media_frame.open();
2175
2176 });
2177
2178 $remove_button.on('click', function( e ) {
2179 e.preventDefault();
2180 $input.val('').trigger('change');
2181 });
2182
2183 $input.on('change', function( e ) {
2184
2185 var $value = $input.val();
2186
2187 if ( $value ) {
2188 $remove_button.removeClass('hidden');
2189 } else {
2190 $remove_button.addClass('hidden');
2191 }
2192
2193 if ( $preview_wrap.length ) {
2194
2195 if ( $.inArray( $value.split('.').pop().toLowerCase(), ['jpg', 'jpeg', 'gif', 'png', 'svg', 'webp'] ) !== -1 ) {
2196 $preview_wrap.removeClass('hidden');
2197 $preview_src.attr('src', $value);
2198 } else {
2199 $preview_wrap.addClass('hidden');
2200 }
2201
2202 }
2203
2204 });
2205
2206 });
2207
2208 };
2209
2210 //
2211 // Field: wp_editor
2212 //
2213 $.fn.adminify_field_wp_editor = function() {
2214 return this.each( function() {
2215
2216 if ( typeof window.wp.editor === 'undefined' || typeof window.tinyMCEPreInit === 'undefined' || typeof window.tinyMCEPreInit.mceInit.adminify_wp_editor === 'undefined' ) {
2217 return;
2218 }
2219
2220 var $this = $(this),
2221 $editor = $this.find('.adminify-wp-editor'),
2222 $textarea = $this.find('textarea');
2223
2224 // If there is wp-editor remove it for avoid dupliated wp-editor conflicts.
2225 var $has_wp_editor = $this.find('.wp-editor-wrap').length || $this.find('.mce-container').length;
2226
2227 if ( $has_wp_editor ) {
2228 $editor.empty();
2229 $editor.append($textarea);
2230 $textarea.css('display', '');
2231 }
2232
2233 // Generate a unique id
2234 var uid = ADMINIFY.helper.uid('adminify-editor-');
2235
2236 $textarea.attr('id', uid);
2237
2238 // Get default editor settings
2239 var default_editor_settings = {
2240 tinymce: window.tinyMCEPreInit.mceInit.adminify_wp_editor,
2241 quicktags: window.tinyMCEPreInit.qtInit.adminify_wp_editor
2242 };
2243
2244 // Get default editor settings
2245 var field_editor_settings = $editor.data('editor-settings');
2246
2247 // Callback for old wp editor
2248 var wpEditor = wp.oldEditor ? wp.oldEditor : wp.editor;
2249
2250 if ( wpEditor && wpEditor.hasOwnProperty('autop') ) {
2251 wp.editor.autop = wpEditor.autop;
2252 wp.editor.removep = wpEditor.removep;
2253 wp.editor.initialize = wpEditor.initialize;
2254 }
2255
2256 // Add on change event handle
2257 var editor_on_change = function( editor ) {
2258 editor.on('change keyup', function() {
2259 var value = ( field_editor_settings.wpautop ) ? editor.getContent() : wp.editor.removep(editor.getContent());
2260 $textarea.val(value).trigger('change');
2261 });
2262 };
2263
2264 // Extend editor selector and on change event handler
2265 default_editor_settings.tinymce = $.extend( {}, default_editor_settings.tinymce, { selector: '#'+ uid, setup: editor_on_change } );
2266
2267 // Override editor tinymce settings
2268 if ( field_editor_settings.tinymce === false ) {
2269 default_editor_settings.tinymce = false;
2270 $editor.addClass('adminify-no-tinymce');
2271 }
2272
2273 // Override editor quicktags settings
2274 if ( field_editor_settings.quicktags === false ) {
2275 default_editor_settings.quicktags = false;
2276 $editor.addClass('adminify-no-quicktags');
2277 }
2278
2279 // Wait until :visible
2280 var interval = setInterval(function () {
2281 if ( $this.is(':visible') ) {
2282 window.wp.editor.initialize(uid, default_editor_settings);
2283 clearInterval(interval);
2284 }
2285 });
2286
2287 // Add Media buttons
2288 if ( field_editor_settings.media_buttons && window.adminify_media_buttons ) {
2289
2290 var $editor_buttons = $editor.find('.wp-media-buttons');
2291
2292 if ( $editor_buttons.length ) {
2293
2294 $editor_buttons.find('.adminify-shortcode-button').data('editor-id', uid);
2295
2296 } else {
2297
2298 var $media_buttons = $(window.adminify_media_buttons);
2299
2300 $media_buttons.find('.adminify-shortcode-button').data('editor-id', uid);
2301
2302 $editor.prepend( $media_buttons );
2303
2304 }
2305
2306 }
2307
2308 });
2309
2310 };
2311
2312 //
2313 // Confirm
2314 //
2315 $.fn.adminify_confirm = function() {
2316 return this.each( function() {
2317 $(this).on('click', function( e ) {
2318
2319 var confirm_text = $(this).data('confirm') || window.adminify_vars.i18n.confirm;
2320 var confirm_answer = confirm( confirm_text );
2321
2322 if ( confirm_answer ) {
2323 ADMINIFY.vars.is_confirm = true;
2324 ADMINIFY.vars.form_modified = false;
2325 } else {
2326 e.preventDefault();
2327 return false;
2328 }
2329
2330 });
2331 });
2332 };
2333
2334 $.fn.serializeObject = function() {
2335
2336 var obj = {};
2337
2338 $.each( this.serializeArray(), function(i,o){
2339 var n = o.name,
2340 v = o.value;
2341
2342 obj[n] = obj[n] === undefined ? v
2343 : $.isArray( obj[n] ) ? obj[n].concat( v )
2344 : [ obj[n], v ];
2345 });
2346
2347 return obj;
2348
2349 };
2350
2351 //
2352 // Options Save
2353 //
2354 $.fn.adminify_save = function() {
2355 return this.each( function() {
2356
2357 var $this = $(this),
2358 $buttons = $('.adminify-save'),
2359 $panel = $('.adminify-options'),
2360 flooding = false,
2361 timeout;
2362
2363 $this.on('click', function( e ) {
2364
2365 if ( !flooding ) {
2366
2367 var $text = $this.data('save'),
2368 $value = $this.val();
2369
2370 $buttons.attr('value', $text);
2371
2372 if ( $this.hasClass('adminify-save-ajax') ) {
2373
2374 e.preventDefault();
2375
2376 $panel.addClass('adminify-saving');
2377 $buttons.prop('disabled', true);
2378
2379 window.wp.ajax.post( 'adminify_'+ $panel.data('unique') +'_ajax_save', {
2380 data: $('#adminify-form').serializeJSONADMINIFY()
2381 })
2382 .done( function( response ) {
2383
2384 // clear errors
2385 $('.adminify-error').remove();
2386
2387 if ( Object.keys( response.errors ).length ) {
2388
2389 var error_icon = '<i class="adminify-label-error adminify-error">!</i>';
2390
2391 $.each(response.errors, function( key, error_message ) {
2392
2393 var $field = $('[data-depend-id="'+ key +'"]'),
2394 $link = $('a[href="#tab='+ $field.closest('.adminify-section').data('section-id') +'"]' ),
2395 $tab = $link.closest('.adminify-tab-item');
2396
2397 $field.closest('.adminify-fieldset').append( '<p class="adminify-error adminify-error-text">'+ error_message +'</p>' );
2398
2399 if ( !$link.find('.adminify-error').length ) {
2400 $link.append( error_icon );
2401 }
2402
2403 if ( !$tab.find('.adminify-arrow .adminify-error').length ) {
2404 $tab.find('.adminify-arrow').append( error_icon );
2405 }
2406
2407 });
2408
2409 }
2410
2411 $panel.removeClass('adminify-saving');
2412 $buttons.prop('disabled', false).attr('value', $value);
2413 flooding = false;
2414
2415 ADMINIFY.vars.form_modified = false;
2416 ADMINIFY.vars.$form_warning.hide();
2417
2418 clearTimeout(timeout);
2419
2420 var $result_success = $('.adminify-form-success');
2421 $result_success.empty().append(response.notice).fadeIn('fast', function() {
2422 timeout = setTimeout( function() {
2423 $result_success.fadeOut('fast');
2424 }, 1000);
2425 });
2426
2427 })
2428 .fail( function( response ) {
2429 alert( response.error );
2430 });
2431
2432 } else {
2433
2434 ADMINIFY.vars.form_modified = false;
2435
2436 }
2437
2438 }
2439
2440 flooding = true;
2441
2442 });
2443
2444 });
2445 };
2446
2447 //
2448 // Option Framework
2449 //
2450 $.fn.adminify_options = function() {
2451 return this.each( function() {
2452
2453 var $this = $(this),
2454 $content = $this.find('.adminify-content'),
2455 $form_success = $this.find('.adminify-form-success'),
2456 $form_warning = $this.find('.adminify-form-warning'),
2457 $save_button = $this.find('.adminify-header .adminify-save');
2458
2459 ADMINIFY.vars.$form_warning = $form_warning;
2460
2461 // Shows a message white leaving theme options without saving
2462 if ( $form_warning.length ) {
2463
2464 window.onbeforeunload = function() {
2465 return ( ADMINIFY.vars.form_modified ) ? true : undefined;
2466 };
2467
2468 $content.on('change keypress', ':input', function() {
2469 if ( !ADMINIFY.vars.form_modified ) {
2470 $form_success.hide();
2471 $form_warning.fadeIn('fast');
2472 ADMINIFY.vars.form_modified = true;
2473 }
2474 });
2475
2476 }
2477
2478 if ( $form_success.hasClass('adminify-form-show') ) {
2479 setTimeout( function() {
2480 $form_success.fadeOut('fast');
2481 }, 1000);
2482 }
2483
2484 $(document).keydown(function (event) {
2485 if ( ( event.ctrlKey || event.metaKey ) && event.which === 83 ) {
2486 $save_button.trigger('click');
2487 event.preventDefault();
2488 return false;
2489 }
2490 });
2491
2492 });
2493 };
2494
2495 //
2496 // Taxonomy Framework
2497 //
2498 $.fn.adminify_taxonomy = function() {
2499 return this.each( function() {
2500
2501 var $this = $(this),
2502 $form = $this.parents('form');
2503
2504 if ( $form.attr('id') === 'addtag' ) {
2505
2506 var $submit = $form.find('#submit'),
2507 $cloned = $this.find('.adminify-field').adminify_clone();
2508
2509 $submit.on( 'click', function() {
2510
2511 if ( !$form.find('.form-required').hasClass('form-invalid') ) {
2512
2513 $this.data('inited', false);
2514
2515 $this.empty();
2516
2517 $this.html( $cloned );
2518
2519 $cloned = $cloned.adminify_clone();
2520
2521 $this.adminify_reload_script();
2522
2523 }
2524
2525 });
2526
2527 }
2528
2529 });
2530 };
2531
2532 //
2533 // Shortcode Framework
2534 //
2535 $.fn.adminify_shortcode = function() {
2536
2537 var base = this;
2538
2539 base.shortcode_parse = function( serialize, key ) {
2540
2541 var shortcode = '';
2542
2543 $.each(serialize, function( shortcode_key, shortcode_values ) {
2544
2545 key = ( key ) ? key : shortcode_key;
2546
2547 shortcode += '[' + key;
2548
2549 $.each(shortcode_values, function( shortcode_tag, shortcode_value ) {
2550
2551 if ( shortcode_tag === 'content' ) {
2552
2553 shortcode += ']';
2554 shortcode += shortcode_value;
2555 shortcode += '[/'+ key +'';
2556
2557 } else {
2558
2559 shortcode += base.shortcode_tags( shortcode_tag, shortcode_value );
2560
2561 }
2562
2563 });
2564
2565 shortcode += ']';
2566
2567 });
2568
2569 return shortcode;
2570
2571 };
2572
2573 base.shortcode_tags = function( shortcode_tag, shortcode_value ) {
2574
2575 var shortcode = '';
2576
2577 if ( shortcode_value !== '' ) {
2578
2579 if ( typeof shortcode_value === 'object' && !$.isArray( shortcode_value ) ) {
2580
2581 $.each(shortcode_value, function( sub_shortcode_tag, sub_shortcode_value ) {
2582
2583 // sanitize spesific key/value
2584 switch( sub_shortcode_tag ) {
2585
2586 case 'background-image':
2587 sub_shortcode_value = ( sub_shortcode_value.url ) ? sub_shortcode_value.url : '';
2588 break;
2589
2590 }
2591
2592 if ( sub_shortcode_value !== '' ) {
2593 shortcode += ' ' + sub_shortcode_tag.replace('-', '_') + '="' + sub_shortcode_value.toString() + '"';
2594 }
2595
2596 });
2597
2598 } else {
2599
2600 shortcode += ' ' + shortcode_tag.replace('-', '_') + '="' + shortcode_value.toString() + '"';
2601
2602 }
2603
2604 }
2605
2606 return shortcode;
2607
2608 };
2609
2610 base.insertAtChars = function( _this, currentValue ) {
2611
2612 var obj = ( typeof _this[0].name !== 'undefined' ) ? _this[0] : _this;
2613
2614 if ( obj.value.length && typeof obj.selectionStart !== 'undefined' ) {
2615 obj.focus();
2616 return obj.value.substring( 0, obj.selectionStart ) + currentValue + obj.value.substring( obj.selectionEnd, obj.value.length );
2617 } else {
2618 obj.focus();
2619 return currentValue;
2620 }
2621
2622 };
2623
2624 base.send_to_editor = function( html, editor_id ) {
2625
2626 var tinymce_editor;
2627
2628 if ( typeof tinymce !== 'undefined' ) {
2629 tinymce_editor = tinymce.get( editor_id );
2630 }
2631
2632 if ( tinymce_editor && !tinymce_editor.isHidden() ) {
2633 tinymce_editor.execCommand( 'mceInsertContent', false, html );
2634 } else {
2635 var $editor = $('#'+editor_id);
2636 $editor.val( base.insertAtChars( $editor, html ) ).trigger('change');
2637 }
2638
2639 };
2640
2641 return this.each( function() {
2642
2643 var $modal = $(this),
2644 $load = $modal.find('.adminify-modal-load'),
2645 $content = $modal.find('.adminify-modal-content'),
2646 $insert = $modal.find('.adminify-modal-insert'),
2647 $loading = $modal.find('.adminify-modal-loading'),
2648 $select = $modal.find('select'),
2649 modal_id = $modal.data('modal-id'),
2650 nonce = $modal.data('nonce'),
2651 editor_id,
2652 target_id,
2653 gutenberg_id,
2654 sc_key,
2655 sc_name,
2656 sc_view,
2657 sc_group,
2658 $cloned,
2659 $button;
2660
2661 $(document).on('click', '.adminify-shortcode-button[data-modal-id="'+ modal_id +'"]', function( e ) {
2662
2663 e.preventDefault();
2664
2665 $button = $(this);
2666 editor_id = $button.data('editor-id') || false;
2667 target_id = $button.data('target-id') || false;
2668 gutenberg_id = $button.data('gutenberg-id') || false;
2669
2670 $modal.removeClass('hidden');
2671
2672 // single usage trigger first shortcode
2673 if ( $modal.hasClass('adminify-shortcode-single') && sc_name === undefined ) {
2674 $select.trigger('change');
2675 }
2676
2677 });
2678
2679 $select.on( 'change', function() {
2680
2681 var $option = $(this);
2682 var $selected = $option.find(':selected');
2683
2684 sc_key = $option.val();
2685 sc_name = $selected.data('shortcode');
2686 sc_view = $selected.data('view') || 'normal';
2687 sc_group = $selected.data('group') || sc_name;
2688
2689 $load.empty();
2690
2691 if ( sc_key ) {
2692
2693 $loading.show();
2694
2695 window.wp.ajax.post( 'adminify-get-shortcode-'+ modal_id, {
2696 shortcode_key: sc_key,
2697 nonce: nonce
2698 })
2699 .done( function( response ) {
2700
2701 $loading.hide();
2702
2703 var $appended = $(response.content).appendTo($load);
2704
2705 $insert.parent().removeClass('hidden');
2706
2707 $cloned = $appended.find('.adminify--repeat-shortcode').adminify_clone();
2708
2709 $appended.adminify_reload_script();
2710 $appended.find('.adminify-fields').adminify_reload_script();
2711
2712 });
2713
2714 } else {
2715
2716 $insert.parent().addClass('hidden');
2717
2718 }
2719
2720 });
2721
2722 $insert.on('click', function( e ) {
2723
2724 e.preventDefault();
2725
2726 if ( $insert.prop('disabled') || $insert.attr('disabled') ) { return; }
2727
2728 var shortcode = '';
2729 var serialize = $modal.find('.adminify-field:not(.adminify-depend-on)').find(':input:not(.ignore)').serializeObjectADMINIFY();
2730
2731 switch ( sc_view ) {
2732
2733 case 'contents':
2734 var contentsObj = ( sc_name ) ? serialize[sc_name] : serialize;
2735 $.each(contentsObj, function( sc_key, sc_value ) {
2736 var sc_tag = ( sc_name ) ? sc_name : sc_key;
2737 shortcode += '['+ sc_tag +']'+ sc_value +'[/'+ sc_tag +']';
2738 });
2739 break;
2740
2741 case 'group':
2742
2743 shortcode += '[' + sc_name;
2744 $.each(serialize[sc_name], function( sc_key, sc_value ) {
2745 shortcode += base.shortcode_tags( sc_key, sc_value );
2746 });
2747 shortcode += ']';
2748 shortcode += base.shortcode_parse( serialize[sc_group], sc_group );
2749 shortcode += '[/' + sc_name + ']';
2750
2751 break;
2752
2753 case 'repeater':
2754 shortcode += base.shortcode_parse( serialize[sc_group], sc_group );
2755 break;
2756
2757 default:
2758 shortcode += base.shortcode_parse( serialize );
2759 break;
2760
2761 }
2762
2763 shortcode = ( shortcode === '' ) ? '['+ sc_name +']' : shortcode;
2764
2765 if ( gutenberg_id ) {
2766
2767 var content = window.adminify_gutenberg_props.attributes.hasOwnProperty('shortcode') ? window.adminify_gutenberg_props.attributes.shortcode : '';
2768 window.adminify_gutenberg_props.setAttributes({shortcode: content + shortcode});
2769
2770 } else if ( editor_id ) {
2771
2772 base.send_to_editor( shortcode, editor_id );
2773
2774 } else {
2775
2776 var $textarea = (target_id) ? $(target_id) : $button.parent().find('textarea');
2777 $textarea.val( base.insertAtChars( $textarea, shortcode ) ).trigger('change');
2778
2779 }
2780
2781 $modal.addClass('hidden');
2782
2783 });
2784
2785 $modal.on('click', '.adminify--repeat-button', function( e ) {
2786
2787 e.preventDefault();
2788
2789 var $repeatable = $modal.find('.adminify--repeatable');
2790 var $new_clone = $cloned.adminify_clone();
2791 var $remove_btn = $new_clone.find('.adminify-repeat-remove');
2792
2793 var $appended = $new_clone.appendTo( $repeatable );
2794
2795 $new_clone.find('.adminify-fields').adminify_reload_script();
2796
2797 ADMINIFY.helper.name_nested_replace( $modal.find('.adminify--repeat-shortcode'), sc_group );
2798
2799 $remove_btn.on('click', function() {
2800
2801 $new_clone.remove();
2802
2803 ADMINIFY.helper.name_nested_replace( $modal.find('.adminify--repeat-shortcode'), sc_group );
2804
2805 });
2806
2807 });
2808
2809 $modal.on('click', '.adminify-modal-close, .adminify-modal-overlay', function() {
2810 $modal.addClass('hidden');
2811 });
2812
2813 });
2814 };
2815
2816 //
2817 // WP Color Picker
2818 //
2819 if ( typeof Color === 'function' ) {
2820
2821 Color.prototype.toString = function() {
2822
2823 if ( this._alpha < 1 ) {
2824 return this.toCSS('rgba', this._alpha).replace(/\s+/g, '');
2825 }
2826
2827 var hex = parseInt( this._color, 10 ).toString( 16 );
2828
2829 if ( this.error ) { return ''; }
2830
2831 if ( hex.length < 6 ) {
2832 for (var i = 6 - hex.length - 1; i >= 0; i--) {
2833 hex = '0' + hex;
2834 }
2835 }
2836
2837 return '#' + hex;
2838
2839 };
2840
2841 }
2842
2843 ADMINIFY.funcs.parse_color = function( color ) {
2844
2845 var value = color.replace(/\s+/g, ''),
2846 trans = ( value.indexOf('rgba') !== -1 ) ? parseFloat( value.replace(/^.*,(.+)\)/, '$1') * 100 ) : 100,
2847 rgba = ( trans < 100 ) ? true : false;
2848
2849 return { value: value, transparent: trans, rgba: rgba };
2850
2851 };
2852
2853 $.fn.adminify_color = function() {
2854 return this.each( function() {
2855
2856 var $input = $(this),
2857 picker_color = ADMINIFY.funcs.parse_color( $input.val() ),
2858 palette_color = window.adminify_vars.color_palette.length ? window.adminify_vars.color_palette : true,
2859 $container;
2860
2861 // Destroy and Reinit
2862 if ( $input.hasClass('wp-color-picker') ) {
2863 $input.closest('.wp-picker-container').after($input).remove();
2864 }
2865
2866 $input.wpColorPicker({
2867 palettes: palette_color,
2868 change: function( event, ui ) {
2869
2870 var ui_color_value = ui.color.toString();
2871
2872 $container.removeClass('adminify--transparent-active');
2873 $container.find('.adminify--transparent-offset').css('background-color', ui_color_value);
2874 $input.val(ui_color_value).trigger('change');
2875
2876 },
2877 create: function() {
2878
2879 $container = $input.closest('.wp-picker-container');
2880
2881 var a8cIris = $input.data('a8cIris'),
2882 $transparent_wrap = $('<div class="adminify--transparent-wrap">' +
2883 '<div class="adminify--transparent-slider"></div>' +
2884 '<div class="adminify--transparent-offset"></div>' +
2885 '<div class="adminify--transparent-text"></div>' +
2886 '<div class="adminify--transparent-button">transparent <i class="fas fa-toggle-off"></i></div>' +
2887 '</div>').appendTo( $container.find('.wp-picker-holder') ),
2888 $transparent_slider = $transparent_wrap.find('.adminify--transparent-slider'),
2889 $transparent_text = $transparent_wrap.find('.adminify--transparent-text'),
2890 $transparent_offset = $transparent_wrap.find('.adminify--transparent-offset'),
2891 $transparent_button = $transparent_wrap.find('.adminify--transparent-button');
2892
2893 if ( $input.val() === 'transparent' ) {
2894 $container.addClass('adminify--transparent-active');
2895 }
2896
2897 $transparent_button.on('click', function() {
2898 if ( $input.val() !== 'transparent' ) {
2899 $input.val('transparent').trigger('change').removeClass('iris-error');
2900 $container.addClass('adminify--transparent-active');
2901 } else {
2902 $input.val( a8cIris._color.toString() ).trigger('change');
2903 $container.removeClass('adminify--transparent-active');
2904 }
2905 });
2906
2907 $transparent_slider.slider({
2908 value: picker_color.transparent,
2909 step: 1,
2910 min: 0,
2911 max: 100,
2912 slide: function( event, ui ) {
2913
2914 var slide_value = parseFloat( ui.value / 100 );
2915 a8cIris._color._alpha = slide_value;
2916 $input.wpColorPicker( 'color', a8cIris._color.toString() );
2917 $transparent_text.text( ( slide_value === 1 || slide_value === 0 ? '' : slide_value ) );
2918
2919 },
2920 create: function() {
2921
2922 var slide_value = parseFloat( picker_color.transparent / 100 ),
2923 text_value = slide_value < 1 ? slide_value : '';
2924
2925 $transparent_text.text(text_value);
2926 $transparent_offset.css('background-color', picker_color.value);
2927
2928 $container.on('click', '.wp-picker-clear', function() {
2929
2930 a8cIris._color._alpha = 1;
2931 $transparent_text.text('');
2932 $transparent_slider.slider('option', 'value', 100);
2933 $container.removeClass('adminify--transparent-active');
2934 $input.trigger('change');
2935
2936 });
2937
2938 $container.on('click', '.wp-picker-default', function() {
2939
2940 var default_color = ADMINIFY.funcs.parse_color( $input.data('default-color') ),
2941 default_value = parseFloat( default_color.transparent / 100 ),
2942 default_text = default_value < 1 ? default_value : '';
2943
2944 a8cIris._color._alpha = default_value;
2945 $transparent_text.text(default_text);
2946 $transparent_slider.slider('option', 'value', default_color.transparent);
2947
2948 if ( default_color.value === 'transparent' ) {
2949 $input.removeClass('iris-error');
2950 $container.addClass('adminify--transparent-active');
2951 }
2952
2953 });
2954
2955 }
2956 });
2957 }
2958 });
2959
2960 });
2961 };
2962
2963 //
2964 // ChosenJS
2965 //
2966 $.fn.adminify_chosen = function() {
2967 return this.each( function() {
2968
2969 var $this = $(this),
2970 $inited = $this.parent().find('.chosen-container'),
2971 is_sortable = $this.hasClass('adminify-chosen-sortable') || false,
2972 is_ajax = $this.hasClass('adminify-chosen-ajax') || false,
2973 is_multiple = $this.attr('multiple') || false,
2974 set_width = is_multiple ? '100%' : 'auto',
2975 set_options = $.extend({
2976 allow_single_deselect: true,
2977 disable_search_threshold: 10,
2978 width: set_width,
2979 no_results_text: window.adminify_vars.i18n.no_results_text,
2980 }, $this.data('chosen-settings'));
2981
2982 if ( $inited.length ) {
2983 $inited.remove();
2984 }
2985
2986 // Chosen ajax
2987 if ( is_ajax ) {
2988
2989 var set_ajax_options = $.extend({
2990 data: {
2991 type: 'post',
2992 nonce: '',
2993 },
2994 allow_single_deselect: true,
2995 disable_search_threshold: -1,
2996 width: '100%',
2997 min_length: 3,
2998 type_delay: 500,
2999 typing_text: window.adminify_vars.i18n.typing_text,
3000 searching_text: window.adminify_vars.i18n.searching_text,
3001 no_results_text: window.adminify_vars.i18n.no_results_text,
3002 }, $this.data('chosen-settings'));
3003
3004 $this.ADMINIFYAjaxChosen(set_ajax_options);
3005
3006 } else {
3007
3008 $this.chosen(set_options);
3009
3010 }
3011
3012 // Chosen keep options order
3013 if ( is_multiple ) {
3014
3015 var $hidden_select = $this.parent().find('.adminify-hide-select');
3016 var $hidden_value = $hidden_select.val() || [];
3017
3018 $this.on('change', function(obj, result) {
3019
3020 if ( result && result.selected ) {
3021 $hidden_select.append( '<option value="'+ result.selected +'" selected="selected">'+ result.selected +'</option>' );
3022 } else if ( result && result.deselected ) {
3023 $hidden_select.find('option[value="'+ result.deselected +'"]').remove();
3024 }
3025
3026 // Force customize refresh
3027 if ( window.wp.customize !== undefined && $hidden_select.children().length === 0 && $hidden_select.data('customize-setting-link') ) {
3028 window.wp.customize.control( $hidden_select.data('customize-setting-link') ).setting.set('');
3029 }
3030
3031 $hidden_select.trigger('change');
3032
3033 });
3034
3035 // Chosen order abstract
3036 $this.ADMINIFYChosenOrder($hidden_value, true);
3037
3038 }
3039
3040 // Chosen sortable
3041 if ( is_sortable ) {
3042
3043 var $chosen_container = $this.parent().find('.chosen-container');
3044 var $chosen_choices = $chosen_container.find('.chosen-choices');
3045
3046 $chosen_choices.bind('mousedown', function( event ) {
3047 if ( $(event.target).is('span') ) {
3048 event.stopPropagation();
3049 }
3050 });
3051
3052 $chosen_choices.sortable({
3053 items: 'li:not(.search-field)',
3054 helper: 'orginal',
3055 cursor: 'move',
3056 placeholder: 'search-choice-placeholder',
3057 start: function(e,ui) {
3058 ui.placeholder.width( ui.item.innerWidth() );
3059 ui.placeholder.height( ui.item.innerHeight() );
3060 },
3061 update: function( e, ui ) {
3062
3063 var select_options = '';
3064 var chosen_object = $this.data('chosen');
3065 var $prev_select = $this.parent().find('.adminify-hide-select');
3066
3067 $chosen_choices.find('.search-choice-close').each( function() {
3068 var option_array_index = $(this).data('option-array-index');
3069 $.each(chosen_object.results_data, function(index, data) {
3070 if ( data.array_index === option_array_index ){
3071 select_options += '<option value="'+ data.value +'" selected>'+ data.value +'</option>';
3072 }
3073 });
3074 });
3075
3076 $prev_select.children().remove();
3077 $prev_select.append(select_options);
3078 $prev_select.trigger('change');
3079
3080 }
3081 });
3082
3083 }
3084
3085 });
3086 };
3087
3088 //
3089 // Helper Checkbox Checker
3090 //
3091 $.fn.adminify_checkbox = function() {
3092 return this.each( function() {
3093
3094 var $this = $(this),
3095 $input = $this.find('.adminify--input'),
3096 $checkbox = $this.find('.adminify--checkbox');
3097
3098 $checkbox.on('click', function() {
3099 $input.val( Number( $checkbox.prop('checked') ) ).trigger('change');
3100 });
3101
3102 });
3103 };
3104
3105 //
3106 // Siblings
3107 //
3108 $.fn.adminify_siblings = function() {
3109 return this.each( function() {
3110
3111 var $this = $(this),
3112 $siblings = $this.find('.adminify--sibling'),
3113 multiple = $this.data('multiple') || false;
3114
3115 $siblings.on('click', function() {
3116
3117 var $sibling = $(this);
3118
3119 if ( multiple ) {
3120
3121 if ( $sibling.hasClass('adminify--active') ) {
3122 $sibling.removeClass('adminify--active');
3123 $sibling.find('input').prop('checked', false).trigger('change');
3124 } else {
3125 $sibling.addClass('adminify--active');
3126 $sibling.find('input').prop('checked', true).trigger('change');
3127 }
3128
3129 } else {
3130
3131 $this.find('input').prop('checked', false);
3132 $sibling.find('input').prop('checked', true).trigger('change');
3133 $sibling.addClass('adminify--active').siblings().removeClass('adminify--active');
3134
3135 }
3136
3137 });
3138
3139 });
3140 };
3141
3142 //
3143 // Help Tooltip
3144 //
3145 $.fn.adminify_help = function() {
3146 return this.each( function() {
3147
3148 var $this = $(this),
3149 $tooltip,
3150 offset_left;
3151
3152 $this.on({
3153 mouseenter: function() {
3154
3155 $tooltip = $( '<div class="adminify-tooltip"></div>' ).html( $this.find('.adminify-help-text').html() ).appendTo('body');
3156 offset_left = ( ADMINIFY.vars.is_rtl ) ? ( $this.offset().left + 24 ) : ( $this.offset().left - $tooltip.outerWidth() );
3157
3158 $tooltip.css({
3159 top: $this.offset().top - ( ( $tooltip.outerHeight() / 2 ) - 14 ),
3160 left: offset_left,
3161 });
3162
3163 },
3164 mouseleave: function() {
3165
3166 if ( $tooltip !== undefined ) {
3167 $tooltip.remove();
3168 }
3169
3170 }
3171
3172 });
3173
3174 });
3175 };
3176
3177 //
3178 // Customize Refresh
3179 //
3180 $.fn.adminify_customizer_refresh = function() {
3181 return this.each( function() {
3182
3183 var $this = $(this),
3184 $complex = $this.closest('.adminify-customize-complex');
3185
3186 if ( $complex.length ) {
3187
3188 var unique_id = $complex.data('unique-id');
3189
3190 if ( unique_id === undefined ) {
3191 return;
3192 }
3193
3194 var $input = $complex.find(':input'),
3195 option_id = $complex.data('option-id'),
3196 obj = $input.serializeObjectADMINIFY(),
3197 data = ( ! $.isEmptyObject(obj) && obj[unique_id] && obj[unique_id][option_id] ) ? obj[unique_id][option_id] : '',
3198 control = window.wp.customize.control(unique_id +'['+ option_id +']');
3199
3200 // clear the value to force refresh.
3201 control.setting._value = null;
3202
3203 control.setting.set( data );
3204
3205 } else {
3206
3207 $this.find(':input').first().trigger('change');
3208
3209 }
3210
3211 $(document).trigger('adminify-customizer-refresh', $this);
3212
3213 });
3214 };
3215
3216 //
3217 // Customize Listen Form Elements
3218 //
3219 $.fn.adminify_customizer_listen = function( options ) {
3220
3221 var settings = $.extend({
3222 closest: false,
3223 }, options );
3224
3225 return this.each( function() {
3226
3227 if ( window.wp.customize === undefined ) { return; }
3228
3229 var $this = ( settings.closest ) ? $(this).closest('.adminify-customize-complex') : $(this),
3230 $input = $this.find(':input'),
3231 unique_id = $this.data('unique-id'),
3232 option_id = $this.data('option-id');
3233
3234 if ( unique_id === undefined ) {
3235 return;
3236 }
3237
3238 $input.on('change keyup', function() {
3239
3240 var obj = $this.find(':input').serializeObjectADMINIFY();
3241 var val = ( !$.isEmptyObject(obj) && obj[unique_id] && obj[unique_id][option_id] ) ? obj[unique_id][option_id] : '';
3242
3243 window.wp.customize.control( unique_id +'['+ option_id +']' ).setting.set( val );
3244
3245 });
3246
3247 });
3248 };
3249
3250 //
3251 // Customizer Listener for Reload JS
3252 //
3253 $(document).on('expanded', '.control-section', function() {
3254
3255 var $this = $(this);
3256
3257 if ( $this.hasClass('open') && !$this.data('inited') ) {
3258
3259 var $fields = $this.find('.adminify-customize-field');
3260 var $complex = $this.find('.adminify-customize-complex');
3261
3262 if ( $fields.length ) {
3263 $this.adminify_dependency();
3264 $fields.adminify_reload_script({dependency: false});
3265 $complex.adminify_customizer_listen();
3266 }
3267
3268 $this.data('inited', true);
3269
3270 }
3271
3272 });
3273
3274 //
3275 // Window on resize
3276 //
3277 ADMINIFY.vars.$window.on('resize adminify.resize', ADMINIFY.helper.debounce( function( event ) {
3278
3279 var window_width = navigator.userAgent.indexOf('AppleWebKit/') > -1 ? ADMINIFY.vars.$window.width() : window.innerWidth;
3280
3281 if ( window_width <= 782 && !ADMINIFY.vars.onloaded ) {
3282 $('.adminify-section').adminify_reload_script();
3283 ADMINIFY.vars.onloaded = true;
3284 }
3285
3286 }, 200)).trigger('adminify.resize');
3287
3288 //
3289 // Widgets Framework
3290 //
3291 $.fn.adminify_widgets = function() {
3292 return this.each( function() {
3293
3294 $(document).on('widget-added widget-updated', function( event, $widget ) {
3295
3296 var $fields = $widget.find('.adminify-fields');
3297
3298 if ( $fields.length ) {
3299 $fields.adminify_reload_script();
3300 }
3301
3302 });
3303
3304 $(document).on('click', '.widget-top', function( event ) {
3305
3306 var $fields = $(this).parent().find('.adminify-fields');
3307
3308 if ( $fields.length ) {
3309 $fields.adminify_reload_script();
3310 }
3311
3312 });
3313
3314 $('.widgets-sortables, .control-section-sidebar').on('sortstop', function( event, ui ) {
3315 ui.item.find('.adminify-fields').adminify_reload_script_retry();
3316 });
3317
3318 });
3319 };
3320
3321 //
3322 // Nav Menu Options Framework
3323 //
3324 $.fn.adminify_nav_menu = function() {
3325 return this.each( function() {
3326
3327 var $navmenu = $(this);
3328
3329 $navmenu.on('click', 'a.item-edit', function() {
3330 $(this).closest('li.menu-item').find('.adminify-fields').adminify_reload_script();
3331 });
3332
3333 $navmenu.on('sortstop', function( event, ui ) {
3334 ui.item.find('.adminify-fields').adminify_reload_script_retry();
3335 });
3336
3337 });
3338 };
3339
3340 //
3341 // Retry Plugins
3342 //
3343 $.fn.adminify_reload_script_retry = function() {
3344 return this.each( function() {
3345
3346 var $this = $(this);
3347
3348 if ( $this.data('inited') ) {
3349 $this.children('.adminify-field-wp_editor').adminify_field_wp_editor();
3350 }
3351
3352 });
3353 };
3354
3355 //
3356 // Reload Plugins
3357 //
3358 $.fn.adminify_reload_script = function( options ) {
3359
3360 var settings = $.extend({
3361 dependency: true,
3362 }, options );
3363
3364 return this.each( function() {
3365
3366 var $this = $(this);
3367
3368 // Avoid for conflicts
3369 if ( !$this.data('inited') ) {
3370
3371 // Field plugins
3372 $this.children('.adminify-field-accordion').adminify_field_accordion();
3373 $this.children('.adminify-field-backup').adminify_field_backup();
3374 $this.children('.adminify-field-background').adminify_field_background();
3375 $this.children('.adminify-field-code_editor').adminify_field_code_editor();
3376 $this.children('.adminify-field-date').adminify_field_date();
3377 $this.children('.adminify-field-datetime').adminify_field_datetime();
3378 $this.children('.adminify-field-fieldset').adminify_field_fieldset();
3379 $this.children('.adminify-field-gallery').adminify_field_gallery();
3380 $this.children('.adminify-field-group').adminify_field_group();
3381 $this.children('.adminify-field-icon').adminify_field_icon();
3382 $this.children('.adminify-field-link').adminify_field_link();
3383 $this.children('.adminify-field-media').adminify_field_media();
3384 $this.children('.adminify-field-map').adminify_field_map();
3385 $this.children('.adminify-field-repeater').adminify_field_repeater();
3386 $this.children('.adminify-field-slider').adminify_field_slider();
3387 $this.children('.adminify-field-sortable').adminify_field_sortable();
3388 $this.children('.adminify-field-sorter').adminify_field_sorter();
3389 $this.children('.adminify-field-spinner').adminify_field_spinner();
3390 $this.children('.adminify-field-switcher').adminify_field_switcher();
3391 $this.children('.adminify-field-tabbed').adminify_field_tabbed();
3392 $this.children('.adminify-field-typography').adminify_field_typography();
3393 $this.children('.adminify-field-upload').adminify_field_upload();
3394 $this.children('.adminify-field-wp_editor').adminify_field_wp_editor();
3395
3396 // Field colors
3397 $this.children('.adminify-field-border').find('.adminify-color').adminify_color();
3398 $this.children('.adminify-field-background').find('.adminify-color').adminify_color();
3399 $this.children('.adminify-field-color').find('.adminify-color').adminify_color();
3400 $this.children('.adminify-field-color_group').find('.adminify-color').adminify_color();
3401 $this.children('.adminify-field-link_color').find('.adminify-color').adminify_color();
3402 $this.children('.adminify-field-typography').find('.adminify-color').adminify_color();
3403
3404 // Field chosenjs
3405 $this.children('.adminify-field-select').find('.adminify-chosen').adminify_chosen();
3406
3407 // Field Checkbox
3408 $this.children('.adminify-field-checkbox').find('.adminify-checkbox').adminify_checkbox();
3409
3410 // Field Siblings
3411 $this.children('.adminify-field-button_set').find('.adminify-siblings').adminify_siblings();
3412 $this.children('.adminify-field-image_select').find('.adminify-siblings').adminify_siblings();
3413 $this.children('.adminify-field-palette').find('.adminify-siblings').adminify_siblings();
3414
3415 // Help Tooptip
3416 $this.children('.adminify-field').find('.adminify-help').adminify_help();
3417
3418 if ( settings.dependency ) {
3419 $this.adminify_dependency();
3420 }
3421
3422 $this.data('inited', true);
3423
3424 $(document).trigger('adminify-reload-script', $this);
3425
3426 }
3427
3428 });
3429 };
3430
3431 //
3432 // Document ready and run scripts
3433 //
3434 $(document).ready( function() {
3435
3436 $('.adminify-save').adminify_save();
3437 $('.adminify-options').adminify_options();
3438 $('.adminify-sticky-header').adminify_sticky();
3439 $('.adminify-nav-options').adminify_nav_options();
3440 $('.adminify-nav-metabox').adminify_nav_metabox();
3441 $('.adminify-taxonomy').adminify_taxonomy();
3442 $('.adminify-page-templates').adminify_page_templates();
3443 $('.adminify-post-formats').adminify_post_formats();
3444 $('.adminify-shortcode').adminify_shortcode();
3445 $('.adminify-search').adminify_search();
3446 $('.adminify-confirm').adminify_confirm();
3447 $('.adminify-expand-all').adminify_expand_all();
3448 $('.adminify-onload').adminify_reload_script();
3449 $('#widgets-editor').adminify_widgets();
3450 $('#widgets-right').adminify_widgets();
3451 $('#menu-to-edit').adminify_nav_menu();
3452
3453 });
3454
3455 })( jQuery, window, document );
3456