PageSourceSearch

https://metalab.at/static/admin/js/core.js

js metalab.at collected 2026-09-24 09:19:24 UTC 6,208 bytes, 184 lines download raw bytes

1// Core JavaScript helper functions
2'use strict';
3
4// quickElement(tagType, parentReference [, textInChildNode, attribute, attributeValue ...]);
5function quickElement() {
6    const obj = document.createElement(arguments[0]);
7    if (arguments[2]) {
8        const textNode = document.createTextNode(arguments[2]);
9        obj.appendChild(textNode);
10    }
11    const len = arguments.length;
12    for (let i = 3; i < len; i += 2) {
13        obj.setAttribute(arguments[i], arguments[i + 1]);
14    }
15    arguments[1].appendChild(obj);
16    return obj;
17}
18
19// "a" is reference to an object
20function removeChildren(a) {
21    while (a.hasChildNodes()) {
22        a.removeChild(a.lastChild);
23    }
24}
25
26// ----------------------------------------------------------------------------
27// Find-position functions by PPK
28// See https://www.quirksmode.org/js/findpos.html
29// ----------------------------------------------------------------------------
30function findPosX(obj) {
31    let curleft = 0;
32    if (obj.offsetParent) {
33        while (obj.offsetParent) {
34            curleft += obj.offsetLeft - obj.scrollLeft;
35            obj = obj.offsetParent;
36        }
37    } else if (obj.x) {
38        curleft += obj.x;
39    }
40    return curleft;
41}
42
43function findPosY(obj) {
44    let curtop = 0;
45    if (obj.offsetParent) {
46        while (obj.offsetParent) {
47            curtop += obj.offsetTop - obj.scrollTop;
48            obj = obj.offsetParent;
49        }
50    } else if (obj.y) {
51        curtop += obj.y;
52    }
53    return curtop;
54}
55
56//-----------------------------------------------------------------------------
57// Date object extensions
58// ----------------------------------------------------------------------------
59{
60    Date.prototype.getTwelveHours = function() {
61        return this.getHours() % 12 || 12;
62    };
63
64    Date.prototype.getTwoDigitMonth = function() {
65        return (this.getMonth() < 9) ? '0' + (this.getMonth() + 1) : (this.getMonth() + 1);
66    };
67
68    Date.prototype.getTwoDigitDate = function() {
69        return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
70    };
71
72    Date.prototype.getTwoDigitTwelveHour = function() {
73        return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours();
74    };
75
76    Date.prototype.getTwoDigitHour = function() {
77        return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
78    };
79
80    Date.prototype.getTwoDigitMinute = function() {
81        return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
82    };
83
84    Date.prototype.getTwoDigitSecond = function() {
85        return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds();
86    };
87
88    Date.prototype.getAbbrevDayName = function() {
89        return typeof window.CalendarNamespace === "undefined"
90            ? '0' + this.getDay()
91            : window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()];
92    };
93
94    Date.prototype.getFullDayName = function() {
95        return typeof window.CalendarNamespace === "undefined"
96            ? '0' + this.getDay()
97            : window.CalendarNamespace.daysOfWeek[this.getDay()];
98    };
99
100    Date.prototype.getAbbrevMonthName = function() {
101        return typeof window.CalendarNamespace === "undefined"
102            ? this.getTwoDigitMonth()
103            : window.CalendarNamespace.monthsOfYearAbbrev[this.getMonth()];
104    };
105
106    Date.prototype.getFullMonthName = function() {
107        return typeof window.CalendarNamespace === "undefined"
108            ? this.getTwoDigitMonth()
109            : window.CalendarNamespace.monthsOfYear[this.getMonth()];
110    };
111
112    Date.prototype.strftime = function(format) {
113        const fields = {
114            a: this.getAbbrevDayName(),
115            A: this.getFullDayName(),
116            b: this.getAbbrevMonthName(),
117            B: this.getFullMonthName(),
118            c: this.toString(),
119            d: this.getTwoDigitDate(),
120            H: this.getTwoDigitHour(),
121            I: this.getTwoDigitTwelveHour(),
122            m: this.getTwoDigitMonth(),
123            M: this.getTwoDigitMinute(),
124            p: (this.getHours() >= 12) ? 'PM' : 'AM',
125            S: this.getTwoDigitSecond(),
126            w: '0' + this.getDay(),
127            x: this.toLocaleDateString(),
128            X: this.toLocaleTimeString(),
129            y: ('' + this.getFullYear()).substr(2, 4),
130            Y: '' + this.getFullYear(),
131            '%': '%'
132        };
133        let result = '', i = 0;
134        while (i < format.length) {
135            if (format.charAt(i) === '%') {
136                result += fields[format.charAt(i + 1)];
137                ++i;
138            }
139            else {
140                result += format.charAt(i);
141            }
142            ++i;
143        }
144        return result;
145    };
146
147    // ----------------------------------------------------------------------------
148    // String object extensions
149    // ----------------------------------------------------------------------------
150    String.prototype.strptime = function(format) {
151        const split_format = format.split(/[.\-/]/);
152        const date = this.split(/[.\-/]/);
153        let i = 0;
154        let day, month, year;
155        while (i < split_format.length) {
156            switch (split_format[i]) {
157            case "%d":
158                day = date[i];
159                break;
160            case "%m":
161                month = date[i] - 1;
162                break;
163            case "%Y":
164                year = date[i];
165                break;
166            case "%y":
167                // A %y value in the range of [00, 68] is in the current
168                // century, while [69, 99] is in the previous century,
169                // according to the Open Group Specification.
170                if (parseInt(date[i], 10) >= 69) {
171                    year = date[i];
172                } else {
173                    year = (new Date(Date.UTC(date[i], 0))).getUTCFullYear() + 100;
174                }
175                break;
176            }
177            ++i;
178        }
179        // Create Date object from UTC since the parsed value is supposed to be
180        // in UTC, not local time. Also, the calendar uses UTC functions for
181        // date extraction.
182        return new Date(Date.UTC(year, month, day));
183    };
184}

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.