(function($) {

    $.fn.forexStream = function() {
        var newItems = 0;
        var focus = true;
        var pauseTimeout = 10800000;
        var refreshId = setTimeout(pause, pauseTimeout);
        var avatar_size = 48;
        var loading_text = 'loading...';
        var title = 'DailyFX Forex Stream';

        $.fn.extend({
            linkUrl: function() {
                var returning = [];
                var regexp = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
                this.each(function() {
                    returning.push(this.replace(regexp,'<a class=\"textlink\" target=\"_blank\" href=\"$1\">$1</a>'));
                });
                return $(returning);
            },
            linkUser: function() {
                var returning = [];
                var regexp = /^[\@]+([A-Za-z0-9-_]+)/gi;
                this.each(function() {
                    returning.push(this.replace(regexp,'<a class=\"textlink" target=\"_blank\" href=\"http://twitter.com/$1\">@$1</a>'));
                });
                return $(returning);
            }
        });

        if($.browser.msie) {
            document.onfocusin = onFocus;
            document.onfocusout = onBlur;
        }
        else {
            document.onfocus = onFocus;
            document.onblur = onBlur;
        }

        return this.each(function(){
            var list = $('<ul class="items">').appendTo(this);
            var loading = $('<p class="loading">' + loading_text + '</p>');

            var url = 'http://forexstream.dailyfx.com/tweets.json';
            var lastId = "";
            if (loading_text) $(this).append(loading);

            $.getJSON(url, function(data) {
                if (loading_text) loading.remove();
                $.each(data, function(i,item) {
                    var avatar_img = '<img src="' + item.user.profile_image_url + '" height="' + avatar_size + '" width="' + avatar_size + '" alt="' + item.user.screen_name + '\'s avatar" border="0"/>';
                    var avatar = '<li class="avatar"><a target="_blank" href="http://twitter.com/' + item.user.screen_name + '">' + avatar_img + '</a></li>';
                    var date = '<a class="date" target="_blank" href="http://twitter.com/' + item.user.screen_name + '/statuses/' + item.id + '" title="View Tweet on Twitter">' + dateString(item.created_at) + '</a> ';
                    var text = $([item.text]).linkUrl().linkUser()[0];
                    var newItem = $('<li class="item"><ul class="clear">' + avatar + '<li class="text">' + date + text + '</li></ul></li>').prependTo(list);

                    newItem.contents().find('img').error(function() {
                        $(this).unbind('error').attr('src', 'img/dailyfx_normal.jpg');
                    });

                    if (item.id > lastId)
                        lastId = item.id;
                });
            });

            setTimeout(updateTweets, 10000);

            function updateTweets() {
                $.getJSON(url+'?since_id='+lastId, function(data) {
                    $.each(data, function(i,item) {
                        var avatar_img = '<img src="' + item.user.profile_image_url + '" height="' + avatar_size + '" width="' + avatar_size + '" alt="' + item.user.screen_name + '\'s avatar" border="0"/>';
                        var avatar = '<li class="avatar"><a target="_blank" href="http://twitter.com/' + item.user.screen_name + '">' + avatar_img + '</a></li>';
                        var date = '<a class="date" target="_blank" href="http://twitter.com/' + item.user.screen_name + '/statuses/' + item.id + '" title="View Tweet on Twitter">' + dateString(item.created_at) + '</a> ';
                        var text = $([item.text]).linkUrl().linkUser()[0];
                        var newItem = $('<li class="item" style="display:none"><ul class="clear">' + avatar + '<li class="text">' + date + text + '</li></ul></li>').prependTo(list);

                        list.children('li:last').remove();

                        newItem.slideDown('slow', function() {
                            $(this).effect('pulsate', {times: 3}, 1000);
                        }).contents().find('img').error(function() {
                            $(this).unbind('error').attr('src', 'img/dailyfx_normal.jpg');
                        });

                        if(item.id > lastId)
                            lastId = item.id;

                        if(!focus) {
                            if(newItems < 20)
                                newItems++;

                            document.title = '(' + newItems + ' new) ' + title;
                        }
                    });
                });

                setTimeout(updateTweets, 10000);
            }
        });

        function onFocus() {
            if(!focus) {
                document.title = title;
                newItems = 0;
                clearTimeout(refreshId);
                refreshId = setTimeout(pause, pauseTimeout);
                focus = true;
            }
        }

        function onBlur() {
            focus = false;
        }
    };

    function dateString(str) {
        var values = str.split(' ');
        var month = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
        var d = new Date(values[1] + ' ' + values[2] + ' ' + values[5] + ' ' + values [3] + ' ' + values[4]);
        var day = d.getDate();
        var m = d.getMonth();
        var time = d.toLocaleTimeString();
        return day + ' ' + month[m] + ' ' + time;
    }

    function pause() {
        window.location = 'pause.html';
    }
})(jQuery);
