Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Файл - emoji.js (Старый размер - 31524 | Новый - 0):
- 0. - if (!window.Emoji) {
- 1. - var Emoji = {
- 2. -
- 3. - opts: {},
- 4. - last: 0,
- 5. - shownId: false,
- 6. -
- 7. - init: function(txt, opts) {
- 8. - var optId = Emoji.last;
- 9. - opts.txt = txt;
- 10. - if (opts.forceTxt) {
- 11. - opts.editable = 0;
- 12. - placeholderSetup(txt);
- 13. - } else {
- 14. - opts.editable = 1;
- 15. - setTimeout(function() {
- 16. - placeholderSetup(txt, {editable: 1, editableFocus: Emoji.editableFocus});
- 17. - if (opts.shouldFocus) {
- 18. - Emoji.editableFocus(txt, false, true);
- 19. - }
- 20. - }, 0);
- 21. - if (browser.mozilla) {
- 22. - document.execCommand("enableObjectResizing", false, false);
- 23. - cur.destroy.push(function() {
- 24. - document.execCommand("enableObjectResizing", false, true);
- 25. - })
- 26. - }
- 27. - addEvent(txt, browser.opera ? 'click' : 'mousedown', function(e) {
- 28. - if (e.target && e.target.tagName == 'IMG') {
- 29. - if (Emoji.getCode(e.target)) {
- 30. - Emoji.editableFocus(txt, e.target, e.offsetX > 8);
- 31. - return cancelEvent(e);
- 32. - }
- 33. - }
- 34. - opts.emojiFocused = false;
- 35. - });
- 36. -
- 37. - addEvent(txt, 'keypress keydown keyup paste', function(e) {
- 38. - if (e.type == 'keydown') {
- 39. - if (e.keyCode == KEY.RETURN || e.keyCode == 10) {
- 40. - if ((cur.ctrl_submit || opts.noEnterSend) && (e.ctrlKey || browser.mac && e.metaKey) ||
- 41. - !(cur.ctrl_submit || opts.noEnterSend) && !e.shiftKey && !(e.ctrlKey || browser.mac && e.metaKey)) {
- 42. - if (!Emoji.emojiEnter(optId, e)) {
- 43. - return false;
- 44. - }
- 45. - //if (!opts.noEnterSend) {
- 46. - opts.onSend();
- 47. - return cancelEvent(e);
- 48. - //}
- 49. - }
- 50. - }
- 51. - if (e.ctrlKey && e.keyCode == KEY.RETURN) {
- 52. - var val = this.value;
- 53. - if (opts.editable) {
- 54. - Emoji.insertHTML('<div><br/></div>');
- 55. - } else {
- 56. - if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") {
- 57. - var start = this.selectionStart;
- 58. - this.value = val.slice(0, start) + "\n" + val.slice(this.selectionEnd);
- 59. - this.selectionStart = this.selectionEnd = start + 1;
- 60. - } else if (document.selection && document.selection.createRange) {
- 61. - this.focus();
- 62. - var range = document.selection.createRange();
- 63. - range.text = "\r\n";
- 64. - range.collapse(false);
- 65. - if (browser.opera) {
- 66. - range.moveEnd('character', 0);
- 67. - range.moveStart('character', 0);
- 68. - }
- 69. - range.select();
- 70. - }
- 71. - txt.autosize.update();
- 72. - setTimeout(function () {
- 73. - txt.autosize.update();
- 74. - }, 0);
- 75. - }
- 76. - return false;
- 77. - }
- 78. - if (e.keyCode == KEY.TAB && !(e.ctrlKey || browser.mac && e.metaKey)) {
- 79. - if (Emoji.shown) {
- 80. - Emoji.editableFocus(txt, false, true);
- 81. - Emoji.ttClick(optId, geByClass1('emoji_smile', opts.controlsCont), true);
- 82. - } else {
- 83. - Emoji.ttClick(optId, geByClass1('emoji_smile', opts.controlsCont), false, true);
- 84. - }
- 85. - return cancelEvent(e);
- 86. - }
- 87. - if (e.keyCode == KEY.ESC) {
- 88. - if (Emoji.shown) {
- 89. - Emoji.editableFocus(txt, false, true);
- 90. - Emoji.ttClick(optId, geByClass1('emoji_smile', opts.controlsCont), true);
- 91. - return cancelEvent(e);
- 92. - }
- 93. - }
- 94. - }
- 95. -
- 96. - if (e.type == 'paste') {
- 97. - Emoji.onEditablePaste(txt, opts, optId);
- 98. - } else if (cur.editable && e.type == 'keyup') {
- 99. - if (opts.checkEditable) {
- 100. - opts.checkEditable(optId, txt);
- 101. - }
- 102. - }
- 103. - if (opts.onKeyAction) {
- 104. - opts.onKeyAction(e);
- 105. - }
- 106. - return true;
- 107. - });
- 108. - }
- 109. -
- 110. -
- 111. - Emoji.opts[Emoji.last] = opts;
- 112. - return Emoji.last++;
- 113. - },
- 114. -
- 115. - onEditablePaste: function(txt, opts, optId) {
- 116. - var range = (browser.chrome || browser.safari || (browser.msie && browser.version > 10)) ? Emoji.getRange() : false;
- 117. - if (range) {
- 118. - var textarea = ce('TEXTAREA', {className: 'emoji_tmp_textarea'});
- 119. - txt.parentNode.appendChild(textarea);
- 120. - textarea.focus();
- 121. - }
- 122. - setTimeout(function(){
- 123. - if (range) {
- 124. - Emoji.setRange(range);
- 125. - var text = val(textarea);
- 126. - re(textarea);
- 127. - if (text) {
- 128. - Emoji.insertHTML(clean(text).replace(/\n/g, '<br/>'));
- 129. - }
- 130. - }
- 131. - Emoji.cleanCont(txt);
- 132. - }, 0);
- 133. - },
- 134. -
- 135. - cleanCont: function(cont) {
- 136. - var el = cont.firstChild;
- 137. - while (el) {
- 138. - var next = el.nextSibling;
- 139. - switch (el.nodeType) {
- 140. - case 1:
- 141. - if (el.id == 'tmp_paste_cont') break;
- 142. - if (el.tagName == 'DIV' || el.tagName == 'P' || el.tagName == 'SPAN') {
- 143. - el.setAttribute('style', '');
- 144. - el.className = '';
- 145. - el.id = '';
- 146. - Emoji.cleanCont(el);
- 147. - } else if (el.tagName == 'IMG') {
- 148. - if (!Emoji.getCode(el)) {
- 149. - re(el);
- 150. - }
- 151. - } else if (el.tagName != 'BR' ){
- 152. - var text = Emoji.editableVal(el, {saveEmoji: true});
- 153. - var f = cf(clean(text).replace(/\n/g, '<br/>'));
- 154. - var last = f.lastChild;
- 155. - el.parentNode.replaceChild(f, el);
- 156. - //if (last) {
- 157. - // Emoji.editableFocus(cont, last, true);
- 158. - //}
- 159. - }
- 160. - break;
- 161. - }
- 162. - el = next;
- 163. - }
- 164. - },
- 165. -
- 166. - editableFocus: function(editable, obj, after) {
- 167. - if (!editable) {
- 168. - return false;
- 169. - }
- 170. - editable.focus();
- 171. - if (editable.phonfocus) {
- 172. - editable.phonfocus();
- 173. - }
- 174. - if (typeof window.getSelection != 'undefined' && typeof document.createRange != 'undefined') {
- 175. - var sel = window.getSelection();
- 176. - if (browser.opera && !after) {
- 177. - sel.collapse(obj || editable, 0);
- 178. - } else {
- 179. - var range = document.createRange();
- 180. - if (obj) {
- 181. - range.selectNode(obj);
- 182. - } else {
- 183. - range.selectNodeContents(editable);
- 184. - }
- 185. - range.collapse(after ? false : true);
- 186. - var sel = window.getSelection();
- 187. - sel.removeAllRanges();
- 188. - sel.addRange(range);
- 189. - }
- 190. - } else if (typeof document.body.createTextRange != 'undefined') {
- 191. - var textRange = document.body.createTextRange();
- 192. - textRange.moveToElementText(obj || editable);
- 193. - textRange.collapse(after ? false : true);
- 194. - textRange.select();
- 195. - }
- 196. - },
- 197. -
- 198. - getRange: function() {
- 199. - if (window.getSelection) {
- 200. - sel = window.getSelection();
- 201. - if (sel.getRangeAt && sel.rangeCount) {
- 202. - return sel.getRangeAt(0);
- 203. - }
- 204. - } else if (document.selection && document.selection.createRange) {
- 205. - return document.selection.createRange();
- 206. - }
- 207. - return null;
- 208. - },
- 209. -
- 210. - setRange: function(range) {
- 211. - if (window.getSelection) {
- 212. - sel = window.getSelection();
- 213. - sel.removeAllRanges();
- 214. - sel.addRange(range);
- 215. - } else if (document.selection && range.select) {
- 216. - range.select();
- 217. - }
- 218. - },
- 219. -
- 220. - editableVal: function(cont, opts) {
- 221. - if (!cont) return '';
- 222. - if (cont.tagName == 'TEXTAREA') return val(cont);
- 223. - var el = cont.firstChild;
- 224. - var v = '';
- 225. - var contTag = new RegExp('^(DIV|P|LI|OL|TR|TD|BLOCKQUOTE)$');
- 226. - while (el) {
- 227. - switch (el.nodeType) {
- 228. - case 3:
- 229. - var str = el.data.replace(/^\n|\n$/g, ' ').replace(/[\n\xa0]/g, ' ').replace(/[ ]+/g, ' ');
- 230. - v += str;
- 231. - break;
- 232. - case 1:
- 233. - var str = Emoji.editableVal(el);
- 234. - if (el.tagName && el.tagName.match(contTag) && str) {
- 235. - if (str.substr(-1) != '\n') {
- 236. - str += '\n';
- 237. - }
- 238. -
- 239. - var prev = el.previousSibling;
- 240. - while(prev && prev.nodeType == 3 && trim(prev.nodeValue) == '') {
- 241. - prev = prev.previousSibling;
- 242. - }
- 243. - if (prev && !(prev.tagName && prev.tagName.match(contTag))) {
- 244. - str = '\n' + str;
- 245. - }
- 246. -
- 247. - } else if (el.tagName == 'IMG') {
- 248. - var code = Emoji.getCode(el);
- 249. - if (code) {
- 250. - if (opts && opts.saveEmoji) {
- 251. - str += Emoji.getEmojiHTML(code);
- 252. - } else {
- 253. - str += Emoji.codeToChr(code);
- 254. - }
- 255. - }
- 256. - } else if (el.tagName == 'BR') {
- 257. - str += '\n';
- 258. - }
- 259. - v += str;
- 260. - break;
- 261. - }
- 262. - el = el.nextSibling;
- 263. - }
- 264. - return v;
- 265. - },
- 266. -
- 267. - cssEmoji: {
- 268. - 'D83DDE0A': [0, ':-)'], 'D83DDE03': [1, ':-D'], 'D83DDE09': [2, ';-)'], 'D83DDE06': [3, 'xD'], 'D83DDE1C': [4, ';-P'], 'D83DDE0B': [5, ':-p'], 'D83DDE0D': [6, '8-)'], 'D83DDE0E': [7, 'B-)'], 'D83DDE12': [8, ':-('], 'D83DDE0F': [9, ':]'], 'D83DDE14': [10, '3('], 'D83DDE22': [11, ':\'('], 'D83DDE2D': [12, ':_('], 'D83DDE29': [13, ':(('], 'D83DDE28': [14, ':o'], 'D83DDE10': [15, ':|'], 'D83DDE0C': [16, '3-)'], 'D83DDE20': [17, '>('], 'D83DDE21': [18, '>(('], 'D83DDE07': [19, 'O:)'], 'D83DDE30': [20, ';o'], 'D83DDE33': [21, '8|'], 'D83DDE32': [22, '8o'], 'D83DDE37': [23, ':X'], 'D83DDE1A': [24, ':-*'], 'D83DDE08': [25, '}:)'], '2764': [26 , '<3'], 'D83DDC4D': [27, ':like:'], 'D83DDC4E': [28, ':dislike:'], '261D': [29, ':up:'], '270C': [30, ':v:'], 'D83DDC4C': [31, ':ok:']
- 269. - },
- 270. - imgEmoji: {'D83DDE15': 1, 'D83DDE1F': 1, 'D83DDE2E': 1, 'D83DDE34': 1},
- 271. -
- 272. - getEmojiHTML: function(code, symbol, enabled) {
- 273. - var editable = (browser.msie && intval(browser.version) > 8) ? ' contenteditable="false"' : '';
- 274. - if (Emoji.cssEmoji[code] != undefined) {
- 275. - var num = -Emoji.cssEmoji[code][0] * 17;
- 276. - return '<img'+editable+' src="/images/blank.gif" emoji="'+code+'" '+(symbol ? 'alt="'+symbol+'"' : symbol)+' class="emoji_css" style="background-position: 0px '+num+'px;" />';
- 277. - } else {
- 278. - if (!Emoji.imgEmoji[code] && symbol && !enabled) {
- 279. - return symbol;
- 280. - } else {
- 281. - return '<img class="emoji" '+(symbol ? 'alt="'+symbol+'"' : symbol)+' src="/images/emoji'+(window.devicePixelRatio >= 2 ? '_2x' : '')+'/'+code+'.png" />';
- 282. - }
- 283. - }
- 284. - },
- 285. -
- 286. - codeToChr: function(code) {
- 287. - var len = code.length / 4;
- 288. - var chr = '';
- 289. - var i = 0;
- 290. - while(len--) {
- 291. - chr += String.fromCharCode(parseInt(code.substr(i, 4), 16))
- 292. - i += 4;
- 293. - }
- 294. - return chr;
- 295. - },
- 296. -
- 297. - checkEditable: function(optId, obj, options) {
- 298. - var scH = obj.scrollHeight;
- 299. - var opts = Emoji.opts[optId];
- 300. - if (!opts) {
- 301. - return false;
- 302. - }
- 303. - var bl = opts.tt;
- 304. - if (scH > options.height + 10) {
- 305. - if (!opts.isSized) {
- 306. - setStyle(obj, {height: options.height+'px', overflowY: 'auto'});
- 307. - var sm = geByClass1('emoji_smile', opts.controlsCont);
- 308. - var ph = ge('im_upload');
- 309. - var diff = sbWidth();
- 310. - setStyle(sm, vk.rtl ? {left: 1 + diff} : {right: 1 + diff});
- 311. - if (ph) {
- 312. - setStyle(ph.parentNode, vk.rtl ? {left: 1 + diff} : {right: 1 + diff});
- 313. - }
- 314. - if (bl) setStyle(bl, vk.rtl ? {left: (opts.ttDiff || 31) + diff} : {right: (opts.ttDiff || 31) + diff})
- 315. - opts.isSized = true;
- 316. - }
- 317. - } else if (opts.isSized) {
- 318. - setStyle(obj, {height: 'auto', overflowY: 'hidden'});
- 319. - var sm = geByClass1('emoji_smile', opts.controlsCont);
- 320. - var ph = ge('im_upload');
- 321. - setStyle(sm, vk.rtl ? {left: 1} : {right: 1});
- 322. - if (ph) {
- 323. - setStyle(ph.parentNode, vk.rtl ? {left: 1}: {right: 1});
- 324. - }
- 325. - if (bl) setStyle(bl, vk.rtl ? {left: (opts.ttDiff || 31)} : {right: (opts.ttDiff || 31)})
- 326. - opts.isSized = false;
- 327. - }
- 328. - },
- 329. -
- 330. - emojiEnter: function(optId, e) {
- 331. - var opts = Emoji.opts[optId]
- 332. - if (opts.emojiFocused && opts.emojiOvered) {
- 333. - var img = geByTag1('img', opts.emojiOvered);
- 334. - Emoji.addEmoji(optId, Emoji.getCode(img), opts.emojiOvered);
- 335. - opts.emojiFocused = true;
- 336. - Emoji.ttClick(optId, ge((cur.peer == -3) ? 'imw_smile' : 'im_smile'), true);
- 337. - debugLog('canceling');
- 338. - return cancelEvent(e);
- 339. - }
- 340. - return true;
- 341. - },
- 342. -
- 343. - insertHTML: function(html) {
- 344. - if (browser.msie/* && browser.version < 10*/) {
- 345. - if (document.selection) {
- 346. - var r = document.selection.createRange();
- 347. - if (r.pasteHTML) {
- 348. - r.pasteHTML(html);
- 349. - }
- 350. - } else {
- 351. - var r = document.getSelection().getRangeAt(0);
- 352. - var n = document.createElement("span");
- 353. - r.surroundContents(n);
- 354. - n.innerHTML = html;
- 355. - r.collapse(false);
- 356. - }
- 357. - } else {
- 358. - document.execCommand('insertHTML', false, html);
- 359. - }
- 360. - },
- 361. -
- 362. - addEmoji: function(optId, code, obj) {
- 363. - if (optId === false) {
- 364. - return false;
- 365. - }
- 366. - var opts = Emoji.opts[optId];
- 367. - opts.emojiFocused = false;
- 368. - if (opts.editable) {
- 369. - var img = ' '+Emoji.getEmojiHTML(code)+' ';
- 370. - var editable = opts.txt;
- 371. - var sel = window.getSelection ? window.getSelection() : false;
- 372. - if (sel && sel.rangeCount) {
- 373. - r = sel.getRangeAt(0);
- 374. - if (r.commonAncestorContainer) {
- 375. - var rCont = r.commonAncestorContainer;
- 376. - } else {
- 377. - var rCont = r.parentElement ? r.parentElement() : r.item(0);
- 378. - }
- 379. - } else {
- 380. - var rCont = false;
- 381. - }
- 382. - el = rCont;
- 383. - while(el && el != editable) {
- 384. - el = el.parentNode;
- 385. - }
- 386. - var edLast = (editable.lastChild || {});
- 387. - if (browser.mozilla && edLast.tagName == 'BR' && !edLast.previousSibling) {
- 388. - re(editable.lastChild);
- 389. - }
- 390. - if (!el) {
- 391. - Emoji.editableFocus(editable, false, true);
- 392. - }
- 393. - Emoji.insertHTML(img);
- 394. - var emojies = geByClass('emoji', editable);
- 395. - emojies.push.apply(emojies, geByClass('emoji_css', editable));
- 396. - for (i in emojies) {
- 397. - var prev = emojies[i].previousSibling;
- 398. - if (prev && prev.nodeType == 3 && prev.textContent && prev.textContent.charCodeAt(0) == 32) {
- 399. - var p = prev.previousSibling;
- 400. - if (p && p.nodeType == 3 && p.textContent && p.textContent.charCodeAt(p.textContent.length - 1) == 160) {
- 401. - re(prev);
- 402. - }
- 403. - }
- 404. - }
- 405. - if (editable.check) editable.check();
- 406. - } else {
- 407. - var textArea = opts.txt;
- 408. - var val = textArea.value;
- 409. - if (browser.iphone || browser.ipad) {
- 410. - var text = Emoji.codeToChr(code);
- 411. - } else {
- 412. - var text = Emoji.cssEmoji[code][1]+' ';
- 413. - }
- 414. - var endIndex, range;
- 415. - if (textArea.selectionStart != undefined && textArea.selectionEnd != undefined) {
- 416. - endIndex = textArea.selectionEnd;
- 417. - textArea.value = val.slice(0, textArea.selectionStart) + text + val.slice(endIndex);
- 418. - textArea.selectionStart = textArea.selectionEnd = endIndex + text.length;
- 419. - } else if (typeof document.selection != 'undefined' && typeof document.selection.createRange != 'undefined') {
- 420. - textArea.focus();
- 421. - range = document.selection.createRange();
- 422. - range.text = text;
- 423. - range.select();
- 424. - }
- 425. - }
- 426. - if (opts.saveDraft) {
- 427. - opts.saveDraft();
- 428. - }
- 429. - },
- 430. -
- 431. - ttHide: function(optId) {
- 432. - Emoji.ttClick(optId, geByClass1('emoji_smile', Emoji.opts[optId].controlsCont), true);
- 433. - },
- 434. -
- 435. - showShadow: function() {
- 436. - return !(browser.msie && browser.version < 10);
- 437. - },
- 438. -
- 439. - ttClick: function(optId, obj, needHide, needShow, ev) {
- 440. - var opts = Emoji.opts[optId];
- 441. - if (!opts) {
- 442. - return;
- 443. - }
- 444. - if ((needHide && !Emoji.shown) || (needShow && Emoji.shown)) {
- 445. - return;
- 446. - }
- 447. - if (!obj) {
- 448. - obj = Emoji.shown || ge((cur.peer == -3) ? 'imw_smile' : 'im_smile');
- 449. - }
- 450. - if (obj.tt && obj.tt.destroy) {
- 451. - obj.tt.destroy();
- 452. - }
- 453. - if (!opts.tt && opts.sharedTT && opts.sharedTT.emojiTT) {
- 454. - opts.tt = opts.sharedTT.emojiTT;
- 455. - opts.emojiScroll = opts.sharedTT.emojiScroll;
- 456. - opts.allEmojiId = opts.sharedTT.emojiAllId;
- 457. - }
- 458. - var tt = opts.tt;
- 459. - if (!tt) {
- 460. - var pointerStyle = '';
- 461. - if (opts.ttShift) {
- 462. - pointerStyle = ' style="left: '+(95+opts.ttShift)+'px"';
- 463. - }
- 464. - var tt = ce('div', {
- 465. - id: 'emoji_block_'+optId,
- 466. - className: 'emoji_tt_wrap'+(!Emoji.showShadow() ? ' emoji_no_opacity' : ''),
- 467. - innerHTML: '<div class="emoji_pointer"'+pointerStyle+'></div><div class="emoji_expand_shadow"></div><div class="emoji_expand_shadow_top"></div><div class="emoji_list"><div class="emoji_scroll">'+Emoji.ttEmojiList(optId)+'</div></div>'
- 468. - });
- 469. - opts.tt = tt;
- 470. - Emoji.reappendEmoji(optId, tt);
- 471. - Emoji.emojiOver(optId, geByClass1('emoji_scroll', tt).firstChild);
- 472. -
- 473. - if (opts.sharedTT) {
- 474. - debugLog('set tt');
- 475. - opts.sharedTT.emojiTT = tt;
- 476. - }
- 477. - }
- 478. - clearTimeout(opts.ttEmojiHide);
- 479. -
- 480. - if (Emoji.shownId !== false && Emoji.shownId != optId) {
- 481. - Emoji.ttClick(Emoji.shownId, geByClass1('emoji_smile', Emoji.opts[Emoji.shownId].controlsCont), true);
- 482. - }
- 483. - if (Emoji.shown) {
- 484. - var toParams = {marginTop: -128, opacity: 0};
- 485. - if (Emoji.cssAnimation()) {
- 486. - addClass(tt, 'emoji_animation');
- 487. - setStyle(tt, toParams);
- 488. - opts.ttEmojiHide = setTimeout(function() {
- 489. - removeClass(tt, 'emoji_animation');
- 490. - hide(tt);
- 491. - }, 1000);
- 492. - } else {
- 493. - setTimeout(function() {
- 494. - animate(tt, toParams, 200, function() {
- 495. - hide(tt);
- 496. - });
- 497. - }, 10);
- 498. - }
- 499. - Emoji.shown = false;
- 500. - Emoji.shownId = false;
- 501. - opts.emojiFocused = false;
- 502. - cur.onMouseClick = false;
- 503. - removeEvent(document, 'keydown', Emoji.emojiMove);
- 504. - if (cur.peer == -3) {
- 505. - Emoji.anim(obj, 0);
- 506. - } else {
- 507. - addClass(obj, 'emoji_smile_animation');
- 508. - clearTimeout(opts.imSmileAnim);
- 509. - opts.imSmileAnim = setTimeout(removeClass.pbind(obj, 'emoji_smile_animation'), 1000);
- 510. - removeClass(obj, 'emoji_smile_on');
- 511. - }
- 512. - if (opts.onHide) {
- 513. - opts.onHide();
- 514. - }
- 515. - } else {
- 516. - show(tt);
- 517. - var toParams = {marginTop: -118, opacity: 1};
- 518. - if (Emoji.cssAnimation()) {
- 519. - addClass(tt, 'emoji_animation');
- 520. - setTimeout(setStyle.pbind(tt, toParams), 100);
- 521. - } else {
- 522. - setTimeout(function() {
- 523. - show(tt);
- 524. - animate(tt, toParams, 200);
- 525. - }, 10);
- 526. - }
- 527. - Emoji.shownId = optId;
- 528. - Emoji.shown = obj;
- 529. - cur.emojiList = geByClass1('emoji_list', tt);
- 530. - opts.emojiFocused = true;
- 531. - setTimeout(function() {
- 532. - cur.onMouseClick = function(e) {
- 533. - var el = e.target;
- 534. - while(el) {
- 535. - if (el.id == 'im_texts' || hasClass(el, 'emoji_tt_wrap') || hasClass(el, 'imw_emoji_wrap')) {
- 536. - return false;
- 537. - }
- 538. - el = el.parentNode;
- 539. - }
- 540. - Emoji.ttClick(optId, false, true);
- 541. - }
- 542. - addEvent(document, 'keydown', Emoji.emojiMove);
- 543. - }, 0);
- 544. - if (cur.peer == -3) {
- 545. - Emoji.anim(obj, 1);
- 546. - } else {
- 547. - addClass(obj, 'emoji_smile_animation')
- 548. - clearTimeout(opts.imSmileAnim);
- 549. - opts.imSmileAnim = setTimeout(removeClass.pbind(obj, 'emoji_smile_animation'), 1000);
- 550. - addClass(obj, 'emoji_smile_on');
- 551. - }
- 552. - if (opts.emojiScroll && opts.emojiExpanded) {
- 553. - opts.emojiScroll.update(false, true);
- 554. - }
- 555. - if (opts.onShow) {
- 556. - opts.onShow();
- 557. - }
- 558. - }
- 559. - if (!opts.emojiExpanded) {
- 560. - Emoji.emojiExpand(optId, tt);
- 561. - }
- 562. - return cancelEvent(ev);
- 563. - },
- 564. - curEmojiSet: ['D83DDE0A', 'D83DDE03', 'D83DDE09', 'D83DDE06', 'D83DDE1C', 'D83DDE0B', 'D83DDE0D', 'D83DDE0E', 'D83DDE12', 'D83DDE0F', 'D83DDE14', 'D83DDE22', 'D83DDE2D', 'D83DDE29', 'D83DDE28', 'D83DDE10', 'D83DDE0C', 'D83DDE04', 'D83DDE07', 'D83DDE30', 'D83DDE32', 'D83DDE33', 'D83DDE37', 'D83DDE02', '2764', 'D83DDE1A', 'D83DDE15', 'D83DDE2F', 'D83DDE26', 'D83DDE35', 'D83DDE20', 'D83DDE21', 'D83DDE1D', 'D83DDE34', 'D83DDE18', 'D83DDE1F', 'D83DDE2C', 'D83DDE36', 'D83DDE2A', 'D83DDE2B', '263A', 'D83DDE00', 'D83DDE25', 'D83DDE1B', 'D83DDE16', 'D83DDE24', 'D83DDE23', 'D83DDE27', 'D83DDE11', 'D83DDE05', 'D83DDE2E', 'D83DDE1E', 'D83DDE19', 'D83DDE13', 'D83DDE01', 'D83DDE31', 'D83DDE08', 'D83DDC7F', 'D83DDC7D', 'D83DDC4D', 'D83DDC4E', '261D', '270C', 'D83DDC4C', 'D83DDC4F', 'D83DDC4A', '270B', 'D83DDE4F', 'D83DDC43', 'D83DDC46', 'D83DDC47', 'D83DDC48', 'D83DDCAA', 'D83DDC42', 'D83DDC8B', 'D83DDCA9', '2744', 'D83CDF4A', 'D83CDF77', 'D83CDF78', 'D83CDF85', 'D83DDCA6', 'D83DDC7A', 'D83DDC28', 'D83DDD1E', 'D83DDC79', '26BD', '26C5', 'D83CDF1F', 'D83CDF4C', 'D83CDF7A', 'D83CDF7B', 'D83CDF39', 'D83CDF45', 'D83CDF52', 'D83CDF81', 'D83CDF82', 'D83CDF84', 'D83CDFC1', 'D83CDFC6', 'D83DDC0E', 'D83DDC0F', 'D83DDC1C', 'D83DDC2B', 'D83DDC2E', 'D83DDC03', 'D83DDC3B', 'D83DDC3C', 'D83DDC05', 'D83DDC13', 'D83DDC18', 'D83DDC94', 'D83DDCAD', 'D83DDC36', 'D83DDC31', 'D83DDC37', 'D83DDC11', '23F3', '26BE', '26C4', '2600', 'D83CDF3A', 'D83CDF3B', 'D83CDF3C', 'D83CDF3D', 'D83CDF4B', 'D83CDF4D', 'D83CDF4E', 'D83CDF4F', 'D83CDF6D', 'D83CDF37', 'D83CDF38', 'D83CDF46', 'D83CDF49', 'D83CDF50', 'D83CDF51', 'D83CDF53', 'D83CDF54', 'D83CDF55', 'D83CDF56', 'D83CDF57', 'D83CDF69', 'D83CDF83', 'D83CDFAA', 'D83CDFB1', 'D83CDFB2', 'D83CDFB7', 'D83CDFB8', 'D83CDFBE', 'D83CDFC0', 'D83CDFE6', 'D83DDE38'],
- 565. - curEmojiKeys: {},
- 566. - emojiShowMore: function(optId) {
- 567. - debugLog('show emoji more');
- 568. - var opts = Emoji.opts[optId];
- 569. - if (Emoji.allEmojiCodes) {
- 570. - debugLog('show emoji more all', opts.allEmojiId);
- 571. - var code;
- 572. - var shown = 0;
- 573. - var cont = geByClass1('emoji_scroll', opts.tt);
- 574. - var str = '';
- 575. - re('im_emoji_progress');
- 576. - while(code = Emoji.allEmojiCodes[opts.allEmojiId]) {
- 577. - opts.allEmojiId += 1;
- 578. - if (opts.sharedTT) {
- 579. - opts.sharedTT.emojiAllId = opts.allEmojiId;
- 580. - }
- 581. - if (Emoji.curEmojiKeys[code]) {
- 582. - continue;
- 583. - }
- 584. - str += Emoji.emojiWrapItem(optId, code);
- 585. - shown += 1;
- 586. - if (shown > 128) {
- 587. - break;
- 588. - }
- 589. - }
- 590. - if (str) {
- 591. - cont.appendChild(cf(str));
- 592. - opts.emojiScroll.update(false, true)
- 593. - }
- 594. - } else {
- 595. - cur.onEmojiLoad = Emoji.emojiShowMore.pbind(optId);
- 596. - }
- 597. - },
- 598. -
- 599. - emojiLoadMore: function(optId) {
- 600. - var opts = Emoji.opts[optId];
- 601. - debugLog('load more');
- 602. - opts.emojiMoreSt = 1;
- 603. - if (Emoji.allEmojiCodes) {
- 604. - opts.allEmojiId = 0;
- 605. - if (opts.sharedTT) {
- 606. - opts.sharedTT.emojiAllId = 0;
- 607. - }
- 608. - if (cur.onEmojiLoad) {
- 609. - cur.onEmojiLoad();
- 610. - }
- 611. - } else {
- 612. - ajax.post('im', {act: 'get_emoji_list'}, {
- 613. - onDone: function(codes) {
- 614. - opts.allEmojiId = 0;
- 615. - if (opts.sharedTT) {
- 616. - opts.sharedTT.emojiAllId = 0;
- 617. - }
- 618. - Emoji.allEmojiCodes = codes;
- 619. - if (cur.onEmojiLoad) {
- 620. - cur.onEmojiLoad();
- 621. - }
- 622. - }
- 623. - })
- 624. - }
- 625. - },
- 626. -
- 627. - ttEmojiList: function(optId) {
- 628. - var list = [];
- 629. - var ems = Emoji.curEmojiSet;
- 630. - var recent = [];
- 631. - var recentList = {};
- 632. -
- 633. - for (var i in ems) {
- 634. - var code = ems[i];
- 635. - Emoji.curEmojiKeys[code] = 1;
- 636. - var str = Emoji.emojiWrapItem(optId, code, i);
- 637. - list.push(str);
- 638. - }
- 639. - if (recent.length) {
- 640. - list.unshift.apply(list, recent);
- 641. - }
- 642. - var loadingEl = '<div align="center" id="im_emoji_progress"><span class="progress_inline progress_gray"></span></div>';
- 643. -
- 644. - return list.join('')+loadingEl;
- 645. - },
- 646. -
- 647. - emojiWrapItem: function(optId, code, i) {
- 648. - var info = Emoji.cssEmoji[code];
- 649. - if (info) {
- 650. - var titleStr = ' title="'+info[1]+'"';
- 651. - } else {
- 652. - var titleStr = '';
- 653. - }
- 654. - if (browser.mobile) {
- 655. - var overEvent = '';
- 656. - } else {
- 657. - var overEvent = ' onmouseover="return Emoji.emojiOver('+optId+', this);"';
- 658. - }
- 659. - return '<a class="emoji_smile_cont '+((code != '2764' && i && (i < 54)) ? 'emoji_smile_shadow' : '')+'" '+titleStr+' onmousedown="Emoji.addEmoji(Emoji.shownId, \''+code+'\', this); return cancelEvent(event);" onclick="return cancelEvent(event);"'+overEvent+'><div class="emoji_bg"></div><div class="emoji_shadow"></div>'+Emoji.getEmojiHTML(code)+'</a>'
- 660. - },
- 661. -
- 662. - reappendEmoji: function(optId, tt) {
- 663. - var opts = Emoji.opts[optId];
- 664. - if (opts.rceCont) {
- 665. - if (!opts.addMediaBtn) {
- 666. - opts.sendWrap.appendChild(opts.rceCont);
- 667. - } else {
- 668. - opts.sendWrap.insertBefore(opts.rceCont, opts.addMediaBtn);
- 669. - }
- 670. - }
- 671. - if (!tt) return;
- 672. - var controls = opts.controlsCont;
- 673. - var diff = opts.isSized ? sbWidth() : 0;
- 674. -
- 675. - controls.insertBefore(tt, domFC(controls));
- 676. - diff += opts.ttDiff;
- 677. - if (opts.ttShift) {
- 678. - diff += opts.ttShift;
- 679. - }
- 680. - setStyle(tt, vk.rtl ? {left: diff} : {right: diff});
- 681. - clearTimeout(cur.ttEmojiHide);
- 682. - hide(tt);
- 683. - },
- 684. - emojiOver: function(optId, obj) {
- 685. - if (browser.mobile) {
- 686. - return true;
- 687. - }
- 688. - var opts = Emoji.opts[optId]
- 689. - addClass(obj, 'emoji_over');
- 690. - if (opts.emojiOvered && opts.emojiOvered != obj) {
- 691. - removeClass(opts.emojiOvered, 'emoji_over');
- 692. - }
- 693. - opts.emojiOvered = obj;
- 694. - Emoji.emojiOpera(optId);
- 695. - },
- 696. - emojiOpera: function(optId) { // fuck opera!
- 697. - if (browser.opera && !browser.mobile) {
- 698. - var tt = Emoji.opts[optId].tt;
- 699. - animate(tt, {opacity: 0.99}, 20, animate.pbind(tt, {opacity: 1}, 20));
- 700. - }
- 701. - },
- 702. - emojiExpand: function(optId, block) {
- 703. - var opts = Emoji.opts[optId];
- 704. - var list = geByClass1('emoji_list', block);
- 705. - if (Emoji.cssAnimation()) {
- 706. - removeClass(block, 'emoji_animation')
- 707. - }
- 708. - addClass(block, 'emoji_expanded');
- 709. -
- 710. - if (opts.emojiScroll) {
- 711. - opts.emojiScroll.enable()
- 712. - } else {
- 713. - var topShown = false;
- 714. - var bottomShown = false;
- 715. - opts.emojiScroll = new Scrollbar(list, {
- 716. - prefix: 'emoji_',
- 717. - nomargin: true,
- 718. - global: true,
- 719. - nokeys: true,
- 720. - right: vk.rtl ? 'auto' : 10,
- 721. - left: !vk.rtl ? 'auto' : 10,
- 722. - scrollChange: function(top) {
- 723. - if (window.tooltips) {
- 724. - tooltips.destroyAll();
- 725. - cur.ttScrollTime = new Date().getTime();
- 726. - }
- 727. - if (Emoji.showShadow()) {
- 728. - if (top && !topShown) {
- 729. - show(geByClass1('emoji_expand_shadow_top', opts.tt));
- 730. - topShown = true;
- 731. - } else if (!top && topShown) {
- 732. - topShown = false;
- 733. - hide(geByClass1('emoji_expand_shadow_top', opts.tt));
- 734. - }
- 735. - }
- 736. - if (top > 10 && !opts.emojiMoreSt) {
- 737. - Emoji.emojiLoadMore(optId);
- 738. - }
- 739. - Emoji.emojiOpera(optId);
- 740. - },
- 741. - more: Emoji.emojiShowMore.pbind(optId)
- 742. - });
- 743. -
- 744. - if (opts.sharedTT) {
- 745. - opts.sharedTT.emojiScroll = opts.emojiScroll;
- 746. - }
- 747. - }
- 748. - opts.emojiExpanded = true;
- 749. - },
- 750. -
- 751. - emojiMove: function(e) {
- 752. - var optId = Emoji.shownId;
- 753. - var opts = Emoji.opts[optId];
- 754. - if (Emoji.shown && opts.emojiFocused) {
- 755. - var el = opts.emojiOvered;
- 756. - switch (e.keyCode) {
- 757. - case KEY.LEFT:
- 758. - el = el.previousSibling;
- 759. - break;
- 760. - case KEY.RIGHT:
- 761. - el = el.nextSibling;
- 762. - break;
- 763. - case KEY.UP:
- 764. - var i = 9;
- 765. - while (el.previousSibling && --i > 0) {
- 766. - el = el.previousSibling;
- 767. - }
- 768. - if (i > 1) {
- 769. - return cancelEvent(e);
- 770. - }
- 771. - break;
- 772. - case KEY.DOWN:
- 773. - var i = 9;
- 774. - while (el.nextSibling && --i > 0) {
- 775. - el = el.nextSibling;
- 776. - }
- 777. - if (i > 1) {
- 778. - return cancelEvent(e);
- 779. - }
- 780. - break;
- 781. - case KEY.ENTER:
- 782. - return Emoji.emojiEnter(optId, e);
- 783. - break;
- 784. - default:
- 785. - return true;
- 786. - }
- 787. - if (el) {
- 788. - var diff = el.offsetTop - cur.emojiList.scrollTop;
- 789. - if (diff > 72) {
- 790. - animate(cur.emojiList, {scrollTop: cur.emojiList.scrollTop + (diff - 72)}, 80, function() {
- 791. - opts.emojiScroll.update(true, true)
- 792. - });
- 793. - } else if (diff < 0) {
- 794. - animate(cur.emojiList, {scrollTop: cur.emojiList.scrollTop + diff}, 80, function() {
- 795. - opts.emojiScroll.update(true, true)
- 796. - });
- 797. - }
- 798. - Emoji.emojiOver(optId, el);
- 799. - }
- 800. - return cancelEvent(e);
- 801. - }
- 802. - return true;
- 803. - },
- 804. -
- 805. - anim: function(el, to) {
- 806. - clearInterval(cur._imAnim);
- 807. - var dt = 300, dStep = 45 / (dt / 13), oStep = 1 / (dt / 13), steps = Math.floor(dt / 13), i = 0;
- 808. - var el1 = domLC(el), el2 = domFC(el);
- 809. - var dFrom1 = to ? 0 : 45, dTo1 = to ? 45 : 0, oFrom1 = to ? 1 : 0, oTo1 = to ? 0 : 1;
- 810. - cur._imAnim = setInterval(function() {
- 811. - ++i;
- 812. - var d1 = (i >= steps) ? dTo1 : (dFrom1 + dStep * i * (to ? 1 : -1)), d2 = d1 - 45;
- 813. - var o1 = (i >= steps) ? oTo1 : (oFrom1 + oStep * i * (to ? -1 : 1)), o2 = 1 - o1;
- 814. - el1.style.WebkitTransform = el1.style.OTransform = el1.style.transform = 'rotate(' + d1 + 'deg)';
- 815. - el2.style.WebkitTransform = el2.style.OTransform = el2.style.transform = 'rotate(' + d2 + 'deg)';
- 816. - el1.style.opacity = o1;
- 817. - el2.style.opacity = o2;
- 818. - if (i >= steps) {
- 819. - clearInterval(cur._imAnim);
- 820. - (to ? addClass : removeClass)(el, 'emoji_smile_on');
- 821. - el1.style.WebkitTransform = el1.style.OTransform = el1.style.transform = el2.style.WebkitTransform = el2.style.OTransform = el2.style.transform = el1.style.opacity = el2.style.opacity = '';
- 822. - }
- 823. - }, 13);
- 824. - },
- 825. - cssAnimation: function() {
- 826. - var v = intval(browser.version);
- 827. - if ((browser.chrome && v > 14) || (browser.mozilla && v > 13) || (browser.opera && v > 2)) {
- 828. - return (cur.peer != -3);
- 829. - }
- 830. - return false;
- 831. - },
- 832. - ttOver: function(obj) {
- 833. - animate(obj, {opacity: 1}, 200);
- 834. - },
- 835. - ttOut: function(obj) {
- 836. - animate(obj, {opacity: 0.7}, 200);
- 837. - },
- 838. - tplSmile: function(optId, placeholder, classAddr) {
- 839. - return '<div title="'+placeholder+'" class="fl_l emoji_smile'+classAddr+'" onmouseover="Emoji.ttOver(this);" onmouseout="Emoji.ttOut(this);" onmousedown="return Emoji.ttClick('+optId+', this, false, false, event);" onclick="return cancelEvent(event);" style="right: 1px; opacity: 0.7;"><div class="emoji_smile_icon_on"></div><div class="emoji_smile_icon"></div></div>'
- 840. - },
- 841. -
- 842. -
- 843. - emojiToHTML: function(str, replaceSymbols) {
- 844. - if (browser.ipad || browser.iphone) {
- 845. - return str;
- 846. - }
- 847. - str = str.replace(/ /g, ' ').replace(/<br>/g, "\n");
- 848. - var regs = {
- 849. - 'D83DDE07': /(\s|^)([0O�]:\))([\s\.,]|$)/g,
- 850. - 'D83DDE09': /(\s|^)(;-\)+)([\s\.,]|$)/g,
- 851. - 'D83DDE06': /(\s|^)([X�x�]-?D)([\s\.,]|$)/g,
- 852. - 'D83DDE0E': /(\s|^)(B-\))([\s\.,]|$)/g,
- 853. - 'D83DDE0C': /(\s|^)(3-\))([\s\.,]|$)/g,
- 854. - 'D83DDE20': /(\s|^)(>\()([\s\.,]|$)/g,
- 855. - 'D83DDE30': /(\s|^)(;[o�O�])([\s\.,]|$)/g,
- 856. - 'D83DDE33': /(\s|^)(8\|)([\s\.,]|$)/g,
- 857. - 'D83DDE32': /(\s|^)(8-?[o�O�])([\s\.,]|$)/g,
- 858. - 'D83DDE0D': /(\s|^)(8-\))([\s\.,]|$)/g,
- 859. - 'D83DDE37': /(\s|^)(:[X�])([\s\.,]|$)/g,
- 860. - 'D83DDE28': /(\s|^)(:[o�O�])([\s\.,]|$)/g,
- 861. - '2764': /(\s|^)(<3)([\s\.,]|$)/g
- 862. - };
- 863. - for (var code in regs) {
- 864. - str = str.replace(regs[code], function(match, pre, smile, space) {
- 865. - return (pre || '') + Emoji.getEmojiHTML(code)+(space || '');
- 866. - });
- 867. - }
- 868. - var regs = {
- 869. - 'D83DDE0A': /(:-\))([\s\.,]|$)/g,
- 870. - 'D83DDE03': /(:-D)([\s\.,]|$)/g,
- 871. - 'D83DDE1C': /(;-[P�])([\s\.,]|$)/g,
- 872. - 'D83DDE0B': /(:-[p�])([\s\.,]|$)/g,
- 873. - 'D83DDE12': /(:-\()([\s\.,]|$)/g,
- 874. - 'D83DDE0F': /(:-?\])([\s\.,]|$)/g,
- 875. - 'D83DDE14': /(3-?\()([\s\.,]|$)/g,
- 876. - 'D83DDE22': /(:'\()([\s\.,]|$)/g,
- 877. - 'D83DDE2D': /(:_\()([\s\.,]|$)/g,
- 878. - 'D83DDE29': /(:\(\()([\s\.,]|$)/g,
- 879. - //'D83DDE15': /(:\\)([\s\.,]|$)/g,
- 880. - 'D83DDE10': /(:\|)([\s\.,]|$)/g,
- 881. - 'D83DDE21': /(>\(\()([\s\.,]|$)/g,
- 882. - 'D83DDE1A': /(:-\*)([\s\.,]|$)/g,
- 883. - 'D83DDE08': /(\}:\))([\s\.,]|$)/g,
- 884. - 'D83DDC4D': /(:like:)([\s\.,]|$)/g,
- 885. - 'D83DDC4E': /(:dislike:)([\s\.,]|$)/g,
- 886. - '261D': /(:up:)([\s\.,]|$)/g,
- 887. - '270C': /(:v:)([\s\.,]|$)/g,
- 888. - 'D83DDC4C': /(:ok:|:��:)([\s\.,]|$)/g
- 889. - };
- 890. - for (var code in regs) {
- 891. - str = str.replace(regs[code], function(match, smile, space) {
- 892. - return Emoji.getEmojiHTML(code)+(space || '');
- 893. - });
- 894. - }
- 895. -
- 896. - str = str.replace(/\n/g, '<br>');
- 897. - if (replaceSymbols) {
- 898. - str = str.replace(Emoji.emojiRegEx, Emoji.emojiReplace).replace(/\uFE0F/g, '');
- 899. - }
- 900. -
- 901. - return str;
- 902. - },
- 903. -
- 904. - emojiReplace: function(symbol) {
- 905. - var i = 0;
- 906. - var code = '', num;
- 907. - while(num = symbol.charCodeAt(i++)) {
- 908. - if (i == 2 && num == 8419) {
- 909. - code = '003'+symbol.charAt(0)+'20E3';
- 910. - break;
- 911. - }
- 912. - code += num.toString(16);
- 913. - }
- 914. - if (symbol.match(/[\uDDE7-\uDDFA]/)) {
- 915. - if (cur.flagSymbol) {
- 916. - code = cur.flagSymbol + code;
- 917. - cur.flagSymbol = false;
- 918. - } else {
- 919. - cur.flagSymbol = code;
- 920. - return '';
- 921. - }
- 922. - }
- 923. - code = code.toUpperCase();
- 924. - return Emoji.getEmojiHTML(code, symbol, true);
- 925. - },
- 926. -
- 927. - emojiRegEx: /([\uE000-\uF8FF\u270A-\u2764\u2122\u25C0\u25FB-\u25FE\u2615\u263a\u2648-\u2653\u2660-\u2668\u267B\u267F\u2693\u261d\u26A0-\u26FA\u2708]|\uD83C[\uDC00-\uDFFF]|[\u2600\u26C4\u26BE\u23F3\u2764]|\uD83D[\uDC00-\uDFFF]|\uD83C[\uDDE8-\uDDFA]\uD83C[\uDDEA-\uDDFA]|[0-9]\u20e3)/g,
- 928. -
- 929. - getCode: function(obj) {
- 930. - var code = false;
- 931. - if (obj.className == 'emoji') {
- 932. - var m = obj.src.match(/\/([a-zA-Z0-9]+).png/);
- 933. - if (m) {
- 934. - var code = m[1];
- 935. - }
- 936. - } else if (obj.className == 'emoji_css') {
- 937. - var code = obj.getAttribute('emoji');
- 938. - }
- 939. - return code;
- 940. - },
- 941. -
- 942. - __eof: 1}}
- 943. - try{stManager.done('emoji.js');}catch(e){}
- ------
Advertisement
Add Comment
Please, Sign In to add comment