'
+ )
+ .appendTo($body)
+ .panel({
+ delay: 500,
+ hideOnClick: true,
+ hideOnSwipe: true,
+ resetScroll: true,
+ resetForms: true,
+ side: 'right',
+ target: $body,
+ visibleClass: 'is-navPanel-visible'
+ });
+
+ // Get inner.
+ $navPanelInner = $navPanel.children('nav');
+
+ // Move nav content on breakpoint change.
+ var $navContent = $nav.children();
+
+ skel.on('!medium -medium', function() {
+
+ // NavPanel -> Nav.
+ $navContent.appendTo($nav);
+
+ // Flip icon classes.
+ $nav.find('.icons, .icon')
+ .removeClass('alt');
+
+ });
+
+ skel.on('+medium', function() {
+
+ // Nav -> NavPanel.
+ $navContent.appendTo($navPanelInner);
+
+ // Flip icon classes.
+ $navPanelInner.find('.icons, .icon')
+ .addClass('alt');
+
+ });
+
+ // Hack: Disable transitions on WP.
+ if (skel.vars.os == 'wp'
+ && skel.vars.osVersion < 10)
+ $navPanel
+ .css('transition', 'none');
+
+ // Intro.
+ var $intro = $('#intro');
+
+ if ($intro.length > 0) {
+
+ // Hack: Fix flex min-height on IE.
+ if (skel.vars.browser == 'ie') {
+ $window.on('resize.ie-intro-fix', function() {
+
+ var h = $intro.height();
+
+ if (h > $window.height())
+ $intro.css('height', 'auto');
+ else
+ $intro.css('height', h);
+
+ }).trigger('resize.ie-intro-fix');
+ }
+
+ // Hide intro on scroll (> small).
+ skel.on('!small -small', function() {
+
+ $main.unscrollex();
+
+ $main.scrollex({
+ mode: 'bottom',
+ top: '25vh',
+ bottom: '-50vh',
+ enter: function() {
+ $intro.addClass('hidden');
+ },
+ leave: function() {
+ $intro.removeClass('hidden');
+ }
+ });
+
+ });
+
+ // Hide intro on scroll (<= small).
+ skel.on('+small', function() {
+
+ $main.unscrollex();
+
+ $main.scrollex({
+ mode: 'middle',
+ top: '15vh',
+ bottom: '-15vh',
+ enter: function() {
+ $intro.addClass('hidden');
+ },
+ leave: function() {
+ $intro.removeClass('hidden');
+ }
+ });
+
+ });
+
+ }
+
+ });
+
+})(jQuery);
\ No newline at end of file
diff --git a/public/themes/massively/assets/js/skel.min.js b/public/themes/massively/assets/js/skel.min.js
new file mode 100644
index 0000000..0e7633a
--- /dev/null
+++ b/public/themes/massively/assets/js/skel.min.js
@@ -0,0 +1,2 @@
+/* skel.js v3.0.1 | (c) skel.io | MIT licensed */
+var skel=function(){"use strict";var t={breakpointIds:null,events:{},isInit:!1,obj:{attachments:{},breakpoints:{},head:null,states:{}},sd:"/",state:null,stateHandlers:{},stateId:"",vars:{},DOMReady:null,indexOf:null,isArray:null,iterate:null,matchesMedia:null,extend:function(e,n){t.iterate(n,function(i){t.isArray(n[i])?(t.isArray(e[i])||(e[i]=[]),t.extend(e[i],n[i])):"object"==typeof n[i]?("object"!=typeof e[i]&&(e[i]={}),t.extend(e[i],n[i])):e[i]=n[i]})},newStyle:function(t){var e=document.createElement("style");return e.type="text/css",e.innerHTML=t,e},_canUse:null,canUse:function(e){t._canUse||(t._canUse=document.createElement("div"));var n=t._canUse.style,i=e.charAt(0).toUpperCase()+e.slice(1);return e in n||"Moz"+i in n||"Webkit"+i in n||"O"+i in n||"ms"+i in n},on:function(e,n){var i=e.split(/[\s]+/);return t.iterate(i,function(e){var a=i[e];if(t.isInit){if("init"==a)return void n();if("change"==a)n();else{var r=a.charAt(0);if("+"==r||"!"==r){var o=a.substring(1);if(o in t.obj.breakpoints)if("+"==r&&t.obj.breakpoints[o].active)n();else if("!"==r&&!t.obj.breakpoints[o].active)return void n()}}}t.events[a]||(t.events[a]=[]),t.events[a].push(n)}),t},trigger:function(e){return t.events[e]&&0!=t.events[e].length?(t.iterate(t.events[e],function(n){t.events[e][n]()}),t):void 0},breakpoint:function(e){return t.obj.breakpoints[e]},breakpoints:function(e){function n(t,e){this.name=this.id=t,this.media=e,this.active=!1,this.wasActive=!1}return n.prototype.matches=function(){return t.matchesMedia(this.media)},n.prototype.sync=function(){this.wasActive=this.active,this.active=this.matches()},t.iterate(e,function(i){t.obj.breakpoints[i]=new n(i,e[i])}),window.setTimeout(function(){t.poll()},0),t},addStateHandler:function(e,n){t.stateHandlers[e]=n},callStateHandler:function(e){var n=t.stateHandlers[e]();t.iterate(n,function(e){t.state.attachments.push(n[e])})},changeState:function(e){t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].sync()}),t.vars.lastStateId=t.stateId,t.stateId=e,t.breakpointIds=t.stateId===t.sd?[]:t.stateId.substring(1).split(t.sd),t.obj.states[t.stateId]?t.state=t.obj.states[t.stateId]:(t.obj.states[t.stateId]={attachments:[]},t.state=t.obj.states[t.stateId],t.iterate(t.stateHandlers,t.callStateHandler)),t.detachAll(t.state.attachments),t.attachAll(t.state.attachments),t.vars.stateId=t.stateId,t.vars.state=t.state,t.trigger("change"),t.iterate(t.obj.breakpoints,function(e){t.obj.breakpoints[e].active?t.obj.breakpoints[e].wasActive||t.trigger("+"+e):t.obj.breakpoints[e].wasActive&&t.trigger("-"+e)})},generateStateConfig:function(e,n){var i={};return t.extend(i,e),t.iterate(t.breakpointIds,function(e){t.extend(i,n[t.breakpointIds[e]])}),i},getStateId:function(){var e="";return t.iterate(t.obj.breakpoints,function(n){var i=t.obj.breakpoints[n];i.matches()&&(e+=t.sd+i.id)}),e},poll:function(){var e="";e=t.getStateId(),""===e&&(e=t.sd),e!==t.stateId&&t.changeState(e)},_attach:null,attach:function(e){var n=t.obj.head,i=e.element;return i.parentNode&&i.parentNode.tagName?!1:(t._attach||(t._attach=n.firstChild),n.insertBefore(i,t._attach.nextSibling),e.permanent&&(t._attach=i),!0)},attachAll:function(e){var n=[];t.iterate(e,function(t){n[e[t].priority]||(n[e[t].priority]=[]),n[e[t].priority].push(e[t])}),n.reverse(),t.iterate(n,function(e){t.iterate(n[e],function(i){t.attach(n[e][i])})})},detach:function(t){var e=t.element;return t.permanent||!e.parentNode||e.parentNode&&!e.parentNode.tagName?!1:(e.parentNode.removeChild(e),!0)},detachAll:function(e){var n={};t.iterate(e,function(t){n[e[t].id]=!0}),t.iterate(t.obj.attachments,function(e){e in n||t.detach(t.obj.attachments[e])})},attachment:function(e){return e in t.obj.attachments?t.obj.attachments[e]:null},newAttachment:function(e,n,i,a){return t.obj.attachments[e]={id:e,element:n,priority:i,permanent:a}},init:function(){t.initMethods(),t.initVars(),t.initEvents(),t.obj.head=document.getElementsByTagName("head")[0],t.isInit=!0,t.trigger("init")},initEvents:function(){t.on("resize",function(){t.poll()}),t.on("orientationChange",function(){t.poll()}),t.DOMReady(function(){t.trigger("ready")}),window.onload&&t.on("load",window.onload),window.onload=function(){t.trigger("load")},window.onresize&&t.on("resize",window.onresize),window.onresize=function(){t.trigger("resize")},window.onorientationchange&&t.on("orientationChange",window.onorientationchange),window.onorientationchange=function(){t.trigger("orientationChange")}},initMethods:function(){document.addEventListener?!function(e,n){t.DOMReady=n()}("domready",function(){function t(t){for(r=1;t=n.shift();)t()}var e,n=[],i=document,a="DOMContentLoaded",r=/^loaded|^c/.test(i.readyState);return i.addEventListener(a,e=function(){i.removeEventListener(a,e),t()}),function(t){r?t():n.push(t)}}):!function(e,n){t.DOMReady=n()}("domready",function(t){function e(t){for(h=1;t=i.shift();)t()}var n,i=[],a=!1,r=document,o=r.documentElement,s=o.doScroll,c="DOMContentLoaded",d="addEventListener",u="onreadystatechange",l="readyState",f=s?/^loaded|^c/:/^loaded|c/,h=f.test(r[l]);return r[d]&&r[d](c,n=function(){r.removeEventListener(c,n,a),e()},a),s&&r.attachEvent(u,n=function(){/^c/.test(r[l])&&(r.detachEvent(u,n),e())}),t=s?function(e){self!=top?h?e():i.push(e):function(){try{o.doScroll("left")}catch(n){return setTimeout(function(){t(e)},50)}e()}()}:function(t){h?t():i.push(t)}}),Array.prototype.indexOf?t.indexOf=function(t,e){return t.indexOf(e)}:t.indexOf=function(t,e){if("string"==typeof t)return t.indexOf(e);var n,i,a=e?e:0;if(!this)throw new TypeError;if(i=this.length,0===i||a>=i)return-1;for(0>a&&(a=i-Math.abs(a)),n=a;i>n;n++)if(this[n]===t)return n;return-1},Array.isArray?t.isArray=function(t){return Array.isArray(t)}:t.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)},Object.keys?t.iterate=function(t,e){if(!t)return[];var n,i=Object.keys(t);for(n=0;i[n]&&e(i[n],t[i[n]])!==!1;n++);}:t.iterate=function(t,e){if(!t)return[];var n;for(n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&e(n,t[n])===!1)break},window.matchMedia?t.matchesMedia=function(t){return""==t?!0:window.matchMedia(t).matches}:window.styleMedia||window.media?t.matchesMedia=function(t){if(""==t)return!0;var e=window.styleMedia||window.media;return e.matchMedium(t||"all")}:window.getComputedStyle?t.matchesMedia=function(t){if(""==t)return!0;var e=document.createElement("style"),n=document.getElementsByTagName("script")[0],i=null;e.type="text/css",e.id="matchmediajs-test",n.parentNode.insertBefore(e,n),i="getComputedStyle"in window&&window.getComputedStyle(e,null)||e.currentStyle;var a="@media "+t+"{ #matchmediajs-test { width: 1px; } }";return e.styleSheet?e.styleSheet.cssText=a:e.textContent=a,"1px"===i.width}:t.matchesMedia=function(t){if(""==t)return!0;var e,n,i,a,r={"min-width":null,"max-width":null},o=!1;for(i=t.split(/\s+and\s+/),e=0;er["max-width"]||null!==r["min-height"]&&cr["max-height"]?!1:!0},navigator.userAgent.match(/MSIE ([0-9]+)/)&&RegExp.$1<9&&(t.newStyle=function(t){var e=document.createElement("span");return e.innerHTML=' ",e})},initVars:function(){var e,n,i,a=navigator.userAgent;e="other",n=0,i=[["firefox",/Firefox\/([0-9\.]+)/],["bb",/BlackBerry.+Version\/([0-9\.]+)/],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/],["opera",/OPR\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)/],["edge",/Edge\/([0-9\.]+)/],["safari",/Version\/([0-9\.]+).+Safari/],["chrome",/Chrome\/([0-9\.]+)/],["ie",/MSIE ([0-9]+)/],["ie",/Trident\/.+rv:([0-9]+)/]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(RegExp.$1),!1):void 0}),t.vars.browser=e,t.vars.browserVersion=n,e="other",n=0,i=[["ios",/([0-9_]+) like Mac OS X/,function(t){return t.replace("_",".").replace("_","")}],["ios",/CPU like Mac OS X/,function(t){return 0}],["wp",/Windows Phone ([0-9\.]+)/,null],["android",/Android ([0-9\.]+)/,null],["mac",/Macintosh.+Mac OS X ([0-9_]+)/,function(t){return t.replace("_",".").replace("_","")}],["windows",/Windows NT ([0-9\.]+)/,null],["bb",/BlackBerry.+Version\/([0-9\.]+)/,null],["bb",/BB[0-9]+.+Version\/([0-9\.]+)/,null]],t.iterate(i,function(t,i){return a.match(i[1])?(e=i[0],n=parseFloat(i[2]?i[2](RegExp.$1):RegExp.$1),!1):void 0}),t.vars.os=e,t.vars.osVersion=n,t.vars.IEVersion="ie"==t.vars.browser?t.vars.browserVersion:99,t.vars.touch="wp"==t.vars.os?navigator.msMaxTouchPoints>0:!!("ontouchstart"in window),t.vars.mobile="wp"==t.vars.os||"android"==t.vars.os||"ios"==t.vars.os||"bb"==t.vars.os}};return t.init(),t}();!function(t,e){"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?module.exports=e():t.skel=e()}(this,function(){return skel});
diff --git a/public/themes/massively/assets/js/util.js b/public/themes/massively/assets/js/util.js
new file mode 100644
index 0000000..bdb8e9f
--- /dev/null
+++ b/public/themes/massively/assets/js/util.js
@@ -0,0 +1,587 @@
+(function($) {
+
+ /**
+ * Generate an indented list of links from a nav. Meant for use with panel().
+ * @return {jQuery} jQuery object.
+ */
+ $.fn.navList = function() {
+
+ var $this = $(this);
+ $a = $this.find('a'),
+ b = [];
+
+ $a.each(function() {
+
+ var $this = $(this),
+ indent = Math.max(0, $this.parents('li').length - 1),
+ href = $this.attr('href'),
+ target = $this.attr('target');
+
+ b.push(
+ '' +
+ '' +
+ $this.text() +
+ ''
+ );
+
+ });
+
+ return b.join('');
+
+ };
+
+ /**
+ * Panel-ify an element.
+ * @param {object} userConfig User config.
+ * @return {jQuery} jQuery object.
+ */
+ $.fn.panel = function(userConfig) {
+
+ // No elements?
+ if (this.length == 0)
+ return $this;
+
+ // Multiple elements?
+ if (this.length > 1) {
+
+ for (var i=0; i < this.length; i++)
+ $(this[i]).panel(userConfig);
+
+ return $this;
+
+ }
+
+ // Vars.
+ var $this = $(this),
+ $body = $('body'),
+ $window = $(window),
+ id = $this.attr('id'),
+ config;
+
+ // Config.
+ config = $.extend({
+
+ // Delay.
+ delay: 0,
+
+ // Hide panel on link click.
+ hideOnClick: false,
+
+ // Hide panel on escape keypress.
+ hideOnEscape: false,
+
+ // Hide panel on swipe.
+ hideOnSwipe: false,
+
+ // Reset scroll position on hide.
+ resetScroll: false,
+
+ // Reset forms on hide.
+ resetForms: false,
+
+ // Side of viewport the panel will appear.
+ side: null,
+
+ // Target element for "class".
+ target: $this,
+
+ // Class to toggle.
+ visibleClass: 'visible'
+
+ }, userConfig);
+
+ // Expand "target" if it's not a jQuery object already.
+ if (typeof config.target != 'jQuery')
+ config.target = $(config.target);
+
+ // Panel.
+
+ // Methods.
+ $this._hide = function(event) {
+
+ // Already hidden? Bail.
+ if (!config.target.hasClass(config.visibleClass))
+ return;
+
+ // If an event was provided, cancel it.
+ if (event) {
+
+ event.preventDefault();
+ event.stopPropagation();
+
+ }
+
+ // Hide.
+ config.target.removeClass(config.visibleClass);
+
+ // Post-hide stuff.
+ window.setTimeout(function() {
+
+ // Reset scroll position.
+ if (config.resetScroll)
+ $this.scrollTop(0);
+
+ // Reset forms.
+ if (config.resetForms)
+ $this.find('form').each(function() {
+ this.reset();
+ });
+
+ }, config.delay);
+
+ };
+
+ // Vendor fixes.
+ $this
+ .css('-ms-overflow-style', '-ms-autohiding-scrollbar')
+ .css('-webkit-overflow-scrolling', 'touch');
+
+ // Hide on click.
+ if (config.hideOnClick) {
+
+ $this.find('a')
+ .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)');
+
+ $this
+ .on('click', 'a', function(event) {
+
+ var $a = $(this),
+ href = $a.attr('href'),
+ target = $a.attr('target');
+
+ if (!href || href == '#' || href == '' || href == '#' + id)
+ return;
+
+ // Cancel original event.
+ event.preventDefault();
+ event.stopPropagation();
+
+ // Hide panel.
+ $this._hide();
+
+ // Redirect to href.
+ window.setTimeout(function() {
+
+ if (target == '_blank')
+ window.open(href);
+ else
+ window.location.href = href;
+
+ }, config.delay + 10);
+
+ });
+
+ }
+
+ // Event: Touch stuff.
+ $this.on('touchstart', function(event) {
+
+ $this.touchPosX = event.originalEvent.touches[0].pageX;
+ $this.touchPosY = event.originalEvent.touches[0].pageY;
+
+ })
+
+ $this.on('touchmove', function(event) {
+
+ if ($this.touchPosX === null
+ || $this.touchPosY === null)
+ return;
+
+ var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX,
+ diffY = $this.touchPosY - event.originalEvent.touches[0].pageY,
+ th = $this.outerHeight(),
+ ts = ($this.get(0).scrollHeight - $this.scrollTop());
+
+ // Hide on swipe?
+ if (config.hideOnSwipe) {
+
+ var result = false,
+ boundary = 20,
+ delta = 50;
+
+ switch (config.side) {
+
+ case 'left':
+ result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta);
+ break;
+
+ case 'right':
+ result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta));
+ break;
+
+ case 'top':
+ result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta);
+ break;
+
+ case 'bottom':
+ result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta));
+ break;
+
+ default:
+ break;
+
+ }
+
+ if (result) {
+
+ $this.touchPosX = null;
+ $this.touchPosY = null;
+ $this._hide();
+
+ return false;
+
+ }
+
+ }
+
+ // Prevent vertical scrolling past the top or bottom.
+ if (($this.scrollTop() < 0 && diffY < 0)
+ || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) {
+
+ event.preventDefault();
+ event.stopPropagation();
+
+ }
+
+ });
+
+ // Event: Prevent certain events inside the panel from bubbling.
+ $this.on('click touchend touchstart touchmove', function(event) {
+ event.stopPropagation();
+ });
+
+ // Event: Hide panel if a child anchor tag pointing to its ID is clicked.
+ $this.on('click', 'a[href="#' + id + '"]', function(event) {
+
+ event.preventDefault();
+ event.stopPropagation();
+
+ config.target.removeClass(config.visibleClass);
+
+ });
+
+ // Body.
+
+ // Event: Hide panel on body click/tap.
+ $body.on('click touchend', function(event) {
+ $this._hide(event);
+ });
+
+ // Event: Toggle.
+ $body.on('click', 'a[href="#' + id + '"]', function(event) {
+
+ event.preventDefault();
+ event.stopPropagation();
+
+ config.target.toggleClass(config.visibleClass);
+
+ });
+
+ // Window.
+
+ // Event: Hide on ESC.
+ if (config.hideOnEscape)
+ $window.on('keydown', function(event) {
+
+ if (event.keyCode == 27)
+ $this._hide(event);
+
+ });
+
+ return $this;
+
+ };
+
+ /**
+ * Apply "placeholder" attribute polyfill to one or more forms.
+ * @return {jQuery} jQuery object.
+ */
+ $.fn.placeholder = function() {
+
+ // Browser natively supports placeholders? Bail.
+ if (typeof (document.createElement('input')).placeholder != 'undefined')
+ return $(this);
+
+ // No elements?
+ if (this.length == 0)
+ return $this;
+
+ // Multiple elements?
+ if (this.length > 1) {
+
+ for (var i=0; i < this.length; i++)
+ $(this[i]).placeholder();
+
+ return $this;
+
+ }
+
+ // Vars.
+ var $this = $(this);
+
+ // Text, TextArea.
+ $this.find('input[type=text],textarea')
+ .each(function() {
+
+ var i = $(this);
+
+ if (i.val() == ''
+ || i.val() == i.attr('placeholder'))
+ i
+ .addClass('polyfill-placeholder')
+ .val(i.attr('placeholder'));
+
+ })
+ .on('blur', function() {
+
+ var i = $(this);
+
+ if (i.attr('name').match(/-polyfill-field$/))
+ return;
+
+ if (i.val() == '')
+ i
+ .addClass('polyfill-placeholder')
+ .val(i.attr('placeholder'));
+
+ })
+ .on('focus', function() {
+
+ var i = $(this);
+
+ if (i.attr('name').match(/-polyfill-field$/))
+ return;
+
+ if (i.val() == i.attr('placeholder'))
+ i
+ .removeClass('polyfill-placeholder')
+ .val('');
+
+ });
+
+ // Password.
+ $this.find('input[type=password]')
+ .each(function() {
+
+ var i = $(this);
+ var x = $(
+ $('
')
+ .append(i.clone())
+ .remove()
+ .html()
+ .replace(/type="password"/i, 'type="text"')
+ .replace(/type=password/i, 'type=text')
+ );
+
+ if (i.attr('id') != '')
+ x.attr('id', i.attr('id') + '-polyfill-field');
+
+ if (i.attr('name') != '')
+ x.attr('name', i.attr('name') + '-polyfill-field');
+
+ x.addClass('polyfill-placeholder')
+ .val(x.attr('placeholder')).insertAfter(i);
+
+ if (i.val() == '')
+ i.hide();
+ else
+ x.hide();
+
+ i
+ .on('blur', function(event) {
+
+ event.preventDefault();
+
+ var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]');
+
+ if (i.val() == '') {
+
+ i.hide();
+ x.show();
+
+ }
+
+ });
+
+ x
+ .on('focus', function(event) {
+
+ event.preventDefault();
+
+ var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']');
+
+ x.hide();
+
+ i
+ .show()
+ .focus();
+
+ })
+ .on('keypress', function(event) {
+
+ event.preventDefault();
+ x.val('');
+
+ });
+
+ });
+
+ // Events.
+ $this
+ .on('submit', function() {
+
+ $this.find('input[type=text],input[type=password],textarea')
+ .each(function(event) {
+
+ var i = $(this);
+
+ if (i.attr('name').match(/-polyfill-field$/))
+ i.attr('name', '');
+
+ if (i.val() == i.attr('placeholder')) {
+
+ i.removeClass('polyfill-placeholder');
+ i.val('');
+
+ }
+
+ });
+
+ })
+ .on('reset', function(event) {
+
+ event.preventDefault();
+
+ $this.find('select')
+ .val($('option:first').val());
+
+ $this.find('input,textarea')
+ .each(function() {
+
+ var i = $(this),
+ x;
+
+ i.removeClass('polyfill-placeholder');
+
+ switch (this.type) {
+
+ case 'submit':
+ case 'reset':
+ break;
+
+ case 'password':
+ i.val(i.attr('defaultValue'));
+
+ x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]');
+
+ if (i.val() == '') {
+ i.hide();
+ x.show();
+ }
+ else {
+ i.show();
+ x.hide();
+ }
+
+ break;
+
+ case 'checkbox':
+ case 'radio':
+ i.attr('checked', i.attr('defaultValue'));
+ break;
+
+ case 'text':
+ case 'textarea':
+ i.val(i.attr('defaultValue'));
+
+ if (i.val() == '') {
+ i.addClass('polyfill-placeholder');
+ i.val(i.attr('placeholder'));
+ }
+
+ break;
+
+ default:
+ i.val(i.attr('defaultValue'));
+ break;
+
+ }
+ });
+
+ });
+
+ return $this;
+
+ };
+
+ /**
+ * Moves elements to/from the first positions of their respective parents.
+ * @param {jQuery} $elements Elements (or selector) to move.
+ * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations.
+ */
+ $.prioritize = function($elements, condition) {
+
+ var key = '__prioritize';
+
+ // Expand $elements if it's not already a jQuery object.
+ if (typeof $elements != 'jQuery')
+ $elements = $($elements);
+
+ // Step through elements.
+ $elements.each(function() {
+
+ var $e = $(this), $p,
+ $parent = $e.parent();
+
+ // No parent? Bail.
+ if ($parent.length == 0)
+ return;
+
+ // Not moved? Move it.
+ if (!$e.data(key)) {
+
+ // Condition is false? Bail.
+ if (!condition)
+ return;
+
+ // Get placeholder (which will serve as our point of reference for when this element needs to move back).
+ $p = $e.prev();
+
+ // Couldn't find anything? Means this element's already at the top, so bail.
+ if ($p.length == 0)
+ return;
+
+ // Move element to top of parent.
+ $e.prependTo($parent);
+
+ // Mark element as moved.
+ $e.data(key, $p);
+
+ }
+
+ // Moved already?
+ else {
+
+ // Condition is true? Bail.
+ if (condition)
+ return;
+
+ $p = $e.data(key);
+
+ // Move element back to its original location (using our placeholder).
+ $e.insertAfter($p);
+
+ // Unmark element as moved.
+ $e.removeData(key);
+
+ }
+
+ });
+
+ };
+
+})(jQuery);
\ No newline at end of file
diff --git a/public/themes/massively/contact.php b/public/themes/massively/contact.php
new file mode 100644
index 0000000..6d214d5
--- /dev/null
+++ b/public/themes/massively/contact.php
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/themes/massively/default.php b/public/themes/massively/default.php
new file mode 100644
index 0000000..2051831
--- /dev/null
+++ b/public/themes/massively/default.php
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/themes/massively/elements.html b/public/themes/massively/elements.html
new file mode 100644
index 0000000..56b7abf
--- /dev/null
+++ b/public/themes/massively/elements.html
@@ -0,0 +1,497 @@
+
+
+
+
+ Elements Reference - Massively by HTML5 UP
+
+
+
+
+
+
+
+
+
This is bold and this is strong. This is italic and this is emphasized.
+ This is superscript text and this is subscript text.
+ This is underlined and this is code: for (;;) { ... }.
+ Finally, this is a link.
+
+
Heading Level 2
+
Heading Level 3
+
Heading Level 4
+
Heading Level 5
+
Heading Level 6
+
+
+
Heading with a Subtitle
+
Lorem ipsum dolor sit amet nullam id egestas urna aliquam
+
+
Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.
+
+
Heading with a Subtitle
+
Lorem ipsum dolor sit amet nullam id egestas urna aliquam
+
+
Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.
+
+
Heading with a Subtitle
+
Lorem ipsum dolor sit amet nullam id egestas urna aliquam
+
+
Nunc lacinia ante nunc ac lobortis. Interdum adipiscing gravida odio porttitor sem non mi integer non faucibus ornare mi ut ante amet placerat aliquet. Volutpat eu sed ante lacinia sapien lorem accumsan varius montes viverra nibh in adipiscing blandit tempus accumsan.
Lorem ipsum dolor vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.
+
+
Item 2
+
+
Lorem ipsum dolor vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.
+
+
Item 3
+
+
Lorem ipsum dolor vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent.
Fringilla nisl. Donec accumsan interdum nisi, quis tincidunt felis sagittis eget tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan faucibus. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis.
Lorem ipsum dolor sit accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Vestibulum ante ipsum primis in faucibus magna blandit adipiscing eu felis iaculis.
+
Lorem ipsum dolor sit accumsan interdum nisi, quis tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Vestibulum ante ipsum primis in faucibus magna blandit adipiscing eu felis iaculis.
+
+
+
+
+
Box
+
+
Felis sagittis eget tempus primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Magna sed etiam ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus lorem ipsum dolor sit amet nullam. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent tincidunt felis sagittis eget. tempus euismod. Vestibulum ante ipsum primis in faucibus vestibulum. Blandit adipiscing eu felis iaculis volutpat ac adipiscing accumsan eu faucibus. Integer ac pellentesque praesent. Vestibulum ante ipsum primis in faucibus magna blandit adipiscing eu felis iaculis volutpat lorem ipsum dolor.
+
+
+
+
+
+
Preformatted
+
i = 0;
+
+while (!deck.isInOrder()) {
+ print 'Iteration ' + i;
+ deck.shuffle();
+ i++;
+}
+
+print 'It took ' + i + ' iterations to sort the deck.';
+