<?php /** * @package RSForm! Pro * @copyright (C) 2007-2019 www.rsjoomla.com * @license GPL, http://www.gnu.org/copyleft/gpl.html */ defined('_JEXEC') or die; require_once JPATH_ADMINISTRATOR.'/components/com_rsform/helpers/fields/textbox.php'; class RSFormProFieldGMaps extends RSFormProFieldTextbox { static $mapScript = false; // backend preview public function getPreviewInput() { return RSFormProHelper::getIcon('gmaps'); } // functions used for rendering in front view public function getFormInput() { $id = $this->getId(); $componentId = $this->getProperty('componentId'); $mapWidth = $this->getProperty('MAPWIDTH', '450px'); $mapHeight = $this->getProperty('MAPHEIGHT', '300px'); $geoLocation = $this->getProperty('GEOLOCATION', 'NO'); // Get the textbox input $textbox = parent::getFormInput(); $html = '<div'. ' id="rsform-map'.$this->componentId.'"'. ' class="rsformMaps"'. ' style="width: '.$this->escape($mapWidth).'; height: '.$this->escape($mapHeight).';"></div>'. '<br />'; if ($geoLocation) { $html .= '<span style="position:relative;">'. $textbox. '<ul'. ' id="rsform_geolocation'.$this->componentId.'"'. ' class="rsform-map-geolocation"'. ' style="display: none;"></ul>'. '</span>'; } else { $html .= $textbox; } // add the gmaps script $this->generateMap(); return $html; } // @desc Overridden here because we need autocomplete set to off public function getAttributes() { $attr = parent::getAttributes(); if (!isset($attr['autocomplete'])) { $attr['autocomplete'] = 'off'; } return $attr; } public function generateMap() { $id = $this->getProperty('componentId'); $zoom = (int) $this->getProperty('MAPZOOM', 2); $center = $this->getProperty('MAPCENTER', '39.5500507,-105.7820674'); $geo = $this->getProperty('GEOLOCATION', 'NO'); $address = $this->getProperty('MAPRESULT', 'ADDRESS'); $name = $this->getProperty('NAME'); $mapType = $this->getProperty('MAPTYPE', 'ROADMAP'); $requestLocation = $this->getProperty('REQUESTLOCATION'); $script = ''; if ($requestLocation) { $script .= 'RSFormPro.googleMapIds.push(' . $id . ');'; } $script .= "\n".'var rsformmap'.$id.'; var geocoder; var rsformmarker'.$id.';'."\n"; $script .= 'function rsfp_initialize_map'.$id.'() {'."\n"; $script .= "\t".'geocoder = new google.maps.Geocoder();'."\n"; $script .= "\t".'var rsformmapDiv'.$id.' = document.getElementById(\'rsform-map'.$id.'\');'."\n"; $script .= "\t".'rsformmap'.$id.' = new google.maps.Map(rsformmapDiv'.$id.', {'."\n"; $script .= "\t\t".'center: new google.maps.LatLng('.$center.'),'."\n"; $script .= "\t\t".'zoom: '.$zoom.','."\n"; $script .= "\t\t".'mapTypeId: google.maps.MapTypeId.'.$mapType.','."\n"; $script .= "\t\t".'streetViewControl: false'."\n"; $script .= "\t".'});'."\n\n"; $script .= "\t".'rsformmarker'.$id.' = new google.maps.Marker({'."\n"; $script .= "\t\t".'map: rsformmap'.$id.','."\n"; $script .= "\t\t".'position: new google.maps.LatLng('.$center.'),'."\n"; $script .= "\t\t".'draggable: true'."\n"; $script .= "\t".'});'."\n\n"; $script .= "\t".'google.maps.event.addListener(rsformmarker'.$id.', \'drag\', function() {'."\n"; $script .= "\t\t".'geocoder.geocode({\'latLng\': rsformmarker'.$id.'.getPosition()}, function(results, status) {'."\n"; $script .= "\t\t\t".'if (status == google.maps.GeocoderStatus.OK) {'."\n"; $script .= "\t\t\t\t".'if (results[0]) {'."\n"; if ($address == 'ADDRESS') $script .= "\t\t\t\t\t".'document.getElementById(\''.$name.'\').value = results[0].formatted_address;'."\n"; else $script .= "\t\t\t\t\t".'document.getElementById(\''.$name.'\').value = rsformmarker'.$id.'.getPosition().toUrlValue();'."\n"; $script .= "\t\t\t\t\t".'RSFormPro.triggerEvent(document.getElementById(\''.$name.'\'), \'input\');' . "\n"; $script .= "\t\t\t\t".'}'."\n"; $script .= "\t\t\t".'}'."\n"; $script .= "\t\t".'});'."\n"; $script .= "\t".'});'."\n"; $currentValue = $this->getValue(); if (!empty($currentValue)) { if ($address == 'ADDRESS') { $script .= "\n\t".'geocoder.geocode({\'address\': document.getElementById(\''.$name.'\').value}, function(results, status) {'."\n"; $script .= "\t\t".'if (status == google.maps.GeocoderStatus.OK) {'."\n"; $script .= "\t\t\t".'rsformmap'.$id.'.setCenter(results[0].geometry.location);'."\n"; $script .= "\t\t\t".'rsformmarker'.$id.'.setPosition(results[0].geometry.location);'."\n"; $script .= "\t\t".'}'."\n"; $script .= "\t".'});'."\n"; } else { $script .= "\t".'if (document.getElementById(\''.$name.'\') && document.getElementById(\''.$name.'\').value && document.getElementById(\''.$name.'\').value.length > 0 && document.getElementById(\''.$name.'\').value.indexOf(\',\') > -1) {'."\n"; $script .= "\t\t".'rsformCoordinates'.$id.' = document.getElementById(\''.$name.'\').value.split(\',\');'."\n"; $script .= "\t\t".'formPosition'.$id.' = new google.maps.LatLng(parseFloat(rsformCoordinates'.$id.'[0]),parseFloat(rsformCoordinates'.$id.'[1]));'."\n"; $script .= "\t\t".'rsformmap'.$id.'.setCenter(formPosition'.$id.');'."\n"; $script .= "\t\t".'rsformmarker'.$id.'.setPosition(formPosition'.$id.');'."\n"; $script .= "\t}\n"; } } if ($requestLocation) { $script .= 'RSFormPro.requestLocation();' . "\n"; } $script .= '}'."\n"; $script .= 'RSFormProUtils.addEvent(window, \'load\', rsfp_initialize_map'.$id.');'."\n\n"; if ($geo) { $isAdress = $address == 'ADDRESS'; $script .= 'RSFormProUtils.addEvent(window, "load", function(){'."\n"; $script .= "\t".'RSFormProUtils.addEvent(document.getElementById(\''.$name.'\'),\'keyup\', function() { '."\n"; $script .= "\t\t".'RSFormPro.initGeoLocation(this.value,'.$id.',\''.$name.'\',rsformmap'.$id.',rsformmarker'.$id.',geocoder, '.(int) $isAdress.');'."\n"; $script .= "\t".'});'."\n"; $script .= '});'."\n"; } // Add the Google Maps API JS if (!RSFormProFieldGMaps::$mapScript) { $this->addScript('https://maps.googleapis.com/maps/api/js?key='.urlencode(RSFormProHelper::getConfig('google.api_key')).'&callback=RSFormPro.initGoogleMaps'); // Do not load the script for every map field RSFormProFieldGMaps::$mapScript = true; } // Add the custom script after the maps.js is loaded in the dom $this->addScriptDeclaration($script); } }