Advertisement
Guest User

Untitled

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