"), r.data("scrollableArea", r.find("." + n.scrollableAreaClass))), r.data("scrollingHotSpotRight").length === 0 ? (r.prepend(""), r.data("scrollingHotSpotRight", r.find("." + n.scrollingHotSpotRightClass))) : r.prepend(r.data("scrollingHotSpotRight")), r.data("scrollingHotSpotLeft").length === 0 ? (r.prepend(""), r.data("scrollingHotSpotLeft", r.find("." + n.scrollingHotSpotLeftClass))) : r.prepend(r.data("scrollingHotSpotLeft")), r.data("speedBooster", 1), r.data("scrollXPos", 0), r.data("hotSpotWidth", r.data("scrollingHotSpotLeft").innerWidth()), r.data("scrollableAreaWidth", 0), r.data("startingPosition", 0), r.data("rightScrollingInterval", null), r.data("leftScrollingInterval", null), r.data("autoScrollingInterval", null), r.data("hideHotSpotBackgroundsInterval", null), r.data("previousScrollLeft", 0), r.data("pingPongDirection", "right"), r.data("getNextElementWidth", !0), r.data("swapAt", null), r.data("startAtElementHasNotPassed", !0), r.data("swappedElement", null), r.data("originalElements", r.data("scrollableArea").children(n.countOnlyClass)), r.data("visible", !0), r.data("enabled", !0), r.data("scrollableAreaHeight", r.data("scrollableArea").height()), r.data("scrollerOffset", r.offset()), r.data("initialAjaxContentLoaded", !1), n.touchScrolling && r.data("enabled") && r.data("scrollWrapper").kinetic({ y: !1, moved: function (e) { n.manualContinuousScrolling && (r.data("scrollWrapper").scrollLeft() <= 0 ? t._checkContinuousSwapLeft() : t._checkContinuousSwapRight()) }, stopped: function (e) { r.data("scrollWrapper").stop(!0, !1), t.stopAutoScrolling() } }), r.data("scrollingHotSpotRight").bind("mousemove", function (e) { if (n.hotSpotScrolling) { var t = e.pageX - (this.offsetLeft + r.data("scrollerOffset").left); r.data("scrollXPos", Math.round(t / r.data("hotSpotWidth") * n.hotSpotScrollingStep)), (r.data("scrollXPos") === Infinity || r.data("scrollXPos") < 1) && r.data("scrollXPos", 1) } }), r.data("scrollingHotSpotRight").bind("mouseover", function () { n.hotSpotScrolling && (r.data("scrollWrapper").stop(!0, !1), t.stopAutoScrolling(), r.data("rightScrollingInterval", setInterval(function () { r.data("scrollXPos") > 0 && r.data("enabled") && (r.data("scrollWrapper").scrollLeft(r.data("scrollWrapper").scrollLeft() + r.data("scrollXPos") * r.data("speedBooster")), n.manualContinuousScrolling && t._checkContinuousSwapRight(), t._showHideHotSpots()) }, n.hotSpotScrollingInterval)), t._trigger("mouseOverRightHotSpot")) }), r.data("scrollingHotSpotRight").bind("mouseout", function () { n.hotSpotScrolling && (clearInterval(r.data("rightScrollingInterval")), r.data("scrollXPos", 0), n.easingAfterHotSpotScrolling && r.data("enabled") && r.data("scrollWrapper").animate({ scrollLeft: r.data("scrollWrapper").scrollLeft() + n.easingAfterHotSpotScrollingDistance }, { duration: n.easingAfterHotSpotScrollingDuration, easing: n.easingAfterHotSpotScrollingFunction })) }), r.data("scrollingHotSpotRight").bind("mousedown", function () { r.data("speedBooster", n.hotSpotMouseDownSpeedBooster) }), e("body").bind("mouseup", function () { r.data("speedBooster", 1) }), r.data("scrollingHotSpotLeft").bind("mousemove", function (e) { if (n.hotSpotScrolling) { var t = this.offsetLeft + r.data("scrollerOffset").left + r.data("hotSpotWidth") - e.pageX; r.data("scrollXPos", Math.round(t / r.data("hotSpotWidth") * n.hotSpotScrollingStep)), (r.data("scrollXPos") === Infinity || r.data("scrollXPos") < 1) && r.data("scrollXPos", 1) } }), r.data("scrollingHotSpotLeft").bind("mouseover", function () { n.hotSpotScrolling && (r.data("scrollWrapper").stop(!0, !1), t.stopAutoScrolling(), r.data("leftScrollingInterval", setInterval(function () { r.data("scrollXPos") > 0 && r.data("enabled") && (r.data("scrollWrapper").scrollLeft(r.data("scrollWrapper").scrollLeft() - r.data("scrollXPos") * r.data("speedBooster")), n.manualContinuousScrolling && t._checkContinuousSwapLeft(), t._showHideHotSpots()) }, n.hotSpotScrollingInterval)), t._trigger("mouseOverLeftHotSpot")) }), r.data("scrollingHotSpotLeft").bind("mouseout", function () { n.hotSpotScrolling && (clearInterval(r.data("leftScrollingInterval")), r.data("scrollXPos", 0), n.easingAfterHotSpotScrolling && r.data("enabled") && r.data("scrollWrapper").animate({ scrollLeft: r.data("scrollWrapper").scrollLeft() - n.easingAfterHotSpotScrollingDistance }, { duration: n.easingAfterHotSpotScrollingDuration, easing: n.easingAfterHotSpotScrollingFunction })) }), r.data("scrollingHotSpotLeft").bind("mousedown", function () { r.data("speedBooster", n.hotSpotMouseDownSpeedBooster) }), r.data("scrollableArea").mousewheel(function (e, i, s, u) { if (r.data("enabled") && n.mousewheelScrolling.length > 0) { var a; n.mousewheelScrolling === "vertical" && u !== 0 ? (t.stopAutoScrolling(), e.preventDefault(), a = Math.round(n.mousewheelScrollingStep * u * -1), t.move(a)) : n.mousewheelScrolling === "horizontal" && s !== 0 ? (t.stopAutoScrolling(), e.preventDefault(), a = Math.round(n.mousewheelScrollingStep * s * -1), t.move(a)) : n.mousewheelScrolling === "allDirections" && (t.stopAutoScrolling(), e.preventDefault(), a = Math.round(n.mousewheelScrollingStep * i * -1), t.move(a)) } }), n.mousewheelScrolling && r.data("scrollingHotSpotLeft").add(r.data("scrollingHotSpotRight")).mousewheel(function (e) { e.preventDefault() }), e(window).bind("resize", function () { t._showHideHotSpots(), t._trigger("windowResized") }), jQuery.isEmptyObject(n.getContentOnLoad) || t[n.getContentOnLoad.method](n.getContentOnLoad.content, n.getContentOnLoad.manipulationMethod, n.getContentOnLoad.addWhere, n.getContentOnLoad.filterTag), n.hiddenOnStart && t.hide(), e(window).load(function () { n.hiddenOnStart || t.recalculateScrollableArea(), n.autoScrollingMode.length > 0 && !n.hiddenOnStart && t.startAutoScrolling(); if (n.autoScrollingMode !== "always") switch (n.visibleHotSpotBackgrounds) { case "always": t.showHotSpotBackgrounds(); break; case "onStart": t.showHotSpotBackgrounds(), r.data("hideHotSpotBackgroundsInterval", setTimeout(function () { t.hideHotSpotBackgrounds(250) }, n.hotSpotsVisibleTime)); break; case "hover": r.mouseenter(function (e) { n.hotSpotScrolling && (e.stopPropagation(), t.showHotSpotBackgrounds(250)) }).mouseleave(function (e) { n.hotSpotScrolling && (e.stopPropagation(), t.hideHotSpotBackgrounds(250)) }); break; default: } t._showHideHotSpots(), t._trigger("setupComplete") }) }, _setOption: function (e, t) { var n = this, r = this.options, i = this.element; r[e] = t, e === "hotSpotScrolling" ? t === !0 ? n._showHideHotSpots() : (i.data("scrollingHotSpotLeft").hide(), i.data("scrollingHotSpotRight").hide()) : e === "autoScrollingStep" || e === "easingAfterHotSpotScrollingDistance" || e === "easingAfterHotSpotScrollingDuration" || e === "easingAfterMouseWheelScrollingDuration" ? r[e] = parseInt(t, 10) : e === "autoScrollingInterval" && (r[e] = parseInt(t, 10), n.startAutoScrolling()) }, showHotSpotBackgrounds: function (e) { var t = this, n = this.element, r = this.option; e !== undefined ? (n.data("scrollingHotSpotLeft").addClass("scrollingHotSpotLeftVisible"), n.data("scrollingHotSpotRight").addClass("scrollingHotSpotRightVisible"), n.data("scrollingHotSpotLeft").add(n.data("scrollingHotSpotRight")).fadeTo(e, .35)) : (n.data("scrollingHotSpotLeft").addClass("scrollingHotSpotLeftVisible"), n.data("scrollingHotSpotLeft").removeAttr("style"), n.data("scrollingHotSpotRight").addClass("scrollingHotSpotRightVisible"), n.data("scrollingHotSpotRight").removeAttr("style")), t._showHideHotSpots() }, hideHotSpotBackgrounds: function (e) { var t = this.element, n = this.option; e !== undefined ? (t.data("scrollingHotSpotLeft").fadeTo(e, 0, function () { t.data("scrollingHotSpotLeft").removeClass("scrollingHotSpotLeftVisible") }), t.data("scrollingHotSpotRight").fadeTo(e, 0, function () { t.data("scrollingHotSpotRight").removeClass("scrollingHotSpotRightVisible") })) : (t.data("scrollingHotSpotLeft").removeClass("scrollingHotSpotLeftVisible").removeAttr("style"), t.data("scrollingHotSpotRight").removeClass("scrollingHotSpotRightVisible").removeAttr("style")) }, _showHideHotSpots: function () { var e = this, t = this.element, n = this.options; n.hotSpotScrolling ? n.manualContinuousScrolling && n.hotSpotScrolling && n.autoScrollingMode !== "always" ? (t.data("scrollingHotSpotLeft").show(), t.data("scrollingHotSpotRight").show()) : n.autoScrollingMode !== "always" && n.hotSpotScrolling ? t.data("scrollableAreaWidth") <= t.data("scrollWrapper").innerWidth() ? (t.data("scrollingHotSpotLeft").hide(), t.data("scrollingHotSpotRight").hide()) : t.data("scrollWrapper").scrollLeft() === 0 ? (t.data("scrollingHotSpotLeft").hide(), t.data("scrollingHotSpotRight").show(), e._trigger("scrollerLeftLimitReached"), clearInterval(t.data("leftScrollingInterval")), t.data("leftScrollingInterval", null)) : t.data("scrollableAreaWidth") <= t.data("scrollWrapper").innerWidth() + t.data("scrollWrapper").scrollLeft() ? (t.data("scrollingHotSpotLeft").show(), t.data("scrollingHotSpotRight").hide(), e._trigger("scrollerRightLimitReached"), clearInterval(t.data("rightScrollingInterval")), t.data("rightScrollingInterval", null)) : (t.data("scrollingHotSpotLeft").show(), t.data("scrollingHotSpotRight").show()) : (t.data("scrollingHotSpotLeft").hide(), t.data("scrollingHotSpotRight").hide()) : (t.data("scrollingHotSpotLeft").hide(), t.data("scrollingHotSpotRight").hide()) }, _setElementScrollPosition: function (t, n) { var r = this.element, i = this.options, s = 0; switch (t) { case "first": return r.data("scrollXPos", 0), !0; case "start": if (i.startAtElementId !== "" && r.data("scrollableArea").has("#" + i.startAtElementId)) return s = e("#" + i.startAtElementId).position().left, r.data("scrollXPos", s), !0; return !1; case "last": return r.data("scrollXPos", r.data("scrollableAreaWidth") - r.data("scrollWrapper").innerWidth()), !0; case "number": if (!isNaN(n)) return s = r.data("scrollableArea").children(i.countOnlyClass).eq(n - 1).position().left, r.data("scrollXPos", s), !0; return !1; case "id": if (n.length > 0 && r.data("scrollableArea").has("#" + n)) return s = e("#" + n).position().left, r.data("scrollXPos", s), !0; return !1; default: return !1 } }, jumpToElement: function (e, t) { var n = this, r = this.element; if (r.data("enabled") && n._setElementScrollPosition(e, t)) { r.data("scrollWrapper").scrollLeft(r.data("scrollXPos")), n._showHideHotSpots(); switch (e) { case "first": n._trigger("jumpedToFirstElement"); break; case "start": n._trigger("jumpedToStartElement"); break; case "last": n._trigger("jumpedToLastElement"); break; case "number": n._trigger("jumpedToElementNumber", null, { elementNumber: t }); break; case "id": n._trigger("jumpedToElementId", null, { elementId: t }); break; default: } } }, scrollToElement: function (e, t) { var n = this, r = this.element, i = this.options, s = !1; r.data("enabled") && n._setElementScrollPosition(e, t) && (r.data("autoScrollingInterval") !== null && (n.stopAutoScrolling(), s = !0), r.data("scrollWrapper").stop(!0, !1), r.data("scrollWrapper").animate({ scrollLeft: r.data("scrollXPos") }, { duration: i.scrollToAnimationDuration, easing: i.scrollToEasingFunction, complete: function () { s && n.startAutoScrolling(), n._showHideHotSpots(); switch (e) { case "first": n._trigger("scrolledToFirstElement"); break; case "start": n._trigger("scrolledToStartElement"); break; case "last": n._trigger("scrolledToLastElement"); break; case "number": n._trigger("scrolledToElementNumber", null, { elementNumber: t }); break; case "id": n._trigger("scrolledToElementId", null, { elementId: t }); break; default: } } })) }, move: function (e) { var t = this, n = this.element, r = this.options; n.data("scrollWrapper").stop(!0, !0); if (e < 0 && n.data("scrollWrapper").scrollLeft() > 0 || e > 0 && n.data("scrollableAreaWidth") > n.data("scrollWrapper").innerWidth() + n.data("scrollWrapper").scrollLeft()) r.easingAfterMouseWheelScrolling ? n.data("scrollWrapper").animate({ scrollLeft: n.data("scrollWrapper").scrollLeft() + e }, { duration: r.easingAfterMouseWheelScrollingDuration, easing: r.easingAfterMouseWheelFunction, complete: function () { t._showHideHotSpots(), r.manualContinuousScrolling && (e > 0 ? t._checkContinuousSwapRight() : t._checkContinuousSwapLeft()) } }) : (n.data("scrollWrapper").scrollLeft(n.data("scrollWrapper").scrollLeft() + e), t._showHideHotSpots(), r.manualContinuousScrolling && (e > 0 ? t._checkContinuousSwapRight() : t._checkContinuousSwapLeft())) }, getFlickrContent: function (t, n) { var r = this, i = this.element; e.getJSON(t, function (t) { function c(t, a) { var p = t.media.m, d = p.replace("_m", s[a].letter), v = e("").attr("src", d); v.load(function () { this.height < i.data("scrollableAreaHeight") ? a + 1 < s.length ? c(t, a + 1) : h(this) : h(this); if (l === f) { switch (n) { case "addFirst": i.data("scrollableArea").children(":first").before(o); break; case "addLast": i.data("scrollableArea").children(":last").after(o); break; default: i.data("scrollableArea").html(o) } i.data("initialAjaxContentLoaded") ? r.recalculateScrollableArea() : i.data("initialAjaxContentLoaded", !0), r._showHideHotSpots(), r._trigger("addedFlickrContent", null, { addedElementIds: u }) } }) } function h(t) { var n = i.data("scrollableAreaHeight") / t.height, r = Math.round(t.width * n), s = e(t).attr("src").split("/"), a = s.length - 1; s = s[a].split("."), e(t).attr("id", s[0]), e(t).css({ height: i.data("scrollableAreaHeight"), width: r }), u.push(s[0]), o.push(t), l++ } var s = [{ size: "small square", pixels: 75, letter: "_s" }, { size: "thumbnail", pixels: 100, letter: "_t" }, { size: "small", pixels: 240, letter: "_m" }, { size: "medium", pixels: 500, letter: "" }, { size: "medium 640", pixels: 640, letter: "_z" }, { size: "large", pixels: 1024, letter: "_b"}], o = [], u = [], a, f = t.items.length, l = 0; i.data("scrollableAreaHeight") <= 75 ? a = 0 : i.data("scrollableAreaHeight") <= 100 ? a = 1 : i.data("scrollableAreaHeight") <= 240 ? a = 2 : i.data("scrollableAreaHeight") <= 500 ? a = 3 : i.data("scrollableAreaHeight") <= 640 ? a = 4 : a = 5, e.each(t.items, function (e, t) { c(t, a) }) }) }, getAjaxContent: function (t, n, r) { var i = this, s = this.element; e.ajaxSetup({ cache: !1 }), e.get(t, function (o) { var u; r !== undefined ? r.length > 0 ? u = e("
").html(o).find(r) : u = t : u = o; switch (n) { case "addFirst": s.data("scrollableArea").children(":first").before(u); break; case "addLast": s.data("scrollableArea").children(":last").after(u); break; default: s.data("scrollableArea").html(u) } s.data("initialAjaxContentLoaded") ? i.recalculateScrollableArea() : s.data("initialAjaxContentLoaded", !0), i._showHideHotSpots(), i._trigger("addedAjaxContent") }) }, getHtmlContent: function (t, n, r) { var i = this, s = this.element, o; r !== undefined ? r.length > 0 ? o = e("
").html(t).find(r) : o = t : o = t; switch (n) { case "addFirst": s.data("scrollableArea").children(":first").before(o); break; case "addLast": s.data("scrollableArea").children(":last").after(o); break; default: s.data("scrollableArea").html(o) } s.data("initialAjaxContentLoaded") ? i.recalculateScrollableArea() : s.data("initialAjaxContentLoaded", !0), i._showHideHotSpots(), i._trigger("addedHtmlContent") }, recalculateScrollableArea: function () { var t = 0, n = !1, r = this.options, i = this.element; i.data("scrollableArea").children(r.countOnlyClass).each(function () { r.startAtElementId.length > 0 && e(this).attr("id") === r.startAtElementId && (i.data("startingPosition", t), n = !0), t += e(this).outerWidth(!0) }), n || i.data("startAtElementId", ""), i.data("scrollableAreaWidth", t), i.data("scrollableArea").width(i.data("scrollableAreaWidth")), i.data("scrollWrapper").scrollLeft(i.data("startingPosition")), i.data("scrollXPos", i.data("startingPosition")) }, getScrollerOffset: function () { var e = this.element; return e.data("scrollWrapper").scrollLeft() }, stopAutoScrolling: function () { var e = this, t = this.element; t.data("autoScrollingInterval") !== null && (clearInterval(t.data("autoScrollingInterval")), t.data("autoScrollingInterval", null), e._showHideHotSpots(), e._trigger("autoScrollingStopped")) }, startAutoScrolling: function () { var e = this, t = this.element, n = this.options; t.data("enabled") && (e._showHideHotSpots(), clearInterval(t.data("autoScrollingInterval")), t.data("autoScrollingInterval", null), e._trigger("autoScrollingStarted"), t.data("autoScrollingInterval", setInterval(function () { if (!t.data("visible") || t.data("scrollableAreaWidth") <= t.data("scrollWrapper").innerWidth()) clearInterval(t.data("autoScrollingInterval")), t.data("autoScrollingInterval", null); else { t.data("previousScrollLeft", t.data("scrollWrapper").scrollLeft()); switch (n.autoScrollingDirection) { case "right": t.data("scrollWrapper").scrollLeft(t.data("scrollWrapper").scrollLeft() + n.autoScrollingStep), t.data("previousScrollLeft") === t.data("scrollWrapper").scrollLeft() && (e._trigger("autoScrollingRightLimitReached"), clearInterval(t.data("autoScrollingInterval")), t.data("autoScrollingInterval", null), e._trigger("autoScrollingIntervalStopped")); break; case "left": t.data("scrollWrapper").scrollLeft(t.data("scrollWrapper").scrollLeft() - n.autoScrollingStep), t.data("previousScrollLeft") === t.data("scrollWrapper").scrollLeft() && (e._trigger("autoScrollingLeftLimitReached"), clearInterval(t.data("autoScrollingInterval")), t.data("autoScrollingInterval", null), e._trigger("autoScrollingIntervalStopped")); break; case "backAndForth": t.data("pingPongDirection") === "right" ? t.data("scrollWrapper").scrollLeft(t.data("scrollWrapper").scrollLeft() + n.autoScrollingStep) : t.data("scrollWrapper").scrollLeft(t.data("scrollWrapper").scrollLeft() - n.autoScrollingStep), t.data("previousScrollLeft") === t.data("scrollWrapper").scrollLeft() && (t.data("pingPongDirection") === "right" ? (t.data("pingPongDirection", "left"), e._trigger("autoScrollingRightLimitReached")) : (t.data("pingPongDirection", "right"), e._trigger("autoScrollingLeftLimitReached"))); break; case "endlessLoopRight": t.data("scrollWrapper").scrollLeft(t.data("scrollWrapper").scrollLeft() + n.autoScrollingStep), e._checkContinuousSwapRight(); break; case "endlessLoopLeft": t.data("scrollWrapper").scrollLeft(t.data("scrollWrapper").scrollLeft() - n.autoScrollingStep), e._checkContinuousSwapLeft(); break; default: } } }, n.autoScrollingInterval))) }, _checkContinuousSwapRight: function () { var t = this.element, n = this.options; t.data("getNextElementWidth") && (n.startAtElementId.length > 0 && t.data("startAtElementHasNotPassed") ? (t.data("swapAt", e("#" + n.startAtElementId).outerWidth(!0)), t.data("startAtElementHasNotPassed", !1)) : t.data("swapAt", t.data("scrollableArea").children(":first").outerWidth(!0)), t.data("getNextElementWidth", !1)); if (t.data("swapAt") <= t.data("scrollWrapper").scrollLeft()) { t.data("swappedElement", t.data("scrollableArea").children(":first").detach()), t.data("scrollableArea").append(t.data("swappedElement")); var r = t.data("scrollWrapper").scrollLeft(); t.data("scrollWrapper").scrollLeft(r - t.data("swappedElement").outerWidth(!0)), t.data("getNextElementWidth", !0) } }, _checkContinuousSwapLeft: function () { var t = this.element, n = this.options; t.data("getNextElementWidth") && (n.startAtElementId.length > 0 && t.data("startAtElementHasNotPassed") ? (t.data("swapAt", e("#" + n.startAtElementId).outerWidth(!0)), t.data("startAtElementHasNotPassed", !1)) : t.data("swapAt", t.data("scrollableArea").children(":first").outerWidth(!0)), t.data("getNextElementWidth", !1)), t.data("scrollWrapper").scrollLeft() === 0 && (t.data("swappedElement", t.data("scrollableArea").children(":last").detach()), t.data("scrollableArea").prepend(t.data("swappedElement")), t.data("scrollWrapper").scrollLeft(t.data("scrollWrapper").scrollLeft() + t.data("swappedElement").outerWidth(!0)), t.data("getNextElementWidth", !0)) }, restoreOriginalElements: function () { var e = this, t = this.element; t.data("scrollableArea").html(t.data("originalElements")), e.recalculateScrollableArea(), e.jumpToElement("first") }, show: function () { var e = this.element; e.data("visible", !0), e.show() }, hide: function () { var e = this.element; e.data("visible", !1), e.hide() }, enable: function () { var e = this.element; e.data("enabled", !0) }, disable: function () { var e = this, t = this.element; e.stopAutoScrolling(), clearInterval(t.data("rightScrollingInterval")), clearInterval(t.data("leftScrollingInterval")), clearInterval(t.data("hideHotSpotBackgroundsInterval")), t.data("enabled", !1) }, destroy: function () { var t = this, n = this.element; t.stopAutoScrolling(), clearInterval(n.data("rightScrollingInterval")), clearInterval(n.data("leftScrollingInterval")), clearInterval(n.data("hideHotSpotBackgroundsInterval")), n.data("scrollingHotSpotRight").unbind("mouseover"), n.data("scrollingHotSpotRight").unbind("mouseout"), n.data("scrollingHotSpotRight").unbind("mousedown"), n.data("scrollingHotSpotLeft").unbind("mouseover"), n.data("scrollingHotSpotLeft").unbind("mouseout"), n.data("scrollingHotSpotLeft").unbind("mousedown"), n.unbind("mousenter"), n.unbind("mouseleave"), n.data("scrollingHotSpotRight").remove(), n.data("scrollingHotSpotLeft").remove(), n.data("scrollableArea").remove(), n.data("scrollWrapper").remove(), n.html(n.data("originalElements")), e.Widget.prototype.destroy.apply(this, arguments) } }) })(jQuery);
// jquery.tweet.js - See http://tweet.seaofclouds.com/ or https://github.com/seaofclouds/tweet for more info
// Copyright (c) 2008-2012 Todd Matthews & Steve Purcell
(function (factory) {
if (typeof define === 'function' && define.amd)
define(['jquery'], factory); // AMD support for RequireJS etc.
else
factory(jQuery);
}(function ($) {
$.fn.tweet = function(o){
var s = $.extend({
username: null, // [string or array] required unless using the 'query' option; one or more twitter screen names (use 'list' option for multiple names, where possible)
list: null, // [string] optional name of list belonging to username
favorites: false, // [boolean] display the user's favorites instead of his tweets
query: null, // [string] optional search query (see also: http://search.twitter.com/operators)
avatar_size: null, // [integer] height and width of avatar if displayed (48px max)
count: 3, // [integer] how many tweets to display?
fetch: null, // [integer] how many tweets to fetch via the API (set this higher than 'count' if using the 'filter' option)
page: 1, // [integer] which page of results to fetch (if count != fetch, you'll get unexpected results)
retweets: true, // [boolean] whether to fetch (official) retweets (not supported in all display modes)
intro_text: null, // [string] do you want text BEFORE your your tweets?
outro_text: null, // [string] do you want text AFTER your tweets?
join_text: null, // [string] optional text in between date and tweet, try setting to "auto"
auto_join_text_default: " I said, ", // [string] auto text for non verb: "I said" bullocks
auto_join_text_ed: " I ", // [string] auto text for past tense: "I" surfed
auto_join_text_ing: " I am ", // [string] auto tense for present tense: "I was" surfing
auto_join_text_reply: " I replied to ", // [string] auto tense for replies: "I replied to" @someone "with"
auto_join_text_url: " I was looking at ", // [string] auto tense for urls: "I was looking at" http:...
loading_text: null, // [string] optional loading text, displayed while tweets load
refresh_interval: null, // [integer] optional number of seconds after which to reload tweets
twitter_url: "twitter.com", // [string] custom twitter url, if any (apigee, etc.)
twitter_api_url: "api.twitter.com", // [string] custom twitter api url, if any (apigee, etc.)
twitter_search_url: "search.twitter.com", // [string] custom twitter search url, if any (apigee, etc.)
template: "{avatar}{time}{join} {text}", // [string or function] template used to construct each tweet
- see code for available vars
comparator: function(tweet1, tweet2) { // [function] comparator used to sort tweets (see Array.sort)
return tweet2["tweet_time"] - tweet1["tweet_time"];
},
filter: function(tweet) { // [function] whether or not to include a particular tweet (be sure to also set 'fetch')
return true;
}
// You can attach callbacks to the following events using jQuery's standard .bind() mechanism:
// "loaded" -- triggered when tweets have been fetched and rendered
}, o);
// See http://daringfireball.net/2010/07/improved_regex_for_matching_urls
var url_regexp = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'".,<>?«»“â€â€˜â€™]))/gi;
// Expand values inside simple string templates with {placeholders}
function t(template, info) {
if (typeof template === "string") {
var result = template;
for(var key in info) {
var val = info[key];
result = result.split('{'+key+'}').join(val === null ? '' : val);
}
return result;
} else return template(info);
}
// Export the t function for use when passing a function as the 'template' option
$.extend({tweet: {t: t}});
function replacer (regex, replacement) {
return function() {
var returning = [];
this.each(function() {
returning.push(this.replace(regex, replacement));
});
return $(returning);
};
}
function escapeHTML(s) {
return s.replace(//g,"^>");
}
$.fn.extend({
linkUser: replacer(/(^|[\W])@(\w+)/gi, "$1@$2"),
// Support various latin1 (\u00**) and arabic (\u06**) alphanumeric chars
linkHash: replacer(/(?:^| )[\#]+([\w\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u00ff\u0600-\u06ff]+)/gi,
' #$1'),
makeHeart: replacer(/(<)+[3]/gi, "♥")
});
function linkURLs(text, entities) {
return text.replace(url_regexp, function(match) {
var url = (/^[a-z]+:/i).test(match) ? match : "http://"+match;
var text = match;
for(var i = 0; i < entities.length; ++i) {
var entity = entities[i];
if (entity.url == url && entity.expanded_url) {
url = entity.expanded_url;
text = entity.display_url;
break;
}
}
return ""+escapeHTML(text)+"";
});
}
function parse_date(date_str) {
// The non-search twitter APIs return inconsistently-formatted dates, which Date.parse
// cannot handle in IE. We therefore perform the following transformation:
// "Wed Apr 29 08:53:31 +0000 2009" => "Wed, Apr 29 2009 08:53:31 +0000"
return Date.parse(date_str.replace(/^([a-z]{3})( [a-z]{3} \d\d?)(.*)( \d{4})$/i, '$1,$2$4$3'));
}
function extract_relative_time(date) {
var toInt = function(val) { return parseInt(val, 10); };
var relative_to = new Date();
var delta = toInt((relative_to.getTime() - date) / 1000);
if (delta < 1) delta = 0;
return {
days: toInt(delta / 86400),
hours: toInt(delta / 3600),
minutes: toInt(delta / 60),
seconds: toInt(delta)
};
}
function format_relative_time(time_ago) {
if ( time_ago.days > 2 ) return 'about ' + time_ago.days + ' days ago';
if ( time_ago.hours > 24 ) return 'about a day ago';
if ( time_ago.hours > 2 ) return 'about ' + time_ago.hours + ' hours ago';
if ( time_ago.minutes > 45 ) return 'about an hour ago';
if ( time_ago.minutes > 2 ) return 'about ' + time_ago.minutes + ' minutes ago';
if ( time_ago.seconds > 1 ) return 'about ' + time_ago.seconds + ' seconds ago';
return 'just now';
}
function build_auto_join_text(text) {
if (text.match(/^(@([A-Za-z0-9-_]+)) .*/i)) {
return s.auto_join_text_reply;
} else if (text.match(url_regexp)) {
return s.auto_join_text_url;
} else if (text.match(/^((\w+ed)|just) .*/im)) {
return s.auto_join_text_ed;
} else if (text.match(/^(\w*ing) .*/i)) {
return s.auto_join_text_ing;
} else {
return s.auto_join_text_default;
}
}
function build_api_url() {
var proto = ('https:' == document.location.protocol ? 'https:' : 'http:');
var count = (s.fetch === null) ? s.count : s.fetch;
var common_params = '&include_entities=1&callback=?';
if (s.list) {
return proto+"//"+s.twitter_api_url+"/1/"+s.username[0]+"/lists/"+s.list+"/statuses.json?page="+s.page+"&per_page="+count+common_params;
} else if (s.favorites) {
return proto+"//"+s.twitter_api_url+"/1/favorites.json?screen_name="+s.username[0]+"&page="+s.page+"&count="+count+common_params;
} else if (s.query === null && s.username.length == 1) {
return proto+'//'+s.twitter_api_url+'/1/statuses/user_timeline.json?screen_name='+s.username[0]+'&count='+count+(s.retweets ? '&include_rts=1' : '')+'&page='+s.page+common_params;
} else {
var query = (s.query || 'from:'+s.username.join(' OR from:'));
return proto+'//'+s.twitter_search_url+'/search.json?&q='+encodeURIComponent(query)+'&rpp='+count+'&page='+s.page+common_params;
}
}
function extract_avatar_url(item, secure) {
if (secure) {
return ('user' in item) ?
item.user.profile_image_url_https :
extract_avatar_url(item, false).
replace(/^http:\/\/[a-z0-9]{1,3}\.twimg\.com\//, "https://s3.amazonaws.com/twitter_production/");
} else {
return item.profile_image_url || item.user.profile_image_url;
}
}
// Convert twitter API objects into data available for
// constructing each tweet
using a template
function extract_template_data(item){
var o = {};
o.item = item;
o.source = item.source;
o.screen_name = item.from_user || item.user.screen_name;
// The actual user name is not returned by all Twitter APIs, so please do not
// file an issue if it is empty:
o.name = item.from_user_name || item.user.name;
o.retweet = typeof(item.retweeted_status) != 'undefined';
o.tweet_time = parse_date(item.created_at);
o.join_text = s.join_text == "auto" ? build_auto_join_text(item.text) : s.join_text;
o.tweet_id = item.id_str;
o.twitter_base = "http://"+s.twitter_url+"/";
o.user_url = o.twitter_base+o.screen_name;
o.tweet_url = o.user_url+"/status/"+o.tweet_id;
o.reply_url = o.twitter_base+"intent/tweet?in_reply_to="+o.tweet_id;
o.retweet_url = o.twitter_base+"intent/retweet?tweet_id="+o.tweet_id;
o.favorite_url = o.twitter_base+"intent/favorite?tweet_id="+o.tweet_id;
o.retweeted_screen_name = o.retweet && item.retweeted_status.user.screen_name;
o.tweet_relative_time = format_relative_time(extract_relative_time(o.tweet_time));
o.entities = item.entities ? (item.entities.urls || []).concat(item.entities.media || []) : [];
o.tweet_raw_text = o.retweet ? ('RT @'+o.retweeted_screen_name+' '+item.retweeted_status.text) : item.text; // avoid '...' in long retweets
o.tweet_text = $([linkURLs(o.tweet_raw_text, o.entities)]).linkUser().linkHash()[0];
o.retweeted_tweet_text = $([linkURLs(item.text, o.entities)]).linkUser().linkHash()[0];
o.tweet_text_fancy = $([o.tweet_text]).makeHeart()[0];
o.avatar_size = s.avatar_size;
o.avatar_url = extract_avatar_url(o.retweet ? item.retweeted_status : item, (document.location.protocol === 'https:'));
o.avatar_screen_name = o.retweet ? o.retweeted_screen_name : o.screen_name;
o.avatar_profile_url = o.twitter_base+o.avatar_screen_name;
// Default spans, and pre-formatted blocks for common layouts
o.user = t('{screen_name}', o);
o.join = s.join_text ? t('{join_text}', o) : '';
o.avatar = o.avatar_size ?
t('', o) : '';
o.time = t('{tweet_relative_time}', o);
o.text = t('{tweet_text_fancy}', o);
o.retweeted_text = t('{retweeted_tweet_text}', o);
o.reply_action = t('reply', o);
o.retweet_action = t('retweet', o);
o.favorite_action = t('favorite', o);
return o;
}
function render_tweets(widget, tweets) {
var list = $('
");a.controlsContainer?(d(a.controlsContainer).append(b),a.directionNav=d("."+e+"direction-nav li a",a.controlsContainer)):(a.append(b),a.directionNav=d("."+e+"direction-nav li a",a));f.directionNav.update();a.directionNav.bind(t,function(b){b.preventDefault();b=d(this).hasClass(e+"next")?a.getTarget("next"):a.getTarget("prev");a.flexAnimate(b,c.pauseOnAction)});
p&&a.directionNav.bind("click touchstart",function(a){a.preventDefault()})},update:function(){var b=e+"disabled";1===a.pagingCount?a.directionNav.addClass(b):c.animationLoop?a.directionNav.removeClass(b):0===a.animatingTo?a.directionNav.removeClass(b).filter("."+e+"prev").addClass(b):a.animatingTo===a.last?a.directionNav.removeClass(b).filter("."+e+"next").addClass(b):a.directionNav.removeClass(b)}},pausePlay:{setup:function(){var b=d('