/**
 * Twiple! Tweetback 0.01
 *
 * @package twiple-tweetback
 * @version $Id: tweetback_src.js 172 2009-01-24 02:47:31Z ayunyan $
 * @author ayunyan <ayu@commun.jp>
 * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
 * @link http://twiple.jp/
 */
var tweetback = {
    version: '0.01',
    twiple_api_url: 'http://api.twiple.jp/',
    twiple_static_url: 'http://static.twiple.jp/',
    options: {
        default_style: 1,
        limit: 30,
        load_message: 'Loading...',
        notweets_message: 'There are currently no tweets.'
    },
    init: function () {
        if (document.getElementById('tweetback') == null) return;

        if (tweetback.options.default_style == 1) tweetback.insert_style();
        tweetback.process(location.href);
    },
    insert_style: function () {
        var link = document.createElement('link');
        link.type = 'text/css';
        link.rel = 'stylesheet';
        link.href = tweetback.twiple_static_url + 'css/tweetback.css';
        link.media = 'all';
        document.getElementsByTagName('head')[0].appendChild(link);
    },
    process: function (url) {
        document.getElementById('tweetback').innerHTML = '<p>' + tweetback.options.load_message + '</p>';
        tweetback.get_jsonp(tweetback.twiple_api_url + 'url/view.json?u=' + url, function (data) {
            if (data == null || data.tweets < 1) {
                document.getElementById('tweetback').innerHTML = '<p>' + tweetback.options.notweets_message + '</p>';
                return;
            }

            var html = '';
            for (var i = 0; i < data.statuses.length; i++) {
                if (i >= tweetback.options.limit) break;
                html += '<div class="item ' + data.statuses[i].service + '">';
                html += '<div class="icon">';
                if (data.statuses[i].user.profile_image_url != null) html += '<a href="' + tweetback.get_userlink(data.statuses[i]) + '" target="_blank"><img src="' + data.statuses[i].user.profile_image_url + '" alt="" /></a>';
                html += '</div>';
                html += '<div class="name"><a href="' + tweetback.get_userlink(data.statuses[i]) + '" target="_blank">' + data.statuses[i].user.screen_name + '</a> <span class="service">' + data.statuses[i].service + '</span></div>';
                html += '<div class="content"><span class="text">';
                html += tweetback.htmlspecialchars(tweetback.get_formattedtext(data.statuses[i])) + '</span> ';
                html += '<span class="date">(<a href="' + tweetback.get_permalink(data.statuses[i]) + '">' + data.statuses[i].created_at + '</a>)</span></div></div>';
            }
            document.getElementById('tweetback').innerHTML = html;
        });
    },
    get_jsonp: function (url, handler) {
        var callback = 'callback_' + (new Date()).getTime();
        url += (url.match(/\?/) ? '&' : '?') + 'callback=' + callback;

        window[callback] = function(data) {
            window[callback] = undefined;
            handler(data);
        }

        var script = document.createElement('script');
        script.setAttribute('type', 'text/javascript');
        script.setAttribute('src', url);
        document.getElementsByTagName('head')[0].appendChild(script);
    },
    get_userlink: function (status) {
        switch (status.user.service) {
        case 'twitter': // Twitter
            return 'http://twitter.com/' + status.user.screen_name;
        case 'wassr': // Wassr
            return 'http://wassr.jp/user/' + status.user.screen_name;
        case 'haiku': // Hatena Haiku
            return 'http://h.hatena.ne.jp/' + status.user.screen_name;
        case 'timelog': // Timelog
            return 'http://' + status.user.screen_name + '.timelog.jp/';
        case 'tsublog': // Tsublog
            return 'http://tsublog.excite.co.jp/user/' + status.user.screen_name;
        case 'mogo2': // Mogomogo
            return 'http://mogo2.jp/' + status.user.service_local_id;
        case 'feecle': // Feecle
            return 'http://' + status.user.screen_name + '.feecle.jp/';
        case 'riro': // riro
            return 'http://riro.jp/profile' + status.user.screen_name + '.html';
        case 'harufm': // Haru.fm
            return 'http://haru.fm/dashboard/' + status.user.screen_name;
        case 'piyo': // PIYO
            return 'http://piyo.fc2.com/' + status.user.screen_name + '/';
        case 'nowa': // nowa
            return 'http://' + status.user.screen_name + '.nowa.jp/';
        case 'logpi': // Logpi
            return 'http://logpi.jp/' + status.user.screen_name;
        default:
            return '#';
        }
    },
    get_permalink: function (status)
    {
        switch (status.service) {
        case 'twitter': // Twitter
            return 'http://twitter.com/' + status.user.screen_name + '/status/' + status.service_local_id;
        case 'wassr': // Wassr
            return 'http://wassr.jp/user/' + status.user.screen_name + '/statuses/' + status.service_local_id;
        case 'haiku': // Hatena Haiku
            return 'http://h.hatena.ne.jp/' + status.user.screen_name + '/' + status.service_local_id;
        case 'timelog': // Timelog
            return 'http://timelog.jp/msg/?' + status.service_local_id;
        case 'tsublog': // Tsublog
            return 'http://tsublog.excite.co.jp/mumble/' + status.service_local_id;
        case 'mogo2': // Mogomogo
            return 'http://mogo2.jp/comment/' + status.service_local_id;
        case 'feecle': // Feecle
            return status.service_local_id;
        case 'riro': // riro
            return 'http://riro.jp/status/' + status.user.screen_name + '/' + status.service_local_id + '/';
        case 'harufm': // Haru.fm
            return 'http://haru.fm/post/' + status.service_local_id;
        case 'piyo': // PIYO
            return 'http://piyo.fc2.com/' + status.user.screen_name + '/?m=q&amp;n=' + status.service_local_id;
        case 'nowa': // nowa
            return 'http://' + status.user.screen_name + '.nowa.jp/status/' + status.service_local_id;
        case 'logpi': // Logpi
            return 'http://logpi.jp/' + status.user.screen_name + '/permalink/' + status.service_local_id;
        default:
            return '#';
        }
    },
    get_formattedtext: function (status)
    {
        return status.text;
    },
    htmlspecialchars: function (text) {
        text = text.replace(/&/g,'&amp;');
        text = text.replace(/"/g,'&quot;');
        text = text.replace(/'/g,'&#039;');
        text = text.replace(/</g,'&lt;');
        text = text.replace(/>/g,'&gt;');
        return text;
    }
}

if (window.addEventListener) {
    window.addEventListener('load', tweetback.init, false);
} else if (document.attachEvent) {
    window.attachEvent('onload', tweetback.init);
} else {
    window['onload'] = tweetback.init;
}
