// https://dev.twitter.com/docs/api/1/get/statuses/user_timeline


(function (f) {
    var c = 0;

    function b(j, o, l) {
        if (l.clearContents) {
            j.empty()
        }
        var n = null,
            k = "",
            m, h = o.length > l.count ? l.count : o.length;
        if (l.headerTemplate) {
            k += l.headerTemplate
        }
        for (m = 0; m < h && o[m]; m++) {
            n = g(o[m]);
            if (l.ignoreReplies && o[m].text.substr(0, 1) == "@") {
                h++;
                continue
            }
            k += a(l.itemTemplate, n, l.enableLinks)
        }
        if (l.footerTemplate) {
            k += l.footerTemplate
        }
		j.hide().prepend(k);
		j.fadeIn(400);
    }
    function a(tmpl, h, enableLinks) {
        var i = tmpl.replace(/%([a-z_\-\.]*)%/ig, function (n, o) {
            var p = h[o] + "" || "";
            if (o == "text" && enableLinks) {
                p = e(p)
            }
            return p
        });
        return i
    }
    function g(k) {
        var j = k,
            h;
        for (h in k.user) {
            j["user_" + h] = k.user[h]
        }
        j.time = d(k.created_at);
        return j
    }
    function d(i) {
        var m = i.split(" "),
            p = (arguments.length > 1) ? arguments[1] : new Date(),
            k = Date.parse(m[1] + " " + m[2] + ", " + m[5] + " " + m[3]) - (p.getTimezoneOffset() * 60000),
            j = new Date(k),
            l = parseInt((p.getTime() - k) / 60000),
            h = "";

        function _getTime(s) {
            var q = s.getHours(),
                t = s.getMinutes() + "",
                r = "am";
            if (q == 0) {
                q = 12
            } else {
                if (q > 12) {
                    q -= 12;
                    r = "pm"
                }
            }
            if (t.length == 1) {
                t = "0" + t
            }
            return q + ":" + t + r
        }
        function n(r) {
            var w = r.toDateString().split(/ /),
                t = w[1],
                q = w[2],
                x = parseInt(q),
                s = r.getFullYear(),
                v = (new Date()).getFullYear(),
                u = "th";
            if ((x % 10) == 1 && q.substr(0, 1) != "1") {
                u = "st"
            } else {
                if ((x % 10) == 2 && q.substr(0, 1) != "1") {
                    u = "nd"
                } else {
                    if ((x % 10) == 3 && q.substr(0, 1) != "1") {
                        u = "rd"
                    }
                }
            }
            if (q.substr(0, 1) == "0") {
                q = q.substr(1)
            }
            return t + " " + q + u + (v != s ? ", " + s : "")
        }

        if (l < 1) {
            h = "less than a minute ago"
        } else if (l < 2) {
			h = "1 minute ago"
		} else if (l < (59)) {
			h = (l).toString() + " minutes ago"
		} else if (l < (75)) {
			h = "about an hour ago"
		} else if (l < (24 * 60)) {
			h = Math.round(l/60) + " hours ago"
		} else {
			h = /*_getTime(j) + " " +*/ n(j)
		}
        return h
    }
    function e(h) {
        var i = {
            '"': "&quot;",
            "&": "&amp;",
            "<": "&lt;",
            ">": "&gt;"
        };
        return h.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/g, function (j) { // URLs
            return '<a onclick="_gaq.push([\'_trackEvent\',\'Tweets\',\'FollowLink\',\''+j+'\']);" href="' + j + '" target="_blank">' + j + '</a>';
        }).replace(/(^|[^\w])(@[\d\w\-]+)/g, function (l, k, j) { // @Users
            return k + '<span class="symbol">@</span><a onclick="_gaq.push([\'_trackEvent\',\'Tweets\',\'UserLink\',\''+j.substr(1)+'\']);" href="http://twitter.com/' + j.substr(1) + '" target="_blank">' + j.substr(1) + '</a>'
        }).replace(/(^|[^\w])(#[\d\w\-]+)/g, function (l, k, j) { // #Tag
            return k + '<span class="symbol">#</span><a onclick="_gaq.push([\'_trackEvent\',\'Tweets\',\'HashTagLink\',\''+j.substr(1)+'\']);" href="http://twitter.com/#!/search?q=%23' + j.substr(1) + '" target="_blank">' + j.substr(1) + '</a>'
        }).replace(/"&<>/, function (j) {
            return i[j]
        })
    }
    f.fn.twittify = function (j, h) {
        var i = f.extend({}, f.fn.twittify.defaults, h);
        if (i.withFriends) {
            i.withFriends = false
        }
        return this.each(function () {
            var l = f(this);
            c++;
            window["twitterCallback" + c] = function (m) {
                if (i.timeout) {
                    clearTimeout(window["twitterTimeout" + c])
                }
                b(l, m, i)
            };
            if (i.timeout) {
                window["twitterTimeout" + c] = setTimeout(function () {
                    if (i.onTimeoutCancel) {
                        window["twitterCallback" + c] = function () {}
                    }
                    i.onTimeout.call(l)
                }, i.timeout * 1000)
            }
            //var k = "http://www.twitter.com/statuses/" + (i.withFriends ? "friends_timeline" : "user_timeline") + "/" + j + ".json?count=" + i.count + "&cb=" + Math.random();
			var k2 = "http://api.twitter.com/1/statuses/user_timeline.json?screen_name=" + j;
			k2 += "&count=" + i.count;
			k2 += "&include_entities=" + i.includeEntities;
			k2 += "&exclude_replies=" + i.excludeReplies;
			k2 += "&trim_user=false";
			k2 += "&include_rts=" + i.includeRTs;
            f.getJSON(k2 + "&callback=?", window["twitterCallback" + c])
        })
    };
    f.fn.twittify.defaults = {
        count: 1,
        prefix: "",
        clearContents: true,
        ignoreReplies: false,
        withFriends: false,
		includeEntities: false,
		excludeReplies: false,
		includeRTs: true,
        enableLinks: true,
        timeout: 10,
        onTimeoutCancel: false,
        onTimeout: function (h) {},
        itemTemplate: '<span>%text% sent %time% from <a href="http://twitter.com/%user_screen_name%/statuses/%id%">%user_screen_name%\'s Twitter</a></span>',
        headerTemplate: "",
        footerTemplate: ""
    }
})(jQuery);
