4 * Copyright (C) 2006 matteo.nastasi@milug.org
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details. You should have received a
15 * copy of the GNU General Public License along with this program; if
16 * not, write to the Free Software Foundation, Inc, 59 Temple Place -
17 * Suite 330, Boston, MA 02111-1307, USA.
27 var is_my_time = false;
28 /* number of takes cards */
44 var cards_width = 55 + 2;
45 var cards_width_d2 = 27;
47 /* height of images */
48 var cards_height = 101 + 2;
49 var cards_height_d2 = 51;
51 /* width of hands area */
52 var hands_width = 400;
54 /* width of the border */
55 var border_width = 10;
57 /* time to send a card to the player 10 or 250 */
58 var G_send_time = 250;
60 /* suffix to add to images name */
61 var sux = new Array( "", "_ea", "", "", "_we");
63 var cards_pos = new Array (8);
64 var cards_ea_pos = new Array (8);
65 var cards_ne_pos = new Array (8);
66 var cards_nw_pos = new Array (8);
67 var cards_we_pos = new Array (8);
69 var take_x = new Array(562, 745, 452, 30, 52);
70 var take_y = new Array(545, 177, 70, 62,155);
72 for (i = 0 ; i < 8 ; i++) {
79 function $(id) { return document.getElementById(id); }
81 function cards_dispose_so(car_n, tak_n)
85 $("takes").style.left = 200 + 400 - 90 + ((90 - cards_width) / 2);
86 $("takes").style.top = 475 + (125 - cards_height)/2;
87 $("takes").style.zIndex = 1;
88 $("takes").style.visibility = "visible";
94 disp = 400 - delta - (2 * border_width);
96 inter = parseInt((disp - cards_width) / (car_n - 1));
97 if (inter > cards_width)
102 wcard = cards_width + inter * (car_n - 1);
103 start = 200 + border_width + (400 - border_width - border_width - wcard - delta) / 2;
105 for (i = 0 ; i < car_n ; i++) {
106 $("card" + cards_pos[i]).style.left = start + (i * inter);
107 $("card" + cards_pos[i]).style.top = 475 + (125 - cards_height)/2;
108 $("card" + cards_pos[i]).style.zIndex = 8 - i;
109 $("card" + cards_pos[i]).style.visibility = "visible";
118 function cards_dispose_ne(car_n, tak_n) {
123 $("takes_ne").style.left = 800 - cards_width - 400 + 90 - ((90 - cards_width) / 2);
124 $("takes_ne").style.top = (125 - cards_height)/2;
125 $("takes_ne").style.zIndex = 1;
126 $("takes_ne").style.visibility = "visible";
132 disp = 400 - delta - (2 * border_width);
134 inter = parseInt((disp - cards_width) / (car_n - 1));
135 if (inter > cards_width)
140 wcard = cards_width + inter * (car_n - 1);
141 start = 800 - cards_width - border_width - (400 - border_width - border_width - wcard - delta) / 2;
144 for (i = 0 ; i < car_n ; i++) {
145 $("card_ne" + cards_ne_pos[i]).style.left = start - ((car_n - i -1) * inter);
146 $("card_ne" + cards_ne_pos[i]).style.top = (125 - cards_height)/2;
147 $("card_ne" + cards_ne_pos[i]).style.zIndex = 8-i;
148 $("card_ne" + cards_ne_pos[i]).style.visibility = "visible";
157 function cards_dispose_nw(car_n, tak_n) {
162 $("takes_nw").style.left = 400 - cards_width - 400 + 90 - ((90 - cards_width) / 2);
163 $("takes_nw").style.top = (125 - cards_height)/2;
164 $("takes_nw").style.zIndex = 1;
165 $("takes_nw").style.visibility = "visible";
171 disp = 400 - delta - (2 * border_width);
173 inter = parseInt((disp - cards_width) / (car_n - 1));
174 if (inter > cards_width)
179 wcard = cards_width + inter * (car_n - 1);
180 // start = 0 + delta + border_width + (400 - border_width - border_width - wcard - delta) / 2;
181 start = 400 - cards_width - border_width - (400 - border_width - border_width - wcard - delta) / 2;
184 for (i = 0 ; i < car_n ; i++) {
185 $("card_nw" + cards_nw_pos[i]).style.left = start - ((car_n-i-1) * inter);
186 $("card_nw" + cards_nw_pos[i]).style.top = (125 - cards_height)/2;
187 $("card_nw" + cards_nw_pos[i]).style.zIndex = (8-i);
188 $("card_nw" + cards_nw_pos[i]).style.visibility = "visible";
189 // alert("xx "+start + (i * inter)+" yy " + (125 - cards_height)/2);
198 function cards_dispose_ea(car_n, tak_n) {
201 $("takes_ea").style.left = 675 + (125 - cards_height)/2;
202 $("takes_ea").style.top = 125 + ((90 - cards_width) / 2);
203 $("takes_ea").style.zIndex = 1;
204 $("takes_ea").style.visibility = "visible";
209 disp = 400 - delta - (2 * border_width);
211 inter = parseInt((disp - cards_width) / (car_n - 1));
212 if (inter > cards_width)
217 wcard = cards_width + inter * (car_n - 1);
218 start = 125 + delta + border_width + (400 - border_width - border_width - wcard - delta) / 2;
221 for (i = 0 ; i < car_n ; i++) {
222 $("card_ea" + cards_ea_pos[i]).style.left = 675 + (125 - cards_height)/2;
223 $("card_ea" + cards_ea_pos[i]).style.top = start + (i * inter);
224 $("card_ea" + cards_ea_pos[i]).style.zIndex = 8 - i;
225 $("card_ea" + cards_ea_pos[i]).style.visibility = "visible";
226 // alert("xx "+ (675 + (125 - cards_height)/2) +" yy " + start + (i * inter));
235 function cards_dispose_we(car_n, tak_n)
239 $("takes_we").style.left = (125 - cards_height)/2;
240 // $("takes_we").style.top = 125 + 400 - 90 + ((90 - cards_width) / 2);
241 $("takes_we").style.top = 525 - cards_width - 400 + 90 - ((90 - cards_width) / 2);
242 $("takes_we").style.zIndex = 1;
243 $("takes_we").style.visibility = "visible";
248 /* pixel a disposizione per mettere le carte: 400 - delta - 2 bordi */
249 disp = 400 - delta - (2 * border_width);
250 /* se c'e' piu' di una carta calcola di quanti pixel devono rimanere scoperte le carte dopo la prima */
252 inter = parseInt((disp - cards_width) / (car_n - 1));
253 if (inter > cards_width)
259 /* dopo avere fatto tutti i conti ricalcola quanti pixel effettivamente verranno occupati dalle carte */
260 wcard = cards_width + inter * (car_n - 1);
262 /* calcola il punto d'inizio da dove disporre le carte: DELTAY + lo spessore del bordo + la meta' di quello
263 che resta della larghezza totale meno tutti gli altri ingombri */
264 // start = 125 + border_width + (400 - border_width - border_width - wcard - delta) / 2;
265 start = 525 - cards_width - border_width - (400 - border_width - border_width - wcard - delta) / 2;
267 for (i = 0 ; i < car_n ; i++) {
268 $("card_we" + cards_we_pos[i]).style.left = (125 - cards_height)/2;
269 $("card_we" + cards_we_pos[i]).style.top = start - (i * inter);
270 $("card_we" + cards_we_pos[i]).style.zIndex = 8 - i;
271 $("card_we" + cards_we_pos[i]).style.visibility = "visible";
280 var cards_dispose_arr = new Array(cards_dispose_so, cards_dispose_ea,
281 cards_dispose_ne, cards_dispose_nw,
284 function cards_dispose(player_pos, cards, takes)
286 var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
288 return (cards_dispose_arr[idx](cards,takes));
294 function card_mouseup_cb(o) {
295 var idx = o.id.substring(4);
296 var briskid = o.briskid;
302 /* case swap in the group */
305 if (parseInt(o.style.top) > 475 &&
306 parseInt(o.style.left) >= 200 && parseInt(o.style.left) < 600) {
307 /* Rearrange cards */
309 // $("sandbox3").innerHTML = "REARRANGE: "+idx;
316 /* found the associated index of the current card. */
317 for (i = 0 ; i < cards_n ; i++)
318 if (cards_pos[i] == idx)
322 disp = 400 - delta - (2 * border_width);
324 inter = parseInt((disp - cards_width) / (cards_n - 1));
325 if (inter > cards_width)
330 wcard = cards_width + inter * (cards_n - 1);
331 start = 200 + border_width + (400 - border_width - border_width - wcard - delta) / 2;
333 for (i = 0 ; i < cards_n ; i++) {
334 /* $("sandbox").innerHTML = */
335 // alert( "LEFT: " + o.style.left + "VALUE " + (cards_width + start + (i * (cards_width / 2))));
336 // $("sandbox3").innerHTML += "<br>LEFT: "+parseInt(o.style.left)+" START["+i+"]: "+(start + ((i+1) * inter));
338 tst = (parseInt(o.style.left) < start + ((i+1) * inter));
340 tst = (parseInt(o.style.left) > start + (i * inter));
342 // $("sandbox2").innerHTML = "old: " +old_idx+ " i: " +i+ "left: " + parseInt(o.style.left) + "comp: " + (start + (cards_width / 2) + (i * (cards_width / 2)));
348 for (e = old_idx ; e < i ; e++)
349 cards_pos[e] = cards_pos[e+1];
353 for (e = old_idx ; e > i ; e--)
354 cards_pos[e] = cards_pos[e-1];
361 cards_dispose_so(cards_n,takes_n);
365 else if (is_my_time &&
366 parseInt(o.style.top) >= 250 &&
367 parseInt(o.style.top) + cards_height < 450 &&
368 parseInt(o.style.left) >= 300 &&
369 (parseInt(o.style.left) + cards_width) < 500) {
372 $("sandbox2").innerHTML = "PLAYED";
374 for (i = 0 ; i < cards_n ; i++) {
375 if (cards_pos[i] == idx) {
376 $("sandbox").innerHTML = "Pippo: "+ i;
377 for (e = i ; e < cards_n-1 ; e++) {
378 cards_pos[e] = cards_pos[e+1];
380 cards_pos[cards_n-1] = idx;
382 cards_dispose_so(cards_n, takes_n);
385 act_play(briskid,o.style.left,o.style.top);
389 cards_dispose_so(cards_n, takes_n);
394 $("sandbox2").innerHTML = "TO ORIGINAL";
395 /* alert("out card " + parseInt(o.style.top)); */
396 /* return to the original position */
397 cards_dispose_so(cards_n, takes_n);
404 function card_send_so(id,card,free,ct)
406 var img = $("card"+id);
407 img.src = getcard(-1,0);
410 img.style.left = 400 - cards_width_d2;
411 img.style.top = 300 - cards_height_d2;
412 img.style.zIndex = 100;
414 var movimg = new slowimg(img,400 - cards_width / 2,475 + (125 - cards_height)/2,25,free,"cards_dispose_so("+ct+", 0)",getcard(card,0));
415 movimg.settime(G_send_time);
419 function card_send_ea(id,card,free,ct)
421 var img = $("card_ea"+id);
422 img.src = getcard(card,1);
425 img.style.left = 400 - cards_height_d2;
426 img.style.top = 300 - cards_width_d2;
427 img.style.zIndex = 100;
429 var movimg = new slowimg(img,686,296,25,free,"cards_dispose_ea("+ct+", 0);",getcard(card,1));
430 movimg.settime(G_send_time);
434 function card_send_ne(id,card,free,ct)
436 var img = $("card_ne"+id);
437 img.src = getcard(card,2);
440 img.style.left = 400 - cards_width_d2;
441 img.style.top = 300 - cards_height_d2;
442 img.style.zIndex = 100;
444 var movimg = new slowimg(img,571,11,25,free,"cards_dispose_ne("+ct+", 0);",getcard(card,2));
445 movimg.settime(G_send_time);
449 function card_send_nw(id,card,free,ct)
451 var img = $("card_nw"+id);
452 img.src = getcard(card,3);
455 img.style.left = 400 - cards_width_d2;
456 img.style.top = 300 - cards_height_d2;
457 img.style.zIndex = 100;
459 var movimg = new slowimg(img,171,11,25,free,"cards_dispose_nw("+ct+", 0);",getcard(card,3));
460 movimg.settime(G_send_time);
464 function card_send_we(id,card,free,ct)
466 var img = $("card_we"+id);
467 img.src = getcard(card,4);
470 if (id < 0 || id > 39)
471 alert("ID ERRATO"+id);
473 img.style.left = 400 - cards_height_d2;
474 img.style.top = 300 - cards_width_d2;
475 img.style.zIndex = 100;
476 var movimg = new slowimg(img,11,296,25,free,"cards_dispose_we("+ct+", 0);",getcard(card,4));
477 movimg.settime(G_send_time);
481 var card_send_arr = new Array(card_send_so, card_send_ea,
482 card_send_ne, card_send_nw,
485 function card_send(player_pos,id,card,free,ct)
487 var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
489 card_send_arr[idx](id,card,free,ct);
492 function getcard(card,pos_id)
495 return ("img/cover"+sux[pos_id]+".png");
497 return ("img/0"+card+sux[pos_id]+".png");
499 return ("img/"+card+sux[pos_id]+".png");
502 function card_setours(zer,uno,due,tre,qua,cin,sei,set)
505 var arg = new Array(zer,uno,due,tre,qua,cin,sei,set);
507 for (i = 0 ; i < 8 ; i++) {
508 $("card"+i).src = getcard(arg[i], 0);
509 $("card"+i).briskid = arg[i];
515 function card_play_so(card_idx, x, y)
517 alert("card_play_so: unreachable function.");
519 function card_play_ne(card_idx, x, y)
521 // alert("card_play_nw: card_pos="+ card_pos+" card_idx="+card_idx+" x="+x+" y="+y);
525 function card_postplay_ea(card_pos)
527 var img = $("card_ea"+card_pos);
530 for (i = 0 ; i < cards_ea_n ; i++) {
531 if (cards_ea_pos[i] == card_pos) {
532 for (e = i ; e < cards_ea_n-1 ; e++) {
533 cards_ea_pos[e] = cards_ea_pos[e+1];
535 cards_ea_pos[cards_ea_n-1] = card_pos;
537 cards_dispose_ea(cards_ea_n, takes_ea_n);
543 function card_play_ea(card_idx, x, y)
545 // var card_pos = RANGE 0 <= x < cards_ea_n
546 var card_pos = rnd_int(0,cards_ea_n-1);
547 var img = $("card_ea"+cards_ea_pos[card_pos]);
548 // alert("IMMO CON "+cards_ea_pos[card_pos]);
549 var newname = getcard(card_idx,1);
552 x1 = 500 + ((y-250) * (125 - cards_height) / (200 - cards_height));
553 y1 = 450 - cards_width - (x - 300);
555 var movimg = new slowimg(img, x1, y1, 1, 1, "card_postplay_ea("+cards_ea_pos[card_pos]+");", newname);
561 function card_postplay_ne(card_pos)
563 var img = $("card_ne"+card_pos);
566 for (i = 0 ; i < cards_ne_n ; i++) {
567 if (cards_ne_pos[i] == card_pos) {
568 for (e = i ; e < cards_ne_n-1 ; e++) {
569 cards_ne_pos[e] = cards_ne_pos[e+1];
571 cards_ne_pos[cards_ne_n-1] = card_pos;
573 cards_dispose_ne(cards_ne_n, takes_ne_n);
579 function card_play_ne(card_idx, x, y)
581 var card_pos = rnd_int(0,cards_ne_n-1);
582 var img = $("card_ne"+cards_ne_pos[card_pos]);
583 var newname = getcard(card_idx,2);
586 x1 = 600 - cards_width - (x - 300);
587 y1 = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
589 var movimg = new slowimg(img, x1, y1, 1, 1, "card_postplay_ne("+cards_ne_pos[card_pos]+");", newname);
595 function card_postplay_nw(card_pos)
597 var img = $("card_nw"+card_pos);
600 for (i = 0 ; i < cards_nw_n ; i++) {
601 if (cards_nw_pos[i] == card_pos) {
602 for (e = i ; e < cards_nw_n-1 ; e++) {
603 cards_nw_pos[e] = cards_nw_pos[e+1];
605 cards_nw_pos[cards_nw_n-1] = card_pos;
607 cards_dispose_nw(cards_nw_n, takes_nw_n);
613 function card_play_nw(card_idx, x, y)
615 var card_pos = rnd_int(0,cards_nw_n-1);
616 var img = $("card_nw"+cards_nw_pos[card_pos]);
617 var newname = getcard(card_idx,3);
620 x1 = 400 - cards_width - (x - 300);
621 y1 = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
623 var movimg = new slowimg(img, x1, y1, 1, 1, "card_postplay_nw("+cards_nw_pos[card_pos]+");", newname);
629 function card_postplay_we(card_pos)
631 var img = $("card_we"+card_pos);
634 for (i = 0 ; i < cards_we_n ; i++) {
635 if (cards_we_pos[i] == card_pos) {
636 for (e = i ; e < cards_we_n-1 ; e++) {
637 cards_we_pos[e] = cards_we_pos[e+1];
639 cards_we_pos[cards_we_n-1] = card_pos;
641 cards_dispose_we(cards_we_n, takes_we_n);
647 function card_play_we(card_idx, x, y)
649 var card_pos = rnd_int(0,cards_we_n-1);
650 var img = $("card_we"+cards_we_pos[card_pos]);
651 var newname = getcard(card_idx,4);
654 x1 = 300 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
657 var movimg = new slowimg(img, x1, y1, 1, 1, "card_postplay_we("+cards_we_pos[card_pos]+");", newname);
662 var card_play_arr = new Array( card_play_so, card_play_ea, card_play_ne, card_play_nw, card_play_we);
664 /* card_play(player_pos, card_pos, card_idx, x, y)
665 player_pos - position of the player on the table
666 card_pos - position of the card in the hand of the player
667 card_idx - id of the card (to show it after the move)
668 x, y - coordinates of the card on the original table
670 orig 200x200 dest 200x125
672 function card_play(player_pos, card_idx, x, y)
674 var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
676 card_play_arr[idx](card_idx, x, y);
681 function card_place_so(card_pos, card_idx, x, y)
683 var img = $("card"+card_pos);
685 // alert("card_place_so"+card_pos);
689 img.style.visibility = "visible";
690 img.src = getcard(card_idx,0);
694 function card_place_ea(card_pos, card_idx, x, y)
696 var img = $("card_ea"+card_pos);
698 // alert("card_place_ea");
700 img.style.left = 500 + ((y-250) * (125 - cards_height) / (200 - cards_height));
701 img.style.top = 450 - cards_width - (x - 300);
702 img.style.visibility = "visible";
703 img.src = getcard(card_idx,1);
707 function card_place_ne(card_pos, card_idx, x, y)
709 var img = $("card_ne"+card_pos);
711 // alert("card_place_ne");
713 img.style.left = 600 - cards_width - (x - 300);
714 img.style.top = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
715 img.style.visibility = "visible";
716 img.src = getcard(card_idx,2);
720 function card_place_nw(card_pos, card_idx, x, y)
722 var img = $("card_nw"+card_pos);
724 // alert("card_place_nw");
726 img.style.left = 400 - cards_width - (x - 300);
727 img.style.top = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
728 img.style.visibility = "visible";
729 img.src = getcard(card_idx,3);
733 function card_place_we(card_pos, card_idx, x, y)
735 var img = $("card_we"+card_pos);
737 // alert("card_place_we");
739 img.style.left = 300 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
740 img.style.top = 250 + x - 300;
741 img.style.visibility = "visible";
742 img.src = getcard(card_idx,4);
745 var card_place_arr = new Array( card_place_so, card_place_ea, card_place_ne, card_place_nw, card_place_we );
748 function card_place(player_pos, card_pos, card_idx, x, y)
750 var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
752 // alert("card_place"+idx);
754 card_place_arr[idx](card_pos, card_idx, x, y);
759 function card_post_take(card)
761 var img = $("card"+card);
762 img.style.visibility = "hidden";
763 cards_dispose_so(cards_n, takes_n);
766 function card_ea_post_take(card)
768 var img = $("card_ea"+card);
769 img.style.visibility = "hidden";
770 cards_dispose_ea(cards_ea_n, takes_ea_n);
773 function card_ne_post_take(card)
775 var img = $("card_ne"+card);
776 img.style.visibility = "hidden";
777 cards_dispose_ne(cards_ne_n, takes_ne_n);
780 function card_nw_post_take(card)
782 var img = $("card_nw"+card);
783 img.style.visibility = "hidden";
784 cards_dispose_nw(cards_nw_n, takes_nw_n);
787 function card_we_post_take(card)
789 var img = $("card_we"+card);
790 img.style.visibility = "hidden";
791 cards_dispose_we(cards_we_n, takes_we_n);
795 function cards_take(win)
799 var taker = (win - table_pos + PLAYERS_N) % PLAYERS_N;
801 // alert("cards_n: "+cards_n+"card: "+cards_pos[cards_n]+"cards_ea_n: "+cards_ea_n+"card_ea: "+cards_ea_pos[cards_ea_n]+"cards_ne_n: "+cards_ne_n+"card_ne: "+cards_ne_pos[cards_ne_n] + "taker:"+taker);
805 takes_n += PLAYERS_N; break;
807 takes_ea_n += PLAYERS_N; break;
809 takes_ne_n += PLAYERS_N; break;
811 takes_nw_n += PLAYERS_N; break;
813 takes_we_n += PLAYERS_N; break;
818 var img = $("card"+cards_pos[cards_n]);
819 var movimg = new slowimg(img,
820 take_x[taker] - cards_width_d2,
821 take_y[taker] - cards_height_d2,
822 1, 0, "card_post_take("+cards_pos[cards_n]+");", null);
826 var img = $("card_ea"+cards_ea_pos[cards_ea_n]);
827 var movimg = new slowimg(img,
828 take_x[taker] - cards_height_d2,
829 take_y[taker] - cards_width_d2,
830 1, 0, "card_ea_post_take("+cards_ea_pos[cards_ea_n]+");", null);
834 var img = $("card_ne"+cards_ne_pos[cards_ne_n]);
835 var movimg = new slowimg(img,
836 take_x[taker] - cards_width_d2,
837 take_y[taker] - cards_height_d2,
838 1, (PLAYERS_N == 3 ? 1 : 0), "card_ne_post_take("+cards_ne_pos[cards_ne_n]+");", null);
842 var img = $("card_nw"+cards_nw_pos[cards_nw_n]);
843 var movimg = new slowimg(img,
844 take_x[taker] - cards_width_d2,
845 take_y[taker] - cards_height_d2,
846 1, 0, "card_nw_post_take("+cards_nw_pos[cards_nw_n]+");", null);
850 var img = $("card_we"+cards_we_pos[cards_we_n]);
851 var movimg = new slowimg(img,
852 take_x[taker] - cards_height_d2,
853 take_y[taker] - cards_width_d2,
854 1, 1, "card_we_post_take("+cards_we_pos[cards_we_n]+");", null);
860 function cards_hidetake(win)
868 window.onload = function() {
869 $("log").innerHTML += " xxxxxxxxxxxxxxxxxxxxxONLOAD<br>"; 53;
872 // $("imm2").style.left = 600;
873 // $("imm2").style.top = 400;
874 var zigu = new slowimg($("imm"),300,100,15,"fin");
877 // setTimeout(function() { alert("FIN:" + fin); }, 5000);
884 window.onload = function() {
886 var greet = document.createElement("span");
887 greet.style.backgroundColor = "yellow";
888 greet.innerHTML = "Hello World!";
889 $("sandbox").appendChild(greet);
893 for (i=0 ; i < 8 ; i++) {
894 Drag.init($("card" + i), card_mouseup_cb);