var LDMapRouteCtl=function(mm,locInfo){this.mm=mm;this.locInfo=locInfo;this.init();};LDMapRouteCtl.prototype=$.extend({},LDMapBase.prototype,{init:function(){this.cm=new LDMapRouteCtl.CoordManager(this.mm,this.locInfo,this);this.sm=new LDMapRouteCtl.SettingManager();this.route=new LDMapRouteCtl.Route(this.mm,this.cm,this.sm);this.taxi=new LDMapRouteCtl.Taxi(this.mm,this.cm,this.sm);},draw:function(tab){if(this[tab])this[tab].draw();},destroy:function(){this.taxi.destroy();this.route.destroy();this.sm.destroy();this.cm.destroy();}});LDMapRouteCtl.SettingManager=function(){this.init();};LDMapRouteCtl.SettingManager.prototype=$.extend({},LDMapBase.prototype,{config:{types:['toll','priority','straight'],defaultSettings:[1,1,1]},domEl:{module:$("#routeAdvModule")},init:function(){var self=this;this.values={};var params=this.getUrlParam("settings")||this.getCookie("__rsettings");if(params){var res=params.split(/(?:,|%2C)/i);var len=this.config.types.length;for(var i=0;i<len&&res.length;i++){var val=res.shift();if(val.length)this.values[this.config.types[i]]=val;}this.saveSettings();}else{this.initSettings();}var openStatus;var pOpenStatus=this.getUrlParam("open");if(pOpenStatus.length)openStatus=parseInt(pOpenStatus)||0;else{var cOpenStatus=this.getCookie("__ropen");if(cOpenStatus.length)openStatus=parseInt(cOpenStatus)||0;}this.openStatus=openStatus?true:false;this.module=this.domEl.module.children();this.module.children().find("input").each(function(i){var el=$(this);var name=el.attr("name");var value=el.val();if(/^checkbox$/.test(el.attr("type"))){el.click(function(){if($(this).attr("checked"))self.values[name]=value;else self.values[name]=0;self.saveSettings();});}else if(/^radio$/.test(el.attr("type"))){el.click(function(){self.values[name]=value;self.saveSettings();});}});var settingModule=this.module.children(".routeSettings:first");settingModule.click(function(){self.toggleNext($(this));});if(this.openStatus)this.toggleNext(settingModule);},initSettings:function(){var len=this.config.types.length;for(var i=0;i<len;i++){if(this.config.defaultSettings[i])this.values[this.config.types[i]]=this.config.defaultSettings[i];else this.values[this.config.types[i]]=0;}},reset:function(){var self=this;this.initSettings();this.module.find("input").each(function(i){var el=$(this);var name=el.attr("name");var value=el.val();if(self.values[name]!=undefined&&self.values[name]==value)el.attr("checked",true);else el.attr("checked",false);});this.removeSettings();},toggleNext:function(el){if(el.hasClass("on")){el.removeClass("on");this.openStatus=false;this.removeCookie("__ropen","/map");}else{el.addClass("on");this.openStatus=true;this.setCookie("__ropen",1,1,"/map");}el.next("div").children().toggle();},getModule:function(){return this.module;},setFormValues:function(){var self=this;this.module.children().find("input").each(function(i){var el=$(this);var name=el.attr("name");var value=el.val();if(self.values[name]!=undefined&&self.values[name]==value){el.attr("checked",true);}});},getSettingStr:function(){var types=this.config.types;var len=types.length;var settings=[];for(var i=0;i<len;i++){var type=types[i];settings.push(this.values[type]!=undefined?this.values[type]:"");}return settings.join(",");},getOpenStatusStr:function(){return this.openStatus?1:0;},showTollSetting:function(cond){var tollSection=this.module.children(".routeSettings:first").next("div").children(".selection:first").find(".toll:first");if(cond&&/^none$/.test(tollSection.css("display"))){tollSection.show();}else if(!cond&&!/^none$/.test(tollSection.css("display"))){tollSection.hide();}},saveSettings:function(){var len=this.config.types.length;var values=[];for(var i=0;i<len;i++){var value=this.values[this.config.types[i]];values.push(value?value:0);}this.setCookie("__rsettings",values.join(","),1,"/map");},removeSettings:function(){this.removeCookie("__rsettings","/map");this.removeCookie("__ropen","/map");},destroy:function(){this.module.empty();}});LDMapRouteCtl.CoordManager=function(mm,locInfo,parent){this.parent=parent;this.mm=mm;this.locInfo=locInfo;this.coords={start:{},goal:{},via:[]};this.init();};LDMapRouteCtl.CoordManager.prototype=$.extend({},LDMapBase.prototype,{config:{maxViaPoints:5},iconProps:{width:30,height:36,aLng:10,aLat:27},iconImages:{start:"/img/map/icons/point_a.png",goal:"/img/map/icons/point_b.png",via:"/img/map/icons/point_yellow.png"},domEl:{module:$("#routeSetModule"),start:{set:$("#routeSetStart"),remove:$("#routeRemoveStart")},goal:{set:$("#routeSetGoal"),remove:$("#routeRemoveGoal")},via:{set:$("#routeSetVia")}},doSearch:function(){return this.__doSearch;},init:function(){var self=this;var mm=self.mm;var domEl=self.domEl;domEl.start.set.click(function(){var c=mm.getCenterLatLng();self.setCoord("start",c.x,c.y);});domEl.start.remove.click(function(){self.removeCoord("start");});domEl.goal.set.click(function(){var c=mm.getCenterLatLng();self.setCoord("goal",c.x,c.y);});domEl.goal.remove.click(function(){self.removeCoord("goal");});domEl.via.set.click(function(){var c=mm.getCenterLatLng();self.setVCoord(c.x,c.y);});self.module=domEl.module.children();this.__doSearch=false;var paramCoords=self.parseLngLat(self.getUrlParam("route"));if(paramCoords.start||paramCoords.goal||paramCoords.via){var sCoord=paramCoords.start;if(sCoord)self.setCoord("start",sCoord.lng,sCoord.lat);var gCoord=paramCoords.goal;if(gCoord)self.setCoord("goal",gCoord.lng,gCoord.lat);var i=0;while(paramCoords.via.length){var vCoord=paramCoords.via.shift();self.setVCoord(vCoord.lng,vCoord.lat);if(++i>=self.config.maxViaPoints)break;}if(sCoord&&gCoord)this.__doSearch=true;return;}var cookieCoords=self.parseLngLat(self.getCookie("__rcoords"));if(cookieCoords.start||cookieCoords.goal||cookieCoords.via){var sCoord=cookieCoords.start;if(sCoord)self.setCoord("start",sCoord.lng,sCoord.lat);var gCoord=cookieCoords.goal;if(gCoord)self.setCoord("goal",gCoord.lng,gCoord.lat);var i=0;while(cookieCoords.via.length){var vCoord=cookieCoords.via.shift();self.setVCoord(vCoord.lng,vCoord.lat);if(++i>=self.config.maxViaPoints)break;}return;}},parseLngLat:function(str){if(!str)return{};var coords={};var entries=str.split(/(?:,|%2C)/);var sCoord=entries.shift().split("_");if(sCoord.length==2&&this.isFloat(sCoord[0])&&this.isFloat(sCoord[1]))coords.start={lng:sCoord[0],lat:sCoord[1]};var gCoord=entries.pop().split("_");if(gCoord.length==2&&this.isFloat(gCoord[0])&&this.isFloat(gCoord[1]))coords.goal={lng:gCoord[0],lat:gCoord[1]};var len=entries.length;var vCoords=[];while(len--){var entry=entries.shift().split("_");if(entry.length==2&&this.isFloat(entry[0])&&this.isFloat(entry[1]))vCoords.push({lng:entry[0],lat:entry[1]});}coords.via=vCoords;return coords;},setCoord:function(type,lng,lat){var self=this;if(self.coords[type].marker)self.mm.removeOverlay(self.coords[type].marker);var setEl=self.domEl[type].set;setEl.prev(".address").html("住所を取得しています...");self.coords[type].lng=lng;self.coords[type].lat=lat;var iconProps=self.iconProps;iconProps.image=self.iconImages[type];self.coords[type].marker=self.addMarker(new MPoint(lng,lat),self.genMIcon(iconProps));self.saveCoords();self.domEl[type].remove.show();self.setLocAddress(lng,lat,setEl.prev(".address"));},removeCoord:function(type){var coord=this.coords[type];if(coord.marker)this.mm.removeOverlay(coord.marker);this.coords[type]={};this.saveCoords();this.domEl[type].remove.hide();var setEl=this.domEl[type].set;setEl.prev(".address").html("&lt;未設定&gt;");},addMarker:function(mpoint,micon){var mMarker=new MMarker(mpoint,micon);this.mm.addOverlay(mMarker);return mMarker;},setVCoord:function(lng,lat){var self=this;var id=self.genId();var iconProps=self.iconProps;iconProps.image=self.iconImages.via;var rowEl=$(document.createElement("li")).attr("id",id);var addrEl=$(document.createElement("span")).html("住所を取得しています...");var setEl=$(document.createElement("a")).attr("href","javascript:void(0);").attr("class","set").html("中心地点をこの経由地に設定").click(function(){var id=$(this).parent().attr("id");var len=self.coords.via.length;for(var i=0;i<len;i++){var vCoord=self.coords.via[i];if(vCoord.id==id){self.mm.removeOverlay(vCoord.marker);var c=self.mm.getCenterLatLng();var marker=self.addMarker(new MPoint(c.x,c.y),self.genMIcon(iconProps));self.coords.via[i]={id:id,lng:c.x,lat:c.y,marker:marker};self.saveCoords();self.setLocAddress(c.x,c.y,addrEl);break;}}});var rmEl=$(document.createElement("a")).attr("href","javascript:void(0);").attr("class","remove").html("削除").click(function(){self.removeVCoord($(this).parent().attr("id"));self.toggleViaLink();self.saveCoords();return false;});self.module.children(".via").children().append(rowEl.append(addrEl).append(setEl).append(rmEl));var marker=self.addMarker(new MPoint(lng,lat),self.genMIcon(iconProps));self.coords.via.push({id:id,lng:lng,lat:lat,marker:marker});self.toggleViaLink();self.saveCoords();self.setLocAddress(lng,lat,addrEl);if(self.module.children(".via").css("display")=="none")self.module.children(".via").show();},setLocAddress:function(lng,lat,targetEl){var setAddress=function(address){targetEl.html(address?address:"不明な場所");};this.locInfo.getLocAddress(lng,lat,setAddress);},removeVCoord:function(id){var len=this.coords.via.length;for(var i=0;i<len;i++){if(this.coords.via[i].id==id){this.mm.removeOverlay(this.coords.via[i].marker);this.coords.via.splice(i,1);break;}}this.module.children(".via").children().children("#"+id).remove();if(!this.coords.via.length)this.module.children(".via").hide();},toggleViaLink:function(){if(this.coords.via.length>=this.config.maxViaPoints)this.domEl.via.set.parent().hide();else this.domEl.via.set.parent().show();},genId:function(){return["id",Math.floor(Math.random()*999999).toString(16)].join("-");},getModule:function(){return this.module;},isFloat:function(num){if(!num)return false;return/^\d+(?:\.\d+)?$/.test(num)?true:false;},hasAllCoords:function(){var sCoord=this.coords.start;var gCoord=this.coords.goal;return this.isFloat(sCoord.lng)&&this.isFloat(sCoord.lat)&&this.isFloat(gCoord.lng)&&this.isFloat(gCoord.lat)?true:false;},saveCoords:function(){var sCoord=this.coords.start;var gCoord=this.coords.goal;var vCoords=this.coords.via;var coords=[];coords.push([sCoord.lng,sCoord.lat].join("_"));var len=vCoords.length;for(var i=0;i<len;i++)coords.push([vCoords[i].lng,vCoords[i].lat].join("_"));coords.push([gCoord.lng,gCoord.lat].join("_"));this.setCookie("__rcoords",coords.join(","),1,"/map");},reset:function(){this.removeCoord("start");this.removeCoord("goal");var len=this.coords.via.length;while(len--){var vCoord=this.coords.via.pop();this.mm.removeOverlay(vCoord.marker);this.module.children(".via").children().children("#"+vCoord.id).remove();}this.module.children(".via").hide();this.toggleViaLink();this.saveCoords();},getCoordStr:function(){function joinLonLat(co){return[co.lng,co.lat].join("_");}var vCoords=this.coords.via;var coords=[];coords.push(joinLonLat(this.coords.start));var len=vCoords.length;for(var i=0;i<len;i++)coords.push(joinLonLat(vCoords[i]));coords.push(joinLonLat(this.coords.goal));return coords.join(",");},destroy:function(){this.domEl.module.empty();}});LDMapRouteCtl.Base=function(){};LDMapRouteCtl.Base.prototype=$.extend({},LDMapBase.prototype,{init:function(){var self=this;this.component=this.domEl.component;this.advComponent=this.domEl.advComponent;this.routeSegments=[];var searchBtn=this.domEl.searchBtn;var resetBtn=this.domEl.resetBtn;var errorMsg=this.domEl.errorMsg;var msgStatus=0;searchBtn.bind("click",function(){if(!self.cm.hasAllCoords()){if(msgStatus)return;msgStatus=1;errorMsg.html("出発地・目的地を設定してください").slideDown();function slideUp(){msgStatus=0;errorMsg.slideUp("slow");}setTimeout(slideUp,3000);return false;}self.submit();});resetBtn.bind("click",function(){self.removeLine();self.cm.reset();self.sm.reset();self.resetSummary();});},draw:function(){if(this.hideTollSetting())this.sm.showTollSetting(false);else this.sm.showTollSetting(true);;this.domEl.errorMsg.hide();this.component.append(this.cm.getModule());this.advComponent.append(this.sm.getModule());this.sm.setFormValues();},makeParams:function(){var mm=this.mm;var c=mm.getCenterLatLng();return{route:this.cm.getCoordStr(),settings:this.sm.getSettingStr(),open:this.sm.getOpenStatusStr(),zoom:mm.getZoomLevel(),lng:c.x,lat:c.y};},params2Query:function(params){var query=[];for(var k in params)query.push([k,encodeURIComponent(params[k])].join("="));return query.join("&");},doSearch:function(type){type=type=="walk"?"walk":"car";var query=["type="+type,"route="+encodeURIComponent(this.cm.getCoordStr()),"settings="+encodeURIComponent(this.sm.getSettingStr())];var reqUrl=[this.getUrl("/api/route/"),query.join("&")].join("?");this.summaryReady();var self=this;$.getJSON(reqUrl,function(data){if(!data.route||!data.route.points.length){self.summaryFail();return;}self.processRoute(data.route);self.processSummary(data);});},processRoute:function(route){var mm=this.mm;if(route.zoom&&route.center_lng&&route.center_lat){mm.centerAndZoom(new MPoint(route.center_lng,route.center_lat),route.zoom);}if(route.points&&route.points.length){var numSeg=route.points.length;for(var i=0;i<numSeg;i++){var segment=route.points.shift();var numPoi=segment.length;var mPoints=[];for(var j=0;j<numPoi;j++){var poi=segment.shift().split(";");mPoints.push(new MPoint(poi[1],poi[0]));}this.routeSegments.push(mPoints);}this.drawLine();}},drawLine:function(){this.polylines=[];var numSeg=this.routeSegments.length;for(var i=0;i<numSeg;i++){var points=this.routeSegments.shift();var pline=new MPolyline(points,"#ff0000",3,0.8);pline.enableClipping();this.mm.addOverlay(pline);this.polylines.push(pline);}},removeLine:function(){if(this.polylines){var plen=this.polylines.length;for(var i=0;i<plen;i++){this.mm.removeOverlay(this.polylines.pop());}this.polylines=null;}},summaryReady:function(){var pane=this.domEl.summary;pane.empty();pane.html("<p>検索しています...</p>");},resetSummary:function(){var pane=this.domEl.summary;pane.slideUp();},travelTMStr:function(d,s){var hrs=parseInt(Math.floor(d/s));var min=parseInt(Math.floor((d/s-hrs)*60));if(hrs)return["約",hrs,"時間",min,"分"].join("");else if(min)return["約",min,"分"].join("");else return"1分以内";},destroy:function(){this.removeLine();this.resetSummary();this.domEl.summary.empty();this.domEl.searchBtn.unbind();this.domEl.resetBtn.unbind();this.domEl.errorMsg.unbind();}});LDMapRouteCtl.Route=function(mm,cm,sm){this.mm=mm;this.cm=cm;this.sm=sm;this.init();this.initRoute();};LDMapRouteCtl.Route.prototype=$.extend({},LDMapRouteCtl.Base.prototype,{config:{defaultType:"car"},domEl:{component:$("#routeSetForm"),advComponent:$("#routeSetAdv"),searchBtn:$("#routeSearch"),resetBtn:$("#routeReset"),errorMsg:$("#module_route > .inner > .errorMsg"),routeTypes:$("#routeTypes > li"),summary:$("#routeSummary"),summaryTmpl:$("#routeSummaryTmpl")},initRoute:function(){var self=this;this.typeEl=this.domEl.routeTypes;this.typeEl.each(function(i){$(this).click(function(){self.selectType($(this).attr("class"));});});var type=this.getUrlParam("type");if(/^walk$/.test(type))this.selectType("walk");else this.selectType(this.config.defaultType);if(this.cm.doSearch()&&/^route$/.test(this.getUrlParam("tab"))&&/^(?:walk|car)$/.test(type))this.doSearch(type);},selectType:function(type){this.selectedType=type;if(/^walk$/.test(type))this.sm.showTollSetting(false);else this.sm.showTollSetting(true);this.typeEl.each(function(i){var el=$(this);if(el.attr("class")==type)el.children().addClass("on");else el.children().removeClass("on");});},hideTollSetting:function(){return/^walk$/.test(this.selectedType)?true:false;},submit:function(){var params=this.makeParams();params.tab="route";params.type=this.selectedType;var url=[this.getUrl("/map/"),this.params2Query(params)].join("?");window.location=url;},summaryFail:function(){var pane=this.domEl.summary;pane.empty();pane.html("<p>ルートを見つけられませんでした</p>");},processSummary:function(data){if(!data.route.points){this.summaryFail();return;}var toggleNext=function(){var el=$(this);if(el.hasClass("on"))el.removeClass("on");else el.addClass("on");el.next("div").toggle();};var self=this;var dist_m=parseInt(data.route.distance_meter);var dist_km=dist_m/1000;var dist_str=dist_m>1000?[dist_km,"km"].join(""):[dist_m,"m"].join("");var pane=this.domEl.summary;var tmpl=this.domEl.summaryTmpl;var distEl=tmpl.children(".distance");distEl.next("div").html(["約",dist_str].join(""));distEl.click(toggleNext);var timeEl=tmpl.children(".time");timeEl.next("div").html(["<ul>","<li>",["徒歩(3km/h)で",this.travelTMStr(dist_km,3)].join(" "),"</li>","<li>",["自転車(15km/h)で",this.travelTMStr(dist_km,15)].join(" "),"</li>","<li>",["クルマ(40km/h)で",this.travelTMStr(dist_km,40)].join(" "),"</li>","<li>",["クルマ(80km/h)で",this.travelTMStr(dist_km,80)].join(" "),"</li>","</ul>"].join(""));timeEl.click(toggleNext);pane.empty();pane.hide();pane.append(tmpl.children());pane.slideDown();}});LDMapRouteCtl.Taxi=function(mm,cm,sm){this.mm=mm;this.cm=cm;this.sm=sm;this.init();this.initTaxi();};LDMapRouteCtl.Taxi.prototype=$.extend({},LDMapRouteCtl.Base.prototype,{domEl:{component:$("#taxiSetForm"),advComponent:$("#taxiSetAdv"),searchBtn:$("#taxiSearch"),resetBtn:$("#taxiReset"),errorMsg:$("#module_taxi > .inner > .errorMsg"),summary:$("#taxiSummary"),summaryTmpl:$("#taxiSummaryTmpl")},initTaxi:function(){if(this.cm.doSearch()&&/^taxi$/.test(this.getUrlParam("tab")))this.doSearch();},hideTollSetting:function(){return false;},submit:function(){var params=this.makeParams();params.tab="taxi";var url=[this.getUrl("/map/"),this.params2Query(params)].join("?");window.location=url;},summaryFail:function(){var pane=this.domEl.summary;pane.empty();pane.html("<p>運賃を算出できませんでした</p>");},processSummary:function(data){if(!data.route.points||!data.route.points.length||!data.taxi)this.summaryFail();var self=this;var toggleNext=function(){var el=$(this);if(el.hasClass("on"))el.removeClass("on");else el.addClass("on");el.next("div").toggle();};var dist_m=parseInt(data.route.distance_meter);var dist_km=dist_m/1000;var dist_str=dist_m>1000?[dist_km,"km"].join(""):[dist_m,"m"].join("");var pane=this.domEl.summary;var tmpl=this.domEl.summaryTmpl;var distEl=tmpl.children(".distance");distEl.next("div").html(["約",dist_str].join(""));distEl.click(toggleNext);var timeEl=tmpl.children(".time");timeEl.next("div").html(["<ul>","<li>",["20km/hで",this.travelTMStr(dist_km,20)].join(" "),"</li>","<li>",["40km/hで",this.travelTMStr(dist_km,40)].join(" "),"</li>","<li>",["60km/hで",this.travelTMStr(dist_km,60)].join(" "),"</li>","<li>",["80km/hで",this.travelTMStr(dist_km,80)].join(" "),"</li>","</ul>"].join(""));timeEl.click(toggleNext);var taxi=data.taxi;var fareEl=tmpl.children(".fare");fareEl.next("div").html(["<ul>","<li>昼: ",taxi.low.day,"円〜",taxi.high.day,"円</li>","<li>夜: ",taxi.low.night,"円〜",taxi.high.night,"円</li>","</ul>",'<p class="poweredby"><a href="http://www.taxisite.com/" target="_blank"><img src="/img/banner/taxisite.gif" alt="taxisite"></a><br><a href="http://www.taxisite.com/" target="_blank">powered by taxisite</a></p>'].join(""));fareEl.click(toggleNext);pane.empty();pane.hide();pane.append(tmpl.children());pane.slideDown();}});