/*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() { var formatString = { formatMatches: function( matches ) { if ( 1 === matches ) { return wc_country_select_params.i18n_matches_1; } return wc_country_select_params.i18n_matches_n.replace( '%qty%', matches ); }, formatNoMatches: function() { return wc_country_select_params.i18n_no_matches; }, formatAjaxError: function() { return wc_country_select_params.i18n_ajax_error; }, formatInputTooShort: function( input, min ) { var number = min - input.length; if ( 1 === number ) { return wc_country_select_params.i18n_input_too_short_1; } return wc_country_select_params.i18n_input_too_short_n.replace( '%qty%', number ); }, formatInputTooLong: function( input, max ) { var number = input.length - max; if ( 1 === number ) { return wc_country_select_params.i18n_input_too_long_1; } return wc_country_select_params.i18n_input_too_long_n.replace( '%qty%', number ); }, formatSelectionTooBig: function( limit ) { if ( 1 === limit ) { return wc_country_select_params.i18n_selection_too_long_1; } return wc_country_select_params.i18n_selection_too_long_n.replace( '%qty%', limit ); }, formatLoadMore: function() { return wc_country_select_params.i18n_load_more; }, formatSearching: function() { return wc_country_select_params.i18n_searching; } }; return formatString; } // Select2 Enhancement if it exists if ( $().select2 ) { 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 ).select2( select2_args ); }); }; 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.parent(), 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.parent().hide().find( '.select2-container' ).remove(); $statebox.replaceWith( '' ); $( 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 + ''; } } $statebox.parent().show(); if ( $statebox.is( 'input' ) ) { // Change for select $statebox.replaceWith( '' ); $statebox = $wrapper.find( '#billing_state, #shipping_state, #calc_shipping_state' ); } $statebox.html( '' + 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( '' ); $( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] ); } else if ( $statebox.is( 'input[type="hidden"]' ) ) { $parent.show().find( '.select2-container' ).remove(); $statebox.replaceWith( '' ); $( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] ); } } $( document.body ).trigger( 'country_to_state_changing', [country, $wrapper ] ); }); $(function() { $( ':input.country_to_state' ).change(); }); });