PageSourceSearch

https://www.shipfinder.com/

html shipfinder.com collected 2026-10-03 23:56:59 UTC 64,047 bytes, 1,183 lines download raw bytes

1
2<!DOCTYPE html>
3<html lang="en">
4<head>
5    <title>ShipFinder - Free Satellite AIS Ship Tracking | Global Real-Time Marine traffic</title>
6    <meta name="description" content="Access free satellite AIS ship tracking and historical track lookup. ShipFinder provides global real-time vessel positions, detailed ship information, and worldwide port data to help you monitor marine traffic instantly." />
7    <meta property="qc:admins" content="274057166463010016375" />
8    <meta name="msvalidate.01" content="070F9ED5CFFF5643223BE139A1D221F5" />
9    <meta name="renderer" content="webkit" />
10    <meta http-equiv="X-UA-Compatible" content="IE=edge,Chrome" />
11    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
12
13    <link rel="canonical" href="https://www.shipfinder.com/" />
14    <link rel="Shortcut icon" href="/favicon.ico" />
15    <link rel="Bookmark" href="/favicon.ico" />
16    <link href="/Content/js/elanemap/style/elane-map.min.css?v=1" rel="stylesheet" />
17    <link href="/Content/css/style.css?v=22" rel="stylesheet" />
18    <link href="/Content/css/mapPlus.css?v=22" rel="stylesheet" />
19    <link href="/Content/js/DataEntryControl/DataEntryControl.css?v=" rel="stylesheet" />
20    
21    <link href="/Content/js/layui/css/layui.css?v=22" rel="stylesheet" />
22    <link href="/Content/css/timecol/daterangepicker.css" rel="stylesheet" />
23    <link href="/Content/css/new.css?v=22" rel="stylesheet" />
24
25    
25<script src="/Content/js/jquery-1.8.2.min.js"></script>
25
26    
26<script src="/Content/js/config.js?v=22"></script>
26
27    
27<script src="/Content/js/elanemap/index.html?v=1" languagePath="/Content/js/elanemap/languages/?language=en"></script>
27
28    
28<script src="/Content/js/elanemap/ElaneMapConfig.js?v=22"></script>
28
29    
29<script src="/Content/js/layer/layui.js?v=?v=22"></script>
29
30    
30<script src="/Content/js/elane/elane.keepOnline.js?v=22"></script>
30
31    
31<script src="/Content/js/base.js?v=22"></script>
31
32    
32<script src="/Content/js/layout.js?v=22"></script>
32
33    
33<script src="/Content/js/polyfill.min.js?v="></script>
33
34    
34<script src="/Content/js/lib/elane.md5.min.js?v=22"></script>
34
35    
35<script src="/Content/js/layer/lay/modules/layer.js?v=22"></script>
35
36    
36<script src="/Content/js/Shipxy.Login.js?v=22"></script>
36
37    
37<script src="/Content/js/Register.js?v=22"></script>
37
38
39    <!--GA获取用户数据-->
40            
40<script>
41                var ga_isLogin = 0;
42                var ga_userid = "";
43                var ga_sT = 0;
44                var ga_fee = 0;
45            </script>
45
46
47    
47<script>
48        window.dataLayer = window.dataLayer || [];
49        //用户等级:3-standard,4-professional,5-enterprise,其余登录用户为free
50        var ga_level = 'guest';
51        //订阅plan:enterprise不分月付年付,standard和professional按最近一笔订单金额区分,
52        //不超过150美元算月付,超过算年付;取不到金额(后台手工开通)按年付
53        var ga_plan = 'none';
54        if (ga_isLogin == 1) {
55            ga_level = ga_sT == 4 ? 'professional' : (ga_sT == 5 ? 'enterprise' : (ga_sT == 3 ? 'standard' : 'free'));
56            if (ga_sT == 5) {
57                ga_plan = 'Enterprise Plan';
58            }
59            else if (ga_sT == 3 || ga_sT == 4) {
60                ga_plan = (ga_sT == 4 ? 'Professional Plan' : 'Standard Plan') + (ga_fee > 0 && ga_fee <= 150 ? '(M)' : '(Y)');
61            }
62        }
63        window.dataLayer.push({
64            'user_id': ga_userid == '' ? undefined : ga_userid,
65            'user_level': ga_level,
66            'subscription_plan': ga_plan
67        });
68    </script>
68
69    <!--GA获取用户数据End-->
70    <!--GA埋点:注册成功 外部登录(Google/Apple/...)新注册成功,由控制器一次性传递-->
71
72    <!-- Google Tag Manager -->
73    
73<script>
vendor: 505 bytes, lines 73-83
73
74        (function (w, d, s, l, i) {
75            w[l] = w[l] || [];
76            w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
77            var f = d.getElementsByTagName(s)[0],
78                j = d.createElement(s),
79                dl = l != 'dataLayer' ? '&l=' + l : '';
80            j.async = true;
81            j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
82            f.parentNode.insertBefore(j, f);
83        })(window, document, 'script', 'dataLayer', '
83GTM-NFDWQNFJ
vendor: 9 bytes, lines 83-84
83');
84    
84</script>
84
85    <!-- End Google Tag Manager -->
86    
87    <meta name="facebook-domain-verification" content="i5p4qcjvzgjpk8cg501fvat5sdr7md" />
88
89    <meta property="og:type" content="website" />
90    <meta property="og:site_name" content="ShipFinder" />
91    <meta property="og:url" content="https://www.shipfinder.com/" />
92    <meta property="og:title" content="ShipFinder - Free Satellite Global Ship Tracking | Real-Time Marine traffic" />
93    <meta property="og:description" content="ShipFinder Free Global Live Ships Map. Access satellite AIS ship tracking and historical track lookup. View global real-time vessel positions, detailed ship information, and worldwide port data." />
94    <meta property="og:image" content="/Content/images/newlogo_sqr.png" />
95
96</head>
97<body style="background-color: transparent;">
98    <!-- Google Tag Manager (noscript) -->
vendor: 83 bytes, lines 98-100
98
99    <noscript>
100        <iframe src="https://www.googletagmanager.com/ns.html?id=
100GTM-NFDWQNFJ
vendor: 111 bytes, lines 100-103
100"
101                height="0" width="0" style="display:none;visibility:hidden"></iframe>
102    </noscript>
103    
103<!-- End Google Tag Manager (noscript) -->
104    
105
106<div class="header header-child">
107    <div class="logo pos_a">
108        <a href="javascript:window.localStorage.mapInfo=null;window.location.href='https://www.shipfinder.com';Index.clearMemoryMapCookie();">
109            <img src="/Content/images/newlogo.svg" alt="" style="width: 120px; margin: 20px;">
110        </a>
111    </div>
112
113    <div class="chang_language pos_a"></div>
114    <div class="header_right_btns pos_a">
115        <div class="hormuz_btn"><a href="/special/hormuz" target="_blank"><img src="/Content/images/hormuz.svg" /></a></div>
116        <div class="api_btn news_btn"><a class="img_text_btn" href="/maritime-news" target="_blank" title="Maritime News"><img src="/Content/images/news1.png" alt="Maritime News" style="width:95px;height:52px;" /><span class="img_btn_text">NEWS</span></a></div>
117        <div class="api_btn"><a class="img_text_btn" href="/ais-data-api" target="_blank" title="Global Vessel Tracking API"><img src="/Content/images/api1.png" alt="Global Vessel Tracking API" /><span class="img_btn_text">API</span></a></div>
118        <div class="queen_btn1" ><a class="img_text_btn" href="/home/plans_pricing" target="plans_pricing" title="Plans & Pricing"><img src="/Content/images/queen.png" alt="Plans & Pricing" /><span class="img_btn_text">Plans &amp; Pricing</span></a></div>
119    </div>
120    <div class="user_center fz_12 login_reg pos_a" id="userCenter">
121            <a class="user_center_pic_guest nav_children_btn" href="javascript:void(0)" onclick="navChildrenToggle(this)"><img src="/Content/images/user_center.png" style="width:40px;" /></a>
122            <span class="pos_a user_center_list nav_children_list _user_center_me" style="padding:4px 0 0;left:auto;right:0;width:130px;">
123                <a href="https://www.shipfinder.com/home/login?ReturnUrl=%2f" class="usercenter_ico">Personal Center</a>
124                <a href="https://www.shipfinder.com/help-center" target="_blank" class="h_ico">Help Center</a>
125                <a href="https://www.shipfinder.com/home/login?ReturnUrl=%2f" class="quit_btn">Sign In</a>
126            </span>
127    </div>
128</div>
129
130<script>
131    function navChildrenToggle(e) {
132        var dom = $(e.target);
133        var _navShow = $(e).next().css('display') == "block" ? true : false;
134        $(".nav_children_btn").removeClass('arrow_transform');
135        $(".nav_children_list").hide();
136        if (_navShow) {
137            $(e).removeClass('arrow_transform');
138            $(e).next().hide();
139        } else {
140            if (window.Menu && Menu.fastmenuLayerHide) { Menu.fastmenuLayerHide(); }
141            if (!$(e).hasClass('user_center_pic')) { $(e).addClass('arrow_transform'); }
142            $(e).next().show();
143        }
144        $(".user_center_list").css("z-index", 9999);
145    }
146
147    $(document.body).click(function (e) {
148        var dom = $(e.target);
149        if (!dom.closest('.nav_children_btn').length && !dom.closest('.user_center_list').length) {
150            $(".nav_children_btn").removeClass('arrow_transform');
151            $(".nav_children_list").hide();
152        }
153    })
154
155</script>
vendor: 2 bytes, line 155
155
156<script src="/Content/js/lang/common.js"></script>
vendor: 2 bytes, line 156
156
157<script src="/Content/js/jsData/coutry.js"></script>
157
158
159    
160<script src="/Content/js/config.js?v=22"></script>
vendor: 2 bytes, line 160
160
161<script type="application/ld+json">
162    {
163        "@context": "https://schema.org",
164        "@graph": [
165            {
166                "@type": "WebSite",
167                "@id": "https://www.shipfinder.com/#website",
168                "url": "https://www.shipfinder.com/",
169                "name": "ShipFinder",
170                "publisher": {
171                    "@id": "https://www.shipfinder.com/#organization"
172                }
173            },
174            {
175                "@type": "Organization",
176                "@id": "https://www.shipfinder.com/#organization",
177                "name": "ShipFinder",
178                "url": "https://www.shipfinder.com/",
179                "logo": "https://www.shipfinder.com/Content/images/newlogo.svg",
180                "sameAs": ["https://www.linkedin.com/company/shipfinder-co.-ltd/"],
181                "parentOrganization": {
182                    "@type": "Organization",
183                    "name": "ELANE GLOBAL PTE. LTD.",
184                    "url": "https://www.elaneglobal.com/",
185                    "sameAs": ["https://www.linkedin.com/company/elaneglobal/"]
186                }
187            },
188            {
189                "@type": "WebPage",
190                "@id": "https://www.shipfinder.com/#webpage",
191                "url": "https://www.shipfinder.com/#webpage",
192                "name": "ShipFinder - Free Satellite AIS Ship Tracking | Global Real-Time Marine traffic",
193                "isPartOf": { "@id": "https://www.shipfinder.com/#website" },
194                "about": { "@id": "https://www.shipfinder.com/#organization" },
195                "description": "ShipFinder - The Live Marine Traffic Tracking App,Live AIS ship Tracker with Ship and Port Database",
196                "breadcrumb": { "@id": "https://www.shipfinder.com/#breadcrumb" }
197            },
198            {
199                "@type": "BreadcrumbList",
200                "@id": "https://www.shipfinder.com/#breadcrumb",
201                "itemListElement": [
202                    {
203                        "@type": "ListItem",
204                        "position": 1,
205                        "name": "Home",
206                        "item": "https://www.shipfinder.com/"
207                    }
208                ]
209            }
210        ]
211    }
212</script>
212
213        
213<script>
214            var username = "";
215        </script>
215
216    
216<script type="text/javascript">
217        var ServerDate = '2026-10-04'; //服务器日期
218        var ShipPictureURL = 'https://shippic.shipfinder.com'; //loadpic
219        var BusinessURL = '';//服务商
220        var MapService = '';
221        MapService=window.location.protocol=="http:"?MapService.replace("https:","http:"):MapService;
222        var NoticeData = '';
223        var isLogin = '0';
224        var _apiweburl = '';
225        var ihsurl = 'https://ihs.shipfinder.com';
226        
227        var selfurl = 'https://www.shipfinder.com'
228        var _tdkey='';
229        var _videoHost='';
230        var _videoWeb='';
231        config.api.talentApiHost = '';  //达人秀接口
232
233        config.api['talentAXBURL']= '';  // 隐藏号码
234        config.api['TalentToken']= '';
235        _tdkey = _tdkey == "" ? "99a08f767025604d8cbb9da28b0f6828" : _tdkey;
236        ShipxyOptions.tiles.tiandituTileUrl = "//t7.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=" + _tdkey
237        ShipxyOptions.tiles.tiandituTileUrl_marker = "//t7.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=" + _tdkey
238
239        config.ship.searchServerUrl = 'https://searchv3.shipfinder.com';
240        var VectorApi = 'https://tile.shipfinder.com/tileserver';//船舶三角
241    </script>
241
242
243
244
245<link href="/Content/fonts/font-awesome.min.css" rel="stylesheet" />
246<script src="/Content/js/DataEntryControl/DataEntryControl.js?v=" async></script>
vendor: 2 bytes, line 246
246
247<script src="/Content/js/lib/elane.md5.min.js?v=22" async></script>
vendor: 2 bytes, line 247
247
248<script src="/Content/js/base.js?v=22"></script>
vendor: 2 bytes, line 248
248
249<script src="/Content/js/Tdrag.min.js" async></script>
vendor: 2 bytes, line 249
249
250<script src="/Content/js/parabola.js"></script>
vendor: 2 bytes, line 250
250
251<script src="/Content/js/ShipxyIndex.js?v=322"></script>
vendor: 2 bytes, line 251
251
252<script src="/Content/js/Shipxylayer.js?v=122"></script>
vendor: 2 bytes, line 252
252
253<script src="/Content/js/elane/elane.js?v=22"></script>
vendor: 2 bytes, line 253
253
254<script src="/Content/js/elane/elane.osLayer.js?v=22"></script>
vendor: 2 bytes, line 254
254
255<script src="/Content/js/elane/elane.ship.js?v=322"></script>
vendor: 2 bytes, line 255
255
256<script src="/Content/js/elane/elane.truck.js?v=22"></script>
vendor: 2 bytes, line 256
256
257<script src="/Content/js/elane/elane.alertShip.js?v=22"></script>
vendor: 2 bytes, line 257
257
258<script src="/Content/js/elane/elane.alertArea.js?v=22"></script>
vendor: 2 bytes, line 258
258
259<script src="/Content/js/elane/elane.filterShip.js?v=222"></script>
vendor: 2 bytes, line 259
259
260<script src="/Content/js/elane/elane.etaShip.js?v=22"></script>
vendor: 2 bytes, line 260
260
261<script src="/Content/js/xcomplete.js?v=22"></script>
vendor: 2 bytes, line 261
261
262<script src="/Content/js/DeAnalyseManager.js?v="></script>
vendor: 2 bytes, line 262
262
263<script src="/Content/js/Shipxy.Group.js?v=22"></script>
vendor: 2 bytes, line 263
263
264<script src="/Content/js/elane/elane.mark.js?v=22"></script>
vendor: 2 bytes, line 264
264
265<script src="/Content/js/elane/elane.olayers.js?v=22"></script>
vendor: 2 bytes, line 265
265
266<script src="/Content/js/elane/elane.olayers.page.js?v=22"></script>
vendor: 2 bytes, line 266
266
267<script src="/Content/js/elane/elane.olayers.poly.js?v=22"></script>
vendor: 2 bytes, line 267
267
268<script src="/Content/js/elane/elane.olayers.rectange.js?v=22"></script>
vendor: 2 bytes, line 268
268
269<script src="/Content/js/elane/elane.olayers.circle.js?v=22"></script>
vendor: 2 bytes, line 269
269
270<script src="/Content/js/elane/elane.AlphaCircle.js?v=22"></script>
vendor: 2 bytes, line 270
270
271<script src="/Content/js/elane/elane.alertETA.js?v=22"></script>
vendor: 2 bytes, line 271
271
272<script src="/Content/js/elane/elane.line.js?v=22"></script>
vendor: 2 bytes, line 272
272
273<script src="/Content/js/elane/elane.sign.js?v=22"></script>
vendor: 2 bytes, line 273
273
274<script src="/Content/js/elane/elane.ChangJiang.js?v=22"></script>
274
275
276<script src="/Content/js/elane/elane.trackreplay.js?v=22"></script>
vendor: 2 bytes, line 276
276
277<script src="/Content/js/elane/elane.weaher.js?v=22"></script>
vendor: 2 bytes, line 277
277
278<script src="/Content/js/elane/elane.layerManager.js?v=22"></script>
vendor: 2 bytes, line 278
278
279<script src="/Content/js/Shipxy.Login.js?v=22"></script>
vendor: 2 bytes, line 279
279
280<script src="/Content/js/timecol/common.js?v=22"></script>
vendor: 2 bytes, line 280
280
281<script src="/Content/js/timecol/moment.js?v=22"></script>
vendor: 2 bytes, line 281
281
282<script src="/Content/js/timecol/daterangepicker.js?v="></script>
vendor: 2 bytes, line 282
282
283<script src="/Content/js/timecol/daterangepicker.zh-CN.js?v="></script>
vendor: 2 bytes, line 283
283
284<script src="/Content/js/elane/elane.Pirate.js?v=22"></script>
vendor: 2 bytes, line 284
284
285<script src="/Content/js/elane/businessService.js?v=122"></script>
vendor: 2 bytes, line 285
285
286<script src="/Content/js/pay.js?v=22"></script>
vendor: 2 bytes, line 286
286
287<script src="/Content/fancybox/jquery.fancybox-1.3.4.pack.js" async></script>
vendor: 2 bytes, line 287
287
288<script src="/Content/fancybox/jquery.mousewheel-3.0.4.pack.js" async></script>
288
289<link href="/Content/fancybox/jquery.fancybox-1.3.4.css" rel="stylesheet" />
290<link href="/Content/css/animate.min.css?v=" rel="stylesheet" />
291<script src="/Content/js/elane/elane.voyageplan.js?v=22"></script>
vendor: 2 bytes, line 291
291
292<script src="/Content/js/elane/elane.forecast.js?v=122"></script>
vendor: 2 bytes, line 292
292
293<script src="/Content/js/elane/elane.sailingdate.js?v=22"></script>
vendor: 2 bytes, line 293
293
294<script src="/Content/js/elane/elane.shipflag.js?v=22"></script>
vendor: 2 bytes, line 294
294
295<script src="/Content/js/elane/elane.shipRemarks.js"></script>
vendor: 2 bytes, line 295
295
296<script src="/Content/js/elane/arealine.js?v=22"></script>
vendor: 2 bytes, line 296
296
297<script src="/Content/js/elane/AvoidTyphoon.js?v=22"></script>
vendor: 2 bytes, line 297
297
298<script src="/Content/js/elane/trackFlay.js?v=22"></script>
vendor: 2 bytes, line 298
298
299<script src="/Content/js/leaflet-polygon.fillPattern.js"></script>
vendor: 2 bytes, line 299
299
300<script src="/Content/js/polycolor.js" async></script>
vendor: 2 bytes, line 300
300
301<script src="/Content/js/weatherplay.js"></script>
vendor: 2 bytes, line 301
301
302<script type="text/javascript" src="//cstaticdun.126.net/load.min.js?t=1791071820" async></script>
vendor: 2 bytes, line 302
302
303<script src="/Content/js/index126.js"></script>
vendor: 2 bytes, line 303
303
304<script src="/Content/js/VerifyCode.js"></script>
vendor: 2 bytes, line 304
304
305<script src="/Content/js/jfg.min.js?v=22"></script>
305
306<div class="map_main pos_a" id="mapMain">
307    <div class="fullmap" id="mapbox" style="right: 0; background-color: transparent;">
308        <div id="testDIv" style="background-color: red; width: 100px; height: 100px; position: absolute; z-index: 9999; display: none"></div>
309    </div>
310    <div class="_footer" style="position: absolute; width: 100%; height: 20px; color: #626d7d; bottom: 0; text-align: center;">
311        <div style="width: 100%; font-size: 12px;">©2026 ShipFinder-H5 - <span>Chart@C-Map @OpenStreetMap</span> <a href="/Home/TermsConditions" target="_blank" class="c_blue ">Terms &amp; Conditions</a><a href="/Home/Treaty" target="_blank" class="c_blue ml_10">Terms of Use</a><a href="/Home/Privacy" target="_blank" class="c_blue ml_10">Privacy Policy</a><a href="/cookie-policy" target="_blank" class="c_blue ml_10">Cookie Policy</a></div>
312        
313    </div>
314    <div id="drawshipcount" style="position: absolute; bottom: 68px; left: 10px; text-align: center; border-radius: 3px; padding: 1px 3px; font-size: 12px; background-color: rgba(255, 255, 255, 0.63); color: #333; box-shadow: 2px 2px 6px rgba(0, 0, 0, 0.27); width: 90px;" title="Number of ships currently drawn:">0</div>
315    <div class="shadow" style="width: 430px; height: 40px; position: absolute; left: 12px; top: 10px;border-radius:0 4px 4px 0;">
316        <div class="new_logo"><a href="javascript:window.localStorage.mapInfo=null;Index.clearMemoryMapCookie();window.location.href='/';"><img src="/Content/images/newlogo.svg" /></a></div>
317        <div class="search_box">
318            <div>
319                <span class="pos_r" style="display: block;">
320                    <input type="text" name="" id="txtKey" placeholder="Search ship, port..." maxlength="40" class="" autocomplete="off">
321                </span>
322                <a href="javascript:void(0)" class="search_btn fl_r blue_btn" onclick="searchLayer.showSearchResult()" id="searchBtn" style="border-radius:0 4px 4px 0;"></a>
323                <a href="javascript:void(0)" class="pos_a clear_input_btn" style="display: none;" onclick="searchLayer.clearInputTxt()">×</a>
324            </div>
325            <div class="clear"></div>
326        </div>
327    </div>
328    <div class="delay_12 "><a class="server_buy" href="/Home/Price"><img src="/Content/images/12HoursDelay_en.png" /></a></div>
329    <div class="search_container down_radius2">
330        <!-- 关键字搜索 -->
331        <div id="_search_list" class="search_result shadow down_radius2" style="display: none">
332        </div>
333        <!-- 查看更多搜索结果 start -->
334        <p id="_search_more_p" class="more_results ta_c down_radius2 no_hide" style="display: none">
335            <a href="javascript:void(0)" class="fl_r mr_10" id="moreResultBtn" onclick="$('#_search_more_p').hide()">
336                <img src="/Content/images/grey_close_btn.png" class="closebtn_360" />
337            </a>
338            <a href="javascript:void(0)" onclick="searchLayer.moreResult()" class="more_btn">More Search Results</a>
339        </p>
340        <!-- 查看更多搜索结果 end -->
341        <!-- 历史记录 -->
342        <div id="_search_list_history" class="search_memory down_radius2 shadow" style="display: none"></div>
343        <!-- 搜索结果  -->
344        <div id="searchResult" class="search_result search_memory down_radius2 shadow" style="display: none"></div>
345    </div>
346    <div class="history_line" id="historyLine">
347    </div>
348    <div class="sailing_date" id="sailingDate"></div>
349    <div class="mask_bg"></div>
350    <div id="dialogue" style="width: 100%; height: 100%; position: fixed; top: 0px; background-color: rgba(0,0,0,0.4); text-align: center; z-index: 1161; display: none;"></div>
351    <div id="codedialogue" style="width: 343px; top: 35%; left: 40%; margin-left: 0px; margin-top: 0px; z-index: 1162; position: absolute; height: 274px; overflow: hidden; background-color: white; display: none;">
352        <p style="height: 35px; background-color: #2770d4; color: white; line-height: 35px; text-align: left; padding-left: 10px; cursor: move;" id="move_part">Code</p>
353        <div id="captcha_div" style="padding: 12px;"></div>
354    </div>
355
356    <!--工具箱--->
357    <div class="toolbox_info" id="toolboxInfo"><a href="javascript:void(0)" id="Math" class="math" onclick="Index.Mathdistance()"></a><a href="javascript:void(0)" id="shipSign" class="ship_sign" onclick="Index.shipSign()"></a><a href="javascript:void(0)" id="locationSet" class="location_set" onclick="Index.locationSet()"></a></div>
358    <div id="buySeaMap" class="buy_seamap fz_12 c_999 pos_a"></div>
359    <div class="fastmenu_box pos_a">
360        <div class="sat-bubble-wrap">
361            <div class="sat-bubble" id="satBindBubble" style="display:none;">
362                <button class="sat-bubble-close" id="satBubbleClose">&times;</button>
363                <div class="sat-bubble-text" id="satBubbleText">
364                    You haven't bound a vessel yet.<br>Bind <strong>1 free satellite vessel</strong> now.
365                </div>
366                <button class="sat-bubble-btn" id="satBubbleBindBtn">Bind Now</button>
367            </div>
368            <a href="javascript:void(0)" id="fastbtnMyships" data-name="myships" class="myships must_login"><b></b><em></em>    </a>
369        </div>
370        <a href="javascript:void(0)" id="fastbtnMyflag" data-name="myflag" class="myflag must_login"><b></b><em></em></a>
371        <a href="javascript:void(0)" id="fastbtnShipscreen" data-name="shipscreen" class="shipscreen"><b></b><em></em></a>
372        <a href="javascript:void(0)" id="fastbtnLayeradd" data-name="layeradd" class="layeradd"><b></b></a>
373        <a href="javascript:void(0)" id="fastbtnSeamete" data-name="seamete" class="seamete"><b></b><em></em></a>
374        <a href="javascript:void(0)" data-name="" class="menu_btn menu_show" id="menuBtn" onclick="menuLayer.isShow()"><b></b></a>
375    </div>
376    <div id="talent" class="talent_show" style="width: 1500px; cursor: pointer;">
377        <div id="talent_person" class="fastmenu_box pos_a" style="top: 58px; width:487px; right: 64px; border-radius:2px 2px 0px 2px; ">
378        </div>
379        <div id="talent_me" class="fastmenu_box pos_a" style="height: 32px; line-height: 32px; top: 162px; right: 64px; border-radius: 0px 0px 0px 5px; box-shadow:none ">
380        </div>
381    </div>
382    <a href="javascript:void(0)" class="full_screen pos_a" data-name="" id="fullScreen" onclick="Index.fullScreen($('body')[0])"></a>
383    <a href="javascript:void(0)" id="quite" class=" pos_a" data-name="" onclick="Index.exitFullScreen($('body')[0])" style="display: none">Exit Full Screen</a>
384    <a href="javascript:void(0)" id="quiteFullScreenTrack" class=" pos_a" data-name="" onclick="map.trackService.trackPlayService.setFullScreen(false);$(this).hide()" style="display: none">Exit full-Screen</a>
385    <!--Feedback(原提意见与联系客服合并,弹框见 _FeedbackModal.cshtml)-->
386    <div class="pos_a advice_box"><a href="javascript:void(0)" onclick="FeedbackModal.open()" class="advice_btn" id="adviceBox"></a></div>
387
388    <!-- ===== Welcome Popup ===== -->
389    <div class="welcomeoverlay overlay" id="welcomeOverlay" style="display:none;">
390        <div class="modal">
391
392            <!-- Top Banner -->
393            <div class="modal-banner">
394                <div class="banner-text">
395                    <div class="banner-title">Welcome to ShipFinder</div>
396                    <div class="banner-desc">Premium maritime intelligence at a fraction of the cost — more features, less spend, no compromise.</div>
397                </div>
398                <button class="modal-close" onclick="closeWelcomeModal()">&#10005;</button>
399            </div>
400
401            <!-- Body - Two Columns -->
402            <div class="modal-body">
403                <!-- Left Column: Features -->
404                <div class="body-left">
405                    <div class="section-title">Why ShipFinder</div>
406                    <div class="feature-grid">
407                        <div class="feature-card">
408                            <div class="feat-icon">
409                                <svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
410                                    <path stroke-linecap="round" stroke-linejoin="round" d="M3.055 11H5a2 2 0 012 2v1a2 2 0 002 2 2 2 0 012 2v2.945M8 3.935V5.5A2.5 2.5 0 0010.5 8h.5a2 2 0 012 2 2 2 0 104 0 2 2 0 012-2h1.064M15 20.488V18a2 2 0 012-2h3.064M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
411                                </svg>
412                            </div>
413                            <div class="feat-title">Global AIS Tracking</div>
414                            <div class="feat-desc">Real-time satellite & terrestrial AIS covering every major shipping lane worldwide.</div>
415                        </div>
416                        <div class="feature-card">
417                            <div class="feat-icon">
418                                <svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
419                                    <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />
420                                </svg>
421                            </div>
422                            <div class="feat-title">Historical Voyage Data</div>
423                            <div class="feat-desc">Up to 15 years of port call & track history to analyze trading behavior.</div>
424                        </div>
425                        <div class="feature-card">
426                            <div class="feat-icon">
427                                <svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
428                                    <path stroke-linecap="round" stroke-linejoin="round" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z" />
429                                    <path stroke-linecap="round" stroke-linejoin="round" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z" />
430                                </svg>
431                            </div>
432                            <div class="feat-title">ETA & Arrival Forecast</div>
433                            <div class="feat-desc">Real-time estimated time of arrival with intelligent route prediction for every vessel.</div>
434                        </div>
435                        <div class="feature-card">
436                            <div class="feat-icon">
437                                <svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
438                                    <path stroke-linecap="round" stroke-linejoin="round" d="M15 17h5l-1.405-1.405A2.032 2.032 0 0118 14.158V11a6.002 6.002 0 00-4-5.659V5a2 2 0 10-4 0v.341C7.67 6.165 6 8.388 6 11v3.159c0 .538-.214 1.055-.595 1.436L4 17h5m6 0v1a3 3 0 11-6 0v-1m6 0H9" />
439                                </svg>
440                            </div>
441                            <div class="feat-title">Smart Fleet Alerts</div>
442                            <div class="feat-desc">Custom notifications for arrivals, departures, zone entry/exit & speed changes.</div>
443                        </div>
444                    </div>
445                </div>
446
447                <!-- Right Column: Bind Vessel -->
448                <div class="body-right">
449                    <div class="section-title">Free Benefits</div>
450                    <div class="bind-card">
451                        <div class="bind-icon-wrap">
452                            <svg fill="none" stroke="currentColor" stroke-width="1.5" viewB
452ox="0 0 24 24">
453                                <path stroke-linecap="round" stroke-linejoin="round" d="M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z" />
454                            </svg>
455                        </div>
456                        <div class="bind-highlight">
457                            Claim <em>1 free satellite vessel</em> to start tracking
458                        </div>
459                        <div class="bind-desc">
460                            Track any vessel worldwide with real-time satellite AIS — get live position updates, voyage history, and port call alerts at zero cost.
461                        </div>
462                        <button class="bind-btn" onclick="bindVessel()">Bind My Vessel Now</button>
463                    </div>
464                </div>
465            </div>
466
467            <!-- Footer -->
468            <div class="modal-footer">
469                <a class="btn btn-secondary" href="https://www.shipfinder.com/help-center/guides/getting-started" target="_blank" rel="noopener">Get Started Guide</a>
470                <button class="btn btn-primary" onclick="closeWelcomeModal()">Explore Platform</button>
471            </div>
472
473        </div>
474    </div>
475
476</div>
477<!--右侧菜单-->
478<div class="menu_info pos_a menu_show" id="menuInfo" style="display: none;"></div>
479<div id="hint"></div>
480<div class="foreacast_panel" style="display:none;"></div>
481
482
483<style>
484    .sfc-mask {
485        position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 10000;
486        background: rgba(23,33,46,0.45);
487        display: flex; align-items: center; justify-content: center;
488        padding: 24px;
489        opacity: 0; visibility: hidden;
490        transition: opacity 0.22s ease, visibility 0.22s ease;
491        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
492        font-size: 14px; line-height: 1.6; color: #333;
493        -webkit-font-smoothing: antialiased;
494    }
495    /* style.css 第 1 行给 div/p/input 等元素写死了 font-family:"微软雅黑"、input/textarea 写死 Arial,
496       元素选择器会压过继承,这里用类选择器让弹框内所有元素统一继承弹框的字体栈 */
497    .sfc-mask *, .sfc-select-panel *, .sfc-toast * { box-sizing: border-box; font-family: inherit; }
498    /* 下拉面板按输入框宽度定宽,自身也要 border-box,否则会比输入框宽出边框和内边距 */
499    .sfc-mask, .sfc-select-panel, .sfc-toast { box-sizing: border-box; }
500    .sfc-mask.show { opacity: 1; visibility: visible; }
501    .sfc-mask p { margin: 0; }
502    .sfc-mask button { font-family: inherit; }
503
504    .sfc-modal {
505        width: 100%; max-width: 560px; max-height: calc(100vh - 48px);
506        background: #fff; border-radius: 4px;
507        box-shadow: 0 16px 48px rgba(23,43,77,0.24);
508        display: flex; flex-direction: column; overflow: hidden;
509        transform: translateY(12px) scale(0.985);
510        transition: transform 0.22s cubic-bezier(0.2,0.7,0.3,1);
511        text-align: left;
512    }
513    .sfc-mask.show .sfc-modal { transform: translateY(0) scale(1); }
514
515    /* 标题区 */
516    .sfc-head { position: relative; padding: 16px 56px 16px 26px; background: #2770D4; color: #fff; }
517    .sfc-title { font-size: 16px; font-weight: 600; letter-spacing: 0.4px; }
518    .sfc-close {
519        position: absolute; top: 13px; right: 14px;
520        width: 30px; height: 30px; display: inline-flex; align-items: center; justify-content: center;
521        background: none; border: none; border-radius: 4px; padding: 0;
522        color: rgba(255,255,255,0.78); cursor: pointer;
523        transition: background 0.18s ease, color 0.18s ease;
524    }
525    .sfc-close svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }
526    .sfc-close:hover { background: rgba(255,255,255,0.16); color: #fff; }
527
528    /* 表单区(内容超高时只滚这一块) */
529    .sfc-body { padding: 16px 26px 0; overflow-y: auto; flex: 1; }
530    .sfc-body::-webkit-scrollbar { width: 8px; }
531    .sfc-body::-webkit-scrollbar-thumb { background: #d6dbe2; border-radius: 4px; }
532
533    .sfc-field { margin-bottom: 16px; }
534    .sfc-body > .sfc-field:last-child { margin-bottom: 0; }
535    .sfc-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
536    .sfc-label { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 6px; font-size: 13px; font-weight: 500; color: #555; }
537    .sfc-req { color: #d93843; font-weight: 600; }
538    .sfc-input, .sfc-textarea, .sfc-select-box {
539        display: block; width: 100%; height: auto; margin: 0;
540        font-family: inherit; font-size: 13.5px; line-height: normal;
540 color: #333;
541        background: #fff; border: 1px solid #ccc; border-radius: 4px;
542        padding: 8px 12px; outline: none; box-shadow: none;
543        transition: border-color 0.18s ease, box-shadow 0.18s ease;
544    }
545    .sfc-input::placeholder, .sfc-textarea::placeholder { color: #b3b9c2; }
546    .sfc-input:hover, .sfc-textarea:hover, .sfc-select-box:hover { border-color: #a8b2bf; }
547    .sfc-input:focus, .sfc-textarea:focus, .sfc-select-box.open { border-color: #2770D4; box-shadow: 0 0 0 3px rgba(39,112,212,0.13); }
548    /* 原型里 textarea 保持浏览器默认的 inline-block(下方会留出基线空隙),这里保持一致 */
549    .sfc-textarea { display: inline-block; min-height: 96px; resize: vertical; line-height: 1.6; }
550
551    /* 主题下拉 */
552    .sfc-select-box { display: flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; text-align: left; white-space: nowrap; }
553    .sfc-select-box .sfc-sv { overflow: hidden; text-overflow: ellipsis; }
554    .sfc-select-box.placeholder .sfc-sv { color: #b3b9c2; }
555    .sfc-select-box .sfc-caret { width: 20px; height: 20px; fill: #999; margin-left: auto; flex: none; transition: transform 0.2s; }
556    .sfc-select-box.open .sfc-caret { transform: rotate(180deg); }
557    /* 面板挂到 body 上用 fixed 定位:.sfc-modal 有 transform + overflow,留在原地会被裁掉 */
558    .sfc-select-panel {
559        position: fixed; z-index: 10002;
560        background: #fff; border: 1px solid #ddd; border-radius: 4px;
561        box-shadow: 0 8px 24px rgba(0,0,0,0.14);
562        padding: 5px; display: none;
563        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
564        line-height: 1.6; text-align: left;
565    }
566    .sfc-select-panel.show { display: block; }
567    .sfc-opt { padding: 7px 10px; border-radius: 4px; font-size: 13.5px; color: #555; cursor: pointer; display: flex; align-items: center; gap: 8px; }
568    .sfc-opt:hover, .sfc-opt.active { background: #e8f0fb; color: #2770D4; }
569    .sfc-opt .sfc-tick { width: 15px; height: 15px; flex: none; fill: none; stroke: #2770D4; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; opacity: 0; }
570    .sfc-opt.active .sfc-tick { opacity: 1; }
571
572    /* 校验反馈 */
573    .sfc-field.has-error .sfc-input, .sfc-field.has-error .sfc-textarea, .sfc-field.has-error .sfc-select-box { border-color: #d93843; }
574    .sfc-field.has-error .sfc-input:focus, .sfc-field.has-error .sfc-textarea:focus { box-shadow: 0 0 0 3px rgba(217,56,67,0.12); }
575    .sfc-err { display: none; margin-top: 5px !important; font-size: 12px; color: #d93843; }
576    .sfc-field.has-error .sfc-err { display: block; }
577
578    /* 操作区 */
579    .sfc-foot { display: flex; align-items: center; justify-content: flex-end; gap: 10px; padding: 18px 26px; }
580    .sfc-btn-cancel {
581        background: #fff; color: #5a6573; border: 1px solid #d5dae1;
582        padding: 8px 20px; border-radius: 4px; font-size: 13.5px; font-weight: 500; cursor: pointer; line-height: normal;
583        transition: background 0.18s ease, border-color 0.18s ease;
584    }
585    .sfc-btn-cancel:hover { background: #f5f7fa; border-color: #c2c9d2; }
586    .sfc-btn-send {
587        display: inline-flex; align-items: center; gap: 8px;
588        background: #2770D4; color: #fff; border: 1px solid #2770D4;
589        padding: 8px 24px; border-radius: 4px; font-size: 13.5px; font-weight: 600; cursor: pointer; line-height: normal;
590        transition: background 0.18s ease, box-shadow 0.18s ease;
591    }
592    .sfc-btn-send:hover { background: #1c5cb8; box-shadow: 0 4px 12px rgba(39,112,212,0.26); }
593    .sfc-btn-send:disabled { opacity: 0.7; cursor: default; box-shadow: none; }
594    .sfc-spinner { width: 14px; height: 14px; border: 2px solid rgba(255,255,255,0.45); border-top-color: #fff; border-radius: 50%; animation: sfc-spin 0.7s linear infinite; display: none; }
595    .sfc-btn-send.loading .sfc-spinner { display: block; }
596    @keyframes sfc-spin { to { transform: rotate(360deg); } }
597
598    /* 常驻邮箱条:原 Customer Service 的邮箱入口 */
599    .sfc-mail { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 14px 26px; background: #e8f0fb; border-top: 1px solid #c8dcf5; }
600    .sfc-mail .sfc-mail-ico { width: 18px; height: 18px; flex: none; fill: none; stroke: #2770D4; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
601    .sfc-mail-txt { flex: 1; min-width: 148px; font-size: 13px; color: #2c3a4b; line-height: 1.5; }
602    .sfc-mail-addr { display: block; font-size: 13.5px; font-weight: 600; color: #2770D4 !important; word-break: break-all; text-decoration: none; }
603    .sfc-mail-addr:hover { text-decoration: underline; }
604    .sfc-mail-btns { display: flex; gap: 8px; margin-left: auto; }
605    .sfc-mail-btn {
606        display: inline-flex; align-items: center; gap: 6px;
607        padding: 6px 13px; background: #fff; color: #2770D4;
608        border: 1px solid #c8dcf5; border-radius: 4px; line-height: normal;
609        font-size: 12.5px; font-weight: 600; cursor: pointer; white-space: nowrap;
610        transition: background 0.18s ease, color 0.18s ease, border-color 0.18s ease;
611    }
612    .sfc-mail-btn svg { width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
613    .sfc-mail-btn:hover { background: #2770D4; color: #fff; border-color: #2770D4; }
614    .sfc-mail-btn.copied { background: #fff; color: #1a8a52; border-color: #b7e0ca; }
615
616    /* 发送成功 */
617    .sfc-modal.is-sent .sfc-body, .sfc-modal.is-sent .sfc-foot { display: none; }
618    .sfc-sent { display: none; flex-direction: column; align-items: center; text-align: center; padding: 44px 34px 38px; }
619    .sfc-modal.is-sent .sfc-sent { display: flex; }
620    .sfc-sent-ico-wrap { width: 54px; height: 54px; display: flex; align-items: center; justify-content: center; background: #e8f0fb; border-radius: 50%; margin-bottom: 16px; }
621    .sfc-sent-ico { width: 28px; height: 28px; fill: none; stroke: #2770D4; stroke-width: 2.4; stroke-linecap: round; stroke-linejoin: round; }
622    .sfc-sent-title { font-size: 16px; font-weight: 600; color: #222; margin-bottom: 7px; }
623    .sfc-sent-desc { font-size: 13.5px; color: #888; max-width: 380px; line-height: 1.7; }
624    .sfc-sent-desc b { color: #555; font-weight: 600; }
625    .sfc-btn-done { margin-top: 22px; background: #2770D4; color: #fff; border: 1px solid #2770D4; padding: 8px 30px; border-radius: 4px; font-size: 13.5px; font-weight: 600; cursor: pointer; line-height: normal; }
626    .sfc-btn-done:hover { background: #1c5cb8; }
627
628    /* 轻提示 */
629    .sfc-toast {
630        position: fixed; left: 50%; top: 24px; transform: translateX(-50%) translateY(-14px);
631        display: inline-flex; align-items: center; gap: 9px;
632        padding: 10px 18px; background: #fff; color: #2c3a4b;
633        border: 1px solid #c8dcf5; border-radius: 4px;
634        box-shadow: 0 6px 22px rgba(23,43,77,0.16);
635        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", "Helvetica Neue", Arial, sans-serif;
636        font-size: 13.5px; font-weight: 500; white-space: nowrap;
637        opacity: 0; pointer-events: none; z-index: 10003;
638        transition: opacity 0.25s ease, transform 0.25s ease;
639    }
640    .sfc-toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }
641    .sfc-toast svg { width: 16px; height: 16px; flex: none; fill: none; stroke: #2770D4; stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; }
642    .sfc-toast.is-error { border-color: #f2c4c7; }
643    .sfc-toast.is-error svg { stroke: #d93843; }
644
645    @media (max-width: 620px) {
646        .sfc-mask { padding: 0; align-items: flex-end; }
647        .sfc-modal { max-width: none; max-height: 94vh; border-radius: 4px 4px 0 0; }
648        .sfc-row { grid-template-columns: 1fr; gap: 0; }
649        .sfc-head { padding: 15px 50px 15px 20px; }
650        .sfc-body { padding: 16px 20px 0; }
651        .sfc-foot { padding: 16px 20px; }
652        .sfc-btn-cancel, .sfc-btn-send { flex: 1; justify-content: center; }
653        .sfc-mail { padding: 14px 20px; }
654        .sfc-mail-btns { margin-left: 0; width: 100%; }
655        .sfc-mail-btn { flex: 1; justify-content: center; }
656    }
657</style>
658
659<div class="sfc-mask" id="sfcModal" role="dialog" aria-modal="true" aria-labelledby="sfcTitle">
660    <div class="sfc-modal" id="sfcPanel">
661
662        <div class="sfc-head">
663            <div class="sfc-title" id="sfcTitle">Contact us</div>
664            <button type="button" class="sfc-close" id="sfcClose" aria-label="Close">
665                <svg viewBox="0 0 24 24">
665<path d="M6 6l12 12M18 6L6 18" /></svg>
666            </button>
667        </div>
668
669        <div class="sfc-body">
670            <div class="sfc-row">
671                <div class="sfc-field">
672                    <label class="sfc-label" for="sfcEmail">Email <span class="sfc-req" aria-hidden="true">*</span></label>
673                    <input class="sfc-input" id="sfcEmail" type="email" autocomplete="email" maxlength="100" placeholder="[email protected]">
674                    <p class="sfc-err" data-err></p>
675                </div>
676                <div class="sfc-field">
677                    <label class="sfc-label" for="sfcName">Name <span class="sfc-req" aria-hidden="true">*</span></label>
678                    <input class="sfc-input" id="sfcName" type="text" autocomplete="name" maxlength="100" placeholder="Your full name">
679                    <p class="sfc-err" data-err></p>
680                </div>
681            </div>
682
683            <div class="sfc-field">
684                <label class="sfc-label" for="sfcCompany">Company</label>
685                <input class="sfc-input" id="sfcCompany" type="text" autocomplete="organization" maxlength="200" placeholder="Company or organisation">
686                <p class="sfc-err" data-err></p>
687            </div>
688
689            <div class="sfc-field">
690                <label class="sfc-label" id="sfcTopicLabel">What can we help you with? <span class="sfc-req" aria-hidden="true">*</span></label>
691                <div>
692                    <button type="button" class="sfc-select-box placeholder" id="sfcTopicBox" aria-haspopup="listbox" aria-expanded="false" aria-labelledby="sfcTopicLabel">
693                        <span class="sfc-sv" id="sfcTopicText">Select a topic</span>
694                        <svg class="sfc-caret" viewBox="0 0 24 24"><path d="M7 10l5 5 5-5z" /></svg>
695                    </button>
696                    <div class="sfc-select-panel" id="sfcTopicPanel" role="listbox" aria-labelledby="sfcTopicLabel">
697                        <div class="sfc-opt" role="option" data-value="Pricing &amp; Plans"><svg class="sfc-tick" viewBox="0 0 24 24"><path d="M20 6.5 9.6 17 4 11.4" /></svg>Pricing &amp; Plans</div>
698                        <div class="sfc-opt" role="option" data-value="API Integration / Technical Support"><svg class="sfc-tick" viewBox="0 0 24 24"><path d="M20 6.5 9.6 17 4 11.4" /></svg>API Integration / Technical Support</div>
699                        <div class="sfc-opt" role="option" data-value="Business Access / Enterprise Trial"><svg class="sfc-tick" viewBox="0 0 24 24"><path d="M20 6.5 9.6 17 4 11.4" /></svg>Business Access / Enterprise Trial</div>
700                        <div class="sfc-opt" role="option" data-value="Partnership / Data Collaboration"><svg class="sfc-tick" viewBox="0 0 24 24"><path d="M20 6.5 9.6 17 4 11.4" /></svg>Partnership / Data Collaboration</div>
701                        <div class="sfc-opt" role="option" data-value="Other"><svg class="sfc-tick" viewBox="0 0 24 24"><path d="M20 6.5 9.6 17 4 11.4" /></svg>Other, please specify</div>
702                    </div>
703                </div>
704                <p class="sfc-err" data-err></p>
705            </div>
706
707            <div class="sfc-field">
708                <label class="sfc-label" for="sfcMessage">Message <span class="sfc-req" aria-hidden="true">*</span></label>
709                <textarea class="sfc-textarea" id="sfcMessage" placeholder="Tell us more about your needs"></textarea>
710                <p class="sfc-err" data-err></p>
711            </div>
712        </div>
713
714        <div class="sfc-foot">
715            <button type="button" class="sfc-btn-cancel" data-sfc-close>Cancel</button>
716            <button type="button" class="sfc-btn-send" id="sfcSend"><span class="sfc-spinner"></span>Send message</button>
717        </div>
718
719        <!-- 发送成功后替换表单区和操作区 -->
720        <div class="sfc-sent">
721            <div class="sfc-sent-ico-wrap"><svg class="sfc-sent-ico" viewBox="0 0 24 24"><path d="M20 6.5 9.6 17 4 11.4" /></svg></div>
722            <div class="sfc-sent-title">Message sent</div>
723            <p class="sfc-sent-desc">We've received your message and will reply to <b id="sfcSentTo">your email</b> within one business day.</p>
724            <button type="button" class="sfc-btn-done" data-sfc-close>Done</button>
725        </div>
726
727        <!-- 常驻邮箱条,成功页也保留 -->
728        <div class="sfc-mail">
729            <svg class="sfc-mail-ico" viewBox="0 0 24 24">
729<path d="M3.5 6h17v12h-17z" /><path d="M3.5 6.6 12 13l8.5-6.4" /></svg>
730            <div class="sfc-mail-txt">
731                Prefer to write your own email?
732                <a class="sfc-mail-addr" href="mailto:[email protected]">[email protected]</a>
733            </div>
734            <div class="sfc-mail-btns">
735                <button type="button" class="sfc-mail-btn" id="sfcCopy">
736                    <svg viewBox="0 0 24 24"><rect x="9" y="9" width="11" height="11" rx="1.6" /><path d="M5.5 15H5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h9a1 1 0 0 1 1 1v.5" /></svg>
737                    Copy address
738                </button>
739                <button type="button" class="sfc-mail-btn" id="sfcCompose">
740                    <svg viewBox="0 0 24 24"><path d="M4 20h16" /><path d="M6 15.5 16.4 5.1a2 2 0 0 1 2.8 2.8L8.8 18.3 4.6 19.4z" /></svg>
741                    Open email app
742                </button>
743            </div>
744        </div>
745
746    </div>
747</div>
748
749<div class="sfc-toast" id="sfcToast" role="status" aria-live="polite">
750    <svg viewBox="0 0 24 24"><path d="M20 6.5 9.6 17 4 11.4" /></svg>
751    <span id="sfcToastTxt"></span>
752</div>
753
754<script>
755    var FeedbackModal = (function () {
756        'use strict';
757
758        var SUPPORT_MAIL = '[email protected]';
759        var userName = '';
760        var isLogin = userName.length > 0;
761
762        var mask = document.getElementById('sfcModal');
763        var panel = document.getElementById('sfcPanel');
764        var elEmail = document.getElementById('sfcEmail');
765        var elName = document.getElementById('sfcName');
766        var elComp = document.getElementById('sfcCompany');
767        var elMsg = document.getElementById('sfcMessage');
768        var topicBox = document.getElementById('sfcTopicBox');
769        var topicPan = document.getElementById('sfcTopicPanel');
770        var topicTxt = document.getElementById('sfcTopicText');
771        var btnSend = document.getElementById('sfcSend');
772        var modalBody = panel.querySelector('.sfc-body');
773        var toast = document.getElementById('sfcToast');
774        var toastTxt = document.getElementById('sfcToastTxt');
775
776        var topic = '';
777        var account = null;   //GetUserInfo 返回的用户资料,首次打开时取一次后缓存
778        var lastFocus = null;
779        var toastTimer = null;
780
781        function each(list, fn) { Array.prototype.forEach.call(list, fn); }
782
783        function showToast(msg, isError) {
784            toastTxt.textContent = msg;
785            toast.classList.toggle('is-error', !!isError);
786            toast.classList.add('show');
787            clearTimeout(toastTimer);
788            toastTimer = setTimeout(function () { toast.classList.remove('show'); }, isError ? 3500 : 2000);
789        }
790
791        /* ---------- 已登录:带出 Email / Name / Company ---------- */
792        //自动填入的值记在 data-auto 上;框里的值被用户改过就不再覆盖
793        function autoFill(el, value) {
794            if (!value) return;
795            if (el.value === '' || el.value === el.getAttribute('data-auto')) {
796                el.value = value;
797                el.setAttribute('data-auto', value);
798            }
799        }
800
801        function fillFromAccount() {
802            if (!isLogin) return;
803            //先用用户名兜底,打开即有值
804            autoFill(elEmail, userName);
805            autoFill(elName, userName);
806
807            if (account) { applyAccount(account); return; }
808            $.ajax({ url: '/User/GetUserInfo', type: 'POST', dataType: 'json' }).done(function (r) {
809                if (r && r.status == 0 && r.data) {
810                    account = r.data;
811                    if (mask.classList.contains('show') && !panel.classList.contains('is-sent')) applyAccount(account);
812                }
813            });
814        }
815
816        function applyAccount(a) {
817            autoFill(elEmail, (a.Email || '').trim());
818            autoFill(elName, (a.Contact || '').trim());
819            autoFill(elComp, (a.CompanyName || '').trim());
820        }
821
822        /* ---------- 打开 / 关闭 ---------- */
823        function open() {
824            lastFocus = document.activeElement;
825            resetForm();
826            //先标记为已打开再取资料:GetUserInfo 若同步返回,回调里的"弹框已打开"判断才不会把资料丢掉
827            mask.classList.add('show');
828            fillFromAccount();
829            setTimeout(function () { (isLogin ? topicBox : elEmail).focus(); }, 60);
830        }
831
832        function close() {
833            mask.classList.remove('show');
834            closeTopic();
835            if (lastFocus && lastFocus.focus) lastFocus.focus();
836        }
837
838        function resetForm() {
839            panel.classList.remove('is-sent');
840            each([elEmail, elName, elComp, elMsg], function (el) { el.value = ''; el.removeAttribute('data-auto'); });
841            topic = '';
842            topicTxt.textContent = 'Select a topic';
843            topicBox.classList.add('placeholder');
844            each(topicPan.querySelectorAll('.sfc-opt'), function (o) { o.classList.remove('active'); });
845            each(panel.querySelectorAll('.sfc-field'), clearError);
846            btnSend.classList.remove('loading');
847            btnSend.disabled = false;
848        }
849
850        each(panel.querySelectorAll('[data-sfc-close]'), function (b) { b.addEventListener('click', close); });
851        document.getElementById('sfcClose').addEventListener('click', close);
852        mask.addEventListener('mousedown', function (e) { if (e.target === mask) close(); });
853
854        document.addEventListener('keydown', function (e) {
855            if (!mask.classList.contains('show')) return;
856            if (e.key === 'Escape') {
857                if (topicPan.classList.contains('show')) { closeTopic(); topicBox.focus(); }
858                else close();
859                return;
860            }
861            if (e.key === 'Tab') trapFocus(e);
862        });
863
864        function trapFocus(e) {
865            var items = panel.querySelectorAll('button:not([disabled]), input, textarea, a[href]');
866            var list = Array.prototype.filter.call(items, function (el) { return el.offsetParent !== null; });
867            if (!list.length) return;
868            var first = list[0], last = list[list.length - 1];
869            if (e.shiftKey && document.activeElement === first) { e.preventDefault(); last.focus(); }
870            else if (!e.shiftKey && document.activeElement === last) { e.preventDefault(); first.focus(); }
871        }
872
873        /* ---------- 主题下拉 ---------- */
874        document.body.appendChild(topicPan);
875
876        function placeTopic() {
877            var r = topicBox.getBoundingClientRect();
878            topicPan.style.width = r.width + 'px';
879            topicPan.style.left = r.left + 'px';
880            topicPan.style.top = '-9999px';
881            var h = topicPan.offsetHeight;
882            var below = window.innerHeight - r.bottom - 12;
883            topicPan.style.top = (h > below && r.top > below ? r.top - h - 4 : r.bottom + 4) + 'px';
884        }
885        function openTopic() {
886            topicPan.classList.add('show'); topicBox.classList.add('open');
887            topicBox.setAttribute('aria-expanded', 'true');
888            placeTopic();
889        }
890        function closeTopic() {
891            topicPan.classList.remove('show'); topicBox.classList.remove('open');
892            topicBox.setAttribute('aria-expanded', 'false');
893        }
894        modalBody.addEventListener('scroll', function () { if (topicPan.classList.contains('show')) placeTopic(); });
895        window.addEventListener('resize', function () { if (topicPan.classList.contains('show')) placeTopic(); });
896
897        topicBox.addEventListener('click', function (e) {
898            e.stopPropagation();
899            topicPan.classList.contains('show') ? closeTopic() : openTopic();
900        });
901        document.addEventListener('click', function (e) {
902            if (!topicPan.contains(e.target) && !topicBox.contains(e.target)) closeTopic();
903        });
904
905        each(topicPan.querySelectorAll('.sfc-opt'), function (opt) {
906            opt.addEventListener('click', function () {
907                topic = opt.getAttribute('data-value');
908                topicTxt.textContent = opt.textContent.trim();
909                topicBox.classList.remove('placeholder');
910                each(topicPan.querySelectorAll('.sfc-opt'), function (o) { o.classList.remove('active'); });
911                opt.classList.add('active');
912                closeTopic();
913                clearError(fieldOf(topicBox));
914            });
915        });
916
917        /* ---------- 校验 ---------- */
918        function fieldOf(el) { return el.closest('.sfc-field'); }
919        function setError(field, msg) {
920            field.classList.add('has-error');
921            var p = field.querySelector('[data-err]');
922            if (p) p.textContent = msg;
923        }
924        function clearError(field) { if (field) field.classList.remove('has-error'); }
925
926        each([elEmail, elName, elMsg], function (el) {
927            el.addEventListener('input', function () { clearError(fieldOf(el)); });
928        });
929
930        function validate() {
931            var firstBad = null;
932            function bad(field, el, msg) { setError(field, msg); if (!firstBad) firstBad = el; }
933
934            each(panel.querySelectorAll('.sfc-field'), clearError);
935
936            var f = fieldOf(elEmail);
937            if (!elEmail.value.trim()) bad(f, elEmail, 'Enter your email address so we can reply.');
938            else if (!/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/.test(elEmail.value.trim())) bad(f, elEmail, 'This email address looks incomplete.');
939
940            f = fieldOf(elName);
941            if (!elName.value.trim()) bad(f, elName, 'Enter your name.');
942
943            f = fieldOf(topicBox);
944            if (!topic) bad(f, topicBox, 'Choose the topic closest to your question.');
945
946            f = fieldOf(elMsg);
947            if (!elMsg.value.trim()) bad(f, elMsg, 'Add a short message so we can help faster.');
948
949            if (firstBad) firstBad.focus();
950            return !firstBad;
951        }
952
953        /* ---------- 提交:沿用 /Home/Suggest,接口参数不变 ---------- */
954        //ASP.NET 请求验证会拦截带 HTML 标记的表单值("A potentially dangerous Request.Form value"),
955        //所以 Content 只能是纯文本:去掉尖括号和 & 井号写法,控制字符压成空格
956        //控制字符(含换行、制表)一律压成空格,按字符码判断,避免在正则里写转义序列
957        function stripControlChars(s) {
958            var out = '';
959            for (var i = 0; i < s.length; i++) {
960                var c = s.charCodeAt(i);
961                out += (c < 32 || c === 127) ? ' ' : s.charAt(i);
962            }
963            return out;
964        }
965
966        function plainText(s) {
967            var t = String(s == null ? '' : s).replace(/[<>]/g, ' ').replace(/&#/g, '# ');
968            return stripControlChars(t).replace(/ +/g, ' ').trim();
969        }
970
971        //接口只有 Content / Mobile / Email:Topic、Name、Company 用竖线拼进 Content,不使用任何 HTML 标记
972        function buildContent(p) {
973            //先按换行切开再逐行清洗,多行留言用 " / " 分隔
974            var lines = String(p.message == null ? '' : p.message).split(String.fromCharCode(10));
975            var msg = [];
976            each(lines, function (line) {
977                var t = plainText(line);
978                if (t) msg.push(t);
979            });
980            return [
981                'Topic: ' + plainText(p.topic),
982                'Name: ' + plainText(p.name),
983                'Company: ' + (plainText(p.company) || '-'),
984                'Message: ' + msg.join(' / ')
985            ].join(' | ');
986        }
987
988        btnSend.addEventListener('click', function () {
989            if (btnSend.disabled || !validate()) return;
990
991            var payload = {
992                email: elEmail.value.trim(),
993                name: elName.value.trim(),
994                company: elComp.value.trim(),
995                topic: topic,
996                message: elMsg.value.trim()
997            };
998
999            btnSend.classList.add('loading');
1000            btnSend.disabled = true;
1001
1002            $.ajax({
1003                url: '/Home/Suggest',
1004                type: 'POST',
1005                dataType: 'json',
1006                data: { Content: buildContent(payload), Mobile: '', Email: payload.email }
1007            }).done(function (ret) {
1008                if (ret && ret.status == 0) {
1009                    document.getElementById('sfcSentTo').textContent = payload.email;
1010                    panel.classList.add('is-sent');
1011                    panel.querySelector('.sfc-btn-done').focus();
1012                } else {
1013                    showToast('Sorry, your message could not be sent. Please try again later or email us directly.', true);
1014                }
1015            }).fail(function () {
1016                showToast('Sorry, your message could not be sent. Please try again later or email us directly.', true);
1017            }).always(function () {
1018                btnSend.classList.remove('loading');
1019                btnSend.disabled = false;
1020            });
1021        });
1022
1023        /* ---------- 邮箱条:复制地址 / 唤起邮件客户端 ---------- */
1024        var btnCopy = document.getElementById('sfcCopy');
1025        btnCopy.addEventListener('click', function () {
1026            var done = function () {
1027                btnCopy.classList.add('copied');
1028                showToast('Email address copied');
1029                setTimeout(function () { btnCopy.classList.remove('copied'); }, 1600);
1030            };
1031            function fallbackCopy() {
1032                var ta = document.createElement('textarea');
1033                ta.value = SUPPORT_MAIL;
1034                ta.style.position = 'fixed'; ta.style.opacity = '0';
1035                document.body.appendChild(ta); ta.select();
1036                try { document.execCommand('copy'); done(); } catch (err) { showToast(SUPPORT_MAIL); }
1037                document.body.removeChild(ta);
1038            }
1039            if (navigator.clipboard && navigator.clipboard.writeText) {
1040                navigator.clipboard.writeText(SUPPORT_MAIL).then(done).catch(fallbackCopy);
1041            } else fallbackCopy();
1042        });
1043
1044        //把已选主题带进邮件标题
1045        document.getElementById('sfcCompose').addEventListener('click', function () {
1046            var subject = topic || 'ShipFinder enquiry';
1047            window.location.href = 'mailto:' + SUPPORT_MAIL + '?subject=' + encodeURIComponent(subject);
1048        });
1049
1050        return { open: open, close: close };
1051    })();
1052</script>
1052
1053
1054<script>
1055    var map
1056    $(function () {
1057        Index.mapInit();
1058
1059    })
1060</script>
vendor: 2 bytes, line 1060
1060
1061<script src="/Content/js/elane/logstatics.js?v=22"></script>
vendor: 2 bytes, line 1061
1061
1062<script src="/Content/js/elane/elane.fishery.js?v=22"></script>
vendor: 2 bytes, line 1062
1062
1063<script src="/Content/js/elane/elane.strait.js?v=22"></script>
vendor: 2 bytes, line 1063
1063
1064<script src="/Content/js/elane/elane.terminator.js?v=22"></script>
vendor: 2 bytes, line 1064
1064
1065<script src="/Content/js/Register.js"></script>
1065
1066<style>
1067    .sat-bubble-wrap {
1068        position: relative;
1069        display: inline-block;
1070    }
1071
1072    .sat-bubble {
1073        position: absolute;
1074        right: calc(100% + 12px);
1075        top: 0;
1076        background: #fff;
1077        border: 1px solid #e0e6ed;
1078        border-radius: 4px;
1079        box-shadow: 0 4px 16px rgba(0,0,0,.10);
1080        padding: 14px 30px 14px 16px;
1081        white-space: nowrap;
1082        z-index: 50;
1083        animation: satBubbleIn .25s ease;
1084    }
1085
1086    @keyframes satBubbleIn {
1087        from {
1088            opacity: 0;
1089            transform: translateX(8px);
1090        }
1091
1092        to {
1093            opacity: 1;
1094            transform: translateX(0);
1095        }
1096    }
1097
1098    .sat-bubble::after {
1099        content: '';
1100        position: absolute;
1101        right: -6px;
1102        top: 12px;
1103        transform: rotate(45deg);
1104        width: 10px;
1105        height: 10px;
1106        background: #fff;
1107        border-top: 1px solid #e0e6ed;
1108        border-right: 1px solid #e0e6ed;
1109    }
1110
1111    .sat-bubble-text {
1112        font-size: 12px;
1113        color: #333;
1114        line-height: 1.8;
1115        margin-bottom: 12px;
1116        padding-right: 4px;
1117    }
1118
1119        .sat-bubble-text strong {
1120            color: rgba(255,157,0,.9);
1121            font-weight: 600;
1122        }
1123
1124    .sat-bubble-close {
1125        position: absolute;
1126        top: 2px;
1127        right: 4px;
1128        width: 28px;
1129        height: 28px;
1130        border: none;
1131        background: none;
1132        cursor: pointer;
1133        color: #999;
1134        font-size: 20px;
1135        line-height: 1;
1136        display: flex;
1137        align-items: center;
1138        justify-content: center;
1139    }
1140
1141        .sat-bubble-close:hover {
1142            color: #333;
1143        }
1144
1145    .sat-bubble-btn {
1146        font-family: inherit;
1147        font-size: 12px;
1148        height: 28px;
1149        padding: 0 16px;
1150        border-radius: 2px;
1151        border: 1px solid rgba(255,157,0,.9);
1152        background: rgba(255,157,0,.9);
1153        color: #fff;
1154        cursor: pointer;
1155        font-weight: 500;
1156    }
1157
1158        .sat-bubble-btn:hover {
1159            background: rgba(230,141,0,.9);
1160            border-color: rgba(230,141,0,.9);
1161        }
1162</style>
1163<script src="/Content/js/freeVessel.js?v=22"></script>
vendor: 2 bytes, line 1163
1163
1164<script>$(function () { freeVessel.initSatBubble(); });</script>
vendor: 2 bytes, line 1164
1164
1165<script src="/Content/js/elane/tideCallback.js"></script>
vendor: 2 bytes, line 1165
1165
1166<script src="/Content/js/MultiSelect.js"></script>
vendor: 2 bytes, line 1166
1166
1167<script src="/Content/js/otherUserInfo.js"></script>
1167
1168
1169
1170    <!--统计代码-->
1171    <div style="display: none;">
1172        
1172<script>
1173            var _hmt = _hmt || [];
1174            (function () {
1175                var hm = document.createElement("script");
1176                hm.src = "https://hm.baidu.com/hm.js?e4ab21382195d0b8f58bf32cfc30900d";
1177                var s = document.getElementsByTagName("script")[0];
1178                s.parentNode.insertBefore(hm, s);
1179            })();
1180        </script>
1180
1181    </div>
1182</body>
1183</html>

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.