/**
  * Make sure the map style shortcode attributes are valid.
  * 
  * The values are send to wp_localize_script in add_frontend_scripts.
  * 
  * @since 2.0.0
  * @param  array $atts     The map style shortcode attributes
  * @return array $map_atts Validated map style shortcode attributes
  */
 public function check_map_shortcode_atts($atts)
 {
     $map_atts = array();
     if (isset($atts['width']) && is_numeric($atts['width'])) {
         $width = 'width:' . $atts['width'] . 'px;';
     } else {
         $width = '';
     }
     if (isset($atts['height']) && is_numeric($atts['height'])) {
         $height = 'height:' . $atts['height'] . 'px;';
     } else {
         $height = '';
     }
     if ($width || $height) {
         $map_atts['css'] = '#wpsl-base-gmap_' . self::$map_count . ' {' . $width . $height . '}';
     }
     if (isset($atts['zoom']) && !empty($atts['zoom'])) {
         $map_atts['zoomLevel'] = wpsl_valid_zoom_level($atts['zoom']);
     }
     if (isset($atts['map_type']) && !empty($atts['map_type'])) {
         $map_atts['mapType'] = wpsl_valid_map_type($atts['map_type']);
     }
     if (isset($atts['map_type_control'])) {
         $map_atts['mapTypeControl'] = $this->shortcode_atts_boolean($atts['map_type_control']);
     }
     if (isset($atts['map_style']) && $atts['map_style'] == 'default') {
         $map_atts['mapStyle'] = '';
     }
     if (isset($atts['street_view'])) {
         $map_atts['streetView'] = $this->shortcode_atts_boolean($atts['street_view']);
     }
     if (isset($atts['scrollwheel'])) {
         $map_atts['scrollWheel'] = $this->shortcode_atts_boolean($atts['scrollwheel']);
     }
     if (isset($atts['control_position']) && !empty($atts['control_position']) && ($atts['control_position'] == 'left' || $atts['control_position'] == 'right')) {
         $map_atts['controlPosition'] = $atts['control_position'];
     }
     return $map_atts;
 }
 /**
  * Sanitize the submitted plugin settings.
  * 
  * @since 1.0.0
  * @return array $output The setting values
  */
 public function sanitize_settings()
 {
     global $wpsl_settings, $wpsl_admin;
     $ux_absints = array('height', 'infowindow_width', 'search_width', 'label_width');
     $marker_effects = array('bounce', 'info_window', 'ignore');
     $ux_checkboxes = array('new_window', 'reset_map', 'listing_below_no_scroll', 'direction_redirect', 'more_info', 'store_url', 'phone_url', 'marker_streetview', 'marker_zoom_to', 'mouse_focus', 'reset_map', 'hide_distance');
     $output['api_key'] = sanitize_text_field($_POST['wpsl_api']['key']);
     $output['api_language'] = wp_filter_nohtml_kses($_POST['wpsl_api']['language']);
     $output['api_region'] = wp_filter_nohtml_kses($_POST['wpsl_api']['region']);
     // Do we need to show the dropdown filters?
     $output['results_dropdown'] = isset($_POST['wpsl_search']['results_dropdown']) ? 1 : 0;
     $output['radius_dropdown'] = isset($_POST['wpsl_search']['radius_dropdown']) ? 1 : 0;
     $output['category_dropdown'] = isset($_POST['wpsl_search']['category_dropdown']) ? 1 : 0;
     $output['distance_unit'] = $_POST['wpsl_search']['distance_unit'] == 'km' ? 'km' : 'mi';
     // Check for a valid max results value, otherwise we use the default.
     if (!empty($_POST['wpsl_search']['max_results'])) {
         $output['max_results'] = sanitize_text_field($_POST['wpsl_search']['max_results']);
     } else {
         $this->settings_error('max_results');
         $output['max_results'] = wpsl_get_default_setting('max_results');
     }
     // See if a search radius value exist, otherwise we use the default.
     if (!empty($_POST['wpsl_search']['radius'])) {
         $output['search_radius'] = sanitize_text_field($_POST['wpsl_search']['radius']);
     } else {
         $this->settings_error('search_radius');
         $output['search_radius'] = wpsl_get_default_setting('search_radius');
     }
     // Check if we have a valid zoom level, it has to be between 1 or 12. If not set it to the default of 3.
     $output['zoom_level'] = wpsl_valid_zoom_level($_POST['wpsl_map']['zoom_level']);
     $output['zoom_name'] = sanitize_text_field($_POST['wpsl_map']['zoom_name']);
     // Check for a valid max auto zoom level.
     $max_zoom_levels = wpsl_get_max_zoom_levels();
     if (in_array(absint($_POST['wpsl_map']['max_auto_zoom']), $max_zoom_levels)) {
         $output['auto_zoom_level'] = $_POST['wpsl_map']['max_auto_zoom'];
     } else {
         $output['auto_zoom_level'] = wpsl_get_default_setting('auto_zoom_level');
     }
     // If no location name is set to zoom to we also empty the latlng values from the hidden input field.
     if (empty($output['zoom_name'])) {
         $this->settings_error('start_point');
         $output['zoom_latlng'] = '';
     } else {
         $output['zoom_latlng'] = sanitize_text_field($_POST['wpsl_map']['zoom_latlng']);
     }
     // Check if we have a valid map type.
     $output['map_type'] = wpsl_valid_map_type($_POST['wpsl_map']['type']);
     $output['auto_locate'] = isset($_POST['wpsl_map']['auto_locate']) ? 1 : 0;
     $output['autoload'] = isset($_POST['wpsl_map']['autoload']) ? 1 : 0;
     // Make sure the auto load limit is either empty or an int.
     if (empty($_POST['wpsl_map']['autoload_limit'])) {
         $output['autoload_limit'] = '';
     } else {
         $output['autoload_limit'] = absint($_POST['wpsl_map']['autoload_limit']);
     }
     $output['streetview'] = isset($_POST['wpsl_map']['streetview']) ? 1 : 0;
     $output['type_control'] = isset($_POST['wpsl_map']['type_control']) ? 1 : 0;
     $output['scrollwheel'] = isset($_POST['wpsl_map']['scrollwheel']) ? 1 : 0;
     $output['control_position'] = $_POST['wpsl_map']['control_position'] == 'left' ? 'left' : 'right';
     $output['map_style'] = json_encode(strip_tags(trim($_POST['wpsl_map']['map_style'])));
     // Make sure we have a valid template ID.
     if (isset($_POST['wpsl_ux']['template_id']) && $_POST['wpsl_ux']['template_id']) {
         $output['template_id'] = sanitize_text_field($_POST['wpsl_ux']['template_id']);
     } else {
         $output['template_id'] = wpsl_get_default_setting('template_id');
     }
     $output['marker_clusters'] = isset($_POST['wpsl_map']['marker_clusters']) ? 1 : 0;
     // Check for a valid cluster zoom value.
     if (in_array($_POST['wpsl_map']['cluster_zoom'], $this->get_default_cluster_option('cluster_zoom'))) {
         $output['cluster_zoom'] = $_POST['wpsl_map']['cluster_zoom'];
     } else {
         $output['cluster_zoom'] = wpsl_get_default_setting('cluster_zoom');
     }
     // Check for a valid cluster size value.
     if (in_array($_POST['wpsl_map']['cluster_size'], $this->get_default_cluster_option('cluster_size'))) {
         $output['cluster_size'] = $_POST['wpsl_map']['cluster_size'];
     } else {
         $output['cluster_size'] = wpsl_get_default_setting('cluster_size');
     }
     /* 
      * Make sure all the ux related fields that should contain an int, actually are an int.
      * Otherwise we use the default value. 
      */
     foreach ($ux_absints as $ux_key) {
         if (absint($_POST['wpsl_ux'][$ux_key])) {
             $output[$ux_key] = $_POST['wpsl_ux'][$ux_key];
         } else {
             $output[$ux_key] = wpsl_get_default_setting($ux_key);
         }
     }
     // Check if the ux checkboxes are checked.
     foreach ($ux_checkboxes as $ux_key) {
         $output[$ux_key] = isset($_POST['wpsl_ux'][$ux_key]) ? 1 : 0;
     }
     // Check if we have a valid marker effect.
     if (in_array($_POST['wpsl_ux']['marker_effect'], $marker_effects)) {
         $output['marker_effect'] = $_POST['wpsl_ux']['marker_effect'];
     } else {
         $output['marker_effect'] = wpsl_get_default_setting('marker_effect');
     }
     // Check if we have a valid address format.
     if (array_key_exists($_POST['wpsl_ux']['address_format'], wpsl_get_address_formats())) {
         $output['address_format'] = $_POST['wpsl_ux']['address_format'];
     } else {
         $output['address_format'] = wpsl_get_default_setting('address_format');
     }
     $output['more_info_location'] = $_POST['wpsl_ux']['more_info_location'] == 'store listings' ? 'store listings' : 'info window';
     $output['infowindow_style'] = isset($_POST['wpsl_ux']['infowindow_style']) ? 'default' : 'infobox';
     $output['start_marker'] = wp_filter_nohtml_kses($_POST['wpsl_map']['start_marker']);
     $output['store_marker'] = wp_filter_nohtml_kses($_POST['wpsl_map']['store_marker']);
     $output['editor_country'] = sanitize_text_field($_POST['wpsl_editor']['default_country']);
     $output['editor_map_type'] = wpsl_valid_map_type($_POST['wpsl_editor']['map_type']);
     $output['hide_hours'] = isset($_POST['wpsl_editor']['hide_hours']) ? 1 : 0;
     if (isset($_POST['wpsl_editor']['hour_input'])) {
         $output['editor_hour_input'] = $_POST['wpsl_editor']['hour_input'] == 'textarea' ? 'textarea' : 'dropdown';
     } else {
         $output['editor_hour_input'] = 'dropdown';
     }
     $output['editor_hour_format'] = $_POST['wpsl_editor']['hour_format'] == 12 ? 12 : 24;
     // The default opening hours.
     if (isset($_POST['wpsl_editor']['textarea'])) {
         $output['editor_hours']['textarea'] = wp_kses_post(trim(stripslashes($_POST['wpsl_editor']['textarea'])));
     }
     $output['editor_hours']['dropdown'] = $wpsl_admin->metaboxes->format_opening_hours();
     array_walk_recursive($output['editor_hours']['dropdown'], 'wpsl_sanitize_multi_array');
     // Permalink and taxonomy slug.
     $output['permalinks'] = isset($_POST['wpsl_permalinks']['active']) ? 1 : 0;
     if (!empty($_POST['wpsl_permalinks']['slug'])) {
         $output['permalink_slug'] = sanitize_text_field($_POST['wpsl_permalinks']['slug']);
     } else {
         $output['permalink_slug'] = wpsl_get_default_setting('permalink_slug');
     }
     if (!empty($_POST['wpsl_permalinks']['category_slug'])) {
         $output['category_slug'] = sanitize_text_field($_POST['wpsl_permalinks']['category_slug']);
     } else {
         $output['category_slug'] = wpsl_get_default_setting('category_slug');
     }
     $required_labels = wpsl_labels();
     // Sanitize the labels.
     foreach ($required_labels as $label) {
         $output[$label . '_label'] = sanitize_text_field($_POST['wpsl_label'][$label]);
     }
     $output['show_credits'] = isset($_POST['wpsl_credits']) ? 1 : 0;
     $output['debug'] = isset($_POST['wpsl_tools']['debug']) ? 1 : 0;
     // Check if we need to flush the permalinks.
     $this->set_flush_rewrite_option($output);
     // Check if there is a reason to delete the autoload transient.
     if ($wpsl_settings['autoload']) {
         $this->set_delete_transient_option($output);
     }
     return $output;
 }