Файловый менеджер - Редактировать - /home/lmsyaran/public_html/joomla5/plugins/fabrik_element/googlemap/googlemap.js
Назад
/** * Googlemap Element * * @copyright: Copyright (C) 2005-2013, fabrikar.com - All rights reserved. * @license: GNU/GPL http://www.gnu.org/copyleft/gpl.html */ /** call back method when maps api is loaded*/ function googlemapload() { if (typeOf(Fabrik.googleMapRadius) === 'null') { var script2 = document.createElement('script'), l = document.location, path = l.pathname.split('/'), index = path.indexOf('index.php'); // For URLs such as /index.php/elements/form/4/97 - we only want the segment before index.php if (index !== -1) { path = path.slice(0, index); } path.shift(); path = path.join('/'); script2.type = 'text/javascript'; //script2.src = l.protocol + '//' + l.host + '/' + path + '/components/com_fabrik/libs/googlemaps/distancewidget.js'; script2.src = Fabrik.liveSite + '/components/com_fabrik/libs/googlemaps/distancewidget.js'; document.body.appendChild(script2); Fabrik.googleMapRadius = true; } if (document.body) { window.fireEvent('google.map.loaded'); } else { console.log('no body'); } } function googleradiusloaded() { if (document.body) { window.fireEvent('google.radius.loaded'); } else { console.log('no body'); } } define(['jquery', 'fab/element', 'lib/debounce/jquery.ba-throttle-debounce', 'fab/fabrik'], function (jQuery, FbElement, Debounce, Fabrik) { window.FbGoogleMap = new Class({ Extends: FbElement, watchGeoCodeDone: false, watchDMMDone: false, options: { 'lat': 0, 'lat_dms': 0, 'lon': 0, 'lon_dms': 0, 'zoomlevel': '13', 'control': '', 'maptypecontrol': false, 'maptypeids': false, 'overviewcontrol': false, 'scalecontrol': false, 'drag': false, 'maptype': 'G_NORMAL_MAP', 'geocode': false, 'latlng': false, 'latlng_dms': false, 'staticmap': false, 'auto_center': false, 'scrollwheel': false, 'streetView': false, 'sensor': false, 'center': 0, 'reverse_geocode': false, 'use_radius': false, 'geocode_on_load': false, 'traffic': false, 'debounceDelay': 500, 'styles': [], 'directionsFrom': false, 'directionsFromLat': 0, 'directionsFromLon': 0, 'reverse_geocode_fields': {}, 'key': false, 'language': '', 'mapShown': true, 'use_overlays': false, 'overlays': [], 'overlay_urls': [], 'overlay_labels': [], 'overlay_events': [], 'lat_element': '', 'lon_element': '' }, loadScript: function () { Fabrik.loadGoogleMap(this.options.key, 'googlemapload', this.options.language); }, initialize: function (element, options) { this.mapMade = false; this.watchDMMDone = false; this.redrawn = false; this.parent(element, options); if (!this.options.mapShown) { return; } this.loadFn = function () { // experimental support for OSM rendering this.mapTypeIds = []; if (typeOf(this.options.maptypeids) !== 'array') { for (var type in google.maps.MapTypeId) { this.mapTypeIds.push(google.maps.MapTypeId[type]); } } else { for (var type in this.options.maptypeids) { this.mapTypeIds.push(this.options.maptypeids[type]); } } this.mapTypeIds.push('OSM'); switch (this.options.maptype) { case 'OSM': this.options.maptype = 'OSM'; break; case 'G_SATELLITE_MAP': this.options.maptype = google.maps.MapTypeId.SATELLITE; break; case 'G_HYBRID_MAP': this.options.maptype = google.maps.MapTypeId.HYBRID; break; case 'TERRAIN': this.options.maptype = google.maps.MapTypeId.TERRAIN; break; default: /* falls through */ case 'G_NORMAL_MAP': this.options.maptype = google.maps.MapTypeId.ROADMAP; break; } this.makeMap(); // @TODO test google object when offline typeOf(google) isnt working if (this.options.center === 1 && (this.options.rowid === '' || this.options.rowid === 0)) { if (geo_position_js.init()) { geo_position_js.getCurrentPosition(this.geoCenter.bind(this), this.geoCenterErr.bind(this), { enableHighAccuracy: true }); } else { fconsole('Geo location functionality not available'); } } }.bind(this); this.radFn = function () { this.makeRadius(); }.bind(this); window.addEvent('google.map.loaded', this.loadFn); window.addEvent('google.radius.loaded', this.radFn); this.loadScript(); }, /** * Called when form closed in ajax window */ destroy: function () { window.removeEvent('google.map.loaded', this.loadFn); window.removeEvent('google.radius.loaded', this.radFn); }, getValue: function () { if (typeOf(this.field) !== 'null') { return this.field.get('value'); } return false; }, makeMap: function () { if (this.mapMade === true) { return; } this.mapMade = true; var self = this; if (typeof (this.map) !== 'undefined' && this.map !== null) { return; } if (typeOf(this.element) === 'null') { return; } if (this.options.geocode || this.options.reverse_geocode) { this.geocoder = new google.maps.Geocoder(); } // Need to use this.options.element as if loading from ajax popup win in list view for some reason // this.element refers to the first loaded row, which should have been removed from the dom this.element = document.id(this.options.element); if (typeOf(this.element) === 'null') { return; } this.field = this.element.getElement('input.fabrikinput'); /** * watchGeoCode() needs to run after all the elements have been added to the form, but * the elements.added event may have already fired. Typically on first load, where we * waited for the maps API to load, it will have already fired. But (say) opening a popup * for a second time, API is already loaded, so no delay. So call it direct, AND from the event, * and watchGeoCode() will keep track of whether it can / has run. */ this.watchGeoCode(); this.watchDMM(); Fabrik.addEvent('fabrik.form.elements.added', function (form) { if (form === self.form) { self.watchGeoCode(); self.watchDMM(); } }); if (this.options.staticmap) { var i = this.element.getElement('img'); var w = i.getStyle('width').toInt(); var h = i.getStyle('height').toInt(); } this.center = new google.maps.LatLng(this.options.lat, this.options.lon); if (!this.options.staticmap) { var zoomControlStyle = this.options.control === 'GSmallMapControl' ? google.maps.ZoomControlStyle.SMALL : google.maps.ZoomControlStyle.LARGE; var vzoomControl = this.options.control !== 'none'; var mapOpts = { center: this.center, zoom: this.options.zoomlevel.toInt(), mapTypeId: this.options.maptype, scaleControl: this.options.scalecontrol, mapTypeControl: this.options.maptypecontrol, overviewMapControl: this.options.overviewcontrol, scrollwheel: this.options.scrollwheel, streetViewControl: this.options.streetView, zoomControl: vzoomControl, zoomControlOptions: { style: zoomControlStyle }, mapTypeControlOptions: { mapTypeIds: this.mapTypeIds } }; this.map = new google.maps.Map(document.id(this.element).getElement('.map'), mapOpts); this.map.setOptions({'styles': this.options.styles}); /** * Experimental support for OSM tile rendering, see ... * http://wiki.openstreetmap.org/wiki/Google_Maps_Example */ if (this.options.maptype === 'OSM') { this.map.mapTypes.set('OSM', new google.maps.ImageMapType({ getTileUrl: function (coord, zoom) { // See above example if you need smooth wrapping at 180th meridian return 'http://tile.openstreetmap.org/' + zoom + '/' + coord.x + '/' + coord.y + '.png'; }, tileSize: new google.maps.Size(256, 256), name: 'OpenStreetMap', maxZoom: 18 })); } if (this.options.traffic) { var trafficLayer = new google.maps.TrafficLayer(); trafficLayer.setMap(this.map); } var opts = { map: this.map, position: this.center }; opts.draggable = this.options.drag; if (this.options.latlng === true) { this.element.getElement('.lat').addEvent('blur', function (e) { this.updateFromLatLng(e); }.bind(this)); this.element.getElement('.lng').addEvent('blur', function (e) { this.updateFromLatLng(e); }.bind(this)); } if (this.options.latlng_dms === true) { this.element.getElement('.latdms').addEvent('blur', function (e) { this.updateFromDMS(e); }.bind(this)); this.element.getElement('.lngdms').addEvent('blur', function (e) { this.updateFromDMS(e); }.bind(this)); } this.marker = new google.maps.Marker(opts); if (this.options.latlng === true) { this.element.getElement('.lat').value = this.marker.getPosition().lat() + '° N'; this.element.getElement('.lng').value = this.marker.getPosition().lng() + '° E'; } if (this.options.latlng_dms === true) { this.element.getElement('.latdms').value = this.latDecToDMS(); this.element.getElement('.lngdms').value = this.lngDecToDMS(); } if (this.options.directionsFrom) { this.directionsService = new google.maps.DirectionsService(); this.directionsDisplay = new google.maps.DirectionsRenderer(); this.directionsDisplay.setMap(this.map); this.directionsFromPoint = new google.maps.LatLng( this.options.directionsFromLat, this.options.directionsFromLon ); this.calcRoute(); } google.maps.event.addListener(this.marker, 'dragend', function () { if (this.options.auto_center) { this.center = this.marker.getPosition(); this.map.setCenter(this.center); } this.field.value = this.marker.getPosition() + ':' + this.map.getZoom(); if (this.options.latlng === true) { this.element.getElement('.lat').value = this.marker.getPosition().lat() + '° N'; this.element.getElement('.lng').value = this.marker.getPosition().lng() + '° E'; } if (this.options.latlng_dms === true) { this.element.getElement('.latdms').value = this.latDecToDMS(); this.element.getElement('.lngdms').value = this.lngDecToDMS(); } if (this.options.latlng_elements === true) { this.updateLatLngElements(); } if (this.options.latlng_osref === true) { this.element.getElement('.osref').value = this.latLonToOSRef(); } if (this.options.reverse_geocode) { this.reverseGeocode(); } if (this.options.directionsFrom) { this.calcRoute(); } Fabrik.fireEvent('fabrik.map.marker.moved', this); }.bind(this)); //google.maps.event.addListener(map, 'drag', centerMarker); google.maps.event.addListener(this.map, 'zoom_changed', function (oldLevel, newLevel) { this.field.value = this.marker.getPosition() + ':' + this.map.getZoom(); }.bind(this)); google.maps.event.addListener(this.map, 'center_changed', function () { this.center = this.map.getCenter(); if (this.options.auto_center && this.options.editable) { this.marker.setPosition(this.map.getCenter()); this.field.value = this.marker.getPosition() + ':' + this.map.getZoom(); if (this.options.latlng === true) { this.element.getElement('.lat').value = this.marker.getPosition().lat() + '° N'; this.element.getElement('.lng').value = this.marker.getPosition().lng() + '° E'; } if (this.options.latlng_dms === true) { this.element.getElement('.latdms').value = this.latDecToDMS(); this.element.getElement('.lngdms').value = this.lngDecToDMS(); } if (this.options.latlng_elements === true) { this.updateLatLngElements(); } } }.bind(this)); this.addOverlays(); } this.watchTab(); Fabrik.addEvent('fabrik.form.page.change.end', function (form) { this.redraw(); }.bind(this)); Fabrik.fireEvent('fabrik.map.make.end', this); }, calcRoute: function () { var request = { origin: this.directionsFromPoint, destination: this.marker.getPosition(), travelMode: google.maps.TravelMode.DRIVING }; this.directionsService.route(request, function (result, status) { if (status == google.maps.DirectionsStatus.OK) { this.directionsDisplay.setDirections(result); } }.bind(this)); }, radiusUpdatePosition: function () { }, radiusUpdateDistance: function () { if (this.options.radius_write_element) { var distance = this.distanceWidget.get('distance'); if (this.options.radius_unit === 'm') { distance = distance / 1.609344; } $(this.options.radius_write_element).value = parseFloat(distance).toFixed(2); //$(this.options.radius_write_element).fireEvent('change', new Event.Mock($(this.options.radius_write_element), 'change')); } }, radiusActiveChanged: function () { // fired by the radius widget when move / drag operation is complete // so let's fire the write element's change event. Don't do this in updateDistance, // as it'll keep firing as they drag. We don't want to fire 'change' until the changing is finished if (this.options.radius_write_element) { if (!this.distanceWidget.get('active')) { document.id(this.options.radius_write_element).fireEvent('change', new Event.Mock(document.id(this.options.radius_write_element), 'change')); } } }, radiusSetDistance: function () { if (this.options.radius_read_element) { var distance = document.id(this.options.radius_read_element).value; if (this.options.radius_unit === 'm') { distance = distance * 1.609344; } var pos = this.distanceWidget.get('sizer_position'); this.distanceWidget.set('distance', distance); var center = this.distanceWidget.get('center'); this.distanceWidget.set('center', center); } }, makeRadius: function () { if (this.options.use_radius) { if (this.options.radius_read_element && this.options.repeatCounter > 0) { this.options.radius_read_element = this.options.radius_read_element.replace(/_\d+$/, '_' + this.options.repeatCounter); } if (this.options.radius_write_element && this.options.repeatCounter > 0) { this.options.radius_write_element = this.options.radius_write_element.replace(/_\d+$/, '_' + this.options.repeatCounter); } var distance = this.options.radius_default; if (!this.options.editable) { distance = this.options.radius_ro_value; } else { if (this.options.radius_read_element) { distance = document.id(this.options.radius_read_element).value; } else if (this.options.radius_write_element) { distance = document.id(this.options.radius_write_element).value; } } if (this.options.radius_unit === 'm') { distance = distance * 1.609344; } this.distanceWidget = new DistanceWidget({ map: this.map, marker: this.marker, distance: distance, // Starting distance in km. maxDistance: 2500, // Twitter has a max distance of 2500km. color: '#000000', activeColor: '#5599bb', sizerIcon: new google.maps.MarkerImage(this.options.radius_resize_off_icon), activeSizerIcon: new google.maps.MarkerImage(this.options.radius_resize_icon) }); google.maps.event.addListener(this.distanceWidget, 'distance_changed', this.radiusUpdateDistance.bind(this)); google.maps.event.addListener(this.distanceWidget, 'position_changed', this.radiusUpdatePosition.bind(this)); google.maps.event.addListener(this.distanceWidget, 'active_changed', this.radiusActiveChanged.bind(this)); if (this.options.radius_fitmap) { this.map.setZoom(20); this.map.fitBounds(this.distanceWidget.get('bounds')); } this.radiusUpdateDistance(); this.radiusUpdatePosition(); this.radiusAddActions(); } }, radiusAddActions: function () { if (this.options.radius_read_element) { document.id(this.options.radius_read_element).addEvent('change', this.radiusSetDistance.bind(this)); } }, updateLatLngElements: function () { var latEl = this.form.formElements.get(this.options.lat_element); var lonEl = this.form.formElements.get(this.options.lon_element); if (latEl && lonEl) { if (this.options.lat_element.test(/_ddm$/) && this.options.lon_element.test(/_ddm$/)) { var latDDM = this.latDecToDDM(); latEl.update(latDDM); var lonDDM = this.lonDecToDDM(); lonEl.update(lonDDM); var latElDec = this.form.formElements.get(this.options.lat_element.replace(/_ddm$/, '')); var lonElDec = this.form.formElements.get(this.options.lon_element.replace(/_ddm$/, '')); if (latElDec && lonElDec) { latElDec.update(this.marker.getPosition().lat()); lonElDec.update(this.marker.getPosition().lng()); } } else { latEl.update(this.marker.getPosition().lat()); lonEl.update(this.marker.getPosition().lng()); var latElDDM = this.form.formElements.get(this.options.lat_element + '_ddm'); var lonElDDM = this.form.formElements.get(this.options.lon_element + '_ddm'); if (latElDDM && lonElDDM) { var latDDM = this.latDecToDDM(); latElDDM.update(latDDM); var lonDDM = this.lonDecToDDM(); lonElDDM.update(lonDDM); } } } }, updateFromLatLngElements: function () { var latEl = this.form.formElements.get(this.options.lat_element); var lonEl = this.form.formElements.get(this.options.lon_element); if (latEl && lonEl) { var lat = latEl.getValue(); var lon = lonEl.getValue(); if (lat !== '' && lon !== '') { lat = lat.replace('° N', '').replace(',', '.').toFloat(); lon = lon.replace('° E', '').replace(',', '.').toFloat(); var pnt = new google.maps.LatLng(lat, lon); this.marker.setPosition(pnt); this.doSetCenter(pnt, this.map.getZoom(), true); var latElDDM = this.form.formElements.get(this.options.lat_element + '_ddm'); var lonElDDM = this.form.formElements.get(this.options.lon_element + '_ddm'); if (latElDDM && lonElDDM) { var latDDM = this.latDecToDDM(); latElDDM.update(latDDM); var lonDDM = this.lonDecToDDM(); lonElDDM.update(lonDDM); } } } }, strDDMtoDec: function (dec) { var ddm_d_m = dec.split(' '); if (ddm_d_m.length === 2) { var ddm_d = ddm_d_m[0]; var ddm_m = ddm_d_m[1]; if (ddm_d.toInt() < 0) { return ((Math.abs(ddm_d.toInt()) + (ddm_m / 60)) * -1).toString(); } else { return (ddm_d.toInt() + (ddm_m / 60)).toString(); } } }, updateFromLatLngDDMElements: function () { var latElDDM = this.form.formElements.get(this.options.lat_element); var lonElDDM = this.form.formElements.get(this.options.lon_element); if (latElDDM && lonElDDM) { var lat = this.strDDMtoDec(latElDDM.getValue()); var lon = this.strDDMtoDec(lonElDDM.getValue()); if (lat !== '' && lon !== '') { var pnt = new google.maps.LatLng(lat.toFloat(), lon.toFloat()); this.marker.setPosition(pnt); this.doSetCenter(pnt, this.map.getZoom(), true); if (this.options.lat_element.test(/_ddm$/) && this.options.lon_element.test(/_ddm$/)) { var latEl = this.form.formElements.get(this.options.lat_element.replace(/_ddm$/, '')); var lonEl = this.form.formElements.get(this.options.lon_element.replace(/_ddm$/, '')); if (latEl && lonEl) { latEl.update(lat); lonEl.update(lon); } } } } }, updateFromLatLng: function () { var lat = this.element.getElement('.lat').get('value').replace('° N', ''); lat = lat.replace(',', '.').toFloat(); var lng = this.element.getElement('.lng').get('value').replace('° E', ''); lng = lng.replace(',', '.').toFloat(); var pnt = new google.maps.LatLng(lat, lng); this.marker.setPosition(pnt); this.doSetCenter(pnt, this.map.getZoom(), true); }, updateFromDMS: function () { var dms = this.element.getElement('.latdms'); var latdms = dms.get('value').replace('S', '-'); latdms = latdms.replace('N', ''); dms = this.element.getElement('.lngdms'); var lngdms = dms.get('value').replace('W', '-'); lngdms = lngdms.replace('E', ''); var latdms_d_ms = latdms.split('°'); var latdms_topnt = latdms_d_ms[0]; var latdms_m_s = latdms_d_ms[1].split('\''); var latdms_m = latdms_m_s[0].toFloat() * 60; var latdms_ms = (latdms_m + latdms_m_s[1].replace('"', '').toFloat()) / 3600; latdms_topnt = Math.abs(latdms_topnt.toFloat()) + latdms_ms.toFloat(); if (latdms_d_ms[0].toString().indexOf('-') !== -1) { latdms_topnt = -latdms_topnt; } var lngdms_d_ms = lngdms.toString().split('°'); var lngdms_topnt = lngdms_d_ms[0]; var lngdms_m_s = lngdms_d_ms[1].split('\''); var lngdms_m = Math.abs(lngdms_m_s[0].toFloat()) * 60; var lngdms_ms = (lngdms_m + Math.abs(lngdms_m_s[1].replace('"', '').toFloat())) / 3600; lngdms_topnt = Math.abs(lngdms_topnt.toFloat()) + lngdms_ms.toFloat(); if (lngdms_d_ms[0].toString().indexOf('-') !== -1) { lngdms_topnt = -lngdms_topnt; } var pnt = new google.maps.LatLng(latdms_topnt.toFloat(), lngdms_topnt.toFloat()); this.marker.setPosition(pnt); this.doSetCenter(pnt, this.map.getZoom(), true); }, latDecToDDM: function () { var latdec = this.marker.getPosition().lat(); var dmmlat_d = parseInt(latdec); var dmmlat_m_float = (60 * (Math.abs(latdec) - Math.abs(dmmlat_d).toFloat())).toFixed(6).toFloat(); return dmmlat_d.toString() + ' ' + dmmlat_m_float.toString(); }, lonDecToDDM: function () { var londec = this.marker.getPosition().lng(); var dmmlon_d = parseInt(londec); var dmmlon_m_float = (60 * (Math.abs(londec) - Math.abs(dmmlon_d).toFloat())).toFixed(6).toFloat(); return dmmlon_d.toString() + ' ' + dmmlon_m_float.toString(); }, latDecToDMS: function () { var latdec = this.marker.getPosition().lat(); var dmslat_d = parseInt(Math.abs(latdec), 10); var dmslat_m_float = 60 * (Math.abs(latdec).toFloat() - dmslat_d.toFloat()); var dmslat_m = parseInt(dmslat_m_float, 10); var dmslat_s_float = 60 * (dmslat_m_float.toFloat() - dmslat_m.toFloat()); // var dmslat_s = Math.round(dmslat_s_float.toFloat()*100)/100; var dmslat_s = dmslat_s_float.toFloat(); if (dmslat_s === 60) { dmslat_m = dmslat_m.toFloat() + 1; dmslat_s = 0; } if (dmslat_m === 60) { dmslat_d = dmslat_d.toFloat() + 1; dmslat_m = 0; } var dmslat_dir = 'N'; if (latdec.toString().indexOf('-') !== -1) { dmslat_dir = 'S'; } else { dmslat_dir = 'N'; } return dmslat_dir + dmslat_d + '°' + dmslat_m + '\'' + dmslat_s + '"'; }, lngDecToDMS: function () { var lngdec = this.marker.getPosition().lng(); var dmslng_d = parseInt(Math.abs(lngdec), 10); var dmslng_m_float = 60 * (Math.abs(lngdec).toFloat() - dmslng_d.toFloat()); var dmslng_m = parseInt(dmslng_m_float, 10); var dmslng_s_float = 60 * (dmslng_m_float.toFloat() - dmslng_m.toFloat()); // var dmslng_s = Math.round(dmslng_s_float.toFloat()*100)/100; var dmslng_s = dmslng_s_float.toFloat(); if (dmslng_s === 60) { dmslng_m.value = dmslng_m.toFloat() + 1; dmslng_s.value = 0; } if (dmslng_m === 60) { dmslng_d.value = dmslng_d.toFloat() + 1; dmslng_m.value = 0; } var dmslng_dir = ''; if (lngdec.toString().indexOf('-') !== -1) { dmslng_dir = 'W'; } else { dmslng_dir = 'E'; } return dmslng_dir + dmslng_d + '°' + dmslng_m + '\'' + dmslng_s + '"'; }, latLonToOSRef: function () { var ll2 = new LatLng(this.marker.getPosition().lng(), this.marker.getPosition().lng()); var OSRef = ll2.toOSRef(); return OSRef.toSixFigureString(); }, geoCode: function (e) { var address = ''; if (this.options.geocode === '2') { this.options.geocode_fields.each(function (field) { var f = this.form.formElements.get(field); if (f) { address += f.get('value') + ','; } }.bind(this)); address = address.slice(0, -1); } else { address = this.element.getElement('.geocode_input').value; } // Strip HTML var d = new Element('div').set('html', address); address = d.get('text'); this.geocoder.geocode({'address': address}, function (results, status) { if (status !== google.maps.GeocoderStatus.OK || results.length === 0) { fconsole(address + ' not found!'); } else { this.options.lat = results[0].geometry.location.lat(); this.options.lon = results[0].geometry.location.lng(); this.marker.setPosition(results[0].geometry.location); this.doSetCenter(results[0].geometry.location, this.map.getZoom(), false); if (this.options.reverse_geocode) { if (this.options.reverse_geocode_fields.formatted_address) { this.form.formElements.get(this.options.reverse_geocode_fields.formatted_address).update( results[0].formatted_address ); } } } }.bind(this)); }, watchDMM: function () { if (this.watchDMMDone) { return; } if (!this.options.editable) { return; } if (typeof this.form === 'undefined') { return; } if (this.options.latlng_elements === true) { var latEl = this.form.formElements.get(this.options.lat_element); var lonEl = this.form.formElements.get(this.options.lon_element); if (latEl && lonEl) { if (this.options.lat_element.test(/_ddm$/) && this.options.lon_element.test(/_ddm$/)) { latEl.addNewEventAux(latEl.getChangeEvent(), function (e) { this.updateFromLatLngDDMElements(e); }.bind(this)); lonEl.addNewEventAux(lonEl.getChangeEvent(), function (e) { this.updateFromLatLngDDMElements(e); }.bind(this)); } else { latEl.addNewEventAux(latEl.getChangeEvent(), function (e) { this.updateFromLatLngElements(e); }.bind(this)); lonEl.addNewEventAux(lonEl.getChangeEvent(), function (e) { this.updateFromLatLngElements(e); }.bind(this)); } } } this.watchDMMDone = true; }, watchGeoCode: function () { if (!this.options.geocode || !this.options.editable) { return; } if (typeof this.form === 'undefined') { return; } if (this.watchGeoCodeDone) { return; } if (this.options.geocode === '2') { if (this.options.geocode_event !== 'button') { this.options.geocode_fields.each(function (field) { var f = document.id(field); if (typeOf(f) !== 'null') { var that = this; var el = this.form.formElements.get(field); // if it's a field element with geocomplete, don't do keyup, wait for element to fire change if (!el.options.geocomplete) { jQuery(f).on('keyup', Debounce(this.options.debounceDelay, function (e) { that.geoCode(e); })); // Select lists, radios whatnots f.addEvent('change', function (e) { this.geoCode(); }.bind(this)); } else { Fabrik.addEvent('fabrik.element.field.geocode', function (el, results) { //fconsole('fired: ' + el.element.id); this.geoCode(); }.bind(this)); } } }.bind(this)); if (this.options.reverse_geocode_fields.formatted_address) { var el = this.form.formElements.get(this.options.reverse_geocode_fields.formatted_address); if (el.options.geocomplete) { Fabrik.addEvent('fabrik.element.field.geocode', function (el, result) { if (el.element.id === this.options.reverse_geocode_fields.formatted_address) { var pnt = new google.maps.LatLng( result.geometry.location.lat(), result.geometry.location.lng() ); this.marker.setPosition(pnt); this.doSetCenter(pnt, this.map.getZoom(), false); this.fillReverseGeocode(result); } }.bind(this)); } } } else { if (this.options.geocode_event === 'button') { this.element.getElement('.geocode').addEvent('click', function (e) { this.geoCode(e); }.bind(this)); } } } if (this.options.geocode === '1' && document.id(this.element).getElement('.geocode_input')) { if (this.options.geocode_event === 'button') { this.element.getElement('.geocode').addEvent('click', function (e) { this.geoCode(e); }.bind(this)); // Stop enter in geocode field submitting the form. this.element.getElement('.geocode_input').addEvent('keypress', function (e) { if (e.key === 'enter') { e.stop(); } }.bind(this)); } else { /* this.element.getElement('.geocode_input').addEvent('keyup', function (e) { e.stop(); this.geoCode(e); }.bind(this)); */ var that = this; jQuery(this.element.getElement('.geocode_input')).on('keyup', Debounce(this.options.debounceDelay, function (e) { that.geoCode(e); })); } } this.watchGeoCodeDone = true; }, unclonableProperties: function () { return ['form', 'marker', 'map', 'maptype']; }, cloned: function (c) { var f = []; this.options.geocode_fields.each(function (field) { var bits = field.split('_'); var i = bits.getLast(); if (typeOf(i.toInt()) === 'null') { return bits.join('_'); } bits.splice(bits.length - 1, 1, c); f.push(bits.join('_')); }); this.options.geocode_fields = f; this.mapMade = false; this.map = null; this.makeMap(); this.parent(c); }, update: function (v) { v = v.split(':'); if (v.length < 2) { v[1] = this.options.zoomlevel; } if (!this.map) { return; } var zoom = v[1].toInt(); this.map.setZoom(zoom); v[0] = v[0].replace('(', ''); v[0] = v[0].replace(')', ''); var pnts = v[0].split(','); if (pnts.length < 2) { pnts[0] = this.options.lat; pnts[1] = this.options.lon; } // $$$ hugh - updateFromLatLng blows up if not displayinbg lat lng // also, not sure why we would do this, as all we want to do is set map back // to default // location, not read location from lat lng fields? // this.updateFromLatLng(pnts[0], pnts[1]); // So instead, lets just set marker to default and recenter var pnt = new google.maps.LatLng(pnts[0], pnts[1]); this.marker.setPosition(pnt); this.doSetCenter(pnt, this.map.getZoom(), true); }, geoCenter: function (p) { var pnt = new google.maps.LatLng(p.coords.latitude, p.coords.longitude); this.marker.setPosition(pnt); this.doSetCenter(pnt, this.map.getZoom(), true); }, geoCenterErr: function (p) { fconsole('geo location error=' + p.message); }, /** * Redraw the map when inside a tab, and the tab is activated. Triggered from element.watchTab() */ redraw: function () { google.maps.event.trigger(this.map, 'resize'); if (!this.redrawn) { this.map.setCenter(this.center); this.map.setZoom(this.map.getZoom()); this.redrawn = true; } }, fillReverseGeocode: function (result) { if (this.options.reverse_geocode_fields.formatted_address) { this.form.formElements.get(this.options.reverse_geocode_fields.formatted_address).update(result.formatted_address); } var streetAddress = ''; var streetNumber = ''; var streetRoute = ''; result.address_components.each(function (component) { component.types.each(function (type) { if (type === 'street_number') { if (this.options.reverse_geocode_fields.street_number || this.options.reverse_geocode_fields.route) { streetNumber = component.long_name; } } else if (type === 'route') { if (this.options.reverse_geocode_fields.route) { streetRoute = component.long_name; } } else if (type === 'street_address') { if (this.options.reverse_geocode_fields.route) { streetAddress = component.long_name; } } else if (type === 'neighborhood') { if (this.options.reverse_geocode_fields.neighborhood) { this.form.formElements.get(this.options.reverse_geocode_fields.neighborhood).update(component.long_name); } } else if (type === 'locality') { if (this.options.reverse_geocode_fields.locality) { this.form.formElements.get(this.options.reverse_geocode_fields.locality).updateByLabel(component.long_name); } } else if (type === 'administrative_area_level_1') { if (this.options.reverse_geocode_fields.administrative_area_level_1) { this.form.formElements.get(this.options.reverse_geocode_fields.administrative_area_level_1).updateByLabel(component.long_name); } } else if (type === 'postal_code') { if (this.options.reverse_geocode_fields.postal_code) { this.form.formElements.get(this.options.reverse_geocode_fields.postal_code).updateByLabel(component.long_name); } } else if (type === 'country') { if (this.options.reverse_geocode_fields.country) { this.form.formElements.get(this.options.reverse_geocode_fields.country).updateByLabel(component.long_name); } } }.bind(this)); }.bind(this)); if (this.options.reverse_geocode_fields.street_number) { this.form.formElements.get(this.options.reverse_geocode_fields.street_number).update(streetNumber); this.form.formElements.get(this.options.reverse_geocode_fields.route).update(streetRoute); } else if (this.options.reverse_geocode_fields.route) { /** * Create the street address. I'm really not sure what the difference between 'route' * and 'street_address' is in Google's component types, so for now just use 'street_address' * as the preference, use 'route' if no 'street_address', and prepend 'street_number' */ if (streetRoute !== '') { if (streetAddress === '') { streetAddress = streetRoute; } } if (streetNumber !== '') { streetAddress = streetNumber + ' ' + streetAddress; } this.form.formElements.get(this.options.reverse_geocode_fields.route).update(streetAddress); } }, reverseGeocode: function () { this.geocoder.geocode({'latLng': this.marker.getPosition()}, function (results, status) { if (status === google.maps.GeocoderStatus.OK) { if (results[0]) { this.fillReverseGeocode(results[0]); } else { window.alert('No results found'); } } else { window.alert('Geocoder failed due to: ' + status); } }.bind(this)); }, doSetCenter: function (pnt, zoom, doReverseGeocode) { this.map.setCenter(pnt, zoom); this.field.value = this.marker.getPosition() + ':' + this.map.getZoom(); if (this.options.latlng === true) { this.element.getElement('.lat').value = pnt.lat() + '° N'; this.element.getElement('.lng').value = pnt.lng() + '° E'; } if (this.options.latlng_dms === true) { this.element.getElement('.latdms').value = this.latDecToDMS(); this.element.getElement('.lngdms').value = this.lngDecToDMS(); } if (this.options.latlng_elements === true) { this.updateLatLngElements(); } if (doReverseGeocode && this.options.reverse_geocode) { this.reverseGeocode(); } }, attachedToForm: function () { if (this.options.geocode && this.options.geocode_on_load) { this.geoCode(); } this.parent(); }, toggleOverlayAux: function (el) { }, toggleOverlay: function (e) { if (e.target.id.test(/overlay_select_(\d+)/)) { var self = this; jQuery(e.target).closest('div').find('.fabrik_googlemap_overlay_select').each( function (k, el) { var olk = el.id.match(/overlay_select_(\d+)/)[1].toInt(); if (el.checked) { self.options.overlays[olk].setMap(self.map); } else { self.options.overlays[olk].setMap(null); } } ); } }, addOverlays: function () { if (this.options.use_overlays) { if (this.options.use_overlays_select === 'radio' && this.options.use_overlays_checked === '') { this.options.use_overlays_checked = '0'; } this.options.overlay_urls.each(function (overlay_url, k) { var pv = this.options.overlay_preserveviewports[k] === '1'; var so = this.options.overlay_suppressinfowindows[k] === '1'; this.options.overlays[k] = new google.maps.KmlLayer({ url: overlay_url, preserveViewport: pv, suppressInfoWindows: so }); if ((this.options.use_overlays_select === 'checkbox' && this.options.use_overlays_checked === '') || (this.options.use_overlays_checked.toInt() === k)) { this.options.overlays[k].setMap(this.map); } this.options.overlay_events[k] = function (e) { this.toggleOverlay(e); }.bind(this); if (typeOf(document.id(this.options.element + '_overlay_select_' + k)) !== 'null') { document.id(this.options.element + '_overlay_select_' + k).addEvent('click', this.options.overlay_events[k]); } }.bind(this)); Fabrik.fireEvent('fabrik.viz.googlemap.overlays.added', [this]); } } }); return window.FbGoogleMap; });
| ver. 1.4 |
Github
|
.
| PHP 8.1.33 | Генерация страницы: 0 |
proxy
|
phpinfo
|
Настройка