// Copyright (c) Position s.r.o.
// All rights reserved.

var ngRoutingVer=1,ngRoutingSubVer=0,ngRoutingAPIVersion=ngRoutingVer+"."+ngRoutingSubVer,ngRoutingByID=[],ngRoutingLastID=0,errCalcRoute=-1,errItineraire=-2,rtFastest=0,rtShortest=1,itBasic=0,itDetailed=1;function getRoutingByID(a){if(ngRoutingByID)return ngRoutingByID[a];return null}function rt_Place(a,b){this.descr=a;this.pos=b}function rt_ProcessUrl(a){this.rpc.sendRequest(a)}function rt_BeginUpdate(){this.UpdateCnt++}
function rt_EndUpdate(){this.UpdateCnt--;if(this.UpdateCnt<=0){if(this.Changed){this.OnPlacesChanged&&this.OnPlacesChanged(this);if(this.Calculated&&this.AutoCalc){this.CalcRoute();this.MapNeedUpdate=false}}this.Changed=false;this.MapNeedUpdate&&this.Map&&this.Map.Update();this.MapNeedUpdate=false}}function rt_PlaceIcon(a){if(a){if(a==this.Places.length-1)return this.EndIcon}else return this.StartIcon;return this.ViaIcon}
function rt_PlaceHotSpot(a){if(a){if(a==this.Places.length-1)return this.EndIconHotSpot}else return this.StartIconHotSpot;return this.ViaIconHotSpot}function rt_ClearPlaces(){this.Calculated&&this.ClearResults();this.BeginUpdate();this.Places=[];this.Map&&this.PlacesVisible&&this.Map.RemovePopupIconsByID(this.RoutingID);this.Changed=true;this.EndUpdate()}
function rt_AddPlaceIcon(a){var b=null;if(this.OnDisplayPlace)b=this.OnDisplayPlace(this,a);if(!b){var c=this.PlaceIconID(a);b=this.Map.PopupIcons[c];if(typeof b!="object"||!b)b=this.Map.AddPopupIcon(c,this.PlaceIcon(a),this.Places[a].pos,this.Places[a].descr,this.PlaceHotSpot(a));if(b){b.pos=this.Places[a].pos;b.descr=this.Places[a].descr;b.RoutingID=this.RoutingID;b.RoutingPlaceIdx=a;b.onpopup=this.OnPlacePopupMenu}}return b}
function rt_AddPlace(a,b){this.BeginUpdate();var c=this.Places.length;this.Places[c]=new rt_Place(a,b);this.Changed=true;if(this.Map&&this.PlacesVisible){this.AddPlaceIcon(c);c>1&&this.UpdatePlaceIcon(c-1);this.MapNeedUpdate=true}this.EndUpdate();return c}
function rt_SetPlace(a,b,c){var e=this.Places.length;if(a>=0)if(a<e){if(this.Places[a].descr==b&&this.Places[a].pos==c)return a;this.BeginUpdate();this.Places[a]=new rt_Place(b,c);if(this.Map&&this.PlacesVisible){this.Map.RemovePopupIconByID(this.RoutingID+"_"+a);this.AddPlaceIcon(a);this.MapNeedUpdate=true}this.Changed=true;this.EndUpdate();return a}else return this.AddPlace(b,c);return-1}
function rt_RemovePlace(a){var b=this.Places.length;if(a>=0&&a<b){this.BeginUpdate();for(var c=a+1;c<b;c++)this.Places[c-1]=this.Places[c];this.Places[b-1]=null;this.Places.length=b-1;this.Changed=true;if(this.Map&&this.PlacesVisible){this.Map.RemovePopupIconByID(this.RoutingID+"_"+a);a==0&&this.UpdatePlaceIcon(0);b>2&&a==b-1&&this.UpdatePlaceIcon(b-2)}this.EndUpdate()}}
function rt_ExchangePlaces(a,b){var c=this.Places.length;if(a!=b&&a>=0&&b>=0&&a<c&&b<c){this.BeginUpdate();c=this.Places[a];this.Changed=true;this.Places[a]=this.Places[b];this.Places[b]=c;if(this.Map&&this.PlacesVisible){c=this.RoutingID+"_"+a;var e=this.RoutingID+"_"+b,f=this.Map.PopupIcons[c],d=this.Map.PopupIcons[e];if(typeof f=="object"&&f||typeof d=="object"&&d){var g=document.getElementById(c),h=document.getElementById(e);f=f.screenpos;d=d.screenpos;this.Map.RemovePopupIconByID(c);this.AddPlaceIcon(a);
this.Map.RemovePopupIconByID(e);this.AddPlaceIcon(b);h&&this.Map.DrawPopupIcon(c,d);g&&this.Map.DrawPopupIcon(e,f)}}this.EndUpdate()}}function rt_ReversePlaces(){var a=this.Places.length,b=Math.round(a/2);a--;this.BeginUpdate();for(var c=0;c<b;c++)this.ExchangePlaces(c,a-c);this.EndUpdate()}
function rt_ShowPlaces(){if(!this.PlacesVisible){if(this.Map){this.BeginUpdate();var a;a=this.Places.length;for(var b=0;b<a;b++){this.AddPlaceIcon(b);this.MapNeedUpdate=true}this.EndUpdate()}this.PlacesVisible=true}}function rt_HidePlaces(){if(this.PlacesVisible){this.Map&&this.Places.length>0&&this.Map.RemovePopupIconsByID(this.RoutingID);this.PlacesVisible=false}}
function rt_DisplayPlace(a){if(this.Map&&!this.PlacesVisible&&a>=0&&a<this.Places.length){this.BeginUpdate();this.AddPlaceIcon(a);this.MapNeedUpdate=true;this.EndUpdate()}}function rt_LocatePlace(a,b,c){if(!this.Map||a<0||a>=this.Places.length)return false;this.Map.LocatePopupIcon(this.PlaceIconID(a),b,c)}function rt_LocatePlaces(a){this.Map&&this.Map.LocatePopupIcons(this.RoutingID+"_*",a)}
function rt_UpdatePlaceIcon(a){var b;if(this.Map&&this.PlacesVisible){var c=this.RoutingID+"_"+a;b=this.Map.PopupIcons[c];if(typeof b=="object"&&b){var e=b.screenpos;if(document.getElementById(c)){this.Map.RemovePopupIconByID(c);this.AddPlaceIcon(a);this.Map.DrawPopupIcon(c,e)}else{a=this.PlaceIcon(a);b.icon=ngPreloadedImages[a];if(typeof b.icon!="object")b.icon=ng_PreloadImage(a);b.url=a}}}}function rt_PlaceIconID(a){return this.RoutingID+"_"+a}
function rt_ItemIconID(a){if(a>=0&&a<this.Itineraire.length)if(typeof this.Itineraire[a].PlaceIdx!="undefined"&&this.Itineraire[a].PlaceIdx>=0)return this.PlaceIconID(this.Itineraire[a].PlaceIdx);return this.RoutingID+"_i"+a}function rt_PlaceIdxByIconID(a){if(a.substring(0,this.RoutingID.length)!=this.RoutingID)return-1;a=a.substring(this.RoutingID.length+1,a.length);return parseInt(a)}
function rt_ItemIdxByIconID(a){if(a.substring(0,this.RoutingID.length+2)!=this.RoutingID+"_i")return-1;a=a.substring(this.RoutingID.length+2,a.length);return parseInt(a)}function rt_DefaultPlacePopupMenu(a,b){return a.CreatePopupHTML(b.descr)}function rt_SetRouteType(a){if(this.RouteType!=a){this.RouteType=a;this.Calculated&&this.AutoCalc&&this.CalcRoute()}}function rt_SetItineraireType(a){if(this.ItineraireType!=a){this.ItineraireType=a;this.Calculated&&this.AutoCalc&&this.UpdateItineraire()}}
function rt_CalcRoute(){if(this.Places.length<2)return false;if(!this.OnCalculate||this.OnCalculate(this)){this.Command("C",true);return true}return false}function rt_ClearResults(){if(this.Calculated)this.Map?this.Map.MapCommand("RC",this.RoutingID):this.Command("D",false);this.Calculated=false;this.Itineraire=[];this.TotalLen=this.TotalTime="";this.ItineraireChanged()}function rt_Error(a){this.OnError&&this.OnError(this,a)}
function rt_SetPHPSession(a){this.Calculated=true;this.PHPSession=a;if(this.Map){this.Map.SetPHPSession(a);this.LocateRoute(this.CalcScale)}}function rt_UpdateItineraire(){this.Command("I",false)}
function rt_ItineraireChanged(){var a,b,c;c=this.Places.length;for(b=0;b<c;b++)this.Places[b].ItemIdx=-1;c=this.Itineraire.length;for(b=0;b<c;b++){a=this.Itineraire[b].name;if(a.substring(0,2)=="_P"){a=parseInt(a.substring(2,a.length));if(!isNaN(a)&&a>=0&&a<this.Places.length){this.Itineraire[b].name=this.Places[a].descr;this.Itineraire[b].PlaceIdx=a;this.Places[a].ItemIdx=b}}}this.OnItineraire&&this.OnItineraire(this)}
function rt_SetItinerairePos(a){for(var b,c=PointsFromStr(a),e=this.Itineraire.length,f=c.length,d=0;d<e;d++)if(d<f)if(!isNaN(c[d].x)&&!isNaN(c[d].y)){this.Itineraire[d].screenpos=c[d];if(this.Map)if(typeof this.Itineraire[d].PlaceIdx=="undefined"||this.Itineraire[d].PlaceIdx<0){a=this.ItemIconID(d);b=this.Map.PopupIcons[a];if(typeof b=="object"&&b){b.pos=this.Itineraire[d].pos;this.Map.DrawPopupIcon(a,c[d])}}}else this.Itineraire[d].screenpos=null;else this.Itineraire[d].screenpos=null}
function rt_LocateRoute(a){if(this.Map){var b=this.RoutingID;if(typeof a=="undefined")b+="&SC=auto";else if(a!="")b+="&SC="+a;this.Map.MapCommand("RT",b)}}
function rt_DisplayItem(a){if(!this.Map||a<0||a>=this.Itineraire.length)return false;var b=this.Itineraire[a].PlaceIdx;if(typeof b=="undefined"){b=null;if(this.OnDisplayItem)b=this.OnDisplayItem(this,a);if(!b){var c=this.ItemIconID(a);b=this.Map.PopupIcons[c];if(typeof b!="object"||!b)b=this.Map.AddPopupIcon(c,this.ItineraireIcon,this.Itineraire[a].pos,this.Itineraire[a].name,this.ItineraireIconHotSpot);if(b){b.pos=this.Itineraire[a].pos;b.descr=this.Itineraire[a].name;typeof this.Itineraire[a].screenpos!=
"undefined"&&this.Itineraire[a].screenpos&&this.Map.DrawPopupIcon(c,this.Itineraire[a].screenpos);b.RoutingID=this.RoutingID;b.RoutingItemIdx=a;b.onpopup=this.OnItemPopupMenu;b.update=false}}return b}else this.DisplayPlace(b)}function rt_LocateItem(a,b,c){if(!this.Map||a<0||a>=this.Itineraire.length)return false;var e=this.Itineraire[a].PlaceIdx;typeof e=="undefined"?this.Map.LocatePopupIcon(this.ItemIconID(a),b,c):this.LocatePlace(e,b,c)}
function rt_RemoveItem(a){if(!this.Map||a<0||a>=this.Itineraire.length)return false;this.Map.RemovePopupIconByID(this.ItemIconID(a));return true}function rt_DisplayAllItems(){for(var a=this.Itineraire.length,b=0;b<a;b++)this.DisplayItem(b)}function rt_ClearDisplayedItems(){this.Map&&this.Map.RemovePopupIconsByID(this.RoutingId+"_i")}
function rt_Command(a,b){if(!(this.OnCommand&&!this.OnCommand(this,a))){this.Cmd=a;this.CmdID++;if(this.CmdID>99)this.CmdID=0;this.ProcessUrl(ng_AddURLParam(this.RoutingURL,this.URLStateParams(b)+"&C="+a))}}function rt_CancelCommand(){this.Cmd!=""&&this.OnCommandCancel&&this.OnCommandCancel(this);this.CmdID++;if(this.CmdID>99)this.CmdID=0;this.Cmd=""}
function rt_URLStateParams(a){if(typeof a=="undefined")a=true;var b=new ngStringBuilder;b.append("R="+this.RoutingID+"&CI="+this.CmdID);b.append("&RT="+this.RouteType+"&IT="+this.ItineraireType);this.APIKey!=""&&b.append("&KEY="+this.APIKey);if(this.Map)this.Map.PHPSession!=""&&b.append("&"+this.Map.PHPSession);else this.PHPSession!=""&&b.append("&"+this.PHPSession);if(a){a=new ngStringBuilder;for(var c=0;c<this.Places.length;c++)a.empty()?a.append(this.Places[c].pos):a.append("|"+this.Places[c].pos);
if(!a.empty()){b.append("&PL=");b.append(ng_URLEncode(a.toString()))}}return b.toString()}
function ngRouting(a){ngRoutingLastID++;this.RoutingID="ngRouting"+ngRoutingLastID;this.rpc=new ngRPC(this.RoutingID);ngRoutingByID[this.RoutingID]=this;this.APIKey=typeof ngMapAPIKey=="undefined"?"":ngMapAPIKey;this.Map=typeof a!="undefined"?a:null;this.Cmd=this.PHPSession="";this.CmdID=0;this.RoutingURL=ngMapAPIURL+"/routing.php";this.MapNeedUpdate=this.Changed=this.Calculated=false;this.UpdateCnt=0;this.RouteColor="rgb(0,255,0)";this.RouteWidth=5;this.RouteOpacity=0.7;this.RouteType=rtFastest;
this.ItineraireType=itBasic;this.AutoCalc=false;this.CalcScale="auto";this.Places=[];this.PlacesVisible=true;this.StartIcon=ngMapAPIURL+"/rt_start.png";this.StartIconHotSpot=new ScreenPt(7,7);this.EndIcon=ngMapAPIURL+"/rt_end.png";this.EndIconHotSpot=new ScreenPt(7,7);this.ViaIcon=ngMapAPIURL+"/rt_place.png";this.ViaIconHotSpot=new ScreenPt(7,7);this.Itineraire=[];this.TotalLen=this.TotalTime="";this.ItineraireIcon=ngMapAPIURL+"/rt_it.png";this.ItineraireIconHotSpot=new ScreenPt(4,4);ng_PreloadImage(this.StartIcon);
ng_PreloadImage(this.EndIcon);ng_PreloadImage(this.PlaceIcon);ng_PreloadImage(this.ItineraireIcon);this.AddPlaceIcon=rt_AddPlaceIcon;this.UpdatePlaceIcon=rt_UpdatePlaceIcon;this.DefaultPlacePopupMenu=rt_DefaultPlacePopupMenu;this.SetPHPSession=rt_SetPHPSession;this.SetItinerairePos=rt_SetItinerairePos;this.UpdateItineraire=rt_UpdateItineraire;this.ItineraireChanged=rt_ItineraireChanged;this.Error=rt_Error;this.ProcessUrl=rt_ProcessUrl;this.URLStateParams=rt_URLStateParams;this.BeginUpdate=rt_BeginUpdate;
this.EndUpdate=rt_EndUpdate;this.PlaceIcon=rt_PlaceIcon;this.PlaceHotSpot=rt_PlaceHotSpot;this.ClearPlaces=rt_ClearPlaces;this.AddPlace=rt_AddPlace;this.SetPlace=rt_SetPlace;this.RemovePlace=rt_RemovePlace;this.ExchangePlaces=rt_ExchangePlaces;this.ReversePlaces=rt_ReversePlaces;this.PlaceIconID=rt_PlaceIconID;this.PlaceIdxByIconID=rt_PlaceIdxByIconID;this.ItemIconID=rt_ItemIconID;this.ItemIdxByIconID=rt_ItemIdxByIconID;this.ShowPlaces=rt_ShowPlaces;this.HidePlaces=rt_HidePlaces;this.DisplayPlace=
rt_DisplayPlace;this.LocatePlace=rt_LocatePlace;this.LocatePlaces=rt_LocatePlaces;this.SetRouteType=rt_SetRouteType;this.SetItineraireType=rt_SetItineraireType;this.CalcRoute=rt_CalcRoute;this.ClearResults=rt_ClearResults;this.LocateRoute=rt_LocateRoute;this.DisplayItem=rt_DisplayItem;this.LocateItem=rt_LocateItem;this.RemoveItem=rt_RemoveItem;this.DisplayAllItems=rt_DisplayAllItems;this.ClearDisplayedItems=rt_ClearDisplayedItems;this.Command=rt_Command;this.CancelCommand=rt_CancelCommand;this.OnPlacePopupMenu=
this.DefaultPlacePopupMenu;this.OnItineraire=this.OnError=this.OnCalculate=this.OnDisplayPlace=this.OnPlacesChanged=null;this.OnItemPopupMenu=this.DefaultPlacePopupMenu;this.OnCommandCancel=this.OnCommand=this.OnDisplayItem=null};
