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.