/*global wc_enhanced_select_params */ jQuery( function( $ ) { function getEnhancedSelectFormatString() { var formatString = { formatMatches: function( matches ) { if ( 1 === matches ) { return wc_enhanced_select_params.i18n_matches_1; } return wc_enhanced_select_params.i18n_matches_n.replace( '%qty%', matches ); }, formatNoMatches: function() { return wc_enhanced_select_params.i18n_no_matches; }, formatAjaxError: function() { return wc_enhanced_select_params.i18n_ajax_error; }, formatInputTooShort: function( input, min ) { var number = min - input.length; if ( 1 === number ) { return wc_enhanced_select_params.i18n_input_too_short_1; } return wc_enhanced_select_params.i18n_input_too_short_n.replace( '%qty%', number ); }, formatInputTooLong: function( input, max ) { var number = input.length - max; if ( 1 === number ) { return wc_enhanced_select_params.i18n_input_too_long_1; } return wc_enhanced_select_params.i18n_input_too_long_n.replace( '%qty%', number ); }, formatSelectionTooBig: function( limit ) { if ( 1 === limit ) { return wc_enhanced_select_params.i18n_selection_too_long_1; } return wc_enhanced_select_params.i18n_selection_too_long_n.replace( '%qty%', limit ); }, formatLoadMore: function() { return wc_enhanced_select_params.i18n_load_more; }, formatSearching: function() { return wc_enhanced_select_params.i18n_searching; } }; return formatString; } $( document.body ) .on( 'wc-enhanced-select-init', function() { // Regular select boxes $( ':input.wc-enhanced-select, :input.chosen_select' ).filter( ':not(.enhanced)' ).each( function() { var select2_args = $.extend({ minimumResultsForSearch: 10, allowClear: $( this ).data( 'allow_clear' ) ? true : false, placeholder: $( this ).data( 'placeholder' ) }, getEnhancedSelectFormatString() ); $( this ).select2( select2_args ).addClass( 'enhanced' ); }); $( ':input.wc-enhanced-select-nostd, :input.chosen_select_nostd' ).filter( ':not(.enhanced)' ).each( function() { var select2_args = $.extend({ minimumResultsForSearch: 10, allowClear: true, placeholder: $( this ).data( 'placeholder' ) }, getEnhancedSelectFormatString() ); $( this ).select2( select2_args ).addClass( 'enhanced' ); }); // Ajax product search box $( ':input.wc-product-search' ).filter( ':not(.enhanced)' ).each( function() { var select2_args = { allowClear: $( this ).data( 'allow_clear' ) ? true : false, placeholder: $( this ).data( 'placeholder' ), minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3', escapeMarkup: function( m ) { return m; }, ajax: { url: wc_enhanced_select_params.ajax_url, dataType: 'json', quietMillis: 250, data: function( term ) { return { term: term, action: $( this ).data( 'action' ) || 'woocommerce_json_search_products_and_variations', security: wc_enhanced_select_params.search_products_nonce, exclude: $( this ).data( 'exclude' ), include: $( this ).data( 'include' ), limit: $( this ).data( 'limit' ) }; }, results: function( data ) { var terms = []; if ( data ) { $.each( data, function( id, text ) { terms.push( { id: id, text: text } ); }); } return { results: terms }; }, cache: true } }; if ( $( this ).data( 'multiple' ) === true ) { select2_args.multiple = true; select2_args.initSelection = function( element, callback ) { var data = $.parseJSON( element.attr( 'data-selected' ) ); var selected = []; $( element.val().split( ',' ) ).each( function( i, val ) { selected.push({ id: val, text: data[ val ] }); }); return callback( selected ); }; select2_args.formatSelection = function( data ) { return '
' + data.text + '
'; }; } else { select2_args.multiple = false; select2_args.initSelection = function( element, callback ) { var data = { id: element.val(), text: element.attr( 'data-selected' ) }; return callback( data ); }; } select2_args = $.extend( select2_args, getEnhancedSelectFormatString() ); $( this ).select2( select2_args ).addClass( 'enhanced' ); if ( $( this ).data( 'sortable' ) ) { $( this ).select2( 'container' ).find( 'ul.select2-choices' ).sortable({ containment: 'parent', start: function() { $( this ).select2( 'onSortStart' ); }, update: function() { $( this ).select2( 'onSortEnd' ); } }); } }); // Ajax customer search boxes $( ':input.wc-customer-search' ).filter( ':not(.enhanced)' ).each( function() { var select2_args = { allowClear: $( this ).data( 'allow_clear' ) ? true : false, placeholder: $( this ).data( 'placeholder' ), minimumInputLength: $( this ).data( 'minimum_input_length' ) ? $( this ).data( 'minimum_input_length' ) : '3', escapeMarkup: function( m ) { return m; }, ajax: { url: wc_enhanced_select_params.ajax_url, dataType: 'json', quietMillis: 250, data: function( term ) { return { term: term, action: 'woocommerce_json_search_customers', security: wc_enhanced_select_params.search_customers_nonce, exclude: $( this ).data( 'exclude' ) }; }, results: function( data ) { var terms = []; if ( data ) { $.each( data, function( id, text ) { terms.push({ id: id, text: text }); }); } return { results: terms }; }, cache: true } }; if ( $( this ).data( 'multiple' ) === true ) { select2_args.multiple = true; select2_args.initSelection = function( element, callback ) { var data = $.parseJSON( element.attr( 'data-selected' ) ); var selected = []; $( element.val().split( ',' ) ).each( function( i, val ) { selected.push({ id: val, text: data[ val ] }); }); return callback( selected ); }; select2_args.formatSelection = function( data ) { return '
' + data.text + '
'; }; } else { select2_args.multiple = false; select2_args.initSelection = function( element, callback ) { var data = { id: element.val(), text: element.attr( 'data-selected' ) }; return callback( data ); }; } select2_args = $.extend( select2_args, getEnhancedSelectFormatString() ); $( this ).select2( select2_args ).addClass( 'enhanced' ); if ( $( this ).data( 'sortable' ) ) { $( this ).select2( 'container' ).find( 'ul.select2-choices' ).sortable({ containment: 'parent', start: function() { $( this ).select2( 'onSortStart' ); }, update: function() { $( this ).select2( 'onSortEnd' ); } }); } }); }) // WooCommerce Backbone Modal .on( 'wc_backbone_modal_before_remove', function() { $( '.wc-enhanced-select, :input.wc-product-search, :input.wc-customer-search' ).filter( ".select2-hidden-accessible" ).select2( 'close' ); }) .trigger( 'wc-enhanced-select-init' ); });