PageSourceSearch

https://cstimer.net/src/js/timer/input.js

js cstimer.net collected 2026-10-03 23:10:08 UTC 4,265 bytes, 157 lines download raw bytes

1execMain(function(timer) {
2	var input = $('<textarea id="inputTimer" rows="1" />');
3	var lastEmptyTrigger = 0;
4
5	function parseInput() {
6		//                          |1st     |2nd    |3rd    |4th        |5th        |6th              |7th                    |8th              |9th
7		var reg = /^\s*(?:[\d]+\. )?\(?(DNF)?\(?(\d*?):?(\d*?):?(\d*\.?\d*?)(\+)?\)?(?:=([\d:.+]+?))?(?:\[([^\]]+)\])?\)?\s*(?:   ([^@].*?))?(?:   @(.*?))?\s*$/;
8		var timeRe = /^(\d*?):?(\d*?):?(\d*\.?\d*?)$/;
9		var arr = input.val();
10		var now = $.now();
11		if (/^[\s\n]*$/.exec(arr) && now > lastEmptyTrigger + 500) {
12			kernel.pushSignal('ctrl', ['scramble', 'next']);
13			lastEmptyTrigger = now;
14			input.val('');
15			return;
16		}
17		arr = arr.split(/\s*[,\n]\s*/);
18		var time, ins, comment, scramble;
19		for (var i = 0; i < arr.length; i++) {
20			var m = reg.exec(arr[i]);
21			if (m != null && m[4] != "") {
22				time = ~~Math.round(3600000 * Math.floor(m[2]) + 60000 * Math.floor(m[3]) + 1000 * parseFloat(m[4]));
23				if (time <= 0) {
24					continue;
25				}
26				if (m[2] == '' && m[3] == '' && /^\d+$/.exec(m[4])) {
27					var intUN = kernel.getProp('intUN') || 20100;
28					var modUN = intUN % 10000;
29					time = Math.floor(time / modUN);
30					var hh = Math.floor(time / 10000000);
31					var mi = Math.floor(time / 100000) % 100;
32					var ss = time % 100000;
33					if (intUN > 20000) {
34						time = (60 * hh + mi) * 60000 + ss;
35					} else if (intUN > 10000) {
36						time = (100 * hh + mi) * 60000 + ss;
37					}
38				}
39				if (m[1] == "DNF") {
40					ins = -1;
41				} else if (m[5] == "+" && time > 2000) {
42					ins = 2000;
43					time -= 2000;
44				} else {
45					ins = 0;
46				}
47				var timeSplit = [];
48				if (m[6]) { //multi-phase timing
49					timeSplit = m[6].split('+').reverse();
50					var timeRemain = time;
51					for (var j = 0; j < timeSplit.length; j++) {
52						var mt = timeRe.exec(timeSplit[j]);
53						if (mt == null) {
54							timeRemain = 1e8;
55							break;
56						}
57						timeRemain -= Math.round(3600000 * Math.floor(mt[1]) + 60000 * Math.floor(mt[2]) + 1000 * parseFloat(mt[3]));
58						timeSplit[j] = Math.max(0, timeRemain);
59					}
60					if (Math.abs(timeRemain) > 10 * timeSplit.length) {
61						timeSplit = [];
62					} else {
63						timeSplit.pop();
64					}
65				}
66				comment = m[7] || "";
67				scramble = m[8];
68				var curTime = [comment, scramble, [ins, time].concat(timeSplit)];
69				var timestamp = mathlib.str2time(m[9]);
70				if (timestamp) {
71					curTime.push(timestamp);
72				}
73				timer.curTime(curTime);
74				kernel.pushSignal('time', curTime);
75				kernel.clrKey();
76			}
77		}
78		input.val('');
79	}
80
81	function setEnable(enable) {
82		enable ? input.show() : input.hide();
83		if (enable) {
84			timer.setFobj(input);
85			input[0].select();
86			input.unbind("click").click(function() {
87				input[0].select();
88			});
89		} else {
90			timer.setFobj();
91		}
92	}
93
94	var lastDown = 0;
95	var lastStop = 0;
96	function onkeyup(keyCode, isTrigger) {
97		var now = $.now();
98		if (!timer.checkUseIns()) {
99			return;
100		} else if (isTrigger) {
101			if (timer.status() == 0) {
102				timer.status(-1);
103			} else if (timer.status() == -1 || timer.status() == -3) {
104				if (now - lastStop < 500) {
105					timer.lcd.fixDisplay(false, isTrigger);
106					return;
107				}
108			} else if (timer.status() == -4) {
109				timer.startTime(now);
110				timer.status(-3);
111			}
112		}
113		timer.lcd.fixDisplay(false, isTrigger);
114		if (isTrigger) {
115			kernel.clrKey();
116		}
117	}
118
119	function onkeydown(keyCode, isTrigger) {
120		var now = $.now();
121		if (!timer.checkUseIns()) {
122			return;
123		} else if (now - lastDown < 200) {
124			return;
125		} else if (timer.status() == -3 || keyCode == 27) {
126			timer.status(isTrigger ? 0 : -1);
127			timer.lcd.fixDisplay(false, false);
128		} else if (isTrigger && timer.status() == -1) {
129			timer.status(-4);
130		}
131		timer.lcd.fixDisplay(true, isTrigger);
132		if (isTrigger) {
133			kernel.clrKey();
134		}
135	}
136
137	$(function() {
138		$('#lcd').after(input);
139	});
140
141	timer.input = {
142		setEnable: setEnable,
143		parseInput: parseInput,
144		onkeydown: function(keyCode, e) {
145			if (keyCode == 28) {
146				return;
147			}
148			return onkeydown(keyCode, timer.keyboard.detectTrigger(keyCode, 0, e));
149		},
150		onkeyup: function(keyCode, e) {
151			return onkeyup(keyCode, timer.keyboard.detectTrigger(keyCode, 1, e));
152		},
153		clear: function() {
154			input.val('');
155		}
156	};
157}, [timer]);

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.