Com'back

Ajoute un choix pour le type (écrit, audio, vidéo...) de message envoyé.

  1. // ==UserScript==
  2. // @name Com'back
  3. // @namespace https://greasyfork.org/fr/scripts/17200-com-back
  4. // @version 2.1.12
  5. // @description Ajoute un choix pour le type (écrit, audio, vidéo...) de message envoyé.
  6. // @author DarKobalt, Naugriim(♥), Solon, Harlinde
  7. // @match https://www.dreadcast.net/Main
  8. // @match https://www.dreadcast.eu/Main
  9. // @grant GM_setValue
  10. // @grant GM_getValue
  11. // @grant GM_deleteValue
  12. // @grant GM_listValues
  13. // @license http://creativecommons.org/licenses/by-nc-nd/4.0/
  14. // ==/UserScript==
  15.  
  16. //Un jour, j'aurai le courage pour un vrai refactoring. ;_;
  17.  
  18. //**********************************************
  19. // PARAMETRAGE (EDITION A VOTRE PROPRE RISQUE, UTILISEZ PLUTÔT LE MENU D'OPTIONS!)
  20. //**********************************************
  21.  
  22. //(A) Valeurs par défaut
  23. //======================
  24. //Dictionnaire des paramètres
  25. let params = {};
  26. //Icônes disponibles
  27. params.icons = {
  28. CLIP: "📎",
  29. ACKN: "📨",
  30. UPLD: "📤",
  31. DWLD: "🔃",
  32. FILE: "📄",
  33. PLAY: "▶️",
  34. WRIT: "📝",
  35. AUDI: "🔊",
  36. VIDE: "🎥",
  37. DECK: "💻",
  38. NORP: "✖",
  39. ININ: "【",
  40. INOU: "】",
  41. };
  42. //Textes informatifs.
  43. params.infotexts = {
  44. CLIP: "Pièce jointe",
  45. ACKN: "Accusé de réception",
  46. UPLD: "Envoi de données en cours",
  47. DWLD: "Chargement en cours, veuillez patienter",
  48. FILE: "Fichier",
  49. PLAY: "Lecture",
  50. WRIT: "Message écrit",
  51. AUDI: "Message audio",
  52. VIDE: "Message vidéo",
  53. DECK: "Depuis un deck",
  54. NORP: "Message HRP",
  55. };
  56. //Boutons disponibles :
  57. params.actionList = ['CLIP', 'ACKN', 'UPLD', 'DWLD', 'FILE', 'PLAY'];
  58. //Items de la liste déroulante :
  59. params.typeList = ['WRIT', 'AUDI', 'VIDE', 'DECK', 'NORP'];
  60. //Valeur fixée pour le menu déroulant
  61. params.list_defaultID = 'NONE';
  62. //Choix entre valeur fixée ou dernière valeur pour le menu déroulant (true = valeur fixée, false = dernière valeur choisie)
  63. params.b_alwaysDefault = false;
  64. //Dernière valeur choisie
  65. params.list_lastID = params.list_defaultID;
  66. //Nombre de boutons par face de carrousel
  67. params.carousel_facesize = 6;
  68. //Nombre d'items "utilisateur"
  69. params.user_typeList = [];
  70. params.user_itemsNumber = 5; //maximum
  71. for (let i = 0; i < params.user_itemsNumber; i++) {
  72. let user_item = "list_userItem_" + i.toString();
  73. params.user_typeList.push(user_item);
  74. }
  75. //Nombre de boutons "utilisateur"
  76. params.user_actionList = [];
  77. params.user_actionsNumber = 6; //maximum
  78. for (let i = 0; i < params.user_actionsNumber; i++) {
  79. let user_action = "list_userAction_" + i.toString();
  80. params.user_actionList.push(user_action);
  81. }
  82. //Couleur du texte placé entre "*".
  83. params.emoteColor = "#58dcf9";
  84. //(B) Sauvegarde des paramètres par défaut
  85. //========================================
  86. let default_params = $.extend(true, {}, params); //copie profonde
  87.  
  88. //(C) Récupération locale de paramètres
  89. //=================================
  90. //Valeur fixée pour le menu déroulant
  91. if (GM_getValue("list_defaultID") !== undefined) {
  92. params.list_defaultID = GM_getValue("list_defaultID");
  93. }
  94. //Choix entre valeur fixée ou dernière valeur pour le menu déroulant
  95. if (GM_getValue("b_alwaysDefault") !== undefined) {
  96. params.b_alwaysDefault = GM_getValue("b_alwaysDefault");
  97. }
  98. //Dernière valeur choisie dans le menu déroulant
  99. if (GM_getValue("list_lastID") !== undefined) {
  100. params.list_lastID = GM_getValue("list_lastID");
  101. }
  102. //Items "utilisateur"
  103. for (let i = 0; i < params.user_itemsNumber; i++) {
  104. let user_item = params.user_typeList[i];
  105. if (GM_getValue(user_item) !== undefined) { //l'user_item existe en mémoire
  106. let user_item_icon = user_item + '_icon';
  107. let user_item_text = user_item + '_text';
  108. if (GM_getValue(user_item_icon) !== undefined) { //récupération de l'icône
  109. params.icons[user_item] = GM_getValue(user_item_icon);
  110. }
  111. if (GM_getValue(user_item_text) !== undefined) { //récupération du texte
  112. params.infotexts[user_item] = GM_getValue(user_item_text);
  113. }
  114. //Ajout aux types de messages
  115. params.typeList.push(user_item);
  116. }
  117. }
  118. //Boutons "utilisateur"
  119. for (let i = 0; i < params.user_actionsNumber; i++) {
  120. let user_action = params.user_actionList[i];
  121. if (GM_getValue(user_action) !== undefined) { //l'user_action existe en mémoire
  122. let user_action_icon = user_action + '_icon';
  123. let user_action_text = user_action + '_text';
  124. if (GM_getValue(user_action_icon) !== undefined) { //récupération de l'icône
  125. params.icons[user_action] = GM_getValue(user_action_icon);
  126. }
  127. if (GM_getValue(user_action_text) !== undefined) { //récupération du texte
  128. params.infotexts[user_action] = GM_getValue(user_action_text);
  129. }
  130. //Ajout aux types d'actions
  131. params.actionList.push(user_action);
  132. }
  133. }
  134. //Nombre de faces de carrousel à créer
  135. params.carousel_facesnumber = carouselFacesNumber();
  136. //Couleur du texte placé entre "*".
  137. if (GM_getValue("emoteColor") !== undefined) {
  138. params.emoteColor = GM_getValue("emoteColor");
  139. }
  140. //**********************************************
  141. //FIN PARAMETRAGE
  142. //**********************************************
  143.  
  144. //**********************************************
  145. //INTERFACE DE CONFIGURATION UTILISATEUR
  146. //**********************************************
  147. let $databox = $('#zone_dataBox');
  148. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  149. //Constructeur de fenêtre de configuration
  150. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  151. let DCCB_ConfigurationWindow = function () {
  152. let window_width = '560px';
  153. let window_height = '450px';
  154. let $config_window = $('<div id="dccb_configwindow" onclick="engine.switchDataBox(this)"/>');
  155. $config_window.draggable();
  156. $config_window.addClass('dataBox focused ui-draggable');
  157. $config_window.css({
  158. width: window_width,
  159. "margin-left": '-185px',
  160. display: 'block',
  161. position: 'absolute',
  162. "z-index": '2',
  163. });
  164. for (let i = 1; i <= 8; i++) {
  165. $('<div class="dbfond' + i + '" />').appendTo($config_window);
  166. }
  167. let $config_head = $('<div class="head ui-draggable-handle" ondblclick="$(\'#dccb_configwindow\').toggleClass(\'reduced\');" />').appendTo($config_window);
  168. $('<div title="Fermer la fenêtre (Q)" class="info1 link close" onclick="engine.closeDataBox($(this).parent().parent().attr(\'id\'));" >X</div>').appendTo($config_head);
  169. $('<div title="Reduire/Agrandir la fenêtre" class="info1 link reduce" onclick="$(\'#dccb_configwindow\').toggleClass(\'reduced\');" >-</div>').appendTo($config_head);
  170. $('<div class="title">Configuration DC Com\'Back</div>').appendTo($config_head);
  171. $('<div class="dbloader" />').appendTo($config_window);
  172. let $config_content = $('<div class="content" style="height:' + window_height + '; overflow: auto"/>').appendTo($config_window);
  173. //----------------------------------------
  174. //Widgets internes
  175. //----------------------------------------
  176. let $config_interface = $('<div />').appendTo($config_content);
  177. $config_interface.css({
  178. "margin-left": '3px',
  179. "font-variant": 'small-caps',
  180. color: '#fff',
  181. height: '100%',
  182. width: '98%',
  183. });
  184. //----------------------------------------
  185. //Bandeau incitant à fermer les messages ouverts
  186. //----------------------------------------
  187. let $warning_banner = $('<div />').appendTo($config_interface);
  188. $warning_banner.text("ATTENTION : Veillez à ne pas modifier les paramètres de Com'Back si des messages sont actuellement ouverts.");
  189. $warning_banner.css({
  190. color: '#f10a18',
  191. "text-align": 'center',
  192. magin: '20px 0',
  193. border: '1px solid #f10a18'
  194. });
  195. //----------------------------------------
  196. //Configuration de l'interpréation du contenu des messages
  197. //----------------------------------------
  198. let $bodyconfig = $('<div />').appendTo($config_interface);
  199. let $bodyconfig_title = $('<h2 class="couleur4" />').appendTo($bodyconfig);
  200. $bodyconfig_title.text('Corps de message');
  201. $bodyconfig_title.css({
  202. "margin-bottom": '5px',
  203. "border-bottom": '1px solid',
  204. display: 'block',
  205. "font-size": '17px',
  206. "-webkit-margin-before": '0.83em',
  207. "-webkit-margin-after": '0.83em',
  208. "-webkit-margin-start": '0px',
  209. "-webkit-margin-end": '0px',
  210. "font-weight": 'bold',
  211. position: 'relative',
  212. });
  213. let $bodyconfig_emote_color = $('<div class="ligne"/>').appendTo($bodyconfig);
  214. $bodyconfig_emote_color.text('Couleur d\'emote (texte entre *...*) : ');
  215. $bodyconfig_emote_color.css({
  216. display: 'inline-block',
  217. });
  218. let $bodyconfig_emote_color_picker = $('<input type="color" />').appendTo($bodyconfig_emote_color);
  219. $bodyconfig_emote_color_picker.val(params.emoteColor);
  220. $bodyconfig_emote_color_picker.css({
  221. border: '0px',
  222. width: "150px",
  223. });
  224. $bodyconfig_emote_color_picker.on('input', function () {
  225. let color = $(this).val();
  226. params.emoteColor = color;
  227. GM_setValue("emoteColor", color);
  228. });
  229. //----------------------------------------
  230. //Configuration du menu déroulant
  231. //----------------------------------------
  232. let $listconfig_title = $('<h2 class="couleur4" />').appendTo($config_interface);
  233. $listconfig_title.text('Types de message personalisés (menu déroulant)');
  234. $listconfig_title.css({
  235. "margin-bottom": '5px',
  236. "border-bottom": '1px solid',
  237. display: 'block',
  238. "font-size": '17px',
  239. "-webkit-margin-before": '0.83em',
  240. "-webkit-margin-after": '0.83em',
  241. "-webkit-margin-start": '0px',
  242. "-webkit-margin-end": '0px',
  243. "font-weight": 'bold',
  244. });
  245. //Choix de la valeur par défaut à l'ouverture d'un message ou d'un fil de discussion
  246. let $listconfig_default = $('<div class="ligne"/>').appendTo($config_interface);
  247. $listconfig_default.text('Valeur par défaut : ');
  248. $listconfig_default.css({
  249. display: 'inline-block',
  250. "margin-bottom": '15px',
  251. });
  252. //Bouton-radio du choix "Dernière valeur utilisée"
  253. let $listconfig_default_lastone = $('<input type="radio" name="typeListDefault" value="false">Dernière utilisée</input>').appendTo($listconfig_default);
  254. $listconfig_default_lastone.css({
  255. margin: '0 5px',
  256. });
  257. $listconfig_default_lastone.attr('checked', !params.b_alwaysDefault);
  258. //Bouton-radio du choix "Valeur par défaut fixée"
  259. let $listconfig_default_value = $('<input type="radio" name="typeListDefault" value="true">Toujours :</input>').appendTo($listconfig_default);
  260. $listconfig_default_value.css({
  261. margin: '0px 5px 0 25px',
  262. "padding-left": '20px',
  263. });
  264. $listconfig_default_value.attr('checked', params.b_alwaysDefault);
  265. //Menu déroulant activé si besoin d'un valeur par défaut fixée
  266. let $listconfig_default_picker = $('<select />').appendTo($listconfig_default);
  267. if (params.b_alwaysDefault) {
  268. $listconfig_default_picker.removeAttr('disabled');
  269. } else {
  270. $listconfig_default_picker.attr('disabled', 'disabled');
  271. }
  272. $listconfig_default_picker.css({
  273. "background-color": '#FFFFFF',
  274. "-webkit-box-shadow": '0 0 1px 0px #329bc2',
  275. "border-color": '#207695',
  276. "border-style": 'solid',
  277. "border-width": 'thin',
  278. width: '175px',
  279. margin: '0 5px',
  280. "white-space": 'nowrap',
  281. overflow: 'hidden',
  282. "text-overflow": 'ellipsis',
  283. "-o-text-overflow": 'ellipsis',
  284. "-ms-text-overflow": 'ellipsis',
  285. "-web-text-overflow": 'ellipsis',
  286. "font-family": "Arial,Segoe UI Symbol,Unifont,Unifont Upper CSUR,sans-serif",
  287. });
  288. //Gestion du choix d'une valeur dans le menu déroulant
  289. $listconfig_default_picker.change(function () {
  290. //Changement de la valeur par défaut de la liste déroulante
  291. params.list_defaultID = $(this).val();
  292. //Tentative de sauvegarde locale
  293. GM_setValue("list_defaultID", params.list_defaultID);
  294. });
  295. //Ajout d'un item vide
  296. $listconfig_default_picker.append('<option value="NONE"></option>');
  297. //Ajout des items contenus dans typeList
  298. for (let i = 0; i < params.typeList.length; i++) {
  299. let type_id = params.typeList[i];
  300. let $option = $('<option id="opt_' + type_id + '" />').appendTo($listconfig_default_picker);
  301. let item_title = params.icons[type_id] + ' - ' + params.infotexts[type_id];
  302. $option.val(type_id).html(item_title);
  303. }
  304. //Sélection du type actuellement par défaut
  305. let type_index = params.list_defaultID;
  306. $listconfig_default_picker.val(type_index);
  307. //Gestion du clic sur le bouton-radio "Toujours"
  308. $listconfig_default_value.change(function () {
  309. if ($(this).attr('checked')) { //Utilisation de la valeur par défaut
  310. params.b_alwaysDefault = true;
  311. $listconfig_default_picker.removeAttr('disabled');
  312. GM_setValue("b_alwaysDefault", params.b_alwaysDefault);
  313. }
  314. });
  315. //Gestion du clic sur le bouton-radio "Dernière utilisée"
  316. $listconfig_default_lastone.change(function () {
  317. if ($(this).attr('checked')) { //Utilisateur de la dernière valeur utilisée
  318. params.b_alwaysDefault = false;
  319. params.list_defaultID = 'NONE';
  320. $listconfig_default_picker.attr('disabled', 'disabled');
  321. GM_setValue("list_defaultID", params.list_defaultID);
  322. GM_setValue("b_alwaysDefault", params.b_alwaysDefault);
  323. }
  324. });
  325. //Gestion des items "utilisateur"
  326. let $listconfig_items = $('<div class="ligne"/>').appendTo($config_interface);
  327. $listconfig_items.text('Items personnalisés : ');
  328. let $useritems_table = $('<table id="dccb_userItems_config"/>').appendTo($listconfig_items);
  329. $useritems_table.css({
  330. width: '100%',
  331. border: 'solid 1px white',
  332. margin: '5px 0',
  333. "font-size": '15px',
  334. });
  335. //Ligne d'en-têtes
  336. $useritems_table.append($('<thead><tr><th>Symbole</th><th>Description</th><th></th></tr></thead>'));
  337. let $useritems_tbody = $('<tbody />').appendTo($useritems_table);
  338. for (let i = 0; i < params.user_typeList.length; i++) {
  339. let type_id = params.user_typeList[i];
  340. let $row = $('<tr />').appendTo($useritems_tbody);
  341. $row.addClass("loaded_item");
  342. $row.attr('id', type_id);
  343. let item_icon = params.icons[type_id] || "";
  344. let $icon_td = $('<td class="editable" style="text-align:center;width:10%;font-size: 20px;">' + item_icon + '</td>').appendTo($row);
  345. $icon_td.data('target_type', 'icon');
  346. let item_text = params.infotexts[type_id] ||  "";
  347. let $text_td = $('<td class="editable" style="padding-left:10px;width:70%;">' + item_text + '</td>').appendTo($row);
  348. $text_td.data('target_type', 'infotext');
  349. //Ajout d'un bouton pour la supression
  350. let $last_td = $('<td style="width:20%"/>').appendTo($row);
  351. let $itemdel_btn = $('<div class="btnTxt" />').appendTo($last_td);
  352. $itemdel_btn.data('type_ID', type_id);
  353. $itemdel_btn.text('Supprimer');
  354. $itemdel_btn.css({
  355. height: '15px',
  356. margin: '5px 15px',
  357. });
  358. //Handler clic sur le bouton "Supprimer" d'une ligne du tableau
  359. $itemdel_btn.click(function () {
  360. if ($(this).data('confirmed')) {
  361. //Suppression des valeurs de la ligne
  362. let type_id = $(this).data('type_ID');
  363. $('#' + type_id + ' > td.editable').text("");
  364. //Suppression des données "utilisateur"
  365. //Suppresion en RAM
  366. let index = params.typeList.indexOf(type_id);
  367. if (index !== -1) {
  368. params.typeList.splice(index, 1);
  369. }
  370. delete params.icons[type_id];
  371. delete params.infotexts[type_id];
  372. //Suppresion en mémoire locale
  373. GM_deleteValue(type_id);
  374. GM_deleteValue(type_id + '_icon');
  375. GM_deleteValue(type_id + '_text');
  376. //Suppression dans le menu déroulant de la fenêtre de configuration
  377. if ($listconfig_default_picker.val() === type_id) { //l'item à supprimer est sélectionné
  378. //On sélectionne le type NONE d'office
  379. $listconfig_default_picker.val('NONE').trigger('change');
  380. }
  381. $('option#opt_' + type_id).remove();
  382. //Remise à zéro du bouton
  383. $(this).text('Supprimer');
  384. $(this).data('confirmed', false);
  385. } else {
  386. //Besoin d'un second clic, pour confirmation
  387. $(this).text('Confirmer');
  388. $(this).data('confirmed', true);
  389. }
  390. });
  391. $itemdel_btn.mouseleave(function () {
  392. //Annulation de la confirmation de suppression
  393. $(this).text('Supprimer');
  394. $(this).data('confirmed', false);
  395. });
  396. }
  397. //Css des éléments du tableau
  398. $useritems_table.find('td').css({
  399. border: '1px solid white',
  400. height: '15px'
  401. });
  402. //Handler double-clic sur une cellule éditable
  403. $('td.editable', $useritems_table).dblclick(function () {
  404. let type_id = $(this).parent().attr('id');
  405. let target_type = $(this).data('target_type');
  406. editCellContent($(this), function (changes) {
  407. if (changes) {
  408. //Sauvegarde en ram et en mémoire locale
  409. if (target_type === 'icon') {
  410. params.icons[type_id] = changes;
  411. GM_setValue(type_id + '_icon', changes);
  412. } else if (target_type === 'infotext') {
  413. params.infotexts[type_id] = changes;
  414. GM_setValue(type_id + '_text', changes);
  415. }
  416. //Ajout à la liste des types disponibles (si non déjà présent)
  417. let item_title = params.icons[type_id] + ' - ' + params.infotexts[type_id];
  418. if (params.typeList.indexOf(type_id) === -1) {
  419. //Ajout à la liste des types disponibles
  420. params.typeList.push(type_id);
  421. //Ajout d'un flag en mémoire locale
  422. GM_setValue(type_id, true);
  423. //Ajout au menu déroulant de la fenêtre de configuration
  424. let $option = $('<option id="opt_' + type_id + '"/>').appendTo($listconfig_default_picker);
  425. $option.val(type_id).html(item_title);
  426. } else { //modification dans le menu déroulant si déjà présent
  427. let $option = $('option#opt_' + type_id);
  428. $option.val(type_id).html(item_title);
  429. }
  430. }
  431. });
  432. });
  433. //----------------------------------------
  434. //Configuration des boutons disponibles
  435. //----------------------------------------
  436. let $buttonsconfig_title = $('<h2 class="couleur4" />').appendTo($config_interface);
  437. $buttonsconfig_title.text('Types d\'indications personalisés (boutons)');
  438. $buttonsconfig_title.css({
  439. "margin-bottom": '5px',
  440. "border-bottom": '1px solid',
  441. display: 'block',
  442. "font-size": '17px',
  443. "-webkit-margin-before": '0.83em',
  444. "-webkit-margin-after": '0.83em',
  445. "-webkit-margin-start": '0px',
  446. "-webkit-margin-end": '0px',
  447. "font-weight": 'bold',
  448. });
  449. //Gestion des boutons "utilisateur"
  450. let $listconfig_actions = $('<div class="ligne"/>').appendTo($config_interface);
  451. $listconfig_actions.text('Boutons personnalisés : ');
  452. let $useractions_table = $('<table id="dccb_userActions_config"/>').appendTo($listconfig_actions);
  453. $useractions_table.css({
  454. width: '100%',
  455. border: 'solid 1px white',
  456. margin: '5px 0',
  457. "font-size": '15px',
  458. });
  459. //Ligne d'en-têtes
  460. $useractions_table.append($('<thead><tr><th>Symbole</th><th>Description</th><th></th></tr></thead>'));
  461. let $useractions_tbody = $('<tbody />').appendTo($useractions_table);
  462. for (let i = 0; i < params.user_actionList.length; i++) {
  463. let type_id = params.user_actionList[i];
  464. let $row = $('<tr />').appendTo($useractions_tbody);
  465. $row.addClass("loaded_action");
  466. $row.attr('id', type_id);
  467. let action_icon = params.icons[type_id] || "";
  468. let $icon_td = $('<td class="editable" style="text-align:center;width:10%;font-size: 20px;">' + action_icon + '</td>').appendTo($row);
  469. $icon_td.data('target_type', 'icon');
  470. let action_text = params.infotexts[type_id] ||  "";
  471. let $text_td = $('<td class="editable" style="padding-left:10px;width:70%;">' + action_text + '</td>').appendTo($row);
  472. $text_td.data('target_type', 'infotext');
  473. //Ajout d'un bouton pour la supression
  474. let $last_td = $('<td style="width:20%"/>').appendTo($row);
  475. let $actiondel_btn = $('<div class="btnTxt" />').appendTo($last_td);
  476. $actiondel_btn.data('type_ID', type_id);
  477. $actiondel_btn.text('Supprimer');
  478. $actiondel_btn.css({
  479. height: '15px',
  480. margin: '5px 15px',
  481. });
  482.  
  483. //Handler clic sur le bouton "Supprimer" d'une ligne du tableau
  484. $actiondel_btn.click(function () {
  485. if ($(this).data('confirmed')) {
  486. //Suppression des valeurs de la ligne
  487. let type_id = $(this).data('type_ID');
  488. $('#' + type_id + ' > td.editable').text("");
  489. //Suppression des données "utilisateur"
  490. //Suppresion en RAM
  491. let index = params.actionList.indexOf(type_id);
  492. if (index !== -1) {
  493. params.actionList.splice(index, 1);
  494. }
  495. params.carousel_facesnumber = carouselFacesNumber();
  496. delete params.icons[type_id];
  497. delete params.infotexts[type_id];
  498. //Suppresion en mémoire locale
  499. GM_deleteValue(type_id);
  500. GM_deleteValue(type_id + '_icon');
  501. GM_deleteValue(type_id + '_text');
  502. //Remise à zéro du bouton
  503. $(this).text('Supprimer');
  504. $(this).data('confirmed', false);
  505. } else {
  506. //Besoin d'un second clic, pour confirmation
  507. $(this).text('Confirmer');
  508. $(this).data('confirmed', true);
  509. }
  510. });
  511. $actiondel_btn.mouseleave(function () {
  512. //Annulation de la confirmation de suppression
  513. $(this).text('Supprimer');
  514. $(this).data('confirmed', false);
  515. });
  516.  
  517. }
  518. //Css des éléments du tableau
  519. $useractions_table.find('td').css({
  520. border: '1px solid white',
  521. height: '15px'
  522. });
  523. //Handler double-clic sur une cellule éditable
  524. $('td.editable', $useractions_table).dblclick(function () {
  525. let type_id = $(this).parent().attr('id');
  526. let target_type = $(this).data('target_type');
  527. editCellContent($(this), function (changes) {
  528. if (changes) {
  529. //Sauvegarde en ram et en mémoire locale
  530. if (target_type === 'icon') {
  531. params.icons[type_id] = changes;
  532. GM_setValue(type_id + '_icon', changes);
  533. } else if (target_type === 'infotext') {
  534. params.infotexts[type_id] = changes;
  535. GM_setValue(type_id + '_text', changes);
  536. }
  537. //Ajout à la liste des actions disponibles (si non déjà présent)
  538. if (params.actionList.indexOf(type_id) === -1) {
  539. //Ajout à la liste des types disponibles
  540. params.actionList.push(type_id);
  541. params.carousel_facesnumber = carouselFacesNumber();
  542. //Ajout d'un flag en mémoire locale
  543. GM_setValue(type_id, true);
  544. }
  545. }
  546. });
  547. });
  548. //----------------------------------------
  549. //Bouton de remise à zéro des paramètres
  550. //----------------------------------------
  551. let $buttons_div = $('<div />').appendTo($config_interface);
  552. $buttons_div.css({
  553. //position: 'absolute',
  554. width: '100%',
  555. bottom: '0px',
  556. });
  557. let $reinit_btn = $('<div class="btnTxt" />').appendTo($buttons_div);
  558. $reinit_btn.text('Remettre à zéro');
  559. $reinit_btn.attr('title','Réinitialisation des variables et fermeture de la fenêtre');
  560. $reinit_btn.click(function(){
  561. //Ecrasement des paramètres par les paramètres par défaut
  562. params = $.extend(true, {}, default_params);
  563. //Fermeture forcée de la fenêtre de configuration
  564. engine.closeDataBox('dccb_configwindow');
  565. //Suppression des variables enregistrées en mémoire
  566. let stored_values = GM_listValues();
  567. for (let i=0;i<stored_values.length;i++){
  568. GM_deleteValue(stored_values[i]);
  569. }
  570. });
  571.  
  572. this.$window = $config_window;
  573. };
  574. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  575. //FIN Constructeur de fenêtre de configuration
  576. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  577.  
  578.  
  579. //---------------------------------------------------
  580. //Ajout d'un item au menu bandeau "Paramètres" de DC
  581. //---------------------------------------------------
  582. let $params_menu = $('.menus > .parametres > ul');
  583. let $dccb_config = $('<li />').appendTo($params_menu);
  584. $dccb_config.text("Configuration Com'Back");
  585. $dccb_config.addClass('link couleur2 separator');
  586.  
  587. $dccb_config.click(function () {
  588. //Fermeture des autres instances de paramétrage ouvertes
  589. engine.closeDataBox('dccb_configwindow');
  590. let $config_window = new DCCB_ConfigurationWindow();
  591. $databox.append($config_window.$window);
  592. });
  593.  
  594. //**********************************************
  595. // FIN INTERFACE DE CONFIGURATION UTILISATEUR
  596. //**********************************************
  597.  
  598. //**********************************************
  599. // FONCTIONS UTILITAIRES
  600. //**********************************************
  601.  
  602. //Calcul du nombre de faces de carrousel
  603. function carouselFacesNumber() {
  604. let integer_part = Math.floor(params.actionList.length / params.carousel_facesize);
  605. let modulo_part = params.actionList.length % params.carousel_facesize;
  606. if (modulo_part > 0) {
  607. return integer_part + 1;
  608. }
  609. return integer_part;
  610. }
  611.  
  612. //Calcul de l'index de rattachement d'un bouton au carousel
  613. function carouselDedicatedFaceIdx(btn_idx) {
  614. return Math.floor(btn_idx / params.carousel_facesize);
  615. }
  616.  
  617. //Obtention de la longueur d'un texte en pixels
  618. function getTextWidth(text, font) {
  619. // re-use canvas object for better performance
  620. let canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas"));
  621. let context = canvas.getContext("2d");
  622. context.font = font;
  623. let metrics = context.measureText(text);
  624. return metrics.width;
  625. }
  626.  
  627. //Mise en forme |n * \n|[icône + texte]|n * \n|
  628. function makeBanner(CR_before, id, CR_after, isHeader) {
  629. let banner = params.icons.ININ + ' ' + params.icons[id] + ' - ' + params.infotexts[id] + ' ' + params.icons.INOU;
  630. if (!isHeader) return Array(CR_before + 1).join("\n") + banner + Array(CR_after + 1).join("\n"); //Si ce n'est pas un en-tête, on ne se préoccupe pas de centrer le texte et on applique directement les retours à la ligne.
  631. let bannerWidth = Math.round(getTextWidth(banner, "12px Trebuchet MS")); //Largeur de la bannière
  632. let spaceWidth = Math.round(getTextWidth(" ", "12px Trebuchet MS")); //Largeur d'un espace insécable (alt+255, différent de l'espace normal)
  633. let windowsWidth = 300; //Largeur de la fenêtre à l'endroit de l'en-tête dans laquelle on peut écrire (avec avatar et marges soustraits)
  634. let nbrSpace = Math.floor(((windowsWidth - bannerWidth) / 2) / spaceWidth); //Déduction du nombre d'espaces à ajouter
  635. let space = " ";
  636. return Array(CR_before + 1).join("\n") + space.repeat(nbrSpace) + banner + Array(CR_after + 1).join("\n");
  637. }
  638.  
  639. //Troncature de chaînes de caractères
  640. function truncateString(string, nb_char) {
  641. return $.trim(string).substring(0, nb_char).split(" ").slice(0, -1).join(" ") + "...";
  642. }
  643.  
  644. //Vérification des données, actuellement désactivé
  645. function checkData() {
  646. /*if (params.list_defaultID === undefined) return false;
  647. if (params.list_lastID === undefined) return false;
  648. if (params.b_alwaysDefault === undefined) return false;
  649. if (params.icons === undefined) return false;
  650. if (params.infotexts === undefined) return false;
  651. for (let i = 0; i < params.actionList.length; i++) {
  652. if (params.icons[params.actionList[i]] === undefined) return false;
  653. if (params.infotexts[params.actionList[i]] === undefined) return false;
  654. }
  655. for (let i = 0; i < params.typeList.length; i++) {
  656. if (params.icons[params.typeList[i]] === undefined) return false;
  657. if (params.infotexts[params.typeList[i]] === undefined) return false;
  658. }*/
  659. return true;
  660. }
  661.  
  662. //Edition d'une cellule de tableau
  663. function editCellContent(cell, cb) {
  664. let init_value = cell.text();
  665. cell.html('<input style="width:100%;background-color:rgb(200,200,210)" type="text" value="' + init_value + '" />');
  666. cell.children().first().focus();
  667. cell.children().first().keypress(function (e) {
  668. if (e.which == 13) { //Touche entrée appuyée
  669. let new_value = cell.find('input').val();
  670. cell.text(new_value);
  671. if (new_value !== init_value) { //la nouvelle valeur est différente de l'ancienne
  672. return cb(new_value);
  673. } else { //pas de changement de valeur
  674. return cb(false);
  675. }
  676. }
  677. });
  678. //Le champ d'édition n'a plus le focus = un clic a été donné sur un autre élément
  679. cell.children().first().blur(function () {
  680. cell.text(init_value);
  681. return cb(false);
  682. });
  683. }
  684.  
  685.  
  686.  
  687. //Formatage des liens et des contenus de message
  688. function format_liens(html) {
  689.  
  690. //URLs starting with http://, https://, or ftp://
  691. let replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&#\/%?=~_|!:,.;]*[-A-Z0-9+&#\/%=~_|])/gim;
  692. html = html.replace(replacePattern1, '<a href="$1" target="_blank">$1</a>');
  693.  
  694. //URLs starting with "www." (without // before it, or it'd re-link the ones done above).
  695. let replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
  696. html = html.replace(replacePattern2, '$1<a href="http://$2" target="_blank">$2</a>');
  697.  
  698. html = html.replace(/(<br\/><\/a>)|(<br><\/a>)/gim, '<\/a><br>'); //Problème des liens www dont la fin peut être tronquée avec une balise <br/>
  699. html = html.replace(/(<br\/>\" target)|(<br>\" target)/gim, '" target'); //Pareil, correction dans le href
  700.  
  701. /*HARLINDE COURTESY*/
  702. //Ta mère youtube
  703. html = html.replace(/<a\shref=\"(?:http?s?:\/\/)?(?:www\.)?(?:youtube\.com|youtu\.be)\/(?:watch\?v=)?(.+)\"\starget=\"_blank\">[\S]+<\/a>/gim, '<center><embed style="max-width: 355px;" src="https://www.youtube.com/embed/$1"></embed></center>');
  704. //Transforme les liens de son en son...
  705. html = html.replace(/<a\shref=\"([\S]+(\.mp3|\.ogg|\.wav))\"\starget=\"_blank\">[\S]+<\/a>/gim, '<center><audio controls><source src="$1"></audio></center>');
  706.  
  707.  
  708. //Transforme les liens d'images en images cliquables
  709. html = html.replace(/<a\shref=\"([\S]+(\.png|\.jpg|\.jpeg|\.gif))\"\starget=\"_blank\">[\S]+<\/a>/gim, '<center><a href="$1" target="_blank"><img src="$1" style="max-width: 355px;"><\/a></center>');
  710.  
  711. //Tranforme le texte entre * en italique
  712. html = html.replace(/\*([^\*]+)\*/gim, '<span style="font-style: italic; color: ' + params.emoteColor + ';">$1</span>');
  713.  
  714. return html;
  715. }
  716.  
  717.  
  718. //**********************************************
  719. // FIN FONCTIONS UTILITAIRES
  720. //**********************************************
  721.  
  722. //**********************************************
  723. // FONCTIONS DES INTERFACES MESSAGES
  724. //**********************************************
  725. //Pour un nouveau message
  726. function mainf() {
  727.  
  728. var old_id = "#db_new_message";
  729. var $databox = $(old_id);
  730. var new_id = 'db_message_' + new Date().getTime().toString();
  731. $databox.attr('id', new_id);
  732. var db_id = '#'+new_id;
  733. var class_name = ".message_nouveau";
  734. var toContent = db_id + " > relative > div.content";
  735. var $msg_content = $(toContent);
  736. var $msg_textarea = $(toContent + " > " + class_name + " > #nm_texte > textarea");
  737.  
  738. //Edition du bouton pour réduire la fenêtre afin de corriger le onclick en chemin relatif jQuery
  739. //Ainsi que du double clic sur le titre de la fenêtre qui a le même effet
  740. $(db_id + " > relative > .head").attr("ondblclick", "").dblclick(function(){
  741. $(this).parent().toggleClass('reduced');
  742. });
  743. $(db_id + " > relative > .head > .info1.link.reduce").attr("onclick", "").click(function(){
  744. $(this).parent().parent().toggleClass('reduced');
  745. });
  746.  
  747. //Menu déroulant
  748. //*********************
  749. //Création du conteneur
  750. var $types_div = $('<div id="DCCB_divListe" />').appendTo($msg_content);
  751. $types_div.css({
  752. "z-index": '999999',
  753. position: 'absolute',
  754. top: '3px',
  755. left: '37px',
  756. "background-color": '#ACABAB',
  757. });
  758. //Création de la liste
  759. var $types_selection = $('<select id="listeTypes" />').appendTo($types_div);
  760. $types_selection.css({ //TODO : vérifier que ellipsis fonctionne
  761. display: 'block',
  762. width: '165px',
  763. "white-space": 'nowrap',
  764. overflow: 'hidden',
  765. "text-overflow": 'ellipsis',
  766. "-o-text-overflow": 'ellipsis',
  767. "-ms-text-overflow": 'ellipsis',
  768. "-web-text-overflow": 'ellipsis',
  769. "font-family": "Arial,Segoe UI Symbol,Unifont,Unifont Upper CSUR,sans-serif",
  770. });
  771. $types_selection.change(function () {
  772. var type_id = $(this).val();
  773. //Changement de dernier item choisi
  774. params.list_lastID = type_id;
  775. //Ajout d'une infobulle
  776. if (type_id !== 'NONE') {
  777. $(this).attr('title', makeBanner(0, type_id, 0, false));
  778. } else {
  779. $(this).attr('title', "");
  780. }
  781. //Sauvegarde locale
  782. GM_setValue("list_lastID", type_id);
  783. });
  784. //Ajout d'un élément neutre
  785. $types_selection.append('<option value="NONE"></option>');
  786. //Ajout des éléments en fonction de 'typeList'
  787. for (var i = 0; i < params.typeList.length; i++) {
  788. var $option = $('<option />').appendTo($types_selection);
  789. var type_id = params.typeList[i];
  790. var item_title = params.icons[type_id] + ' - ' + params.infotexts[type_id];
  791. $option.val(type_id).html(item_title);
  792. }
  793. //Application du choix par défaut
  794. var type_id = (params.b_alwaysDefault) ? params.list_defaultID : params.list_lastID;
  795. $types_selection.val(type_id);
  796. if (type_id !== 'NONE') {
  797. $types_selection.attr('title', makeBanner(0, type_id, 0, false));
  798. } else {
  799. $types_selection.attr('title', "");
  800. }
  801.  
  802. //Boutons
  803. //*********************
  804. //Edit bouton d'envoi pour injecter fonctions customs
  805. $(db_id + " > relative > .content > .message_nouveau > .envoyer.link").attr("onclick", "").click(function() {
  806. //Ajout d'un en-tête au message avant l'envoi
  807. if ($types_selection.val() !== 'NONE') {
  808. var header = makeBanner(1, $types_selection.val(), 4, true);
  809. var new_msg = header + $msg_textarea.val();
  810. $msg_textarea.val(new_msg);
  811. }
  812. nav.getMessagerie().sendMessage($(db_id));
  813. $(this).off("click"); //Empêche un envoi multiple du message.
  814. });
  815. //Boutons annexes pour ajouter des bouts de texte (pièce jointe, etc).
  816. var $actions_div = $('<div id="div_cb_annexes"/>').appendTo($msg_content);
  817. $actions_div.css({
  818. "z-index": '999999',
  819. position: 'absolute',
  820. top: '25%',
  821. right: '4px',
  822. width: '30px',
  823. height: (params.carousel_facesize * 30).toString() + 'px',
  824. overflow: 'hidden',
  825. border: '1px solid rgba(0, 0, 0,0.1)',
  826. "box-shadow": '0',
  827. });
  828. $actions_div.on('contextmenu', function (e) {
  829. e.stopPropagation();
  830. e.preventDefault();
  831. if (carousel_stockpile.length < 2) {
  832. return false; // Ignorer si pas plus d'éléments
  833. }
  834. //On extrait le premier élément de la pile (sans remise)
  835. var fifo = carousel_stockpile.shift();
  836. //On cache cet élément
  837. $('.' + fifo, $actions_div).hide();
  838. //On montre le nouvel élément de tête
  839. $('.' + carousel_stockpile[0], $actions_div).show();
  840. //On ajoute l'ancien premier élément en fin de pile
  841. carousel_stockpile.push(fifo);
  842. return false;
  843. });
  844. //Initialisation d'une pile de gestion des faces du carrousel
  845. var carousel_stockpile = []
  846. for (var idx_carousel = 0; idx_carousel < params.carousel_facesnumber; idx_carousel++) {
  847. carousel_stockpile.push('carousel_' + idx_carousel.toString());
  848. }
  849. //Création des boutons rattachés à une face du carrousel
  850. for (var idx_btn = 0; idx_btn < params.actionList.length; idx_btn++) {
  851. var dedicatedCarousel_id = "carousel_" + carouselDedicatedFaceIdx(idx_btn);
  852. var action_id = params.actionList[idx_btn];
  853. var $button = $('<button title="' + params.infotexts[action_id] + '" class="cb_annexes" id="DCCB_b' + idx_btn.toString() + '">' + params.icons[action_id] + '</button>').appendTo($actions_div);
  854. //On range le bouton sur une face du carrousel via une classe CSS
  855. $button.addClass(dedicatedCarousel_id);
  856. $button.val(action_id);
  857. //On cache tous les boutons à l'initialisation
  858. $button.hide();
  859. $button.click(function () {
  860. var innerBanner = makeBanner(0, $(this).val(), 1, false);
  861. var new_msg = $msg_textarea.val() + innerBanner;
  862. $msg_textarea.val(new_msg);
  863. });
  864. }
  865. //On montre les membres de la première face du carrousel
  866. $('.carousel_0', $actions_div).show();
  867.  
  868. $(".cb_annexes").css({
  869. "background-color": "#ACABAB",
  870. "height": "30px",
  871. "width": "30px",
  872. "font-size": "20px",
  873. "font-family": "Arial,Segoe UI Symbol,Unifont,Unifont Upper CSUR,sans-serif",
  874. }); //Ajout du CSS des boutons.
  875. //console.log("Com'back started: nouveau message"); //Debug
  876. }
  877.  
  878. //Pour un film de discussion existant
  879. function filcomf() {
  880.  
  881. $("#liste_messages").ajaxComplete(function (e, xhr, opt) { //Naugriim, je t'aime. <3 (Attendre le chargement de la fenêtre avant d'envoyer la sauce)
  882.  
  883. //console.log("COM'BACK DEBUG: " + opt.url);
  884. if(!opt.url.includes("Menu/Messaging/action=OpenMessage")) return;
  885.  
  886. $("#liste_messages").unbind('ajaxComplete'); //Evite de renvoyer à chaque nouvelle requête ajax du jeu et donc de dupliquer la fonction
  887. let message_id = $("input.id_conversation").attr('value'); //Récupère l'id du message
  888. let db_id = "#db_message_" + message_id;
  889.  
  890. $(db_id + " > relative > .content > .message > .grid1 > .contenu").css("min-height", "25vh"); // Test pour hauteur de com' responsive...
  891.  
  892. //Transformation des liens en liens cliquables
  893. //*********************
  894. let $message_content = $(db_id + " > relative > .content > .message > .grid1 > .contenu > .texte");
  895. let content_orig = $message_content.html();
  896. $message_content.html(format_liens(content_orig));
  897. let last_clicked_id = $(db_id + " .link.conversation.selected").attr('id');
  898. $(db_id + " .link.conversation").click(function () {
  899. let $cheminTexte = $(db_id + " > relative > .content > .message > .grid1 > .contenu > .texte");
  900. $cheminTexte.ajaxComplete(function () {
  901. $(this).unbind('ajaxComplete');
  902. let this_clicked_id = $(db_id + " .link.conversation.selected").attr('id');
  903. if (this_clicked_id !== last_clicked_id) {
  904. last_clicked_id = this_clicked_id; //Eviter de repasser la fonction qui sinon nique les liens.
  905. $(this).html(format_liens($(this).html()));
  906. }
  907. });
  908.  
  909. });
  910.  
  911. $(db_id + " > relative > .content > div.message > .grid2 .btnTxt").filter((i, el) => ["Répondre", "Inviter"].includes($(el).text())).click(function () { //Création et affichage lors du clic sur l'un des boutons en bas de la fenêtre
  912.  
  913. if (document.getElementById("dccb_div_fc_" + message_id) === null) { //Ne recrée pas l'interface du script si elle existe déjà: REND IMPOSSIBLE L'OUVERTURE DE PLUSIEURS COMS SANS BUGS.
  914.  
  915. let $msg_content = $(db_id + " > relative > .content > .message");
  916. let $msg_textarea = $(db_id + " > relative > .content > .message > .zone_reponse > .texte > #nm_texte > textarea");
  917.  
  918. //Augmentation de la taille de la zone_conversation
  919. //$('.zone_conversation').css('height', '340px');
  920. //Version animée
  921. /* $('.zone_conversation').animate({
  922. height: '340px'
  923. }, 500);*/
  924.  
  925. //Menu déroulant
  926. //*********************
  927. //Création du conteneur
  928. let $types_div = $('<div id="dccb_div_fc_' + message_id + '" />').appendTo($msg_content);
  929. $types_div.addClass('dccb_div_fc');
  930. $types_div.css({
  931. "z-index": '999999',
  932. position: 'absolute',
  933. bottom: '0px',
  934. left: '105px',
  935. "background-color": '#FFFFFF',
  936. "-webkit-box-shadow": '0 0 1px 0px #329bc2',
  937. "border-color": '#207695',
  938. "border-style": 'solid',
  939. "border-width": 'thin',
  940. });
  941. //Création de la liste
  942. let $types_selection = $('<select id="listeTypesfc_' + message_id + '" />').appendTo($types_div);
  943. $types_selection.addClass('listeTypesfc');
  944. $types_selection.css({ //TODO : vérifier que ellipsis fonctionne
  945. height: '27px',
  946. color: '#397d94',
  947. display: 'block',
  948. width: '250px',
  949. "white-space": 'nowrap',
  950. overflow: 'hidden',
  951. "text-overflow": 'ellipsis',
  952. "-o-text-overflow": 'ellipsis',
  953. "-ms-text-overflow": 'ellipsis',
  954. "-web-text-overflow": 'ellipsis',
  955. "font-family": 'Arial,Segoe UI Symbol,Unifont,Unifont Upper CSUR,sans-serif',
  956. });
  957. $types_selection.change(function () {
  958. let type_id = $(this).val();
  959. //Changement de dernier item choisi
  960. params.list_lastID = type_id;
  961. //Ajout d'une infobulle
  962. if (type_id !== 'NONE') {
  963. $(this).attr('title', makeBanner(0, type_id, 0, false));
  964. } else {
  965. $(this).attr('title', "");
  966. }
  967. //Sauvegarde locale
  968. GM_setValue("list_lastID", type_id);
  969. });
  970. //Ajout d'un élément neutre
  971. $types_selection.append('<option value="NONE"></option>');
  972. //Ajout des éléments en fonction de 'typeList'
  973. for (let i = 0; i < params.typeList.length; i++) {
  974. let $option = $('<option />').appendTo($types_selection);
  975. let type_id = params.typeList[i];
  976. let item_title = params.icons[type_id] + ' - ' + params.infotexts[type_id];
  977. $option.val(type_id).html(item_title);
  978. }
  979. //Application du choix par défaut
  980. let type_id = (params.b_alwaysDefault) ? params.list_defaultID : params.list_lastID;
  981. $types_selection.val(type_id);
  982. if (type_id !== 'NONE') {
  983. $types_selection.attr('title', makeBanner(0, type_id, 0, false));
  984. } else {
  985. $types_selection.attr('title', "");
  986. }
  987. //Boutons
  988. //*********************
  989. //Bouton d'envoi injecté
  990. $(db_id + " > relative > .content > .message > .zone_reponse > .btnTxt").attr("onclick", "").click(function(){
  991. //Ajout d'un en-tête au message avant l'envoi
  992. if ($types_selection.val() !== 'NONE') {
  993. let header = makeBanner(1, $types_selection.val(), 4, true);
  994. let new_msg = header + $msg_textarea.val();
  995. $msg_textarea.val(new_msg);
  996. }
  997. nav.getMessagerie().sendMessage($(db_id));
  998. $(this).off("click"); //Empêche d'envoyer un message en double.
  999. });
  1000. //Boutons annexes pour ajouter des bouts de texte (pièce jointe, etc).
  1001. let $actions_div = $('<div id="dccb_annexesfc_' + message_id + '"/>').appendTo($msg_content);
  1002. $actions_div.css({
  1003. "z-index": '999999',
  1004. position: 'absolute',
  1005. bottom: '-1px',
  1006. left: '365px',
  1007. height: '29px',
  1008. width: (params.carousel_facesize * 30).toString() + 'px',
  1009. overflow: 'hidden',
  1010. border: '1px solid rgba(0, 0, 0,0.1)',
  1011. "box-shadow": '0',
  1012. });
  1013. $actions_div.on('contextmenu', function (e) {
  1014. e.stopPropagation();
  1015. e.preventDefault();
  1016. if (carousel_stockpile.length < 2) {
  1017. return false; // Ignorer si pas plus d'éléments
  1018. }
  1019. //On extrait le premier élément de la pile (sans remise)
  1020. let fifo = carousel_stockpile.shift();
  1021. //On cache cet élément
  1022. $('.' + fifo, $actions_div).hide();
  1023. //On montre le nouvel élément de tête
  1024. $('.' + carousel_stockpile[0], $actions_div).show();
  1025. //On ajoute l'ancien premier élément en fin de pile
  1026. carousel_stockpile.push(fifo);
  1027. return false;
  1028. });
  1029. //Initialisation d'une pile de gestion des faces du carrousel
  1030. let carousel_stockpile = []
  1031. for (let idx_carousel = 0; idx_carousel < params.carousel_facesnumber; idx_carousel++) {
  1032. carousel_stockpile.push('carousel_' + idx_carousel.toString());
  1033. }
  1034. for (let idx_btn = 0; idx_btn < params.actionList.length; idx_btn++) {
  1035. let dedicatedCarousel_id = "carousel_" + carouselDedicatedFaceIdx(idx_btn);
  1036. let action_id = params.actionList[idx_btn];
  1037. let $button = $('<button title="' + params.infotexts[action_id] + '" class="cb_annexesfc cb_annexesfc_' + message_id + '" id="DCCB_b' + idx_btn.toString() + '_' + message_id + '">' + params.icons[action_id] + '</button>').appendTo($actions_div);
  1038. $button.val(action_id);
  1039. $button.addClass(dedicatedCarousel_id);
  1040. //On cache tous les boutons à l'initialisation
  1041. $button.hide();
  1042. $button.click(function () {
  1043. let innerBanner = makeBanner(0, $(this).val(), 1, false);
  1044. let new_msg = $msg_textarea.val() + innerBanner;
  1045. $msg_textarea.val(new_msg);
  1046. });
  1047. }
  1048. $('.carousel_0', $actions_div).show();
  1049.  
  1050. $(".cb_annexesfc_" + message_id).css({
  1051. "color": "#397D94",
  1052. "background-color": "#FFFFFF",
  1053. "height": "29px",
  1054. "width": "29px",
  1055. "font-size": "15px",
  1056. "border-color": "#207695",
  1057. "font-family": "Arial,Segoe UI Symbol,Unifont,Unifont Upper CSUR,sans-serif",
  1058. }); //Ajout du CSS des boutons.
  1059.  
  1060. $msg_textarea.css({
  1061. "font-family": "Verdana,Courier,Segoe UI Symbol,Unifont,Unifont Upper CSUR,sans-serif",
  1062. }); //CSS Unicode pour la zone d'écriture d'un fil de com'. Nécessite d'être placé ici parce que nique AJAX et jQuery.
  1063.  
  1064.  
  1065.  
  1066. }
  1067. });
  1068.  
  1069. });
  1070.  
  1071. console.log("Com'back started: fil de discussion"); //Debug
  1072. }
  1073. //**********************************************
  1074. // FIN FONCTIONS DES INTERFACES MESSAGES
  1075. //**********************************************
  1076.  
  1077. //**********************************************
  1078. // MAIN
  1079. //**********************************************
  1080.  
  1081. if (!checkData()) {
  1082. console.log("DCCB - Com'back : Erreur dans les données");
  1083. } else {
  1084.  
  1085. $("#zone_messagerie > div.btnTxt.link").click(mainf); //Nouveaux messages
  1086. //$("#liste_contacts div.btnTxt.mail").click(mainf); //Nouveaux messages (Liste de contacts)
  1087. $("li.message").click(filcomf); //1ère initialisation
  1088.  
  1089.  
  1090. $(document).ajaxSuccess(function(e, xhr, opt){
  1091. if (opt.url.includes("/Menu/Messaging/OpenFolder")) {
  1092. //console.log("DCCB - Actualisation des events");
  1093. $("li.message").off("click", filcomf);
  1094. $("li.message").click(filcomf);
  1095. }
  1096. });
  1097.  
  1098. setInterval(function () { //Fix bien crade pour contacter l'auteur d'une annonce AITL.
  1099. $(".annonce > .texte > span:contains(Contacter l'auteur)").click(mainf);
  1100. }, 1000);
  1101.  
  1102. //Affichage du Unicode via la police Unifont
  1103. $("body").css({
  1104. "font-family": "Trebuchet MS,Verdana,Arial,Segoe UI Symbol,Unifont,Unifont Upper CSUR,sans-serif",
  1105. });
  1106. $("textarea").css({
  1107. "font-family": "Verdana,Courier,Segoe UI Symbol,Unifont,Unifont Upper CSUR,sans-serif",
  1108. }); //Ne fonctionne que pour les nouveaux messages à cause d'AJAX. Sera sûrement à adapter si Remedy règle le bug de fermeture des nouveaux messages.
  1109.  
  1110. console.log("DCCB - Com'back initialisé!");
  1111. }