Advertisement
Guest User

Untitled

a guest
Feb 26th, 2016
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.56 KB | None | 0 0
  1. /* DVZ Shoutbox by Tomasz 'Devilshakerz' Mlynski [devilshakerz.com]; Copyright (C) 2014-2015 */
  2.  
  3. var dvz_shoutbox = {
  4.  
  5. // defaults
  6. interval: 5,
  7. antiflood: 0,
  8. maxShouts: 20,
  9. awayTime: 600000,
  10. lazyMode: false,
  11. lazyMargin: 0,
  12. callSign: '@',
  13. lang: [],
  14. status: true,
  15. reversed: false,
  16. callbacks: {
  17. 'toggle': [],
  18. 'update': [],
  19. 'recall': [],
  20. 'entries': [],
  21. 'shout': [],
  22. 'edit': [],
  23. 'delete': [],
  24. 'call': [],
  25. },
  26.  
  27. // runtime
  28. recalling: false,
  29. timeout: false,
  30. holdTimeout: false,
  31. frozen: false,
  32. updating: false,
  33. started: false,
  34. lastSent: 0,
  35. firstId: 0,
  36. lastId: 0,
  37. activity: 0,
  38.  
  39. loop: function (forced) {
  40.  
  41. if (forced == true) {
  42. clearTimeout(dvz_shoutbox.timeout);
  43. } else {
  44.  
  45. if (dvz_shoutbox.isAway()) {
  46. dvz_shoutbox.toggle(false, false);
  47. dvz_shoutbox.frozen = true;
  48. return false;
  49. }
  50.  
  51. if (!dvz_shoutbox.lazyLoad()) {
  52. dvz_shoutbox.frozen = true;
  53. return false;
  54. }
  55.  
  56. if (dvz_shoutbox.status == false) {
  57. dvz_shoutbox.frozen = true;
  58. return false;
  59. }
  60.  
  61. }
  62.  
  63. dvz_shoutbox.update(function(){
  64.  
  65. dvz_shoutbox.started = true;
  66.  
  67. // next request
  68. if (dvz_shoutbox.interval) {
  69. dvz_shoutbox.timeout = setTimeout('dvz_shoutbox.loop()', dvz_shoutbox.interval * 1000);
  70. }
  71.  
  72. });
  73.  
  74.  
  75. },
  76.  
  77. // actions
  78. update: function (callback) {
  79.  
  80. if (dvz_shoutbox.updating) {
  81. return false;
  82. } else {
  83. dvz_shoutbox.updating = true;
  84. }
  85.  
  86. $.get(
  87. 'xmlhttp.php',
  88. { action: 'dvz_sb_get_updates', first: dvz_shoutbox.firstId, last: dvz_shoutbox.lastId },
  89. function(data) {
  90.  
  91. if (dvz_shoutbox.handleErrors(data)) {
  92. return false;
  93. }
  94.  
  95. if (data) {
  96.  
  97. var data = $.parseJSON(data);
  98.  
  99. // new shouts
  100. if (data.html) {
  101.  
  102. // insert new shouts
  103. if (dvz_shoutbox.reversed) {
  104.  
  105. var scrollMax = $('#shoutbox .data').innerHeight() - $('#shoutbox .window').innerHeight(),
  106. scroll = $('#shoutbox .window').scrollTop();
  107.  
  108. $('#shoutbox .data').append( $(data.html).fadeIn(function(){
  109.  
  110. // scroll to bottom again
  111. if (!dvz_shoutbox.started || scroll >= scrollMax) {
  112. $('#shoutbox .window').scrollTop( $('#shoutbox .window')[0].scrollHeight );
  113. }
  114.  
  115. }) );
  116.  
  117. } else {
  118. $('#shoutbox .data').prepend( $(data.html).hide().fadeIn() );
  119. }
  120.  
  121. // remove old shouts to fit the limit
  122. var old = $('#shoutbox .entry').length - dvz_shoutbox.maxShouts;
  123.  
  124. if (old > 0) {
  125. $('#shoutbox .entry:nth'+(dvz_shoutbox.reversed ? '' : '-last')+'-child(-n+'+old+')').remove();
  126. }
  127.  
  128. // mark new shouts
  129. if (dvz_shoutbox.started) {
  130.  
  131. $('#shoutbox .entry').filter(function(){
  132. return parseInt($(this).attr('data-id')) > dvz_shoutbox.lastId && $(this).not('[data-own]').length;
  133. }).addClass('new');
  134.  
  135. setTimeout("$('#shoutbox .entry.new').removeClass('new')", 1000);
  136. }
  137.  
  138. dvz_shoutbox.lastId = data.last;
  139.  
  140. dvz_shoutbox.appendControls();
  141.  
  142. }
  143.  
  144. // sync updates
  145. if (data.sync) {
  146.  
  147. for (var i in data.sync) {
  148.  
  149. var entry = $('#shoutbox .entry[data-id='+i+']');
  150.  
  151. if (data.sync[i] === null) {
  152. entry.fadeOut(function(){
  153. $(this).remove();
  154. });
  155. } else {
  156. entry.children('.text').html(data.sync[i]);
  157. }
  158.  
  159. }
  160.  
  161. }
  162.  
  163. }
  164.  
  165. dvz_shoutbox.updating = false;
  166.  
  167. dvz_shoutbox.runCallbacks('update');
  168.  
  169. if (typeof(callback) == 'function') {
  170. callback();
  171. }
  172.  
  173. }
  174. );
  175.  
  176. },
  177.  
  178. recall: function () {
  179.  
  180. $.get(
  181. 'xmlhttp.php',
  182. { action: 'dvz_sb_recall', first: dvz_shoutbox.firstId },
  183. function(data) {
  184.  
  185. if (dvz_shoutbox.handleErrors(data)) {
  186. return false;
  187. }
  188.  
  189. if (data) {
  190.  
  191. var data = $.parseJSON(data);
  192.  
  193. // insert new shouts
  194. if (dvz_shoutbox.reversed) {
  195. $('#shoutbox .data').prepend( $(data.html) );
  196. } else {
  197. $('#shoutbox .data').append( $(data.html) );
  198. }
  199.  
  200. // extend the limit
  201. dvz_shoutbox.maxShouts = $('#shoutbox .entry').length;
  202.  
  203. dvz_shoutbox.firstId = data.first;
  204.  
  205. dvz_shoutbox.appendControls();
  206.  
  207. if (data.end) {
  208. dvz_shoutbox.recalling = false;
  209. }
  210.  
  211. }
  212.  
  213. dvz_shoutbox.runCallbacks('recall');
  214.  
  215. }
  216. );
  217.  
  218. },
  219.  
  220. shout: function() {
  221.  
  222. var message = $('#shoutbox input.text').val();
  223.  
  224. if ($.trim(message) == '') {
  225. return false;
  226. }
  227.  
  228. if (!dvz_shoutbox.antifloodPass()) {
  229. dvz_shoutbox.handleErrors('A');
  230. return false;
  231. }
  232.  
  233. dvz_shoutbox.toggleForm(false);
  234.  
  235. $.post(
  236. 'xmlhttp.php',
  237. { action: 'dvz_sb_shout', text: message, key: my_post_key },
  238. function(data) {
  239.  
  240. if (!dvz_shoutbox.handleErrors(data)) {
  241.  
  242. dvz_shoutbox.lastSent = Math.floor((new Date).getTime() / 1000);
  243. dvz_shoutbox.clearForm();
  244. dvz_shoutbox.loop(true);
  245.  
  246. dvz_shoutbox.runCallbacks('shout', { message: message });
  247.  
  248. }
  249.  
  250. dvz_shoutbox.toggleForm(true);
  251.  
  252. }
  253. );
  254.  
  255. },
  256.  
  257. edit: function (id) {
  258.  
  259. // text request
  260. $.get(
  261. 'xmlhttp.php',
  262. { action: 'dvz_sb_get', id: id, key: my_post_key },
  263. function(data){
  264.  
  265. if (dvz_shoutbox.handleErrors(data)) {
  266. return false;
  267. }
  268.  
  269. var data = $.parseJSON(data),
  270. newText = prompt('Shout #'+id+':', data.text);
  271.  
  272. if (newText && newText != data.text) {
  273.  
  274. // update request
  275. $.post(
  276. 'xmlhttp.php',
  277. { action: 'dvz_sb_update', text: newText, id: id, key: my_post_key },
  278. function(data) {
  279.  
  280. if (!dvz_shoutbox.handleErrors(data)) {
  281.  
  282. $('#shoutbox .entry[data-id="'+id+'"] .text').html(data);
  283.  
  284. dvz_shoutbox.runCallbacks('edit', { id: id, text: data });
  285.  
  286. }
  287.  
  288. }
  289. );
  290.  
  291. }
  292.  
  293. }
  294. );
  295. },
  296.  
  297. delete: function (id, noConfirm) {
  298.  
  299. if (noConfirm || confirm(dvz_shoutbox.lang[0])) {
  300.  
  301. $.post(
  302. 'xmlhttp.php',
  303. { action: 'dvz_sb_delete', id: id, key: my_post_key },
  304. function(data) {
  305.  
  306. if (!dvz_shoutbox.handleErrors(data)) {
  307.  
  308. $('#shoutbox .entry[data-id="'+id+'"]').fadeOut(function(){ $(this).remove() });
  309.  
  310. dvz_shoutbox.runCallbacks('delete', { id: id });
  311.  
  312. }
  313.  
  314. }
  315. );
  316.  
  317. }
  318.  
  319. },
  320.  
  321. // functionality
  322. toggle: function (status, remember) {
  323.  
  324. if (status == true) {
  325.  
  326. dvz_shoutbox.status = true;
  327.  
  328. $('#shoutbox').removeClass('collapsed');
  329. $('#shoutbox .body').fadeIn();
  330.  
  331. if (dvz_shoutbox.frozen || !dvz_shoutbox.started) {
  332. dvz_shoutbox.frozen = false;
  333. dvz_shoutbox.loop();
  334. }
  335.  
  336. } else {
  337.  
  338. dvz_shoutbox.status = false;
  339.  
  340. $('#shoutbox .body').stop(1).fadeOut(function(){
  341. if (dvz_shoutbox.status == false) $('#shoutbox').stop(1).addClass('collapsed');
  342. });
  343.  
  344. }
  345.  
  346. if (remember !== false) {
  347. document.cookie = cookiePrefix+'dvz_sb_status='+(+status)+'; path='+cookiePath+'; max-age=31536000';
  348. }
  349.  
  350. dvz_shoutbox.runCallbacks('toggle', { status: status });
  351.  
  352. },
  353.  
  354. // core
  355. antifloodPass: function() {
  356. var time = Math.floor((new Date).getTime() / 1000);
  357. return (time - dvz_shoutbox.lastSent) >= dvz_shoutbox.antiflood;
  358. },
  359.  
  360. updateActivity: function () {
  361. dvz_shoutbox.activity = (new Date).getTime();
  362. },
  363.  
  364. isAway: function () {
  365. if (!dvz_shoutbox.awayTime) return false;
  366. return (new Date).getTime() - dvz_shoutbox.activity > dvz_shoutbox.awayTime;
  367. },
  368.  
  369. onDisplay: function () {
  370. var viewTop = $(document).scrollTop(),
  371. viewBottom = viewTop + $(window).height(),
  372. elementTop = $('#shoutbox').offset().top,
  373. elementBottom = elementTop + $('#shoutbox').height();
  374.  
  375. return elementBottom >= (viewTop - dvz_shoutbox.lazyMargin) && elementTop <= (viewBottom + dvz_shoutbox.lazyMargin);
  376. },
  377.  
  378. checkVisibility: function () {
  379. if (dvz_shoutbox.frozen && dvz_shoutbox.onDisplay()) {
  380. dvz_shoutbox.frozen = false;
  381. dvz_shoutbox.loop();
  382. }
  383. },
  384.  
  385. lazyLoad: function () {
  386. if (dvz_shoutbox.lazyMode && !dvz_shoutbox.onDisplay()) {
  387. if (
  388. dvz_shoutbox.lazyMode == 'start' && !dvz_shoutbox.started ||
  389. dvz_shoutbox.lazyMode == 'always'
  390. ) {
  391. return false;
  392. }
  393. }
  394.  
  395. return true;
  396. },
  397.  
  398. handleErrors: function (response) {
  399. if (response == 'A') {
  400. alert(dvz_shoutbox.lang[1]);
  401. return true;
  402. } else
  403. if (response == 'P') {
  404. alert(dvz_shoutbox.lang[2]);
  405. return true;
  406. }
  407. if (response == 'S') {
  408. dvz_shoutbox.toggle(false);
  409. return true;
  410. }
  411.  
  412. return false;
  413. },
  414.  
  415. runCallbacks: function (name, data) {
  416. if (dvz_shoutbox.callbacks[name]) {
  417. for (var i in dvz_shoutbox.callbacks[name]) {
  418. dvz_shoutbox.callbacks[name][i](data);
  419. }
  420. }
  421. },
  422.  
  423. // visual
  424. call: function (username) {
  425.  
  426. var $input = $('#shoutbox input.text'),
  427. words = $input.val().split(' '),
  428. appendix = username;
  429.  
  430. // enclose in quotes if needed
  431. if (username.match( /["'`\.:\-+=~@#$%^*!?()\[\]{}\s]+/g )) {
  432.  
  433. var quotes = ['"', "'", '`'];
  434.  
  435. for (var i in quotes) {
  436. if (username.indexOf(quotes[i]) == -1) {
  437. appendix = quotes[i] + username + quotes[i];
  438. break;
  439. }
  440. }
  441.  
  442. }
  443.  
  444. // add a call sign
  445. appendix = dvz_shoutbox.callSign + appendix;
  446.  
  447. // add a leading space if suitable
  448. if ($input.val() != '' && $input.val().slice(-1) != ' ') {
  449. appendix = ' ' + appendix;
  450. }
  451.  
  452. // add a trailing space if suitable
  453. for (var i in words) {
  454. if (words[i] != '' && words[i].slice(0,1) != dvz_shoutbox.callSign) {
  455. break;
  456. }
  457. if (i == words.length-1) {
  458. appendix = appendix + ' ';
  459. }
  460. }
  461.  
  462. $('#shoutbox input.text').focus();
  463. $('#shoutbox input.text').val($input.val() + appendix);
  464. $('#shoutbox input.text').focus();
  465.  
  466. dvz_shoutbox.runCallbacks('call', { username: username });
  467.  
  468. },
  469.  
  470. toggleForm: function (status) {
  471. if (status == false) {
  472. $("#shoutbox input.text").attr('disabled', 'disabled');
  473. } else {
  474. $("#shoutbox input.text").removeAttr('disabled');
  475. $("#shoutbox input.text").focus();
  476. }
  477. },
  478.  
  479. clearForm: function () {
  480. $('#shoutbox input.text').val('');
  481. },
  482.  
  483. appendControls: function () {
  484. dvz_shoutbox.runCallbacks('entries');
  485.  
  486. $('#shoutbox .entry:not([parsed])').each(function(){
  487.  
  488. if (typeof $(this).attr('data-mod') !== 'undefined') {
  489. $(this).children('.info').prepend('<a href="" class="mod edit">E</a><a href="" class="mod del">X</a>');
  490. }
  491.  
  492. $(this).attr('parsed', '');
  493.  
  494. });
  495. },
  496.  
  497. };
  498.  
  499. $(document).on('click', '#shoutbox .head', function() {
  500. dvz_shoutbox.toggle(!dvz_shoutbox.status);
  501. });
  502. $(document).on('click', '#shoutbox .head a', function(e){
  503. e.stopPropagation();
  504. });
  505. $(document).on('click', '#shoutbox .entry .avatar', function() {
  506. dvz_shoutbox.call( $(this).parents('.entry').attr('data-username') );
  507. return false;
  508. });
  509. $(document).on('click', '#shoutbox .entry .mod.edit', function() {
  510. dvz_shoutbox.edit( $(this).parents('.entry').attr('data-id') );
  511. return false;
  512. });
  513. $(document).on('mousedown', '#shoutbox .entry[data-mod] .text', function() {
  514. dvz_shoutbox.holdTimeout = setTimeout($.proxy(function() {
  515. dvz_shoutbox.edit( $(this).parents('.entry').attr('data-id') );
  516. }, this), 500);
  517.  
  518. }).bind('mouseup mouseleave', function() {
  519. clearTimeout(dvz_shoutbox.holdTimeout);
  520. });
  521. $(document).on('click', function(e) {
  522. if (e.which == 2 && $(e.target).is('#shoutbox .entry .mod.del')) {
  523. dvz_shoutbox.delete( $(e.target).parents('.entry').attr('data-id'), true );
  524. e.preventDefault();
  525. }
  526. });
  527.  
  528. $(document).on('click', '#shoutbox .entry .mod.del', function() {
  529. dvz_shoutbox.delete( $(this).parents('.entry').attr('data-id') );
  530. return false;
  531. });
  532. $('#shoutbox .window').scroll(function() {
  533. if (dvz_shoutbox.recalling && $('#shoutbox .entry').length == dvz_shoutbox.maxShouts) {
  534.  
  535. var scrollMax = $('#shoutbox .data').innerHeight() - $('#shoutbox .window').innerHeight(),
  536. scroll = $('#shoutbox .window').scrollTop();
  537.  
  538. if (
  539. !dvz_shoutbox.reversed && scroll >= scrollMax ||
  540. dvz_shoutbox.reversed && scroll == 0
  541. ) {
  542. dvz_shoutbox.recall();
  543. }
  544. }
  545. });
  546. $(document).on('submit', '#shoutbox .panel form', function() {
  547. dvz_shoutbox.shout();
  548. return false;
  549. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement