function twitterSearchCallback(json) {
  var tweets = [];
  for (var i=0; i<json.results.length; i++){
      var tweet = json.results[i];
      tweets.push(render_tweet(tweet));
  }
  document.getElementById('twitter_update_list').innerHTML = tweets.join('');
  timer = setTimeout('update_tweets(\''+json.query+'\')', 60000);
}

function update_tweets(q) {
   var old_script = document.getElementById('twitter_callback');
   var new_script = document.createElement('script');
   new_script.setAttribute('id','twitter_callback');
   new_script.setAttribute('type','text/javascript');
   new_script.setAttribute('src','http://search.twitter.com/search.json?callback=twitterSearchCallback&rpp=5&q=' + q + '&show_user=true');

   old_script.parentNode.replaceChild(new_script, old_script);
}

function render_tweet(tweet) {
    var status = tweet.text.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) {
      return link_url(url);
    }).replace(/\B@([_a-z0-9]+)/ig, function(reply) {
      return  '@' + link_user(reply.substring(1));
    });

    return '<li>'
         + link_image(tweet.from_user, tweet.profile_image_url)
         + link_poster(tweet.from_user)
         + ' <span class="twitter_status">'+status+'</span> '
         + link_status(tweet.from_user, tweet.id, tweet.created_at)
         + '</li>'
         ;
}

function link_image(user, image_url) {
    var img_attrs = {
        'class': 'twitter_userpic',
        'alt': user,
        'src': image_url,
        'style': 'width:48px;height:48px',
        'width': '48',
        'height': '48'
    }
    var img = render_tag('img', null, img_attrs);

    var a_attrs = {
        'class': 'twitter_userpic_link',
        'href': 'http://twitter.com/' + user
    };   
    return render_tag('a', img, a_attrs);
}

function link_status(user, id, created_at) {
    var attrs = {
        'class': 'twitter_status_link',
        'href': 'http://twitter.com/' + user + '/statuses/' + id
    };   
    return render_tag('a', relative_time(created_at), attrs);
}

function link_url(url) {
    var attrs = {
        'class': 'twitter_url_link',
        'href': url
    };   
    return render_tag('a', url, attrs);
}

function link_poster(user) {
    var attrs = {
        'class': 'twitter_poster_link',
        'href': 'http://twitter.com/' + user
    };   
    return render_tag('a', user, attrs);
}

function link_user(user) {
    var attrs = {
        'class': 'twitter_user_link',
        'href': 'http://twitter.com/' + user
    };   
    return render_tag('a', user, attrs);
}

function render_tag(name, value, attrs) {
    var tag = '<' + name;
    for (var key in attrs) {
        tag += ' ' + key + '="' + attrs[key] + '"';
    }
    
    if (value === null) {
        tag += ' />';
    }
    else {
        tag += '>' + value + '</' + name + '>';
    }

    return tag;
}

function relative_time(time_value) {
  //var values = time_value.split(" ");
  //time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
  var parsed_date = Date.parse(time_value);
  var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
  var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
  delta = delta + (relative_to.getTimezoneOffset() * 60);

  if (delta < 60) {
    return 'less than a minute ago';
  } else if(delta < 120) {
    return 'about a minute ago';
  } else if(delta < (60*60)) {
    return (parseInt(delta / 60)).toString() + ' minutes ago';
  } else if(delta < (120*60)) {
    return 'about an hour ago';
  } else if(delta < (24*60*60)) {
    return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
  } else if(delta < (48*60*60)) {
    return '1 day ago';
  } else {
    return (parseInt(delta / 86400)).toString() + ' days ago';
  }
}
