nanha
2/7/2013 - 1:43 AM

Twitter Archive 페이지에서 핵심인 application.min.js

Twitter Archive 페이지에서 핵심인 application.min.js

var Grailbird = function (b, a, c) {
    Grailbird.data = Grailbird.data || {};
    Grailbird.data[b + "_" + a] = c
};
(function (b) {
    var f = {}, e = {}, a = {};
    var c = {
        empty_month: Hogan.compile('<li class="without-tweets" title="" rel="tooltip" data-placement="bottom" data-date="" data-count="0"><span class="value">{{this_month}}</span></li>'),
        month_bar: Hogan.compile('<li><a href="#" class="with-tweets" title="{{str_title}}: {{str_count}}" rel="tooltip" data-placement="bottom" data-idx="{{data_idx}}" data-date="{{str_title}}" data-count="{{this_count}}"><span class="bar" style="height: {{this_height}}%;"></span><span class="value">{{this_month}}</span></a></li>'),
        header_str: Hogan.compile('{{title_str}} <span class="count">{{count}} {{content_type}}</span>'),
        user_header: Hogan.compile('<li><h1 class="brand">@{{screen_name}}</h1></li>'),
        user_nav: Hogan.compile('<a href="#" class="icon-sprite icon-user dropdown-toggle" data-toggle="dropdown"></a><ul class="dropdown-menu"><li><a href="#user-info" data-toggle="modal"><i class="icon-user"></i>View account details</a></li><li class="divider"></li><li><a href="https://twitter.com/{{screen_name}}" target="_blank"><i class="icon-share-alt"></i>View profile on Twitter</a></li></ul>'),
        modal_header: Hogan.compile('<h3>Account details <span class="download-date muted">as of {{created_at_relative}}</span></h3>'),
        modal_user_details: Hogan.compile('<h3>{{full_name}}</h3><h4 class="muted">@{{screen_name}}</h4><div class="stats muted">{{#bio}}<p>{{bio}}</p>{{/bio}}<p>{{#location}}<a href="https://maps.google.com/?q={{location}}">{{location}}</a>{{/location}}{{#url}}{{#location}} &middot; {{/location}}<a href="{{url}}" title="{{#expanded_url}}{{expanded_url}}{{/expanded_url}}{{^expanded_url}}{{url}}{{/expanded_url}}">{{#display_url}}{{display_url}}{{/display_url}}{{^display_url}}{{url}}{{/display_url}}</a>{{/url}}</p></div>'),
        modal_payload_details: Hogan.compile('<p>{{tweets}} <span class="footer-label muted">Tweets</span></p>'),
        modal_account_details: Hogan.compile('<p>#{{id}} <span class="footer-label muted">User ID</span></p><p class="truncated">{{created_at_relative}} <span class="footer-label muted">Joined</span></p>'),
        nav_tab: Hogan.compile('<li class="{{sectionClass}}"><a href="#">{{sectionName}}</a></li>')
    };
    b.init = function () {
        var g = $(document),
            h = $(".tweets-header");
        twt.settings.showLocalTimes = true;
        twt.settings.product = "archive";
        Grailbird.data = Grailbird.data || {};
        Grailbird.current_index = 0;
        f = Grailbird.user();
        f.init();
        e = Grailbird.tweets();
        f.setState(e);
        e.init();
        $(".brand").click(function (i) {
            i.preventDefault();
            i.stopImmediatePropagation();
            $(".row .contents, .sidebar").removeClass("container-messages");
            $(".tweets-header .nav-clear").hide();
            $(".container").removeClass("searching");
            f.setState(e);
            e.init()
        });
        $(".tweets-header .nav-arrow").tooltip().click(function () {
            e.displayTweets(Number($(this).attr("data-idx")));
            $(this).tooltip("show")
        });
        $(".navbar-search").submit(function (l) {
            l.preventDefault();
            var k = /^\s+|\s+$/g,
                i = $(this).find(".search-query").val(),
                j = i.replace(k, "");
            if (!Grailbird.isValidSearchStr(j)) {
                $(".navbar-search").trigger("invalidSearch");
                return
            }
            $(".navbar-search").trigger("dismissTooltip");
            $(".nav-arrow-left, .nav-arrow-right").tooltip("hide").hide();
            $(".container .tweets").fadeOut(0, function () {
                $(".months .with-tweets, .histogram").removeClass("active");
                $(".container").addClass("searching in-progress");
                $(".tweets-header-title").empty().text("Searching for ‘" + i + "’ …");
                $(this).empty();
                $(this).fadeIn(100);
                f.search(i)
            })
        }).tooltip().bind("dismissTooltip", function (i) {
            i.preventDefault();
            $(this).tooltip("hide")
        }).bind("invalidSearch", function (i) {
            i.preventDefault();
            $(this).attr("data-original-title", "Your query must be at least two characters.").tooltip("show")
        });
        $(".navbar-search .search-query").blur(function (i) {
            $(".navbar-search").trigger("dismissTooltip")
        });
        $(".sidebar-nav .search-mask, .tweets-header .nav-clear").tooltip().click(jQuery.proxy(function (i) {
            i.preventDefault();
            f.getState().resetSearch()
        }, Grailbird));
        $(".icon-compose").tooltip();
        $(".icon-compose a").click(function (i) {
            i.preventDefault();
            twt.popup($(this).attr("href"))
        });
        $(document).keyup(function (i) {
            if ($(".container.searching").length === 0) {
                if (i.keyCode === 37) {
                    i.preventDefault();
                    $(".nav-arrow-left:visible").click();
                    $(".nav-arrow-right").tooltip("hide")
                }
                if (i.keyCode === 39) {
                    i.preventDefault();
                    $(".nav-arrow-right:visible").click();
                    $(".nav-arrow-left").tooltip("hide")
                }
            } else {
                if (i.keyCode === 27) {
                    $(".tweets-header .nav-clear:visible").click()
                }
            }
            if (i.keyCode === 191) {
                $(".navbar-search .search-query:not(:focus)").focus().select()
            }
        });
        $(window).scroll(function () {
            var i = g.scrollTop();
            if (i > 0) {
                h.addClass("raised")
            } else {
                h.removeClass("raised")
            }
        })
    };
    b.extend = function (m) {
        var h = Array.prototype.slice.call(arguments, 1),
            j = 0,
            g = h.length,
            n, k;
        for (j; j < g; j++) {
            k = h[j];
            for (n in k) {
                if (k[n] !== undefined) {
                    m[n] = k[n]
                }
            }
        }
        return m
    };
    (function (g) {
        g.base = {
            init: function () {
                $(".navbar-search .search-query").attr("placeholder", this.search_placeholder);
                this.buildNavigation();
                this.displayTweets(0)
            },
            buildNavigation: function () {
                var k = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
                    s = this,
                    h = $('<div class="histogram"><h3></h3><ol class="months unstyled"></ol></div>'),
                    l, n = [],
                    p;
                $(".content-nav").empty();
                var m = _.max(this.status_index, function (i) {
                    return i.tweet_count
                }),
                    j = function () {
                        if (l) {
                            n = n.reverse();
                            if (n.length < 12) {
                                for (var i = 0; i < 12; i++) {
                                    if (!n[i] || n[i].match(/class="value">(\d+)<\/span>/)[1] != i + 1) {
                                        n.splice(i, 0, c.empty_month.render({
                                            this_month: i + 1
                                        }))
                                    }
                                }
                            }
                            l.find(".months").append(n.join(""))
                        }
                    };
                for (var o = 0; o < this.status_index.length; o++) {
                    var q = k[this.status_index[o]["month"] - 1] + " " + this.status_index[o]["year"],
                        r = {
                            this_year: this.status_index[o]["year"],
                            this_month: this.status_index[o]["month"],
                            this_count: Grailbird.insertCommas(this.status_index[o]["tweet_count"]),
                            this_height: (this.status_index[o]["tweet_count"] / m.tweet_count) * 100,
                            str_title: q,
                            str_count: Grailbird.insertCommas(this.status_index[o]["tweet_count"]) + " " + this.pluralize(this.status_index[o]["tweet_count"]),
                            data_idx: o
                        };
                    this.status_index[o]["title_str"] = q;
                    if (this.status_index[o]["year"] !== p) {
                        j();
                        l = h.clone();
                        n = [];
                        l.find("h3").text(r.this_year);
                        $(".content-nav").append(l);
                        p = r.this_year
                    }
                    n.push(c.month_bar.render(r))
                }
                j();
                $(".months .with-tweets").tooltip().click(function () {
                    s.displayTweets(Number($(this).attr("data-idx")))
                })
            },
            displayTweets: function (i) {
                Grailbird.current_index = i;
                var k = {
                    border: false,
                    showMedia: true,
                    popupWebIntents: true
                };
                var o = this,
                    n = 0,
                    p = 0,
                    m = this.status_index[i],
                    h = m.var_name,
                    l = c.header_str.render({
                        title_str: m.title_str,
                        count: Grailbird.insertCommas(m.tweet_count),
                        content_type: this.pluralize(m.tweet_count)
                    }),
                    j = function () {
                        $(".tweets-header-title").fadeOut(100);
                        $(".container .contents .tweets").fadeOut(100, function () {
                            $(".tweets-header-title").empty().html(l).attr("title", "");
                            $(this).empty();
                            $(window).scrollTop(0);
                            $(".navbar-search .search-query").val("");
                            twt.timeline(Grailbird.data[h], k).renderTo(".tweets");
                            $(".tweets-header-title").fadeIn(100);
                            $(this).fadeIn(100)
                        })
                    };
                if (this.status_index[i].year === undefined) {
                    $(".user-list .user").removeClass("active");
                    $($(".user-list .user")[i]).addClass("active");
                    k.showActions = false
                } else {
                    $(".months .with-tweets, .histogram").removeClass("active");
                    $('.months .with-tweets[data-idx="' + i + '"]').addClass("active").parents(".histogram").addClass("active")
                }
                n = Number(i) + 1;
                p = Number(i) - 1;
                if (i === 0) {
                    p = null;
                    $(".tweets-header .nav-arrow-right").hide()
                }
                if (this.status_index.length - 1 == i) {
                    n = null;
                    $(".tweets-header .nav-arrow-left").hide()
                }
                if (i < this.status_index.length - 1) {
                    $(".tweets-header .nav-arrow-left").attr({
                        "data-idx": n,
                        "data-original-title": this.status_index[n]["title_str"]
                    }).show()
                }
                if (i > 0) {
                    $(".tweets-header .nav-arrow-right").attr({
                        "data-idx": p,
                        "data-original-title": this.status_index[p]["title_str"]
                    }).show()
                }
                if (!Grailbird.data[h]) {
                    Grailbird.loadScript(m, j)
                } else {
                    j()
                }
            },
            pluralize: function (h) {
                return (Number(h) === 1) ? this.str_singular : this.str_plural
            },
            search: function (r) {
                var m = this.status_index,
                    n = this.status_index.length,
                    p, s = [],
                    q = new RegExp(r, "im"),
                    i = h(r),
                    l = new RegExp(i, "im"),
                    o = 0;
                while (n--) {
                    p = m[n];
                    if (!Grailbird.data[p.var_name]) {
                        Grailbird.loadScript(p, (function (t) {
                            return function () {
                                j(t.var_name)
                            }
                        })(p))
                    } else {
                        window.setTimeout((function (t) {
                            return function () {
                                j(t.var_name)
                            }
                        })(p), 1)
                    }
                }
                function h(t) {
                    return t.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
                }
                function j(u) {
                    var t = _.filter(Grailbird.data[u], function (w) {
                        var v = false;
                        if ( !! w.text.match(q)) {
                            v = true
                        } else {
                            if ( !! (w.user && (w.user.screen_name.match(q) || ("@" + w.user.screen_name).match(q) || w.user.name.match(q)))) {
                                v = true
                            } else {
                                if ( !! (w.entities)) {
                                    _.each(w.entities.urls || [], function (x) {
                                        if ((x.display_url && x.display_url.match(l)) || (x.expanded_url && x.expanded_url.match(l))) {
                                            v = true;
                                            return
                                        }
                                    });
                                    _.each(w.entities.media || [], function (x) {
                                        if ((x.display_url && x.display_url.match(l)) || (x.expanded_url && x.expanded_url.match(l))) {
                                            v = true;
                                            return
                                        }
                                    })
                                } else {
                                    if ( !! (w.retweeted_status && (w.retweeted_status.text.match(q)))) {
                                        v = true
                                    } else {
                                        if ( !! (w.retweeted_status && (w.retweeted_status.user && w.retweeted_status.user.name.match(q)))) {
                                            v = true
                                        } else {
                                            if ( !! (w.retweeted_status && (w.retweeted_status.user && w.retweeted_status.user.screen_name.match(q)))) {
                                                v = true
                                            } else {
                                                if ( !! (w.retweeted_status && (w.retweeted_status_user && ("@" + w.retweeted_status.user.screen_name).match(q)))) {
                                                    v = true
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        return v
                    });
                    _.each(t, function (v) {
                        s.push(v)
                    });
                    k()
                }
                function k() {
                    o++;
                    if (o == m.length) {
                        var t = _.sortBy(s, function (w) {
                            return Date.parse(w.created_at) * -1
                        }),
                            v = [s.length],
                            u;
                        v.push((s.length === 1) ? " result matches " : " results match ");
                        v.push("‘" + r + "’");
                        u = v.join("");
                        $(".container .tweets").fadeOut(100, function () {
                            $(".container").addClass("searching").removeClass("in-progress");
                            $(".tweets-header-title").empty().text(u).attr("title", u);
                            $(this).empty();
                            twt.timeline(t, {
                                border: false,
                                showMedia: true,
                                popupWebIntents: false
                            }).renderTo(".tweets");
                            _.each($(".e-content .p-name, .h-card .screen-name"), function (w) {
                                _.each($(w).find("*").andSelf(), function (x) {
                                    $(x).highlight(r, "found")
                                })
                            });
                            $(this).fadeIn(100)
                        })
                    }
                }
            },
            resetSearch: function () {
                $(".container").removeClass("searching");
                e.displayTweets(Grailbird.current_index)
            }
        }
    })(a);
    (function (g) {
        var h = function () {
            this.str_singular = "Tweet";
            this.str_plural = "Tweets";
            this.search_placeholder = "Search all Tweets";
            this.status_index = tweet_index
        };
        h.prototype = Grailbird.extend({}, a.base);
        g.tweets = function () {
            return new h()
        }
    })(Grailbird);
    (function (g) {
        var h = function () {
            var i
        };
        h.prototype.init = function () {
            user_details.created_at_relative = twt.formattedDate(user_details.created_at);
            payload_details.created_at_relative = twt.formattedDate(payload_details.created_at);
            user_details.id = Grailbird.insertCommas(user_details.id);
            payload_details.tweets = Grailbird.insertCommas(payload_details.tweets);
            $("#primary-nav").append(c.user_header.render(user_details));
            $("#util-nav .dropdown").append(c.user_nav.render(user_details));
            $(".modal-header").append(c.modal_header.render(payload_details));
            $(".modal-body .user-details").append(c.modal_user_details.render(user_details));
            $(".modal-footer .stats").append(c.modal_payload_details.render(payload_details)).append(c.modal_account_details.render(user_details))
        };
        h.prototype.setState = function (i) {
            this.active_display = i
        };
        h.prototype.getState = function () {
            return this.active_display
        };
        h.prototype.search = function (i) {
            this.active_display.search(i)
        };
        g.user = function () {
            return new h()
        }
    })(Grailbird);
    b.createNavTab = function (i, h) {
        var g = "nav-" + i.toLowerCase();
        $("#primary-nav").append(c.nav_tab.render({
            sectionClass: g,
            sectionName: i
        }));
        $sectionTab = $("." + g);
        $sectionTab.click(function (j) {
            $(this).addClass("active").siblings().removeClass("active");
            $(".row .contents, .sidebar").removeClass("container-messages");
            f.setState(h);
            h.init()
        });
        return $sectionTab
    };
    b.isValidSearchStr = function (g) {
        return g.length > 1
    };
    b.loadScript = function (i, k) {
        var j = i.file_name,
            h = document.createElement("script"),
            g = function () {
                i.loaded = true;
                k && k()
            };
        h.src = j;
        h.charset = "utf-8";
        h.onreadystatechange = function () {
            if (this.readyState == "complete" || this.readyState == "loaded") {
                g()
            }
        };
        h.onload = g;
        document.getElementsByTagName("head")[0].appendChild(h)
    };
    b.insertCommas = function d(g) {
        g = g.toString();
        return (g.length > 3) ? self.Grailbird.insertCommas(g.substr(0, g.length - 3)) + "," + g.substr(g.length - 3) : g
    }
})(Grailbird);
jQuery.fn.highlight = function (d, c) {
    var b = new RegExp(d, "gi"),
        a = Hogan.compile('<span class="{{class_name}}">{{{match}}}</span>');
    return this.each(function () {
        $(this).contents().filter(function () {
            return (this.nodeType == 3 && b.test(this.nodeValue)) || ($(this).text().toLowerCase() === d.toLowerCase())
        }).replaceWith(function () {
            if (this.nodeValue === null) {
                return a.render({
                    class_name: c,
                    match: $(this).html()
                })
            } else {
                return (this.nodeValue || "").replace(b, function (e) {
                    return a.render({
                        class_name: c,
                        match: e
                    })
                })
            }
        })
    })
};
$(document).ready(function () {
    Grailbird.init()
});