(function(root, factory){ if(typeof define==='function'&&define.amd){ define([], factory); }else if(typeof exports==='object'){ module.exports=factory(); }else{ factory(); }}(this, function(){ var domNode=''; var maxTweets=20; var parseLinks=true; var queue=[]; var inProgress=false; var printTime=true; var printUser=true; var formatterFunction=null; var supportsClassName=true; var showRts=true; var customCallbackFunction=null; var showInteractionLinks=true; var showImages=false; var targetBlank=true; var lang='en'; var permalinks=true; var dataOnly=false; var script=null; var scriptAdded=false; function handleTweets(tweets){ if(customCallbackFunction===null){ var x=tweets.length; var n=0; var element=document.getElementById(domNode); var html=''; element.innerHTML=html; }else{ customCallbackFunction(tweets); }} function strip(data){ return data.replace(/]*>(.*?)<\/b>/gi, function(a,s){return s;}) .replace(/class="(?!(tco-hidden|tco-display|tco-ellipsis))+.*?"|data-query-source=".*?"|dir=".*?"|rel=".*?"/gi, ''); } function targetLinksToNewWindow(el){ var links=el.getElementsByTagName('a'); for (var i=links.length - 1; i >=0; i--){ links[i].setAttribute('target', '_blank'); }} function getElementsByClassName (node, classname){ var a=[]; var regex=new RegExp('(^|)' + classname + '(|$)'); var elems=node.getElementsByTagName('*'); for (var i=0, j=elems.length; i < j; i++){ if(regex.test(elems[i].className)){ a.push(elems[i]); }} return a; } function extractImageUrl(image_data){ if(image_data!==undefined&&image_data.innerHTML.indexOf('data-srcset') >=0){ var data_src=image_data.innerHTML .match(/data-srcset="([A-z0-9%_\.-]+)/i)[0]; return decodeURIComponent(data_src).split('"')[1]; }} var twitterFetcher={ fetch: function(config){ if(config.maxTweets===undefined){ config.maxTweets=20; } if(config.enableLinks===undefined){ config.enableLinks=true; } if(config.showUser===undefined){ config.showUser=true; } if(config.showTime===undefined){ config.showTime=true; } if(config.dateFunction===undefined){ config.dateFunction='default'; } if(config.showRetweet===undefined){ config.showRetweet=true; } if(config.customCallback===undefined){ config.customCallback=null; } if(config.showInteraction===undefined){ config.showInteraction=true; } if(config.showImages===undefined){ config.showImages=false; } if(config.linksInNewWindow===undefined){ config.linksInNewWindow=true; } if(config.showPermalinks===undefined){ config.showPermalinks=true; } if(config.dataOnly===undefined){ config.dataOnly=false; } if(inProgress){ queue.push(config); }else{ inProgress=true; domNode=config.domId; maxTweets=config.maxTweets; parseLinks=config.enableLinks; printUser=config.showUser; printTime=config.showTime; showRts=config.showRetweet; formatterFunction=config.dateFunction; customCallbackFunction=config.customCallback; showInteractionLinks=config.showInteraction; showImages=config.showImages; targetBlank=config.linksInNewWindow; permalinks=config.showPermalinks; dataOnly=config.dataOnly; var head=document.getElementsByTagName('head')[0]; if(script!==null){ head.removeChild(script); } script=document.createElement('script'); script.type='text/javascript'; if(config.list!==undefined){ script.src='https://syndication.twitter.com/timeline/list?' + 'callback=twitterFetcher.callback&dnt=false&list_slug=' + config.list.listSlug + '&screen_name=' + config.list.screenName + '&suppress_response_codes=true&lang=' + (config.lang||lang) + '&rnd=' + Math.random(); }else if(config.profile!==undefined){ script.src='https://syndication.twitter.com/timeline/profile?' + 'callback=twitterFetcher.callback&dnt=false' + '&screen_name=' + config.profile.screenName + '&suppress_response_codes=true&lang=' + (config.lang||lang) + '&rnd=' + Math.random(); }else if(config.likes!==undefined){ script.src='https://syndication.twitter.com/timeline/likes?' + 'callback=twitterFetcher.callback&dnt=false' + '&screen_name=' + config.likes.screenName + '&suppress_response_codes=true&lang=' + (config.lang||lang) + '&rnd=' + Math.random(); }else{ script.src='https://cdn.syndication.twimg.com/widgets/timelines/' + config.id + '?&lang=' + (config.lang||lang) + '&callback=twitterFetcher.callback&' + 'suppress_response_codes=true&rnd=' + Math.random(); } head.appendChild(script); }}, callback: function(data){ data.body=data.body.replace(/(]*>)|(]*>)/g, ''); if(!showImages){ data.body=data.body.replace(/(]*>|(]*>))/g, ''); } if(!printUser){ data.body=data.body.replace(/(]*>)/g, ''); } var div=document.createElement('div'); div.innerHTML=data.body; if(typeof(div.getElementsByClassName)==='undefined'){ supportsClassName=false; } function swapDataSrc(element){ var avatarImg=element.getElementsByTagName('img')[0]; avatarImg.src=avatarImg.getAttribute('data-src-2x'); return element; } var tweets=[]; var authors=[]; var times=[]; var images=[]; var rts=[]; var tids=[]; var permalinksURL=[]; var x=0; if(supportsClassName){ var tmp=div.getElementsByClassName('timeline-Tweet'); while (x < tmp.length){ if(tmp[x].getElementsByClassName('timeline-Tweet-retweetCredit').length > 0){ rts.push(true); }else{ rts.push(false); } if(!rts[x]||rts[x]&&showRts){ tweets.push(tmp[x].getElementsByClassName('timeline-Tweet-text')[0]); tids.push(tmp[x].getAttribute('data-tweet-id')); if(printUser){ authors.push(swapDataSrc(tmp[x].getElementsByClassName('timeline-Tweet-author')[0])); } times.push(tmp[x].getElementsByClassName('dt-updated')[0]); permalinksURL.push(tmp[x].getElementsByClassName('timeline-Tweet-timestamp')[0]); if(tmp[x].getElementsByClassName('timeline-Tweet-media')[0]!==undefined){ images.push(tmp[x].getElementsByClassName('timeline-Tweet-media')[0]); }else{ images.push(undefined); }} x++; }}else{ var tmp=getElementsByClassName(div, 'timeline-Tweet'); while (x < tmp.length){ if(getElementsByClassName(tmp[x], 'timeline-Tweet-retweetCredit').length > 0){ rts.push(true); }else{ rts.push(false); } if(!rts[x]||rts[x]&&showRts){ tweets.push(getElementsByClassName(tmp[x], 'timeline-Tweet-text')[0]); tids.push(tmp[x].getAttribute('data-tweet-id')); if(printUser){ authors.push(swapDataSrc(getElementsByClassName(tmp[x],'timeline-Tweet-author')[0])); } times.push(getElementsByClassName(tmp[x], 'dt-updated')[0]); permalinksURL.push(getElementsByClassName(tmp[x], 'timeline-Tweet-timestamp')[0]); if(getElementsByClassName(tmp[x], 'timeline-Tweet-media')[0]!==undefined){ images.push(getElementsByClassName(tmp[x], 'timeline-Tweet-media')[0]); }else{ images.push(undefined); }} x++; }} if(tweets.length > maxTweets){ tweets.splice(maxTweets, (tweets.length - maxTweets)); authors.splice(maxTweets, (authors.length - maxTweets)); times.splice(maxTweets, (times.length - maxTweets)); rts.splice(maxTweets, (rts.length - maxTweets)); images.splice(maxTweets, (images.length - maxTweets)); permalinksURL.splice(maxTweets, (permalinksURL.length - maxTweets)); } var arrayTweets=[]; var x=tweets.length; var n=0; if(dataOnly){ while (n < x){ arrayTweets.push({ tweet: tweets[n].innerHTML, author: authors[n].innerHTML, time: times[n].textContent, image: extractImageUrl(images[n]), rt: rts[n], tid: tids[n], permalinkURL: (permalinksURL[n]===undefined) ? '':permalinksURL[n].href }); n++; }}else{ while (n < x){ if(typeof(formatterFunction)!=='string'){ var datetimeText=times[n].getAttribute('datetime'); var newDate=new Date(times[n].getAttribute('datetime') .replace(/-/g,'/').replace('T', ' ').split('+')[0]); var dateString=formatterFunction(newDate, datetimeText); times[n].setAttribute('aria-label', dateString); if(tweets[n].textContent){ if(supportsClassName){ times[n].textContent=dateString; }else{ var h=document.createElement('p'); var t=document.createTextNode(dateString); h.appendChild(t); h.setAttribute('aria-label', dateString); times[n]=h; }}else{ times[n].textContent=dateString; }} var op=''; if(parseLinks){ if(targetBlank){ targetLinksToNewWindow(tweets[n]); if(printUser){ targetLinksToNewWindow(authors[n]); }} if(printUser){ op +='
' + strip(authors[n].innerHTML) + '
'; } op +='

' + strip(tweets[n].innerHTML) + '

'; if(printTime){ if(permalinks){ op +='

' + times[n].getAttribute('aria-label') + '

'; }else{ op +='

' + times[n].getAttribute('aria-label') + '

'; }} }else{ if(tweets[n].textContent){ if(printUser){ op +='

' + authors[n].textContent + '

'; } op +='

' + tweets[n].textContent + '

'; if(printTime){ op +='

' + times[n].textContent + '

'; }}else{ if(printUser){ op +='

' + authors[n].textContent + '

'; } op +='

' + tweets[n].textContent + '

'; if(printTime){ op +='

' + times[n].textContent + '

'; }} } if(showInteractionLinks){ op +='

' + '

'; } if(showImages&&images[n]!==undefined&&extractImageUrl(images[n])!==undefined){ op +='
' + 'Image from tweet' + '
'; } if(showImages){ arrayTweets.push(op); }else if(!showImages&&tweets[n].textContent.length){ arrayTweets.push(op); } n++; }} handleTweets(arrayTweets); inProgress=false; if(queue.length > 0){ twitterFetcher.fetch(queue[0]); queue.splice(0,1); }} }; window.twitterFetcher=twitterFetcher; return twitterFetcher; }));