Advertisement
Guest User

Untitled

a guest
Oct 15th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.66 KB | None | 0 0
  1. // ==UserScript==
  2. // @name Chattcentralen.se
  3. // @namespace
  4. // @version
  5. // @description Productivity fixes for chattcentralen
  6. // @author
  7. // @match https://chattcentralen.se/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11.  
  12. (function() {
  13. 'use strict';
  14. loadConfig();
  15. console.log(config);
  16. document.title = "✉ Chattcentralen - " + window.location.pathname.substr(1);
  17. switch(window.location.pathname) {
  18. case '/':
  19. console.log("Main page: inserting username and password");
  20. if(config.username)
  21. document.getElementsByClassName('username')[0].value = config.username;
  22. if(config.password)
  23. document.getElementsByClassName('password')[0].value = config.password;
  24. document.getElementsByClassName('ui-button')[1].focus();
  25. if(config.autoLogin && document.getElementsByClassName("messages")[0].textContent.indexOf("Please enter") > -1) {
  26. console.log("Autologin");
  27. document.getElementsByClassName('ui-button')[1].click();
  28. }
  29. break;
  30. case '/messages':
  31. shimFunctions();
  32. case '/announcements':
  33. case '/statistics':
  34. if(config.showCounters) {
  35. createCounters();
  36. getStats();
  37. }
  38. registerHotkeys();
  39. createSettingsButton();
  40. if(config.goToMessagesFirst && document.referrer == window.location.origin+'/')
  41. window.location = window.location.origin+'/messages';
  42. break;
  43. }
  44. })();
  45.  
  46. function loadConfig() {
  47. console.log("Loading config");
  48. var defaults = {
  49. hotkeys: ['KeyQ', 'KeyW', 'KeyA', 'KeyS', 'KeyZ', 'KeyX', 'Digit1', 'Digit2', 'Digit3', 'Digit4', 'Digit5', 'KeyEnter'],
  50. username: '',
  51. password: '',
  52. autoLogin: false,
  53. showCounters: true,
  54. goToMessagesFirst: false,
  55. highlightMessagesNotes: true,
  56. focusTargetNotes: false,
  57. notificationSound: true
  58. };
  59.  
  60. var local = JSON.parse(localStorage.getItem('config'));
  61. if(local === null)
  62. local = defaults;
  63. for (let i in defaults)
  64. if (!local.hasOwnProperty(i))
  65. local[i] = defaults[i];
  66. for (let i in local)
  67. if (!defaults.hasOwnProperty(i))
  68. delete local[i];
  69. console.log("\tConfig loaded");
  70.  
  71. Notification.requestPermission().then(function(result) {
  72. local.showNotifications = result === "granted";
  73. });
  74. config = local;
  75. }
  76.  
  77. function focusMessageBox() {
  78. window.scroll(0, 0);
  79. document.getElementsByClassName('conversation-message-text')[0].focus();
  80. }
  81.  
  82. function getTargetName() {
  83. return document.getElementsByClassName('target-name')[0].textContent.slice(1);
  84. }
  85. function getUsername() {
  86. return document.getElementsByClassName("user")[0].textContent.match(/\w+/)[0];
  87. }
  88.  
  89. function notifyOperator() {
  90. if(document.hidden) {
  91. if(notifyOperator.notificationSound === undefined) {
  92. notifyOperator.notificationSound = new Audio("");
  93. }
  94. console.log("Sending notification");
  95. let oldTitle = document.title;
  96. let newTitle = "✉ New message!";
  97. let notification = new Notification("Chattcentralen", {body: "New message received!"});
  98. if(config.notificationSound) {
  99. notifyOperator.notificationSound.play();
  100. }
  101. setTimeout(() => {
  102. notification.close.bind(notification);
  103. }, 5000);
  104. var n = 0;
  105. function blinkTitle() {
  106. document.title = n%2 ? newTitle : oldTitle;
  107. n++;
  108. if(document.hidden)
  109. window.setTimeout(blinkTitle, 500);
  110. else
  111. document.title = oldTitle;
  112. }
  113. blinkTitle();
  114. window.focus();
  115. }
  116. }
  117.  
  118. function highlightMessagesNotes(element) {
  119. console.log("Highlighting messages and notes");
  120. let username = document.getElementsByClassName('target-name')[0].textContent.match(/\w+/)[0];
  121. for (let e of document.getElementsByClassName("from-to")) {
  122. if(e.textContent.indexOf(username) > -1) {
  123. e.parentElement.parentElement.style.background = highlightColor;
  124. }
  125. }
  126. let target = getTargetName();
  127.  
  128. }
  129.  
  130. window.afterConversationLoaded = function() {
  131. console.log("Loaded conversation");
  132. getStats();
  133. notifyOperator();
  134.  
  135. console.log("Registering emoji click refocusing");
  136. for(let e of document.getElementsByClassName('emoji-insert')) {
  137. e.addEventListener('click', focusMessageBox);
  138. }
  139.  
  140. console.log("Registering automatic photo adding");
  141. for(let e of document.getElementById('AddMediaDialog').getElementsByClassName("mediaAddContainer")) {
  142. e.addEventListener('click', () => {
  143. e.getElementsByTagName("img")[0].click();
  144. e.getElementsByTagName("input")[0].click();
  145. $('#btnAddMedia').button('enable')[0].click();
  146. focusMessageBox();
  147. });
  148. }
  149. 40, 2
  150. let highlightColor = "rgb(255, 211, 20)";
  151. var target = document.getElementById('conversation-content');
  152. if(config.highlightMessagesNotes) {
  153. console.log("Highlighting own messages");
  154. for(let e of document.getElementById("conversation-messages").getElementsByClassName('message-text')) {
  155. let parentParent = e.parentElement.parentElement;
  156. if(parentParent.textContent.slice(1).indexOf(getTargetName()) > -1)
  157. parentParent.style.background = "rgb(145, 145, 145)";
  158. else
  159.  
  160. parentParent.style.background = "rgb(107, 107, 107)";
  161. }
  162.  
  163.  
  164.  
  165. console.log("Highlighting target notes");
  166. let ending = getTargetName().toUpperCase();
  167. for(let e of document.getElementsByClassName('player-last-notes')[0].children) {
  168. if(e.children[2].textContent.toUpperCase().replace(/[\ \)]*$/,"").indexOf(ending) > -1) {
  169. e.style.background = highlightColor;
  170. }
  171. }
  172. }
  173.  
  174.  
  175. let targetNotesContent = document.getElementsByClassName('target-note-content')[0];
  176. document.addEventListener('selectionchange', (e) => {
  177. let anchor = document.getSelection().anchorNode;
  178. if(anchor && anchor.nodeType === Node.TEXT_NODE) {
  179. anchor = anchor.parentElement;
  180. }
  181. if(anchor.classList.contains('message-text')) {
  182. targetNotesContent.value = window.getSelection().toString();
  183. }
  184. });
  185. }
  186.  
  187. function shimFunctions() {
  188. /*
  189. if(config.showCounters) {
  190. console.log("Adding statistics counters");
  191. loadConversation = (function() {
  192. var cached_loadConversation = loadConversation;
  193. return function() {
  194. var result = cached_loadConversation.apply(this, arguments);
  195. afterConversationLoaded();
  196. return result;
  197. };
  198. })();
  199. }
  200. /*/
  201. console.log("Adding statistics counters????");
  202. if(config.showCounters) {
  203. console.log("Adding statistics counters");
  204. loadConversation = new Function(
  205. "id",
  206. "doPreload",
  207. "review",
  208. "fromClaimNext",
  209. "claimNextType",
  210. loadConversation.toString()
  211. .replace("userIdleTime = 0;", "userIdleTime = 0;\n\t\tafterConversationLoaded();")
  212. .replace(/^function[^{]+{/i,"")
  213. .replace(/}[^}]*$/i, "")
  214. );
  215. }
  216. //*/
  217. console.log("Shimming playerNotes");
  218. playerNotes = (function() {
  219. var cached_playerNotes = playerNotes;
  220. return function() { // Swaps category dropdown and log button for player
  221. var result = cached_playerNotes.apply(this, arguments);
  222. let e = document.getElementsByClassName('player-note-categories')[0];
  223. let f = document.getElementsByClassName('player-save-note')[0];
  224. if(e !== undefined && f !== undefined) {
  225. f.insertAdjacentElement('beforebegin', e);
  226. f.addEventListener('click', focusMessageBox);
  227. }
  228. return result;
  229. };
  230. })();
  231. console.log("Shimming targetNotes");
  232. targetNotes = (function() { // Swaps category dropdown and log button for player
  233. var cached_targetNotes = targetNotes;
  234. return function() {
  235. var result = cached_targetNotes.apply(this, arguments);
  236. let e = document.getElementsByClassName('target-note-categories')[0];
  237. let f = document.getElementsByClassName('target-save-note')[0];
  238. if(e !== undefined && f !== undefined) {
  239. f.insertAdjacentElement('beforebegin', e);
  240. if(config.focusTargetNotes) {
  241. f.addEventListener('click', (() => $('.target-note-content')[0].focus()));
  242. } else {
  243. f.addEventListener('click', focusMessageBox);
  244. }
  245. }
  246. return result;
  247. };
  248. })();
  249. }
  250.  
  251. function registerHotkeys() {
  252. console.log("Registering hotkeys");
  253. var helperFunctions = new Map();
  254. helperFunctions.set(config.hotkeys[0], // Go to player note
  255. () => {
  256. let e = document.getElementsByClassName('player-note-content')[0];
  257. if(e !== undefined) {
  258. var targetNameNote = " (" + getTargetName() + ")";
  259. if(!e.value.endsWith(targetNameNote))
  260. e.value += targetNameNote;
  261. $.fancybox.close();
  262. e.focus();
  263. let pos = e.value.length - targetNameNote.length;
  264. e.setSelectionRange(pos, pos);
  265. }
  266. });
  267. helperFunctions.set(config.hotkeys[1], // Go to target note
  268. () => {
  269. let e = document.getElementsByClassName('target-note-content')[0];
  270. if(e !== undefined) {
  271. $.fancybox.close();
  272. e.focus();
  273. }
  274. });
  275. helperFunctions.set(config.hotkeys[2], focusMessageBox); // Go to message box
  276. helperFunctions.set(config.hotkeys[3], // Open latest attachment
  277. () => {
  278. let e = document.getElementsByClassName('conversation-attachment')[0];
  279. if(e !== undefined) {
  280. e.click();
  281. }
  282. });
  283. helperFunctions.set(config.hotkeys[4], // Add image
  284. () => {
  285. let e = document.getElementsByClassName('message-addmedia-button')[0];
  286. if(e !== undefined) {
  287. e.click();
  288. }
  289. });
  290. helperFunctions.set(config.hotkeys[5], // Remove image
  291. () => {
  292. let e = document.getElementsByClassName('message-delmedia-button')[0];
  293. if(e !== undefined) {
  294. e.click();
  295. }
  296. });
  297. helperFunctions.set(config.hotkeys[6], // Go to Messages
  298. () => {
  299. $('button[rel="messages"]').click();
  300. });
  301. helperFunctions.set(config.hotkeys[7], // Go to Statistics
  302. () => {
  303. $('button[rel="statistics"]').click();
  304. /*console.log("Sending notification");
  305. window.setTimeout(() => {
  306. notifyOperator();
  307. }, 2000);*/
  308. });
  309. helperFunctions.set(config.hotkeys[8], // Go to Announcements
  310. () => {
  311. $('button[rel="announcements"]').click();
  312. });
  313. helperFunctions.set(config.hotkeys[9], // Go to Manual
  314. () => {
  315. $('button[rel="documents/manual.pdf"]').click();
  316. });
  317. helperFunctions.set(config.hotkeys[10], // Go to Settings
  318. () => {
  319. $('button[rel="settings"]').click();
  320. });
  321.  
  322.  
  323. document.addEventListener('keydown', (e) => { // Adds event listeners for the hotkeys
  324. if(e.altKey && isOkHotkey(e.code)) {
  325. e.preventDefault();
  326. e.stopPropagation();
  327. let f = helperFunctions.get(e.code);
  328. if(f !== undefined) f();
  329. }
  330. });
  331.  
  332.  
  333. console.log("\tHotkeys registered");
  334. }
  335.  
  336. function isOkHotkey(code) {
  337. return code.startsWith("Key") || code.startsWith("Digit") || code.startsWith("Numpad") || code.startsWith("F");
  338. }
  339.  
  340. function createSettingsButton() {
  341. function addSetting(value, name) {
  342. var id_name = (name + 'Setting').replace(/[^A-Za-z_]/g,'');
  343. var label = document.createElement('label');
  344. label.innerHTML = name + ": ";
  345. label.setAttribute('for', id_name);
  346. label.style.gridColumn = '1';
  347. var element = document.createElement('input');
  348. if(typeof value == 'boolean') {
  349. element.type = 'checkbox';
  350. element.checked = value;
  351. } else {
  352. element.type = 'text';
  353. element.value = value !== undefined ? value : "";
  354. }
  355. element.id = id_name;
  356. element.name = id_name;
  357. element.style.gridColumn = '2';
  358. settingsDialog.appendChild(label);
  359. settingsDialog.appendChild(element);
  360. return element;
  361. }
  362.  
  363. function setHotkey(n, e) {
  364. if(isOkHotkey(e.code) || ['Backspace', 'Delete'].includes(e.code)) {
  365. e.preventDefault();
  366. e.stopPropagation();
  367. var code = (['Backspace', 'Delete'].includes(e.code)) ? "" : e.code;
  368. e.target.value = code;
  369. config.hotkeys[n] = code;
  370. }
  371. }
  372. console.log("Creating settings button");
  373.  
  374. var menu = $('#topmenu1')[0];
  375. var settingsDialog = document.createElement('div');
  376. settingsDialog.id = 'SettingsDialog';
  377. settingsDialog.style.display = 'none';
  378. settingsDialog.style.alignItems = 'center';
  379.  
  380. addSetting(config.username, 'Username') .addEventListener('change', (e) => {config.username = e.target.value;});
  381. addSetting(config.password, 'Password') .addEventListener('change', (e) => {config.password = e.target.value;});
  382. addSetting(config.autoLogin, 'Autologin') .addEventListener('change', (e) => {config.autoLogin = e.target.checked;});
  383. addSetting(config.showCounters, 'Show counters') .addEventListener('change', (e) => {config.showCounters = e.target.checked;});
  384. addSetting(config.goToMessagesFirst, 'Go to Messages after login')
  385. .addEventListener('change', (e) => {config.goToMessagesFirst = e.target.checked;});
  386. addSetting(config.highlightMessagesNotes, 'Highlights messages and notes')
  387. .addEventListener('change', (e) => {config.highlightMessagesNotes = e.target.checked;});
  388. addSetting(config.focusTargetNotes, 'Focus target notes after logging')
  389. .addEventListener('change', (e) => {config.focusTargetNotes = e.target.checked;});
  390. addSetting(config.notificationSound, 'Play sound on new message')
  391. .addEventListener('change', (e) => {config.notificationSound = e.target.checked;});
  392. addSetting(config.hotkeys[ 0], 'Go to player logging') .addEventListener('keydown', (e) => {setHotkey( 0, e);});
  393. addSetting(config.hotkeys[ 1], 'Go to target logging') .addEventListener('keydown', (e) => {setHotkey( 1, e);});
  394. addSetting(config.hotkeys[ 2], 'Go to message box') .addEventListener('keydown', (e) => {setHotkey( 2, e);});
  395. addSetting(config.hotkeys[ 3], 'Open latest attachment').addEventListener('keydown', (e) => {setHotkey( 3, e);});
  396. addSetting(config.hotkeys[ 4], 'Add photo dialog') .addEventListener('keydown', (e) => {setHotkey( 4, e);});
  397. addSetting(config.hotkeys[ 5], 'Remove selected photo') .addEventListener('keydown', (e) => {setHotkey( 5, e);});
  398. addSetting(config.hotkeys[ 6], 'Go to Messages') .addEventListener('keydown', (e) => {setHotkey( 6, e);});
  399. addSetting(config.hotkeys[ 7], 'Go to Statistics') .addEventListener('keydown', (e) => {setHotkey( 7, e);});
  400. addSetting(config.hotkeys[ 8], 'Go to Announcements') .addEventListener('keydown', (e) => {setHotkey( 8, e);});
  401. addSetting(config.hotkeys[ 9], 'Go to Manual') .addEventListener('keydown', (e) => {setHotkey( 9, e);});
  402. addSetting(config.hotkeys[10], 'Open these settings') .addEventListener('keydown', (e) => {setHotkey(10, e);});
  403. addSetting(config.hotkeys[11], 'Send Button/Lap') .addEventListener('keydown', (e) => {setHotkey(11, e);});
  404.  
  405. var settingsButton = menu.children[5].cloneNode();
  406. settingsButton.id = 'SettingsButton';
  407. settingsButton.setAttribute('rel', 'settings');
  408. settingsButton.addEventListener('click', () => {
  409. $('#SettingsDialog').dialog({
  410. title: "Settings",
  411. resizable: false,
  412. modal: true,
  413. position: 'top',
  414. width: '400',
  415. open: () => {
  416. $('#SettingsDialog')[0].style.display = 'grid';
  417. },
  418. buttons: [
  419. {
  420. text: "Save",
  421. click: () => {
  422. console.log("Storing config");
  423. localStorage.setItem('config', JSON.stringify(config));
  424. console.log("\tConfig stored:");
  425. console.log(localStorage.getItem('config'));
  426. loadConfig();
  427. //window.location.reload();
  428. }
  429. }
  430. ]
  431. });
  432. });
  433. $('button[rel="documents/manual.pdf"]')[0].insertAdjacentElement('afterend', settingsButton);
  434. $('button[rel="documents/manual.pdf"]')[0].insertAdjacentText('afterend', '\n');
  435. $('#SettingsButton').button();
  436. settingsButton.children[0].innerHTML = 'Settings';
  437. document.getElementById('informDialog').insertAdjacentElement('afterend', settingsDialog);
  438. console.log("\tSettings button created");
  439. }
  440.  
  441. function createCounters() {
  442. console.log("Creating counter elements");
  443. var menu = document.getElementById('topmenu1');
  444. menu.style.position = 'relative';
  445.  
  446. var counters = document.createElement('div');
  447. counters.id = 'counters-container';
  448. counters.style.display = 'inline-block';
  449. counters.style.position = 'absolute';
  450. counters.style.top = '50%';
  451. counters.style.transform = 'translateY(-50%)';
  452. counters.style.fontSize = '1.1em';
  453.  
  454. var column1 = document.createElement('div');
  455. column1.id = 'counters-column1';
  456. column1.style.display = 'inline-block';
  457. column1.style.marginLeft = '1em';
  458. column1.style.marginTop = '1em';
  459. column1.style.verticalAlign = 'top';
  460. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Normal: ';
  461. column1.appendChild(document.createElement('span'));
  462. column1.appendChild(document.createElement('br'));
  463. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Bonus: ';
  464. column1.appendChild(document.createElement('span'));
  465. column1.appendChild(document.createElement('br'));
  466. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Earned: €';
  467. column1.appendChild(document.createElement('span'));
  468. column1.appendChild(document.createElement('br'));
  469. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Time: ';
  470. column1.appendChild(document.createElement('span'));
  471.  
  472. var column2 = document.createElement('div');
  473. column2.id = 'counters-column2';
  474. column2.style.display = 'inline-block';
  475. column2.style.marginLeft = '2em';
  476. column2.style.marginTop = '1em';
  477. column2.style.verticalAlign = 'top';
  478. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'This week: ';
  479. column2.appendChild(document.createElement('span'));
  480. column2.appendChild(document.createElement('br'));
  481. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Earned: €';
  482. column2.appendChild(document.createElement('span'));
  483. column2.appendChild(document.createElement('br'));
  484. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Rate: €';
  485. column2.appendChild(document.createElement('span'));
  486. column2.appendChild(document.createElement('br'));
  487. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Last Msg: ';
  488. column2.appendChild(document.createElement('span'));
  489.  
  490.  
  491. var column3 = document.createElement('div');
  492. column3.id = 'counters-column3';
  493. column3.style.display = 'inline-block';
  494. column3.style.marginLeft = '3em';
  495. column3.style.marginTop = '1em';
  496. column3.style.verticalAlign = 'top';
  497. column3.appendChild(document.createElement('button')); column3.lastChild.innerHTML = 'Start';
  498. column3.appendChild(document.createElement('span'));
  499. column3.appendChild(document.createElement('br'));
  500.  
  501.  
  502. var column4 = document.createElement('div');
  503. column4.id = 'counters-column4';
  504. column4.style.display = 'inline-block';
  505. column4.style.marginLeft = '3em';
  506. column4.style.marginTop = '1em';
  507. column4.style.verticalAlign = 'top';
  508. column4.appendChild(document.createElement('button')); column4.lastChild.innerHTML = 'Stop';
  509.  
  510. var column5 = document.createElement('div');
  511. column5.id = 'counters-column5';
  512. column5.style.display = 'inline-block';
  513. column5.style.marginLeft = '3em';
  514. column5.style.marginTop = '1em';
  515. column5.style.verticalAlign = 'top';
  516. column5.appendChild(document.createElement('button')); column5.lastChild.innerHTML = 'Clear';
  517.  
  518. counters.appendChild(column1);
  519. counters.appendChild(column2);
  520. counters.appendChild(column3);
  521. counters.appendChild(column4);
  522. counters.appendChild(column5);
  523. menu.insertBefore(counters, menu.lastElementChild);
  524. console.log("\tCounter elements created");
  525. }
  526.  
  527.  
  528. function calcRate(messages) {
  529. if(messages >= 1976)
  530. return 0.19;
  531. if(messages >= 1576)
  532. return 0.16;
  533. if(messages >= 776)
  534. return 0.14;
  535. return 0.12;
  536. }
  537.  
  538. function calcEarned(rate, normal, bonus, other) {
  539. return rate * (normal + bonus) +
  540. 0.02 * bonus +
  541. 0.12 * other;
  542. }
  543.  
  544.  
  545. function getStats() {
  546. function updateCounters(stats) {
  547. function statsForDate(date) {
  548. var normal = parseInt(date.replied_messages_normal) | 0;
  549. var peakHour = parseInt(date.replied_messages_peakhour) | 0;
  550. var weekend = parseInt(date.replied_messages_saturday) +
  551. parseInt(date.replied_messages_sunday) +
  552. parseInt(date.replied_messages_specialtrigger) | 0;
  553. var other = parseInt(date.replied_favorites) +
  554. parseInt(date.replied_flirts) +
  555. parseInt(date.replied_matches) | 0;
  556. return [normal, peakHour + weekend, other];
  557. }
  558. console.log("Updating counters");
  559. var date = new Date().toLocaleString('sv-SE', {
  560. year: 'numeric',
  561. month: '2-digit',
  562. day: '2-digit'
  563. });
  564. var sentNormal, sentBonus, other, normalWeek=0, bonusWeek=0, otherWeek=0, rate,
  565. column1 = document.getElementById('counters-column1'),
  566. column2 = document.getElementById('counters-column2'),
  567. column3 = document.getElementById('counters-column3'),
  568. column4 = document.getElementById('counters-column4'),
  569. column5 = document.getElementById('counters-column5'),
  570. column6 = document.getElementById('counters-column6');
  571. column1.children[1].innerHTML = 'No statistics for today (yet?)!';
  572. column1.children[4].innerHTML = '';
  573. for(const s of stats) {
  574. [sentNormal, sentBonus, other] = statsForDate(s);
  575. normalWeek += sentNormal;
  576. bonusWeek += sentBonus;
  577. otherWeek += other;
  578. if(s.date == date) {
  579. rate = calcRate(normalWeek + bonusWeek);
  580. column1.children[1].innerHTML = sentNormal;
  581. column1.children[4].innerHTML = sentBonus;
  582. column1.children[7].innerHTML = (rate * (sentNormal + sentBonus)).toFixed(2);
  583. console.log("\tCounters for today updated");
  584. break;
  585. }
  586. }
  587. column2.children[1].innerHTML = normalWeek + bonusWeek;
  588. column2.children[4].innerHTML = calcEarned(rate, normalWeek, bonusWeek, otherWeek).toFixed(2);
  589. column2.children[7].innerHTML = rate;
  590.  
  591.  
  592. console.log("\tCounters updated");
  593. }
  594. console.log("Getting statistics");
  595. $.ajax({
  596. url: '/ajax/stats/action/getStats',
  597. dataType: 'json',
  598. type: 'POST',
  599. data: {
  600. year: new Date().getFullYear(),
  601. weekno: $.datepicker.iso8601Week(new Date()),
  602. pagination: {
  603. current: 1,
  604. drawPagination: false,
  605. perPage: 20,
  606. total: 1
  607. },
  608. type: 'mine'
  609. },
  610. success: function (response) {
  611. console.log("getStats AJAX call success");
  612. updateCounters(response.data.result);
  613. },
  614. complete: function () {}
  615. });
  616. console.log("\tStatistics gotten");
  617. }
  618.  
  619.  
  620.  
  621. var h1 = document.getElementById('counters-column1'),
  622. start = document.getElementById('counters-column3'),
  623. stop = document.getElementById('counters-column4'),
  624. clear = document.getElementById('counters-column5'),
  625. h2 = document.getElementById('counters-column2'),
  626. seconds = 0, minutes = 0, hours = 0,
  627. t;
  628.  
  629. function add() {
  630. seconds++;
  631. if (seconds >= 60) {
  632. seconds = 0;
  633. minutes++;
  634. if (minutes >= 60) {
  635. minutes = 0;
  636. hours++;
  637. }
  638. }
  639.  
  640. h1.children[10].textContent = (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + ":" + (seconds > 9 ? seconds : "0" + seconds);
  641.  
  642. timer();
  643. }
  644. function timer() {
  645. t = setTimeout(add, 1000);
  646. }
  647. timer();
  648.  
  649.  
  650. /* Start button */
  651. start.onclick = timer;
  652.  
  653. /* Stop button */
  654. stop.onclick = function() {
  655. clearTimeout(t);
  656. }
  657.  
  658. /* Clear button */
  659. clear.onclick = function() {
  660. h1.children[10].textContent = "00:00";
  661. seconds = 0; minutes = 0; hours = 0;
  662. h2.children[10].textContent = ""
  663. }
  664.  
  665. var lastLap = {seconds: seconds, minutes: minutes, hours: hours};
  666.  
  667. /* Lap Button*/
  668. document.addEventListener('keydown', (e) => { // Send Button/Lap
  669. if (e.which == 13 || e.keyCode == 13) {
  670.  
  671. $('.message-submit-button').click();
  672. h2.children[10].textContent = leftPad(minutes) + ":" + leftPad(seconds);
  673. h1.children[10].innerHTML = "00:00";
  674. seconds = 0; minutes = 0; hours = 0;
  675. return false;
  676. }
  677. return true;
  678.  
  679. });
  680.  
  681. function leftPad(value) {
  682. return value < 10 ? ('0' + value) : value;
  683. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement