(function($) {
    $.fn.blipper = function($fake, templ, options) {

        if (this.length > 1) {
            return this.each(function() {
                $(this).blipper($fake, templ, options);
            });
        }

        var $container = this;
        var $self = this[0];
        var opts = $.extend(true, {}, $.fn.blipper.defaults, options);

        if (typeof $fake != 'object') {
            $fake = $($fake);
        }
        if (typeof templ != 'string' || templ.length == 0) {
            templ = '<p>{{html text}}</p>';
        }


        var tweets = [];
        var counter = 0;
        var interv = setInterval(function() {
            counter++;
            if ($fake.find('.twtr-tweet').length > 0) {
                $fake.find('.twtr-tweet').each(function() {

                    if (
                        (typeof opts.filter != 'function' || opts.filter.call(this, tweets)) &&
                        (typeof opts.max != 'number' || tweets.length < opts.max)
                    ) {
                        var $t = $(this);

                        var $avatar = $t.find('.twtr-avatar .twtr-img a');
                        var $user = $t.find('.twtr-tweet-text p a.twtr-user');
                        var $text = $t.find('.twtr-tweet-text p');
                        var $footer = $text.find('> em').clone(true);
                        var $timestamp = $footer.find('a.twtr-timestamp');
                        var $reply = $footer.find('a.twtr-reply');
                        var $retweet = $footer.find('a.twtr-rt');
                        var $favorite = $footer.find('a.twtr-fav');

                        $text.find('a.twtr-user, em').remove();
                        $text.find('a').removeClass('twtr-hyperlink');

                        var _timestamp = $timestamp.text();
                        if (typeof $.fn.blipper.translations[opts.lang] == 'object') {
                            for (var i in $.fn.blipper.translations[opts.lang]) {
                                _timestamp = _timestamp.split(i).join($.fn.blipper.translations[opts.lang][i]);
                            }
                        }

                        tweets.push({
                            avatar: $avatar.html(),
                            avatarSrc: $avatar.find('img').attr('src'),
                            user: $user.text(),
                            userHref: $user.attr('href'),
                            text: $text.html(),
                            timestamp: _timestamp,
                            timestampHref: $timestamp.attr('href'),
                            reply: $reply.text(),
                            replyHref: $reply.attr('href'),
                            retweet: $retweet.text(),
                            retweetHref: $retweet.attr('href'),
                            favorite: $favorite.text(),
                            favoriteHref: $favorite.attr('href')
                        });
                    }
                });
                clearInterval(interv);
                $.template('tweetTemplate', templ);
                $container.append($.tmpl('tweetTemplate', tweets));
                $fake.remove();
                if (typeof opts.callback == 'function') {
                    opts.callback.call( $self, tweets );
                }
            }
            if (counter > 1000) { // cancel after 20 sec.
                clearInterval(interv);
            }
        }, 200);

        return this;
    };

    $.fn.blipper.defaults = {
        'lang': 'nl',
        'max': null,
        'filter': null,
        'callback': null
    };

    $.fn.blipper.translations = {
        'nl': {
            'less than': 'minder dan',
            'about': 'ongeveer',
            'a minute': 'een minuut',
            'minutes': 'minuten',
            'hours': 'uur',
            'hour': 'uur',
            'yesterday': 'gisteren',
            'days': 'dagen',
            'day': 'dag',
            'ago': 'geleden'
        }
    };
})(jQuery);
