M4V Script

Extend all emoticons to quick reply form, quick quote(s), quick capture post, max zoom, custom resize image

  1. // ==UserScript==
  2. // @name M4V Script
  3. // @namespace https://m4v.me/748
  4. // @description Extend all emoticons to quick reply form, quick quote(s), quick capture post, max zoom, custom resize image
  5. // @author theheroofvn
  6. // @include https://m4v.me/*
  7. // @require http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
  8. // @require http://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js
  9. // @require http://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js
  10. // @require http://cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.min.js
  11. // @require http://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js
  12. // @require http://cdnjs.cloudflare.com/ajax/libs/intercom.js/0.1.4/intercom.min.js
  13. // @require http://cdnjs.cloudflare.com/ajax/libs/taffydb/2.7.2/taffy-min.js
  14. // @require http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js
  15. // @require http://cdnjs.cloudflare.com/ajax/libs/jquery_lazyload/1.9.5/jquery.lazyload.min.js
  16. // @require http://cdnjs.cloudflare.com/ajax/libs/jquery.selection/1.0.1/jquery.selection.min.js
  17. // @require http://cdn.jsdelivr.net/jquery.inview/0.2/jquery.inview.min.js
  18. // @resource settings_bar http://i.imgur.com/7IyqBeF.png
  19. // @run-at document-start
  20. // @grant GM_addStyle
  21. // @grant GM_getResourceURL
  22. // @grant unsafeWindow
  23. // @version 7.1.7
  24. // @icon https://m4v.me/favicon.ico
  25. // @credit http://m4v.me/p_titsilveral1479/262598
  26. // ==/UserScript==
  27. if (frameElement) return;
  28. this.$ = this.jQuery = jQuery.noConflict(true);
  29. /*
  30. Library
  31. */
  32. if (!String.prototype.format) {
  33. String.prototype.format = function() {
  34. var args = arguments;
  35. return this.replace(/{(\d+)}/g, function(match, number) {
  36. return typeof args[number] != "undefined" ? args[number] : match;
  37. });
  38. };
  39. }
  40. function isInArray(value, array) {
  41. return array.indexOf(value) > -1;
  42. }
  43. var intervals = {}, count = {};
  44. var removeListener = function(selector) {
  45. if (intervals[selector]) {
  46. window.clearInterval(intervals[selector]);
  47. intervals[selector] = null;
  48. }
  49. };
  50. var found = "waitUntilExists.found";
  51. $.fn.waitUntilExists = function(handler, shouldRunHandlerOnce, isChild) {
  52. var selector = this.selector;
  53. var $this = $(selector);
  54. var $elements = $this.not(function() {
  55. return $(this).data(found);
  56. });
  57. //console.log("waitUntilExists: " + selector);
  58. count[selector] = typeof count[selector] !== 'undefined' ? count[selector] : 1;
  59. if (handler === "remove") removeListener(selector);
  60. else {
  61. if (shouldRunHandlerOnce && $this.length || count[selector] == 10) {
  62. removeListener(selector);
  63. $elements.each(handler).data(found, true);
  64. } else if (!isChild) {
  65. $elements.each(handler).data(found, true);
  66. intervals[selector] = window.setInterval(function() {
  67. $this.waitUntilExists(handler, shouldRunHandlerOnce, true);
  68. }, 500);
  69. }
  70. }
  71. count[selector]++;
  72. return $this;
  73. };
  74. ko.templateSources.stringTemplate = function(template, templates) {
  75. this.templateName = template;
  76. this.templates = templates;
  77. };
  78. ko.utils.extend(ko.templateSources.stringTemplate.prototype, {
  79. data: function(key, value) {
  80. this.templates._data = this.templates._data || {};
  81. this.templates._data[this.templateName] = this.templates._data[this.templateName] || {};
  82. if (arguments.length === 1) {
  83. return this.templates._data[this.templateName][key];
  84. }
  85. this.templates._data[this.templateName][key] = value;
  86. },
  87. text: function(value) {
  88. if (arguments.length === 0) {
  89. return this.templates[this.templateName];
  90. }
  91. this.templates[this.templateName] = value;
  92. }
  93. });
  94. ko.bindingHandlers.stopBinding = {
  95. init: function() {
  96. return { controlsDescendantBindings: true };
  97. }
  98. };
  99. function createStringTemplateEngine(templateEngine, templates) {
  100. templateEngine.makeTemplateSource = function(template) {
  101. return new ko.templateSources.stringTemplate(template, templates);
  102. };
  103. return templateEngine;
  104. }
  105. function localStorage_bg() {
  106. this.get = function(item) {
  107. return localStorage.getItem(item);
  108. };
  109. this.set = function(item, value) {
  110. return localStorage.setItem(item, value);
  111. };
  112. this.getNDefault = function(item, defaultValue) {
  113. var value = localStorage.getItem(item);
  114. if(!value){
  115. localStorage.setItem(item, defaultValue);
  116. return localStorage.getItem(item);
  117. }
  118. return value;
  119. };
  120. }
  121. /*
  122. Utils
  123. */
  124. function removeImageAjax(html) {
  125. html = html.replace(/<img\b[^>]*>/ig, '');
  126. return html;
  127. }
  128. $.fn.clicktoggle = function(a, b) {
  129. return this.each(function() {
  130. var clicked = false;
  131. $(this).click(function() {
  132. if (clicked) {
  133. clicked = false;
  134. return b.apply(this, arguments);
  135. }
  136. clicked = true;
  137. return a.apply(this, arguments);
  138. });
  139. });
  140. };
  141. function postHelper($html) {
  142. return {
  143. getThreadId:function(){
  144. var thread_id, t_id1;
  145. t_id1 = location.href.match(/t=(\d+)/);
  146. if (t_id1 !== null && t_id1.length > 0) thread_id = t_id1[1];
  147. else {
  148. try {
  149. thread_id = unsafeWindow.threadid.toString();
  150. } catch (e) {
  151. /*var t_id2 = $("a:contains('Previous Thread')");
  152. if (t_id2.length > 0) thread_id = t_id2.attr("href").match(/t=(\d+)/)[1];
  153. else {
  154. var t_id3 = $(".pagenav a.smallfont:first-child");
  155. if (t_id3.length > 0) thread_id = t_id3.attr("href").match(/t=(\d+)/)[1];
  156. else thread_id = -1;
  157. }*/
  158. }
  159. }
  160. return thread_id;
  161. },
  162. getPage: function () {
  163. var page, $pageNav;
  164. $pageNav = $html.find(".pagenav");
  165. if ($pageNav.length === 0) {
  166. page = 1;
  167. } else {
  168. page = $pageNav.eq(0).find("tbody td.alt2 strong").text();
  169. }
  170. return page;
  171. },
  172. getLatestPost: function () {
  173. var id, lastpost, post;
  174. lastpost = $html.find("table[id^='post']:last");
  175. id = lastpost.attr("id").match(/(\d+)/)[1];
  176. post = $html.find("table[id^='post']").length -1;
  177. return {
  178. post: post,
  179. id: id
  180. };
  181. },
  182. getPostId: function (num) {
  183. var id, post;
  184. post = $html.find("table[id^='post']").eq(num);
  185. id = post.attr("id").match(/(\d+)/)[1];
  186. return id;
  187. }
  188. };
  189. }
  190. function checkLogin() {
  191. var isLogged = false, hasRun = false;
  192. function run() {
  193. if (hasRun) return;
  194. if (!_.isUndefined($.cookie('isLogin'))) isLogged = true;
  195. else {
  196. $("strong:contains('Welcome')").waitUntilExists(function() {
  197. var username = $(this).eq(0).text();
  198. if (username === "") {
  199. isLogged = false;
  200. console.log("#Tit: Đăng nhập đã mẹ ơi ._.");
  201. $(".tborder:has(input[name='vb_login_username'])").before("<div id='nologin-message'>#Tit: Chưa đăng nhập thì xài không có được -___-</div>");
  202. } else {
  203. isLogged = true;
  204. $.cookie('isLogin', 'yes');
  205. }
  206. }, true);
  207. }
  208. hasRun = true;
  209. }
  210. return {
  211. run: run,
  212. isLogged: function() {
  213. run();
  214. return isLogged;
  215. }
  216. };
  217. }
  218. function uuid() {
  219. var _global = this;
  220. var _rng;
  221. if (typeof _global.require == "function") {
  222. try {
  223. var _rb = _global.require("crypto").randomBytes;
  224. _rng = _rb && function() {
  225. return _rb(16);
  226. };
  227. } catch (e) {}
  228. }
  229. if (!_rng && _global.crypto && crypto.getRandomValues) {
  230. var _rnds8 = new Uint8Array(16);
  231. _rng = function whatwgRNG() {
  232. crypto.getRandomValues(_rnds8);
  233. return _rnds8;
  234. };
  235. }
  236. if (!_rng) {
  237. var _rnds = new Array(16);
  238. _rng = function() {
  239. for (var i = 0, r; i < 16; i++) {
  240. if ((i & 3) === 0) r = Math.random() * 4294967296;
  241. _rnds[i] = r >>> ((i & 3) << 3) & 255;
  242. }
  243. return _rnds;
  244. };
  245. }
  246. var BufferClass = typeof _global.Buffer == "function" ? _global.Buffer : Array;
  247. var _byteToHex = [];
  248. var _hexToByte = {};
  249. for (var i = 0; i < 256; i++) {
  250. _byteToHex[i] = (i + 256).toString(16).substr(1);
  251. _hexToByte[_byteToHex[i]] = i;
  252. }
  253. function parse(s, buf, offset) {
  254. var i = buf && offset || 0, ii = 0;
  255. buf = buf || [];
  256. s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {
  257. if (ii < 16) {
  258. buf[i + ii++] = _hexToByte[oct];
  259. }
  260. });
  261. while (ii < 16) {
  262. buf[i + ii++] = 0;
  263. }
  264. return buf;
  265. }
  266. function unparse(buf, offset) {
  267. var i = offset || 0, bth = _byteToHex;
  268. return bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + "-" + bth[buf[i++]] + bth[buf[i++]] + "-" + bth[buf[i++]] + bth[buf[i++]] + "-" + bth[buf[i++]] + bth[buf[i++]] + "-" + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]] + bth[buf[i++]];
  269. }
  270. var _seedBytes = _rng();
  271. var _nodeId = [ _seedBytes[0] | 1, _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5] ];
  272. var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 16383;
  273. var _lastMSecs = 0, _lastNSecs = 0;
  274. function v1(options, buf, offset) {
  275. var i = buf && offset || 0;
  276. var b = buf || [];
  277. options = options || {};
  278. var clockseq = options.clockseq !== null ? options.clockseq : _clockseq;
  279. var msecs = options.msecs !== null ? options.msecs : new Date().getTime();
  280. var nsecs = options.nsecs !== null ? options.nsecs : _lastNSecs + 1;
  281. var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 1e4;
  282. if (dt < 0 && options.clockseq === null) {
  283. clockseq = clockseq + 1 & 16383;
  284. }
  285. if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === null) {
  286. nsecs = 0;
  287. }
  288. if (nsecs >= 1e4) {
  289. throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");
  290. }
  291. _lastMSecs = msecs;
  292. _lastNSecs = nsecs;
  293. _clockseq = clockseq;
  294. msecs += 122192928e5;
  295. var tl = ((msecs & 268435455) * 1e4 + nsecs) % 4294967296;
  296. b[i++] = tl >>> 24 & 255;
  297. b[i++] = tl >>> 16 & 255;
  298. b[i++] = tl >>> 8 & 255;
  299. b[i++] = tl & 255;
  300. var tmh = msecs / 4294967296 * 1e4 & 268435455;
  301. b[i++] = tmh >>> 8 & 255;
  302. b[i++] = tmh & 255;
  303. b[i++] = tmh >>> 24 & 15 | 16;
  304. b[i++] = tmh >>> 16 & 255;
  305. b[i++] = clockseq >>> 8 | 128;
  306. b[i++] = clockseq & 255;
  307. var node = options.node || _nodeId;
  308. for (var n = 0; n < 6; n++) {
  309. b[i + n] = node[n];
  310. }
  311. return buf ? buf : unparse(b);
  312. }
  313. function v4(options, buf, offset) {
  314. var i = buf && offset || 0;
  315. if (typeof options == "string") {
  316. buf = options == "binary" ? new BufferClass(16) : null;
  317. options = null;
  318. }
  319. options = options || {};
  320. var rnds = options.random || (options.rng || _rng)();
  321. rnds[6] = rnds[6] & 15 | 64;
  322. rnds[8] = rnds[8] & 63 | 128;
  323. if (buf) {
  324. for (var ii = 0; ii < 16; ii++) {
  325. buf[i + ii] = rnds[ii];
  326. }
  327. }
  328. return buf || unparse(rnds);
  329. }
  330. var _uuid = v4;
  331. _uuid.v1 = v1;
  332. _uuid.v4 = v4;
  333. _uuid.parse = parse;
  334. _uuid.unparse = unparse;
  335. _uuid.BufferClass = BufferClass;
  336. return _uuid;
  337. }
  338. function JobStack() {
  339. var _JobStack = {
  340. Job: function(opts) {
  341. var that = this;
  342. that._stack = null;
  343. if (typeof opts.async != "undefined") that.stack = opts.stack;
  344. this.guid = uuid().v4();
  345. that.isQueued = true;
  346. that.isDoing = false;
  347. that.isDone = false;
  348. that.endTime = -1;
  349. that.async = false;
  350. if (typeof opts.async == "boolean") that.async = opts.async;
  351. that.runnow = false;
  352. if (typeof opts.runnow == "boolean") that.async = opts.runnow;
  353. that.onDone = function() {};
  354. if (typeof opts.onDone != "undefined") that.onDone = opts.onDone;
  355. that.onStart = function() {};
  356. if (typeof opts.onStart != "undefined") that.onStart = opts.onStart;
  357. that._run = opts.run;
  358. that.run = function() {
  359. if (that._stack === null) {
  360. console.log("This job is not belong to any stack!");
  361. return false;
  362. }
  363. if (that.isDone === true) {
  364. that.done();
  365. }
  366. that.isDoing = true;
  367. that.startTime = new Date();
  368. that._run.call(that);
  369. if (that.async === false) {
  370. that.done();
  371. }
  372. };
  373. that.done = function() {
  374. that.isDone = true;
  375. that.endTime = new Date();
  376. that.isDoing = false;
  377. that._stack.oneJobDone(that);
  378. };
  379. if (that.runnow) that.run();
  380. },
  381. Stack: function(opts) {
  382. var that = this;
  383. that.jobs = [];
  384. that.maxJobDoing = 2;
  385. if (typeof opts.maxJobDoing != "undefined") that.maxJobDoing = opts.maxJobDoing;
  386. that.callback = function() {};
  387. if (typeof opts.callback != "undefined") that.callback = opts.callback;
  388. that.add = function(job) {
  389. job._stack = that;
  390. that.jobs.push(job);
  391. };
  392. that.addJob = function(opts) {
  393. var job = new jobstack.Job(opts);
  394. that.add(job);
  395.  
  396. };
  397. that.addAsyncJob = function(opts) {
  398. if (typeof opts == "function") {
  399. var newOpts = {
  400. async: true,
  401. run: opts
  402. };
  403. that.addJob(newOpts);
  404. } else {
  405. opts.async = true;
  406. that.addJob(opts);
  407. }
  408. };
  409. that.getAvailableJobs = function() {
  410. var jobs = [];
  411. for (var i = 0; i < that.jobs.length; i++) {
  412. var j = that.jobs[i];
  413. if (j.isDone === false && j.isDoing === false && j.isQueued === true) {
  414. jobs.push(j);
  415. }
  416. }
  417. return jobs;
  418. };
  419. that.getNextAvailableJob = function() {
  420. var jobs = that.getAvailableJobs();
  421. if (jobs.length === 0) return false;
  422. return jobs[0];
  423. };
  424. that.getDoingJobs = function() {
  425. var jobs = [];
  426. for (var i = 0; i < that.jobs.length; i++) {
  427. var j = that.jobs[i];
  428. if (j.isDone === false && j.isDoing === true && j.isQueued === true) {
  429. jobs.push(j);
  430. }
  431. }
  432. return jobs;
  433. };
  434. that.getDoneJobs = function() {
  435. var jobs = [];
  436. for (var i = 0; i < that.jobs.length; i++) {
  437. var j = that.jobs[i];
  438. if (j.isDone === true && j.isDoing === false && j.isQueued === true) {
  439. jobs.push(j);
  440. }
  441. }
  442. return jobs;
  443. };
  444. that.run = function() {
  445. for (var i = 0; i < that.maxJobDoing; i++) {
  446. var j = that.getNextAvailableJob();
  447. if (j !== false) j.run();
  448. }
  449. };
  450. that.oneJobDone = function(job) {
  451. var newJob = that.getNextAvailableJob();
  452. if (newJob !== false) {
  453. if (that.getDoingJobs().length < that.maxJobDoing) {
  454. newJob.run();
  455. } else {}
  456. } else {
  457. that.checkDone();
  458. }
  459. };
  460. that.checkDone = function() {
  461. if (that.getAvailableJobs().length === 0 && that.getDoingJobs().length === 0) {
  462. that.allJobDone();
  463. return true;
  464. }
  465. return false;
  466. };
  467. that.allJobDone = function() {
  468. that.callback.call();
  469. };
  470. }
  471. };
  472. return _JobStack;
  473. }
  474. /*
  475. Function
  476. */
  477. function MaxZoom() {
  478. GM_addStyle('.page{width:100%!important;max-width:none}.plk_smilebox.quick{height:130px!important}');
  479. }
  480. var myLocalStorage, get_settings, settings_list, maxwidthSaved, window_width, rainbowSaved;
  481. myLocalStorage = new localStorage_bg();
  482. get_settings = myLocalStorage.get("settings");
  483. if (!get_settings) {
  484. settings_list = [];
  485. myLocalStorage.set("settings", JSON.stringify(settings_list));
  486. } else settings_list = JSON.parse(get_settings);
  487. if (isInArray("settings_option_bb", settings_list)) MaxZoom();
  488. maxwidthSaved = myLocalStorage.get("maxwidthSaved");
  489. window_width = $(window).width() - 56;
  490. if (!maxwidthSaved) maxwidthSaved = "853";
  491. rainbowSaved = myLocalStorage.get("rainbowSaved");
  492. if (!rainbowSaved) rainbowSaved = "Rainbow";
  493. /*window.addEventListener('error', function(e) {
  494. window.location.reload();
  495. }, true);*/
  496. GM_addStyle(".alt2 a[style*=wrap] > strong{margin-right:150px}.animated{-webkit-animation-duration:.5s;-moz-animation-duration:.5s;-o-animation-duration:.5s;animation-duration:.5s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}.animated.fadeInLeft{-webkit-animation-name:fadeInLeft;-moz-animation-name:fadeInLeft;-o-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px)}100%{opacity:1;-webkit-transform:translateX(0)}}@-moz-keyframes fadeInLeft{0%{opacity:0;-moz-transform:translateX(-20px)}100%{opacity:1;-moz-transform:translateX(0)}}@-o-keyframes fadeInLeft{0%{opacity:0;-o-transform:translateX(-20px)}100%{opacity:1;-o-transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(-20px);-moz-transform:translateX(-20px);-o-transform:translateX(-20px);transform:translateX(-20px)}100%{opacity:1;-webkit-transform:translateX(0);-moz-transform:translateX(0);-o-transform:translateX(0);transform:translateX(0)}}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3);background:rgba(255,255,255,0.8);border-radius:0}::-webkit-scrollbar-thumb{border-radius:0;background:rgba(35,73,124,0.8);-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.5)}::-webkit-scrollbar-thumb:window-inactive{background:rgba(35,73,124,0.4)}.capture{background:url(data:image/gif;base64,R0lGODlhBAASAPcAAHiY0HqVxP///yozeIKOoZOds+np7bS2uZGr2aKru3SLs2d8oL3AynaDoamzyFxsieTm8g0akry+wlxxlUxhhYWRqpmmvWl1hFlky4Kdy42s4WyCpqyts4up3Wl9oeTl62R5nfj4+j1SdXWVzJqhrc7R20lZmLzA2t/h5TpOcOnq9YyaswoUaGB1mYmVq4Og0nmOskVafjRJbSs4sp26656qwl55qHmWyeHi53GGqiczjpSivIadx8PEzHaLr32Ko3WOunSSxcnJ0cXJzHOSynF2koWj2FltkZey5Imk08zP1IKJltXa5IiQmc3Q1tzd4aOnrEFWenqSu4aRpdjZ3nuFmiY1z9HT2Uleghcp0HqRuWl6mRgmrHyRtl90mG+EqLC4ylJhe1Vul1Rkghov96uxutHS1vb292WCs2uGtoCe0ufp9MHBxlFlilVpjp2ksHyazThDiLe6v8vN2hskbwkTefHy9IiRopakvXOAn8jK1WV/qtLW3u3u+IqYsPf4+VpqnGN0lJCu4tTV3GR4mUddhKGotW6Fvvz8/PT198nMz+3t75iz5XuSuKCltYim2neUxsrN0rm9yVlogxQeePDx8oagzfr6+4SWtHiGo22Mw3GIsXGPwlhngpWZo/Pz/RAfrxIbaWaEuGWArV92nVpij1ZohWyErm99lm6Dp26BowYPWllxmmZ4l/Hx++fo6Y+Wn3+XwH2UunWRv36Jm0NWdwUPZmuApPT0/mN4nOvs987S4JSiu3SIq5yowM3O0kpRg1p0nmZsmKutur/H14CMp9fY3pOftiY486C972F+sH+Yw01co0xcirO2wJigrHWBjkhZekVMe01abg4dwI2cuLfAz3d/iszM1Gd+qMzL0unp8neMsOzs9t7g66SuwEJQil1wkEVfi+/w+khQiFZmmV1jll1lm2h0kHqUwJSw33uTvBUhgjNCuWp/o9HS3NXU2pKhu5GhvUxhlIyXr/P09fTz9lNluF57r3KHq0NPhY+VqZCZrWiCrlhxnfX1/yH5BAEAAP8ALAAAAAAEABIAAAhDAC0ItACgIIBHCDvAUaPmRboAENNJTLdOyrp1jbo0ytilI4yPMHyI9JGvZL4vKFPdWnnL3a0NGxbIXEChJgUXFXIGBAA7) repeat-x;color:white;font-weight:bold;display:inline-block;vertical-align:5px;cursor:pointer;border-radius:6px;font-size:11px;padding:0 8px 1px;line-height:17px}.plk_smilebox_img{cursor:pointer;padding:2px;-webkit-transition:all .2s linear;-moz-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.plk_smilebox_img:hover{-moz-transform:scale(1.2);-webkit-transform:scale(1.2);-o-transform:scale(1.2);-ms-transform:scale(1.2);transform:scale(1.2)}.plk_smilebox.quick{height:170px;overflow:auto}#vB_Editor_001_smiliebox .plk_smilebox{width:auto!important;height:255px;overflow:auto}form[name='vbform'] .panel>div,#message_form .panel>div>div{width:auto!important;max-width:none!important}form[name='vbform'] .panel>div>table{width:100%}#vB_Editor_001_textarea{width:99%!important}#vB_Editor_001 .controlbar:last-child{width:30%}.controlbar.cmnw{margin-top:10px}.cmnw{position:relative}.cmnw .btn{display:inline-block;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;cursor:pointer;color:#333;text-shadow:rgba(255,255,255,0.74902) 0 1px 1px;background-color:#f5f5f5;background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e6e6e6));background-image:-webkit-linear-gradient(#fff,#e6e6e6);background-image:-moz-linear-gradient(#fff,#e6e6e6);background-image:-o-linear-gradient(#fff,#e6e6e6);background-image:linear-gradient(#fff,#e6e6e6);background-repeat:repeat-x;border:1px solid #aaa;border-radius:4px;-webkit-box-shadow:rgba(255,255,255,0.2) 0 1px 0 inset,rgba(0,0,0,0.0470588) 0 1px 2px;box-shadow:rgba(255,255,255,0.2) 0 1px 0 inset,rgba(0,0,0,0.0470588) 0 1px 2px}.cmnw .btn:hover{color:#333;text-decoration:none;background-position:0 -15px;background-color:#e6e6e6}.wrap_popover{display:none;position:absolute;top:120%;z-index:999;max-width:276px;text-align:justify;background:white;-o-background-clip:padding-box;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:rgba(0,0,0,0.2) 0 5px 10px;box-shadow:rgba(0,0,0,0.2) 0 5px 10px}.popover{position:relative}.popover:after{content:'';width:0;height:0;position:absolute;border:10px solid transparent;border-bottom:10px solid white;top:-20px;left:50px}.popover_title{margin:0;padding:8px 0;text-align:center;font-size:14px;font-weight:normal;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover_content p{margin:10px}.popover_content img{vertical-align:middle}h6{font-size:1em;margin:0}.label-primary{display:inline-block;padding:2px 5px;margin:4px 0;border-radius:3px;font-weight:bold;background:#32476c}.quote_count{color:white;background:red;padding:0 3px;border-radius:3px;line-height:normal;font-size:9px;top:5px;right:0;position:absolute}.plk_backdrop{width:100%;height:100%;position:fixed;top:0;left:0;z-index:5;background:black;opacity:.5}.plk_contentbar{position:fixed;z-index:9999;top:0;left:0;width:auto;height:auto;background-color:#39527f}.bar-item-wrapper{float:left;width:40px;height:40px;position:relative}.bar-item-wrapper.active{background-color:#5780c9}.bar-item-wrapper>a.handler{line-height:40px;text-align:center;display:block;width:40px;height:40px;position:absolute;top:0;left:0;z-index:100}#setting_bar>a.handler{background-position:8px center}#followthread_bar>a.handler{background-position:-62px center}#quoteNotification_bar>a.handler{background-position:-25px center}.bar-item-container{display:none;width:30%;min-width:400px;max-height:400px;overflow-x:hidden;overflow-y:auto;background:#5780c9;color:white;-webkit-box-shadow:black 2px 2px 3px;box-shadow:black 2px 2px 3px;position:absolute;top:40px;left:0;z-index:99;-webkit-transition:all .5s;-moz-transition:all .5s;-o-transition:all .5s;transition:all .5s}.bar-item-wrapper.active>.bar-item-container{opacity:1;display:block}#setting_bar>.bar-item-container{max-height:none}.data-list .data-item{color:white;border-bottom:2px solid #39527f;padding:8px}.SubscriptionItem--unhighlight{background-color:#39527f}.data-list .data-item a{color:white}.setting_bar_input{float:right}#settings_option_bb{margin-top:0;margin-bottom:0;height:40px}#settings_option_bb_img{display:inline-block;width:45px;height:40px;background-position:-100px center!important}.settingContent{display:inline-block;max-width:350px;line-height:1.5em}.quoteContent{line-height:1.5em}.page{min-width:768px}.rainbow-full{cursor:default;padding:1px}.rainbow-full:hover{padding:0;border:1px solid #316ac5;background:#c1d2ee}.wrap_popover_rainbow{left:200px}.preview_container{display:none}.preview_container.active{display:block}.active > .preview_inner{margin-top:10px;padding:10px;border:1px solid #c6c6c6;max-height:300px;overflow:auto}");
  497. GM_addStyle('.plk_contentbar .bar-item-wrapper a.handler, #settings_option_bb_img{background:url(' + GM_getResourceURL("settings_bar") +') no-repeat}');
  498.  
  499. $(function() {
  500. function loadExternalScript(handler) {
  501. var script = document.createElement('script');
  502. script.type = 'text/javascript';
  503. script.innerHTML = handler;
  504. document.getElementsByTagName('head')[0].appendChild(script);
  505. }
  506. function ContentBar() {
  507. var htmlTemplate, $backDrop, $bar = null, bd, exports;
  508. htmlTemplate = "" + "<div id='plk_contentbar' class='cmnw plk_contentbar'>" + "<div data-bind='foreach: BarItems'>" + "<div class='bar-item-wrapper' data-bind='attr:{id:id},css:{active:_state.open}'>" + "<a href='javascript:;' class='handler animated' data-bind='template:{name:barButton.template,data:container.data},click:barButtonClick'></a>" + "<div class='bar-item-container animated' data-bind='template: {name:container.template,data:container.data},css:{fadeInLeft:_state.open}'></div>" + "</div>" + "</div>" + "</div>";
  509. $backDrop = $("<div id='plk_contentbar_bd' class='plk_backdrop' data-bind='" + "visible:showBD" + "'></div>");
  510. function init() {
  511. $bar = $("#plk_contentbar");
  512. if ($bar.length === 0) {
  513. $bar = $(htmlTemplate);
  514. $bar.appendTo(document.body);
  515. $backDrop.appendTo(document.body);
  516. ko.setTemplateEngine(createStringTemplateEngine(new ko.nativeTemplateEngine(), getData().templates));
  517. ko.applyBindings(getData(), $bar[0]);
  518. ko.applyBindings(getData(), $backDrop[0]);
  519. }
  520. }
  521. function getData() {
  522. if (_.isUndefined(window.ContentBar)) {
  523. window.ContentBar = {
  524. BarItems: ko.observableArray([]),
  525. templates: {},
  526. closeAll: function() {
  527. var baritems = this.BarItems();
  528. for (var i = 0; i < baritems.length; i++) {
  529. baritems[i].closePanel();
  530. }
  531. }
  532. };
  533. window.ContentBar.showBD = ko.computed(function() {
  534. var baritems = window.ContentBar.BarItems();
  535. for (var i = 0; i < baritems.length; i++) {
  536. if (baritems[i]._state.open() === true) {
  537. return true;
  538. }
  539. }
  540. return false;
  541. });
  542. }
  543. return window.ContentBar;
  544. }
  545. function updateDate(data) {
  546. window.ContentBar = data;
  547. }
  548. $backDrop.on("click", function() {
  549. getData().closeAll();
  550. });
  551. bd = {
  552. open: function() {
  553. $backDrop.show();
  554. },
  555. close: function() {
  556. $backDrop.hide();
  557. }
  558. };
  559. function BarItemDefault() {
  560. this.$bar = {};
  561. this.event = {
  562. init: function() {},
  563. open: function() {},
  564. close: function() {}
  565. };
  566. this.flash = function() {
  567. if (this._state.flashing === false) {
  568. this.$barButton.removeClass("flash").addClass("flash");
  569. this._state.flashing = true;
  570. var that = this;
  571. setTimeout(function() {
  572. that._state.flashing = false;
  573. }, 1e3);
  574. }
  575. };
  576. this._state = {
  577. open: ko.observable(false),
  578. flashing: ko.observable(false)
  579. };
  580. this.closePanel = function() {
  581. this.event.close.call(this);
  582. this._state.open(false);
  583. };
  584. this.openPanel = function() {
  585. window.ContentBar.closeAll();
  586. this.event.open.call(this);
  587. this._state.open(true);
  588. };
  589. this.barButtonClick = function(barItem) {
  590. if (this._state.open() === false) {
  591. this.openPanel();
  592. } else {
  593. this.closePanel();
  594. }
  595. };
  596. }
  597. exports = {
  598. run: function() {
  599. init();
  600. this.addBarItem({
  601. id: "setting_bar",
  602. barButton: {
  603. template: "setting_barButton"
  604. },
  605. templates: {
  606. setting_barButton: "",
  607. setting_container: "<div id='wrap_SettingsList' class='data-list' data-bind='stopBinding: true'></div>"
  608. },
  609. container: {
  610. template: "setting_container",
  611. data: {}
  612. }/*,
  613. barButtonClick: function() {
  614. return true;
  615. }*/
  616. });
  617. },
  618. addBarItem: function(barItem) {
  619. barItem = $.extend(true, {}, new BarItemDefault(), barItem);
  620.  
  621. var data = getData();
  622. barItem.$bar = function() {
  623. return $("#" + barItem.id);
  624. };
  625.  
  626. for (var tmpl in barItem.templates) {
  627. if (barItem.templates.hasOwnProperty(tmpl)) {
  628. data.templates[tmpl] = barItem.templates[tmpl];
  629. }
  630. }
  631. data.BarItems.push(barItem);
  632. updateDate(data);
  633. return barItem;
  634. }
  635. };
  636. return exports;
  637. }
  638. function MaxWidthResizeImage(maxwidthSaved) {
  639. $("#resize_choices").prop("disabled", false);
  640. var handler = function(maxwidth) {
  641. return "NcodeImageResizer.MAXWIDTH = " + maxwidth + ";";
  642. };
  643. if (maxwidthSaved == "Full") {
  644. GM_addStyle('.voz-post-message > img{max-width:' + window_width + 'px;height:auto;}');
  645. loadExternalScript(handler(window_width));
  646. } else {
  647. GM_addStyle('.voz-post-message > img{max-width:' + maxwidthSaved + 'px;height:auto;}');
  648. loadExternalScript(handler(parseInt(maxwidthSaved)));
  649. }
  650. }
  651. function DetectImage() {
  652. var detect_link = /(?=[^ ])(h *t *t *p *: *\/ *\/ *)?(([a-zA-Z0-9-\.]+\.)?[a-zA-Z0-9-]{3,}\.(com|net|org|us|ru|info|vn|gl|ly|com\.vn|net\.vn|gov\.vn|edu|edu\.vn)(\/)?([^\s\[]+)?)(?=\s|$|\[)/gi;
  653. $("[id^='post_message_']").each(function() {
  654. var node, nodes, replaceTextWithLink, i, len;
  655. nodes = $(this).contents();
  656. replaceTextWithLink = function(node) {
  657. if (detect_link.test($(node).text())) {
  658. var replacement = $(node).text().replace(detect_link, "<a data-type='linkdetected' href='https://$2' target='_blank'>$2</a>");
  659. $(node).before(replacement);
  660. node.nodeValue = "";
  661. }
  662. return;
  663. };
  664. for (i = 0, len = nodes.length; i < len; i++) {
  665. node = nodes[i];
  666. if (node.nodeType === 3) {
  667. replaceTextWithLink(node);
  668. }
  669. }
  670. });
  671. $("a[href*='redirect/index.php']").each(function() {
  672. try {
  673. var url = $(this).attr("href").match(/\?link=(.*)/)[1];
  674. var decoded = decodeURIComponent(url);
  675. $(this).attr("href", decoded);
  676.  
  677. } catch (e) {
  678. }
  679. });
  680. $("[id^='post_message_'] a:not(:has(img))").each(function() {
  681. var href = $(this).attr("href");
  682. if (/\.(jpg|jpeg|png|gif|bmp)$/.test(href)) {
  683. $(this).attr("data-smartlink", "image");
  684. var button = $("<button class='showimage'>Hiện hình</button>");
  685. button.attr('image_link', href);
  686. $(this).after(button);
  687. } else if (/\.(mp4|webm|ogg)$/.test(href)) {
  688. var video = $('<div class="video_container"><video controls preload="metadata">Your browser does not support the <code>video</code> element.</video></div>');
  689. video.children().attr("src", href);
  690. $(this).after(video);
  691. }
  692. });
  693. $(".showimage").clicktoggle(function() {
  694. $(this).text('Ẩn hình');
  695. var href = $(this).attr('image_link');
  696. var img = $("<div><a href='" + href + "' target='_blank'><img src='" + href + "' title='Vui lòng nhấn vào đây để tới link ảnh gốc'/></a></div>");
  697. $(this).after(img);
  698. }, function() {
  699. $(this).text('Hiện hình');
  700. $(this).next().remove();
  701. });
  702. var videos = $(".video_container > video");
  703. GM_addStyle('.video_container > video{max-width:' + window_width + 'px;height:auto;}');
  704. $(window).resize(function() {
  705. window_width = $(this).width() - 56;
  706. GM_addStyle('img[onload^="NcodeImageResizer"], .video_container > video{max-width:' + window_width + 'px;height:auto;}');
  707. });
  708. if (/Chrome[\/\s](\d+\.\d+)/.test(navigator.userAgent)) {
  709. videos.click(function() {
  710. if ($(this)[0].paused)
  711. $(this)[0].play();
  712. else $(this)[0].pause();
  713. });
  714. }
  715. }
  716. function Emo(xlocalStorage) {
  717. var EmoStorage = xlocalStorage;
  718. function smilieList() {
  719. varlist = [{text:":adore:",src:"/images/smileys/user/big/adore.png",stt:1},{text:":after_boom:",src:"/images/smileys/user/big/after_boom.png",stt:2},{text:":ah:",src:"/images/smileys/user/big/ah.png",stt:3},{text:":amazed:",src:"/images/smileys/user/big/amazed.png",stt:4},{text:":angry:",src:"/images/smileys/user/big/angry.png",stt:5},{text:":bad_smelly:",src:"/images/smileys/user/big/bad_smelly.png",stt:6},{text:":baffle:",src:"/images/smileys/user/big/baffle.png",stt:7},{text:":beat_brick:",src:"/images/smileys/user/big/beat_brick.png",stt:8},{text:":beat_plaster:",src:"/images/smileys/user/big/beat_plaster.png",stt:9},{text:":beat_shot:",src:"/images/smileys/user/big/beat_shot.png",stt:10},{text:":beated:",src:"/images/smileys/user/big/beated.png",stt:11},{text:":beauty:",src:"/images/smileys/user/big/beauty.png",stt:12},{text:":big_smile:",src:"/images/smileys/user/big/big_smile.png",stt:13},{text:":boss:",src:"/images/smileys/user/big/boss.png",stt:14},{text:":burn_joss_stick:",src:"/images/smileys/user/big/burn_joss_stick.png",stt:15},{text:":byebye:",src:"/images/smileys/user/big/byebye.png",stt:16},{text:":canny:",src:"/images/smileys/user/big/canny.png",stt:17},{text:":choler:",src:"/images/smileys/user/big/choler.png",stt:18},{text:":cold:",src:"/images/smileys/user/big/cold.png",stt:19},{text:":confident:",src:"/images/smileys/user/big/confident.png",stt:20},{text:"confuse",src:"/images/smileys/user/big/confuse.png",stt:21},{text:":cool:",src:"/images/smileys/user/big/cool.png",stt:22},{text:":cry",src:"/images/smileys/user/big/cry.png",stt:23},{text:":doubt:",src:"/images/smileys/user/big/doubt.png",stt:24},{text:":dribble:",src:"/images/smileys/user/big/dribble.png",stt:25},{text:':embarrassed:',src:"/images/smileys/user/big/embarrassed.png",stt:26},{text:":extreme_sexy_girl:",src:"/images/smileys/user/big/extreme_sexy_girl.png",stt:27},{text:":feel_good:",src:"/images/smileys/user/big/feel_good.png",stt:28},{text:":go:",src:"/images/smileys/user/big/go.png",stt:29},{text:":haha:",src:"/images/smileys/user/big/haha.png",stt:30},{text:":hell_boy:",src:"/images/smileys/user/big/hell_boy.png",stt:31},{text:":hungry:",src:"/images/smileys/user/big/hungry.png",stt:32},{text:":look_down:",src:"/images/smileys/user/big/look_down.png",stt:33},{text:":matrix:",src:"/images/smileys/user/big/matrix.png",stt:34},{text:":misdoubt:",src:"/images/smileys/user/big/misdoubt.png",stt:35},{text:":nosebleed:",src:"/images/smileys/user/big/nosebleed.png",stt:36},{text:":oh:",src:"/images/smileys/user/big/oh.png",stt:37},{text:":ops:",src:"/images/smileys/user/big/ops.png",stt:38},{text:":pudency:",src:"/images/smileys/user/big/pudency.png",stt:39},{text:":sad:",src:"/images/smileys/user/big/sad.png",stt:40},{text:":sexy_girl:",src:"/images/smileys/user/big/sexy_girl.png",stt:41},{text:":smile:",src:"/images/smileys/user/big/smile.png",stt:42},{text:":spiderman:",src:"/images/smileys/user/big/spiderman.png",stt:43},{text:":still_dreaming:",src:"/images/smileys/user/big/still_dreaming.png",stt:44},{text:":sure:",src:"/images/smileys/user/big/sure.png",stt:45},{text:":surrender:",src:"/images/smileys/user/big/surrender.png",stt:46},{text:":sweat:",src:"/images/smileys/user/big/sweat.png",stt:47},{text:":sweet_kiss:",src:"/images/smileys/user/big/sweet_kiss.png",stt:48},{text:":tire:",src:"/images/smileys/user/big/tire.png",stt:49},{text:":too_sad:",src:"/images/smileys/user/big/too_sad.png",stt:50},{text:":waaaht:",src:"/images/smileys/user/big/waaaht.png",stt:51},{text:":what:",src:"/images/smileys/user/big/what.png",stt:52}];
  720. for (var i = 0; i < list.length; i++) {
  721. var smilie = list[i];
  722. if (smilie.src.indexOf("https") === 0) continue;
  723. if (smilie.src.charAt(0) != "/") {
  724. smilie.src = "/" + smilie.src;
  725. }
  726. smilie.src = "https://m4v.me" + smilie.src;
  727. smilie.clickNum = 0;
  728. }
  729. return list;
  730. }
  731. return {
  732. run: function() {
  733. var editorFull, editorQuick, editor, smileCont, smileBox, default_smilieList, _smilieList, data;
  734. editorFull = $("#vB_Editor_001_textarea");
  735. editorQuick = $("#vB_Editor_QR_textarea");
  736. editor = null;
  737. smileCont = $("#vB_Editor_001_smiliebox");
  738. smileBox = $("<div id='smilebox' class='plk_smilebox' data-bind='foreach: smilies'>" + "<img class='plk_smilebox_img' data-bind='attr:{src:src,alt:text},click:$root.Select'/>" + "</div>");
  739. if (editorFull.length > 0) {
  740. editor = editorFull;
  741. if (smileCont.length === 0) {
  742. return;
  743. }
  744. smileCont.find("table").remove();
  745. } else if (editorQuick.length > 0) {
  746. editor = editorQuick;
  747. smileCont = editorQuick.parents("#vB_Editor_QR").eq(0);
  748. smileBox.addClass("controlbar quick");
  749. } else {
  750. alert("Failed to load Smile lists");
  751. return;
  752. }
  753. smileCont.append(smileBox);
  754. default_smilieList = smilieList();
  755. _smilieList = smilieList();
  756. function _exec() {
  757. var _smiles = _smilieList.sort(function(a, b) {
  758. if (a.clickNum < b.clickNum) {
  759. return 1;
  760. } else if (a.clickNum > b.clickNum) {
  761. return -1;
  762. } else {
  763. if (a.stt < b.stt) return -1;
  764. else if (a.stt > b.stt) return 1;
  765. }
  766. });
  767. var SmilieVM = {
  768. smilies: _smiles,
  769. Select: function(smilie) {
  770. var smilieText = smilie.text;
  771. var v = editor.val();
  772. var selStart = editor.prop("selectionStart");
  773. var selEnd = editor.prop("selectionEnd");
  774. var textBefore = v.substring(0, selStart);
  775. var textAfter = v.substring(selEnd, v.length);
  776. editor.val(textBefore + smilieText + textAfter);
  777. editor[0].setSelectionRange(selStart + smilieText.length, selStart + smilieText.length);
  778. if (typeof smilie.clickNum != "undefined") {
  779. smilie.clickNum++;
  780. } else {
  781. smilie.clickNum = 1;
  782. }
  783. var smile = _.findWhere(default_smilieList, {
  784. text: smilie.text
  785. });
  786. smile.clickNum = smilie.clickNum;
  787. var clickList = [];
  788. for (var i = 0; i < default_smilieList.length; i++) {
  789. clickList.push({
  790. click: default_smilieList[i].clickNum
  791. });
  792. }
  793. editor.focus();
  794. EmoStorage.set("iconUsage", JSON.stringify(clickList));
  795. }
  796. };
  797. ko.applyBindings(SmilieVM, smileBox[0]);
  798. }
  799. data = EmoStorage.get("iconUsage");
  800. if (data) {
  801. if (typeof data == "string") {
  802. data = JSON.parse(data);
  803. }
  804. if (data.length > 0) {
  805. for (var i = 0; i < data.length; i++) {
  806. var d = data[i];
  807. if (typeof d.click != "undefined" && _smilieList[i]) {
  808. _smilieList[i].clickNum = d.click;
  809. default_smilieList[i].clickNum = d.click;
  810. }
  811. }
  812. }
  813. }
  814. _exec();
  815. $("form[name='vbform'], form#message_form").submit(function(event) {
  816. if (editor.val().length >= 10) editor.val(editor.val().replace(/:\+1:/g, " [IMG]http://i.imgur.com/JfLvYp5.png[/IMG]"));
  817. });
  818. }
  819. };
  820. }
  821. function LoadQuickQuote() {
  822. function clearChecked() {
  823. $.cookie("vbulletin_multiquote", "");
  824. $("[src='https://vozforums.com/images/buttons/multiquote_on.gif']").attr("src", "https://vozforums.com/images/buttons/multiquote_off.gif");
  825. }
  826. return {
  827. run: function() {
  828. var editorQuick, editorWrap, $Toolbar, $btnLoadQ, $btnClearQ, loadQ_tooltip;
  829. editorQuick = $("#vB_Editor_QR_textarea");
  830. editorWrap = editorQuick.parents("#vB_Editor_QR").eq(0);
  831. $Toolbar = $("<div class='controlbar cmnw'></div>");
  832. editorWrap.append($Toolbar);
  833. $btnLoadQ = $("<a href='javascript:;' class='btn'>Load Quotes</a>");
  834. $btnClearQ = $("<a href='javascript:;' class='btn' title='Xóa các trích dẫn đã đánh dấu'>Del Quotes</a>");
  835. loadQ_tooltip = $("<div class='wrap_popover'><div class='popover'><h3 class='popover_title'>Chèn các trích dẫn đã đánh dấu</h3><div class='popover_content'><p>Để thực hiện trích dẫn nhiều bài cùng lúc: Click vào nút <img src='https://vozforums.com/images/buttons/multiquote_off.gif'/>" + " ở bên dưới-phải của mỗi bài viết cần trích dẫn.</p><p>Những bài viết nào đã được đánh dấu icon sẽ chuyển sang <img src='https://vozforums.com/images/buttons/multiquote_on.gif' /></p></div></div></div>");
  836. $Toolbar.append($btnLoadQ);
  837. $Toolbar.append($btnClearQ);
  838. $Toolbar.append(loadQ_tooltip);
  839. $btnClearQ.on("click", function() {
  840. clearChecked();
  841. });
  842. $btnLoadQ.on("click", function() {
  843. var href = $("a:has(>img[src*='images/buttons/reply.gif'])")[0].href, v = editorQuick.val();
  844. editorQuick.val("Đang xử lý..." + v);
  845. $.ajax({
  846. url: href,
  847. success: function(html) {
  848. html = removeImageAjax(html);
  849. var text = $(html).find("#vB_Editor_001_textarea").val();
  850. editorQuick.val(text + v);
  851. },
  852. error: function() {
  853. editorQuick.val(v);
  854. },
  855. complete: function() {
  856. editorQuick.focus();
  857. }
  858. });
  859. });
  860. $btnLoadQ.hover(function() {
  861. loadQ_tooltip.fadeIn();
  862. }, function() {
  863. loadQ_tooltip.hide();
  864. });
  865. $("a[id^='qr_']").on("click", function(event) {
  866. var href = $(this).attr('href'), v = editorQuick.val();
  867. editorQuick.val("Đang xử lý..." + v);
  868. $.ajax({
  869. url: href,
  870. success: function(html) {
  871. html = removeImageAjax(html);
  872. var text = $(html).find("#vB_Editor_001_textarea").val();
  873. editorQuick.val(text + v);
  874. },
  875. error: function() {
  876. editorQuick.val(v);
  877. }
  878. });
  879. });
  880. $("#qrform").submit(function(event) {
  881. if (editorQuick.val().length >= 10) clearChecked();
  882. return true;
  883. });
  884. }
  885. };
  886. }
  887. function RainbowText(rainbowSaved, type) {
  888. $("#rainbow_choices").prop("disabled", false);
  889. type = (typeof type !== 'undefined') ? type : 'quick';
  890. var random_char = [], random_length = 0;
  891. var $Toolbar, btnRainbow, btnUnRainbow, editor;
  892. function rgbToHex(R, G, B) {
  893. return toHex(R) + toHex(G) + toHex(B);
  894. }
  895. function toHex(n) {
  896. n = parseInt(n, 10);
  897. if (isNaN(n)) return "00";
  898. n = Math.max(0, Math.min(n, 255));
  899. return "0123456789ABCDEF".charAt((n - n % 16) / 16) + "0123456789ABCDEF".charAt(n % 16);
  900. }
  901. function getRandomInt(min, max) {
  902. return Math.floor(Math.random() * (max - min)) + min;
  903. }
  904. function randomize_colors(input_text_length) {
  905. for (var a = 0; a < input_text_length; a += 1) {
  906. random_char[a] = rgbToHex(getRandomInt(0, 255), getRandomInt(0, 255), getRandomInt(0, 255));
  907. }
  908. random_length = input_text_length;
  909. }
  910. function unRainbow(input_text) {
  911. return input_text.replace(/\[\/?((color(="?#.{6}"?)?)|[bB])\]/g, '');
  912. }
  913. return {
  914. run: function() {
  915. if (type === 'quick') {
  916. editor = $("#vB_Editor_QR_textarea");
  917. if ($(".controlbar.cmnw").length === 0) {
  918. var editorWrap = editor.parents("#vB_Editor_QR").eq(0);
  919. $Toolbar = $("<div class='controlbar cmnw'></div>");
  920. editorWrap.append($Toolbar);
  921. } else {
  922. $Toolbar = $(".controlbar.cmnw");
  923. }
  924. btnRainbow = $('<a href="javascript:;" class="btn">Rainbow</a>');
  925. btnUnRainbow = $('<a href="javascript:;" class="btn">UnRainbow</a>');
  926. var Rainbow_tooltip = $('<div class="wrap_popover wrap_popover_rainbow"><div class=popover><h3 class=popover_title>Tạo Rainbow Text</h3><div class=popover_content><p>Bôi đen đoạn text và click nút Rainbow</p></div></div></div> ');
  927. $(btnRainbow).hover(function() {
  928. Rainbow_tooltip.fadeIn();
  929. }, function() {
  930. Rainbow_tooltip.hide();
  931. });
  932. $Toolbar.append(Rainbow_tooltip);
  933.  
  934. } else if (type === 'full') {
  935. editor = $("#vB_Editor_001_textarea");
  936. $Toolbar = $("#vB_Editor_001_controls > table:last-child > tbody > tr");
  937. $($Toolbar).append('<td><img src="images/editor/separator.gif" width="6" height="20" alt=""></td>');
  938. btnRainbow = $('<td class="rainbow-full">Rainbow</td>');
  939. btnUnRainbow = $('<td class="rainbow-full">UnRainbow</td>');
  940. }
  941. var input_text_backup = '';
  942. $(btnRainbow).on('click', function(event) {
  943. var i = 0, a = 0, ccol,
  944. str_bbcode = '', str_html = '',
  945. input_text, selection = $(editor).selection();
  946. if (selection === '') {
  947. alert('Chưa bôi đen đoạn text!');
  948. $(editor).select();
  949. return;
  950. }
  951. if (input_text_backup === unRainbow(selection)) {
  952. input_text = input_text_backup;
  953. } else {
  954. input_text = input_text_backup = selection;
  955. }
  956. if (rainbowSaved === 'Rainbow') {
  957. var s = 1 / 6, p;
  958. for (a = 0; a < input_text.length; a++) {
  959. i = a / input_text.length;
  960. p = (i % s) / s;
  961. if (i >= s * 0) ccol = rgbToHex(204, 204 * p, 0);
  962. if (i >= s * 1) ccol = rgbToHex(204 * (1 - p), 204, 0);
  963. if (i >= s * 2) ccol = rgbToHex(0, 204, 204 * p);
  964. if (i >= s * 3) ccol = rgbToHex(0, 204 * (1 - p), 204);
  965. if (i >= s * 4) ccol = rgbToHex(255 * p, 0, 255);
  966. if (i >= s * 5) ccol = rgbToHex(255, 0, 255 * (1 - p));
  967. if (input_text.charAt(a) == " ") {
  968. str_html += " ";
  969. str_bbcode += " ";
  970. } else {
  971. str_html += "<font color='#" + ccol + "'>" + input_text.charAt(a) + "</font>";
  972. str_bbcode += '[color=#' + ccol + ']' + input_text.charAt(a) + "[/color]";
  973. }
  974. }
  975. }
  976. else if (rainbowSaved == 'Word by word') {
  977. randomize_colors(input_text.length);
  978. for (a = 0; a <= input_text.length; a++) {
  979. ccol = random_char[i];
  980. if (input_text.charAt(a) == " ") i++;
  981. if (a >= random_length) {
  982. str_html += input_text.charAt(a);
  983. str_bbcode += input_text.charAt(a);
  984. } else {
  985. if ((a === 0 || input_text.charAt(a - 1) == " ") && a === input_text.length - 1) {
  986. str_html += "<font color='#" + ccol + "'>" + input_text.charAt(a) + "</font>";
  987. str_bbcode += '[color=#' + ccol + ']' + input_text.charAt(a) + '[/color]';
  988. } else if (a === 0 || input_text.charAt(a - 1) == " ") {
  989. str_html += "<font color='#" + ccol + "'>" + input_text.charAt(a);
  990. str_bbcode += '[color=#' + ccol + ']' + input_text.charAt(a);
  991. } else if (a === input_text.length - 1 || input_text.charAt(a) == " ") {
  992. str_html += input_text.charAt(a) + "</font>";
  993. str_bbcode += input_text.charAt(a) + '[/color]';
  994. } else {
  995. str_html += input_text.charAt(a);
  996. str_bbcode += input_text.charAt(a);
  997. }
  998. }
  999. }
  1000. }
  1001. $("#rainbow-preview").html('<b>' + str_html + '</b>');
  1002. $(editor).selection('replace', {text: '[B]' + str_bbcode + '[/B]'});
  1003. });
  1004. $(btnUnRainbow).on('click', function(event) {
  1005. $(editor).val(unRainbow($(editor).val()));
  1006. });
  1007. $($Toolbar).append(btnRainbow);
  1008. $($Toolbar).append(btnUnRainbow);
  1009. $(".vBulletin_editor").prepend('<div id="rainbow-preview"></div>');
  1010. }
  1011. };
  1012. }
  1013. function show_f17_link() {
  1014. var f17 = '<div class="navbar"><a href="748"><strong>M4V CENTRAIL</strong></a> </div><div class="navbar"><a href="p_titsilveral1479/262598"><strong>Đẹp trai thì mới có nhèo gái theo</strong></a> </div>';
  1015. $(".page > div > table:first-of-type").before(f17);
  1016. /*var bongda = '<div class="navbar"><a href="https://m4v.me/1074/forum/5725251/p/1"><strong>M4V TOÀN THƯ</strong></a> (Mọi thắc mắc chui vô đây)</div>';
  1017. $(".page > div > table:first-of-type").before(bongda);*/
  1018. }
  1019.  
  1020. /*
  1021. Main
  1022. */
  1023. var contentBar, settingsHTML, settings_VM, resize_choices, resize_choices_VM, rainbow_choices, rainbow_choices_VM;
  1024. contentBar = new ContentBar();
  1025. contentBar.run();
  1026. (function() {
  1027. settingsHTML = $('<div id="SettingsList" data-bind="foreach: settings_options"><div class="settings_option data-item"><strong><span class="settingContent" data-bind="html: name"></span></strong><input class="setting_bar_input" type="checkbox" data-bind="attr: {id: id, value: id}, checked: $root.check, click: $root.click" /></div></div>');
  1028. settingsHTML.appendTo("#wrap_SettingsList");
  1029. settings_VM = {
  1030. settings_options: [{"id": "settings_option_sl", "name": "Smile List"}, {"id": "settings_option_qq", "name": "Fast Quote"}, {"id": "settings_option_fpp", "name": "Capture"}, {"id": "settings_option_rs", "name": "Auto resize picture <span id='wrap_resize_choices' data-bind='stopBinding: true'></span>"}, {"id": "settings_option_rb", "name": "Rainbow Text <span id='wrap_rainbow_choices' data-bind='stopBinding: true'></span>"}, {"id": "settings_option_bb", "name": "Max Zoom<span id='settings_option_bb_img' class='inlineimg'></span>"}, {"id": "settings_option_help", "name": "<a href='javascript:;' title='Click to download' id='download_help'>Download file hướng dẫn chức năng</a>"}],
  1031. check: ko.observableArray(settings_list),
  1032. click: function(data, event) {
  1033. myLocalStorage.set("settings", JSON.stringify(settings_list));
  1034. if (data.id == "settings_option_rs") {
  1035. if (isInArray("settings_option_rs", settings_list)) $("#resize_choices").prop("disabled", false);
  1036. else $("#resize_choices").prop("disabled", true);
  1037. } else if (data.id == "settings_option_rb") {
  1038. if (isInArray("settings_option_rb", settings_list)) $("#rainbow_choices").prop("disabled", false);
  1039. else $("#rainbow_choices").prop("disabled", true);
  1040. }
  1041. return true;
  1042. }
  1043. };
  1044. ko.applyBindings(settings_VM, settingsHTML[0]);
  1045. resize_choices = $('<select id="resize_choices" data-bind="options: choices, value: selectedChoice" disabled="disabled"></select>');
  1046. resize_choices.appendTo('#wrap_resize_choices');
  1047. resize_choices_VM = {
  1048. choices: ["Full", "853", "1066", "1280"],
  1049. selectedChoice: ko.observable(maxwidthSaved)
  1050. };
  1051. resize_choices_VM.selectedChoice.subscribe(function(newValue) {
  1052. myLocalStorage.set("maxwidthSaved", newValue);
  1053. });
  1054. ko.applyBindings(resize_choices_VM, resize_choices[0]);
  1055.  
  1056. rainbow_choices = $('<select id="rainbow_choices" data-bind="options: choices, value: selectedChoice" disabled="disabled"></select>');
  1057. rainbow_choices.appendTo('#wrap_rainbow_choices');
  1058. rainbow_choices_VM = {
  1059. choices: ["Rainbow", "Word by word"],
  1060. selectedChoice: ko.observable(rainbowSaved)
  1061. };
  1062. rainbow_choices_VM.selectedChoice.subscribe(function(newValue) {
  1063. myLocalStorage.set("rainbowSaved", newValue);
  1064. });
  1065. ko.applyBindings(rainbow_choices_VM, rainbow_choices[0]);
  1066.  
  1067. $("#settings_option_help").remove();
  1068. $("#download_help").on("click", function(e) {
  1069. e.preventDefault();
  1070. location.href = "http://upnhanh.mobi/get/05Hejo";
  1071. });
  1072.  
  1073. var main = function(callback) {
  1074. if (/\/showthread\.php/.test(location.href)) {
  1075. show_f17_link();
  1076. $("#vB_Editor_QR_textarea").waitUntilExists(function() {
  1077. callback(false);
  1078. if (isInArray("settings_option_rs", settings_list)) {
  1079. MaxWidthResizeImage(maxwidthSaved);
  1080. var imagesOnPost = $("img[onload^='Ncode']");
  1081. imagesOnPost.each(function() {
  1082. var src = $(this).attr("src");
  1083. $(this).removeAttr("src");
  1084. $(this).attr("data-original", src);
  1085. $(this).wrap("<a href='" + src + "' target='_blank'></a>");
  1086. });
  1087. imagesOnPost.lazyload({
  1088. skip_invisible : false,
  1089. threshold : 200,
  1090. effect: "fadeIn"
  1091. });
  1092. }
  1093.  
  1094. if (isInArray("settings_option_sl", settings_list)) {
  1095. var emo = new Emo(myLocalStorage);
  1096. emo.run();
  1097. }
  1098. if (isInArray("settings_option_qq", settings_list)) {
  1099. var loadquickquote = new LoadQuickQuote();
  1100. loadquickquote.run();
  1101. }
  1102. if (isInArray("settings_option_rb", settings_list)) {
  1103. var rainbow = new RainbowText(rainbowSaved);
  1104. rainbow.run();
  1105. }
  1106. DetectImage();
  1107. if (isInArray("settings_option_fpp", settings_list)) Capture();
  1108. }, true);
  1109. return;
  1110. }
  1111. if (/\/showpost\.php/.test(location.href)) {
  1112. $("td[id^='td_post_']").waitUntilExists(function() {
  1113. if (isInArray("settings_option_rs", settings_list)) MaxWidthResizeImage(maxwidthSaved);
  1114. DetectImage();
  1115. if (isInArray("settings_option_fpp", settings_list)) Capture();
  1116. }, true);
  1117. } else if (/^https:\/\/vozforums\.com\/(newreply|editpost|newthread|private\.php\?do).*$/.test(location.href)) {
  1118. $(".vBulletin_editor").waitUntilExists(function() {
  1119. if (isInArray("settings_option_sl", settings_list)) {
  1120. var emo = new Emo(myLocalStorage);
  1121. emo.run();
  1122. }
  1123. if (isInArray("settings_option_rb", settings_list)) {
  1124. var rainbow = new RainbowText(rainbowSaved, 'full');
  1125. rainbow.run();
  1126. }
  1127. DetectImage();
  1128. }, true);
  1129. }
  1130. callback();
  1131. };
  1132. var all_page = function(f17_flag) {
  1133. f17_flag = typeof f17_flag === 'undefined' ? true : f17_flag;
  1134. if (f17_flag) show_f17_link();
  1135. var new_featured = "Hàng xách tay có sửa chữa từ các bô lão theheroofvn\n- Xin chân thành cảm ơn\n- #Tit-M4V",
  1136. featured = $.cookie('VozLove_newfeatured');
  1137. if (_.isUndefined(featured)) {
  1138. alert(new_featured);
  1139. } else {
  1140. if (featured != new_featured) {
  1141. alert(new_featured);
  1142. }
  1143. }
  1144. $.cookie('VozLove_newfeatured', new_featured, { expires: 365 });
  1145. };
  1146. main(all_page);
  1147. })();
  1148. });