public static string CreateSimplePolyline(this IEnumerable <StopsBasic.StopBasic> stops, JavascriptVariable <JavascriptObject> map, double strokeWeight, CPColor strokeColor, bool strokeDashed = false, int index = 0)
        {
            var arr = new JavascriptArray <JavascriptObject.Anonymous>(stops.Select(s => new JavascriptObject.Anonymous(
                                                                                        new KeyValuePair <string, object>("lat", s.Latitude),
                                                                                        new KeyValuePair <string, object>("lng", s.Longitude))));

            var coordinates = new JavascriptVariable <JavascriptArray <JavascriptObject.Anonymous> >($"coordinates{ index }", arr);

            var lineSymbol = new JavascriptVariable <JavascriptObject.Anonymous>($"lineSymbol{ index }", new JavascriptObject.Anonymous(
                                                                                     new KeyValuePair <string, object>("path", new JavascriptString("M 0,-1 0,1")),
                                                                                     new KeyValuePair <string, object>("strokeOpacity", 1),
                                                                                     new KeyValuePair <string, object>("scale", 4)));

            var polyline = strokeDashed ? new JavascriptVariable <JavascriptObject>($"polyline{ index }", new JavascriptObject("google.maps.Polyline",
                                                                                                                               new JavascriptObject.Anonymous(
                                                                                                                                   new KeyValuePair <string, object>("path", coordinates.Name),
                                                                                                                                   new KeyValuePair <string, object>("strokeColor", new JavascriptString("#" + strokeColor.R.ToString("X2") + strokeColor.G.ToString("X2") + strokeColor.B.ToString("X2"))),
                                                                                                                                   new KeyValuePair <string, object>("strokeOpacity", 0),
                                                                                                                                   new KeyValuePair <string, object>("icons", new JavascriptArray <JavascriptObject.Anonymous> {
                new JavascriptObject.Anonymous(
                    new KeyValuePair <string, object>("icon", lineSymbol.Name),
                    new KeyValuePair <string, object>("offset", new JavascriptString("0")),
                    new KeyValuePair <string, object>("repeat", new JavascriptString("20px")))
            }))))
                                        :
                           new JavascriptVariable <JavascriptObject>($"polyline{ index }", new JavascriptObject("google.maps.Polyline",
                                                                                                                new JavascriptObject.Anonymous(
                                                                                                                    new KeyValuePair <string, object>("path", coordinates.Name),
                                                                                                                    new KeyValuePair <string, object>("strokeColor", new JavascriptString("#" + strokeColor.R.ToString("X2") + strokeColor.G.ToString("X2") + strokeColor.B.ToString("X2"))),
                                                                                                                    new KeyValuePair <string, object>("strokeOpacity", 1.0),
                                                                                                                    new KeyValuePair <string, object>("strokeWeight", strokeWeight))));

            return(coordinates.VariableAssignment() + Environment.NewLine + (strokeDashed ? (lineSymbol.VariableAssignment() + Environment.NewLine) : string.Empty) +
                   polyline.VariableAssignment() + Environment.NewLine + polyline.Call(new JavascriptFunction.Call("setMap", map.Name)));
        }
        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)));
        }