|
| 1 | +/* jQuery Twitter */ |
| 2 | +(function($) { |
| 3 | + /* |
| 4 | + jquery.twitter.js v1.6 |
| 5 | + Last updated: 16 October 2012 |
| 6 | +
|
| 7 | + Created by Damien du Toit |
| 8 | + http://coda.co.za/content/projects/jquery.twitter/ |
| 9 | +
|
| 10 | + Licensed under a Creative Commons Attribution-Non-Commercial 3.0 Unported License |
| 11 | + http://creativecommons.org/licenses/by-nc/3.0/ |
| 12 | + */ |
| 13 | + |
| 14 | + $.fn.getTwitter = function(options) { |
| 15 | + |
| 16 | + $.fn.getTwitter.defaults = { |
| 17 | + userName: null, |
| 18 | + numTweets: 5, |
| 19 | + loaderText: "Loading tweets...", |
| 20 | + slideIn: true, |
| 21 | + slideDuration: 750, |
| 22 | + showHeading: true, |
| 23 | + headingText: "Latest Tweets", |
| 24 | + showProfileLink: true, |
| 25 | + showProfileImg: true, |
| 26 | + showTimestamp: true, |
| 27 | + includeRetweets: false, |
| 28 | + excludeReplies: true |
| 29 | + }; |
| 30 | + |
| 31 | + var o = $.extend({}, $.fn.getTwitter.defaults, options); |
| 32 | + |
| 33 | + return this.each(function() { |
| 34 | + var c = $(this); |
| 35 | + |
| 36 | + // hide container element, remove alternative content, and add class |
| 37 | + c.hide().empty().addClass("twitted"); |
| 38 | + |
| 39 | + // add heading to container element |
| 40 | + if (o.showHeading) { |
| 41 | + c.append("<h2>"+o.headingText+"</h2>"); |
| 42 | + } |
| 43 | + |
| 44 | + // add twitter list to container element |
| 45 | + var twitterListHTML = "<ul id=\"twitter_update_list\"></ul>"; |
| 46 | + c.append(twitterListHTML); |
| 47 | + |
| 48 | + var tl = $("#twitter_update_list"); |
| 49 | + |
| 50 | + // hide twitter list |
| 51 | + tl.hide(); |
| 52 | + |
| 53 | + // add preLoader to container element |
| 54 | + var preLoaderHTML = $("<p class=\"preLoader\">"+o.loaderText+"</p>"); |
| 55 | + c.append(preLoaderHTML); |
| 56 | + |
| 57 | + // add Twitter profile link to container element |
| 58 | + if (o.showProfileLink) { |
| 59 | + var profileLinkHTML = "<p class=\"profileLink\"><a href=\"https://twitter.com/"+o.userName+"\">https://twitter.com/"+o.userName+"</a></p>"; |
| 60 | + c.append(profileLinkHTML); |
| 61 | + } |
| 62 | + |
| 63 | + // if(o.showProfileImg){ |
| 64 | + // var profileImgHTML = "<img" |
| 65 | + // } |
| 66 | + |
| 67 | + // show container element |
| 68 | + c.show(); |
| 69 | + |
| 70 | + // request (o.numTweets + 20) to avoid not having enough tweets if includeRetweets = false and/or excludeReplies = true |
| 71 | + window.jsonTwitterFeed = "https://api.twitter.com/1/statuses/user_timeline.json?include_rts="+o.includeRetweets+"&excludeReplies="+o.excludeReplies+"&screen_name="+o.userName+"&count="+(o.numTweets + 20); |
| 72 | + |
| 73 | + $.ajax({ |
| 74 | + url: jsonTwitterFeed, |
| 75 | + data: {}, |
| 76 | + dataType: "jsonp", |
| 77 | + callbackParameter: "callback", |
| 78 | + timeout: 50000, |
| 79 | + success: function(data) { |
| 80 | + window.count = 0; |
| 81 | + |
| 82 | + $.each(data, function(key, val) { |
| 83 | + |
| 84 | + var tweetHTML = "<li><span>" + replaceURLWithHTMLLinks(val.text) + "</span>"; |
| 85 | + |
| 86 | + |
| 87 | + |
| 88 | + if (o.showTimestamp) tweetHTML += " <a style=\"font-size:85%\" href=\"https://twitter.com/" + o.userName + "/statuses/" + val.id_str + "\">" + relative_time(val.created_at) + "</a>"; |
| 89 | + |
| 90 | + tweetHTML += "</li>"; |
| 91 | + |
| 92 | + $("#twitter_update_list").append(tweetHTML); |
| 93 | + |
| 94 | + count++; |
| 95 | + |
| 96 | + if (count == o.numTweets) { |
| 97 | + // remove preLoader from container element |
| 98 | + $(preLoaderHTML).remove(); |
| 99 | + |
| 100 | + // show twitter list |
| 101 | + if (o.slideIn) { |
| 102 | + // a fix for the jQuery slide effect |
| 103 | + // Hat-tip: http://blog.pengoworks.com/index.cfm/2009/4/21/Fixing-jQuerys-slideDown-effect-ie-Jumpy-Animation |
| 104 | + var tlHeight = tl.data("originalHeight"); |
| 105 | + |
| 106 | + // get the original height |
| 107 | + if (!tlHeight) { |
| 108 | + tlHeight = tl.show().height(); |
| 109 | + tl.data("originalHeight", tlHeight); |
| 110 | + tl.hide().css({height: 0}); |
| 111 | + } |
| 112 | + |
| 113 | + tl.show().animate({height: tlHeight}, o.slideDuration); |
| 114 | + } |
| 115 | + else { |
| 116 | + tl.show(); |
| 117 | + } |
| 118 | + |
| 119 | + // add unique class to first list item |
| 120 | + tl.find("li:first").addClass("firstTweet"); |
| 121 | + |
| 122 | + // add unique class to last list item |
| 123 | + tl.find("li:last").addClass("lastTweet"); |
| 124 | + |
| 125 | + return false; |
| 126 | + } |
| 127 | + }); |
| 128 | + }, |
| 129 | + error: function(XHR, textStatus, errorThrown) { |
| 130 | + //alert("Error: " + textStatus); |
| 131 | + //alert("Error: " + errorThrown); |
| 132 | + } |
| 133 | + }); |
| 134 | + }); |
| 135 | + |
| 136 | + function replaceURLWithHTMLLinks(text) { |
| 137 | + var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig; |
| 138 | + return text.replace(exp, "<a href=\"$1\">$1</a>"); |
| 139 | + } |
| 140 | + |
| 141 | + // sourced from https://twitter.com/javascripts/blogger.js |
| 142 | + function relative_time(time_value) { |
| 143 | + var values = time_value.split(" "); |
| 144 | + time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3]; |
| 145 | + var parsed_date = Date.parse(time_value); |
| 146 | + var relative_to = (arguments.length > 1) ? arguments[1] : new Date(); |
| 147 | + var delta = parseInt((relative_to.getTime() - parsed_date) / 1000); |
| 148 | + delta = delta + (relative_to.getTimezoneOffset() * 60); |
| 149 | + |
| 150 | + if (delta < 60) { |
| 151 | + return "less than a minute ago"; |
| 152 | + } |
| 153 | + else if (delta < 120) { |
| 154 | + return "about a minute ago"; |
| 155 | + } |
| 156 | + else if (delta < (60*60)) { |
| 157 | + return (parseInt(delta / 60)).toString() + " minutes ago"; |
| 158 | + } |
| 159 | + else if (delta < (120*60)) { |
| 160 | + return "about an hour ago"; |
| 161 | + } |
| 162 | + else if (delta < (24*60*60)) { |
| 163 | + return "about " + (parseInt(delta / 3600)).toString() + " hours ago"; |
| 164 | + } |
| 165 | + else if (delta < (48*60*60)) { |
| 166 | + return "1 day ago"; |
| 167 | + } |
| 168 | + else { |
| 169 | + return (parseInt(delta / 86400)).toString() + " days ago"; |
| 170 | + } |
| 171 | + } |
| 172 | + }; |
| 173 | +})(jQuery); |
| 174 | + |
| 175 | +/* Commit Widget */ |
| 176 | +(function ($) { |
| 177 | + function widget(element, options, callback) { |
| 178 | + this.element = element; |
| 179 | + this.options = options; |
| 180 | + this.callback = $.isFunction(callback) ? callback : $.noop; |
| 181 | + } |
| 182 | + |
| 183 | + widget.prototype = (function() { |
| 184 | + |
| 185 | + function getCommits(user, repo, branch, callback) { |
| 186 | + $.ajax({ |
| 187 | + url: "https://api.github.com/repos/" + user + "/" + repo + "/commits?sha=" + branch, |
| 188 | + dataType: 'jsonp', |
| 189 | + success: callback |
| 190 | + }); |
| 191 | + } |
| 192 | + |
| 193 | + function _widgetRun(widget) { |
| 194 | + if (!widget.options) { |
| 195 | + widget.element.append('<span class="error">Options for widget are not set.</span>'); |
| 196 | + return; |
| 197 | + } |
| 198 | + var callback = widget.callback; |
| 199 | + var element = widget.element; |
| 200 | + var user = widget.options.user; |
| 201 | + var repo = widget.options.repo; |
| 202 | + var branch = widget.options.branch; |
| 203 | + var avatarSize = widget.options.avatarSize || 20; |
| 204 | + var last = widget.options.last === undefined ? 0 : widget.options.last; |
| 205 | + var limitMessage = widget.options.limitMessageTo === undefined ? 0 : widget.options.limitMessageTo; |
| 206 | + |
| 207 | + element.append('<p>Loading commits...</p>'); |
| 208 | + getCommits(user, repo, branch, function (data) { |
| 209 | + var commits = data.data; |
| 210 | + var totalCommits = (last < commits.length ? last : commits.length); |
| 211 | + |
| 212 | + element.empty(); |
| 213 | + |
| 214 | + var list = $('<ul class="github-commits-list">').appendTo(element); |
| 215 | + for (var c = 0; c < totalCommits; c++) { |
| 216 | + var commit = commits[c]; |
| 217 | + list.append( |
| 218 | + '<li ' + itemClass(c, totalCommits) + ' >' + |
| 219 | + ' ' + ((commit.author !== null) ? avatar(commit.author.gravatar_id, avatarSize) : '') + |
| 220 | + ' ' + ((commit.author !== null) ? author(commit.author.login) : commit.commit.committer.name) + |
| 221 | + ' committed ' + message(replaceHtmlTags(commit.commit.message), commit.sha) + |
| 222 | + ' ' + when(commit.commit.committer.date) + |
| 223 | + '</li>'); |
| 224 | + } |
| 225 | + callback(element); |
| 226 | + |
| 227 | + function itemClass(current, totalCommits) { |
| 228 | + if (current === 0) { |
| 229 | + return 'class="first"'; |
| 230 | + } else if (current === totalCommits - 1) { |
| 231 | + return 'class="last"'; |
| 232 | + } |
| 233 | + return ''; |
| 234 | + } |
| 235 | + |
| 236 | + function avatar(hash, size) { |
| 237 | + return '<img class="github-avatar" src="http://www.gravatar.com/avatar/' + hash + '?s=' + size + '"/>'; |
| 238 | + } |
| 239 | + |
| 240 | + function author(login) { |
| 241 | + return '<a class="github-user" href="https://github.com/' + login + '">' + login + '</a>'; |
| 242 | + } |
| 243 | + |
| 244 | + function message(commitMessage, sha) { |
| 245 | + var originalCommitMessage = commitMessage; |
| 246 | + if (limitMessage > 0 && commitMessage.length > limitMessage) |
| 247 | + { |
| 248 | + commitMessage = commitMessage.substr(0, limitMessage) + '...'; |
| 249 | + } |
| 250 | + return '"' + '<a class="github-commit" title="' + originalCommitMessage + '" href="https://github.com/' + user + '/' + repo + '/commit/' + sha + '">' + commitMessage + '</a>"'; |
| 251 | + } |
| 252 | + |
| 253 | + function replaceHtmlTags(message) { |
| 254 | + return message.replace(/&/g, "&") |
| 255 | + .replace(/>/g, ">") |
| 256 | + .replace(/</g, "<") |
| 257 | + .replace(/"/g, """); |
| 258 | + } |
| 259 | + |
| 260 | + function when(commitDate) { |
| 261 | + var commitTime = new Date(commitDate).getTime(); |
| 262 | + var todayTime = new Date().getTime(); |
| 263 | + |
| 264 | + var differenceInDays = Math.floor(((todayTime - commitTime)/(24*3600*1000))); |
| 265 | + if (differenceInDays === 0) { |
| 266 | + var differenceInHours = Math.floor(((todayTime - commitTime)/(3600*1000))); |
| 267 | + if (differenceInHours === 0) { |
| 268 | + var differenceInMinutes = Math.floor(((todayTime - commitTime)/(600*1000))); |
| 269 | + if (differenceInMinutes === 0) { |
| 270 | + |
| 271 | + return 'just now'; |
| 272 | + } |
| 273 | + |
| 274 | + return 'about ' + differenceInMinutes + ' minutes ago'; |
| 275 | + } |
| 276 | + |
| 277 | + return 'about ' + differenceInHours + ' hours ago'; |
| 278 | + } else if (differenceInDays == 1) { |
| 279 | + return 'yesterday'; |
| 280 | + } |
| 281 | + return differenceInDays + ' days ago'; |
| 282 | + } |
| 283 | + }); |
| 284 | + } |
| 285 | + |
| 286 | + return { |
| 287 | + run: function () { |
| 288 | + _widgetRun(this); |
| 289 | + } |
| 290 | + }; |
| 291 | + |
| 292 | + })(); |
| 293 | + |
| 294 | + $.fn.githubInfoWidget = function(options, callback) { |
| 295 | + this.each(function () { |
| 296 | + new widget($(this), options, callback) |
| 297 | + .run(); |
| 298 | + }); |
| 299 | + return this; |
| 300 | + }; |
| 301 | + |
| 302 | +})(jQuery); |
| 303 | + |
| 304 | + |
| 305 | +$(function(){ |
| 306 | + $(window).scroll(function(){ |
| 307 | + if($(this).scrollTop() > 114){ |
| 308 | + $('.navBar').addClass('stuck') |
| 309 | + } else { |
| 310 | + $('.navBar').removeClass('stuck') |
| 311 | + } |
| 312 | + }) |
| 313 | + |
| 314 | + // $(".latest-tweets").getTwitter({ |
| 315 | + // userName: "processingOrg", |
| 316 | + // numTweets: 3, |
| 317 | + // loaderText: "Loading tweets...", |
| 318 | + // slideIn: false, |
| 319 | + // showHeading: false, |
| 320 | + // headingText: "Latest Tweets", |
| 321 | + // showProfileLink: false, |
| 322 | + // showTimestamp: true, |
| 323 | + // includeRetweets: false, |
| 324 | + // excludeReplies: true |
| 325 | + // }); |
| 326 | + |
| 327 | + // $(".latest-commits").githubInfoWidget({ user: 'processing', repo: 'processing', branch: 'master', last: 5 }); |
| 328 | + |
| 329 | +}); |
0 commit comments