Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ web/apidoc
web/Composer-Setup.exe
web/book.pdf
cache/
silex.log
silex.log
web/components
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes.
File renamed without changes.
File renamed without changes
File renamed without changes
File renamed without changes
File renamed without changes
145 changes: 145 additions & 0 deletions assets/js/base.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
/* ------------------------------------------------------

Base.js

The master JS file.

Written by Joey Emery.

Contents:
--- Document ready
--- Latest Commit
--- Mobile Navigation
--- Resizer

------------------------------------------------------ */

/* --- Latest Commit --- */
var LatestCommit = {
location: false,

init: function(location) {
if($('#latest_commit').length > 0) {
this.location = location;
this.getLatestCommit();
}
},

getLatestCommit: function() {
$.get(this.location, function(data) {
var commit = data[0];

$('#latest_commit #post_info a:first span:last').text(commit.commit.author.name);
$('#latest_commit #post_info a:last span:last').text($.timeago(commit.commit.author.date));
$('#latest_commit p').text(commit.commit.message);
$('#latest_commit').removeClass('loading');
}, 'json');
}
}

/* --- Mobile Navigation --- */
var MobileNavigation = {
distance: '-250px',
speed: 400,
is_open: false,

/* Sets everything up and fires relevant methods */
init: function() {
$('#mini_nav').css('height', $('body').innerHeight());
this.bind();
},

/* Toggle between open/close */
toggle: function() {
if(this.is_open) {
this.close();
} else {
this.open();
}
},

/* Opens the navigation */
open: function() {
$('#slide_wrapper').css('width', $('body').innerWidth());
$('#mini_nav').css('display', 'block');

$('#slide_wrapper').animate({
'margin-left' : this.distance
}, this.speed, function() {
$('#mini_nav').css('z-index', 100);
});
this.is_open = true;
},

/* Closes the navation */
close: function() {
$('#mini_nav').css('z-index', 9);

$('#slide_wrapper').animate({
'margin-left' : 0
}, this.speed, function() {
$('#slide_wrapper').css('width', 'auto');
$('#mini_nav').css('display', 'none');
});
this.is_open = false;
},

/* Bind elements to their relative methods */
bind: function() {
var instance = this;

$('#header ul').on('click', 'li.show_menu a', function(e) {
e.preventDefault();
instance.toggle();
});
}
}

/* --- Resizer --- */
var Resizer = {
width: false,
callback: false,

init: function(callback) {
this.callback = (typeof callback == 'function') ? callback : false;
this.calculate();
},

calculate: function() {
this.width = $(window).width();
var obj = this;
$(window).resize(function(e) {
obj.width = $(window).width();

if(obj.callback)
obj.callback();
});
}
}

/* --- Document Ready --- */
$(document).ready(function() {
// Controls the mobile navigation stack.
MobileNavigation.init();

// Get the stuff from Github.
LatestCommit.init('https://api.github.com/repos/composer/composer/commits');

// Resizer.
Resizer.init(function() {
if(MobileNavigation.is_open)
MobileNavigation.close();
});

// Time since something happened.
$('.realtime_time').timeago();

// Prettier scrolling.
$('body').on('click', 'a.anchor, .toc li a', function(e) {
e.preventDefault();

$('body').animate({
'scrollTop': ($($(this).attr('href')).offset().top - 70)
}, 1000);
});
});
184 changes: 184 additions & 0 deletions assets/js/libs/timeago.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
/**
* Timeago is a jQuery plugin that makes it easy to support automatically
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
*
* @name timeago
* @version 1.1.0
* @requires jQuery v1.2.3+
* @author Ryan McGeary
* @license MIT License - http://www.opensource.org/licenses/mit-license.php
*
* For usage and examples, visit:
* http://timeago.yarp.com/
*
* Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
*/

