|
|
|
var defaults = ["1/1", "2-1", "3*(3+2)", "5*3", "4+12", "0+16"];
|
|
|
|
|
|
|
|
var Card = (function() {
|
|
|
|
var self = Object.create({}, {
|
|
|
|
val: {
|
|
|
|
value: -1,
|
|
|
|
writable: true
|
|
|
|
},
|
|
|
|
id: {
|
|
|
|
value: -1,
|
|
|
|
writable: true
|
|
|
|
},
|
|
|
|
index: {
|
|
|
|
value: -1,
|
|
|
|
writable: true
|
|
|
|
},
|
|
|
|
isMatch: {
|
|
|
|
value: function(card) {
|
|
|
|
if (this.val == card.val) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return self;
|
|
|
|
})();
|
|
|
|
|
|
|
|
var Game = (function() {
|
|
|
|
var self = Object.create({}, {
|
|
|
|
cards: {
|
|
|
|
value: null,
|
|
|
|
enumarable: true,
|
|
|
|
writable: true
|
|
|
|
},
|
|
|
|
matches: {
|
|
|
|
value: 0,
|
|
|
|
writable: true
|
|
|
|
},
|
|
|
|
init: {
|
|
|
|
value: function(count) {
|
|
|
|
if(typeof count !== "number"){
|
|
|
|
log("Cards count must be an number");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.cards = new Array(count);
|
|
|
|
for (i = 0; i < this.cards.length / 2; i++) {
|
|
|
|
var card = Object.create(Card, {
|
|
|
|
val: {
|
|
|
|
value: i+1
|
|
|
|
},
|
|
|
|
id: {
|
|
|
|
value: i*2
|
|
|
|
}
|
|
|
|
});
|
|
|
|
card.index = card.id;
|
|
|
|
var card2 = Object.create(Card, {
|
|
|
|
val: {
|
|
|
|
value: i+1
|
|
|
|
},
|
|
|
|
id: {
|
|
|
|
value: card.index+1
|
|
|
|
}
|
|
|
|
});
|
|
|
|
card2.index = card2.id;
|
|
|
|
this.cards[card.index] = card;
|
|
|
|
this.cards[card2.index] = card2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
selected: {
|
|
|
|
value: null,
|
|
|
|
writable: true
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return self;
|
|
|
|
})();
|
|
|
|
|
|
|
|
function onTemplateLoadedCallback() {
|
|
|
|
$("select[name=count]").each(function(i, select) {
|
|
|
|
var min = $(select).data("min");
|
|
|
|
var max = $(select).data("max");
|
|
|
|
for(var i = min ; i <= max ; i=i+2) {
|
|
|
|
var option = $("<option/>");
|
|
|
|
option.val(i);
|
|
|
|
option.text(fr.njin.i18n.memory.parameters.option.cards(i));
|
|
|
|
$(select).append(option);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/*
|
|
|
|
$("#timeoutValue").text($("input[name=timeout]").val());
|
|
|
|
$("input[name=timeout]").change(function(){
|
|
|
|
$("#timeoutValue").text($(this).val());
|
|
|
|
});
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
|
|
|
|
function reloadApp(app) {
|
|
|
|
var cardsCount = parseInt(app.parameters.value("count"));
|
|
|
|
var timeout = parseInt(app.parameters.value("timeout"))*1000;
|
|
|
|
|
|
|
|
var scene = $("#scene");
|
|
|
|
var table = $("<div id='table'/>");
|
|
|
|
scene.empty();
|
|
|
|
scene.append(table);
|
|
|
|
|
|
|
|
var game = Object.create(Game);
|
|
|
|
game.init(cardsCount);
|
|
|
|
|
|
|
|
var rows = new Array(game.cards.length/2);
|
|
|
|
for(i = 0 ; i < game.cards.length/2 ; i++) {
|
|
|
|
var row = $("<div/>");
|
|
|
|
table.append(row);
|
|
|
|
rows[i] = row;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!app.onEdit)
|
|
|
|
app.utils.shuffle(game.cards);
|
|
|
|
|
|
|
|
for(i = 0 ; i < game.cards.length ; i++) {
|
|
|
|
(function(){
|
|
|
|
var card = game.cards[i];
|
|
|
|
var defaultValue = defaults[card.index]
|
|
|
|
card.index = i;
|
|
|
|
|
|
|
|
var pFrontTextKey = cardTextParameterKey(card, 0);
|
|
|
|
var pBackTextKey = cardTextParameterKey(card, 1);
|
|
|
|
window.card = card;
|
|
|
|
window.frontDisplayValue = app.parameters.value(pFrontTextKey) || "?";
|
|
|
|
window.backDisplayValue = app.parameters.value(pBackTextKey) || defaultValue;
|
|
|
|
|
|
|
|
var cardView = $(Mustache.render(cardTemplate, window));
|
|
|
|
rows[i%2].append(cardView);
|
|
|
|
cardView.data("card", card);
|
|
|
|
|
|
|
|
var checkbox = cardView.find("input[name='switch']");
|
|
|
|
function setSwicth(index) {
|
|
|
|
var val = app.parameters.value("#UsePicture"+cardParameterKey(card, index)) === "true";
|
|
|
|
var $p = cardView.find(".cards > div").eq(index);
|
|
|
|
if(val) {
|
|
|
|
$p.addClass("usePicture");
|
|
|
|
}else {
|
|
|
|
$p.removeClass("usePicture");
|
|
|
|
}
|
|
|
|
checkbox.eq(index).attr("checked", val);
|
|
|
|
}
|
|
|
|
checkbox.each(function(index) {
|
|
|
|
$(this).change(function() {
|
|
|
|
app.parameters.value("#UsePicture"+cardParameterKey(card, index), $(this).is(':checked'));
|
|
|
|
setSwicth(index);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
setSwicth(0);
|
|
|
|
setSwicth(1);
|
|
|
|
|
|
|
|
var dropzone = cardView.find(".dropzone");
|
|
|
|
|
|
|
|
function setPicture(index) {
|
|
|
|
var f = $.parseJSON(app.parameters.value("#Picture"+cardParameterKey(card, index)));
|
|
|
|
var pictureHolder = dropzone.eq(index).parent().find(">div:eq(0)");
|
|
|
|
if(f !== null) {
|
|
|
|
var $img = $('<img src="" class="uploadPic" title="" alt="" />').attr(f);
|
|
|
|
pictureHolder.empty();
|
|
|
|
pictureHolder.append($img);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
dropzone.each(function(index){
|
|
|
|
app.utils.droppable($(this), function(f) {
|
|
|
|
app.parameters.value("#Picture"+cardParameterKey(card, index), JSON.stringify(f));
|
|
|
|
setPicture(index);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
setPicture(0);
|
|
|
|
setPicture(1);
|
|
|
|
})();
|
|
|
|
}
|
|
|
|
if(!app.onEdit) {
|
|
|
|
$(".cards>div:first-child").click(function(){
|
|
|
|
var cardView = $(this).parent();
|
|
|
|
var card = cardView.parent().parent().data("card");
|
|
|
|
cardView.toggleClass("flip");
|
|
|
|
log("Flip card at index "+card.index+" w/ value "+card.val);
|
|
|
|
if(game.selected == null)
|
|
|
|
game.selected = card;
|
|
|
|
else{
|
|
|
|
var toCompare = game.selected;
|
|
|
|
log("Compare w/ card at index "+toCompare.index+" w/ value "+toCompare.val);
|
|
|
|
var isMatch = card.isMatch(toCompare);
|
|
|
|
if(!isMatch) {
|
|
|
|
var index = toCompare.index;
|
|
|
|
var otherCardView = rows[index%2].find(">div").eq(Math.floor(index/2)).find(".cards:eq(0)");
|
|
|
|
setTimeout(function(){
|
|
|
|
cardView.toggleClass("flip");
|
|
|
|
otherCardView.toggleClass("flip");
|
|
|
|
}, timeout);
|
|
|
|
}else{
|
|
|
|
game.matches++;
|
|
|
|
}
|
|
|
|
game.selected = null;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}else{
|
|
|
|
$(".card .text > div").each(function(i, e) {
|
|
|
|
var card = $(e).parent().parent().parent().parent().parent().parent().data("card");
|
|
|
|
var pKey = cardTextParameterKey(card, i);
|
|
|
|
e.contentEditable = true;
|
|
|
|
$(e).bind('blur keyup paste', function(){
|
|
|
|
app.parameters.value(pKey, $(this).text());
|
|
|
|
});
|
|
|
|
});
|
|
|
|
$(".card-container .actions button[role=flip]").click(function(){
|
|
|
|
var cardView = $(this).parent().parent().find(">.cards:eq(0)");
|
|
|
|
cardView.toggleClass("flip");
|
|
|
|
});
|
|
|
|
$(".card-container .actions button[role=flip]").click();
|
|
|
|
}
|
|
|
|
if(window.sankore)
|
|
|
|
window.sankore.enableDropOnWidget(app.onEdit);
|
|
|
|
}
|
|
|
|
|
|
|
|
function cardParameterKey(card, i) {
|
|
|
|
return "card"+card.id+(i%2==0 ? "Front":"Back");
|
|
|
|
}
|
|
|
|
|
|
|
|
function cardTextParameterKey(card, i) {
|
|
|
|
return cardParameterKey(card, i)+"Text";
|
|
|
|
}
|
|
|
|
|
|
|
|
function reloadCallback(parameter) {
|
|
|
|
if(parameter === undefined || parameter.key === "count")
|
|
|
|
reloadApp(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
$(document).ready(function(){
|
|
|
|
var callbacks = {
|
|
|
|
onTemplatesLoaded: onTemplateLoadedCallback,
|
|
|
|
onEdit: reloadApp,
|
|
|
|
onView: reloadApp
|
|
|
|
};
|
|
|
|
init(reloadCallback, {
|
|
|
|
toolbar: toolbarTemplate,
|
|
|
|
parameters: parametersTemplate
|
|
|
|
}, callbacks);
|
|
|
|
});
|