1
-
1
+ /* global document, randomColor, snabbt, FastClick */
2
2
// Constants
3
+ 'use strict' ;
4
+
3
5
var CARD_HEIGHT = 100 ;
4
6
var CARD_WIDTH = 60 ;
5
7
var CARD_COUNT = 40 ;
6
8
7
9
var WIDTH = 800 ;
8
10
var HEIGHT = 600 ;
9
- var BOTTOM = 400 ;
10
11
11
- var TILT = Math . PI / 8 ;
12
- var PYTH_ANGLE = Math . PI / 2 - TILT ;
12
+ var TILT = Math . PI / 8 ;
13
+ var PYTH_ANGLE = Math . PI / 2 - TILT ;
13
14
14
15
var TILTED_CARD_HEIGHT = Math . sin ( PYTH_ANGLE ) * CARD_HEIGHT + 2 ;
15
16
var TILTED_CARD_WIDTH = Math . cos ( PYTH_ANGLE ) * CARD_HEIGHT ;
16
17
var CARD_SPACING = 2 ;
17
18
var PYRAMID_WIDTH = TILTED_CARD_WIDTH * 2 + CARD_SPACING * 2 ;
18
19
19
- function update_sizes ( ) {
20
- var c = document . getElementById ( 'container' ) ;
21
- WIDTH = c . clientWidth ;
22
- HEIGHT = c . clientHeight ;
20
+ function updateSizes ( ) {
21
+ var container = document . getElementById ( 'container' ) ;
22
+ WIDTH = container . clientWidth ;
23
+ HEIGHT = container . clientHeight ;
23
24
CARD_WIDTH = WIDTH * 0.05 ;
24
25
CARD_HEIGHT = HEIGHT * 0.15 ;
25
26
TILTED_CARD_HEIGHT = Math . sin ( PYTH_ANGLE ) * CARD_HEIGHT + 2 ;
26
27
TILTED_CARD_WIDTH = Math . cos ( PYTH_ANGLE ) * CARD_HEIGHT ;
27
28
PYRAMID_WIDTH = TILTED_CARD_WIDTH * 2 + CARD_SPACING * 2 ;
28
- for ( var i = 0 ; i < Deck . cards . length ; ++ i ) {
29
- Deck . card_at ( i ) . style . height = CARD_HEIGHT + 'px' ;
30
- Deck . card_at ( i ) . style . width = CARD_WIDTH + 'px' ;
29
+ for ( var i = 0 ; i < Deck . length ( ) ; ++ i ) {
30
+ Deck . cardAt ( i ) . style . height = CARD_HEIGHT + 'px' ;
31
+ Deck . cardAt ( i ) . style . width = CARD_WIDTH + 'px' ;
31
32
}
32
33
}
33
34
34
35
var COLORS = randomColor ( {
35
36
count : 40 ,
36
- luminosity : 'dark' ,
37
+ luminosity : 'dark'
37
38
} ) ;
38
39
39
40
@@ -44,13 +45,13 @@ var WALL = 3;
44
45
var CYLINDER = 4 ;
45
46
var current_mode ;
46
47
47
- var formation_builders = { } ;
48
- formation_builders [ PILE ] = pile_positions ;
49
- formation_builders [ HOUSE ] = house_positions ;
50
- formation_builders [ WALL ] = wall_positions ;
51
- formation_builders [ CYLINDER ] = cylinder_positions ;
48
+ var formationBuilders = { } ;
49
+ formationBuilders [ PILE ] = pile_positions ;
50
+ formationBuilders [ HOUSE ] = house_positions ;
51
+ formationBuilders [ WALL ] = wall_positions ;
52
+ formationBuilders [ CYLINDER ] = cylinder_positions ;
52
53
53
- function create_card ( container , index ) {
54
+ function createCard ( container , index ) {
54
55
var card = document . createElement ( 'div' ) ;
55
56
card . className = 'card' ;
56
57
card . style . background = COLORS [ index % COLORS . length ] ;
@@ -61,34 +62,36 @@ function create_card(container, index) {
61
62
62
63
// Deck
63
64
var Deck = ( function ( ) {
64
- this . cards = [ ] ;
65
- this . card_index = [ ] ;
65
+ var cards = [ ] ;
66
+ var cardIndex = 0 ;
66
67
67
- for ( var i = 0 ; i < CARD_COUNT ; ++ i ) {
68
+ for ( var i = 0 ; i < CARD_COUNT ; ++ i ) {
68
69
var container = document . getElementById ( 'surface' ) ;
69
- this . cards . push ( create_card ( container , i ) ) ;
70
+ cards . push ( createCard ( container , i ) ) ;
70
71
}
71
72
72
- this . next_card = function ( ) {
73
- if ( this . card_index > 51 )
74
- return ;
75
- return this . cards [ this . card_index ++ ] ;
76
- } ;
77
-
78
- this . card_at = function ( index ) {
79
- return this . cards [ index ] ;
80
- } ;
81
-
82
- this . reset = function ( ) {
83
- this . card_index = 0 ;
84
- } ;
85
- return this ;
73
+ return {
74
+ nextCard : function ( ) {
75
+ if ( cardIndex > 51 )
76
+ return ;
77
+ return cards [ cardIndex ++ ] ;
78
+ } ,
79
+ cardAt : function ( index ) {
80
+ return cards [ index ] ;
81
+ } ,
82
+ reset : function ( ) {
83
+ cardIndex = 0 ;
84
+ } ,
85
+ length : function ( ) {
86
+ return cards . length ;
87
+ }
88
+ }
86
89
} ) ( ) ;
87
90
88
91
function build_formation ( positions ) {
89
92
Deck . reset ( ) ;
90
- for ( i = 0 ; i < positions . length ; ++ i ) {
91
- snabbt ( Deck . next_card ( ) , {
93
+ for ( var i = 0 ; i < positions . length ; ++ i ) {
94
+ snabbt ( Deck . nextCard ( ) , {
92
95
position : positions [ i ] . position ,
93
96
rotation : positions [ i ] . rotation ,
94
97
easing : 'ease' ,
@@ -97,43 +100,47 @@ function build_formation(positions) {
97
100
}
98
101
}
99
102
100
- function set_mode ( mode ) {
101
- update_sizes ( ) ;
102
- if ( mode == current_mode ) {
103
+ function setMode ( mode ) {
104
+ updateSizes ( ) ;
105
+ if ( mode = == current_mode ) {
103
106
return ;
104
107
}
105
108
106
- positions = formation_builders [ mode ] ( ) ;
109
+ var positions = formationBuilders [ mode ] ( ) ;
107
110
build_formation ( positions ) ;
108
111
109
112
current_mode = mode ;
110
113
}
111
114
112
- function rotate_container ( ) {
115
+ function rotateContainer ( ) {
113
116
var container = document . getElementById ( 'surface' ) ;
114
117
snabbt ( container , {
115
- rotation : [ 0 , 2 * Math . PI , 0 ] ,
118
+ fromRotation : [ 0 , 0 , 0 ] ,
119
+ rotation : [ 0 , 2 * Math . PI , 0 ] ,
116
120
duration : 10000 ,
117
121
perspective : 2000 ,
118
- loop : Infinity
122
+ complete : function ( ) {
123
+ console . log ( 'compoete' ) ;
124
+ rotateContainer ( ) ;
125
+ }
119
126
} ) ;
120
127
}
121
128
122
129
function pile_positions ( ) {
123
130
Deck . reset ( ) ;
124
131
var positions = [ ] ;
125
132
126
- var i = 0 ;
127
- var card = Deck . next_card ( ) ;
128
- var center = ( WIDTH - CARD_WIDTH ) / 2 ;
129
- var y = HEIGHT - HEIGHT * 0.2 ;
130
- while ( card ) {
133
+ var i = 0 ;
134
+ var card = Deck . nextCard ( ) ;
135
+ var center = ( WIDTH - CARD_WIDTH ) / 2 ;
136
+ var y = HEIGHT - HEIGHT * 0.2 ;
137
+ while ( card ) {
131
138
positions . push ( {
132
- position : [ center , y - i * 0.5 , WIDTH * 0.1 ] ,
133
- rotation : [ Math . PI / 2 , 0 , 0 ] ,
139
+ position : [ center , y - i * 0.5 , WIDTH * 0.1 ] ,
140
+ rotation : [ Math . PI / 2 , 0 , 0 ]
134
141
} ) ;
135
142
++ i ;
136
- card = Deck . next_card ( ) ;
143
+ card = Deck . nextCard ( ) ;
137
144
}
138
145
return positions ;
139
146
}
@@ -142,13 +149,13 @@ function house_positions() {
142
149
Deck . reset ( ) ;
143
150
144
151
var floors = 5 ;
145
- var y = ( floors - 1 ) * TILTED_CARD_HEIGHT + TILTED_CARD_HEIGHT / 2 ;
152
+ var y = ( floors - 1 ) * TILTED_CARD_HEIGHT + TILTED_CARD_HEIGHT / 2 ;
146
153
var z = - WIDTH * 0.2 ;
147
154
var x = ( WIDTH - PYRAMID_WIDTH * floors ) / 2 - TILTED_CARD_WIDTH ;
148
155
149
156
var positions = [ ] ;
150
157
var i ;
151
- for ( i = 0 ; i < floors ; ++ i ) {
158
+ for ( i = 0 ; i < floors ; ++ i ) {
152
159
var _x = x + i * TILTED_CARD_WIDTH + i * CARD_SPACING ;
153
160
var _y = y - i * TILTED_CARD_HEIGHT - i * CARD_SPACING ;
154
161
positions = positions . concat ( house_row_positions ( floors - i , _x , _y , z ) ) ;
@@ -161,37 +168,37 @@ function house_row_positions(count, x, y, z) {
161
168
var positions = [ ] ;
162
169
var i ;
163
170
// Tilted cards
164
- for ( i = 0 ; i < count ; ++ i ) {
165
- card_positions = pyramid_postions ( x + i * PYRAMID_WIDTH , y , z ) ;
171
+ for ( i = 0 ; i < count ; ++ i ) {
172
+ var cardPositions = pyramid_postions ( x + i * PYRAMID_WIDTH , y , z ) ;
166
173
positions . push ( {
167
- position : card_positions [ 0 ] . position ,
168
- rotation : card_positions [ 0 ] . rotation ,
174
+ position : cardPositions [ 0 ] . position ,
175
+ rotation : cardPositions [ 0 ] . rotation
169
176
} ) ;
170
177
positions . push ( {
171
- position : card_positions [ 1 ] . position ,
172
- rotation : card_positions [ 1 ] . rotation ,
178
+ position : cardPositions [ 1 ] . position ,
179
+ rotation : cardPositions [ 1 ] . rotation
173
180
} ) ;
174
181
}
175
182
// Bridge cards
176
- for ( i = 0 ; i < count - 1 ; ++ i ) {
183
+ for ( i = 0 ; i < count - 1 ; ++ i ) {
177
184
positions . push ( {
178
- position : [ x + i * PYRAMID_WIDTH + TILTED_CARD_WIDTH , y - TILTED_CARD_HEIGHT / 2 - CARD_SPACING / 2 , z ] ,
179
- rotation : [ Math . PI / 2 , Math . PI / 2 , 0 ] ,
185
+ position : [ x + i * PYRAMID_WIDTH + TILTED_CARD_WIDTH , y - TILTED_CARD_HEIGHT / 2 - CARD_SPACING / 2 , z ] ,
186
+ rotation : [ Math . PI / 2 , Math . PI / 2 , 0 ]
180
187
} ) ;
181
188
}
182
189
return positions ;
183
190
}
184
191
185
192
function pyramid_postions ( x , y , z ) {
186
193
// Firefox flickers if elements overlap
187
- var spacing = ( TILTED_CARD_WIDTH / 2 ) + CARD_SPACING / 2 ;
194
+ var spacing = TILTED_CARD_WIDTH / 2 + CARD_SPACING / 2 ;
188
195
189
196
return [ {
190
197
position : [ x - spacing , y , z ] ,
191
- rotation : [ - TILT , Math . PI / 2 , 0 ] ,
198
+ rotation : [ - TILT , Math . PI / 2 , 0 ]
192
199
} , {
193
200
position : [ x + spacing , y , z ] ,
194
- rotation : [ TILT , Math . PI / 2 , 0 ] ,
201
+ rotation : [ TILT , Math . PI / 2 , 0 ]
195
202
} ] ;
196
203
}
197
204
@@ -201,9 +208,9 @@ function wall_positions() {
201
208
var h = CARD_HEIGHT + 10 ;
202
209
var start_x = ( WIDTH - 10 * w ) / 2 ;
203
210
var start_y = ( HEIGHT - 4 * h ) / 2 ;
204
- for ( var i = 0 ; i < CARD_COUNT ; ++ i ) {
205
- var x = ( i % 10 ) * w + start_x ;
206
- var y = ( Math . floor ( i / 10 ) ) * h + start_y ;
211
+ for ( var i = 0 ; i < CARD_COUNT ; ++ i ) {
212
+ var x = i % 10 * w + start_x ;
213
+ var y = Math . floor ( i / 10 ) * h + start_y ;
207
214
positions . push ( {
208
215
position : [ x , y , 0 ] ,
209
216
rotation : [ 0 , 0 , 0 ]
@@ -216,47 +223,35 @@ function cylinder_positions() {
216
223
var positions = [ ] ;
217
224
var start_x = WIDTH / 2 ;
218
225
var start_y = HEIGHT * 0.1 ;
219
- var radius = WIDTH * 0.2 ;
220
- for ( var i = 0 ; i < CARD_COUNT ; ++ i ) {
221
- var angle = ( ( i % 10 ) / 10 ) * 2 * Math . PI ;
226
+ var radius = WIDTH * 0.2 ;
227
+ for ( var i = 0 ; i < CARD_COUNT ; ++ i ) {
228
+ var angle = i % 10 / 10 * 2 * Math . PI ;
222
229
var x = Math . cos ( angle ) * radius + start_x ;
223
230
var z = Math . sin ( angle ) * radius ;
224
231
var y = Math . floor ( i / 10 ) * 1.2 * CARD_HEIGHT + start_y ;
225
232
positions . push ( {
226
233
position : [ x , y , z ] ,
227
- rotation : [ 0 , Math . PI / 2 + angle , 0 ] ,
234
+ rotation : [ 0 , Math . PI / 2 + angle , 0 ]
228
235
} ) ;
229
236
}
230
237
return positions ;
231
238
}
232
239
233
- function build_wall ( ) {
234
- set_mode ( WALL ) ;
235
- }
236
-
237
- function build_house ( ) {
238
- set_mode ( HOUSE ) ;
239
- }
240
-
241
- function build_pile ( ) {
242
- set_mode ( PILE ) ;
243
- }
244
-
245
240
function init ( ) {
246
- update_sizes ( ) ;
241
+ updateSizes ( ) ;
247
242
Deck . reset ( ) ;
248
- build_pile ( ) ;
249
- rotate_container ( ) ;
243
+ setMode ( PILE ) ;
244
+ rotateContainer ( ) ;
250
245
251
246
// Initialize fast click
252
247
FastClick . attach ( document . body ) ;
253
248
254
249
// Event handlers
255
250
var buttons = {
256
- " pile_button" : PILE ,
257
- " house_button" : HOUSE ,
258
- " wall_button" : WALL ,
259
- " cylinder_button" : CYLINDER
251
+ ' pile_button' : PILE ,
252
+ ' house_button' : HOUSE ,
253
+ ' wall_button' : WALL ,
254
+ ' cylinder_button' : CYLINDER
260
255
} ;
261
256
262
257
var click_handler = function ( key ) {
@@ -265,10 +260,10 @@ function init() {
265
260
document . getElementById ( 'wall_button' ) . className = '' ;
266
261
document . getElementById ( 'cylinder_button' ) . className = '' ;
267
262
document . getElementById ( key ) . className = 'button-primary' ;
268
- set_mode ( buttons [ key ] ) ;
263
+ setMode ( buttons [ key ] ) ;
269
264
} ;
270
265
271
- for ( var key in buttons ) {
272
- document . getElementById ( key ) . addEventListener ( 'click' , click_handler . bind ( undefined , key ) ) ;
273
- }
266
+ Object . keys ( buttons ) . forEach ( function ( key ) {
267
+ document . getElementById ( key ) . addEventListener ( 'click' , click_handler . bind ( null , key ) ) ;
268
+ } ) ;
274
269
}
0 commit comments