PluginProbe ʕ •ᴥ•ʔ
Custom Twitter Feeds – A Tweets Widget or X Feed Widget / 2.7.0
Custom Twitter Feeds – A Tweets Widget or X Feed Widget v2.7.0
2.8.0 2.7.0 2.6.1 2.6.0 1.0 1.0.1 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.2 1.2.1 1.2.10 1.2.11 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3 1.4 1.4.1 1.5 1.5.1 1.6 1.6.1 1.7 1.8 1.8.1 1.8.2 1.8.3 1.8.4 2.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1 2.1.1 2.1.2 2.2 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.3.0 2.3.1 2.5.4 2.5.5 trunk
custom-twitter-feeds / js / ctf-scripts.js
custom-twitter-feeds / js Last commit date
admin-notifications.js 1 month ago ctf-admin-scripts.js 1 month ago ctf-blocks.js 1 month ago ctf-scripts.js 1 month ago ctf-scripts.min.js 1 month ago jquery.matchHeight-min.js 1 month ago
ctf-scripts.js
596 lines
1 var ctf_js_exists = (typeof ctf_js_exists !== 'undefined') ? true : false;
2 if(!ctf_js_exists){
3
4 (function ($) {
5
6 window.ctf_init = function() {
7 window.ctfObject = {};
8 if ($('.ctf').length
9 && typeof $('.ctf').first().attr('data-ctf-flags') !== 'undefined') {
10 var flags = $('.ctf').first().attr('data-ctf-flags').split(',');
11
12 if (flags.indexOf('gdpr') > -1) {
13 window.ctfObject.consentGiven = false;
14 window.ctfObject.gdpr = true;
15 } else {
16 window.ctfObject.consentGiven = true;
17 window.ctfObject.gdpr = false;
18 }
19
20 if (flags.indexOf('locator') > -1) {
21 var random = Math.floor(Math.random() * $('.ctf').length);
22 window.ctfObject.locator = $('.ctf').length === 1 || (random === 1);
23 } else {
24 window.ctfObject.locator = false;
25 }
26
27 } else {
28 window.ctfObject.consentGiven = true;
29 window.ctfObject.gdpr = false;
30 window.ctfObject.locator = false;
31 }
32
33 if ($('.ctf').length <= $('.ctf_is_initialized').length) {
34 return;
35 }
36 if (window.ctfObject.consentGiven) {
37 ctfMaybeAddIntents();
38 }
39 //Runs every time new tweets are loaded
40 function ctfScripts($ctf) {
41 $ctf.addClass('ctf_is_initialized');
42
43 if (window.ctfObject.locator) {
44 var feedID = typeof $ctf.attr('data-feed-id') ? $ctf.attr('data-feed-id') : 'ctf-single',
45 postID = typeof $ctf.attr('data-postid') ? $ctf.attr('data-postid') : '';
46
47 jQuery.ajax({
48 url: ctf.ajax_url,
49 type: 'post',
50 data: {
51 action: 'ctf_do_locator',
52 atts: $ctf.attr('data-ctfshortcode'),
53 feed_id: feedID,
54 location: ctfLocationGuess($ctf),
55 post_id: postID,
56 },
57 success: function (data) {
58 }
59 }); // ajax call
60 }
61
62 if (ctfCheckConsent()) {
63 ctfRemovePrivacyFeatures($ctf);
64 } else {
65 ctfApplyPrivacyFeatures($ctf);
66 }
67 //Loop through each newly loaded tweet
68 $ctf.find('.ctf-item.ctf-new').each(function () {
69
70 var $ctfItem = $(this),
71 $ctfTextMedia = $ctfItem.find('.ctf-tweet-text-media-wrap'),
72 $ctfText = $ctfItem.find('.ctf-tweet-text').remove('.ctf-tweet-text-media-wrap'),
73 ctfTextStr = ' ' + $ctfText.html();
74
75 if ($ctf.attr('data-ctfdisablelinks') != 'true' && typeof ctfTextStr !== 'undefined' && !$ctf.find('.ctf-tweet-text-link').length) {
76
77 var ctfLinkColor = $ctf.attr('data-ctflinktextcolor'),
78 ctfLinkColorHex = '';
79 if (ctfLinkColor) ctfLinkColorHex = ctfLinkColor.replace(';', '').split("#")[1];
80
81 //Link URLs
82 window.ctfLinkify = (function () {
83 var k = "[a-z\\d.-]+://",
84 h = "(?:(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])\\.){3}(?:[0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])",
85 c = "(?:(?:[^\\s!@#$%^&*()_=+[\\]{}\\\\|;:'\",.<>/?]+)\\.)+",
86 n = "(?:ac|ad|aero|ae|af|ag|ai|al|am|an|ao|aq|arpa|ar|asia|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|biz|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|cat|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|coop|com|co|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|info|int|in|io|iq|ir|is|it|je|jm|jobs|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mobi|mo|mp|mq|mr|ms|mt|museum|mu|mv|mw|mx|my|mz|name|na|nc|net|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pro|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tel|tf|tg|th|tj|tk|tl|tm|tn|to|tp|travel|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|xn--0zwm56d|xn--11b5bs3a9aj6g|xn--80akhbyknj4f|xn--9t4b11yi5a|xn--deba0ad|xn--g6w251d|xn--hgbk6aj7f53bba|xn--hlcj6aya9esc7a|xn--jxalpdlp|xn--kgbechtv|xn--zckzah|ye|yt|yu|za|zm|zw)",
87 f = "(?:" + c + n + "|" + h + ")", o = "(?:[;/][^#?<>\\s]*)?",
88 e = "(?:\\?[^#<>\\s]*)?(?:#[^<>\\s]*)?", d = "\\b" + k + "[^<>\\s]+",
89 a = "\\b" + f + o + e + "(?!\\w)", m = "mailto:",
90 j = "(?:" + m + ")?[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@" + f + e + "(?!\\w)",
91 l = new RegExp("(?:" + d + "|" + a + "|" + j + ")", "ig"), g = new RegExp("^" + k, "i"),
92 b = {"'": "`", ">": "<", ")": "(", "]": "[", "}": "{", "B;": "B+", "b:": "b9"}, i = {
93 callback: function (q, p) {
94 return p ? '<a href="' + p + '" title="' + p + '" target="_blank">' + q + "</a>" : q
95 },
96 punct_regexp: /(?:[!?.,:;'"]|(?:&|&amp;)(?:lt|gt|quot|apos|raquo|laquo|rsaquo|lsaquo);)$/
97 };
98 return function (u, z) {
99 z = z || {};
100 var w, v, A, p, x = "", t = [], s, E, C, y, q, D, B, r;
101 for (v in i) {
102 if (z[v] === undefined) {
103 z[v] = i[v]
104 }
105 }
106 while (w = l.exec(u)) {
107 A = w[0];
108 E = l.lastIndex;
109 C = E - A.length;
110 if (/[\/:]/.test(u.charAt(C - 1))) {
111 continue
112 }
113 do {
114 y = A;
115 r = A.substr(-1);
116 B = b[r];
117 if (B) {
118 q = A.match(new RegExp("\\" + B + "(?!$)", "g"));
119 D = A.match(new RegExp("\\" + r, "g"));
120 if ((q ? q.length : 0) < (D ? D.length : 0)) {
121 A = A.substr(0, A.length - 1);
122 E--
123 }
124 }
125 if (z.punct_regexp) {
126 A = A.replace(z.punct_regexp, function (F) {
127 E -= F.length;
128 return ""
129 })
130 }
131 } while (A.length && A !== y);
132 p = A;
133 if (!g.test(p)) {
134 p = (p.indexOf("@") !== -1 ? (!p.indexOf(m) ? "" : m) : !p.indexOf("irc.") ? "irc://" : !p.indexOf("ftp.") ? "ftp://" : "http://") + p
135 }
136 if (s != C) {
137 t.push([u.slice(s, C)]);
138 s = E
139 }
140 t.push([A, p])
141 }
142 t.push([u.substr(s)]);
143 for (v = 0; v < t.length; v++) {
144 x += z.callback.apply(window, t[v])
145 }
146 return x || u
147 }
148 })();
149 if (!$ctfText.find('a').length) {
150 $ctfText.find('.emoji').each(function() {
151 $(this).replaceWith($(this).attr('alt'));
152 });
153 ctfTextStr = ' ' +$ctfText.html();
154 ctfTextStr = ctfLinkify(ctfTextStr);
155 }
156 //Link hashtags
157 var ctfHashRegex = /(^|\s)#(\w*[\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]+\w*)/gi;
158
159 function ctfHashReplacer(hash) {
160 //Remove white space at beginning of hash
161 var replacementString = hash.trim();
162 //If the hash is a hex code then don't replace it with a link as it's likely in the style attr, eg: "color: #ff0000"
163 if (/^#[0-9A-F]{6}$/i.test(replacementString)) {
164 return replacementString;
165 } else {
166 return ' <a href="https://twitter.com/hashtag/' + replacementString.substring(1) + '" target="_blank" rel="nofollow noopener">' + replacementString + '</a>';
167 }
168 }
169
170 //Replace hashtags in text
171 if (ctfTextStr.length > 0) {
172 //Add a space after all <br> tags so that #hashtags immediately after them are also converted to hashtag links. Without the space they aren't captured by the regex.
173 ctfTextStr = ctfTextStr.replace(/<br>/g, "<br> ");
174 ctfTextStr = ctfTextStr.replace(ctfHashRegex, ctfHashReplacer);
175 }
176
177 //Link @tags
178 function ctfReplaceTags(tag) {
179 var replacementString = tag.trim();
180 return ' <a href="https://twitter.com/' + replacementString.substring(1) + '" target="_blank" rel="nofollow noopener">' + replacementString + '</a>';
181 }
182
183 var tagRegex = /[\s][@]+[A-Za-z0-9-_]+/g;
184 ctfTextStr = ctfTextStr.replace(tagRegex, ctfReplaceTags);
185
186
187 //Replace text with linked version
188 $ctfText.html(ctfTextStr.trim());
189 $ctfText.append($ctfTextMedia);
190
191 //Add link color
192 $ctfText.find('a').css('color', '#' + ctfLinkColorHex);
193 $ctfTextMedia.css('color', '#' + ctfLinkColorHex);
194
195 } // End "ctfdata-disablelinks" check
196
197 // shorten long urls in tweets
198 $ctfItem.find('.ctf-tweet-text a').each(function () {
199 if (jQuery(this).text().indexOf('http') > -1 && jQuery(this).text().length > 63) {
200 jQuery(this).text(jQuery(this).text().substring(0, 60) + '...');
201 }
202 });
203
204 }); // End .ctfItem loop
205
206 //Change color of retweet icon to match text
207 // $ctf.find('.ctf-retweet-icon').css({'background' : $ctf.find('.ctf-tweet-text a').css('color')}); //This doesn't work well if the link color is set to white as the default color of the icon text is also white
208
209 //Change colors of some items to match tweet text
210 $ctf.find('.ctf-author-name, .ctf-tweet-date, .ctf-author-screenname, .ctf-twitterlink, .ctf-author-box-link, .ctf-retweet-text, .ctf-quoted-tweet').css('color', $ctf.find('.ctf-tweet-text').css('color'));
211
212 $ctf.find('.ctf_more').off('click').on('click', function (e) {
213 e.preventDefault();
214 $(this).hide().next('.ctf_remaining').show();
215 });
216
217 // Call Custom JS if it exists
218 if (typeof ctf_custom_js == 'function') ctf_custom_js($);
219
220 $ctf.find('.ctf-author-box-link p:empty').remove();
221 } // end ctfScripts()
222
223 function ctfLoadTweets(lastIDData, shortcodeData, $ctf, $ctfMore, numNeeded, persistentIndex) {
224
225 //Display loader
226 $ctfMore.addClass('ctf-loading').append('<div class="ctf-loader"></div>');
227 $ctfMore.find('.ctf-loader').css('background-color', $ctfMore.css('color'));
228
229 var feedID = typeof $ctf.attr('data-feedid') ? $ctf.attr('data-feedid') : 'ctf-single',
230 postID = typeof $ctf.attr('data-postid') ? $ctf.attr('data-postid') : '',
231 v2feed = typeof $ctf.attr('data-feed') ? $ctf.attr('data-feed') : '';
232
233
234 jQuery.ajax({
235 url: ctf.ajax_url,
236 type: 'post',
237 data: {
238 action: 'ctf_get_more_posts',
239 last_id_data: lastIDData,
240 shortcode_data: shortcodeData,
241 num_needed: numNeeded,
242 persistent_index: persistentIndex,
243 feed_id: feedID,
244 location: ctfLocationGuess($ctf),
245 post_id: postID,
246 v2feed: v2feed,
247 },
248 success: function (data) {
249 if (lastIDData !== '') {
250 // appends the html echoed out in ctf_get_new_posts() to the last post element
251 if (data.indexOf('<meta charset') == -1) {
252 $ctf.find('.ctf-item').removeClass('ctf-new').last().after(data);
253 }
254
255 if ($ctf.find('.ctf-out-of-tweets').length) {
256 $ctfMore.hide();
257 //Fade in the no more tweets message
258 $ctf.find('.ctf-out-of-tweets p').eq(0).fadeIn().end().eq(1).delay(500).fadeIn();
259 }
260 } else {
261 $ctf.find('.ctf-tweets').append(data);
262 }
263
264
265 //Remove loader
266 $ctfMore.removeClass('ctf-loading').find('.ctf-loader').remove();
267
268 //Re-run JS code
269 ctfScripts($ctf);
270
271 }
272 }); // ajax call
273 }
274
275 $('.ctf').each(function () {
276
277 var $ctf = $(this),
278 numNeeded = parseInt($ctf.attr('data-ctfneeded'));
279
280 //Adds a class if the feed is in a narrow column or on mobile so we can make styling adjustments
281 if ($ctf.width() <= 480) $ctf.addClass('ctf-narrow');
282 if ($ctf.width() <= 320) $ctf.addClass('ctf-super-narrow');
283
284 if (!$(this).hasClass('ctf_is_initialized')) {
285 ctfScripts($ctf);
286 }
287
288 // delay added to prevent strange issue with ajax themes returning the entire page
289 setTimeout(function () {
290 if (numNeeded > 0) {
291 var $ctfMore = $ctf.find('.ctf-more'),
292 lastIDData = $ctf.find('.ctf-item').last().attr('id'),
293 persistentIndex = $ctf.find('.ctf-item').length,
294 shortcodeData = $ctf.attr('data-ctfshortcode');
295
296 ctfLoadTweets(lastIDData, shortcodeData, $ctf, $ctfMore, numNeeded, persistentIndex);
297 }
298 }, 500);
299
300 // add the load more button and input to simulate a dynamic json file call
301 $ctf.find('.ctf-more').on('click', function () {
302 // read the json that is in the ctf-shortcode-data that contains all of the shortcode arguments
303 var $ctfMore = $(this),
304 lastIDData = $ctf.find('.ctf-item').last().attr('id'),
305 persistentIndex = $ctf.find('.ctf-item').length,
306 shortcodeData = $ctf.attr('data-ctfshortcode');
307
308 ctfLoadTweets(lastIDData, shortcodeData, $ctf, $ctfMore, 0, persistentIndex);
309
310 });
311
312 $ctf.find('.ctf-author-box-link p:empty').remove();
313 setTimeout(function () {
314 if (ctfCheckConsent()) {
315 ctfRemovePrivacyFeatures($ctf);
316 } else {
317 ctfApplyPrivacyFeatures($ctf);
318 }
319 }, 500);
320 }); // end .cff each loop
321
322
323 }
324
325 jQuery(document).ready(function($) {
326 ctf_init();
327
328 // Cookie Notice by dFactory
329 $('#cookie-notice a').on('click',function() {
330 setTimeout(function() {
331 ctfAterConsentToggled();
332 },1000);
333 });
334
335 // Cookie Notice by dFactory
336 $('#cookie-law-info-bar a').on('click',function() {
337 setTimeout(function() {
338 ctfAterConsentToggled();
339 },1000);
340 });
341
342 // GDPR Cookie Consent by WebToffee
343 $('.cli-user-preference-checkbox').on('click',function(){
344 ctfAterConsentToggled();
345 });
346
347 // Cookiebot
348 $(window).on('CookiebotOnAccept', function (event) {
349 ctfAterConsentToggled();
350 });
351
352 // Complianz by Really Simple Plugins
353 $(document).on('cmplzEnableScripts', function (event) {
354 if ( event.detail === 'marketing' ) {
355 $('.ctf').each(function () {
356 window.ctfObject.consentGiven = true;
357 ctfAterConsentToggled();
358 });
359 }
360 });
361
362 // Complianz by Really Simple Plugins
363 $(document).on('cmplzFireCategories', function (event) {
364 if ( event.detail.category === 'marketing' ) {
365 $('.ctf').each(function () {
366 window.ctfObject.consentGiven = true;
367 ctfAterConsentToggled();
368 });
369 }
370 });
371
372 // Borlabs Cookie by Borlabs
373 $(document).on('borlabs-cookie-consent-saved', function (event) {
374 ctfAterConsentToggled();
375 });
376
377 // devowl.io
378 if (typeof window.consentApi !== 'undefined') {
379 window.consentApi.consent("custom-twitter-feed").then(() => {
380 try {
381 // applies full features to feed
382 setTimeout(function() {
383 $('.ctf').each(function () {
384 window.ctfObject.consentGiven = true;
385 ctfAterConsentToggled();
386 });
387 },1000);
388 }
389 catch (error) {
390 // do nothing
391 }
392 });
393 }
394
395 // Moove Agency
396 $('.moove-gdpr-infobar-allow-all').on('click',function() {
397 setTimeout(function() {
398 $('.ctf').each(function () {
399 window.ctfObject.consentGiven = true;
400 ctfAterConsentToggled();
401 });
402 },1000);
403 });
404
405 // WPConsent
406 window.addEventListener('wpconsent_consent_saved', function(event) {
407 setTimeout(function() {
408 $('.ctf').each(function () {
409 ctfAterConsentToggled();
410 });
411 },1000);
412 });
413
414 window.addEventListener('wpconsent_consent_updated', function(event) {
415 setTimeout(function() {
416 $('.ctf').each(function () {
417 ctfAterConsentToggled();
418 });
419 },1000);
420 });
421 });
422
423 function ctfCheckConsent() {
424 if (window.ctfObject.consentGiven || !window.ctfObject.gdpr) {
425 return true;
426 }
427 if (typeof window.WPConsent !== 'undefined') {
428 window.ctfObject.consentGiven = window.WPConsent.hasConsent('marketing');
429 } else if (typeof CLI_Cookie !== "undefined") { // GDPR Cookie Consent by WebToffee
430 if (CLI_Cookie.read(CLI_ACCEPT_COOKIE_NAME) !== null) {
431
432 // WebToffee no longer uses this cookie but being left here to maintain backwards compatibility
433 if (CLI_Cookie.read('cookielawinfo-checkbox-non-necessary') !== null) {
434 window.ctfObject.consentGiven = CLI_Cookie.read('cookielawinfo-checkbox-non-necessary') === 'yes';
435 }
436
437 if (CLI_Cookie.read('cookielawinfo-checkbox-necessary') !== null) {
438 window.ctfObject.consentGiven = CLI_Cookie.read('cookielawinfo-checkbox-necessary') === 'yes';
439 }
440 }
441
442 } else if (typeof window.cnArgs !== "undefined") { // Cookie Notice by dFactory
443 var value = "; " + document.cookie,
444 parts = value.split( '; cookie_notice_accepted=' );
445
446 if ( parts.length === 2 ) {
447 var val = parts.pop().split( ';' ).shift();
448
449 window.ctfObject.consentGiven = (val === 'true');
450 }
451 } else if (typeof window.cookieconsent !== 'undefined') { // Complianz by Really Simple Plugins
452 window.ctfObject.consentGiven = ( ctfCmplzGetCookie('cmplz_consent_status') === 'allow' || jQuery('body').hasClass('cmplz-status-marketing') );
453 } else if (typeof window.Cookiebot !== "undefined") { // Cookiebot by Cybot A/S
454 window.ctfObject.consentGiven = Cookiebot.consented;
455 } else if (typeof window.BorlabsCookie !== 'undefined') { // Borlabs Cookie by Borlabs
456 window.ctfObject.consentGiven = typeof window.BorlabsCookie.Consents !== 'undefined' ? window.BorlabsCookie.Consents.hasConsent('twitter') : window.BorlabsCookie.checkCookieConsent('twitter');
457 } else if (cffCmplzGetCookie('moove_gdpr_popup')) { // Moove GDPR Popup
458 var moove_gdpr_popup = JSON.parse(decodeURIComponent(ctfCmplzGetCookie('moove_gdpr_popup')));
459 window.ctfObject.consentGiven = typeof moove_gdpr_popup.thirdparty !== "undefined" && moove_gdpr_popup.thirdparty === "1";
460 }
461
462 var evt = jQuery.Event('ctfcheckconsent');
463 evt.feed = this;
464 jQuery(window).trigger(evt);
465
466 return window.ctfObject.consentGiven; // GDPR not enabled
467 }
468
469 function ctfApplyPrivacyFeatures($ctf) {
470 if (!$ctf.find('.ctf-hide-avatar').length || $ctf.find('.ctf-hide-avatar.ctf-no-consent').length) {
471 $ctf.find('.ctf-item').addClass('ctf-hide-avatar ctf-no-consent');
472 }
473 if ($('.ctf-header-img span').length) {
474 $('.ctf-header-img').addClass('ctf-no-consent');
475 }
476 }
477
478 function ctfRemovePrivacyFeatures($ctf) {
479 ctfMaybeAddIntents();
480 $ctf.find('.ctf-item.ctf-no-consent').removeClass('ctf-hide-avatar');
481 $ctf.find('.ctf-author-avatar').each(function() {
482 $(this).find('span').replaceWith('<img src="'+$(this).find('span').attr('data-avatar')+'" alt="'+$(this).find('span').attr('data-alt')+'" width="48" height="48">');
483 });
484 $ctf.find('.ctf-header-img').each(function() {
485 $(this).find('span').replaceWith('<img src="'+$(this).find('span').attr('data-avatar')+'" alt="'+$(this).find('span').attr('data-alt')+'" width="48" height="48">');
486 });
487 $ctf.find('.ctf-no-consent').removeClass('ctf-no-consent');
488 //Header profile pic hover
489 $ctf.find('.ctf-header .ctf-header-link').on('mouseenter mouseleave', function(e) {
490 switch(e.type) {
491 case 'mouseenter':
492 $ctf.find('.ctf-header .ctf-header-img-hover').fadeIn(200);
493 break;
494 case 'mouseleave':
495 $ctf.find('.ctf-header .ctf-header-img-hover').stop().fadeOut(600);
496 break;
497 }
498 });
499 }
500
501 function ctfAterConsentToggled() {
502 if (ctfCheckConsent()) {
503 $('.ctf').each(function () {
504 ctfRemovePrivacyFeatures($(this));
505 });
506 }
507 }
508
509 function ctfMaybeAddIntents() {
510 if (typeof window.ctfObject.intentsIncluded === undefined) {
511 window.ctfObject.intentsIncluded = false;
512 }
513
514 $('.ctf').each(function () {
515 if (!window.ctfObject.intentsIncluded && typeof $(this).attr('data-ctfintents') !== undefined) {
516 window.ctfObject.intentsIncluded = true;
517 (function() {
518 if (window.__twitterIntentHandler) return;
519 var intentRegex = /twitter\.com\/intent\/(\w+)/,
520 windowOptions = 'scrollbars=yes,resizable=yes,toolbar=no,location=yes',
521 width = 550,
522 height = 420,
523 winHeight = screen.height,
524 winWidth = screen.width;
525
526 function handleIntent(e) {
527 e = e || window.event;
528 var target = e.target || e.srcElement,
529 m, left, top;
530
531 while (target && target.nodeName.toLowerCase() !== 'a') {
532 target = target.parentNode;
533 }
534
535 if (target && target.nodeName.toLowerCase() === 'a' && target.href) {
536 m = target.href.match(intentRegex);
537 if (m) {
538 left = Math.round((winWidth / 2) - (width / 2));
539 top = 0;
540
541 if (winHeight > height) {
542 top = Math.round((winHeight / 2) - (height / 2));
543 }
544
545 window.open(target.href, 'intent', windowOptions + ',width=' + width +
546 ',height=' + height + ',left=' + left + ',top=' + top);
547 e.returnValue = false;
548 e.preventDefault && e.preventDefault();
549 }
550 }
551 }
552
553 if (document.addEventListener) {
554 document.addEventListener('click', handleIntent, false);
555 } else if (document.attachEvent) {
556 document.attachEvent('onclick', handleIntent);
557 }
558 window.__twitterIntentHandler = true;
559 }());
560 }
561 });
562 }
563
564 function ctfCmplzGetCookie(cname) {
565 var name = cname + "="; //Create the cookie name variable with cookie name concatenate with = sign
566 var cArr = window.document.cookie.split(';'); //Create cookie array by split the cookie by ';'
567
568 //Loop through the cookies and return the cookie value if it find the cookie name
569 for (var i = 0; i < cArr.length; i++) {
570 var c = cArr[i].trim();
571 //If the name is the cookie string at position 0, we found the cookie and return the cookie value
572 if (c.indexOf(name) == 0)
573 return c.substring(name.length, c.length);
574 }
575
576 return "";
577 }
578 function ctfLocationGuess($feed) {
579 var location = 'content';
580
581 if ($feed.closest('footer').length) {
582 location = 'footer';
583 } else if ($feed.closest('.header').length
584 || $feed.closest('header').length) {
585 location = 'header';
586 } else if ($feed.closest('.sidebar').length
587 || $feed.closest('aside').length) {
588 location = 'sidebar';
589 }
590
591 return location;
592 }
593 })(jQuery);
594
595
596 } //End ctf_js_exists check