Initial commit
This commit is contained in:
8
.htacess
Normal file
8
.htacess
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
AddType text/cache-manifest .manifest
|
||||||
|
|
||||||
|
AddType audio/mpeg mp3
|
||||||
|
AddType audio/mp4 m4a
|
||||||
|
AddType audio/ogg ogg
|
||||||
|
AddType audio/ogg oga
|
||||||
|
AddType audio/webm webma
|
||||||
|
AddType audio/wav wav
|
||||||
8
LICENSE
Normal file
8
LICENSE
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
Copyright (c) 2013 Russell Beattie
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
16
README.md
Normal file
16
README.md
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# [Flip.io Puzzle](http://flip.io)
|
||||||
|
|
||||||
|
An HTML5 puzzle app, and puzzle file generator. MIT licensed. Code is running at http://flip.io
|
||||||
|
|
||||||
|
Here's a quick rundown of the files:
|
||||||
|
|
||||||
|
* app.js - Main logic for the HTML5 GUI
|
||||||
|
* batch.js - Node.js batch program which generates a new puzzle.js file containing 1000 puzzles.
|
||||||
|
* flip.manifest_ - unused, but ready to be used for offline Web App
|
||||||
|
* index.html - HTML5 page with templates using Underscore templating (ejs).
|
||||||
|
* main.css - style for GUI
|
||||||
|
* LICENSE - MIT license for project
|
||||||
|
* puzzles.js - generated JSON list of puzzles using batch
|
||||||
|
* fonts/ - offline cache of web fonts used in various formats (included for convenience)
|
||||||
|
* lib/ - directory containing third party libraries (included for convenience): backbone, lodash, jquery, normalize.css
|
||||||
|
* media/ - folder for sound files and images
|
||||||
566
app.js
Normal file
566
app.js
Normal file
@@ -0,0 +1,566 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
var App = {};
|
||||||
|
|
||||||
|
App.init = function(){
|
||||||
|
|
||||||
|
App.name = 'Flip.io';
|
||||||
|
$('.title').text(App.name);
|
||||||
|
|
||||||
|
App.touch = ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
|
||||||
|
|
||||||
|
if(window['Audio']){
|
||||||
|
var audio = new Audio();
|
||||||
|
var ext = '.wav';
|
||||||
|
if(audio.canPlayType('audio/mp3')){
|
||||||
|
ext = '.mp3';
|
||||||
|
}
|
||||||
|
App.sounds = {};
|
||||||
|
|
||||||
|
var ding = new Audio();
|
||||||
|
ding.src = './media/ding' + ext;
|
||||||
|
ding.volume = 0.5;
|
||||||
|
|
||||||
|
var sweep = new Audio();
|
||||||
|
sweep.src = './media/sweep' + ext;
|
||||||
|
sweep.volume = 0.3;
|
||||||
|
|
||||||
|
App.sounds['sweep'] = sweep;
|
||||||
|
App.sounds['ding'] = ding;
|
||||||
|
}
|
||||||
|
|
||||||
|
$('body').on('touchmove', function(e){
|
||||||
|
|
||||||
|
if(e.target.style = 'clues'){
|
||||||
|
|
||||||
|
} else {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.homeView = new App.HomeView();
|
||||||
|
this.puzzleView = new App.PuzzleView();
|
||||||
|
this.router = new App.Router();
|
||||||
|
|
||||||
|
Backbone.history.start();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
App.play = function(sound){
|
||||||
|
if(App.sounds){
|
||||||
|
var snd = App.sounds[sound];
|
||||||
|
try{
|
||||||
|
snd.pause();
|
||||||
|
snd.currentTime = 0;
|
||||||
|
} catch (err){}
|
||||||
|
snd.play();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
App.addWin = function(puzNum){
|
||||||
|
if(window['localStorage']){
|
||||||
|
var wins = localStorage.setItem['wins'];
|
||||||
|
if(!wins){
|
||||||
|
wins = [];
|
||||||
|
}
|
||||||
|
wins.push(puzNum);
|
||||||
|
localStorage.setItem['wins'] = wins;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
App.getWins = function(){
|
||||||
|
if(window['localStorage']){
|
||||||
|
var wins = localStorage.setItem['wins'];
|
||||||
|
if(!wins){
|
||||||
|
wins = [];
|
||||||
|
}
|
||||||
|
return wins;
|
||||||
|
} else {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
App.Router = Backbone.Router.extend({
|
||||||
|
|
||||||
|
currentView: null,
|
||||||
|
|
||||||
|
routes: {
|
||||||
|
'': 'showHome',
|
||||||
|
':number': 'showPuzzle',
|
||||||
|
},
|
||||||
|
|
||||||
|
clearCurrent: function(){
|
||||||
|
if(this.currentView){
|
||||||
|
this.currentView.$el.html('');
|
||||||
|
this.currentView.remove();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
showHome: function() {
|
||||||
|
|
||||||
|
$('.content').fadeOut(function(){
|
||||||
|
|
||||||
|
App.router.clearCurrent();
|
||||||
|
|
||||||
|
document.title = App.name;
|
||||||
|
$('.titlenum').text('');
|
||||||
|
|
||||||
|
App.homeView.render();
|
||||||
|
|
||||||
|
$('.content').html(App.homeView.$el);
|
||||||
|
|
||||||
|
App.router.currentView = App.homeView;
|
||||||
|
|
||||||
|
$('.puznum').focus();
|
||||||
|
|
||||||
|
$('.content').fadeIn();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
showPuzzle: function(puzNum) {
|
||||||
|
|
||||||
|
$('.content').fadeOut(function(){
|
||||||
|
|
||||||
|
App.router.clearCurrent();
|
||||||
|
|
||||||
|
document.title = App.name + ' / Puzzle ' + puzNum;
|
||||||
|
$('.titlenum').text('#' + puzNum);
|
||||||
|
|
||||||
|
App.puzzleView.render(puzNum);
|
||||||
|
|
||||||
|
$('.content').html(App.puzzleView.$el);
|
||||||
|
|
||||||
|
App.router.currentView = App.puzzleView;
|
||||||
|
|
||||||
|
$('.content').fadeIn();
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
App.HomeView = Backbone.View.extend({
|
||||||
|
|
||||||
|
tagName: 'div',
|
||||||
|
className: 'home',
|
||||||
|
|
||||||
|
events: function() {
|
||||||
|
|
||||||
|
var events;
|
||||||
|
|
||||||
|
if(App.touch){
|
||||||
|
events = {
|
||||||
|
'keypress .puznum': 'checkField',
|
||||||
|
'update .puznum': 'checkField',
|
||||||
|
'submit .puz-form': 'loadPuzzle',
|
||||||
|
'touchend .go-btn': 'loadPuzzle',
|
||||||
|
'touchend .random-btn': 'randomPuzzle'
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
events = {
|
||||||
|
'keypress .puznum': 'checkField',
|
||||||
|
'submit .puz-form': 'loadPuzzle',
|
||||||
|
'click .go-btn': 'loadPuzzle',
|
||||||
|
'click .random-btn': 'randomPuzzle'
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return events;
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function() {
|
||||||
|
|
||||||
|
this.delegateEvents();
|
||||||
|
|
||||||
|
var tpl = $('.homeTemplate').text();
|
||||||
|
var html = _.template(tpl, {});
|
||||||
|
|
||||||
|
this.$el.html(html);
|
||||||
|
|
||||||
|
$('.puznum').focus();
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
checkField: function(e){
|
||||||
|
|
||||||
|
var keyCode = e.keyCode || e.charCode;
|
||||||
|
|
||||||
|
//console.log(keyCode);
|
||||||
|
|
||||||
|
if(keyCode == 13 || keyCode == 8 || keyCode == 46 || keyCode == 92 || keyCode == 39 || keyCode == 37){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(keyCode < 48 || keyCode > 57){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var val = $('.puznum').val();
|
||||||
|
|
||||||
|
if(val.length >= 3){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
loadPuzzle: function(e){
|
||||||
|
if(e){
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
var puzNum = parseInt($('.puznum').val());
|
||||||
|
|
||||||
|
if(isNaN(puzNum) || puzNum < 1 || puzNum > 1000){
|
||||||
|
|
||||||
|
$('.puznum').val('');
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
App.router.navigate(puzNum+'', {trigger: true});
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
randomPuzzle: function(){
|
||||||
|
|
||||||
|
var puzNum = Math.floor( Math.random() * ( 1001) );
|
||||||
|
|
||||||
|
$('.puznum').val(puzNum);
|
||||||
|
|
||||||
|
// App.router.navigate(puzNum + "", {trigger: true});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
App.PuzzleView = Backbone.View.extend({
|
||||||
|
|
||||||
|
tagName: 'div',
|
||||||
|
className: 'puzzle',
|
||||||
|
|
||||||
|
secs: 0,
|
||||||
|
stop: false,
|
||||||
|
intervalID: null,
|
||||||
|
guessing: false,
|
||||||
|
count: 0,
|
||||||
|
total: 7,
|
||||||
|
puzNum: 0,
|
||||||
|
data: null,
|
||||||
|
|
||||||
|
events: function(){
|
||||||
|
|
||||||
|
var events;
|
||||||
|
|
||||||
|
if(App.touch){
|
||||||
|
events = {
|
||||||
|
'touchend .shuffle' : 'doShuffle',
|
||||||
|
'touchend .hint' : 'doHint',
|
||||||
|
'touchend .square' : 'doSquare',
|
||||||
|
'touchend .reset': 'doReset',
|
||||||
|
'touchend .restart': 'doRestart',
|
||||||
|
'touchend .gohome': 'doHome',
|
||||||
|
'touchend .next': 'doNext'
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
events = {
|
||||||
|
'click .shuffle' : 'doShuffle',
|
||||||
|
'click .hint' : 'doHint',
|
||||||
|
'click .square' : 'doSquare',
|
||||||
|
'click .reset': 'doReset',
|
||||||
|
'click .restart': 'doRestart',
|
||||||
|
'click .gohome': 'doHome',
|
||||||
|
'click .next': 'doNext'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return events;
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
render: function(puzNum) {
|
||||||
|
|
||||||
|
this.delegateEvents();
|
||||||
|
|
||||||
|
this.guessing = false;
|
||||||
|
this.count = 0;
|
||||||
|
|
||||||
|
this.puzNum = parseInt(puzNum);
|
||||||
|
|
||||||
|
if(isNaN(puzNum) || puzNum < 1 || puzNum > 1000){
|
||||||
|
App.router.navigate('', {trigger: true});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.start = new Date();
|
||||||
|
this.secs = 0;
|
||||||
|
|
||||||
|
this.data = puzzles[puzNum];
|
||||||
|
|
||||||
|
var tpl = $('.puzzleTemplate').text();
|
||||||
|
var html = _.template(tpl, this.data);
|
||||||
|
|
||||||
|
this.$el.html(html);
|
||||||
|
|
||||||
|
this.startTimer();
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
doHome: function(e){
|
||||||
|
|
||||||
|
this.stopTimer();
|
||||||
|
|
||||||
|
App.router.navigate('', {trigger: true});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
doNext: function(e){
|
||||||
|
App.router.navigate((App.puzzleView.puzNum +1)+'', {trigger: true});
|
||||||
|
},
|
||||||
|
|
||||||
|
doShuffle: function(e){
|
||||||
|
shuffleItems('tr');
|
||||||
|
shuffleItems('tbody');
|
||||||
|
},
|
||||||
|
|
||||||
|
doHint: function(e){
|
||||||
|
|
||||||
|
var active = [];
|
||||||
|
|
||||||
|
$('.clues li').each(function(index){
|
||||||
|
|
||||||
|
if($(this).data('answer') !== ''){
|
||||||
|
active.push($(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
var rand = Math.floor(Math.random() * active.length);
|
||||||
|
var $clue = active[rand];
|
||||||
|
|
||||||
|
var b = rot13($clue.data('answer'));
|
||||||
|
|
||||||
|
b = b.substr(0,3);
|
||||||
|
|
||||||
|
$('.square').each(function(index){
|
||||||
|
|
||||||
|
if($(this).data('guessed') !== 'true'){
|
||||||
|
|
||||||
|
var s = $(this).text();
|
||||||
|
|
||||||
|
if(b.indexOf(s) == 0){
|
||||||
|
$clue.fadeOut('slow', function(){
|
||||||
|
$clue.fadeIn();
|
||||||
|
});
|
||||||
|
$(this).fadeOut('slow', function(){
|
||||||
|
$(this).fadeIn();
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
doSquare: function(e){
|
||||||
|
|
||||||
|
if(App.puzzleView.guessing == false){
|
||||||
|
var sq = e.target;
|
||||||
|
|
||||||
|
$(sq).data('guessed','true');
|
||||||
|
|
||||||
|
$(sq).hide();
|
||||||
|
|
||||||
|
var a = $('.answertext').text();
|
||||||
|
|
||||||
|
a = a + $(sq).text();
|
||||||
|
|
||||||
|
$('.answertext').html(a);
|
||||||
|
|
||||||
|
if(a.length > 9){
|
||||||
|
App.puzzleView.doReset(e);
|
||||||
|
} else {
|
||||||
|
App.puzzleView.doGuess(a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
doGuess: function(a){
|
||||||
|
|
||||||
|
if(a == ''){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var $clues = $('.clues li');
|
||||||
|
|
||||||
|
App.puzzleView.guessing = true;
|
||||||
|
|
||||||
|
for(var i = 0; i < $clues.length; i++){
|
||||||
|
|
||||||
|
var $clue = $clues.eq(i);
|
||||||
|
|
||||||
|
var b = rot13($clue.data('answer'));
|
||||||
|
|
||||||
|
if( a.toLowerCase() == b.toLowerCase()){
|
||||||
|
|
||||||
|
App.play('ding');
|
||||||
|
|
||||||
|
$clue.data('answer','');
|
||||||
|
|
||||||
|
$('.answertext').fadeOut('fast',function(){
|
||||||
|
$('.answertext').html('');
|
||||||
|
$('.answertext').show();
|
||||||
|
});
|
||||||
|
|
||||||
|
$clue.find('.word').fadeOut(function(){
|
||||||
|
$(this).html(b).addClass('correct');
|
||||||
|
$(this).fadeIn();
|
||||||
|
});
|
||||||
|
|
||||||
|
$clue.find('.def').fadeOut(function(){
|
||||||
|
$(this).css({'text-decoration':'line-through','font-style':'italic'});
|
||||||
|
$(this).fadeIn();
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.square').each(function(index){
|
||||||
|
$(this).data('guessed','');
|
||||||
|
});
|
||||||
|
|
||||||
|
App.puzzleView.count++;
|
||||||
|
|
||||||
|
if(App.puzzleView.count == App.puzzleView.total){
|
||||||
|
App.puzzleView.doWin();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
App.puzzleView.guessing = false;
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
doWin: function(){
|
||||||
|
|
||||||
|
App.puzzleView.stopTimer();
|
||||||
|
|
||||||
|
App.addWin(App.puzzleView.puzNum);
|
||||||
|
|
||||||
|
App.play('sweep');
|
||||||
|
|
||||||
|
setTimeout(function() {
|
||||||
|
|
||||||
|
$('.squares table').fadeOut();
|
||||||
|
$('.hint').hide();
|
||||||
|
$('.shuffle').hide();
|
||||||
|
|
||||||
|
var tpl = $('.winTemplate').text();
|
||||||
|
var html = _.template(tpl, {});
|
||||||
|
|
||||||
|
$('.squares').html(html);
|
||||||
|
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
doRestart: function(e){
|
||||||
|
|
||||||
|
App.puzzleView.secs = 0;
|
||||||
|
|
||||||
|
App.puzzleView.render(App.puzzleView.puzNum);
|
||||||
|
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
doReset: function(e){
|
||||||
|
|
||||||
|
$('.answertext').html('');
|
||||||
|
//$('.answertext').css('color','');
|
||||||
|
|
||||||
|
$('.square').each(function(index){
|
||||||
|
|
||||||
|
if($(this).data('guessed') == 'true'){
|
||||||
|
$(this).data('guessed','');
|
||||||
|
$(this).fadeIn();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
stopTimer: function(){
|
||||||
|
clearInterval(App.puzzleView.intervalID);
|
||||||
|
App.puzzleView.intervalID = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
startTimer: function(){
|
||||||
|
if(App.puzzleView.intervalID == null){
|
||||||
|
App.puzzleView.intervalID = setInterval('App.puzzleView.timer()', 1000);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
timer: function(){
|
||||||
|
App.puzzleView.secs = Math.floor(((new Date()) - App.puzzleView.start)/1000) ;
|
||||||
|
|
||||||
|
$('.timer').text(formatTime(App.puzzleView.secs));
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ----- misc functions
|
||||||
|
|
||||||
|
function formatTime(sec){
|
||||||
|
|
||||||
|
var hr = Math.floor(sec / 3600);
|
||||||
|
var min = Math.floor((sec - (hr * 3600))/60);
|
||||||
|
sec -= ((hr * 3600) + (min * 60));
|
||||||
|
sec += ''; min += '';
|
||||||
|
while (min.length < 2) {min = '0' + min;}
|
||||||
|
while (sec.length < 2) {sec = '0' + sec;}
|
||||||
|
hr = (hr)?':'+hr:'';
|
||||||
|
|
||||||
|
return hr + min + ':' + sec;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function rot13(str) {
|
||||||
|
return str.replace(/[a-zA-Z]/g, function(c) {
|
||||||
|
return String.fromCharCode((c <= 'Z' ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function shuffleItems(sel) {
|
||||||
|
var $el = $(sel);
|
||||||
|
$el.each(function(){
|
||||||
|
var items = $(this).children().clone(true);
|
||||||
|
var ret = (items.length) ? $(this).html(shuffle(items)) : this;
|
||||||
|
$el.replaceWith(ret);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function shuffle(arr) {
|
||||||
|
for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
apple-touch-icon.png
Normal file
BIN
apple-touch-icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.6 KiB |
126
batch.js
Normal file
126
batch.js
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
'use strict';
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
// List out the possible ways to divide a word into squares with 2 or 3 letters.
|
||||||
|
var squaresList = {};
|
||||||
|
squaresList[2] = [
|
||||||
|
{wordlen: 4, squares: [2,2] },
|
||||||
|
{wordlen: 5, squares: [2,3] },
|
||||||
|
{wordlen: 5, squares: [3,2] },
|
||||||
|
{wordlen: 6, squares: [3,3] }
|
||||||
|
];
|
||||||
|
squaresList[3] = [
|
||||||
|
{wordlen: 6, squares: [2,2,2] },
|
||||||
|
{wordlen: 7, squares: [2,2,3] },
|
||||||
|
{wordlen: 7, squares: [2,3,2] },
|
||||||
|
{wordlen: 7, squares: [3,2,2] },
|
||||||
|
{wordlen: 8, squares: [3,3,2] },
|
||||||
|
{wordlen: 8, squares: [3,2,3] },
|
||||||
|
{wordlen: 8, squares: [2,3,3] },
|
||||||
|
{wordlen: 9, squares: [3,3,3] },
|
||||||
|
];
|
||||||
|
squaresList[4] = [
|
||||||
|
{wordlen: 8, squares: [2,2,2,2] },
|
||||||
|
{wordlen: 9, squares: [2,2,2,3] },
|
||||||
|
{wordlen: 9, squares: [2,2,3,2] },
|
||||||
|
{wordlen: 9, squares: [2,3,2,2] },
|
||||||
|
{wordlen: 9, squares: [3,2,2,2] }
|
||||||
|
];
|
||||||
|
|
||||||
|
// To fill 20 squares with letters 7 words
|
||||||
|
var squaresNeeded = [4, 3, 3, 3, 3, 2, 2];
|
||||||
|
|
||||||
|
|
||||||
|
// pull in the word list, divide into lists by word length
|
||||||
|
var lines = fs.readFileSync('./words.txt').toString().split('\n');
|
||||||
|
|
||||||
|
var words = {};
|
||||||
|
|
||||||
|
for (var i = 0; i < lines.length; i++) {
|
||||||
|
var line = lines[i].trim();
|
||||||
|
if(line !== ''){
|
||||||
|
var ln = line.split(' - ');
|
||||||
|
var s = ln[0].length;
|
||||||
|
if(!words[s]){
|
||||||
|
words[s] = [];
|
||||||
|
}
|
||||||
|
words[s].push({
|
||||||
|
word: ln[0],
|
||||||
|
def : ln[1].charAt(0).toUpperCase() + ln[1].substr(1) + '.'
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// generate puzzles
|
||||||
|
var puzzles = [];
|
||||||
|
|
||||||
|
for(var p = 1; p <= 1000; p++){
|
||||||
|
|
||||||
|
|
||||||
|
var puzzle = {};
|
||||||
|
var cwords = [];
|
||||||
|
var csquares = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < squaresNeeded.length; i++) {
|
||||||
|
|
||||||
|
var squareTypes = squaresList[squaresNeeded[i]];
|
||||||
|
|
||||||
|
var squareType = squareTypes[Math.floor((Math.random() * squareTypes.length))];
|
||||||
|
|
||||||
|
var wordlist = words[squareType.wordlen];
|
||||||
|
|
||||||
|
var entry = wordlist[Math.floor((Math.random() * wordlist.length))];
|
||||||
|
|
||||||
|
cwords.push({
|
||||||
|
word: rot13(entry.word),
|
||||||
|
def: entry.def
|
||||||
|
});
|
||||||
|
|
||||||
|
var start = 0;
|
||||||
|
|
||||||
|
var squares = squareType.squares;
|
||||||
|
|
||||||
|
for (var x = 0; x < squares.length; x++) {
|
||||||
|
var letnum = squares[x];
|
||||||
|
|
||||||
|
csquares.push(entry.word.substr(start, letnum));
|
||||||
|
|
||||||
|
start += letnum;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
cwords = shuffle(cwords);
|
||||||
|
csquares = shuffle(csquares);
|
||||||
|
|
||||||
|
puzzle['clues'] = cwords;
|
||||||
|
puzzle['squares'] = csquares;
|
||||||
|
|
||||||
|
puzzles.push(puzzle);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
var json = JSON.stringify(puzzles);
|
||||||
|
|
||||||
|
var js = 'var puzzles = ' + json;
|
||||||
|
|
||||||
|
fs.writeFileSync('./puzzles_test.js', js);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function rot13(str) {
|
||||||
|
return str.replace(/[a-zA-Z]/g, function(c) {
|
||||||
|
return String.fromCharCode((c <= 'Z' ? 90 : 122) >= (c = c.charCodeAt(0) + 13) ? c : c - 26);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function shuffle(arr) {
|
||||||
|
for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
BIN
favicon.ico
Normal file
BIN
favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
18
flip.manifest_
Normal file
18
flip.manifest_
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
CACHE MANIFEST
|
||||||
|
app.js
|
||||||
|
apple-touch-icon.png
|
||||||
|
favicon.ico
|
||||||
|
lib/backbone.min.js
|
||||||
|
lib/jquery.min.js
|
||||||
|
lib/lodash.min.js
|
||||||
|
lib/normalize.css
|
||||||
|
main.css
|
||||||
|
media/ding.mp3
|
||||||
|
media/ding.wav
|
||||||
|
media/flipscreenshot.png
|
||||||
|
media/flipscreenshot_sm.png
|
||||||
|
media/star.mp3
|
||||||
|
media/star.wav
|
||||||
|
media/sweep.mp3
|
||||||
|
media/sweep.wav
|
||||||
|
puzzles.js
|
||||||
BIN
fonts/oxygen400.eot
Normal file
BIN
fonts/oxygen400.eot
Normal file
Binary file not shown.
BIN
fonts/oxygen400.ttf
Normal file
BIN
fonts/oxygen400.ttf
Normal file
Binary file not shown.
BIN
fonts/oxygen400.woff
Normal file
BIN
fonts/oxygen400.woff
Normal file
Binary file not shown.
BIN
fonts/oxygen700.eot
Normal file
BIN
fonts/oxygen700.eot
Normal file
Binary file not shown.
BIN
fonts/oxygen700.ttf
Normal file
BIN
fonts/oxygen700.ttf
Normal file
Binary file not shown.
BIN
fonts/oxygen700.woff
Normal file
BIN
fonts/oxygen700.woff
Normal file
Binary file not shown.
169
index.html
Normal file
169
index.html
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" itemscope itemtype="http://schema.org/Organization">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<title>Flip.io</title>
|
||||||
|
<meta name="description" content="Flip.io - 999 word puzzles">
|
||||||
|
<meta name="author" content="Russell Beattie">
|
||||||
|
<meta property="og:type" content="website" />
|
||||||
|
<meta property="og:title" content="Flip.io" />
|
||||||
|
<meta property="og:description" content="999 word puzzles"/>
|
||||||
|
<meta property="og:url" content="http://flip.io" />
|
||||||
|
<meta property="og:image" content="http://flip.io/media/flipscreenshot.png" />
|
||||||
|
<meta itemprop="name" content="Flip.io">
|
||||||
|
<meta itemprop="description" content="999 word puzzles">
|
||||||
|
<meta itemprop="image" content="http://flip.io/media/flipscreenshot.png">
|
||||||
|
<meta name="viewport" content="width=device-width, maximum-scale=1.0">
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
|
<link rel="apple-touch-icon" href="./apple-touch-icon.png">
|
||||||
|
<link rel="stylesheet" href="./lib/normalize.css">
|
||||||
|
<link rel="stylesheet" href="./main.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="main">
|
||||||
|
<div class="topnav">
|
||||||
|
<h1 class="title"></h1>
|
||||||
|
<h1 class="titlenum"></h1>
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
Developed by <a href="http://www.russellbeattie.com">Russell Beattie</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/template" class="homeTemplate">
|
||||||
|
|
||||||
|
<h3>
|
||||||
|
999 word puzzles.
|
||||||
|
</h3>
|
||||||
|
<div class="puzhome">
|
||||||
|
<form class="puz-form">
|
||||||
|
Enter a Number: <br>
|
||||||
|
<input pattern="[0-9]*" name="puznum" class="puznum" value="<%=App.puzzleView.puzNum ? App.puzzleView.puzNum : ''%>">
|
||||||
|
<button class="go-btn btn">Go</button> <button class="random-btn btn">Random</button>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<%
|
||||||
|
var wins = App.getWins();
|
||||||
|
|
||||||
|
if(wins.length > 0){
|
||||||
|
%>
|
||||||
|
<div class="wins">
|
||||||
|
Wins:
|
||||||
|
<%
|
||||||
|
for(var i = 0; i < wins.length; i++){
|
||||||
|
var win = wins[i];
|
||||||
|
%>
|
||||||
|
<a href="#<%=win%>">#<%=win%></a>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
</div>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/template" class="puzzleTemplate">
|
||||||
|
<%
|
||||||
|
var puzzle = obj;
|
||||||
|
%>
|
||||||
|
|
||||||
|
<div class="answer">
|
||||||
|
<span class="answertext"></span>
|
||||||
|
<span class="reset">X</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="clues">
|
||||||
|
<ul>
|
||||||
|
<%
|
||||||
|
var clues = puzzle['clues'];
|
||||||
|
|
||||||
|
for(var i = 0; i < clues.length; i++){
|
||||||
|
var clue = clues[i]
|
||||||
|
%>
|
||||||
|
<li data-answer="<%=clue['word']%>">
|
||||||
|
<span class="word"><%=clue['word'].length%> letters</span>:
|
||||||
|
<span class="def"><%=clue['def']%></span>
|
||||||
|
</li>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="nav">
|
||||||
|
<span class="gohome">Home</span>
|
||||||
|
<span class="restart">Restart</span>
|
||||||
|
<span class="hint">Hint</span>
|
||||||
|
<span class="shuffle">Shuffle</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="squares">
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<%
|
||||||
|
var squares = puzzle['squares'];
|
||||||
|
|
||||||
|
for(var i = 0; i < squares.length; i++){
|
||||||
|
var sq = squares[i]
|
||||||
|
|
||||||
|
if(i % 4 == 0){
|
||||||
|
%>
|
||||||
|
<tr>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
<td>
|
||||||
|
<div class="square letters"><%=sq%></div>
|
||||||
|
</td>
|
||||||
|
<%
|
||||||
|
}
|
||||||
|
%>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="timer">00:00<div>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script type="text/template" class="winTemplate">
|
||||||
|
|
||||||
|
<h1>Great Job!</h1>
|
||||||
|
<h3>Your time: <%=formatTime(App.puzzleView.secs)%></h3>
|
||||||
|
<div class="nav">
|
||||||
|
<span class="next">Next Puzzle!</span>
|
||||||
|
<div class="share">
|
||||||
|
<%
|
||||||
|
var params = {
|
||||||
|
url: document.location.href,
|
||||||
|
text: 'I solved this Flip.io puzzle in ' + formatTime(App.puzzleView.secs) + ' minutes! ' + document.location.href
|
||||||
|
}
|
||||||
|
|
||||||
|
paramString = $.param(params);
|
||||||
|
|
||||||
|
%>
|
||||||
|
<span><a class="share" target="_blank" href="https://twitter.com/share?url=<%=paramString%>"><i></i> Share on Twitter</a></span>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<script src="./lib/jquery.min.js"></script>
|
||||||
|
<script src="./lib/lodash.min.js"></script>
|
||||||
|
<script src="./lib/backbone.min.js"></script>
|
||||||
|
<script src="./puzzles.js"></script>
|
||||||
|
<script src="./app.js"></script>
|
||||||
|
<script>
|
||||||
|
$(function () {
|
||||||
|
App.init();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
42
lib/backbone.min.js
vendored
Normal file
42
lib/backbone.min.js
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
// Backbone.js 0.9.10
|
||||||
|
|
||||||
|
// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
|
||||||
|
// Backbone may be freely distributed under the MIT license.
|
||||||
|
// For all details and documentation:
|
||||||
|
// http://backbonejs.org
|
||||||
|
(function(){var n=this,B=n.Backbone,h=[],C=h.push,u=h.slice,D=h.splice,g;g="undefined"!==typeof exports?exports:n.Backbone={};g.VERSION="0.9.10";var f=n._;!f&&"undefined"!==typeof require&&(f=require("underscore"));g.$=n.jQuery||n.Zepto||n.ender;g.noConflict=function(){n.Backbone=B;return this};g.emulateHTTP=!1;g.emulateJSON=!1;var v=/\s+/,q=function(a,b,c,d){if(!c)return!0;if("object"===typeof c)for(var e in c)a[b].apply(a,[e,c[e]].concat(d));else if(v.test(c)){c=c.split(v);e=0;for(var f=c.length;e<
|
||||||
|
f;e++)a[b].apply(a,[c[e]].concat(d))}else return!0},w=function(a,b){var c,d=-1,e=a.length;switch(b.length){case 0:for(;++d<e;)(c=a[d]).callback.call(c.ctx);break;case 1:for(;++d<e;)(c=a[d]).callback.call(c.ctx,b[0]);break;case 2:for(;++d<e;)(c=a[d]).callback.call(c.ctx,b[0],b[1]);break;case 3:for(;++d<e;)(c=a[d]).callback.call(c.ctx,b[0],b[1],b[2]);break;default:for(;++d<e;)(c=a[d]).callback.apply(c.ctx,b)}},h=g.Events={on:function(a,b,c){if(!q(this,"on",a,[b,c])||!b)return this;this._events||(this._events=
|
||||||
|
{});(this._events[a]||(this._events[a]=[])).push({callback:b,context:c,ctx:c||this});return this},once:function(a,b,c){if(!q(this,"once",a,[b,c])||!b)return this;var d=this,e=f.once(function(){d.off(a,e);b.apply(this,arguments)});e._callback=b;this.on(a,e,c);return this},off:function(a,b,c){var d,e,t,g,j,l,k,h;if(!this._events||!q(this,"off",a,[b,c]))return this;if(!a&&!b&&!c)return this._events={},this;g=a?[a]:f.keys(this._events);j=0;for(l=g.length;j<l;j++)if(a=g[j],d=this._events[a]){t=[];if(b||
|
||||||
|
c){k=0;for(h=d.length;k<h;k++)e=d[k],(b&&b!==e.callback&&b!==e.callback._callback||c&&c!==e.context)&&t.push(e)}this._events[a]=t}return this},trigger:function(a){if(!this._events)return this;var b=u.call(arguments,1);if(!q(this,"trigger",a,b))return this;var c=this._events[a],d=this._events.all;c&&w(c,b);d&&w(d,arguments);return this},listenTo:function(a,b,c){var d=this._listeners||(this._listeners={}),e=a._listenerId||(a._listenerId=f.uniqueId("l"));d[e]=a;a.on(b,"object"===typeof b?this:c,this);
|
||||||
|
return this},stopListening:function(a,b,c){var d=this._listeners;if(d){if(a)a.off(b,"object"===typeof b?this:c,this),!b&&!c&&delete d[a._listenerId];else{"object"===typeof b&&(c=this);for(var e in d)d[e].off(b,c,this);this._listeners={}}return this}}};h.bind=h.on;h.unbind=h.off;f.extend(g,h);var r=g.Model=function(a,b){var c,d=a||{};this.cid=f.uniqueId("c");this.attributes={};b&&b.collection&&(this.collection=b.collection);b&&b.parse&&(d=this.parse(d,b)||{});if(c=f.result(this,"defaults"))d=f.defaults({},
|
||||||
|
d,c);this.set(d,b);this.changed={};this.initialize.apply(this,arguments)};f.extend(r.prototype,h,{changed:null,idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},sync:function(){return g.sync.apply(this,arguments)},get:function(a){return this.attributes[a]},escape:function(a){return f.escape(this.get(a))},has:function(a){return null!=this.get(a)},set:function(a,b,c){var d,e,g,p,j,l,k;if(null==a)return this;"object"===typeof a?(e=a,c=b):(e={})[a]=b;c||(c={});
|
||||||
|
if(!this._validate(e,c))return!1;g=c.unset;p=c.silent;a=[];j=this._changing;this._changing=!0;j||(this._previousAttributes=f.clone(this.attributes),this.changed={});k=this.attributes;l=this._previousAttributes;this.idAttribute in e&&(this.id=e[this.idAttribute]);for(d in e)b=e[d],f.isEqual(k[d],b)||a.push(d),f.isEqual(l[d],b)?delete this.changed[d]:this.changed[d]=b,g?delete k[d]:k[d]=b;if(!p){a.length&&(this._pending=!0);b=0;for(d=a.length;b<d;b++)this.trigger("change:"+a[b],this,k[a[b]],c)}if(j)return this;
|
||||||
|
if(!p)for(;this._pending;)this._pending=!1,this.trigger("change",this,c);this._changing=this._pending=!1;return this},unset:function(a,b){return this.set(a,void 0,f.extend({},b,{unset:!0}))},clear:function(a){var b={},c;for(c in this.attributes)b[c]=void 0;return this.set(b,f.extend({},a,{unset:!0}))},hasChanged:function(a){return null==a?!f.isEmpty(this.changed):f.has(this.changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this.changed):!1;var b,c=!1,d=this._changing?
|
||||||
|
this._previousAttributes:this.attributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return null==a||!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},fetch:function(a){a=a?f.clone(a):{};void 0===a.parse&&(a.parse=!0);var b=a.success;a.success=function(a,d,e){if(!a.set(a.parse(d,e),e))return!1;b&&b(a,d,e)};return this.sync("read",this,a)},save:function(a,b,c){var d,e,g=this.attributes;
|
||||||
|
null==a||"object"===typeof a?(d=a,c=b):(d={})[a]=b;if(d&&(!c||!c.wait)&&!this.set(d,c))return!1;c=f.extend({validate:!0},c);if(!this._validate(d,c))return!1;d&&c.wait&&(this.attributes=f.extend({},g,d));void 0===c.parse&&(c.parse=!0);e=c.success;c.success=function(a,b,c){a.attributes=g;var k=a.parse(b,c);c.wait&&(k=f.extend(d||{},k));if(f.isObject(k)&&!a.set(k,c))return!1;e&&e(a,b,c)};a=this.isNew()?"create":c.patch?"patch":"update";"patch"===a&&(c.attrs=d);a=this.sync(a,this,c);d&&c.wait&&(this.attributes=
|
||||||
|
g);return a},destroy:function(a){a=a?f.clone(a):{};var b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};a.success=function(a,b,e){(e.wait||a.isNew())&&d();c&&c(a,b,e)};if(this.isNew())return a.success(this,null,a),!1;var e=this.sync("delete",this,a);a.wait||d();return e},url:function(){var a=f.result(this,"urlRoot")||f.result(this.collection,"url")||x();return this.isNew()?a:a+("/"===a.charAt(a.length-1)?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},
|
||||||
|
isNew:function(){return null==this.id},isValid:function(a){return!this.validate||!this.validate(this.attributes,a)},_validate:function(a,b){if(!b.validate||!this.validate)return!0;a=f.extend({},this.attributes,a);var c=this.validationError=this.validate(a,b)||null;if(!c)return!0;this.trigger("invalid",this,c,b||{});return!1}});var s=g.Collection=function(a,b){b||(b={});b.model&&(this.model=b.model);void 0!==b.comparator&&(this.comparator=b.comparator);this.models=[];this._reset();this.initialize.apply(this,
|
||||||
|
arguments);a&&this.reset(a,f.extend({silent:!0},b))};f.extend(s.prototype,h,{model:r,initialize:function(){},toJSON:function(a){return this.map(function(b){return b.toJSON(a)})},sync:function(){return g.sync.apply(this,arguments)},add:function(a,b){a=f.isArray(a)?a.slice():[a];b||(b={});var c,d,e,g,p,j,l,k,h,m;l=[];k=b.at;h=this.comparator&&null==k&&!1!=b.sort;m=f.isString(this.comparator)?this.comparator:null;c=0;for(d=a.length;c<d;c++)(e=this._prepareModel(g=a[c],b))?(p=this.get(e))?b.merge&&(p.set(g===
|
||||||
|
e?e.attributes:g,b),h&&(!j&&p.hasChanged(m))&&(j=!0)):(l.push(e),e.on("all",this._onModelEvent,this),this._byId[e.cid]=e,null!=e.id&&(this._byId[e.id]=e)):this.trigger("invalid",this,g,b);l.length&&(h&&(j=!0),this.length+=l.length,null!=k?D.apply(this.models,[k,0].concat(l)):C.apply(this.models,l));j&&this.sort({silent:!0});if(b.silent)return this;c=0;for(d=l.length;c<d;c++)(e=l[c]).trigger("add",e,this,b);j&&this.trigger("sort",this,b);return this},remove:function(a,b){a=f.isArray(a)?a.slice():[a];
|
||||||
|
b||(b={});var c,d,e,g;c=0;for(d=a.length;c<d;c++)if(g=this.get(a[c]))delete this._byId[g.id],delete this._byId[g.cid],e=this.indexOf(g),this.models.splice(e,1),this.length--,b.silent||(b.index=e,g.trigger("remove",g,this,b)),this._removeReference(g);return this},push:function(a,b){a=this._prepareModel(a,b);this.add(a,f.extend({at:this.length},b));return a},pop:function(a){var b=this.at(this.length-1);this.remove(b,a);return b},unshift:function(a,b){a=this._prepareModel(a,b);this.add(a,f.extend({at:0},
|
||||||
|
b));return a},shift:function(a){var b=this.at(0);this.remove(b,a);return b},slice:function(a,b){return this.models.slice(a,b)},get:function(a){if(null!=a)return this._idAttr||(this._idAttr=this.model.prototype.idAttribute),this._byId[a.id||a.cid||a[this._idAttr]||a]},at:function(a){return this.models[a]},where:function(a){return f.isEmpty(a)?[]:this.filter(function(b){for(var c in a)if(a[c]!==b.get(c))return!1;return!0})},sort:function(a){if(!this.comparator)throw Error("Cannot sort a set without a comparator");
|
||||||
|
a||(a={});f.isString(this.comparator)||1===this.comparator.length?this.models=this.sortBy(this.comparator,this):this.models.sort(f.bind(this.comparator,this));a.silent||this.trigger("sort",this,a);return this},pluck:function(a){return f.invoke(this.models,"get",a)},update:function(a,b){b=f.extend({add:!0,merge:!0,remove:!0},b);b.parse&&(a=this.parse(a,b));var c,d,e,g,h=[],j=[],l={};f.isArray(a)||(a=a?[a]:[]);if(b.add&&!b.remove)return this.add(a,b);d=0;for(e=a.length;d<e;d++)c=a[d],g=this.get(c),
|
||||||
|
b.remove&&g&&(l[g.cid]=!0),(b.add&&!g||b.merge&&g)&&h.push(c);if(b.remove){d=0;for(e=this.models.length;d<e;d++)c=this.models[d],l[c.cid]||j.push(c)}j.length&&this.remove(j,b);h.length&&this.add(h,b);return this},reset:function(a,b){b||(b={});b.parse&&(a=this.parse(a,b));for(var c=0,d=this.models.length;c<d;c++)this._removeReference(this.models[c]);b.previousModels=this.models.slice();this._reset();a&&this.add(a,f.extend({silent:!0},b));b.silent||this.trigger("reset",this,b);return this},fetch:function(a){a=
|
||||||
|
a?f.clone(a):{};void 0===a.parse&&(a.parse=!0);var b=a.success;a.success=function(a,d,e){a[e.update?"update":"reset"](d,e);b&&b(a,d,e)};return this.sync("read",this,a)},create:function(a,b){b=b?f.clone(b):{};if(!(a=this._prepareModel(a,b)))return!1;b.wait||this.add(a,b);var c=this,d=b.success;b.success=function(a,b,f){f.wait&&c.add(a,f);d&&d(a,b,f)};a.save(null,b);return a},parse:function(a){return a},clone:function(){return new this.constructor(this.models)},_reset:function(){this.length=0;this.models.length=
|
||||||
|
0;this._byId={}},_prepareModel:function(a,b){if(a instanceof r)return a.collection||(a.collection=this),a;b||(b={});b.collection=this;var c=new this.model(a,b);return!c._validate(a,b)?!1:c},_removeReference:function(a){this===a.collection&&delete a.collection;a.off("all",this._onModelEvent,this)},_onModelEvent:function(a,b,c,d){("add"===a||"remove"===a)&&c!==this||("destroy"===a&&this.remove(b,d),b&&a==="change:"+b.idAttribute&&(delete this._byId[b.previous(b.idAttribute)],null!=b.id&&(this._byId[b.id]=
|
||||||
|
b)),this.trigger.apply(this,arguments))},sortedIndex:function(a,b,c){b||(b=this.comparator);var d=f.isFunction(b)?b:function(a){return a.get(b)};return f.sortedIndex(this.models,a,d,c)}});f.each("forEach each map collect reduce foldl inject reduceRight foldr find detect filter select reject every all some any include contains invoke max min toArray size first head take initial rest tail drop last without indexOf shuffle lastIndexOf isEmpty chain".split(" "),function(a){s.prototype[a]=function(){var b=
|
||||||
|
u.call(arguments);b.unshift(this.models);return f[a].apply(f,b)}});f.each(["groupBy","countBy","sortBy"],function(a){s.prototype[a]=function(b,c){var d=f.isFunction(b)?b:function(a){return a.get(b)};return f[a](this.models,d,c)}});var y=g.Router=function(a){a||(a={});a.routes&&(this.routes=a.routes);this._bindRoutes();this.initialize.apply(this,arguments)},E=/\((.*?)\)/g,F=/(\(\?)?:\w+/g,G=/\*\w+/g,H=/[\-{}\[\]+?.,\\\^$|#\s]/g;f.extend(y.prototype,h,{initialize:function(){},route:function(a,b,c){f.isRegExp(a)||
|
||||||
|
(a=this._routeToRegExp(a));c||(c=this[b]);g.history.route(a,f.bind(function(d){d=this._extractParameters(a,d);c&&c.apply(this,d);this.trigger.apply(this,["route:"+b].concat(d));this.trigger("route",b,d);g.history.trigger("route",this,b,d)},this));return this},navigate:function(a,b){g.history.navigate(a,b);return this},_bindRoutes:function(){if(this.routes)for(var a,b=f.keys(this.routes);null!=(a=b.pop());)this.route(a,this.routes[a])},_routeToRegExp:function(a){a=a.replace(H,"\\$&").replace(E,"(?:$1)?").replace(F,
|
||||||
|
function(a,c){return c?a:"([^/]+)"}).replace(G,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,b){return a.exec(b).slice(1)}});var m=g.History=function(){this.handlers=[];f.bindAll(this,"checkUrl");"undefined"!==typeof window&&(this.location=window.location,this.history=window.history)},z=/^[#\/]|\s+$/g,I=/^\/+|\/+$/g,J=/msie [\w.]+/,K=/\/$/;m.started=!1;f.extend(m.prototype,h,{interval:50,getHash:function(a){return(a=(a||this).location.href.match(/#(.*)$/))?a[1]:""},getFragment:function(a,
|
||||||
|
b){if(null==a)if(this._hasPushState||!this._wantsHashChange||b){a=this.location.pathname;var c=this.root.replace(K,"");a.indexOf(c)||(a=a.substr(c.length))}else a=this.getHash();return a.replace(z,"")},start:function(a){if(m.started)throw Error("Backbone.history has already been started");m.started=!0;this.options=f.extend({},{root:"/"},this.options,a);this.root=this.options.root;this._wantsHashChange=!1!==this.options.hashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=!(!this.options.pushState||
|
||||||
|
!this.history||!this.history.pushState);a=this.getFragment();var b=document.documentMode,b=J.exec(navigator.userAgent.toLowerCase())&&(!b||7>=b);this.root=("/"+this.root+"/").replace(I,"/");b&&this._wantsHashChange&&(this.iframe=g.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow,this.navigate(a));if(this._hasPushState)g.$(window).on("popstate",this.checkUrl);else if(this._wantsHashChange&&"onhashchange"in window&&!b)g.$(window).on("hashchange",this.checkUrl);
|
||||||
|
else this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval));this.fragment=a;a=this.location;b=a.pathname.replace(/[^\/]$/,"$&/")===this.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,!0),this.location.replace(this.root+this.location.search+"#"+this.fragment),!0;this._wantsPushState&&(this._hasPushState&&b&&a.hash)&&(this.fragment=this.getHash().replace(z,""),this.history.replaceState({},document.title,
|
||||||
|
this.root+this.fragment+a.search));if(!this.options.silent)return this.loadUrl()},stop:function(){g.$(window).off("popstate",this.checkUrl).off("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);m.started=!1},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a===this.fragment&&this.iframe&&(a=this.getFragment(this.getHash(this.iframe)));if(a===this.fragment)return!1;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(this.getHash())},
|
||||||
|
loadUrl:function(a){var b=this.fragment=this.getFragment(a);return f.any(this.handlers,function(a){if(a.route.test(b))return a.callback(b),!0})},navigate:function(a,b){if(!m.started)return!1;if(!b||!0===b)b={trigger:b};a=this.getFragment(a||"");if(this.fragment!==a){this.fragment=a;var c=this.root+a;if(this._hasPushState)this.history[b.replace?"replaceState":"pushState"]({},document.title,c);else if(this._wantsHashChange)this._updateHash(this.location,a,b.replace),this.iframe&&a!==this.getFragment(this.getHash(this.iframe))&&
|
||||||
|
(b.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,a,b.replace));else return this.location.assign(c);b.trigger&&this.loadUrl(a)}},_updateHash:function(a,b,c){c?(c=a.href.replace(/(javascript:|#).*$/,""),a.replace(c+"#"+b)):a.hash="#"+b}});g.history=new m;var A=g.View=function(a){this.cid=f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()},L=/^(\S+)\s*(.*)$/,M="model collection el id attributes className tagName events".split(" ");
|
||||||
|
f.extend(A.prototype,h,{tagName:"div",$:function(a){return this.$el.find(a)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();this.stopListening();return this},setElement:function(a,b){this.$el&&this.undelegateEvents();this.$el=a instanceof g.$?a:g.$(a);this.el=this.$el[0];!1!==b&&this.delegateEvents();return this},delegateEvents:function(a){if(a||(a=f.result(this,"events"))){this.undelegateEvents();for(var b in a){var c=a[b];f.isFunction(c)||(c=this[a[b]]);
|
||||||
|
if(!c)throw Error('Method "'+a[b]+'" does not exist');var d=b.match(L),e=d[1],d=d[2],c=f.bind(c,this),e=e+(".delegateEvents"+this.cid);if(""===d)this.$el.on(e,c);else this.$el.on(e,d,c)}}},undelegateEvents:function(){this.$el.off(".delegateEvents"+this.cid)},_configure:function(a){this.options&&(a=f.extend({},f.result(this,"options"),a));f.extend(this,f.pick(a,M));this.options=a},_ensureElement:function(){if(this.el)this.setElement(f.result(this,"el"),!1);else{var a=f.extend({},f.result(this,"attributes"));
|
||||||
|
this.id&&(a.id=f.result(this,"id"));this.className&&(a["class"]=f.result(this,"className"));a=g.$("<"+f.result(this,"tagName")+">").attr(a);this.setElement(a,!1)}}});var N={create:"POST",update:"PUT",patch:"PATCH","delete":"DELETE",read:"GET"};g.sync=function(a,b,c){var d=N[a];f.defaults(c||(c={}),{emulateHTTP:g.emulateHTTP,emulateJSON:g.emulateJSON});var e={type:d,dataType:"json"};c.url||(e.url=f.result(b,"url")||x());if(null==c.data&&b&&("create"===a||"update"===a||"patch"===a))e.contentType="application/json",
|
||||||
|
e.data=JSON.stringify(c.attrs||b.toJSON(c));c.emulateJSON&&(e.contentType="application/x-www-form-urlencoded",e.data=e.data?{model:e.data}:{});if(c.emulateHTTP&&("PUT"===d||"DELETE"===d||"PATCH"===d)){e.type="POST";c.emulateJSON&&(e.data._method=d);var h=c.beforeSend;c.beforeSend=function(a){a.setRequestHeader("X-HTTP-Method-Override",d);if(h)return h.apply(this,arguments)}}"GET"!==e.type&&!c.emulateJSON&&(e.processData=!1);var m=c.success;c.success=function(a){m&&m(b,a,c);b.trigger("sync",b,a,c)};
|
||||||
|
var j=c.error;c.error=function(a){j&&j(b,a,c);b.trigger("error",b,a,c)};a=c.xhr=g.ajax(f.extend(e,c));b.trigger("request",b,a,c);return a};g.ajax=function(){return g.$.ajax.apply(g.$,arguments)};r.extend=s.extend=y.extend=A.extend=m.extend=function(a,b){var c=this,d;d=a&&f.has(a,"constructor")?a.constructor:function(){return c.apply(this,arguments)};f.extend(d,c,b);var e=function(){this.constructor=d};e.prototype=c.prototype;d.prototype=new e;a&&f.extend(d.prototype,a);d.__super__=c.prototype;return d};
|
||||||
|
var x=function(){throw Error('A "url" property or function must be specified');}}).call(this);
|
||||||
4
lib/jquery.min.js
vendored
Normal file
4
lib/jquery.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
42
lib/lodash.min.js
vendored
Normal file
42
lib/lodash.min.js
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
/*!
|
||||||
|
Lo-Dash 1.0.0-rc.3 lodash.com/license
|
||||||
|
Underscore.js 1.4.3 underscorejs.org/LICENSE
|
||||||
|
*/
|
||||||
|
;(function(e,t){function n(e){if(e&&typeof e=="object"&&e.__wrapped__)return e;if(!(this instanceof n))return new n(e);this.__wrapped__=e}function r(e,t,n){t||(t=0);var r=e.length,i=r-t>=(n||tt);if(i)for(var s={},n=t-1;++n<r;){var o=e[n]+"";(Et.call(s,o)?s[o]:s[o]=[]).push(e[n])}return function(n){if(i){var r=n+"";return Et.call(s,r)&&-1<R(s[r],n)}return-1<R(e,n,t)}}function i(e){return e.charCodeAt(0)}function s(e,t){var n=e.b,r=t.b,e=e.a,t=t.a;if(e!==t){if(e>t||typeof e=="undefined")return 1;if(
|
||||||
|
e<t||typeof t=="undefined")return-1}return n<r?-1:1}function o(e,t,n){function r(){var u=arguments,a=s?this:t;return i||(e=t[o]),n.length&&(u=u.length?n.concat(p(u)):n),this instanceof r?(h.prototype=e.prototype,a=new h,h.prototype=null,u=e.apply(a,u),x(u)?u:a):e.apply(a,u)}var i=S(e),s=!n,o=t;return s&&(n=t),i||(t=e),r}function u(e,t,n){return e?typeof e!="function"?function(t){return t[e]}:typeof t!="undefined"?n?function(n,r,i,s){return e.call(t,n,r,i,s)}:function(n,r,i){return e.call(t,n,r,i)
|
||||||
|
}:e:V}function a(){for(var e={b:"",c:"",e:Xt,f:Wt,g:"",h:Jt,i:Gt,j:mt,k:"",l:!0},t,n=0;t=arguments[n];n++)for(var r in t)e[r]=t[r];t=e.a,e.d=/^[^,]+/.exec(t)[0],n=Function,r="var i,l="+e.d+",t="+e.d+";if(!"+e.d+")return t;"+e.k+";",e.b?(r+="var m=l.length;i=-1;if(typeof m=='number'){",e.i&&(r+="if(k(l)){l=l.split('')}"),r+="while(++i<m){"+e.b+"}}else {"):e.h&&(r+="var m=l.length;i=-1;if(m&&j(l)){while(++i<m){i+='';"+e.g+"}}else {"),e.e||(r+="var u=typeof l=='function'&&s.call(l,'prototype');");if(
|
||||||
|
e.f&&e.l)r+="var q=-1,r=p[typeof l]?n(l):[],m=r.length;while(++q<m){i=r[q];",e.e||(r+="if(!(u&&i=='prototype')){"),r+=e.g+"",e.e||(r+="}");else{r+="for(i in l){";if(!e.e||e.l)r+="if(",e.e||(r+="!(u&&i=='prototype')"),!e.e&&e.l&&(r+="&&"),e.l&&(r+="h.call(l,i)"),r+="){";r+=e.g+";";if(!e.e||e.l)r+="}"}r+="}";if(e.e){r+="var f=l.constructor;";for(var i=0;7>i;i++)r+="i='"+e.j[i]+"';if(","constructor"==e.j[i]&&(r+="!(f&&f.prototype===l)&&"),r+="h.call(l,i)){"+e.g+"}"}if(e.b||e.h)r+="}";return r+=e.c+";return t"
|
||||||
|
,n("e,h,j,k,p,n,s","return function("+t+"){"+r+"}")(u,Et,v,N,nn,At,xt)}function f(e){return"\\"+rn[e]}function l(e){return hn[e]}function c(e){return typeof e.toString!="function"&&typeof (e+"")=="string"}function h(){}function p(e,t,n){t||(t=0),typeof n=="undefined"&&(n=e?e.length:0);for(var r=-1,n=n-t||0,i=Array(0>n?0:n);++r<n;)i[r]=e[t+r];return i}function d(e){return pn[e]}function v(e){return Tt.call(e)==Dt}function m(e){var t=!1;if(!e||typeof e!="object"||v(e))return t;var n=e.constructor;return!
|
||||||
|
S(n)&&(!Yt||!c(e))||n instanceof n?Vt?(ln(e,function(e,n,r){return t=!Et.call(r,n),!1}),!1===t):(ln(e,function(e,n){t=n}),!1===t||Et.call(e,t)):t}function g(e){var t=[];return cn(e,function(e,n){t.push(n)}),t}function y(e,t,n,r,i){if(null==e)return e;n&&(t=!1);if(n=x(e)){var s=Tt.call(e);if(!en[s]||Yt&&c(e))return e;var o=vn(e)}if(!n||!t)return n?o?p(e):fn({},e):e;n=tn[s];switch(s){case Ht:case Bt:return new n(+e);case jt:case qt:return new n(e);case It:return n(e.source,at.exec(e))}r||(r=[]),i||
|
||||||
|
(i=[]);for(s=r.length;s--;)if(r[s]==e)return i[s];var u=o?n(e.length):{};return r.push(e),i.push(u),(o?_:cn)(e,function(e,n){u[n]=y(e,t,null,r,i)}),o&&(Et.call(e,"index")&&(u.index=e.index),Et.call(e,"input")&&(u.input=e.input)),u}function b(e){var t=[];return ln(e,function(e,n){S(e)&&t.push(n)}),t.sort()}function w(e){var t={};return cn(e,function(e,n){t[e]=n}),t}function E(e,t,n,r){if(e===t)return 0!==e||1/e==1/t;if(null==e||null==t)return e===t;var i=Tt.call(e),s=Tt.call(t);i==Dt&&(i=Ft),s==Dt&&
|
||||||
|
(s=Ft);if(i!=s)return!1;switch(i){case Ht:case Bt:return+e==+t;case jt:return e!=+e?t!=+t:0==e?1/e==1/t:e==+t;case It:case qt:return e==t+""}s=i==Pt;if(!s){if(e.__wrapped__||t.__wrapped__)return E(e.__wrapped__||e,t.__wrapped__||t);if(i!=Ft||Yt&&(c(e)||c(t)))return!1;var i=!Kt&&v(e)?Object:e.constructor,o=!Kt&&v(t)?Object:t.constructor;if(i!=o&&(!S(i)||!(i instanceof i&&S(o)&&o instanceof o)))return!1}n||(n=[]),r||(r=[]);for(i=n.length;i--;)if(n[i]==e)return r[i]==t;var u=!0,a=0;n.push(e),r.push(
|
||||||
|
t);if(s){a=e.length;if(u=a==t.length)for(;a--&&(u=E(e[a],t[a],n,r)););return u}return ln(e,function(e,i,s){if(Et.call(s,i))return a++,u=Et.call(t,i)&&E(e,t[i],n,r)}),u&&ln(t,function(e,t,n){if(Et.call(n,t))return u=-1<--a}),u}function S(e){return typeof e=="function"}function x(e){return e?nn[typeof e]:!1}function T(e){return typeof e=="number"||Tt.call(e)==jt}function N(e){return typeof e=="string"||Tt.call(e)==qt}function C(e,t,n){var r=arguments,i=0,s=2,o=r[3],u=r[4];n!==et&&(o=[],u=[],typeof
|
||||||
|
n!="number"&&(s=r.length));for(;++i<s;)cn(r[i],function(t,n){var r,i,s;if(t&&((i=vn(t))||mn(t))){for(var a=o.length;a--;)if(r=o[a]==t)break;r?e[n]=u[a]:(o.push(t),u.push(s=(s=e[n],i)?vn(s)?s:[]:mn(s)?s:{}),e[n]=C(s,t,et,o,u))}else t!=null&&(e[n]=t)});return e}function k(e){var t=[];return cn(e,function(e){t.push(e)}),t}function L(e,t,n){var r=-1,i=e?e.length:0,s=!1,n=(0>n?Ot(0,i+n):n)||0;return typeof i=="number"?s=-1<(N(e)?e.indexOf(t,n):R(e,t,n)):an(e,function(e){if(++r>=n)return!(s=e===t)}),s}
|
||||||
|
function A(e,t,n){var r=!0,t=u(t,n);if(vn(e))for(var n=-1,i=e.length;++n<i&&(r=!!t(e[n],n,e)););else an(e,function(e,n,i){return r=!!t(e,n,i)});return r}function O(e,t,n){var r=[],t=u(t,n);if(vn(e))for(var n=-1,i=e.length;++n<i;){var s=e[n];t(s,n,e)&&r.push(s)}else an(e,function(e,n,i){t(e,n,i)&&r.push(e)});return r}function M(e,t,n){var r,t=u(t,n);return _(e,function(e,n,i){if(t(e,n,i))return r=e,!1}),r}function _(e,t,n){if(t&&typeof n=="undefined"&&vn(e))for(var n=-1,r=e.length;++n<r&&!1!==t(e[
|
||||||
|
n],n,e););else an(e,t,n);return e}function D(e,t,n){var r=-1,i=e?e.length:0,s=Array(typeof i=="number"?i:0),t=u(t,n);if(vn(e))for(;++r<i;)s[r]=t(e[r],r,e);else an(e,function(e,n,i){s[++r]=t(e,n,i)});return s}function P(e,t,n){var r=-Infinity,s=-1,o=e?e.length:0,a=r;if(t||!vn(e))t=!t&&N(e)?i:u(t,n),an(e,function(e,n,i){n=t(e,n,i),n>r&&(r=n,a=e)});else for(;++s<o;)e[s]>a&&(a=e[s]);return a}function H(e,t){return D(e,t+"")}function B(e,t,n,r){var i=3>arguments.length,t=u(t,r,et);if(vn(e)){var s=-1,o=
|
||||||
|
e.length;for(i&&(n=e[++s]);++s<o;)n=t(n,e[s],s,e)}else an(e,function(e,r,s){n=i?(i=!1,e):t(n,e,r,s)});return n}function j(e,t,n,r){var i=e,s=e?e.length:0,o=3>arguments.length;if(typeof s!="number")var a=gn(e),s=a.length;else Gt&&N(e)&&(i=e.split(""));return t=u(t,r,et),_(e,function(e,r,u){r=a?a[--s]:--s,n=o?(o=!1,i[r]):t(n,i[r],r,u)}),n}function F(e,t,n){var r,t=u(t,n);if(vn(e))for(var n=-1,i=e.length;++n<i&&!(r=t(e[n],n,e)););else an(e,function(e,n,i){return!(r=t(e,n,i))});return!!r}function I(e
|
||||||
|
,t,n){if(e){var r=e.length;return null==t||n?e[0]:p(e,0,Mt(Ot(0,t),r))}}function q(e,t){for(var n=-1,r=e?e.length:0,i=[];++n<r;){var s=e[n];vn(s)?St.apply(i,t?s:q(s)):i.push(s)}return i}function R(e,t,n){var r=-1,i=e?e.length:0;if(typeof n=="number")r=(0>n?Ot(0,i+n):n||0)-1;else if(n)return r=z(e,t),e[r]===t?r:-1;for(;++r<i;)if(e[r]===t)return r;return-1}function U(e,t,n){return p(e,null==t||n?1:Ot(0,t))}function z(e,t,n,r){for(var i=0,s=e?e.length:i,n=n?u(n,r):V,t=n(t);i<s;)r=i+s>>>1,n(e[r])<t?i=
|
||||||
|
r+1:s=r;return i}function W(e,t,n,r){var i=-1,s=e?e.length:0,o=[],a=o;typeof t=="function"&&(r=n,n=t,t=!1);var f=!t&&75<=s;if(f)var l={};n&&(a=[],n=u(n,r));for(;++i<s;){var r=e[i],c=n?n(r,i,e):r;if(f)var h=c+"",h=Et.call(l,h)?!(a=l[h]):a=l[h]=[];if(t?!i||a[a.length-1]!==c:h||0>R(a,c))(n||f)&&a.push(c),o.push(r)}return o}function X(e,t){return zt||Nt&&2<arguments.length?Nt.call.apply(Nt,arguments):o(e,t,p(arguments,2))}function V(e){return e}function $(e){_(b(e),function(t){var r=n[t]=e[t];n.prototype
|
||||||
|
[t]=function(){var e=[this.__wrapped__];return St.apply(e,arguments),e=r.apply(n,e),new n(e)}})}function J(){return this.__wrapped__}var K=typeof exports=="object"&&exports,Q=typeof global=="object"&&global;Q.global===Q&&(e=Q);var G=[],Y=new function(){},Z=0,et=Y,tt=30,nt=e._,rt=/[-?+=!~*%&^<>|{(\/]|\[\D|\b(?:delete|in|instanceof|new|typeof|void)\b/,it=/&(?:amp|lt|gt|quot|#x27);/g,st=/\b__p\+='';/g,ot=/\b(__p\+=)''\+/g,ut=/(__e\(.*?\)|\b__t\))\+'';/g,at=/\w*$/,ft=/(?:__e|__t=)\(\s*(?![\d\s"']|this\.)/g
|
||||||
|
,lt=RegExp("^"+(Y.valueOf+"").replace(/[.*+?^=!:${}()|[\]\/\\]/g,"\\$&").replace(/valueOf|for [^\]]+/g,".+?")+"$"),ct=/\$\{((?:(?=\\?)\\?[\s\S])*?)}/g,ht=/<%=([\s\S]+?)%>/g,pt=/($^)/,dt=/[&<>"']/g,vt=/['\n\r\t\u2028\u2029\\]/g,mt="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),gt=Math.ceil,yt=G.concat,bt=Math.floor,wt=lt.test(wt=Object.getPrototypeOf)&&wt,Et=Y.hasOwnProperty,St=G.push,xt=Y.propertyIsEnumerable,Tt=Y.toString,Nt=lt.test(Nt=
|
||||||
|
p.bind)&&Nt,Ct=lt.test(Ct=Array.isArray)&&Ct,kt=e.isFinite,Lt=e.isNaN,At=lt.test(At=Object.keys)&&At,Ot=Math.max,Mt=Math.min,_t=Math.random,Dt="[object Arguments]",Pt="[object Array]",Ht="[object Boolean]",Bt="[object Date]",jt="[object Number]",Ft="[object Object]",It="[object RegExp]",qt="[object String]",Rt=!!e.attachEvent,Ut=Nt&&!/\n|true/.test(Nt+Rt),zt=Nt&&!Ut,Wt=At&&(Rt||Ut),Xt,Vt,$t=($t={0:1,length:1},G.splice.call($t,0,1),$t[0]),Jt=!0;(function(){function e(){this.x=1}var t=[];e.prototype=
|
||||||
|
{valueOf:1,y:1};for(var n in new e)t.push(n);for(n in arguments)Jt=!n;Xt=!/valueOf/.test(t),Vt="x"!=t[0]})(1);var Kt=arguments.constructor==Object,Qt=!v(arguments),Gt="xx"!="x"[0]+Object("x")[0];try{var Yt=("[object Object]",Tt.call(document)==Ft)}catch(Zt){}var en={"[object Function]":!1};en[Dt]=en[Pt]=en[Ht]=en[Bt]=en[jt]=en[Ft]=en[It]=en[qt]=!0;var tn={};tn[Pt]=Array,tn[Ht]=Boolean,tn[Bt]=Date,tn[Ft]=Object,tn[jt]=Number,tn[It]=RegExp,tn[qt]=String;var nn={"boolean":!1,"function":!0,object:!0,
|
||||||
|
number:!1,string:!1,"undefined":!1},rn={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"};n.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:ht,variable:""};var sn={a:"o,v,g",k:"for(var a=1,b=typeof g=='number'?2:arguments.length;a<b;a++){if((l=arguments[a])){",g:"t[i]=l[i]",c:"}}"},on={a:"d,c,w",k:"c=c&&typeof w=='undefined'?c:e(c,w)",b:"if(c(l[i],i,d)===false)return t",g:"if(c(l[i],i,d)===false)return t"},un={b:null},an=a(on),fn=a(sn
|
||||||
|
);Qt&&(v=function(e){return e?Et.call(e,"callee"):!1});var ln=a(on,un,{l:!1}),cn=a(on,un),hn={"&":"&","<":"<",">":">",'"':""","'":"'"},pn=w(hn),dn=a(sn,{g:"if(t[i]==null)"+sn.g}),vn=Ct||function(e){return Kt&&e instanceof Array||Tt.call(e)==Pt};S(/x/)&&(S=function(e){return e instanceof Function||"[object Function]"==Tt.call(e)});var mn=wt?function(e){if(!e||typeof e!="object")return!1;var t=e.valueOf,n=typeof t=="function"&&(n=wt(t))&&wt(n);return n?e==n||wt(e)==n&&!v(e):m(e)
|
||||||
|
}:m,gn=At?function(e){return typeof e=="function"&&xt.call(e,"prototype")?g(e):x(e)?At(e):[]}:g;n.after=function(e,t){return 1>e?t():function(){if(1>--e)return t.apply(this,arguments)}},n.assign=fn,n.bind=X,n.bindAll=function(e){for(var t=arguments,n=1<t.length?0:(t=b(e),-1),r=t.length;++n<r;){var i=t[n];e[i]=X(e[i],e)}return e},n.bindKey=function(e,t){return o(e,t,p(arguments,2))},n.compact=function(e){for(var t=-1,n=e?e.length:0,r=[];++t<n;){var i=e[t];i&&r.push(i)}return r},n.compose=function(
|
||||||
|
){var e=arguments;return function(){for(var t=arguments,n=e.length;n--;)t=[e[n].apply(this,t)];return t[0]}},n.countBy=function(e,t,n){var r={},t=u(t,n);return _(e,function(e,n,i){n=t(e,n,i),Et.call(r,n)?r[n]++:r[n]=1}),r},n.debounce=function(e,t,n){function r(){u=null,n||(s=e.apply(o,i))}var i,s,o,u;return function(){var a=n&&!u;return i=arguments,o=this,clearTimeout(u),u=setTimeout(r,t),a&&(s=e.apply(o,i)),s}},n.defaults=dn,n.defer=function(e){var n=p(arguments,1);return setTimeout(function(){e
|
||||||
|
.apply(t,n)},1)},n.delay=function(e,n){var r=p(arguments,2);return setTimeout(function(){e.apply(t,r)},n)},n.difference=function(e){for(var t=-1,n=e?e.length:0,i=yt.apply(G,arguments),i=r(i,n),s=[];++t<n;){var o=e[t];i(o)||s.push(o)}return s},n.filter=O,n.flatten=q,n.forEach=_,n.forIn=ln,n.forOwn=cn,n.functions=b,n.groupBy=function(e,t,n){var r={},t=u(t,n);return _(e,function(e,n,i){n=t(e,n,i),(Et.call(r,n)?r[n]:r[n]=[]).push(e)}),r},n.initial=function(e,t,n){if(!e)return[];var r=e.length;return p
|
||||||
|
(e,0,Mt(Ot(0,r-(null==t||n?1:t||0)),r))},n.intersection=function(e){var t=arguments,n=t.length,i={0:{}},s=-1,o=e?e.length:0,u=100<=o,a=[],f=a;e:for(;++s<o;){var l=e[s];if(u)var c=l+"",c=Et.call(i[0],c)?!(f=i[0][c]):f=i[0][c]=[];if(c||0>R(f,l)){u&&f.push(l);for(var h=n;--h;)if(!(i[h]||(i[h]=r(t[h],0,100)))(l))continue e;a.push(l)}}return a},n.invert=w,n.invoke=function(e,t){var n=p(arguments,2),r=typeof t=="function",i=[];return _(e,function(e){i.push((r?t:e[t]).apply(e,n))}),i},n.keys=gn,n.map=D,
|
||||||
|
n.max=P,n.memoize=function(e,t){var n={};return function(){var r=t?t.apply(this,arguments):arguments[0];return Et.call(n,r)?n[r]:n[r]=e.apply(this,arguments)}},n.merge=C,n.min=function(e,t,n){var r=Infinity,s=-1,o=e?e.length:0,a=r;if(t||!vn(e))t=!t&&N(e)?i:u(t,n),an(e,function(e,n,i){n=t(e,n,i),n<r&&(r=n,a=e)});else for(;++s<o;)e[s]<a&&(a=e[s]);return a},n.object=function(e,t){for(var n=-1,r=e?e.length:0,i={};++n<r;){var s=e[n];t?i[s]=t[n]:i[s[0]]=s[1]}return i},n.omit=function(e,t,n){var r=typeof
|
||||||
|
t=="function",i={};if(r)t=u(t,n);else var s=yt.apply(G,arguments);return ln(e,function(e,n,o){if(r?!t(e,n,o):0>R(s,n,1))i[n]=e}),i},n.once=function(e){var t,n=!1;return function(){return n?t:(n=!0,t=e.apply(this,arguments),e=null,t)}},n.pairs=function(e){var t=[];return cn(e,function(e,n){t.push([n,e])}),t},n.partial=function(e){return o(e,p(arguments,1))},n.pick=function(e,t,n){var r={};if(typeof t!="function")for(var i=0,s=yt.apply(G,arguments),o=s.length;++i<o;){var a=s[i];a in e&&(r[a]=e[a])}
|
||||||
|
else t=u(t,n),ln(e,function(e,n,i){t(e,n,i)&&(r[n]=e)});return r},n.pluck=H,n.range=function(e,t,n){e=+e||0,n=+n||1,null==t&&(t=e,e=0);for(var r=-1,t=Ot(0,gt((t-e)/n)),i=Array(t);++r<t;)i[r]=e,e+=n;return i},n.reject=function(e,t,n){return t=u(t,n),O(e,function(e,n,r){return!t(e,n,r)})},n.rest=U,n.shuffle=function(e){var t=-1,n=Array(e?e.length:0);return _(e,function(e){var r=bt(_t()*(++t+1));n[t]=n[r],n[r]=e}),n},n.sortBy=function(e,t,n){var r=[],t=u(t,n);_(e,function(e,n,i){r.push({a:t(e,n,i),b
|
||||||
|
:n,c:e})}),e=r.length;for(r.sort(s);e--;)r[e]=r[e].c;return r},n.tap=function(e,t){return t(e),e},n.throttle=function(e,t){function n(){u=new Date,o=null,i=e.apply(s,r)}var r,i,s,o,u=0;return function(){var a=new Date,f=t-(a-u);return r=arguments,s=this,0>=f?(clearTimeout(o),o=null,u=a,i=e.apply(s,r)):o||(o=setTimeout(n,f)),i}},n.times=function(e,t,n){for(var e=+e||0,r=-1,i=Array(e);++r<e;)i[r]=t.call(n,r);return i},n.toArray=function(e){return typeof (e?e.length:0)=="number"?Gt&&N(e)?e.split("")
|
||||||
|
:p(e):k(e)},n.union=function(){return W(yt.apply(G,arguments))},n.uniq=W,n.values=k,n.where=function(e,t){var n=gn(t);return O(e,function(e){for(var r=n.length;r--;){var i=e[n[r]]===t[n[r]];if(!i)break}return!!i})},n.without=function(e){for(var t=-1,n=e?e.length:0,i=r(arguments,1,20),s=[];++t<n;){var o=e[t];i(o)||s.push(o)}return s},n.wrap=function(e,t){return function(){var n=[e];return St.apply(n,arguments),t.apply(this,n)}},n.zip=function(e){for(var t=-1,n=e?P(H(arguments,"length")):0,r=Array(
|
||||||
|
n);++t<n;)r[t]=H(arguments,t);return r},n.collect=D,n.drop=U,n.each=_,n.extend=fn,n.methods=b,n.select=O,n.tail=U,n.unique=W,$(n),n.clone=y,n.cloneDeep=function(e){return y(e,!0)},n.contains=L,n.escape=function(e){return null==e?"":(e+"").replace(dt,l)},n.every=A,n.find=M,n.has=function(e,t){return e?Et.call(e,t):!1},n.identity=V,n.indexOf=R,n.isArguments=v,n.isArray=vn,n.isBoolean=function(e){return!0===e||!1===e||Tt.call(e)==Ht},n.isDate=function(e){return e instanceof Date||Tt.call(e)==Bt},n.isElement=
|
||||||
|
function(e){return e?1===e.nodeType:!1},n.isEmpty=function(e){var t=!0;if(!e)return t;var n=Tt.call(e),r=e.length;return n==Pt||n==qt||n==Dt||Qt&&v(e)||n==Ft&&typeof r=="number"&&S(e.splice)?!r:(cn(e,function(){return t=!1}),t)},n.isEqual=E,n.isFinite=function(e){return kt(e)&&!Lt(parseFloat(e))},n.isFunction=S,n.isNaN=function(e){return T(e)&&e!=+e},n.isNull=function(e){return null===e},n.isNumber=T,n.isObject=x,n.isPlainObject=mn,n.isRegExp=function(e){return e instanceof RegExp||Tt.call(e)==It
|
||||||
|
},n.isString=N,n.isUndefined=function(e){return typeof e=="undefined"},n.lastIndexOf=function(e,t,n){var r=e?e.length:0;for(typeof n=="number"&&(r=(0>n?Ot(0,r+n):Mt(n,r-1))+1);r--;)if(e[r]===t)return r;return-1},n.mixin=$,n.noConflict=function(){return e._=nt,this},n.random=function(e,t){return null==e&&null==t&&(t=1),e=+e||0,null==t&&(t=e,e=0),e+bt(_t()*((+t||0)-e+1))},n.reduce=B,n.reduceRight=j,n.result=function(e,t){var n=e?e[t]:null;return S(n)?e[t]():n},n.size=function(e){var t=e?e.length:0;
|
||||||
|
return typeof t=="number"?t:gn(e).length},n.some=F,n.sortedIndex=z,n.template=function(e,t,r){e||(e=""),r||(r={});var i,s,o=n.templateSettings,u=0,a=r.interpolate||o.interpolate||pt,l="__p+='",c=r.variable||o.variable,h=c;e.replace(RegExp((r.escape||o.escape||pt).source+"|"+a.source+"|"+(a===ht?ct:pt).source+"|"+(r.evaluate||o.evaluate||pt).source+"|$","g"),function(t,n,r,s,o,a){return r||(r=s),l+=e.slice(u,a).replace(vt,f),n&&(l+="'+__e("+n+")+'"),o&&(l+="';"+o+";__p+='"),r&&(l+="'+((__t=("+r+"))==null?'':__t)+'"
|
||||||
|
),i||(i=o||rt.test(n||r)),u=a+t.length,t}),l+="';\n",h||(c="obj",i?l="with("+c+"){"+l+"}":(r=RegExp("(\\(\\s*)"+c+"\\."+c+"\\b","g"),l=l.replace(ft,"$&"+c+".").replace(r,"$1__d"))),l=(i?l.replace(st,""):l).replace(ot,"$1").replace(ut,"$1;"),l="function("+c+"){"+(h?"":c+"||("+c+"={});")+"var __t,__p='',__e=_.escape"+(i?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":(h?"":",__d="+c+"."+c+"||"+c)+";")+l+"return __p}";try{s=Function("_","return "+l)(n)}catch(p){throw p.source=
|
||||||
|
l,p}return t?s(t):(s.source=l,s)},n.unescape=function(e){return null==e?"":(e+"").replace(it,d)},n.uniqueId=function(e){return(null==e?"":e+"")+ ++Z},n.all=A,n.any=F,n.detect=M,n.foldl=B,n.foldr=j,n.include=L,n.inject=B,cn(n,function(e,t){n.prototype[t]||(n.prototype[t]=function(){var t=[this.__wrapped__];return St.apply(t,arguments),e.apply(n,t)})}),n.first=I,n.last=function(e,t,n){if(e){var r=e.length;return null==t||n?e[r-1]:p(e,Ot(0,r-t))}},n.take=I,n.head=I,cn(n,function(e,t){n.prototype[t]||
|
||||||
|
(n.prototype[t]=function(t,r){var i=e(this.__wrapped__,t,r);return null==t||r?i:new n(i)})}),n.VERSION="1.0.0-rc.3",n.prototype.toString=function(){return this.__wrapped__+""},n.prototype.value=J,n.prototype.valueOf=J,an(["join","pop","shift"],function(e){var t=G[e];n.prototype[e]=function(){return t.apply(this.__wrapped__,arguments)}}),an(["push","reverse","sort","unshift"],function(e){var t=G[e];n.prototype[e]=function(){return t.apply(this.__wrapped__,arguments),this}}),an(["concat","slice","splice"
|
||||||
|
],function(e){var t=G[e];n.prototype[e]=function(){var e=t.apply(this.__wrapped__,arguments);return new n(e)}}),$t&&an(["pop","shift","splice"],function(e){var t=G[e],r="splice"==e;n.prototype[e]=function(){var e=this.__wrapped__,i=t.apply(e,arguments);return 0===e.length&&delete e[0],r?new n(i):i}}),typeof define=="function"&&typeof define.amd=="object"&&define.amd?(e._=n,define(function(){return n})):K?typeof module=="object"&&module&&module.exports==K?(module.exports=n)._=n:K._=n:e._=n})(this);
|
||||||
396
lib/normalize.css
vendored
Normal file
396
lib/normalize.css
vendored
Normal file
@@ -0,0 +1,396 @@
|
|||||||
|
/*! normalize.css v2.1.0 | MIT License | git.io/normalize */
|
||||||
|
|
||||||
|
/* ==========================================================================
|
||||||
|
HTML5 display definitions
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correct `block` display not defined in IE 8/9.
|
||||||
|
*/
|
||||||
|
|
||||||
|
article,
|
||||||
|
aside,
|
||||||
|
details,
|
||||||
|
figcaption,
|
||||||
|
figure,
|
||||||
|
footer,
|
||||||
|
header,
|
||||||
|
hgroup,
|
||||||
|
main,
|
||||||
|
nav,
|
||||||
|
section,
|
||||||
|
summary {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correct `inline-block` display not defined in IE 8/9.
|
||||||
|
*/
|
||||||
|
|
||||||
|
audio,
|
||||||
|
canvas,
|
||||||
|
video {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent modern browsers from displaying `audio` without controls.
|
||||||
|
* Remove excess height in iOS 5 devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
audio:not([controls]) {
|
||||||
|
display: none;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address styling not present in IE 8/9.
|
||||||
|
*/
|
||||||
|
|
||||||
|
[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==========================================================================
|
||||||
|
Base
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Set default font family to sans-serif.
|
||||||
|
* 2. Prevent iOS text size adjust after orientation change, without disabling
|
||||||
|
* user zoom.
|
||||||
|
*/
|
||||||
|
|
||||||
|
html {
|
||||||
|
font-family: sans-serif; /* 1 */
|
||||||
|
-webkit-text-size-adjust: 100%; /* 2 */
|
||||||
|
-ms-text-size-adjust: 100%; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove default margin.
|
||||||
|
*/
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==========================================================================
|
||||||
|
Links
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address `outline` inconsistency between Chrome and other browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
a:focus {
|
||||||
|
outline: thin dotted;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Improve readability when focused and also mouse hovered in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
a:active,
|
||||||
|
a:hover {
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==========================================================================
|
||||||
|
Typography
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address variable `h1` font-size and margin within `section` and `article`
|
||||||
|
* contexts in Firefox 4+, Safari 5, and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 2em;
|
||||||
|
margin: 0.67em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address styling not present in IE 8/9, Safari 5, and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
abbr[title] {
|
||||||
|
border-bottom: 1px dotted;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
b,
|
||||||
|
strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address styling not present in Safari 5 and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
dfn {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address differences between Firefox and other browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
hr {
|
||||||
|
-moz-box-sizing: content-box;
|
||||||
|
box-sizing: content-box;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address styling not present in IE 8/9.
|
||||||
|
*/
|
||||||
|
|
||||||
|
mark {
|
||||||
|
background: #ff0;
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correct font family set oddly in Safari 5 and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
code,
|
||||||
|
kbd,
|
||||||
|
pre,
|
||||||
|
samp {
|
||||||
|
font-family: monospace, serif;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Improve readability of pre-formatted text in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pre {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set consistent quote types.
|
||||||
|
*/
|
||||||
|
|
||||||
|
q {
|
||||||
|
quotes: "\201C" "\201D" "\2018" "\2019";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address inconsistent and variable font size in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
small {
|
||||||
|
font-size: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent `sub` and `sup` affecting `line-height` in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
sub,
|
||||||
|
sup {
|
||||||
|
font-size: 75%;
|
||||||
|
line-height: 0;
|
||||||
|
position: relative;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
sup {
|
||||||
|
top: -0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub {
|
||||||
|
bottom: -0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==========================================================================
|
||||||
|
Embedded content
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove border when inside `a` element in IE 8/9.
|
||||||
|
*/
|
||||||
|
|
||||||
|
img {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correct overflow displayed oddly in IE 9.
|
||||||
|
*/
|
||||||
|
|
||||||
|
svg:not(:root) {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==========================================================================
|
||||||
|
Figures
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address margin not present in IE 8/9 and Safari 5.
|
||||||
|
*/
|
||||||
|
|
||||||
|
figure {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==========================================================================
|
||||||
|
Forms
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define consistent border, margin, and padding.
|
||||||
|
*/
|
||||||
|
|
||||||
|
fieldset {
|
||||||
|
border: 1px solid #c0c0c0;
|
||||||
|
margin: 0 2px;
|
||||||
|
padding: 0.35em 0.625em 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct `color` not being inherited in IE 8/9.
|
||||||
|
* 2. Remove padding so people aren't caught out if they zero out fieldsets.
|
||||||
|
*/
|
||||||
|
|
||||||
|
legend {
|
||||||
|
border: 0; /* 1 */
|
||||||
|
padding: 0; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Correct font family not being inherited in all browsers.
|
||||||
|
* 2. Correct font size not being inherited in all browsers.
|
||||||
|
* 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
input,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
|
font-family: inherit; /* 1 */
|
||||||
|
font-size: 100%; /* 2 */
|
||||||
|
margin: 0; /* 3 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address Firefox 4+ setting `line-height` on `input` using `!important` in
|
||||||
|
* the UA stylesheet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
input {
|
||||||
|
line-height: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Address inconsistent `text-transform` inheritance for `button` and `select`.
|
||||||
|
* All other form control elements do not inherit `text-transform` values.
|
||||||
|
* Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+.
|
||||||
|
* Correct `select` style inheritance in Firefox 4+ and Opera.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
select {
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`
|
||||||
|
* and `video` controls.
|
||||||
|
* 2. Correct inability to style clickable `input` types in iOS.
|
||||||
|
* 3. Improve usability and consistency of cursor style between image-type
|
||||||
|
* `input` and others.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button,
|
||||||
|
html input[type="button"], /* 1 */
|
||||||
|
input[type="reset"],
|
||||||
|
input[type="submit"] {
|
||||||
|
-webkit-appearance: button; /* 2 */
|
||||||
|
cursor: pointer; /* 3 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Re-set default cursor for disabled elements.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button[disabled],
|
||||||
|
html input[disabled] {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Address box sizing set to `content-box` in IE 8/9.
|
||||||
|
* 2. Remove excess padding in IE 8/9.
|
||||||
|
*/
|
||||||
|
|
||||||
|
input[type="checkbox"],
|
||||||
|
input[type="radio"] {
|
||||||
|
box-sizing: border-box; /* 1 */
|
||||||
|
padding: 0; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome.
|
||||||
|
* 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome
|
||||||
|
* (include `-moz` to future-proof).
|
||||||
|
*/
|
||||||
|
|
||||||
|
input[type="search"] {
|
||||||
|
-webkit-appearance: textfield; /* 1 */
|
||||||
|
-moz-box-sizing: content-box;
|
||||||
|
-webkit-box-sizing: content-box; /* 2 */
|
||||||
|
box-sizing: content-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove inner padding and search cancel button in Safari 5 and Chrome
|
||||||
|
* on OS X.
|
||||||
|
*/
|
||||||
|
|
||||||
|
input[type="search"]::-webkit-search-cancel-button,
|
||||||
|
input[type="search"]::-webkit-search-decoration {
|
||||||
|
-webkit-appearance: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove inner padding and border in Firefox 4+.
|
||||||
|
*/
|
||||||
|
|
||||||
|
button::-moz-focus-inner,
|
||||||
|
input::-moz-focus-inner {
|
||||||
|
border: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 1. Remove default vertical scrollbar in IE 8/9.
|
||||||
|
* 2. Improve readability and alignment in all browsers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
textarea {
|
||||||
|
overflow: auto; /* 1 */
|
||||||
|
vertical-align: top; /* 2 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ==========================================================================
|
||||||
|
Tables
|
||||||
|
========================================================================== */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove most spacing between table cells.
|
||||||
|
*/
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
}
|
||||||
310
main.css
Normal file
310
main.css
Normal file
@@ -0,0 +1,310 @@
|
|||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Oxygen';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: url(fonts/oxygen400.ttf) format('truetype');
|
||||||
|
src: url(fonts/oxygen400.woff) format('woff');
|
||||||
|
src: url(fonts/oxygen400.eot);
|
||||||
|
src: local('Oxygen'), local('Oxygen-Regular'), url(fonts/oxygen400.eot) format('embedded-opentype'), url(fonts/oxygen400.woff) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Oxygen';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: url(fonts/oxygen700.ttf) format('truetype');
|
||||||
|
src: url(fonts/oxygen700.woff) format('woff');
|
||||||
|
src: url(fonts/oxygen400.eot);
|
||||||
|
src: local('Oxygen Bold'), local('Oxygen-Bold'), url(fonts/oxygen700.eot) format('embedded-opentype'), url(fonts/oxygen700.woff) format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
html {
|
||||||
|
-webkit-tap-highlight-color: rgba(0,0,0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: Oxygen, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
min-width: 320px;
|
||||||
|
background-color: #ecebe6;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main {
|
||||||
|
padding: 10px;
|
||||||
|
max-width: 820px;
|
||||||
|
min-width: 320px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
text-align: center;
|
||||||
|
font-size: .9em;
|
||||||
|
line-height: 1.7;
|
||||||
|
color: #666;
|
||||||
|
border-top: 1px solid #ccc;
|
||||||
|
padding: 5px;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 0px;
|
||||||
|
left: 0px;
|
||||||
|
right: 0px;
|
||||||
|
z-index: -1;
|
||||||
|
min-width: 320px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.home {
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wins {
|
||||||
|
text-align: left;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
padding: 10px;
|
||||||
|
width: 80%;
|
||||||
|
margin: 20px auto;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.word {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.topnav {
|
||||||
|
overflow: hidden;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title, .titlenum {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.6em;
|
||||||
|
line-height: 1;
|
||||||
|
color: #faa51a;
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.title {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.titlenum {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav {
|
||||||
|
text-align: center;
|
||||||
|
margin: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav span {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0px 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #666;
|
||||||
|
border: 1px solid #faa51a;
|
||||||
|
line-height: 1.5;
|
||||||
|
margin: 0px 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timer {
|
||||||
|
color: #aaa;
|
||||||
|
position: absolute;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
right: 0px;
|
||||||
|
text-align: center;
|
||||||
|
padding-top: 10px;
|
||||||
|
min-width: 340px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
body {
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-o-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.squares table {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0px auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.squares tr {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.squares td {
|
||||||
|
text-align: center;
|
||||||
|
width: 20%;
|
||||||
|
height: 62px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.letters {
|
||||||
|
margin: 5px;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
font-size: 1.8em;
|
||||||
|
line-height: 1.8;
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
background-color: #FAA51A;
|
||||||
|
cursor: pointer
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.puznum {
|
||||||
|
font-size: 1em;
|
||||||
|
padding: 5px;
|
||||||
|
margin: 20px auto;
|
||||||
|
border: 1px solid #333;
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
padding: 0 10px;
|
||||||
|
margin-left: 5px;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
-khtml-user-select: none;
|
||||||
|
font-size: 1.1em;
|
||||||
|
line-height: 1.6;
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
background-color: #FAA51A;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer
|
||||||
|
}
|
||||||
|
|
||||||
|
.clues {
|
||||||
|
margin: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clues ul {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 0px;
|
||||||
|
list-style-type: none;
|
||||||
|
}
|
||||||
|
.clues li {
|
||||||
|
cursor: default;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clues li:nth-child(odd) {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.answer {
|
||||||
|
margin: 15px auto;
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 5px 5px;
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.answertext, .reset, .guess {
|
||||||
|
margin: 14px 20px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.reset {
|
||||||
|
color: #aaa;
|
||||||
|
padding: 5px 13px;
|
||||||
|
cursor: pointer;
|
||||||
|
position: absolute;
|
||||||
|
right: 8px;
|
||||||
|
top: 8px;
|
||||||
|
margin: 0px;
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.answertext {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 2em;
|
||||||
|
color: #faa51a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.correct {
|
||||||
|
color: #faa51a;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.squares h1 {
|
||||||
|
text-align: center;
|
||||||
|
margin: 20px;
|
||||||
|
font-size: 3em;
|
||||||
|
color: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.squares h3 {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.share i {
|
||||||
|
display: inline-block;
|
||||||
|
padding-top: 3px;
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
vertical-align: middle;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-image: url(data:image/png;base64,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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
|
||||||
|
body{
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.clues{
|
||||||
|
overflow: auto;
|
||||||
|
height: 140px;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav {
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.letters {
|
||||||
|
margin: 1px;
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.squares td{
|
||||||
|
height: 38px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BIN
media/ding.mp3
Normal file
BIN
media/ding.mp3
Normal file
Binary file not shown.
BIN
media/ding.wav
Normal file
BIN
media/ding.wav
Normal file
Binary file not shown.
BIN
media/flipscreenshot.png
Normal file
BIN
media/flipscreenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 81 KiB |
BIN
media/flipscreenshot_sm.png
Normal file
BIN
media/flipscreenshot_sm.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 59 KiB |
BIN
media/star.mp3
Normal file
BIN
media/star.mp3
Normal file
Binary file not shown.
BIN
media/star.wav
Normal file
BIN
media/star.wav
Normal file
Binary file not shown.
BIN
media/sweep.mp3
Normal file
BIN
media/sweep.mp3
Normal file
Binary file not shown.
BIN
media/sweep.wav
Normal file
BIN
media/sweep.wav
Normal file
Binary file not shown.
1
puzzles.js
Normal file
1
puzzles.js
Normal file
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user