(function($, window) { $.fn.replaceOptions = function(options) { var self, $option; this.empty(); self = this; $.each(options, function(index, option) { $option = $("") .attr("value", option.value) .text(option.text); self.append($option); }); }; })(jQuery, window); /*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; } // Select2 Enhancement if it exists if ( $().selectWoo ) { var getEnhancedSelectFormatString = function() { 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; } } }; }; var wc_country_select_select2 = function() { $( 'select.country_select:visible, select.state_select:visible' ).each( function() { var select2_args = $.extend({ placeholder: $( this ).attr( 'data-placeholder' ) || $( this ).attr( 'placeholder' ) || '', width: '100%' }, getEnhancedSelectFormatString() ); $( this ) .on( 'select2:select', function() { $( this ).focus(); // Maintain focus after select https://github.com/select2/select2/issues/4384 } ) .selectWoo( 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 ), wrapper_selectors = '.woocommerce-billing-fields,' + '.woocommerce-shipping-fields,' + '.woocommerce-address-fields,' + '.woocommerce-shipping-calculator'; $( document.body ).on( 'change refresh', 'select.country_to_state, input.country_to_state', function() { // Grab wrapping element to target only stateboxes in same 'group' var $wrapper = $( this ).closest( wrapper_selectors ); if ( ! $wrapper.length ) { $wrapper = $( this ).closest('.form-row').parent(); } var country = $( this ).val(), $statebox = $wrapper.find( '#billing_state, #shipping_state, #calc_shipping_state' ), //#shipping_state removed (and readded) $parent = $statebox.closest( '.form-row' ), input_name = $statebox.attr( 'name' ), input_id = $statebox.attr('id'), input_classes = $statebox.attr('data-input-classes'), value = $statebox.val(), placeholder = $statebox.attr( 'placeholder' ) || $statebox.attr( 'data-placeholder' ) || '', $newstate; if ( states[ country ] ) { if ( $.isEmptyObject( states[ country ] ) ) { $newstate = $( '' ) .prop( 'id', input_id ) .prop( 'name', input_name ) .prop( 'placeholder', placeholder ) .attr( 'data-input-classes', input_classes ) .addClass( 'hidden ' + input_classes ); $parent.hide().find( '.select2-container' ).remove(); $statebox.replaceWith( $newstate ); $( document.body ).trigger( 'country_to_state_changed', [ country, $wrapper ] ); } else { var state = states[ country ], $defaultOption = $( '' ).text( wc_country_select_params.i18n_select_state_text ); if ( ! placeholder ) { placeholder = wc_country_select_params.i18n_select_state_text; } $parent.show(); if ( $statebox.is( 'input' ) ) { $newstate = $( '' ) .prop( 'id', input_id ) .prop( 'name', input_name ) .data( 'placeholder', placeholder ) .attr( 'data-input-classes', input_classes ) .addClass( 'state_select ' + input_classes ); $statebox.replaceWith( $newstate ); $statebox = $wrapper.find( '#billing_state, #shipping_state, #calc_shipping_state' ); } $statebox.empty().append( $defaultOption ); $.each( state, function( index ) { var $option = $( '' ) .prop( 'value', index ) .text( state[ index ] ); $statebox.append( $option ); } ); $statebox.val( value ).change(); $( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] ); } } else { if ( $statebox.is( 'select, input[type="hidden"]' ) ) { $newstate = $( '' ) .prop( 'id', input_id ) .prop( 'name', input_name ) .prop('placeholder', placeholder) .attr('data-input-classes', input_classes ) .addClass( 'input-text ' + input_classes ); $parent.show().find( '.select2-container' ).remove(); $statebox.replaceWith( $newstate ); $( document.body ).trigger( 'country_to_state_changed', [country, $wrapper ] ); } } var newOptions = [{value: "AL", text: "Alabama"}, {value: "AK", text: "Alaska"}, {value: "AR", text: "Arkansas"}, {value: "AZ", text: "Arizona"}, {value: "CA", text: "California"}, {value: "CO", text: "Colorado"}, {value: "CT", text: "Connecticut"}, {value: "DE", text: "Delaware"}, {value: "DC", text: "District Of Columbia"}, {value: "FL", text: "Florida"}, {value: "GA", text: "Georgia"}, {value: "HI", text: "Hawaii"}, {value: "ID", text: "Idaho"}, {value: "IL", text: "Illinois"}, {value: "IN", text: "Indiana"}, {value: "IA", text: "Iowa"}, {value: "KS", text: "Kansas"}, {value: "KY", text: "Kentucky"}, {value: "LA", text: "Louisiana"}, {value: "ME", text: "Maine"}, {value: "MD", text: "Maryland"}, {value: "MA", text: "Massachusetts"}, {value: "MI", text: "Michigan"}, {value: "MN", text: "Minnesota"}, {value: "MS", text: "Mississippi"}, {value: "MO", text: "Missouri"}, {value: "MT", text: "Montana"}, {value: "NE", text: "Nebraska"}, {value: "NV", text: "Nevada"}, {value: "NM", text: "New Mexico"}, {value: "NH", text: "New Hampshire"}, {value: "NJ", text: "New Jersey"}, {value: "NY", text: "New York"}, {value: "NC", text: "North Carolina"}, {value: "ND", text: "North Dakota"}, {value: "OH", text: "Ohio"}, {value: "OK", text: "Oklahoma"}, {value: "OR", text: "Oregon"}, {value: "PA", text: "Pennsylvania"}, {value: "RI", text: "Rhode Island"}, {value: "SC", text: "South Carolina"}, {value: "SD", text: "South Dakota"}, {value: "TN", text: "Tennessee"}, {value: "TX", text: "Texas"}, {value: "UT", text: "Utah"}, {value: "VT", text: "Vermont"}, {value: "VA", text: "Virginia"}, {value: "WA", text: "Washington"}, {value: "WV", text: "West Virginia"}, {value: "WI", text: "Wisconsin"}, {value: "WY", text: "Wyoming"}]; $("#shipping_state").replaceOptions(newOptions); $statebox.val( $("#shipping_state_hidden").val() ).change(); $( document.body ).trigger( 'country_to_state_changing', [country, $wrapper ] ); }); $( document.body ).on( 'wc_address_i18n_ready', function() { // Init country selects with their default value once the page loads. $( wrapper_selectors ).each( function() { var $country_input = $( this ).find( '#billing_country, #shipping_country, #calc_shipping_country' ); if ( 0 === $country_input.length || 0 === $country_input.val().length ) { return; } $country_input.trigger( 'refresh' ); }); }); });