/*
 Trends
 Kenneth Kufluk 2011

 I take tweets and break them down into words.
 I index the tweets by word and maintain a count of popular words.
 The aim is to show micro-trends.

 Listens:
 - Roar.tweet
 - common-words

 Fires:
 - Roar.newWordset
*/
$(function() {
 var $tweetDiv =$('#activity');

 var trend_words = {};
 var hashtags = {};

 var RE_break_into_words = /\b(\w{4,})\b/g;
 var silent_words = ['http', 'bit', 'com'];

 // Get:  common-words
 $.get('roar/common-words.txt', function(data) {
   // silent_words = silent_words.concat(data.replace(/[\n ]/g, '').split(/,/));
 });

 // log the hashtags
 $(window).bind('Roar.addHashtags', function(e, data) {
   $.extend(hashtags, data);
 });

 // Listen:  tweet
 $(window).bind('Roar.tweet', function(e, tweet) {
   // console.log('trends: indexing tweet');
   if (!tweet.text) return;
       var matches = tweet.text.match(RE_break_into_words);
       var word, hashes = {};
   // check tweet for hashtags
   for (tag in hashtags) {
     if (!hashtags.hasOwnProperty(tag)) continue;
     if (matches.indexOf(tag)>=0) {
       if (!hashes[tag]) hashes[tag]=0;
       hashes[tag]++;
     }
     if (hashtags[tag].alternate) {
       for (var subtag in hashtags[tag].alternate) {
         if (matches.indexOf(hashtags[tag].alternate[subtag])) {
           if (!hashes[tag]) hashes[tag]=0;
           hashes[tag]++;
         }
       }
     }
   }
   // add the words to the trends
       for (var i=0, l=matches.length; i<l ;i++) {
               word = matches[i].toLowerCase();
               // increment each word
               if (trend_words[word]) {
                 trend_words[word].count++;
               } else {
                 trend_words[word] = {
                 count:1,
                 hashtags: hashtags,
                 hash:{}
               };
               }
               // increment the hashes
               for (var hash in hashes) {
       if (!hashes.hasOwnProperty(hash)) continue;
                 if (trend_words[word].hash[hash]) {
                   trend_words[word].hash[hash] += hashes[hash];
                 } else {
                   trend_words[word].hash[hash] = hashes[hash];
                 }
               }
       }
 });

 var tidyup_words = setInterval(function() {
   var word;
       for (word in trend_words) {
               if (trend_words.hasOwnProperty(word)) {
                 trend_words[word].count--;
       // TODO: perf test this
                 if (trend_words[word].count<=0) delete trend_words[word];
               }
       }
 }, 3000);

 // update the blobs
 var ballTimer = setInterval(function() {
   var word;
   for (word in silent_words) {
     if (!silent_words.hasOwnProperty(word)) continue;
     delete trend_words[silent_words[word]];
   }
   $(window).trigger('Roar.newWordset', [trend_words]);
 }, 1000);

});