(function($){
  $.fn.extend({
    tumblr: function(username) {
      var el = $(this);

      $.ajax({
        url: 'http://'+username+'.tumblr.com/api/read/json',
        data: { num: 20 },
        dataType: 'jsonp',
        cache: true,
        ifModified: true,
        success: function(data) {
          var id = $(el).attr('id');
          $('#'+id+' h2 a').attr('href', 'http://'.concat(username, '.tumblr.com/'))
                           .html(username.concat('.tumblr.com'));

          var ul = $('<ul/>');
          $(el).append(ul);

          for (i in data.posts) {

            //// debug info
            //if (window.console && window.console.log)
            //  window.console.log(data.posts[i]);

            var li = $('<li/>');

            // format date and time
            if (Date.prototype.toInternetTime && Date.prototype.getDayOfYear) {
              // fix date to js-parseable format
              var parseable_date = data.posts[i]['date-gmt'].replace(/-/g,'/');
              // convert data to Data object
              var d = new Date(Date.parse(parseable_date));
              // get date as a DayOfYear
              var date = d.getDayOfYear();
              // get time in .beats
              var time = d.toInternetTime();
            } else {
              var date = data.posts[i]['date-gmt'].split(/[ -]/).slice(1,3).join('-');
              var time = data.posts[i]['date-gmt'].split(/[: ]/).slice(1,3).join(':');
            }

            // build up an element
            $(li).addClass(data.posts[i]['type']).append(
              $('<a/>').addClass('date')
                       .attr('src', data.posts[i]['url'])
                       .attr('title', data.posts[i]['date'])
                       .append(date)
                       .append(time)
            );

            // regular text message
            if (data.posts[i]['type'] == 'regular') {
              $(li).append(data.posts[i]['regular-body']);
            } else

            // link
            if (data.posts[i]['type'] == 'link') {
              if (data.posts[i]['link-text']) {
                $(li).append($('<a/>').attr('href', data.posts[i]['link-url']).html(data.posts[i]['link-text']));
              } else {
                $(li).append($('<a/>').attr('href', data.posts[i]['link-url']).html(data.posts[i]['link-url']))
                     .append(' - ')
                     .append(data.posts[i]['link-text']);
              }
              if (data.posts[i]['link-description'])
                $(li).append(' ')
                     .append(data.posts[i]['link-description']);
            } else

            // chat
            if (data.posts[i]['type'] == 'conversation') {
              for (idx in data.posts[i]['conversation']) {
                $(li).append($('<p/>').html(
                  '<strong>'.concat(data.posts[i]['conversation'][idx]['name'],
                  '</strong> : ', data.posts[i]['conversation'][idx]['phrase'])));
              }
            } else

            // quote
            if (data.posts[i]['type'] == 'quote') {
              $(li).append(
                $('<quote/>').html(data.posts[i]['quote-text'])
              ).append(
                $('<p/>').addClass('author').html(data.posts[i]['quote-source'])
              );
            } else

            // photo
            if (data.posts[i]['type'] == 'photo') {
              $(li).append(
                $('<a/>').attr('href', '' + data.posts[i]['photo-link-url'])
                         .html(data.posts[i]['photo-caption'])
              ).append(
                $('<span/>').addClass('frame').append(
                  $('<img/>').attr('src', data.posts[i]['photo-url-250'])
                             .attr('alt', data.posts[i]['photo-caption'])
                )
              );
            } else

            // video
            if (data.posts[i]['type'] == 'video') {
              $(li).append(
                data.posts[i]['video-caption']
              ).append(
                $('<span/>').addClass('frame').append(
                  data.posts[i]['video-player']
                    .replace(/width:\s*\d+/g, 'width:250')
                    .replace(/height:\s*\d+/g, 'height:214')
                    .replace(/width="\d+"/g, 'width="250"')
                    .replace(/height="\d+"/g, 'height="210"')
                )
              );
            } else

            // audio
            if (data.posts[i]['type'] == 'audio') {
              $(li).append(
                data.posts[i]['audio-caption']
              ).append(
                $('<span/>').addClass('frame').append(
                  data.posts[i]['audio-player']
                )
              );
            }

            $(ul).append(li);
          }
        }
      });
    }
  });
})(jQuery);
