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() }";