Files
old-flip/app.js

647 lines
14 KiB
JavaScript
Raw Normal View History

2013-03-07 22:25:52 -08:00
'use strict';
var App = {};
App.init = function(){
2013-12-08 09:39:43 +01:00
App.rijeci_serivce_url = "http://www.islambosna.ba/rijeci_backend/"
App.forum_service_url = "http://www.islambosna.ba/forum/"
// get the username from islambosna forum
2013-12-08 09:39:43 +01:00
/* $.get(App.forum_service_url + "rijeci_get_user.php",
function (data) {
App.username = data;
2013-12-08 09:39:43 +01:00
});*/
2013-12-09 05:27:26 +00:00
$('#hiddeniframe').load(App.forum_service_url + "rijeci_get_user.php" , function(){
App.username = $('#hiddeniframe').contents().find("#username").text();
});
App.name = 'IslamBosna Riječi';
2013-03-07 22:25:52 -08:00
$('.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;
App.puzzleNumber = puzNum;
2013-03-07 22:25:52 -08:00
$('.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: 0,
2013-03-07 22:25:52 -08:00
puzNum: 0,
data: null,
events: function(){
var events;
if(App.touch){
events = {
'touchend .shuffle' : 'doShuffle',
2013-03-12 17:22:48 -07:00
'touchend .sort' : 'doSort',
2013-03-07 22:25:52 -08:00
'touchend .hint' : 'doHint',
'touchend .square' : 'doSquare',
'touchend .reset': 'doReset',
'touchend .restart': 'doRestart',
'touchend .gohome': 'doHome',
2013-12-08 09:39:43 +01:00
'touchend .next': 'doNext',
'touchend .pogoci': 'doPogoci',
'touchend .pobjede': 'doPobjede'
2013-03-07 22:25:52 -08:00
}
} else {
events = {
'click .shuffle' : 'doShuffle',
2013-03-12 17:22:48 -07:00
'click .sort' : 'doSort',
2013-12-08 07:06:24 +01:00
'click .hint' : 'doHint',
2013-03-07 22:25:52 -08:00
'click .square' : 'doSquare',
'click .reset': 'doReset',
'click .restart': 'doRestart',
'click .gohome': 'doHome',
2013-12-08 09:39:43 +01:00
'click .next': 'doNext',
'click .pogoci': 'doPogoci',
'click .pobjede': 'doPobjede'
2013-03-07 22:25:52 -08:00
}
}
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];
this.total = puzzles[puzNum]['clues'].length;
2013-03-07 22:25:52 -08:00
var tpl = $('.puzzleTemplate').text();
var html = _.template(tpl, this.data);
this.$el.html(html);
this.startTimer();
2013-12-08 09:39:43 +01:00
},
doPogoci: function(e){
2013-12-08 09:59:42 +01:00
window.location = App.rijeci_serivce_url + "guesses";
2013-12-08 09:39:43 +01:00
},
doPobjede: function(e) {
2013-12-08 09:59:42 +01:00
window.location = App.rijeci_serivce_url + "solutions";
2013-12-08 09:39:43 +01:00
2013-03-07 22:25:52 -08:00
},
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){
2013-03-12 17:22:48 -07:00
App.puzzleView.redrawSquares('shuffle');
},
doSort: function(e){
App.puzzleView.redrawSquares('sort');
},
redrawSquares: function(order){
App.puzzleView.doReset();
var squares = puzzles[App.puzzleView.puzNum]['squares'];
if(order == 'sort'){
squares.sort();
} else {
squares = shuffle(squares);
}
var hidden = [];
$('.square:hidden').each(function(){
hidden.push($(this).text());
});
hidden.sort();
for(var i = 0; i < $('.square').length; i++){
$('.square').eq(i).text(squares[i]);
var h = hidden.indexOf(squares[i]);
if(h !== -1){
delete hidden[h];
$('.square').eq(i).hide();
} else {
$('.square').eq(i).show();
}
}
2013-03-07 22:25:52 -08:00
},
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);
2013-03-12 17:22:48 -07:00
if(a.length > 10){
2013-03-07 22:25:52 -08:00
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();
});
var definition = $clue.find('.def').text();
var guess = $.param({ username: App.username , definition: definition });
2013-12-08 09:39:43 +01:00
$.post(App.rijeci_serivce_url + "guesses.json", guess , function (data) {
} );
2013-03-07 22:25:52 -08:00
$('.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');
var solution = $.param({ username: App.username , number: App.puzzleNumber, time: $('.timer').text() });
$.post(App.rijeci_serivce_url + "solutions.json", solution , function (data) {
alert(data);
} );
2013-03-07 22:25:52 -08:00
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
2013-03-12 18:26:32 -07:00
function formatTime(seconds){
2013-03-07 22:25:52 -08:00
2013-03-12 18:26:32 -07:00
var hours = Math.floor(seconds / 3600);
seconds -= hours * 3600;
var minutes = Math.floor(seconds / 60);
seconds -= minutes * 60;
2013-03-07 22:25:52 -08:00
2013-03-12 18:26:32 -07:00
if (hours < 10) {hours = '0' + hours;}
if (minutes < 10) {minutes = '0' + minutes;}
if (seconds < 10) {seconds = '0' + seconds;}
if(hours == '00'){
hours = '';
} else {
hours = hours + ':';
}
return hours + minutes + ':' + seconds;
2013-03-07 22:25:52 -08:00
}
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;
}