var INIT_G_MAP_TYPE = G_NORMAL_MAP; var MAX_INIT_ZOOM_LEVEL = 14; var DEF_GOTO_ZOOM_LEVEL = 15; var map = null; var g_map_type = INIT_G_MAP_TYPE; var map_container = null; var map_flag_image = null; var message_div = null; var default_marker_handler = null; var get_location_info_data = null; var flag_list = null; var scroller = null; var goto_flag = null; var _flag_id = 1; var flags = Array(); var selected_flag = null; var selected_flagimage = null; var previous_zoomlevel = null; var xmlhttp = null; var change_log = Array(); // status: create, update, delete, copy, move var baseIcon = new GIcon(); baseIcon.image = "/img/markers/133.png"; baseIcon.shadow = "/img/markers/shadow50.png"; baseIcon.transparent = "/img/markers/markerTransparent.png"; baseIcon.iconSize = new GSize(20, 34); baseIcon.shadowSize = new GSize(37, 34); baseIcon.iconAnchor = new GPoint(9, 34); baseIcon.infoWindowAnchor = new GPoint(9, 2); baseIcon.infoShadowAnchor = new GPoint(18, 25); baseIcon.imageMap = [9,0,6,1,4,2,2,4,0,8,0,12,1,14,2,16,5,19,7,23,8,26,9,30,9,34,11,34,11,30,12,26,13,24,14,21,16,18,18,16,20,12,20,8,18,4,16,2,15,1,13,0]; var baseRouteIcon = new GIcon(); baseRouteIcon.image = "/img/track/133.png"; //baseRouteIcon.shadow = "/img/track/shadow50.png"; baseRouteIcon.transparent = "/img/track/markerTransparent.png"; baseRouteIcon.iconSize = new GSize(8, 8); //baseRouteIcon.shadowSize = new GSize(8, 8); baseRouteIcon.iconAnchor = new GPoint(4, 4); baseRouteIcon.infoWindowAnchor = new GPoint(4, 0); //baseRouteIcon.infoShadowAnchor = new GPoint(18, 25); baseRouteIcon.imageMap = [0,0, 0,7, 7,7, 7,0]; function Flag(map, flag_data) { /* flag_data = {id, name, desc, tags, point_x, point_y, is_route, list_sort, media_url, media_type, owner_id, owner_name, is_default, editable} */ var self = this; self.id = null; self.name = ""; self.desc = ""; self.tags = ""; self.point_x = null; self.point_y = null; self.is_route = false; self.list_sort = null; self.media_url = null; self.media_type = null; self.owner_id = null; self.owner_name = null; self.is_default = false; self.editable = false; self.map = null; self.marker = null; self.icon = null; self.html = ""; self.list_item = null; self.constructor = function(map, flag_data) { self.id = ((flag_data.id) ? (flag_data.id) : ("_" + (_flag_id++))); self.setWindowDetails(flag_data.name, flag_data.desc, flag_data.tags, flag_data.media_url, flag_data.media_type, flag_data.owner_id, flag_data.owner_name, flag_data.is_default, flag_data.editable); self.point_x = flag_data.point_x; self.point_y = flag_data.point_y; self.is_route = flag_data.is_route; self.list_sort = flag_data.list_sort; if (self.is_route == '1') { self.icon = new GIcon(baseRouteIcon); self.icon.image = ((self.editable) ? ("/img/track/066.png") : ("/img/track/133.png")); } else { self.icon = new GIcon(baseIcon); self.icon.image = ((self.is_default) ? ("/img/markers/216.png") : ((self.editable) ? ("/img/markers/066.png") : ("/img/markers/133.png"))); } self.map = map; self.marker = new GMarker(new GPoint(self.point_x, self.point_y), {title: flag_data.name, icon: self.icon, draggable: true, dragCrossMove: false, bouncy: true, bounceGravity: 1}); self.marker.disableDragging(); self.map.addOverlay(self.marker); if (map_editable) { GEvent.addListener ( self.marker, "click", function(marker, point) { if (!selected_flag || selected_flag == self) { self.createWindow(); } } ); GEvent.addListener ( self.marker, "dblclick", function(marker, point) { if (!selected_flag || selected_flag == self) { if (self.editable) { start_edit(self); } else { self.createWindow(); } } } ); GEvent.addListener ( self.marker, "dragstart", function(marker) { if (selected_flag == self) { self.hideWindow(); } } ); GEvent.addListener ( self.marker, "dragend", function(marker) { if (selected_flag == self) { self.point_x = self.marker.getPoint().x; self.point_y = self.marker.getPoint().y; self.createWindow(); } } ); } else { GEvent.addListener ( self.marker, "click", function(marker, point) { if (selected_flag != self) { self.select(); } } ); // GEvent.addListener // ( // self.marker, // "mouseover", // function(marker, point) // { // if (selected_flag != self) // { // try // { // for (var i=0; i"; } else { self.html += "New flag"; } self.html += "
"; if (self.media_url) { switch (self.media_type) { case 'IMG': self.html += "
"; self.html += ""; self.html += '
'; self.html += "
"; break; case 'MOV': self.html += "
"; self.html += ""; self.html += "
"; break; case 'WAV': self.html += "
"; self.html += ""; self.html += "
"; break; default: self.html += "
"; self.html += "
"; break; } } else { self.html += "
"; } self.html += ""; self.html += ''+'View detailed map'; if (self.id > -1) { self.html += '
'+'Tell a friend!'; self.html += (remote_user_id ? '
'+(remote_user_id != self.owner_id ? 'Add to my friends' : '') : ''); self.html += "
"; } self.html += "
"; if (self.desc) { self.html += "
"; self.html += "" + self.desc.replace(/[\r\n\s]+$/g, "").replace(/\r\n|\n\r|\r|\n/g, "
") + ""; self.html += "
"; } if (self.tags) { self.html += "
"; self.html += "Tags: " + self.tags + ""; } if (self.owner_id && self.owner_name) { self.html += "
"; self.html += "Owner: " + self.owner_name + ""; } self.html += ''; self.html += "
"; } self.createWindow = function() { var html = self.html; if (self.editable) { if (selected_flag == self) { html += "
"; html += "Edit details for this flag in the right
colomn and click 'Save flag details' »
"; } else { html += "
"; html += ""; html += "edit flag »"; if (!self.is_default) { if (self.id > -1) { html += "
"; html += "move flag »"; html += ""; html += "
"; html += "copy flag »"; html += ""; } html += "
"; html += "remove flag »"; } html += "
"; } } var bookmarks = ""; if (self.id > -1) { bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += ''; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
'; bookmarks += '
Send to MySpace »
'; bookmarks += '
Send to Bebo »
'; bookmarks += '
Send to HI5 »
'; bookmarks += '
Send to Friendster »
'; bookmarks += '
Send to Hyves »
'; } var navigate_to = ""; navigate_to += ''; navigate_to += ''; if (self.id > -1) { var tabs = [ new GInfoWindowTab('main', '
' + html + '
'), new GInfoWindowTab('bookmarks', bookmarks), new GInfoWindowTab('navigate to', navigate_to) ]; } else { var tabs = [ new GInfoWindowTab('main', '
' + html + '
'), new GInfoWindowTab('navigate to', navigate_to) ]; } self.marker.openInfoWindowTabsHtml(tabs); } self.showWindow = function() { self.map.getInfoWindow().show(); } self.hideWindow = function() { self.map.getInfoWindow().hide(); } self.setPoint = function(point) { self.point_x = point.x; self.point_y = point.y; self.hideWindow(); self.marker.setPoint(point); self.createWindow(); } self.select = function() { if (map_flag_image) { map_container.style.display = ''; map_flag_image.style.display = 'none'; } if (selected_flag) { selected_flag.deselect(); } selected_flag = self; self.hideWindow(); self.map.removeOverlay(self.marker); if (self.is_route == '1') { self.icon.image = "/img/track/012.png"; } else { self.icon.image = "/img/markers/012.png"; } self.map.addOverlay(self.marker); self.createWindow(); if (self.editable) { self.marker.enableDragging(); } if (self.list_item) { self.list_item.select(); } if (!self.editable) { self.log_view(); } } self.deselect = function() { selected_flag = null; self.hideWindow(); self.map.removeOverlay(self.marker); if (self.is_route == '1') { self.icon.image = ((self.editable) ? ("/img/track/066.png") : ("/img/track/133.png")); } else { self.icon.image = ((self.is_default) ? ("/img/markers/216.png") : ((self.editable) ? ("/img/markers/066.png") : ("/img/markers/133.png"))); } self.map.addOverlay(self.marker); self.createWindow(); if (self.editable) { self.marker.disableDragging(); } if (self.list_item) { self.list_item.deselect(); } } self.remove = function() { if (selected_flag == self) { selected_flag = null; } self.hideWindow(); self.map.removeOverlay(self.marker); } self.goto = function() { self.select(); } self.log_view = function() { if (self.is_route) return; var method = "POST"; var data = { "action": "log_flag_view", "flag_id": self.id, "user_id": remote_user_id }; var json_data = data.toJSONString(); xmlhttp = GXmlHttp.create(); xmlhttp.open(method, map_service, true); xmlhttp.send(json_data); } self.enlargePicture = function(enlarge) { var map_flag_cont = false; if (map_flag_image) { for (var a=0; a < map_flag_image.childNodes.length; a++) { if (map_flag_image.childNodes[a].nodeName.toLowerCase() == 'div') { map_flag_cont = map_flag_image.childNodes[a]; break; } } } if (!map_flag_image) { return false; } if (!map_flag_cont) { return false; } if (enlarge) { map_container.style.display = 'none'; map_flag_image.style.display = 'block'; var width = map_flag_cont.offsetWidth; var height = map_flag_cont.offsetHeight; var testImage = new Image; testImage.src = self.media_url; var ratio = ((height/testImage.height) > (width/testImage.width)) ? (width/testImage.width) : (height/testImage.height); ratio = ratio < 1 ? ratio : 1; var newWidth = (ratio*testImage.width); var paddLeft = newWidth ? Math.round((width-newWidth)/2) : 0; paddLeft = paddLeft ? 'padding-left:' + paddLeft + 'px;' : 0; newWidth = newWidth ? 'width="' + newWidth + '"' : ''; var newHeight = (ratio*testImage.height); var paddTop = newHeight ? Math.round((height-newHeight)/2) : 0; paddTop = paddTop ? 'padding-top:' + paddTop+'px;' : 0; newHeight = newHeight ? 'height="' + newHeight + '"' : ''; map_flag_cont.innerHTML = ''; selected_flagimage=self; } else { map_container.style.display = 'block'; map_flag_image.style.display = 'none'; } return true; } self.zoom_to_detail = function(zoom) { if (zoom) { previous_zoomlevel = map.getZoom(); map.setZoom(15); } else { map.setZoom(previous_zoomlevel); } var link = document.getElementById('view_detailed_map'); link.innerHTML = zoom ? 'Previous view' : 'View detailed map'; link.onclick = zoom ? function() { selected_flag.zoom_to_detail(false); } : function() { selected_flag.zoom_to_detail(true); }; } self.constructor(map, flag_data); } function show_move_flag_select(flag_id) { document.getElementById('move_flag_link_' + flag_id).style.display = 'none'; document.getElementById('move_flag_select_' + flag_id).style.display = 'inline'; document.getElementById('copy_flag_link_' + flag_id).style.display = 'inline'; document.getElementById('copy_flag_select_' + flag_id).style.display = 'none'; } function show_copy_flag_select(flag_id) { document.getElementById('copy_flag_link_' + flag_id).style.display = 'none'; document.getElementById('copy_flag_select_' + flag_id).style.display = 'inline'; document.getElementById('move_flag_link_' + flag_id).style.display = 'inline'; document.getElementById('move_flag_select_' + flag_id).style.display = 'none'; } function FlagListItem(flag, container) { var self = this; self.selected = false; self.container = container; self.element = document.createElement('li'); self.id = flag.id self.element.innerHTML = flag.name; self.element.className = 'unselected'; self.element.style.cursor = 'pointer'; self.select = function() { var scroll = self.container.parentNode; var ypos = self.element.offsetTop; ypos = (self.container.offsetTop >= scroll.offsetTop) ? (ypos-scroll.offsetTop) : (ypos); ypos = ypos - Math.round((scroll.clientHeight-self.element.offsetHeight) / 2); scroll.scrollTop = ypos; self.selected = true; self.element.className = 'selected'; } self.deselect = function() { self.selected = false; self.element.className = 'unselected'; } self.hoverStart = function() { this.className = 'selected hover'; } self.hoverEnd = function() { this.className = ((self.selected) ? ('selected') : ('unselected')); } self.element.onclick = flag.goto; self.element.onmouseover = self.hoverStart; self.element.onmouseout = self.hoverEnd; self.container.appendChild(self.element); flag.list_item = this; } function FlagList(container_id) { var self = this; self.container = document.getElementById(container_id); self.flag_items = []; self.addFlag = function(flag) { if (self.container) { var flag_item = new FlagListItem(flag, self.container); self.flag_items.push(flag_item); } } } function change_log_find(flag) { for (var i=0; i -1) { change_log.splice(i, 1); return true; } return false; } function change_log_set_status(flag, status, to_map_id) { var i = change_log_find(flag); if (i > -1) { switch (status) { case 'create': change_log[i].status = 'create'; break; case 'update': if (change_log[i].status != 'create') { change_log[i].status = 'update'; } break; case 'delete': if (change_log[i].status == 'create') { change_log_remove(flag); } else { change_log[i].status = 'delete'; } break; case 'copy': change_log[i].status = 'copy'; change_log[i].to_map_id = to_map_id; break; case 'move': change_log[i].status = 'move'; change_log[i].to_map_id = to_map_id; break; } } else { change_log.push({'flag': flag, 'status': status, 'to_map_id': to_map_id}); } return true; } function enlarge_picture(id, enlarge) { for(var i=0; i=0?ImgId-1:ImgArr.length-1; break; case 'next' : ImgId=ImgId+1Save to this map"; } navigate_to += ""; } if (save_to) { output += '
'+save_to+'
'; } if(navigate_to) { output += '
'+navigate_to; } var point = new GLatLng(location.lat, location.lng); map.openInfoWindow(point, output); } } } function get_location_info(point) { map.openInfoWindow(point, "Get location info...."); var method = "POST"; var data = { "action": "get_location_info", "x": point.x, "y": point.y }; var json_data = data.toJSONString(); xmlhttp = GXmlHttp.create(); xmlhttp.open(method, map_service, true); xmlhttp.onreadystatechange = get_location_info_response; xmlhttp.send(json_data); return false; } function get_location_info_response() { if (xmlhttp.readyState == 4) { var jsonResponse = xmlhttp.responseText; var response = eval('(' + jsonResponse + ')'); if (response.error) { alert(response.error); } else { var html = ''; var navigate_to = ''; var save_to = ''; var output = ''; var point = map.getInfoWindow().getPoint(); var data = response.response; if (data.street) html += data.street + ' '; //if (data.nrs_1) html += data.nrs_1 + ' - '; if (data.nrs_3) { html += data.nrs_3 + '
' } else { if (data.nrs_2) html += data.nrs_2 + '
'; }; if (data.area) html += data.area + '
'; if (data.zip) html += data.zip + '
'; if (data.state) html += data.state + '
'; if (data.place) html += data.place + '
'; if (data.country) html += data.country + '
'; if (remote_user_id) { get_location_info_data = data; get_location_info_data.point_x = point.x; get_location_info_data.point_y = point.y; get_location_info_data.desc = html; if (map_is_editable) { save_to += "Save to this map"; } navigate_to += ""; } if(html) { output+=html; } if(save_to) { output+='
'+save_to+'
'; } if(navigate_to) { output+='
'+navigate_to; } map.openInfoWindow(point,output); } } } function show_pois(main, sub, x, y) { if (!main) { return false; } document.getElementById('show_poi_submit').style.display = "none"; document.getElementById('progressbar').style.display = "block"; var method = "POST"; var data = { "action": "get_pois", "main": main, "sub": sub, "x": x, "y": y }; var json_data = data.toJSONString(); xmlhttp = GXmlHttp.create(); xmlhttp.open(method, map_service, true); xmlhttp.onreadystatechange = show_pois_response; xmlhttp.send(json_data); return false; } function show_pois_response() { if (xmlhttp.readyState == 4) { document.getElementById('show_poi_submit').style.display = "block"; document.getElementById('progressbar').style.display = "none"; var jsonResponse = xmlhttp.responseText; var response = eval('(' + jsonResponse + ')'); if (response.error) { alert(response.error); } else { var pois = response.response; if (!pois) { alert("Server error."); return; } if (!pois.nr_found) { alert('No points of interest found'); return; } var bounds = new GLatLngBounds(); for (var i=0; i'; } if (poi.d) { desc += 'Distance: ' + poi.d + ' meters
'; } if (poi.c) { desc += 'Country: ' + poi.c + '
'; } if (poi.t) { desc += 'State: ' + poi.t + '
'; } if (poi.p) { desc += 'Place: ' + poi.l + '
'; } if (poi.i) { desc += 'District: ' + poi.i + '
'; } if (poi.r) { desc += 'Street: ' + poi.r + ((poi.n) ? (' ' + poi.n) : ('')) + '
'; } if (poi.h) { desc += 'Telephone: ' + poi.h + '
'; } var flag_data = { "id": 0, "name": poi.p, "desc": desc, "tags": '', "point_x": poi.x, "point_y": poi.y, "is_route": false, "list_sort": '0', "media_url": '', "media_type": null, "owner_id": null, "owner_name": null, "is_default": false, "editable": false }; var flag = new Flag(map, flag_data); flags.push(flag); bounds.extend(new GLatLng(flag_data.point_y, flag_data.point_x)); } var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2; var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2; var zoom = map.getBoundsZoomLevel(bounds); if (zoom > MAX_INIT_ZOOM_LEVEL) zoom = MAX_INIT_ZOOM_LEVEL; map.setZoom(zoom); map.setCenter(new GLatLng(clat, clng)); } } } function close_message_div() { if (message_div) { message_div.style.display = 'none'; } } function upload_media() { var win = window.open('/upload.php','nav4all_upload_window','width=350,height=250'); if (!win) { alert('Please allow popups from nav4all'); return true; } win.focus(); return true; } function load_map_flags() { if (map_flags.length) { for (var i in map_flags) { if (i == 'toJSONString') continue; var flag = new Flag(map, map_flags[i]); flags.push(flag); if (!map_editable) { if (flag.media_url && flag.media_type == 'IMG') { scroller.Add(flag.id, flag.media_url, flag.goto); } flag_list.addFlag(flag); } if (goto_flag_id == flag.id) { goto_flag = flag; } } if (goto_flag) { goto_flag.select(); } } if (map_routes.length > 0) { setTimeout(load_map_routes, 1000); } } function load_map_routes() { if (map_routes.length > 0) { for (var i in map_routes) { var polyline_points = []; for (var j in map_routes[i]) { polyline_points.push(new GLatLng(map_routes[i][j].y, map_routes[i][j].x)); } if (polyline_points.length > 0) { var polyline = new GPolyline(polyline_points, "#FF0000", 3, 0.5); map.addOverlay(polyline); } } } } function load() { if (GBrowserIsCompatible()) { map_flag_image = document.getElementById("map_flag_image"); map_container = document.getElementById("map"); if (map_flag_image) { map_flag_image.style.display = 'none'; } if (!map_editable) { flag_list = new FlagList('flag_list'); scroller = new JsScroller('scroller_holder', 910, 80, 6); } switch (map_type) { case 'NORMAL': g_map_type = G_NORMAL_MAP; break; case 'SATELLITE': g_map_type = G_SATELLITE_MAP; break; case 'HYBRID': g_map_type = G_HYBRID_MAP; break; } map = new GMap2(document.getElementById("map")); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.addControl(new GOverviewMapControl()); if (goto_lat && goto_lng) { map.setCenter(new GLatLng(goto_lat, goto_lng), DEF_GOTO_ZOOM_LEVEL, g_map_type); if (show_address) { var flag_data = { "id": null, "name": show_address, "desc": '', "tags": '', "point_x": goto_lng, "point_y": goto_lat, "is_route": false, "list_sort": '0', "media_url": '', "media_type": null, "owner_id": null, "owner_name": null, "is_default": true, "editable": false }; var flag = new Flag(map, flag_data); flags.push(flag); flag.select(); } } else { map.setCenter(new GLatLng(30, 0), 1 , g_map_type); if (map_flags.length) { var bounds = new GLatLngBounds(); for (var i in map_flags) { if (i == 'toJSONString') continue; bounds.extend(new GLatLng(map_flags[i].point_y, map_flags[i].point_x)); } var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2; var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2; var zoom = map.getBoundsZoomLevel(bounds); if (zoom > MAX_INIT_ZOOM_LEVEL) zoom = MAX_INIT_ZOOM_LEVEL; map.setZoom(zoom); map.setCenter(new GLatLng(clat, clng)); } } if (map_container && edit_default_marker) { message_div = document.createElement('DIV'); message_div.style.position = 'absolute'; message_div.style.background = 'white'; message_div.style.border = '1px solid red'; message_div.style.padding = '10px'; message_div.style.width = '300px'; message_div.style.height = '100px'; message_div.style.top = '150px'; message_div.style.left = '150px'; var html = '
'; html += '

'; html += 'Please double click on the map to mark your location.'; html += '

'; html += 'ok'; message_div.innerHTML = html; map_container.appendChild(message_div); } if (edit_default_marker) { default_marker_handler = GEvent.addListener ( map, "dblclick", function(marker, point) { if (!marker) { var flag_data = { "id": null, "name": 'Your location', "desc": '', "tags": '', "point_x": point.x, "point_y": point.y, "is_route": false, "list_sort": '0', "media_url": '', "media_type": null, "owner_id": remote_user_id, "owner_name": remote_user_name, "is_default": true, "editable": false }; var flag = new Flag(map, flag_data); flags.push(flag); save_default_user_marker(map_id, remote_user_id, flag.point_x, flag.point_y, flag.name); GEvent.removeListener(default_marker_handler); } } ); } else if (map_editable) { GEvent.addListener ( map, "dblclick", function(marker, point) { CURRENT_EDIT_POINT = null; WAITING_FOR_DBLCLICK = false; if (marker) { //map.removeOverlay(marker); } else { if (selected_flag) { selected_flag.setPoint(point); } else { var flag_data = { "id": null, "name": '', "desc": '', "tags": '', "point_x": point.x, "point_y": point.y, "is_route": false, "list_sort": '0', "media_url": '', "media_type": null, "owner_id": remote_user_id, "owner_name": remote_user_name, "is_default": false, "editable": true }; var flag = new Flag(map, flag_data); flags.push(flag); change_log_set_status(flag, 'create'); start_edit(flag); } } } ); } GEvent.addListener ( map, "click", function(marker, point) { if (!marker) { CURRENT_EDIT_POINT = point; WAITING_FOR_DBLCLICK = true; get_location_info_timeout() //get_location_info(point); } } ); if (map_flags.length) { setTimeout(load_map_flags, 1000); } } } var CURRENT_EDIT_POINT = null; var WAITING_FOR_DBLCLICK = false; function get_location_info_timeout() { if (WAITING_FOR_DBLCLICK) { setTimeout("WAITING_FOR_DBLCLICK = false;get_location_info_timeout()", 400); } else { if (CURRENT_EDIT_POINT) { get_location_info_continue(CURRENT_EDIT_POINT); } } } function get_location_info_continue(point) { WAITING_FOR_DBLCLICK = false; CURRENT_EDIT_POINT = null; get_location_info(point); }