Просмотр файла public/assets/js/main.js

Размер файла: 18.65Kb
  1. $(function () {
  2. var currentLang = $('html').attr('lang');
  3. translate = window['translate_' + currentLang];
  4.  
  5. prettyPrint();
  6. bootbox.setDefaults({ locale: 'ru' });
  7.  
  8. toastr.options = {
  9. 'toastClass' : 'toastr',
  10. "progressBar": true,
  11. "positionClass": "toast-top-full-width"
  12. };
  13.  
  14. $('.markItUp').markItUp(mySettings).on('input', function () {
  15. var maxlength = $(this).attr('maxlength');
  16. var text = $(this).val().replace(/(\r\n|\n|\r)/g, "\r\n");
  17.  
  18. var currentLength = text.length;
  19. var counter = $('.js-textarea-counter');
  20.  
  21. if (currentLength > maxlength) {
  22. counter.addClass('text-danger');
  23. } else {
  24. counter.removeClass('text-danger');
  25. }
  26.  
  27. counter.text(translate.characters_left + ': ' + (maxlength - currentLength));
  28.  
  29. if (currentLength === 0) {
  30. counter.empty();
  31. }
  32. });
  33.  
  34. $('.markItUpHtml').markItUp(myHtmlSettings);
  35.  
  36. $('[data-bs-toggle="tooltip"]').tooltip();
  37. $('[data-bs-toggle="popover"]').popover();
  38.  
  39. // Hide popover poppers anywhere
  40. $('body').on('click', function (e) {
  41. //did not click a popover toggle or popover
  42. if ($(e.target).data('bs-toggle') !== 'popover'
  43. && $(e.target).parents('.popover.in').length === 0) {
  44. $('[data-bs-toggle="popover"]').popover('hide');
  45. }
  46. });
  47.  
  48. // Spoiler
  49. $('.spoiler-title').on('click', function () {
  50. var spoiler = $(this).parent();
  51. spoiler.toggleClass('spoiler-open');
  52. spoiler.find('.spoiler-text:first').slideToggle();
  53. });
  54.  
  55. /* Show news on the main */
  56. $('.news-title').on('click', function () {
  57. $(this).toggleClass('fa-rotate-180');
  58. $(this).nextAll(".news-text:first").slideToggle();
  59. });
  60.  
  61. $('a.gallery').colorbox({
  62. maxWidth: '100%',
  63. maxHeight: '100%',
  64. onComplete : function () {
  65. $(this).colorbox.resize();
  66. }
  67. }).colorbox({
  68. rel: function () {
  69. return $(this).data('group');
  70. },
  71. current: translate.photo_count
  72. });
  73.  
  74. $(window).resize(function () {
  75. $.colorbox.resize();
  76. });
  77.  
  78. $('.colorpicker').on('input', function () {
  79. $('.colorpicker-addon').val(this.value);
  80. });
  81. $('.colorpicker-addon').on('input', function () {
  82. $('.colorpicker').val(this.value);
  83. });
  84.  
  85. /* $('.colorpick').colorpicker({
  86. useAlpha: false,
  87. format: 'hex'
  88. });*/
  89.  
  90. $('.carousel').carousel({
  91. interval: false
  92. });
  93.  
  94. $('.phone').mask('0 000 000-00-00-00');
  95. $('.birthday').mask('00.00.0000');
  96.  
  97. // Scroll up
  98. $(window).scroll(function () {
  99. if ($(this).scrollTop() > 200) {
  100. $('.scrollup').fadeIn();
  101. } else {
  102. $('.scrollup').fadeOut();
  103. }
  104. });
  105.  
  106. $('.scrollup').click(function () {
  107. $("html, body").animate({
  108. scrollTop: 0
  109. }, 600);
  110. return false;
  111. });
  112.  
  113.  
  114. /* if ($('.markItUpEditor').val().length > 0) {
  115. window.onbeforeunload = function() {
  116. return "You're about to end your session, are you sure?";
  117. }
  118. }*/
  119.  
  120. $('.js-messages-block').on('show.bs.dropdown', function () {
  121. getNewMessages();
  122. })
  123. });
  124.  
  125. /* Вывод уведомлений */
  126. notification = function (type, title, message, optionsOverride) {
  127. return toastr[type](message, title, optionsOverride);
  128. };
  129.  
  130. /* Показ формы загрузки файла */
  131. showAttachForm = function () {
  132. $('.js-attach-button').hide();
  133. $('.js-attach-form').slideDown();
  134.  
  135. return false;
  136. };
  137.  
  138. /* Переход к форме ввода */
  139. postJump = function () {
  140. $('html, body').animate({
  141. scrollTop: ($('.section-form').offset().top)
  142. }, 500);
  143. };
  144.  
  145. /* Ответ на сообщение */
  146. postReply = function (el) {
  147. postJump();
  148.  
  149. var field = $('.markItUpEditor');
  150. var post = $(el).closest('.section');
  151. var author = post.find('.section-author').data('login');
  152.  
  153. var $lastSymbol = field.val().slice(field.val().length - 1);
  154. var separ = $.inArray($lastSymbol, ['', '\n']) !== -1 ? '' : '\n';
  155.  
  156. field.focus().val(field.val() + separ + author + ', ');
  157.  
  158. return false;
  159. };
  160.  
  161. /* Цитирование сообщения */
  162. postQuote = function (el) {
  163. postJump();
  164.  
  165. var field = $('.markItUpEditor');
  166. var post = $(el).closest('.section');
  167. var author = post.find('.section-author').data('login');
  168. var date = post.find('.section-date').text();
  169. var text = post.find('.section-message').clone();
  170. var message = $.trim(text.find('blockquote').remove().end().text());
  171.  
  172. var $lastSymbol = field.val().slice(field.val().length - 1);
  173. var separ = $.inArray($lastSymbol, ['', '\n']) !== -1 ? '' : '\n';
  174.  
  175. if (!message) {
  176. field.focus().val(field.val() + separ + author + ', ');
  177.  
  178. return false;
  179. }
  180.  
  181. field.focus().val(field.val() + separ + '[quote=' + author + ' ' + date + ']' + message + '[/quote]\n');
  182.  
  183. return false;
  184. };
  185.  
  186. /* Выход с сайта */
  187. logout = function (el) {
  188. bootbox.confirm(translate.confirm_logout, function (result) {
  189. if (result) {
  190. window.location = $(el).attr("href");
  191. }
  192. });
  193.  
  194. return false;
  195. };
  196.  
  197. /* Отправка жалобы на спам */
  198. sendComplaint = function (el) {
  199. bootbox.confirm(translate.confirm_complain_submit, function (result) {
  200. if (result) {
  201. $.ajax({
  202. data: {
  203. id: $(el).data('id'),
  204. type: $(el).data('type'),
  205. page: $(el).data('page'),
  206. token: $(el).data('token')
  207. },
  208. dataType: 'json', type: 'post', url: '/ajax/complaint',
  209. success: function (data) {
  210.  
  211. $(el).replaceWith('<i class="fa fa-bell-slash text-muted"></i>');
  212.  
  213. if (data.status === 'error') {
  214. notification('error', data.message);
  215. return false;
  216. }
  217.  
  218. if (data.status === 'success') {
  219. notification('success', translate.complain_submitted);
  220. }
  221. }
  222. });
  223. }
  224. });
  225.  
  226. return false;
  227. };
  228.  
  229. /* Добавление или удаление закладок */
  230. bookmark = function (el) {
  231. $.ajax({
  232. data: {
  233. tid: $(el).data('tid'),
  234. token: $(el).data('token')
  235. },
  236. dataType: 'json', type: 'post', url: '/forums/bookmarks/perform',
  237. success: function (data) {
  238.  
  239. if (data.status === 'error') {
  240. notification('error', data.message);
  241. return false;
  242. }
  243.  
  244. if (data.status === 'added') {
  245. notification('success', data.message);
  246. $(el).text($(el).data('from'));
  247. }
  248.  
  249. if (data.status === 'deleted') {
  250. notification('success', data.message);
  251. $(el).text($(el).data('to'));
  252. }
  253. }
  254. });
  255.  
  256. return false;
  257. };
  258.  
  259. /* Удаление сообщения в форуме */
  260. deletePost = function (el) {
  261. $.ajax({
  262. data: {tid: $(el).data('tid'), token: $(el).data('token')},
  263. dataType: 'json', type: 'post', url: '/forums/active/delete',
  264. success: function (data) {
  265.  
  266. if (data.status === 'error') {
  267. notification('error', data.message);
  268. return false;
  269. }
  270.  
  271. if (data.status === 'success') {
  272. notification('success', translate.message_deleted);
  273. $(el).closest('.section').hide('slow');
  274. }
  275. }
  276. });
  277.  
  278. return false;
  279. };
  280.  
  281. /* Удаление комментариев */
  282. deleteComment = function (el) {
  283. bootbox.confirm(translate.confirm_message_delete, function (result) {
  284. if (result) {
  285. $.ajax({
  286. data: {
  287. id: $(el).data('id'),
  288. rid: $(el).data('rid'),
  289. type: $(el).data('type'),
  290. token: $(el).data('token')
  291. },
  292. dataType: 'json', type: 'post', url: '/ajax/delcomment',
  293. success: function (data) {
  294.  
  295. if (data.status === 'error') {
  296. notification('error', data.message);
  297. return false;
  298. }
  299.  
  300. if (data.status === 'success') {
  301. notification('success', translate.message_deleted);
  302. $(el).closest('.section').hide('slow');
  303. }
  304. }
  305. });
  306. }
  307. });
  308.  
  309. return false;
  310. };
  311.  
  312. /* Изменение рейтинга */
  313. changeRating = function (el) {
  314. $.ajax({
  315. data: {
  316. id: $(el).data('id'),
  317. type: $(el).data('type'),
  318. vote: $(el).data('vote'),
  319. token: $(el).data('token')
  320. },
  321. dataType: 'json',
  322. type: 'post',
  323. url: '/ajax/rating',
  324. success: function (data) {
  325. if (data.status === 'error') {
  326. return false;
  327. }
  328.  
  329. if (data.status === 'success') {
  330. rating = $(el).closest('.js-rating').find('b');
  331.  
  332. $(el).closest('.js-rating').find('a').removeClass('active');
  333.  
  334. if (! data.cancel) {
  335. $(el).addClass('active');
  336. }
  337.  
  338. rating.html($(data.rating));
  339. }
  340. }
  341. });
  342.  
  343. return false;
  344. };
  345.  
  346. /**
  347. * Удаляет запись из истории рейтинга
  348. */
  349. deleteRating = function (el) {
  350. bootbox.confirm(translate.confirm_message_delete, function (result) {
  351. if (result) {
  352. $.ajax({
  353. data: {
  354. id: $(el).data('id'),
  355. token: $(el).data('token')
  356. },
  357. dataType: 'json', type: 'post', url: '/ratings/delete',
  358. success: function (data) {
  359.  
  360. if (data.status === 'error') {
  361. notification('error', data.message);
  362. return false;
  363. }
  364.  
  365. if (data.status === 'success') {
  366. notification('success', translate.record_deleted);
  367. $(el).closest('.section').hide('slow');
  368. }
  369. }
  370. });
  371. }
  372. });
  373.  
  374. return false;
  375. };
  376.  
  377. /**
  378. * Удаляет запись из списка жалоб
  379. */
  380. deleteSpam = function (el) {
  381. $.ajax({
  382. data: {id: $(el).data('id'), token: $(el).data('token')},
  383. dataType: 'json', type: 'post', url: '/admin/spam/delete',
  384. success: function (data) {
  385.  
  386. if (data.status === 'error') {
  387. notification('error', data.message);
  388. return false;
  389. }
  390.  
  391. if (data.status === 'success') {
  392. notification('success', translate.record_deleted);
  393. $(el).closest('.section').hide('slow');
  394. }
  395. }
  396. });
  397.  
  398. return false;
  399. };
  400.  
  401. /**
  402. * Удаляет запись со стены сообщений
  403. */
  404. deleteWall = function (el) {
  405. bootbox.confirm(translate.confirm_message_delete, function (result) {
  406. if (result) {
  407. $.ajax({
  408. data: {id: $(el).data('id'), login: $(el).data('login'), token: $(el).data('token')},
  409. dataType: 'json', type: 'post', url: '/walls/' + $(el).data('login') + '/delete',
  410. success: function (data) {
  411.  
  412. if (data.status === 'error') {
  413. notification('error', data.message);
  414. return false;
  415. }
  416.  
  417. if (data.status === 'success') {
  418. notification('success', translate.record_deleted);
  419. $(el).closest('.section').hide('slow');
  420. }
  421. }
  422. });
  423. }
  424. });
  425.  
  426. return false;
  427. };
  428.  
  429. /* Показ формы создания голосования */
  430. showVoteForm = function () {
  431. $('.js-vote-form').toggle();
  432.  
  433. return false;
  434. };
  435.  
  436. /* Копирует текст в input */
  437. copyToClipboard = function (el) {
  438. var form = $(el).closest('.input-group');
  439. form.find('input').select();
  440.  
  441. form.find('.input-group-text')
  442. .attr('data-bs-original-title', translate.copied)
  443. .tooltip('update')
  444. .tooltip('show');
  445.  
  446. document.execCommand("copy");
  447.  
  448. return false;
  449. };
  450.  
  451. /* Загрузка изображения */
  452. submitFile = function (el) {
  453. var form = new FormData();
  454. form.append('file', el.files[0]);
  455. form.append('id', $(el).data('id'));
  456. form.append('type', $(el).data('type'));
  457. form.append('token', $(el).data('token'));
  458.  
  459. $.ajax({
  460. data: form,
  461. type: 'post',
  462. contentType: false,
  463. processData: false,
  464. dataType: 'json',
  465. url: '/ajax/file/upload',
  466. beforeSend: function () {
  467. $('.js-files').append('<i class="fas fa-spinner fa-spin fa-3x mx-3"></i>');
  468. },
  469. complete: function () {
  470. $('.fa-spinner').remove();
  471. },
  472. success: function (data) {
  473. if (data.status === 'error') {
  474. notification('error', data.message);
  475. return false;
  476. }
  477.  
  478. if (data.status === 'success') {
  479. if (data.type === 'image') {
  480. var template = $('.js-image-template').clone();
  481.  
  482. template.find('img').attr({
  483. 'src' : data.path,
  484. 'data-source' : data.source
  485. });
  486. } else {
  487. var template = $('.js-file-template').clone();
  488.  
  489. template.find('.js-file-link').attr({
  490. 'href' : data.path
  491. }).text(data.name);
  492.  
  493. template.find('.js-file-size').text(data.size);
  494. }
  495.  
  496. template.find('.js-file-delete').attr('data-id', data.id);
  497. $('.js-files').append(template.html());
  498. }
  499. }
  500. });
  501.  
  502. return false;
  503. };
  504.  
  505. /* Загрузка изображения */
  506. submitImage = function (el, paste) {
  507. var form = new FormData();
  508. form.append('file', el.files[0]);
  509. form.append('id', $(el).data('id'));
  510. form.append('type', $(el).data('type'));
  511. form.append('token', $(el).data('token'));
  512.  
  513. $.ajax({
  514. data: form,
  515. type: 'post',
  516. contentType: false,
  517. processData: false,
  518. dataType: 'json',
  519. url: '/ajax/file/upload',
  520. beforeSend: function () {
  521. $('.js-files').append('<i class="fas fa-spinner fa-spin fa-3x mx-3"></i>');
  522. },
  523. complete: function () {
  524. $('.fa-spinner').remove();
  525. },
  526. success: function (data) {
  527. if (data.status === 'error') {
  528. notification('error', data.message);
  529. return false;
  530. }
  531.  
  532. if (data.status === 'success') {
  533. var template = $('.js-image-template').clone();
  534.  
  535. template.find('img').attr({
  536. 'src' : data.path,
  537. 'data-source' : data.source
  538. });
  539.  
  540. template.find('a').attr('data-id', data.id);
  541.  
  542. $('.js-files').append(template.html());
  543.  
  544. if (paste) {
  545. pasteImage(data.source);
  546. }
  547. }
  548. }
  549. });
  550.  
  551. return false;
  552. };
  553.  
  554. /* Вставка изображения в форму */
  555. pasteImage = function (path) {
  556. var field = $('.markItUpEditor');
  557. var caretPos = field[0].selectionStart;
  558. var text = field.val();
  559. var paste = '[img]' + path + '[/img]';
  560.  
  561. field.focus().val(text.substring(0, caretPos) + paste + text.substring(caretPos));
  562. };
  563.  
  564. /* Удаление изображения из формы */
  565. cutImage = function (path) {
  566. var field = $('.markItUpEditor');
  567. var text = field.val();
  568. var cut = '[img]' + path + '[/img]';
  569.  
  570. field.val(text.replace(cut, ''));
  571. };
  572.  
  573. /* Удаление файла */
  574. deleteFile = function (el) {
  575. $.ajax({
  576. data: {
  577. id: $(el).data('id'),
  578. type: $(el).data('type'),
  579. token: $(el).data('token')
  580. },
  581. dataType: 'json',
  582. type: 'post',
  583. url: '/ajax/file/delete',
  584. success: function (data) {
  585. if (data.status === 'error') {
  586. notification('error', data.message);
  587. return false;
  588. }
  589.  
  590. if (data.status === 'success') {
  591. cutImage(data.path);
  592. $(el).closest('.js-file').hide('fast');
  593. }
  594. }
  595. });
  596.  
  597. return false;
  598. };
  599.  
  600. /* Показывает форму для повторной отправки кода подтверждения */
  601. resendingCode = function () {
  602. $('.js-resending-link').hide();
  603. $('.js-resending-form').show();
  604.  
  605. return false;
  606. };
  607.  
  608. /* Показывает панель с запросами */
  609. showQueries = function () {
  610. $('.js-queries').slideToggle();
  611. };
  612.  
  613. /* Get new messages */
  614. getNewMessages = function () {
  615. $.ajax({
  616. dataType: 'json',
  617. type: 'get',
  618. url: '/messages/new',
  619. beforeSend: function () {
  620. $('.js-messages').append('<li class="js-message-spin text-center"><i class="fas fa-spinner fa-spin fa-2x my-2"></i></li>');
  621. },
  622. complete: function () {
  623. $('.js-message-spin').remove();
  624. },
  625. success: function (data) {
  626. if (data.status === 'error') {
  627. return false;
  628. }
  629.  
  630. if (data.status === 'success') {
  631. $('.js-messages-block').find('.js-messages').empty().append(data.dialogues);
  632. }
  633. }
  634. });
  635.  
  636. return false;
  637. };
  638.  
  639. var checkTimeout;
  640. /* Проверка логина */
  641. checkLogin = function (el) {
  642. var message = $(el).closest('.mb-3').find('.invalid-feedback');
  643.  
  644. if ($(el).val().length < 3) {
  645. $(el).removeClass('is-valid is-invalid');
  646. message.empty();
  647.  
  648. return false;
  649. }
  650.  
  651. clearTimeout(checkTimeout);
  652.  
  653. checkTimeout = setTimeout(function () {
  654. $.ajax({
  655. data: {
  656. login: $(el).val()
  657. },
  658. dataType: 'json',
  659. type: 'post',
  660. url: '/check-login',
  661. success: function (data) {
  662. if (data.status === 'success') {
  663. $(el).removeClass('is-invalid').addClass('is-valid');
  664. message.empty();
  665. }
  666.  
  667. if (data.status === 'error') {
  668. $(el).removeClass('is-valid').addClass('is-invalid');
  669. message.text(data.message)
  670. }
  671. }
  672. });
  673. }, 1000);
  674.  
  675. return false;
  676. };