public static string CreateMarkers(this IEnumerable <StopsBasic.StopBasic> stops, JavascriptVariable <JavascriptObject> map, bool zoomToCurrentPosition = false) { var markersInfo = new JavascriptVariable <JavascriptArray <JavascriptArray <object> > >("markersInfo", new JavascriptArray <JavascriptArray <object> >(stops.Select(stop => new JavascriptArray <object> { "'" + stop.Name + "'", stop.Latitude, stop.Longitude, stop.ID }))); var bounds = new JavascriptVariable <JavascriptObject>("bounds", new JavascriptObject("google.maps.LatLngBounds")); var cycle = new JavascriptControlStructures.For(new JavascriptVariable <int>("i", 0), (int)markersInfo.Content.Count); var marker = new JavascriptVariable <JavascriptObject>("marker", new JavascriptObject("google.maps.Marker", new JavascriptObject.Anonymous( new KeyValuePair <string, object>("title", $"{ markersInfo.Name }[{ cycle.ControlVariable.Name }][0]"), new KeyValuePair <string, object>("position", new JavascriptObject.Anonymous( new KeyValuePair <string, object>("lat", $"{ markersInfo.Name }[{ cycle.ControlVariable.Name }][1]"), new KeyValuePair <string, object>("lng", $"{ markersInfo.Name }[{ cycle.ControlVariable.Name }][2]"))), new KeyValuePair <string, object>("map", map.Name)))); var popupWindow = new JavascriptVariable <JavascriptObject>("popupWindow", new JavascriptObject("google.maps.InfoWindow")); var content = new JavascriptVariable <string>("content", $"{ markersInfo.Name }[{ cycle.ControlVariable.Name }][3]"); var innerFn = new JavascriptFunction.Anonymous(); innerFn.AddInstruction(popupWindow.Call(new JavascriptFunction.Call("setContent", new JavascriptFunction.Call("window.external.ShowDepartures", content.Name))).ToString); innerFn.AddInstruction(popupWindow.Call(new JavascriptFunction.Call("open", map.Name, marker.Name)).ToString); var onClickAnonymousFn = new JavascriptFunction.Anonymous(marker.Name, content.Name, popupWindow.Name); onClickAnonymousFn.AddInstruction(new JavascriptFunction.Return <JavascriptFunction.Anonymous>(innerFn).ToString); var onClickListener = new JavascriptFunction.Call("google.maps.event.addListener", marker.Name, new JavascriptString("click"), new JavascriptFunction.Anonymous.Application(onClickAnonymousFn, marker.Name, content.Content, popupWindow.Name) ); cycle.AddInstruction(popupWindow.VariableAssignment); cycle.AddInstruction(marker.VariableAssignment); cycle.AddInstruction(onClickListener.ToString); if (!zoomToCurrentPosition) { cycle.AddInstruction(bounds.Call(new JavascriptFunction.Call("extend", marker.Call(new JavascriptFunction.Call("getPosition")))).ToString); } return(zoomToCurrentPosition ? markersInfo.VariableAssignment() + Environment.NewLine + cycle.ToString() : markersInfo.VariableAssignment() + Environment.NewLine + bounds.VariableAssignment() + Environment.NewLine + cycle.ToString() + Environment.NewLine + map.Call(new JavascriptFunction.Call("fitBounds", bounds.Name))); }
public string Call(JavascriptFunction.Call fn) => $"{ Name }.{ fn.ToString() }";