var statcrunch_apppref = "new";var apppref = statcrunch_apppref; var tweets = new Array(); var scnames = new Array(); var texts = new Array(); var retweets = new Array(); var dates = new Array(); var months = new Array(); var years = new Array(); var colcount = 0; var month = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"); var debug = "false"; var pagestoload = new Array(); var pagenames = new Array(); var curpage = -1; var currenttimeinc = -1; var curpageloaded = false; var apptitle = ""; var mode = "names"; var tweetcount = 0; var trendsloaded = false; function getObjectAsString(obj){ var output = ''; for (property in obj) { if(obj[property] instanceof Object){ output += property + ': '; //getObjectAsString(obj[property])+';\n'; }else output += property + ': ' + obj[property]+'; '; } // alert(output); return output; } function ShowContent(d) { if(d.length < 1) { return; } document.getElementById(d).style.display = "block"; } function HideContent(d) { if(d.length < 1) { return; } document.getElementById(d).style.display = "none"; } function ReverseContentDisplay(d) { if(d.length < 1) { return; } if(document.getElementById(d).style.display == "none") { document.getElementById(d).style.display = "block"; } else { document.getElementById(d).style.display = "none"; } } function trim(str, chars) { return ltrim(rtrim(str, chars), chars); } function ltrim(str, chars) { chars = chars || "\\s"; return str.replace(new RegExp("^[" + chars + "]+", "g"), ""); } function rtrim(str, chars) { chars = chars || "\\s"; return str.replace(new RegExp("[" + chars + "]+$", "g"), ""); } function textareaToArray(t){ return trim(t.value).split(/[,\s\n\r]+/); } function getQueryString(key, defv){ if (defv==null) defv = ""; key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); var regex = new RegExp("[\\?&]"+key+"=([^&#]*)"); var qs = regex.exec(window.location.href); if(qs == null) return defv; else return unescape(qs[1]).replace(/\+/g,' '); } Array.prototype.unique = function() { var a = []; var l = this.length; for(var i=0; i tweet2.date) return -1; if (tweet1.date < tweet2.date) return 1; return 0; }; function createColumnParam(arr,lab,dlim){ colcount = colcount + 1; var output = ''; output += ''; output += ''; return(output); } function handleSelection(){ setTimeout("showSelectedTweets()",10); } function showSelectedTweets(){ var dacount = 0; if(apppref != "new"){ var sc = document.applets['webstat1']; for(var k = 0; k < tweets.length; k++){ if(sc.isTweetSelected(k)){ dacount++; if(dacount == 1) HideContent("selins"); ShowContent('tweet'+k); }else HideContent('tweet'+k); } }else{ var fw = document.getElementById('sc_frame_twitter').contentWindow; for(var k = 0; k < tweets.length; k++){ if(fw.twitter.isTweetSelected(k+1)){ dacount++; if(dacount == 1) HideContent("selins"); ShowContent('tweet'+k); }else HideContent('tweet'+k); } } document.getElementById("stcount").innerHTML = ""+dacount; if(dacount == 0) ShowContent("selins"); } function clearTweetSelections(){ if(apppref != "new") document.applets['webstat1'].clearTweetSelections(); else{ var fw = document.getElementById('sc_frame_twitter').contentWindow; if(fw) fw.twitter.clearTweetSelections(); } } function shortdate(date){ var dayear = date.getFullYear(); var damonth = month[date.getMonth()]; var dadate = date.getDate(); return damonth+" "+dadate+", "+dayear; } function timeAgo(date) { var relative_to = new Date(); var delta = ~~((relative_to.getTime() - date.getTime()) / 1000); var r = ''; // delta = delta + (relative_to.getTimezoneOffset() * 60); // alert(delta); if (delta <= 1) { r = '1 second ago'; } else if (delta < 60) { r = delta + ' seconds ago'; } else if (delta < 120) { r = '1 minute ago'; } else if (delta < ( 59*60)) { r = (~~(delta / 60)) + ' minutes ago'; } else if (delta < (2*90*60)) { // 2* because sometimes read 1 hours ago r = '1 hour ago'; } else if (delta < (24*60*60)) { r = (~~(delta / 3600)) + ' hours ago'; } else { r = shortdate(date); } return r; } function expandLinks(tweet) { if (tweet === undefined) return ''; var text = tweet.text, i = 0; if (tweet.entities) { // replace urls with expanded urls and let the ify shorten the link if (tweet.entities.urls && tweet.entities.urls.length) { for (i = 0; i < tweet.entities.urls.length; i++) { if (tweet.entities.urls[i].expanded_url) text = text.replace(tweet.entities.urls[i].url, tweet.entities.urls[i].expanded_url); // /g ? } } // replace media with url to actual image (or thing?) if (tweet.entities.media && tweet.entities.media.length) { for (i = 0; i < tweet.entities.media.length; i++) { if (tweet.entities.media[i].media_url || tweet.entities.media[i].expanded_url) text = text.replace(tweet.entities.media[i].url, tweet.entities.media[i].media_url ? tweet.entities.media[i].media_url : tweet.entities.media[i].expanded_url); // /g ? } } } return text; } function fixLink(t) { return t.replace(/[a-z]+:\/\/([a-z0-9-_]+\.[a-z0-9-_:~\+#%&\?\/.=]+[^:\.,\)\s*$])/ig, function(m, link) { return '' + ((link.length > 36) ? link.substr(0, 35) + '…' : link) + ''; }); }; function fixAt(t) { return t.replace(/(^|[^\w]+)\@([a-zA-Z0-9_]{1,15}(\/[a-zA-Z0-9-_]+)*)/g, function(m, m1, m2) { return m1 + '@' + m2 + ''; }); }; function fixHash(t) { return t.replace(/(^|[^&\w'"]+)\#([a-zA-Z0-9_^"^<]+)/g, function(m, m1, m2) { return m.substr(-1) === '"' || m.substr(-1) == '<' ? m : m1 + '#' + m2 + ''; }); }; function clean(tweettext) { return fixHash(fixAt(fixLink(tweettext))); } function processTweets(){ tweets.sort(date_sort_desc); var td = '
To select tweets, interact with the word wall above or click on the corresponding row numbers in the data table. Select the Data tab above to view the data table of tweets.
'; for(var i = 0; i < tweets.length; i++){ var tweet = tweets[i]; scnames[i] = tweet.user.screen_name.replace(/\,/gi," "); texts[i] = tweet.text.replace(/\"/gi,"").replace(/"""/gi,"").replace(/\|/gi," "); retweets[i] = tweet.retweet_count; years[i] = tweet.date.getFullYear(); months[i] = month[tweet.date.getMonth()]; dates[i] = tweet.date.getDate(); var nicedate = ''+shortdate(tweet.date)+''; var linkname = ''+scnames[i]+''; var nicetext = clean(expandLinks(tweet)); td += '
\n'+linkname+'\n
\n'+nicetext+'
'+nicedate+'
\n'; } document.getElementById('tweetdisplay').innerHTML = td; HideContent('loadarea'); HideContent('entryload'); ShowContent('apparea'); document.getElementById('appletarea').innerHTML = "\n"; ShowContent('tweetarea'); } function getStopWords(){ var stops = ""; var stopwords = trim(document.getElementById('stopwords').value); if(stopwords != "") stops += (" "+stopwords.replace(/\"/gi,"")); if(mode=="search"){ var keys = textareaToArray(document.getElementById('keywords')).unique(); for(var i = 0; i < keys.length; i++){ keys[i] = keys[i].replace(/\#/gi,"").replace(/\"/gi,""); stops += ' '+keys[i]+' @'+keys[i]+' #'+keys[i]+' '; } } if(mode=="names"){ var danames = textareaToArray(document.getElementById('names')).unique(); for(var i = 0; i < Math.min(danames.length,5); i++){ danames[i] = danames[i].replace(/\#/gi,"").replace(/\"/gi,""); stops += ' '+danames[i]+' @'+danames[i]+' '; } } return(stops); } function launchContent(){ document.getElementById('applettitle').innerHTML = '
'+apptitle+'
'; var fw = document.getElementById('sc_frame_twitter').contentWindow; if(fw){ var arrayofarrays = [scnames,texts,months,dates,years]; var arrayofnames = ["Name","Tweet","Month","Date","Year"]; for(var i = 0; i < arrayofarrays.length; i++){ var daarray = arrayofarrays[i]; fw.dp.setNameAt(i,arrayofnames[i]); for(var j = 0; j < daarray.length; j++){ fw.dp.setDataVal(i,j,daarray[j],true); } } fw.dp.trimColumns(); fw.dp.trimEmptyColumns(); fw.dp.updateTable(); fw.dp.clearRowSelections(); fw.dp.setScrollGrid(); fw.updateFocusAfterLoad(); fw.updateDataName('Tweets'); }else alert("Could not find StatCrunch window!"); } function parseDate(str) { var v=str.split(' '); return new Date(Date.parse(v[1]+" "+v[2]+", "+v[5]+" "+v[3]+" UTC")); } function parseSearchDate(str) { var v=str.split(' '); return new Date(Date.parse(v[1]+" "+v[2]+", "+v[3]+" "+v[4]+" UTC")); } function loadTweets(response){ if(!response.errors){ if(debug=="true") document.getElementById("debugarea").innerHTML += "Loading response"+getObjectAsString(response)+"
"; for(var i = 0; i < response.length; i++){ var tweet = response[i]; tweet.date = new Date(parseDate(tweet.created_at.replace(",",""))); tweet.image = tweet.user.profile_image_url; tweets.push(tweet); } curpageloaded = true; }else{ alert("Twitter says: "+response.errors[0].message+"!"); HideContent('loadarea'); ShowContent('entryarea'); } } function loadsearchtweets(keywords){ loadSearchTweets(keywords); } function loadSearchTweets(response){ if(!response.errors){ if(debug=="true") document.getElementById("debugarea").innerHTML += "Loading response"+getObjectAsString(response)+"
"; var mintweetid = Number.POSITIVE_INFINITY; for(var i = 0; i < response.statuses.length; i++){ var tweet = response.statuses[i]; tweet.date = new Date(parseSearchDate(tweet.created_at.replace(",",""))); // tweet.user = new Object(); // tweet.user.screen_name = tweet.from_user; tweet.image = tweet.user.profile_image_url; // tweet.retweet_count = tweet.metadata.recent_retweets; tweets.push(tweet); if(tweet.id < mintweetid) mintweetid = tweet.id; } if(curpage < pagestoload.length - 1){ pagestoload[curpage+1] += encodeURIComponent("&max_id="+mintweetid); if(debug=="true") console.log(pagestoload[curpage+1]); } curpageloaded = true; }else{ alert("Twitter says: "+response.errors[0].message+"!"); HideContent('loadarea'); ShowContent('entryarea'); } } function showRateLimit(response){ if(response.remaining_hits==0) alert("You have "+response.remaining_hits+" Twitter accesses remaining before a reset happens at "+response.reset_time+"."); } function displayTrends(response){ if(!response.errors){ var out = '

Trending Now:
    '; var n = Math.min(response[0].trends.length,10); for(var i = 0; i < n; i++){ out += '
  1. '+response[0].trends[i].name+'\n'; if( i < n-1) out += "   "; } out += '

'; document.getElementById("trends").innerHTML = out; trendsloaded = true; }else{ alert("Twitter says: "+response.errors[0].message+"!"); } } function loadTrends(){ loadScript('twitter-proxy.php?url='+encodeURIComponent('/trends/place.json?id=1&callback=displayTrends')); } function monitorScriptLoad(){ if(curpageloaded){ curpage = curpage + 1; currenttimeinc = 0; if(curpage <= pagestoload.length-1 && tweetcount < tweets.length) loadPage(curpage); else processTweets(); }else{ currenttimeinc = currenttimeinc + 1; if(currenttimeinc <= 200){ setTimeout("monitorScriptLoad()",100); }else{ alert("There was an error loading your desired data from Twitter. If you are searching for screen names, please make sure the names are all valid. Also, please make sure the Twitter web site is up and running. You may also try again later if this application's rate limit has been exceeded."); HideContent('loadarea'); ShowContent('entryarea'); // loadScript('http://api.twitter.com/account/rate_limit_status.json?callback=showRateLimit'); } } } function loadScript(src){ var e = document.createElement('script'); e.type = 'text/javascript'; // e.async = true; e.src = src; if(debug=="true") document.getElementById("debugarea").innerHTML += "Loading "+e.src+"
"; /* e.onerror= function () { alert("Error loading data from Twitter."+src+"! Please make sure this is a valid Twitter screen name. Also, please make sure that twitter.com is up and running."); } */ document.getElementsByTagName('head')[0].appendChild(e); } function loadPage(i){ if(i >= 0 && i < pagestoload.length){ curpage = i; currenttimeinc = 0; curpageloaded = false; tweetcount = tweets.length; document.getElementById('loadarea').innerHTML = pagenames[i]; loadScript(pagestoload[i]); setTimeout("monitorScriptLoad()",100); } } function startLoadingPages(){ reset(); HideContent('entryarea'); ShowContent('loadarea'); if(pagestoload.length >= 0){ loadPage(0); } } function loadName(name){ document.getElementById('names').value = name; loadNames(); } function loadNames(){ screennames = textareaToArray(document.getElementById('names')).unique(); if(screennames.length > 0){ if(debug=="true") document.getElementById("debugarea").innerHTML += "Loading "+screennames.toString()+"
"; pagestoload = new Array(); pagenames = new Array(); apptitle = 'Tweets for: Edit'; keywords = escape(keywords); for(var i =1; i <= 2; i++){ // console.log('twitter-proxy.php?url='+encodeURIComponent('/search/tweets.json?q='+keywords+'&callback=loadSearchTweets&count=100')); pagestoload.push('twitter-proxy.php?url='+encodeURIComponent('/search/tweets.json?q='+keywords+'&callback=loadSearchTweets&count=100')); pagenames.push("Loading tweets "+((i-1)*100+1)+" to "+(i*100)); } mode="search"; startLoadingPages(); }else alert("You must enter keywords!"); } function getPopular(){ pagestoload = new Array(); pagenames = new Array(); apptitle = 'Up to 200 popular tweets Edit'; for(var i =1; i <=2; i++){ pagestoload.push('twitter-proxy.php?url='+encodeURIComponent('/search/tweets.json?q=&callback=loadSearchTweets&count=100')); pagenames.push("Loading tweets "+((i-1)*100+1)+" to "+(i*100)); } startLoadingPages(); } function reset(){ tweets = new Array(); scnames = new Array(); texts = new Array(); retweets = new Array(); dates = new Array(); months = new Array(); years = new Array(); colcount = 0; document.getElementById("stcount").innerHTML = ""+0; } function initialize(){ var sninfo = getQueryString("names","false"); debug = getQueryString("debug","false"); if(debug=="true") ShowContent('debugarea'); if(sninfo != "false"){ document.getElementById('names').value = sninfo; // loadNames(); } // loadTrends(); } function backToEntry(){ HideContent('apparea'); HideContent('tweetarea'); ShowContent('entryload'); ShowContent('entryarea'); document.getElementById('appletarea').innerHTML = ""; }