| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*global wc_country_select_params */
- jQuery( function( $ ) {
- // wc_country_select_params is required to continue, ensure the object exists
- if ( typeof wc_country_select_params === 'undefined' ) {
- return false;
- }
- function getEnhancedSelectFormatString() {
- return {
- 'language': {
- errorLoading: function() {
- // Workaround for https://github.com/select2/select2/issues/4355 instead of i18n_ajax_error.
- return wc_country_select_params.i18n_searching;
- },
- inputTooLong: function( args ) {
- var overChars = args.input.length - args.maximum;
- if ( 1 === overChars ) {
- return wc_country_select_params.i18n_input_too_long_1;
- }
- return wc_country_select_params.i18n_input_too_long_n.replace( '%qty%', overChars );
- },
- inputTooShort: function( args ) {
- var remainingChars = args.minimum - args.input.length;
- if ( 1 === remainingChars ) {
- return wc_country_select_params.i18n_input_too_short_1;
- }
- return wc_country_select_params.i18n_input_too_short_n.replace( '%qty%', remainingChars );
- },
- loadingMore: function() {
- return wc_country_select_params.i18n_load_more;
- },
- maximumSelected: function( args ) {
- if ( args.maximum === 1 ) {
- return wc_country_select_params.i18n_selection_too_long_1;
- }
- return wc_country_select_params.i18n_selection_too_long_n.replace( '%qty%', args.maximum );
- },
- noResults: function() {
- return wc_country_select_params.i18n_no_matches;
- },
- searching: function() {
- return wc_country_select_params.i18n_searching;
- }
- }
- };
- }
- // Select2 Enhancement if it exists
- if ( $().selectWoo ) {
- var wc_country_select_select2 = function() {
- $( 'select.country_select:visible, select.state_select:visible' ).each( function() {
- var select2_args = $.extend({
- placeholderOption: 'first',
- width: '100%'
- }, getEnhancedSelectFormatString() );
- $( this ).selectWoo( select2_args );
- // Maintain focus after select https://github.com/select2/select2/issues/4384
- $( this ).on( 'select2:select', function() {
- $( this ).focus();
- } );
- });
- };
- wc_country_select_select2();
- $( document.body ).bind( 'country_to_state_changed', function() {
- wc_country_select_select2();
- });
- }
- /* State/Country select boxes */
- var states_json = wc_country_select_params.countries.replace( /"/g, '"' ),
- states = $.parseJSON( states_json );
- $( document.body ).on( 'change', 'select.country_to_state, input.country_to_state', function() {
- // Grab wrapping element to target only stateboxes in same 'group'
- var $wrapper = $( this ).closest('.woocommerce-billing-fields, .woocommerce-shipping-fields, .woocommerce-shipping-calculator');
- if ( ! $wrapper.length ) {
- $wrapper = $( this ).closest('.form-row').parent();
- }
- var country = $( this ).val(),
- $statebox = $wrapper.find( '#billing_state, #shipping_state, #calc_shipping_state' ),
- $parent = $statebox.closest( 'p.form-row' ),
- input_name = $statebox.attr( 'name' ),
- input_id = $statebox.attr( 'id' ),
- value = $statebox.val(),
- placeholder = $statebox.attr( 'placeholder' ) || $statebox.attr( 'data-placeholder' ) || '';
- if ( states[ country ] ) {
- if ( $.isEmptyObject( states[ country ] ) ) {
- $statebox.closest( 'p.form-row' ).hide().find( '.select2-container' ).remove();
- $statebox.replaceWith( '<input type="hidden" class="hidden" name="' + input_name + '" id="' + input_id + '" value="" placeholder="' + placeholder + '" />' );
- $( document.body ).trigger( 'country_to_state_changed', [ country, $wrapper ] );
- } else {
- var options = '',
- state = states[ country ];
- for( var index in state ) {
- if ( state.hasOwnProperty( index ) ) {
- options = options + '<option value="' + index + '">' + state[ index ] + '</option>';
- }
- }
- $statebox.closest( 'p.form-row' ).show();
- if ( $statebox.is( 'input' ) ) {
- // Change for select
- $statebox.replaceWith( '<select name="' + input_name + '" id="' + input_id + '" class="state_select" data-placeholder="' + placeholder + '"></select>' );
- $statebox = $wrapper.find( '#billing_state, #shipping_state, #calc_shipping_state' );
- }
- $statebox.html( '<option value="">' + wc_country_select_params.i18n_select_state_text + '</option>' + options );
- $statebox.val( value ).change();
- $( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] );
- }
- } else {
- if ( $statebox.is( 'select' ) ) {
- $parent.show().find( '.select2-container' ).remove();
- $statebox.replaceWith( '<input type="text" class="input-text" name="' + input_name + '" id="' + input_id + '" placeholder="' + placeholder + '" />' );
- $( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] );
- } else if ( $statebox.is( 'input[type="hidden"]' ) ) {
- $parent.show().find( '.select2-container' ).remove();
- $statebox.replaceWith( '<input type="text" class="input-text" name="' + input_name + '" id="' + input_id + '" placeholder="' + placeholder + '" />' );
- $( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] );
- }
- }
- $( document.body ).trigger( 'country_to_state_changing', [country, $wrapper ] );
- });
- $(function() {
- $( ':input.country_to_state' ).change();
- });
- });
|