chatjs.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  1. <?php
  2. require_once("user.php");
  3. $USER = new User("registration_callback");
  4. $userpic = md5( strtolower( trim( $USER->email ) ) );
  5. header("Content-type: application/javascript");
  6. ?>
  7. var isMobile = false; //initiate as false
  8. var d = new Date();
  9. var timezone = d.getTimezoneOffset();
  10. console.log(timezone)
  11. // device detection
  12. if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|ipad|iris|kindle|Android|Silk|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(navigator.userAgent)
  13. || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(navigator.userAgent.substr(0,4))) isMobile = true;
  14. /*
  15. * JavaScript MD5
  16. * https://github.com/blueimp/JavaScript-MD5
  17. *
  18. * Copyright 2011, Sebastian Tschan
  19. * https://blueimp.net
  20. *
  21. * Licensed under the MIT license:
  22. * https://opensource.org/licenses/MIT
  23. *
  24. * Based on
  25. * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
  26. * Digest Algorithm, as defined in RFC 1321.
  27. * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
  28. * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
  29. * Distributed under the BSD License
  30. * See http://pajhome.org.uk/crypt/md5 for more info.
  31. */
  32. /* global define */
  33. ;(function ($) {
  34. 'use strict'
  35. /*
  36. * Add integers, wrapping at 2^32. This uses 16-bit operations internally
  37. * to work around bugs in some JS interpreters.
  38. */
  39. function safeAdd (x, y) {
  40. var lsw = (x & 0xFFFF) + (y & 0xFFFF)
  41. var msw = (x >> 16) + (y >> 16) + (lsw >> 16)
  42. return (msw << 16) | (lsw & 0xFFFF)
  43. }
  44. /*
  45. * Bitwise rotate a 32-bit number to the left.
  46. */
  47. function bitRotateLeft (num, cnt) {
  48. return (num << cnt) | (num >>> (32 - cnt))
  49. }
  50. /*
  51. * These functions implement the four basic operations the algorithm uses.
  52. */
  53. function md5cmn (q, a, b, x, s, t) {
  54. return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)
  55. }
  56. function md5ff (a, b, c, d, x, s, t) {
  57. return md5cmn((b & c) | ((~b) & d), a, b, x, s, t)
  58. }
  59. function md5gg (a, b, c, d, x, s, t) {
  60. return md5cmn((b & d) | (c & (~d)), a, b, x, s, t)
  61. }
  62. function md5hh (a, b, c, d, x, s, t) {
  63. return md5cmn(b ^ c ^ d, a, b, x, s, t)
  64. }
  65. function md5ii (a, b, c, d, x, s, t) {
  66. return md5cmn(c ^ (b | (~d)), a, b, x, s, t)
  67. }
  68. /*
  69. * Calculate the MD5 of an array of little-endian words, and a bit length.
  70. */
  71. function binlMD5 (x, len) {
  72. /* append padding */
  73. x[len >> 5] |= 0x80 << (len % 32)
  74. x[(((len + 64) >>> 9) << 4) + 14] = len
  75. var i
  76. var olda
  77. var oldb
  78. var oldc
  79. var oldd
  80. var a = 1732584193
  81. var b = -271733879
  82. var c = -1732584194
  83. var d = 271733878
  84. for (i = 0; i < x.length; i += 16) {
  85. olda = a
  86. oldb = b
  87. oldc = c
  88. oldd = d
  89. a = md5ff(a, b, c, d, x[i], 7, -680876936)
  90. d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)
  91. c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)
  92. b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)
  93. a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)
  94. d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)
  95. c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)
  96. b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)
  97. a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)
  98. d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)
  99. c = md5ff(c, d, a, b, x[i + 10], 17, -42063)
  100. b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)
  101. a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)
  102. d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)
  103. c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)
  104. b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)
  105. a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)
  106. d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)
  107. c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)
  108. b = md5gg(b, c, d, a, x[i], 20, -373897302)
  109. a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)
  110. d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)
  111. c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)
  112. b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)
  113. a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)
  114. d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)
  115. c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)
  116. b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)
  117. a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)
  118. d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)
  119. c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)
  120. b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)
  121. a = md5hh(a, b, c, d, x[i + 5], 4, -378558)
  122. d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)
  123. c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)
  124. b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)
  125. a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)
  126. d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)
  127. c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)
  128. b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)
  129. a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)
  130. d = md5hh(d, a, b, c, x[i], 11, -358537222)
  131. c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)
  132. b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)
  133. a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)
  134. d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)
  135. c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)
  136. b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)
  137. a = md5ii(a, b, c, d, x[i], 6, -198630844)
  138. d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)
  139. c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)
  140. b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)
  141. a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)
  142. d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)
  143. c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)
  144. b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)
  145. a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)
  146. d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)
  147. c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)
  148. b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)
  149. a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)
  150. d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)
  151. c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)
  152. b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)
  153. a = safeAdd(a, olda)
  154. b = safeAdd(b, oldb)
  155. c = safeAdd(c, oldc)
  156. d = safeAdd(d, oldd)
  157. }
  158. return [a, b, c, d]
  159. }
  160. /*
  161. * Convert an array of little-endian words to a string
  162. */
  163. function binl2rstr (input) {
  164. var i
  165. var output = ''
  166. var length32 = input.length * 32
  167. for (i = 0; i < length32; i += 8) {
  168. output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF)
  169. }
  170. return output
  171. }
  172. /*
  173. * Convert a raw string to an array of little-endian words
  174. * Characters >255 have their high-byte silently ignored.
  175. */
  176. function rstr2binl (input) {
  177. var i
  178. var output = []
  179. output[(input.length >> 2) - 1] = undefined
  180. for (i = 0; i < output.length; i += 1) {
  181. output[i] = 0
  182. }
  183. var length8 = input.length * 8
  184. for (i = 0; i < length8; i += 8) {
  185. output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32)
  186. }
  187. return output
  188. }
  189. /*
  190. * Calculate the MD5 of a raw string
  191. */
  192. function rstrMD5 (s) {
  193. return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))
  194. }
  195. /*
  196. * Calculate the HMAC-MD5, of a key and some data (raw strings)
  197. */
  198. function rstrHMACMD5 (key, data) {
  199. var i
  200. var bkey = rstr2binl(key)
  201. var ipad = []
  202. var opad = []
  203. var hash
  204. ipad[15] = opad[15] = undefined
  205. if (bkey.length > 16) {
  206. bkey = binlMD5(bkey, key.length * 8)
  207. }
  208. for (i = 0; i < 16; i += 1) {
  209. ipad[i] = bkey[i] ^ 0x36363636
  210. opad[i] = bkey[i] ^ 0x5C5C5C5C
  211. }
  212. hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)
  213. return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))
  214. }
  215. /*
  216. * Convert a raw string to a hex string
  217. */
  218. function rstr2hex (input) {
  219. var hexTab = '0123456789abcdef'
  220. var output = ''
  221. var x
  222. var i
  223. for (i = 0; i < input.length; i += 1) {
  224. x = input.charCodeAt(i)
  225. output += hexTab.charAt((x >>> 4) & 0x0F) +
  226. hexTab.charAt(x & 0x0F)
  227. }
  228. return output
  229. }
  230. /*
  231. * Encode a string as utf-8
  232. */
  233. function str2rstrUTF8 (input) {
  234. return unescape(encodeURIComponent(input))
  235. }
  236. /*
  237. * Take string arguments and return either raw or hex encoded strings
  238. */
  239. function rawMD5 (s) {
  240. return rstrMD5(str2rstrUTF8(s))
  241. }
  242. function hexMD5 (s) {
  243. return rstr2hex(rawMD5(s))
  244. }
  245. function rawHMACMD5 (k, d) {
  246. return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))
  247. }
  248. function hexHMACMD5 (k, d) {
  249. return rstr2hex(rawHMACMD5(k, d))
  250. }
  251. function md5 (string, key, raw) {
  252. if (!key) {
  253. if (!raw) {
  254. return hexMD5(string)
  255. }
  256. return rawMD5(string)
  257. }
  258. if (!raw) {
  259. return hexHMACMD5(key, string)
  260. }
  261. return rawHMACMD5(key, string)
  262. }
  263. if (typeof define === 'function' && define.amd) {
  264. define(function () {
  265. return md5
  266. })
  267. } else if (typeof module === 'object' && module.exports) {
  268. module.exports = md5
  269. } else {
  270. $.md5 = md5
  271. }
  272. }(this));
  273. $(document).ready(function()
  274. {
  275. // init
  276. $(window).focus();
  277. var tabinfocus = true;
  278. $("#chat").hide();
  279. // allowed characters in username
  280. $("#username").keyup(function()
  281. {
  282. var text = $(this).val();
  283. $(this).val(text.replace(/[^a-zA-Z0-9 ]/g, ""));
  284. });
  285. // enter username
  286. var user = "";
  287. user = "<?php echo $USER->username; ?>";
  288. // choose avatar, check username, start chat
  289. var avatar = "";
  290. avatar = "https://www.gravatar.com/avatar/" + md5('<?php echo $USER->email; ?>') + "?d=mm";
  291. startchat();
  292. // start chat
  293. function startchat()
  294. {
  295. // zoom chat to fit viewport
  296. if( $(window).innerWidth() > 630 ) // if not mobile
  297. {
  298. var ratio = $(window).innerHeight() / 660; // browser viewport by chat height
  299. //$("#chat").css("zoom", ratio);
  300. //$("#chat").css("-moz-transform-origin", "0 0");
  301. //$("#chat").css("-moz-transform", "scale(" + ratio + ")");
  302. }
  303. // update favicon to user avatar
  304. //$("#favicon").remove();
  305. //var userfavicon = "<link id=\"favicon\" type=\"image/x-icon\"" +
  306. " rel=\"shortcut icon\" href=\"img/" + avatar + ".ico\">";
  307. //$(userfavicon).appendTo("head");
  308. // start chat
  309. $("#chat").show();
  310. $("#message").focus();
  311. refresh();
  312. }
  313. // allowed characters in message
  314. // log message
  315. $("#message").focus().keypress(function(event)
  316. {
  317. if( event.keyCode === 13 )
  318. {
  319. event.preventDefault();
  320. if( $("#content").is(":visible") )
  321. {
  322. var message = $("#message").val();
  323. message = encodeURIComponent(message);
  324. var data = "messagedata=" + message + "###" + user + "###" + avatar;
  325. $(this).val("");
  326. $.ajax
  327. ({
  328. type: "POST",
  329. url: "chat/logmessage.php",
  330. data: data,
  331. cache: false
  332. });
  333. }
  334. }
  335. });
  336. // log emoticon
  337. $(".emoticonimg").click(function()
  338. {
  339. var emoticonselected = $(this);
  340. emoticonselected.hide();
  341. var emoticonid = $(this).attr("id");
  342. var data = "messagedata=" + "specialchar" + emoticonid + "###" + user + "###" + avatar;
  343. $.ajax
  344. ({
  345. type: "POST",
  346. url: "chat/logmessage.php",
  347. data: data,
  348. cache: false,
  349. success: function(result)
  350. {
  351. emoticonselected.show();
  352. }
  353. });
  354. });
  355. // show upload form
  356. $("#showuploadform").click(function()
  357. {
  358. $("#showuploadform").hide();
  359. $("#showemoticons").show();
  360. $("#uploadform").show();
  361. $("#emoticons").hide();
  362. $("#loadingwrapper").hide();
  363. var r = Math.floor((Math.random() * 14) + 1);
  364. var randomemoticon = "chat/img/emoticon" + r + ".png";
  365. $("#showemoticonsimg").attr("src", randomemoticon);
  366. refresh(); // also use as manual content refresh
  367. });
  368. // upload image
  369. $("#form").submit(function(event)
  370. {
  371. event.preventDefault();
  372. $("#uploadform").hide();
  373. $("#showemoticons").hide();
  374. $("#loadingwrapper").show();
  375. var filedata = $("#uploadimage").prop("files")[0];
  376. var formdata = new FormData();
  377. formdata.append("image", filedata);
  378. var datavars = user + "###" + avatar;
  379. formdata.append("datavars", datavars);
  380. $.ajax
  381. ({
  382. type: "POST",
  383. url: "chat/uploadimage.php",
  384. cache: false,
  385. contentType: false,
  386. processData: false,
  387. data: formdata,
  388. success: function(result)
  389. {
  390. $("#uploadimage").val("");
  391. $("#showuploadform").show();
  392. $("#showemoticons").hide();
  393. $("#uploadform").hide();
  394. $("#loadingwrapper").hide();
  395. $("#content").show();
  396. $("#emoticons").show();
  397. }
  398. });
  399. });
  400. // show emoticons
  401. $("#showemoticons").click(function()
  402. {
  403. $("#showuploadform").show();
  404. $("#showemoticons").hide();
  405. $("#uploadform").hide();
  406. $("#loadingwrapper").hide();
  407. $("#content").show();
  408. $("#emoticons").show();
  409. });
  410. // refresh content
  411. var content = $("#messages");
  412. var newcontent = content.html();
  413. function refresh()
  414. {
  415. setTimeout(function()
  416. {
  417. var data = "user=" + user;
  418. $.ajax
  419. ({
  420. type: "POST",
  421. url: "chat/refreshmessages.php",
  422. data: data,
  423. cache: false,
  424. success: function(result)
  425. {
  426. // check who is still online
  427. var datetoday = new Date();
  428. var timenow = datetoday.getTime() / 1000;
  429. $.ajax
  430. ({
  431. url: "chat/getonline.php",
  432. cache: false,
  433. success: function(result)
  434. {
  435. var onlineusers = JSON.parse(result);
  436. var oldonlineusers = $("#onlineusers").html();
  437. var newonlineusers = '';
  438. var onlinecount = 0;
  439. if( onlineusers.length <= 0 ) // no user typing
  440. {
  441. newonlineusers += "No Users Online";
  442. onlinecount = 0;
  443. }
  444. else
  445. {
  446. if( onlineusers.length >= 1 ) // one user typing
  447. {
  448. jQuery.each( onlineusers, function( i, val ) {
  449. onlinecount++;
  450. var timecheck = val[1];
  451. var status = "";
  452. var color = "";
  453. if( timecheck < timenow - 1800 )
  454. {
  455. status = '<span style="min-height: 14px;margin-top: 10px;" class="pull-right badge badge-danger"> </span>';
  456. color = "red";
  457. }else{
  458. status = '<span style="min-height: 14px;margin-top: 10px;" class="pull-right badge badge-success"> </span>';
  459. color = "blue";
  460. }
  461. if( timecheck < timenow - 3600 )
  462. {
  463. newonlineusers += '';
  464. }else{
  465. newonlineusers += '<div class="member-info"><img style="height:40px" src="'+val[2]+'" alt="admin" class="img-circle"><span class="member-name" style="position: absolute;margin-top: 10px;">'+val[0]+'</span>'+status+'</div>';
  466. i++;
  467. }
  468. $("img[alt^='"+val[0]+"']").each(function()
  469. {
  470. var timestamp = val[1];
  471. // set user offline avatar
  472. if( timestamp < timenow - 1800 )
  473. {
  474. $(this).addClass("offline");
  475. $(this).removeClass("online");
  476. }
  477. else // set user online avatar
  478. {
  479. $(this).addClass("online");
  480. $(this).removeClass("offline");
  481. }
  482. });
  483. });
  484. }
  485. }
  486. if(onlinecount > 9 ){ onlinecount = "9-plus"; }
  487. if(newonlineusers === ''){ newonlineusers = "No Users Online"; onlinecount = 0;}
  488. if( newonlineusers != oldonlineusers )
  489. {
  490. $("#onlineusers").html(newonlineusers);
  491. $("#online-count").attr("class", "mdi mdi-numeric-"+onlinecount+"-box");
  492. }
  493. }
  494. });
  495. // new messages
  496. var newmessages = result.split("###endofmessage###");
  497. for( var i=0; i<newmessages.length; i++ )
  498. {
  499. var message = newmessages[i];
  500. if( message != "" )
  501. {
  502. var messagekeypos = message.indexOf("avatarandtext");
  503. var messagekey = message.substr(messagekeypos + 19, 32);
  504. var contentdom = document.getElementById("messages");
  505. var messagedom = document.getElementById(messagekey);
  506. if( $.contains(contentdom, messagedom) == false )
  507. {
  508. // append new message
  509. content.append(message).promise().done(function()
  510. {
  511. // scroll to bottom
  512. if( newcontent != content.html() )
  513. {
  514. var toscroll = document.getElementById("messages");
  515. toscroll.scrollTop = toscroll.scrollHeight;
  516. $(".box").animate({ scrollTop: $('.box').prop("scrollHeight")}, 0);
  517. newcontent = content.html();
  518. }
  519. // new message tab alert
  520. var userwriting = user + "writing";
  521. if( message.lastIndexOf(userwriting) == -1 )
  522. {
  523. if ($('.chat-box').hasClass('email-active')){
  524. console.log("supress message");
  525. }else{
  526. newmessagealert(message);
  527. }
  528. }
  529. // refresh eventlisteners of messages to set likes
  530. $(".messagelike").unbind().click(function()
  531. {
  532. if( this.innerHTML.indexOf("target=") == -1 &&
  533. this.innerHTML.indexOf("_blank") == -1 )
  534. {
  535. likemessage(this.id);
  536. }
  537. });
  538. });
  539. }
  540. }
  541. }
  542. // get and show likes
  543. $.ajax
  544. ({
  545. url: "chat/getlikes.php",
  546. cache: false,
  547. success: function(result)
  548. {
  549. var likesandunlikes = result.split("#");
  550. var likedmessages = likesandunlikes[0];
  551. var unlikedmessages = likesandunlikes[1];
  552. var likes = JSON.parse(likedmessages);
  553. var unlikes = JSON.parse(unlikedmessages);
  554. for( var i=0; i<likes.length; i++ )
  555. {
  556. var likeid = "#like" + likes[i];
  557. $(likeid).show();
  558. }
  559. for( var i=0; i<unlikes.length; i++ )
  560. {
  561. var unlikeid = "#like" + unlikes[i];
  562. $(unlikeid).hide();
  563. }
  564. }
  565. });
  566. // hide intro
  567. if( result != "" )
  568. {
  569. $("#intro").hide();
  570. }
  571. // loop
  572. refresh();
  573. }
  574. });
  575. // update if current user is typing
  576. if( $("#message").val() != "" )
  577. {
  578. istyping(user, 1);
  579. }
  580. else if( $("#message").val() == "" )
  581. {
  582. istyping(user, 0);
  583. }
  584. }, 500);
  585. }
  586. // tab focus
  587. window.onload = function()
  588. {
  589. tabinfocus = true;
  590. console.log("chat started");
  591. setTimeout(function() {
  592. if ($('.chat-box').hasClass('email-active')){
  593. tabinfocus = true;
  594. $(".mdi-forum").removeClass("tada loop-animation new-message");//SET MESSAGE TO ZERO
  595. console.log("in focus");
  596. }else{
  597. tabinfocus = false;
  598. console.log("not in focus");
  599. }
  600. }, 5000);
  601. };
  602. window.onfocus = function()
  603. {
  604. if ($('.chat-box').hasClass('email-active')){
  605. tabinfocus = true;
  606. $(".mdi-forum").removeClass("tada loop-animation new-message");//SET MESSAGE TO ZERO
  607. console.log("in focus");
  608. }else{
  609. tabinfocus = false;
  610. console.log("not in focus");
  611. }
  612. };
  613. window.onblur = function()
  614. {
  615. tabinfocus = false;
  616. console.log("not in focus");
  617. };
  618. // new message tab alert
  619. function newmessagealert(message)
  620. {
  621. if( !tabinfocus )
  622. {
  623. i = parseInt(parent.document.title);
  624. if(isNaN(i)){
  625. i = 1;
  626. }else{
  627. i++
  628. }
  629. console.log("new message");
  630. $(".mdi-forum").addClass("tada loop-animation new-message");
  631. var $jQueryObject = $($.parseHTML(message));
  632. var alertMessage = $jQueryObject.find(".chat-body").html();
  633. var alertUsername = $jQueryObject.find("h4[class^='pull-left zero-m']").html();
  634. var alertIcon = $jQueryObject.find("img").attr("src");;
  635. if(isMobile === false){
  636. parent.Push.create(alertUsername, {
  637. body: alertMessage,
  638. icon: alertIcon,
  639. timeout: 4000,
  640. onClick: function () {
  641. window.parent.focus();
  642. this.close();
  643. }
  644. });
  645. }
  646. // sound
  647. var audio = $("#tabalert")[0];
  648. audio.play();
  649. }
  650. }
  651. // like message
  652. function likemessage(messageid)
  653. {
  654. var data = "messageid=" + messageid;
  655. $.ajax
  656. ({
  657. type: "POST",
  658. url: "chat/setlike.php",
  659. data: data,
  660. cache: false
  661. });
  662. }
  663. // update which users are typing
  664. function istyping(u, t)
  665. {
  666. // set typing user
  667. var data = "datavars=" + u + "###" + t;
  668. $.ajax
  669. ({
  670. type: "POST",
  671. url: "chat/settyping.php",
  672. data: data,
  673. cache: false,
  674. success: function(result)
  675. {
  676. // get typing users
  677. $.ajax
  678. ({
  679. url: "chat/gettyping.php",
  680. cache: false,
  681. success: function(result)
  682. {
  683. var typingusers = JSON.parse(result);
  684. if( typingusers.length == 0 ) // no user typing
  685. {
  686. $("#istyping").html("");
  687. }
  688. else
  689. { //$("#istyping").html("<li class=\"chat-inverted\"><img src=\"images/ellipsis.png\" class=\"dont img-circle user-avatar online\" alt=\"user\"><div class=\"chat-panel red-bg\"><div class=\"chat-body\">" + typingusers[0] + "...</div></div></li>");
  690. if( typingusers.length == 1 ) // one user typing
  691. {
  692. $("#istyping").html(typingusers[0] + " is typing...");
  693. //$(".box").animate({ scrollTop: $('.box').prop("scrollHeight")}, 0);
  694. }
  695. else if( typingusers.length == 2 ) // two users typing
  696. {
  697. var whoistyping = typingusers[0] +
  698. " and " + typingusers[1] +
  699. " are typing...";
  700. $("#istyping").html(whoistyping);
  701. //$(".box").animate({ scrollTop: $('.box').prop("scrollHeight")}, 0);
  702. }
  703. else if( typingusers.length > 2 ) // more than two users typing
  704. {
  705. var whoistyping = typingusers[0] +
  706. " and " + typingusers[1] +
  707. " and others are typing...";
  708. $("#istyping").html(whoistyping);
  709. //$(".box").animate({ scrollTop: $('.box').prop("scrollHeight")}, 0);
  710. }
  711. }
  712. }
  713. });
  714. }
  715. });
  716. }
  717. });