PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 1.0.9
Adminify – White Label, Admin Menu Editor, Login Customizer v1.0.9
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 1.0.9, at lib/adminify-framework/assets/js/main.js

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