/**
|
|
* Created by ohayon_m on 17/08/15.
|
|
*/
|
|
|
|
define(["activity/sample-ressources", "activity/palettes/template-palette", "activity/palettes/size-palette", "activity/lz-string", "sugar-web/graphics/journalchooser", 'sugar-web/datastore'], function (SampleRessources, templatePalette, sizePalette, lzString, chooser, datastore) {
|
|
|
|
var FOUND_COLOR = "#84f060";
|
|
var MODE_CLASSIC = "classic";
|
|
var MODE_SPLITTED = "splitted";
|
|
var MODE_EQUAL = "equal";
|
|
var MODE_NON_EQUAL = "non_equal";
|
|
var INLINE_RES = "#inline#";
|
|
|
|
var TEMPLATE_SUMS = {
|
|
name: "Addition", icon: "addition.svg", cards: [
|
|
[{text: "3+4"}, {text: "7"}],
|
|
[{text: "5+5"}, {text: "10"}],
|
|
[{text: "5+6"}, {text: "11"}],
|
|
[{text: "4+4"}, {text: "8"}],
|
|
[{text: "4+5"}, {text: "9"}],
|
|
[{text: "3+3"}, {text: "6"}],
|
|
[{text: "2+2"}, {text: "4"}],
|
|
[{text: "1+1"}, {text: "2"}],
|
|
[{text: "1+2"}, {text: "3"}],
|
|
[{text: "9+9"}, {text: "18"}],
|
|
[{text: "10+9"}, {text: "19"}],
|
|
[{text: "8+8"}, {text: "16"}],
|
|
[{text: "8+9"}, {text: "17"}],
|
|
[{text: "7+7"}, {text: "14"}],
|
|
[{text: "7+8"}, {text: "15"}],
|
|
[{text: "6+6"}, {text: "12"}]
|
|
],
|
|
mode: MODE_SPLITTED
|
|
};
|
|
var TEMPLATE_LETTERS = {
|
|
name: "Letters", icon: "letters.svg", cards: [
|
|
[{text: "A"}, {text: "a"}],
|
|
[{text: "B"}, {text: "b"}],
|
|
[{text: "C"}, {text: "c"}],
|
|
[{text: "D"}, {text: "d"}],
|
|
[{text: "E"}, {text: "e"}],
|
|
[{text: "F"}, {text: "f"}],
|
|
[{text: "G"}, {text: "g"}],
|
|
[{text: "H"}, {text: "h"}],
|
|
[{text: "I"}, {text: "i"}],
|
|
[{text: "J"}, {text: "j"}],
|
|
[{text: "K"}, {text: "k"}],
|
|
[{text: "L"}, {text: "l"}],
|
|
[{text: "M"}, {text: "m"}],
|
|
[{text: "N"}, {text: "n"}],
|
|
[{text: "O"}, {text: "o"}],
|
|
[{text: "P"}, {text: "p"}],
|
|
[{text: "Q"}, {text: "q"}],
|
|
[{text: "R"}, {text: "r"}],
|
|
[{text: "S"}, {text: "s"}],
|
|
[{text: "T"}, {text: "t"}],
|
|
[{text: "U"}, {text: "u"}],
|
|
[{text: "V"}, {text: "v"}],
|
|
[{text: "W"}, {text: "w"}],
|
|
[{text: "X"}, {text: "x"}],
|
|
[{text: "Y"}, {text: "y"}],
|
|
[{text: "Z"}, {text: "z"}]
|
|
],
|
|
mode: MODE_SPLITTED
|
|
};
|
|
|
|
var TEMPLATE_SOUNDS = {
|
|
name: "Sounds", icon: "sounds.svg", cards: [
|
|
[
|
|
{image: INLINE_RES + "drumkit1_b", sound: INLINE_RES + "beat1_a"},
|
|
{image: INLINE_RES + "drumkit1_b", sound: INLINE_RES + "beat1_a"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit2_b", sound: INLINE_RES + "beat1_b"},
|
|
{image: INLINE_RES + "drumkit2_b", sound: INLINE_RES + "beat1_b"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit3_b", sound: INLINE_RES + "beat1_c"},
|
|
{image: INLINE_RES + "drumkit3_b", sound: INLINE_RES + "beat1_c"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit4_b", sound: INLINE_RES + "beat8"},
|
|
{image: INLINE_RES + "drumkit4_b", sound: INLINE_RES + "beat8"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit5_b", sound: INLINE_RES + "beat10"},
|
|
{image: INLINE_RES + "drumkit5_b", sound: INLINE_RES + "beat10"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit6_b", sound: INLINE_RES + "beat3"},
|
|
{image: INLINE_RES + "drumkit6_b", sound: INLINE_RES + "beat3"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit7_b", sound: INLINE_RES + "beat4"},
|
|
{image: INLINE_RES + "drumkit7_b", sound: INLINE_RES + "beat4"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit8_b", sound: INLINE_RES + "beat14"},
|
|
{image: INLINE_RES + "drumkit8_b", sound: INLINE_RES + "beat14"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit9_b", sound: INLINE_RES + "beat6_2"},
|
|
{image: INLINE_RES + "drumkit9_b", sound: INLINE_RES + "beat6_2"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit10_b", sound: INLINE_RES + "beat2"},
|
|
{image: INLINE_RES + "drumkit10_b", sound: INLINE_RES + "beat2"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit11_b", sound: INLINE_RES + "beat16"},
|
|
{image: INLINE_RES + "drumkit11_b", sound: INLINE_RES + "beat16"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "drumkit12_b", sound: INLINE_RES + "beat17"},
|
|
{image: INLINE_RES + "drumkit12_b", sound: INLINE_RES + "beat17"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar1_2", sound: INLINE_RES + "bending_a"},
|
|
{image: INLINE_RES + "guitar1_2", sound: INLINE_RES + "bending_a"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar2_2", sound: INLINE_RES + "bending_b"},
|
|
{image: INLINE_RES + "guitar2_2", sound: INLINE_RES + "bending_b"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar3_2", sound: INLINE_RES + "flashcomp2a"},
|
|
{image: INLINE_RES + "guitar3_2", sound: INLINE_RES + "flashcomp2a"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar4_2", sound: INLINE_RES + "flashcomp2b"},
|
|
{image: INLINE_RES + "guitar4_2", sound: INLINE_RES + "flashcomp2b"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar5_2", sound: INLINE_RES + "gedaempft"},
|
|
{image: INLINE_RES + "guitar5_2", sound: INLINE_RES + "gedaempft"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar6_2", sound: INLINE_RES + "ungedaempft"},
|
|
{image: INLINE_RES + "guitar6_2", sound: INLINE_RES + "ungedaempft"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar7_2", sound: INLINE_RES + "jimi4"},
|
|
{image: INLINE_RES + "guitar7_2", sound: INLINE_RES + "jimi4"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar8_2", sound: INLINE_RES + "git_hit1"},
|
|
{image: INLINE_RES + "guitar8_2", sound: INLINE_RES + "git_hit1"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar9_2", sound: INLINE_RES + "git_hit4"},
|
|
{image: INLINE_RES + "guitar9_2", sound: INLINE_RES + "git_hit4"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar10_2", sound: INLINE_RES + "jimi1"},
|
|
{image: INLINE_RES + "guitar10_2", sound: INLINE_RES + "jimi1"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar11_2", sound: INLINE_RES + "flasholet4"},
|
|
{image: INLINE_RES + "guitar11_2", sound: INLINE_RES + "flasholet4"}
|
|
],
|
|
[
|
|
{image: INLINE_RES + "guitar12_2", sound: INLINE_RES + "guitcello"},
|
|
{image: INLINE_RES + "guitar12_2", sound: INLINE_RES + "guitcello"}
|
|
]
|
|
],
|
|
mode: MODE_CLASSIC
|
|
};
|
|
|
|
var MemorizeApp = {
|
|
strings: {add: "Add", update: "Update", remove: "Remove"},
|
|
ui: {},
|
|
templates: [TEMPLATE_SUMS, TEMPLATE_LETTERS, TEMPLATE_SOUNDS],
|
|
isHost: false,
|
|
editor: {pairMode: MODE_EQUAL, card1: {}, card2: {}, selectedPair: -1},
|
|
game: {
|
|
template: TEMPLATE_LETTERS,
|
|
multiplayer: false,
|
|
selectedCards: [],
|
|
mode: undefined,
|
|
cards: [],
|
|
currentPlayer: "",
|
|
players: [],
|
|
size: 4
|
|
},
|
|
computeCards: computeCards,
|
|
inEditMode: false,
|
|
shareActivity: shareActivity,
|
|
initUI: initUI,
|
|
drawGame: drawGame,
|
|
onUsersListChanged: onUsersListChanged,
|
|
onDataReceived: onDataReceived
|
|
};
|
|
|
|
function shuffle(array) {
|
|
var currentIndex = array.length, temporaryValue, randomIndex;
|
|
|
|
while (0 !== currentIndex) {
|
|
randomIndex = Math.floor(Math.random() * currentIndex);
|
|
currentIndex -= 1;
|
|
|
|
temporaryValue = array[currentIndex];
|
|
array[currentIndex] = array[randomIndex];
|
|
array[randomIndex] = temporaryValue;
|
|
}
|
|
|
|
return array;
|
|
}
|
|
|
|
|
|
function shareActivity(isHost) {
|
|
if (!MemorizeApp.presence.isConnected()) {
|
|
return;
|
|
}
|
|
MemorizeApp.inEditMode = false;
|
|
|
|
leaveEditMode();
|
|
disableEditMode();
|
|
|
|
MemorizeApp.game.multiplayer = true;
|
|
MemorizeApp.isHost = isHost;
|
|
MemorizeApp.me = MemorizeApp.presence.userInfo;
|
|
MemorizeApp.game.currentPlayer = MemorizeApp.me.networkId;
|
|
MemorizeApp.ui.gamePlayers.style.display = "block";
|
|
}
|
|
|
|
|
|
function computeCards(ignoreSave) {
|
|
MemorizeApp.game.cards = [];
|
|
MemorizeApp.game.selectedCards = [];
|
|
|
|
if (!MemorizeApp.game.template) {
|
|
return;
|
|
}
|
|
MemorizeApp.game.mode = MemorizeApp.game.template.mode;
|
|
|
|
var shuffledTemplate = {name: MemorizeApp.game.template.name, cards: []};
|
|
shuffledTemplate.cards = JSON.parse(JSON.stringify(shuffle(MemorizeApp.game.template.cards)));
|
|
|
|
var cardsNumber = 0;
|
|
if (MemorizeApp.game.size % 2 == 0) {
|
|
cardsNumber = MemorizeApp.game.size * MemorizeApp.game.size;
|
|
} else {
|
|
cardsNumber = MemorizeApp.game.size * MemorizeApp.game.size - 2;
|
|
}
|
|
|
|
if (MemorizeApp.game.mode == MODE_CLASSIC) {
|
|
var cards = [];
|
|
for (var i = 0; i < shuffledTemplate.cards.length && i < cardsNumber / 2; i++) {
|
|
var card1 = shuffledTemplate.cards[i][0];
|
|
var card2 = shuffledTemplate.cards[i][1];
|
|
|
|
card1.id = i;
|
|
card2.id = i;
|
|
|
|
cards.push(card1);
|
|
cards.push(card2);
|
|
}
|
|
MemorizeApp.game.cards = shuffle(cards);
|
|
}
|
|
|
|
if (MemorizeApp.game.mode == MODE_SPLITTED) {
|
|
var cards1 = [];
|
|
var cards2 = [];
|
|
|
|
for (var i = 0; i < cardsNumber / 2 && i < shuffledTemplate.cards.length; i++) {
|
|
var card1 = shuffledTemplate.cards[i][0];
|
|
var card2 = shuffledTemplate.cards[i][1];
|
|
|
|
card1.id = i;
|
|
card2.id = i;
|
|
|
|
cards1.push(card1);
|
|
cards2.push(card2);
|
|
}
|
|
|
|
var shuffledCard1 = shuffle(cards1);
|
|
for (var i = 0; i < shuffledCard1.length; i++) {
|
|
MemorizeApp.game.cards.push(shuffledCard1[i]);
|
|
}
|
|
|
|
var shuffledCard2 = shuffle(cards2);
|
|
for (var i = 0; i < shuffledCard2.length; i++) {
|
|
MemorizeApp.game.cards.push(shuffledCard2[i]);
|
|
}
|
|
}
|
|
if (!ignoreSave) saveGame();
|
|
}
|
|
|
|
|
|
function resizeTextInsideTextCardDivs() {
|
|
var elements = document.getElementsByClassName('textCard');
|
|
for (var i = 0; i < elements.length; i++) {
|
|
var el = elements[i];
|
|
while (el.scrollHeight > el.offsetHeight) {
|
|
el.style.fontSize = parseInt(el.style.fontSize) - 1 + "px";
|
|
}
|
|
while (el.scrollWidth > el.offsetWidth) {
|
|
el.style.fontSize = parseInt(el.style.fontSize) - 1 + "px";
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
function generateCardDiv(card, minSize) {
|
|
if (card.image) {
|
|
if (card.image.indexOf(INLINE_RES) == 0) {
|
|
card.image = SampleRessources[card.image.slice(INLINE_RES.length)];
|
|
}
|
|
var div = document.createElement("div");
|
|
div.style.background = "url('" + card.image + "')";
|
|
div.style.backgroundRepeat = "no-repeat";
|
|
div.style.backgroundSize = "contain";
|
|
div.style.webkitBackgroundSize = "contain";
|
|
div.style.backgroundPosition = "center center";
|
|
div.style.height = minSize + "px";
|
|
div.style.width = minSize + "px";
|
|
|
|
return div;
|
|
}
|
|
|
|
if (card.text) {
|
|
if (card.text.indexOf(INLINE_RES) == 0) {
|
|
card.text = SampleRessources[card.text.slice(INLINE_RES.length)];
|
|
}
|
|
var div = document.createElement("div");
|
|
div.className = "textCard";
|
|
div.style.textAlign = "center";
|
|
div.style.display = "block";
|
|
div.innerHTML = card.text;
|
|
div.style.lineHeight = minSize + "px";
|
|
div.style.fontSize = minSize + 'px';
|
|
div.style.color = "#000";
|
|
div.style.width = minSize + "px";
|
|
div.style.height = minSize + "px";
|
|
|
|
return div;
|
|
}
|
|
}
|
|
|
|
function createAudioContextIfMissing() {
|
|
if (MemorizeApp.context) {
|
|
return;
|
|
}
|
|
var context = window.AudioContext ||
|
|
window.webkitAudioContext ||
|
|
window.mozAudioContext ||
|
|
window.oAudioContext ||
|
|
window.msAudioContext;
|
|
|
|
if (!context) {
|
|
return;
|
|
}
|
|
context = new context();
|
|
MemorizeApp.context = context;
|
|
|
|
var buffer = context.createBuffer(1, 1, 22050);
|
|
var source = context.createBufferSource();
|
|
MemorizeApp.source = source;
|
|
source.buffer = buffer;
|
|
|
|
source.connect(context.destination);
|
|
source.start(0);
|
|
}
|
|
|
|
function createFullCardDiv(i, minSize, card) {
|
|
var fullCardDiv = document.createElement("div");
|
|
fullCardDiv.cardPosition = i;
|
|
fullCardDiv.webkitPerspective = "500px";
|
|
fullCardDiv.perspective = "500px";
|
|
fullCardDiv.style.border = "3px solid #fff";
|
|
fullCardDiv.style.borderRadius = "6px";
|
|
fullCardDiv.style.margin = "5px";
|
|
fullCardDiv.style.webkitTransition = "transform 0.5s";
|
|
fullCardDiv.style.transition = "transform 0.5s";
|
|
|
|
fullCardDiv.style.transitionDuration = "0.5s";
|
|
fullCardDiv.style.webkitTransitionDuration = "0.5s";
|
|
|
|
fullCardDiv.style.transformStyle = "preserve-3d";
|
|
fullCardDiv.style.webkitTransformStyle = "preserve-3d";
|
|
fullCardDiv.style.position = "relative";
|
|
fullCardDiv.style.float = "left";
|
|
fullCardDiv.style.height = minSize + "px";
|
|
fullCardDiv.style.width = minSize + "px";
|
|
if (card.solved) {
|
|
fullCardDiv.style.webkitTransform = "rotateY(180deg)";
|
|
fullCardDiv.style.transform = "rotateY(180deg)";
|
|
} else {
|
|
fullCardDiv.style.webkitTransform = "";
|
|
fullCardDiv.style.transform = "";
|
|
}
|
|
if (MemorizeApp.game.selectedCards.length != 0) {
|
|
if (MemorizeApp.game.selectedCards[0].cardPosition == fullCardDiv.cardPosition) {
|
|
fullCardDiv.style.webkitTransform = "";
|
|
fullCardDiv.style.transform = "";
|
|
}
|
|
}
|
|
|
|
return fullCardDiv;
|
|
}
|
|
|
|
function createFrontDiv(i, middle, minSize) {
|
|
var front = document.createElement("div");
|
|
if (MemorizeApp.game.mode == MODE_CLASSIC) {
|
|
front.style.background = "#777";
|
|
}
|
|
if (MemorizeApp.game.mode == MODE_SPLITTED) {
|
|
if (i < middle) {
|
|
front.style.background = "#777 url(icons/number1.svg)";
|
|
} else {
|
|
front.style.background = "#777 url(icons/number2.svg)";
|
|
}
|
|
}
|
|
front.zIndex = 2;
|
|
front.style.borderRadius = "6px";
|
|
front.style.webkitBackfaceVisibility = "hidden";
|
|
front.style.backfaceVisibility = "hidden";
|
|
|
|
front.style.backgroundPosition = "center center";
|
|
front.style.backgroundRepeat = "no-repeat";
|
|
front.style.height = minSize + "px";
|
|
front.style.position = "absolute";
|
|
front.style.top = "0px";
|
|
front.style.left = "0px";
|
|
front.style.width = minSize + "px";
|
|
|
|
return front;
|
|
}
|
|
|
|
function createDiv(i, minSize, card) {
|
|
var div = document.createElement("div");
|
|
var generatedDiv = generateCardDiv(MemorizeApp.game.cards[i], minSize);
|
|
div.appendChild(generatedDiv);
|
|
div.style.height = minSize + "px";
|
|
div.style.webkitBackfaceVisibility = "hidden";
|
|
div.style.backfaceVisibility = "hidden";
|
|
div.style.mozBackfaceVisibility = "hidden";
|
|
div.style.position = "absolute";
|
|
div.style.webkitTransform = "rotateY(180deg)";
|
|
div.style.transform = "rotateY(180deg)";
|
|
div.style.top = "0px";
|
|
div.style.left = "0px";
|
|
div.style.borderRadius = "6px";
|
|
div.style.width = minSize + "px";
|
|
div.style.background = "#fff";
|
|
|
|
if (card.solved) {
|
|
div.style.backgroundColor = FOUND_COLOR;
|
|
}
|
|
|
|
return div;
|
|
}
|
|
|
|
function cardClick(div, fromMe, user) {
|
|
var middle = MemorizeApp.game.cards.length / 2;
|
|
|
|
createAudioContextIfMissing();
|
|
var t = div;
|
|
|
|
if (t.card.solved || MemorizeApp.game.selectedCards.length == 2) {
|
|
return;
|
|
}
|
|
|
|
if (MemorizeApp.game.mode == MODE_SPLITTED && MemorizeApp.game.selectedCards.length == 1) {
|
|
if (t.cardPosition < middle && MemorizeApp.game.selectedCards[0].cardPosition < middle) {
|
|
return;
|
|
}
|
|
if (t.cardPosition >= middle && MemorizeApp.game.selectedCards[0].cardPosition >= middle) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
t.style.webkitTransform = "rotateY(180deg)";
|
|
t.style.transform = "rotateY(180deg)";
|
|
|
|
if(MemorizeApp.game.selectedCards.length == 1 && MemorizeApp.game.selectedCards[0] == t){
|
|
return;
|
|
}
|
|
else{
|
|
MemorizeApp.game.selectedCards.push(t);
|
|
}
|
|
|
|
if (t.card.sound) {
|
|
if (t.card.sound.indexOf(INLINE_RES) == 0) {
|
|
t.card.sound = SampleRessources[t.card.sound.slice(INLINE_RES.length)];
|
|
}
|
|
var b64 = t.card.sound.split("base64,")[1];
|
|
b64 = Base64Binary.decodeArrayBuffer(btoa(atob(b64)));
|
|
|
|
if (MemorizeApp.context) {
|
|
MemorizeApp.context.decodeAudioData(b64, function (buffer) {
|
|
var source = MemorizeApp.context.createBufferSource(); // creates a sound source
|
|
if (MemorizeApp.source) {
|
|
try {
|
|
MemorizeApp.source.stop(0);
|
|
} catch (e) {
|
|
}
|
|
}
|
|
MemorizeApp.source = source;
|
|
source.buffer = buffer;
|
|
source.connect(MemorizeApp.context.destination);
|
|
try {
|
|
source.start(0);
|
|
} catch (e) {
|
|
|
|
}
|
|
}, function (err) {
|
|
console.log("err(decodeAudioData): " + err);
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
if (MemorizeApp.game.selectedCards.length == 1) {
|
|
return;
|
|
}
|
|
|
|
if (MemorizeApp.game.selectedCards[0].card.id == t.card.id) {
|
|
MemorizeApp.game.selectedCards[0].card.solved = true;
|
|
t.card.solved = true;
|
|
|
|
for (var i = 0; i < MemorizeApp.game.players.length; i++) {
|
|
if (MemorizeApp.game.players[i].networkId == user.networkId) {
|
|
MemorizeApp.game.players[i].score = MemorizeApp.game.players[i].score + 1;
|
|
}
|
|
}
|
|
|
|
displayUsersAndScores();
|
|
var div1 = MemorizeApp.game.selectedCards[0].resultDiv;
|
|
var div2 = t.resultDiv;
|
|
setTimeout(function () {
|
|
div1.style.backgroundColor = FOUND_COLOR;
|
|
div2.style.backgroundColor = FOUND_COLOR;
|
|
}, 1000);
|
|
|
|
MemorizeApp.game.selectedCards = [];
|
|
saveGame();
|
|
return;
|
|
}
|
|
|
|
MemorizeApp.game.currentPlayer = "";
|
|
|
|
setTimeout(function () {
|
|
try {
|
|
t.style.webkitTransform = "";
|
|
t.style.transform = "";
|
|
MemorizeApp.game.selectedCards[0].style.webkitTransform = "";
|
|
MemorizeApp.game.selectedCards[0].style.transform = "";
|
|
MemorizeApp.game.selectedCards = [];
|
|
|
|
setTimeout(function () {
|
|
if (fromMe) {
|
|
for (var i = 0; i < MemorizeApp.game.players.length; i++) {
|
|
if (MemorizeApp.game.players[i].online && MemorizeApp.game.players[i].networkId != MemorizeApp.me.networkId) {
|
|
MemorizeApp.game.currentPlayer = MemorizeApp.game.players[i].networkId;
|
|
sendMessage({
|
|
action: "updateCurrentPlayer",
|
|
currentPlayer: MemorizeApp.game.currentPlayer
|
|
});
|
|
displayUsersAndScores();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}, 300);
|
|
|
|
|
|
} catch (e) {
|
|
}
|
|
}, 2000)
|
|
|
|
}
|
|
|
|
function saveGame() {
|
|
MemorizeApp.activity.getDatastoreObject().setDataAsText(JSON.stringify({game: MemorizeApp.game}));
|
|
MemorizeApp.activity.getDatastoreObject().save(function (error, meta) {
|
|
});
|
|
}
|
|
|
|
function onCardClick() {
|
|
if (MemorizeApp.game.multiplayer) {
|
|
if (MemorizeApp.game.currentPlayer != MemorizeApp.me.networkId) {
|
|
return;
|
|
}
|
|
sendMessage({action: "cardClick", position: this.cardPosition});
|
|
if (MemorizeApp.game.players.length == 0 || MemorizeApp.game.players.length == 1) {
|
|
cardClick(this, true);
|
|
}
|
|
for (var i = 0; i < MemorizeApp.game.players.length; i++) {
|
|
if (MemorizeApp.game.players[i].networkId == MemorizeApp.me.networkId) {
|
|
cardClick(this, true, MemorizeApp.game.players[i]);
|
|
}
|
|
}
|
|
} else {
|
|
cardClick(this, true);
|
|
}
|
|
|
|
}
|
|
|
|
function drawGame() {
|
|
if (MemorizeApp.editor.pairMode == MODE_EQUAL) {
|
|
MemorizeApp.ui.gameEditorInsertModeButton.style.backgroundImage = "url(icons/pair-non-equals.svg)"
|
|
} else {
|
|
MemorizeApp.ui.gameEditorInsertModeButton.style.backgroundImage = "url(icons/pair-equals.svg)"
|
|
}
|
|
if (MemorizeApp.game.template.mode == MODE_CLASSIC) {
|
|
MemorizeApp.ui.gameEditorPlayModeButton.style.backgroundImage = "url(icons/grouped_game1.svg)";
|
|
} else {
|
|
MemorizeApp.ui.gameEditorPlayModeButton.style.backgroundImage = "url(icons/grouped_game2.svg)";
|
|
}
|
|
|
|
MemorizeApp.ui.gameSizeButton.style.background = "url(icons/" + MemorizeApp.game.size + "x" + MemorizeApp.game.size + ".svg)";
|
|
MemorizeApp.ui.gameTemplatesButton.style.backgroundImage = "url(icons/" + MemorizeApp.game.template.icon + ")";
|
|
|
|
MemorizeApp.ui.gameGrid.innerHTML = "";
|
|
|
|
var gameDiv = MemorizeApp.ui.gameGrid;
|
|
var width = document.body.clientWidth;
|
|
var height = document.body.clientHeight;
|
|
var middle = MemorizeApp.game.cards.length / 2;
|
|
|
|
var minSize = height;
|
|
if (width < height) {
|
|
minSize = width;
|
|
}
|
|
minSize = minSize - (56 + 20) * 3;
|
|
minSize = minSize / MemorizeApp.game.size;
|
|
|
|
for (var i = 0; i < MemorizeApp.game.cards.length; i++) {
|
|
var card = MemorizeApp.game.cards[i];
|
|
|
|
if (i % MemorizeApp.game.size == 0 && i > 0) {
|
|
var div = document.createElement("div");
|
|
div.style.clear = "both";
|
|
gameDiv.appendChild(div);
|
|
}
|
|
|
|
var fullCardDiv = createFullCardDiv(i, minSize, card);
|
|
var front = createFrontDiv(i, middle, minSize);
|
|
var div = createDiv(i, minSize, card);
|
|
|
|
fullCardDiv.card = card;
|
|
fullCardDiv.resultDiv = div;
|
|
|
|
var clickEvent = "click";
|
|
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
|
|
clickEvent = "touchend";
|
|
}
|
|
fullCardDiv.addEventListener(clickEvent, onCardClick, false);
|
|
fullCardDiv.appendChild(div);
|
|
fullCardDiv.appendChild(front);
|
|
gameDiv.appendChild(fullCardDiv);
|
|
}
|
|
|
|
gameDiv.style.width = parseInt(minSize + 10) * parseInt(MemorizeApp.game.size + 1) + "px";
|
|
gameDiv.style.marginLeft = "auto";
|
|
gameDiv.style.marginRight = "auto";
|
|
|
|
resizeTextInsideTextCardDivs();
|
|
}
|
|
|
|
function onDataReceived(data) {
|
|
if (data.user.networkId == MemorizeApp.me.networkId) {
|
|
return;
|
|
}
|
|
|
|
data.content = JSON.parse(lzString.decompressFromUTF16(data.content));
|
|
|
|
if (data.content.action == "updateCurrentPlayer") {
|
|
MemorizeApp.game.currentPlayer = data.content.currentPlayer;
|
|
displayUsersAndScores();
|
|
}
|
|
|
|
if (data.content.action == "updateGame") {
|
|
MemorizeApp.game = data.content.game;
|
|
MemorizeApp.ui.gameSizeButton.style.background = "url(icons/" + MemorizeApp.game.size + "x" + MemorizeApp.game.size + ".svg)";
|
|
MemorizeApp.ui.gameTemplatesButton.style.backgroundImage = "url(icons/" + MemorizeApp.game.template.icon + ")";
|
|
MemorizeApp.drawGame();
|
|
displayUsersAndScores();
|
|
saveGame();
|
|
}
|
|
|
|
if (data.content.action == "cardClick") {
|
|
var notFilteredCards = MemorizeApp.ui.gameGrid.childNodes;
|
|
var cards = [];
|
|
|
|
for (var i = 0; i < notFilteredCards.length; i++) {
|
|
if (!notFilteredCards[i].style.clear || notFilteredCards[i].style.clear == "") {
|
|
cards.push(notFilteredCards[i]);
|
|
}
|
|
}
|
|
|
|
for (var i = 0; i < MemorizeApp.game.players.length; i++) {
|
|
if (MemorizeApp.game.players[i].networkId == data.user.networkId) {
|
|
cardClick(cards[data.content.position], false, MemorizeApp.game.players[i]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function sendMessage(content) {
|
|
if (!MemorizeApp.game.multiplayer) {
|
|
return;
|
|
}
|
|
var sharedId = window.top.sugar.environment.sharedId;
|
|
if (!sharedId) {
|
|
sharedId = MemorizeApp.presence.getSharedInfo().id
|
|
}
|
|
|
|
MemorizeApp.presence.sendMessage(sharedId, {
|
|
user: MemorizeApp.presence.getUserInfo(),
|
|
content: lzString.compressToUTF16(JSON.stringify(content))
|
|
});
|
|
}
|
|
|
|
function displayUsersAndScores() {
|
|
if (MemorizeApp.game.players.length == 0) {
|
|
return;
|
|
}
|
|
var div = document.createElement("div");
|
|
|
|
var myTurn = false;
|
|
if (MemorizeApp.game.currentPlayer == MemorizeApp.me.networkId) {
|
|
myTurn = true;
|
|
}
|
|
var canPlay = document.createElement("div");
|
|
canPlay.style.float = "left";
|
|
canPlay.style.marginTop = "10px";
|
|
canPlay.style.width = "30px";
|
|
canPlay.style.marginRight = "3px";
|
|
canPlay.style.borderRight = "1px solid #fff";
|
|
canPlay.style.height = "30px";
|
|
if (myTurn) {
|
|
canPlay.style.backgroundImage = "url(icons/play.svg)"
|
|
} else {
|
|
canPlay.style.backgroundImage = "url(icons/sandclock.svg)"
|
|
}
|
|
canPlay.style.backgroundPosition = "center center";
|
|
canPlay.style.backgroundRepeat = "no-repeat";
|
|
div.appendChild(canPlay);
|
|
|
|
for (var i = 0; i < MemorizeApp.game.players.length; i++) {
|
|
var player = MemorizeApp.game.players[i];
|
|
var d = document.createElement("div");
|
|
d.style.paddingTop = "15px";
|
|
var xoColor = generateXOLogoWithColor(player.colorvalue);
|
|
var scores = "";
|
|
for (var j = 0; j < player.score; j++) {
|
|
scores += '<img style="height:13px;" src="icons/pair-add.svg">';
|
|
}
|
|
d.innerHTML = '<img style="height:23px; vertical-align:middle; " src="' + xoColor + '"><span style="color:#fff;">' + player.name + "</span> " + scores;
|
|
d.style.float = "left";
|
|
if (i != 0) {
|
|
d.style.marginLeft = "10px";
|
|
}
|
|
div.appendChild(d);
|
|
}
|
|
MemorizeApp.ui.gamePlayers.innerHTML = "";
|
|
MemorizeApp.ui.gamePlayers.appendChild(div);
|
|
}
|
|
|
|
function onUsersListChanged(users) {
|
|
for (var i = 0; i < MemorizeApp.game.players.length; i++) {
|
|
MemorizeApp.game.players[i].online = false;
|
|
}
|
|
|
|
if (!MemorizeApp.hasLoadedMultiplayer && users.length >= 3) {
|
|
document.getElementById("stop-button").click();
|
|
return;
|
|
}
|
|
|
|
MemorizeApp.hasLoadedMultiplayer = true;
|
|
|
|
|
|
if (users.length == 1) {
|
|
MemorizeApp.isHost = true;
|
|
MemorizeApp.game.currentPlayer = MemorizeApp.me.networkId;
|
|
MemorizeApp.game.selectedCards = [];
|
|
drawGame();
|
|
displayUsersAndScores();
|
|
return;
|
|
}
|
|
|
|
for (var i = 0; i < users.length; i++) {
|
|
var found = false;
|
|
for (var j = 0; j < MemorizeApp.game.players.length; j++) {
|
|
if (MemorizeApp.game.players[j].networkId == users[i].networkId) {
|
|
MemorizeApp.game.players[j].online = true;
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!found) {
|
|
var user = users[i];
|
|
user.score = 0;
|
|
user.online = true;
|
|
MemorizeApp.game.players.push(user);
|
|
}
|
|
}
|
|
if (MemorizeApp.isHost) {
|
|
sendMessage({action: "updateGame", game: MemorizeApp.game});
|
|
}
|
|
displayUsersAndScores();
|
|
}
|
|
|
|
var xoLogo = '<?xml version="1.0" ?><!DOCTYPE svg PUBLIC \'-//W3C//DTD SVG 1.1//EN\' \'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\' [<!ENTITY stroke_color "#010101"><!ENTITY fill_color "#FFFFFF">]><svg enable-background="new 0 0 55 55" height="55px" version="1.1" viewBox="0 0 55 55" width="55px" x="0px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" y="0px"><g display="block" id="stock-xo_1_"><path d="M33.233,35.1l10.102,10.1c0.752,0.75,1.217,1.783,1.217,2.932 c0,2.287-1.855,4.143-4.146,4.143c-1.145,0-2.178-0.463-2.932-1.211L27.372,40.961l-10.1,10.1c-0.75,0.75-1.787,1.211-2.934,1.211 c-2.284,0-4.143-1.854-4.143-4.141c0-1.146,0.465-2.184,1.212-2.934l10.104-10.102L11.409,24.995 c-0.747-0.748-1.212-1.785-1.212-2.93c0-2.289,1.854-4.146,4.146-4.146c1.143,0,2.18,0.465,2.93,1.214l10.099,10.102l10.102-10.103 c0.754-0.749,1.787-1.214,2.934-1.214c2.289,0,4.146,1.856,4.146,4.145c0,1.146-0.467,2.18-1.217,2.932L33.233,35.1z" fill="&fill_color;" stroke="&stroke_color;" stroke-width="3.5"/><circle cx="27.371" cy="10.849" fill="&fill_color;" r="8.122" stroke="&stroke_color;" stroke-width="3.5"/></g></svg>';
|
|
|
|
function generateXOLogoWithColor(color) {
|
|
var coloredLogo = xoLogo;
|
|
coloredLogo = coloredLogo.replace("#010101", color.stroke);
|
|
coloredLogo = coloredLogo.replace("#FFFFFF", color.fill);
|
|
|
|
return "data:image/svg+xml;base64," + btoa(coloredLogo);
|
|
}
|
|
|
|
function initUI(callback) {
|
|
MemorizeApp.ui.gameGrid = document.getElementById("game-grid");
|
|
MemorizeApp.ui.gamePlayers = document.getElementById("game-players");
|
|
MemorizeApp.ui.gameEditor = document.getElementById("game-editor");
|
|
|
|
MemorizeApp.ui.gameTemplatesButton = document.getElementById("game-templates-button");
|
|
|
|
var gt = new templatePalette.TemplatePalette(MemorizeApp.ui.gameTemplatesButton, undefined, MemorizeApp.templates);
|
|
gt.addEventListener('template', function (e) {
|
|
for (var i = 0; i < MemorizeApp.game.players.length; i++) {
|
|
MemorizeApp.game.players[i].score = 0;
|
|
}
|
|
MemorizeApp.game.template = e.detail.value;
|
|
MemorizeApp.ui.gameTemplatesButton.style.backgroundImage = "url(icons/" + e.detail.value.icon + ")";
|
|
MemorizeApp.computeCards();
|
|
MemorizeApp.drawGame();
|
|
sendMessage({action: "updateGame", game: MemorizeApp.game});
|
|
});
|
|
|
|
MemorizeApp.ui.gameSizeButton = document.getElementById("game-size-button");
|
|
var sp = new sizePalette.SizePalette(MemorizeApp.ui.gameSizeButton);
|
|
sp.addEventListener('size', function (e) {
|
|
for (var i = 0; i < MemorizeApp.game.players.length; i++) {
|
|
MemorizeApp.game.players[i].score = 0;
|
|
}
|
|
MemorizeApp.game.size = e.detail.value;
|
|
MemorizeApp.ui.gameSizeButton.style.background = "url(icons/" + e.detail.value + "x" + e.detail.value + ".svg)";
|
|
MemorizeApp.computeCards();
|
|
MemorizeApp.drawGame();
|
|
sendMessage({action: "updateGame", game: MemorizeApp.game});
|
|
});
|
|
|
|
|
|
MemorizeApp.ui.gameResetButton = document.getElementById("game-reset-button");
|
|
MemorizeApp.ui.gameResetButton.addEventListener("click", function () {
|
|
for (var i = 0; i < MemorizeApp.game.players.length; i++) {
|
|
MemorizeApp.game.players[i].score = 0;
|
|
}
|
|
MemorizeApp.game.selectedCards = [];
|
|
MemorizeApp.game.cards = [];
|
|
displayUsersAndScores();
|
|
MemorizeApp.computeCards();
|
|
MemorizeApp.drawGame();
|
|
sendMessage({action: "updateGame", game: MemorizeApp.game});
|
|
});
|
|
|
|
MemorizeApp.ui.gameEditorButton = document.getElementById("game-editor-button");
|
|
MemorizeApp.ui.gameEditorInsertModeButton = document.getElementById("game-editor-insert-mode-button");
|
|
MemorizeApp.ui.gameEditorPlayModeButton = document.getElementById("game-editor-play-mode-button");
|
|
|
|
MemorizeApp.ui.gameEditorPlayModeButton.addEventListener("click", function() {
|
|
if (MemorizeApp.game.template.mode == MODE_CLASSIC) {
|
|
MemorizeApp.game.template.mode = MODE_SPLITTED;
|
|
MemorizeApp.ui.gameEditorPlayModeButton.style.backgroundImage = "url(icons/grouped_game2.svg)";
|
|
} else {
|
|
MemorizeApp.game.template.mode = MODE_CLASSIC;
|
|
MemorizeApp.ui.gameEditorPlayModeButton.style.backgroundImage = "url(icons/grouped_game1.svg)";
|
|
}
|
|
saveGame();
|
|
displayEditor();
|
|
});
|
|
|
|
|
|
MemorizeApp.ui.gameEditorClearButton = document.getElementById("game-editor-clear-button");
|
|
|
|
MemorizeApp.ui.gameEditorInsertModeButton.addEventListener("click", function() {
|
|
if (MemorizeApp.editor.pairMode == MODE_EQUAL) {
|
|
MemorizeApp.editor.pairMode = MODE_NON_EQUAL;
|
|
MemorizeApp.ui.gameEditorInsertModeButton.style.backgroundImage = "url(icons/pair-non-equals.svg)"
|
|
} else {
|
|
MemorizeApp.editor.pairMode = MODE_EQUAL;
|
|
MemorizeApp.ui.gameEditorInsertModeButton.style.backgroundImage = "url(icons/pair-equals.svg)"
|
|
}
|
|
saveGame();
|
|
displayEditor();
|
|
});
|
|
|
|
MemorizeApp.ui.gameEditorClearButton.addEventListener("click", function() {
|
|
MemorizeApp.game.template.cards = [];
|
|
saveGame();
|
|
displayEditor();
|
|
});
|
|
|
|
MemorizeApp.ui.gameEditorButton.addEventListener("click", function () {
|
|
if (MemorizeApp.inEditMode) {
|
|
leaveEditMode();
|
|
} else {
|
|
enterEditMode();
|
|
}
|
|
});
|
|
|
|
MemorizeApp.ui.gameEditorInsertModeButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorInsertModeButton.style.opacity = 0.3;
|
|
|
|
MemorizeApp.ui.gameEditorPlayModeButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorPlayModeButton.style.opacity = 0.3;
|
|
|
|
MemorizeApp.ui.gameEditorClearButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorClearButton.style.opacity = 0.3;
|
|
|
|
//window.onresize = function () {
|
|
// setTimeout(function () {
|
|
// if (MemorizeApp.inEditMode) {
|
|
// displayEditor()
|
|
// } else {
|
|
// MemorizeApp.drawGame();
|
|
// }
|
|
// }, 250);
|
|
//};
|
|
|
|
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
}
|
|
|
|
function enterEditMode() {
|
|
//TODO palette equality
|
|
//TODO palette show
|
|
MemorizeApp.inEditMode = true;
|
|
MemorizeApp.ui.gameGrid.innerHTML = "";
|
|
MemorizeApp.ui.gameGrid.style.display = "none";
|
|
MemorizeApp.ui.gameEditor.style.display = "block";
|
|
MemorizeApp.game.selectedCards = [];
|
|
MemorizeApp.editor.selectedPair = -1;
|
|
|
|
/* Disable game buttons */
|
|
|
|
MemorizeApp.ui.gameTemplatesButton.disabled = true;
|
|
MemorizeApp.ui.gameTemplatesButton.style.opacity = 0.3;
|
|
|
|
MemorizeApp.ui.gameSizeButton.disabled = true;
|
|
MemorizeApp.ui.gameSizeButton.style.opacity = 0.3;
|
|
|
|
MemorizeApp.ui.gameResetButton.disabled = true;
|
|
MemorizeApp.ui.gameResetButton.style.opacity = 0.3;
|
|
|
|
/* Enable editor buttons */
|
|
|
|
MemorizeApp.ui.gameEditorInsertModeButton.disabled = false;
|
|
MemorizeApp.ui.gameEditorInsertModeButton.style.opacity = 1;
|
|
|
|
MemorizeApp.ui.gameEditorPlayModeButton.disabled = false;
|
|
MemorizeApp.ui.gameEditorPlayModeButton.style.opacity = 1;
|
|
|
|
MemorizeApp.ui.gameEditorClearButton.disabled = false;
|
|
MemorizeApp.ui.gameEditorClearButton.style.opacity = 1;
|
|
|
|
MemorizeApp.ui.gameEditorButton.style.backgroundImage = "url(icons/play.svg)";
|
|
|
|
displayEditor();
|
|
}
|
|
|
|
function generateEditorDiv(card) {
|
|
var minSize = document.body.clientWidth;
|
|
if (minSize > document.body.clientHeight) {
|
|
minSize = document.body.clientHeight;
|
|
}
|
|
|
|
var e = document.createElement("div");
|
|
e.style.width = parseInt(minSize / 3.5) + "px";
|
|
e.style.marginLeft = "25px";
|
|
e.style.float = "left";
|
|
e.style.marginTop = "7px";
|
|
|
|
var d = document.createElement("div");
|
|
d.style.width = parseInt(minSize / 3.5) - 10 + "px";
|
|
d.style.height = parseInt(minSize / 3.5) - 10 + "px";
|
|
d.style.background = "rgb(119, 119, 119)";
|
|
d.style.border = "4px solid #000";
|
|
d.style.textAlign = "center";
|
|
d.style.borderRadius = "9px";
|
|
d.style.color = "#fff";
|
|
d.style.fontSize = parseInt(minSize / 3.5) - 10 + "px";
|
|
d.style.lineHeight = parseInt(minSize / 3.5) - 10 + "px";
|
|
d.className = "textCard";
|
|
d.style.backgroundRepeat = "no-repeat";
|
|
d.style.backgroundSize = "100%";
|
|
d.style.backgroundPosition = "center";
|
|
if (card && card.text) {
|
|
d.innerHTML = card.text;
|
|
} else if (card && card.image) {
|
|
d.style.backgroundImage = "url('" + card.image + "')";
|
|
}
|
|
|
|
var importPicture = document.createElement("img");
|
|
importPicture.style.marginLeft = "5px";
|
|
importPicture.style.marginTop = "5px";
|
|
importPicture.style.textAlign = "center";
|
|
importPicture.setAttribute("src", "icons/import_picture.svg");
|
|
importPicture.style.width = "30px";
|
|
importPicture.className = "insertImage";
|
|
|
|
var input = document.createElement("input");
|
|
input.setAttribute("type", "text");
|
|
input.style.marginRight = "auto";
|
|
input.style.marginLeft = "auto";
|
|
input.style.width = parseInt(minSize / 3.5) - 50 + "px";
|
|
input.style.marginTop = "5px";
|
|
input.card = card;
|
|
if (card && card.text) {
|
|
input.value = card.text;
|
|
}
|
|
|
|
input.linkedDiv = d;
|
|
input.onkeyup = function () {
|
|
this.linkedDiv.innerHTML = this.value;
|
|
this.linkedDiv.style.fontSize = this.linkedDiv.style.width;
|
|
this.card.text = this.value;
|
|
resizeTextInsideTextCardDivs()
|
|
};
|
|
|
|
e.appendChild(d);
|
|
e.appendChild(input);
|
|
e.appendChild(importPicture);
|
|
|
|
return e;
|
|
}
|
|
|
|
function generateAddEditRemoveButton() {
|
|
var div = document.createElement("div");
|
|
var minSize = document.body.clientWidth;
|
|
if (minSize > document.body.clientHeight) {
|
|
minSize = document.body.clientHeight;
|
|
}
|
|
|
|
div.style.float = "right";
|
|
div.style.height = parseInt(minSize / 3.5) + "px";
|
|
div.style.marginRight = "20px";
|
|
div.style.marginTop = "7px";
|
|
|
|
var addButton = document.createElement("div");
|
|
var updateButton = document.createElement("div");
|
|
var deleteButton = document.createElement("div");
|
|
|
|
var buttonSize = parseInt((minSize / 3.5) / 5) + "px";
|
|
|
|
addButton.style.padding = "5px";
|
|
addButton.style.userSelect = "none";
|
|
addButton.style.webkitUserSelect = "none";
|
|
addButton.style.mozUserSelect = "none";
|
|
addButton.innerHTML = "<img style='height:" + buttonSize + "; width:" + buttonSize + ";' src='icons/pair-add.svg'><br/>" + MemorizeApp.strings.add;
|
|
addButton.onmouseover = function () {
|
|
this.style.background = "#888";
|
|
};
|
|
addButton.onmouseout = function () {
|
|
this.style.background = "transparent";
|
|
};
|
|
addButton.addEventListener("click", function () {
|
|
var cards = [];
|
|
if (MemorizeApp.editor.pairMode == MODE_EQUAL) {
|
|
cards[0] = MemorizeApp.editor.card1;
|
|
cards[1] = MemorizeApp.editor.card1;
|
|
}
|
|
if (MemorizeApp.editor.pairMode == MODE_NON_EQUAL) {
|
|
cards[0] = MemorizeApp.editor.card1;
|
|
cards[1] = MemorizeApp.editor.card2;
|
|
}
|
|
|
|
if (!cards[0].text && !cards[0].image && !cards[0].sound) {
|
|
return;
|
|
}
|
|
|
|
if (!cards[1].text && !cards[1].image && !cards[1].sound) {
|
|
return;
|
|
}
|
|
|
|
cards = JSON.parse(JSON.stringify(cards));
|
|
MemorizeApp.editor.card1 = {};
|
|
MemorizeApp.editor.card2 = {};
|
|
MemorizeApp.game.template.cards.push(cards);
|
|
MemorizeApp.editor.selectedPair = -1;
|
|
saveGame();
|
|
displayEditor();
|
|
});
|
|
|
|
updateButton.style.padding = "5px";
|
|
updateButton.style.userSelect = "none";
|
|
updateButton.style.webkitUserSelect = "none";
|
|
updateButton.style.mozUserSelect = "none";
|
|
updateButton.innerHTML = "<img style='height:" + buttonSize + "; width:" + buttonSize + ";' src='icons/pair-update.svg'><br/>" + MemorizeApp.strings.update;
|
|
updateButton.onmouseover = function () {
|
|
this.style.background = "#888";
|
|
};
|
|
updateButton.onmouseout = function () {
|
|
this.style.background = "transparent";
|
|
};
|
|
updateButton.addEventListener("click", function () {
|
|
var cards = [];
|
|
if (MemorizeApp.editor.pairMode == MODE_EQUAL) {
|
|
cards[0] = MemorizeApp.editor.card1;
|
|
cards[1] = MemorizeApp.editor.card1;
|
|
}
|
|
if (MemorizeApp.editor.pairMode == MODE_NON_EQUAL) {
|
|
cards[0] = MemorizeApp.editor.card1;
|
|
cards[1] = MemorizeApp.editor.card2;
|
|
}
|
|
|
|
if (!cards[0].text && !cards[0].image && !cards[0].sound) {
|
|
return;
|
|
}
|
|
|
|
if (!cards[1].text && !cards[1].image && !cards[1].sound) {
|
|
return;
|
|
}
|
|
|
|
cards = JSON.parse(JSON.stringify(cards));
|
|
|
|
if (MemorizeApp.editor.selectedPair > -1) {
|
|
MemorizeApp.game.template.cards[MemorizeApp.editor.selectedPair] = cards
|
|
}
|
|
saveGame();
|
|
displayEditor();
|
|
});
|
|
|
|
deleteButton.style.padding = "5px";
|
|
deleteButton.style.userSelect = "none";
|
|
deleteButton.style.webkitUserSelect = "none";
|
|
deleteButton.style.mozUserSelect = "none";
|
|
deleteButton.innerHTML = "<img style='height:" + buttonSize + "; width:" + buttonSize + ";' src='icons/remove.svg'><br/>" + MemorizeApp.strings.remove;
|
|
deleteButton.onmouseover = function () {
|
|
this.style.background = "#888";
|
|
};
|
|
deleteButton.onmouseout = function () {
|
|
this.style.background = "transparent";
|
|
};
|
|
deleteButton.addEventListener("click", function () {
|
|
if (MemorizeApp.editor.selectedPair > -1) {
|
|
MemorizeApp.game.template.cards.splice(MemorizeApp.editor.selectedPair, 1);
|
|
}
|
|
|
|
MemorizeApp.editor.selectedPair = -1;
|
|
MemorizeApp.editor.card1 = {};
|
|
MemorizeApp.editor.card2 = {};
|
|
saveGame();
|
|
displayEditor();
|
|
});
|
|
|
|
div.appendChild(addButton);
|
|
div.appendChild(updateButton);
|
|
div.appendChild(deleteButton);
|
|
|
|
return div;
|
|
}
|
|
|
|
function generateCardFromCardsList(pair, minSize, index) {
|
|
minSize = minSize - 10;
|
|
var d = document.createElement("div");
|
|
d.style.display = "inline-block";
|
|
d.style.height = minSize + "px";
|
|
d.style.marginLeft = "5px";
|
|
|
|
if (index == MemorizeApp.editor.selectedPair) {
|
|
d.style.border = "3px solid #00f";
|
|
}
|
|
//d.style.marginTop = "5px";
|
|
//d.style.marginLeft = "15px";
|
|
|
|
var card1 = document.createElement("div");
|
|
card1.style.backgroundRepeat = "no-repeat";
|
|
card1.style.backgroundSize = "cover";
|
|
card1.style.backgroundPosition = "center center";
|
|
|
|
card1.innerHTML = " ";
|
|
card1.style.backgroundColor = "#666";
|
|
card1.className = "textCard";
|
|
|
|
|
|
if (pair[0].text) {
|
|
if (pair[0].text.indexOf(INLINE_RES) == 0) {
|
|
pair[0].text = SampleRessources[pair[0].image.slice(INLINE_RES.length)]
|
|
}
|
|
card1.innerHTML = pair[0].text;
|
|
}
|
|
else if (pair[0].image) {
|
|
if (pair[0].image.indexOf(INLINE_RES) == 0) {
|
|
pair[0].image = SampleRessources[pair[0].image.slice(INLINE_RES.length)]
|
|
}
|
|
card1.style.backgroundImage = "url('" + pair[0].image + "')";
|
|
|
|
}
|
|
card1.style.width = parseInt(minSize / 2) + "px";
|
|
card1.style.height = parseInt(minSize / 2) + "px";
|
|
card1.style.lineHeight = card1.style.width + "";
|
|
card1.style.borderRadius = "6px";
|
|
card1.style.textAlign = "center";
|
|
card1.style.fontSize = parseInt(minSize / 8) + "px";
|
|
card1.style.border = "1px solid #000";
|
|
card1.style.color = "#fff";
|
|
card1.style.marginBottom = "5px";
|
|
|
|
|
|
var card2 = document.createElement("div");
|
|
card2.style.backgroundRepeat = "no-repeat";
|
|
card2.style.backgroundPosition = "center center";
|
|
card2.style.backgroundSize = "cover";
|
|
|
|
|
|
card2.innerHTML = " ";
|
|
card2.style.backgroundColor = "#666";
|
|
card2.className = "textCard";
|
|
if (pair[1].text) {
|
|
if (pair[1].text.indexOf(INLINE_RES) == 0) {
|
|
pair[1].text = SampleRessources[pair[1].image.slice(INLINE_RES.length)]
|
|
}
|
|
card2.innerHTML = pair[1].text;
|
|
}
|
|
else if (pair[1].image) {
|
|
if (pair[1].image.indexOf(INLINE_RES) == 0) {
|
|
pair[1].image = SampleRessources[pair[1].image.slice(INLINE_RES.length)]
|
|
}
|
|
card2.style.backgroundImage = "url('" + pair[1].image + "')";
|
|
}
|
|
|
|
card2.style.width = parseInt(minSize / 2) + "px";
|
|
card2.style.height = parseInt(minSize / 2) + "px";
|
|
card2.style.textAlign = "center";
|
|
card2.style.lineHeight = card2.style.width + "";
|
|
card2.style.borderRadius = "6px";
|
|
card2.style.fontSize = parseInt(minSize / 8) + "px";
|
|
card2.style.border = "1px solid #000";
|
|
card2.style.color = "#fff";
|
|
|
|
d.appendChild(card1);
|
|
d.appendChild(card2);
|
|
|
|
return d;
|
|
}
|
|
|
|
function insertimagebuttonsFun(){
|
|
document.getElementsByClassName("insertImage")[0].onclick = function(){
|
|
var cards = [];
|
|
chooser.show(function (entry) {
|
|
// No selection
|
|
if (!entry) {
|
|
return;
|
|
}
|
|
// Get object content
|
|
var dataentry = new datastore.DatastoreObject(entry.objectId);
|
|
dataentry.loadAsText(function (err, metadata, text) {
|
|
//We load the drawing inside an image element
|
|
var element = document.createElement('img');
|
|
if (entry.metadata.activity == 'org.olpcfrance.PaintActivity') {
|
|
element.src = LZString.decompressFromUTF16(JSON.parse(text).src);
|
|
} else {
|
|
element.src = text;
|
|
}
|
|
element.onload = function () {
|
|
document.getElementsByClassName("textCard")[0].style.backgroundImage = 'url(' + element.src + ')';
|
|
if (MemorizeApp.editor.pairMode == MODE_EQUAL) {
|
|
MemorizeApp.editor.card1.image = element.src;
|
|
MemorizeApp.editor.card1.text = "";
|
|
MemorizeApp.editor.card2.image = element.src;
|
|
MemorizeApp.editor.card2.text = "";
|
|
}else{
|
|
MemorizeApp.editor.card1.image = element.src;
|
|
MemorizeApp.editor.card1.text = "";
|
|
}
|
|
var cards = [];
|
|
if (MemorizeApp.editor.pairMode == MODE_EQUAL) {
|
|
cards[0] = MemorizeApp.editor.card1;
|
|
cards[1] = MemorizeApp.editor.card1;
|
|
}
|
|
if (MemorizeApp.editor.pairMode == MODE_NON_EQUAL) {
|
|
cards[0] = MemorizeApp.editor.card1;
|
|
cards[1] = MemorizeApp.editor.card2;
|
|
}
|
|
|
|
if (!cards[0].text && !cards[0].image && !cards[0].sound) {
|
|
return;
|
|
}
|
|
|
|
if (!cards[1].text && !cards[1].image && !cards[1].sound) {
|
|
return;
|
|
}
|
|
|
|
cards = JSON.parse(JSON.stringify(cards));
|
|
|
|
if (MemorizeApp.editor.selectedPair > -1) {
|
|
MemorizeApp.game.template.cards[MemorizeApp.editor.selectedPair] = cards
|
|
}
|
|
saveGame();
|
|
displayEditor();
|
|
};
|
|
});
|
|
}, { mimetype: 'image/png' }, { mimetype: 'image/jpeg' }, { activity: 'org.olpcfrance.PaintActivity'});
|
|
}
|
|
if(document.getElementsByClassName("insertImage")[1]){
|
|
document.getElementsByClassName("insertImage")[1].onclick = function(){
|
|
var cards = [];
|
|
chooser.show(function (entry) {
|
|
// No selection
|
|
if (!entry) {
|
|
return;
|
|
}
|
|
// Get object content
|
|
var dataentry = new datastore.DatastoreObject(entry.objectId);
|
|
dataentry.loadAsText(function (err, metadata, text) {
|
|
//We load the drawing inside an image element
|
|
var element = document.createElement('img');
|
|
element.src = text;
|
|
element.onload = function () {
|
|
document.getElementsByClassName("textCard")[1].style.backgroundImage = 'url(' + element.src + ')';
|
|
if (MemorizeApp.editor.pairMode == MODE_EQUAL) {
|
|
MemorizeApp.editor.card1.image = element.src;
|
|
MemorizeApp.editor.card1.text = "";
|
|
MemorizeApp.editor.card2.image = element.src;
|
|
MemorizeApp.editor.card2.text = "";
|
|
}else{
|
|
MemorizeApp.editor.card2.image = element.src;
|
|
MemorizeApp.editor.card2.text = "";
|
|
}
|
|
var cards = [];
|
|
if (MemorizeApp.editor.pairMode == MODE_EQUAL) {
|
|
cards[0] = MemorizeApp.editor.card1;
|
|
cards[1] = MemorizeApp.editor.card1;
|
|
}
|
|
if (MemorizeApp.editor.pairMode == MODE_NON_EQUAL) {
|
|
cards[0] = MemorizeApp.editor.card1;
|
|
cards[1] = MemorizeApp.editor.card2;
|
|
}
|
|
|
|
if (!cards[0].text && !cards[0].image && !cards[0].sound) {
|
|
return;
|
|
}
|
|
|
|
if (!cards[1].text && !cards[1].image && !cards[1].sound) {
|
|
return;
|
|
}
|
|
cards = JSON.parse(JSON.stringify(cards));
|
|
if (MemorizeApp.editor.selectedPair > -1) {
|
|
MemorizeApp.game.template.cards[MemorizeApp.editor.selectedPair] = cards
|
|
}
|
|
saveGame();
|
|
displayEditor();
|
|
};
|
|
});
|
|
}, { mimetype: 'image/png' }, { mimetype: 'image/jpeg' });
|
|
}
|
|
}
|
|
}
|
|
|
|
function generateCardsList() {
|
|
var div = document.createElement("div");
|
|
var minSize = document.body.clientWidth;
|
|
if (minSize > document.body.clientHeight) {
|
|
minSize = document.body.clientHeight;
|
|
}
|
|
|
|
div.style.position = "fixed";
|
|
div.style.bottom = 0;
|
|
div.style.width = document.body.clientWidth + "px";
|
|
div.style.height = parseInt(minSize / 3) + "px";
|
|
div.style.padding = "10px";
|
|
div.style.paddingBottom = "20px";
|
|
div.style.marginTop = "7px";
|
|
div.style.background = "#eee";
|
|
div.style.overflowX = "auto";
|
|
div.style.whiteSpace = "nowrap"
|
|
div.style.overflowY = "hidden";
|
|
|
|
for (var i = 0; i < MemorizeApp.game.template.cards.length; i++) {
|
|
var card = MemorizeApp.game.template.cards[i];
|
|
var pair = generateCardFromCardsList(card, parseInt(minSize / 3), i);
|
|
pair.cards = card;
|
|
pair.index = i;
|
|
pair.addEventListener("click", function() {
|
|
MemorizeApp.editor.selectedPair = this.index;
|
|
MemorizeApp.editor.pairMode = MODE_NON_EQUAL;
|
|
MemorizeApp.editor.card1 = this.cards[0];
|
|
MemorizeApp.editor.card2 = this.cards[1];
|
|
displayEditor();
|
|
});
|
|
|
|
div.appendChild(pair);
|
|
}
|
|
var emptyDiv = document.createElement("div");
|
|
emptyDiv.style.height = parseInt(minSize/6)+"px";
|
|
emptyDiv.style.width = "30px";
|
|
emptyDiv.style.display = "inline-block";
|
|
div.appendChild(emptyDiv);
|
|
|
|
return div;
|
|
}
|
|
|
|
function generateClearBoth() {
|
|
var d = document.createElement("div");
|
|
d.style.clear = "both";
|
|
return d;
|
|
}
|
|
|
|
function displayEditor() {
|
|
MemorizeApp.ui.gameEditor.innerHTML = "";
|
|
|
|
if (MemorizeApp.editor.pairMode == MODE_EQUAL) {
|
|
MemorizeApp.ui.gameEditor.appendChild(generateEditorDiv(MemorizeApp.editor.card1));
|
|
}
|
|
|
|
if (MemorizeApp.editor.pairMode == MODE_NON_EQUAL) {
|
|
MemorizeApp.ui.gameEditor.appendChild(generateEditorDiv(MemorizeApp.editor.card1));
|
|
MemorizeApp.ui.gameEditor.appendChild(generateEditorDiv(MemorizeApp.editor.card2));
|
|
}
|
|
insertimagebuttonsFun();
|
|
MemorizeApp.ui.gameEditor.appendChild(generateAddEditRemoveButton());
|
|
MemorizeApp.ui.gameEditor.appendChild(generateClearBoth());
|
|
MemorizeApp.ui.gameEditor.appendChild(generateCardsList());
|
|
|
|
resizeTextInsideTextCardDivs()
|
|
|
|
}
|
|
|
|
function leaveEditMode() {
|
|
MemorizeApp.editor.card1 = {};
|
|
MemorizeApp.editor.card2 = {};
|
|
MemorizeApp.inEditMode = false;
|
|
MemorizeApp.ui.gameEditor.innerHTML = "";
|
|
MemorizeApp.ui.gameEditor.style.display = "none";
|
|
MemorizeApp.ui.gameGrid.style.display = "block";
|
|
|
|
/* Enable game buttons */
|
|
|
|
MemorizeApp.ui.gameTemplatesButton.disabled = false;
|
|
MemorizeApp.ui.gameTemplatesButton.style.opacity = 1;
|
|
|
|
MemorizeApp.ui.gameSizeButton.disabled = false;
|
|
MemorizeApp.ui.gameSizeButton.style.opacity = 1;
|
|
|
|
MemorizeApp.ui.gameResetButton.disabled = false;
|
|
MemorizeApp.ui.gameResetButton.style.opacity = 1;
|
|
|
|
/* Disable editor buttons */
|
|
|
|
MemorizeApp.ui.gameEditorInsertModeButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorInsertModeButton.style.opacity = 0.3;
|
|
|
|
MemorizeApp.ui.gameEditorPlayModeButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorPlayModeButton.style.opacity = 0.3;
|
|
|
|
MemorizeApp.ui.gameEditorClearButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorClearButton.style.opacity = 0.3;
|
|
|
|
MemorizeApp.ui.gameEditorButton.style.backgroundImage = "url(icons/cog.svg)";
|
|
|
|
MemorizeApp.drawGame();
|
|
}
|
|
|
|
function disableEditMode() {
|
|
/* Disable All editor buttons */
|
|
|
|
MemorizeApp.ui.gameEditorButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorButton.style.opacity = 0.3;
|
|
MemorizeApp.ui.gameEditorButton.style.backgroundImage = "url(icons/cog.svg)";
|
|
|
|
MemorizeApp.ui.gameEditorInsertModeButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorInsertModeButton.style.opacity = 0.3;
|
|
|
|
MemorizeApp.ui.gameEditorPlayModeButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorPlayModeButton.style.opacity = 0.3;
|
|
|
|
MemorizeApp.ui.gameEditorClearButton.disabled = true;
|
|
MemorizeApp.ui.gameEditorClearButton.style.opacity = 0.3;
|
|
}
|
|
|
|
var Base64Binary = {
|
|
_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
|
|
|
|
_arrayBufferToBase64: function (buffer) {
|
|
var binary = '';
|
|
var bytes = new Uint8Array(buffer);
|
|
var len = bytes.byteLength;
|
|
for (var i = 0; i < len; i++) {
|
|
binary += String.fromCharCode(bytes[i]);
|
|
}
|
|
return window.btoa(binary);
|
|
},
|
|
|
|
/* will return a Uint8Array type */
|
|
decodeArrayBuffer: function (input) {
|
|
var bytes = (input.length / 4) * 3;
|
|
var ab = new ArrayBuffer(bytes);
|
|
this.decode(input, ab);
|
|
|
|
return ab;
|
|
},
|
|
|
|
removePaddingChars: function (input) {
|
|
var lkey = this._keyStr.indexOf(input.charAt(input.length - 1));
|
|
if (lkey == 64) {
|
|
return input.substring(0, input.length - 1);
|
|
}
|
|
return input;
|
|
},
|
|
|
|
decode: function (input, arrayBuffer) {
|
|
//get last chars to see if are valid
|
|
input = this.removePaddingChars(input);
|
|
input = this.removePaddingChars(input);
|
|
|
|
var bytes = parseInt((input.length / 4) * 3, 10);
|
|
|
|
var uarray;
|
|
var chr1, chr2, chr3;
|
|
var enc1, enc2, enc3, enc4;
|
|
var i = 0;
|
|
var j = 0;
|
|
|
|
if (arrayBuffer)
|
|
uarray = new Uint8Array(arrayBuffer);
|
|
else
|
|
uarray = new Uint8Array(bytes);
|
|
|
|
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
|
|
|
|
for (i = 0; i < bytes; i += 3) {
|
|
enc1 = this._keyStr.indexOf(input.charAt(j++));
|
|
enc2 = this._keyStr.indexOf(input.charAt(j++));
|
|
enc3 = this._keyStr.indexOf(input.charAt(j++));
|
|
enc4 = this._keyStr.indexOf(input.charAt(j++));
|
|
|
|
chr1 = (enc1 << 2) | (enc2 >> 4);
|
|
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
|
|
chr3 = ((enc3 & 3) << 6) | enc4;
|
|
|
|
uarray[i] = chr1;
|
|
if (enc3 != 64) uarray[i + 1] = chr2;
|
|
if (enc4 != 64) uarray[i + 2] = chr3;
|
|
}
|
|
|
|
return uarray;
|
|
}
|
|
}
|
|
|
|
|
|
return MemorizeApp;
|
|
}
|
|
)
|
|
;
|