/**
     * Render the shortcode
     * @param  array $args	 Shortcode paramters
     * @param  string $content Content between shortcode
     * @return string		  HTML output
     */
    function render($args, $content = '')
    {
        global $smof_data;
        $defaults = FusionCore_Plugin::set_shortcode_defaults(array('class' => '', 'id' => '', 'animation' => 'no', 'address' => '', 'height' => '300px', 'icon' => '', 'infobox' => '', 'infobox_background_color' => '', 'infobox_content' => '', 'infobox_text_color' => '', 'map_style' => '', 'overlay_color' => '', 'popup' => 'yes', 'scale' => 'yes', 'scrollwheel' => 'yes', 'type' => 'roadmap', 'width' => '100%', 'zoom' => '14', 'zoom_pancontrol' => 'yes'), $args);
        extract($defaults);
        self::$args = $defaults;
        $html = '';
        if ($address) {
            $addresses = explode('|', $address);
            if ($addresses) {
                self::$args['address'] = $addresses;
            }
            $num_of_addresses = count($addresses);
            if ($infobox_content) {
                $infobox_content_array = explode('|', $infobox_content);
            } else {
                $infobox_content_array = '';
            }
            if ($icon) {
                $icon_array = explode('|', $icon);
            } else {
                $icon_array = '';
            }
            if ($map_style == 'theme') {
                $map_style = 'custom';
                $icon = 'theme';
                $animation = 'yes';
                $infobox = 'custom';
                $infobox_background_color = FusionCore_Plugin::hex2rgb($smof_data['primary_color']);
                $infobox_background_color = 'rgba(' . $infobox_background_color[0] . ', ' . $infobox_background_color[1] . ', ' . $infobox_background_color[2] . ', 0.8)';
                $overlay_color = $smof_data['primary_color'];
                $brightness_level = FusionCore_Plugin::calc_color_brightness($smof_data['primary_color']);
                if ($brightness_level > 140) {
                    $infobox_text_color = '#fff';
                } else {
                    $infobox_text_color = '#747474';
                }
            }
            // If only one custom icon is set, use it for all markers
            if ($map_style == 'custom' && $icon && $icon != 'theme' && $icon_array && count($icon_array) == 1) {
                $icon_url = $icon_array[0];
                for ($i = 0; $i < $num_of_addresses; $i++) {
                    $icon_array[$i] = $icon_url;
                }
            }
            if ($icon == 'theme' && $map_style == 'custom') {
                for ($i = 0; $i < $num_of_addresses; $i++) {
                    $icon_array[$i] = plugins_url('images/avada_map_marker.png', dirname(__FILE__));
                }
            }
            if (wp_script_is('google-maps-api', 'registered')) {
                wp_print_scripts('google-maps-api');
            }
            if (wp_script_is('google-maps-infobox', 'registered')) {
                wp_print_scripts('google-maps-infobox');
            }
            foreach (self::$args['address'] as $add) {
                $add = trim($add);
                $add_arr = explode("\n", $add);
                $add_arr = array_filter($add_arr, 'trim');
                $add = implode('<br/>', $add_arr);
                $add = str_replace("\r", '', $add);
                $add = str_replace("\n", '', $add);
                $coordinates[]['address'] = $add;
            }
            if (!is_array($coordinates)) {
                return;
            }
            for ($i = 0; $i < $num_of_addresses; $i++) {
                if (strpos(self::$args['address'][$i], 'latlng=') === 0) {
                    self::$args['address'][$i] = $coordinates[$i]['address'];
                }
            }
            if (is_array($infobox_content_array) && !empty($infobox_content_array)) {
                for ($i = 0; $i < $num_of_addresses; $i++) {
                    if (!array_key_exists($i, $infobox_content_array)) {
                        $infobox_content_array[$i] = self::$args['address'][$i];
                    }
                }
                self::$args['infobox_content'] = $infobox_content_array;
            } else {
                self::$args['infobox_content'] = self::$args['address'];
            }
            $cached_addresses = get_option('fusion_map_addresses');
            foreach (self::$args['address'] as $key => $address) {
                $json_addresses[] = array('address' => $address, 'infobox_content' => html_entity_decode(self::$args['infobox_content'][$key]));
                if (isset($icon_array) && is_array($icon_array) && array_key_exists($key, $icon_array)) {
                    $json_addresses[$key]['marker'] = $icon_array[$key];
                }
                if (strpos($address, strtolower('latlng=')) !== false) {
                    $json_addresses[$key]['address'] = str_replace('latlng=', '', $address);
                    $latLng = explode(',', $json_addresses[$key]['address']);
                    $json_addresses[$key]['coordinates'] = true;
                    $json_addresses[$key]['latitude'] = $latLng[0];
                    $json_addresses[$key]['longitude'] = $latLng[1];
                    $json_addresses[$key]['cache'] = false;
                    if (strpos(self::$args['infobox_content'][$key], strtolower('latlng=')) !== false) {
                        $json_addresses[$key]['infobox_content'] = '';
                    }
                    if (isset($cached_addresses[trim($json_addresses[$key]['latitude'] . ',' . $json_addresses[$key]['longitude'])])) {
                        $json_addresses[$key]['geocoded_address'] = $cached_addresses[trim($json_addresses[$key]['latitude'] . ',' . $json_addresses[$key]['longitude'])]['address'];
                        $json_addresses[$key]['cache'] = true;
                    }
                } else {
                    $json_addresses[$key]['coordinates'] = false;
                    $json_addresses[$key]['cache'] = false;
                    if (isset($cached_addresses[trim($json_addresses[$key]['address'])])) {
                        $json_addresses[$key]['latitude'] = $cached_addresses[trim($json_addresses[$key]['address'])]['latitude'];
                        $json_addresses[$key]['longitude'] = $cached_addresses[trim($json_addresses[$key]['address'])]['longitude'];
                        $json_addresses[$key]['cache'] = true;
                    }
                }
            }
            $json_addresses = json_encode($json_addresses);
            $map_id = uniqid('fusion_map_');
            // generate a unique ID for this map
            $this->map_id = $map_id;
            ob_start();
            ?>
			<script type="text/javascript">
				var map_<?php 
            echo $map_id;
            ?>
;
				var markers = [];
				var counter = 0;
				function fusion_run_map_<?php 
            echo $map_id;
            ?>
() {
					jQuery('#<?php 
            echo $map_id;
            ?>
').fusion_maps({
						addresses: <?php 
            echo $json_addresses;
            ?>
,
						animations: <?php 
            echo $animation == 'yes' ? 'true' : 'false';
            ?>
,
						infobox_background_color: '<?php 
            echo $infobox_background_color;
            ?>
',
						infobox_styling: '<?php 
            echo $infobox;
            ?>
',
						infobox_text_color: '<?php 
            echo $infobox_text_color;
            ?>
',
						map_style: '<?php 
            echo $map_style;
            ?>
',
						map_type: '<?php 
            echo $type;
            ?>
',
						marker_icon: '<?php 
            echo $icon;
            ?>
',
						overlay_color: '<?php 
            echo $overlay_color;
            ?>
',
						overlay_color_hsl: <?php 
            echo json_encode(FusionCore_Plugin::rgb2hsl($overlay_color));
            ?>
,
						pan_control: <?php 
            echo $zoom_pancontrol == 'yes' ? 'true' : 'false';
            ?>
,
						show_address: <?php 
            echo $popup == 'yes' ? 'true' : 'false';
            ?>
,
						scale_control: <?php 
            echo $scale == 'yes' ? 'true' : 'false';
            ?>
,
						scrollwheel: <?php 
            echo $scrollwheel == 'yes' ? 'true' : 'false';
            ?>
,
						zoom: <?php 
            echo $zoom;
            ?>
,
						zoom_control: <?php 
            echo $zoom_pancontrol == 'yes' ? 'true' : 'false';
            ?>
,
					});
				}

				google.maps.event.addDomListener(window, 'load', fusion_run_map_<?php 
            echo $map_id;
            ?>
);
			</script>
			<?php 
            if ($defaults['id']) {
                $html = ob_get_clean() . sprintf('<div id="%s"><div %s></div></div>', $defaults['id'], FusionCore_Plugin::attributes('google-map-shortcode'));
            } else {
                $html = ob_get_clean() . sprintf('<div %s></div>', FusionCore_Plugin::attributes('google-map-shortcode'));
            }
        }
        return $html;
    }
