Advertisement
Guest User

Untitled

a guest
Feb 1st, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 60.45 KB | None | 0 0
  1. // ==UserScript==
  2. // @name SE Vanliga kontot 4.0
  3. // @namespace
  4. // @version SE 3.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', 'KeyH', 'KeyK', 'Digit4', 'Digit5', 'ArrowRight', 'Digit6', 'ArrowLeft', 'Digit1', 'Digit5', 'Digit3'],
  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('contextmenu', allowCopyAndPaste, true);
  86. document.addEventListener('keydown', allowCopyAndPaste, true);
  87. })();
  88.  
  89.  
  90. function focusMessageBox() {
  91. window.scroll(0, 0);
  92. document.getElementsByClassName('conversation-message-text')[0].focus();
  93. }
  94.  
  95. function getTargetName() {
  96. return document.getElementsByClassName('target-name')[0].textContent.slice(1);
  97. }
  98. function getUsername() {
  99. return document.getElementsByClassName("user")[0].textContent.match(/\w+/)[0];
  100. }
  101.  
  102. function notifyOperator() {
  103. if(document.hidden) {
  104. if(notifyOperator.notificationSound === undefined) {
  105. notifyOperator.notificationSound = new Audio("https://youtu.be/llcQu-XB6oE?t=10");
  106. }
  107. console.log("Sending notification");
  108. let oldTitle = document.title;
  109. let newTitle = "✉ New message!";
  110. let notification = new Notification("Chattcentralen", {body: "New message received!"});
  111. if(config.notificationSound) {
  112. notifyOperator.notificationSound.play();
  113. }
  114. setTimeout(() => {
  115. notification.close.bind(notification);
  116. }, 5000);
  117. var n = 0;
  118. function blinkTitle() {
  119. document.title = n%2 ? newTitle : oldTitle;
  120. n++;
  121. if(document.hidden)
  122. window.setTimeout(blinkTitle, 500);
  123. else
  124. document.title = oldTitle;
  125. }
  126. blinkTitle();
  127. window.focus();
  128. }
  129. }
  130.  
  131. function highlightMessagesNotes(element) {
  132. console.log("Highlighting messages and notes");
  133. let username = document.getElementsByClassName('target-name')[0].textContent.match(/\w+/)[0];
  134. for (let e of document.getElementsByClassName("from-to")) {
  135. if(e.textContent.indexOf(username) > -1) {
  136. e.parentElement.parentElement.style.background = highlightColor;
  137. }
  138. }
  139. let target = getTargetName();
  140.  
  141. }
  142.  
  143. /**
  144. * jQuery.autotype -
  145. */
  146. (function($){
  147.  
  148. // code type constants
  149. var CHARACTER = 1,
  150. NON_CHARACTER = 2,
  151. MODIFIER_BEGIN = 3,
  152. MODIFIER_END = 4,
  153. isNullOrEmpty = function(val) { return val === null || val.length === 0; },
  154. isUpper = function(char) { return char.toUpperCase() === char; },
  155. isLower = function(char) { return char.toLowerCase() === char; },
  156. areDifferentlyCased = function(char1,char2) {
  157. return (isUpper(char1) && isLower(char2)) ||
  158. (isLower(char1) && isUpper(char2));
  159. },
  160. convertCase = function(char) {
  161. return isUpper(char) ? char.toLowerCase() : char.toUpperCase();
  162. },
  163. parseCodes = function(value, codeMap) {
  164. // buffer to hold a collection of key/char code pairs corresponding to input string value
  165. var codes = [],
  166. // buffer to hold the name of a control key as it's being parsed
  167. definingControlKey = false,
  168. // hold a collection of currently pushed modifier keys
  169. activeModifiers = {
  170. alt: false,
  171. meta: false,
  172. shift: false,
  173. ctrl: false
  174. },
  175. explicitModifiers = $.extend({}, activeModifiers),
  176. // buffer to hold construction of current control key
  177. currentControlKey = '',
  178. previousChar = '',
  179. pushCode = function(opts) {
  180. codes.push($.extend({}, opts, activeModifiers));
  181. },
  182. pushModifierBeginCode = function(modifierName) {
  183. activeModifiers[modifierName] = true;
  184. pushCode({
  185. keyCode: codeMap[modifierName],
  186. charCode: 0,
  187. char: '',
  188. type: MODIFIER_BEGIN
  189. });
  190. },
  191. pushModifierEndCode = function(modifierName) {
  192. activeModifiers[modifierName] = false;
  193. pushCode({
  194. keyCode: codeMap[modifierName],
  195. charCode: 0,
  196. char: '',
  197. type: MODIFIER_END
  198. });
  199. };
  200.  
  201. for(var i=0;i<value.length;i++) {
  202. // if the character is about to define a control key
  203. if(!definingControlKey &&
  204. i <= value.length - 5 &&
  205. value.charAt(i) === '{' &&
  206. value.charAt(i+1) === '{')
  207. {
  208. // skip the next "{"
  209. i++;
  210.  
  211. definingControlKey = true;
  212. }
  213. // if the character is about to end definition of control key
  214. else if (definingControlKey &&
  215. i <= value.length - 2 &&
  216. value.charAt(i) === '}' &&
  217. value.charAt(i+1) === '}')
  218. {
  219. // skip the next "}"
  220. i++;
  221.  
  222. // check if this key is a modifier-opener (is a ctrl,alt,del,shift)
  223. if(activeModifiers[currentControlKey] !== undefined)
  224. {
  225. explicitModifiers[currentControlKey] = true;
  226. pushModifierBeginCode(currentControlKey);
  227. }
  228. // check if this key is a modifier-closer (is a /ctrl,/alt,/del,.shift)
  229. else if(activeModifiers[currentControlKey.substring(1)] !== undefined)
  230. {
  231. explicitModifiers[currentControlKey] = false;
  232. pushModifierEndCode(currentControlKey.substring(1));
  233. }
  234. // otherwise is some other kind of non-modifier control key
  235. else
  236. {
  237. pushCode({
  238. keyCode: codeMap[currentControlKey],
  239. charCode: 0,
  240. char: '',
  241. type: NON_CHARACTER,
  242. controlKeyName: currentControlKey
  243. });
  244. }
  245.  
  246. definingControlKey = false;
  247. currentControlKey = '';
  248. }
  249. // currently defining control key
  250. else if (definingControlKey)
  251. {
  252. currentControlKey += value.charAt(i);
  253. }
  254. // otherwise is just a text character
  255. else
  256. {
  257. var character = value.charAt(i);
  258.  
  259. // check for any implicitly changing of cases, and register presses/releases
  260. // of the shift key in accord with them.
  261. if(
  262. (!isNullOrEmpty(previousChar) && areDifferentlyCased(previousChar, character)) ||
  263. (isNullOrEmpty(previousChar) && isUpper(character))
  264. )
  265. {
  266. if(isUpper(character) && !activeModifiers.shift) {
  267. pushModifierBeginCode("shift");
  268. } else if (isLower(character) && activeModifiers.shift && !explicitModifiers.shift){
  269. pushModifierEndCode("shift");
  270. }
  271. }
  272.  
  273. // modify the current character if there are active modifiers
  274. if((activeModifiers.shift && isLower(character)) ||
  275. (!activeModifiers.shift && isUpper(character))) {
  276. // shift converts case
  277. character = convertCase(character);
  278. }
  279.  
  280. var code = {
  281. // if can't identify a keycode, just fudge with the char code.
  282. // nope, this isn't ideal by any means.
  283. keyCode: codeMap[character] || character.charCodeAt(0),
  284. charCode: character.charCodeAt(0),
  285. char: character,
  286. type: CHARACTER
  287. };
  288.  
  289. // modify the current character if there are active modifiers
  290. if(activeModifiers.alt ||
  291. activeModifiers.ctrl ||
  292. activeModifiers.meta) {
  293. // alt, ctrl, meta make it so nothing is typed
  294. code.char = '';
  295. }
  296. pushCode(code);
  297. if(code.char !== '') { previousChar = code.char; }
  298. }
  299. }
  300. return codes;
  301. },
  302. triggerCodeOnField = function(code, field) {
  303. // build up base content that every event should contain
  304. // with information about whether certain chord keys are
  305. // simulated as being pressed
  306. var evnt = {
  307. altKey: code.alt,
  308. metaKey: code.meta,
  309. shiftKey: code.shift,
  310. ctrlKey: code.ctrl
  311. };
  312.  
  313. // build out 3 event instances for all the steps of a key entry
  314. var keyDownEvent = $.extend($.Event(), evnt, {type:'keydown', keyCode: code.keyCode, charCode: 0, which: code.keyCode});
  315. var keyPressEvent = $.extend($.Event(), evnt, {type:'keypress', keyCode: 0, charCode: code.charCode, which: code.charCode || code.keyCode});
  316. var keyUpEvent = $.extend($.Event(), evnt, {type:'keyup', keyCode: code.keyCode, charCode: 0, which: code.keyCode});
  317.  
  318. // go ahead and trigger the first 2 (down and press)
  319. // a keyup of a modifier shouldn't also re-trigger a keydown
  320. if(code.type !== MODIFIER_END) {
  321. field.trigger(keyDownEvent);
  322. }
  323.  
  324. // modifier keys don't have a keypress event, only down or up
  325. if(code.type !== MODIFIER_BEGIN && code.type !== MODIFIER_END) {
  326. field.trigger(keyPressEvent);
  327. }
  328.  
  329. // only actually add the new character to the input if the keydown or keypress events
  330. // weren't cancelled by any consuming event handlers
  331. if(!keyDownEvent.isPropagationStopped() &&
  332. !keyPressEvent.isPropagationStopped()) {
  333. if(code.type === NON_CHARACTER) {
  334. switch(code.controlKeyName) {
  335. case 'enter':
  336. field.val(field.val() + "\n");
  337. break;
  338. case 'back':
  339. field.val(field.val().substring(0,field.val().length-1));
  340. break;
  341. }
  342. } else {
  343. field.val(field.val() + code.char);
  344. }
  345. }
  346.  
  347. // then also trigger the 3rd event (up)
  348. // a keydown of a modifier shouldn't also trigger a keyup until coded
  349. if(code.type !== MODIFIER_BEGIN) {
  350. field.trigger(keyUpEvent);
  351. }
  352. },
  353. triggerCodesOnField = function(codes, field, delay, global) {
  354. if(delay > 0) {
  355. codes = codes.reverse();
  356. var keyInterval = global.setInterval(function(){
  357. var code = codes.pop();
  358. triggerCodeOnField(code, field);
  359. if(codes.length === 0) {
  360. global.clearInterval(keyInterval);
  361. field.trigger('autotyped');
  362. }
  363. }, delay);
  364. } else {
  365. $.each(codes,function(){
  366. triggerCodeOnField(this, field);
  367. });
  368. field.trigger('autotyped');
  369. }
  370. };
  371.  
  372. $.fn.autotype = function(value, options) {
  373. if(value === undefined || value === null) { throw("Value is required by jQuery.autotype plugin"); }
  374. var settings = $.extend({}, $.fn.autotype.defaults, options);
  375.  
  376. // 1st Pass
  377. // step through the input string and convert it into
  378. // a logical sequence of steps, key, and charcodes to apply to the inputs
  379. var codes = parseCodes(value, settings.keyCodes[settings.keyBoard]);
  380.  
  381. // 2nd Pass
  382. // Run the translated codes against each input through a realistic
  383. // and cancelable series of key down/press/up events
  384. return this.each(function(){ triggerCodesOnField(codes, $(this), settings.delay, settings.global); });
  385. };
  386.  
  387. $.fn.autotype.defaults = {
  388. version: '0.5.0',
  389. keyBoard: 'enUs',
  390. delay: 0,
  391. global: window,
  392. keyCodes: {
  393. enUs: { 'back':8,'ins':45,'del':46,'enter':13,'shift':16,'ctrl':17,'meta':224,
  394. 'alt':18,'pause':19,'caps':20,'esc':27,'pgup':33,'pgdn':34,
  395. 'end':35,'home':36,'left':37,'up':38,'right':39,'down':40,
  396. 'printscr':44,'num0':96,'num1':97,'num2':98,'num3':99,'num4':100,
  397. 'num5':101,'num6':102,'num7':103,'num8':104,'num9':105,
  398. 'multiply':106,'add':107,'subtract':109,'decimal':110,
  399. 'divide':111,'f1':112,'f2':113,'f3':114,'f4':115,'f5':116,
  400. 'f6':117,'f7':118,'f8':119,'f9':120,'f10':121,'f11':122,
  401. 'f12':123,'numlock':144,'scrolllock':145,' ':9,' ':32,
  402. 'tab':9,'space':32,'0':48,'1':49,'2':50,'3':51,'4':52,
  403. '5':53,'6':54,'7':55,'8':56,'9':57,')':48,'!':49,'@':50,
  404. '#':51,'$':52,'%':53,'^':54,'&':55,'*':56,'(':57,';':186,
  405. '=':187,',':188,'-':189,'.':190,'/':191,'[':219,'\\':220,
  406. ']':221,"'":222,':':186,'+':187,'<':188,'_':189,'>':190,
  407. '?':191,'{':219,'|':220,'}':221,'"':222,'a':65,'b':66,'c':67,
  408. 'd':68,'e':69,'f':70,'g':71,'h':72,'i':73,'j':74,'k':75,
  409. 'l':76,'m':77,'n':78,'o':79,'p':80,'q':81,'r':82,'s':83,
  410. 't':84,'u':85,'v':86,'w':87,'x':88,'y':89,'z':90,'A':65,
  411. 'B':66,'C':67,'D':68,'E':69,'F':70,'G':71,'H':72,'I':73,
  412. 'J':74,'K':75,'L':76,'M':77,'N':78,'O':79,'P':80,'Q':81,
  413. 'R':82,'S':83,'T':84,'U':85,'V':86,'W':87,'X':88,'Y':89,'Z':90, 'Å':197, 'Ä':196, 'Ö':214}
  414. }
  415. };
  416.  
  417. })(jQuery);
  418.  
  419. window.afterConversationLoaded = function() {
  420. console.log("Loaded conversation");
  421. getStats();
  422. notifyOperator();
  423.  
  424. console.log("Registering emoji click refocusing");
  425. for(let e of document.getElementsByClassName('emoji-insert')) {
  426. e.addEventListener('click', focusMessageBox);
  427. }
  428.  
  429. console.log("Registering automatic photo adding");
  430. for(let e of document.getElementById('AddMediaDialog').getElementsByClassName("mediaAddContainer")) {
  431. e.addEventListener('click', () => {
  432. e.getElementsByTagName("img")[0].click();
  433. e.getElementsByTagName("input")[0].click();
  434. $('#btnAddMedia').button('enable')[0].click();
  435. focusMessageBox();
  436. });
  437. }
  438.  
  439. let highlightColor = "rgb(255, 211, 20)";
  440. var target = document.getElementById('conversation-content');
  441. if(config.highlightMessagesNotes) {
  442. console.log("Highlighting own messages");
  443. for(let e of document.getElementById("conversation-messages").getElementsByClassName('message-text')) {
  444. let parentParent = e.parentElement.parentElement;
  445. if(parentParent.textContent.slice(1).indexOf(getTargetName()) > -1)
  446. parentParent.style.background = "rgb(145, 145, 145)";
  447. else
  448.  
  449. parentParent.style.background = "rgb(107, 107, 107)";
  450. }
  451.  
  452.  
  453.  
  454. console.log("Highlighting target notes");
  455. let ending = getTargetName().toUpperCase();
  456. for(let e of document.getElementsByClassName('player-last-notes')[0].children) {
  457. if(e.children[2].textContent.toUpperCase().replace(/[\ \)]*$/,"").indexOf(ending) > -1) {
  458. e.style.background = highlightColor;
  459. }
  460. }
  461. }
  462.  
  463.  
  464. let targetNotesContent = document.getElementsByClassName('target-note-content')[0];
  465. document.addEventListener('selectionchange', (e) => {
  466. let anchor = document.getSelection().anchorNode;
  467. if(anchor && anchor.nodeType === Node.TEXT_NODE) {
  468. anchor = anchor.parentElement;
  469. }
  470. if(anchor.classList.contains('message-text')) {
  471. targetNotesContent.value = window.getSelection().toString();
  472. }
  473. });
  474.  
  475.  
  476. //Function to focus end of text
  477. (function($){
  478. $.fn.focusTextToEnd = function(){
  479. this.focus();
  480. var $thisVal = this.val();
  481. this.val('').val($thisVal);
  482. return this;
  483. }
  484. }(jQuery));
  485. //Copy text between textareas
  486. $(".counters-column6").on("change", function(){
  487. var Text = $(".counters-column6").val();
  488. $(".conversation-message-text").autotype(Text);
  489. //Delete Text
  490. $(".counters-column6").val('');
  491. //Focus TextField
  492. window.scroll(0, 0);
  493. $(".conversation-message-text").focusTextToEnd();
  494. });
  495. }
  496.  
  497. function shimFunctions() {
  498. /*
  499. if(config.showCounters) {
  500. console.log("Adding statistics counters");
  501. loadConversation = (function() {
  502. var cached_loadConversation = loadConversation;
  503. return function() {
  504. var result = cached_loadConversation.apply(this, arguments);
  505. afterConversationLoaded();
  506. return result;
  507. };
  508. })();
  509. }
  510. /*/
  511. console.log("Adding statistics counters????");
  512. if(config.showCounters) {
  513. console.log("Adding statistics counters");
  514. loadConversation = new Function(
  515. "id",
  516. "doPreload",
  517. "review",
  518. "fromClaimNext",
  519. "claimNextType",
  520. loadConversation.toString()
  521. .replace("userIdleTime = 0;", "userIdleTime = 0;\n\t\tafterConversationLoaded();")
  522. .replace(/^function[^{]+{/i,"")
  523. .replace(/}[^}]*$/i, "")
  524. );
  525. }
  526. //*/
  527. console.log("Shimming playerNotes");
  528. playerNotes = (function() {
  529. var cached_playerNotes = playerNotes;
  530. return function() { // Swaps category dropdown and log button for player
  531. var result = cached_playerNotes.apply(this, arguments);
  532. let e = document.getElementsByClassName('player-note-categories')[0];
  533. let f = document.getElementsByClassName('player-save-note')[0];
  534. if(e !== undefined && f !== undefined) {
  535. f.insertAdjacentElement('beforebegin', e);
  536. f.addEventListener('click', focusMessageBox);
  537. }
  538. return result;
  539. };
  540. })();
  541. console.log("Shimming targetNotes");
  542. targetNotes = (function() { // Swaps category dropdown and log button for player
  543. var cached_targetNotes = targetNotes;
  544. return function() {
  545. var result = cached_targetNotes.apply(this, arguments);
  546. let e = document.getElementsByClassName('target-note-categories')[0];
  547. let f = document.getElementsByClassName('target-save-note')[0];
  548. if(e !== undefined && f !== undefined) {
  549. f.insertAdjacentElement('beforebegin', e);
  550. if(config.focusTargetNotes) {
  551. f.addEventListener('click', (() => $('.target-note-content')[0].focus()));
  552. } else {
  553. f.addEventListener('click', focusMessageBox);
  554. }
  555. }
  556. return result;
  557. };
  558. })();
  559. }
  560.  
  561. function registerHotkeys() {
  562. console.log("Registering hotkeys");
  563. var helperFunctions = new Map();
  564. var helpFunctions = new Map();
  565.  
  566. helperFunctions.set(config.hotkeys[0], // Go to player note
  567. () => {
  568. let e = document.getElementsByClassName('player-note-content')[0];
  569. if(e !== undefined) {
  570. var targetNameNote = " (" + getTargetName() + ")";
  571. if(!e.value.endsWith(targetNameNote))
  572. e.value += targetNameNote;
  573. $.fancybox.close();
  574. e.focus();
  575. let pos = e.value.length - targetNameNote.length;
  576. e.setSelectionRange(pos, pos);
  577. }
  578. });
  579. helperFunctions.set(config.hotkeys[1], // Go to target note
  580. () => {
  581. let e = document.getElementsByClassName('target-note-content')[0];
  582. if(e !== undefined) {
  583. $.fancybox.close();
  584. e.focus();
  585. }
  586. });
  587. helperFunctions.set(config.hotkeys[2], focusMessageBox); // Go to message box
  588. helperFunctions.set(config.hotkeys[3], // Open latest attachment
  589. () => {
  590. let e = document.getElementsByClassName('conversation-attachment')[0];
  591. if(e !== undefined) {
  592. e.click();
  593. }
  594. });
  595. helperFunctions.set(config.hotkeys[4], // Add image
  596. () => {
  597. let e = document.getElementsByClassName('message-addmedia-button')[0];
  598. if(e !== undefined) {
  599. e.click();
  600. }
  601. });
  602. helperFunctions.set(config.hotkeys[5], // Remove image
  603. () => {
  604. let e = document.getElementsByClassName('message-delmedia-button')[0];
  605. if(e !== undefined) {
  606. e.click();
  607. }
  608. });
  609. helperFunctions.set(config.hotkeys[6], // Go to Messages
  610. () => {
  611. $('button[rel="messages"]').click();
  612. });
  613. helperFunctions.set(config.hotkeys[7], // Go to Stopped Messages
  614. () => {
  615. $('button[rel="stopped"]').click();
  616. });
  617. helperFunctions.set(config.hotkeys[8], // Go to Unread Messages
  618. () => {
  619. $('button[rel="unread"]').click();
  620. });
  621. helperFunctions.set(config.hotkeys[9], // Generate Hobbies and save to Notes
  622. () => {
  623. // Adds :containsNC - non case-sensitive :contains
  624. $.extend($.expr[":"], {
  625. "containsNC": function(elem, i, match, array) {
  626. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  627. }
  628. });
  629.  
  630. var interests = [' astrologi' ,'bakning' ,'basta' ,'bilar' ,'bio' ,'brädspel' ,'båtar' ,'böcker' ,'campa' ,'cykla' ,'dansa' ,'datorer' ,'dekorera' ,'djur' ,'film' ,'fiska' ,'flyga' ,'fotboll' ,'fotografera' ,'friluftsliv' ,'friskvård' ,'gymnastik' ,'hund' ,'husdjur' ,'hälsa' ,'jogga' ,'katt' ,'klättring' ,'konserter' ,'konst' ,'litteratur' ,'matlagning' ,'meditera' ,'motorcyklar' ,'museum' ,'musik' ,'måla' ,'natur' ,'opera' ,'politik' ,'promenera' ,'pyssla' ,'religion' ,'renovera' ,'resa' ,'rida' ,'segla' ,'simma' ,'skidor' ,'skådespel' ,'social media' ,'spela kort' ,'tatueringar' ,'teater' ,'teckna' ,'teknik' ,'trädgård' ,'träna' ,'tv' ,'umgås' ,'uteliv' ,'vandra' ,'vinprovning' ,'vintersport' ,'äta ute'];
  631.  
  632. var n = ~~(Math.random() * 4) + 2;
  633.  
  634. var rand = [];
  635. do {
  636. rand[rand.length] = interests.splice(Math.floor(Math.random() * interests.length), 1)[0];
  637. } while (rand.length < n);
  638.  
  639. var hoBB = rand;
  640.  
  641. // Extract target name
  642. var targetName = $('.target-name').text();
  643. // Trim period from target name
  644. var targetNamee = targetName.substr(1);
  645. // Insert text to note
  646. $('.player-note-content.area').val(hoBB);
  647. var f = $('.player-note-content.area').val();
  648. var e = $('.player-note-content.area');
  649. $(e).val( f + ' (' + targetNamee + ')');
  650. // Select note category
  651. var category = 'Hobby';
  652.  
  653. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  654. // Save note
  655. $('.player-save-note').trigger('click')
  656.  
  657. //Autotype text to Message
  658. $('.conversation-message-text').autotype(f);
  659. });
  660. helperFunctions.set(config.hotkeys[10], // Generera Sexintressen + spara i Notes
  661. () => {
  662. // Adds :containsNC - non case-sensitive :contains
  663. $.extend($.expr[":"], {
  664. "containsNC": function(elem, i, match, array) {
  665. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  666. }
  667. });
  668.  
  669. var interests = [' analt' ,' bakifrån' ,' bli bunden' ,' att binda' ,' använda buttplug' ,' använda dildo' ,' dominans' ,' kyssar' ,' långa förspel' ,' missionären' ,' ögonbindel' ,' offentliga platser' ,' onani' ,' hårdare smisk' ,' att rida' ,' rollspel' ,' sexiga underkläder' ,' sexleksaker' ,' skeda' ,' att suga' ,' att svälja' ,' teasing' ,' vaniljsex'];
  670.  
  671. var n = ~~(Math.random() * 4) + 2;
  672.  
  673. var rand = [];
  674. do {
  675. rand[rand.length] = interests.splice(Math.floor(Math.random() * interests.length), 1)[0];
  676. } while (rand.length < n);
  677.  
  678. var sex = rand;
  679.  
  680. // Extract target name
  681. var targetName = $('.target-name').text();
  682. // Trim period from target name
  683. var targetNamee = targetName.substr(1);
  684. // Insert text to note
  685. $('.player-note-content.area').val(sex);
  686. var f = $('.player-note-content.area').val();
  687. var e = $('.player-note-content.area');
  688. $(e).val( f + ' (' + targetNamee + ')');
  689.  
  690. // Select note category
  691. var category = 'Sexuella preferenser';
  692.  
  693. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  694. // Save note
  695. $('.player-save-note').trigger('click')
  696.  
  697. //Autotype text to Message
  698. $('.conversation-message-text').autotype(f);
  699. });
  700. helperFunctions.set(config.hotkeys[11], // Player Jobb+Spara i Notes
  701. () => {
  702. // Adds :containsNC - non case-sensitive :contains
  703. $.extend($.expr[":"], {
  704. "containsNC": function(elem, i, match, array) {
  705. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  706. }
  707. });
  708.  
  709. //Extract Player Proffesion//
  710. var playerjob = $('.profession').text().toLowerCase();
  711. // Extract target name
  712. var targetName = $('.target-name').text();
  713. // Trim period from target name
  714. var targetNamee = targetName.substr(1);
  715. // Insert text to note
  716. $('.player-note-content.area').val(playerjob + ' (' + targetNamee + ')');
  717. // Select note category
  718. var category = 'jobb/utbildning';
  719. // Categories
  720. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  721. // Save note
  722. $('.player-save-note').trigger('click')
  723.  
  724. //paste proffesion//
  725.  
  726. $('.conversation-message-text').autotype(playerjob);
  727. });
  728. helperFunctions.set(config.hotkeys[12], // Retrieve Player Name and Save to Notes
  729. () => {
  730. // Adds :containsNC - non case-sensitive :contains
  731. $.extend($.expr[":"], {
  732. "containsNC": function(elem, i, match, array) {
  733. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  734. }
  735. });
  736.  
  737. var playername = $('.real_name').text();
  738. // Extract target name
  739. var targetName = $('.target-name').text();
  740. // Trim period from target name
  741. var targetNamee = targetName.substr(1);
  742. // Insert text to note
  743. $('.player-note-content.area').val(playername + ' (' + targetNamee + ')');
  744. // Select note category
  745. var category = 'namn';
  746. // Categories
  747. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  748. // Save note
  749. $('.player-save-note').trigger('click')
  750.  
  751. //Autotype text to Message
  752. $('.conversation-message-text').autotype(playername);
  753. });
  754.  
  755. helperFunctions.set(config.hotkeys[13], // Target Notes+Autoval av Kategori
  756. () => {
  757. // Adds :containsNC - non case-sensitive :contains
  758. $.extend($.expr[":"], {
  759. "containsNC": function(elem, i, match, array) {
  760. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  761. }
  762. });
  763.  
  764. // Extract selected text
  765. var note = window.getSelection().toString();
  766. // Modify and verify selected text
  767. var text = prompt('Target note:', note);
  768. // Insert text to note
  769. $('.target-note-content.area').val(text);
  770. // Select note category
  771. var category;
  772. if (text.match(/bild|selfie|kuk|gif/i)) {
  773. var category = 'Bilder';
  774. } else if (text.match(/singel|barn|son|söner|döttrar|dotter|fru|särbo|sambo|gift|skild|änk/i)) {
  775. var category = 'Familj/Relationer';
  776. } else if (text.match(/jobb|arbetar|plugg|stude|pension|kör buss|kör lastbil|kör taxi|på järnvägen|chef|kock|vakt|pilot|polis|bagare|förare|frisör|jurist|läkare|lärare|ledare|målare|montör|rektor|advokat|konsult|optiker|pedagog|säljare|väktare|arbetare|arkitekt|brandman|chaufför|designer|fotograf|ingenjör|operatör|snickare|arbetslös|assistent|bartender|maskinist|sköterska|veterinär|elektriker|journalist|hantverkare|programmerare|projektledare|mekaniker|driver eget|företag|firma|måleri|snickeri|verkstad/i)) {
  777. var category = 'Jobb/Utbildning';
  778. } else if (text.match(/hund|katt|husdjur|spela|träna|astrologi|basta|bakning|bilar|bio|film|brädspel|båtar|böcker|litteratur|campa|cykla|dansa|datorer|dekorera|djur|fiska|flyga|fotboll|fotografera|friluftsliv|gymnastik|hälsa|friskvård|jogga|klättring|konserter|konst|museum|matlagning|meditera|motorcyklar|musik|måla|natur|nyheter|politik|opera|promenera|pyssla|religion|renovera|resa|rida|resa|segla|simma|skidor|skådespel|social media|tatueringar|teater|teckna|teknik|trädgård|träna|tv|umgås|uteliv|vandra|vinprovning|vintersport|äta ute/i)) {
  779. var category = 'Hobby';
  780. } else if (text.match(/bor i|Karlskrona|Karlshamn|Borås|Borlänge/i)) {
  781. var category = 'Stad';
  782. } else if (text.match(/heter|Abbe|Abdullah|Abraham|Adam|Adel|Adis|Agris|Agua|Alaga|Albert|Albin|Alek|Alex|Alexander|Alf|Alfred|Ali|Allan|Amir|Anders|Andreas|André|Andy|Ante|Anton|Ants|Ari|Aristides|Arne|Arto|Arvid|Axel|Azar|Behzad|Bengt/i)) {
  783. var category = 'Namn';
  784. } else if (text.match(/Bengt-Åke|Benny|Bernt|Bernt-Olov|Bernth|Bert|Bertil|Birger|Birgir|Bjarne|Björn|Bo|Bogdan|Boris|Bosse|Bror|Börge|Börje|Calle|Calmer|Carl|Carsten|Chaban|Charlie|Chris|Christer|Christian|Christoffer|Christophe|Christopher/i)) {
  785. var category = 'Namn';
  786. } else if (text.match(/Claes|Classe|Claudiu|Conny|Costas|Dan|Dane|Daniel|Danne|David|Davide|Davor|Deivys|Demir|Dennis|Derek|Dick|Edi|Edvard|Edvin|Ego|Eije|Einar|Eki|Elias|Emanuel|Emil|Emir|Eric|Erik|Erland|Evert|Ewen|Farid|Filip|Folke|Francesco/i)) {
  787. var category = 'Namn';
  788. } else if (text.match(/Franjo|Frank|Freddie|Fredrik|Friedhelm|Frode|Fugus|Gabriel|Georg|Gerald|Gerd|Gerra|Gert|Gert-Owe|Getahun|Gunnar|Gustaf|Gustav|Göran|Görgen|Görgen|Gösta|Göte|Habib|Hans|Hans Börge|Harald|Harri|Harry|Hasse|Helmut|Henke|Henrik|Henry|Hossein|Hugo|Håkan|Ihsan|Inge|Ingemar|Ingmar/i)) {
  789. var category = 'Namn';
  790. } else if (text.match(/Ingvar|Isaac|Isac|Isak|Ismail|Ivar|Jack|Jakob|Jan|Janne|Jean|Jens|Jerry|Jesper|Jhonatan|Jimmy|Joakim|Joar|Jocke|Joel|Johan|Johannes|John|Johnny|Jon|Jonas|Jonathan|Jonny|Juan|Julius|Jyrki|Jörgen|Kai|Kaj|Kalle|Kari|Karl|Karl Gustav|Karl-Erik|Karl-Olov|Karol|Ken|Kenneth|Kenny|Kent|Kenta/i)) {
  791. var category = 'Namn';
  792. } else if (text.match(/Kenth|Kieren|Kim|Kjell|Kjelle|Klas|Knut|Krister|Kristian|Kristoffer|Kurt|Kurt-Lennart|Kutte|Kåge|Lars|Lars Olov|Larsa|Larte|Larui|Lasse|Leif|Lellas|Lennart|Leo|Leon|Linus|Lucky|Ludvig|Magnus|Manne|Manuel|Marco|Marcus|Marek|Marian|Mario|Mark|Marko|Markus|Martin|Mathias|Mats|Matsvo|Matte|Matti|Mattias|Max|Melker|Michael|Michel|Micke|Mika|Mikael|Mikael|Mille|Miron|Misa|Mohamed|Mohammed/i)) {
  793. var category = 'Namn';
  794. } else if (text.match(/Morgan|Musa|Mustapha|Måns|Mårten|Nicke|Nicklas|Nicky|Niclas|Niklas|Nille|Nils|Nisse|Nurko|Ola|Oliver|Olle|Olof|Olov|Oscar|Oskar|Ove|Owe|Parsia|Pasi|Patric|Patrick|Patrik|Paul|Pavel|Peder|Pelle|Peo|Per|Per-Olof|Peter|Pether|Petter|Philip|Pierre|Pontus|Poul|Putte|Pär|Rafael|Rafeo|Ragnar|Raimo|Rasmus|Riccardo|Richard|Rickard|Rikard|Rimtaf|Risto|Robban|Robert|Robin|Roffe|Roger|Roland|Rolf|Rolle|Romii|Ronnie|Ronny|Ruben|Rune|Sabah|Sajad|Saladin|Sam|Samuel|Sebastian|Seed|Serko|Sigge|Silvo|Simon|Stefan|Steffen|Sten|Sten-Åke|Stig|Stig-Evert|Sture|Sune|Sven|Sven Erik|Sven Ingvar|Sven Åke|Sven-Erik|Sven-Gunnar|Sven-Åke|Sören|Tage|Taha|Tapio|Ted|Thomas|Thorbjörn|Tobbe|Tobias|Tobias|Tom|Tomas|Tommy|Tony|Torbjörn|Tord|Tore|Torgny|Torsten|Uffe|Ulf|Ulrik|Uno|Urban|Valentin|Victor|Viktor|Vilhelm|Waldemar|Wiktor|Wilhelm|William|Wojtek|Yngve|Yousef|Zdislav|Åke|Öyvind/i)) {
  795. var category = 'Namn';
  796. } else if (text.match(/anal|bakifrån|bunden|buttplug|dildo|dominans|kyssar|förspel|missionär|mystik|offentlig|onan|piska|rollspel|underkläder|sexleksaker|strap-on|suga|svälja|teasing|trekant|kondom|vaniljsex|wet/i)) {
  797. var category = 'Sexuella preferenser';
  798. } else if (text.match(/bil|mc|motorcykel/i)) {
  799. var category = 'Transportmedel';
  800. } else if (text.match(/mejl|mail|telef|skype|kik|fb|facebook/i)) {
  801. var category = 'Mejl och telefon';
  802. } else if (text.match(/sjuk/i)) {
  803. var category = 'Hälsa';
  804. } else var category = prompt('Select category:');
  805. // Categories
  806. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  807. // Save note
  808. $('.target-save-note').trigger('click')
  809. //Focus TextField
  810. window.scroll(0, 0);
  811. $( ".conversation-message-text" ).focus();
  812. });
  813. helperFunctions.set(config.hotkeys[14], // Save to Target Aktuellt
  814. () => {
  815. // Adds :containsNC - non case-sensitive :contains
  816. $.extend($.expr[":"], {
  817. "containsNC": function(elem, i, match, array) {
  818. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  819. }
  820. });
  821.  
  822. // Extract selected text
  823. var note = window.getSelection().toString();
  824. // Insert text to note
  825. $('.target-note-content.area').val(note);
  826. // Select note category
  827. var category = 'aktuella saker';
  828. // Categories
  829. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  830. // Save note
  831. $('.target-save-note').trigger('click')
  832. //Focus TextField
  833. window.scroll(0, 0);
  834. $( ".conversation-message-text" ).focus();
  835. });
  836. helperFunctions.set(config.hotkeys[15], // Save To Player Auto Category
  837. () => {
  838. // Adds :containsNC - non case-sensitive :contains
  839. $.extend($.expr[":"], {
  840. "containsNC": function(elem, i, match, array) {
  841. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  842. }
  843. });
  844. //Function to focus end of text
  845. (function($){
  846. $.fn.focusTextToEnd = function(){
  847. this.focus();
  848. var $thisVal = this.val();
  849. this.val('').val($thisVal);
  850. return this;
  851. }
  852. }(jQuery));
  853. // Extract selected text
  854. var note = window.getSelection().toString();
  855. // Modify and verify selected text
  856. var text = prompt('Player note:', note);
  857. // Extract target name
  858. var targetName = $('.target-name').text();
  859. // Trim period from target name
  860. var targetNamee = targetName.substr(1);
  861. // Insert text to note
  862. $('.player-note-content.area').val(text + ' (' + targetNamee + ')');
  863. // Select note category
  864. var category;
  865. if (text.match(/bild|selfie|kuk|gif/i)) {
  866. var category = 'Bilder';
  867. } else if (text.match(/singel|barn|son|söner|döttrar|dotter|fru|särbo|sambo|gift|skild|änk/i)) {
  868. var category = 'Familj/Relationer';
  869. } else if (text.match(/jobb|arbetar|plugg|stude|pension|kör buss|kör lastbil|kör taxi|på järnvägen|chef|kock|vakt|pilot|polis|bagare|förare|frisör|jurist|läkare|lärare|ledare|målare|montör|rektor|advokat|konsult|optiker|pedagog|säljare|väktare|arbetare|arkitekt|brandman|chaufför|designer|fotograf|ingenjör|operatör|snickare|arbetslös|assistent|bartender|maskinist|sköterska|veterinär|elektriker|journalist|hantverkare|programmerare|projektledare|mekaniker|driver eget|företag|firma|måleri|snickeri|verkstad/i)) {
  870. var category = 'Jobb/Utbildning';
  871. } else if (text.match(/hund|katt|husdjur|spela|träna|astrologi|basta|bakning|bilar|bio|film|brädspel|båtar|böcker|litteratur|campa|cykla|dansa|datorer|dekorera|djur|fiska|flyga|fotboll|fotografera|friluftsliv|gymnastik|hälsa|friskvård|jogga|klättring|konserter|konst|museum|matlagning|meditera|motorcyklar|musik|måla|natur|nyheter|politik|opera|promenera|pyssla|religion|renovera|resa|rida|resa|segla|simma|skidor|skådespel|social media|tatueringar|teater|teckna|teknik|trädgård|träna|tv|umgås|uteliv|vandra|vinprovning|vintersport|äta ute/i)) {
  872. var category = 'Hobby';
  873. } else if (text.match(/bor i|Karlskrona|Karlshamn|Borås|Borlänge/i)) {
  874. var category = 'Stad';
  875. } else if (text.match(/heter/i)) {
  876. var category = 'Namn';
  877. } else if (text.match(/anal|bakifrån|bunden|buttplug|dildo|dominans|kyssar|förspel|missionär|mystik|offentlig|onan|piska|rollspel|underkläder|sexleksaker|strap-on|suga|svälja|teasing|trekant|kondom|vaniljsex|wet/i)) {
  878. var category = 'Sexuella preferenser';
  879. } else if (text.match(/bil|mc|motorcykel/i)) {
  880. var category = 'Transportmedel';
  881. } else if (text.match(/mejl|mail|telef|skype|kik|fb|facebook/i)) {
  882. var category = 'Mejl och telefon';
  883. } else if (text.match(/sjuk/i)) {
  884. var category = 'Hälsa';
  885. } else var category = prompt('Select category:');
  886. // Categories
  887. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  888. // Save note
  889. $('.player-save-note').trigger('click')
  890. //Focus TextField
  891. window.scroll(0, 0);
  892. $('.conversation-message-text').focusTextToEnd();
  893. });
  894. helperFunctions.set(config.hotkeys[16], // Player Save to Stad
  895. () => {
  896. // Adds :containsNC - non case-sensitive :contains
  897. $.extend($.expr[":"], {
  898. "containsNC": function(elem, i, match, array) {
  899. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  900. }
  901. });
  902. //Function to focus end of text
  903. (function($){
  904. $.fn.focusTextToEnd = function(){
  905. this.focus();
  906. var $thisVal = this.val();
  907. this.val('').val($thisVal);
  908. return this;
  909. }
  910. }(jQuery));
  911. // Extract selected text
  912. var note = window.getSelection().toString();
  913. // Extract target name
  914. var targetName = $('.target-name').text();
  915. // Trim period from target name
  916. var targetNamee = targetName.substr(1);
  917. // Insert text to note
  918. $('.player-note-content.area').val(note + ' (' + targetNamee + ')');
  919. // Select note category
  920. var category = 'stad';
  921. // Categories
  922. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  923. // Save note
  924. $('.player-save-note').trigger('click')
  925. //Focus TextField
  926. window.scroll(0, 0);
  927. $('.conversation-message-text').focusTextToEnd();
  928.  
  929. });
  930. helperFunctions.set(config.hotkeys[17], // Player Save to Aktuellt
  931. () => {
  932. // Adds :containsNC - non case-sensitive :contains
  933. $.extend($.expr[":"], {
  934. "containsNC": function(elem, i, match, array) {
  935. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  936. }
  937. });
  938. //Function to focus end of text
  939. (function($){
  940. $.fn.focusTextToEnd = function(){
  941. this.focus();
  942. var $thisVal = this.val();
  943. this.val('').val($thisVal);
  944. return this;
  945. }
  946. }(jQuery));
  947. // Extract selected text
  948. var note = window.getSelection().toString();
  949. // Extract target name
  950. var targetName = $('.target-name').text();
  951. // Trim period from target name
  952. var targetNamee = targetName.substr(1);
  953. // Insert text to note
  954. $('.player-note-content.area').val(note + ' (' + targetNamee + ')');
  955. // Select note category
  956. var category = 'Aktuella saker';
  957. // Categories
  958. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  959. // Save note
  960. $('.player-save-note').trigger('click')
  961. //Focus TextField
  962. window.scroll(0, 0);
  963. $('.conversation-message-text').focusTextToEnd();
  964. });
  965. helperFunctions.set(config.hotkeys[18], // Target Notes No Prompt
  966. () => {
  967. // Adds :containsNC - non case-sensitive :contains
  968. $.extend($.expr[":"], {
  969. "containsNC": function(elem, i, match, array) {
  970. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  971. }
  972. });
  973.  
  974.  
  975. // Extract selected text
  976. var text = window.getSelection().toString();
  977. // Insert text to note
  978. $('.target-note-content.area').val(text);
  979. // Select note category
  980. var category;
  981. if (text.match(/bild|selfie|kuk|gif/i)) {
  982. var category = 'Bilder';
  983. } else if (text.match(/singel|barn|son|söner|döttrar|dotter|fru|särbo|sambo|gift|skild|änk/i)) {
  984. var category = 'Familj/Relationer';
  985. } else if (text.match(/jobb|arbetar|plugg|stude|pension|kör buss|kör lastbil|kör taxi|på järnvägen|chef|kock|vakt|pilot|polis|bagare|förare|frisör|jurist|läkare|lärare|ledare|målare|montör|rektor|advokat|konsult|optiker|pedagog|säljare|väktare|arbetare|arkitekt|brandman|chaufför|designer|fotograf|ingenjör|operatör|snickare|arbetslös|assistent|bartender|maskinist|sköterska|veterinär|elektriker|journalist|hantverkare|programmerare|projektledare|mekaniker|driver eget|företag|firma|måleri|snickeri|verkstad/i)) {
  986. var category = 'Jobb/Utbildning';
  987. } else if (text.match(/hund|katt|husdjur|spela|träna|astrologi|basta|bakning|bilar|bio|film|brädspel|båtar|böcker|litteratur|campa|cykla|dansa|datorer|dekorera|djur|fiska|flyga|fotboll|fotografera|friluftsliv|gymnastik|hälsa|friskvård|jogga|klättring|konserter|konst|museum|matlagning|meditera|motorcyklar|musik|måla|natur|nyheter|politik|opera|promenera|pyssla|religion|renovera|resa|rida|resa|segla|simma|skidor|skådespel|social media|tatueringar|teater|teckna|teknik|trädgård|träna|tv|umgås|uteliv|vandra|vinprovning|vintersport|äta ute/i)) {
  988. var category = 'Hobby';
  989. } else if (text.match(/bor i|Karlskrona|Karlshamn|Borås|Borlänge/i)) {
  990. var category = 'Stad';
  991. } else if (text.match(/heter|Abbe|Abdullah|Abraham|Adam|Adel|Adis|Agris|Agua|Alaga|Albert|Albin|Alek|Alex|Alexander|Alf|Alfred|Ali|Allan|Amir|Anders|Andreas|André|Andy|Ante|Anton|Ants|Ari|Aristides|Arne|Arto|Arvid|Axel|Azar|Behzad|Bengt/i)) {
  992. var category = 'Namn';
  993. } else if (text.match(/Bengt-Åke|Benny|Bernt|Bernt-Olov|Bernth|Bert|Bertil|Birger|Birgir|Bjarne|Björn|Bo|Bogdan|Boris|Bosse|Bror|Börge|Börje|Calle|Calmer|Carl|Carsten|Chaban|Charlie|Chris|Christer|Christian|Christoffer|Christophe|Christopher/i)) {
  994. var category = 'Namn';
  995. } else if (text.match(/Claes|Classe|Claudiu|Conny|Costas|Dan|Dane|Daniel|Danne|David|Davide|Davor|Deivys|Demir|Dennis|Derek|Dick|Edi|Edvard|Edvin|Ego|Eije|Einar|Eki|Elias|Emanuel|Emil|Emir|Eric|Erik|Erland|Evert|Ewen|Farid|Filip|Folke|Francesco/i)) {
  996. var category = 'Namn';
  997. } else if (text.match(/Franjo|Frank|Freddie|Fredrik|Friedhelm|Frode|Fugus|Gabriel|Georg|Gerald|Gerd|Gerra|Gert|Gert-Owe|Getahun|Gunnar|Gustaf|Gustav|Göran|Görgen|Görgen|Gösta|Göte|Habib|Hans|Hans Börge|Harald|Harri|Harry|Hasse|Helmut|Henke|Henrik|Henry|Hossein|Hugo|Håkan|Ihsan|Inge|Ingemar|Ingmar/i)) {
  998. var category = 'Namn';
  999. } else if (text.match(/Ingvar|Isaac|Isac|Isak|Ismail|Ivar|Jack|Jakob|Jan|Janne|Jean|Jens|Jerry|Jesper|Jhonatan|Jimmy|Joakim|Joar|Jocke|Joel|Johan|Johannes|John|Johnny|Jon|Jonas|Jonathan|Jonny|Juan|Julius|Jyrki|Jörgen|Kai|Kaj|Kalle|Kari|Karl|Karl Gustav|Karl-Erik|Karl-Olov|Karol|Ken|Kenneth|Kenny|Kent|Kenta/i)) {
  1000. var category = 'Namn';
  1001. } else if (text.match(/Kenth|Kieren|Kim|Kjell|Kjelle|Klas|Knut|Krister|Kristian|Kristoffer|Kurt|Kurt-Lennart|Kutte|Kåge|Lars|Lars Olov|Larsa|Larte|Larui|Lasse|Leif|Lellas|Lennart|Leo|Leon|Linus|Lucky|Ludvig|Magnus|Manne|Manuel|Marco|Marcus|Marek|Marian|Mario|Mark|Marko|Markus|Martin|Mathias|Mats|Matsvo|Matte|Matti|Mattias|Max|Melker|Michael|Michel|Micke|Mika|Mikael|Mikael|Mille|Miron|Misa|Mohamed|Mohammed/i)) {
  1002. var category = 'Namn';
  1003. } else if (text.match(/Morgan|Musa|Mustapha|Måns|Mårten|Nicke|Nicklas|Nicky|Niclas|Niklas|Nille|Nils|Nisse|Nurko|Ola|Oliver|Olle|Olof|Olov|Oscar|Oskar|Ove|Owe|Parsia|Pasi|Patric|Patrick|Patrik|Paul|Pavel|Peder|Pelle|Peo|Per|Per-Olof|Peter|Pether|Petter|Philip|Pierre|Pontus|Poul|Putte|Pär|Rafael|Rafeo|Ragnar|Raimo|Rasmus|Riccardo|Richard|Rickard|Rikard|Rimtaf|Risto|Robban|Robert|Robin|Roffe|Roger|Roland|Rolf|Rolle|Romii|Ronnie|Ronny|Ruben|Rune|Sabah|Sajad|Saladin|Sam|Samuel|Sebastian|Seed|Serko|Sigge|Silvo|Simon|Stefan|Steffen|Sten|Sten-Åke|Stig|Stig-Evert|Sture|Sune|Sven|Sven Erik|Sven Ingvar|Sven Åke|Sven-Erik|Sven-Gunnar|Sven-Åke|Sören|Tage|Taha|Tapio|Ted|Thomas|Thorbjörn|Tobbe|Tobias|Tobias|Tom|Tomas|Tommy|Tony|Torbjörn|Tord|Tore|Torgny|Torsten|Uffe|Ulf|Ulrik|Uno|Urban|Valentin|Victor|Viktor|Vilhelm|Waldemar|Wiktor|Wilhelm|William|Wojtek|Yngve|Yousef|Zdislav|Åke|Öyvind/i)) {
  1004. var category = 'Namn';
  1005. } else if (text.match(/anal|bakifrån|bunden|buttplug|dildo|dominans|kyssar|förspel|missionär|mystik|offentlig|onan|piska|rollspel|underkläder|sexleksaker|strap-on|suga|svälja|teasing|trekant|kondom|vaniljsex|wet/i)) {
  1006. var category = 'Sexuella preferenser';
  1007. } else if (text.match(/bil|mc|motorcykel/i)) {
  1008. var category = 'Transportmedel';
  1009. } else if (text.match(/mejl|mail|telef|skype|kik|fb|facebook/i)) {
  1010. var category = 'Mejl och telefon';
  1011. } else if (text.match(/sjuk/i)) {
  1012. var category = 'Hälsa';
  1013. } else var category = prompt('Select category:');
  1014. // Categories
  1015. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  1016. // Save note
  1017. $('.target-save-note').trigger('click')
  1018. //Focus TextField
  1019. window.scroll(0, 0);
  1020. $( ".conversation-message-text" ).focus();
  1021. });
  1022. helperFunctions.set(config.hotkeys[19], // Focus TextField Column6
  1023. () => {
  1024. //Focus TextField
  1025. $( ".counters-column6" ).focusTextToEnd();
  1026. });
  1027.  
  1028. //Key Event Listensers for Hotkeys
  1029.  
  1030. document.addEventListener('keyup', (e) =>{ // Send Mssg and Lap Time on hit Enter Key
  1031. if (e.which == 13) {
  1032. var isFocused = $(".conversation-message-text").is(":focus"),
  1033. Fokus = $(".counters-column6").is(":focus");
  1034. var len = $('.conversation-message-text').val().length || $('.counters-column6').val().length;
  1035. if (len >= 75 && isFocused) {
  1036. $('#counters-column5').trigger("click");
  1037. $('.message-submit-button').trigger("click");
  1038. }else if (len >= 75 && Fokus) {
  1039. $(".conversation-message-text").focusTextToEnd();
  1040. $('#counters-column5').trigger("click");
  1041. setTimeout($('.message-submit-button').trigger("click"), 500);
  1042. }else{
  1043. return false;
  1044. }
  1045. }
  1046. });
  1047.  
  1048.  
  1049. document.addEventListener('keyup', (e) => { // Adds Alt Key event listeners for the hotkeys
  1050. if(e.altKey && isOkHotkey(e.code)) {
  1051. e.preventDefault();
  1052. e.stopPropagation();
  1053. let f = helperFunctions.get(e.code);
  1054. if(f !== undefined) f();
  1055. }
  1056. });
  1057.  
  1058. document.addEventListener('keyup', (e) => { // Adds Ctrl Key event listeners for the hotkeys
  1059. if(e.ctrlKey && isOkHotkey(e.code)) {
  1060. e.preventDefault();
  1061. e.stopPropagation();
  1062. let r = helpFunctions.get(e.code);
  1063. if(r !== undefined) r();
  1064. }
  1065. });
  1066.  
  1067.  
  1068. console.log("\tHotkeys registered");
  1069. }
  1070.  
  1071. function isOkHotkey(code) {
  1072. return code.startsWith("Key") || code.startsWith("Digit") || code.startsWith("Numpad") || code.startsWith("Arrow") || code.startsWith("F") || code.startsWith("R");
  1073. }
  1074.  
  1075. function createSettingsButton() {
  1076. function addSetting(value, name) {
  1077. var id_name = (name + 'Setting').replace(/[^A-Za-z_]/g,'');
  1078. var label = document.createElement('label');
  1079. label.innerHTML = name + ": ";
  1080. label.setAttribute('for', id_name);
  1081. label.style.gridColumn = '1';
  1082. var element = document.createElement('input');
  1083. if(typeof value == 'boolean') {
  1084. element.type = 'checkbox';
  1085. element.checked = value;
  1086. } else {
  1087. element.type = 'text';
  1088. element.value = value !== undefined ? value : "";
  1089. }
  1090. element.id = id_name;
  1091. element.name = id_name;
  1092. element.style.gridColumn = '2';
  1093. settingsDialog.appendChild(label);
  1094. settingsDialog.appendChild(element);
  1095. return element;
  1096. }
  1097.  
  1098. function setHotkey(n, e) {
  1099. if(isOkHotkey(e.code) || ['Backspace', 'Delete'].includes(e.code)) {
  1100. e.preventDefault();
  1101. e.stopPropagation();
  1102. var code = (['Backspace', 'Delete'].includes(e.code)) ? "" : e.code;
  1103. e.target.value = code;
  1104. config.hotkeys[n] = code;
  1105. }
  1106. }
  1107. console.log("Creating settings button");
  1108.  
  1109. var menu = $('#topmenu1')[0];
  1110. var settingsDialog = document.createElement('div');
  1111. settingsDialog.id = 'SettingsDialog';
  1112. settingsDialog.style.display = 'none';
  1113. settingsDialog.style.alignItems = 'center';
  1114.  
  1115. addSetting(config.username, 'Username') .addEventListener('change', (e) => {config.username = e.target.value;});
  1116. addSetting(config.password, 'Password') .addEventListener('change', (e) => {config.password = e.target.value;});
  1117. addSetting(config.autoLogin, 'Autologin') .addEventListener('change', (e) => {config.autoLogin = e.target.checked;});
  1118. addSetting(config.showCounters, 'Show counters') .addEventListener('change', (e) => {config.showCounters = e.target.checked;});
  1119. addSetting(config.goToMessagesFirst, 'Go to Messages after login')
  1120. .addEventListener('change', (e) => {config.goToMessagesFirst = e.target.checked;});
  1121. addSetting(config.highlightMessagesNotes, 'Highlights messages and notes')
  1122. .addEventListener('change', (e) => {config.highlightMessagesNotes = e.target.checked;});
  1123. addSetting(config.focusTargetNotes, 'Focus target notes after logging')
  1124. .addEventListener('change', (e) => {config.focusTargetNotes = e.target.checked;});
  1125. addSetting(config.notificationSound, 'Play sound on new message')
  1126. .addEventListener('change', (e) => {config.notificationSound = e.target.checked;});
  1127. settingsDialog.appendChild(document.createElement('span'));
  1128. settingsDialog.appendChild(document.createElement('br'));
  1129. settingsDialog.appendChild(document.createElement('span')); settingsDialog.lastChild.innerHTML = 'Functions Starting With ALT Key';
  1130. settingsDialog.appendChild(document.createElement('span'));
  1131. settingsDialog.appendChild(document.createElement('br'));
  1132. addSetting(config.hotkeys[ 0], 'Go to player logging') .addEventListener('keyup', (e) => {setHotkey( 0, e);});
  1133. addSetting(config.hotkeys[ 1], 'Go to target logging') .addEventListener('keyup', (e) => {setHotkey( 1, e);});
  1134. addSetting(config.hotkeys[ 2], 'Go to message box') .addEventListener('keyup', (e) => {setHotkey( 2, e);});
  1135. addSetting(config.hotkeys[ 3], 'Open latest attachment').addEventListener('keyup', (e) => {setHotkey( 3, e);});
  1136. addSetting(config.hotkeys[ 4], 'Add photo dialog') .addEventListener('keyup', (e) => {setHotkey( 4, e);});
  1137. addSetting(config.hotkeys[ 5], 'Remove selected photo') .addEventListener('keyup', (e) => {setHotkey( 5, e);});
  1138. addSetting(config.hotkeys[ 6], 'Go to Messages') .addEventListener('keyup', (e) => {setHotkey( 6, e);});
  1139. addSetting(config.hotkeys[ 7], 'Go to Stopped Messages') .addEventListener('keyup', (e) => {setHotkey( 7, e);});
  1140. addSetting(config.hotkeys[8], 'Go to Unread Messages') .addEventListener('keyup', (e) => {setHotkey(8, e);});
  1141. addSetting(config.hotkeys[9], 'Generate Hobbies') .addEventListener('keyup', (e) => {setHotkey(9, e);});
  1142. addSetting(config.hotkeys[10], 'SexIntressen') .addEventListener('keyup', (e) => {setHotkey(10, e);});
  1143. addSetting(config.hotkeys[11], 'Player Jobb') .addEventListener('keyup', (e) => {setHotkey(11, e);});
  1144. addSetting(config.hotkeys[12], 'Player Namn') .addEventListener('keyup', (e) => {setHotkey(12, e);});
  1145. settingsDialog.appendChild(document.createElement('span'));
  1146. settingsDialog.appendChild(document.createElement('br'));
  1147. settingsDialog.appendChild(document.createElement('span')); settingsDialog.lastChild.innerHTML = 'Functions Starting With CTRL Key';
  1148. settingsDialog.appendChild(document.createElement('span'));
  1149. settingsDialog.appendChild(document.createElement('br'));
  1150. addSetting(config.hotkeys[13], 'Target AutoNotes') .addEventListener('keyup', (e) => {setHotkey(13, e);});
  1151. addSetting(config.hotkeys[14], 'Target Aktuellt') .addEventListener('keyup', (e) => {setHotkey(14, e);});
  1152. addSetting(config.hotkeys[15], 'Player AutoNotes') .addEventListener('keyup', (e) => {setHotkey(15, e);});
  1153. addSetting(config.hotkeys[16], 'Player Stad') .addEventListener('keyup', (e) => {setHotkey(16, e);});
  1154. addSetting(config.hotkeys[17], 'Player Aktuellt') .addEventListener('keyup', (e) => {setHotkey(17, e);});
  1155. addSetting(config.hotkeys[18], 'Target Notes Utan Prompt') .addEventListener('keyup', (e) => {setHotkey(18, e);});
  1156. addSetting(config.hotkeys[19], 'Focus Textarea') .addEventListener('keyup', (e) => {setHotkey(19, e);});
  1157.  
  1158. var settingsButton = menu.children[5].cloneNode();
  1159. settingsButton.id = 'SettingsButton';
  1160. settingsButton.setAttribute('rel', 'settings');
  1161. settingsButton.addEventListener('click', () => {
  1162. $('#SettingsDialog').dialog({
  1163. title: "Settings",
  1164. resizable: false,
  1165. modal: true,
  1166. position: 'top',
  1167. width: '400',
  1168. open: () => {
  1169. $('#SettingsDialog')[0].style.display = 'grid';
  1170. },
  1171. buttons: [
  1172. {
  1173. text: "Save",
  1174. click: () => {
  1175. console.log("Storing config");
  1176. localStorage.setItem('config', JSON.stringify(config));
  1177. console.log("\tConfig stored:");
  1178. console.log(localStorage.getItem('config'));
  1179. loadConfig();
  1180. //window.location.reload();
  1181. }
  1182. }
  1183. ]
  1184. });
  1185. });
  1186. $('button[rel="documents/manual.pdf"]')[0].insertAdjacentElement('afterend', settingsButton);
  1187. $('button[rel="documents/manual.pdf"]')[0].insertAdjacentText('afterend', '\n');
  1188. $('#SettingsButton').button();
  1189. settingsButton.children[0].innerHTML = 'Settings';
  1190. document.getElementById('informDialog').insertAdjacentElement('afterend', settingsDialog);
  1191. console.log("\tSettings button created");
  1192. }
  1193.  
  1194. function createCounters() {
  1195. console.log("Creating counter elements");
  1196. var menu = document.getElementById('topmenu1');
  1197. menu.style.position = 'relative';
  1198.  
  1199. var counters = document.createElement('div');
  1200. counters.id = 'counters-container';
  1201. counters.style.display = 'inline-block';
  1202. counters.style.position = 'absolut';
  1203. counters.style.top = '50%';
  1204. counters.style.transform = 'translateY(-50%)';
  1205. counters.style.fontSize = '1.1em';
  1206.  
  1207.  
  1208. var column1 = document.createElement('div');
  1209. column1.id = 'counters-column1';
  1210. column1.style.display = 'inline-block';
  1211. column1.style.marginLeft = '1em';
  1212. column1.style.marginTop = '1em';
  1213. column1.style.verticalAlign = 'top';
  1214. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Sent: ';
  1215. column1.appendChild(document.createElement('span'));
  1216. column1.appendChild(document.createElement('br'));
  1217. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Earned: €';
  1218. column1.appendChild(document.createElement('span'));
  1219. column1.appendChild(document.createElement('br'));
  1220.  
  1221.  
  1222. var column2 = document.createElement('div');
  1223. column2.id = 'counters-column2';
  1224. column2.style.display = 'inline-block';
  1225. column2.style.marginLeft = '2em';
  1226. column2.style.marginTop = '1em';
  1227. column2.style.verticalAlign = 'top';
  1228. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'This week: ';
  1229. column2.appendChild(document.createElement('span'));
  1230. column2.appendChild(document.createElement('br'));
  1231. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Earned: €';
  1232. column2.appendChild(document.createElement('span'));
  1233. column2.appendChild(document.createElement('br'));
  1234. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Rate: €';
  1235. column2.appendChild(document.createElement('span'));
  1236. column2.appendChild(document.createElement('br'));
  1237.  
  1238. var column4 = document.createElement('div');
  1239. column4.id = 'counters-column4';
  1240. column4.style.display = 'inline-block';
  1241. column4.style.marginLeft = '3em';
  1242. column4.style.marginTop = '1em';
  1243. column4.style.verticalAlign = 'top';
  1244. column4.appendChild(document.createElement('span')); column4.lastChild.innerHTML = 'Time: ';
  1245. column4.appendChild(document.createElement('span'));
  1246. column4.appendChild(document.createElement('br'));
  1247. column4.appendChild(document.createElement('span')); column4.lastChild.innerHTML = 'Last Msg: ';
  1248. column4.appendChild(document.createElement('span'));
  1249.  
  1250. var column5 = document.createElement('div');
  1251. column5.id = 'counters-column5';
  1252. column5.style.display = 'none';
  1253. column5.style.marginLeft = '3em';
  1254. column5.style.marginTop = '1em';
  1255. column5.style.verticalAlign = 'top';
  1256. column5.appendChild(document.createElement('button')); column5.lastChild.innerHTML = 'Clear';
  1257.  
  1258. counters.appendChild(column1);
  1259. counters.appendChild(column2);
  1260. counters.appendChild(column4);
  1261. counters.appendChild(column5);
  1262. menu.insertBefore(counters, menu.lastElementChild);
  1263.  
  1264. var menuu = document.getElementById('main');
  1265. menuu.style.position = 'relative';
  1266.  
  1267. var counterss = document.createElement('div');
  1268. counterss.id = 'counters-container2';
  1269. counterss.style.display = 'block';
  1270. counterss.style.position = 'absolut';
  1271. counterss.style.float = 'left';
  1272. counterss.style.top = '100%';
  1273. counterss.style.transform = 'translateY(-50%)';
  1274. counterss.style.fontSize = '1.1em';
  1275.  
  1276. var column6 = document.createElement('textarea');
  1277. column6.className = 'counters-column6';
  1278. column6.style.display = 'inline-block';
  1279. column6.style.marginLeft = '24em';
  1280. column6.style.marginTop = '6em';
  1281. column6.style.verticalAlign = 'top';
  1282. column6.style.width = '790px';
  1283. column6.style.height = '50px';
  1284.  
  1285. counterss.appendChild(column6);
  1286. menuu.insertBefore(counterss, menuu.lastElementChild);
  1287. console.log("\tCounter elements created");
  1288. }
  1289.  
  1290.  
  1291. function calcRate(messages) {
  1292. if(messages >= 1976)
  1293. return 0.19;
  1294. if(messages >= 1576)
  1295. return 0.16;
  1296. if(messages >= 776)
  1297. return 0.14;
  1298. return 0.12;
  1299. }
  1300.  
  1301. function calcEarned(rate, normal, bonus, other) {
  1302. return rate * (normal + bonus) +
  1303. 0.02 * bonus +
  1304. 0.12 * other;
  1305. }
  1306.  
  1307.  
  1308. function getStats() {
  1309. function updateCounters(stats) {
  1310. function statsForDate(date) {
  1311. var normal = parseInt(date.replied_messages_normal) | 0;
  1312. var peakHour = parseInt(date.replied_messages_peakhour) | 0;
  1313. var weekend = parseInt(date.replied_messages_saturday) +
  1314. parseInt(date.replied_messages_sunday) +
  1315. parseInt(date.replied_messages_specialtrigger) | 0;
  1316. var other = parseInt(date.replied_favorites) +
  1317. parseInt(date.replied_flirts) +
  1318. parseInt(date.replied_matches) +
  1319. parseInt(date.replied_proposals) +
  1320. parseInt(date.replied_stopped) | 0;
  1321. return [normal, peakHour + weekend, other];
  1322. }
  1323. console.log("Updating counters");
  1324. var date = new Date().toLocaleString('sv-SE', {
  1325. year: 'numeric',
  1326. month: '2-digit',
  1327. day: '2-digit'
  1328. });
  1329. var sentNormal, sentBonus, other, normalWeek=0, bonusWeek=0, otherWeek=0, rate,
  1330. column1 = document.getElementById('counters-column1'),
  1331. column2 = document.getElementById('counters-column2'),
  1332. column4 = document.getElementById('counters-column4'),
  1333. column5 = document.getElementById('counters-column5');
  1334. column1.children[1].innerHTML = 'No statistics for today (yet?)!';
  1335. column1.children[4].innerHTML = '';
  1336. for(const s of stats) {
  1337. [sentNormal, sentBonus, other] = statsForDate(s);
  1338. normalWeek += sentNormal;
  1339. bonusWeek += sentBonus;
  1340. otherWeek += other;
  1341. if(s.date == date) {
  1342. rate = calcRate(normalWeek + bonusWeek);
  1343. column1.children[1].innerHTML = sentNormal + sentBonus;
  1344. column1.children[4].innerHTML = (rate * (sentNormal + sentBonus)).toFixed(2);
  1345. console.log("\tCounters for today updated");
  1346. break;
  1347. }
  1348. }
  1349. column2.children[1].innerHTML = normalWeek + bonusWeek;
  1350. column2.children[4].innerHTML = calcEarned(rate, normalWeek, bonusWeek, otherWeek).toFixed(2);
  1351. column2.children[7].innerHTML = rate;
  1352.  
  1353.  
  1354. console.log("\tCounters updated");
  1355. }
  1356. console.log("Getting statistics");
  1357. $.ajax({
  1358. url: '/ajax/stats/action/getStats',
  1359. dataType: 'json',
  1360. type: 'POST',
  1361. data: {
  1362. year: new Date().getFullYear(),
  1363. weekno: $.datepicker.iso8601Week(new Date()),
  1364. pagination: {
  1365. current: 1,
  1366. drawPagination: false,
  1367. perPage: 20,
  1368. total: 1
  1369. },
  1370. type: 'mine'
  1371. },
  1372. success: function (response) {
  1373. console.log("getStats AJAX call success");
  1374. updateCounters(response.data.result);
  1375. },
  1376. complete: function () {}
  1377. });
  1378. console.log("\tStatistics gotten");
  1379. }
  1380.  
  1381.  
  1382.  
  1383. var h1 = document.getElementById('counters-column4'),
  1384. start = document.getElementById('counters-column5'),
  1385. h2 = document.getElementById('counters-column4'),
  1386. seconds = 0, minutes = 0, hours = 0,
  1387. t;
  1388.  
  1389. function add() {
  1390. seconds++;
  1391. if (seconds >= 60) {
  1392. seconds = 0;
  1393. minutes++;
  1394. if (minutes >= 60) {
  1395. minutes = 0;
  1396. hours++;
  1397. }
  1398. }
  1399.  
  1400. h1.children[1].textContent = (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + ":" + (seconds > 9 ? seconds : "0" + seconds);
  1401.  
  1402. timer();
  1403. }
  1404. function timer() {
  1405. t = setTimeout(add, 1000);
  1406. }
  1407. timer();
  1408.  
  1409.  
  1410. /* Start button */
  1411. start.onclick = function() {
  1412.  
  1413. h2.children[4].textContent = leftPad(minutes) + ":" + leftPad(seconds);
  1414. h1.children[1].innerHTML = "00:00";
  1415. seconds = 0; minutes = 0; hours = 0;
  1416. return false;
  1417. }
  1418. return true;
  1419.  
  1420.  
  1421.  
  1422.  
  1423.  
  1424. function leftPad(value) {
  1425. return value < 10 ? ('0' + value) : value;
  1426. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement