var gMap = { map : null, geocoder : null, activeTag : false, activeTagWord : null, onDocumentLoad : function () { if (GBrowserIsCompatible()) { // map create and customize var copyOSM = new GCopyrightCollection("OpenStreetMap"); copyOSM.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90,-180), new GLatLng(90,180)), 0, " ")); var tilesMapnik = new GTileLayer(copyOSM, 1, 17, {tileUrlTemplate: 'http://tile.openstreetmap.org/{Z}/{X}/{Y}.png'}); var tilesOsmarender = new GTileLayer(copyOSM, 1, 17, {tileUrlTemplate: 'http://tah.openstreetmap.org/Tiles/tile.php/{Z}/{X}/{Y}.png'}); var mapMapnik = new GMapType([tilesMapnik], G_NORMAL_MAP.getProjection(), "Карта"); var mapOsmarender = new GMapType([tilesOsmarender], G_NORMAL_MAP.getProjection(), "Osmarend"); gMap.map = new GMap2(document.getElementById('map'), { mapTypes: [mapMapnik,G_HYBRID_MAP] }); // map create and customize // gMap.map = new GMap2(document.getElementById('map')); if (window.map_default_lat && window.map_default_lng) { gMap.map.setCenter(new GLatLng(window.map_default_lat, window.map_default_lng), window.map_default_zoom); } else { gMap.map.setCenter(new GLatLng(55.755, 37.623), 13); } gMap.map.addControl(new GOverviewMapControl()); gMap.map.addControl(new GLargeMapControl()); gMap.map.addControl(new GMapTypeControl()); gMap.map.setMapType(mapMapnik); gMap.map.enableDoubleClickZoom(); gMap.map.enableContinuousZoom(); gMap.markersHandler.markersTypes.include(String(1)); gMap.markersHandler.markersTypes.include(String(2)); gMap.markersHandler.markersTypes.include(String(3)); GEvent.addListener(gMap.map, 'load', function() { gMap.markersHandler.server.loadMarkers(); }); GEvent.addListener(gMap.map, 'click', function(overlay, point) { if (overlay) return; if (gMap.markersHandler.markerAddState) { if (gMap.markersHandler.currentMarker != null) { gMap.markersHandler.currentMarker.setLatLng(point); $('maps_add_marker_form').elements['marker_lat'].value = gMap.markersHandler.currentMarker.getLatLng().lat(); $('maps_add_marker_form').elements['marker_lng'].value = gMap.markersHandler.currentMarker.getLatLng().lng(); $('maps_add_marker_form_lat').innerHTML = gMap.markersHandler.currentMarker.getLatLng().lat() + '°'; $('maps_add_marker_form_lng').innerHTML = gMap.markersHandler.currentMarker.getLatLng().lng() + '°'; } else { var newPoint = point; var newIcon = gMap.iconsHandler.prepareIcon(); var newMarker = new GMarker(newPoint,{title:'Новый объект', draggable:true, icon: newIcon}); gMap.markersHandler.currentMarker = newMarker; GEvent.addListener(newMarker, 'dragend', function() { $('maps_add_marker_form').elements['marker_lat'].value = gMap.markersHandler.currentMarker.getLatLng().lat(); $('maps_add_marker_form').elements['marker_lng'].value = gMap.markersHandler.currentMarker.getLatLng().lng(); $('maps_add_marker_form_lat').innerHTML = gMap.markersHandler.currentMarker.getLatLng().lat() + '°'; $('maps_add_marker_form_lng').innerHTML = gMap.markersHandler.currentMarker.getLatLng().lng() + '°'; }); gMap.map.addOverlay(gMap.markersHandler.currentMarker); // $('maps_add_marker').removeClass('hidden'); $('maps_add_marker_form').elements['marker_lat'].value = point.lat(); $('maps_add_marker_form').elements['marker_lng'].value = point.lng(); $('maps_add_marker_form_lat').innerHTML = point.lat() + '°'; $('maps_add_marker_form_lng').innerHTML = point.lng() + '°'; } } }); GEvent.addListener(gMap.map, 'moveend', function() { gMap.markersHandler.server.loadMarkers(); }); gMap.geocoder = new GClientGeocoder(); /* $('maps_markers_view_switcher_form_checkboxes_button').addEvent('click', function (event) { $('maps_markers_view_switcher_form_checkboxes_button').addClass('selected'); $('maps_markers_view_switcher_form_tags_button').removeClass('selected'); $('maps_markers_view_switcher_form_checkboxes_holder').removeClass('hidden'); $('maps_markers_view_switcher_form_tags_holder').addClass('hidden'); gMap.activeTag = true; }); $('maps_markers_view_switcher_form_tags_button').addEvent('click', function (event) { $('maps_markers_view_switcher_form_checkboxes_button').removeClass('selected'); $('maps_markers_view_switcher_form_tags_button').addClass('selected'); $('maps_markers_view_switcher_form_checkboxes_holder').addClass('hidden'); $('maps_markers_view_switcher_form_tags_holder').removeClass('hidden'); gMap.activeTag = false; }); $$('#maps_markers_view_switcher_form_tags_holder a').each(function (tagLink) { gMap.markersHandler.tags[tagLink.innerHTML] = []; tagLink.addEvent('click', function (event) { if (!window.ie) event.preventDefault(); else event.returnValue = false; tagLink.removeClass('active'); gMap.activeTagWord = tagLink; }); });*/ } }, onDocumentUnload : function () { GUnload(); }, markersHandler : { markerAddState : false, markers : [], markersObjects : {1:[],2:[],3:[],4:[],5:[],6:[],7:[],8:[],9:[],10:[],11:[]}, markersTypes : [], tags : [], currentMarker : null, zoomLimit : 11, enableMarkerAddState : function () { gMap.markersHandler.markerAddState = true; }, disableMarkerAddState : function () { gMap.markersHandler.markerAddState = false; if (gMap.markersHandler.currentMarker) { gMap.markersHandler.currentMarker.hide(); } gMap.markersHandler.currentMarker = null; $('maps_add_marker_form').reset(); $('maps_add_marker_form_lat').innerHTML = ''; $('maps_add_marker_form_lng').innerHTML = ''; }, createMarker : function (point) { // Set up our GMarkerOptions object var markerOptions = { icon : gMap.iconsHandler.prepareIcon() }; var marker = new GMarker(point, markerOptions); return marker; }, onClickMarker : function () { }, server : { // url : '/ajax/map/', url : '/content/Xml', saveMarker : function () { if (($('maps_add_marker_form').elements['marker_lat'].value != '') && ($('maps_add_marker_form').elements['marker_lng'].value != '')) { var data = $('maps_add_marker_form').toQueryString() + '&act=add_marker'; ajaxLoadPost(gMap.markersHandler.server.url, data, gMap.markersHandler.server.saveMarkerOnload, window); } else { futu_alert(FAT.gmap_header, FAT.gmap_marker_add_no_marker, true, 'error'); } }, saveMarkerOnload : function (ajaxObj) { if(ajaxObj && ajaxObj.responseXML){ var xml = ajaxObj.responseXML; var errors = xml.getElementsByTagName('error'); var messages = xml.getElementsByTagName('message'); if(errors && errors.length && errors[0].firstChild && errors[0].firstChild.nodeType == 3) { futu_alert(FAT.gmap_header, errors[0].firstChild.data, true, 'error'); } else if (messages && messages.length && messages[0].firstChild && messages[0].firstChild.nodeType == 3 && messages[0].firstChild.data == 'ok') { var marker_type = xml.getElementsByTagName('marker_type')[0].firstChild.data; var marker_id = xml.getElementsByTagName('object_id')[0].firstChild.data; var marker_title = xml.getElementsByTagName('marker_title')[0].firstChild.data; futu_alert(FAT.gmap_header, FAT.gmap_marker_add_success, false, 'message'); var newPoint = new GLatLng(gMap.markersHandler.currentMarker.getLatLng().lat(),gMap.markersHandler.currentMarker.getLatLng().lng()); var newIcon = gMap.iconsHandler.prepareIcon(marker_type); var newMarker = new GMarker(newPoint,{title:marker_title, draggable:false, icon: newIcon}); gMap.map.addOverlay(newMarker); GEvent.addListener(newMarker, 'click', function() { gMap.markersHandler.server.loadMarkerInfo(newMarker, marker_id); }); gMap.markersHandler.markersObjects[marker_type].push(newMarker); gMap.markersHandler.markers.push(marker_id); gMap.markersHandler.currentMarker.hide(); gMap.markersHandler.currentMarker = null; gMap.markersHandler.disableMarkerAddState(); } } }, loadMarkers : function () { var bounds = gMap.map.getBounds(); var zoom = gMap.map.getZoom(); if (zoom > gMap.markersHandler.zoomLimit) { var sw_bound_lat = bounds.getSouthWest().lat(); var sw_bound_lng = bounds.getSouthWest().lng(); var ne_bound_lat = bounds.getNorthEast().lat(); var ne_bound_lng = bounds.getNorthEast().lng(); if (gMap.activeTag) { var data = 'act=list&sw_lat='+sw_bound_lat+'&sw_lng='+sw_bound_lng+'&ne_lat='+ne_bound_lat+'&ne_lng='+ne_bound_lng+'&zoom='+zoom+'&tag='+gMap.activeTagWord.innerHTML; } else { var data = 'act=list&sw_lat='+sw_bound_lat+'&sw_lng='+sw_bound_lng+'&ne_lat='+ne_bound_lat+'&ne_lng='+ne_bound_lng+'&zoom='+zoom; } // data=''; ajaxLoadPost(gMap.markersHandler.server.url, data, gMap.markersHandler.server.loadMarkersOnload, window); } }, loadMarkersOnload : function (ajaxObj) { if(ajaxObj && ajaxObj.responseXML){ var xml = ajaxObj.responseXML; var errors = xml.getElementsByTagName('error'); var messages = xml.getElementsByTagName('message'); if(errors && errors.length && errors[0].firstChild && errors[0].firstChild.nodeType == 3) { futu_alert(FAT.gmap_header, errors[0].firstChild.data, true, 'error'); } else if (messages && messages.length && messages[0].firstChild && messages[0].firstChild.nodeType == 3 && messages[0].firstChild.data == 'ok') { var markers = xml.getElementsByTagName('marker'); $A(markers).each(function (marker) { if (!gMap.markersHandler.markers.contains(marker.getAttribute('id'))) { var newPoint = new GLatLng(marker.getAttribute('lat'),marker.getAttribute('lng')); var marker_types = marker.getAttribute('marker_type').split(','); var newIcon = gMap.iconsHandler.prepareIcon(marker_types[0],marker_types[1]); var newMarker = new GMarker(newPoint,{title: marker.firstChild.data, draggable:false, icon: newIcon}); gMap.map.addOverlay(newMarker); if (marker_types[0] == '3') { GEvent.addListener(newMarker, 'click', function() { gMap.markersHandler.server.loadMarkerInfoMetro(newMarker, marker.firstChild.data); }); } else { GEvent.addListener(newMarker, 'click', function() { gMap.markersHandler.server.loadMarkerInfo(newMarker, marker.getAttribute('id')); }); } if (window.map_object_id != marker.getAttribute('id')) { $A(marker_types).each(function (marker_type_one) { marker_type_one = marker_type_one.toInt(); gMap.markersHandler.markersObjects[marker_type_one].push(newMarker); }); //gMap.markersHandler.markersObjects[marker.getAttribute('marker_type')].push(newMarker); } else { window.map_object_id = ''; } gMap.markersHandler.markers.push(marker.getAttribute('id')); } }); for (var i = 1; i < 12; i++) { $A(gMap.markersHandler.markersObjects[i]).each(function (mm) { mm.hide(); }); } for (var i = 1; i < 12; i++) { $A(gMap.markersHandler.markersObjects[i]).each(function (mm) { if (gMap.markersHandler.markersTypes.contains(String(i))) { mm.show(); } }); } } } }, loadMarkerInfoMetro : function (marker, marker_title) { marker.openInfoWindowHtml('
' + marker_title + '
'); }, loadMarkerInfo : function (marker, marker_id) { marker.openInfoWindowHtml('
'); var data = 'act=get_info'+'&id='+marker_id; ajaxLoadPost(gMap.markersHandler.server.url, data, gMap.markersHandler.server.loadMarkerInfoOnload, window, {marker: marker, marker_id:marker_id}); }, loadMarkerInfoOnload : function (ajaxObj, opts) { if(ajaxObj && ajaxObj.responseXML){ var ourMarker = opts.marker; var ourMarkerId = opts.marker_id; var xml = ajaxObj.responseXML; var errors = xml.getElementsByTagName('error'); var messages = xml.getElementsByTagName('message'); if(errors && errors.length && errors[0].firstChild && errors[0].firstChild.nodeType == 3) { futu_alert(FAT.gmap_header, errors[0].firstChild.data, true, 'error'); } else if (messages && messages.length && messages[0].firstChild && messages[0].firstChild.nodeType == 3 && messages[0].firstChild.data == 'ok') { if (xml.getElementsByTagName('title')[0].firstChild) { var markerTitle = xml.getElementsByTagName('title')[0].firstChild.data; } else { var markerTitle = ''; } if (xml.getElementsByTagName('address')[0].firstChild) { var markerAddress = xml.getElementsByTagName('address')[0].firstChild.data; } else { var markerAddress = ''; } if (xml.getElementsByTagName('id')[0].firstChild) { var markerId = xml.getElementsByTagName('id')[0].firstChild.data; } else { var markerId = ''; } if (xml.getElementsByTagName('image')[0].firstChild) { var markerImage = xml.getElementsByTagName('image')[0].firstChild.data; } else { var markerImage = ''; } if (xml.getElementsByTagName('comments_count')[0].firstChild) { var commentsCount = xml.getElementsByTagName('comments_count')[0].firstChild.data; } else { var commentsCount = null; } if (xml.getElementsByTagName('photos_count')[0].firstChild) { var photosCount = xml.getElementsByTagName('photos_count')[0].firstChild.data; } else { var photosCount = null; } var iHTML = ''; iHTML += ''; iHTML += ''; iHTML += ''; iHTML += ''; iHTML += ''; iHTML += ''; iHTML += ''; iHTML += ''; iHTML += '
'; iHTML += ''+markerTitle+'
'+markerAddress+'
Отзывов: '+commentsCount+'
Фото: '+photosCount+''; iHTML += '
'; ourMarker.openInfoWindowHtml(iHTML); } } }, editMarker : function () { var data = $('maps_marker_edit_form').toQueryString() + '&act=update_marker'; ajaxLoadPost(gMap.markersHandler.server.url, data, gMap.markersHandler.server.editMarkerOnload, window); }, editMarkerOnload : function (ajaxObj) { if(ajaxObj && ajaxObj.responseXML){ var xml = ajaxObj.responseXML; var errors = xml.getElementsByTagName('error'); var messages = xml.getElementsByTagName('message'); var redirect = xml.getElementsByTagName('redirect'); if(errors && errors.length && errors[0].firstChild && errors[0].firstChild.nodeType == 3) { futu_alert(FAT.gmap_header, errors[0].firstChild.data, true, 'error'); } else if (messages && messages.length && messages[0].firstChild && messages[0].firstChild.nodeType == 3 && messages[0].firstChild.data == 'ok') { if (redirect && redirect.length && redirect[0].firstChild && redirect[0].firstChild.nodeType == 3) { var redirectLink = redirect[0].firstChild.data; window.location.href = redirectLink; } } } }, deleteMarker : function (marker_id) { var data = 'act=delete_marker&marker_id='+marker_id; ajaxLoadPost(gMap.markersHandler.server.url, data, gMap.markersHandler.server.deleteMarkerOnload, window); }, deleteMarkerOnload : function (ajaxObj) { if(ajaxObj && ajaxObj.responseXML){ var xml = ajaxObj.responseXML; var errors = xml.getElementsByTagName('error'); var messages = xml.getElementsByTagName('message'); var redirect = xml.getElementsByTagName('redirect'); if(errors && errors.length && errors[0].firstChild && errors[0].firstChild.nodeType == 3) { futu_alert(FAT.gmap_header, errors[0].firstChild.data, true, 'error'); } else if (messages && messages.length && messages[0].firstChild && messages[0].firstChild.nodeType == 3 && messages[0].firstChild.data == 'ok') { if (redirect && redirect.length && redirect[0].firstChild && redirect[0].firstChild.nodeType == 3) { var redirectLink = redirect[0].firstChild.data; window.location.href = redirectLink; } else { window.location.href = '/map/'; } } } } } }, iconsHandler : { prepareIcon : function (markerType,markerSubType) { // defaultIcon var newIcon = new GIcon(); // newIcon.shadow = '/images/map/shadowfor32x32.png'; // newIcon.shadowSize = new GSize(58, 34); newIcon.iconAnchor = new GPoint(20, 20); newIcon.infoWindowAnchor = new GPoint(20, 2); // newIcon.infoShadowAnchor = new GPoint(0,0); switch(markerType) { case '1' : newIcon.iconSize = new GSize(43, 45); newIcon.image = '/images/map/icon_radar.png'; break; case '2' : newIcon.iconSize = new GSize(43, 45); newIcon.image = '/images/map/icon_kamera.png'; break; case '4' : newIcon.iconSize = new GSize(43, 45); newIcon.image = '/images/map/icon_post.png'; break; case '3' : newIcon.iconAnchor = new GPoint(10, 10); newIcon.infoWindowAnchor = new GPoint(10, 2); newIcon.iconSize = new GSize(23, 19); switch(markerSubType) { case '1': newIcon.image = '/images/map/icon_metro_blue.png'; break; case '2': newIcon.image = '/images/map/icon_metro_green.png'; break; case '3': newIcon.image = '/images/map/icon_metro_red.png'; break; default: newIcon.image = '/images/map/icon_metro_green.png'; } break; default : newIcon.image = '/images/map/icon_new.png'; break; } return newIcon; } } } window.addEvent('load', function () { if ($('map')) { gMap.onDocumentLoad(); GEvent.trigger(gMap.map, 'load'); } else if ($('map_preview')) { gMap.onDocumentLoadPreview(); } else if ($('map_edit')) { gMap.onDocumentLoadEdit(); } else if ($('map_default_position')) { gMap.onDocumentLoadDefaultPosition(); } }); window.addEvent('unload', function () { if ($('map') || $('map_preview') || $('map_edit')) { gMap.onDocumentUnload(); } }); function ajaxLoadPost(url, data, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction) { var ajaxObject = null; if (window.XMLHttpRequest) { // branch for native XMLHttpRequest object ajaxObject = new XMLHttpRequest(); } else if (window.ActiveXObject) { // branch for IE/Windows ActiveX version var ajaxObject = new ActiveXObject("Microsoft.XMLHTTP"); } if(ajaxObject){ ajaxObject.onreadystatechange = function(){ ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction); } new_url = url+'?'+data; ajaxObject.open("POST", new_url, true); // ajaxObject.setRequestHeader("Content-type", ""); // ajaxObject.setRequestHeader("Content-length", data.length); // ajaxObject.setRequestHeader("Connection", "close"); ajaxObject.send(null); } } function ajaxLoadHandler(ajaxObject, ajaxCallBackFunction, callObject, params, ajaxCallBackErrorFunction){ // only if req shows "complete" if (ajaxObject.readyState == 4) { // only if "OK" if (ajaxObject.status == 200) { // ...processing statements go here... ajaxCallBackFunction.call(callObject, ajaxObject, params); } else { if(ajaxCallBackErrorFunction){ ajaxCallBackErrorFunction.call(callObject, ajaxObject); } else { alert("There was a problem retrieving the XML data:\n" + ajaxObject.statusText); } } } }