main.js 7.89 KB
Newer Older
Claudio Valerio's avatar
Claudio Valerio committed
1 2 3 4 5
var defaults = ["1/1", "2-1", "3*(3+2)", "5*3", "4+12", "0+16"];

var Card = (function() {
    var self = Object.create({}, {
        val: {
6 7
            value: -1,
            writable: true
Claudio Valerio's avatar
Claudio Valerio committed
8
        },
9 10
        id: {
            value: -1,
11
            writable: true
12
        },
Claudio Valerio's avatar
Claudio Valerio committed
13
        index: {
14 15
            value: -1,
            writable: true
Claudio Valerio's avatar
Claudio Valerio committed
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
        },
        isMatch: {
            value: function(card) {
                if (this.val == card.val) {
                    return true;
                }
                return false;
            }
        }
    });
    return self;
})();

var Game = (function() {
    var self = Object.create({}, {
        cards: {
32 33 34
            value: null,
            enumarable: true,
            writable: true
Claudio Valerio's avatar
Claudio Valerio committed
35 36
        },
        matches: {
37 38
            value: 0,
            writable: true
Claudio Valerio's avatar
Claudio Valerio committed
39 40 41
        },
        init: {
            value: function(count) {
42 43 44 45 46
                if(typeof count !== "number"){
                    log("Cards count must be an number");	
                    return;
                }
                this.cards = new Array(count);
Claudio Valerio's avatar
Claudio Valerio committed
47 48 49 50 51
                for (i = 0; i < this.cards.length / 2; i++) {
                    var card = Object.create(Card, {
                        val: {
                            value: i+1
                        },
52 53 54
                        id: {
                            value: i*2
                        }
Claudio Valerio's avatar
Claudio Valerio committed
55
                    });
56
                    card.index = card.id;
Claudio Valerio's avatar
Claudio Valerio committed
57 58 59 60
                    var card2 = Object.create(Card, {
                        val: {
                            value: i+1
                        },
61 62 63
                        id: {
                            value: card.index+1
                        }
Claudio Valerio's avatar
Claudio Valerio committed
64
                    });
65 66 67
                    card2.index = card2.id;
                    this.cards[card.index] = card;
                    this.cards[card2.index] = card2;
Claudio Valerio's avatar
Claudio Valerio committed
68 69 70 71
                }
            }
        },
        selected: {
72 73
            value: null,
            writable: true
Claudio Valerio's avatar
Claudio Valerio committed
74 75 76 77 78 79
        }
    });
    return self;
})();

function onTemplateLoadedCallback() {
80 81 82 83 84 85 86 87 88 89 90
    $("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);
        }
    });
/*
Claudio Valerio's avatar
Claudio Valerio committed
91 92 93 94
	$("#timeoutValue").text($("input[name=timeout]").val());	
	$("input[name=timeout]").change(function(){
		$("#timeoutValue").text($(this).val());
	});
Claudio Valerio's avatar
Claudio Valerio committed
95
	*/
Claudio Valerio's avatar
Claudio Valerio committed
96 97 98
}

function reloadApp(app) {
99 100
    var cardsCount = parseInt(app.parameters.value("count"));
    var timeout = parseInt(app.parameters.value("timeout"))*1000;
Claudio Valerio's avatar
Claudio Valerio committed
101
	
102 103 104 105
    var scene = $("#scene");
    var table = $("<div id='table'/>");
    scene.empty();
    scene.append(table);
Claudio Valerio's avatar
Claudio Valerio committed
106

107 108
    var game = Object.create(Game);
    game.init(cardsCount);
Claudio Valerio's avatar
Claudio Valerio committed
109

110 111 112 113 114 115
    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;
    }
Claudio Valerio's avatar
Claudio Valerio committed
116

117 118
    if(!app.onEdit)
        app.utils.shuffle(game.cards);
Claudio Valerio's avatar
Claudio Valerio committed
119
		
120 121 122 123 124
    for(i = 0 ; i < game.cards.length ; i++) {
        (function(){
            var card = game.cards[i];
            var defaultValue = defaults[card.index]
            card.index = i;
Claudio Valerio's avatar
Claudio Valerio committed
125

126 127 128 129 130
            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;
Claudio Valerio's avatar
Claudio Valerio committed
131

132 133 134
            var cardView = $(Mustache.render(cardTemplate, window));
            rows[i%2].append(cardView);
            cardView.data("card", card);
Claudio Valerio's avatar
Claudio Valerio committed
135

136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
            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);
Claudio Valerio's avatar
Claudio Valerio committed
155
			
156
            var dropzone = cardView.find(".dropzone");
Claudio Valerio's avatar
Claudio Valerio committed
157
			
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
            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);
Claudio Valerio's avatar
Claudio Valerio committed
219 220 221
}

function cardParameterKey(card, i) {
222
    return "card"+card.id+(i%2==0 ? "Front":"Back");
Claudio Valerio's avatar
Claudio Valerio committed
223 224 225
}

function cardTextParameterKey(card, i) {
226
    return cardParameterKey(card, i)+"Text";
Claudio Valerio's avatar
Claudio Valerio committed
227 228 229
}

function reloadCallback(parameter) {
230 231
    if(parameter === undefined || parameter.key === "count")
        reloadApp(this);
Claudio Valerio's avatar
Claudio Valerio committed
232 233 234
}

$(document).ready(function(){
235 236 237 238 239 240 241 242 243
    var callbacks = {
        onTemplatesLoaded: onTemplateLoadedCallback,
        onEdit: reloadApp,
        onView: reloadApp
    };
    init(reloadCallback, {
        toolbar: toolbarTemplate, 
        parameters: parametersTemplate
    }, callbacks);
Claudio Valerio's avatar
Claudio Valerio committed
244
});