function distanceBetweenPoints(p1, p2) { if (!p1 || !p2) return 0; var R = 6378137; // Radius of the Earth in m var dLat = (p2.lat() - p1.lat()) * Math.PI / 180; var dLon = (p2.lng() - p1.lng()) * Math.PI / 180; var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(p1.lat() * Math.PI / 180) * Math.cos(p2.lat() * Math.PI / 180) * Math.sin(dLon / 2) * Math.sin(dLon / 2); var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); var d = R * c; return d; } var tagBody = '(?:[^"\'>]|"[^"]*"|\'[^\']*\')*'; var tagOrComment = new RegExp( '<(?:' // Comment body. + '!--(?:(?:-*[^->])*--+|-?)' // Special "raw text" elements whose content should be elided. + '|script\\b' + tagBody + '>[\\s\\S]*?[\\s\\S]*?', 'gi'); function removeTags(html) { var oldHtml; do { oldHtml = html; html = html.replace(tagOrComment, ''); } while (html !== oldHtml); return html; } function removeUnnecessary(s) { var r = s.replace(/(日本、|Unnamed Road, )?(〒(\d){3,4}-(\d){3,4} )?/, '') .replace(/( (\d){3,4}-(\d){3,4} 日本)?$/, '') .replace('Unnamed Road', ''); return r; } function onMoveHere() { if(window.anzenmap_mgr._app_status.isOnPostFlow && window.anzenmap_mgr._app_status.postFlowStep > anzenmap_cnsts.POST_FLOW.START) return; if(window.anzenmap_mgr._app_status.isOpenedModal) return; navigator.geolocation.getCurrentPosition(function(){ var coords = arguments[0].coords; var pnt = new google.maps.LatLng(coords.latitude, coords.longitude); window.anzenmap_mgr._map.setCenter(pnt); }, function(){ console.log(arguments); alert(ZdcEmapGPSErrMsg || arguments[0].message); }); } function onMoveInitPoint() { var pnts = /lat=([0-9.]+)&lon=([0-9.]+)/.exec(document.location.search); if(pnts && pnts.length == 3) { var isDeg = pnts[1].indexOf('.') !== -1; var t,n; if(isDeg) { t = pnts[1]; n = pnts[2]; } else { t = ZDC.msTodeg(pnts[1]); n = ZDC.msTodeg(pnts[2]); } var tn = ZdcEmapTky2Wgs(t, n); var pnt = new google.maps.LatLng(tn.lat, tn.lon); window.anzenmap_mgr._map.setCenter(pnt); } } function openNewBackgroundTab(url){ var a = document.createElement("a"); a.href = url; var evt = document.createEvent("MouseEvents"); //the tenth parameter of initMouseEvent sets ctrl key evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, true, false, false, false, 0, null); a.dispatchEvent(evt); } function onUsage(el) { var site = /\/(p|smt)\/(\w+)\/.*/.exec(document.location.pathname); var type = (site[1] === 'p' ? 'pc' : 'sp'); var prefix = (site[1] === 'p' ? 'pc' : site[1]); var fnm = prefix + '_manual.pdf'; var url = '/asp/' + site[2] + '/' + type + '/'; if(el) { el.href = fnm; el.download = url; el.target = '_blank'; // el.click(); } else { // var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1; // if(!is_chrome) window.open(url + fnm, '_blank'); // else // openNewBackgroundTab(url + fnm); } } function moveAsp(p) { var site = /\/(p|smt)\/(\w+)\/.*/.exec(document.location.pathname); var type = (site[1] === 'p' ? 'pc' : 'sp'); var page = type + (p === '5' ? '_m005.html' : '_m999.html'); var url = '/asp/' + site[2] + '/' + type + '/' + page; document.location.href = url; } function moveAbsolute(url) { if(window.anzenmap_mgr._app_status.isOpenedModal) return; document.location.href = url; } function onMail(el) { var id = window.anzenmap_mgr._app_status.currentMarker.id; var nl = '\r\n'; var to = 'AIG_anzenmymap@aig.co.jp'; var sbj = 'あんぜんmyマップ削除依頼(ID:' + id + ')'; var bdy = 'ID : ' + id + nl + '以下の項目を漏れなくご入力ください' + nl + '○削除依頼理由' + nl + '(以下のうち不要な選択肢は削除してください)' + nl + '・誤った内容のコメントを投稿してしまった' + nl + '・意図しない地点にコメントを投稿してしまった' + nl + '・明らかにいたずら目的の投稿である' + nl + '・コメントに公序良俗に反する言葉が含まれている' + nl + '・コメントに誹謗中傷や名誉棄損に該当する言葉が含まれている' + nl + '・コメントに個人情報が含まれている' + nl + '・その他 (具体的に理由をご記載ください)'; var str = 'mailto:' + to + '?subject=' + encodeURIComponent(sbj) + '&body=' + encodeURIComponent(bdy); if(typeof el === 'undefined') { el = document.createElement('a'); document.body.appendChild(el); } el.href = str; if(navigator.userAgent.indexOf('Firefox') === -1) el.click(); } var ZdcEmapReading = 0;//読み込み中・処理中フラグ function ZdcEampVisibleWait() { var wait = document.getElementById("ZdcEmapWait"); if (!wait) return; wait.style.left = '0px'; wait.style.top = '0px'; wait.style.width = '100%'; wait.style.height = '100%'; wait.style.display = "block"; } function ZdcEmapReadOn() { if(window.anzenmap_mgr) { ZdcEmapReading = window.anzenmap_mgr._app_status.ds; ZdcEampVisibleWait(); } } function ZdcEmapReadOff() { if(window.anzenmap_mgr) { ZdcEmapReading = window.anzenmap_mgr._app_status.ds; if(ZdcEmapReading === 0) { ZdcEampHiddenWait(); } toggleClose(true); } } anzenmap_cnsts = {MARKER_TYPE : {BLURVIEW : '01', ACC_STREET : '02' , OTHER : '03', CHILD : '04' , DEAD_3 : '05', DEAD_2 : '06' , DEAD_1 : '07', DEAD_0 : '08' , SCHOOL : '09', EMPTY : '10' , OVERLAP : '99', JUST_VIEW : '98'} , MARKER_DESC : {BLURVIEW : '道路の見通しが悪い' , ACC_STREET : '危ないと感じる交差点' , OTHER : 'その他の危険', CHILD : 'こども110番' , DEAD_3 : '事故多発エリア(こども死傷者数3人以上)' , DEAD_2 : '事故多発エリア(こども死傷者数2人)' , DEAD_1 : '事故多発エリア(こども死傷者数1人)' , DEAD_0 : '事故多発エリア(こども死傷者数0人)' , SCHOOL : '小学校' , EMPTY : '10' , OVERLAP : '99'} , MARKER_EVENT : {STD : 0, CLOSE : 4} , POST_FLOW : {START : 0, CONFIRM_PNT : 1, LOAD_PAGE: 2 , WAIT_USER_ACTION: 2.5, RECEIVED_USER_ACTION: 2.7 , VALIDATE_FORM: 3, CANCEL : 4 , CONFIRM_POST: 5, FAILED_POST: 6 , TOO_HIGH_SCALE: 7, RESTART: -2}}; function anzenmap_fns(map, markers, infoBox) { this._map = map; this._markers = markers; this._info = infoBox; this._app_status = this.getDefaultStatus(); var that = this; google.maps.event.addListener(map, 'click', that.onMapClick.bind(this)); google.maps.event.addListener(map, 'bounds_changed', initGLogo); google.maps.event.addListener(infoBox, 'domready', that.onPreparedDetail.bind(this)); google.maps.event.addListener(infoBox, 'closeclick', that.clearHistories.bind(this)); google.maps.event.addDomListener(window, 'resize', that.onResize.bind(this)); // block legacy event; window.onorientationchange = that.log.bind(this);//that.onResize.bind(this); google.maps.event.trigger(map, 'resize'); this._map.setOptions({clickableIcons: false, gestureHandling: 'greedy' , disableDoubleClickZoom: true, keyboardShortcuts: false}); this._info.setOptions({disableAutoPan: true, boxClass: 'detail-pane'}); } anzenmap_fns.prototype.onResize = function() { var z = this._map.getZoom(); var c = this._map.getCenter(); var hh = 0; var that = this; if(this._app_status.isPc) { hh = $('header').height() + $('div.breadcrumbs').height() + 10; } else { hh = $('nav').height(); } var ti = setTimeout(function(){ clearTimeout(ti); ZdcEmapWindowWidth = document.body.clientWidth; ZdcEmapWindowHeight = window.innerHeight - hh; document.getElementById("ZdcEmapMap").style.width = ZdcEmapWindowWidth + 'px'; document.getElementById("ZdcEmapMap").style.height = ZdcEmapWindowHeight + 'px'; google.maps.event.trigger(that._map, 'resize'); that._map.setZoom(z); that._map.setCenter(c); initGLogo(); // sometime not fire idle event? // google.maps.event.addListenerOnce(that._map, 'idle', function() { // google.maps.event.trigger(that._map, 'resize'); // that._map.setZoom(z); // that._map.setCenter(c); // }); }, 500); }; anzenmap_fns.prototype.getCurrentMeterPerPx = function() { var lat = this._map.getCenter().lat(); var zoom = this._map.getZoom(); var mp = 156543.03392 * Math.cos(lat * Math.PI / 180) / Math.pow(2, zoom); return mp; }; anzenmap_fns.prototype.getDefaultStatus = function() { var site = /\/(p|smt)\/(\w+)\/.*/.exec(document.location.pathname); var path = 'company/' + site[2] + '/'; var mp = this.getCurrentMeterPerPx(); return {ds: 0 , stopBubble: false , isDirty: false , merged: false , detailType: null , histories: [] , isOnPostFlow: false , isOpenedModal: false , postFlowStep: -1 , postCid : null , postKey : null , isPc : (site[1] === 'p') , isDebug: (site[2].indexOf('test') !== -1) , debugTime: [0] , metersPerPx : mp , fetchByOwnFnFinished: false , fetchByOwnFnResult: [] , resourceRoot: path}; }; anzenmap_fns.prototype.resetAppStatus = function() { this._app_status = this.getDefaultStatus(); var ms = this._markers; ms.map(function(m){ if(m.hasOwnProperty('marker')) m.marker.setMap(null); }); this._markers = []; }; anzenmap_fns.prototype.log = function() { // when debug env; if(this._app_status && this._app_status.isDebug) { console.log(arguments); } }; anzenmap_fns.prototype.trackTime = function(isEnd, idx, msg) { // when debug env; if(this._app_status && this._app_status.isDebug) { var t = new Date().getTime(); var p = this._app_status.debugTime.length - 1; idx = idx || p === 0 ? (isEnd && p > 0 ? p - 1 : p) : (isEnd ? p : p + 1); if(!isEnd) this._app_status.debugTime[idx] = t; else { var d = (t - this._app_status.debugTime[idx]) / 1000; this._app_status.debugTime[idx] = [idx, msg, d]; this.log.apply(this, ['time : ', d, msg]); this._app_status.debugTime[idx + 1] = t; } return idx + 1; } }; anzenmap_fns.prototype.resourcePath = function(suffix) { return this._app_status.resourceRoot + suffix; }; anzenmap_fns.prototype.clearHistories = function() { this._app_status.histories = []; }; anzenmap_fns.prototype.addHistory = function(o) { var idx = o[0]; var hist = this._app_status.histories.filter(function(h){ return h[0] == idx && h.length == o.length; }); var insertable = hist.length == 0; if(insertable) this._app_status.histories.push(o); }; anzenmap_fns.prototype.goBack = function() { this._app_status.histories.pop(); var can = this._app_status.histories.length > 0; if(can) { var prev = this._app_status.histories.pop(); this.onMarkerClick.apply(this, prev); } else { this._info.close(); if(this._app_status.isPc) { toggleClose(true); } } }; anzenmap_fns.prototype.closeInfo = function() { this._info.close(); this.clearHistories(); $('.popup-to-close').hide(); }; anzenmap_fns.prototype.resetDs = function() { // remove school markers // check this._markers not array var sms = this._markers.filter(function(m){ // id is assigned by server side; api res not contain own id; return !m.hasOwnProperty('id') || m.hasOwnProperty('isSubmit'); }); sms.map(function(m){ m.marker.setMap(null); }); this._app_status.merged = false; ZdcEmapReadOn(); }; anzenmap_fns.prototype.hasMoreDs = function(rslt) { var cnt = this._app_status.ds + 1; var isReset = cnt == 1; var prev = (isReset ? [] : this._markers); if(isReset) this.resetDs(); this._app_status.ds = cnt; this._markers = [].concat(rslt).concat(prev); this.log('append result', rslt.length, prev.length, '->', this._markers.length); return cnt <= 1; }; anzenmap_fns.prototype.stopBubble = function() { this._app_status.stopBubble = true; }; anzenmap_fns.prototype.isSkip = function() { return this._app_status.stopBubble; }; anzenmap_fns.prototype.isDirty = function() { return this._app_status.isDirty; }; anzenmap_fns.prototype.resetDsStatus = function() { this._app_status.ds = 0; this._app_status.stopBubble = false; this._app_status.merged = true; this.log('debug times : ', this._app_status.debugTime); this._app_status.debugTime = [0]; ZdcEmapReadOff(); }; anzenmap_fns.prototype.wrapProcessor = function(preFn, fn, postFn) { var that = this; return function() { var args = arguments; if(typeof preFn === 'function') { args = preFn.apply(null, args); that.log('after preFn', fn.name, args); } if(args !== false) { args = (args === true) ? [] : args; var res = fn.apply(this, args); that.log('after originFn', fn.name, res); } else { that.log('skip origin fn', fn.name, res); } if(typeof postFn === 'function') { var addOrigin = [that, fn].concat(args); var tmp = postFn.apply(null, addOrigin); if(tmp) res = tmp; that.log('after postFn', fn.name, tmp, res); } return res; }; }; anzenmap_fns.prototype.wrapRewriteOpt = function(fn) { var that = this; return function() { var opts = arguments[0]; that.log('origin rewrite opt', opts); if(opts.itarda == true) { opts.cid = 'ITARDA' + (opts.dev ? 'test' : ''); opts.jkn = ''; delete opts.anzenmap; } else if(opts.anzenmap == true) { opts.cid = 'anzenmap' + (opts.dev ? 'test' : ''); opts.jkn = '((COL_01:1))'; delete opts.itarda; } opts.enc = 'EUC'; opts.limitCount = 100; opts.maxCount = 100; // calc radius opts.radius = that.getMeterRadius(); // use WGS /* var center = that._map.getCenter(); var boxmin = that._map.getBounds().getSouthWest(); var boxmax = that._map.getBounds().getNorthEast(); if(that._app_status.isPc) { opts.lat = center.lat(); opts.lon = center.lng(); opts.latlon = boxmin.lat()+","+boxmin.lng()+","+boxmax.lat()+","+boxmax.lng(); } else { opts.lat = ZDC.degToms(center.lat()); opts.lon = ZDC.degToms(center.lng()); opts.latlon = ZDC.degToms(boxmin.lat()) + "," + ZDC.degToms(boxmin.lng()) + "," + ZDC.degToms(boxmax.lat()) + "," + ZDC.degToms(boxmax.lng()); } */ var args = arguments; args[0] = opts; that.log('rewrite opt', opts.cid, opts.jkn); var res = fn.apply(this, args); return res; }; }; anzenmap_fns.prototype.onFetch = function() { var z = this._map.getZoom(); var r = false; var isNotOnPost = this._app_status.isOnPostFlow !== true; if(z <= 13) { //event.stopPropagation(); if(!isNotOnPost) togglePost(); this.showPostDesc(anzenmap_cnsts.POST_FLOW.TOO_HIGH_SCALE); this._app_status.isDirty = ZdcEmapSearchShopCancel = true; } else { var mp = this.getCurrentMeterPerPx(); this._app_status.metersPerPx = mp; if(isNotOnPost) { this.showPostDesc(-1); } this._app_status.isDirty = ZdcEmapSearchShopCancel = false; ZdcEmapSearchEventCenterChangeAvailable = isNotOnPost; r = isNotOnPost && ZdcEmapReading === 0; } this.log('zoom', z // , 'ZdcEmapSearchShopCancel', ZdcEmapSearchShopCancel // , 'ZdcEmapSearchEventFlg', ZdcEmapSearchEventFlg , 'ZdcEmapReading', ZdcEmapReading , 'isNotOnPost', isNotOnPost , 'run?', r); if(r) { // this.trackTime(); // this.resetAppStatus(); this.resetDsStatus(); if(this._app_status.isPc) toggleClose(true); } else { var oMarkers = this._markers; for(var i = 0; i < oMarkers.length; i++) { this.reAssignIcon(oMarkers[i]); } } return r; }; anzenmap_fns.prototype.postOnFetch = function(that, ofn) { // that.log('ZdcEmapSearchShopCancel', ZdcEmapSearchShopCancel // , 'ZdcEmapSearchEventFlg', ZdcEmapSearchEventFlg // , 'ZdcEmapSearchEventCenterChangeAvailable', ZdcEmapSearchEventCenterChangeAvailable); if(ZdcEmapSearchEventCenterChangeAvailable === false) { if(this !== window) that.showPostDesc(this._app_status.postFlowStep); } }; anzenmap_fns.prototype.getLegacyMarkers = function() { return (typeof ZdcEmapListMarkers === 'undefined' ? ZdcEmapMapShopMrkId : ZdcEmapListMarkers) .filter(function(e){ return e && e.hasOwnProperty('id'); }); }; anzenmap_fns.prototype.onFetched = function(that, ofn, oRslt) { that.trackTime(true); var oms = that.getLegacyMarkers(); if(that.isSkip()) { that.log('skip', that._markers.length, oms.length); return; } var rslt = oRslt[0]; var result = rslt.items; if(that.hasMoreDs(result)) { that.log('wait other data', that._markers.length, result.length, oms.length); return; } that.stopBubble(); result = that._markers; rslt.hitCount = result.length; rslt.recCount = result.length; rslt.items = result; // re-create markers var tmp = ofn.apply(null, [rslt]); that.log('wait until re-create markers', result.length, '<-', oms.length); var merged = false; var refId = setInterval(function(){ var finished = that._app_status.fetchByOwnFnFinished; var ioms = that.getLegacyMarkers(); if(finished && rslt.recCount == ioms.length) { clearInterval(refId); that.log('re-create markers finished', result.length, ioms.length, that._app_status.fetchByOwnFnResult); result = result.concat(that._app_status.fetchByOwnFnResult); that._app_status.fetchByOwnFnResult = []; merged = true; } }, 1 * 300); var timeout = false; var failoverId = setTimeout(function(){ if(refId) clearInterval(refId); clearTimeout(failoverId); that.log('timeout', result.length , oms.length , that._app_status.fetchByOwnFnFinished , that._app_status.fetchByOwnFnResult); if(oms > result) { result = oms.concat(that._app_status.fetchByOwnFnResult); that._app_status.ds = 2; merged = true; } else timeout = true; }, 15 * 1000); var channel = setInterval(function(){ if(merged || timeout) { clearInterval(channel); if(refId) clearInterval(refId); if(failoverId) clearTimeout(failoverId); try { if(!timeout) that.onMerged(result); } catch(error) { that.log('onMerged failed', error); } that.resetDsStatus(); } }, 1 * 500); }; anzenmap_fns.prototype.getMeterRadius = function() { var pnt = this._map.getCenter(); var r = Math.round(distanceBetweenPoints(pnt, this._map.getBounds().getNorthEast())); // maximum 10000; r = (r > 10000 ? 10000 : r); return r; }; anzenmap_fns.prototype.fetchByOwnFn = function() { // load school data var that = this; var tidx = that.trackTime(); var pnt = this._map.getCenter(); ZDC.Search.getPoiByLatLon({genrecode:'0025000160' , latlon: new ZDC.LatLon(pnt.lat(), pnt.lng()) , datum: 'WGS84' , limit:'100' , radius: that.getMeterRadius()} , function(status, datas) { if(status.code == '000') // result = result.concat(datas.item); that._app_status.fetchByOwnFnResult = datas.item; else that.log('fetch school failed', status, datas); // merged = true; that._app_status.fetchByOwnFnFinished = true; // clearInterval(refId); that.trackTime(true, tidx, 'school fetched : ' + that._app_status.fetchByOwnFnResult.length); }); }; anzenmap_fns.prototype.merge = function(o1, o2) { var obj3 = {}; for (var attrname in o1) { obj3[attrname] = o1[attrname]; } for (var attrname in o2) { obj3[attrname] = o2[attrname]; } return obj3; }; anzenmap_fns.prototype.createPoint = function(latlng) { return new google.maps.LatLng(latlng.lat, latlng.lon); }; anzenmap_fns.prototype.createMarker = function(opts) { var dopt = {map: this._map, draggable: false, optimized: false}; var o = this.merge(dopt, opts); return new google.maps.Marker(o); }; anzenmap_fns.prototype.typeToMarkerIcon = function(type) { var url = this.resourcePath('/images/common/icon-map' + type + '.png?v=20241119'); var mp = this._app_status.metersPerPx; // origin image size var op = (parseInt(type) > 4 && parseInt(type) < 10 ? [38, 38] : [38, 50]); // scaled size var sp = ((op[0] / mp) > op[0] ? op : [(op[0] / mp), (op[1] / mp)]); var o = {url: url // , size: new google.maps.Size(op[0], op[1]) , scaledSize: new google.maps.Size(sp[0], sp[1]) // , origin: new google.maps.Point(0,0) }; // when 1m+, anchor location should be mp (calc offset based on the origin) // if(mp >= 1) // { // var x = (op[0] - sp[0]) / 2; // var y = (op[1] - sp[1]) / 2; // o.anchor = new google.maps.Point(x - mp, y - mp); // } /* パッケージ仕様 : not work; var o = new google.maps.MarkerImage( url, new google.maps.Size(sp[0], sp[1]), new google.maps.Point(0, 0), new google.maps.Point(0, 0)); */ return o; }; anzenmap_fns.prototype.reAssignIcon = function(marker) { if(marker.hasOwnProperty('col_32') && marker.hasOwnProperty('col_01')) { var type = null; var name = marker.name; if(name == '事故多発エリア') { // 拠点データ : cid->itarda var dcnt = marker.col_32; type = anzenmap_cnsts.MARKER_TYPE.DEAD_3; if(dcnt == '0') type = anzenmap_cnsts.MARKER_TYPE.DEAD_0; else if(dcnt == '1') type = anzenmap_cnsts.MARKER_TYPE.DEAD_1; else if(dcnt == '2') type = anzenmap_cnsts.MARKER_TYPE.DEAD_2; marker.cid = 'ITARDA' + (this._app_status.isDebug ? 'test' : ''); } else { // 投稿データ : cid->anzenmap // re-assign values var s = marker.col_02; marker.addr = s; marker.col_02 = marker.col_01; // ignore not critical properties and right disp_num; var t = marker.col_03; if(t == '1') type = anzenmap_cnsts.MARKER_TYPE.BLURVIEW; else if(t == '2') type = anzenmap_cnsts.MARKER_TYPE.ACC_STREET; else if(t == '3') type = anzenmap_cnsts.MARKER_TYPE.OTHER; else if(t == '4') type = anzenmap_cnsts.MARKER_TYPE.CHILD; marker.cid = 'anzenmap' + (this._app_status.isDebug ? 'test' : ''); } if(type !== null) marker.marker.setIcon(this.typeToMarkerIcon(type)); } else if(marker.hasOwnProperty('data')) marker.marker.setIcon(this.typeToMarkerIcon(anzenmap_cnsts.MARKER_TYPE.SCHOOL)); }; anzenmap_fns.prototype.onMerged = function(oResult) { if(this.isDirty()) { this.resetAppStatus(); return; } var oMarkers = this.getLegacyMarkers(); var tidx = this.trackTime(); for(var i = 0; i < oMarkers.length; i++) { // swap to own identifier; //ZdcEmapListMarkers[i].marker.data.id = result[i].id; // when pc, init empty list if(typeof oMarkers[i] === 'undefined' || oMarkers[i] === null) break; oResult[i].marker = (oMarkers[i].hasOwnProperty('marker') ? oMarkers[i].marker : oMarkers[i]); oResult[i].idx = i; this.reAssignIcon(oResult[i]); } var result = oResult.slice(oMarkers.length); // this.log('sliced', result.length, oMarkers.length); /* school {poi: {addressText, latlon {lat, lon}, text */ var that = this; for(i = 0; i < result.length; i++) { var item = result[i]; var o = {position: this.createPoint(item.poi.latlon), data: item.poi}; var m = this.createMarker(o); var idx = this._markers.length; m.setIcon(this.typeToMarkerIcon(anzenmap_cnsts.MARKER_TYPE.SCHOOL)); m.addListener('click', that.onMarkerClick.bind(this).anzenmap_partial(idx)); o.marker = m; o.idx = idx; o.cid = 'ITARDA' + (this._app_status.isDebug ? 'test' : ''); this._markers.push(o); } // set this._markers = ZdcEmapListMarkers; // update status this.trackTime(true, tidx, 're-assign itarda,anzenmap,school data marker icon'); this.log('merged data', that._markers); }; anzenmap_fns.prototype.getOverlappedMarkers = function(marker) { // get zoom level; marker bounds(lat,lon,w,h); var zl = this._map.getZoom(); var hr = 60; // change overlap scale if(zl <= 7) hr = 25000; else if(zl == 8) hr = 10000; else if(zl == 9) hr = 5000; else if(zl == 10) hr = 2500; else if(zl == 11) hr = 1000; else if(zl == 12) hr = 500; else if(zl == 13) hr = 400; else if(zl == 14) hr = 250; else if(zl == 15) hr = 100; else if(zl == 16) hr = 50; else if(zl == 17) hr = 20; else if(zl >= 18) hr = 10; var that = this; var overlapped = this._markers.filter(function(m){ var d = distanceBetweenPoints(m.marker.getPosition(), marker.marker.getPosition()); //that.log('distance', d); return d <= hr; }); return overlapped; }; anzenmap_fns.prototype.getDetailType = function(marker, overlapped) { if(overlapped && overlapped.length > 1) return anzenmap_cnsts.MARKER_TYPE.OVERLAP; var icon = marker.marker.getIcon().url; // icon to type var m = /icon-map(\d+).png/.exec(icon); //return anzenmap_cnsts.MARKER_TYPE.anzenmap_getKeyByValue(m); return m ? m[1] : anzenmap_cnsts.MARKER_TYPE.OTHER; }; anzenmap_fns.prototype.getDetailDesc = function(type) { var dk = 'EMPTY'; for(var p in anzenmap_cnsts.MARKER_TYPE) { if(anzenmap_cnsts.MARKER_TYPE[p] == type) { dk = p; break; } } return anzenmap_cnsts.MARKER_DESC[dk]; }; anzenmap_fns.prototype.getDetailPage = function(type) { var page = this.resourcePath('/marker-detail-'); switch(type) { case anzenmap_cnsts.MARKER_TYPE.BLURVIEW : case anzenmap_cnsts.MARKER_TYPE.ACC_STREET : case anzenmap_cnsts.MARKER_TYPE.CHILD : case anzenmap_cnsts.MARKER_TYPE.OTHER : page += 'report'; break; case anzenmap_cnsts.MARKER_TYPE.JUST_VIEW : page += 'other'; break; case anzenmap_cnsts.MARKER_TYPE.SCHOOL : page += 'school'; break; case anzenmap_cnsts.MARKER_TYPE.EMPTY : page += 'post'; break; case anzenmap_cnsts.MARKER_TYPE.OVERLAP : page += 'overlap'; break; default : page += 'accident'; break; } return page + '.html'; }; anzenmap_fns.prototype.loadDetail = function(page) { var that = this; var r = /(images\/[a-z]+\/{0,2}[a-z0-9\-_]+.(png|jpg|gif))/g; var cb = function(html, status){ // set contents in callback html = html.replace(r, function(m, capture, offset, str){ return that.resourcePath(capture); }); that.log('load html', html, status); if(isInfoWindowOpen(that._info)){ that._info.close(); that._info.setContent(html); that._info.open(that._map, null); }else{ that._info.setContent(html); that._info.open(that._map, null); } }; //ZdcEmapHttpRequestHtml('shop_msg.htm', cb); // shared file must exists $.ajax({url: page, success: cb}); }; function isInfoWindowOpen(infoWindow){ var map = infoWindow.getMap(); return (map !== null && typeof map !== "undefined"); } anzenmap_fns.prototype.onMapClick = function(point) { var onModal = this._app_status.isOpenedModal; if(onModal) return; this.log('map click', point); var type = (this._app_status.isOnPostFlow ? anzenmap_cnsts.MARKER_TYPE.EMPTY : anzenmap_cnsts.MARKER_TYPE.JUST_VIEW); var step = anzenmap_cnsts.POST_FLOW.CONFIRM_PNT; // update status if(this._app_status.postFlowStep > anzenmap_cnsts.POST_FLOW.START) { // block event; return; this.resetPost(); this._app_status.isOnPostFlow = true; step = anzenmap_cnsts.POST_FLOW.START; } this._app_status.detailType = type; this._app_status.currentMarker = point; // post : load page when user clicked confirm if(this._app_status.isOnPostFlow) { this.postFlow(step); } else { var page = this.getDetailPage(type); // show infobox this.loadDetail(page); } }; anzenmap_fns.prototype.onMarkerClick = function(markerId, ignoreOverlap, forceType, forceEvt) { if(this._app_status.isOnPostFlow && forceEvt !== anzenmap_cnsts.POST_FLOW.LOAD_PAGE) return; // get marker by id from global collection; var marker = this._markers[markerId]; // check overlap var overlapped = (ignoreOverlap ? null : this.getOverlappedMarkers(marker)); // get icon; extract type; var type = forceType || this.getDetailType(marker, overlapped); var page = this.getDetailPage(type); this.log('marker click', marker, overlapped, type, page); // update status this._app_status.detailType = type; this._app_status.currentMarker = marker; this._app_status.overlapped = overlapped; // from map click, reset histories if(arguments.length === 1) this.clearHistories(); this.addHistory(arguments); // load html this.loadDetail(page); }; anzenmap_fns.prototype.putLog = function() { var m = this._app_status.currentMarker; if(!m.hasOwnProperty('name')) return; var key = this._app_status.postKey || ''; var cid = m.cid; var kid = m.id || ''; var type = (this._app_status.isPc ? '1' : '5'); var opt = cid; var ep = '/cgi/kyotenid.cgi?key=' + key + '&cid=' + cid + '&kid=' + kid + '&type=' + type + '&opt=' + opt; var that = this; $.ajax({url: ep, success: that.log.bind(this)}); }; anzenmap_fns.prototype.onPreparedDetail = function() { if(this._app_status.isPc) { toggleClose(); } this.putLog(); // mod 2024/05/09 R.Sugita var type = this._app_status.detailType; switch(type) { case anzenmap_cnsts.MARKER_TYPE.BLURVIEW : case anzenmap_cnsts.MARKER_TYPE.ACC_STREET : case anzenmap_cnsts.MARKER_TYPE.CHILD : case anzenmap_cnsts.MARKER_TYPE.OTHER : this.onReport(); break; case anzenmap_cnsts.MARKER_TYPE.JUST_VIEW: this.onOther(); break; case anzenmap_cnsts.MARKER_TYPE.SCHOOL: this.onSchool(); break; case anzenmap_cnsts.MARKER_TYPE.EMPTY: this.postFlow(anzenmap_cnsts.POST_FLOW.WAIT_USER_ACTION); break; case anzenmap_cnsts.MARKER_TYPE.OVERLAP: this.onOverlap(); default: this.onAccident(); break; } var close = $('.btn-close'); if(close.length > 0) { var that = this; //close.click(function(e){ close.on('click',function(e){ // mod 2023/06/05 M.date e.stopPropagation(); that.onCloseInfoWindow(); return false; }); } var back = $('.btn-go-back'); if(back.length > 0) { var that = this; back.on('click',function(e){ // mod 2023/06/05 M.date e.stopPropagation(); that.goBack(); return false; }); } }; anzenmap_fns.prototype.onCloseInfoWindow = function() { if(this._app_status.isOnPostFlow) { this.resetPost(); togglePost(); } else this.closeInfo(); }; anzenmap_fns.prototype.pointToAddr = function(pnt, el) { var m = this._app_status.currentMarker; if(m.hasOwnProperty('addr')) { el.text(m.addr); } else if(m.hasOwnProperty('data')) { el.text(m.data.text); } else { var gs = new google.maps.Geocoder(); var that = this; gs.geocode({location: pnt}, function(r, s){ if(s == google.maps.GeocoderStatus.OK) { // that.log('geocode result', r); var as = null; var c = []; // https://developers.google.com/maps/documentation/geocoding/intro#Types var mls = ['street_address' , 'sublocality_level_4' , 'administrative_area_level_4' // failover , 'premise' , 'sublocality_level_3' , 'administrative_area_level_3' , 'sublocality', 'locality' ]; do { var ml = mls.shift(); c = r.filter(function(o){ return o.types.indexOf(ml) !== -1; }); } while(c.length == 0 && mls.length > 0); c = c.shift(); if(that._app_status.isOnPostFlow && typeof c !== 'undefined') { var m = that._app_status.currentMarker; m.postal = c.address_components.pop().long_name; as = c.address_components.reverse().reduce(function(acc, ao){ if(ao.types.indexOf('postal_code') !== -1 || ao.types.indexOf('country') !== -1) return acc; else return acc + ao.long_name; }, ''); m.addr = removeUnnecessary(as); } else if(that._app_status.isOnPostFlow) that.postFlow(anzenmap_cnsts.POST_FLOW.RESTART); else as = removeUnnecessary(c.formatted_address); if(el.length === 0) el = $(el.selector); el.text(as); } else { that.log('failed find addr', pnt); if(that._app_status.isOnPostFlow) that.postFlow(anzenmap_cnsts.POST_FLOW.RESTART); } }); } }; anzenmap_fns.prototype.pointToStreetView = function(pnt, el) { var cw = $('.detail-pane').width() || ZdcEmapWindowWidth; el.css({width: cw - 40, height: cw - 140}); var ss = new google.maps.StreetViewService(); var sp = new google.maps.StreetViewPanorama(el[0] , {linksControl: false, scrollwheel: false , clickToGo: false, fullscreenControl: false , motionTracking: false, panControl: true , addressControl: false, zoomControl: false}); // ss.getPanoramaByLocation(pnt, 50, function(d, s){ ss.getPanorama({location: pnt, source: google.maps.StreetViewSource.OUTDOOR , preference: google.maps.StreetViewPreference.NEAREST , radius: 20} , function(d, s){ if(s == 'OK') { sp.setPano(d.location.pano); sp.setVisible(true); } else { if(el.children().last()[0].nodeName != 'IMG') { el.children().last().remove(); el.css({height: ''}); } } }); }; anzenmap_fns.prototype.onReport = function() { var marker = this._app_status.currentMarker; var ct = this._app_status.detailType; var t = $('.title-yellow'); var a = $('.marker-detail-address'); var s = $('.marker-detail-image'); var c = $('.marker-detail-comment'); t.text(this.getDetailDesc(ct)); a.text(removeUnnecessary(marker.addr)); c.text(marker.col_04.replace(/\[br\]/g, '\r\n')); this.pointToStreetView(marker.marker.getPosition(), s); }; anzenmap_fns.prototype.onOther = function() { var a = $('.marker-detail-address'); var s = $('.marker-detail-image'); var m = this._app_status.currentMarker; var point = m.latLng || m.marker.getPosition(); this.pointToAddr(point, a); this.pointToStreetView(point, s); }; anzenmap_fns.prototype.onSchool = function() { var t = $('.title-yellow'); var a = $('.marker-detail-address'); var s = $('.marker-detail-image'); var m = this._app_status.currentMarker; var point = m.latLng || m.marker.getPosition(); t.text(m.data.text); a.text(removeUnnecessary(m.data.addressText)); this.pointToStreetView(point, s); }; anzenmap_fns.prototype.onOverlap = function() { var overlapped = this._app_status.overlapped; var isPc = $('ul.map-icon-list').length > 0; var target = $((isPc ? 'ul.map-icon-list' : 'ul.candidacy-list')); var that = this; var html = ''; html = overlapped.reduce(function(h, o){ var t = that.getDetailType(o); var l = (t == anzenmap_cnsts.MARKER_TYPE.SCHOOL ? o.data.text : that.getDetailDesc(t)); var spc = (t == anzenmap_cnsts.MARKER_TYPE.DEAD_0 ? 'icon-area-04' : (t == anzenmap_cnsts.MARKER_TYPE.DEAD_1 ? 'icon-area-03' : (t == anzenmap_cnsts.MARKER_TYPE.DEAD_2 ? 'icon-area-02' : (t == anzenmap_cnsts.MARKER_TYPE.DEAD_3 ? 'icon-area-01' : 'icon-pin' + t)))); var a = o['addr'] || o.data.addressText; // school a = removeUnnecessary(a); var e = 'javascript:window.anzenmap_mgr.onMarkerClick(' + o.idx + ', true);'; var i = that.resourcePath('/images/common/icon-map' + t + '.png?v=20241119'); var c = (isPc ? '
' + l + '