PageSourceSearch

https://snowscan.xyz/assets/js/custom/commonjs.js?v=26.9.3.0

js snowscan.xyz collected 2026-09-25 19:15:36 UTC 110,693 bytes, 2,627 lines download raw bytes

1var strAge = $("#hdnAgeText").val();
2var strDateTime = $("#hdnDateTimeText").val();
3var strDateTimeLocal = "Date Time (Local)";
4var strDateTimeLocalShort = "Local";
5var strSiteName = $("#hdnSiteName").val();
6
7var strAgeTitle = $("#hdnAgeTitle").val();
8var strDateTimeTitle = $("#hdnDateTimeTitle").val();
9
10var ageClass = ".showAge";
11var dateTimeClass = ".showDate";
12var localDateTimeClass = ".showLocalDate"
13var localDateTimeNFTClass = ".showLocalDateNFT"
14var offsetHoursFinal;
15
16var strTxnFee = $("#hdnTxnText").val();
17var strGasPrice = $("#hdnGasPriceText").val();
18
19function checkAdBlock() {
20    var element = document.createElement("div");
21    element.id = "checkAdBlock"
22    element.className = "banner_ad";
23    element.style.width = "0.5px";
24    document.body.appendChild(element);
25    if ($("#checkAdBlock").width() > 0) {
26        return false;
27    } else {
28        return true;
29    }
30}
31
32function setAgeDateTimeCookie(strValue) {
33    var d = new Date();
34    d.setFullYear(d.getFullYear() + 1);
35    var expires = "expires=" + d.toUTCString();
36    document.cookie = strSiteName + "_switch_age_datetime=" + strValue + ";" + expires + ";path=/";
37}
38
39function onDocumentReady(isDataTable, isShortText) {
40    if (isShortText) {
41        strDateTime = "UTC"
42    }
43
44    if (strGlobal == "" || strGlobal == strAge) {
45        $("#lnkAgeDateTime").text(strAge);
46        $("#lnkAgeDateTime").attr("title", strDateTimeTitle);
47        $(dateTimeClass).hide();
48        //check display UTC or Local datetime
49        convertUtcToLocalDateTime();
50        $(ageClass).show();
51    }
52    else if (strGlobal == strDateTime) {
53        $("#lnkAgeDateTime").text(strDateTime);
54        $("#lnkAgeDateTime").attr("title", strAgeTitle);
55        $(ageClass).hide();
56        $(dateTimeClass).show();
57        //check display UTC or Local datetime
58        convertUtcToLocalDateTime();
59        //show UTC with timezone on column header
60        if (offsetHoursFinal !== undefined) {
61            $("#lnkAgeDateTime").text(strDateTimeLocal);
62        }
63    }
64
65    if (strGlobalFee == null || strGlobalFee == "null" || strGlobalFee == strTxnFee) {
66        $(".switch-txn-fee-gas-price").text(strTxnFee);
67        $(".switch-txn-fee-gas-price").attr("title", $("#hdnTxnFeeTitle").val());
68        $(".showTxnFee").show();
69        $(".showGasPrice").hide();
70    } else if (strGlobalFee == strGasPrice) {
71        $(".switch-txn-fee-gas-price").text(strGasPrice);
72        $(".switch-txn-fee-gas-price").attr("title", $("#hdnGasPriceTitle").val());
73        $(".showTxnFee").hide();
74        $(".showGasPrice").show();
75    }
76
77    if (strGlobalSlotEpoch == null || strGlobalSlotEpoch == "null" || strGlobalSlotEpoch == "Slot") {
78        $(".switch-slot-epoch").text("Slot");
79        $(".switch-slot-epoch").attr("title", "Click to show Epoch");
80        $(".switch-slot-epoch").attr("data-bs-title", "Click to show Epoch");
81        $(".showSlotNumber").show();
82        $(".showEpochNumber").hide();
83    } else if (strGlobalSlotEpoch == "Epoch") {
84        $(".switch-slot-epoch").text("Epoch");
85        $(".switch-slot-epoch").attr("title", "Click to show Slot");
86        $(".switch-slot-epoch").attr("data-bs-title", "Click to show Slot");
87        $(".showSlotNumber").hide();
88        $(".showEpochNumber").show();
89    }
90
91    if (!isDataTable) {
92        renderFnTooltip($("#lnkAgeDateTime"), 0);
93        renderFnTooltip($(".switch-txn-fee-gas-price"), 0);
94        renderFnTooltip($(".switch-slot-epoch"), 0);
95    }
96}
97
98function onDateAgeDocumentReady(opts) {
99    strGlobal = getCookie(strSiteName + "_switch_age_datetime");
100    var el = $(".hc_lnkAgeDateTime")
101    var customAgeText = strAge
102    var customDateTime = strDateTime
103
104    if (typeof opts !== 'undefined') {
105        if (opts.el) {
106            el = $(opts.el)
107        }
108
109        if (opts.customAgeText) {
110            customAgeText = opts.customAgeText
111        }
112        if (opts.customDateTime) {
113            customDateTime = opts.customDateTime
114        }
115    }
116
117    if (strGlobal == "" || strGlobal == strAge) {
118        el.text(customAgeText);
119        el.attr("title", strDateTimeTitle);
120        $(dateTimeClass).hide();
121        //check display UTC or Local datetime
122        convertUtcToLocalDateTime();
123        $(ageClass).show();
124    }
125    else if (strGlobal == strDateTime) {
126        el.text(customDateTime);
127        el.attr("title", strAgeTitle);
128        $(ageClass).hide();
129
130        //check display UTC or Local datetime
131        convertUtcToLocalDateTime();
132        //show UTC with timezone on column header
133        if (offsetHoursFinal !== undefined) {
134            el.text(strDateTimeLocal);
135        }
136
137        $(dateTimeClass).show();
138    }
139
140    renderFnTooltip(el, 0)
141}
142
143function switchAgeToDateTime(data) {
144
145    disposeFnTooltip($("#" + data.id))
146
147    var strVal = $("#" + data.id).text();
148    if (strVal == strAge) {
149        $("#" + data.id).text(strDateTime);
150        $("#" + data.id).attr("title", strAgeTitle);
151        $(dateTimeClass).show();
152
153        //check display UTC or Local datetime
154        convertUtcToLocalDateTime();
155        //show UTC with timezone on column header
156        if (offsetHoursFinal !== undefined) {
157            $("#" + data.id).text(strDateTimeLocal);
158        }
159
160        $(ageClass).hide();
161        setAgeDateTimeCookie(strDateTime);
162    }
163    else if (strVal == strDateTime || strVal == strDateTimeLocal) {
164        $("#" + data.id).text(strAge);
165        $("#" + data.id).attr("title", strDateTimeTitle);
166        $(dateTimeClass).hide();
167        $(ageClass).show();
168        setAgeDateTimeCookie(strAge);
169    }
170
171    renderFnTooltip($("#" + data.id), 1)
172}
173
174function switchAgeToDateTimeV2(self, opts) {
175    var strVal = $("#" + self.id).text();
176    var el = self ? $(self) : $(".hc_lnkAgeDateTime")
177    disposeFnTooltip(el)
178
179    var customAgeText = strAge
180    var customDateTime = strDateTime
181    var elParent = ""
182    var elChild = ""
183
184    if (typeof opts !== 'undefined') {
185        if (opts.el) {
186            el = $(opts.el)
187        }
188        if (opts.customAgeText) {
189            customAgeText = opts.customAgeText
190        }
191        if (opts.customDateTime) {
192            customDateTime = opts.customDateTime
193        }
194        if (opts.elParent) {
195            elParent = opts.elParent
196        }
197        if (opts.elParent) {
198            elChild = opts.elChild
199        }
200    }
201    if (strVal == customAgeText) {
202        el.text(customDateTime);
203        el.attr("title", strAgeTitle);
204        $(dateTimeClass).show();
205
206        //check display UTC or Local datetime
207        convertUtcToLocalDateTime();
208        //show UTC with timezone on column header
209        if (offsetHoursFinal !== undefined) {
210            el.text(strDateTimeLocal);
211        }
212
213        $(ageClass).hide();
214        setAgeDateTimeCookie(strDateTime);
215    }
216    else if (strVal == customDateTime || strVal == strDateTimeLocal) {
217        el.text(customAgeText);
218        el.attr("title", strDateTimeTitle);
219        $(dateTimeClass).hide();
220        $(ageClass).show();
221        setAgeDateTimeCookie(strAge);
222    }
223
224    renderFnTooltip(el, 1)
225}
226
227function onAddressDocReady() {
228    if (strGlobal == "" || strGlobal == strAge) {
229        $("#lnkTxAgeDateTime").text(strAge);
230        $("#lnkTxAgeDateTime").attr("title", strDateTimeTitle);
231        $("#lnkIntAgeDateTime").text(strAge);
232        $("#lnkIntAgeDateTime").attr("title", strDateTimeTitle);
233        $("#lnkMinBlkAgeDateTime").text(strAge);
234        $("#lnkMinBlkAgeDateTime").attr("title", strDateTimeTitle);
235        $("#lnkMinUncAgeDateTime").text(strAge);
236        $("#lnkMinUncAgeDateTime").attr("title", strDateTimeTitle);
237        $("#lnkWithBlkAgeDateTime").text(strAge);
238        $("#lnkWithBlkAgeDateTime").attr("title", strDateTimeTitle);
239        $("#lnkDepositBlkAgeDateTime").text(strAge);
240        $("#lnkDepositBlkAgeDateTime").attr("title", strDateTimeTitle);
241        $("#hdnErc20").val(strAge);
242        $(dateTimeClass).attr("style", "display:none !important");
243        $(ageClass).show();
244    }
245    else if (strGlobal == strDateTime) {
246        $("#lnkTxAgeDateTime").text(strDateTime);
247        $("#lnkTxAgeDateTime").attr("title", strAgeTitle);
248        $("#lnkIntAgeDateTime").text(strDateTime);
249        $("#lnkIntAgeDateTime").attr("title", strAgeTitle);
250        $("#lnkMinBlkAgeDateTime").text(strDateTime);
251        $("#lnkMinBlkAgeDateTime").attr("title", strAgeTitle);
252        $("#lnkMinUncAgeDateTime").text(strDateTime);
253        $("#lnkMinUncAgeDateTime").attr("title", strAgeTitle);
254        $("#lnkWithBlkAgeDateTime").text(strDateTime);
255        $("#lnkWithBlkAgeDateTime").attr("title", strAgeTitle);
256        $("#lnkDepositBlkAgeDateTime").text(strDateTime);
257        $("#lnkDeposithBlkAgeDateTime").attr("title", strAgeTitle);
258        $("#hdnErc20").val(strDateTime);
259        $(ageClass).attr("style", "display:none !important");
260        $(dateTimeClass).show();
261
262        //check display UTC or Local datetime
263        convertUtcToLocalDateTime();
264        //show UTC with timezone on column header
265        if (offsetHoursFinal !== undefined) {
266            $("#lnkTxAgeDateTime").text(strDateTimeLocal);
267            $("#lnkIntAgeDateTime").text(strDateTimeLocal);
268            $("#lnkMinBlkAgeDateTime").text(strDateTimeLocal);
269            $("#lnkWithBlkAgeDateTime").text(strDateTimeLocal);
270            $("#lnkDepositBlkAgeDateTime").text(strDateTimeLocal);
271        }
272    }
273
274    renderFnTooltip($("#lnkTxAgeDateTime"), 0)
275    renderFnTooltip($("#lnkIntAgeDateTime"), 0)
276    renderFnTooltip($("#lnkMinBlkAgeDateTime"), 0)
277    renderFnTooltip($("#lnkMinUncAgeDateTime"), 0)
278    renderFnTooltip($("#lnkWithBlkAgeDateTime"), 0)
279    renderFnTooltip($("#lnkDepositBlkAgeDateTime"), 0)
280}
281
282function switchAgeToDateTimeInAddPage(data) {
283    disposeFnTooltip($("#lnkTxAgeDateTime"))
284    disposeFnTooltip($("#lnkIntAgeDateTime"))
285    disposeFnTooltip($("#lnkMinBlkAgeDateTime"))
286    disposeFnTooltip($("#lnkMinUncAgeDateTime"))
287    disposeFnTooltip($("#lnkWithBlkAgeDateTime"))
288    disposeFnTooltip($("#lnkDepositBlkAgeDateTime"))
289
290    var strVal = $("#" + data.id).text();
291    if (strVal == strAge) {
292        $("#lnkTxAgeDateTime").text(strDateTime);
293        $("#lnkTxAgeDateTime").attr("title", strAgeTitle);
294        $("#lnkIntAgeDateTime").text(strDateTime);
295        $("#lnkIntAgeDateTime").attr("title", strAgeTitle);
296        $("#lnkMinBlkAgeDateTime").text(strDateTime);
297        $("#lnkMinBlkAgeDateTime").attr("title", strAgeTitle);
298        $("#lnkMinUncAgeDateTime").text(strDateTime);
299        $("#lnkMinUncAgeDateTime").attr("title", strAgeTitle);
300        $("#lnkWithBlkAgeDateTime").text(strDateTime);
301        $("#lnkWithBlkAgeDateTime").attr("title", strAgeTitle);
302        $("#lnkDepositBlkAgeDateTime").text(strDateTime);
303        $("#lnkDepositBlkAgeDateTime").attr("title", strAgeTitle);
304        $("#hdnErc20").val(strDateTime);
305        $(dateTimeClass).show();
306        $(ageClass).attr("style", "display:none !important");
307        setAgeDateTimeCookie(strDateTime);
308
309        //check display UTC or Local datetime
310        convertUtcToLocalDateTime();
311        //show UTC with timezone on column header
312        if (offsetHoursFinal !== undefined) {
313            $("#lnkTxAgeDateTime").text(strDateTimeLocal);
314            $("#lnkIntAgeDateTime").text(strDateTimeLocal);
315            $("#lnkMinBlkAgeDateTime").text(strDateTimeLocal);
316            $("#lnkWithBlkAgeDateTime").text(strDateTimeLocal);
317            $("#lnkDepositBlkAgeDateTime").text(strDateTimeLocal);
318        }
319
320        if (document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime') != null) {
321            document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime').text = strDateTime;
322            document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime').title = strAgeTitle;
323            $("#tokenpageiframe").contents().find(dateTimeClass).show();
324            $("#tokenpageiframe").contents().find(ageClass).hide();
325        }
326
327        //if (document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime') != null) {
328        //    document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime').text = strDateTime;
329        //    document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime').title = strAgeTitle;
330        //    $("#tokenerc721_pageiframe").contents().find(dateTimeClass).show();
331        //    $("#tokenerc721_pageiframe").contents().find(ageClass).hide();
332        //}
333
334        //if (document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime') != null) {
335        //    document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime').text = strDateTime;
336        //    document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime').title = strAgeTitle;
337        //    $("#tokenerc1155_pageiframe").contents().find(dateTimeClass).show();
338        //    $("#tokenerc1155_pageiframe").contents().find(ageClass).hide();
339        //}
340
341        if (document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime') != null) {
342            document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime').text = strDateTime;
343            document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime').title = strAgeTitle;
344            $("#loans_pageiframe").contents().find(dateTimeClass).show();
345            $("#loans_pageiframe").contents().find(ageClass).hide();
346        }
347    }
348    else if (strVal == strDateTime || strVal == strDateTimeLocal) {
349        $("#lnkTxAgeDateTime").text(strAge);
350        $("#lnkTxAgeDateTime").attr("title", strDateTimeTitle);
351        $("#lnkIntAgeDateTime").text(strAge);
352        $("#lnkIntAgeDateTime").attr("title", strDateTimeTitle);
353        $("#lnkMinBlkAgeDateTime").text(strAge);
354        $("#lnkMinBlkAgeDateTime").attr("title", strDateTimeTitle);
355        $("#lnkMinUncAgeDateTime").text(strAge);
356        $("#lnkMinUncAgeDateTime").attr("title", strDateTimeTitle);
357        $("#lnkWithBlkAgeDateTime").text(strAge);
358        $("#lnkWithBlkAgeDateTime").attr("title", strDateTimeTitle);
359        $("#lnkDepositBlkAgeDateTime").text(strAge);
360        $("#lnkDepositBlkAgeDateTime").attr("title", strDateTimeTitle);
361        $("#hdnErc20").val(strAge);
362        $(dateTimeClass).attr("style", "display:none !important");
363        $(ageClass).show();
364        setAgeDateTimeCookie(strAge);
365
366        if (document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime') != null) {
367            document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime').text = strAge;
368            document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime').title = strDateTimeTitle;
369            $("#tokenpageiframe").contents().find(dateTimeClass).hide();
370            $("#tokenpageiframe").contents().find(ageClass).show();
371        }
372
373        //if (document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime') != null) {
374        //    document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime').text = strAge;
375        //    document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime').title = strDateTimeTitle;
376        //    $("#tokenerc721_pageiframe").contents().find(dateTimeClass).hide();
377        //    $("#tokenerc721_pageiframe").contents().find(ageClass).show();
378        //}
379
380        //if (document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime') != nu
380ll) {
381        //    document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime').text = strAge;
382        //    document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime').title = strDateTimeTitle;
383        //    $("#tokenerc1155_pageiframe").contents().find(dateTimeClass).hide();
384        //    $("#tokenerc1155_pageiframe").contents().find(ageClass).show();
385        //}
386
387        if (document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime') != null) {
388            document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime').text = strAge;
389            document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime').title = strDateTimeTitle;
390            $("#loans_pageiframe").contents().find(dateTimeClass).hide();
391            $("#loans_pageiframe").contents().find(ageClass).show();
392        }
393    }
394
395    renderFnTooltip($("#lnkTxAgeDateTime"), (data.id === "lnkTxAgeDateTime" ? 1 : 0))
396    renderFnTooltip($("#lnkIntAgeDateTime"), (data.id === "lnkIntAgeDateTime" ? 1 : 0))
397    renderFnTooltip($("#lnkMinBlkAgeDateTime"), (data.id === "lnkMinBlkAgeDateTime" ? 1 : 0))
398    renderFnTooltip($("#lnkMinUncAgeDateTime"), (data.id === "lnkMinUncAgeDateTime" ? 1 : 0))
399    renderFnTooltip($("#lnkWithBlkAgeDateTime"), (data.id === "lnkWithBlkAgeDateTime" ? 1 : 0))
400    renderFnTooltip($("#lnkDepositBlkAgeDateTime"), (data.id === "lnkDepositBlkAgeDateTime" ? 1 : 0))
401}
402
403function setGlobalValue(data) {
404    var strVal = $("#" + data.id).val();
405    if (strVal == "" || strVal == strAge) {
406        setAgeDateTimeCookie(strAge);
407        switchAgeDateTimeFromIframe(data);
408    }
409    else if (strVal == strDateTime) {
410        setAgeDateTimeCookie(strDateTime);
411        switchAgeDateTimeFromIframe(data);
412    }
413}
414
415function switchAgeDateTimeFromIframe(data) {
416    disposeFnTooltip($("#lnkTxAgeDateTime"))
417    disposeFnTooltip($("#lnkIntAgeDateTime"))
418    disposeFnTooltip($("#lnkMinBlkAgeDateTime"))
419    disposeFnTooltip($("#lnkMinUncAgeDateTime"))
420    disposeFnTooltip($("#lnkWithBlkAgeDateTime"))
421    disposeFnTooltip($("#lnkDepositBlkAgeDateTime"))
422
423    var strVal = $("#" + data.id).val();
424    if (strVal == strDateTime) {
425        $("#lnkTxAgeDateTime").text(strDateTime);
426        $("#lnkTxAgeDateTime").attr("title", strAgeTitle);
427        $("#lnkIntAgeDateTime").text(strDateTime);
428        $("#lnkIntAgeDateTime").attr("title", strAgeTitle);
429        $("#lnkMinBlkAgeDateTime").text(strDateTime);
430        $("#lnkMinBlkAgeDateTime").attr("title", strAgeTitle);
431        $("#lnkMinUncAgeDateTime").text(strDateTime);
432        $("#lnkMinUncAgeDateTime").attr("title", strAgeTitle);
433        $("#lnkWithBlkAgeDateTime").text(strDateTime);
434        $("#lnkWithBlkAgeDateTime").attr("title", strAgeTitle);
435        $("#lnkDepositBlkAgeDateTime").text(strDateTime);
436        $("#lnkDepositBlkAgeDateTime").attr("title", strAgeTitle);
437        $(dateTimeClass).show();
438
439        $(ageClass).attr("style", "display:none !important");
440
441        if (document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime') != null) {
442            document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime').text = strDateTime;
443            document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime').title = strAgeTitle;
444            $("#tokenpageiframe").contents().find(dateTimeClass).show();
445            $("#tokenpageiframe").contents().find(ageClass).hide();
446
447            //check display UTC or Local datetime
448            convertUtcToLocalDateTime();
449            //show UTC with timezone on column header
450            if (offsetHoursFinal !== undefined) {
451                document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime').text = strDateTimeLocal;
452            }
453        }
454
455        //if (document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime') != null) {
456        //    document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime').text = strDateTime;
457        //    document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime').title = strAgeTitle;
458        //    $("#tokenerc721_pageiframe").contents().find(dateTimeClass).show();
459        //    $("#tokenerc721_pageiframe").contents().find(ageClass).hide();
460        //}
461
462        //if (document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime') != null) {
463        //    document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime').text = strDateTime;
464        //    document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime').title = strAgeTitle;
465        //    $("#tokenerc1155_pageiframe").contents().find(dateTimeClass).show();
466        //    $("#tokenerc1155_pageiframe").contents().find(ageClass).hide();
467        //}
468
469        if (document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime') != null) {
470            document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime').text = strDateTime;
471            document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime').title = strAgeTitle;
472            $("#loans_pageiframe").contents().find(dateTimeClass).show();
473            $("#loans_pageiframe").contents().find(ageClass).hide();
474        }
475    }
476    else if (strVal == strAge) {
477        $("#lnkTxAgeDateTime").text(strAge);
478        $("#lnkTxAgeDateTime").attr("title", strDateTimeTitle);
479        $("#lnkIntAgeDateTime").text(strAge);
480        $("#lnkIntAgeDateTime").attr("title", strDateTimeTitle);
481        $("#lnkMinBlkAgeDateTime").text(strAge);
482        $("#lnkMinBlkAgeDateTime").attr("title", strDateTimeTitle);
483        $("#lnkMinUncAgeDateTime").text(strAge);
484        $("#lnkMinUncAgeDateTime").attr("title", strDateTimeTitle);
485        $("#lnkWithBlkAgeDateTime").text(strAge);
486        $("#lnkWithBlkAgeDateTime").attr("title", strDateTimeTitle);
487        $("#lnkDepositBlkAgeDateTime").text(strAge);
488        $("#lnkDepositBlkAgeDateTime").attr("title", strDateTimeTitle);
489        $(dateTimeClass).attr("style", "display:none !important");
490        $(ageClass).show();
491
492        if (document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime') != null) {
493            document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime').text = strAge;
494            document.getElementById('tokenpageiframe').contentWindow.document.getElementById('lnkErc20AgeDateTime').title = strDateTimeTitle;
495            $("#tokenpageiframe").contents().find(dateTimeClass).hide();
496            $("#tokenpageiframe").contents().find(ageClass).show();
497        }
498
499        //if (document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime') != null) {
500        //    document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime').text = strAge;
501        //    document.getElementById('tokenerc721_pageiframe').contentWindow.document.getElementById('lnkErc721AgeDateTime').title = strDateTimeTitle;
502        //    $("#tokenerc721_pageiframe").contents().find(dateTimeClass).hide();
503        //    $("#tokenerc721_pageiframe").contents().find(ageClass).show();
504        //}
505
506        //if (document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime') != null) {
507        //    document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime').text = strAge;
508        //    document.getElementById('tokenerc1155_pageiframe').contentWindow.document.getElementById('lnkErc1155AgeDateTime').title = strDateTimeTitle;
509        //    $("#tokenerc1155_pageiframe").contents().find(dateTimeClass).hide();
510        //    $("#tokenerc1155_pageiframe").contents().find(ageClass).show();
511        //}
512
513        if (document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime') != null) {
514            document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime').text = strAge;
515            document.getElementById('loans_pageiframe').contentWindow.document.getElementById('lnkLoanAgeDateTime').title = strDateTimeTitle;
516            $("#loans_pageiframe").contents().find(dateTimeClass).hide();
517            $("#loans_pageiframe").contents().find(ageClass).show();
518        }
519    }
520
521    renderFnTooltip($("#lnkTxAgeDateTime"), (data.id === "lnkTxAgeDateTime" ? 1 : 0))
522    renderFnTooltip($("#lnkIntAgeDateTime"), (data.id === "lnkIntAgeDateTime" ? 1 : 0))
523    renderFnTooltip($("#lnkMinBlkAgeDateTime"), (data.id === "lnkMinBlkAgeDateTime" ? 1 : 0))
524    renderFnTooltip($("#lnkMinUncAgeDateTime"), (data.id === "lnkMinUncAgeDateTime" ? 1 : 0))
525    renderFnTooltip($("#lnkWithBlkAgeDateTime"), (data.id === "lnkWithBlkAgeDateTime" ? 1 : 0))
526    renderFnTooltip($("#lnkDepositBlkAgeDateTime"), (data.id === "lnkDepositBlkAgeDateTime" ? 1 : 0))
527}
528
529function onAddTokenDocReady() {
530    var obj = window.parent.document.getElementById('hdnErc20');
531    if (obj.value == "" || obj.value == strAge) {
532        $("#lnkErc20AgeDateTime").text(strAge);
533        $("#lnkErc20AgeDateTime").attr("title", strDateTimeTitle);
534        $(dateTimeClass).hide();
535        $(ageClass).show();
536    }
537    else if (obj.value == strDateTime) {
538        $("#lnkErc20AgeDateTime").text(strDateTime);
539        $("#lnkErc20AgeDateTime").attr("title", strAgeTitle);
540        $(ageClass).hide();
541        $(dateTimeClass).show();
542
543        //check display UTC or Local datetime
544        convertUtcToLocalDateTime();
545        //show UTC with timezone on column header
546        if (offsetHoursFinal !== undefined) {
547            $("#lnkErc20AgeDateTime").text(strDateTimeLocal);
548        }
549
550
551    }
552
553    renderFnTooltip($("#lnkErc20AgeDateTime"), 0)
554}
555
556function switchAgeToDateTimeAddToken(data) {
557
558    disposeFnTooltip($("#" + data.id))
559    var strVal = $("#" + data.id).text();
560    if (strVal == strAge) {
561        $("#" + data.id).text(strDateTime);
562        $("#" + data.id).attr("title", strAgeTitle);
563        $(dateTimeClass).show();
564
565        //check display UTC or Local datetime
566        convertUtcToLocalDateTime();
567        //show UTC with timezone on column header
568        if (offsetHoursFinal !== undefined) {
569            $("#" + data.id).text(strDateTimeLocal);
570        }
571
572        $(ageClass).hide();
573        var obj = window.parent.document.getElementById('hdnErc20');
574        obj.value = strDateTime;
575        parent.setGlobalValue(obj);
576    }
577    else if (strVal == strDateTime || strVal == strDateTimeLocal) {
578        $("#" + data.id).text(strAge);
579        $("#" + data.id).attr("title", strDateTimeTitle);
580        $(dateTimeClass).hide();
581        $(ageClass).show();
582        var obj = window.parent.document.getElementById('hdnErc20');
583        obj.value = strAge;
584        parent.setGlobalValue(obj);
585    }
586
587    renderFnTooltip($("#" + data.id), 1)
588}
589
590function onERC721DocReady() {
591    var obj = window.parent.document.getElementById('hdnErc20');
592    if (obj.value == "" || obj.value == strAge) {
593        $("#lnkErc721AgeDateTime").text(strAge);
594        $("#lnkErc721AgeDateTime").attr("title", strDateTimeTitle);
595        $(dateTimeClass).hide();
596        $(ageClass).show();
597    }
598    else if (obj.value == strDateTime) {
599        $("#lnkErc721AgeDateTime").text(strDateTime);
600        $("#lnkErc721AgeDateTime").attr("title", strAgeTitle);
601        $(ageClass).hide();
602        $(dateTimeClass).show();
603
604        //check display UTC or Local datetime
605        convertUtcToLocalDateTime();
606        //show UTC with timezone on column header
607        if (offsetHoursFinal !== undefined) {
608            $("#lnkErc721AgeDateTime").text(strDateTimeLocal);
609        }
610    }
611
612    renderFnTooltip($("#lnkErc721AgeDateTime"), 0)
613}
614
615function switchAgeToDateTimeERC721Token(data) {
616    disposeFnTooltip($("#" + data.id))
617    var strVal = $("#" + data.id).text();
618    if (strVal == strAge) {
619        $("#" + data.id).text(strDateTime);
620        $("#" + data.id).attr("title", strAgeTitle);
621        $(dateTimeClass).show();
622
623        //check display UTC or Local datetime
624        convertUtcToLocalDateTime();
625        //show UTC with timezone on column header
626        if (offsetHoursFinal !== undefined) {
627            $("#" + data.id).text(strDateTimeLocal);
628        }
629
630        $(ageClass).hide();
631        var obj = window.parent.document.getElementById('hdnErc20');
632        obj.value = strDateTime;
633        parent.setGlobalValue(obj);
634    }
635    else if (strVal == strDateTime || strVal == strDateTimeLocal) {
636        $("#" + data.id).text(strAge);
637        $("#" + data.id).attr("title", strDateTimeTitle);
638        $(dateTimeClass).hide();
639        $(ageClass).show();
640        var obj = window.parent.document.getElementById('hdnErc20');
641        obj.value = strAge;
642        parent.setGlobalValue(obj);
643    }
644
645    renderFnTooltip($("#" + data.id), 1)
646}
647
648function onERC1155DocReady() {
649    var obj = window.parent.document.getElementById('hdnErc20');
650    if (obj.value == "" || obj.value == strAge) {
651        $("#lnkErc1155AgeDateTime").text(strAge);
652        $("#lnkErc1155AgeDateTime").attr("title", strDateTimeTitle);
653        $(dateTimeClass).hide();
654        $(ageClass).show();
655    }
656    else if (obj.value == strDateTime) {
657        $("#lnkErc1155AgeDateTime").text(strDateTime);
658        $("#lnkErc1155AgeDateTime").attr("title", strAgeTitle);
659        $(ageClass).hide();
660        $(dateTimeClass).show();
661    }
662
663    renderFnTooltip($("#lnkErc1155AgeDateTime"), 0)
664}
665
666function onBridgeDepositDocReady() {
667    var obj = window.parent.document.getElementById('hdnErc20');
668    if (obj.value == "" || obj.value == strAge) {
669        $("#lnkBridgeDepositAgeDateTime").text(strAge);
670        $("#lnkBridgeDepositAgeDateTime").attr("title", strDateTimeTitle);
671        $(dateTimeClass).hide();
672        $(ageClass).show();
673    }
674    else if (obj.value == strDateTime) {
675        $("#lnkBridgeDepositAgeDateTime").text(strDateTime);
676        $("#lnkBridgeDepositAgeDateTime").attr("title", strAgeTitle);
677        $(ageClass).hide();
678        $(dateTimeClass).show();
679
680        //check display UTC or Local datetime
681        convertUtcToLocalDateTime();
682        //show UTC with timezone on column header
683        if (offsetHoursFinal !== undefined) {
684            $("#lnkBridgeDepositAgeDateTime").text(strDateTimeLocal);
685        }
686    }
687    $("#lnkBridgeDepositAgeDateTime").attr("data-toggle-commonjs", "tooltip");
688    $("[data-toggle-commonjs='tooltip']").tooltip();
689}
690
691function onRewardDocReady() {
692    var obj = window.parent.document.getElementById('hdnErc20');
693    if (obj.value == "" || obj.value == strAge) {
694        $("#lnkRewardAgeDateTime").text(strAge);
695        $("#lnkRewardAgeDateTime").attr("title", strDateTimeTitle);
696        $(dateTimeClass).hide();
697        $(ageClass).show();
698    }
699    else if (obj.value == strDateTime) {
700        $("#lnkRewardAgeDateTime").text(strDateTime);
701        $("#lnkRewardAgeDateTime").attr("title", strAgeTitle);
702        $(ageClass).hide();
703        $(dateTimeClass).show();
704
705        //check display UTC or Local datetime
706        convertUtcToLocalDateTime();
707        //show UTC with timezone on column header
708        if (offsetHoursFinal !== undefined) {
709            $("#lnkRewardAgeDateTime").text(strDateTimeLocal);
710        }
711    }
712    $("#lnkRewardAgeDateTime").attr("data-toggle-commonjs", "tooltip");
713    $("[data-toggle-commonjs='tooltip']").tooltip();
714}
715
716function clearGlobalValue() {
717 
717   strGlobal = "";
718    document.cookie = strSiteName + "_switch_age_datetime=" + strGlobal;
719}
720
721function onTokenTxnsDocReady() {
722    var obj = window.parent.document.getElementById('hdnTokenTxns2');
723    if (obj.value == "" || obj.value == "null" || obj.value == strAge) {
724        $("#lnkTokenTxnsAgeDateTime").text(strAge);
725        $("#lnkTokenTxnsAgeDateTime").attr("title", strDateTimeTitle);
726        $(dateTimeClass).hide();
727        //check display UTC or Local datetime
728        convertUtcToLocalDateTime();
729        $(ageClass).show();
730    }
731    else if (obj.value == strDateTime) {
732        $("#lnkTokenTxnsAgeDateTime").text(strDateTime);
733        $("#lnkTokenTxnsAgeDateTime").attr("title", strAgeTitle);
734        $(ageClass).hide();
735        $(dateTimeClass).show();
736
737        //check display UTC or Local datetime
738        convertUtcToLocalDateTime();
739        //show UTC with timezone on column header
740        if (offsetHoursFinal !== undefined) {
741            $("#lnkTokenTxnsAgeDateTime").text(strDateTimeLocal);
742        }
743    }
744
745    renderFnTooltip($("#lnkTokenTxnsAgeDateTime"), 0)
746}
747
748function switchAgeToDateTimeTokenTxns(data) {
749    disposeFnTooltip($("#" + data.id))
750    var strVal = $("#" + data.id).text();
751    if (strVal == strAge) {
752        $("#" + data.id).text(strDateTime);
753        $("#" + data.id).attr("title", strAgeTitle);
754        $(dateTimeClass).show();
755
756        //check display UTC or Local datetime
757        convertUtcToLocalDateTime();
758        //show UTC with timezone on column header
759        if (offsetHoursFinal !== undefined) {
760            $("#" + data.id).text(strDateTimeLocal);
761        }
762
763        $(ageClass).hide();
764        var obj = window.parent.document.getElementById('hdnTokenTxns2');
765        obj.value = strDateTime;
766        parent.setGlobalTokenValue(obj);
767    }
768    else if (strVal == strDateTime || strVal == strDateTimeLocal) {
769        $("#" + data.id).text(strAge);
770        $("#" + data.id).attr("title", strDateTimeTitle);
771        $(dateTimeClass).hide();
772        $(ageClass).show();
773        var obj = window.parent.document.getElementById('hdnTokenTxns2');
774        obj.value = strAge;
775        parent.setGlobalTokenValue(obj);
776    }
777
778    renderFnTooltip($("#" + data.id), 1)
779}
780
781function onAddLoanDocReady() {
782    var obj = window.parent.document.getElementById('hdnErc20');
783    if (obj.value == "" || obj.value == strAge) {
784        $("#lnkLoanAgeDateTime").text(strAge);
785        $("#lnkLoanAgeDateTime").attr("title", strDateTimeTitle);
786        $(dateTimeClass).hide();
787        $(ageClass).show();
788    }
789    else if (obj.value == strDateTime) {
790        $("#lnkLoanAgeDateTime").text(strDateTime);
791        $("#lnkLoanAgeDateTime").attr("title", strAgeTitle);
792        $(ageClass).hide();
793        $(dateTimeClass).show();
794    }
795
796    renderFnTooltip($("#lnkLoanAgeDateTime"), 0)
797}
798
799function onDexTradeDocReady() {
800    var obj = window.parent.document.getElementById('hdnTokenTxns2');
801    if (obj.value == "" || obj.value == "null" || obj.value == strAge) {
802        $("#lnkDexTradeAgeDateTime").text(strAge);
803        $("#lnkDexTradeAgeDateTime").attr("title", strDateTimeTitle);
804        $(dateTimeClass).hide();
805        $(ageClass).show();
806    }
807    else if (obj.value == strDateTime) {
808        $("#lnkDexTradeAgeDateTime").text(strDateTime);
809        $("#lnkDexTradeAgeDateTime").attr("title", strAgeTitle);
810        $(ageClass).hide();
811        $(dateTimeClass).show();
812        //check display UTC or Local datetime
813        convertUtcToLocalDateTime();
814        //show UTC with timezone on column header
815        if (offsetHoursFinal !== undefined) {
816            $("#lnkDexTradeAgeDateTime").text(strDateTimeLocal);
817        }
818    }
819
820    renderFnTooltip($("#lnkDexTradeAgeDateTime"), 0)
821}
822
823function switchTxFeeGasPrice(self) {
824    disposeFnTooltip(self ? $(self) : $(".switch-txn-fee-gas-price"))
825
826    var strVal = self ? $(self).text() : $(".switch-txn-fee-gas-price").text();
827    if (strVal == strTxnFee) {
828        $(".switch-txn-fee-gas-price").text(strGasPrice);
829        $(".switch-txn-fee-gas-price").attr("title", $("#hdnGasPriceTitle").val());
830        $(".showGasPrice").show();
831        $(".showTxnFee").hide();
832        sessionStorage.setItem("ShowFee", strGasPrice);
833    }
834    else if (strVal == strGasPrice) {
835        $(".switch-txn-fee-gas-price").text(strTxnFee);
836        $(".switch-txn-fee-gas-price").attr("title", $("#hdnTxnFeeTitle").val());
837        $(".showGasPrice").hide();
838        $(".showTxnFee").show();
839        sessionStorage.setItem("ShowFee", strTxnFee);
840    }
841
842    if (self) {
843        renderFnTooltip($(self), 1)
844    } else {
845        renderFnTooltip($(".switch-txn-fee-gas-price"), 1)
846    }
847
848}
849
850function switchSlotAndEpoch(self) {
851    disposeFnTooltip(self ? $(self) : $(".switch-slot-epoch"))
852
853    var strVal = self ? $(self).text() : $(".switch-slot-epoch").text();
854    if (strVal == "Slot") {
855        $(".switch-slot-epoch").text("Epoch");
856        $(".switch-slot-epoch").attr("title", "Click to show Slot");
857        $(".switch-slot-epoch").attr("data-bs-title", "Click to show Slot");
858        $(".showEpochNumber").show();
859        $(".showSlotNumber").hide();
860        sessionStorage.setItem("ShowSlotEpoch", "Epoch");
861    }
862    else if (strVal == "Epoch") {
863        $(".switch-slot-epoch").text("Slot");
864        $(".switch-slot-epoch").attr("title", "Click to show Epoc
864h");
865        $(".switch-slot-epoch").attr("data-bs-title", "Click to show Epoch");
866        $(".showEpochNumber").hide();
867        $(".showSlotNumber").show();
868        sessionStorage.setItem("ShowSlotEpoch", "Slot");
869    }
870
871    if (self) {
872        renderFnTooltip($(self), 1)
873    } else {
874        renderFnTooltip($(".switch-slot-epoch"), 1)
875    }
876}
877
878function setGlobalTokenValue(data) {
879    var strVal = $("#" + data.id).val();
880    if (strVal == "" || strVal == strAge) {
881        setAgeDateTimeCookie(strAge);
882        switchAgeDateTimeInTokenIframe(data);
883    }
884    else if (strVal == strDateTime) {
885        setAgeDateTimeCookie(strDateTime);
886        switchAgeDateTimeInTokenIframe(data);
887    }
888}
889
890function switchAgeDateTimeInTokenIframe(data) {
891    var strVal = $("#" + data.id).val();
892    if (strVal == strDateTime) {
893        if (document.getElementById('tokentxnsiframe').contentWindow.document.getElementById('lnkTokenTxnsAgeDateTime') != null) {
894            document.getElementById('tokentxnsiframe').contentWindow.document.getElementById('lnkTokenTxnsAgeDateTime').text = strDateTime;
895            document.getElementById('tokentxnsiframe').contentWindow.document.getElementById('lnkTokenTxnsAgeDateTime').title = strAgeTitle;
896            $("#tokentxnsiframe").contents().find(dateTimeClass).show();
897            $("#tokentxnsiframe").contents().find(ageClass).hide();
898        }
899
900        if (document.getElementById('dextrackeriframe').contentWindow.document.getElementById('lnkDexTradeAgeDateTime') != null) {
901            document.getElementById('dextrackeriframe').contentWindow.document.getElementById('lnkDexTradeAgeDateTime').text = strDateTime;
902            document.getElementById('dextrackeriframe').contentWindow.document.getElementById('lnkDexTradeAgeDateTime').title = strAgeTitle;
903            $("#dextrackeriframe").contents().find(dateTimeClass).show();
904            $("#dextrackeriframe").contents().find(ageClass).hide();
905        }
906    }
907    else if (strVal == strAge) {
908        if (document.getElementById('tokentxnsiframe').contentWindow.document.getElementById('lnkTokenTxnsAgeDateTime') != null) {
909            document.getElementById('tokentxnsiframe').contentWindow.document.getElementById('lnkTokenTxnsAgeDateTime').text = strAge;
910            document.getElementById('tokentxnsiframe').contentWindow.document.getElementById('lnkTokenTxnsAgeDateTime').title = strDateTimeTitle;
911            $("#tokentxnsiframe").contents().find(dateTimeClass).hide();
912            $("#tokentxnsiframe").contents().find(ageClass).show();
913        }
914
915        if (document.getElementById('dextrackeriframe').contentWindow.document.getElementById('lnkDexTradeAgeDateTime') != null) {
916            document.getElementById('dextrackeriframe').contentWindow.document.getElementById('lnkDexTradeAgeDateTime').text = strAge;
917            document.getElementById('dextrackeriframe').contentWindow.document.getElementById('lnkDexTradeAgeDateTime').title = strDateTimeTitle;
918            $("#dextrackeriframe").contents().find(dateTimeClass).hide();
919            $("#dextrackeriframe").contents().find(ageClass).show();
920        }
921    }
922}
923
924function disposeFnTooltip(el, type) {
925    el.tooltip("dispose");
926}
927
928function renderFnTooltip(el, type) {
929    if (type === 1) {
930        el.tooltip("toggle");
931    } else {
932        el.attr("data-bs-toggle", "tooltip");
933        el.tooltip();
934    }
935}
936
937myFn_boxExpand = {
938    actionParam: "",
939    toggleAction: "",
940    spinner: '<div class="popover popover-body pagecustom_popover" id="spinner-wrapper" style="height: 40px!important;"><i class="fas fa-circle-notch fa-spin spinner-wrapper__icon position-relativer text-primary fa-2x mb-2" style="top: unset"></i></div>',
941    init: function (strElement, toggleAction, actionParam) {
942        var self = this;
943        self.actionParam = actionParam
944        self.toggleAction = toggleAction
945
946        $(strElement).on("click", function (e) {
947            self.fnClick(e)
948        });
949    },
950    fnClick: function (e) {
951        var target = e.currentTarget
952        $(target).off('click');
953        e.preventDefault();
954        e.stopPropagation();
955
956        var self = this;
957        self.fnProcess(e, function () {
958            self.fnOnClick(target)
959        });
960    },
961    fnOnClick: function (target) {
962        var self = this;
963        $(target).on("click", function (e) {
964            self.fnClick(e)
965        });
966    },
967    fnProcess_Popover: function (e, callback) {
968        var self = this;
969        var el = $(e.currentTarget);
970
971        if (!el.attr("data-bs-content")) {
972            el.popover({
973                trigger: 'manual',
974                html: true,
975                placement: 'right',
976                content: self.spinner,
977                boundary: "window"
978            }).popover("show");
979
980            var el_parent_tr = el.parents("tr");
981            var str_el_next = el_parent_tr.find('.myFnExpandBox_searchVal').text()
982            self.expandBox(0, str_el_next, function (data) {
983                el.attr('data-bs-content', data);
984                el.popover("show")
985            })
986
987            el.click(function () {
988                $(this).popover('toggle');
989            }).blur(function () {
990                //$(this).popover('hide');
991                var _this = this;
992                setTimeout(function () {
993                    $(_this).popover('hide');
994                }, 150);
995            });
996        }
997    },
998    fnProcess_Popover_Data: function (e, callback) {
999        var self = this;
1000        var el = $(e.currentTarget);
1001
1002        if (!el.attr("data-bs-content")) {
1003            el.popover({
1004                trigger: 'manual',
1005                html: true,
1006                placement: 'right',
1007                content: self.spinner,
1008            }).popover("show");
1009
1010            var el_parent_tr = el.parents("tr");
1011            var str_el_next = el_parent_tr.find('.myFnExpandBox_withData').attr("box-data");
1012            var str_el_headers = el_parent_tr.find('.myFnExpandBox_withData').attr("box-header");
1013            self.expandBoxWithData(str_el_next.split(','), str_el_headers.split(','), function (data) {
1014                el.attr('data-bs-content', data);
1015                el.popover("show")
1016            })
1017
1018            el.click(function () {
1019                $(this).popover('toggle');
1020            }).blur(function () {
1021                var _this = this;
1022                setTimeout(function () {
1023                    $(_this).popover('hide');
1024                }, 150);
1025            });
1026        }
1027    },
1028    fnProcess_Table: function (e, callback) {
1029        var self = this;
1030        var el = $(e.currentTarget);
1031        var el_parent_tr = el.parents("tr");
1032        var str_el_next = el_parent_tr.find('.myFnExpandBox_searchVal').text()
1033        var el_parent_tr__child_length = el_parent_tr.children().length;
1034        var el_parent_tr_next = ""
1035
1036        if (el.hasClass("myfn_boxExpand_open")) {
1037            el_parent_tr_next = el_parent_tr.next(".myExpandBox");
1038
1039            el.removeClass("myfn_boxExpand_open");
1040            el.addClass("fa-chevron-up");
1041            el.removeClass("fa-chevron-down");
1042
1043            el_parent_tr_next.remove();
1044            callback()
1045        } else {
1046            el.addClass("myfn_boxExpand_open");
1047            el.removeClass("fa-chevron-up");
1048            el.addClass("fa-chevron-down");
1049
1050            el_parent_tr.after('<tr class="myExpandBox"><td colspan="' + el_parent_tr__child_length + '" style="white-space: unset;padding-top:1.25rem;">' + self.spinner + '</td></tr>');
1051            self.expandBox(el_parent_tr__child_length, str_el_next, function (data) {
1052                el_parent_tr_next = el_parent_tr.next(".myExpandBox");
1053                el_parent_tr_next.remove();
1054
1055                el_parent_tr.after(data);
1056                $.HSCore.components.HSClipboard.init('.js-clipboard');
1057                $.HSCore.components.HSMalihuScrollBar.init($('.js-scrollbar'));
1058                callback()
1059            });
1060        }
1061    },
1062    fnProcess: function (e, callback) {
1063        var self = this;
1064        if (self.toggleAction == "popover") {
1065            self.fnProcess_Popover(e, callback)
1066        }
1067        else if (self.toggleAction == "popOverWithData") {
1068            self.fnProcess_Popover_Data(e, callback)
1069        }
1070        else {
1071            self.fnProcess_Table(e, callback)
1072        }
1073    },
1074    expandBoxWithData: function (dataArray, dataHeader, callback) {
1075        var strResult = "";
1076        if (dataArray.length == 0 || dataArray.length != dataHeader.length) {
1077            strResult += "<tr>";
1078            strResult += '<td>';
1079            strResult += "something wrong";
1080            strResult += "</td>";
1081            strResult += "</tr>";
1082        }
1083        else {
1084            strResult = generateTable(dataArray, dataHeader);
1085        }
1086        callback(strResult)
1087
1088        function generateTable(dataArray, dataHeader) {
1089            var strResult = "<h4 class='h5 mb-3'>Additional Info</h4>";
1090            for (let i = 0; i < dataArray.length; i++) {
1091                if (dataArray[i] == "") {
1092                    continue;
1093                }
1094                strResult += "<h5 class='fs-1 fw-bold mb-1'>" + dataHeader[i] + ":</h5>";
1095                strResult += dataArray[i];
1096                strResult += "<hr class='hr-space'>";
1097            }
1098            return strResult;
1099        }
1100    },
1101    expandBox: function (colspan_number, strSearchVal, callback) {
1102        var tmp_overlayMain = window.parent.document.getElementById('overlayMain')
1103        if (tmp_overlayMain) {
1104            window.parent.document.getElementById('overlayMain').style.display = 'none';
1105        }
1106        var self = this;
1107        $.ajax({
1108            type: 'Get',
1109            url: '/txsHandler.ashx',
1110            data: { strSearchVal: strSearchVal, toggleAction: self.toggleAction, actionParam: self.actionParam },
1111        }).done(function (data, textStatus, xhr) {
1112            var strResult = "";
1113            if (colspan_number) {
1114                if (textStatus === "success") {
1115                    strResult += '<tr class="myExpandBox">';
1116                    strResult += '<td colspan="' + colspan_number + '" style="white-space: unset;">';
1117                    strResult += data;
1118                    strResult += "</td>";
1119                    strResult += "</tr>";
1120                } else {
1121                    strResult += "<tr>";
1122                    strResult += '<td colspan="' + colspan_number + '">';
1123                    strResult += "something wrong";
1124                    strResult += "</td>";
1125                    strResult += "</tr>";
1126                }
1127            } else {
1128                strResult = (data)
1129            }
1130            callback(strResult)
1131
1132        });
1133    }
1134};
1135
1136var commonHashControl = {
1137    inithash: function (callback) {
1138        var hash = window.location.hash.substring(1);
1139        if (hash != '') {
1140            this.activaTab(hash);
1141        };
1142
1143        if (callback) {
1144            callback(hash)
1145        }
1146    },
1147    activaTab: function (tab) {
1148        $('a[href="#' + tab + '"]').tab('show')
1149        //.on('shown.bs.tab', function (event) {
1150        //$('#' + tab)[0].scrollIntoView()
1151        //});
1152    },
1153    updatehash: function (strhash) {
1154        try {
1155            if (strhash === '') {
1156                history.replaceState("", document.title, window.location.href.split('#')[0]);
1157            } else {
1158                var baseUrl = window.location.href.split('#')[0];
1159                history.replaceState("", document.title, baseUrl + '#' + strhash);
1160            }
1161        } catch (err) {
1162        }
1163        this.activaTab(strhash);
1164    },
1165}
1166
1167function getParameterByName(key) {
1168    return decodeURIComponent(window.location.search.replace(new RegExp("^(?:.*[&\\?]" + encodeURIComponent(key).replace(/[\.\+\*]/g, "\\$&") + "(?:\\=([^&]*))?)?.*$", "i"), "$1"));
1169}
1170
1171function getCookie(cname) {
1172    var name = cname + "=";
1173    var ca = document.cookie.split(';');
1174    for (var i = 0; i < ca.length; i++) {
1175        var c = ca[i];
1176        while (c.charAt(0) === ' ') {
1177            c = c.substring(1);
1178        }
1179        if (c.indexOf(name) === 0) {
1180            return c.substring(name.length, c.length);
1181        }
1182    }
1183    return "";
1184}
1185
1186function handleHtmlString(strVal) {
1187    strVal = strVal.replace(' ', '').replace('@', '').replace("'", "").replace("*", "").replace("(", "").replace(")", "").replace(";", "").replace(",", "").replace("<script", "").trim();
1188    return strVal;
1189}
1190
1191function clearSearchInput() {
1192    const urlParams = new URLSearchParams(window.location.search);
1193    const strSearchVal = urlParams.get('q');
1194    if (strSearchVal !== "") {
1195        $("#q").val("");
1196    }
1197}
1198
1199function initDateTimeTooltip(useShortHeader = false) {
1200
1201    let headerText = "";
1202    let tooltipTitle = "";
1203    const datetimeTextCookie = getCookie(strSiteName + "_switch_age_datetime");
1204    if (datetimeTextCookie == '' || datetimeTextCookie == strAge) {
1205        headerText = strAge;
1206        tooltipTitle = strDateTimeTitle;
1207        $(dateTimeClass).hide();
1208
1209        //check display UTC or Local datetime
1210        convertUtcToLocalDateTime();
1211
1212        $(ageClass).show();
1213    }
1214    else {
1215        headerText = useShortHeader ? "UTC" : strDateTime;
1216
1217        //check display UTC or Local datetime
1218        convertUtcToLocalDateTime();
1219        //show UTC with timezome on column header
1220        if (offsetHoursFinal !== undefined) {
1221            //var datetimeTextLocal = "Date Time (UTC" + offsetHoursFinal + ")";
1222            if (useShortHeader) {
1223                headerText = strDateTimeLocalShort;
1224            }
1225            else {
1226                headerText = strDateTimeLocal;
1227            }
1228        }
1229
1230        tooltipTitle = strAgeTitle;
1231        $(dateTimeClass).show();
1232        $(ageClass).hide();
1233    }
1234
1235    const tooltipTriggerList = document.querySelectorAll('.age-datetime-with-tooltip');
1236    const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => {
1237        $(tooltipTriggerEl).text(headerText);
1238
1239        const newTooltip = new bootstrap.Tooltip(tooltipTriggerEl, {
1240            title: tooltipTitle,
1241            trigger: "hover"
1242        });
1243
1244        return newTooltip;
1245    });
1246}
1247
1248function convertUtcTimestampToLocalTime(showShortMonth = true) {
1249
1250    strDateTimeFormat = getCookie(strSiteName + "_datetime_format");
1251    if (strDateTimeFormat === "LOCAL") {
1252        const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
1253        var unixTimestamp = $("#showUtcLocalDate").attr("data-timestamp");
1254        const utcDate = new Date(unixTimestamp * 1000);
1255        const offsetMinutes = utcDate.getTimezoneOffset();
1256        const offsetHours = Math.abs(offsetMinutes / 60);
1257        const sign = offsetMinutes > 0 ? '-' : '+';
1258        const offsetHoursFinal = sign + offsetHours;
1259        const day = utcDate.getDate();
1260        const month = utcDate.toLocaleString('default', { timeZone: tzid, month: 'short' });
1261        const year = utcDate.getFullYear();
1262        const time = utcDate.toLocaleTimeString('default', { timeZone: tzid });
1263
1264        // create a new formatted date string
1265        var formattedDateString = `${month}-${day}-${year} ${time}`;
1266        if(showShortMonth) {
1267            $("#showUtcLocalDate").text(formattedDateString + " UTC" + offsetHoursFinal);
1268        }
1269        else {
1270            formattedDateString = utcDate.toLocaleString('sv-SE', { timeZone: tzid });
1271            $("#showUtcLocalDate").text(formattedDateString + " UTC" + offsetHoursFinal);
1272        }
1273       
1274    }
1275}
1276
1277function convertMultipleUtcTimestampToLocalTime() {
1278    strDateTimeFormat = getCookie("etherscan_datetime_format");
1279    if (strDateTimeFormat === "LOCAL") {
1280        const el_showUtcLocalDate = $(".showUtcLocalDate")
1281
1282        el_showUtcLocalDate.each(function () {
1283            const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
1284            var unixTimestamp = $(this).attr("data-timestamp");
1285            const utcDate = new Date(unixTimestamp * 1000);
1286            const offsetMinutes = utcDate.getTimezoneOffset();
1287            const offsetHours = Math.abs(offsetMinutes / 60);
1288            const sign = offsetMinutes > 0 ? '-' : '+';
1289            const offsetHoursFinal = sign + offsetHours;
1290            const day = utcDate.getDate();
1291            const month = utcDate.toLocaleString('default', { timeZone: tzid, month: 'short' });
1292            const year = utcDate.getFullYear();
1293            const time = utcDate.toLocaleTimeString('default', { timeZone: tzid });
1294            // create a new formatted date string
1295            const formattedDateString = `${month}-${day}-${year} ${time}`;
1296            $(this).text(formattedDateString + " UTC" + offsetHoursFinal);
1297        });
1298    }
1299}
1300
1301function convertUtcToLocalDateTime(showUTCText = false, showAge = true) {
1302
1303    strDateTimeFormat = getCookie(strSiteName + "_datetime_format");
1304    if (strDateTimeFormat === "LOCAL") {
1305
1306        var localDateTimeArray = new Array();
1307        //var offsetHoursFinal;
1308        const tzid = Intl.DateTimeFormat().resolvedOptions().timeZone;
1309
1310        if ($(localDateTimeClass).length > 0) {
1311
1312            var $localDatetimeColumn = $(localDateTimeClass);
1313            $localDatetimeColumn.each(function (i, v) {
1314                const unixTimestamp = v.innerText ? v.innerText.trim() : '';
1315                if (!unixTimestamp) {
1316                    localDateTimeArray.push(null);
1317                    return;
1318                }
1319                const utcDate = new Date(unixTimestamp * 1000);
1320                const offsetMinutes = utcDate.getTimezoneOffset();
1321                const offsetHours = Math.abs(offsetMinutes / 60);
1322                const sign = offsetMinutes > 0 ? '-' : '+';
1323                offsetHoursFinal = sign + offsetHours;
1324                const localDateTime = utcDate.toLocaleString("sv-SE", {
1325                    timeZone: tzid,
1326                    year: "numeric",
1327                    month: "2-digit",
1328                    day: "2-digit",
1329                    hour: "2-digit",
1330                    minute: "2-digit",
1331                    second: "2-digit",
1332                    //timeZoneName: "short"
1333                });
1334
1335                var html = v.innerHTML;
1336                var content = html.replace(unixTimestamp, localDateTime);
1337                localDateTimeArray.push(content);
1338
1339            });
1340
1341            for (var j = 0; j < localDateTimeArray.length; j++) {
1342                if (!localDateTimeArray[j]) continue;
1343                var datetimeColumn = $(dateTimeClass);
1344                if (!datetimeColumn[j]) continue;
1345                datetimeColumn[j].innerHTML = cleanHtmlStr(localDateTimeArray[j]);
1346            }
1347
1348            for (var k = 0; k < localDateTimeArray.length; k++) {
1349                if (!localDateTimeArray[k] || !$(ageClass)[k]) continue;
1350                var utc = $($(ageClass)[k].innerHTML).attr("data-bs-title");
1351                var ageHtml = $(ageClass)[k].innerHTML;
1352                var localDT = $(localDateTimeArray[k]);
1353                if (!localDT.length || !localDT[0]) continue;
1354                var content = ageHtml.replace(utc, localDT[0].innerHTML);
1355                $(ageClass)[k].innerHTML = cleanHtmlStr(content);
1356            }
1357        }
1358        else if ($(localDateTimeNFTClass).length > 0) {
1359
1360            var $localDatetimeNFTColumn = $(localDateTimeNFTClass);
1361            $localDatetimeNFTColumn.each(function (i, v) {
1362                const dateText = v.innerText;
1363
1364                // need to split the date string, add leading zeroes to hour and replace space with T for Safari
1365                var parts = dateText.split(" ");
1366                var datePart = parts[0];
1367                var timePart = parts[1];
1368
1369                var timeParts = timePart.split(":");
1370                var hours = timeParts[0];
1371                var minutes = timeParts[1];
1372                var seconds = timeParts[2];
1373
1374                hours = hours.padStart(2, "0");
1375                var dateText2 = datePart + "T" + hours + ":" + minutes + ":" + seconds;
1376
1377                const date = new Date(dateText2);
1378                const offsetMinutes = date.getTimezoneOffset();
1379                const offsetHours = Math.abs(offsetMinutes / 60);
1380                const sign = offsetMinutes > 0 ? '-' : '+';
1381                offsetHoursFinal = sign + offsetHours;
1382
1383                const utcTimestamp = Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(),
1384                    date.getHours(), date.getMinutes(), date.getSeconds());
1385                const localDateTimeNFT = new Date(utcTimestamp).toLocaleString('sv-SE', {
1386                    timeZone: tzid,
1387                    year: "numeric",
1388                    month: "2-digit",
1389                    day: "2-digit",
1390                    hour: "2-digit",
1391                    minute: "2-digit",
1392                    second: "2-digit",
1393                });
1394
1395                var html = v.innerHTML;
1396                var utcTxtString = "";
1397                if(showUTCText){
1398                    utcTxtString = " UTC" + offsetHoursFinal
1399                }
1400                var content = html.replace(dateText, localDateTimeNFT + utcTxtString);
1401                localDateTimeArray.push(content);
1402
1403            });
1404
1405            for (var j = 0; j < localDateTimeArray.length; j++) {
1406                var datetimeColumn = $(dateTimeClass);
1407                datetimeColumn[j].innerHTML = cleanHtmlStr(localDateTimeArray[j]);
1408            }
1409
1410            if (showAge) {
1411                for (var k = 0; k < localDateTimeArray.length; k++) {
1412                    var utc = $($(ageClass)[k].innerHTML).attr("title");
1413                    var ageHtml = $(ageClass)[k].innerHTML;
1414                    var content = ageHtml.replace(utc, $(localDateTimeArray[k])[0].innerHTML);
1415                    $(ageClass)[k].innerHTML = cleanHtmlStr(content);
1416                }
1417            }
1418            
1419
1420        }
1421
1422        //for (var j = 0; j < localDateTimeArray.length; j++) {
1423        //    var datetimeColumn = $(dateTimeClass);
1424        //    datetimeColumn[j].innerHTML = cleanHtmlStr(localDateTimeArray[j]);
1425        //}
1426
1427        //for (var k = 0; k < localDateTimeArray.length; k++) {
1428        //    var utc = $($(ageClass)[k].innerHTML).attr("data-bs-title");
1429        //    var ageHtml = $(ageClass)[k].innerHTML;
1430        //    var content = ageHtml.replace(utc, $(localDateTimeArray[k])[0].innerHTML);
1431        //    $(ageClass)[k].innerHTML = cleanHtmlStr(content);
1432        //}
1433    }
1434    else {
1435        offsetHoursFinal = undefined
1436    }
1437
1438    //reinit tooltip
1439    $(`[data-bs-toggle="tooltip"]`).tooltip();
1440}
1441
1442function cleanHtmlStr(strVal) {
1443    strVal = strVal.replace('@', '').replace("'", "").replace("*", "").replace("(", "").replace(")", "").replace(";", "").replace(",", "").replace("<script", "").trim();
1444    return strVal;
1445}
1446
1447function switchAgeToDateTimeNew(el, useShortHeader = false) {
1448    const self = $(el);
1449    const tooltip = bootstrap.Tooltip.getOrCreateInstance(el);
1450    const currentHeaderText = self.text();
1451    const datetimeText = useShortHeader ? "UTC" : strDateTime;
1452    const table = self.closest('table');
1453
1454    if (currentHeaderText == strAge) {
1455        self.text(datetimeText);
1456        table.find(dateTimeClass).show();
1457
1458        //check display UTC or Local datetime
1459        convertUtcToLocalDateTime();
1460        //show UTC with timezone on column header
1461        if (offsetHoursFinal !== undefined) {
1462            if (useShortHeader) {
1463                self.text(strDateTimeLocalShort);
1464            }
1465            else {
1466                self.text(strDateTimeLocal);
1467            }
1468        }
1469
1470        table.find(ageClass).hide();
1471        setAgeDateTimeCookie(strDateTime);
1472
1473        tooltip.setContent({ '.tooltip-inner': strAgeTitle });
1474    }
1475    else if (currentHeaderText == datetimeText || currentHeaderText == strDateTimeLocal || currentHeaderText == strDateTimeLocalShort) {
1476        self.text(strAge);
1477        table.find(dateTimeClass).hide();
1478        table.find(ageClass).show();
1479        setAgeDateTimeCookie(strAge);
1480
1481        tooltip.setContent({ '.tooltip-inner': strDateTimeTitle });
1482    }
1483}
1484
1485function switchAgeDateTimeWithEffective(el) {
1486    var table = $(el).closest('table');
1487    var ageLink = table.find('.age-datetime-with-tooltip')[0];
1488    if (ageLink) {
1489        switchAgeToDateTimeNew(ageLink);
1490    }
1491
1492    var ageText = table.find('.age-datetime-with-tooltip').text().trim();
1493    var $eff = table.find('.effective-datetime-with-tooltip');
1494    if (ageText === strDateTime) {
1495        $eff.text("Effective (UTC)");
1496    } else if (ageText === strDateTimeLocal) {
1497        $eff.text("Effective (Local)");
1498    } else {
1499        $eff.text("Effective");
1500    }
1501}
1502
1503function initTxFeeGasPriceTooltip() {
1504    let headerText = "";
1505    let tooltipTitle = "";
1506    if (strGlobalFee == null || strGlobalFee == "null" || strGlobalFee == strTxnFee) {
1507        headerText = strTxnFee;
1508        tooltipTitle = $("#hdnTxnFeeTitle").val();
1509        $(".showTxnFee").show();
1510        $(".showGasPrice").hide();
1511    } else if (strGlobalFee == strGasPrice) {
1512        headerText = strGasPrice;
1513        tooltipTitle = $("#hdnGasPriceTitle").val();
1514        $(".showTxnFee").hide();
1515        $(".showGasPrice").show();
1516    }
1517
1518    const tooltipTriggerList = document.querySelectorAll('.switch-txn-fee-gas-price');
1519    const tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => {
1520        $(tooltipTriggerEl).text(headerText);
1521
1522        const newTooltip = new bootstrap.Tooltip(tooltipTriggerEl, {
1523            title: tooltipTitle,
1524            trigger: "hover"
1525        });
1526
1527        return newTooltip;
1528    });
1529}
1530
1531function switchTxFeeGasPriceNew(el) {
1532    const self = $(el);
1533    const tooltip = bootstrap.Tooltip.getOrCreateInstance(el);
1534    const strVal = self.text();
1535    if (strVal == strTxnFee) {
1536        self.text(strGasPrice);
1537        $(".showGasPrice").show();
1538        $(".showTxnFee").hide();
1539        sessionStorage.setItem("ShowFee", strGasPrice);
1540
1541        tooltip.setContent({ '.tooltip-inner': $("#hdnGasPriceTitle").val() });
1542    }
1543    else if (strVal == strGasPrice) {
1544        self.text(strTxnFee);
1545        $(".showGasPrice").hide();
1546        $(".showTxnFee").show();
1547        sessionStorage.setItem("ShowFee", strTxnFee);
1548
1549        tooltip.setContent({ '.tooltip-inner': $("#hdnTxnFeeTitle").val() });
1550    }
1551}
1552
1553function switchAmountToValue(el, text1, text2, isStart) {
1554    if (el) {
1555        var cAmountPrice = getCookie(strSiteName + "_switch_token_amount_value");
1556
1557        if ((isStart == false && cAmountPrice == "value") || (isStart == true && cAmountPrice == "amount")) {
1558            $(el).html(text1)
1559            $("#tooltipAmountValue").show()
1560            $(".td_showValue").show()
1561            $(".td_showAmount").hide()
1562            writeCookie(strSiteName + "_switch_token_amount_value", "amount")
1563        } else {
1564            $(el).html(text2)
1565            $("#tooltipAmountValue").hide()
1566            $(".td_showValue").hide()
1567            $(".td_showAmount").show()
1568            writeCookie(strSiteName + "_switch_token_amount_value", "value")
1569        }
1570    }
1571}
1572
1573function switchMethodColumn(el, text1, text2, isStart) {
1574    if (el) {
1575        var res = getCookie(strSiteName + "_switch_function_name");
1576
1577        if ((isStart == false && res == "method") || (isStart == true && res == "action")) {
1578            $(el).html(text1)
1579            $(el).attr("data-bs-toggle", "tooltip")
1580            $(el).attr("data-bs-trigger", "hover")
1581            $(el).attr("data-bs-title", "Click to show curated Action where applicable")
1582            $(".td_functionNameOri").show()
1583            $(".td_functionNameCustom").hide()
1584            $(".method-tooltip").show()
1585            $(".action-tooltip").hide()
1586            writeCookie(strSiteName + "_switch_function_name", "action")
1587        } else {
1588            $(el).html(text2)
1589            $(el).attr("data-bs-toggle", "tooltip")
1590            $(el).attr("data-bs-trigger", "hover")
1591            $(el).attr("data-bs-title", "Click to show executed Function")
1592            $(".td_functionNameOri").hide()
1593            $(".td_functionNameCustom").show()
1594            $(".method-tooltip").hide()
1595            $(".action-tooltip").show()
1596            writeCookie(strSiteName + "_switch_function_name", "method")
1597        }
1598
1599        // Get the existing tooltip instance
1600        let tooltipInstance = bootstrap.Tooltip.getInstance(el);
1601        if (tooltipInstance) {
1602            // Update the content of the tooltip while it's still shown
1603            tooltipInstance.setContent({
1604                '.tooltip-inner': $(el).attr("data-bs-title")
1605            });
1606            tooltipInstance.update(); // Refresh the tooltip position and size
1607        } else {
1608            // Create a new tooltip instance if not already initialized
1609            new bootstrap.Tooltip(el, {
1610                title: $(el).attr("data-bs-title"),
1611                trigger: 'hover'
1612            });
1613        }
1614    }
1615    TextHighlight.init();
1616    $("#headerMethod").show()
1617    $("#headerMethod_internaltx").show()
1618    $("#headerMethod_AA").show()
1619    $("#headerMethod_label").show()
1620
1621}
1622
1623function initPopover() {
1624    const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
1625    const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
1626}
1627
1628function registerPreviewButtonEvent() {
1629    document.removeEventListener('click', handleTxPreviewOnClick);
1630    document.addEventListener('click', handleTxPreviewOnClick);
1631
1632    if (window.top != window.self) {
1633        window.parent.document.removeEventListener('click', handleTxPreviewOnClick);
1634        window.parent.document.addEventListener('click', handleTxPreviewOnClick);
1635    }
1636}
1637
1638var txPreviewPopoverGlobal = null;
1639function handleTxPreviewOnClick(e) {
1640    var targetedClass = e.target.closest('.js-tnx-preview');
1641
1642    if (txPreviewPopoverGlobal !== null) {
1643        if (
1644            !(targetedClass &&
1645                txPreviewPopoverGlobal === bootstrap.Popover.getOrCreateInstance(targetedClass))
1646        ) {
1647            txPreviewPopoverGlobal.hide();
1648        } else {
1649            // if the same element is clicked again, need to hide the popover and do nothing
1650            let currrentModel = bootstrap.Popover.getOrCreateInstance(targetedClass)
1651            if (currrentModel && currrentModel._isShown()) {
1652                currrentModel.hide();
1653                return;
1654            }
1655        }
1656
1657    }
1658
1659    if (e.target.closest('.js-tnx-preview')) {
1660        txPreviewPopoverGlobal = bootstrap.Popover.getOrCreateInstance(targetedClass);
1661        txPreviewPopoverGlobal.show();
1662    }
1663
1664    if (targetedClass) {
1665        const self = $(targetedClass);
1666        const isInitialized = self.data("initialized");
1667
1668        if (isInitialized === false) {
1669            const txHash = $.trim(self.parents("tr").find('.myFnExpandBox_searchVal').text());
1670
1671            $.ajax({
1672                type: 'Get',
1673                url: '/txsHandler.ashx',
1674                data: { strSearchVal: txHash, toggleAction: "popover", actionParam: "txs" },
1675            }).done(function (data, textStatus, xhr) {
1676                self.data("initialized", true);
1677
1678                if (window.top != window.self) {
1679                    txPreviewPopoverGlobal.dispose()
1680                    txPreviewPopoverGlobal = bootstrap.Popover.getOrCreateInstance(targetedClass);
1681                    txPreviewPopoverGlobal._config.content = data;
1682                    txPreviewPopoverGlobal.show()
1683                    txPreviewPopoverGlobal._config.container = window.parent.document.body
1684
1685                    txPreviewPopoverGlobal._element.addEventListener('hidden.bs.popover', () => {
1686                        txPreviewPopoverGlobal._config.container = window.document.body
1687                        txPreviewPopoverGlobal.update();
1688                    })
1689                    txPreviewPopoverGlobal._element.addEventListener('shown.bs.popover', () => {
1690                        txPreviewPopoverGlobal._config.container = window.parent.document.body
1691                        txPreviewPopoverGlobal.update();
1692                    })
1693                } else {
1694                    txPreviewPopoverGlobal.tip.querySelectorAll(".popover-body")[0].innerHTML = data
1695                    txPreviewPopoverGlobal._config.content = data;
1696                    txPreviewPopoverGlobal.update();
1697                }
1698            });
1699        }
1700    }
1701
1702}
1703
1704function initAdvPopover() {
1705    const popoverTriggerList = document.querySelectorAll('.myFnExpandBoxData');
1706    const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl));
1707}
1708
1709function registerDataPreviewButtonEvent() {
1710    $(".myFnExpandBoxData").on("click", function (event) {
1711        const self = $(event.currentTarget);
1712        const isInitialized = self.data("initialized");
1713
1714        if (isInitialized === false) {
1715            const popover = bootstrap.Popover.getOrCreateInstance(self[0]);
1716            var self_parent_tr = self.parents("tr");
1717            //var str_self_count = self_parent_tr.find('.myFnExpandBox_withData').attr("counter-data");
1718            var str_self_next = self_parent_tr.find('.myFnExpandBox_withData').attr("box-data");
1719            var str_self_next_full = self_parent_tr.find('.myFnExpandBox_withData').attr("box-data-full");
1720            var str_self_headers = self_parent_tr.find('.myFnExpandBox_withData').attr("box-header");
1721            var strData = expandBoxWithData(str_self_next.split(','), str_self_headers.split(','), str_self_next_full.split(','));
1722
1723            //popover.setContent({
1724            //    ".popover-body": strData
1725            //});
1726            self.data("initialized", true);
1727
1728            popover.dispose();
1729
1730            const popover_add = new bootstrap.Popover(self[0], {
1731                "content": function () {
1732                    return strData;
1733                },
1734                "html": true,
1735                "sanitize": false
1736            }).show();
1737
1738            $('[data-bs-add-toggle="tooltip"]').tooltip();
1739            self[0].addEventListener('shown.bs.popover', () => {
1740                $('[data-bs-add-toggle="tooltip"]').tooltip();
1741            });
1742        }
1743    });
1744}
1745
1746function expandBoxWithData(dataArray, dataHeader, dataArrayFull) {
1747    var strResult = "";
1748    if (dataArray.length == 0 || dataArrayFull.length == 0 || dataArray.length != dataHeader.length) {
1749        strResult += "<tr>";
1750        strResult += '<td>';
1751        strResult += "something wrong";
1752        strResult += "</td>";
1753        strResult += "</tr>";
1754    }
1755    else {
1756        var strResult = "<h4 class='fs-base fw-bold mb-4'>Additional Info</h4>";
1757        for (let i = 0; i < dataArray.length; i++) {
1758            var fullData = dataArrayFull[i] || dataArray[i];
1759            if (fullData == "") {
1760                continue;
1761            }
1762            var strCopyButton = "<button type='button' class='btn btn-sm btn-white d-inline-flex align-items-center gap-1 mt-2' onclick='generateCopyFunction(this, this.getAttribute(\"data-copy-text\"))' data-copy-text='" + htmlEnc(fullData) + "' data-bs-add-toggle='tooltip' data-bs-placement='top' title='Copy " + htmlEnc(dataHeader[i]) + " Data'><i class='far fa-copy fa-fw'></i>Copy " + htmlEnc(dataHeader[i]) + " Data</button>";
1763            strResult += "<h6 class='fw-bold mb-1'>" + htmlEnc(dataHeader[i]) + ":</h6>";
1764            strResult += "<div class='overflow-auto scrollbar-custom text-break' style='max-height: 15rem; white-space: normal;
1764 overflow-wrap: anywhere;'>" + htmlEnc(fullData) + "</div>" + strCopyButton;
1765            strResult += "<hr class='hr-space'>";
1766        }
1767    }
1768    return strResult;
1769}
1770
1771function generateCopyFunction(el, text) {
1772    try {
1773
1774        //copy to clipboard code
1775        var elem = document.createElement('textarea');
1776        elem.value = text;
1777        document.body.appendChild(elem);
1778        elem.select();
1779        document.execCommand('copy');
1780        document.body.removeChild(elem);
1781
1782        //get i element and original image class
1783        generateCopyIcon(el, "Copied");
1784
1785    } catch (err) {
1786    }
1787}
1788
1789function generateCopyIcon(el, tooltipText) {
1790    var iElem = $(el).children("i")[0];
1791    var oriImageClass = $(iElem).attr("class");
1792    var oriTooltip = $(el).attr('data-bs-original-title') || $(el).attr('data-original-title') || $(el).attr('title') || "Copy";
1793    var checkImageClass = 'fa fa-check btn-icon__inner'
1794
1795    $(iElem).removeClass(oriImageClass).addClass(checkImageClass);
1796    $(el).attr('data-original-title', tooltipText);
1797    $(el).attr('data-bs-original-title', tooltipText);
1798    $(el).attr('title', tooltipText);
1799
1800    setTimeout(() => {
1801        $(el).tooltip('show');
1802    }, 1);
1803
1804    setTimeout(() => {
1805        $(iElem).removeClass(checkImageClass).addClass(oriImageClass);
1806        $(el).attr('data-original-title', oriTooltip);
1807        $(el).attr('data-bs-original-title', oriTooltip);
1808        $(el).attr('title', oriTooltip);
1809    }, 1000)
1810}
1811
1812function writeCookie(key, value, days) {
1813    var date = new Date();
1814    days = days || 365;
1815    date.setTime(+ date + (days * 86400000));
1816    window.document.cookie = key + "=" + value + "; expires=" + date.toGMTString() + "; path=/";
1817    return value;
1818}
1819
1820//use by nft-tarnsfers, nft-trades, nft-last-mints
1821if (!String.prototype.format) {
1822    String.prototype.format = function () {
1823        var args = arguments;
1824        return this.replace(/{(\d+)}/g, function (match, number) {
1825            return typeof args[number] != 'undefined' ? args[number] : match;
1826        });
1827    };
1828}
1829//use by advance_search, nft-last-mints, nft-trades, nft-transfers, nftitem, tokenholdingnew
1830function numberWithCommas(x) {
1831    return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
1832}
1833//use by home(js), nft-tarnsfers, nft-trades, nft-last-mints, name-lookup-search
1834function getTruncatedAddress(strAddress, maxW = "max-width: 11.5rem") {
1835    var strVal = "";
1836    if (strAddress !== "") {
1837
1838        const isAddress = /^0x[0-9a-fA-F]{40}$/.test(strAddress);
1839        if (!isAddress) {
1840            strVal = "<span class='hash-tag text-truncate' style='" + maxW + "'>" + htmlEnc(strAddress) + "</span>";
1841            return strVal;
1842        }
1843
1844        var strTruncateType = getCookie(strSiteName + "_address_format");
1845        if (strTruncateType === "") {
1846            strTruncateType = "0";
1847        }
1848
1849        if (strTruncateType === "0" || strTruncateType === null || strTruncateType === "") {
1850            strVal = "<span data-highlight-target='" + strAddress + "'>" + strAddress.substring(0, 10) + "..." + strAddress.substring(strAddress.length - 9) + "</span>";
1851        } else if (strTruncateType === "1") {
1852            strVal = "<span class='hash-tag text-truncate' style='" + maxW + "'>" + htmlEnc(strAddress) + "</span>";
1853        }
1854    }
1855    return strVal;
1856}
1857//use by nft-tarnsfers, nft-trades, nft-last-mints,name-lookup-search
1858function generateCopyToClipboard(strText, count, title) {
1859    if (!title) title = "Copy Address";
1860    var res = "<a class='js-clipboard link-secondary' href='javascript:;' data-clipboard-text='" + strText + "'"
1861    res += "data-bs-toggle='tooltip' data-bs-trigger='hover' data-bs-html='true' data-bs-boundary='viewport' title='" + title +"' data-hs-clipboard-options='{ "
1862    res += '"type": "tooltip", "successText": "Copied!", "classChangeTarget": "#linkIcon_' + count + '", '
1863    res += '"defaultClass": "fa-copy", "successClass": "fa-check" }'
1864    res += "'>"
1865    res += "<i id='linkIcon_" + count + "' class='far fa-copy fa-fw'></i> "
1866    res += "</a>"
1867
1868    return res;
1869}
1870
1871//global init
1872function registerTrigger() {
1873    const triggerHover = document.querySelectorAll('a[data-bs-toggle="tooltip"]:not([data-bs-trigger="hover"]):not([data-clipboard-text])');
1874    triggerHover.forEach(element => {
1875        var triggerHoverTooltip = bootstrap.Tooltip.getInstance(element);
1876        if (triggerHoverTooltip) {
1877            triggerHoverTooltip.dispose();
1878            element.setAttribute("data-bs-trigger", "hover");
1879            triggerHoverTooltip = bootstrap.Tooltip.getOrCreateInstance(element);
1880        }
1881    });
1882}
1883
1884function handleBackButtonTooltip() {
1885    let el_handleTooltipPageShow = document.querySelector('.bs-tooltip-auto')
1886    if (el_handleTooltipPageShow) {
1887        let targetedElem = document.querySelector(`[aria-describedby='${document.querySelector('.bs-tooltip-auto').getAttribute('id')}']`)
1888        if (targetedElem) {
1889            let tooltipTemp = bootstrap.Tooltip.getInstance(targetedElem);
1890            tooltipTemp.hide();
1891        }
1892    }
1893}
1894
1895function htmlEnc(s) {
1896    if (s != null) {
1897        return s.replace(/&/g, '&amp;')
1898            .replace(/</g, '&lt;')
1899            .replace(/>/g, '&gt;')
1900            .replace(/'/g, '&#39;')  // Single quote
1901            .replace(/"/g, '&quot;') // Double quote
1902            .replace(/`/g, '&#96;')  // Backtick
1903            .replace(/\//g, '&#x2F;') // Forward slash
1904            .replace(/\\/g, '&#x5C;') // Backslash
1905    } else {
1906        return ""
1907    }
1908}
1909
1910window.removeEventListener('pageshow', handleBackButtonTooltip);
1911window.addEventListener('pageshow', handleBackButtonTooltip);
1912registerTrigger();
1913
1914var themeMode = localStorage.getItem('theme');
1915if (themeMode === null) {
1916    themeMode = 'light';
1917}
1918
1919var cThemeMode = getCookie('displaymode');
1920
1921$(document).ready(function () {
1922
1923    $('.theme-btn').click(function () {
1924        themeMode = localStorage.getItem('theme');
1925        cThemeMode = themeMode;
1926        if (themeMode === null) {
1927            themeMode = 'light';
1928        }
1929
1930        $("iframe").each(function () {
1931            var src = $(this).contents().find('html');
1932
1933            if (cThemeMode === 'light' || themeMode === 'light') {
1934                src.attr('data-bs-theme', 'light');
1935            } else if (cThemeMode === 'dim' || themeMode === 'dim') {
1936                src.attr('data-bs-theme', 'dim');
1937            } else if (cThemeMode === 'dark' || themeMode === 'dark') {
1938                src.attr('data-bs-theme', 'dark');
1939            } else if (cThemeMode === 'auto' || themeMode === 'auto') {
1940                src.attr('data-bs-theme', getCookie('site_auto_theme'));
1941            }
1942
1943            if (src.prevObject.prevObject[0].id === "token_analytics_pageiframe") {
1944                var iframeSrc = src.prevObject.prevObject.contents().find('iframe');
1945                var htmlSrc = iframeSrc.contents().find('html');
1946                if (cThemeMode === 'light' || themeMode === 'light') {
1947                    htmlSrc.attr('data-bs-theme', 'light');
1948                } else if (cThemeMode === 'dim' || themeMode === 'dim') {
1949                    htmlSrc.attr('data-bs-theme', 'dim');
1950                } else if (cThemeMode === 'dark' || themeMode === 'dark') {
1951                    htmlSrc.attr('data-bs-theme', 'dark');
1952                } else if (cThemeMode === 'auto' || themeMode === 'auto') {
1953                    htmlSrc.attr('data-bs-theme', getCookie('site_auto_theme'));
1954                }
1955            }
1956        });
1957
1958        var className = document.getElementsByClassName('editor');
1959        var classNameCount = className.length;
1960        for (var j = 0; j < classNameCount; j++) {
1961            var aceEditor = ace.edit(className[j].id);
1962            var editorSearch = ace.edit(className[j].id);
1963            if (cThemeMode === 'light' || themeMode === 'light') {
1964                aceEditor.setTheme(ace_editor_theme);
1965            } else if (cThemeMode === 'dim' || themeMode === 'dim') {
1966                aceEditor.setTheme(ace_editor_theme_dim);
1967            } else if (cThemeMode === 'dark' || themeMode === 'dark') {
1968                aceEditor.setTheme(ace_editor_theme_dark);
1969            } else if (cThemeMode === 'auto' || themeMode === 'auto') {
1970                aceEditor.setTheme('data-bs-theme', getCookie('site_auto_theme'));
1971            }
1972        }
1973    });
1974
1975});
1976
1977(function () {
1978    if (cThemeMode === 'light' || themeMode === 'light') {
1979        document.documentElement.setAttribute('data-bs-theme', 'light');
1980    } else if (cThemeMode === 'dim' || themeMode === 'dim') {
1981        document.documentElement.setAttribute('data-bs-theme', 'dim');
1982    } else if (cThemeMode === 'dark' || themeMode === 'dark') {
1983        document.documentElement.setAttribute('data-bs-theme', 'dark');
1984    } else if (cThemeMode === 'auto' || themeMode === 'auto') {
1985        document.documentElement.setAttribute('data-bs-theme', getCookie('site_auto_theme'));
1986    }
1987})();
1988
1989//Private Note Quick Add Edit Start
1990function appendReturnUrl(returnUrl) {
1991    let hash = "";
1992    let isIframe = (window.self !== window.top);
1993
1994    try {
1995        // Check if in an iframe and if same-origin with parent
1996        if (isIframe && window.parent.location.origin === window.location.origin) {
1997            hash = window.parent.location.hash.substring(1);
1998        } else {
1999            hash = window.location.hash.substring(1);
2000        }
2001    } catch (e) {
2002        console.warn("Cross-origin access blocked");
2003    }
2004
2005    // Add hash if it exists, with proper URL encoding
2006    if (hash) {
2007        returnUrl += "&hash=" + encodeURIComponent(hash);
2008    }
2009
2010    // Redirect to login
2011    if (isIframe) {
2012        window.parent.location.href = "/login?" + returnUrl;
2013    } else {
2014        window.location.href = "/login?" + returnUrl;
2015    }
2016}
2017function quickEditTxPrivateNote(txhash, result, element) {
2018    window.parent.document.getElementById("modalElement").value = element;
2019    window.parent.$('#tnxPrivateNoteModal').modal('show');
2020    window.parent.document.getElementById("editTxnNote").value = result;
2021    window.parent.document.getElementById("saveTxnNoteHash").value = txhash;
2022    window.parent.document.getElementById("txtPrivateNoteTip").innerHTML = "";
2023}
2024function quickAddTxPrivateNote(txhash, element) {
2025    window.parent.document.getElementById("modalElement").value = element;
2026    window.parent.$('#tnxPrivateNoteModal').modal('show');
2027    window.parent.document.getElementById("editTxnNote").value = "";
2028    window.parent.document.getElementById("saveTxnNoteHash").value = txhash;
2029    window.parent.document.getElementById("txtPrivateNoteTip").innerHTML = "";
2030}
2031function quickSubmitTxPrivateNote() {
2032    var txhash = window.parent.document.getElementById("saveTxnNoteHash").value;
2033    var privnote = htmlEnc(window.parent.document.getElementById("editTxnNote").value.trim());
2034
2035    $.ajax({
2036        type: 'Get',
2037        url: '/updateHandler',
2038        data: {
2039            opr: 'updatenotetx',
2040            tx: txhash,
2041            txt: privnote,
2042            sid: sid
2043        },
2044        success: function (res) {
2045            if (res == 0) {
2046                window.parent.$('#tnxPrivateNoteModal').modal('hide');
2047                var element = window.parent.document.getElementById("modalElement").value;
2048                updateTransactionHash(txhash, privnote, element)
2049            } else if (res == 1) {
2050                $("#txtPrivateNoteTip").html("<i class='far fa-exclamation-circle text-secondary'></i> Sorry but to update your private note, You have to be <a href='/login'><b>Logged In</b></a> first.");
2051            } else if (res == 2) {
2052                $("#txtPrivateNoteTip").html("<i class='far fa-exclamation-triangle text-danger'></i> Unable to update private note. General exception error occurred.");
2053            } else if (res == 3) {
2054                window.parent.$('#tnxPrivateNoteModal').modal('hide');
2055                var element = window.parent.document.getElementById("modalElement").value;
2056                removePrivateNote(element)
2057            } else if (res == 4) {
2058                $("#txtPrivateNoteTip").html("<i class='far fa-exclamation-triangle text-danger'></i> Unable to remove private note. General exception error occurred.");
2059            } else if (res == 5) {
2060                $("#txtPrivateNoteTip").html("<i class='far fa-exclamation-triangle text-danger'></i> Sorry, we were unable to add a new private Note. You have exceeded the maximum allowed quota for your account.");
2061            } else if (res == 6) {
2062                $("#txtPrivateNoteTip").html("<i class='far fa-exclamation-triangle text-danger'></i> Invalid Tx Hash");
2063            }
2064        },
2065        error: function (XMLHttpRequest, textStatus, errorThrown) {
2066            console.log(textStatus);
2067        }
2068    });
2069};
2070function removePrivateNote(element) {
2071    const existingElement = element.closest('div.d-flex').nextElementSibling;
2072    if (existingElement != null) {
2073        existingElement.remove()
2074    }
2075}
2076function updateTransactionHash(searchHash, privnote, element) {
2077    // Encode privnote and searchHash to prevent XSS
2078    privnote = htmlEnc(privnote);
2079    searchHash = encodeURIComponent(searchHash);
2080
2081    // Create a new HTML element instead of setting `innerHTML` directly
2082    const newDiv = document.createElement('div');
2083    newDiv.classList.add('d-inline-flex', 'align-items-center', 'gap-1', 'appendPrivNote');
2084    newDiv.setAttribute('data-bs-toggle', 'popover');
2085    newDiv.setAttribute('data-bs-trigger', 'hover');
2086    newDiv.setAttribute('data-bs-content', privnote);
2087
2088    const icon = document.createElement('i');
2089    icon.classList.add('far', 'fa-regular', 'small', 'fa-note-sticky', 'text-muted', 'mt-0.5');
2090    newDiv.appendChild(icon);
2091
2092    const spanText = document.createElement('span');
2093    spanText.classList.add('text-muted', 'small', 'hash-tag', 'text-truncate');
2094    spanText.textContent = privnote;
2095    newDiv.appendChild(spanText);
2096
2097    // Replace or insert the new element as required
2098    const existingElement = element.closest('div.d-flex').nextElementSibling;
2099    if (existingElement != null && existingElement.classList.contains('d-inline-flex')) {
2100        existingElement.replaceWith(newDiv);
2101    } else {
2102        element.closest('div.d-flex').insertAdjacentElement('afterend', newDiv);
2103    }
2104
2105    // Create the edit button safely
2106    const editBtnSpan = document.createElement('span');
2107    editBtnSpan.classList.add('group-lg-hover', 'transition-all');
2108    editBtnSpan.setAttribute('data-bs-toggle', 'tooltip');
2109    editBtnSpan.setAttribute('data-bs-trigger', 'hover');
2110    editBtnSpan.setAttribute('data-bs-placement', 'top');
2111    editBtnSpan.setAttribute('title', 'Edit Transaction Private Note');
2112
2113    const editLink = document.createElement('a');
2114    editLink.classList.add('link-muted');
2115    editLink.setAttribute('href', 'javascript:;');
2116    editLink.addEventListener('click', function () {
2117        quickEditTxPrivateNote(searchHash, privnote, this);
2118    });
2119
2120    const editIcon = document.createElement('i');
2121    editIcon.classList.add('far', 'fa-pen-to-square');
2122    editLink.appendChild(editIcon);
2123    editBtnSpan.appendChild(editLink);
2124
2125    element.closest('span.group-lg-hover').replaceWith(editBtnSpan);
2126
2127    initPopover();
2128    $("[data-bs-toggle='tooltip']").tooltip();
2129}
2130//Private Note Quick Add Edit End
2131
2132//Private Name Tag Quick Add Edit Start
2133var strAddressPublicTag = ""
2134var strAddressENS = ""
2135var blnIsContract = false
2136function quickEditPrivateNameTag(address, addressPrivateTag, addressPublicTag, addressENS, isContract, privateNote, element, istab) {
2137
2138    strAddressPublicTag = htmlEnc(addressPublicTag)
2139    strAddressENS = htmlEnc(addressENS)
2140    blnIsContract = htmlEnc(isContract)
2141    addressPrivateTag = htmlEnc(addressPrivateTag)
2142    privateNote = htmlEnc(privateNote)
2143
2144    if (istab === "true") {
2145        window.parent.document.getElementById("modalElementPrivateNameTag").value = element;
2146        window.parent.$('#privateNameTagModal').modal('show');
2147        window.parent.document.getElementById("txtAddress").value = address;
2148        window.parent.document.getElementById("txtPrivateNameTagMain").value = addressPrivateTag;
2149        window.parent.document.getElementById("txtPrivateNoteAreaMain").value = privateNote;
2150        //window.parent.document.getElementById("privatetagtip").innerHTML = "";
2151    }
2152    else {
2153        document.getElementById("modalElementPrivateNameTag").value = element;
2154        $('#privateNameTagModal').modal('show');
2155        document.getElementById("txtAddress").value = address;
2156        document.getElementById("txtPrivateNameTagMain").value = addressPrivateTag;
2157        document.getElementById("txtPrivateNoteAreaMain").value = privateNote;
2158        //document.getElementById("privatetagtip").innerHTML = "";
2159    }
2160
2161}
2162function quickAddPrivateNameTag(address, addressPrivateTag, addressPublicTag, addressENS, isContract, privateNote, element, istab) {
2163
2164    strAddressPublicTag = htmlEnc(addressPublicTag)
2165    strAddressENS = htmlEnc(addressENS)
2166    blnIsContract = htmlEnc(isContract)
2167
2168    if (istab === "true") {
2169        window.parent.document.getElementById("modalElementPrivateNameTag").value = element;
2170        window.parent.$('#privateNameTagModal').modal('show');
2171        window.parent.document.getElementById("txtAddress").value = address;
2172        window.parent.document.getElementById("txtPrivateNameTagMain").value = "";
2173        window.parent.document.getElementById("txtPrivateNoteAreaMain").value = "";
2174        //window.parent.document.getElementById("privatetagtip").innerHTML = "";
2175    }
2176    else {
2177        document.getElementById("modalElementPrivateNameTag").value = element;
2178        $('#privateNameTagModal').modal('show');
2179        document.getElementById("txtAddress").value = address;
2180        document.getElementById("txtPrivateNameTagMain").value = "";
2181        document.getElementById("txtPrivateNoteAreaMain").value = "";
2182        //document.getElementById("privatetagtip").innerHTML = "";
2183    }
2184
2185}
2186function quickSubmitPrivateNameTag() {
2187
2188    var address = htmlEnc(document.getElementById("txtAddress").value);
2189    address = address.replace(/^\s+|\s+$/gm, '');
2190    var privname = htmlEnc(document.getElementById("txtPrivateNameTagMain").value);
2191    var privnote = htmlEnc(document.getElementById("txtPrivateNoteAreaMain").value);
2192
2193    $.ajax({
2194        type: 'Get',
2195        url: '/updateHandler',
2196        data: {
2197            opr: 'updatenoteaddr',
2198            a: address,
2199            nametag: privname,
2200            txt: privnote,
2201            isReturnHtml: '1',
2202            sid: sid
2203        },
2204        success: function (res) {
2205
2206            if (!isNaN(res)) {
2207                res = parseInt(res);
2208
2209                if (res == 0) {
2210                    $('#privateNameTagModal').modal('toggle');
2211                    var element = document.getElementById("modalElementPrivateNameTag").value;
2212                    UpdatePrivateNameTag(address, privname, blnIsContract, privnote, element)
2213                } else if (res == 1) {
2214                    $("#privatenotetipMain").html("<font color='gray'><i class='fa fa-exclamation-circle'></i> Sorry but to update your private Note, You have to be <font color='#48B8EE'><a href='/login'><b>Logged In</b></a></font> first.</font>");
2215                } else if (res == 2) {
2216                    $("#privatenotetipMain").html("<font color='gray'><i class='far fa-exclamation-triangle'></i> Unable to update private Note. General exception error occurred.</font>");
2217                } else if (res == 3) {
2218                    $('#privateNameTagModal').modal('toggle');
2219                } else if (res == 4) {
2220                    $("#privatenotetipMain").html("<font color='gray'><i class='far fa-exclamation-triangle'></i> Unable to remove private Note. General exception error occurred.</font>");
2221                } else if (res == 5) {
2222                    $("#privatenotetipMain").html("<font color='red'><i class='far fa-exclamation-triangle'></i> Sorry, we were unable to add a new private Note. You have exceeded the maximum allowed quota for your account</font>");
2223                }
2224            }
2225            else {
2226                $('#privateNameTagModal').modal('toggle');
2227                var element = document.getElementById("modalElementPrivateNameTag").value;
2228                removePrivateNameTag(element, res)
2229            }
2230        },
2231        error: function (XMLHttpRequest, textStatus, errorThrown) {
2232        }
2233    });
2234}
2235
2236function UpdatePrivateNameTag(address, privname, blnIsContract, privNote, element) {
2237
2238    address = htmlEnc(address);
2239    privname = htmlEnc(privname);
2240    privNote = htmlEnc(privNote);
2241
2242    address = address.toLowerCase();
2243    //const links = document.querySelectorAll('a.js-clipboard.link-secondary');
2244    const links = document.querySelectorAll(
2245        'a.js-clipboard.link-secondary, a.js-clipboard-required-confirmation.link-secondary'
2246    );
2247
2248    for (let link of links) {
2249
2250        const linkAddress = link.getAttribute('data-clipboard-text');
2251        if (linkAddress && linkAddress.toLowerCase() === address) {
2252            let displayElement = link.closest('div.d-flex');
2253            if (displayElement && displayElement.closest('td') && displayElement.firstElementChild && !displayElement.classList.contains('d-none') && privname !== "") {
2254                var tooltip = 'My Name Tag: ' + privname + ' <br> (' + address + ')';
2255                if (strAddressPublicTag !== "") {
2256                    tooltip = 'My Name Tag: ' + privname + ' <br> Public Tag: ' + strAddressPublicTag + ' (' + address + ')';
2257                }
2258
2259                // Create the icon element
2260                const icon = document.createElement('i');
2261                icon.classList.add('far', 'fa-memo', 'text-secondary');
2262                icon.setAttribute('data-bs-toggle', 'tooltip');
2263                icon.setAttribute('data-bs-title', 'Contract');
2264
2265                // Create nametag element
2266                const nametag = document.createElement('a');
2267                nametag.href = "/address/" + address;
2268                nametag.className = "badge border text-dark fw-normal fs-sm rounded-pill hash-tag text-truncate py-1.5 bg-light border-dark dark:border-white border-opacity-10";
2269                nametag.setAttribute("data-bs-toggle", "tooltip");
2270                nametag.setAttribute("data-bs-trigger", "hover");
2271                nametag.setAttribute("data-bs-html", "true");
2272                nametag.setAttribute("data-bs-title", tooltip);
2273
2274                if (blnIsContract === "true") {
2275                    nametag.appendChild(icon);
2276                    nametag.innerHTML += " " + privname;
2277                }
2278                else {
2279                    nametag.innerHTML = privname;
2280                }
2281
2282
2283                displayElement.replaceChild(nametag, displayElement.firstElementChild);
2284
2285                TextHighlight.addContent(privname, nametag);
2286
2287                // Create the edit button
2288                const editBtnSpan = document.createElement('span');
2289                editBtnSpan.classList.add('group-lg-hover', 'transition-all');
2290                editBtnSpan.setAttribute('data-bs-toggle', 'tooltip');
2291                editBtnSpan.setAttribute('data-bs-trigger', 'hover');
2292                editBtnSpan.setAttribute('data-bs-placement', 'top');
2293                editBtnSpan.setAttribute('title', 'Edit Private Name Tag');
2294
2295                const editLink = document.createElement('a');
2296                editLink.classList.add('link-muted');
2297                //editLink.setAttribute('href', 'javascript:;');
2298                editLink.href = "#";
2299                editLink.addEventListener('click', function (event) {
2300                    event.preventDefault();
2301                    quickEditPrivateNameTag(address, privname, strAddressPublicTag, strAddressENS, blnIsContract, privNote, this);
2302                });
2303
2304                const editIcon = document.createElement('i');
2305                editIcon.classList.add('far', 'fa-pen-to-square');
2306                editLink.appendChild(editIcon);
2307                editBtnSpan.appendChild(editLink);
2308
2309                //element.closest('span.group-lg-hover').replaceWith(editBtnSpan);
2310                displayElement.querySelector('span.group-lg-hover').replaceWith(editBtnSpan);
2311            }
2312        }
2313    }
2314
2315    $("[data-bs-toggle='tooltip']").tooltip();
2316}
2317function removePrivateNameTag(element, res) {
2318    try {
2319        if (res.html) {
2320            const match = res.html.match(/data-clipboard-text=['"]([^'"]+)['"]/);
2321            let address = match ? match[1].toLowerCase() : null;
2322
2323            //const links = document.querySelectorAll('a.js-clipboard.link-secondary');
2324            const links = document.querySelectorAll(
2325                'a.js-clipboard.link-secondary, a.js-clipboard-required-confirmation.link-secondary'
2326            );
2327
2328            for (let link of links) {
2329                const linkAddress = link.getAttribute('data-clipboard-text');
2330                if (linkAddress && linkAddress.toLowerCase() === address) {
2331                    let displayElement = link.closest('div.d-flex');
2332                    if (displayElement) {
2333                        displayElement.innerHTML = res.html;
2334                    }
2335                }
2336            }
2337        }
2338    } catch (error) {
2339        console.error("Error removing private name tag:", error);
2340    }
2341}
2342
2343//Private Name Tag Quick Add Edit End
2344
2345//// CONTENT BLOCKER DETECTION
2346//// =======================================================
2347//const POLL_MS = 250;
2348//const MAX_POLLS = 12;
2349
2350//function show(group, showAlt) {
2351//    group.querySelector('.default-content').style.display = showAlt ? 'none' : '';
2352//    group.querySelector('.alternate-content').style.display = showAlt ? '' : 'none';
2353//}
2354
2355//function waitForCreative(container, group, n = 0) {
2356//    const hasCreative = container.querySelector('iframe,img') && container.offsetHeight > 0;
2357//    if (hasCreative) return show(group, false);
2358//    if (n < MAX_POLLS) {
2359//        return setTimeout(() => waitForCreative(container, group, n + 1), POLL_MS);
2360//    }
2361//    show(group, true);
2362//}
2363
2364//window.addEventListener('DOMContentLoaded', () => {
2365//    document.querySelectorAll('[data-featured-group]').forEach(group => {
2366//        const container = group.querySelector('.featured-container');
2367//        if (!container) return;
2368
2369//        /* Grab the first provider <script src> inside the container */
2370//        const tag = container.querySelector('script[src]');
2371//        if (!tag) {
2372//            return waitForCreative(container, group);
2373//        }
2374
2375//        /* Probe the same URL with <link rel="preload"> (tiny request) */
2376//        const probe = document.createElement('link');
2377//        probe.rel = 'preload';
2378//        probe.as = 'script';
2379//        probe.href = tag.src;
2380
2381//        probe.onerror = () => show(group, true);
2382//        probe.onload = () => waitForCreative(container, group);
2383
2384//        document.head.appendChild(probe);
2385//    });
2386//});
2387
2388function initTimestampSwitcher(elId, dropdownId, copyBtnId) {
2389    const el = document.getElementById(elId);
2390    const switcher = document.getElementById(dropdownId);
2391    const copyBtn = document.getElementById(copyBtnId);
2392    if (!el || !switcher) return;
2393
2394    const modeInput = switcher.querySelector("#tsModeValue");
2395    const modeLabel = switcher.querySelector("#tsModeLabel");
2396    const triggerBtn = switcher.querySelector(".ts-dropdown-trigger");
2397    const tooltipTarget = switcher.querySelector(".ts-tooltip-target");
2398    const menuEl = switcher.querySelector(".dropdown-menu");
2399    const utcValueEl = switcher.querySelector("#tsUtcValue");
2400    const localValueEl = switcher.querySelector("#tsLocalValue");
2401    const unixValueEl = switcher.querySelector("#tsUnixValue");
2402    const copyButtons = switcher.querySelectorAll(".ts-copy-btn");
2403
2404    const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
2405    const timestamp = Number(el.dataset.timestamp);
2406    const date = new Date(timestamp * 1000);
2407    const tooltipTarget$ = tooltipTarget ? $(tooltipTarget) : null;
2408
2409    if (switcher.dataset.tsInitialized === "1") {
2410        refreshMenuValues();
2411        const mode = getMode();
2412        setMode(mode);
2413        render(mode);
2414        updateCopyButton();
2415        return;
2416    }
2417
2418    function pad(n) {
2419        return n.toString().padStart(2, "0");
2420    }
2421
2422    function formatUTC(d) {
2423        let h = d.getUTCHours();
2424        const ampm = h >= 12 ? "PM" : "AM";
2425        h = h % 12 || 12;
2426        return `${months[d.getUTCMonth()]}-${pad(d.getUTCDate())}-${d.getUTCFullYear()} ` +
2427            `${pad(h)}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())} ${ampm} +UTC`;
2428    }
2429
2430    function formatLocal(d) {
2431        let h = d.getHours();
2432        const ampm = h >= 12 ? "PM" : "AM";
2433        h = h % 12 || 12;
2434        const offsetMinutes = -d.getTimezoneOffset();
2435        const sign = offsetMinutes >= 0 ? "+" : "-";
2436        const hours = Math.floor(Math.abs(offsetMinutes) / 60);
2437        const minutes = Math.abs(offsetMinutes) % 60;
2438        const utcOffset = `UTC${sign}${pad(hours)}${minutes ? ":" + pad(minutes) : ""}`;
2439        return `${months[d.getMonth()]}-${pad(d.getDate())}-${d.getFullYear()} ` +
2440            `${pad(h)}:${pad(d.getMinutes())}:${pad(d.getSeconds())} ${ampm} ${utcOffset}`;
2441    }
2442
2443    function getMode() {
2444        if (!modeInput || !modeInput.value) {
2445            return "utc";
2446        }
2447        return modeInput.value.toLowerCase();
2448    }
2449
2450    function setMode(mode) {
2451        if (modeInput) {
2452            modeInput.value = mode;
2453        }
2454    }
2455
2456    function refreshMenuValues() {
2457        if (utcValueEl) {
2458            utcValueEl.textContent = formatUTC(date);
2459        }
2460        if (localValueEl) {
2461            localValueEl.textContent = formatLocal(date);
2462        }
2463        if (unixValueEl) {
2464            unixValueEl.textContent = `${timestamp}`;
2465        }
2466    }
2467
2468    function render(mode) {
2469        if (mode === "unix") {
2470            el.textContent = timestamp;
2471        }
2472        else if (mode === "local") {
2473            el.textContent = formatLocal(date);
2474        }
2475        else {
2476            el.textContent = formatUTC(date);
2477        }
2478        if (modeLabel) {
2479            modeLabel.textContent = el.textContent;
2480        }
2481    }
2482
2483    function updateCopyButton() {
2484        if (copyBtn) {
2485            copyBtn.style.display = "none";
2486        }
2487    }
2488
2489    async function copyText(value, iconEl) {
2490        try {
2491            if (navigator.clipboard && navigator.clipboard.writeText) {
2492                await navigator.clipboard.writeText(value);
2493            } else {
2494                const textarea = document.createElement("textarea");
2495                textarea.value = value;
2496                textarea.style.position = "fixed";
2497                textarea.style.opacity = "0";
2498                document.body.appendChild(textarea);
2499                textarea.focus();
2500                textarea.select();
2501                document.execCommand("copy");
2502                document.body.removeChild(textarea);
2503            }
2504            if (iconEl) {
2505                const icon = iconEl.querySelector("i") || iconEl;
2506                icon.classList.remove("fa-copy");
2507                icon.classList.add("fa-check");
2508                const button$ = $(iconEl);
2509                const originalTooltip = button$.attr("data-bs-original-title") || button$.attr("data-original-title") || button$.attr("title") || "Copy";
2510                const placement = button$.attr("data-bs-placement") || "top";
2511                const container = button$.attr("data-bs-container") || "body";
2512
2513                button$.tooltip("dispose");
2514                button$.removeAttr("data-bs-original-title");
2515                button$.removeAttr("data-original-title");
2516                button$.removeAttr("title");
2517                button$.tooltip({
2518                    trigger: "manual",
2519                    placement: placement,
2520                    container: container,
2521                    title: "Copied!"
2522                });
2523                button$.tooltip("show");
2524
2525                setTimeout(() => {
2526                    icon.classList.remove("fa-check");
2527                    icon.classList.add("fa-copy");
2528                    button$.tooltip("dispose");
2529                    button$.attr("title", originalTooltip);
2530                    button$.attr("data-bs-placement", placement);
2531                    button$.attr("data-bs-trigger", "hover");
2532                    button$.attr("data-bs-container", container);
2533                    renderFnTooltip(button$, 0);
2534                }, 800);
2535            }
2536        } catch (err) {
2537            console.error("Unable to copy timestamp value", err);
2538        }
2539    }
2540
2541    copyButtons.forEach(icon => {
2542        icon.addEventListener("click", (event) => {
2543            event.preventDefault();
2544            event.stopPropagation();
2545            const target = icon.getAttribute("data-copy-target");
2546            let textToCopy = "";
2547            if (target === "local") {
2548                textToCopy = localValueEl ? localValueEl.textContent : "";
2549            } else if (target === "unix") {
2550                textToCopy = unixValueEl ? unixValueEl.textContent : "";
2551            } else {
2552                textToCopy = utcValueEl ? utcValueEl.textContent : "";
2553            }
2554            if (textToCopy) {
2555                copyText(textToCopy, icon);
2556            }
2557        });
2558    });
2559
2560    refreshMenuValues();
2561    const defaultMode = getMode();
2562    setMode(defaultMode);
2563    render(defaultMode);
2564    updateCopyButton();
2565
2566    if (tooltipTarget$ && tooltipTarget$.length) {
2567        tooltipTarget$.attr("data-bs-placement", "top");
2568        tooltipTarget$.attr("data-bs-trigger", "hover");
2569        tooltipTarget$.attr("data-bs-container", "body");
2570        renderFnTooltip(tooltipTarget$, 0);
2571    }
2572
2573    function showMenu() {
2574        if (!menuEl || !triggerBtn) return;
2575        menuEl.classList.add("show");
2576        switcher.classList.add("show");
2577        triggerBtn.setAttribute("aria-expanded", "true");
2578    }
2579
2580    function hideMenu() {
2581        if (!menuEl || !triggerBtn) return;
2582        menuEl.classList.remove("show");
2583        switcher.classList.remove("show");
2584        triggerBtn.setAttribute("aria-expanded", "false");
2585    }
2586
2587    function toggleMenu() {
2588        if (!menuEl) return;
2589        if (menuEl.classList.contains("show")) {
2590            hideMenu();
2591        } else {
2592            showMenu();
2593        }
2594    }
2595
2596    if (triggerBtn && menuEl && !switcher.dataset.dropdownClickBound) {
2597        triggerBtn.addEventListener("click", (event) => {
2598            event.preventDefault();
2599            event.stopPropagation();
2600            toggleMenu();
2601        });
2602        switcher.dataset.dropdownClickBound = "1";
2603    }
2604
2605    if (!switcher.dataset.outsideCloseBound) {
2606        document.addEventListener("click", (event) => {
2607            const isInsideSwitcher = switcher.contains(event.target);
2608            if (!isInsideSwitcher) {
2609                hideMenu();
2610            }
2611        }, true);
2612        switcher.dataset.outsideCloseBound = "1";
2613    }
2614
2615    if (copyButtons && copyButtons.length) {
2616        copyButtons.forEach((btn) => {
2617            const button$ = $(btn);
2618            button$.attr("data-bs-placement", "top");
2619            button$.attr("data-bs-trigger", "hover");
2620            button$.attr("data-bs-container", "body");
2621            renderFnTooltip(button$, 0);
2622        });
2623    }
2624
2625    switcher.dataset.tsInitialized = "1";
2626
2627}

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.