﻿
/*

Global helper functions and prototypes
=======================================
    
*/

//
// make a console function if it doesn't exist
//
if (!window.console) {
    window.console = { log: function () { } };
}

var daysOfWeek = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];


// 
// visit URL that keeps referrer URL intact in IE
// from: http://blog.dczweb.net/post/RequestUrlReferrer-Is-Null-In-IE-60-when-locationhref(Javascript)-is-used-to-redirect.aspx
function navigateTo(url) {
    var fakeLink = document.createElement("a");
    if (typeof (fakeLink.click) == 'undefined')
        location.href = url; // sends referrer in FF, not in IE 
    else {
        fakeLink.href = url;
        document.body.appendChild(fakeLink);
        fakeLink.click(); // click() method defined in IE only 
    }
}



/*

// from http://unscriptable.com/index.php/2009/03/20/debouncing-javascript-methods/
Function.prototype.debounce = function (threshold, execAsap) {

var func = this, timeout;

return function debounced() {
var obj = this, args = arguments;
function delayed() {
if (!execAsap)
func.apply(obj, args);
timeout = null;
};

if (timeout)
clearTimeout(timeout);
else if (execAsap)
func.apply(obj, args);

timeout = setTimeout(delayed, threshold || 100);
};

}
*/

/*
Tweet marquee
==================================
*/
(function ($) {

    // The stream mode enum
    $.tweetMarqueeMode = { From: 0, Mention: 1, FromAndMention: 2 };
    $.tweetMarqueeJoinMode = { None: 0, Auto: 1, Pronoun: 2, ScreenName: 3 };

    // some constants
    var screenNameSymbol = "SCREENNAME";

    $.fn.tweetMarquee = function (o) {
        var s = {
            join_mode: $.tweetMarqueeJoinMode.None,     // [string]   join mode in between date and tweet, try setting to see $.tweetMarqueeJoinMode
            pronoun_join_text_default: "i said,",       // [string]   auto text for non verb: "i said" bullocks
            pronoun_join_text_ed: "i",                  // [string]   auto text for past tense: "i" surfed
            pronoun_join_text_ing: "i am",              // [string]   auto tense for present tense: "i was" surfing
            pronoun_join_text_reply: "i replied to",    // [string]   auto tense for replies: "i replied to" @someone "with"
            pronoun_join_text_url: "i was looking at",  // [string]   auto tense for urls: "i was looking at" http:...

            screen_name_join_text_default: screenNameSymbol + " said,",     // [string]   auto text for non verb: "CVertex said" bullocks
            screen_name_join_text_ed: screenNameSymbol + "",                 // [string]   auto text for past tense: "CVertex" surfed
            screen_name_join_text_ing: screenNameSymbol + " is",             // [string]   auto tense for present tense: "CVertex was" surfing
            screen_name_join_text_reply: screenNameSymbol + " replied to",   // [string]   auto tense for replies: "CVertex replied to" @someone "with"
            screen_name_join_text_url: screenNameSymbol + " was looking at", // [string]   auto tense for urls: "CVertex was looking at" http:...

            user_url_format: "http://twitter.com/" + screenNameSymbol,       // [string]     screen name format for twitter profile page, e.g. "http://twitter.com/SCREENNAME"
            stream_mode: $.tweetMarqueeMode.From      // [$.tweetMarqueeMode] stream mode default is $.tweetMarqueeMode.From
        };



        // message suffix expressions
        var reply_exp = /^(@([A-Za-z0-9-_]+)) .*/i;
        var url_exp = /(^\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+) .*/i;
        var past_tense_exp = /^((\w+ed)|just) .*/im;
        var adjective_exp = /^(\w*ing) .*/i;

        function relative_time(time_value) {
            if ($.browser.msie) { // ie's Date.parse doesn't like the timezone specifier, e.g. +1000
                time_value = time_value.replace(/\+\d{4}/, '');
            }
            var parsed_date = Date.parse(time_value);
            var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
            var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
            if (delta < 60) {
                return 'less than a minute ago';
            } else if (delta < 120) {
                return 'about a minute ago';
            } else if (delta < (45 * 60)) {
                return (parseInt(delta / 60)).toString() + ' minutes ago';
            } else if (delta < (90 * 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';
            }
        }

        function generate_user_url(settings, screenName, urlArrayIndex) {
            if (urlArrayIndex == -1 || settings.user_url.length == 0 || settings.user_url.length < urlArrayIndex) {
                return "http://twitter.com/" + screenName;
            }

            return settings.user_url[urlArrayIndex];
        }

        function generate_screen_name_join_text(settings, joinText, screenName, urlArrayIndex) {
            var user_url = generate_user_url(settings, screenName, urlArrayIndex);
            var replaceText = '<a target="' + settings.user_url_target + '" href="' + user_url + '">' + screenName + '</a>'
            return joinText.replace(screenNameSymbol, replaceText);
        }

        function generate_join_text(settings, text, screenName, urlArrayIndex) {
            var jt = '';

            switch (settings.join_mode) {
                case $.tweetMarqueeJoinMode.None:
                    return null;
                    break;
                case $.tweetMarqueeJoinMode.ScreenName:
                    if (text.match(reply_exp)) {
                        jt = generate_screen_name_join_text(settings, settings.screen_name_join_text_reply, screenName, urlArrayIndex);
                    } else if (text.match(url_exp)) {
                        jt = generate_screen_name_join_text(settings, settings.screen_name_join_text_url, screenName, urlArrayIndex);
                    } else if (text.match(past_tense_exp)) {
                        jt = generate_screen_name_join_text(settings, settings.screen_name_join_text_ed, screenName, urlArrayIndex);
                    } else if (text.match(adjective_exp)) {
                        jt = generate_screen_name_join_text(settings, settings.screen_name_join_text_ing, screenName, urlArrayIndex);
                    } else {
                        jt = generate_screen_name_join_text(settings, settings.screen_name_join_text_default, screenName, urlArrayIndex);
                    }
                    break;
                case $.tweetMarqueeJoinMode.Auto:
                case $.tweetMarqueeJoinMode.Pronoun:
                default:
                    if (text.match(reply_exp)) {
                        jt = settings.pronoun_join_text_reply;
                    } else if (text.match(url_exp)) {
                        jt = settings.pronoun_join_text_url;
                    } else if (text.match(past_tense_exp)) {
                        jt = settings.pronoun_join_text_ed;
                    } else if (text.match(adjective_exp)) {
                        jt = settings.pronoun_join_text_ing;
                    } else {
                        jt = settings.pronoun_join_text_default;
                    }
                    break;
            }
            return jt;
        }

        function generate_avatar_title(screenName) {
            return "See " + screenName;
        }

        function generate_twitter_query(mode, usernames) {
            var q = '';
            switch (mode) {
                case $.tweetMarqueeMode.FromAndMention:
                    q = "from:" + usernames.join('%20OR%20from:') + "%20OR%20%40" + usernames.join('%20OR%20%40');
                    break;
                case $.tweetMarqueeMode.Mention:
                    q = "%40" + usernames.join('%20OR%20%40');
                    break;
                case $.tweetMarqueeMode.From:
                default:
                    q = "from:" + usernames.join('%20OR%20from:');
                    break;
            }
            return q;
        }



        if (o) $.extend(s, o);

        return this.each(function () {
            var area = $(this);

            var url = 'http://search.twitter.com/search.json?q=from:ilovefootballoz' + '&rpp=' + 50 + '&callback=?';
            
            // new api call
            //url = '/api/tweet/index';

            var tweets = [];
            var tweetIndex = 0;
            var displayer = (function(target) {
                return function(msg) {
                    $(target).html(msg);
                };

            })(area);


            var updater = function() {
                console.log(tweetIndex);
                displayer(tweets[tweetIndex++]);
                tweetIndex %= tweets.length;
                

            };

            $.getJSON(url, function (data) {
                
                
                console.log('returned');


                $.each(data.results, function (i, item) {

                    

                    // generate the join text (between avatar and text)
                    var join_text = " said ";
                    //var join = '<span class="tweet_join">' + join_text + '</span>';
                    var join = '<span class="tweet_join">  </span>';
                    var avatarTitle = generate_avatar_title(item.from_user);

                    var user_url = "http://twitter.com/ilovefootballoz";


                    console.log(item);
                   

                    tweets.push(('<a class="avatar" target="' + s.user_url_target + '" title="' + avatarTitle + '" href="' + user_url + '">@' + item.from_user + '</a>') +
                                    ((join_text) ? join : ' ') +
                                    '<span class="message">' +
                                    item.text.replace(/(\w+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+)/gi, '<a target="_blank" href="$1">$1</a>').replace(/[\@]+([A-Za-z0-9-_]+)/gi, (s.join_text == "auto") ? '<a target="_blank" href="http://twitter.com/$1">@$1</a> with ' : '<a target="_blank" href="http://twitter.com/$1">@$1</a>').replace(/[\#]+([A-Za-z0-9-_]+)/gi, '<a href="http://search.twitter.com/search?q=&tag=$1&lang=all&from=' + item.from_user + '">#$1</a>') +
                                    '</span>&nbsp;' +
                                    //'<a href="http://twitter.com/' + item.from_user + '/statuses/' + item.id + '" target="_blank" class="time" title="view tweet on twitter">' + relative_time(item.created_at) + '</a>' +
                                    '');

                });


                 // create refresh timer that cycles through the thingsupdater
                 updater();
                 setInterval(updater,10000);

            });


        });

    };
})(jQuery);

