1Packeta = window.Packeta || {}; 2Packeta.Viewport = { 3 element: null, 4 originalValue: null, 5 set: function() { 6 if (!Packeta.Viewport.element) { 7 Packeta.Viewport.element = document.querySelector("meta[name=viewport]"); 8 if (Packeta.Viewport.element) { 9 Packeta.Viewport.originalValue = Packeta.Viewport.element.getAttribute("content"); 10 } else { 11 Packeta.Viewport.originalValue = 'user-scalable=yes'; 12 Packeta.Viewport.element = document.createElement('meta'); 13 Packeta.Viewport.element.setAttribute("name", "viewport"); 14 (document.head || document.getElementsByTagName('head')[0]).appendChild(Packeta.Viewport.element); 15 } 16 } 17 Packeta.Viewport.element.setAttribute('content', 'width=device-width, initial-scale=1.0, minimum-scale=1.0, user-scalable=yes'); 18 }, 19 restore: function() { 20 if (Packeta.Viewport.originalValue !== null) { 21 Packeta.Viewport.element.setAttribute('content', Packeta.Viewport.originalValue); 22 } 23 } 24}; 25 26Packeta.Util = { 27 28 makeRequest: function(method, url, data, callback) { 29 try { 30 var xhr = new XMLHttpRequest(); 31 xhr.open(method, url); 32 xhr.timeout = 5000; 33 34 xhr.onload = function() { 35 if (this.status >= 200 && this.status < 300) { 36 callback(xhr.response, false); 37 } else { 38 callback({ 39 status: this.status, 40 statusText: xhr.statusText 41 }, true); 42 } 43 }; 44 45 xhr.onerror = function() { 46 callback({ 47 status: this.status, 48 statusText: xhr.statusText 49 }, true); 50 }; 51 52 xhr.ontimeout = function() { 53 callback({ 54 status: this.status, 55 statusText: xhr.statusText 56 }, true); 57 }; 58 59 if (method === "POST" && data) { 60 xhr.send(data); 61 } else { 62 xhr.send(); 63 } 64 } catch (error) { 65 callback({ 66 error: "XMLHttpRequest error: " + error 67 }, true) 68 } 69 } 70}; 71 72Packeta.Widget = { 73 baseUrl: 'https://widget.packeta.com/', 74 backupUrl: 'https://backup.widget.packeta.com/', 75 healthUrl: 'https://widget.packeta.com/v6/api/hcs/api/healthcheck', 76 errorUrl: 'https://error-page-service-widget-errors.prod.packeta-com.codenow.com/', 77 versions: { 78 backup: 'backup', 79 base: 'base', 80 error: 'error' 81 }, 82 close: function() {}, 83 initIframe: function(apiKey, callback, opts, inElement) { 84 Packeta.Widget.close(); 85 86 if (!opts) { 87 opts = {}; 88 } 89 if (!('version' in opts)) { 90 opts.version = 3; 91 } 92 93 opts.apiKey = apiKey; 94 95 var url = Packeta.Widget.baseUrl; 96 97 if (opts.currentVersion === Packeta.Widget.versions.backup) { 98 url = Packeta.Widget.backupUrl; 99 } 100 101 if (opts.currentVersion === Packeta.Widget.versions.error) { 102 url = Packeta.Widget.errorUrl; 103 } 104 105 url = url + 'v6/#/?'; 106 107 for (let param in opts) { 108 url += "&" + param + "=" + encodeURIComponent(opts[param]); 109 } 110 111 var inline = (typeof(inElement) != "undefined" && inElement !== null); 112 var wrapper; 113 if (inline) { 114 wrapper = inElement; 115 } else { 116 Packeta.Viewport.set(); 117 wrapper = document.createElement("div"); 118 wrapper.setAttribute("style", "z-index: 999999; position: fixed; -webkit-backface-visibility: hidden; left: 0; top: 0; width: 100%; height: 100%; background: " + (opts.overlayColor || "rgba(0, 0, 0, 0.3)") + "; "); 119 wrapper.addEventListener("click", function() { 120 Packeta.Widget.close(); 121 }); 122 123 // fix for some older browsers which fail to do 100% width of position:absolute inside position:fixed element 124 setTimeout( 125 function() { 126 var rect = iframe.getBoundingClientRect(); 127 var width = ('width' in rect ? rect.width : rect.right - rect.left); 128 if (Math.round(width) < window.innerWidth - 100) { // 10px = side padding sum, just as a safety measure 129 iframe.style.width = window.innerWidth + "px"; 130 iframe.style.height = window.innerHeight + "px"; 131 } 132 }, 133 0 134 ); 135 } 136
137 // always support Escape key immediatelly after the widget is displayed, even for inline 138 wrapper.addEventListener("keyup", function(e) { 139 if (e.keyCode == 27) { 140 Packeta.Widget.close(); 141 } 142 }); 143 144 var iframe = document.createElement("iframe"); 145 if (inline) { 146 iframe.setAttribute("style", "border: hidden; width: 100%; height: 100%; "); 147 } else { 148 iframe.setAttribute("style", "border: hidden; position: absolute; left: 0; top: 0; width: 100%; height: 100%; padding: 10px 5px; box-sizing: border-box; "); 149 } 150 iframe.setAttribute('id', "packeta-widget"); 151 iframe.setAttribute('sandbox', "allow-scripts allow-same-origin allow-popups"); 152 iframe.setAttribute('allow', "geolocation"); 153 iframe.setAttribute('allowfullscreen', "true"); 154 iframe.setAttribute('src', url); 155 156 wrapper.appendChild(iframe); 157 if (!inline) { 158 document.body.appendChild(wrapper); 159 } 160 161 if (wrapper.getAttribute("tabindex") === null) { 162 wrapper.setAttribute("tabindex", "-1"); // make it focusable 163 } 164 wrapper.focus(); 165 166 var receiver = function(e) { 167 // check if this is message from the Packeta Widget 168 try { 169 var message = typeof e.data === "object" ? e.data : JSON.parse(e.data); 170 if (!message.packetaWidgetMessage) return; 171 } catch (err) { 172 return; 173 } 174 if (opts.layout && ['hd', 'ac', 'rs'].includes(opts.layout.toLocaleLowerCase())) { 175 Packeta.Widget.close(message); 176 } else if (opts.layout && ['cd', 'cdmap', 'cdreg'].includes(opts.layout.toLocaleLowerCase())) { 177 Packeta.Widget.close(message.delivery); 178 } else { 179 Packeta.Widget.close(message.packetaPoint); 180 } 181 182 183 }; 184 window.addEventListener('message', receiver); 185 186 Packeta.Widget.close = function(point) { 187 window.removeEventListener('message', receiver); 188 if (inline) { 189 try { 190 iframe.parentNode.removeChild(iframe); 191 } catch (err) { 192 // ignore 193 } 194 } else { 195 document.body.removeChild(wrapper); 196 Packeta.Viewport.restore(); 197 } 198 callback(point || null); 199 Packeta.Widget.close = function() {}; 200 }; 201 }, 202 pick: function(apiKey, callback, opts, inElement) { 203 204 if (!opts) { 205 opts = {}; 206 } 207 208 opts.loader = 'library'; 209 opts.referrer = window.location.origin; 210 211 const vendorsKey = Object.keys(opts) 212 .find(key => (key.toLowerCase() === "vendors")); 213 214 if (vendorsKey && typeof opts[vendorsKey] === 'object') { 215 try { 216 opts[vendorsKey] = opts[vendorsKey] 217 .map(item => ( 218 `${item.country || ''},` 219 + `${item.group || ''},` 220 + `${item.carrierId || ''},` 221 + `${item.currency || ''},` 222 + `${(item.price || item.price === 0) ? item.price : ''},` 223 + `${item.selected || ''}`)) 224 .join('|'); 225 } catch (error) { 226 opts[vendorsKey] = ''; 227 } 228 } 229 230 if (opts.layout && ['hd', 'ac', 'rs'].includes(opts.layout.toLocaleLowerCase())) { 231 Packeta.Widget.baseUrl = 'https://hd.widget.packeta.com/'; 232 Packeta.Widget.backupUrl = 'https://backup.widget.packeta.com/'; 233 Packeta.Widget.healthUrl = 'https://hd.widget.packeta.com/api/hcs/api/healthcheck'; 234 } else if (opts.layout && ['cd', 'cdmap', 'cdreg'].includes(opts.layout.toLocaleLowerCase())) { 235 Packeta.Widget.baseUrl = 'https://cardelivery.widget.packeta.com/'; 236 Packeta.Widget.backupUrl = 'https://backup.widget.packeta.com/'; 237 Packeta.Widget.healthUrl = 'https://cardelivery.widget.packeta.com/v6/api/hcs/api/healthcheck'; 238 } else { 239 Packeta.Widget.baseUrl = 'https://widget.packeta.com/'; 240 Packeta.Widget.backupUrl = 'https://backup.widget.packeta.com/'; 241 Packeta.Widget.healthUrl = 'https://widget.packeta.com/v6/api/hcs/api/healthcheck'; 242 } 243 244 function runBase() { 245 opts.currentVersion = Packeta.Widget.versions.base; 246 Packeta.Widget.initIframe(apiKey, callback, opts, inElement); 247 }; 248 249 function runBA() { 250 opts.currentVersion = Packeta.Widget.versions.backup; 251 Packeta.Widget.initIframe(apiKey, callback, opts, inElement); 252 } 253 254 function runError() { 255 opts.currentVersion = Packeta.Widget.versions.error; 256 Packeta.Widget.initIframe(apiKey, callback, opts, inElement); 257 } 258
259 Packeta.Util.makeRequest("GET", Packeta.Widget.healthUrl, null, function(data, error) { 260 261 if (!error) { 262 263 var result = data.toLocaleLowerCase() === "true"; 264 265 console.log("Widget health check result: " + result); 266 267 if (result === true) { 268 console.log("starting Widget"); 269 runBase(); 270 } else if (Packeta.Widget.backupUrl !== opts.referrer) { 271 console.log("starting backup environment"); 272 runBA(); 273 } else { 274 console.log("backup environment healthcheck failed"); 275 runError(); 276 } 277 278 } else { 279 console.log("Widget health check result: " + JSON.stringify(data)); 280 console.log("starting backup environment"); 281 if (Packeta.Widget.backupUrl !== opts.referrer) { 282 runBA(); 283 } else { 284 console.log("backup environment healthcheck failed"); 285 runError(); 286 } 287 } 288 }) 289 290 291 } 292};
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.