summaryrefslogtreecommitdiff
path: root/webcards/scripts/cards/deck.js
blob: 620a038517e9f8081d6457c7633dcf0c152200ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// Deck class represents multiple cards.
// Can be arranged in multiple ways.
function Deck (options = {mode: "stack", smode: "one", sct: 0, pos: [0, 0]}){
    this.cards = [];
    
    // View mode
    //  infdraw - infinite draw. always appears as if there are multiple cards
    //  stack - stack mode
    //  strip
    //      horizontal
    //          left (strip-hl)
    //          right (strip-hr)
    //      vertical
    //          up (strip-vu)
    //          down (strip-vd)
    this.inf = options.mode == "infdraw";

    // Select mode - controls what other cards are selected when one card is selected
    //  above - selectes cards above the selected one
    //  below - selects cards below the selected one
    //  around - selects cards above and below
    //  one - selects only card chosen
    //  all - selects all cards when card selected
    this.smode = options.smode;
    
    // Select count (negative defaults to 0)
    //  above - controls number of cards above clicked are selected
    //  below - controls number of cards below clicked are selected
    //  around
    //      number - number above and below selected
    //      array - [first number: number above selected] [second number: number below selected]
    //  one - no effect
    //  all - no effect
    this.sct = options.sct > 0 ? options.sct : 0;
    
    // Position
    //  array of where the deck is centered
    this.x = options.pos[0];
    this.y = options.pos[1];
    
    this.e = document.createElement("deck");
    this.e.style.left = this.x + "px";
    this.e.style.top = this.y + "px";
    this.e.setAttribute("mode", options.mode);
}

Deck.prototype = {
    // Add a card to the front of the deck
    appendCard: function(card) {
        this.cards.push(card);
        this.e.appendChild(card.e);
    },

    // Add a card to the back of the deck
    prependCard: function(card) {
        this.cards.unshift(card);
        this.e.prepend(card.e);
    },

    // Add a card at the index specified
    addCardAt: function(card, index) {
        if(index < 0 || index > this.cards.length)
            return
        
        if(index == 0) {
            this.prependCard(card);
        } else if (index == this.cards.length) {
            this.appendCard(card);
        } else {
            let temp = this.cards.slice(0, index);
            temp[temp.length - 1].e.after(card.e);
            temp.push(card);
            this.cards.unshift(...temp);
        }
    },

    // Swap the cards at the specified indexes
    swapCard: function(index1, index2) {
        if(index1 < 0 || index1 >= this.cards.length || index2 < 0 || index2 >= this.cards.length)
            return
        
        var temp = this.cards[index1]
        this.cards[index1] = this.cards[index2];
        this.cards[index2] = temp;

        this.cards[index1 - 1].e.after(this.cards[index1]);
        this.cards[index2 - 1].e.after(this.cards[index2]);
    },

    // Remove the card at the front of the deck (index length - 1), returns the card removed (if any)
    removeFront: function() {
        return this.removeCard(this.cards.length - 1);
    },

    // Remove the card at the back of the deck (index 0), returns the card removed (if any)
    removeBack: function() {
        return this.removeCard(0);
    },

    // Remove a card from the deck, returning the card element
    removeCard: function(index) {

        if(index < 0 || index >= this.cards.length)
            return

        this.e.removeChild(this.cards[index].e);
        return this.cards.splice(index, 1)[0];
    }
};