array('js' => array('markerwithlabel_packed.js'), 'flag' => false),
'EGMapKeyDragZoom' => array('js' => array('keydragzoom_packed.js'), 'flag' => false),
'EGMapMarkerClusterer' => array('js' => array('markerclusterer_packed.js'), 'flag' => false),
'EGMapLatLonControl' => array('js' => array('latloncontrol.js'), 'flag' => false),
'EGMapKMLService' => array('js' => array('geoxml3.js'), 'flag' => false),
'EGMapInfoBox' => array('js'=> array('infobox_packed.js'), 'flag'=> false)
);
/**
*
* Folder reference to the registered plugin assets
* @var string
*/
private $pluginDir = null;
/**
*
* HTML document Id
* @var string
*/
private $_containerId;
/**
*
* Container HTML attributes
* @var array
*/
private $_htmlOptions = array();
/**
*
* Container CSS options
*
* array('width'=>'512px','height'=>'512px');
*
* @var array
*/
private $_styleOptions = array('width' => '512px', 'height' => '512px');
/**
*
* default Google Map Options
* @var array
*/
protected $options = array(
// boolean If true, do not clear the contents of the Map div.
'noClear ' => null,
// Enables/disables zoom and center on double click. true by default.
'disableDoubleClickZoom' => null,
// string Color used for the background of the Map div. This color will be visible when tiles have not yet loaded as a user pans.
'backgroundColor' => null,
// string The name or url of the cursor to display on a draggable object.
'draggableCursor' => null,
// string The name or url of the cursor to display when an object is dragging.
'draggingCursor' => null,
// boolean If false, prevents the map from being dragged. Dragging is enabled by default.
'draggable' => null,
// boolean If true, enables scrollwheel zooming on the map. The scrollwheel is disabled by default.
'scrollwheel' => null,
// boolean If false, prevents the map from being controlled by the keyboard. Keyboard shortcuts are enabled by default.
'keyboardShortcuts' => null,
// LatLng The initial Map center. Required.
'center' => null,
// number The initial Map zoom level. Required.
'zoom' => null,
// The maximum zoom level which will be displayed on the map. If omitted, or set to
// null, the maximum zoom from the current map type is used instead.
'maxZoom' => null,
// The minimum zoom level which will be displayed on the map. If omitted, or set to
// null, the minimum zoom from the current map type is used instead.
'minZoom' => null,
// The enabled/disabled state of the zoom control.
// true by default
'zoomControl' => null,
// http://code.google.com/intl/en-EN/apis/maps/documentation/javascript/reference.html#ZoomControlStyle
'zoomControlStyle' => null,
// Of type named array
// http://code.google.com/intl/en-EN/apis/maps/documentation/javascript/reference.html#ZoomControlOptions
'zoomControlOptions' => null,
// The initial enabled/disabled state of the Street View pegman control.
'streetViewControl' => null,
// The initial display options for the Street View pegman control.
// Of type named array
// http://code.google.com/intl/en-EN/apis/maps/documentation/javascript/reference.html#streetViewControlOptions
'streetViewControlOptions' => null,
// string The initial Map mapTypeId. Required.
'mapTypeId' => self::TYPE_ROADMAP,
// boolean Enables/disables all default UI. May be overridden individually.
'disableDefaultUI' => null,
// boolean The initial enabled/disabled state of the Map type control.
'mapTypeControl' => null,
// MapTypeControl options The initial display options for the Map type control.
// Of type named array
// http://code.google.com/intl/en-EN/apis/maps/documentation/javascript/reference.html#MapTypeControlOptions
'mapTypeControlOptions' => null,
// The enabled/disabled state of the pan control.
'panControl' => null,
// The display options for the pan control.
// http://code.google.com/intl/en-EN/apis/maps/documentation/javascript/reference.html#PanControlOptions
'panControlOptions' => null,
// boolean The initial enabled/disabled state of the scale control.
'scaleControl' => null,
// ScaleControl options The initial display options for the scale control.
// http://code.google.com/intl/en-EN/apis/maps/documentation/javascript/reference.html#ScaleControlOptions
// Of type named array
'scaleControlOptions' => null,
// boolean The initial enabled/disabled state of the navigation control.
'navigationControl' => null,
// NavigationControl options The initial display options for the navigation control.
// http://code.google.com/intl/en-EN/apis/maps/documentation/javascript/3.2/reference.html#NavigationControlOptions
// Of type named array
'navigationControlOptions' => null
);
/**
*
* Where the map should be appended to
* (refer to registerMap Script)
* It can be any valid javascript #id identifier
*/
private $_appendTo = null;
/**
*
* If enabled will hold a reference to a
* EGMapKeyDragZoom object
* @var EGMapKeyDragZoom
*/
private $_keyDrag = null;
/**
*
* If enabled will hold a reference to a
* EGMapClusteredManager object
*/
private $_markerClusterer = null;
/**
*
* If enabled will hold a reference to a
* EGMapLatLonControl object
*/
private $_latLonControl = null;
/**
*
* If enabled will hold a reference to a
* EGMapKMLService object
*/
private $_kmlService = null;
/**
* @todo replace following variables to
* a CMap object with CTypedList | CTypedMap Collections
* $resources = new CMap()
* $resources['markers'] = new CTypedList('EGMapMarker');
* $resources['variables'] = new CMap();
* $resources['events']
*/
protected $resources;
/**
* the interface to the Google Maps API web service
*/
protected $gMapClient = null;
/**
* Constructs a Google Map PHP object
*
* @param array $options Google Map Options
* @param array $htmlOptions Container HTML attributes
*/
public function __construct($options=array(), $htmlOptions=array())
{
$this->resources = new CMap();
$this->setOptions($options);
$this->setHtmlOptions($htmlOptions);
$this->gMapClient = new EGMapClient();
}
/**
*
* Sets the HTML attributes of the container
* @param array $options
*/
public function setHtmlOptions($options)
{
if (is_scalar($options))
return;
$this->_htmlOptions = array_merge($this->_htmlOptions, $options);
}
/**
*
* Returns the HTML attributes of the container
* @return array
*/
public function getHtmlOptions()
{
return $this->_htmlOptions;
}
/**
*
* Sets Google Map Options
* @param array $options
*
*/
public function setOptions($options)
{
$this->options = CMap::mergeArray($this->options, $options);
}
/**
*
* Returns the Google API key
* @see EGMapClient
* @return string $key
*/
public function getAPIKey()
{
return $this->getGMapClient()->getAPIKey();
}
/**
*
* Sets a Google API key for a specific domain
* @param string $domain
* @param string $key
*/
public function setAPIKey($domain, $key)
{
$this->getGMapClient()->setAPIKey($domain, $key, true);
}
/**
* Gets an instance of the interface to the Google Map web geocoding service
*
* @return EGMapClient
*/
public function getGMapClient()
{
if (null === $this->gMapClient)
$this->gMapClient = new EGMapClient();
return $this->gMapClient;
}
/**
* Sets an instance of the interface to the Google Map web geocoding service
*
* @param EGMapClient
*/
public function setGMapClient($gMapClient)
{
$this->gMapClient = $gMapClient;
}
/**
* Geocodes an address
* @param string $address
* @return GMapGeocodedAddress
* @author Fabrice Bernhard
*/
public function geocode($address)
{
$address = trim($address);
$gMapGeocodedAddress = new EGMapGeocodedAddress($address);
$accuracy = $gMapGeocodedAddress->geocode($this->getGMapClient());
if ($accuracy)
return $gMapGeocodedAddress;
return null;
}
/**
* Geocodes an address and returns additional normalized information
* @param string $address
* @return GMapGeocodedAddress
* @author Fabrice Bernhard
* @since 2010-12-22 Yii Modified Antonio Ramirez
*/
public function geocodeXml($address)
{
$address = trim($address);
$gMapGeocodedAddress = new EGMapGeocodedAddress($address);
$gMapGeocodedAddress->geocodeXml($this->getGMapClient());
return $gMapGeocodedAddress;
}
/**
* Returns the ID of the widget or generates a new one if requested.
* @param boolean $autoGenerate whether to generate an ID if it is not set previously
* @return string id of the widget.
* @author Antonio Ramirez
*/
public function getContainerId($autoGenerate=true)
{
if ($this->_containerId !== null)
return $this->_containerId;
else if ($autoGenerate)
return $this->_containerId = 'EGMapContainer' . parent::$_counter++;
}
/**
*
* Sets content layer ID
* @param integer $id
* @author Antonio Ramirez
*/
public function setContainerId($id)
{
$this->_containerId = $id;
}
/**
*
* Sets the id of the layer where the maps should be rendered
* @param string $id ie. #idcontainer
*/
public function appendMapTo($id)
{
if (substr(ltrim($id), 0, 1) != '#' && $id != 'body')
throw new CException(Yii::t('EGMap', 'The id of the layer doesnt seem a correct ID (not CSS selector)
Function: ' . __FUNCTION__));
$this->_appendTo = $id;
}
/**
* Defines one attributes of the div container
* Styles are defined differently
* @link $this->setStyles
* @param array $htmlOptions of attributes
* @author Antonio Ramirez
*/
public function setContainerOptions($htmlOptions)
{
if (is_scalar($htmlOptions))
throw new CException(Yii::t('EGMap', 'setContainerOptions: $htmlOptions must be an array'));
if (isset($htmlOptions['id']))
$this->setContainerId($htmlOptions['id']);
$this->_htmlOptions = $htmlOptions;
}
/**
*
* Returns the attribute options of the container
* @return array htmlOptions
* @author Antonio Ramirez
*/
public function getContainerOptions()
{
return $this->_htmlOptions;
}
/**
* returns the Html for the Google map container
* @param Array $options Style options of the HTML container
* @return string $container
* @since 2010-12-22 Yii modified Antonio Ramirez
*/
public function getContainer($styles=array(), $attributes=array())
{
$options = array_merge($this->_htmlOptions, array('id' => $this->getContainerId()));
if (!isset($options['style']))
$options['style'] = '';
foreach ($this->_styleOptions as $style => $value)
{
$options['style'] .= $style . ':' . $value . ';';
}
return CHtml::tag('div', $options, '', true);
}
/**
*
* @return string
* @author fabriceb
* @since 2009-08-20
* @since 2011-01-21 Modified by Antonio Ramirez
* Improved algorithm
*/
public function optionsToJs()
{
return $this->encode($this->options);
}
/**
*
* Registers the Javascript required for the Google map
* @param array $afterInit -javascript code to be rendered after init call
* @param string $language -preferred language setting for the results
* @param string $region -top level geographic domain
* @param ClientScript::CONSTANT $position -where to render the script
* @since 2010-12-22 Antonio Ramirez (inspired by sfGMap Plugin of Fabriceb)
* @since 2011-01-09 Antonio Ramirez
* removed deprecated initialization procedures //$init_events[] = $this->getIconsJs();
* @since 2011-01-22 Antonio Ramirez
* Added support for key drag and marker clusterer plugin
* @since 2011-03-10 Matt Kay
* Added polygon support (added to init_events)
* @since 2011-03-23 Antonio Ramirez
* Added circles and rectangles support
*/
public function registerMapScript($afterInit=array(), $language = null, $region = null, $position = CClientScript::POS_LOAD)
{
// TODO: include support in the future
$params = 'sensor=false';
if ($language !== null)
$params .= '&language=' . $language;
if ($region !== null)
$params .= '®ion=' . $region;
CGoogleApi::init();
CGoogleApi::register('maps', '3', array('other_params' => $params));
$this->registerPlugins();
$js = '';
$init_events = array();
if (null !== $this->_appendTo)
{
$init_events[] = "$('{$this->getContainer()}').appendTo('{$this->_appendTo}');" . PHP_EOL;
}
$init_events[] = 'var mapOptions = ' . $this->encode($this->options) . ';' . PHP_EOL;
$init_events[] = $this->getJsName() . ' = new google.maps.Map(document.getElementById("' . $this->getContainerId() . '"), mapOptions);' . PHP_EOL;
// add some more events
$init_events[] = $this->getEventsJs();
$init_events[] = $this->getMarkersJs();
$init_events[] = $this->getDirectionsJs();
$init_events[] = $this->getPluginsJs();
$init_events[] = $this->getPolygonsJs();
$init_events[] = $this->getCirclesJs();
$init_events[] = $this->getRectanglesJs();
if (is_array($afterInit))
{
foreach ($afterInit as $ainit)
$init_events[] = $ainit;
}
if ($this->getGlobalVariable($this->getJsName() . '_info_window'))
$init_events[] = $this->getJsName() . '_info_window=new google.maps.InfoWindow();';
if ($this->getGlobalVariable($this->getJsName() . '_info_box') && $this->resources->itemAt('infobox_config'))
$init_events[] = $this->getJsName (). '_info_box=new InfoBox('.
$this->resources->itemAt('infobox_config').');';
// declare the Google Map Javascript object as global
$this->addGlobalVariable($this->getJsName(), 'null');
$js = $this->getGlobalVariables();
Yii::app()->getClientScript()->registerScript('EGMap_' . $this->getJsName(), $js, CClientScript::POS_HEAD);
$js = 'function ' . $this->_containerId . '_init(){' . PHP_EOL;
foreach ($init_events as $init_event)
{
if ($init_event)
{
$js .= $init_event . PHP_EOL;
}
}
$js .= '
} google.maps.event.addDomListener(window, "load",' . PHP_EOL . $this->_containerId . '_init);' . PHP_EOL;
Yii::app()->getClientScript()->registerScript($this->_containerId . time(), $js, CClientScript::POS_END);
}
/**
* @return string javascript code from plugins
*/
public function getPluginsJs()
{
$return = '';
if (null !== $this->_markerClusterer)
$return .= $this->_markerClusterer->toJs($this->getJsName());
if (null !== $this->_keyDrag)
$return .= $this->_keyDrag->toJs($this->getJsName());
if (null !== $this->_latLonControl)
$return .= $this->_latLonControl->toJs($this->getJsName());
if (null !== $this->_kmlService)
$return .= $this->_kmlService->toJs($this->getJsName());
return $return;
}
/**
*
* Enables LatLonControl plugin
*
*/
public function enableKMLService($url, $localhost = false)
{
if (true === $localhost)
$this->registerPlugin('EGMapKMLService');
$this->_kmlService = new EGMapKMLService($url);
}
/**
*
* Disables LatLonControl plugin
*/
public function disableKMLService()
{
$this->registerPlugin('EGMapKMLService', false);
$this->_kmlService = null;
}
/**
*
* Enables LatLonControl plugin
*
*/
public function enableLatLonControl()
{
$this->registerPlugin('EGMapLatLonControl');
$this->_latLonControl = new EGMapLatLonControl();
}
/**
*
* Disables LatLonControl plugin
*/
public function disableLatLonControl()
{
$this->registerPlugin('EGMapLatLonControl', false);
$this->_latLonControl = null;
}
/**
*
* Enables Marker Clusterer Plugin
* @param EGMapMarkerClusterer $markerclusterer
* @author Antonio Ramirez
*/
public function enableMarkerClusterer(EGMapMarkerClusterer $markerclusterer)
{
$this->registerPlugin('EGMapMarkerClusterer');
$this->_markerClusterer = $markerclusterer;
}
/**
*
* Disables Marker Clusterer Plugin
* @author Antonio Ramirez
*/
public function disableMarkerClusterer()
{
$this->registerPlugin('EGMapMarkerClusterer');
$this->_markerClusterer = null;
}
/**
*
* Enables Key drag Zoom plugin
* @param EGMapKeyDragZoom $dragzoom
* @author Antonio Ramirez
*/
public function enableKeyDragZoom(EGMapKeyDragZoom $dragzoom)
{
$this->registerPlugin('EGMapKeyDragZoom');
$this->_keyDrag = $dragzoom;
}
/**
*
* Disables Key Drag Zoom Plugin
*/
public function disableKeyDragZoom()
{
$this->registerPlugin('EGMapKeyDragZoom', false);
$this->_keyDrag = null;
}
/**
*
* Lazy Programmer's function to register the javascript needed and display HTML
* map container
* @param array $afterInit -javascript code to be rendered after init call
* @param string $language -preferred language setting for the results
* @param string $region -top level geographic domain
* @param ClientScript::CONSTANT $position -where to render the script
*/
public function renderMap($afterInit=array(), $language = null, $region = null, $position = CClientScript::POS_LOAD)
{
$this->registerMapScript($afterInit, $language, $region, $position);
if (null === $this->_appendTo)
echo $this->getContainer();
}
/**
* @param EGMapMarker $marker a marker to be put on the map
* @since 2011-01-11 added support for global infowindow
* @since 2011-01-22 added support for EGMapMarkerWithLabel plugin
* @since 2011-01-23 fixed info window shared
*/
public function addMarker(EGMapMarker $marker)
{
if (null === $this->resources->itemAt('markers'))
$this->resources->add('markers', new CTypedList('EGMapMarker'));
if ($marker->getHtmlInfoWindow() && $marker->htmlInfoWindowShared() && !$this->getGlobalVariable($this->getJsName() . '_info_window'))
$this->addGlobalVariable($this->getJsName() . '_info_window', 'null');
if ($marker->getHtmlInfoBox() && $marker->htmlInfoBoxShared() && !$this->getGlobalVariable($this->getJsName() . '_info_box'))
{
$this->addGlobalVariable($this->getJsName() . '_info_box', 'null');
$this->resources->add('infobox_config',$marker->getHtmlInfoBox()->getEncodedOptions());
$this->registerPlugin('EGMapInfoBox');
}
if ($marker instanceof EGMapMarkerWithLabel && !$this->pluginRegistered('EGMapMarkerWithLabel'))
$this->registerPlugin('EGMapMarkerWithLabel');
$this->resources->itemAt('markers')->add($marker);
}
/**
* @param EGMapPolygon $polygon a polygon to be put on the map
* @since 2011-03-10 Matt Kay
* Added this function for polygons based on addMarker
* @since 2011-17-12 Added info window support
*/
public function addPolygon(EGMapPolygon $polygon)
{
if (null === $this->resources->itemAt('polygons'))
$this->resources->add('polygons', new CTypedList('EGMapPolygon'));
if ($polygon->getHtmlInfoWindow() && $polygon->htmlInfoWindowShared() && !$this->getGlobalVariable($this->getJsName() . '_info_window'))
$this->addGlobalVariable($this->getJsName() . '_info_window', 'null');
$this->resources->itemAt('polygons')->add($polygon);
}
/**
* @param EGMapCircle $circle a circle to be put on the map
* @since 2011-03-23 Antonio Ramirez Cobos
*/
public function addCircle(EGMapCircle $circle)
{
if (null === $this->resources->itemAt('circles'))
$this->resources->add('circles', new CTypedList('EGMapCircle'));
if ($circle->getHtmlInfoWindow() && $circle->htmlInfoWindowShared() && !$this->getGlobalVariable($this->getJsName() . '_info_window'))
$this->addGlobalVariable($this->getJsName() . '_info_window', 'null');
$this->resources->itemAt('circles')->add($circle);
}
/**
* @param EGMapRectangle $rectangle a rectangle to be put on the map
* @since 2011-03-23 Antonio Ramirez Cobos
*/
public function addRectangle(EGMapRectangle $rectangle)
{
if (null === $this->resources->itemAt('rectangles'))
$this->resources->add('rectangles', new CTypedList('EGMapRectangle'));
if ($rectangle->getHtmlInfoWindow() && $rectangle->htmlInfoWindowShared() && !$this->getGlobalVariable($this->getJsName() . '_info_window'))
$this->addGlobalVariable($this->getJsName() . '_info_window', 'null');
$this->resources->itemAt('rectangles')->add($rectangle);
}
/**
* @param EGMapMarker[] $markers marker to be put on the map
* @since 2011-01-22 Antonio Ramirez
* Added support for EGMapMarkerWithLabel plugin
*/
public function setMarkers(CTypedList $markers)
{
foreach ($markers as $marker)
{
if (!$marker instanceof EGMapMarker)
throw new CException(Yii::t('EGMap', 'Markers collection must be of base class EGMapMarker'));
if ($marker instanceof EGMapMarkerWithLabel && !$this->pluginRegistered('EGMapMarkerWithLabel'))
$this->registerPlugin('EGMapMarkerWithLabel');
}
$this->resources->add('markers', $markers);
}
/**
* @param EGMapEvent $event an event to be attached to the map
*/
public function addEvent(EGMapEvent $event)
{
if (null === $this->resources->itemAt('events'))
$this->resources->add('events', new CTypedList('EGMapEvent'));
$this->resources->itemAt('events')->add($event);
}
/**
* $directions getter
*
* @return array $directions
* @author Vincent Guillon
* @since 2009-11-13 17:18:29
*/
public function getDirections()
{
return $this->resources->itemAt('directions');
}
/**
* $directions setter
*
* @param CTypedList $directions
* @author Vincent Guillon
* @since 2009-11-13 17:21:18
*/
public function setDirections($directions = null)
{
if ($directions instanceof CTypedList)
$this->resources->add('directions', $directions);
}
/**
* Add direction to list ($this->directions)
*
* @param EGMapDirection $directions
* @author Antonio Ramirez
*/
public function addDirection(EGMapDirection $direction)
{
if (null === $this->resources->itemAt('directions'))
$this->resources->add('directions', new CTypedList('EGMapDirection'));
$this->resources->itemAt('directions')->add($direction);
}
/**
* Returns the javascript string which defines the markers
* @return string
* @since 2011-01-22 modified Antonio Ramirez
* Added support for marker clusterer
*/
public function getMarkersJs()
{
$return = '';
if (null !== $this->resources->itemAt('markers'))
{
foreach ($this->resources->itemAt('markers') as $marker)
{
$return .= $marker->toJs($this->getJsName());
if (null !== $this->_markerClusterer)
$this->_markerClusterer->addMarker($marker);
$return .= "\n ";
}
}
return $return;
}
/**
* Returns the javascript string which defines events linked to the map
*
* @return string
* @since 2011-01-21 handles different type of events now
*/
public function getEventsJs()
{
$return = '';
if (null !== $this->resources->itemAt('events'))
{
foreach ($this->resources->itemAt('events') as $event)
{
$return .= $event->toJs($this->getJsName());
$return .= "\n";
}
}
return $return;
}
/**
* Returns the javascript string which defines the polygons
* @return string
* @since 2011-03-10 Matt Kay
* Added function based on getMarkersJs
*/
public function getPolygonsJs()
{
$return = '';
if (null !== $this->resources->itemAt('polygons'))
{
foreach ($this->resources->itemAt('polygons') as $polygon)
{
$return .= $polygon->toJs($this->getJsName());
$return .= "\n ";
}
}
return $return;
}
/**
* Returns the javascript string which defines the circles
* @return string
* @since 2011-03-23 Antonio Ramirez
*
*/
public function getCirclesJs()
{
$return = '';
if (null !== $this->resources->itemAt('circles'))
{
foreach ($this->resources->itemAt('circles') as $circle)
{
$return .= $circle->toJs($this->getJsName());
$return .= "\n ";
}
}
return $return;
}
/**
* Returns the javascript string which defines rectangles
* @return string
* @since 2011-03-23 Antonio Ramirez
*
*/
public function getRectanglesJs()
{
$return = '';
if (null !== $this->resources->itemAt('rectangles'))
{
foreach ($this->resources->itemAt('rectangles') as $rectangle)
{
$return .= $rectangle->toJs($this->getJsName());
$return .= "\n ";
}
}
return $return;
}
/**
* Get the directions javascript code
*
* @return string $js_code
* @author Antonio Ramirez
*/
public function getDirectionsJs()
{
$js_code = '';
if (null !== $this->resources->itemAt('directions'))
{
foreach ($this->resources->itemAt('directions') as $direction)
{
$js_code .= $direction->toJs($this->getJsName());
$js_code .= "\n ";
}
}
return $js_code;
}
/**
*
* Adds global variables to be set before init function
* @param string $name
* @param mixed $value
*/
public function addGlobalVariable($name, $value='null')
{
if (null === $this->resources->itemAt('variables'))
$this->resources->add('variables', new CMap());
$this->resources->itemAt('variables')->add($name, $value);
}
/**
*
* @return global variable if set
*/
public function getGlobalVariable($name)
{
if (null === $this->resources->itemAt('variables'))
return null;
return $this->resources->itemAt('variables')->itemAt($name);
}
/**
*
* Removes a global variable
* @param string $name of the variable to remove
*/
public function removeGlobalVariable($name)
{
if (null === $this->resources->itemAt('variables'))
return;
$this->resources->itemAt('variables')->remove($name);
}
/**
*
* @return string global variables in JS format
*/
public function getGlobalVariables()
{
$return = '';
if (null !== $this->resources->itemAt('variables'))
{
foreach ($this->resources->itemAt('variables') as $name => $value)
{
$return .='
var ' . $name . ' = ' . $value . ';';
}
}
return $return;
}
/**
* Defines one style of the div container
* @param string $style_tag name of css tag
* @param string $style_value value of css tag
* @since 2010-12-22 modified for Yii Antonio Ramirez
*/
public function setContainerStyle($style_tag, $style_value)
{
if (!is_array($this->_styleOptions))
$this->_styleOptions = array();
$this->_styleOptions = array_merge($this->_styleOptions, array($style_tag => $style_value));
}
/**
*
* Gets one style of the Google Map div
* @param string $style_tag name of css tag
* @since 2010-12-22 modified Antonio Ramirez
*/
public function getContainerStyle($style_tag)
{
if (isset($this->_styleOptions[$style_tag]))
return $this->_styleOptions[$style_tag];
return false;
}
/**
* Sets the center of the map at the beginning
*
* @param float $lat
* @param float $lng
* @since 2010-12-22 modified for Yii Antonio Ramirez
*/
public function setCenter($lat=null, $lng=null)
{
$coord = new EGMapCoord($lat, $lng);
$this->options['center'] = $coord;
}
/**
*
* @return EGMapCoord
*/
public function getCenterCoord()
{
return $this->options['center'];
}
/**
*
* @return float Latitude
*/
public function getCenterLat()
{
return isset($this->options['center']) ? $this->getCenterCoord()->getLatitude() : null;
}
/**
*
* @return float Longitude
*/
public function getCenterLng()
{
return isset($this->options['center']) ? $this->getCenterCoord()->getLongitude() : null;
}
/**
* gets the width of the map in pixels according to container style
* @return integer
* @since 2010-12-22 code reduction Yii Antonio Ramirez
*/
public function getWidth()
{
if (substr($this->getContainerStyle('width'), -2, 2) != 'px')
return false;
return intval(substr($this->getContainerStyle('width'), 0, -2));
}
/**
* gets the width of the map in pixels according to container style
* @return integer
* @since 2010-12-22 code reduction Antonio Ramirez
*/
public function getHeight()
{
if (substr($this->getContainerStyle('height'), -2, 2) != 'px')
return false;
return intval(substr($this->getContainerStyle('height'), 0, -2));
}
/**
* sets the width of the map in pixels
*
* @param integer | string
*/
public function setWidth($width)
{
if (is_numeric($width))
{
$width = $width . 'px';
}
$this->setContainerStyle('width', $width);
}
/**
* sets the width of the map in pixels
*
* @param integer | string
*/
public function setHeight($height)
{
if (is_numeric($height))
{
$height = $height . 'px';
}
$this->setContainerStyle('height', $height);
}
/**
* Returns the URL of a static version of the map (when JavaScript is not active)
* Supports only markers and basic parameters: center, zoom, size.
* @param string $map_type = 'mobile'
* @param string $hl Language (fr, en...)
* @return string URL of the image
* @author Laurent Bachelier
* @since 2010-12-22 inserted http_build_query modified Antonio Ramirez
*/
public function getStaticMapUrl($maptype='mobile', $hl='es')
{
$params = array(
'maptype' => $maptype,
'zoom' => $this->getZoom(),
'key' => $this->getAPIKey(),
'center' => $this->getCenterLat() . ',' . $this->getCenterLng(),
'size' => $this->getWidth() . 'x' . $this->getHeight(),
'hl' => $hl,
'markers' => $this->getMarkersStatic()
);
$pairs = array();
$params = http_build_query($params);
return 'http://maps.google.com/staticmap?' . $params; //implode('&',$pairs);
}
/**
* Returns the static code to create markers
* @return string
* @author Laurent Bachelier
* @since 2010-12-22 Yii modified Antonio Ramirez
*/
protected function getMarkersStatic()
{
$markers_code = array();
if (null !== $this->resources->itemAt('markers'))
{
foreach ($this->resources->itemAt('markers') as $marker)
{
$markers_code[] = $marker->getMarkerStatic();
}
}
return implode('|', $markers_code);
}
/**
*
* calculates the center of the markers linked to the map
*
* @return EGMapCoord
* @since 2010-12-22 modified for Yii Antonio Ramirez
*/
public function getMarkersCenterCoord()
{
if (null === $this->resources->itemAt('markers'))
throw new CException(Yii::t('EGMap', 'At least one more marker is necessary for getMarkersCenterCoord to work'));
//todo: check for markers existence
return EGMapMarker::getCenterCoord($this->resources->itemAt('markers'));
}
/**
* sets the center of the map at the center of the markers
* @since 2010-12-22 modified for Yii Antonio Ramirez
*/
public function centerOnMarkers()
{
$center = $this->getMarkersCenterCoord();
$this->setCenter($center->getLatitude(), $center->getLongitude());
}
/**
*
* calculates the zoom which fits the markers on the map
*
* @param integer $margin a scaling factor around the smallest bound
* @return integer $zoom
* @author fabriceb
* @since 2009-05-02
* @since 2010-12-22 modified for Yii Antonio Ramirez
*/
public function getMarkersFittingZoom($margin = 0, $default_zoom = 14)
{
if (null === $this->resources->itemAt('markers'))
throw new CException(Yii::t('EGMap', 'At least one more marker is necessary for getMarkersFittingZoom to work'));
//todo check for markers existence
$bounds = EGMapBounds::getBoundsContainingMarkers($this->resources->itemAt('markers'), $margin);
return $bounds->getZoom(min($this->getWidth(), $this->getHeight()), $default_zoom);
}
/**
* sets the zoom of the map to fit the markers (uses mercator projection to guess the size in pixels of the bounds)
* WARNING : this depends on the width in pixels of the resulting map
*
* @param integer $margin a scaling factor around the smallest bound
* @author fabriceb
* @since 2009-05-02
*/
public function zoomOnMarkers($margin = 0, $default_zoom = 14)
{
$this->options['zoom'] = $this->getMarkersFittingZoom($margin, $default_zoom);
}
/**
* sets the zoom and center of the map to fit the markers (uses mercator projection to guess the size in pixels of the bounds)
*
* @param integer $margin a scaling factor around the smallest bound
* @author fabriceb
* @since 2009-05-02
*/
public function centerAndZoomOnMarkers($margin = 0, $default_zoom = 14)
{
$this->centerOnMarkers();
$this->zoomOnMarkers($margin, $default_zoom);
}
/**
*
* @return EGMapBounds
* @author fabriceb
* @since Jun 2, 2009 fabriceb
* @since 2010-12-22 modified for Yii Antonio Ramirez
*/
public function getBoundsFromCenterAndZoom()
{
return EGMapBounds::getBoundsFromCenterAndZoom($this->getCenterCoord(), $this->zoom, $this->getWidth(), $this->getHeight());
}
/**
* backwards compatibility
* @param string[] $api_keys
* @return string
* @author fabriceb
* @since Jun 17, 2009 fabriceb
* @since 2010-12-22 modified for Yii Antonio Ramirez
*/
public static function guessAPIKey($api_keys = null)
{
return EGMapClient::guessAPIKey($api_keys);
}
/**
*
* Loops through the plugins and registers its required
* assets
* @author Antonio Ramirez
*/
private function registerPlugins()
{
$assetDir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'assets' . DIRECTORY_SEPARATOR;
$assetUrl = Yii::app()->assetManager->publish($assetDir);
$cs = Yii::app()->getClientScript();
foreach ($this->plugins as $p)
{
if ($p['flag'])
{
foreach ($p['js'] as $js)
$cs->registerScriptFile($assetUrl . "/" . $js, CClientScript::POS_END);
}
}
}
/**
*
* Flags a plugin to register its assets
* @param string $plugin name
* @param boolean $register
*/
private function registerPlugin($plugin, $register=true)
{
$this->plugins[$plugin]["flag"] = $register;
}
/**
*
* Checks whether a plugin has been flagged to be
* registered or not
* @param string $plugin name
* @return boolean true|false
*/
private function pluginRegistered($plugin)
{
return $this->plugins[$plugin]["flag"];
}
/**
*
* Encodes an option array into
* appropiate Javascript object
* representation
* @param mixed $value
* @author Antonio Ramirez
*/
public static function encode($value)
{
if (is_string($value))
{
if (strpos($value, 'js:') === 0)
return substr($value, 3);
else
return $value;
}
else if ($value === null)
return 'null';
else if (is_bool($value))
return $value ? 'true' : 'false';
else if (is_integer($value))
return "$value";
else if (is_float($value))
{
if ($value === -INF)
return 'Number.NEGATIVE_INFINITY';
else if ($value === INF)
return 'Number.POSITIVE_INFINITY';
else
return rtrim(sprintf('%.16F', $value), '0'); // locale-independent representation
}
else if (is_object($value))
{
if (method_exists($value, 'toJs'))
return $value->toJs();
return self::encode(get_object_vars($value));
}
else if (is_array($value))
{
$es = array();
if (($n = count($value)) > 0 && array_keys($value) !== range(0, $n - 1))
{
foreach ($value as $k => $v)
{
if (null === $v)
continue;
$es[] = $k . ":" . self::encode($v);
}
return '{' . implode(',' . PHP_EOL, $es) . '}';
}
else
{
foreach ($value as $v)
$es[] = self::encode($v);
return '[' . implode(',', $es) . ']';
}
}
else
return '';
}
}