diff --git a/.themes/classic/_config/adn-timeline.yml b/.themes/classic/_config/adn-timeline.yml
new file mode 100644
index 0000000..3b52c2e
--- /dev/null
+++ b/.themes/classic/_config/adn-timeline.yml
@@ -0,0 +1,10 @@
+---
+# -------------------------------- #
+# App.net Sidebar Plugin Configs #
+# -------------------------------- #
+
+adn:
+ user:
+ post-count: 4
+ show-replies: false
+ show-reposts: false
diff --git a/.themes/classic/_config/delicious-feed.yml b/.themes/classic/_config/delicious-feed.yml
new file mode 100644
index 0000000..ce7657a
--- /dev/null
+++ b/.themes/classic/_config/delicious-feed.yml
@@ -0,0 +1,4 @@
+# Delicious link stream
+delicious:
+ user:
+ count: 4
diff --git a/_config/defaults/deploy/gh_pages.yml b/.themes/classic/_config/deploy/gh_pages.yml
similarity index 68%
rename from _config/defaults/deploy/gh_pages.yml
rename to .themes/classic/_config/deploy/gh_pages.yml
index 1e804ea..d2872fa 100644
--- a/_config/defaults/deploy/gh_pages.yml
+++ b/.themes/classic/_config/deploy/gh_pages.yml
@@ -7,6 +7,3 @@
# This will be configured for you when you run config_deploy
deploy_branch: "gh-pages"
deploy_dir: "_deploy"
-
-# Hidden "dot" files that should be included with the deployed site (see task copydot)
-copy_dot_files: []
diff --git a/.themes/classic/_config/deploy/rsync.yml b/.themes/classic/_config/deploy/rsync.yml
new file mode 100644
index 0000000..e9872f8
--- /dev/null
+++ b/.themes/classic/_config/deploy/rsync.yml
@@ -0,0 +1,14 @@
+---
+# ------------------------ #
+# RSync Config #
+# deploy_default: rsync #
+# ------------------------ #
+
+# Be sure your public key is listed in your server's ~/.ssh/authorized_keys file
+ssh_user: "user@domain.com"
+ssh_port: "22"
+document_root: "~/website.com/"
+rsync_delete: false
+rsync_args: "" # Any extra arguments to pass to rsync
+rsync_checksum: true # Attempts to only upload changed files
+deploy_dir: "_deploy"
diff --git a/_config/defaults/disqus.yml b/.themes/classic/_config/disqus.yml
similarity index 100%
rename from _config/defaults/disqus.yml
rename to .themes/classic/_config/disqus.yml
diff --git a/.themes/classic/_config/facebook-like.yml b/.themes/classic/_config/facebook-like.yml
new file mode 100644
index 0000000..b52130b
--- /dev/null
+++ b/.themes/classic/_config/facebook-like.yml
@@ -0,0 +1,2 @@
+# Facebook Like button on posts/pages
+facebook_like: false
diff --git a/_config/defaults/gauges_analytics.yml b/.themes/classic/_config/gauges-analytics.yml
similarity index 100%
rename from _config/defaults/gauges_analytics.yml
rename to .themes/classic/_config/gauges-analytics.yml
diff --git a/.themes/classic/_config/github-repos.yml b/.themes/classic/_config/github-repos.yml
new file mode 100644
index 0000000..7bdc8d5
--- /dev/null
+++ b/.themes/classic/_config/github-repos.yml
@@ -0,0 +1,24 @@
+---
+# --------------------------------------- #
+# Github Sidebar Repos Listing Plugin #
+# --------------------------------------- #
+
+# Github repositories
+github_repos:
+ user:
+
+ # Automatically select repositories based on:
+ count: 4
+ skip_forks: true # Don't show repos you've forked from others
+ sort_by_watchers: true # Show your top watched projects, set to false to sort by last update
+
+
+ # Instead of fetching automatically, specify a list of repositories to include
+ # Setting repos will ignore the automatic settings above
+ repos:
+
+ # Example:
+ # user: imathis
+ # repos:
+ # - octopress
+ # - hsl-color-picker
diff --git a/_config/defaults/google_analytics.yml b/.themes/classic/_config/google-analytics.yml
similarity index 100%
rename from _config/defaults/google_analytics.yml
rename to .themes/classic/_config/google-analytics.yml
diff --git a/_config/defaults/google_plus.yml b/.themes/classic/_config/google-plus.yml
similarity index 68%
rename from _config/defaults/google_plus.yml
rename to .themes/classic/_config/google-plus.yml
index c658eed..f0b0f83 100644
--- a/_config/defaults/google_plus.yml
+++ b/.themes/classic/_config/google-plus.yml
@@ -4,6 +4,10 @@
# --------------------------------- #
# Hidden: No visible button, just add author information to search results
-googleplus_user:
-googleplus_hidden: false
-google_plus_image_size: 32
+googleplus:
+ user:
+ hidden: false
+ image_size: 32
+
+ # Google+ Sharing
+ plus_one: false
\ No newline at end of file
diff --git a/_config/defaults/jekyll.yml b/.themes/classic/_config/jekyll.yml
similarity index 72%
rename from _config/defaults/jekyll.yml
rename to .themes/classic/_config/jekyll.yml
index e66464a..412697d 100644
--- a/_config/defaults/jekyll.yml
+++ b/.themes/classic/_config/jekyll.yml
@@ -10,7 +10,7 @@ source: source # source file directory
destination: public # compiled site directory
plugins: plugins
code_dir: downloads/code
-category_dir: blog/categories
+category_dir: categories
include:
- .htaccess
markdown: redcarpet
@@ -22,14 +22,15 @@ redcarpet:
- superscript
- smart
pygments: false # Jekyll's default Python Pygments have been replaced by pygments.rb.
- # Set to true to use Albino + Python Pygments
+include:
+ - .htaccess
-env: production
-blog_index_dir: source # directory for your blog's index page (if you put your index in source/blog/index.html, set this to 'source/blog')
+env: production # affects asset compilation
+post_index_dir: source # directory for your posts index page (if you put your index in source/blog/index.html, set this to 'source/blog')
stash_dir: _stash # directory to stash posts for speedy generation
posts_dir: _posts # directory for blog files
-themes_dir: .themes # directory for blog files
new_post_ext: markdown # default new post file extension when using the new_post task
new_page_ext: markdown # default new page file extension when using the new_page task
server_host: 0.0.0.0 # host ip address for preview server
server_port: 4000 # port for preview server eg. localhost:4000
+timezone: local # default time and date used to local timezone. Vew supported timezones (under TZ column): http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
diff --git a/.themes/classic/_config/pinboard-feed.yml b/.themes/classic/_config/pinboard-feed.yml
new file mode 100644
index 0000000..967d10e
--- /dev/null
+++ b/.themes/classic/_config/pinboard-feed.yml
@@ -0,0 +1,4 @@
+# Pinboard link stream
+pinboard:
+ user:
+ count: 4
diff --git a/.themes/classic/_config/require-js.yml b/.themes/classic/_config/require-js.yml
new file mode 100644
index 0000000..1b5015a
--- /dev/null
+++ b/.themes/classic/_config/require-js.yml
@@ -0,0 +1,17 @@
+---
+# Asset configuration
+
+# Javascript assets stored in assets/javascripts and assets/javascripts/lib
+# Are wrapped with CommonJS functions, combined, uglified and fingerprinted
+# Supported files: .js, .coffee, .mustache, .eco, .tmpl
+
+require_js:
+ # Dependiences are added first as globals
+ dependencies:
+ - lib/modernizr.js
+ - lib/swfobject-dynamic.js
+ - lib/*.*
+
+ # files from the javascripts root path are wrapped with CommonJS functions
+ modules:
+ - '*.*'
diff --git a/_config/defaults/classic.yml b/.themes/classic/_config/theme.yml
similarity index 79%
rename from _config/defaults/classic.yml
rename to .themes/classic/_config/theme.yml
index 7eec157..d51722a 100644
--- a/_config/defaults/classic.yml
+++ b/.themes/classic/_config/theme.yml
@@ -3,6 +3,14 @@
# Classic Theme Configuration #
# ------------------------------- #
+theme:
+ name: classic
+ # path to theme stylesheets directory
+ stylesheets_dir: assets/stylesheets
+ # path to theme javascripts directory
+ javascripts_dir: assets/javascripts
+
+
url: http://yoursite.com
title: My Octopress Blog
subtitle: A blogging framework for hackers.
@@ -32,13 +40,13 @@ page_sidebar: page_default.html
post_sidebar: post_default.html
paginate: 10 # Posts per page on the blog index
-pagination_dir: blog # Directory base for pagination URLs eg. /blog/page/2/
+pagination_dir: # Directory base for pagination URLs eg. /page/2/
recent_posts: 5 # Posts in the sidebar Recent Posts section
-excerpt_link: "Read on →" # "Continue reading" link text at the bottom of excerpted articles
+excerpt_link: "Read on →" # "Continue reading" link text at the bottom of excerpted articles
excerpt_in_feed: false # Truncate excerpted articles in the atom feed
permalink_label: "Permalink"
-permalink_label_feed: "⚓ Permalink"
-linklog_marker: "→"
+permalink_label_feed: "★ Permalink"
+linklog_marker: "→"
linklog_marker_position: after
linklog_marker_position_feed: after
standard_post_marker:
diff --git a/.themes/classic/_config/twitter-timeline.yml b/.themes/classic/_config/twitter-timeline.yml
new file mode 100644
index 0000000..39e1a0b
--- /dev/null
+++ b/.themes/classic/_config/twitter-timeline.yml
@@ -0,0 +1,19 @@
+---
+# -------------------------------- #
+# Tweet Sidebar Plugin Configs #
+# -------------------------------- #
+
+twitter:
+ user:
+
+ timeline:
+ tweet-count: 4
+ show-replies: false
+ show-rts: false
+
+ follow-button:
+ show: true
+ follower-count: false
+
+ # Sharing button on posts
+ tweet-button: true
diff --git a/.themes/classic/assets/javascripts/adn-timeline.coffee b/.themes/classic/assets/javascripts/adn-timeline.coffee
new file mode 100644
index 0000000..e170052
--- /dev/null
+++ b/.themes/classic/assets/javascripts/adn-timeline.coffee
@@ -0,0 +1,68 @@
+# App.net fetcher for Octopress (c) Brandon Mathis // MIT License
+helpers = require('helpers')
+
+Adn =
+ timeline: []
+ cookie: 'adn-feed'
+ classname: 'adn-feed'
+
+ template: ->
+ helpers.statusFeed @timeline, @classname
+
+ errorTemplate: ->
+ helpers.errorTemplate "Failed to load posts.", @classname
+
+ parseHtml: (post)->
+ text = helpers.trimDisplayUrls post.html
+ text = text.replace "@#{mention.name}", "@#{mention.name}" for mention in post.entities.mentions
+ text = text.replace "##{hashtag.name}", "##{hashtag.name}" for hashtag in post.entities.hashtags
+ text
+
+ getPost: (post) ->
+ type = if post.repost_of then 'repost' else 'post'
+ post = if type is 'repost' then post.repost_of else post
+ {
+ type: type
+ url: post.canonical_url
+ date: post.created_at
+ author: { user: post.user.username, name: post.user.name, url: post.user.canonical_url } if type is 'repost'
+ text: @parseHtml post
+ }
+
+ format: (posts, user, options) ->
+ postList = []
+ for post in posts
+ postList.push @getPost(post) unless post.repost_of and !options.reposts
+ postList
+
+ init: (user, options, callback) ->
+ posts = $.cookie @cookie
+ if posts
+ @timeline = JSON.parse(posts)
+ if @timeline.length isnt options.count
+ $.removeCookie @cookie
+ @timeline = []
+ init user, options, callback
+ else
+ callback @template()
+ else
+ url = "https://alpha-api.app.net/stream/0/users/@#{user}/posts?"
+ url += "&max_id=#{options.max_id}" if options.max_id
+ url += "&include_directed_posts=0" unless options.replies
+ url += "&callback=?"
+
+ $.ajax
+ url: url
+ dataType: 'jsonp'
+ error: (err) => callback @errorTemplate
+ success: (response) =>
+ @timeline = @timeline.concat response.data
+ if @timeline.length < options.count
+ options.max_id = response.meta.max_id
+ init user, options, callback
+ else
+ @timeline = @format @timeline.slice(0, options.count), user, options
+ $.cookie @cookie, JSON.stringify @timeline, { path: '/' }
+ callback @template()
+
+module.exports = Adn
diff --git a/.themes/classic/assets/javascripts/delicious-feed.coffee b/.themes/classic/assets/javascripts/delicious-feed.coffee
new file mode 100644
index 0000000..2ad48ff
--- /dev/null
+++ b/.themes/classic/assets/javascripts/delicious-feed.coffee
@@ -0,0 +1,38 @@
+# Delicious fetcher for Octopress (c) Brandon Mathis // MIT License
+helpers = require('helpers')
+
+Delicious =
+ cookie: 'delicious-feed'
+ classname: 'delicious-feed'
+
+ template: (data) ->
+ helpers.linkFeed data, @classname
+
+ errorTemplate: ->
+ helpers.errorTemplate "Failed to load bookmarks.", @classname
+
+ format: (feed) ->
+ for item in feed
+ {
+ url: item.u
+ date: item.dt
+ title: item.d
+ text: item.n
+ meta: "Tagged: " + ("#{tag}" for tag in item.t).join ' '
+ }
+
+ init: (user, options, callback) ->
+ feed = $.cookie @cookie
+ if feed
+ callback @template JSON.parse(feed)
+ else
+ $.ajax
+ url: "http://feeds.delicious.com/v2/json/#{user}?&count=#{options.count}&callback=?"
+ dataType: 'jsonp'
+ error: (err) => callback @errorTemplate
+ success: (data) =>
+ data = @format data
+ $.cookie @cookie, JSON.stringify data, { path: '/' }
+ callback @template data
+
+module.exports = Delicious
diff --git a/.themes/classic/assets/javascripts/github-repos.coffee b/.themes/classic/assets/javascripts/github-repos.coffee
new file mode 100644
index 0000000..1cf6e69
--- /dev/null
+++ b/.themes/classic/assets/javascripts/github-repos.coffee
@@ -0,0 +1,60 @@
+# Github fetcher for Octopress (c) Brandon Mathis // MIT License
+helpers = require('helpers')
+
+GitHub =
+ cookie: 'github-feed'
+ classname: 'github-feed'
+
+ template: (data)->
+ helpers.linkFeed data, @classname
+
+ errorTemplate: ->
+ helpers.errorTemplate "Failed to load repo list.", @classname
+
+ addRepo: (repo)->
+ title: repo.name
+ url: repo.url
+ text: repo.description
+ meta: repo.meta
+
+ format: (repos, options) ->
+ repoList = []
+
+ if options.repos
+ filter = []
+ filter.push i.trim().toLowerCase() for i in options.repos.split ','
+
+ for repo in repos
+ unless repoList.length is options.count
+ if options.forks or options.watchers
+ repo.meta = ''
+ if options.watchers
+ repo.meta += "Watchers: #{repo.watchers}"
+ if options.forks
+ repo.meta += ' ,' if repo.meta.length > 0
+ repo.meta += "Forks: #{repo.forks}"
+
+ if filter and filter.indexOf repo.name.toLowerCase() > -1
+ # repo order should match list
+ repoList[filter.indexOf repo.name] = @addRepo repo, options
+ else if !filter
+ repoList.push @addRepo repo, options unless options.skipForks and repo.fork
+
+ repoList
+
+ init: (user, options, callback) ->
+ if options.count or options.repos
+ feed = $.cookie @cookie
+ if feed
+ callback @template JSON.parse(feed)
+ else
+ $.ajax
+ url: "https://api.github.com/users/#{user}/repos?callback=?"
+ dataType: 'jsonp'
+ error: (err) => callback @errorTemplate
+ success: (data) =>
+ data = @format(data.data, options)
+ $.cookie @cookie, JSON.stringify data, { path: '/' }
+ callback @template data
+
+module.exports = GitHub
diff --git a/.themes/classic/assets/javascripts/github.coffee b/.themes/classic/assets/javascripts/github.coffee
new file mode 100644
index 0000000..67aa535
--- /dev/null
+++ b/.themes/classic/assets/javascripts/github.coffee
@@ -0,0 +1,60 @@
+# Github fetcher for Octopress (c) Brandon Mathis // MIT License
+helpers = require('helpers')
+
+GitHub =
+ cookie: 'github-feed'
+ classname: 'github-feed'
+
+ template: (data)->
+ helpers.linkFeed data, @classname
+
+ errorTemplate: ->
+ helpers.errorTemplate "Failed to load repo list.", @classname
+
+ addRepo: (repo)->
+ title: repo.name
+ url: repo.url
+ text: repo.description
+ meta: repo.meta
+
+ format: (repos, options) ->
+ repoList = []
+
+ if options.repos
+ filter = []
+ filter.push i.trim().toLowerCase() for i in options.repos.split ','
+
+ for repo in repos
+ unless repoList.length is options.count and options.count > 1
+ if options.forks or options.watchers
+ repo.meta = ''
+ if options.watchers
+ repo.meta += "Watchers: #{repo.watchers}"
+ if options.forks
+ repo.meta += ' ,' if repo.meta.length > 0
+ repo.meta += "Forks: #{repo.forks}"
+
+ if filter and filter.indexOf repo.name.toLowerCase() > -1
+ # repo order should match list
+ repoList[filter.indexOf repo.name] = @addRepo repo, options
+ else if !filter
+ repoList.push @addRepo repo, options unless options.skipForks and repo.fork
+
+ repoList
+
+ init: (user, options, callback) ->
+ if options.count or options.repos
+ feed = $.cookie @cookie
+ if feed
+ callback @template JSON.parse(feed)
+ else
+ $.ajax
+ url: "https://api.github.com/users/#{user}/repos?callback=?"
+ dataType: 'jsonp'
+ error: (err) => callback @errorTemplate
+ success: (data) =>
+ data = @format(data.data, options)
+ $.cookie @cookie, JSON.stringify data, { path: '/' }
+ callback @template data
+
+module.exports = GitHub
diff --git a/.themes/classic/assets/javascripts/helpers.coffee b/.themes/classic/assets/javascripts/helpers.coffee
new file mode 100644
index 0000000..c4aac88
--- /dev/null
+++ b/.themes/classic/assets/javascripts/helpers.coffee
@@ -0,0 +1,96 @@
+# Helper methods for Octopress (c) 2013 Brandon Mathis // MIT License
+
+Helpers =
+ # Template helpers
+
+ linkFeed: (feed, classname)->
+ "
" + (for item in feed
+ text = "- "
+ text += "
#{item.title.replace '<','<'}
"
+ text += "#{item.text.replace '<','<'}
"
+ text += "#{item.meta}
" if item.meta
+ text += " "
+ ).join('') + "
"
+
+ statusFeed: (feed, classname = '')->
+ ""
+
+ errorTemplate: (message, service = '') ->
+ "#{message}
"
+
+ htmlEscape: (str) ->
+ return String(str)
+ .replace(/&/g, '&')
+ .replace(/"/g, '"')
+ .replace(/'/g, ''')
+ .replace(//g, '>')
+
+ # Url helpers
+
+ trimUrl: (url)->
+ parts = []
+ for part in url.split '/'
+ parts.push part if parts.concat(part).join('/').length < 35
+ parts = parts.join('/')
+ if parts.length < url.length then parts + '…' else parts
+
+ linkify: (text, marker, url) ->
+ text.replace new RegExp("(^|\\W|>)(#{marker})([^\\s<]+)", 'g'), "$1$2$3"
+
+ trimDisplayUrls: (text)->
+ text.replace />https?:\/\/([^\s<]+)/gi, (match, p1)=>
+ ">#{@trimUrl(p1)}"
+
+ # ----------#
+ # Utilities #
+ # ----------#
+
+ # Sort an array of objects on a given key
+
+ sortByKey: (list, key, order='asc') ->
+ list = list.sort (a,b)->
+ if a[key] > b[key] then 1 else if b[key] > a[key] then -1 else 0
+ if order is 'desc' then list.reverse() else list
+
+
+ # Timeago based on JavaScript Pretty Date Copyright (c) 2011 John Resig
+
+ timeago: (time)->
+ say =
+ just_now: "now"
+ minute_ago: "1m"
+ minutes_ago: "m"
+ hour_ago: "1h"
+ hours_ago: "h"
+ yesterday: "1d"
+ days_ago: "d"
+ last_week: "1w"
+ weeks_ago: "w"
+
+ time = time.replace(/-/g,"/").replace(/[TZ]/g," ")
+ secs = ((new Date().getTime() - new Date(time).getTime()) / 1000)
+ mins = Math.floor secs / 60
+ hours = Math.floor secs / 3600
+ days = Math.floor secs / 86400
+ weeks = Math.floor days / 7
+
+ return '#' if isNaN(secs) or days < 0
+
+ if days is 0
+ if secs < 60 then say.just_now
+ else if secs < 120 then say.minute_ago
+ else if secs < 3600 then mins + say.minutes_ago
+ else if secs < 7200 then say.hour_ago
+ else hours + say.hours_ago
+ else
+ if days is 1 then say.yesterday
+ else if days < 7 then days + say.days_ago
+ else if days is 7 then say.last_week
+ else weeks + say.weeks_ago
+
+module.exports = Helpers
diff --git a/.themes/classic/assets/javascripts/lib/ios-rotate-scaling-fix.js b/.themes/classic/assets/javascripts/lib/ios-rotate-scaling-fix.js
new file mode 100644
index 0000000..761fc44
--- /dev/null
+++ b/.themes/classic/assets/javascripts/lib/ios-rotate-scaling-fix.js
@@ -0,0 +1,18 @@
+// iOS scaling bug fix
+// By @mathias, @cheeaun and @jdalton
+// Source url: https://gist.github.com/901295
+
+var addEvent = 'addEventListener',
+ type = 'gesturestart',
+ qsa = 'querySelectorAll',
+ scales = [1, 1],
+ meta = qsa in doc ? doc[qsa]('meta[name=viewport]') : [];
+function fix() {
+ meta.content = 'width=device-width,minimum-scale=' + scales[0] + ',maximum-scale=' + scales[1];
+ doc.removeEventListener(type, fix, true);
+}
+if ((meta = meta[meta.length - 1]) && addEvent in doc) {
+ fix();
+ scales = [0.25, 1.6];
+ doc[addEvent](type, fix, true);
+}
diff --git a/.themes/classic/assets/javascripts/lib/jquery.cookie.js b/.themes/classic/assets/javascripts/lib/jquery.cookie.js
new file mode 100644
index 0000000..06d5e21
--- /dev/null
+++ b/.themes/classic/assets/javascripts/lib/jquery.cookie.js
@@ -0,0 +1,92 @@
+/*!
+ * jQuery Cookie Plugin v1.3.1
+ * https://github.com/carhartl/jquery-cookie
+ *
+ * Copyright 2013 Klaus Hartl
+ * Released under the MIT license
+ */
+(function (factory) {
+ if (typeof define === 'function' && define.amd && define.amd.jQuery) {
+ // AMD. Register as anonymous module.
+ define(['jquery'], factory);
+ } else {
+ // Browser globals.
+ factory(jQuery);
+ }
+}(function ($) {
+
+ var pluses = /\+/g;
+
+ function raw(s) {
+ return s;
+ }
+
+ function decoded(s) {
+ return decodeURIComponent(s.replace(pluses, ' '));
+ }
+
+ function converted(s) {
+ if (s.indexOf('"') === 0) {
+ // This is a quoted cookie as according to RFC2068, unescape
+ s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
+ }
+ try {
+ return config.json ? JSON.parse(s) : s;
+ } catch(er) {}
+ }
+
+ var config = $.cookie = function (key, value, options) {
+
+ // write
+ if (value !== undefined) {
+ options = $.extend({}, config.defaults, options);
+
+ if (typeof options.expires === 'number') {
+ var days = options.expires, t = options.expires = new Date();
+ t.setDate(t.getDate() + days);
+ }
+
+ value = config.json ? JSON.stringify(value) : String(value);
+
+ return (document.cookie = [
+ encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
+ options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+ options.path ? '; path=' + options.path : '',
+ options.domain ? '; domain=' + options.domain : '',
+ options.secure ? '; secure' : ''
+ ].join(''));
+ }
+
+ // read
+ var decode = config.raw ? raw : decoded;
+ var cookies = document.cookie.split('; ');
+ var result = key ? undefined : {};
+ for (var i = 0, l = cookies.length; i < l; i++) {
+ var parts = cookies[i].split('=');
+ var name = decode(parts.shift());
+ var cookie = decode(parts.join('='));
+
+ if (key && key === name) {
+ result = converted(cookie);
+ break;
+ }
+
+ if (!key) {
+ result[name] = converted(cookie);
+ }
+ }
+
+ return result;
+ };
+
+ config.defaults = {};
+
+ $.removeCookie = function (key, options) {
+ if ($.cookie(key) !== undefined) {
+ $.cookie(key, '', $.extend(options, { expires: -1 }));
+ return true;
+ }
+ return false;
+ };
+
+}));
diff --git a/.themes/classic/assets/javascripts/lib/modernizr.js b/.themes/classic/assets/javascripts/lib/modernizr.js
new file mode 100644
index 0000000..c43b11e
--- /dev/null
+++ b/.themes/classic/assets/javascripts/lib/modernizr.js
@@ -0,0 +1,464 @@
+/*! Modernizr 2.6.2 (Custom Build) | MIT & BSD
+ * Build: http://modernizr.com/download/#-video-shiv-cssclasses-addtest-testprop-testallprops-domprefixes-forms_placeholder-load
+ */
+;
+
+
+
+window.Modernizr = (function( window, document, undefined ) {
+
+ var version = '2.6.2',
+
+ Modernizr = {},
+
+ enableClasses = true,
+
+ docElement = document.documentElement,
+
+ mod = 'modernizr',
+ modElem = document.createElement(mod),
+ mStyle = modElem.style,
+
+ inputElem = document.createElement('input') ,
+
+ smile = ':)',
+
+ toString = {}.toString, omPrefixes = 'Webkit Moz O ms',
+
+ cssomPrefixes = omPrefixes.split(' '),
+
+ domPrefixes = omPrefixes.toLowerCase().split(' '),
+
+
+ tests = {},
+ inputs = {},
+ attrs = {},
+
+ classes = [],
+
+ slice = classes.slice,
+
+ featureName,
+
+
+
+ _hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
+
+ if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {
+ hasOwnProp = function (object, property) {
+ return _hasOwnProperty.call(object, property);
+ };
+ }
+ else {
+ hasOwnProp = function (object, property) {
+ return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
+ };
+ }
+
+
+ if (!Function.prototype.bind) {
+ Function.prototype.bind = function bind(that) {
+
+ var target = this;
+
+ if (typeof target != "function") {
+ throw new TypeError();
+ }
+
+ var args = slice.call(arguments, 1),
+ bound = function () {
+
+ if (this instanceof bound) {
+
+ var F = function(){};
+ F.prototype = target.prototype;
+ var self = new F();
+
+ var result = target.apply(
+ self,
+ args.concat(slice.call(arguments))
+ );
+ if (Object(result) === result) {
+ return result;
+ }
+ return self;
+
+ } else {
+
+ return target.apply(
+ that,
+ args.concat(slice.call(arguments))
+ );
+
+ }
+
+ };
+
+ return bound;
+ };
+ }
+
+ function setCss( str ) {
+ mStyle.cssText = str;
+ }
+
+ function setCssAll( str1, str2 ) {
+ return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
+ }
+
+ function is( obj, type ) {
+ return typeof obj === type;
+ }
+
+ function contains( str, substr ) {
+ return !!~('' + str).indexOf(substr);
+ }
+
+ function testProps( props, prefixed ) {
+ for ( var i in props ) {
+ var prop = props[i];
+ if ( !contains(prop, "-") && mStyle[prop] !== undefined ) {
+ return prefixed == 'pfx' ? prop : true;
+ }
+ }
+ return false;
+ }
+
+ function testDOMProps( props, obj, elem ) {
+ for ( var i in props ) {
+ var item = obj[props[i]];
+ if ( item !== undefined) {
+
+ if (elem === false) return props[i];
+
+ if (is(item, 'function')){
+ return item.bind(elem || obj);
+ }
+
+ return item;
+ }
+ }
+ return false;
+ }
+
+ function testPropsAll( prop, prefixed, elem ) {
+
+ var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
+ props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
+
+ if(is(prefixed, "string") || is(prefixed, "undefined")) {
+ return testProps(props, prefixed);
+
+ } else {
+ props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
+ return testDOMProps(props, prefixed, elem);
+ }
+ } tests['video'] = function() {
+ var elem = document.createElement('video'),
+ bool = false;
+
+ try {
+ if ( bool = !!elem.canPlayType ) {
+ bool = new Boolean(bool);
+ bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,'');
+
+ bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,'');
+
+ bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,'');
+ }
+
+ } catch(e) { }
+
+ return bool;
+ };
+ function webforms() {
+ Modernizr['input'] = (function( props ) {
+ for ( var i = 0, len = props.length; i < len; i++ ) {
+ attrs[ props[i] ] = !!(props[i] in inputElem);
+ }
+ if (attrs.list){
+ attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);
+ }
+ return attrs;
+ })('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
+ Modernizr['inputtypes'] = (function(props) {
+
+ for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {
+
+ inputElem.setAttribute('type', inputElemType = props[i]);
+ bool = inputElem.type !== 'text';
+
+ if ( bool ) {
+
+ inputElem.value = smile;
+ inputElem.style.cssText = 'position:absolute;visibility:hidden;';
+
+ if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
+
+ docElement.appendChild(inputElem);
+ defaultView = document.defaultView;
+
+ bool = defaultView.getComputedStyle &&
+ defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
+ (inputElem.offsetHeight !== 0);
+
+ docElement.removeChild(inputElem);
+
+ } else if ( /^(search|tel)$/.test(inputElemType) ){
+ } else if ( /^(url|email)$/.test(inputElemType) ) {
+ bool = inputElem.checkValidity && inputElem.checkValidity() === false;
+
+ } else {
+ bool = inputElem.value != smile;
+ }
+ }
+
+ inputs[ props[i] ] = !!bool;
+ }
+ return inputs;
+ })('search tel url email datetime date month week time datetime-local number range color'.split(' '));
+ }
+ for ( var feature in tests ) {
+ if ( hasOwnProp(tests, feature) ) {
+ featureName = feature.toLowerCase();
+ Modernizr[featureName] = tests[feature]();
+
+ classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
+ }
+ }
+
+ Modernizr.input || webforms();
+
+
+ Modernizr.addTest = function ( feature, test ) {
+ if ( typeof feature == 'object' ) {
+ for ( var key in feature ) {
+ if ( hasOwnProp( feature, key ) ) {
+ Modernizr.addTest( key, feature[ key ] );
+ }
+ }
+ } else {
+
+ feature = feature.toLowerCase();
+
+ if ( Modernizr[feature] !== undefined ) {
+ return Modernizr;
+ }
+
+ test = typeof test == 'function' ? test() : test;
+
+ if (typeof enableClasses !== "undefined" && enableClasses) {
+ docElement.className += ' ' + (test ? '' : 'no-') + feature;
+ }
+ Modernizr[feature] = test;
+
+ }
+
+ return Modernizr;
+ };
+
+
+ setCss('');
+ modElem = inputElem = null;
+
+ ;(function(window, document) {
+ var options = window.html5 || {};
+
+ var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
+
+ var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
+
+ var supportsHtml5Styles;
+
+ var expando = '_html5shiv';
+
+ var expanID = 0;
+
+ var expandoData = {};
+
+ var supportsUnknownElements;
+
+ (function() {
+ try {
+ var a = document.createElement('a');
+ a.innerHTML = '';
+ supportsHtml5Styles = ('hidden' in a);
+
+ supportsUnknownElements = a.childNodes.length == 1 || (function() {
+ (document.createElement)('a');
+ var frag = document.createDocumentFragment();
+ return (
+ typeof frag.cloneNode == 'undefined' ||
+ typeof frag.createDocumentFragment == 'undefined' ||
+ typeof frag.createElement == 'undefined'
+ );
+ }());
+ } catch(e) {
+ supportsHtml5Styles = true;
+ supportsUnknownElements = true;
+ }
+
+ }()); function addStyleSheet(ownerDocument, cssText) {
+ var p = ownerDocument.createElement('p'),
+ parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
+
+ p.innerHTML = 'x';
+ return parent.insertBefore(p.lastChild, parent.firstChild);
+ }
+
+ function getElements() {
+ var elements = html5.elements;
+ return typeof elements == 'string' ? elements.split(' ') : elements;
+ }
+
+ function getExpandoData(ownerDocument) {
+ var data = expandoData[ownerDocument[expando]];
+ if (!data) {
+ data = {};
+ expanID++;
+ ownerDocument[expando] = expanID;
+ expandoData[expanID] = data;
+ }
+ return data;
+ }
+
+ function createElement(nodeName, ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createElement(nodeName);
+ }
+ if (!data) {
+ data = getExpandoData(ownerDocument);
+ }
+ var node;
+
+ if (data.cache[nodeName]) {
+ node = data.cache[nodeName].cloneNode();
+ } else if (saveClones.test(nodeName)) {
+ node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
+ } else {
+ node = data.createElem(nodeName);
+ }
+
+ return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;
+ }
+
+ function createDocumentFragment(ownerDocument, data){
+ if (!ownerDocument) {
+ ownerDocument = document;
+ }
+ if(supportsUnknownElements){
+ return ownerDocument.createDocumentFragment();
+ }
+ data = data || getExpandoData(ownerDocument);
+ var clone = data.frag.cloneNode(),
+ i = 0,
+ elems = getElements(),
+ l = elems.length;
+ for(;i')
+ var mobileNav = $('fieldset.mobile-nav').append('