/**
 * master onload 
 */
window.onload = function() {
    loadListeningData();
    grabPhotoData();
    /* put twitter last so that its frequent breakage doesn't get in the 
     * way of loading other <script>-based data */
    grabTwitterData();
}

/**
 * Twitter!
 */

function grabTwitterData() {
    var url = 'http://twitter.com/statuses/user_timeline/justben.json?callback=loadTweets&count=5';
    var script = document.createElement('script');
    script.setAttribute('src', url);
    document.body.appendChild(script);
}

/* loadTweets() based on twitterCallback2() from http://twitter.com/javascripts/blogger.js */
function loadTweets(tweets) {
    var statusHTML = [];
    if (tweets.length > 0) {
        for (var i=0; i<tweets.length; i++){
            var username = tweets[i].user.screen_name;
            var status = tweets[i].text.replace(/((https?|s?ftp)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, function(url) {
                return '<a href="'+url+'">'+url+'</a>';
            }).replace(/\B@([_a-zA-Z0-9]+)/g, function(user) {
                return user.charAt(0)+'<a href="http://twitter.com/'+user.substring(1)+'">'+user.substring(1)+'</a>';
            }).replace(/\B#([_a-zA-Z0-9]+)/g, function(topic) {
                return '<a href="http://search.twitter.com/search?q=%23'+topic.substring(1)+'">'+topic+'</a>';
            });
            var twitdate = parse_twitter_time(tweets[i].created_at);
            statusHTML.push('<li>'+status+' <a href="http://twitter.com/'+username+'/statuses/'+tweets[i].id+'">'+relative_time(twitdate)+'</a></li>');
        }
    } else {
        statusHTML.push('<li class="metanote">No Twitter updates found. Perhaps a Twitter error?</li>');
    }
    document.getElementById('tweetbox').innerHTML = '<ul>'+statusHTML.join('')+'</ul>';
}

/**
 * Flickr!
 */

function grabPhotoData() {
    var script = document.createElement('script');
    script.setAttribute('src', '/photos/recent');
    document.body.appendChild(script);
}

function loadFlickrPhotos(rsp) {
    if (rsp.stat != 'ok')
        return;

    var photos = rsp.photos.photo;
    if (photos.length > 0) {
        var lis = [];
        for (var i = 0; i < photos.length; i++) {
            var thumb = 'http://farm' + photos[i].farm + '.static.flickr.com/' + photos[i].server + '/' + photos[i].id + '_' + photos[i].secret + '_s.jpg';
            var url =  'http://www.flickr.com/photos/' + photos[i].owner + '/' + photos[i].id + '/';
            lis.push('<li><a href="' + url + '"><img src="' + thumb + '" /></a></li>');
        }
        document.getElementById('photos').innerHTML = '<ul>' + lis.join('') + '</ul>';
    } else {
        document.getElementById('photos').innerHTML = '<span class="metanode">No photos found. Perhaps a flickr.com error?</span>';
    }
}

/**
 * last.fm!
 */

function createXHR() {
    try {
        return new XMLHttpRequest();
    } catch (e) {}

    /* hope this one works */
    return new ActiveXObject("Msxml2.XMLHTTP");
}

function loadListeningData() {
    var req = createXHR();
    req.onreadystatechange = function() {
        if (req.readyState == 4 && req.status == 200) {
            var lis = [];
            tracks = eval(req.responseText);
            for (var i = 0; i < tracks.length; i++) {
                var playlinkhtml = '';
                if (tracks[i].streamable) {
                    playlinkhtml = '<a href="' + tracks[i].url + '?autostart"><img src="icon_play" /></a>';
                }
                var playhtml =  '<span class="play">' + playlinkhtml + '</span>';
                var artisthtml = '<span class="artist">' + tracks[i].artist + '</span>';
                var trackhtml = '<a href="' + tracks[i].url + '">' + tracks[i].name + '</a>';
                var datehtml = '<span class="datestamp">' + relative_time(tracks[i].date * 1000) + '</span>';
                var li = '<li>' + playhtml + artisthtml + ' — ' + trackhtml + ' ' + datehtml + '</li>';
                lis.push(li);
            }
            ul = '<ul>' + lis.join('') + '</ul>';
            document.getElementById('listendata').innerHTML = ul;
        } else if (req.readyState == 4 && req.status != 200) {
            document.getElementById('listendata').innerHTML = '<span class="metanote">No tracks found. Perhaps a last.fm error?</span>';
        }
    };
    req.open("GET", "/listening/recent");
    req.send(null);
}

function parse_twitter_time(twit_time) {
    var values = twit_time.split(" ");
    var time_str = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
    var twitter_time = Date.parse(time_str);
    /* correct for timezone */
    return twitter_time - new Date().getTimezoneOffset() * 60 * 1000;
}

/**
 *  handy shared stuff 
 */

/* relative_time() based on http://twitter.com/javascripts/blogger.js */
function relative_time(date_obj) {
    var now = new Date();
    var delta = parseInt((now.getTime() - date_obj) / 1000);

    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';
    }
}