예제 #2
0
    /**
     * Render the shortcode
     * @param  array $args	 Shortcode paramters
     * @param  string $content Content between shortcode
     * @return string		  HTML output
     */
    function render($args, $content = '')
    {
        global $smof_data;
        $defaults = FusionCore_Plugin::set_shortcode_defaults(array('class' => '', 'id' => '', 'animation' => 'no', 'address' => '', 'height' => '300px', 'icon' => '', 'infobox' => '', 'infobox_background_color' => '', 'infobox_content' => '', 'infobox_text_color' => '', 'map_style' => '', 'overlay_color' => '', 'popup' => 'yes', 'scale' => 'yes', 'scrollwheel' => 'yes', 'type' => 'roadmap', 'width' => '100%', 'zoom' => '14', 'zoom_pancontrol' => 'yes'), $args);
        extract($defaults);
        self::$args = $defaults;
        $html = '';
        if ($address) {
            $addresses = explode('|', $address);
            if ($infobox_content) {
                $infobox_content_array = explode('|', $infobox_content);
            } else {
                $infobox_content_array = '';
            }
            if ($icon) {
                $icon_array = explode('|', $icon);
            } else {
                $icon_array = '';
            }
            if ($addresses) {
                self::$args['address'] = $addresses;
            }
            $num_of_addresses = count($addresses);
            if ($map_style == 'theme') {
                $map_style = 'custom';
                $icon = 'theme';
                $animation = 'yes';
                $infobox = 'custom';
                $infobox_background_color = FusionCore_Plugin::hex2rgb($smof_data['primary_color']);
                $infobox_background_color = 'rgba(' . $infobox_background_color[0] . ', ' . $infobox_background_color[1] . ', ' . $infobox_background_color[2] . ', 0.8)';
                $overlay_color = $smof_data['primary_color'];
                $brightness_level = FusionCore_Plugin::calc_color_brightness($smof_data['primary_color']);
                if ($brightness_level > 140) {
                    $infobox_text_color = '#fff';
                } else {
                    $infobox_text_color = '#747474';
                }
            }
            if ($map_style == 'custom') {
                $animation = 'yes';
            }
            if ($icon == 'theme' && $map_style == 'custom') {
                for ($i = 0; $i < $num_of_addresses; $i++) {
                    $icon_array[$i] = plugins_url('images/avada_map_marker.png', dirname(__FILE__));
                }
            }
            wp_print_scripts('google-maps-api');
            wp_print_scripts('google-maps-infobox');
            foreach (self::$args['address'] as $add) {
                $coordinates[] = $this->get_coordinates($add);
            }
            if (!is_array($coordinates)) {
                return;
            }
            for ($i = 0; $i < $num_of_addresses; $i++) {
                if (strpos(self::$args['address'][$i], 'latlng=') === 0) {
                    self::$args['address'][$i] = $coordinates[$i]['address'];
                }
            }
            if (is_array($infobox_content_array) && !empty($infobox_content_array)) {
                for ($i = 0; $i < $num_of_addresses; $i++) {
                    if (!array_key_exists($i, $infobox_content_array)) {
                        $infobox_content_array[$i] = self::$args['address'][$i];
                    }
                }
                self::$args['infobox_content'] = $infobox_content_array;
            } else {
                self::$args['infobox_content'] = self::$args['address'];
            }
            $map_id = uniqid('fusion_map_');
            // generate a unique ID for this map
            $this->map_id = $map_id;
            ob_start();
            ?>
			<script type="text/javascript">
				var map_<?php 
            echo $map_id;
            ?>
;
				var markers = [];
				var counter = 0;
				function fusion_run_map_<?php 
            echo $map_id;
            ?>
() {
					var location = new google.maps.LatLng(<?php 
            echo $coordinates[0]['lat'];
            ?>
, <?php 
            echo $coordinates[0]['lng'];
            ?>
);
					var map_options = {
						zoom: <?php 
            echo $zoom;
            ?>
,
						center: location,
						mapTypeId: google.maps.MapTypeId.<?php 
            echo strtoupper($type);
            ?>
,
						scrollwheel: <?php 
            echo $scrollwheel == 'yes' ? 'true' : 'false';
            ?>
,
						scaleControl: <?php 
            echo $scale == 'yes' ? 'true' : 'false';
            ?>
,
						panControl: <?php 
            echo $zoom_pancontrol == 'yes' ? 'true' : 'false';
            ?>
,
						zoomControl: <?php 
            echo $zoom_pancontrol == 'yes' ? 'true' : 'false';
            ?>
						
					};
					map_<?php 
            echo $map_id;
            ?>
 = new google.maps.Map(document.getElementById("<?php 
            echo esc_attr($map_id);
            ?>
"), map_options);
					<?php 
            $i = 0;
            ?>
					<?php 
            foreach ($coordinates as $key => $coordinate) {
                $infobox_content = trim(self::$args['infobox_content'][$key]);
                $infobox_content_arr = explode("\n", $infobox_content);
                $infobox_content_arr = array_filter($infobox_content_arr, 'trim');
                $infobox_content = implode('', $infobox_content_arr);
                $infobox_content = str_replace("\r", '', $infobox_content);
                $infobox_content = str_replace("\n", '', $infobox_content);
                ?>
					
					var content_string = "<div class='info-window'><?php 
                echo $infobox_content;
                ?>
</div>";
					
					<?php 
                if ($overlay_color && $map_style == 'custom') {
                    $hsl = FusionCore_Plugin::rgb2hsl($overlay_color);
                    ?>
					var styles = [
					  {
						stylers: [
						  { hue: '<?php 
                    echo $overlay_color;
                    ?>
' },
						  <?php 
                    if (self::$args['map_style'] == 'custom') {
                        ?>
						  { saturation: '<?php 
                        echo $hsl['sat'] * 2 - 100;
                        ?>
' },
						  { lightness: '<?php 
                        echo $hsl['lum'] * 2 - 100;
                        ?>
' }
						  <?php 
                    } elseif (self::$args['map_style'] == 'theme') {
                        ?>
						  { saturation: '-20' },
						  <?php 
                    }
                    ?>
						]
					  },{
						featureType: "road",
						elementType: "geometry",
						stylers: [
						  { visibility: "simplified" }
						]
					  },{
						featureType: "road",
						elementType: "labels",
					  }
					];					

					map_<?php 
                    echo $map_id;
                    ?>
.setOptions({styles: styles});
					
					<?php 
                }
                ?>

					map_<?php 
                echo $map_id;
                ?>
_args = {
						position: new google.maps.LatLng("<?php 
                echo $coordinate['lat'];
                ?>
", "<?php 
                echo $coordinate['lng'];
                ?>
"),
						map: map_<?php 
                echo $map_id;
                ?>
					};

					<?php 
                if ($animation == 'yes') {
                    ?>
					map_<?php 
                    echo $map_id;
                    ?>
_args.animation = google.maps.Animation.DROP;
					<?php 
                }
                ?>
					<?php 
                if ($icon == 'theme' && isset($icon_array[$i]) && $icon_array[$i] && $map_style == 'custom') {
                    ?>
					map_<?php 
                    echo $map_id;
                    ?>
_args.icon = new google.maps.MarkerImage( '<?php 
                    echo $icon_array[$i];
                    ?>
', null, null, null, new google.maps.Size( 37, 55 ) );
					<?php 
                } else {
                    if (isset($icon_array[$i]) && $icon_array[$i] && $map_style == 'custom') {
                        ?>
					map_<?php 
                        echo $map_id;
                        ?>
_args.icon = '<?php 
                        echo $icon_array[$i];
                        ?>
';
					<?php 
                    }
                }
                ?>
					<?php 
                $i++;
                ?>

					markers[counter] = new google.maps.Marker(map_<?php 
                echo $map_id;
                ?>
_args);
					
					<?php 
                if ($infobox == 'custom' && $map_style == 'custom') {
                    ?>
					
						var info_box_div = document.createElement('div');
						info_box_div.className = 'fusion-info-box';
						info_box_div.style.cssText = 'background-color:<?php 
                    echo $infobox_background_color;
                    ?>
;color:<?php 
                    echo $infobox_text_color;
                    ?>
;';

						info_box_div.innerHTML = content_string;

						var info_box_options = {
							 content: info_box_div
							,disableAutoPan: false
							,maxWidth: 150
							,pixelOffset: new google.maps.Size(-125, 10)
							,zIndex: null
							,boxStyle: { 
							  background: 'none'
							  ,opacity: 1
							  ,width: "250px"
							 }
							,closeBoxMargin: "2px 2px 2px 2px"
							,closeBoxURL: "<?php 
                    echo is_ssl() ? 'https' : 'http';
                    ?>
://www.google.com/intl/en_us/mapfiles/close.gif"
							,infoBoxClearance: new google.maps.Size(1, 1)

						};

						markers[counter]['infowindow'] = new InfoBox(info_box_options);
						markers[counter]['infowindow'].open(map_<?php 
                    echo $map_id;
                    ?>
, markers[counter]);
						<?php 
                    if ($popup != 'yes') {
                        ?>
							markers[counter]['infowindow'].setVisible( false );
						<?php 
                    }
                    ?>
						google.maps.event.addListener(markers[counter], 'click', function() {
							if( this['infowindow'].getVisible() ) {
								this['infowindow'].setVisible( false );
							} else {
								this['infowindow'].setVisible( true );
							}
						}); 					
						
					<?php 
                } else {
                    ?>
					
						markers[counter]['infowindow'] = new google.maps.InfoWindow({
							content: content_string
						});					
						
						<?php 
                    if ($popup == 'yes') {
                        ?>
							markers[counter]['infowindow'].show = true;
							markers[counter]['infowindow'].open(map_<?php 
                        echo $map_id;
                        ?>
, markers[counter]);
						<?php 
                    }
                    ?>
						

						google.maps.event.addListener(markers[counter], 'click', function() {
							if(this['infowindow'].show) {
								this['infowindow'].close(map_<?php 
                    echo $map_id;
                    ?>
, this);
								this['infowindow'].show = false;
							} else {
								this['infowindow'].open(map_<?php 
                    echo $map_id;
                    ?>
, this);
								this['infowindow'].show = true;
							}
						});
					
					<?php 
                }
                ?>
					
					counter++;
					<?php 
            }
            ?>

				}

				google.maps.event.addDomListener(window, 'load', fusion_run_map_<?php 
            echo $map_id;
            ?>
);

			</script>
			<?php 
            if ($defaults['id']) {
                $html = ob_get_clean() . sprintf('<div id="%s"><div %s></div></div>', $defaults['id'], FusionCore_Plugin::attributes('google-map-shortcode'));
            } else {
                $html = ob_get_clean() . sprintf('<div %s></div>', FusionCore_Plugin::attributes('google-map-shortcode'));
            }
        }
        return $html;
    }