Guest User

Untitled

a guest
Feb 13th, 2019
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 68.57 KB | None | 0 0
  1. // ==UserScript==
  2. // @name SE Flirt 4.0 Dark Version
  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: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''],
  50. username: '',
  51. password: '',
  52. autoLogin: false,
  53. showCounters: true,
  54. goToMessagesFirst: false,
  55. highlightMessagesNotes: true,
  56. searchAndOpen: false,
  57. notificationSound: true,
  58. hideProfilePics: false
  59. };
  60.  
  61. var local = JSON.parse(localStorage.getItem('config'));
  62. if(local === null)
  63. local = defaults;
  64. for (let i in defaults)
  65. if (!local.hasOwnProperty(i))
  66. local[i] = defaults[i];
  67. for (let i in local)
  68. if (!defaults.hasOwnProperty(i))
  69. delete local[i];
  70. console.log("\tConfig loaded");
  71.  
  72. Notification.requestPermission().then(function(result) {
  73. local.showNotifications = result === "granted";
  74. });
  75. config = local;
  76. }
  77.  
  78.  
  79.  
  80.  
  81. function focusMessageBox() {
  82. window.scroll(0, 0);
  83. document.getElementsByClassName('conversation-message-text')[0].focus();
  84. }
  85.  
  86. function getTargetName() {
  87. return document.getElementsByClassName('target-name')[0].textContent.slice(1);
  88. }
  89. function getUsername() {
  90. return document.getElementsByClassName("user")[0].textContent.match(/\w+/)[0];
  91. }
  92.  
  93. function notifyOperator() {
  94. if(document.hidden) {
  95. if(notifyOperator.notificationSound === undefined) {
  96. notifyOperator.notificationSound = new Audio("https://youtu.be/llcQu-XB6oE?t=10");
  97. }
  98. console.log("Sending notification");
  99. let oldTitle = document.title;
  100. let newTitle = "✉ New message!";
  101. let notification = new Notification("Chattcentralen", {body: "New message received!"});
  102. if(config.notificationSound) {
  103. notifyOperator.notificationSound.play();
  104. }
  105. setTimeout(() => {
  106. notification.close.bind(notification);
  107. }, 5000);
  108. var n = 0;
  109. function blinkTitle() {
  110. document.title = n%2 ? newTitle : oldTitle;
  111. n++;
  112. if(document.hidden)
  113. window.setTimeout(blinkTitle, 500);
  114. else
  115. document.title = oldTitle;
  116. }
  117. blinkTitle();
  118. window.focus();
  119. }
  120. }
  121.  
  122. function highlightMessagesNotes(element) {
  123. console.log("Highlighting messages and notes");
  124. let username = document.getElementsByClassName('target-name')[0].textContent.match(/\w+/)[0];
  125. for (let e of document.getElementsByClassName("from-to")) {
  126. if(e.textContent.indexOf(username) > -1) {
  127. e.parentElement.parentElement.style.background = highlightColor;
  128. }
  129. }
  130. let target = getTargetName();
  131.  
  132. }
  133.  
  134. (function(){
  135. let allowCopyAndPaste = function(e){
  136. e.stopImmediatePropagation();
  137. return true;
  138. };
  139.  
  140. document.addEventListener('copy', allowCopyAndPaste, true);
  141. document.addEventListener('paste', allowCopyAndPaste, true);
  142. document.addEventListener('contextmenu', allowCopyAndPaste, true);
  143. document.addEventListener('keydown', allowCopyAndPaste, true);
  144. })();
  145.  
  146.  
  147. /**
  148. * jQuery.autotype -
  149. */
  150. (function($){
  151.  
  152. // code type constants
  153. var CHARACTER = 1,
  154. NON_CHARACTER = 2,
  155. MODIFIER_BEGIN = 3,
  156. MODIFIER_END = 4,
  157. isNullOrEmpty = function(val) { return val === null || val.length === 0; },
  158. isUpper = function(char) { return char.toUpperCase() === char; },
  159. isLower = function(char) { return char.toLowerCase() === char; },
  160. areDifferentlyCased = function(char1,char2) {
  161. return (isUpper(char1) && isLower(char2)) ||
  162. (isLower(char1) && isUpper(char2));
  163. },
  164. convertCase = function(char) {
  165. return isUpper(char) ? char.toLowerCase() : char.toUpperCase();
  166. },
  167. parseCodes = function(value, codeMap) {
  168. // buffer to hold a collection of key/char code pairs corresponding to input string value
  169. var codes = [],
  170. // buffer to hold the name of a control key as it's being parsed
  171. definingControlKey = false,
  172. // hold a collection of currently pushed modifier keys
  173. activeModifiers = {
  174. alt: false,
  175. meta: false,
  176. shift: false,
  177. ctrl: false
  178. },
  179. explicitModifiers = $.extend({}, activeModifiers),
  180. // buffer to hold construction of current control key
  181. currentControlKey = '',
  182. previousChar = '',
  183. pushCode = function(opts) {
  184. codes.push($.extend({}, opts, activeModifiers));
  185. },
  186. pushModifierBeginCode = function(modifierName) {
  187. activeModifiers[modifierName] = true;
  188. pushCode({
  189. keyCode: codeMap[modifierName],
  190. charCode: 0,
  191. char: '',
  192. type: MODIFIER_BEGIN
  193. });
  194. },
  195. pushModifierEndCode = function(modifierName) {
  196. activeModifiers[modifierName] = false;
  197. pushCode({
  198. keyCode: codeMap[modifierName],
  199. charCode: 0,
  200. char: '',
  201. type: MODIFIER_END
  202. });
  203. };
  204.  
  205. for(var i=0;i<value.length;i++) {
  206. // if the character is about to define a control key
  207. if(!definingControlKey &&
  208. i <= value.length - 5 &&
  209. value.charAt(i) === '{' &&
  210. value.charAt(i+1) === '{')
  211. {
  212. // skip the next "{"
  213. i++;
  214.  
  215. definingControlKey = true;
  216. }
  217. // if the character is about to end definition of control key
  218. else if (definingControlKey &&
  219. i <= value.length - 2 &&
  220. value.charAt(i) === '}' &&
  221. value.charAt(i+1) === '}')
  222. {
  223. // skip the next "}"
  224. i++;
  225.  
  226. // check if this key is a modifier-opener (is a ctrl,alt,del,shift)
  227. if(activeModifiers[currentControlKey] !== undefined)
  228. {
  229. explicitModifiers[currentControlKey] = true;
  230. pushModifierBeginCode(currentControlKey);
  231. }
  232. // check if this key is a modifier-closer (is a /ctrl,/alt,/del,.shift)
  233. else if(activeModifiers[currentControlKey.substring(1)] !== undefined)
  234. {
  235. explicitModifiers[currentControlKey] = false;
  236. pushModifierEndCode(currentControlKey.substring(1));
  237. }
  238. // otherwise is some other kind of non-modifier control key
  239. else
  240. {
  241. pushCode({
  242. keyCode: codeMap[currentControlKey],
  243. charCode: 0,
  244. char: '',
  245. type: NON_CHARACTER,
  246. controlKeyName: currentControlKey
  247. });
  248. }
  249.  
  250. definingControlKey = false;
  251. currentControlKey = '';
  252. }
  253. // currently defining control key
  254. else if (definingControlKey)
  255. {
  256. currentControlKey += value.charAt(i);
  257. }
  258. // otherwise is just a text character
  259. else
  260. {
  261. var character = value.charAt(i);
  262.  
  263. // check for any implicitly changing of cases, and register presses/releases
  264. // of the shift key in accord with them.
  265. if(
  266. (!isNullOrEmpty(previousChar) && areDifferentlyCased(previousChar, character)) ||
  267. (isNullOrEmpty(previousChar) && isUpper(character))
  268. )
  269. {
  270. if(isUpper(character) && !activeModifiers.shift) {
  271. pushModifierBeginCode("shift");
  272. } else if (isLower(character) && activeModifiers.shift && !explicitModifiers.shift){
  273. pushModifierEndCode("shift");
  274. }
  275. }
  276.  
  277. // modify the current character if there are active modifiers
  278. if((activeModifiers.shift && isLower(character)) ||
  279. (!activeModifiers.shift && isUpper(character))) {
  280. // shift converts case
  281. character = convertCase(character);
  282. }
  283.  
  284. var code = {
  285. // if can't identify a keycode, just fudge with the char code.
  286. // nope, this isn't ideal by any means.
  287. keyCode: codeMap[character] || character.charCodeAt(0),
  288. charCode: character.charCodeAt(0),
  289. char: character,
  290. type: CHARACTER
  291. };
  292.  
  293. // modify the current character if there are active modifiers
  294. if(activeModifiers.alt ||
  295. activeModifiers.ctrl ||
  296. activeModifiers.meta) {
  297. // alt, ctrl, meta make it so nothing is typed
  298. code.char = '';
  299. }
  300. pushCode(code);
  301. if(code.char !== '') { previousChar = code.char; }
  302. }
  303. }
  304. return codes;
  305. },
  306. triggerCodeOnField = function(code, field) {
  307. // build up base content that every event should contain
  308. // with information about whether certain chord keys are
  309. // simulated as being pressed
  310. var evnt = {
  311. altKey: code.alt,
  312. metaKey: code.meta,
  313. shiftKey: code.shift,
  314. ctrlKey: code.ctrl
  315. };
  316.  
  317. // build out 3 event instances for all the steps of a key entry
  318. var keyDownEvent = $.extend($.Event(), evnt, {type:'keydown', keyCode: code.keyCode, charCode: 0, which: code.keyCode});
  319. var keyPressEvent = $.extend($.Event(), evnt, {type:'keypress', keyCode: 0, charCode: code.charCode, which: code.charCode || code.keyCode});
  320. var keyUpEvent = $.extend($.Event(), evnt, {type:'keyup', keyCode: code.keyCode, charCode: 0, which: code.keyCode});
  321.  
  322. // go ahead and trigger the first 2 (down and press)
  323. // a keyup of a modifier shouldn't also re-trigger a keydown
  324. if(code.type !== MODIFIER_END) {
  325. field.trigger(keyDownEvent);
  326. }
  327.  
  328. // modifier keys don't have a keypress event, only down or up
  329. if(code.type !== MODIFIER_BEGIN && code.type !== MODIFIER_END) {
  330. field.trigger(keyPressEvent);
  331. }
  332.  
  333. // only actually add the new character to the input if the keydown or keypress events
  334. // weren't cancelled by any consuming event handlers
  335. if(!keyDownEvent.isPropagationStopped() &&
  336. !keyPressEvent.isPropagationStopped()) {
  337. if(code.type === NON_CHARACTER) {
  338. switch(code.controlKeyName) {
  339. case 'enter':
  340. field.val(field.val() + "\n");
  341. break;
  342. case 'back':
  343. field.val(field.val().substring(0,field.val().length-1));
  344. break;
  345. }
  346. } else {
  347. field.val(field.val() + code.char);
  348. }
  349. }
  350.  
  351. // then also trigger the 3rd event (up)
  352. // a keydown of a modifier shouldn't also trigger a keyup until coded
  353. if(code.type !== MODIFIER_BEGIN) {
  354. field.trigger(keyUpEvent);
  355. }
  356. },
  357. triggerCodesOnField = function(codes, field, delay, global) {
  358. if(delay > 0) {
  359. codes = codes.reverse();
  360. var keyInterval = global.setInterval(function(){
  361. var code = codes.pop();
  362. triggerCodeOnField(code, field);
  363. if(codes.length === 0) {
  364. global.clearInterval(keyInterval);
  365. field.trigger('autotyped');
  366. }
  367. }, delay);
  368. } else {
  369. $.each(codes,function(){
  370. triggerCodeOnField(this, field);
  371. });
  372. field.trigger('autotyped');
  373. }
  374. };
  375.  
  376. $.fn.autotype = function(value, options) {
  377. if(value === undefined || value === null) { throw("Value is required by jQuery.autotype plugin"); }
  378. var settings = $.extend({}, $.fn.autotype.defaults, options);
  379.  
  380. // 1st Pass
  381. // step through the input string and convert it into
  382. // a logical sequence of steps, key, and charcodes to apply to the inputs
  383. var codes = parseCodes(value, settings.keyCodes[settings.keyBoard]);
  384.  
  385. // 2nd Pass
  386. // Run the translated codes against each input through a realistic
  387. // and cancelable series of key down/press/up events
  388. return this.each(function(){ triggerCodesOnField(codes, $(this), settings.delay, settings.global); });
  389. };
  390.  
  391. $.fn.autotype.defaults = {
  392. version: '0.5.0',
  393. keyBoard: 'enUs',
  394. delay: 0,
  395. global: window,
  396. keyCodes: {
  397. enUs: { 'back':8,'ins':45,'del':46,'enter':13,'shift':16,'ctrl':17,'meta':224,
  398. 'alt':18,'pause':19,'caps':20,'esc':27,'pgup':33,'pgdn':34,
  399. 'end':35,'home':36,'left':37,'up':38,'right':39,'down':40,
  400. 'printscr':44,'num0':96,'num1':97,'num2':98,'num3':99,'num4':100,
  401. 'num5':101,'num6':102,'num7':103,'num8':104,'num9':105,
  402. 'multiply':106,'add':107,'subtract':109,'decimal':110,
  403. 'divide':111,'f1':112,'f2':113,'f3':114,'f4':115,'f5':116,
  404. 'f6':117,'f7':118,'f8':119,'f9':120,'f10':121,'f11':122,
  405. 'f12':123,'numlock':144,'scrolllock':145,' ':9,' ':32,
  406. 'tab':9,'space':32,'0':48,'1':49,'2':50,'3':51,'4':52,
  407. '5':53,'6':54,'7':55,'8':56,'9':57,')':48,'!':49,'@':50,
  408. '#':51,'$':52,'%':53,'^':54,'&':55,'*':56,'(':57,';':186,
  409. '=':187,',':188,'-':189,'.':190,'/':191,'[':219,'\\':220,
  410. ']':221,"'":222,':':186,'+':187,'<':188,'_':189,'>':190,
  411. '?':191,'{':219,'|':220,'}':221,'"':222,'a':65,'b':66,'c':67,
  412. 'd':68,'e':69,'f':70,'g':71,'h':72,'i':73,'j':74,'k':75,
  413. 'l':76,'m':77,'n':78,'o':79,'p':80,'q':81,'r':82,'s':83,
  414. 't':84,'u':85,'v':86,'w':87,'x':88,'y':89,'z':90,'A':65,
  415. 'B':66,'C':67,'D':68,'E':69,'F':70,'G':71,'H':72,'I':73,
  416. 'J':74,'K':75,'L':76,'M':77,'N':78,'O':79,'P':80,'Q':81,
  417. 'R':82,'S':83,'T':84,'U':85,'V':86,'W':87,'X':88,'Y':89,'Z':90, 'Å':197, 'Ä':196, 'Ö':214}
  418. }
  419. };
  420.  
  421. })(jQuery);
  422.  
  423. //Function to focus end of text
  424. (function($){
  425. $.fn.focusTextToEnd = function(){
  426. this.focus();
  427. var $thisVal = this.val();
  428. this.val('').val($thisVal);
  429. return this;
  430. }
  431. }(jQuery));
  432. //Copy text between textareas
  433. $(".counters-column6").on("input", function(e){
  434. var length = $(".counters-column6").val().length;
  435. if (length > 4) {
  436. //Transfering text
  437. var Text = $(".counters-column6").val();
  438. $(".conversation-message-text").autotype(Text);
  439. //Delete Text in first field
  440. $(".counters-column6").val('');
  441. //Focus main TextField
  442. window.scroll(0, 0);
  443. $(".conversation-message-text").focusTextToEnd();
  444. }
  445. });
  446.  
  447.  
  448.  
  449.  
  450. window.afterConversationLoaded = function() {
  451. console.log("Loaded conversation");
  452. getStats();
  453. notifyOperator();
  454.  
  455. console.log("Registering emoji click refocusing");
  456. for(let e of document.getElementsByClassName('emoji-insert')) {
  457. e.addEventListener('click', focusMessageBox);
  458. }
  459.  
  460. console.log("Registering automatic photo adding");
  461. for(let e of document.getElementById('AddMediaDialog').getElementsByClassName("mediaAddContainer")) {
  462. e.addEventListener('click', () => {
  463. e.getElementsByTagName("img")[0].click();
  464. e.getElementsByTagName("input")[0].click();
  465. $('#btnAddMedia').button('enable')[0].click();
  466. focusMessageBox();
  467. });
  468. }
  469. //Textfield to show after conversation loaded//
  470. $(".counters-column6").css("visibility","visible");
  471.  
  472. //Hidning profile Pics//
  473. var picL = document.getElementsByClassName('player-photo-src');
  474. var picR = document.getElementsByClassName('target-photo-src');
  475. if (config.hideProfilePics) {
  476. $(picL).css("visibility","hidden");
  477. $(picR).css("visibility","hidden");
  478. $('.td2').css("display","none");
  479. };
  480.  
  481. let highlightColor = "rgb(255, 211, 20)";
  482. var target = document.getElementById('conversation-content');
  483. if(config.highlightMessagesNotes) {
  484. console.log("Highlighting own messages");
  485. for(let e of document.getElementById("conversation-messages").getElementsByClassName('from-to')) {
  486. let parentParent = e.parentElement.parentElement;
  487. if(e.textContent.slice(1).indexOf(getTargetName()) > -1) {
  488. parentParent.style.background = "rgb(145, 145, 145)";
  489.  
  490. }else{
  491.  
  492. parentParent.style.background = "rgb(107, 107, 107)";
  493. }
  494.  
  495. }
  496.  
  497. console.log("Highlighting target notes");
  498. let ending = getTargetName().toUpperCase();
  499. for(let e of document.getElementsByClassName('player-last-notes')[0].children) {
  500. if(e.children[2].textContent.toUpperCase().replace(/[\ \)]*$/,"").indexOf(ending) > -1) {
  501. e.style.background = highlightColor;
  502. }
  503. }
  504. }
  505.  
  506.  
  507. let targetNotesContent = document.getElementsByClassName('target-note-content')[0];
  508. document.addEventListener('selectionchange', (e) => {
  509. let anchor = document.getSelection().anchorNode;
  510. if(anchor && anchor.nodeType === Node.TEXT_NODE) {
  511. anchor = anchor.parentElement;
  512. }
  513. if(anchor.classList.contains('message-text')) {
  514. targetNotesContent.value = window.getSelection().toString();
  515. }
  516. });
  517.  
  518. setTimeout(function () {
  519. var convId = $('#conversation-content .message-last-in-id').val(), image = document.getElementById("conversation-messages").getElementsByClassName('attach'),
  520. messId = 'table-msg-row table-msg-row-' + (convId);
  521. if(config.searchAndOpen) {
  522. for(let e of document.getElementById("conversation-messages").getElementsByClassName('from-to')) {
  523. let img = e.parentElement.parentElement.parentElement.parentElement;
  524. if(img.className.match(messId) && e.textContent.slice(1).indexOf(getTargetName()) > -1) {
  525. let e = document.getElementsByClassName('conversation-attachment')[0];
  526. var f = e.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement;
  527. if(e !== undefined && f.className.match(messId)) {
  528. e.click();
  529.  
  530. // Adds :containsNC - non case-sensitive :contains
  531. $.extend($.expr[":"], {
  532. "containsNC": function(elem, i, match, array) {
  533. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  534. }
  535. });
  536. setTimeout( function () {
  537. var text = prompt('Save Picture:', )
  538. //Close Image
  539. $.fancybox.close();
  540. // Insert text to note
  541. $('.target-note-content.area').val(text);
  542. // Select note category
  543. var category = 'bilder';
  544. // Categories
  545. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  546. // Save note
  547. $('.target-save-note').trigger('click')
  548. //Focus TextField
  549. window.scroll(0, 0);
  550. $( ".conversation-message-text" ).focus();
  551. }, 1500)
  552.  
  553.  
  554.  
  555.  
  556.  
  557. }
  558. }
  559.  
  560. }
  561. }
  562. }, 1500);
  563.  
  564.  
  565.  
  566. }
  567.  
  568. function shimFunctions() {
  569. /*
  570. if(config.showCounters) {
  571. console.log("Adding statistics counters");
  572. loadConversation = (function() {
  573. var cached_loadConversation = loadConversation;
  574. return function() {
  575. var result = cached_loadConversation.apply(this, arguments);
  576. afterConversationLoaded();
  577. return result;
  578. };
  579. })();
  580. }
  581. /*/
  582. console.log("Adding statistics counters????");
  583. if(config.showCounters) {
  584. console.log("Adding statistics counters");
  585. loadConversation = new Function(
  586. "id",
  587. "doPreload",
  588. "review",
  589. "fromClaimNext",
  590. "claimNextType",
  591. loadConversation.toString()
  592. .replace("userIdleTime = 0;", "userIdleTime = 0;\n\t\tafterConversationLoaded();")
  593. .replace(/^function[^{]+{/i,"")
  594. .replace(/}[^}]*$/i, "")
  595. );
  596. }
  597. //*/
  598.  
  599. }
  600.  
  601. function registerHotkeys() {
  602. console.log("Registering hotkeys");
  603. var helperFunctions = new Map();
  604. var helpFunctions = new Map();
  605.  
  606. helperFunctions.set(config.hotkeys[0], //
  607. () => {
  608.  
  609. var convId = $('#conversation-content .message-last-in-id').val(),
  610. messId = 'table-msg-row table-msg-row-' + (convId),
  611. messageTable = document.getElementsByClassName(messId),
  612. f = document.getElementById("conversation-messages").getElementsByClassName('message-text');
  613.  
  614. for(let e of f) {
  615. let parentParent = f.parentElement.parentElement;
  616. if(parentParent.textContent.slice(1).indexOf(getTargetName()) > -1) {
  617. let e = document.getElementsByClassName('conversation-attachment')[0];
  618. if(e !== undefined) {
  619. e.click();
  620.  
  621. };
  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. // Input Type About Attachment
  630. var text = prompt('Target note:', );
  631. // Insert text to note
  632. $('.target-note-content.area').val(text);
  633. // Select note category
  634. var category = 'Bild';
  635. // Categories
  636. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  637. // Save note
  638. $('.target-save-note').trigger('click')
  639. //Focus TextField
  640. window.scroll(0, 0);
  641. $( ".conversation-message-text" ).focus();
  642.  
  643. } else{
  644. $( ".conversation-message-text" ).focus();
  645.  
  646. }
  647. }
  648.  
  649.  
  650. });
  651. helperFunctions.set(config.hotkeys[1], //
  652. () => {
  653.  
  654.  
  655.  
  656. let e = document.getElementsByClassName('conversation-attachment')[0];
  657. if(e !== undefined) {
  658. e.click();
  659. }
  660.  
  661.  
  662. });
  663. helperFunctions.set(config.hotkeys[2], focusMessageBox); // Go to message box
  664. helperFunctions.set(config.hotkeys[3], // Focus Custom TextField(Column6)
  665. () => {
  666. //Focus TextField
  667. $( ".counters-column6" ).focusTextToEnd();
  668. });
  669. helperFunctions.set(config.hotkeys[4], // Add image
  670. () => {
  671. $('.conversation-show-more').trigger('click');
  672. });
  673. helperFunctions.set(config.hotkeys[5], // Remove image
  674. () => {
  675. let e = document.getElementsByClassName('message-delmedia-button')[0];
  676. if(e !== undefined) {
  677. e.click();
  678. }
  679. });
  680. helperFunctions.set(config.hotkeys[6], // Go to Messages
  681. () => {
  682. $('button[rel="messages"]').click();
  683. });
  684. helperFunctions.set(config.hotkeys[7], // Go to Stopped Messages
  685. () => {
  686. $('button[rel="stopped"]').click();
  687. });
  688. helperFunctions.set(config.hotkeys[8], // Go to Unread Messages
  689. () => {
  690. $('button[rel="unread"]').click();
  691. });
  692. helperFunctions.set(config.hotkeys[9], // Generate Hobbies and save to Notes
  693. () => {
  694. // Adds :containsNC - non case-sensitive :contains
  695. $.extend($.expr[":"], {
  696. "containsNC": function(elem, i, match, array) {
  697. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  698. }
  699. });
  700.  
  701. 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'];
  702.  
  703. var n = ~~(Math.random() * 4) + 2;
  704.  
  705. var rand = [];
  706. do {
  707. rand[rand.length] = interests.splice(Math.floor(Math.random() * interests.length), 1)[0];
  708. } while (rand.length < n);
  709.  
  710. var hoBB = rand;
  711.  
  712. // Extract target name
  713. var targetName = $('.target-name').text();
  714. // Trim period from target name
  715. var targetNamee = targetName.substr(1);
  716. // Insert text to note
  717. $('.player-note-content.area').val(hoBB);
  718. var f = $('.player-note-content.area').val();
  719. var e = $('.player-note-content.area');
  720. $(e).val( f + ' (' + targetNamee + ')');
  721. // Select note category
  722. var category = 'Hobby';
  723.  
  724. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  725. // Save note
  726. $('.player-save-note').trigger('click')
  727.  
  728. //Autotype text to Message
  729. $('.conversation-message-text').autotype(f);
  730. });
  731. helperFunctions.set(config.hotkeys[10], // Generera Sexintressen + spara i Notes
  732. () => {
  733. // Adds :containsNC - non case-sensitive :contains
  734. $.extend($.expr[":"], {
  735. "containsNC": function(elem, i, match, array) {
  736. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  737. }
  738. });
  739.  
  740. 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'];
  741.  
  742. var n = ~~(Math.random() * 4) + 2;
  743.  
  744. var rand = [];
  745. do {
  746. rand[rand.length] = interests.splice(Math.floor(Math.random() * interests.length), 1)[0];
  747. } while (rand.length < n);
  748.  
  749. var sex = rand;
  750.  
  751. // Extract target name
  752. var targetName = $('.target-name').text();
  753. // Trim period from target name
  754. var targetNamee = targetName.substr(1);
  755. // Insert text to note
  756. $('.player-note-content.area').val(sex);
  757. var f = $('.player-note-content.area').val();
  758. var e = $('.player-note-content.area');
  759. $(e).val( f + ' (' + targetNamee + ')');
  760.  
  761. // Select note category
  762. var category = 'Sexuella preferenser';
  763.  
  764. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  765. // Save note
  766. $('.player-save-note').trigger('click')
  767.  
  768. //Autotype text to Message
  769. $('.conversation-message-text').autotype(f);
  770. });
  771. helperFunctions.set(config.hotkeys[11], // Player Jobb+Spara i Notes
  772. () => {
  773. // Adds :containsNC - non case-sensitive :contains
  774. $.extend($.expr[":"], {
  775. "containsNC": function(elem, i, match, array) {
  776. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  777. }
  778. });
  779.  
  780. //Extract Player Proffesion//
  781. var playerjob = $('.profession').text().toLowerCase();
  782. // Extract target name
  783. var targetName = $('.target-name').text();
  784. // Trim period from target name
  785. var targetNamee = targetName.substr(1);
  786. // Insert text to note
  787. $('.player-note-content.area').val(playerjob + ' (' + targetNamee + ')');
  788. // Select note category
  789. var category = 'jobb/utbildning';
  790. // Categories
  791. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  792. // Save note
  793. $('.player-save-note').trigger('click')
  794.  
  795. //paste proffesion//
  796.  
  797. $('.conversation-message-text').autotype(playerjob);
  798. });
  799. helperFunctions.set(config.hotkeys[12], // Retrieve Player Name and Save to Notes
  800. () => {
  801. // Adds :containsNC - non case-sensitive :contains
  802. $.extend($.expr[":"], {
  803. "containsNC": function(elem, i, match, array) {
  804. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  805. }
  806. });
  807.  
  808. var playername = $('.real_name').text();
  809. // Extract target name
  810. var targetName = $('.target-name').text();
  811. // Trim period from target name
  812. var targetNamee = targetName.substr(1);
  813. // Insert text to note
  814. $('.player-note-content.area').val(playername + ' (' + targetNamee + ')');
  815. // Select note category
  816. var category = 'namn';
  817. // Categories
  818. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  819. // Save note
  820. $('.player-save-note').trigger('click')
  821.  
  822. //Autotype text to Message
  823. $('.conversation-message-text').autotype(playername);
  824. });
  825.  
  826. helperFunctions.set(config.hotkeys[13], // Target Notes+Autoval av Kategori
  827. () => {
  828. // Adds :containsNC - non case-sensitive :contains
  829. $.extend($.expr[":"], {
  830. "containsNC": function(elem, i, match, array) {
  831. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  832. }
  833. });
  834.  
  835. // Extract selected text
  836. var note = window.getSelection().toString();
  837. // Modify and verify selected text
  838. var text = prompt('Target note:', note);
  839. // Insert text to note
  840. $('.target-note-content.area').val(text);
  841. // Select note category
  842. var category;
  843. if (text.match(/bild|selfie|kuk|gif/i)) {
  844. var category = 'Bilder';
  845. } else if (text.match(/singel|barn|son|söner|döttrar|dotter|fru|särbo|sambo|gift|skild|änk/i)) {
  846. var category = 'Familj/Relationer';
  847. } 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)) {
  848. var category = 'Jobb/Utbildning';
  849. } 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)) {
  850. var category = 'Hobby';
  851. } else if (text.match(/bor i|Karlskrona|Karlshamn|Borås|Borlänge/i)) {
  852. var category = 'Stad';
  853. } 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)) {
  854. var category = 'Namn';
  855. } 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)) {
  856. var category = 'Namn';
  857. } 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)) {
  858. var category = 'Namn';
  859. } 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)) {
  860. var category = 'Namn';
  861. } 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)) {
  862. var category = 'Namn';
  863. } 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)) {
  864. var category = 'Namn';
  865. } 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)) {
  866. var category = 'Namn';
  867. } 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)) {
  868. var category = 'Sexuella preferenser';
  869. } else if (text.match(/bil|mc|motorcykel/i)) {
  870. var category = 'Transportmedel';
  871. } else if (text.match(/mejl|mail|telef|skype|kik|fb|facebook/i)) {
  872. var category = 'Mejl och telefon';
  873. } else if (text.match(/sjuk/i)) {
  874. var category = 'Hälsa';
  875. } else var category = prompt('Select category:');
  876. // Categories
  877. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  878. // Save note
  879. $('.target-save-note').trigger('click')
  880. //Focus TextField
  881. window.scroll(0, 0);
  882. $( ".conversation-message-text" ).focus();
  883. });
  884. helperFunctions.set(config.hotkeys[14], // Save to Target Aktuellt
  885. () => {
  886. // Adds :containsNC - non case-sensitive :contains
  887. $.extend($.expr[":"], {
  888. "containsNC": function(elem, i, match, array) {
  889. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  890. }
  891. });
  892.  
  893. // Extract selected text
  894. var note = window.getSelection().toString();
  895. // Insert text to note
  896. $('.target-note-content.area').val(note);
  897. // Select note category
  898. var category = 'aktuella saker';
  899. // Categories
  900. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  901. // Save note
  902. $('.target-save-note').trigger('click')
  903. //Focus TextField
  904. window.scroll(0, 0);
  905. $( ".conversation-message-text" ).focus();
  906. });
  907. helperFunctions.set(config.hotkeys[15], // Save To Player Auto Category
  908. () => {
  909. // Adds :containsNC - non case-sensitive :contains
  910. $.extend($.expr[":"], {
  911. "containsNC": function(elem, i, match, array) {
  912. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  913. }
  914. });
  915. //Function to focus end of text
  916. (function($){
  917. $.fn.focusTextToEnd = function(){
  918. this.focus();
  919. var $thisVal = this.val();
  920. this.val('').val($thisVal);
  921. return this;
  922. }
  923. }(jQuery));
  924. // Extract selected text
  925. var note = window.getSelection().toString();
  926. // Modify and verify selected text
  927. var text = prompt('Player note:', note);
  928. // Extract target name
  929. var targetName = $('.target-name').text();
  930. // Trim period from target name
  931. var targetNamee = targetName.substr(1);
  932. // Insert text to note
  933. $('.player-note-content.area').val(text + ' (' + targetNamee + ')');
  934. // Select note category
  935. var category;
  936. if (text.match(/bild|selfie|kuk|gif/i)) {
  937. var category = 'Bilder';
  938. } else if (text.match(/singel|barn|son|söner|döttrar|dotter|fru|särbo|sambo|gift|skild|änk/i)) {
  939. var category = 'Familj/Relationer';
  940. } 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)) {
  941. var category = 'Jobb/Utbildning';
  942. } 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)) {
  943. var category = 'Hobby';
  944. } else if (text.match(/bor i|Karlskrona|Karlshamn|Borås|Borlänge/i)) {
  945. var category = 'Stad';
  946. } else if (text.match(/heter/i)) {
  947. var category = 'Namn';
  948. } 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)) {
  949. var category = 'Sexuella preferenser';
  950. } else if (text.match(/bil|mc|motorcykel/i)) {
  951. var category = 'Transportmedel';
  952. } else if (text.match(/mejl|mail|telef|skype|kik|fb|facebook/i)) {
  953. var category = 'Mejl och telefon';
  954. } else if (text.match(/sjuk/i)) {
  955. var category = 'Hälsa';
  956. } else var category = prompt('Select category:');
  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[16], // Player Save to Stad
  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. //Function to focus end of text
  974. (function($){
  975. $.fn.focusTextToEnd = function(){
  976. this.focus();
  977. var $thisVal = this.val();
  978. this.val('').val($thisVal);
  979. return this;
  980. }
  981. }(jQuery));
  982. // Extract selected text
  983. var note = window.getSelection().toString();
  984. // Extract target name
  985. var targetName = $('.target-name').text();
  986. // Trim period from target name
  987. var targetNamee = targetName.substr(1);
  988. // Insert text to note
  989. $('.player-note-content.area').val(note + ' (' + targetNamee + ')');
  990. // Select note category
  991. var category = 'stad';
  992. // Categories
  993. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  994. // Save note
  995. $('.player-save-note').trigger('click')
  996. //Focus TextField
  997. window.scroll(0, 0);
  998. $('.conversation-message-text').focusTextToEnd();
  999.  
  1000. });
  1001. helperFunctions.set(config.hotkeys[17], // Player Save to Aktuellt
  1002. () => {
  1003. // Adds :containsNC - non case-sensitive :contains
  1004. $.extend($.expr[":"], {
  1005. "containsNC": function(elem, i, match, array) {
  1006. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  1007. }
  1008. });
  1009. //Function to focus end of text
  1010. (function($){
  1011. $.fn.focusTextToEnd = function(){
  1012. this.focus();
  1013. var $thisVal = this.val();
  1014. this.val('').val($thisVal);
  1015. return this;
  1016. }
  1017. }(jQuery));
  1018. // Extract selected text
  1019. var note = window.getSelection().toString();
  1020. // Extract target name
  1021. var targetName = $('.target-name').text();
  1022. // Trim period from target name
  1023. var targetNamee = targetName.substr(1);
  1024. // Insert text to note
  1025. $('.player-note-content.area').val(note + ' (' + targetNamee + ')');
  1026. // Select note category
  1027. var category = 'Aktuella saker';
  1028. // Categories
  1029. $('select.player-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  1030. // Save note
  1031. $('.player-save-note').trigger('click')
  1032. //Focus TextField
  1033. window.scroll(0, 0);
  1034. $('.conversation-message-text').focusTextToEnd();
  1035. });
  1036. helperFunctions.set(config.hotkeys[18], // Target Notes No Prompt
  1037. () => {
  1038. // Adds :containsNC - non case-sensitive :contains
  1039. $.extend($.expr[":"], {
  1040. "containsNC": function(elem, i, match, array) {
  1041. return (elem.textContent || elem.innerText || "").toLowerCase().indexOf((match[3] || "").toLowerCase()) >= 0;
  1042. }
  1043. });
  1044.  
  1045.  
  1046. // Extract selected text
  1047. var text = window.getSelection().toString();
  1048. // Insert text to note
  1049. $('.target-note-content.area').val(text);
  1050. // Select note category
  1051. var category;
  1052. if (text.match(/bild|selfie|kuk|gif/i)) {
  1053. var category = 'Bilder';
  1054. } else if (text.match(/singel|barn|son|söner|döttrar|dotter|fru|särbo|sambo|gift|skild|änk/i)) {
  1055. var category = 'Familj/Relationer';
  1056. } 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)) {
  1057. var category = 'Jobb/Utbildning';
  1058. } 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)) {
  1059. var category = 'Hobby';
  1060. } else if (text.match(/bor i|Karlskrona|Karlshamn|Borås|Borlänge/i)) {
  1061. var category = 'Stad';
  1062. } 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)) {
  1063. var category = 'Namn';
  1064. } 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)) {
  1065. var category = 'Namn';
  1066. } 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)) {
  1067. var category = 'Namn';
  1068. } 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)) {
  1069. var category = 'Namn';
  1070. } 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)) {
  1071. var category = 'Namn';
  1072. } 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)) {
  1073. var category = 'Namn';
  1074. } 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)) {
  1075. var category = 'Namn';
  1076. } 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)) {
  1077. var category = 'Sexuella preferenser';
  1078. } else if (text.match(/bil|mc|motorcykel/i)) {
  1079. var category = 'Transportmedel';
  1080. } else if (text.match(/mejl|mail|telef|skype|kik|fb|facebook/i)) {
  1081. var category = 'Mejl och telefon';
  1082. } else if (text.match(/sjuk/i)) {
  1083. var category = 'Hälsa';
  1084. } else var category = prompt('Select category:');
  1085. // Categories
  1086. $('select.target-note-categories option:containsNC("' + category + '")').attr('selected', 'selected');
  1087. // Save note
  1088. $('.target-save-note').trigger('click')
  1089. //Focus TextField
  1090. window.scroll(0, 0);
  1091. $( ".conversation-message-text" ).focus();
  1092. });
  1093. helperFunctions.set(config.hotkeys[19], // Focus TextField Column6
  1094. () => {
  1095. //Focus TextField
  1096. $( ".counters-column6" ).focusTextToEnd();
  1097. });
  1098.  
  1099. //Key Event Listensers for Hotkeys
  1100.  
  1101. document.addEventListener('keyup', (e) =>{ // Send Mssg and Lap Time on hit Enter Key
  1102. if (e.which == 13) {
  1103. var isFocused = $(".conversation-message-text").is(":focus"),
  1104. len = $('.conversation-message-text').val().length;
  1105.  
  1106. if (len >= 75 && isFocused) {
  1107. $('#counters-column5').trigger("click");
  1108. $('.message-submit-button').trigger("click");
  1109.  
  1110. }
  1111. }
  1112. });
  1113.  
  1114.  
  1115. document.addEventListener('keyup', (e) => { // Adds Alt Key event listeners for the hotkeys
  1116. if(e.altKey && isOkHotkey(e.code)) {
  1117. e.preventDefault();
  1118. e.stopPropagation();
  1119. let f = helperFunctions.get(e.code);
  1120. if(f !== undefined) f();
  1121. }
  1122. });
  1123.  
  1124. document.addEventListener('keyup', (e) => { // Adds Ctrl Key event listeners for the hotkeys
  1125. if(e.ctrlKey && isOkHotkey(e.code)) {
  1126. e.preventDefault();
  1127. e.stopPropagation();
  1128. let r = helpFunctions.get(e.code);
  1129. if(r !== undefined) r();
  1130. }
  1131. });
  1132.  
  1133.  
  1134. console.log("\tHotkeys registered");
  1135. }
  1136.  
  1137. function isOkHotkey(code) {
  1138. return code.startsWith("Key") || code.startsWith("Digit") || code.startsWith("Numpad") || code.startsWith("Arrow") || code.startsWith("F") || code.startsWith("R");
  1139. }
  1140.  
  1141. function createSettingsButton() {
  1142. function addSetting(value, name) {
  1143. var id_name = (name + 'Setting').replace(/[^A-Za-z_]/g,'');
  1144. var label = document.createElement('label');
  1145. label.innerHTML = name + ": ";
  1146. label.setAttribute('for', id_name);
  1147. label.style.gridColumn = '1';
  1148. var element = document.createElement('input');
  1149. if(typeof value == 'boolean') {
  1150. element.type = 'checkbox';
  1151. element.checked = value;
  1152. } else {
  1153. element.type = 'text';
  1154. element.value = value !== undefined ? value : "";
  1155. }
  1156. element.id = id_name;
  1157. element.name = id_name;
  1158. element.style.gridColumn = '2';
  1159. settingsDialog.appendChild(label);
  1160. settingsDialog.appendChild(element);
  1161. return element;
  1162. }
  1163.  
  1164. function setHotkey(n, e) {
  1165. if(isOkHotkey(e.code) || ['Backspace', 'Delete'].includes(e.code)) {
  1166. e.preventDefault();
  1167. e.stopPropagation();
  1168. var code = (['Backspace', 'Delete'].includes(e.code)) ? "" : e.code;
  1169. e.target.value = code;
  1170. config.hotkeys[n] = code;
  1171. }
  1172. }
  1173. console.log("Creating settings button");
  1174.  
  1175. var menu = $('#topmenu1')[0];
  1176. var settingsDialog = document.createElement('div');
  1177. settingsDialog.id = 'SettingsDialog';
  1178. settingsDialog.style.display = 'none';
  1179. settingsDialog.style.alignItems = 'center';
  1180.  
  1181. addSetting(config.username, 'Username') .addEventListener('change', (e) => {config.username = e.target.value;});
  1182. addSetting(config.password, 'Password') .addEventListener('change', (e) => {config.password = e.target.value;});
  1183. addSetting(config.autoLogin, 'Autologin') .addEventListener('change', (e) => {config.autoLogin = e.target.checked;});
  1184. addSetting(config.showCounters, 'Show counters') .addEventListener('change', (e) => {config.showCounters = e.target.checked;});
  1185. addSetting(config.goToMessagesFirst, 'Go to Messages after login')
  1186. .addEventListener('change', (e) => {config.goToMessagesFirst = e.target.checked;});
  1187. addSetting(config.highlightMessagesNotes, 'Highlights messages and notes')
  1188. .addEventListener('change', (e) => {config.highlightMessagesNotes = e.target.checked;});
  1189. addSetting(config.searchAndOpen, 'AutoSearch Attachment')
  1190. .addEventListener('change', (e) => {config.searchAndOpen = e.target.checked;});
  1191. addSetting(config.notificationSound, 'Play sound on new message')
  1192. .addEventListener('change', (e) => {config.notificationSound = e.target.checked;});
  1193. addSetting(config.hideProfilePics, 'Hide Profile Pics')
  1194. .addEventListener('change', (e) => {config.hideProfilePics = e.target.checked;});
  1195. settingsDialog.appendChild(document.createElement('span'));
  1196. settingsDialog.appendChild(document.createElement('br'));
  1197. settingsDialog.appendChild(document.createElement('span')); settingsDialog.lastChild.innerHTML = 'Functions Starting With ALT Key';
  1198. settingsDialog.appendChild(document.createElement('span'));
  1199. settingsDialog.appendChild(document.createElement('br'));
  1200. addSetting(config.hotkeys[ 0], '??') .addEventListener('keyup', (e) => {setHotkey( 0, e);});
  1201. addSetting(config.hotkeys[ 1], '??') .addEventListener('keyup', (e) => {setHotkey( 1, e);});
  1202. addSetting(config.hotkeys[ 2], 'Go to message box') .addEventListener('keyup', (e) => {setHotkey( 2, e);});
  1203. addSetting(config.hotkeys[ 3], 'Focus Textarea').addEventListener('keyup', (e) => {setHotkey( 3, e);});
  1204. addSetting(config.hotkeys[ 4], '??') .addEventListener('keyup', (e) => {setHotkey( 4, e);});
  1205. addSetting(config.hotkeys[ 5], '??') .addEventListener('keyup', (e) => {setHotkey( 5, e);});
  1206. addSetting(config.hotkeys[ 6], 'Go to Messages') .addEventListener('keyup', (e) => {setHotkey( 6, e);});
  1207. addSetting(config.hotkeys[ 7], 'Go to Stopped Messages') .addEventListener('keyup', (e) => {setHotkey( 7, e);});
  1208. addSetting(config.hotkeys[8], 'Go to Unread Messages') .addEventListener('keyup', (e) => {setHotkey(8, e);});
  1209. addSetting(config.hotkeys[9], 'Generate Hobbies') .addEventListener('keyup', (e) => {setHotkey(9, e);});
  1210. addSetting(config.hotkeys[10], 'SexIntressen') .addEventListener('keyup', (e) => {setHotkey(10, e);});
  1211. addSetting(config.hotkeys[11], 'Player Jobb') .addEventListener('keyup', (e) => {setHotkey(11, e);});
  1212. addSetting(config.hotkeys[12], 'Player Namn') .addEventListener('keyup', (e) => {setHotkey(12, e);});
  1213. addSetting(config.hotkeys[13], 'Target AutoNotes') .addEventListener('keyup', (e) => {setHotkey(13, e);});
  1214. addSetting(config.hotkeys[14], 'Target Aktuellt') .addEventListener('keyup', (e) => {setHotkey(14, e);});
  1215. addSetting(config.hotkeys[15], 'Player AutoNotes') .addEventListener('keyup', (e) => {setHotkey(15, e);});
  1216. addSetting(config.hotkeys[16], 'Player Stad') .addEventListener('keyup', (e) => {setHotkey(16, e);});
  1217. addSetting(config.hotkeys[17], 'Player Aktuellt') .addEventListener('keyup', (e) => {setHotkey(17, e);});
  1218. addSetting(config.hotkeys[18], 'Target Notes Utan Prompt') .addEventListener('keyup', (e) => {setHotkey(18, e);});
  1219. addSetting(config.hotkeys[19], '??') .addEventListener('keyup', (e) => {setHotkey(19, e);});
  1220.  
  1221. var settingsButton = menu.children[5].cloneNode();
  1222. settingsButton.id = 'SettingsButton';
  1223. settingsButton.setAttribute('rel', 'settings');
  1224. settingsButton.addEventListener('click', () => {
  1225. $('#SettingsDialog').dialog({
  1226. title: "Settings",
  1227. resizable: false,
  1228. modal: true,
  1229. position: 'top',
  1230. width: '400',
  1231. open: () => {
  1232. $('#SettingsDialog')[0].style.display = 'grid';
  1233. },
  1234. buttons: [
  1235. {
  1236. text: "Save",
  1237. click: () => {
  1238. console.log("Storing config");
  1239. localStorage.setItem('config', JSON.stringify(config));
  1240. console.log("\tConfig stored:");
  1241. console.log(localStorage.getItem('config'));
  1242. loadConfig();
  1243. //window.location.reload();
  1244. }
  1245. }
  1246. ]
  1247. });
  1248. });
  1249. $('button[rel="documents/manual.pdf"]')[0].insertAdjacentElement('afterend', settingsButton);
  1250. $('button[rel="documents/manual.pdf"]')[0].insertAdjacentText('afterend', '\n');
  1251. $('#SettingsButton').button();
  1252. settingsButton.children[0].innerHTML = 'Settings';
  1253. document.getElementById('informDialog').insertAdjacentElement('afterend', settingsDialog);
  1254. console.log("\tSettings button created");
  1255. }
  1256.  
  1257. function createCounters() {
  1258. console.log("Creating counter elements");
  1259. var menu = document.getElementById('topmenu1');
  1260. menu.style.position = 'relative';
  1261.  
  1262. var counters = document.createElement('div');
  1263. counters.id = 'counters-container';
  1264. counters.style.position = 'absolute';
  1265. counters.style.left = '39%';
  1266. counters.style.top = '10px';
  1267. counters.style.display = 'block';
  1268.  
  1269.  
  1270. var column1 = document.createElement('div');
  1271. column1.id = 'counters-column1';
  1272. column1.style.display = 'inline-block';
  1273. column1.style.marginLeft = '1em';
  1274. column1.style.verticalAlign = 'top';
  1275. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Sent: ';
  1276. column1.appendChild(document.createElement('span'));
  1277. column1.appendChild(document.createElement('br'));
  1278. column1.appendChild(document.createElement('span')); column1.lastChild.innerHTML = 'Earned: €';
  1279. column1.appendChild(document.createElement('span'));
  1280. column1.appendChild(document.createElement('br'));
  1281.  
  1282.  
  1283. var column2 = document.createElement('div');
  1284. column2.id = 'counters-column2';
  1285. column2.style.display = 'inline-block';
  1286. column2.style.marginLeft = '2em';
  1287. column2.style.verticalAlign = 'top';
  1288. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'This week: ';
  1289. column2.appendChild(document.createElement('span'));
  1290. column2.appendChild(document.createElement('br'));
  1291. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Earned: €';
  1292. column2.appendChild(document.createElement('span'));
  1293. column2.appendChild(document.createElement('br'));
  1294. column2.appendChild(document.createElement('span')); column2.lastChild.innerHTML = 'Rate: €';
  1295. column2.appendChild(document.createElement('span'));
  1296. column2.appendChild(document.createElement('br'));
  1297.  
  1298. var column4 = document.createElement('div');
  1299. column4.id = 'counters-column4';
  1300. column4.style.display = 'inline-block';
  1301. column4.style.marginLeft = '3em';
  1302. column4.style.verticalAlign = 'top';
  1303. column4.appendChild(document.createElement('span')); column4.lastChild.innerHTML = 'Time: ';
  1304. column4.appendChild(document.createElement('span'));
  1305. column4.appendChild(document.createElement('br'));
  1306. column4.appendChild(document.createElement('span')); column4.lastChild.innerHTML = 'Last Msg: ';
  1307. column4.appendChild(document.createElement('span'));
  1308.  
  1309. var column5 = document.createElement('div');
  1310. column5.id = 'counters-column5';
  1311. column5.style.display = 'none';
  1312. column5.style.marginLeft = '3em';
  1313. column5.style.verticalAlign = 'top';
  1314. column5.appendChild(document.createElement('button')); column5.lastChild.innerHTML = 'Clear';
  1315.  
  1316. counters.appendChild(column1);
  1317. counters.appendChild(column2);
  1318. counters.appendChild(column4);
  1319. counters.appendChild(column5);
  1320. menu.insertBefore(counters, menu.lastElementChild);
  1321.  
  1322. var menuu = document.getElementById('main');
  1323. menuu.style.position = 'relative';
  1324.  
  1325. var counterss = document.createElement('div');
  1326. counterss.id = 'counters-container2';
  1327. counterss.style.position = 'absolute';
  1328. counterss.style.left = '20.8vw';
  1329. counterss.style.width = '56.6vw';
  1330. counterss.style.display = 'block';
  1331.  
  1332.  
  1333. var column6 = document.createElement('textarea');
  1334. column6.tabIndex = '2';
  1335. column6.className = 'counters-column6';
  1336. column6.placeholder = 'Click And Paste Your Text Here!';
  1337. column6.style.position = 'relative';
  1338. column6.style.width = 'inherit';
  1339. column6.rows = '2';
  1340. column6.style.marginTop = '10px';
  1341. column6.style.borderRadius = '6px';
  1342. column6.style.background = '#636363';
  1343. column6.style.outline = 'none';
  1344. column6.style.border = 'none';
  1345. column6.style.visibility = 'hidden';
  1346. column6.style.placeholder = '#003da0';
  1347.  
  1348.  
  1349. counterss.appendChild(column6);
  1350. menuu.insertBefore(counterss, menuu.firstElementChild);
  1351.  
  1352. var styleNode = document.createElement("style");
  1353. document.body.appendChild(styleNode);
  1354.  
  1355. //CSS Code//CSS Code//
  1356.  
  1357. //Body
  1358. styleNode.innerHTML = "html { background-color: #636363 !important; }\n";
  1359. styleNode.innerHTML += "body { background-color: #636363 !important; font-family: merriweather, serif !important; outline: none !important; }\n";
  1360. styleNode.innerHTML += "::-webkit-scrollbar { display: none !important; }\n";
  1361.  
  1362. //Lay out Top
  1363. styleNode.innerHTML += ".layout-top { position: fixed !important; z-index: 1 !important; }\n";
  1364. styleNode.innerHTML += "#topmenu1 { background-color: #636363 !important; font-family: merriweather, serif !important; border-style: none !important; }\n";
  1365. styleNode.innerHTML += "#topmenu2 { display: none !important; }\n";
  1366. styleNode.innerHTML += "#counters-container { font-size: 14px; font-weight: bold !important; }\n";
  1367.  
  1368. //Midd Section//
  1369.  
  1370. //Upper Textfield
  1371. styleNode.innerHTML +=
  1372. "::placeholder { text-align: center !important; color: #012359 !important; font-size: 15px !important; font-weight: bold !important; }\n";
  1373. styleNode.innerHTML +=
  1374. "textarea.counters-column6 { top: 100px; font-size: 13px !important; font-weight: bold !important; position: fixed !important; z-index: 5; tab-index: 1 !important; }\n";
  1375.  
  1376. //Upper Textfield On Focus
  1377. styleNode.innerHTML +=
  1378. "textarea.counters-column6:focus { border: 1px solid rgba(81, 203, 238, 1) !important; box-shadow: 0 0 7px rgba(81, 203, 238, 1) !important; background: #919191 !important; }\n";
  1379.  
  1380. //Information On Top of Lower Textfield Hidden Objects
  1381. styleNode.innerHTML += "div.from-to { visibility: hidden !important; }\n";
  1382. styleNode.innerHTML += "div.subject{ display: none !important; }\n";
  1383. styleNode.innerHTML += ".message-subject { display: none !important; }\n";
  1384.  
  1385. //Information On Top of Lower Textfield Non Hidden Objects
  1386. styleNode.innerHTML +=
  1387. ".from-to.start-date { visibility: visible !important; position: absolute !important; left: 35% !important; background: #919191 !important; font-weight: bold !important; font-size: 17px !important; font-family: erriweather, serif !important; border-radius: 7px !important; }\n";
  1388. styleNode.innerHTML += ".green { font-size: 11px !important; font-family: merriweather, serif !important; position: relative !important; margin-right: 5px !important; }\n";
  1389.  
  1390. //Lower Texfield Area
  1391. styleNode.innerHTML += ".conversation-fill { position: fixed !important; margin-left: 5px !important; margin-top: 43px !important; z-index: 0 }\n";
  1392. styleNode.innerHTML += ".message.read { !important; padding: 0 5px !important; font-weight: bold !important; }\n";
  1393. styleNode.innerHTML += "textarea.conversation-message-text, ul.emoji-preset, .message-submit-button, .message-addmedia-button, .message-delmedia-button { top: 36px !important; position: relative !important; }\n";
  1394. styleNode.innerHTML +=
  1395. "textarea.conversation-message-text { width: 56.7vw !important; background-color: #636363 !important; outline: none !important; border-radius: 6px !important; font-size: 15px !important; font-family: merriweather, serif !important; font-weight: bold !important; }\n";
  1396.  
  1397. //Lower Texfield Area On Focus
  1398. styleNode.innerHTML +=
  1399. "textarea.conversation-message-text:focus { border: 1px solid rgba(81, 203, 238, 1) !important; box-shadow: 0 0 7px rgba(81, 203, 238, 1) !important; background: #919191 !important; }\n";
  1400.  
  1401. //Objects Under Lower Textfield Area
  1402. styleNode.innerHTML += ".specialdatepicker, #future, .message-send-direct, .message-text span { display: none !important; }\n";
  1403. styleNode.innerHTML += " span.ui-button-text, span.emoji.emoji-sizer { display: block !important; }\n";
  1404.  
  1405. //Incoming Messages Area
  1406. styleNode.innerHTML += "#conversation-messages { top: 25px !important; height: 400px !important; margin-left: 3px !important; font-weight: bold !important; position: relative !important; overflow-y: auto; }\n";
  1407. styleNode.innerHTML += ".tr .td3 .message-text {!important; font-size: 16px !important; font-weight: bold !important; font-family: robot !important; }\n";
  1408. styleNode.innerHTML += ".tr .td3 .from-to { visibility: visible !important; }\n";
  1409. styleNode.innerHTML += ".label { }\n";
  1410. styleNode.innerHTML += "#showmore { position: relative !important; top: 45px !important; background: #919191 !important; }\n";
  1411. //Side Sections//
  1412. //Hidden Objects
  1413. styleNode.innerHTML += "div.bar-title { display: none !important; }\n";
  1414.  
  1415. //Profiles and Notes
  1416. styleNode.innerHTML += ".conversation-left, .conversation-right { background: #636363 !important; font-size: 13px !important; font-family: merriweather, serif !important; }\n";
  1417. styleNode.innerHTML += ".block-content, .player-note, .ui-draggable, .ui-widget-content, .ui-widget-header { background: #919191 !important; font-size: 13px !important; font-weight: bold !important; }\n";
  1418. styleNode.innerHTML += ".player-last-notes { font-size: 13px !important; font-weight: bold !important; }\n";
  1419. styleNode.innerHTML += ".note-cnt { border-left: 0px !important; border-top: 1px !important; font-size: 11px !important; font-weight: bold !important; border-color: #000000 padding: 2px !important; }\n";
  1420. styleNode.innerHTML += ".note_title { border-bottom: 1px solid #000000 !important; font-size: 12px !important; font-weight: bold !important; background: #919191 !important; }\n";
  1421. styleNode.innerHTML += "textarea.target-note-content, textarea.player-note-content, .player-note-content.input, .target-note-content.input { outline: none !important; background-color: #919191 !important; border-radius: 6px !important; }\n";
  1422. styleNode.innerHTML += "select.target-note-categories, select.player-note-categories { outline: none !important; background-color: #919191 !important; border-radius: 6px !important; margin-top: 5px !important; }\n";
  1423.  
  1424. //Textarea Notes On Focus
  1425. styleNode.innerHTML +=
  1426. "textarea.target-note-content:focus, textarea.player-note-content:focus, .player-note-content.input:focus, .target-note-content.input:focus { border: 1px solid rgba(81, 203, 238, 1) !important; box-shadow: 0 0 7px rgba(81, 203, 238, 1) !important; background: #919191 !important; border-radius: 6px !important; outline: none !important;}\n";
  1427.  
  1428. //Buttons//
  1429. styleNode.innerHTML += "button { background-color: #636363 !important; border: none !important; }\n";
  1430. styleNode.innerHTML += " .ui-state-default { font-weight: bold !important; background: none !important; color: #000000 !important; border: none !important; font-family: merriweather, serif !important; }\n";
  1431. styleNode.innerHTML += "button.navigation span { font-size: 15px !important; letter-spacing: 5px !important; }\n";
  1432. //Buttons Hover//
  1433. styleNode.innerHTML += "button.navigation span:hover { border: 1px solid rgba(81, 203, 238, 1) !important; box-shadow: 0 0 7px rgba(81, 203, 238, 1) !important; background: #919191 !important; border-radius: 6px !important; }\n";
  1434. styleNode.innerHTML +=
  1435. " select.target-note-categories:hover, select.player-note-categories:hover, button:hover { border: 1px solid rgba(81, 203, 238, 1) !important; box-shadow: 0 0 7px rgba(81, 203, 238, 1) !important; background: #919191 !important; border-radius: 6px !important; }\n";
  1436.  
  1437. //Hidden Buttons//
  1438. styleNode.innerHTML += "button[rel='documents/manual.pdf'], button[rel='Announcements'] { display: none !important; }\n";
  1439.  
  1440. //Loading Screen
  1441. styleNode.innerHTML += ".message-message { background-color: #636363 !important; }\n";
  1442. styleNode.innerHTML += ".title { visibility: hidden !important; }\n";
  1443.  
  1444. console.log("\tCounter elements created");
  1445. }
  1446.  
  1447.  
  1448. function calcRate(messages) {
  1449. if(messages >= 1976)
  1450. return 0.19;
  1451. if(messages >= 1576)
  1452. return 0.16;
  1453. if(messages >= 776)
  1454. return 0.14;
  1455. return 0.12;
  1456. }
  1457.  
  1458. function calcEarned(rate, normal, bonus, other) {
  1459. return rate * (normal + bonus) +
  1460. 0.02 * bonus +
  1461. 0.12 * other;
  1462. }
  1463.  
  1464.  
  1465. function getStats() {
  1466. function updateCounters(stats) {
  1467. function statsForDate(date) {
  1468. var normal = parseInt(date.replied_messages_normal) | 0;
  1469. var peakHour = parseInt(date.replied_messages_peakhour) | 0;
  1470. var weekend = parseInt(date.replied_messages_saturday) +
  1471. parseInt(date.replied_messages_sunday) +
  1472. parseInt(date.replied_messages_specialtrigger) | 0;
  1473. var other = parseInt(date.replied_favorites) +
  1474. parseInt(date.replied_flirts) +
  1475. parseInt(date.replied_matches) +
  1476. parseInt(date.replied_proposals) +
  1477. parseInt(date.replied_stopped) | 0;
  1478. return [normal, peakHour + weekend, other];
  1479. }
  1480. console.log("Updating counters");
  1481. var date = new Date().toLocaleString('sv-SE', {
  1482. year: 'numeric',
  1483. month: '2-digit',
  1484. day: '2-digit'
  1485. });
  1486. var sentNormal, sentBonus, other, normalWeek=0, bonusWeek=0, otherWeek=0, rate,
  1487. column1 = document.getElementById('counters-column1'),
  1488. column2 = document.getElementById('counters-column2'),
  1489. column4 = document.getElementById('counters-column4'),
  1490. column5 = document.getElementById('counters-column5');
  1491. column1.children[1].innerHTML = '0';
  1492. column1.children[4].innerHTML = '0';
  1493. for(const s of stats) {
  1494. [sentNormal, sentBonus, other] = statsForDate(s);
  1495. normalWeek += sentNormal;
  1496. bonusWeek += sentBonus;
  1497. otherWeek += other;
  1498. if(s.date == date) {
  1499. rate = calcRate(normalWeek + bonusWeek);
  1500. column1.children[1].innerHTML = other;
  1501. column1.children[4].innerHTML = (rate * (sentNormal + sentBonus + other)).toFixed(2);
  1502. console.log("\tCounters for today updated");
  1503. break;
  1504. }
  1505. }
  1506. column2.children[1].innerHTML = otherWeek;
  1507. column2.children[4].innerHTML = calcEarned(rate, normalWeek, bonusWeek, otherWeek).toFixed(2);
  1508. column2.children[7].innerHTML = rate;
  1509.  
  1510. console.log("\tCounters updated");
  1511. }
  1512. console.log("Getting statistics");
  1513. $.ajax({
  1514. url: '/ajax/stats/action/getStats',
  1515. dataType: 'json',
  1516. type: 'POST',
  1517. data: {
  1518. year: new Date().getFullYear(),
  1519. weekno: $.datepicker.iso8601Week(new Date()),
  1520. pagination: {
  1521. current: 1,
  1522. drawPagination: false,
  1523. perPage: 20,
  1524. total: 1
  1525. },
  1526. type: 'mine'
  1527. },
  1528. success: function (response) {
  1529. console.log("getStats AJAX call success");
  1530. updateCounters(response.data.result);
  1531. },
  1532. complete: function () {}
  1533. });
  1534. console.log("\tStatistics gotten");
  1535. }
  1536.  
  1537.  
  1538.  
  1539. var h1 = document.getElementById('counters-column4'),
  1540. start = document.getElementById('counters-column5'),
  1541. h2 = document.getElementById('counters-column4'),
  1542. seconds = 0, minutes = 0, hours = 0,
  1543. t;
  1544.  
  1545. function add() {
  1546. seconds++;
  1547. if (seconds >= 60) {
  1548. seconds = 0;
  1549. minutes++;
  1550. if (minutes >= 60) {
  1551. minutes = 0;
  1552. hours++;
  1553. }
  1554. }
  1555.  
  1556. h1.children[1].textContent = (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + ":" + (seconds > 9 ? seconds : "0" + seconds);
  1557.  
  1558. timer();
  1559. }
  1560. function timer() {
  1561. t = setTimeout(add, 1000);
  1562. }
  1563. timer();
  1564.  
  1565.  
  1566. /* Start button */
  1567. start.onclick = function() {
  1568.  
  1569. h2.children[4].textContent = leftPad(minutes) + ":" + leftPad(seconds);
  1570. h1.children[1].innerHTML = "00:00";
  1571. seconds = 0; minutes = 0; hours = 0;
  1572. return false;
  1573. }
  1574. return true;
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580. function leftPad(value) {
  1581. return value < 10 ? ('0' + value) : value;
  1582. }
Add Comment
Please, Sign In to add comment