(function (e) { e.fn.jTweetsAnywhere = function (a) { a = e.extend({ username: "tbillenstein", list: null, searchParams: null, count: 0, tweetProfileImagePresent: null, tweetFilter: defaultTweetFilter, showTweetFeed: true, showFollowButton: false, showConnectButton: false, showLoginInfo: false, showTweetBox: false, mainDecorator: defaultMainDecorator, tweetFeedDecorator: defaultTweetFeedDecorator, tweetDecorator: defaultTweetDecorator, tweetProfileImageDecorator: defaultTweetProfileImageDecorator, tweetBodyDecorator: defaultTweetBodyDecorator, tweetUsernameDecorator: defaultTweetUsernameDecorator, tweetTextDecorator: defaultTweetTextDecorator, tweetAttributesDecorator: defaultTweetAttributesDecorator, tweetTimestampDecorator: defaultTweetTimestampDecorator, tweetSourceDecorator: defaultTweetSourceDecorator, tweetGeoLocationDecorator: defaultTweetGeoLocationDecorator, tweetInReplyToDecorator: defaultTweetInReplyToDecorator, tweetRetweeterDecorator: defaultTweetRetweeterDecorator, tweetFeedControlsDecorator: defaultTweetFeedControlsDecorator, tweetFeedControlsMoreBtnDecorator: defaultTweetFeedControlsMoreBtnDecorator, tweetFeedControlsPrevBtnDecorator: defaultTweetFeedControlsPrevBtnDecorator, tweetFeedControlsNextBtnDecorator: defaultTweetFeedControlsNextBtnDecorator, tweetFeedAutorefreshTriggerDecorator: defaultTweetFeedAutorefreshTriggerDecorator, tweetFeedAutorefreshTriggerContentDecorator: defaultTweetFeedAutorefreshTriggerContentDecorator, connectButtonDecorator: defaultConnectButtonDecorator, loginInfoDecorator: defaultLoginInfoDecorator, loginInfoContentDecorator: defaultLoginInfoContentDecorator, followButtonDecorator: defaultFollowButtonDecorator, tweetBoxDecorator: defaultTweetBoxDecorator, linkDecorator: defaultLinkDecorator, usernameDecorator: defaultUsernameDecorator, hashtagDecorator: defaultHashtagDecorator, loadingDecorator: defaultLoadingDecorator, errorDecorator: defaultErrorDecorator, noDataDecorator: defaultNoDataDecorator, tweetTimestampFormatter: defaultTweetTimestampFormatter, tweetTimestampTooltipFormatter: defaultTweetTimestampTooltipFormatter, tweetVisualizer: defaultTweetVisualizer, loadingIndicatorVisualizer: defaultLoadingIndicatorVisualizer, autorefreshTriggerVisualizer: defaultAutorefreshTriggerVisualizer, onDataRequestHandler: defaultOnDataRequestHandler, onRateLimitDataHandler: defaultOnRateLimitDataHandler, _tweetFeedConfig: { expandHovercards: false, showTimestamp: { refreshInterval: 0 }, showSource: false, showGeoLocation: true, showInReplyTo: true, showProfileImages: null, showUserScreenNames: null, showUserFullNames: false, includeRetweets: true, paging: { mode: "none", _limit: 0, _offset: 0 }, autorefresh: { mode: "none", interval: 60, duration: 3600, _startTime: null, _triggerElement: null }, _pageParam: 0, _maxId: null, _recLevel: 0, _noData: false, _clearBeforePopulate: false }, _tweetBoxConfig: { counter: true, width: 515, height: 65, label: "What's happening?", defaultContent: "", onTweet: function () { } }, _connectButtonConfig: { size: "medium" }, _baseSelector: null, _baseElement: null, _tweetFeedElement: null, _tweetFeedControlsElement: null, _followButtonElement: null, _loginInfoElement: null, _connectButtonElement: null, _tweetBoxElement: null, _loadingIndicatorElement: null, _noDataElement: null, _tweetsCache: [], _autorefreshTweetsCache: [], _stats: { dataRequestCount: 0, rateLimitPreventionCount: 0, rateLimit: { remaining_hits: 150, hourly_limit: 150}} }, a); if (a.mainDecorator) { a._baseSelector = this.selector; if (typeof a.username != "string") { if (!a.searchParams) a.searchParams = ["q=from:" + a.username.join(" OR from:")]; a.username = a.username[0] } typeof a.showTweetFeed == "object" && e.extend(true, a._tweetFeedConfig, a.showTweetFeed); if (typeof a.showTweetBox == "object") { a._tweetBoxConfig = a.showTweetBox; a.showTweetBox = true } if (typeof a.showConnectButton == "object") { a._connectButtonConfig = a.showConnectButton; a.showConnectButton = true } if (a._tweetFeedConfig.showProfileImages == null) a._tweetFeedConfig.showProfileImages = a.tweetProfileImagePresent; if (a._tweetFeedConfig.showProfileImages == null) a._tweetFeedConfig.showProfileImages = (a.list || a.searchParams) && a.tweetProfileImageDecorator; if (a._tweetFeedConfig.showUserScreenNames == null) { if (a.list || a.searchParams) a._tweetFeedConfig.showUserScreenNames = true; if (!a.tweetUsernameDecorator) a._tweetFeedConfig.showUserScreenNames = false } if (a._tweetFeedConfig.showUserFullNames == null) { if (a.list || a.searchParams) a._tweetFeedConfig.showUserFullNames = true; if (!a.tweetUsernameDecorator) a._tweetFeedConfig.showUserFullNames = false } a.count = validateRange(a.count, 0, a.searchParams ? 100 : 20); a._tweetFeedConfig.autorefresh.interval = Math.max(30, a._tweetFeedConfig.autorefresh.interval); a._tweetFeedConfig.paging._offset = 0; a._tweetFeedConfig.paging._limit = a.count; if (a.count == 0 || !a.showTweetFeed) { a.tweetFeedDecorator = null; a.tweetFeedControlsDecorator = null } if (a._tweetFeedConfig.paging.mode == "none") a.tweetFeedControlsDecorator = null; if (!a.showFollowButton) a.followButtonDecorator = null; if (!a.showTweetBox) a.tweetBoxDecorator = null; if (!a.showConnectButton) a.connectButtonDecorator = null; if (!a.showLoginInfo) a.loginInfoDecorator = null; if (!a._tweetFeedConfig.showTimestamp) a.tweetTimestampDecorator = null; if (!a._tweetFeedConfig.showSource) a.tweetSourceDecorator = null; if (!a._tweetFeedConfig.showGeoLocation) a.tweetGeoLocationDecorator = null; if (!a._tweetFeedConfig.showInReplyTo) a.tweetInReplyToDecorator = null; e.ajaxSetup({ cache: true }); return this.each(function () { a._baseElement = e(this); a._tweetFeedElement = a.tweetFeedDecorator ? e(a.tweetFeedDecorator(a)) : null; a._tweetFeedControlsElement = a.tweetFeedControlsDecorator ? e(a.tweetFeedControlsDecorator(a)) : null; a._followButtonElement = a.followButtonDecorator ? e(a.followButtonDecorator(a)) : null; a._tweetBoxElement = a.tweetBoxDecorator ? e(a.tweetBoxDecorator(a)) : null; a._connectButtonElement = a.connectButtonDecorator ? e(a.connectButtonDecorator(a)) : null; a._loginInfoElement = a.loginInfoDecorator ? e(a.loginInfoDecorator(a)) : null; a.mainDecorator(a); populateTweetFeed(a); populateAnywhereControls(a); bindEventHandlers(a); a._tweetFeedConfig.autorefresh._startTime = (new Date).getTime(); startAutorefresh(a); startTimestampRefresh(a) }) } }; defaultMainDecorator = function (a) { a._tweetFeedElement && a._baseElement.append(a._tweetFeedElement); a._tweetFeedControlsElement && a._baseElement.append(a._tweetFeedControlsElement); a._connectButtonElement && a._baseElement.append(a._connectButtonElement); a._loginInfoElement && a._baseElement.append(a._loginInfoElement); a._followButtonElement && a._baseElement.append(a._followButtonElement); a._tweetBoxElement && a._baseElement.append(a._tweetBoxElement) }; defaultTweetFeedControlsDecorator = function (a) { var b = ""; if (a._tweetFeedConfig.paging.mode == "prev-next") { if (a.tweetFeedControlsPrevBtnDecorator) b += a.tweetFeedControlsPrevBtnDecorator(a); if (a.tweetFeedControlsNextBtnDecorator) b += a.tweetFeedControlsNextBtnDecorator(a) } else if (a._tweetFeedConfig.paging.mode != "endless-scroll") if (a.tweetFeedControlsMoreBtnDecorator) b += a.tweetFeedControlsMoreBtnDecorator(a); return '<div class="jta-tweet-list-controls">' + b + "</div>" }; defaultTweetFeedControlsMoreBtnDecorator = function () { return '<span class="jta-tweet-list-controls-button jta-tweet-list-controls-button-more">More</span>' }; defaultTweetFeedControlsPrevBtnDecorator = function () { return '<span class="jta-tweet-list-controls-button jta-tweet-list-controls-button-prev">Zur&uuml;ck</span>' }; defaultTweetFeedControlsNextBtnDecorator = function () { return '<span class="jta-tweet-list-controls-button jta-tweet-list-controls-button-next">Vor</span>' }; defaultTweetFeedAutorefreshTriggerDecorator = function (a, b) { var c = ""; if (b.tweetFeedAutorefreshTriggerContentDecorator) c = b.tweetFeedAutorefreshTriggerContentDecorator(a, b); return '<li class="jta-tweet-list-autorefresh-trigger">' + c + "</li>" }; defaultTweetFeedAutorefreshTriggerContentDecorator = function (a) { return '<span class="jta-tweet-list-autorefresh-trigger-content">' + ("" + a + " new " + (a > 1 ? " tweets" : " tweet")) + "</span>" }; defaultTweetFeedDecorator = function () { return '<ul class="jta-tweet-list"></ul>' }; defaultTweetDecorator = function (a, b) { var c = ""; if (b._tweetFeedConfig.showProfileImages) c += b.tweetProfileImageDecorator(a, b); if (b.tweetBodyDecorator) c += b.tweetBodyDecorator(a, b); c += '<div class="jta-clear">&nbsp;</div>'; return '<li class="jta-tweet-list-item">' + c + "</li>" }; defaultTweetProfileImageDecorator = function (a) { a = a.retweeted_status || a; var b = a.user ? a.user.screen_name : a.from_user; return '<div class="jta-tweet-profile-image">' + ('<a class="jta-tweet-profile-image-link" href="http://twitter.com/' + b + '" target="_blank"><img src="' + (a.user ? a.user.profile_image_url : a.profile_image_url) + '" alt="' + b + '"' + (isAnywherePresent() ? "" : ' title="' + b + '"') + "/></a>") + "</div>" }; defaultTweetBodyDecorator = function (a, b) { var c = ""; if (b.tweetTextDecorator) c += b.tweetTextDecorator(a, b); if (b.tweetAttributesDecorator) c += b.tweetAttributesDecorator(a, b); return '<div class="jta-tweet-body ' + (b._tweetFeedConfig.showProfileImages ? "jta-tweet-body-list-profile-image-present" : "") + '">' + c + "</div>" }; defaultTweetTextDecorator = function (a, b) { var c = a.text; if (a.retweeted_status && (b._tweetFeedConfig.showUserScreenNames || b._tweetFeedConfig.showUserScreenNames == null || b._tweetFeedConfig.showUserFullNames || b._tweetFeedConfig.showUserFullNames == null)) c = a.retweeted_status.text; if (b.linkDecorator) c = b.linkDecorator(c, b); if (b.usernameDecorator) c = b.usernameDecorator(c, b); if (b.hashtagDecorator) c = b.hashtagDecorator(c, b); if (b._tweetFeedConfig.showUserScreenNames || b._tweetFeedConfig.showUserFullNames || a.retweeted_status && (b._tweetFeedConfig.showUserScreenNames == null || b._tweetFeedConfig.showUserFullNames == null)) c = b.tweetUsernameDecorator(a, b) + " " + c; return '<span class="jta-tweet-text">' + c + "</span>" }; defaultTweetUsernameDecorator = function (a, b) { var c = a.retweeted_status || a, d = c.user ? c.user.screen_name : c.from_user; c = c.user ? c.user.name : null; var f; if (d && (b._tweetFeedConfig.showUserScreenNames || b._tweetFeedConfig.showUserScreenNames == null && a.retweeted_status)) f = '<span class="jta-tweet-user-screen-name"><a class="jta-tweet-user-screen-name-link" href="http://twitter.com/' + d + '" target="_blank">' + d + "</a></span>"; var g; if (c && (b._tweetFeedConfig.showUserFullNames || b._tweetFeedConfig.showUserFullNames == null && a.retweeted_status)) g = '<span class="jta-tweet-user-full-name">' + (f ? " (" : "") + '<a class="jta-tweet-user-full-name-link" href="http://twitter.com/' + d + '" name="' + d + '" target="_blank">' + c + "</a>" + (f ? ")" : "") + "</span>"; d = ""; if (f) d += f; if (g) { if (f) d += " "; d += g } if (f || g) d = '<span class="jta-tweet-user-name">' + (a.retweeted_status ? "RT " : "") + d + "</span>"; return d }; defaultTweetAttributesDecorator = function (a, b) { var c = ""; if (b.tweetTimestampDecorator || b.tweetSourceDecorator || b.tweetGeoLocationDecorator || b.tweetInReplyToDecorator || a.retweeted_status && b.tweetRetweeterDecorator) { c += '<span class="jta-tweet-attributes">'; if (b.tweetTimestampDecorator) c += b.tweetTimestampDecorator(a, b); if (b.tweetSourceDecorator) c += b.tweetSourceDecorator(a, b); if (b.tweetGeoLocationDecorator) c += b.tweetGeoLocationDecorator(a, b); if (b.tweetInReplyToDecorator) c += b.tweetInReplyToDecorator(a, b); if (a.retweeted_status && b.tweetRetweeterDecorator) c += b.tweetRetweeterDecorator(a, b); c += "</span>" } return c }; defaultTweetTimestampDecorator = function (a, b) { var c = a.retweeted_status || a, d = formatDate(c.created_at), f = b.tweetTimestampFormatter(d), g = b.tweetTimestampTooltipFormatter(d); return '<span class="jta-tweet-timestamp"><a class="jta-tweet-timestamp-link" data-timestamp="' + d + '" href="http://twitter.com/' + (c.user ? c.user.screen_name : c.from_user) + "/status/" + c.id + '" target="_blank" title="' + g + '">' + f + "</a></span>" }; defaultTweetTimestampTooltipFormatter = function (a) { return (new Date(a)).toLocaleString() }; defaultTweetTimestampFormatter = function (a) { var b = new Date, c = parseInt((b.getTime() - Date.parse(a)) / 1E3), d = ""; if (c < 60) d += c + " second" + (c == 1 ? "" : "s") + " ago"; else if (c < 3600) { b = parseInt((c + 30) / 60); d += b + " minute" + (b == 1 ? "" : "s") + " ago" } else if (c < 86400) { b = parseInt((c + 1800) / 3600); d += b + " hour" + (b == 1 ? "" : "s") + " ago" } else { a = new Date(a); a.getHours(); a.getMinutes(); d += ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][a.getMonth()] + " " + a.getDate(); if (a.getFullYear() < b.getFullYear()) d += ", " + a.getFullYear(); b = parseInt((c + 43200) / 86400); d += " (" + b + " day" + (b == 1 ? "" : "s") + " ago)" } return d }; exTimestampFormatter = function (a) { var b = parseInt(((new Date).getTime() - Date.parse(a)) / 1E3), c = ""; if (b < 60) c += "less than a minute ago"; else if (b < 3600) { b = parseInt((b + 30) / 60); c += b + " minute" + (b == 1 ? "" : "s") + " ago" } else if (b < 86400) { b = parseInt((b + 1800) / 3600); c += "about " + b + " hour" + (b == 1 ? "" : "s") + " ago" } else { b = parseInt((b + 43200) / 86400); c += "about " + b + " day" + (b == 1 ? "" : "s") + " ago"; a = new Date(a); b = "AM"; var d = a.getHours(); if (d > 12) { d -= 12; b = "PM" } var f = a.getMinutes(); c += " (" + d + ":" + ((f < 10 ? "0" : "") + f) + " " + b + " " + (a.getMonth() + 1) + "/" + a.getDate() + "/" + a.getFullYear() + ")" } return c }; defaultTweetSourceDecorator = function (a) { return '<span class="jta-tweet-source"> via <span class="jta-tweet-source-link">' + (a.retweeted_status || a).source.replace(/\&lt\;/gi, "<").replace(/\&gt\;/gi, ">").replace(/\&quot\;/gi, '"') + "</span></span>" }; defaultTweetGeoLocationDecorator = function (a) { var b = ""; a = a.retweeted_status || a; var c; if (a.geo && a.geo.coordinates) c = a.geo.coordinates.join(); else if (a.place && a.place.full_name) c = a.place.full_name; if (c) { b = "here"; if (a.place && a.place.full_name) b = a.place.full_name; b = '<span class="jta-tweet-location"> from <a class="jta-tweet-location-link" href="' + ("http://maps.google.com/maps?q=" + c) + '" target="_blank">' + b + "</a></span>" } return b }; defaultTweetInReplyToDecorator = function (a) { a = a.retweeted_status || a; var b = ""; if (a.in_reply_to_status_id && a.in_reply_to_screen_name) b = '<span class="jta-tweet-inreplyto"> <a class="jta-tweet-inreplyto-link" href="http://twitter.com/' + a.in_reply_to_screen_name + "/status/" + a.in_reply_to_status_id + '" target="_blank">in reply to ' + a.in_reply_to_screen_name + "</a></span>"; return b }; defaultTweetRetweeterDecorator = function (a) { var b = ""; if (a.retweeted_status) { b = a.user ? a.user.screen_name : a.from_user; a = (a.retweeted_status.retweet_count || 0) - 1; var c = " and " + a + (a > 1 ? " others" : " other"); b = '<br/><span class="jta-tweet-retweeter">Retweeted by ' + ('<a class="jta-tweet-retweeter-link" href="http://twitter.com/' + b + '" target="_blank">' + b + "</a>") + (a > 0 ? c : "") + "</span>" } return b }; defaultConnectButtonDecorator = function () { return '<div class="jta-connect-button"></div>' }; defaultLoginInfoDecorator = function () { return '<div class="jta-login-info"></div>' }; defaultLoginInfoContentDecorator = function (a, b) { var c = ""; if (b.isConnected()) { c = b.currentUser.data("screen_name"); var d = b.currentUser.data("profile_image_url"); c = '<div class="jta-login-info-profile-image"><a href="http://twitter.com/' + c + '" target="_blank"><img src="' + d + '" alt="' + c + '" title="' + c + '"/></a></div><div class="jta-login-info-block"><div class="jta-login-info-screen-name"><a href="http://twitter.com/' + c + '" target="_blank">' + c + '</a></div><div class="jta-login-info-sign-out">Sign out</div></div><div class="jta-clear">&nbsp;</div>' } return c }; defaultFollowButtonDecorator = function () { return '<div class="jta-follow-button"></div>' }; defaultTweetBoxDecorator = function () { return '<div class="jta-tweet-box"></div>' }; defaultLinkDecorator = function (a) { return a.replace(/((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi, '<a href="$1" class="jta-tweet-a jta-tweet-link" target="_blank" rel="nofollow">$1</a>') }; defaultUsernameDecorator = function (a) { return isAnywherePresent() ? a : a.replace(/@([a-zA-Z0-9_]+)/gi, '@<a href="http://twitter.com/$1" class="jta-tweet-a twitter-anywhere-user" target="_blank" rel="nofollow">$1</a>') }; defaultHashtagDecorator = function (a) { return a.replace(/#([a-zA-Z0-9_]+)/gi, '<a href="http://search.twitter.com/search?q=%23$1" class="jta-tweet-a jta-tweet-hashtag" title="#$1" target="_blank" rel="nofollow">#$1</a>') }; defaultLoadingDecorator = function () { return '<li class="jta-loading">loading ...</li>' }; defaultErrorDecorator = function (a) { return '<li class="jta-error">ERROR: ' + a + "</li>" }; defaultNoDataDecorator = function () { return '<li class="jta-nodata">No more data</li>' }; defaultTweetFilter = function () { return true }; defaultTweetVisualizer = function (a, b, c) { a[c](b) }; defaultLoadingIndicatorVisualizer = function (a, b, c, d) { defaultVisualizer(a, b, "append", "fadeIn", 600, "fadeOut", 200, d) }; defaultAutorefreshTriggerVisualizer = function (a, b, c, d) { defaultVisualizer(a, b, "prepend", "slideDown", 600, "fadeOut", 200, d) }; defaultVisualizer = function (a, b, c, d, f, g, k, h) { var j = function () { h && h() }; if (a) { b.hide(); a[c](b); b[d](f, j) } else b[g](k, function () { b.remove(); j() }) }; defaultOnDataRequestHandler = function () { return true }; defaultOnRateLimitDataHandler = function () { }; updateLoginInfoElement = function (a, b) { if (a._loginInfoElement && a.loginInfoContentDecorator) { a._loginInfoElement.children().remove(); a._loginInfoElement.append(a.loginInfoContentDecorator(a, b)); e(a._baseSelector + " .jta-login-info-sign-out").bind("click", function () { twttr.anywhere.signOut() }) } }; getFeedUrl = function (a, b) { var c = "https:" == document.location.protocol ? "https:" : "http:"; if (a.searchParams) c += "//search.twitter.com/search.json?" + (a.searchParams instanceof Array ? a.searchParams.join("&") : a.searchParams) + "&rpp=100"; else if (a.list) c += "//api.twitter.com/1/" + a.username + "/lists/" + a.list + "/statuses.json?per_page=20"; else { c += "//api.twitter.com/1/statuses/user_timeline.json?screen_name=" + a.username + "&count=20"; if (a._tweetFeedConfig.includeRetweets) c += "&include_rts=true" } if (b) c += (a._tweetFeedConfig._maxId ? "&max_id=" + a._tweetFeedConfig._maxId : "") + "&page=" + a._tweetFeedConfig._pageParam; c += "&callback=?"; return c }; isAnywherePresent = function () { return typeof twttr != "undefined" }; clearTweetFeed = function (a) { a._tweetFeedElement && a._tweetFeedElement.empty() }; populateTweetFeed = function (a) { a.tweetDecorator && a._tweetFeedElement && getPagedTweets(a, function (b, c) { c._tweetFeedConfig._clearBeforePopulate && clearTweetFeed(c); hideLoadingIndicator(c, function () { e.each(b, function (d, f) { c.tweetVisualizer(c._tweetFeedElement, e(c.tweetDecorator(f, c)), "append", c) }); if (c._tweetFeedConfig._noData && c.noDataDecorator && !c._tweetFeedConfig._noDataElement) { c._tweetFeedConfig._noDataElement = e(c.noDataDecorator(c)); c._tweetFeedElement.append(c._tweetFeedConfig._noDataElement) } c._tweetFeedConfig._clearBeforePopulate && c._tweetFeedElement.scrollTop(0); addHovercards(c) }) }) }; populateTweetFeed2 = function (a) { if (a._tweetFeedElement && a._autorefreshTweetsCache.length > 0) if (a._tweetFeedConfig.autorefresh.mode == "trigger-insert") if (a._tweetFeedConfig.autorefresh._triggerElement) a.tweetFeedAutorefreshTriggerContentDecorator && a._tweetFeedConfig.autorefresh._triggerElement.html(a.tweetFeedAutorefreshTriggerContentDecorator(a._autorefreshTweetsCache.length, a)); else { if (a.tweetFeedAutorefreshTriggerDecorator) { a._tweetFeedConfig.autorefresh._triggerElement = e(a.tweetFeedAutorefreshTriggerDecorator(a._autorefreshTweetsCache.length, a)); a._tweetFeedConfig.autorefresh._triggerElement.bind("click", function () { a.autorefreshTriggerVisualizer(null, a._tweetFeedConfig.autorefresh._triggerElement, a, function () { insertTriggerTweets(a) }); a._tweetFeedConfig.autorefresh._triggerElement = null }); a.autorefreshTriggerVisualizer(a._tweetFeedElement, a._tweetFeedConfig.autorefresh._triggerElement, a) } } else insertTriggerTweets(a) }; insertTriggerTweets = function (a) { if (a.tweetDecorator && a._autorefreshTweetsCache.length > 0) { for (; a._autorefreshTweetsCache.length > 0; ) { var b = a._autorefreshTweetsCache.pop(); a._tweetsCache.unshift(b); a._tweetFeedConfig.paging._offset++; a.tweetVisualizer(a._tweetFeedElement, e(a.tweetDecorator(b, a)), "prepend", a) } addHovercards(a) } }; addHovercards = function (a) { isAnywherePresent() && twttr.anywhere(function (b) { b(a._baseSelector + " .jta-tweet-list").hovercards({ expanded: a._tweetFeedConfig.expandHovercards }); b(a._baseSelector + " .jta-tweet-profile-image img").hovercards({ expanded: a._tweetFeedConfig.expandHovercards, username: function (c) { return c.alt } }); b(a._baseSelector + " .jta-tweet-retweeter-link").hovercards({ expanded: a._tweetFeedConfig.expandHovercards, username: function (c) { return c.text } }); b(a._baseSelector + " .jta-tweet-user-screen-name-link").hovercards({ expanded: a._tweetFeedConfig.expandHovercards, username: function (c) { return c.text } }); b(a._baseSelector + " .jta-tweet-user-full-name-link").hovercards({ expanded: a._tweetFeedConfig.expandHovercards, username: function (c) { return c.name } }) }) }; populateAnywhereControls = function (a) { isAnywherePresent() && twttr.anywhere(function (b) { a.tweetBoxDecorator && b(a._baseSelector + " .jta-tweet-box").tweetBox(a._tweetBoxConfig); a.followButtonDecorator && b(a._baseSelector + " .jta-follow-button").followButton(a.username); if (a.connectButtonDecorator) { var c = e.extend({ authComplete: function () { updateLoginInfoElement(a, b) }, signOut: function () { updateLoginInfoElement(a, b) } }, a._connectButtonConfig); b(a._baseSelector + " .jta-connect-button").connectButton(c); updateLoginInfoElement(a, b) } }) }; bindEventHandlers = function (a) { if (a.tweetFeedControlsDecorator) if (a._tweetFeedConfig.paging.mode == "prev-next") { e(a._baseSelector + " .jta-tweet-list-controls-button-prev").bind("click", function () { !isLoading(a) && a._tweetFeedConfig.paging._offset > 0 && prevPage(a, true) }); e(a._baseSelector + " .jta-tweet-list-controls-button-next").bind("click", function () { isLoading(a) || nextPage(a, true) }) } else a._tweetFeedConfig.paging.mode == "endless-scroll" ? a._tweetFeedElement.bind("scroll", function () { !isLoading(a) && e(this)[0].scrollHeight - e(this).scrollTop() == e(this).outerHeight() && nextPage(a, false) }) : e(a._baseSelector + " .jta-tweet-list-controls-button-more").bind("click", function () { isLoading(a) || nextPage(a, false) }) }; nextPage = function (a, b) { doPage(a, b, Math.min(a._tweetFeedConfig.paging._offset + a._tweetFeedConfig.paging._limit, a._tweetsCache.length)) }; prevPage = function (a, b) { doPage(a, b, Math.max(0, a._tweetFeedConfig.paging._offset - a._tweetFeedConfig.paging._limit)) }; doPage = function (a, b, c) { a._tweetFeedConfig.paging._offset = c; a._tweetFeedConfig._clearBeforePopulate = b; populateTweetFeed(a) }; startAutorefresh = function (a) { if (a._tweetFeedConfig.autorefresh.mode != "none" && a._tweetFeedConfig.paging.mode != "prev-next" && a._tweetFeedConfig.autorefresh.duration != 0 && (a._tweetFeedConfig.autorefresh.duration < 0 || (new Date).getTime() - a._tweetFeedConfig.autorefresh._startTime <= a._tweetFeedConfig.autorefresh.duration * 1E3)) window.setTimeout(function () { processAutorefresh(a) }, a._tweetFeedConfig.autorefresh.interval * 1E3) }; stopAutorefresh = function (a) { a._tweetFeedConfig.autorefresh.duration = 0 }; processAutorefresh = function (a) { if (a._tweetFeedConfig.autorefresh.duration != 0) { getRateLimitedData(a, true, getFeedUrl(a, false), function (b, c) { var d = (b.results || b).slice(0); d.reverse(); e.each(d, function (f, g) { isTweetInCache(g, c) || c.tweetFilter(g, c) && c._autorefreshTweetsCache.unshift(g) }); populateTweetFeed2(c) }); startAutorefresh(a) } }; startTimestampRefresh = function (a) { a.tweetTimestampDecorator && typeof a._tweetFeedConfig.showTimestamp == "object" && a._tweetFeedConfig.showTimestamp.refreshInterval > 0 && window.setTimeout(function () { processTimestampRefresh(a) }, a._tweetFeedConfig.showTimestamp.refreshInterval * 1E3) }; processTimestampRefresh = function (a) { e.each(a._tweetFeedElement.find(".jta-tweet-timestamp-link"), function (b, c) { var d = e(c).attr("data-timestamp"); e(c).html(a.tweetTimestampFormatter(d)) }); startTimestampRefresh(a) }; isTweetInCache = function (a, b) { for (var c = b._tweetsCache.length, d = 0; d < c; d++) if (a.id == b._tweetsCache[d].id) return true; return false }; showLoadingIndicator = function (a) { if (a._tweetFeedElement && a.loadingDecorator && !a._loadingIndicatorElement) { a._loadingIndicatorElement = e(a.loadingDecorator(a)); a.loadingIndicatorVisualizer(a._tweetFeedElement, a._loadingIndicatorElement, a, null); a._tweetFeedElement.scrollTop(1E6) } }; hideLoadingIndicator = function (a, b) { if (a._loadingIndicatorElement) { a.loadingIndicatorVisualizer(null, a._loadingIndicatorElement, a, b); a._loadingIndicatorElement = null } else b && b() }; isLoading = function (a) { return a._loadingIndicatorElement != null }; formatDate = function (a) { return a.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, "$1,$2$4$3") }; validateRange = function (a, b, c) { if (a < b) a = b; if (a > c) a = c; return a }; showError = function (a, b) { a.errorDecorator && a._tweetFeedElement && a._tweetFeedElement.append(a.errorDecorator(b, a)) }; getPagedTweets = function (a, b) { a._tweetFeedConfig._recLevel = 0; getRecPagedTweets(a, a._tweetFeedConfig.paging._offset, a._tweetFeedConfig.paging._limit, b) }; getRecPagedTweets = function (a, b, c, d) { ++a._tweetFeedConfig._recLevel; if (b + c <= a._tweetsCache.length || a._tweetFeedConfig._recLevel > 3 || a._tweetFeedConfig._noData) { if (b + c > a._tweetsCache.length) c = Math.max(0, a._tweetsCache.length - b); for (var f = [], g = 0; g < c; g++) f[g] = a._tweetsCache[b + g]; d(f, a) } else { ++a._tweetFeedConfig._pageParam; getRateLimitedData(a, false, getFeedUrl(a, true), function (k, h) { var j = k.results || k; if (j.length == 0) h._tweetFeedConfig._noData = true; else e.each(j, function (l, i) { if (i.id_str) i.id = i.id_str; if (i.in_reply_to_status_id_str) i.in_reply_to_status_id = i.in_reply_to_status_id_str; if (!h._tweetFeedConfig._maxId) h._tweetFeedConfig._maxId = i.id; h.tweetFilter(i, h) && h._tweetsCache.push(i) }); getRecPagedTweets(h, b, c, d) }) } }; getRateLimitedData = function (a, b, c, d) { getRateLimit(a, function (f) { if (f && f.remaining_hits <= 0) { a._stats.rateLimitPreventionCount++; hideLoadingIndicator(a, null) } else getData(a, b, c, d) }) }; getData = function (a, b, c, d) { a._stats.dataRequestCount++; if (a.onDataRequestHandler(a._stats, a)) { b || showLoadingIndicator(a); e.getJSON(c, function (f) { f.error ? showError(a, f.error) : d(f, a) }) } else hideLoadingIndicator(a, null) }; getRateLimit = function (a, b) { e.getJSON("http://api.twitter.com/1/account/rate_limit_status.json?callback=?", function (c) { a._stats.rateLimit = c; a.onRateLimitDataHandler(a._stats, a); b(c) }) } })(jQuery);
