PageSourceSearch

https://sailflow.com/App_Common/JS/jweather/WFProducts.js?20260916a

js sailflow.com collected 2026-09-24 11:18:50 UTC 7,584 bytes, 225 lines download raw bytes

1function WFProducts() {}
2
3// changes from api
4// 1. made feature.exceptions and array
5// 2. added guest member_levels to features
6// 3. added guest member_level_kit
7
8//////////////////////////////////////////////////////////////////////
9//  Public Interface
10/////////////////////////////////////////////////////////////////////
11WFProducts.getFeatureTitleById = function (featureId) {
12    for (i = 0; i < WFProducts.products.features.length; i++) {
13        var feature = WFProducts.products.features[i];
14        if (feature.feature_id == featureId) {
15            return feature.title;
16        }
17    }
18}
19
20WFProducts.getFeatureMembershipStringById = function (featureId) {
21    for (i = 0; i < WFProducts.products.features.length; i++) {
22        var feature = WFProducts.products.features[i];
23        if (feature.feature_id == featureId) {
24            return feature.memberships_str;
25        }
26    }
27}
28
29WFProducts.getMembershipLevelNameById = function (memberLevel) {
30    for (i = 0; i < WFProducts.products.member_level_kits.length; i++) {
31        var memberLevelKit = WFProducts.products.member_level_kits[i];
32        if (memberLevelKit.member_level == memberLevel) {
33            return memberLevelKit.name;
34        }
35    }
36    return "Guest";
37}
38
39WFProducts.getAnalyticsKeyById = function (featureId) {
40    var analyticsKey = null;
41
42    for (i = 0; i < WFProducts.products.features.length; i++) {
43        var feature = WFProducts.products.features[i];
44        if (feature.feature_id == featureId) {
45            analyticsKey = feature.analytics_key;
46        }
47    }
48
49    return analyticsKey;
50}
51
52
53/*
54    doesUserHaveAccessToFeature
55
56        featureId                   int     Required
57        memberLevelId               int     Required
58        exceptionFailMemberIdsStr   str     Optional    "2,49"
59
60        returns true if a featureId is available for the given memberLevel
61
62        if exceptionFailMemberIdsStr is given it will also check the feature exceptions
63        if an exception is found the matches the exceptionFailMemberLevelIds and memberLevel false is returned
64*/
65WFProducts.doesUserHaveAccessToFeature = function (featureId, memberLevel, exceptionFailMemberLevelIdsStr) {
66    for (i = 0; i < WFProducts.products.features.length; i++) {
67        var feature = WFProducts.products.features[i];
68        if (feature.feature_id == featureId) {
69            for (j = 0; j < feature.member_levels.length; j++) {
70                if (feature.member_levels[j] == memberLevel) {
71                    // match found - the feature contains the user's memberLevel
72
73                    // now look to see if there is an exception for a memberLevel in exceptionFailMemberIdsStr
74                    if (typeof exceptionFailMemberLevelIdsStr != "undefined" && exceptionFailMemberLevelIdsStr.length > 0) {
75                        // there is a list of memberIds to check for exceptions
76                        if (typeof feature.exceptions != "undefined") {
77                            // the feature does have exceptions 
78                            // return false if we find a match
79                            var exceptionMemberLevelIds = exceptionFailMemberLevelIdsStr.split(",");
80                            for (k = 0; k < exceptionMemberLevelIds.length; k++) {
81                                exceptionMemberLevelId = exceptionMemberLevelIds[k];
82                                for (l = 0; l < feature.exceptions.length; l++) {
83                                    var exception = feature.exceptions[l];
84                                    if (exception.member_level == exceptionMemberLevelId && exceptionMemberLevelId == memberLevel) {
85                                        // the feature does have an exception for a failMemberLevelId and user's memberLevel
86                                        return false;
87                                    }
88                                }
89                            }
90                        }
91                    }
92
93                    // no exceptions found - return true
94                    return true;
95                }
96            }
97        }
98    }
99    return false;
100}
101
102WFProducts.getExcludedMapOverlays = function (memberLevel) {
103    var excludedOverlays = [];
104
105    for (var x = 0; x < WFProducts.MapOverlays.length; x++) {
106        if (!WFProducts.doesUserHaveAccessToFeature(WFProducts.MapOverlays[x].featureId, memberLevel)) {
107            excludedOverlays.push(WFProducts.MapOverlays[x].overlayName);
108        }
109    }
110        
111    return excludedOverlays;
112}
113
114WFProducts.getExcludedMarkerData = function (memberLevel) {
115    var excludedMarkerData = [];
116
117    if (!WFProducts.doesUserHaveAccessToFeature(7, memberLevel)) {
118        excludedMarkerData.push(100);
119        excludedMarkerData.push(101);
120    }
121
122    return excludedMarkerData;
123}
124
125WFProducts.test = function () {
126    for (i = 0; i < WFProducts.products.features.length; i++) {
127        var feature = WFProducts.products.features[i];
128        console.debug(i + " - " + feature.title);
129    }
130}
131
132WFProducts.MapOverlays = [{ featureId: 6, overlayName: "nautical" }, { featureId: 18, overlayName: "sst" }, { featureId: 25, overlayName: "currents" }, {featureId: 7, overlayName: "nowcast"}];
133WFProducts.ProfileFeature = 3;
134WFProducts.AlertFeature = 4;
135WFProducts.NauticalChartFeature = 6;
136WFProducts.NoAdsFeature = 16;
137
138/* View Descriptions returned from api */
139WFProducts.regionalProducts = [
140    {
141        "analytics_key": "Wind_Observations",
142        "regional_product_id": 1,
143        "title": "Wind Observations"
144    },
145    {
146        "analytics_key": "Wind_Forecast",
147        "regional_product_id": 2,
148        "title": "Wind Forecast"
149    },
150    {
151        "analytics_key": "Wind_Nowcast",
152        "regional_product_id": 3,
153        "title": "Wind Nowcast"
154    },
155    {
156        "analytics_key": "General_Weather",
157        "regional_product_id": 4,
158        "title": "General Weather"
159    },
160    {
161        "analytics_key": "Radar_Precipitation",
162        "regional_product_id": 5,
163        "title": "Radar / Precipitation"
164    },
165    {
166        "analytics_key": "Satellite_Clouds",
167        "regional_product_id": 6,
168        "title": "Satellite / Clouds"
169    },
170    {
171        "analytics_key": "Sea_Surface_Temperatures",
172        "regional_product_id": 7,
173        "title": "Sea Surface Temperatures"
174    },
175    {
176        "analytics_key": "Radar_Wind",
177        "regional_product_id": 8,
178        "title": "Radar + Wind"
179    },
180    {
181        "analytics_key": "Satellite_Wind",
182        "regional_product_id": 9,
183        "title": "Satellite + Wind"
184    },
185    {
186        "analytics_key": "NWS_Marine_Forecast_Zones",
187        "regional_product_id": 10,
188        "title": "NWS Marine Forecast Zones"
189    },
190    {
191        "analytics_key": "Daily_Briefings",
192        "regional_product_id": 11,
193        "title": "Daily Briefings"
194    },
195    {
196        "analytics_key": "OnSite_Reports",
197        "regional_product_id": 12,
198        "title": "OnSite Reports"
199    },
200    {
201        "analytics_key": "Sea_Surface_Current",
202        "regional_product_id": 13,
203        "title": "Sea Surface Current"
204    },    
205    {
206        "analytics_key": "Flow",
207        "regional_product_id": 18,
208        "title": "Flow"
209    },    
210    {
211        "analytics_key": "Wind_Gust",
212        "regional_product_id": 19,
213        "title": "Wind + Gust"
214    },    
215    {
216        "analytics_key": "Live_Wind_Flow",
217        "regional_product_id": 19,
218        "title": "Live Wind - Flow"
219    },    
220    {
221        "analytics_key": "Radar_Satellite",
222        "regional_product_id": 23,
223        "title": "Radar + Satellite"
224    }
225];

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.