Best JavaScript code snippet using storybook-test-runner
csf.js
Source:csf.js  
1/**2 *3 * -----------------------------------------------------------4 *5 * Codestar Framework6 * A Simple and Lightweight WordPress Option Framework7 *8 * -----------------------------------------------------------9 *10 */11;(function( $, window, document, undefined ) {12  'use strict';13  //14  // Constants15  //16  var CSF   = CSF || {};17  CSF.funcs = {};18  CSF.vars  = {19    onloaded: false,20    $body: $('body'),21    $window: $(window),22    $document: $(document),23    is_rtl: $('body').hasClass('rtl'),24    code_themes: [],25  };26  //27  // Helper Functions28  //29  CSF.helper = {30    //31    // Generate UID32    //33    uid: function( prefix ) {34      return ( prefix || '' ) + Math.random().toString(36).substr(2, 9);35    },36    // Quote regular expression characters37    //38    preg_quote: function( str ) {39      return (str+'').replace(/(\[|\-|\])/g, "\\$1");40    },41    //42    // Reneme input names43    //44    name_nested_replace: function( $selector, field_id ) {45      var checks = [];46      var regex  = new RegExp('('+ CSF.helper.preg_quote(field_id) +')\\[(\\d+)\\]', 'g');47      $selector.find(':radio').each(function() {48        if( this.checked || this.orginal_checked ) {49          this.orginal_checked = true;50        }51      });52      $selector.each( function( index ) {53        $(this).find(':input').each(function() {54          this.name = this.name.replace(regex, field_id +'['+ index +']');55          if( this.orginal_checked ) {56            this.checked = true;57          }58        });59      });60    },61    //62    // Debounce63    //64    debounce: function( callback, threshold, immediate ) {65      var timeout;66      return function() {67        var context = this, args = arguments;68        var later = function() {69          timeout = null;70          if( !immediate ) {71            callback.apply(context, args);72          }73        };74        var callNow = ( immediate && !timeout );75        clearTimeout( timeout );76        timeout = setTimeout( later, threshold );77        if( callNow ) {78          callback.apply(context, args);79        }80      };81    },82    //83    // Get a cookie84    //85    get_cookie: function( name ) {86      var e, b, cookie = document.cookie, p = name + '=';87      if( ! cookie ) {88        return;89      }90      b = cookie.indexOf( '; ' + p );91      if( b === -1 ) {92        b = cookie.indexOf(p);93        if( b !== 0 ) {94          return null;95        }96      } else {97        b += 2;98      }99      e = cookie.indexOf( ';', b );100      if( e === -1 ) {101        e = cookie.length;102      }103      return decodeURIComponent( cookie.substring( b + p.length, e ) );104    },105    //106    // Set a cookie107    //108    set_cookie: function( name, value, expires, path, domain, secure ) {109      var d = new Date();110      if( typeof( expires ) === 'object' && expires.toGMTString ) {111        expires = expires.toGMTString();112      } else if( parseInt( expires, 10 ) ) {113        d.setTime( d.getTime() + ( parseInt( expires, 10 ) * 1000 ) );114        expires = d.toGMTString();115      } else {116        expires = '';117      }118      document.cookie = name + '=' + encodeURIComponent( value ) +119        ( expires ? '; expires=' + expires : '' ) +120        ( path    ? '; path=' + path       : '' ) +121        ( domain  ? '; domain=' + domain   : '' ) +122        ( secure  ? '; secure'             : '' );123    },124    //125    // Remove a cookie126    //127    remove_cookie: function( name, path, domain, secure ) {128      CSF.helper.set_cookie( name, '', -1000, path, domain, secure );129    },130  };131  //132  // Custom clone for textarea and select clone() bug133  //134  $.fn.csf_clone = function() {135    var base   = $.fn.clone.apply(this, arguments),136        clone  = this.find('select').add(this.filter('select')),137        cloned = base.find('select').add(base.filter('select'));138    for( var i = 0; i < clone.length; ++i ) {139      for( var j = 0; j < clone[i].options.length; ++j ) {140        if( clone[i].options[j].selected === true ) {141          cloned[i].options[j].selected = true;142        }143      }144    }145    this.find(':radio').each( function() {146      this.orginal_checked = this.checked;147    });148    return base;149  };150  //151  // Expand All Options152  //153  $.fn.csf_expand_all = function() {154    return this.each( function() {155      $(this).on('click', function( e ) {156        e.preventDefault();157        $('.csf-wrapper').toggleClass('csf-show-all');158        $('.csf-section').csf_reload_script();159        $(this).find('.fa').toggleClass('fa-indent').toggleClass('fa-outdent');160      });161    });162  };163  //164  // Options Navigation165  //166  $.fn.csf_nav_options = function() {167    return this.each( function() {168      var $nav    = $(this),169          $links  = $nav.find('a'),170          $hidden = $nav.closest('.csf').find('.csf-section-id'),171          $last_section;172      $(window).on('hashchange', function() {173        var hash  = window.location.hash.match(new RegExp('tab=([^&]*)'));174        var slug  = hash ? hash[1] : $links.first().attr('href').replace('#tab=', '');175        var $link = $('#csf-tab-link-'+ slug);176        if( $link.length > 0 ) {177          $link.closest('.csf-tab-depth-0').addClass('csf-tab-active').siblings().removeClass('csf-tab-active');178          $links.removeClass('csf-section-active');179          $link.addClass('csf-section-active');180          if( $last_section !== undefined ) {181            $last_section.hide();182          }183          var $section = $('#csf-section-'+slug);184          $section.css({display: 'block'});185          $section.csf_reload_script();186          $hidden.val(slug);187          $last_section = $section;188        }189      }).trigger('hashchange');190    });191  };192  //193  // Metabox Tabs194  //195  $.fn.csf_nav_metabox = function() {196    return this.each( function() {197      var $nav      = $(this),198          $links    = $nav.find('a'),199          unique_id = $nav.data('unique'),200          post_id   = $('#post_ID').val() || 'global',201          $last_section,202          $last_link;203      $links.on('click', function( e ) {204        e.preventDefault();205        var $link      = $(this),206            section_id = $link.data('section');207        if( $last_link !== undefined ) {208          $last_link.removeClass('csf-section-active');209        }210        if( $last_section !== undefined ) {211          $last_section.hide();212        }213        $link.addClass('csf-section-active');214        var $section = $('#csf-section-'+section_id);215        $section.css({display: 'block'});216        $section.csf_reload_script();217        CSF.helper.set_cookie('csf-last-metabox-tab-'+ post_id +'-'+ unique_id, section_id);218        $last_section = $section;219        $last_link    = $link;220      });221      var get_cookie = CSF.helper.get_cookie('csf-last-metabox-tab-'+ post_id +'-'+ unique_id);222      if( get_cookie ) {223        $nav.find('a[data-section="'+ get_cookie +'"]').trigger('click');224      } else {225        $links.first('a').trigger('click');226      }227    });228  };229  //230  // Metabox Page Templates Listener231  //232  $.fn.csf_page_templates = function() {233    if( this.length ) {234      $(document).on('change', '.editor-page-attributes__template select, #page_template', function() {235        var maybe_value = $(this).val() || 'default';236        $('.csf-page-templates').removeClass('csf-show').addClass('csf-hide');237        $('.csf-page-'+maybe_value.toLowerCase().replace(/[^a-zA-Z0-9]+/g,'-')).removeClass('csf-hide').addClass('csf-show');238      });239    }240  };241  //242  // Metabox Post Formats Listener243  //244  $.fn.csf_post_formats = function() {245    if( this.length ) {246      $(document).on('change', '.editor-post-format select, #formatdiv input[name="post_format"]', function() {247        var maybe_value = $(this).val() || 'default';248        // Fallback for classic editor version249        maybe_value = ( maybe_value === '0' ) ? 'default' : maybe_value;250        $('.csf-post-formats').removeClass('csf-show').addClass('csf-hide');251        $('.csf-post-format-'+maybe_value).removeClass('csf-hide').addClass('csf-show');252      });253    }254  };255  //256  // Search257  //258  $.fn.csf_search = function() {259    return this.each( function() {260      var $this    = $(this),261          $input   = $this.find('input');262      $input.on('change keyup', function() {263        var value    = $(this).val(),264            $wrapper = $('.csf-wrapper'),265            $section = $wrapper.find('.csf-section'),266            $fields  = $section.find('> .csf-field:not(.hidden)'),267            $titles  = $fields.find('> .csf-title, .csf-search-tags');268        if( value.length > 3 ) {269          $fields.addClass('csf-hidden');270          $wrapper.addClass('csf-search-all');271          $titles.each( function() {272            var $title = $(this);273            if( $title.text().match( new RegExp('.*?' + value + '.*?', 'i') ) ) {274              var $field = $title.closest('.csf-field');275              $field.removeClass('csf-hidden');276              $field.parent().csf_reload_script();277            }278          });279        } else {280          $fields.removeClass('csf-hidden');281          $wrapper.removeClass('csf-search-all');282        }283      });284    });285  };286  //287  // Sticky Header288  //289  $.fn.csf_sticky = function() {290    return this.each( function() {291      var $this     = $(this),292          $window   = $(window),293          $inner    = $this.find('.csf-header-inner'),294          padding   = parseInt( $inner.css('padding-left') ) + parseInt( $inner.css('padding-right') ),295          offset    = 32,296          scrollTop = 0,297          lastTop   = 0,298          ticking   = false,299          stickyUpdate = function() {300            var offsetTop = $this.offset().top,301                stickyTop = Math.max(offset, offsetTop - scrollTop ),302                winWidth  = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);303            if( stickyTop <= offset && winWidth > 782 ) {304              $inner.css({width: $this.outerWidth()-padding});305              $this.css({height: $this.outerHeight()}).addClass( 'csf-sticky' );306            } else {307              $inner.removeAttr('style');308              $this.removeAttr('style').removeClass( 'csf-sticky' );309            }310          },311          requestTick = function() {312            if( !ticking ) {313              requestAnimationFrame( function() {314                stickyUpdate();315                ticking = false;316              });317            }318            ticking = true;319          },320          onSticky  = function() {321            scrollTop = $window.scrollTop();322            requestTick();323          };324      $window.on( 'scroll resize', onSticky);325      onSticky();326    });327  };328  //329  // Dependency System330  //331  $.fn.csf_dependency = function() {332    return this.each( function() {333      var $this     = $(this),334          ruleset   = $.csf_deps.createRuleset(),335          depends   = [],336          is_global = false;337      $this.children('[data-controller]').each( function() {338        var $field      = $(this),339            controllers = $field.data('controller').split('|'),340            conditions  = $field.data('condition').split('|'),341            values      = $field.data('value').toString().split('|'),342            rules       = ruleset;343        if( $field.data('depend-global') ) {344          is_global = true;345        }346        $.each(controllers, function( index, depend_id ) {347          var value     = values[index] || '',348              condition = conditions[index] || conditions[0];349          rules = rules.createRule('[data-depend-id="'+ depend_id +'"]', condition, value);350          rules.include($field);351          depends.push(depend_id);352        });353      });354      if( depends.length ) {355        if( is_global ) {356          $.csf_deps.enable(CSF.vars.$body, ruleset, depends);357        } else {358          $.csf_deps.enable($this, ruleset, depends);359        }360      }361    });362  };363  //364  // Field: accordion365  //366  $.fn.csf_field_accordion = function() {367    return this.each( function() {368      var $titles = $(this).find('.csf-accordion-title');369      $titles.on('click', function() {370        var $title   = $(this),371            $icon    = $title.find('.csf-accordion-icon'),372            $content = $title.next();373        if( $icon.hasClass('fa-angle-right') ) {374          $icon.removeClass('fa-angle-right').addClass('fa-angle-down');375        } else {376          $icon.removeClass('fa-angle-down').addClass('fa-angle-right');377        }378        if( !$content.data( 'opened' ) ) {379          $content.csf_reload_script();380          $content.data( 'opened', true );381        }382        $content.toggleClass('csf-accordion-open');383      });384    });385  };386  //387  // Field: backup388  //389  $.fn.csf_field_backup = function() {390    return this.each( function() {391      if( window.wp.customize === undefined ) { return; }392      var base    = this,393          $this   = $(this),394          $body   = $('body'),395          $import = $this.find('.csf-import'),396          $reset  = $this.find('.csf-reset');397      base.notification = function( message_text ) {398        if( wp.customize.notifications && wp.customize.OverlayNotification ) {399          // clear if there is any saved data.400          if( !wp.customize.state('saved').get() ) {401            wp.customize.state('changesetStatus').set('trash');402            wp.customize.each( function( setting ) { setting._dirty = false; });403            wp.customize.state('saved').set(true);404          }405          // then show a notification overlay406          wp.customize.notifications.add( new wp.customize.OverlayNotification('csf_field_backup_notification', {407            type: 'info',408            message: message_text,409            loading: true410          }));411        }412      };413      $reset.on('click', function( e ) {414        e.preventDefault();415        if( CSF.vars.is_confirm ) {416          base.notification( window.csf_vars.i18n.reset_notification );417          window.wp.ajax.post('csf-reset', {418            unique: $reset.data('unique'),419            nonce: $reset.data('nonce')420          })421          .done( function( response ) {422            window.location.reload(true);423          })424          .fail( function( response ) {425            alert( response.error );426            wp.customize.notifications.remove('csf_field_backup_notification');427          });428        }429      });430      $import.on('click', function( e ) {431        e.preventDefault();432        if( CSF.vars.is_confirm ) {433          base.notification( window.csf_vars.i18n.import_notification );434          window.wp.ajax.post( 'csf-import', {435            unique: $import.data('unique'),436            nonce: $import.data('nonce'),437            import_data: $this.find('.csf-import-data').val()438          }).done( function( response ) {439            window.location.reload(true);440          }).fail( function( response ) {441            alert( response.error );442            wp.customize.notifications.remove('csf_field_backup_notification');443          });444        }445      });446    });447  };448  //449  // Field: background450  //451  $.fn.csf_field_background = function() {452    return this.each( function() {453      $(this).find('.csf--media').csf_reload_script();454    });455  };456  //457  // Field: code_editor458  //459  $.fn.csf_field_code_editor = function() {460    return this.each( function() {461      if( typeof CodeMirror !== 'function' ) { return; }462      var $this       = $(this),463          $textarea   = $this.find('textarea'),464          $inited     = $this.find('.CodeMirror'),465          data_editor = $textarea.data('editor');466      if( $inited.length ) {467        $inited.remove();468      }469      var interval = setInterval(function () {470        if( $this.is(':visible') ) {471          var code_editor = CodeMirror.fromTextArea( $textarea[0], data_editor );472          // load code-mirror theme css.473          if( data_editor.theme !== 'default' && CSF.vars.code_themes.indexOf(data_editor.theme) === -1 ) {474            var $cssLink = $('<link>');475            $('#csf-codemirror-css').after( $cssLink );476            $cssLink.attr({477              rel: 'stylesheet',478              id: 'csf-codemirror-'+ data_editor.theme +'-css',479              href: data_editor.cdnURL +'/theme/'+ data_editor.theme +'.min.css',480              type: 'text/css',481              media: 'all'482            });483            CSF.vars.code_themes.push(data_editor.theme);484          }485          CodeMirror.modeURL = data_editor.cdnURL +'/mode/%N/%N.min.js';486          CodeMirror.autoLoadMode(code_editor, data_editor.mode);487          code_editor.on( 'change', function( editor, event ) {488            $textarea.val( code_editor.getValue() ).trigger('change');489          });490          clearInterval(interval);491        }492      });493    });494  };495  //496  // Field: date497  //498  $.fn.csf_field_date = function() {499    return this.each( function() {500      var $this    = $(this),501          $inputs  = $this.find('input'),502          settings = $this.find('.csf-date-settings').data('settings'),503          wrapper  = '<div class="csf-datepicker-wrapper"></div>',504          $datepicker;505      var defaults = {506        showAnim: '',507        beforeShow: function(input, inst) {508          $(inst.dpDiv).addClass('csf-datepicker-wrapper');509        },510        onClose: function( input, inst ) {511          $(inst.dpDiv).removeClass('csf-datepicker-wrapper');512        },513      };514      settings = $.extend({}, settings, defaults);515      if( $inputs.length === 2 ) {516        settings = $.extend({}, settings, {517          onSelect: function( selectedDate ) {518            var $this  = $(this),519                $from  = $inputs.first(),520                option = ( $inputs.first().attr('id') === $(this).attr('id') ) ? 'minDate' : 'maxDate',521                date   = $.datepicker.parseDate( settings.dateFormat, selectedDate );522            $inputs.not(this).datepicker('option', option, date );523          }524        });525      }526      $inputs.each( function(){527        var $input = $(this);528        if( $input.hasClass('hasDatepicker') ) {529          $input.removeAttr('id').removeClass('hasDatepicker');530        }531        $input.datepicker(settings);532      });533    });534  };535  //536  // Field: fieldset537  //538  $.fn.csf_field_fieldset = function() {539    return this.each( function() {540      $(this).find('.csf-fieldset-content').csf_reload_script();541    });542  };543  //544  // Field: gallery545  //546  $.fn.csf_field_gallery = function() {547    return this.each( function() {548      var $this  = $(this),549          $edit  = $this.find('.csf-edit-gallery'),550          $clear = $this.find('.csf-clear-gallery'),551          $list  = $this.find('ul'),552          $input = $this.find('input'),553          $img   = $this.find('img'),554          wp_media_frame;555      $this.on('click', '.csf-button, .csf-edit-gallery', function( e ) {556        var $el   = $(this),557            ids   = $input.val(),558            what  = ( $el.hasClass('csf-edit-gallery') ) ? 'edit' : 'add',559            state = ( what === 'add' && !ids.length ) ? 'gallery' : 'gallery-edit';560        e.preventDefault();561        if( typeof window.wp === 'undefined' || ! window.wp.media || ! window.wp.media.gallery ) { return; }562         // Open media with state563        if( state === 'gallery' ) {564          wp_media_frame = window.wp.media({565            library: {566              type: 'image'567            },568            frame: 'post',569            state: 'gallery',570            multiple: true571          });572          wp_media_frame.open();573        } else {574          wp_media_frame = window.wp.media.gallery.edit( '[gallery ids="'+ ids +'"]' );575          if( what === 'add' ) {576            wp_media_frame.setState('gallery-library');577          }578        }579        // Media Update580        wp_media_frame.on( 'update', function( selection ) {581          $list.empty();582          var selectedIds = selection.models.map( function( attachment ) {583            var item  = attachment.toJSON();584            var thumb = ( typeof item.sizes.thumbnail !== 'undefined' ) ? item.sizes.thumbnail.url : item.url;585            $list.append('<li><img src="'+ thumb +'"></li>');586            return item.id;587          });588          $input.val( selectedIds.join( ',' ) ).trigger('change');589          $clear.removeClass('hidden');590          $edit.removeClass('hidden');591        });592      });593      $clear.on('click', function( e ) {594        e.preventDefault();595        $list.empty();596        $input.val('').trigger('change');597        $clear.addClass('hidden');598        $edit.addClass('hidden');599      });600    });601  };602  //603  // Field: group604  //605  $.fn.csf_field_group = function() {606    return this.each( function() {607      var $this     = $(this),608          $fieldset = $this.children('.csf-fieldset'),609          $group    = $fieldset.length ? $fieldset : $this,610          $wrapper  = $group.children('.csf-cloneable-wrapper'),611          $hidden   = $group.children('.csf-cloneable-hidden'),612          $max      = $group.children('.csf-cloneable-max'),613          $min      = $group.children('.csf-cloneable-min'),614          field_id  = $wrapper.data('field-id'),615          unique_id = $wrapper.data('unique-id'),616          is_number = Boolean( Number( $wrapper.data('title-number') ) ),617          max       = parseInt( $wrapper.data('max') ),618          min       = parseInt( $wrapper.data('min') );619      // clear accordion arrows if multi-instance620      if( $wrapper.hasClass('ui-accordion') ) {621        $wrapper.find('.ui-accordion-header-icon').remove();622      }623      var update_title_numbers = function( $selector ) {624        $selector.find('.csf-cloneable-title-number').each( function( index ) {625          $(this).html( ( $(this).closest('.csf-cloneable-item').index()+1 ) + '.' );626        });627      };628      $wrapper.accordion({629        header: '> .csf-cloneable-item > .csf-cloneable-title',630        collapsible : true,631        active: false,632        animate: false,633        heightStyle: 'content',634        icons: {635          'header': 'csf-cloneable-header-icon fa fa-angle-right',636          'activeHeader': 'csf-cloneable-header-icon fa fa-angle-down'637        },638        activate: function( event, ui ) {639          var $panel  = ui.newPanel;640          var $header = ui.newHeader;641          if( $panel.length && !$panel.data( 'opened' ) ) {642            var $fields = $panel.children();643            var $first  = $fields.first().find(':input').first();644            var $title  = $header.find('.csf-cloneable-value');645            $first.on('keyup', function( event ) {646              $title.text($first.val());647            });648            $panel.csf_reload_script();649            $panel.data( 'opened', true );650            $panel.data( 'retry', false );651          } else if( $panel.data( 'retry' ) ) {652            $panel.csf_reload_script_retry();653            $panel.data( 'retry', false );654          }655        }656      });657      $wrapper.sortable({658        axis: 'y',659        handle: '.csf-cloneable-title,.csf-cloneable-sort',660        helper: 'original',661        cursor: 'move',662        placeholder: 'widget-placeholder',663        start: function( event, ui ) {664          $wrapper.accordion({ active:false });665          $wrapper.sortable('refreshPositions');666          ui.item.children('.csf-cloneable-content').data('retry', true);667        },668        update: function( event, ui ) {669          CSF.helper.name_nested_replace( $wrapper.children('.csf-cloneable-item'), field_id );670          $wrapper.csf_customizer_refresh();671          if( is_number ) {672            update_title_numbers($wrapper);673          }674        },675      });676      $group.children('.csf-cloneable-add').on('click', function( e ) {677        e.preventDefault();678        var count = $wrapper.children('.csf-cloneable-item').length;679        $min.hide();680        if( max && (count+1) > max ) {681          $max.show();682          return;683        }684        var new_field_id = unique_id + field_id + '['+ count +']';685        var $cloned_item = $hidden.csf_clone(true);686        $cloned_item.removeClass('csf-cloneable-hidden');687        $cloned_item.find(':input').each( function() {688          this.name = new_field_id + this.name.replace( ( this.name.startsWith('_nonce') ? '_nonce' : unique_id ), '');689        });690        $cloned_item.find('.csf-data-wrapper').each( function(){691          $(this).attr('data-unique-id', new_field_id );692        });693        $wrapper.append($cloned_item);694        $wrapper.accordion('refresh');695        $wrapper.accordion({active: count});696        $wrapper.csf_customizer_refresh();697        $wrapper.csf_customizer_listen({closest: true});698        if( is_number ) {699          update_title_numbers($wrapper);700        }701      });702      var event_clone = function( e ) {703        e.preventDefault();704        var count = $wrapper.children('.csf-cloneable-item').length;705        $min.hide();706        if( max && (count+1) > max ) {707          $max.show();708          return;709        }710        var $this           = $(this),711            $parent         = $this.parent().parent(),712            $cloned_helper  = $parent.children('.csf-cloneable-helper').csf_clone(true),713            $cloned_title   = $parent.children('.csf-cloneable-title').csf_clone(),714            $cloned_content = $parent.children('.csf-cloneable-content').csf_clone(),715            cloned_regex    = new RegExp('('+ CSF.helper.preg_quote(field_id) +')\\[(\\d+)\\]', 'g');716        $cloned_content.find('.csf-data-wrapper').each( function(){717          var $this = $(this);718          $this.attr('data-unique-id', $this.attr('data-unique-id').replace(cloned_regex, field_id +'['+ ($parent.index()+1) +']') );719        });720        var $cloned = $('<div class="csf-cloneable-item" />');721        $cloned.append($cloned_helper);722        $cloned.append($cloned_title);723        $cloned.append($cloned_content);724        $wrapper.children().eq($parent.index()).after($cloned);725        CSF.helper.name_nested_replace( $wrapper.children('.csf-cloneable-item'), field_id );726        $wrapper.accordion('refresh');727        $wrapper.csf_customizer_refresh();728        $wrapper.csf_customizer_listen({closest: true});729        if( is_number ) {730          update_title_numbers($wrapper);731        }732      };733      $wrapper.children('.csf-cloneable-item').children('.csf-cloneable-helper').on('click', '.csf-cloneable-clone', event_clone);734      $group.children('.csf-cloneable-hidden').children('.csf-cloneable-helper').on('click', '.csf-cloneable-clone', event_clone);735      var event_remove = function( e ) {736        e.preventDefault();737        var count = $wrapper.children('.csf-cloneable-item').length;738        $max.hide();739        $min.hide();740        if( min && (count-1) < min ) {741          $min.show();742          return;743        }744        $(this).closest('.csf-cloneable-item').remove();745        CSF.helper.name_nested_replace( $wrapper.children('.csf-cloneable-item'), field_id );746        $wrapper.csf_customizer_refresh();747        if( is_number ) {748          update_title_numbers($wrapper);749        }750      };751      $wrapper.children('.csf-cloneable-item').children('.csf-cloneable-helper').on('click', '.csf-cloneable-remove', event_remove);752      $group.children('.csf-cloneable-hidden').children('.csf-cloneable-helper').on('click', '.csf-cloneable-remove', event_remove);753    });754  };755  //756  // Field: icon757  //758  $.fn.csf_field_icon = function() {759    return this.each( function() {760      var $this = $(this);761      $this.on('click', '.csf-icon-add', function( e ) {762        e.preventDefault();763        var $button = $(this);764        var $modal  = $('#csf-modal-icon');765        $modal.show();766        CSF.vars.$icon_target = $this;767        if( !CSF.vars.icon_modal_loaded ) {768          $modal.find('.csf-modal-loading').show();769          window.wp.ajax.post( 'csf-get-icons', { nonce: $button.data('nonce') } ).done( function( response ) {770            $modal.find('.csf-modal-loading').hide();771            CSF.vars.icon_modal_loaded = true;772            var $load = $modal.find('.csf-modal-load').html( response.content );773            $load.on('click', 'a', function( e ) {774              e.preventDefault();775              var icon = $(this).data('csf-icon');776              CSF.vars.$icon_target.find('i').removeAttr('class').addClass(icon);777              CSF.vars.$icon_target.find('input').val(icon).trigger('change');778              CSF.vars.$icon_target.find('.csf-icon-preview').removeClass('hidden');779              CSF.vars.$icon_target.find('.csf-icon-remove').removeClass('hidden');780              $modal.hide();781            });782            $modal.on('change keyup', '.csf-icon-search', function() {783              var value  = $(this).val(),784                  $icons = $load.find('a');785              $icons.each( function() {786                var $elem = $(this);787                if( $elem.data('csf-icon').search( new RegExp( value, 'i' ) ) < 0 ) {788                  $elem.hide();789                } else {790                  $elem.show();791                }792              });793            });794            $modal.on('click', '.csf-modal-close, .csf-modal-overlay', function() {795              $modal.hide();796            });797          });798        }799      });800      $this.on('click', '.csf-icon-remove', function( e ) {801        e.preventDefault();802        $this.find('.csf-icon-preview').addClass('hidden');803        $this.find('input').val('').trigger('change');804        $(this).addClass('hidden');805      });806    });807  };808  //809  // Field: media810  //811  $.fn.csf_field_media = function() {812    return this.each( function() {813      var $this          = $(this),814          $upload_button = $this.find('.csf--button'),815          $remove_button = $this.find('.csf--remove'),816          $library       = $upload_button.data('library') && $upload_button.data('library').split(',') || '',817          wp_media_frame;818      $upload_button.on('click', function( e ) {819        e.preventDefault();820        if( typeof window.wp === 'undefined' || ! window.wp.media || ! window.wp.media.gallery ) {821          return;822        }823        if( wp_media_frame ) {824          wp_media_frame.open();825          return;826        }827        wp_media_frame = window.wp.media({828          library: {829            type: $library830          }831        });832        wp_media_frame.on( 'select', function() {833          var thumbnail;834          var attributes   = wp_media_frame.state().get('selection').first().attributes;835          var preview_size = $upload_button.data('preview-size') || 'thumbnail';836          $this.find('.csf--url').val( attributes.url );837          $this.find('.csf--id').val( attributes.id );838          $this.find('.csf--width').val( attributes.width );839          $this.find('.csf--height').val( attributes.height );840          $this.find('.csf--alt').val( attributes.alt );841          $this.find('.csf--title').val( attributes.title );842          $this.find('.csf--description').val( attributes.description );843          if( typeof attributes.sizes !== 'undefined' && typeof attributes.sizes.thumbnail !== 'undefined' && preview_size === 'thumbnail' ) {844            thumbnail = attributes.sizes.thumbnail.url;845          } else if( typeof attributes.sizes !== 'undefined' && typeof attributes.sizes.full !== 'undefined' ) {846            thumbnail = attributes.sizes.full.url;847          } else {848            thumbnail = attributes.icon;849          }850          $remove_button.removeClass('hidden');851          $this.find('.csf--preview').removeClass('hidden');852          $this.find('.csf--src').attr('src', thumbnail);853          $this.find('.csf--thumbnail').val( thumbnail ).trigger('change');854        });855        wp_media_frame.open();856      });857      $remove_button.on('click', function( e ) {858        e.preventDefault();859        $remove_button.addClass('hidden');860        $this.find('.csf--preview').addClass('hidden');861        $this.find('input').val('');862        $this.find('.csf--thumbnail').trigger('change');863      });864    });865  };866  //867  // Field: repeater868  //869  $.fn.csf_field_repeater = function() {870    return this.each( function() {871      var $this     = $(this),872          $fieldset = $this.children('.csf-fieldset'),873          $repeater = $fieldset.length ? $fieldset : $this,874          $wrapper  = $repeater.children('.csf-repeater-wrapper'),875          $hidden   = $repeater.children('.csf-repeater-hidden'),876          $max      = $repeater.children('.csf-repeater-max'),877          $min      = $repeater.children('.csf-repeater-min'),878          field_id  = $wrapper.data('field-id'),879          unique_id = $wrapper.data('unique-id'),880          max       = parseInt( $wrapper.data('max') ),881          min       = parseInt( $wrapper.data('min') );882      $wrapper.children('.csf-repeater-item').children('.csf-repeater-content').csf_reload_script();883      $wrapper.sortable({884        axis: 'y',885        handle: '.csf-repeater-sort',886        helper: 'original',887        cursor: 'move',888        placeholder: 'widget-placeholder',889        update: function( event, ui ) {890          CSF.helper.name_nested_replace( $wrapper.children('.csf-repeater-item'), field_id );891          $wrapper.csf_customizer_refresh();892          ui.item.csf_reload_script_retry();893        }894      });895      $repeater.children('.csf-repeater-add').on('click', function( e ) {896        e.preventDefault();897        var count = $wrapper.children('.csf-repeater-item').length;898        $min.hide();899        if( max && (count+1) > max ) {900          $max.show();901          return;902        }903        var new_field_id = unique_id + field_id + '['+ count +']';904        var $cloned_item = $hidden.csf_clone(true);905        $cloned_item.removeClass('csf-repeater-hidden');906        $cloned_item.find(':input').each( function() {907          this.name = new_field_id + this.name.replace( ( this.name.startsWith('_nonce') ? '_nonce' : unique_id ), '');908        });909        $cloned_item.find('.csf-data-wrapper').each( function(){910          $(this).attr('data-unique-id', new_field_id );911        });912        $wrapper.append($cloned_item);913        $cloned_item.children('.csf-repeater-content').csf_reload_script();914        $wrapper.csf_customizer_refresh();915        $wrapper.csf_customizer_listen({closest: true});916      });917      var event_clone = function( e ) {918        e.preventDefault();919        var count = $wrapper.children('.csf-repeater-item').length;920        $min.hide();921        if( max && (count+1) > max ) {922          $max.show();923          return;924        }925        var $this           = $(this),926            $parent         = $this.parent().parent().parent(),927            $cloned_content = $parent.children('.csf-repeater-content').csf_clone(),928            $cloned_helper  = $parent.children('.csf-repeater-helper').csf_clone(true),929            cloned_regex    = new RegExp('('+ CSF.helper.preg_quote(field_id) +')\\[(\\d+)\\]', 'g');930        $cloned_content.find('.csf-data-wrapper').each( function(){931          var $this = $(this);932          $this.attr('data-unique-id', $this.attr('data-unique-id').replace(cloned_regex, field_id +'['+ ($parent.index()+1) +']') );933        });934        var $cloned = $('<div class="csf-repeater-item" />');935        $cloned.append($cloned_content);936        $cloned.append($cloned_helper);937        $wrapper.children().eq($parent.index()).after($cloned);938        $cloned.children('.csf-repeater-content').csf_reload_script();939        CSF.helper.name_nested_replace( $wrapper.children('.csf-repeater-item'), field_id );940        $wrapper.csf_customizer_refresh();941        $wrapper.csf_customizer_listen({closest: true});942      };943      $wrapper.children('.csf-repeater-item').children('.csf-repeater-helper').on('click', '.csf-repeater-clone', event_clone);944      $repeater.children('.csf-repeater-hidden').children('.csf-repeater-helper').on('click', '.csf-repeater-clone', event_clone);945      var event_remove = function( e ) {946        e.preventDefault();947        var count = $wrapper.children('.csf-repeater-item').length;948        $max.hide();949        $min.hide();950        if( min && (count-1) < min ) {951          $min.show();952          return;953        }954        $(this).closest('.csf-repeater-item').remove();955        CSF.helper.name_nested_replace( $wrapper.children('.csf-repeater-item'), field_id );956        $wrapper.csf_customizer_refresh();957      };958      $wrapper.children('.csf-repeater-item').children('.csf-repeater-helper').on('click', '.csf-repeater-remove', event_remove);959      $repeater.children('.csf-repeater-hidden').children('.csf-repeater-helper').on('click', '.csf-repeater-remove', event_remove);960    });961  };962  //963  // Field: slider964  //965  $.fn.csf_field_slider = function() {966    return this.each( function() {967      var $this   = $(this),968          $input  = $this.find('input'),969          $slider = $this.find('.csf-slider-ui'),970          data    = $input.data(),971          value   = $input.val() || 0;972      if( $slider.hasClass('ui-slider') ) {973        $slider.empty();974      }975      $slider.slider({976        range: 'min',977        value: value,978        min: data.min,979        max: data.max,980        step: data.step,981        slide: function( e, o ) {982          $input.val( o.value ).trigger('change');983        }984      });985      $input.keyup( function() {986        $slider.slider('value', $input.val());987      });988    });989  };990  //991  // Field: sortable992  //993  $.fn.csf_field_sortable = function() {994    return this.each( function() {995      var $sortable = $(this).find('.csf--sortable');996      $sortable.sortable({997        axis: 'y',998        helper: 'original',999        cursor: 'move',1000        placeholder: 'widget-placeholder',1001        update: function( event, ui ) {1002          $sortable.csf_customizer_refresh();1003        }1004      });1005      $sortable.find('.csf--sortable-content').csf_reload_script();1006    });1007  };1008  //1009  // Field: sorter1010  //1011  $.fn.csf_field_sorter = function() {1012    return this.each( function() {1013      var $this         = $(this),1014          $enabled      = $this.find('.csf-enabled'),1015          $has_disabled = $this.find('.csf-disabled'),1016          $disabled     = ( $has_disabled.length ) ? $has_disabled : false;1017      $enabled.sortable({1018        connectWith: $disabled,1019        placeholder: 'ui-sortable-placeholder',1020        update: function( event, ui ) {1021          var $el = ui.item.find('input');1022          if( ui.item.parent().hasClass('csf-enabled') ) {1023            $el.attr('name', $el.attr('name').replace('disabled', 'enabled'));1024          } else {1025            $el.attr('name', $el.attr('name').replace('enabled', 'disabled'));1026          }1027          $this.csf_customizer_refresh();1028        }1029      });1030      if( $disabled ) {1031        $disabled.sortable({1032          connectWith: $enabled,1033          placeholder: 'ui-sortable-placeholder',1034          update: function( event, ui ) {1035            $this.csf_customizer_refresh();1036          }1037        });1038      }1039    });1040  };1041  //1042  // Field: spinner1043  //1044  $.fn.csf_field_spinner = function() {1045    return this.each( function() {1046      var $this   = $(this),1047          $input  = $this.find('input'),1048          $inited = $this.find('.ui-spinner-button');1049      if( $inited.length ) {1050        $inited.remove();1051      }1052      $input.spinner({1053        max: $input.data('max') || 100,1054        min: $input.data('min') || 0,1055        step: $input.data('step') || 1,1056        spin: function (event, ui ) {1057          $input.val(ui.value).trigger('change');1058        }1059      });1060    });1061  };1062  //1063  // Field: switcher1064  //1065  $.fn.csf_field_switcher = function() {1066    return this.each( function() {1067      var $switcher = $(this).find('.csf--switcher');1068      $switcher.on('click', function() {1069        var value  = 0;1070        var $input = $switcher.find('input');1071        if( $switcher.hasClass('csf--active') ) {1072          $switcher.removeClass('csf--active');1073        } else {1074          value = 1;1075          $switcher.addClass('csf--active');1076        }1077        $input.val(value).trigger('change');1078      });1079    });1080  };1081  //1082  // Field: tabbed1083  //1084  $.fn.csf_field_tabbed = function() {1085    return this.each( function() {1086      var $this     = $(this),1087          $links    = $this.find('.csf-tabbed-nav a'),1088          $sections = $this.find('.csf-tabbed-section');1089      $sections.eq(0).csf_reload_script();1090      $links.on( 'click', function( e ) {1091       e.preventDefault();1092        var $link    = $(this),1093            index    = $link.index(),1094            $section = $sections.eq(index);1095        $link.addClass('csf-tabbed-active').siblings().removeClass('csf-tabbed-active');1096        $section.csf_reload_script();1097        $section.removeClass('hidden').siblings().addClass('hidden');1098      });1099    });1100  };1101  //1102  // Field: typography1103  //1104  $.fn.csf_field_typography = function() {1105    return this.each(function () {1106      var base          = this;1107      var $this         = $(this);1108      var loaded_fonts  = [];1109      var webfonts      = csf_typography_json.webfonts;1110      var googlestyles  = csf_typography_json.googlestyles;1111      var defaultstyles = csf_typography_json.defaultstyles;1112      //1113      //1114      // Sanitize google font subset1115      base.sanitize_subset = function( subset ) {1116        subset = subset.replace('-ext', ' Extended');1117        subset = subset.charAt(0).toUpperCase() + subset.slice(1);1118        return subset;1119      };1120      //1121      //1122      // Sanitize google font styles (weight and style)1123      base.sanitize_style = function( style ) {1124        return googlestyles[style] ? googlestyles[style] : style;1125      };1126      //1127      //1128      // Load google font1129      base.load_google_font = function( font_family, weight, style ) {1130        if( font_family && typeof WebFont === 'object' ) {1131          weight = weight ? weight.replace('normal', '') : '';1132          style  = style ? style.replace('normal', '') : '';1133          if( weight || style ) {1134            font_family = font_family +':'+ weight + style;1135          }1136          if( loaded_fonts.indexOf( font_family ) === -1 ) {1137            WebFont.load({ google: { families: [font_family] } });1138          }1139          loaded_fonts.push( font_family );1140        }1141      };1142      //1143      //1144      // Append select options1145      base.append_select_options = function( $select, options, condition, type, is_multi ) {1146        $select.find('option').not(':first').remove();1147        var opts = '';1148        $.each( options, function( key, value ) {1149          var selected;1150          var name = value;1151          // is_multi1152          if( is_multi ) {1153            selected = ( condition && condition.indexOf(value) !== -1 ) ? ' selected' : '';1154          } else {1155            selected = ( condition && condition === value ) ? ' selected' : '';1156          }1157          if( type === 'subset' ) {1158            name = base.sanitize_subset( value );1159          } else if( type === 'style' ){1160            name = base.sanitize_style( value );1161          }1162          opts += '<option value="'+ value +'"'+ selected +'>'+ name +'</option>';1163        });1164        $select.append(opts).trigger('csf.change').trigger('chosen:updated');1165      };1166      base.init = function () {1167        //1168        //1169        // Constants1170        var selected_styles = [];1171        var $typography     = $this.find('.csf--typography');1172        var $type           = $this.find('.csf--type');1173        var unit            = $typography.data('unit');1174        var exclude_fonts   = $typography.data('exclude') ? $typography.data('exclude').split(',') : [];1175        //1176        //1177        // Chosen init1178        if( $this.find('.csf--chosen').length ) {1179          var $chosen_selects = $this.find('select');1180          $chosen_selects.each( function(){1181            var $chosen_select = $(this),1182                $chosen_inited = $chosen_select.parent().find('.chosen-container');1183            if( $chosen_inited.length ) {1184              $chosen_inited.remove();1185            }1186            $chosen_select.chosen({1187              allow_single_deselect: true,1188              disable_search_threshold: 15,1189              width: '100%'1190            });1191          });1192        }1193        //1194        //1195        // Font family select1196        var $font_family_select = $this.find('.csf--font-family');1197        var first_font_family   = $font_family_select.val();1198        // Clear default font family select options1199        $font_family_select.find('option').not(':first-child').remove();1200        var opts = '';1201        $.each(webfonts, function( type, group ) {1202          // Check for exclude fonts1203          if( exclude_fonts && exclude_fonts.indexOf(type) !== -1 ) { return; }1204          opts += '<optgroup label="' + group.label + '">';1205          $.each(group.fonts, function( key, value ) {1206            // use key if value is object1207            value = ( typeof value === 'object' ) ? key : value;1208            var selected = ( value === first_font_family ) ? ' selected' : '';1209            opts += '<option value="'+ value +'" data-type="'+ type +'"'+ selected +'>'+ value +'</option>';1210          });1211          opts += '</optgroup>';1212        });1213        // Append google font select options1214        $font_family_select.append(opts).trigger('chosen:updated');1215        //1216        //1217        // Font style select1218        var $font_style_block = $this.find('.csf--block-font-style');1219        if( $font_style_block.length ) {1220          var $font_style_select = $this.find('.csf--font-style-select');1221          var first_style_value  = $font_style_select.val() ? $font_style_select.val().replace(/normal/g, '' ) : '';1222          //1223          // Font Style on on change listener1224          $font_style_select.on('change csf.change', function( event ) {1225            var style_value = $font_style_select.val();1226            // set a default value1227            if( !style_value && selected_styles && selected_styles.indexOf('normal') === -1 ) {1228              style_value = selected_styles[0];1229            }1230            // set font weight, for eg. replacing 800italic to 8001231            var font_normal = ( style_value && style_value !== 'italic' && style_value === 'normal' ) ? 'normal' : '';1232            var font_weight = ( style_value && style_value !== 'italic' && style_value !== 'normal' ) ? style_value.replace('italic', '') : font_normal;1233            var font_style  = ( style_value && style_value.substr(-6) === 'italic' ) ? 'italic' : '';1234            $this.find('.csf--font-weight').val( font_weight );1235            $this.find('.csf--font-style').val( font_style );1236          });1237          //1238          //1239          // Extra font style select1240          var $extra_font_style_block = $this.find('.csf--block-extra-styles');1241          if( $extra_font_style_block.length ) {1242            var $extra_font_style_select = $this.find('.csf--extra-styles');1243            var first_extra_style_value  = $extra_font_style_select.val();1244          }1245        }1246        //1247        //1248        // Subsets select1249        var $subset_block = $this.find('.csf--block-subset');1250        if( $subset_block.length ) {1251          var $subset_select = $this.find('.csf--subset');1252          var first_subset_select_value = $subset_select.val();1253          var subset_multi_select = $subset_select.data('multiple') || false;1254        }1255        //1256        //1257        // Backup font family1258        var $backup_font_family_block = $this.find('.csf--block-backup-font-family');1259        //1260        //1261        // Font Family on Change Listener1262        $font_family_select.on('change csf.change', function( event ) {1263          // Hide subsets on change1264          if( $subset_block.length ) {1265            $subset_block.addClass('hidden');1266          }1267          // Hide extra font style on change1268          if( $extra_font_style_block.length ) {1269            $extra_font_style_block.addClass('hidden');1270          }1271          // Hide backup font family on change1272          if( $backup_font_family_block.length ) {1273            $backup_font_family_block.addClass('hidden');1274          }1275          var $selected = $font_family_select.find(':selected');1276          var value     = $selected.val();1277          var type      = $selected.data('type');1278          if( type && value ) {1279            // Show backup fonts if font type google or custom1280            if( ( type === 'google' || type === 'custom' ) && $backup_font_family_block.length ) {1281              $backup_font_family_block.removeClass('hidden');1282            }1283            // Appending font style select options1284            if( $font_style_block.length ) {1285              // set styles for multi and normal style selectors1286              var styles = defaultstyles;1287              // Custom or gogle font styles1288              if( type === 'google' && webfonts[type].fonts[value][0] ) {1289                styles = webfonts[type].fonts[value][0];1290              } else if( type === 'custom' && webfonts[type].fonts[value] ) {1291                styles = webfonts[type].fonts[value];1292              }1293              selected_styles = styles;1294              // Set selected style value for avoid load errors1295              var set_auto_style  = ( styles.indexOf('normal') !== -1 ) ? 'normal' : styles[0];1296              var set_style_value = ( first_style_value && styles.indexOf(first_style_value) !== -1 ) ? first_style_value : set_auto_style;1297              // Append style select options1298              base.append_select_options( $font_style_select, styles, set_style_value, 'style' );1299              // Clear first value1300              first_style_value = false;1301              // Show style select after appended1302              $font_style_block.removeClass('hidden');1303              // Appending extra font style select options1304              if( type === 'google' && $extra_font_style_block.length && styles.length > 1 ) {1305                // Append extra-style select options1306                base.append_select_options( $extra_font_style_select, styles, first_extra_style_value, 'style', true );1307                // Clear first value1308                first_extra_style_value = false;1309                // Show style select after appended1310                $extra_font_style_block.removeClass('hidden');1311              }1312            }1313            // Appending google fonts subsets select options1314            if( type === 'google' && $subset_block.length && webfonts[type].fonts[value][1] ) {1315              var subsets          = webfonts[type].fonts[value][1];1316              var set_auto_subset  = ( subsets.length < 2 && subsets[0] !== 'latin' ) ? subsets[0] : '';1317              var set_subset_value = ( first_subset_select_value && subsets.indexOf(first_subset_select_value) !== -1 ) ? first_subset_select_value : set_auto_subset;1318              // check for multiple subset select1319              set_subset_value = ( subset_multi_select && first_subset_select_value ) ? first_subset_select_value : set_subset_value;1320              base.append_select_options( $subset_select, subsets, set_subset_value, 'subset', subset_multi_select );1321              first_subset_select_value = false;1322              $subset_block.removeClass('hidden');1323            }1324          } else {1325            // Clear subsets options if type and value empty1326            if( $subset_block.length ) {1327              $subset_select.find('option').not(':first-child').remove();1328              $subset_select.trigger('chosen:updated');1329            }1330            // Clear font styles options if type and value empty1331            if( $font_style_block.length ) {1332              $font_style_select.find('option').not(':first-child').remove();1333              $font_style_select.trigger('chosen:updated');1334            }1335          }1336          // Update font type input value1337          $type.val(type);1338        }).trigger('csf.change');1339        //1340        //1341        // Preview1342        var $preview_block = $this.find('.csf--block-preview');1343        if( $preview_block.length ) {1344          var $preview = $this.find('.csf--preview');1345          // Set preview styles on change1346          $this.on('change', CSF.helper.debounce( function( event ) {1347            $preview_block.removeClass('hidden');1348            var font_family       = $font_family_select.val(),1349                font_weight       = $this.find('.csf--font-weight').val(),1350                font_style        = $this.find('.csf--font-style').val(),1351                font_size         = $this.find('.csf--font-size').val(),1352                font_variant      = $this.find('.csf--font-variant').val(),1353                line_height       = $this.find('.csf--line-height').val(),1354                text_align        = $this.find('.csf--text-align').val(),1355                text_transform    = $this.find('.csf--text-transform').val(),1356                text_decoration   = $this.find('.csf--text-decoration').val(),1357                text_color        = $this.find('.csf--color').val(),1358                word_spacing      = $this.find('.csf--word-spacing').val(),1359                letter_spacing    = $this.find('.csf--letter-spacing').val(),1360                custom_style      = $this.find('.csf--custom-style').val(),1361                type              = $this.find('.csf--type').val();1362            if( type === 'google' ) {1363              base.load_google_font(font_family, font_weight, font_style);1364            }1365            var properties = {};1366            if( font_family     ) { properties.fontFamily     = font_family;           }1367            if( font_weight     ) { properties.fontWeight     = font_weight;           }1368            if( font_style      ) { properties.fontStyle      = font_style;            }1369            if( font_variant    ) { properties.fontVariant    = font_variant;          }1370            if( font_size       ) { properties.fontSize       = font_size + unit;      }1371            if( line_height     ) { properties.lineHeight     = line_height + unit;    }1372            if( letter_spacing  ) { properties.letterSpacing  = letter_spacing + unit; }1373            if( word_spacing    ) { properties.wordSpacing    = word_spacing + unit;   }1374            if( text_align      ) { properties.textAlign      = text_align;            }1375            if( text_transform  ) { properties.textTransform  = text_transform;        }1376            if( text_decoration ) { properties.textDecoration = text_decoration;       }1377            if( text_color      ) { properties.color          = text_color;            }1378            $preview.removeAttr('style');1379            // Customs style attribute1380            if( custom_style ) { $preview.attr('style', custom_style); }1381            $preview.css(properties);1382          }, 100 ) );1383          // Preview black and white backgrounds trigger1384          $preview_block.on('click', function() {1385            $preview.toggleClass('csf--black-background');1386            var $toggle = $preview_block.find('.csf--toggle');1387            if( $toggle.hasClass('fa-toggle-off') ) {1388              $toggle.removeClass('fa-toggle-off').addClass('fa-toggle-on');1389            } else {1390              $toggle.removeClass('fa-toggle-on').addClass('fa-toggle-off');1391            }1392          });1393          if( !$preview_block.hasClass('hidden') ) {1394            $this.trigger('change');1395          }1396        }1397      };1398      base.init();1399    });1400  };1401  //1402  // Field: upload1403  //1404  $.fn.csf_field_upload = function() {1405    return this.each( function() {1406      var $this          = $(this),1407          $input         = $this.find('input'),1408          $upload_button = $this.find('.csf--button'),1409          $remove_button = $this.find('.csf--remove'),1410          $library       = $upload_button.data('library') && $upload_button.data('library').split(',') || '',1411          wp_media_frame;1412      $input.on('change', function( e ) {1413        if( $input.val() ) {1414          $remove_button.removeClass('hidden');1415        } else {1416          $remove_button.addClass('hidden');1417        }1418      });1419      $upload_button.on('click', function( e ) {1420        e.preventDefault();1421        if( typeof window.wp === 'undefined' || ! window.wp.media || ! window.wp.media.gallery ) {1422          return;1423        }1424        if( wp_media_frame ) {1425          wp_media_frame.open();1426          return;1427        }1428        wp_media_frame = window.wp.media({1429          library: {1430            type: $library1431          },1432        });1433        wp_media_frame.on( 'select', function() {1434          $input.val( wp_media_frame.state().get('selection').first().attributes.url ).trigger('change');1435        });1436        wp_media_frame.open();1437      });1438      $remove_button.on('click', function( e ) {1439        e.preventDefault();1440        $input.val('').trigger('change');1441      });1442    });1443  };1444  //1445  // Confirm1446  //1447  $.fn.csf_confirm = function() {1448    return this.each( function() {1449      $(this).on('click', function( e ) {1450        var confirm_text    = $(this).data('confirm') || window.csf_vars.i18n.confirm;1451        var confirm_answer  = confirm( confirm_text );1452        CSF.vars.is_confirm = true;1453        if( !confirm_answer ) {1454          e.preventDefault();1455          CSF.vars.is_confirm = false;1456          return false;1457        }1458      });1459    });1460  };1461  $.fn.serializeObject = function(){1462    var obj = {};1463    $.each( this.serializeArray(), function(i,o){1464      var n = o.name,1465        v = o.value;1466        obj[n] = obj[n] === undefined ? v1467          : $.isArray( obj[n] ) ? obj[n].concat( v )1468          : [ obj[n], v ];1469    });1470    return obj;1471  };1472  //1473  // Options Save1474  //1475  $.fn.csf_save = function() {1476    return this.each( function() {1477      var $this    = $(this),1478          $buttons = $('.csf-save'),1479          $panel   = $('.csf-options'),1480          flooding = false,1481          timeout;1482      $this.on('click', function( e ) {1483        if( !flooding ) {1484          var $text  = $this.data('save'),1485              $value = $this.val();1486          $buttons.attr('value', $text);1487          if( $this.hasClass('csf-save-ajax') ) {1488            e.preventDefault();1489            $panel.addClass('csf-saving');1490            $buttons.prop('disabled', true);1491            window.wp.ajax.post( 'csf_'+ $panel.data('unique') +'_ajax_save', {1492              data: $('#csf-form').serializeJSONCSF()1493            })1494            .done( function( response ) {1495              clearTimeout(timeout);1496              var $result_success = $('.csf-form-success');1497              $result_success.empty().append(response.notice).slideDown('fast', function() {1498                timeout = setTimeout( function() {1499                  $result_success.slideUp('fast');1500                }, 2000);1501              });1502              // clear errors1503              $('.csf-error').remove();1504              var $append_errors = $('.csf-form-error');1505              $append_errors.empty().hide();1506              if( Object.keys( response.errors ).length ) {1507                var error_icon = '<i class="csf-label-error csf-error">!</i>';1508                $.each(response.errors, function( key, error_message ) {1509                  var $field = $('[data-depend-id="'+ key +'"]'),1510                      $link  = $('#csf-tab-link-'+ ($field.closest('.csf-section').index()+1)),1511                      $tab   = $link.closest('.csf-tab-depth-0');1512                  $field.closest('.csf-fieldset').append( '<p class="csf-text-error csf-error">'+ error_message +'</p>' );1513                  if( !$link.find('.csf-error').length ) {1514                    $link.append( error_icon );1515                  }1516                  if( !$tab.find('.csf-arrow .csf-error').length ) {1517                    $tab.find('.csf-arrow').append( error_icon );1518                  }1519                  console.log(error_message);1520                  $append_errors.append( '<div>'+ error_icon +' '+ error_message + '</div>' );1521                });1522                $append_errors.show();1523              }1524              $panel.removeClass('csf-saving');1525              $buttons.prop('disabled', false).attr('value', $value);1526              flooding = false;1527            })1528            .fail( function( response ) {1529              alert( response.error );1530            });1531          }1532        }1533        flooding = true;1534      });1535    });1536  };1537  //1538  // Taxonomy Framework1539  //1540  $.fn.csf_taxonomy = function() {1541    return this.each( function() {1542      var $this = $(this),1543          $form = $this.parents('form');1544      if( $form.attr('id') === 'addtag' ) {1545        var $submit = $form.find('#submit'),1546            $cloned = $this.find('.csf-field').csf_clone();1547        $submit.on( 'click', function() {1548          if( !$form.find('.form-required').hasClass('form-invalid') ) {1549            $this.data('inited', false);1550            $this.empty();1551            $this.html( $cloned );1552            $cloned = $cloned.csf_clone();1553            $this.csf_reload_script();1554          }1555        });1556      }1557    });1558  };1559  //1560  // Shortcode Framework1561  //1562  $.fn.csf_shortcode = function() {1563    var base = this;1564    base.shortcode_parse = function( serialize, key ) {1565      var shortcode = '';1566      $.each(serialize, function( shortcode_key, shortcode_values ) {1567        key = ( key ) ? key : shortcode_key;1568        shortcode += '[' + key;1569        $.each(shortcode_values, function( shortcode_tag, shortcode_value ) {1570          if( shortcode_tag === 'content' ) {1571            shortcode += ']';1572            shortcode += shortcode_value;1573            shortcode += '[/'+ key +'';1574          } else {1575            shortcode += base.shortcode_tags( shortcode_tag, shortcode_value );1576          }1577        });1578        shortcode += ']';1579      });1580      return shortcode;1581    };1582    base.shortcode_tags = function( shortcode_tag, shortcode_value ) {1583      var shortcode = '';1584      if( shortcode_value !== '' ) {1585        if( typeof shortcode_value === 'object' && !$.isArray( shortcode_value ) ) {1586          $.each(shortcode_value, function( sub_shortcode_tag, sub_shortcode_value ) {1587            // sanitize spesific key/value1588            switch( sub_shortcode_tag ) {1589              case 'background-image':1590                sub_shortcode_value = ( sub_shortcode_value.url  ) ? sub_shortcode_value.url : '';1591              break;1592            }1593            if( sub_shortcode_value !== '' ) {1594              shortcode += ' ' + sub_shortcode_tag.replace('-', '_') + '="' + sub_shortcode_value.toString() + '"';1595            }1596          });1597        } else {1598          shortcode += ' ' + shortcode_tag.replace('-', '_') + '="' + shortcode_value.toString() + '"';1599        }1600      }1601      return shortcode;1602    };1603    base.insertAtChars = function( _this, currentValue ) {1604      var obj = ( typeof _this[0].name !== 'undefined' ) ? _this[0] : _this;1605      if( obj.value.length && typeof obj.selectionStart !== 'undefined' ) {1606        obj.focus();1607        return obj.value.substring( 0, obj.selectionStart ) + currentValue + obj.value.substring( obj.selectionEnd, obj.value.length );1608      } else {1609        obj.focus();1610        return currentValue;1611      }1612    };1613    base.send_to_editor = function( html, editor_id ) {1614      var tinymce_editor;1615      if( typeof tinymce !== 'undefined' ) {1616        tinymce_editor = tinymce.get( editor_id );1617      }1618      if( tinymce_editor && !tinymce_editor.isHidden() ) {1619        tinymce_editor.execCommand( 'mceInsertContent', false, html );1620      } else {1621        var $editor = $('#'+editor_id);1622        $editor.val( base.insertAtChars( $editor, html ) ).trigger('change');1623      }1624    };1625    return this.each( function() {1626      var $modal   = $(this),1627          $load    = $modal.find('.csf-modal-load'),1628          $content = $modal.find('.csf-modal-content'),1629          $insert  = $modal.find('.csf-modal-insert'),1630          $loading = $modal.find('.csf-modal-loading'),1631          $select  = $modal.find('select'),1632          modal_id = $modal.data('modal-id'),1633          nonce    = $modal.data('nonce'),1634          editor_id,1635          target_id,1636          gutenberg_id,1637          sc_key,1638          sc_name,1639          sc_view,1640          sc_group,1641          $cloned,1642          $button;1643      $(document).on('click', '.csf-shortcode-button[data-modal-id="'+ modal_id +'"]', function( e ) {1644        e.preventDefault();1645        $button      = $(this);1646        editor_id    = $button.data('editor-id')    || false;1647        target_id    = $button.data('target-id')    || false;1648        gutenberg_id = $button.data('gutenberg-id') || false;1649        $modal.show();1650        // single usage trigger first shortcode1651        if( $modal.hasClass('csf-shortcode-single') && sc_name === undefined ) {1652          $select.trigger('change');1653        }1654      });1655      $select.on( 'change', function() {1656        var $option   = $(this);1657        var $selected = $option.find(':selected');1658        sc_key   = $option.val();1659        sc_name  = $selected.data('shortcode');1660        sc_view  = $selected.data('view') || 'normal';1661        sc_group = $selected.data('group') || sc_name;1662        $load.empty();1663        if( sc_key ) {1664          $loading.show();1665          window.wp.ajax.post( 'csf-get-shortcode-'+ modal_id, {1666            shortcode_key: sc_key,1667            nonce: nonce1668          })1669          .done( function( response ) {1670            $loading.hide();1671            var $appended = $(response.content).appendTo($load);1672            $insert.parent().removeClass('hidden');1673            $cloned = $appended.find('.csf--repeat-shortcode').csf_clone();1674            $appended.csf_reload_script();1675            $appended.find('.csf-fields').csf_reload_script();1676          });1677        } else {1678          $insert.parent().addClass('hidden');1679        }1680      });1681      $insert.on('click', function( e ) {1682        e.preventDefault();1683        var shortcode = '';1684        var serialize = $modal.find('.csf-field:not(.hidden)').find(':input').serializeObjectCSF();1685        switch ( sc_view ) {1686          case 'contents':1687            var contentsObj = ( sc_name ) ? serialize[sc_name] : serialize;1688            $.each(contentsObj, function( sc_key, sc_value ) {1689              var sc_tag = ( sc_name ) ? sc_name : sc_key;1690              shortcode += '['+ sc_tag +']'+ sc_value +'[/'+ sc_tag +']';1691            });1692          break;1693          case 'group':1694            shortcode += '[' + sc_name;1695            $.each(serialize[sc_name], function( sc_key, sc_value ) {1696              shortcode += base.shortcode_tags( sc_key, sc_value );1697            });1698            shortcode += ']';1699            shortcode += base.shortcode_parse( serialize[sc_group], sc_group );1700            shortcode += '[/' + sc_name + ']';1701          break;1702          case 'repeater':1703            shortcode += base.shortcode_parse( serialize[sc_group], sc_group );1704          break;1705          default:1706            shortcode += base.shortcode_parse( serialize );1707          break;1708        }1709        if( gutenberg_id ) {1710          var content = window.csf_gutenberg_props.attributes.hasOwnProperty('shortcode') ? window.csf_gutenberg_props.attributes.shortcode : '';1711          window.csf_gutenberg_props.setAttributes({shortcode: content + shortcode});1712        } else if( editor_id ) {1713          base.send_to_editor( shortcode, editor_id );1714        } else {1715          var $textarea = (target_id) ? $(target_id) : $button.parent().find('textarea');1716          $textarea.val( base.insertAtChars( $textarea, shortcode ) ).trigger('change');1717        }1718        $modal.hide();1719      });1720      $modal.on('click', '.csf--repeat-button', function( e ) {1721        e.preventDefault();1722        var $repeatable = $modal.find('.csf--repeatable');1723        var $new_clone  = $cloned.csf_clone();1724        var $remove_btn = $new_clone.find('.csf-repeat-remove');1725        var $appended = $new_clone.appendTo( $repeatable );1726        $new_clone.find('.csf-fields').csf_reload_script();1727        CSF.helper.name_nested_replace( $modal.find('.csf--repeat-shortcode'), sc_group );1728        $remove_btn.on('click', function() {1729          $new_clone.remove();1730          CSF.helper.name_nested_replace( $modal.find('.csf--repeat-shortcode'), sc_group );1731        });1732      });1733      $modal.on('click', '.csf-modal-close, .csf-modal-overlay', function() {1734        $modal.hide();1735      });1736    });1737  };1738  //1739  // Helper Checkbox Checker1740  //1741  $.fn.csf_checkbox = function() {1742    return this.each( function() {1743      var $this     = $(this),1744          $input    = $this.find('.csf--input'),1745          $checkbox = $this.find('.csf--checkbox');1746      $checkbox.on('click', function() {1747        $input.val( Number( $checkbox.prop('checked') ) ).trigger('change');1748      });1749    });1750  };1751  //1752  // Field: wp_editor1753  //1754  $.fn.csf_field_wp_editor = function() {1755    return this.each( function() {1756      if( typeof window.wp.editor === 'undefined' || typeof window.tinyMCEPreInit === 'undefined' || typeof window.tinyMCEPreInit.mceInit.csf_wp_editor === 'undefined' ) {1757        return;1758      }1759      var $this     = $(this),1760          $editor   = $this.find('.csf-wp-editor'),1761          $textarea = $this.find('textarea');1762      // If there is wp-editor remove it for avoid dupliated wp-editor conflicts.1763      var $has_wp_editor = $this.find('.wp-editor-wrap').length || $this.find('.mce-container').length;1764      if( $has_wp_editor ) {1765        $editor.empty();1766        $editor.append($textarea);1767        $textarea.css('display', '');1768      }1769      // Generate a unique id1770      var uid = CSF.helper.uid('csf-editor-');1771      $textarea.attr('id', uid);1772      // Get default editor settings1773      var default_editor_settings = {1774        tinymce: window.tinyMCEPreInit.mceInit.csf_wp_editor,1775        quicktags: window.tinyMCEPreInit.qtInit.csf_wp_editor1776      };1777      // Get default editor settings1778      var field_editor_settings = $editor.data('editor-settings');1779      // Add on change event handle1780      var editor_on_change = function( editor ) {1781        editor.on('change', CSF.helper.debounce( function() {1782          editor.save();1783          $textarea.trigger('change');1784        }, 250 ) );1785      };1786      // Extend editor selector and on change event handler1787      default_editor_settings.tinymce = $.extend( {}, default_editor_settings.tinymce, { selector: '#'+ uid, setup: editor_on_change } );1788      // Override editor tinymce settings1789      if( field_editor_settings.tinymce === false ) {1790        default_editor_settings.tinymce = false;1791        $editor.addClass('csf-no-tinymce');1792      }1793      // Override editor quicktags settings1794      if( field_editor_settings.quicktags === false ) {1795        default_editor_settings.quicktags = false;1796        $editor.addClass('csf-no-quicktags');1797      }1798      // Wait until :visible1799      var interval = setInterval(function () {1800        if( $this.is(':visible') ) {1801          window.wp.editor.initialize(uid, default_editor_settings);1802          clearInterval(interval);1803        }1804      });1805      // Add Media buttons1806      if( field_editor_settings.media_buttons && window.csf_media_buttons ) {1807        var $editor_buttons = $editor.find('.wp-media-buttons');1808        if( $editor_buttons.length ) {1809          $editor_buttons.find('.csf-shortcode-button').data('editor-id', uid);1810        } else {1811          var $media_buttons = $(window.csf_media_buttons);1812          $media_buttons.find('.csf-shortcode-button').data('editor-id', uid);1813          $editor.prepend( $media_buttons );1814        }1815      }1816    });1817  };1818  //1819  // Siblings1820  //1821  $.fn.csf_siblings = function() {1822    return this.each( function() {1823      var $this     = $(this),1824          $siblings = $this.find('.csf--sibling'),1825          multiple  = $this.data('multiple') || false;1826      $siblings.on('click', function() {1827        var $sibling = $(this);1828        if( multiple ) {1829          if( $sibling.hasClass('csf--active') ) {1830            $sibling.removeClass('csf--active');1831            $sibling.find('input').prop('checked', false).trigger('change');1832          } else {1833            $sibling.addClass('csf--active');1834            $sibling.find('input').prop('checked', true).trigger('change');1835          }1836        } else {1837          $this.find('input').prop('checked', false);1838          $sibling.find('input').prop('checked', true).trigger('change');1839          $sibling.addClass('csf--active').siblings().removeClass('csf--active');1840        }1841      });1842    });1843  };1844  //1845  // WP Color Picker1846  //1847  if( typeof Color === 'function' ) {1848    Color.fn.toString = function() {1849      if( this._alpha < 1 ) {1850        return this.toCSS('rgba', this._alpha).replace(/\s+/g, '');1851      }1852      var hex = parseInt( this._color, 10 ).toString( 16 );1853      if( this.error ) { return ''; }1854      if( hex.length < 6 ) {1855        for (var i = 6 - hex.length - 1; i >= 0; i--) {1856          hex = '0' + hex;1857        }1858      }1859      return '#' + hex;1860    };1861  }1862  CSF.funcs.parse_color = function( color ) {1863    var value = color.replace(/\s+/g, ''),1864        trans = ( value.indexOf('rgba') !== -1 ) ? parseFloat( value.replace(/^.*,(.+)\)/, '$1') * 100 ) : 100,1865        rgba  = ( trans < 100 ) ? true : false;1866    return { value: value, transparent: trans, rgba: rgba };1867  };1868  $.fn.csf_color = function() {1869    return this.each( function() {1870      var $input        = $(this),1871          picker_color  = CSF.funcs.parse_color( $input.val() ),1872          palette_color = window.csf_vars.color_palette.length ? window.csf_vars.color_palette : true,1873          $container;1874      // Destroy and Reinit1875      if( $input.hasClass('wp-color-picker') ) {1876        $input.closest('.wp-picker-container').after($input).remove();1877      }1878      $input.wpColorPicker({1879        palettes: palette_color,1880        change: function( event, ui ) {1881          var ui_color_value = ui.color.toString();1882          $container.removeClass('csf--transparent-active');1883          $container.find('.csf--transparent-offset').css('background-color', ui_color_value);1884          $input.val(ui_color_value).trigger('change');1885        },1886        create: function() {1887          $container = $input.closest('.wp-picker-container');1888          var a8cIris = $input.data('a8cIris'),1889              $transparent_wrap = $('<div class="csf--transparent-wrap">' +1890                                '<div class="csf--transparent-slider"></div>' +1891                                '<div class="csf--transparent-offset"></div>' +1892                                '<div class="csf--transparent-text"></div>' +1893                                '<div class="csf--transparent-button button button-small">transparent</div>' +1894                                '</div>').appendTo( $container.find('.wp-picker-holder') ),1895              $transparent_slider = $transparent_wrap.find('.csf--transparent-slider'),1896              $transparent_text   = $transparent_wrap.find('.csf--transparent-text'),1897              $transparent_offset = $transparent_wrap.find('.csf--transparent-offset'),1898              $transparent_button = $transparent_wrap.find('.csf--transparent-button');1899          if( $input.val() === 'transparent' ) {1900            $container.addClass('csf--transparent-active');1901          }1902          $transparent_button.on('click', function() {1903            if( $input.val() !== 'transparent' ) {1904              $input.val('transparent').trigger('change').removeClass('iris-error');1905              $container.addClass('csf--transparent-active');1906            } else {1907              $input.val( a8cIris._color.toString() ).trigger('change');1908              $container.removeClass('csf--transparent-active');1909            }1910          });1911          $transparent_slider.slider({1912            value: picker_color.transparent,1913            step: 1,1914            min: 0,1915            max: 100,1916            slide: function( event, ui ) {1917              var slide_value = parseFloat( ui.value / 100 );1918              a8cIris._color._alpha = slide_value;1919              $input.wpColorPicker( 'color', a8cIris._color.toString() );1920              $transparent_text.text( ( slide_value === 1 || slide_value === 0 ? '' : slide_value ) );1921            },1922            create: function() {1923              var slide_value = parseFloat( picker_color.transparent / 100 ),1924                  text_value  = slide_value < 1 ? slide_value : '';1925              $transparent_text.text(text_value);1926              $transparent_offset.css('background-color', picker_color.value);1927              $container.on('click', '.wp-picker-clear', function() {1928                a8cIris._color._alpha = 1;1929                $transparent_text.text('');1930                $transparent_slider.slider('option', 'value', 100);1931                $container.removeClass('csf--transparent-active');1932                $input.trigger('change');1933              });1934              $container.on('click', '.wp-picker-default', function() {1935                var default_color = CSF.funcs.parse_color( $input.data('default-color') ),1936                    default_value = parseFloat( default_color.transparent / 100 ),1937                    default_text  = default_value < 1 ? default_value : '';1938                a8cIris._color._alpha = default_value;1939                $transparent_text.text(default_text);1940                $transparent_slider.slider('option', 'value', default_color.transparent);1941              });1942              $container.on('click', '.wp-color-result', function() {1943                $transparent_wrap.toggle();1944              });1945              $('body').on( 'click.wpcolorpicker', function() {1946                $transparent_wrap.hide();1947              });1948            }1949          });1950        }1951      });1952    });1953  };1954  //1955  // ChosenJS1956  //1957  $.fn.csf_chosen = function() {1958    return this.each( function() {1959      var $this       = $(this),1960          $inited     = $this.parent().find('.chosen-container'),1961          is_multi    = $this.attr('multiple') || false,1962          set_width   = is_multi ? '100%' : 'auto',1963          set_options = $.extend({1964            allow_single_deselect: true,1965            disable_search_threshold: 15,1966            width: set_width1967          }, $this.data());1968      if( $inited.length ) {1969        $inited.remove();1970      }1971      $this.chosen(set_options);1972    });1973  };1974  //1975  // Number (only allow numeric inputs)1976  //1977  $.fn.csf_number = function() {1978    return this.each( function() {1979      $(this).on('keypress', function( e ) {1980        if( e.keyCode !== 0 && e.keyCode !== 8 && e.keyCode !== 45 && e.keyCode !== 46 && ( e.keyCode < 48 || e.keyCode > 57 ) ) {1981          return false;1982        }1983      });1984    });1985  };1986  //1987  // Help Tooltip1988  //1989  $.fn.csf_help = function() {1990    return this.each( function() {1991      var $this = $(this),1992          $tooltip,1993          offset_left;1994      $this.on({1995        mouseenter: function() {1996          $tooltip = $( '<div class="csf-tooltip"></div>' ).html( $this.find('.csf-help-text').html() ).appendTo('body');1997          offset_left = ( CSF.vars.is_rtl ) ? ( $this.offset().left + 24 ) : ( $this.offset().left - $tooltip.outerWidth() );1998          $tooltip.css({1999            top: $this.offset().top - ( ( $tooltip.outerHeight() / 2 ) - 14 ),2000            left: offset_left,2001          });2002        },2003        mouseleave: function() {2004          if( $tooltip !== undefined ) {2005            $tooltip.remove();2006          }2007        }2008      });2009    });2010  };2011  //2012  // Customize Refresh2013  //2014  $.fn.csf_customizer_refresh = function() {2015    return this.each( function() {2016      var $this    = $(this),2017          $complex = $this.closest('.csf-customize-complex');2018      if( $complex.length ) {2019        var $input  = $complex.find(':input'),2020            $unique = $complex.data('unique-id'),2021            $option = $complex.data('option-id'),2022            obj     = $input.serializeObjectCSF(),2023            data    = ( !$.isEmptyObject(obj) ) ? obj[$unique][$option] : '',2024            control = wp.customize.control($unique +'['+ $option +']');2025        // clear the value to force refresh.2026        control.setting._value = null;2027        control.setting.set( data );2028      } else {2029        $this.find(':input').first().trigger('change');2030      }2031      $(document).trigger('csf-customizer-refresh', $this);2032    });2033  };2034  //2035  // Customize Listen Form Elements2036  //2037  $.fn.csf_customizer_listen = function( options ) {2038    var settings = $.extend({2039      closest: false,2040    }, options );2041    return this.each( function() {2042      if( window.wp.customize === undefined ) { return; }2043      var $this     = ( settings.closest ) ? $(this).closest('.csf-customize-complex') : $(this),2044          $input    = $this.find(':input'),2045          unique_id = $this.data('unique-id'),2046          option_id = $this.data('option-id');2047      if( unique_id === undefined ) { return; }2048      $input.on('change keyup', CSF.helper.debounce( function() {2049        var obj = $this.find(':input').serializeObjectCSF();2050        if( !$.isEmptyObject(obj) && obj[unique_id] ) {2051          window.wp.customize.control( unique_id +'['+ option_id +']' ).setting.set( obj[unique_id][option_id] );2052        }2053      }, 250 ) );2054    });2055  };2056  //2057  // Customizer Listener for Reload JS2058  //2059  $(document).on('expanded', '.control-section-csf', function() {2060    var $this = $(this);2061    if( $this.hasClass('open') && !$this.data('inited') ) {2062      $this.csf_dependency();2063      $this.find('.csf-customize-field').csf_reload_script({dependency: false});2064      $this.find('.csf-customize-complex').csf_customizer_listen();2065      $this.data('inited', true);2066    }2067  });2068  //2069  // Window on resize2070  //2071  CSF.vars.$window.on('resize csf.resize', CSF.helper.debounce( function( event ) {2072    var window_width = navigator.userAgent.indexOf('AppleWebKit/') > -1 ? CSF.vars.$window.width() : window.innerWidth;2073    if( window_width <= 782 && !CSF.vars.onloaded ) {2074      $('.csf-section').csf_reload_script();2075      CSF.vars.onloaded  = true;2076    }2077  }, 200)).trigger('csf.resize');2078  //2079  // Widgets Framework2080  //2081  $.fn.csf_widgets = function() {2082    if( this.length ) {2083      $(document).on('widget-added widget-updated', function( event, $widget ) {2084        $widget.find('.csf-fields').csf_reload_script();2085      });2086      $('.widgets-sortables, .control-section-sidebar').on('sortstop', function( event, ui ) {2087        ui.item.find('.csf-fields').csf_reload_script_retry();2088      });2089      $(document).on('click', '.widget-top', function( event ) {2090        $(this).parent().find('.csf-fields').csf_reload_script();2091      });2092    }2093  };2094  //2095  // Retry Plugins2096  //2097  $.fn.csf_reload_script_retry = function() {2098    return this.each( function() {2099      var $this = $(this);2100      if( $this.data('inited') ) {2101        $this.children('.csf-field-wp_editor').csf_field_wp_editor();2102      }2103    });2104  };2105  //2106  // Reload Plugins2107  //2108  $.fn.csf_reload_script = function( options ) {2109    var settings = $.extend({2110      dependency: true,2111    }, options );2112    return this.each( function() {2113      var $this = $(this);2114      // Avoid for conflicts2115      if( !$this.data('inited') ) {2116        // Field plugins2117        $this.children('.csf-field-accordion').csf_field_accordion();2118        $this.children('.csf-field-backup').csf_field_backup();2119        $this.children('.csf-field-background').csf_field_background();2120        $this.children('.csf-field-code_editor').csf_field_code_editor();2121        $this.children('.csf-field-date').csf_field_date();2122        $this.children('.csf-field-fieldset').csf_field_fieldset();2123        $this.children('.csf-field-gallery').csf_field_gallery();2124        $this.children('.csf-field-group').csf_field_group();2125        $this.children('.csf-field-icon').csf_field_icon();2126        $this.children('.csf-field-media').csf_field_media();2127        $this.children('.csf-field-repeater').csf_field_repeater();2128        $this.children('.csf-field-slider').csf_field_slider();2129        $this.children('.csf-field-sortable').csf_field_sortable();2130        $this.children('.csf-field-sorter').csf_field_sorter();2131        $this.children('.csf-field-spinner').csf_field_spinner();2132        $this.children('.csf-field-switcher').csf_field_switcher();2133        $this.children('.csf-field-tabbed').csf_field_tabbed();2134        $this.children('.csf-field-typography').csf_field_typography();2135        $this.children('.csf-field-upload').csf_field_upload();2136        $this.children('.csf-field-wp_editor').csf_field_wp_editor();2137        // Field colors2138        $this.children('.csf-field-border').find('.csf-color').csf_color();2139        $this.children('.csf-field-background').find('.csf-color').csf_color();2140        $this.children('.csf-field-color').find('.csf-color').csf_color();2141        $this.children('.csf-field-color_group').find('.csf-color').csf_color();2142        $this.children('.csf-field-link_color').find('.csf-color').csf_color();2143        $this.children('.csf-field-typography').find('.csf-color').csf_color();2144        // Field allows only number2145        $this.children('.csf-field-dimensions').find('.csf-number').csf_number();2146        $this.children('.csf-field-slider').find('.csf-number').csf_number();2147        $this.children('.csf-field-spacing').find('.csf-number').csf_number();2148        $this.children('.csf-field-spinner').find('.csf-number').csf_number();2149        $this.children('.csf-field-typography').find('.csf-number').csf_number();2150        // Field chosenjs2151        $this.children('.csf-field-select').find('.csf-chosen').csf_chosen();2152        // Field Checkbox2153        $this.children('.csf-field-checkbox').find('.csf-checkbox').csf_checkbox();2154        // Field Siblings2155        $this.children('.csf-field-button_set').find('.csf-siblings').csf_siblings();2156        $this.children('.csf-field-image_select').find('.csf-siblings').csf_siblings();2157        $this.children('.csf-field-palette').find('.csf-siblings').csf_siblings();2158        // Help Tooptip2159        $this.children('.csf-field').find('.csf-help').csf_help();2160        if( settings.dependency ) {2161          $this.csf_dependency();2162        }2163        $this.data('inited', true);2164        $(document).trigger('csf-reload-script', $this);2165      }2166    });2167  };2168  //2169  // Document ready and run scripts2170  //2171  $(document).ready( function() {2172    $('.csf-save').csf_save();2173    $('.csf-confirm').csf_confirm();2174    $('.csf-nav-options').csf_nav_options();2175    $('.csf-nav-metabox').csf_nav_metabox();2176    $('.csf-expand-all').csf_expand_all();2177    $('.csf-search').csf_search();2178    $('.csf-sticky-header').csf_sticky();2179    $('.csf-taxonomy').csf_taxonomy();2180    $('.csf-shortcode').csf_shortcode();2181    $('.csf-page-templates').csf_page_templates();2182    $('.csf-post-formats').csf_post_formats();2183    $('.csf-onload').csf_reload_script();2184    $('.widget').csf_widgets();2185  });...csf.min.js
Source:csf.min.js  
1/**2 *3 * -----------------------------------------------------------4 *5 * Codestar Framework6 * A Lightweight and easy-to-use WordPress Options Framework7 *8 * Copyright 2015 Codestar <info@codestarlive.com>9 *10 * -----------------------------------------------------------11 *12 */13;(function ( $, window, document, undefined ) {14  'use strict';15  // caching16  var CSF     = {};17  var $body   = $('body');18  var has_rtl = $body.hasClass('rtl');19  CSF.funcs = {};20  CSF.vars  = {};21  //22  // Helper Functions - CODEVZ, Regex changed and trigger change added23  //24  CSF.helper = {25    name_replace: function( $selector ) {26      if ( $selector.closest( '.widget-content' ).length ) {27        $selector.find('.csf-cloneable-item').each( function( index ) {28          $(this).find('input').each( function(){29            this.name = this.name.replace(/\]\[\d+\]/g, ']['+ index +']');30            $( this ).trigger( 'change' );31          });32        });33      } else {34        $selector.find('.csf-cloneable-item').each( function( index ) {35          $(this).find(':input').each( function(){36            this.name = this.name.replace(/\[(\d+)\]/, '['+ index +']');37          });38        });39      }40    },41    debounce: function( callback, threshold, immediate ) {42      var timeout;43      return function() {44        var context = this, args = arguments;45        var later = function() {46          timeout = null;47          if ( !immediate ) {48            callback.apply(context, args);49          }50        };51        var callNow = ( immediate && !timeout );52        clearTimeout( timeout );53        timeout = setTimeout( later, threshold );54        if ( callNow ){55          callback.apply(context, args);56        }57      };58    }59  };60  //61  // Custom clone for textarea and select clone() bug62  //63  $.fn.csf_clone = function () {64    var base   = $.fn.clone.apply(this, arguments),65        clone  = this.find('select').add(this.filter('select')),66        cloned = base.find('select').add(base.filter('select'));67    for( var i = 0; i < clone.length; ++i ) {68      for( var j = 0; j < clone[i].options.length; ++j ) {69        if( clone[i].options[j].selected === true ) {70          cloned[i].options[j].selected = true;71        }72      }73    }74    return base;75  };76  //77  // Navigation78  //79  $.fn.csf_navigation = function() {80    return this.each(function() {81      var $nav     = $(this),82          $parent  = $nav.closest('.csf'),83          $section = $parent.find('.csf-section-id'),84          $expand  = $parent.find('.csf-expand-all'),85          $tabbed;86      $nav.find('ul:first a').on('click', function (e) {87        e.preventDefault();88        var $el     = $(this),89            $next   = $el.next(),90            $target = $el.data('section');91        if( $next.is('ul') ) {92          $el.closest('li').toggleClass('csf-tab-active');93        } else {94          $tabbed = $('#csf-tab-'+$target);95          $tabbed.removeClass('hidden').siblings().addClass('hidden');96          $nav.find('a').removeClass('csf-section-active');97          $el.addClass('csf-section-active');98          $section.val($target);99          $tabbed.csf_reload_script();100        }101      });102      $expand.on('click', function (e) {103        e.preventDefault();104        $parent.find('.csf-wrapper').toggleClass('csf-show-all');105        $parent.find('.csf-section').not('.csf-onload').csf_reload_script();106        $(this).find('.fa').toggleClass('fa-eye-slash' ).toggleClass('fa-eye');107      });108    });109  };110  //111  // Search112  //113  $.fn.csf_search = function() {114    return this.each(function() {115      var $this    = $(this),116          $input   = $this.find('input');117      $input.on('change keyup', function() {118        var value    = $(this).val(),119            $wrapper = $('.csf-wrapper'),120            $section = $wrapper.find('.csf-section'),121            $fields  = $section.find('> .csf-field:not(.hidden)'),122            $titles  = $fields.find('> .csf-title, .csf-search-tags');123        if( value.length > 3 ) {124          $fields.addClass('csf-hidden');125          $wrapper.addClass('csf-search-all');126          $titles.each( function() {127            var $title = $(this);128            if( $title.text().match( new RegExp('.*?' + value + '.*?', 'i') ) ) {129              var $field = $title.closest('.csf-field');130              $field.removeClass('csf-hidden');131              $field.parent().csf_reload_script();132            }133          });134        } else {135          $fields.removeClass('csf-hidden');136          $wrapper.removeClass('csf-search-all');137        }138      });139    });140  };141  //142  // Sticky Header143  //144  $.fn.csf_sticky = function() {145    return this.each(function() {146      var $this     = $(this),147          $window   = $(window),148          $inner    = $this.find('.csf-header-inner'),149          padding   = parseInt( $inner.css('padding-left') ) + parseInt( $inner.css('padding-right') ),150          offset    = 32,151          scrollTop = 0,152          lastTop   = 0,153          ticking   = false,154          onSticky  = function() {155            scrollTop = $window.scrollTop();156            requestTick();157          },158          requestTick = function () {159            if( !ticking ) {160              requestAnimationFrame( function() {161                stickyUpdate();162                ticking = false;163              });164            }165            ticking = true;166          },167          stickyUpdate = function() {168            var offsetTop = $this.offset().top,169                stickyTop = Math.max(offset, offsetTop - scrollTop ),170                winWidth  = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);171            if ( stickyTop <= offset && winWidth > 782 ) {172              $inner.css({width: $this.outerWidth()-padding});173              $this.css({height: $this.outerHeight()}).addClass( 'csf-sticky' );174            } else {175              $inner.removeAttr('style');176              $this.removeAttr('style').removeClass( 'csf-sticky' );177            }178          };179      $window.on( 'scroll resize', onSticky);180      onSticky();181    });182  };183  //184  // Dependency System185  //186  $.fn.csf_dependency = function ( param ) {187    return this.each(function () {188      var base  = this,189          $this = $(this);190      base.init = function () {191        base.ruleset = $.deps.createRuleset();192        var cfg = {193          show: function( el ) {194            el.removeClass('hidden');195          },196          hide: function( el ) {197            el.addClass('hidden');198          },199          log: false,200          checkTargets: false201        };202        if( param !== undefined ) {203          base.depSub();204        } else {205          base.depRoot();206        }207        $.deps.enable( $this, base.ruleset, cfg );208      };209      base.depRoot = function() {210        $this.each( function() {211          $(this).find('[data-controller]').each( function() {212            var $this       = $(this),213                _controller = $this.data('controller').split('|'),214                _condition  = $this.data('condition').split('|'),215                _value      = $this.data('value').toString().split('|'),216                _rules      = base.ruleset;217            $.each(_controller, function(index, element) {218              var value     = _value[index] || '',219                  condition = _condition[index] || _condition[0];220              _rules = _rules.createRule('[data-depend-id="'+ element +'"]', condition, value);221              _rules.include($this);222            });223          });224        });225      };226      base.depSub = function() {227        $this.each( function() {228          $(this).find('[data-sub-controller]').each( function() {229            var $this       = $(this),230                _controller = $this.data('sub-controller').split('|'),231                _condition  = $this.data('sub-condition').split('|'),232                _value      = $this.data('sub-value').toString().split('|'),233                _rules      = base.ruleset;234            $.each(_controller, function(index, element) {235              var value     = _value[index] || '',236                  condition = _condition[index] || _condition[0];237              _rules = _rules.createRule('[data-sub-depend-id="'+ element +'"]', condition, value);238              _rules.include($this);239            });240          });241        });242      };243      base.init();244    });245  };246  //247  // Chosen Script248  //249  $.fn.csf_chosen = function() {250    return this.each(function() {251      $(this).chosen({allow_single_deselect: true, disable_search_threshold: 15, width: parseFloat( $(this).actual('width') + 25 ) +'px'});252    });253  };254  //255  // Field Image Selector256  //257  $.fn.csf_field_image_selector = function() {258    return this.each(function() {259      $(this).find('label').on('click', function () {260        $(this).siblings().find('input').prop('checked', false);261      });262    });263  };264  //265  // Field Sorter266  //267  $.fn.csf_field_sorter = function() {268    return this.each(function() {269      var $this         = $(this),270          $enabled      = $this.find('.csf-enabled'),271          $has_disabled = $this.find('.csf-disabled'),272          $disabled     = ( $has_disabled.length ) ? $has_disabled : false;273      $enabled.sortable({274        connectWith: $disabled,275        placeholder: 'ui-sortable-placeholder',276        update: function( event, ui ) {277          var $el = ui.item.find('input');278          if( ui.item.parent().hasClass('csf-enabled') ) {279            $el.attr('name', $el.attr('name').replace('disabled', 'enabled'));280          } else {281            $el.attr('name', $el.attr('name').replace('enabled', 'disabled'));282          }283          $this.csf_customizer_refresh();284        }285      });286      if( $disabled ) {287        $disabled.sortable({288          connectWith: $enabled,289          placeholder: 'ui-sortable-placeholder'290        });291      }292    });293  };294  //295  // Field Upload296  //297  $.fn.csf_field_upload = function() {298    return this.each(function() {299      var $this      = $(this),300          $button    = $this.find('.csf-button'),301          $preview   = $this.find('.csf-image-preview'),302          $remove    = $this.find('.csf-image-remove'),303          $img       = $this.find('img'),304          $input     = $this.find('input'),305          extensions = ['jpg', 'gif', 'png', 'svg', 'jpeg'],306          wp_media_frame;307      $button.on('click', function( e ) {308        e.preventDefault();309        if ( typeof wp === 'undefined' || ! wp.media || ! wp.media.gallery ) {310          return;311        }312        if ( wp_media_frame ) {313          wp_media_frame.open();314          return;315        }316        wp_media_frame = wp.media({317          title: $button.data('frame-title'),318          library: {319            type: $button.data('upload-type')320          },321          button: {322            text: $button.data('insert-title'),323          }324        });325        wp_media_frame.on( 'select', function() {326          var attachment = wp_media_frame.state().get( 'selection' ).first();327          $input.val( attachment.attributes.url ).trigger('change');328        });329        wp_media_frame.open();330      });331      if( $preview.length ) {332        $input.on('change keyup', function() {333          var $this = $(this),334              value = $this.val(),335              ext   = value.toLowerCase().slice((value.toLowerCase().lastIndexOf('.') - 1) + 2);336          // CODEVZ337          $preview.removeClass('hidden');338          $img.attr('src', value);339        });340        $remove.on('click', function( e ) {341          e.preventDefault();342          $input.val('').trigger('change');343          $preview.addClass('hidden');344        });345      }346    });347  };348  //349  // Field Image350  //351  $.fn.csf_field_image = function() {352    return this.each(function() {353      var $this    = $(this),354          $button  = $this.find('.csf-button'),355          $preview = $this.find('.csf-image-preview'),356          $remove  = $this.find('.csf-image-remove'),357          $input   = $this.find('input'),358          $img     = $this.find('img'),359          wp_media_frame;360      $button.on('click', function( e ) {361        e.preventDefault();362        if ( typeof wp === 'undefined' || ! wp.media || ! wp.media.gallery ) {363          return;364        }365        if ( wp_media_frame ) {366          wp_media_frame.open();367          return;368        }369        wp_media_frame = wp.media({370          library: {371            type: 'image'372          }373        });374        wp_media_frame.on( 'select', function() {375          var attachment = wp_media_frame.state().get('selection').first().attributes;376          var thumbnail = ( typeof attachment.sizes !== 'undefined' && typeof attachment.sizes.thumbnail !== 'undefined' ) ? attachment.sizes.thumbnail.url : attachment.url;377          $preview.removeClass('hidden');378          $img.attr('src', thumbnail);379          $input.val( attachment.id ).trigger('change');380        });381        wp_media_frame.open();382      });383      $remove.on('click', function( e ) {384        e.preventDefault();385        $input.val('').trigger('change');386        $preview.addClass('hidden');387      });388    });389  };390  //391  // Field Gallery392  //393  $.fn.csf_field_gallery = function() {394    return this.each(function() {395      var $this  = $(this),396          $edit  = $this.find('.csf-edit-gallery'),397          $clear = $this.find('.csf-clear-gallery'),398          $list  = $this.find('ul'),399          $input = $this.find('input'),400          $img   = $this.find('img'),401          wp_media_frame,402          wp_media_click;403      $this.on('click', '.csf-button, .csf-edit-gallery', function( e ) {404        var $el   = $(this),405            what  = ( $el.hasClass('csf-edit-gallery') ) ? 'edit' : 'add',406            state = ( what === 'edit' ) ? 'gallery-edit' : 'gallery-library';407        e.preventDefault();408        if ( typeof wp === 'undefined' || ! wp.media || ! wp.media.gallery ) {409          return;410        }411        if ( wp_media_frame ) {412          wp_media_frame.open();413          wp_media_frame.setState(state);414          return;415        }416        wp_media_frame = wp.media({417          library: {418            type: 'image'419          },420          frame: 'post',421          state: 'gallery',422          multiple: true423        });424        wp_media_frame.on('open', function() {425          var ids = $input.val();426          if ( ids ) {427            var get_array = ids.split(',');428            var library   = wp_media_frame.state('gallery-edit').get('library');429            wp_media_frame.setState(state);430            get_array.forEach(function(id) {431              var attachment = wp.media.attachment(id);432              library.add( attachment ? [ attachment ] : [] );433            });434          }435        });436        wp_media_frame.on( 'update', function() {437          var inner  = '';438          var ids    = [];439          var images = wp_media_frame.state().get('library');440          images.each(function(attachment) {441            var attributes = attachment.attributes;442            var thumbnail  = ( typeof attributes.sizes.thumbnail !== 'undefined' ) ? attributes.sizes.thumbnail.url : attributes.url;443            inner += '<li><img src="'+ thumbnail +'"></li>';444            ids.push(attributes.id);445          });446          $input.val(ids).trigger('change');447          $list.html('').append(inner);448          $clear.removeClass('hidden');449          $edit.removeClass('hidden');450        });451        wp_media_frame.open();452        wp_media_click = what;453      });454      $clear.on('click', function( e ) {455        e.preventDefault();456        $list.html('');457        $input.val('').trigger('change');458        $clear.addClass('hidden');459        $edit.addClass('hidden');460      });461    });462  };463  // CODEVZ, Live group title464  function codevz_live_title( $this ) {465      setTimeout(function() {466        $this.find( '.csf-cloneable-content' ).each(function() {467          var en = $( this ),468              tt = en.parent().find( '> .csf-cloneable-title .csf-cloneable-text' );469          en.find( '> .csf-field:first-child [name]' ).off( 'change.cc keyup.cc' ).on( 'change.cc keyup.cc', function() {470            var een = $( this );471            if ( een.is( "select" ) ) {472              tt.html( een.find( 'option:selected' ).text() );473            } else {474              tt.html( een.val() ? een.val() : '...' );475            }476          }).trigger( 'change' );477        });478      }, 250 );479  }480  //481  // Field Group482  //483  $.fn.csf_field_group = function() {484    return this.each(function() {485      var $this    = $(this),486          $wrapper = $this.find('.csf-cloneable-wrapper'),487          $data    = $this.find('.csf-cloneable-data'),488          $hidden  = $this.find('.csf-cloneable-hidden'),489          unique   = $data.data('unique-id'),490          limit    = parseInt( $data.data('limit') );491      $wrapper.accordion({492        header: '.csf-cloneable-title',493        collapsible : true,494        active: false,495        animate: false,496        heightStyle: 'content',497        icons: {498          'header': 'csf-cloneable-header-icon fa fa-angle-right',499          'activeHeader': 'csf-cloneable-header-icon fa fa-angle-down'500        },501        beforeActivate: function( event, ui ) {502          var $panel = ui.newPanel;503          if( $panel.length && !$panel.data( 'opened' ) ) {504            $panel.find('.csf-field').removeClass('csf-no-script');505            $panel.csf_reload_script('sub');506            $panel.data( 'opened', true );507          }508        }509      });510      $wrapper.sortable({511        //connectWith: ".csf-cloneable-wrapper",512        axis: 'y',513        handle: '.csf-cloneable-title',514        helper: 'original',515        cursor: 'move',516        placeholder: 'widget-placeholder',517        start: function( event, ui ) {518          $wrapper.accordion({ active:false });519          $wrapper.sortable('refreshPositions');520        },521        stop: function( event, ui ) {522          CSF.helper.name_replace( $wrapper );523          $wrapper.csf_customizer_refresh();524        }525      });526      codevz_live_title( $this );527      // CODEVZ, Add icon to group add528      $this.find( '.csf-cloneable-add' ).prepend( '<i class="fa fa-plus"></i>' );529      $this.on('click', '.csf-cloneable-add', function( e ) {530        e.preventDefault();531        var count = $wrapper.find('.csf-cloneable-item').length;532        if( limit && (count+1) > limit ) {533          $data.show();534          return;535        }536        var $cloned_item = $hidden.csf_clone().removeClass('csf-cloneable-hidden');537        $cloned_item.find(':input').each( function() {538          this.name = this.name.replace('_nonce', unique).replace('num', count);539        });540        $wrapper.append($cloned_item);541        $wrapper.accordion('refresh');542        $wrapper.accordion({active: count});543        $wrapper.csf_customizer_refresh();544        $wrapper.csf_customizer_listen(true);545      codevz_live_title( $this );546      });547      $wrapper.on('click', '.csf-cloneable-clone', function( e ) {548        e.preventDefault();549        if( limit && parseInt($wrapper.find('.csf-cloneable-item').length+1) > limit ) {550          $data.show();551          return;552        }553        var $this   = $(this),554            $parent = $this.closest('.csf-cloneable-item'),555            $cloned = $parent.csf_clone().addClass('csf-cloned'),556            $childs = $wrapper.children();557        $childs.eq($parent.index()).after($cloned);558        CSF.helper.name_replace( $wrapper );559        $wrapper.accordion('refresh');560        $wrapper.csf_customizer_refresh();561        $wrapper.csf_customizer_listen(true);562      codevz_live_title( $this );563      });564      $wrapper.on('click', '.csf-cloneable-remove', function(e) {565        e.preventDefault();566        $(this).closest('.csf-cloneable-item').remove();567        CSF.helper.name_replace( $wrapper );568        $wrapper.csf_customizer_refresh();569        $data.hide();570      });571    });572  };573  //574  // Field Repeater575  //576  $.fn.csf_field_repeater = function() {577    return this.each(function() {578      var $this    = $(this),579          $wrapper = $this.find('.csf-cloneable-wrapper'),580          $hidden  = $this.find('.csf-cloneable-hidden'),581          $data    = $this.find('.csf-cloneable-data'),582          unique   = $data.data('unique-id'),583          limit    = parseInt( $data.data('limit') );584      $wrapper.sortable({585        axis: 'y',586        handle: '.csf-cloneable-sort',587        helper: 'original',588        cursor: 'move',589        placeholder: 'widget-placeholder',590        stop: function( event, ui ) {591          CSF.helper.name_replace( $wrapper );592          $wrapper.csf_customizer_refresh();593        }594      });595      $this.on('click', '.csf-cloneable-add', function( e ) {596        e.preventDefault();597        var count = $wrapper.find('.csf-cloneable-item').length;598        if( limit && (count+1) > limit ) {599          $data.show();600          return;601        }602        var $cloned = $hidden.csf_clone().removeClass('csf-cloneable-hidden');603        $wrapper.append($cloned);604        $cloned.find(':input').each( function() {605          this.name = this.name.replace('_nonce', unique).replace('num', count);606        });607        $cloned.find('.csf-field').removeClass('csf-no-script');608        $cloned.csf_reload_script('sub');609        $wrapper.csf_customizer_refresh();610        $wrapper.csf_customizer_listen(true);611      });612      $wrapper.on('click', '.csf-cloneable-clone', function( e ) {613        e.preventDefault();614        if( limit && parseInt($wrapper.find('.csf-cloneable-item').length+1) > limit ) {615          $data.show();616          return;617        }618        var $this   = $(this),619            $parent = $this.closest('.csf-cloneable-item'),620            $index  = $parent.index(),621            $cloned = $parent.csf_clone(),622            $childs = $wrapper.children();623        $childs.eq($index).after($cloned);624        $cloned.addClass('csf-cloned').csf_reload_script('sub');625        CSF.helper.name_replace( $wrapper );626        $wrapper.csf_customizer_refresh();627        $wrapper.csf_customizer_listen(true);628      });629      $wrapper.on('click', '.csf-cloneable-remove', function(e) {630        e.preventDefault();631        $(this).closest('.csf-cloneable-item').remove();632        $data.hide();633        CSF.helper.name_replace( $wrapper );634        $wrapper.csf_customizer_refresh();635      });636    });637  };638  //639  // Field Icon640  //641  $.fn.csf_field_icon = function() {642    return this.each( function() {643      var $this = $(this);644      $this.on('click', '.csf-icon-add', function ( e ) {645        var $modal = $('#csf-modal-icon'),646            // CODEVZ647            old_item = $( this ).parent().find( 'input' ).val(),648            active_icon = function() {649              if ( old_item ) {650                $modal.find( 'a' ).each(function() {651                  if ( old_item === $( this ).data( 'csf-icon' ) ) {652                    $( this ).addClass( 'cz_active_icon' ).siblings().removeClass( 'cz_active_icon' );653                  }654                });655              }656            };// CODEVZ657        e.preventDefault();658        $modal.show();659        $body.addClass('csf-icon-scrolling');660        CSF.vars.$icon_target = $this;661        if( !CSF.vars.icon_modal_loaded ) {662          $.ajax({663            type: 'POST',664            url: ajaxurl,665            data: {666              action: 'csf-get-icons'667            },668            success: function( content ) {669              CSF.vars.icon_modal_loaded = true;670              var $load = $modal.find('.csf-modal-content').html( content );671              $load.on('click', 'a', function ( e ) {672                e.preventDefault();673                var icon = $(this).data('csf-icon');674                CSF.vars.$icon_target.find('i').removeAttr('class').addClass(icon);675                CSF.vars.$icon_target.find('input').val(icon).trigger('change');676                CSF.vars.$icon_target.find('.csf-icon-preview').removeClass('hidden');677                CSF.vars.$icon_target.find('.csf-icon-remove').removeClass('hidden');678                $modal.hide();679                $body.removeClass('csf-icon-scrolling');680              });681              active_icon(); // CODEVZ682              $modal.on('change keyup', '.csf-icon-search', function(){683                var value  = $(this).val(),684                    $icons = $load.find('a');685                $icons.each(function() {686                  var $elem = $(this);687                  if ( $elem.data('csf-icon').search( new RegExp( value, 'i' ) ) < 0 ) {688                    $elem.hide();689                  } else {690                    $elem.show();691                  }692                });693              });694              $modal.on('click', '.csf-modal-close, .csf-modal-overlay', function() {695                $modal.hide();696                $body.removeClass('csf-icon-scrolling');697              });698            }699          });700        } else {701          active_icon(); // CODEVZ702        }703      });704      $this.on('click', '.csf-icon-remove', function ( e ) {705        e.preventDefault();706        $this.find('.csf-icon-preview').addClass('hidden');707        $this.find('input').val('').trigger('change');708        $(this).addClass('hidden');709      });710    });711  };712  //713  // CODEVZ: Field Font select714  //715  $.fn.csf_field_select_font = function() {716    return this.each( function() {717      var $this = $(this);718      $this.on('click', '.csf-font-add', function ( e ) {719        var $modal = $('#csf-modal-font'),720            old_font = $( this ).prev( 'input' ).val(),721            active_font = function() {722              if ( old_font ) {723                old_font = old_font.indexOf( '=' ) > 0 ? old_font.substring( 0, old_font.indexOf( "=" ) ) : old_font;724                $modal.find( 'span' ).each(function() {725                  if ( old_font === $( this ).text() ) {726                    $( this ).parent().addClass( 'cz_active_font' ).removeClass( 'cz_font' ).siblings().removeClass( 'cz_active_font' );727                  }728                });729              }730            };731        e.preventDefault();732        $modal.show();733        $body.addClass('csf-font-scrolling');734        CSF.vars.$font_target = $this;735        var cz_add_google_font_link = function( fonts_elements ) {736          fonts_elements.each(function() {737            var dis = $( this ),738                font = $( 'span', dis ).html();739            if ( ! dis.hasClass( 'websafe_font' ) && ! $( 'link', dis ).length ) {740              dis.css( 'font-family', font ).append('<link rel="stylesheet"  href="//fonts.googleapis.com/css?family=' + font.replace( / /g, '+' ) + ':100,200,300,400,500,600,700,800,900" type="text/css" media="all" />');741              setTimeout(function() {742                dis.show().removeClass( 'cz_font' );743                $( '#loadMore_font' ).removeClass( 'cz_loader' );744              }, 1000 );745            }746          });747        };748        if( !CSF.vars.font_modal_loaded ) {749          $.ajax({750            type: 'POST',751            url: ajaxurl,752            data: {753              action: 'csf-get-fonts'754            },755            success: function( content ) {756              CSF.vars.font_modal_loaded = true;757              var $load = $modal.find('.csf-modal-content').html( content );758              $( '.csf-modal-content', $modal ).append('<div class="clr"></div><a href="#" id="loadMore_font" class="cz_loader">Load More</a>');759              var size_li = $( '.csf-modal-content a', $modal ).size();760              var x = 20;761              cz_add_google_font_link( $( '.cz_font:lt('+x+')', $modal ) );762              $( '#loadMore_font' ).on('click', function (e) {763                  $( this ).addClass( 'cz_loader' );764                  cz_add_google_font_link( $( '.cz_font:lt('+x+')', $modal ) );765                  e.preventDefault();766                  return false;767              });768              // Font params769              $load.on('click', 'a i', function ( e ) {770                var diz = $( this ).parent().next( '.cz_font_params' );771                $( '.cz_font_params' ).not( diz ).fadeOut();772                diz.fadeToggle();773              });774              $( 'body' ).on( 'click', function( e ) {775                if ( ! $( e.target ).closest( '.csf-modal-content' ).length ) {776                  $( '.cz_font_params' ).fadeOut();777                }778              });779              active_font();780              // Select font781              $load.on('click', 'a', function ( e ) {782                e.preventDefault();783                if ( $( e.target ).prop( 'tagName' ) == 'A' || $( e.target ).prop( 'tagName' ) == 'SPAN' || $( e.target ).prop( 'tagName' ) == 'DIV' ) {784                  var font = $( 'span', this).html(), 785                      font_css = font;786                  // Font params787                  if ( $( this ).next( 'div' ).find( '.cz_font_variants :checkbox:checked' ).val() ) {788                    var vala = [];789                    $( this ).next( 'div' ).find( '.cz_font_variants :checkbox:checked' ).each(function(i){790                      vala[i] = $( this ).val();791                    });792                    font = font + '=' + vala.join(",");793                  }794                  if ( $( this ).next( 'div' ).find( '.cz_font_subsets :checkbox:checked' ).val() ) {795                    var valb = [];796                    $( this ).next( 'div' ).find( '.cz_font_subsets :checkbox:checked' ).each(function(i){797                      valb[i] = $( this ).val();798                    });799                    font = font + '&' + valb.join(",");800                  }801                  $( '.cz_font_params' ).fadeOut();802                  CSF.vars.$font_target.find('input').val( font ).trigger('change');803                  CSF.vars.$font_target.find('.csf-font-preview, .csf-font-remove').removeClass('hidden');804                  $modal.hide();805                  $body.removeClass('csf-font-scrolling');806                }807              });808              $modal.on('change keyup', '.csf-font-search', function(){809                var value  = $(this).val(),810                    $fonts = $load.find('a');811                if ( ! value ) {812                  var x = 20;813                  $( '.csf-modal-content a', $modal ).hide().not( '.cz_font' ).show();814                  $( '#loadMore_font, .websafe_font', $modal ).show();815                  return false;816                }817                if ( value.length < 3 ) {818                  return false;819                }820                $( '#loadMore_font' ).hide();821                $fonts.each(function() {822                  var $elem = $(this),823                      search = new RegExp( value, 'i' );824                  if ( search && $elem.find('span').html().search( search ) < 0 ) {825                    $elem.hide();826                  } else {827                    $elem.show();828                    cz_add_google_font_link( $elem );829                  }830                });831              });832              833              // Change font preview text834              $modal.on('change keyup', '.csf-font-placeholder', function(){835                var value = $( this ).val();836                if ( value ) {837                  $modal.find('.csf-modal-content span').hide();838                  $modal.find('.csf-modal-content .cz_preview').show().html( value );839                } else {840                  $modal.find('.csf-modal-content .cz_preview').hide();841                  $modal.find('.csf-modal-content span').show();842                }843              });844              $modal.on('click', '.csf-modal-close, .csf-modal-overlay', function() {845                $modal.hide();846                $body.removeClass('csf-font-scrolling');847              });848            }849          });850        } else {851          active_font();852        }853      });854      $this.on('click', '.csf-font-remove', function ( e ) {855        e.preventDefault();856        $this.find('input').val('').trigger('change');857        $( this ).addClass('hidden');858      });859    });860  };861  //862  // ADDED BY CODEVZ863  //864  // Field Demo Importer865  //866  $.fn.csf_field_demo_importer = function() {867    return this.each( function() {868      var $this = $(this);869      $this.on('click', '.csf-importer-add', function ( e ) {870        var $modal = $('#csf-modal-importer');871        e.preventDefault();872        $modal.show();873        $body.addClass('csf-importer-scrolling');874        CSF.vars.$importer_target = $this;875        if( !CSF.vars.importer_modal_loaded ) {876          $.ajax({877            type: 'POST',878            url: ajaxurl,879            data: {880              action: 'importer_modal_content'881            },882            success: function( content ) {883              CSF.vars.importer_modal_loaded = true;884              var $load = $modal.find('.csf-modal-content').html( content );885              886              $load.on('click', '.importer_settings', function ( e ) {887                e.stopPropagation();888              });889              $modal.on('change keyup', '.csf-importer-search', function(){890                var value  = $(this).val(),891                    $demos = $load.find('.cz_demo');892                $demos.each(function() {893                  var $elem = $(this);894                  if ( $elem.find( '[name="demo"]' ).val().search( new RegExp( value, 'i' ) ) < 0 ) {895                    $elem.hide();896                  } else {897                    $elem.show();898                  }899                });900              });901              $modal.on('click', '.csf-modal-close, .csf-modal-overlay', function() {902                $modal.hide();903                $body.removeClass('csf-importer-scrolling');904              });905            }906          });907        }908      });909    });910  };911  //912  // ADDED BY CODEVZ913  //914  // Field Header Preset915  //916  $.fn.csf_field_header_preset = function() {917    return this.each( function() {918      var $this = $(this);919      $this.on('click', '.csf-header-preset-add', function ( e ) {920        e.preventDefault();921        var $modal = $('#csf-modal-header-preset');922        $modal.show();923        CSF.vars.$importer_target = $this;924        if( !CSF.vars.importer_modal_loaded ) {925          $.ajax({926            type: 'POST',927            url: ajaxurl,928            data: {929              action: 'codevz_header_preset'930            },931            success: function( content ) {932              console.log( content );933              CSF.vars.importer_modal_loaded = true;934              var $load = $modal.find('.csf-modal-content').html( content );935              $load.on('click', '.cz_header_preset', function() {936                var val = $( this ).attr( 'data-header' );937                $( '[name="codevz_theme_options[header_preset]"]' ).val( val ).trigger( 'change' );938                $modal.hide();939              });940              $modal.on('click', '.csf-modal-close, .csf-modal-overlay', function() {941                $modal.hide();942              });943            }944          });945        }946      });947    });948  };949  //950  // Color Picker Helper951  //952  if( typeof Color === 'function' ) {953    Color.fn.toString = function () {954      if ( this._alpha < 1 ) {955        return this.toCSS('rgba', this._alpha).replace(/\s+/g, '');956      }957      var hex = parseInt( this._color, 10 ).toString( 16 );958      if ( this.error ) { return ''; }959      if ( hex.length < 6 ) {960        for (var i = 6 - hex.length - 1; i >= 0; i--) {961          hex = '0' + hex;962        }963      }964      return '#' + hex;965    };966  }967  CSF.funcs.PARSE_COLOR_VALUE = function( val ) {968    var value = val.replace(/\s+/g, ''),969        alpha = ( value.indexOf('rgba') !== -1 ) ? parseFloat( value.replace(/^.*,(.+)\)/, '$1') * 100 ) : 100,970        rgba  = ( alpha < 100 ) ? true : false;971    return { value: value, alpha: alpha, rgba: rgba };972  };973  //974  // Field Color Picker975  //976  $.fn.csf_field_colorpicker = function() {977    return this.each(function() {978      var $this     = $(this),979          $input    = $this.find('.csf-wp-color-picker'),980          $wppicker = $this.find('.wp-picker-container');981      // BY CODEVZ: setTimeout for better customizer performance982      setTimeout(function() {983        // Destroy and Reinit984        // EDITED BY CODEVZ985        if( $wppicker.length && ! $this.closest( '.csf-field-codevz_box_shadow' ).length ) {986          $wppicker.after($input).remove();987        }988        if( $input.data('rgba') !== false ) {989          // CODEVZ990          var picker = CSF.funcs.PARSE_COLOR_VALUE( $input.val() ),991              primary_color = typeof codevz_primary_color == 'string' ? codevz_primary_color : '',992              secondary_color = typeof codevz_secondary_color == 'string' ? codevz_secondary_color : '',993              palettes = ['#000000','#FFFFFF','transparent','#E53935','#FF5722','#FFEB3B','#8BC34A','#3F51B5',primary_color];994            if ( secondary_color ) {995              palettes.push( secondary_color );996            }997          $input.wpColorPicker({998            palettes: palettes, // CODEVZ999            clear: function() {1000              $input.trigger('keyup');1001            },1002            change: function( event, ui ) {1003              var ui_color_value = ui.color.toString();1004              if ( ui.color.error ) {1005                ui_color_value = 'transparent';1006              }1007              $input.closest('.wp-picker-container').find('.csf-alpha-slider-offset').css('background-color', ui_color_value);1008              $input.val(ui_color_value).trigger('change');1009            },1010            create: function() {1011              var a8cIris       = $input.data('a8cIris'),1012                  $container    = $input.closest('.wp-picker-container'),1013                  $alpha_wrap   = $('<div class="csf-alpha-wrap">' +1014                                    '<div class="csf-alpha-slider"></div>' +1015                                    '<div class="csf-alpha-slider-offset"></div>' +1016                                    '<div class="csf-alpha-text"></div>' +1017                                    '</div>').appendTo( $container.find('.wp-picker-holder') ),1018                  $alpha_slider = $alpha_wrap.find('.csf-alpha-slider'),1019                  $alpha_text   = $alpha_wrap.find('.csf-alpha-text'),1020                  $alpha_offset = $alpha_wrap.find('.csf-alpha-slider-offset');1021              $alpha_slider.slider({1022                slide: function( event, ui ) {1023                  var slide_value = parseFloat( ui.value / 100 );1024                  a8cIris._color._alpha = slide_value;1025                  $input.wpColorPicker( 'color', a8cIris._color.toString() );1026                  $alpha_text.text( ( slide_value < 1 ? slide_value : '' ) );1027                },1028                create: function() {1029                  var slide_value = parseFloat( picker.alpha / 100 ),1030                      alpha_text_value = slide_value < 1 ? slide_value : '';1031                  $alpha_text.text(alpha_text_value);1032                  $alpha_offset.css('background-color', picker.value);1033                  $container.on('click', '.wp-picker-clear', function() {1034                    a8cIris._color._alpha = 1;1035                    $alpha_text.text('').trigger('change');1036                    $alpha_slider.slider('option', 'value', 100).trigger('slide');1037                  });1038                  $container.on('click', '.wp-picker-default', function() {1039                    var default_picker = CSF.funcs.PARSE_COLOR_VALUE( $input.data('default-color') ),1040                        default_value  = parseFloat( default_picker.alpha / 100 ),1041                        default_text   = default_value < 1 ? default_value : '';1042                    a8cIris._color._alpha = default_value;1043                    $alpha_text.text(default_text);1044                    $alpha_slider.slider('option', 'value', default_picker.alpha).trigger('slide');1045                  });1046                  $container.on('click', '.wp-color-result', function() {1047                    $alpha_wrap.toggle();1048                  });1049                  $body.on( 'click.wpcolorpicker', function() {1050                    $alpha_wrap.hide();1051                  });1052                },1053                value: picker.alpha,1054                step: 1,1055                min: 1,1056                max: 1001057              });1058            }1059          });1060        } else {1061          $input.wpColorPicker({1062            clear: function() {1063              $input.trigger('keyup');1064            },1065            change: function( event, ui ) {1066              $input.val(ui.color.toString()).trigger('change');1067            }1068          });1069        }1070      }, 500 );1071    });1072  };1073  //1074  // Field Ace Editor1075  //1076  $.fn.csf_field_ace_editor = function() {1077    return this.each(function() {1078      if( typeof ace !== 'undefined' ) {1079        var $this     = $(this),1080            $textarea = $this.find('.csf-ace-editor-textarea'),1081            options   = JSON.parse( $this.find( '.csf-ace-editor-options' ).val() ),1082            editor    = ace.edit($this.find('.csf-ace-editor').attr('id'));1083        // global settings of ace editor1084        editor.getSession().setValue($textarea.val());1085        editor.setOptions( options );1086        editor.on( 'change', function( e ) {1087          $textarea.val( editor.getSession().getValue() ).trigger('change');1088        });1089      }1090    });1091  };1092  //1093  // Field Datepicker1094  //1095  $.fn.csf_field_datepicker = function() {1096    return this.each(function() {1097      var $this   = $(this),1098          $input  = $this.find('input'),1099          options = JSON.parse( $this.find('.csf-datepicker-options').val() ),1100          wrapper = '<div class="csf-datepicker-wrapper"></div>',1101          $datepicker;1102      var defaults = {1103        beforeShow: function(input, inst) {1104          $datepicker = $('#ui-datepicker-div');1105          $datepicker.wrap(wrapper);1106        },1107        onClose: function(){1108          var cancelInterval = setInterval( function() {1109            if( $datepicker.is( ':hidden' ) ) {1110              $datepicker.unwrap(wrapper);1111              clearInterval(cancelInterval);1112            }1113          }, 100 );1114        }1115      };1116      options = $.extend({}, options, defaults);1117      $input.datepicker(options);1118    });1119  };1120  //1121  // Field Tabbed1122  //1123  $.fn.csf_field_tabbed = function() {1124    return this.each( function() {1125      var $this    = $(this),1126          $links   = $this.find('.csf-tabbed-nav a'),1127          $section = $this.find('.csf-tabbed-section');1128      $links.on( 'click', function(e) {1129       e.preventDefault();1130        var $link = $(this),1131            index = $link.index();1132        $link.addClass('csf-tabbed-active').siblings().removeClass('csf-tabbed-active');1133        $section.eq(index).removeClass('hidden').siblings().addClass('hidden');1134      });1135    });1136  };1137  //1138  // Field Backup1139  //1140  $.fn.csf_field_backup = function() {1141    return this.each( function() {1142      var $this   = $(this),1143          $reset  = $this.find('.csf-reset-js'),1144          $import = $this.find('.csf-import-js'),1145          data    = $this.find('.csf-data').data();1146      $reset.on( 'click', function( e ) {1147        $('.csf-options').addClass('csf-saving');1148        e.preventDefault();1149        $.ajax({1150          type: 'POST',1151          url: ajaxurl,1152          data: {1153            action: 'csf-reset-options',1154            unique: data.unique,1155            wpnonce: data.wpnonce1156          },1157          success: function() {1158            location.reload();1159          }1160        });1161      });1162      $import.on( 'click', function( e ) {1163        $('.csf-options').addClass('csf-saving');1164        e.preventDefault();1165        $.ajax({1166          type: 'POST',1167          url: ajaxurl,1168          data: {1169            action: 'csf-import-options',1170            unique: data.unique,1171            wpnonce: data.wpnonce,1172            value: $this.find('.csf-import-data').val()1173          },1174          success: function( content ) {1175            location.reload();1176          }1177        });1178      });1179    });1180  };1181  //1182  // Confirm1183  //1184  $.fn.csf_confirm = function() {1185    return this.each( function() {1186      $(this).on('click', function( e ) {1187        if ( !confirm('Are you sure?') ) {1188          e.preventDefault();1189        }1190      });1191    });1192  };1193  //1194  // Options Save1195  //1196  $.fn.csf_save = function() {1197    return this.each( function() {1198      var $this  = $(this),1199          $text  = $this.data('save'),1200          $value = $this.val(),1201          $ajax  = $('.csf-save-ajax'),1202          $panel = $('.csf-options');1203      $(document).on('keydown', function(event) {1204        if (event.ctrlKey || event.metaKey) {1205          if( String.fromCharCode(event.which).toLowerCase() === 's' ) {1206            event.preventDefault();1207            $this.trigger('click');1208          }1209        }1210      });1211      $this.on('click', function ( e ) {1212        if( $ajax.length ) {1213          if( typeof tinyMCE === 'object' ) {1214            tinyMCE.triggerSave();1215          }1216          $panel.addClass('csf-saving');1217          $this.prop('disabled', true).attr('value', $text);1218          var serializedOptions = $('#CSF_form').serialize();1219          $.post( 'options.php', serializedOptions ).error( function() {1220            alert('Error, Please try again.');1221          }).success( function() {1222            $panel.removeClass('csf-saving');1223            $this.prop('disabled', false).attr('value', $value);1224          });1225          e.preventDefault();1226        } else {1227          $this.addClass('disabled').attr('value', $text);1228        }1229      });1230    });1231  };1232  //1233  // Taxonomy Framework1234  //1235  $.fn.csf_taxonomy = function() {1236    return this.each( function() {1237      var $this   = $(this),1238          $parent = $this.parent();1239      if( $parent.attr('id') === 'addtag' ) {1240        var $submit  = $parent.find('#submit'),1241            $clone   = $this.find('.csf-field').csf_clone(),1242            $list    = $('#the-list'),1243            flooding = false;1244        $submit.on( 'click', function() {1245          if( !flooding ) {1246            $list.on( 'DOMNodeInserted', function() {1247              if( flooding ) {1248                $this.empty();1249                $this.html( $clone );1250                $clone = $clone.csf_clone();1251                $this.csf_reload_script();1252                flooding = false;1253              }1254            });1255          }1256          flooding = true;1257        });1258      }1259    });1260  };1261  //1262  // Shortcode Framework1263  //1264  $.fn.csf_shortcode = function() {1265    var instance = this, deploy_atts;1266    instance.validate_atts = function( _atts, _this ) {1267      var el_value;1268      if( _this.data('check') !== undefined && deploy_atts === _atts ) { return ''; }1269      deploy_atts = _atts;1270      if ( _this.closest('.pseudo-field').hasClass('hidden') === true ) { return ''; }1271      if ( _this.hasClass('pseudo') === true ) { return ''; }1272      if( _this.is(':checkbox') || _this.is(':radio') ) {1273        el_value = _this.is(':checked') ? _this.val() : '';1274      } else {1275        el_value = _this.val();1276      }1277      if( _this.data('check') !== undefined ) {1278        el_value = _this.closest('.csf-field').find('input:checked').map( function() {1279         return $(this).val();1280        }).get();1281      }1282      if( el_value !== null && el_value !== undefined && el_value !== '' && el_value.length !== 0 ) {1283        return ' ' + _atts + '="' + el_value + '"';1284      }1285      return '';1286    };1287    instance.insertAtChars = function ( _this, currentValue ) {1288      var obj = ( typeof _this[0].name !== 'undefined' ) ? _this[0] : _this;1289      if ( obj.value.length && typeof obj.selectionStart !== 'undefined' ) {1290        obj.focus();1291        return obj.value.substring( 0, obj.selectionStart ) + currentValue + obj.value.substring( obj.selectionEnd, obj.value.length );1292      } else {1293        obj.focus();1294        return currentValue;1295      }1296    };1297    instance.send_to_editor = function ( html, editor_id ) {1298      var tinymce_editor;1299      if ( typeof tinymce !== 'undefined' ) {1300        tinymce_editor = tinymce.get( editor_id );1301      }1302      if ( tinymce_editor && !tinymce_editor.isHidden() ) {1303        tinymce_editor.execCommand( 'mceInsertContent', false, html );1304      } else {1305        var $editor = $('#'+editor_id);1306        $editor.val( instance.insertAtChars( $editor, html ) ).trigger('change');1307      }1308    };1309    return this.each( function() {1310      var $this     = $(this),1311          $content  = $this.find('.csf-modal-content'),1312          $insert   = $this.find('.csf-modal-insert'),1313          $select   = $this.find('select'),1314          modal_id  = $this.data('modal-id'),1315          editor_id,1316          sc_name,1317          sc_view,1318          sc_clone,1319          $sc_elem;1320      $(document).on('click', '.csf-shortcode-button[data-modal-button-id="'+ modal_id +'"]', function ( e ) {1321        var $button = $(this);1322        e.preventDefault();1323        $sc_elem  = $button;1324        editor_id = $button.data('editor-id') || false;1325        $this.show();1326        $body.addClass('csf-shortcode-scrolling');1327      });1328      $select.on( 'change', function() {1329        var $elem   = $(this);1330            sc_name = $elem.val();1331            sc_view = $elem.find(':selected').data('view');1332        if( sc_name.length ){1333          $.ajax({1334            type: 'POST',1335            url: ajaxurl,1336            data: {1337              action: 'csf-get-shortcode-'+modal_id,1338              shortcode: sc_name1339            },1340            success: function( content ) {1341              $content.html( content );1342              $insert.parent().removeClass('hidden');1343              sc_clone = $('.csf-shortcode-clone', $this).csf_clone();1344              $content.csf_reload_script('sub');1345            }1346          });1347        } else {1348          $insert.parent().addClass('hidden');1349          $content.html('');1350        }1351      });1352      $insert.on('click', function ( e ) {1353        e.preventDefault();1354        var shortcode = '',1355            ruleAttr  = 'data-atts',1356            cloneAttr = 'data-clone-atts',1357            cloneID   = 'data-clone-id';1358        switch ( sc_view ) {1359          case 'contents':1360            $this.find('[' + ruleAttr + ']').each( function() {1361              var _this = $(this), _atts = _this.data('atts');1362              shortcode += '['+_atts+']';1363              shortcode += _this.val();1364              shortcode += '[/'+_atts+']';1365            });1366          break;1367          case 'clone':1368            shortcode += '[' + sc_name;1369            $('[' + ruleAttr + ']', $this.find('.csf-field:not(.hidden)') ).each( function() {1370              var _this_main = $(this), _this_main_atts = _this_main.data('atts');1371              shortcode += instance.validate_atts( _this_main_atts, _this_main );1372            });1373            shortcode += ']';1374            $this.find('[' + cloneID + ']').each( function() {1375              var _this_clone = $(this),1376                  _clone_id   = _this_clone.data('clone-id');1377              shortcode += '[' + _clone_id;1378              $('[' + cloneAttr + ']', _this_clone.find('.csf-field:not(.hidden)') ).each( function() {1379                var _this_multiple = $(this), _atts_multiple = _this_multiple.data('clone-atts');1380                if( _atts_multiple !== 'content' ) {1381                  shortcode += instance.validate_atts( _atts_multiple, _this_multiple );1382                } else if ( _atts_multiple === 'content' ) {1383                  shortcode += ']';1384                  shortcode += _this_multiple.val();1385                  shortcode += '[/'+_clone_id+'';1386                }1387              });1388              shortcode += ']';1389            });1390            shortcode += '[/' + sc_name + ']';1391          break;1392          case 'clone_duplicate':1393            $this.find('[' + cloneID + ']').each( function() {1394              var _this_clone = $(this),1395                  _clone_id   = _this_clone.data('clone-id');1396              shortcode += '[' + _clone_id;1397              $('[' + cloneAttr + ']', _this_clone.find('.csf-field:not(.hidden)') ).each( function() {1398                var _this_multiple = $(this),1399                    _atts_multiple = _this_multiple.data('clone-atts');1400                if( _atts_multiple !== 'content' ) {1401                  shortcode += instance.validate_atts( _atts_multiple, _this_multiple );1402                } else if ( _atts_multiple === 'content' ) {1403                  shortcode += ']';1404                  shortcode += _this_multiple.val();1405                  shortcode += '[/'+_clone_id+'';1406                }1407              });1408              shortcode += ']';1409            });1410          break;1411          default:1412            shortcode += '[' + sc_name;1413            $('[' + ruleAttr + ']', $this.find('.csf-field:not(.hidden)') ).each( function() {1414              var _this = $(this), _atts = _this.data('atts');1415              if( _atts !== 'content' ) {1416                shortcode += instance.validate_atts( _atts, _this );1417              } else if ( _atts === 'content' ) {1418                shortcode += ']';1419                shortcode += _this.val();1420                shortcode += '[/'+sc_name+'';1421              }1422            });1423            shortcode += ']';1424          break;1425        }1426        if( !editor_id ) {1427          var $textarea = $sc_elem.next();1428          $textarea.val( instance.insertAtChars( $textarea, shortcode ) ).trigger('change');1429        } else {1430          instance.send_to_editor( shortcode, editor_id );1431        }1432        deploy_atts = null;1433        $this.hide();1434        $body.removeClass('csf-shortcode-scrolling');1435      });1436      $content.on('click', '.csf-clone-button', function( e ) {1437        e.preventDefault();1438        var $cloned = sc_clone.csf_clone().addClass('csf-shortcode-cloned');1439        $content.find('.csf-clone-button-wrapper').before( $cloned );1440        $cloned.find(':input').attr('name', '_nonce_' + $cloned.index());1441        $cloned.find('.csf-remove-clone').show().on('click', function( e ) {1442          $cloned.remove();1443          e.preventDefault();1444        });1445        // reloadPlugins1446        $cloned.csf_reload_script('sub');1447      });1448      $this.on('click', '.csf-modal-close, .csf-modal-overlay', function() {1449        $this.hide();1450        $body.removeClass('csf-shortcode-scrolling');1451      });1452    });1453  };1454  //1455  // Helper Tooltip1456  //1457  $.fn.csf_tooltip = function() {1458    return this.each(function() {1459      var $this = $(this),1460          $tooltip,1461          tooltip_left;1462      $this.on({1463        mouseenter: function () {1464          $tooltip = $( '<div class="csf-tooltip"></div>' ).html( $this.attr( 'data-title' ) ).appendTo('body');1465          tooltip_left = ( has_rtl ) ? ( $this.offset().left + 24 ) : ( $this.offset().left - $tooltip.outerWidth() );1466          $tooltip.css({1467            top: $this.offset().top - ( ( $tooltip.outerHeight() / 2 ) - 12 ),1468            left: tooltip_left,1469          });1470        },1471        mouseleave: function () {1472          if( $tooltip !== undefined ) {1473            $tooltip.remove();1474          }1475        }1476      });1477    });1478  };1479  //1480  // Customize Refresh1481  //1482  $.fn.csf_customizer_refresh = function() {1483    return this.each(function() {1484      var $this    = $(this),1485          $complex = $this.closest('.csf-customize-complex');1486      $(document).trigger('csf-customizer-refresh', $this);1487      if( wp.customize === undefined || $complex.length === 0 ) { return; }1488      var $input  = $complex.find(':input'),1489          $unique = $complex.data('unique-id'),1490          $option = $complex.data('option-id'),1491          obj     = $input.serializeObjectCSF(),1492          data    = ( !$.isEmptyObject(obj) ) ? obj[$unique][$option] : '';1493      wp.customize.control( $unique +'['+ $option +']' ).setting.set( data );1494    });1495  };1496  //1497  // Customize Listen Form Elements - CODEVZ EDITED DELAY1498  //1499  $.fn.csf_customizer_listen = function( has_closest ) {1500    return this.each(function() {1501      if( wp.customize === undefined ) { return; }1502      var $this   = ( has_closest ) ? $(this).closest('.csf-customize-complex') : $(this),1503          $input  = $this.find(':input'),1504          $unique = $this.data('unique-id'),1505          $option = $this.data('option-id'),1506          delay   = ( $option.indexOf( '_css_' ) >= 0 ) ? 0 : 250;1507      if( $unique === undefined ) { return; }1508      $input.on('change keyup', CSF.helper.debounce( function() {1509        var obj  = $this.find(':input').serializeObjectCSF();1510        var data = ( !$.isEmptyObject(obj) ) ? obj[$unique][$option] : '';1511        wp.customize.control( $unique +'['+ $option +']' ).setting.set( data );1512      }, 250 ) );1513    });1514  };1515  //1516  // Customizer Listener for Reload JS1517  //1518  $(document).on( 'expanded', '.control-section-csf', function() {1519    var $this = $(this);1520    if( !$this.data('inited') ) {1521      $this.csf_reload_script();1522      $this.find('.csf-customize-complex').csf_customizer_listen();1523    }1524  });1525  //1526  // Widgets Framework1527  //1528  $.fn.csf_widgets = function() {1529    return this.each(function() {1530      var $this   = $(this),1531          $widgets = $this.find('.widget-liquid-right .widget');1532      $widgets.each( function() {1533        var $widget  = $(this),1534            $title = $widget.find('.widget-top');1535        $title.on('click', function() {1536          $widget.csf_reload_script();1537        });1538      });1539    });1540  };1541  //1542  // Widget Listener for Reload JS1543  //1544  $(document).on( 'widget-added widget-updated', function( event, $widget ) {1545    $widget.data( 'inited', false ); // CODEVZ1546    $widget.csf_reload_script();1547  });1548  //1549  // Reload Widget Plugins1550  //1551  $.fn.csf_reload_script = function( has_sub ) {1552    return this.each(function() {1553      var $this = $(this);1554      // Avoid for conflicts1555      if( !$this.data('inited') ) {1556        $this.find('.csf-field-image-selector').not('.csf-no-script').csf_field_image_selector();1557        $this.find('.csf-field-image').not('.csf-no-script').csf_field_image();1558        $this.find('.csf-field-gallery').not('.csf-no-script').csf_field_gallery();1559        //$this.find('.csf-field-sorter').not('.csf-no-script').csf_field_sorter();1560        $this.find('.csf-field-upload').not('.csf-no-script').csf_field_upload();1561        $this.find('.csf-field-color_picker').not('.csf-no-script').csf_field_colorpicker();1562        $this.find('.csf-field-icon').not('.csf-no-script').csf_field_icon();1563        $this.find('.csf-field-select_font').not('.csf-no-script').csf_field_select_font();1564        $this.find('.csf-field-demo_importer').not('.csf-no-script').csf_field_demo_importer();1565        $this.find('.csf-field-header-preset').not('.csf-no-script').csf_field_header_preset();1566        $this.find('.csf-field-group').not('.csf-no-script').csf_field_group();1567        //$this.find('.csf-field-repeater').not('.csf-no-script').csf_field_repeater();1568        //$this.find('.csf-field-ace_editor').not('.csf-no-script').csf_field_ace_editor();1569        //$this.find('.csf-field-date').not('.csf-no-script').csf_field_datepicker();1570        //$this.find('.csf-field-tabbed').not('.csf-no-script').csf_field_tabbed();1571        $this.find('.csf-field-backup').not('.csf-no-script').csf_field_backup();1572        $this.find('.csf-help').not('.csf-no-script').csf_tooltip();1573        //$this.find('.chosen').not('.csf-no-script').csf_chosen();1574        $this.csf_dependency();1575        if( has_sub === 'sub' ) {1576          $this.csf_dependency('sub');1577        }1578        $this.data('inited', true);1579        $(document).trigger('csf-reload-script', [ $this ]);1580      }1581    });1582  };1583  $(document).ready( function() {1584    $('.csf-save').csf_save();1585    $('.csf-confirm').csf_confirm();1586    $('.csf-nav').csf_navigation();1587    $('.csf-search').csf_search();1588    $('.csf-sticky-header').csf_sticky();1589    $('.csf-taxonomy').csf_taxonomy();1590    //$('.csf-shortcode').csf_shortcode();1591    $('.widgets-php').csf_widgets();1592    $('.csf-onload').csf_reload_script();1593  });...Using AI Code Generation
1import {csf} from 'storybook-test-runner';2import {storiesOf} from 'storybook-test-runner';3import {stories} from 'storybook-test-runner';4csf('MyComponent', module, () => {5  storiesOf('MyComponent', module)6    .add('MyComponent Story', () => <MyComponent />);7});8storiesOf('MyComponent', module)9  .add('MyComponent Story', () => <MyComponent />);10stories('MyComponent', module)11  .add('MyComponent Story', () => <MyComponent />);12storiesOf('MyComponent', module)13  .add('MyComponent Story', () => <MyComponent />);14stories('MyComponent', module)15  .add('MyComponent Story', () => <MyComponent />);16storiesOf('MyComponent', module)17  .add('MyComponent Story', () => <MyComponent />);18stories('MyComponent', module)19  .add('MyComponent Story', () => <MyComponent />);20storiesOf('MyComponent', module)21  .add('MyComponent Story', () => <MyComponent />);22stories('MyComponent', module)23  .add('MyComponent Story', () => <MyComponent />);24storiesOf('MyComponent', module)25  .add('MyComponent Story', () => <MyComponent />);26stories('MyComponent', module)27  .add('MyComponent Story', () => <MyComponent />);28storiesOf('MyComponent', module)29  .add('MyComponent Story', () => <MyComponent />);30stories('MyComponent', module)31  .add('MyComponent Story', () => <MyComponent />);32storiesOf('MyComponent', module)33  .add('MyComponentUsing AI Code Generation
1import { csf } from 'storybook-test-runner';2const stories = csf(require.context('../src', true, /\.stories\.js$/));3stories.forEach(story => {4  it(`should render ${story.name} correctly`, async () => {5    const wrapper = await story.render();6    expect(wrapper.html()).toMatchSnapshot();7  });8});9import { storiesOf } from '@storybook/vue';10import Button from './button.vue';11storiesOf('Button', module).add('with text', () => ({12  components: { Button },13}));14The story.render() method also accepts an optional parameter which can be used to set the props of the story. The above code can be modified to set the props of the story as follows:15import { csf } from 'storybook-test-runner';16const stories = csf(require.context('../src', true, /\.stories\.js$/));17stories.forEach(story => {18  it(`should render ${story.name} correctly`, async () => {19    const wrapper = await story.render({ props: { text: 'Hello Button' } });20    expect(wrapper.html()).toMatchSnapshot();21  });22});23import { storiesOf } from '@storybook/vue';24import Button from './button.vue';25storiesOf('Button', module).add('with text', () => ({26  components: { Button },27  props: {28    text: {29      default: text('Text', 'Hello Button')30    }31  },32  template: '<Button>{{ text }}</Button>'33}));34The story.render() method also accepts an optional parameter which can be used to set the context of the story. The above code can be modified to set the context of the story as follows:35import {Using AI Code Generation
1import { spec } from 'storybook-test-runner';2export default spec('my-storybook', 'my-component');3import test from './test';4import { storiesOf } from '@storybook/react';5storiesOf('my-storybook', module)6  .add('my-component', () => <div>my-component</div>);7test('my-storybook', 'my-component', () => {8});9import test from './test';10import { storiesOf } from '@storybook/react';11storiesOf('my-storybook', module)12  .add('my-component', () => <div>my-component</div>);13test('my-storybook', 'my-component', () => {14});15import test from './test';16import { storiesOf } from '@storybook/react';17storiesOf('my-storybook', module)18  .add('my-component', () => <div>my-component</div>);19test('my-storybook', 'my-component', () => {20});21import test from './test';22import { storiesOf } from '@storybook/react';Using AI Code Generation
1const { csf } = require("@storybook/csf");2const { getStorybook } = require("@storybook/react");3const { getStorybookConfig } = require("storybook-test-runner");4const { stories } = getStorybookConfig(getStorybook());5stories.forEach((story) => {6  const { id, kind, name, parameters } = story;7  const { component, story: storyFn } = csf.getStoryExports(story);8  const storyContext = { id, kind, name, story: storyFn, parameters };9  const storyElement = component(storyContext);10  console.log("Story element", storyElement);11});Using AI Code Generation
1import { csf } from '@storybook/csf';2import { render } from '@storybook/core/client';3import { StoryStore } from '@storybook/client-api';4import { applyDecorators } from '@storybook/addons';5import { decorators } from './decorators';6import { stories } from './stories';7const storyStore = new StoryStore();8stories.forEach((story) => {9  const { id, name, decorators: storyDecorators, parameters, args, argTypes } = story;10  storyStore.addStory(11    { id, kind: 'Test', name },12    () => csf.render({ storyFn: story.storyFn, parameters, args, argTypes }),13    applyDecorators(decorators, storyDecorators),14  );15});16render({ storyStore });Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