(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
$.timeago = function(timestamp) {
if (timestamp instanceof Date) {
return inWords(timestamp);
} else if (typeof timestamp === "string") {
return inWords($.timeago.parse(timestamp));
} else if (typeof timestamp === "number") {
return inWords(new Date(timestamp));
} else {
return inWords($.timeago.datetime(timestamp));
}
};
var $t = $.timeago;

$.extend($.timeago, {
settings: {
refreshMillis: 60000,
allowFuture: false,
localeTitle: false,
strings: {
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "ago",
suffixFromNow: "from now",
seconds: "less than a minute",
minute: "about a minute",
minutes: "%d minutes",
hour: "about an hour",
hours: "about %d hours",
day: "a day",
days: "%d days",
month: "about a month",
months: "%d months",
year: "about a year",
years: "%d years",
wordSeparator: " ",
numbers: []
}
},
inWords: function(distanceMillis) {
var $l = this.settings.strings;
var prefix = $l.prefixAgo;
var suffix = $l.suffixAgo;
if (this.settings.allowFuture) {
if (distanceMillis < 0) {
prefix = $l.prefixFromNow;
suffix = $l.suffixFromNow;
}
}

var seconds = Math.abs(distanceMillis) / 1000;
var minutes = seconds / 60;
var hours = minutes / 60;
var days = hours / 24;
var years = days / 365;

function substitute(stringOrFunction, number) {
var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
var value = ($l.numbers && $l.numbers[number]) || number;
return string.replace(/%d/i, value);
}

var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
seconds < 90 && substitute($l.minute, 1) ||
minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
minutes < 90 && substitute($l.hour, 1) ||
hours < 24 && substitute($l.hours, Math.round(hours)) ||
hours < 42 && substitute($l.day, 1) ||
days < 30 && substitute($l.days, Math.round(days)) ||
days < 45 && substitute($l.month, 1) ||
days < 365 && substitute($l.months, Math.round(days / 30)) ||
years < 1.5 && substitute($l.year, 1) ||
substitute($l.years, Math.round(years));

var separator = $l.wordSeparator || "";
if ($l.wordSeparator === undefined) { separator = " "; }
return $.trim([prefix, words, suffix].join(separator));
},
parse: function(iso8601) {
var s = $.trim(iso8601);
s = s.replace(/\.\d+/,""); // remove milliseconds
s = s.replace(/-/,"/").replace(/-/,"/");
s = s.replace(/T/," ").replace(/Z/," UTC");
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
return new Date(s);
},
datetime: function(elem) {
var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
return $t.parse(iso8601);
},
isTime: function(elem) {
// jQuery's `is()` doesn't play well with HTML5 in IE
return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
}
});

// functions that can be called via $(el).timeago('action')
// init is default when no action is given
// functions are called with context of a single element
var functions = {
init: function(){
var refresh_el = $.proxy(refresh, this);
refresh_el();
var $s = $t.settings;
if ($s.refreshMillis > 0) {
setInterval(refresh_el, $s.refreshMillis);
}
},
update: function(time){
$(this).data('timeago', { datetime: $t.parse(time) });
refresh.apply(this);
}
};

$.fn.timeago = function(action, options) {
var fn = action ? functions[action] : functions.init;
if(!fn){
throw new Error("Unknown function name '"+ action +"' for timeago");
}
// each over objects here and call the requested function
this.each(function(){
fn.call(this, options);
});
return this;
};

function refresh() {
var data = prepareData(this);
if (!isNaN(data.datetime)) {
$(this).text(inWords(data.datetime));
}
return this;
}

function prepareData(element) {
element = $(element);
if (!element.data("timeago")) {
element.data("timeago", { datetime: $t.datetime(element) });
var text = $.trim(element.text());
if ($t.settings.localeTitle) {
element.attr("title", element.data('timeago').datetime.toLocaleString());
} else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
element.attr("title", text);
}
}
return element.data("timeago");
}

function inWords(date) {
return $t.inWords(distance(date));
}

function distance(date) {
return (new Date().getTime() - date.getTime());
}

// fix for IE6 suckage
document.createElement("abbr");
document.createElement("time");
}));
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
29 changes: 28 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,37 @@
"symfony/translation": "2.1.*",
"symfony/twig-bridge": "2.1.*",
"symfony/validator": "2.1.*",
"sami/sami": "*"
"sami/sami": "*",
"components/jquery": "1.9.*"
},
"autoload": {
"psr-0": { "": "src/" }
},
"extra": {
"component": {
"name": "getcomposer",
"styles": [
"assets/css/base.css"
],
"scripts": [
"assets/js/libs/timeago.js",
"assets/js/base.js"
],
"files": [
"assets/fonts/*",
"assets/img/*",
"assets/img/icons/*"
],
"shim": {
"deps": [
"jquery"
]
}
}
},
"config": {
"component-dir": "web/components",
"component-baseurl": "/web/components"
},
"minimum-stability": "dev"
}
Loading