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 & 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 & 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">×</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()">✕</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 & Plans"><svg class="sfc-tick" viewBox="0 0 24 24"><path d="M20 6.5 9.6 17 4 11.4" /></svg>Pricing & 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.