scripts.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. $('body').on('click', '.spoiler', function() {
  2. $(this).find("a").toggle();
  3. $(this).next('div').toggle();
  4. });
  5. $('body').on('click', '.blur', function(e) {
  6. e.stopPropagation();
  7. $(this).prev().toggle();
  8. $(this).toggle();
  9. $(this).next('a').toggle();
  10. });
  11. $('body').on('click', '.toggleblur', function(e) {
  12. e.stopPropagation();
  13. $(this).toggle();
  14. $(this).next('a').next('a').toggle();
  15. $(this).next('a').toggle();
  16. });
  17. $('body').on('click', '#emoji', function(e) {
  18. $(this).closest(".element").find('.picker').toggle();
  19. $('#emojisearch').focus();
  20. });
  21. $('body').on('click', '#contact', function(e) {
  22. $(this).closest(".element").find('.contactpicker').toggle();
  23. $('#contactsearch').focus();
  24. });
  25. $('body').on('click', '.emoji', function(e) {
  26. var code = $(this).attr("title");
  27. console.log(code);
  28. boxtxt = $(this).closest(".element").find("#status").val();
  29. $(this).closest(".element").find("#status").val(boxtxt + ":"+code+":");
  30. });
  31. $('body').on('click', '.contact', function(e) {
  32. var code = $(this).attr("title");
  33. console.log(code);
  34. boxtxt = $(this).closest(".element").find("#status").val();
  35. $(this).closest(".element").find("#status").val(boxtxt + code+" ");
  36. });
  37. $(document).on("change paste keyup","#emojisearch",function () {
  38. var val = $(this).val();
  39. var list = $(this).closest('.element').find('.emojilist');
  40. console.log(val);
  41. $.get("action.php?a=true&emoji=" + val, function(data) {
  42. list.html(data);
  43. });
  44. });
  45. $(document).on("change paste keyup","#contactsearch",function () {
  46. var val = $(this).val();
  47. var list = $(this).closest('.element').find('.contactlist');
  48. console.log(val);
  49. $.get("action.php?a=true&contact=" + val, function(data) {
  50. list.html(data);
  51. });
  52. });
  53. // Open Lightbox
  54. $('body').on('click', '.open-lightbox', function(e) {
  55. e.preventDefault();
  56. e.stopPropagation();
  57. var image = $(this).attr('href');
  58. $('html').addClass('no-scroll');
  59. $('body').append('<div class="lightbox-opened"><img style="max-height:100%; max-width:100%;" src="' + image + '"></div>');
  60. });
  61. // Close Lightbox
  62. $('body').on('click', '.lightbox-opened', function() {
  63. $('html').removeClass('no-scroll');
  64. $('.lightbox-opened').remove();
  65. });
  66. window.addEventListener("scroll", function() {
  67. onScrollDiv()
  68. });
  69. window.addEventListener("DOMContentLoaded", function() {
  70. onScrollDiv()
  71. });
  72. function onScrollDiv() {
  73. var images = document.querySelectorAll('.lazyload');
  74. for (var i = 0, nb = images.length; i < nb; i++) {
  75. var img = images[i]
  76. var rect = img.getBoundingClientRect();
  77. var isVisible = ((rect.top - window.innerHeight) < 500 && (rect.bottom) > -50) ? true : false;
  78. if (isVisible) {
  79. if (!img.src) {
  80. img.src = img.dataset.src;
  81. }
  82. }
  83. }
  84. }
  85. $('body').on('click', '.replies', function(e) {
  86. e.preventDefault;
  87. $(".reply").remove();
  88. $(".element").removeClass("element_pad");
  89. $(this).closest(".element").addClass("element_pad");
  90. /*$('.replies_container').html('');*/
  91. var id = $(this).parent().parent().attr('id');
  92. if($('#' + id+'.replies_container').find('.reply').length < 1){
  93. $('#' + id+'.replies_container').html("<p><img src='img/loading.gif'></p>");
  94. }
  95. $.get("action.php?a=true&replies=" + id, function(data) {
  96. $('#' + id+'.replies_container').html(data);
  97. $('#' + id+'.replies_container').delay(800).fadeIn(400);
  98. $('#a' + id).html('');
  99. $('#' + id+".replies_container .ancestor").appendTo('#a' + id);
  100. });
  101. });
  102. $.fn.isOnScreen = function(){
  103. var win = $(window);
  104. var viewport = {
  105. top : win.scrollTop(),
  106. left : win.scrollLeft()
  107. };
  108. viewport.right = viewport.left + win.width();
  109. viewport.bottom = viewport.top + win.height();
  110. var bounds = this.offset();
  111. bounds.right = bounds.left + this.outerWidth();
  112. bounds.bottom = bounds.top + this.outerHeight();
  113. return (!(viewport.right < bounds.left || viewport.left > bounds.right || viewport.bottom < bounds.top || viewport.top > bounds.bottom));
  114. };
  115. $('body').on('click', '.ldr:not(.tlicon)', function(e) {
  116. $('.tlicon').each(function(a){
  117. $( this ).removeClass('tiselected')
  118. });
  119. });
  120. $('body').on('click', '.ldr', function(e) {
  121. e.preventDefault();
  122. location.hash = "#top";
  123. $('#loader').html('');
  124. $('#loaded').remove();
  125. var url = $(this).attr('href');
  126. var id = $(this).attr('id');
  127. localStorage.setItem("content", $('#content .element').detach());
  128. $('#content').html('<center><div class="loadingImage"></div></center>');
  129. $.get(url + "&ajax=1", function(data) {
  130. $('#content').html(data);
  131. history.pushState({}, "Dashboard FE", url);
  132. var thread = getUrlParameter('thread');
  133. });
  134. });
  135. $('body').on('click', '.gotop a', function(e) {
  136. e.preventDefault();
  137. $('html, body').animate({
  138. scrollTop: 0
  139. }, 800);
  140. return false;
  141. });
  142. $('body').on('click', '.topbar:not(a)', function(e) {
  143. if(e.target !== e.currentTarget) return;
  144. e.preventDefault();
  145. $('html, body').animate({
  146. scrollTop: 0
  147. }, 800);
  148. return false;
  149. });
  150. $('body').on('click', '#loader', function() {
  151. var cnt = $("#loaded").contents();
  152. // $("#content").prepend(cnt);
  153. $('#content').find('.element').first().after(cnt);
  154. $("#loaded").remove();
  155. $("#loader").html('');
  156. });
  157. $('body').on('click', '.listdelete', function() {
  158. var id = $(this).attr('id');
  159. $.get("action.php?listdelete=" + id, function(data) {
  160. $("#"+id).remove();
  161. });
  162. });
  163. $('body').on('click', '.softmutedelete', function() {
  164. var id = $(this).attr('id');
  165. $.get("action.php?softmutedelete=" + id, function(data) {
  166. $("#"+id).remove();
  167. });
  168. });
  169. $('body').on('click', '.listnew', function() {
  170. var name = $(this).prev().val();
  171. $.get("action.php?listnew=" + name, function(data) {
  172. location.reload(true)
  173. });
  174. });
  175. $("li input").keypress(function (e) {
  176. var key = e.which;
  177. if(key == 13) // the enter key code
  178. {
  179. var name = $(this).val();
  180. $.get("action.php?listnew=" + name, function(data) {
  181. location.reload(true)
  182. });
  183. }
  184. });
  185. $('body').on('click', '.nsfw', function() {
  186. var id = $(this).attr('id');
  187. $.get("action.php?a=true&nsfw=" + id, function(data) {
  188. if (data == '1') {
  189. $('#' + id + '.nsfw').toggleClass('nsfw unnsfw');
  190. $('#' + id + '.unnsfw').html('NSFW <span class="fontello">&#xf205;</span>');
  191. }
  192. });
  193. });
  194. $('body').on('click', '.unnsfw', function() {
  195. var id = $(this).attr('id');
  196. $.get("action.php?a=true&nsfw=" + id, function(data) {
  197. if (data == '1') {
  198. $('#' + id + '.unnsfw').toggleClass('unnsfw nsfw');
  199. $('#' + id + '.nsfw').html('NSFW <span class="fontello">&#xf204;</span>');
  200. }
  201. });
  202. });
  203. $('body').on('click', '.block', function() {
  204. var id = $(this).attr('id');
  205. $.get("action.php?a=true&mode=true&block=" + id, function(data) {
  206. $('#' + id + '.block').removeClass('block').addClass('unblock');
  207. $('#' + id + '.unblock').html('Unblock');
  208. });
  209. });
  210. $('body').on('click', '.unblock', function() {
  211. var id = $(this).attr('id');
  212. $.get("action.php?a=true&mode=off&block=" + id, function(data) {
  213. $('#' + id + '.unblock').removeClass('unblock').addClass('block');
  214. $('#' + id + '.block').html('Block');
  215. });
  216. });
  217. $('body').on('click', '.autl', function() {
  218. var id = $(this).attr('id');
  219. var list = $(this).attr('list');
  220. $.get("action.php?a=true&mode=true&user=" + id + "&list=" + list, function(data) {
  221. $('#' + id + '.autl').removeClass('autl').addClass('rutl');
  222. /* $('#' + id + '.rutl li').html('Added'); */
  223. });
  224. });
  225. $('body').on('click', '.rutl', function() {
  226. var elem = $(this);
  227. var id = $(this).attr('id');
  228. var list = $(this).attr('list');
  229. $.get("action.php?a=true&mode=off&user=" + id + "&list=" + list, function(data) {
  230. $('#' + id + '.rutl').removeClass('rutl').addClass('autl');
  231. /* $(elem).find('li').html('Removed');*/
  232. });
  233. });
  234. $('body').on('click', '.hide', function() {
  235. var id = $(this).attr('id');
  236. $.get("action.php?a=true&mode=true&hide=" + id, function(data) {
  237. $('#' + id + '.hide').removeClass('hide').addClass('unhide');
  238. $('#' + id + '.unhide').html('Unhide Thread');
  239. console.log(data);
  240. });
  241. });
  242. $('body').on('click', '.unhide', function() {
  243. var id = $(this).attr('id');
  244. $.get("action.php?a=true&mode=off&hide=" + id, function(data) {
  245. $('#' + id + '.unhide').removeClass('unhide').addClass('hide');
  246. $('#' + id + '.hide').html('Hide Thread');
  247. console.log(data);
  248. });
  249. });
  250. $('body').on('click', '.bookmark', function() {
  251. var id = $(this).attr('id');
  252. $.get("action.php?a=true&mode=true&bookmark=" + id, function(data) {
  253. $('#' + id + '.bookmark').removeClass('bookmark').addClass('unbookmark');
  254. $('#' + id + '.unbookmark').html('Unbookmark');
  255. console.log(data);
  256. });
  257. });
  258. $('body').on('click', '.unbookmark', function() {
  259. var id = $(this).attr('id');
  260. $.get("action.php?a=true&mode=off&bookmark=" + id, function(data) {
  261. $('#' + id + '.unbookmark').removeClass('unbookmark').addClass('bookmark');
  262. $('#' + id + '.bookmark').html('Bookmark');
  263. console.log(data);
  264. });
  265. });
  266. $('body').on('click', '.follow', function() {
  267. var id = $(this).attr('id');
  268. $.get("action.php?a=true&follow=" + id, function(data) {
  269. console.log(data);
  270. if (data == '1') {
  271. $('#' + id + '.follow').removeClass('follow').addClass('unfollow');
  272. $('#' + id + '.unfollow').html('<span class=\'fontello\'></span> Following');
  273. }
  274. });
  275. });
  276. $('body').on('click', '.unfollow', function() {
  277. var id = $(this).attr('id');
  278. $.get("action.php?a=true&unfollow=" + id, function(data) {
  279. if (data == '1') {
  280. $('#' + id + '.unfollow').removeClass('unfollow').addClass('follow');
  281. $('#' + id + '.follow').html('Follow');
  282. }
  283. });
  284. });
  285. $('.container').on('mouseenter', '.user', function(event) {
  286. event.stopPropagation();
  287. event.stopImmediatePropagation();
  288. var id = $(this).attr('id');
  289. console.log(id);
  290. $(this).append("<div class='userinfo' id='" + id + "'><img src='img/loading.gif'></div>");
  291. $('#' + id + '.userinfo').fadeIn();
  292. $.when($.get("action.php?a=true&userinfo=" + id, function(data) {
  293. $('#' + id + '.userinfo').html(data);
  294. })).then(function(){
  295. $('#' + id + '.userinfo').fadeIn();
  296. });
  297. });
  298. $('.container').on('mouseleave', '.user', function(event) {
  299. event.stopPropagation();
  300. event.stopImmediatePropagation();
  301. $(this).find('.userinfo').fadeOut(300, function() { $(this).remove(); });
  302. });
  303. $('.container').on('mouseenter', '.external', function(event) {
  304. event.stopPropagation();
  305. event.stopImmediatePropagation();
  306. var id = $(this).attr('id');
  307. var url = $(this).attr('href');
  308. console.log(url);
  309. $(this).before("<div class='notif previewpost' id='" + id + "'></div>");
  310. $.when($.get("action.php?a=true&previewurl=" + btoa(url), function(data) {
  311. $('#' + id + '.previewpost').html(data);
  312. })).then(function(){
  313. if ($('#' + id + '.previewpost').html() === 'empty'){
  314. return false;
  315. }
  316. $('#' + id + '.previewpost').fadeIn();
  317. });
  318. });
  319. $('.container').on('mouseleave', '.external', function(event) {
  320. event.stopPropagation();
  321. event.stopImmediatePropagation();
  322. $('.container').find('.previewpost').fadeOut(300, function() { $(this).remove(); });
  323. });
  324. $('.container').on('mouseenter', '.preview', function(event) {
  325. event.stopPropagation();
  326. event.stopImmediatePropagation();
  327. var id = $(this).attr('id');
  328. console.log(id);
  329. $(this).before("<div class='notif previewpost' id='" + id + "'></div>");
  330. $.when($.get("action.php?a=true&previewpost=" + id, function(data) {
  331. $('#' + id + '.previewpost').html(data);
  332. })).then(function(){
  333. $('#' + id + '.previewpost').fadeIn();
  334. });
  335. });
  336. $('.container').on('mouseleave', '.preview', function(event) {
  337. event.stopPropagation();
  338. event.stopImmediatePropagation();
  339. $('.container').find('.previewpost').fadeOut(300, function() { $(this).remove(); });
  340. });
  341. var getUrlParameter = function getUrlParameter(sParam) {
  342. var sPageURL = window.location.search.substring(1),
  343. sURLVariables = sPageURL.split('&'),
  344. sParameterName,
  345. i;
  346. for (i = 0; i < sURLVariables.length; i++) {
  347. sParameterName = sURLVariables[i].split('=');
  348. if (sParameterName[0] === sParam) {
  349. return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);
  350. }
  351. }
  352. };
  353. function getMode() {
  354. if (typeof getUrlParameter('user') !== 'undefined') {
  355. console.log('list');
  356. return "&user=" + getUrlParameter('user');
  357. }
  358. if (typeof getUrlParameter('list') !== 'undefined') {
  359. console.log('list');
  360. return "&list=" + getUrlParameter('list');
  361. }
  362. if (typeof getUrlParameter('mode') !== 'undefined') {
  363. console.log('mode');
  364. return "&mode=" + getUrlParameter('mode');
  365. }
  366. if (typeof getUrlParameter('tag') !== 'undefined') {
  367. console.log('tag');
  368. return "&tag=" + getUrlParameter('tag');
  369. }
  370. if (typeof getUrlParameter('search') !== 'undefined') {
  371. console.log('tag');
  372. return "&search=" + getUrlParameter('search');
  373. }
  374. return "&mode=federated";
  375. };
  376. function loadmore(){
  377. var thread = getUrlParameter('thread');
  378. if (typeof thread !== 'undefined') {
  379. return false;
  380. }
  381. if (typeof getUrlParameter('search') !== 'undefined') {
  382. return false;
  383. }
  384. var thread = getUrlParameter('thread');
  385. if (typeof thread === 'undefined') {
  386. var error = $(".error").length;
  387. if (error < 1) {
  388. pageMode = getMode();
  389. var id = $('.post').last().attr('pid');
  390. $('.loadmore').html("<img id='loadinggif' src='img/loading.gif'>")
  391. $.get("index.php?ajax=1&next=" + id + "" + pageMode, function(data) {
  392. $('.loadmore').parent().before(data);
  393. $('.loadmore').html("Load More Posts")
  394. });
  395. }
  396. }
  397. }
  398. $(window).scroll(function() {
  399. if ($(window).scrollTop() >= ($(document).height()-700) - $(window).height()) {
  400. var loadinggif = $('#loadinggif').attr('src');
  401. if (typeof loadinggif === 'undefined') {
  402. loadmore();
  403. }
  404. }
  405. });
  406. $('body').on('click', '.loadmore', function() {
  407. loadmore();
  408. });
  409. function newPosts() {
  410. var url = window.location.href;
  411. var thread = getUrlParameter('thread');
  412. if (typeof thread !== 'undefined') {
  413. return false;
  414. }
  415. var search = getUrlParameter('search');
  416. if (typeof search !== 'undefined') {
  417. return false;
  418. }
  419. var error = $(".error").length;
  420. if (error >= 1) {
  421. return false;
  422. }
  423. var id = $(".post").first().attr('pid');
  424. pageMode = getMode();
  425. if (getUrlParameter('mode') == 'bookmarks') {
  426. return false;
  427. }
  428. var page = getUrlParameter('page');
  429. if (typeof page !== 'undefined') {
  430. return false;
  431. }
  432. $.get("index.php?ajax=1&since=" + id + "" + pageMode, function(data) {
  433. if (window.location.href !== url){
  434. return false;
  435. }
  436. if (data) {
  437. var scroll = $(window).scrollTop();
  438. if (scroll > 1000) {
  439. $('#loader').html("<div class='avatar' style='height:0px;'></div><div class='loader' style='display:table-cell; height:50px; line-height:50px;'><a class='link' style='margin:5px;' href='#'>Load Newer Posts</a></div>");
  440. if ($('#loaded').length) {
  441. $('#loaded').prepend(data);
  442. } else {
  443. $('#loader').after("<div id='loaded' style='display:none'></div>");
  444. $('#loaded').prepend(data);
  445. }
  446. } else {
  447. if ($('#loaded').length) {
  448. $('#loaded').prepend(data);
  449. } else {
  450. $('#content').find('.element').first().after(data);
  451. }
  452. }
  453. }
  454. });
  455. };
  456. window.setInterval(function() {
  457. var timestamp;
  458. $('.postAge').each(function(a){
  459. timestamp = $(this).attr('id');
  460. $(this).html(timeSince(timestamp)+' ago');
  461. });
  462. newPosts();
  463. }, 25000);
  464. function themecheck(name){
  465. if(name.value == "custom"){
  466. $('#customtheme').css("display","block");
  467. }
  468. else{
  469. $('#customtheme').css("display","none");
  470. }
  471. };
  472. function timeSince(date) {
  473. /* https://stackoverflow.com/questions/3177836/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site */
  474. var seconds = Math.floor((new Date() - (date*1000)) / 1000);
  475. var interval = Math.floor(seconds / 31536000);
  476. if (interval >= 1) {
  477. return interval + " year"+(interval > 1 ? "s" : "");
  478. }
  479. interval = Math.floor(seconds / 2592000);
  480. if (interval >= 1) {
  481. return interval + " month"+(interval > 1 ? "s" : "");
  482. }
  483. interval = Math.floor(seconds / 604800);
  484. if (interval >= 1) {
  485. return interval + " week"+(interval > 1 ? "s" : "");
  486. }
  487. interval = Math.floor(seconds / 86400);
  488. if (interval >= 1) {
  489. return interval + " day"+(interval > 1 ? "s" : "");
  490. }
  491. interval = Math.floor(seconds / 3600);
  492. if (interval >= 1) {
  493. return interval + " hour"+(interval > 1 ? "s" : "");
  494. }
  495. interval = Math.floor(seconds / 60);
  496. if (interval >= 1) {
  497. return interval + " minute"+(interval > 1 ? "s" : "");
  498. }
  499. if (interval < 0) {
  500. return " just now";
  501. }
  502. return Math.floor(seconds) + " seconds";
  503. }
  504. function previewHeader(){
  505. const chooseFile = document.getElementById("chooseheader");
  506. const imgPreview = document.getElementById("profileheader");
  507. const files = chooseFile.files[0];
  508. if (files) {
  509. const fileReader = new FileReader();
  510. fileReader.readAsDataURL(files);
  511. fileReader.addEventListener("load", function () {
  512. imgPreview.style.backgroundImage = 'url(' + this.result + ')';
  513. });
  514. }
  515. }
  516. function previewAvatar(){
  517. const chooseFile = document.getElementById("chooseavatar");
  518. const imgPreview = document.getElementById("profileavatar");
  519. const files = chooseFile.files[0];
  520. if (files) {
  521. const fileReader = new FileReader();
  522. fileReader.readAsDataURL(files);
  523. fileReader.addEventListener("load", function () {
  524. imgPreview.style.backgroundImage = 'url(' + this.result + ')';
  525. });
  526. }
  527. }
  528. function dockvideo(elem){
  529. $('#videodock embed').detach();
  530. $(elem).prev().prev().detach().appendTo('#videodock');
  531. $(elem).toggle();
  532. embed1 = $('#videodock embed');
  533. embed1.width(350);
  534. embed1.height(240);
  535. $('#videodock').toggle();
  536. }
  537. function undockvideo(){
  538. $('#videodock embed').detach();
  539. $('#videodock').toggle();
  540. }