update
[brisk.git] / web / dnd.js
1 /*
2  *  brisk - dnd.js
3  *
4  *  Copyright (C) 2006-2008 Matteo Nastasi
5  *                          mailto: nastasi@alternativeoutput.it 
6  *                                  matteo.nastasi@milug.org
7  *                          web: http://www.alternativeoutput.it
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful, but
15  * WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABLILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  * General Public License for more details. You should have received a
18  * copy of the GNU General Public License along with this program; if
19  * not, write to the Free Software Foundation, Inc, 59 Temple Place -
20  * Suite 330, Boston, MA 02111-1307, USA.
21  *
22  * $Id$
23  *
24  */
25
26 var PLAYERS_N = 3;
27 /* current manche */
28 var manche = 1;
29 /* cards on hands */
30 var cards_n;
31 /* is my time */
32 var is_my_time = false;
33 /* number of takes cards */
34 var takes_n;
35
36 var cards_ea_n;
37 var takes_ea_n;
38
39 var cards_ne_n;
40 var takes_ne_n;
41
42 var cards_nw_n;
43 var takes_nw_n;
44
45 var cards_we_n;
46 var takes_we_n;
47
48 /* width of images */
49 var cards_width = 55 + 2; 
50 var cards_width_d2 =  27; 
51
52 /* height of images */
53 var cards_height = 101 + 2; 
54 var cards_height_d2 =   51; 
55
56 /* width of hands area */
57 var hands_width = 400;
58
59 /* width of the border */
60 var border_width = 10;
61
62 /* time to send a card to the player 10 or 250 */
63 var G_send_time = 250;
64 var G_play_time = 500;
65 var G_take_time = 500;
66
67 /* suffix to add to images name */
68 var sux = new Array( "", "_ea", "", "", "_we");
69
70 var cards_pos = new Array (8);
71 var cards_ea_pos = new Array (8);
72 var cards_ne_pos = new Array (8);
73 var cards_nw_pos = new Array (8);
74 var cards_we_pos = new Array (8);
75
76 var take_x = new Array(562, 745, 452, 30, 52);
77 var take_y = new Array(545, 177,  70, 62,155);
78
79 for (i = 0 ; i < 8 ; i++) {
80     cards_pos[i] = i;
81     cards_ea_pos[i] = i;
82     cards_ne_pos[i] = i;
83     cards_nw_pos[i] = i;
84     cards_we_pos[i] = i;
85 }
86 function $(id) { return document.getElementById(id); }
87
88 function cards_dispose_so(car_n, tak_n)
89 {
90     if (tak_n > 0) {
91         delta = 80;
92         $("takes").style.left = 200 + 400 - 90 + ((90 - cards_width) /  2);
93         $("takes").style.top  = 475 + (125 - cards_height)/2;
94         $("takes").style.zIndex = 1;
95         $("takes").style.visibility = "visible";
96     }
97     else
98         delta = 0;
99         
100
101     disp = 400 - delta - (2 * border_width);
102     if (car_n > 1) {
103         inter = parseInt((disp  - cards_width) / (car_n - 1));
104         if (inter > cards_width)
105             inter = cards_width;
106     }
107     else
108         inter = 0;
109     wcard = cards_width + inter * (car_n - 1);
110     start = 200 + border_width + (400 - border_width - border_width - wcard - delta) / 2;
111
112     for (i = 0 ; i < car_n ; i++) {
113         $("card" + cards_pos[i]).style.left = start + (i * inter);
114         $("card" + cards_pos[i]).style.top  = 475 + (125 - cards_height)/2;
115         $("card" + cards_pos[i]).style.zIndex = 8 - i;
116         $("card" + cards_pos[i]).style.visibility = "visible";
117     }
118
119     cards_n = car_n;
120     takes_n = tak_n;
121
122     return (0);
123
124
125 function cards_dispose_ne(car_n, tak_n) {
126     // tak_n = 2;
127
128     if (tak_n > 0) {
129         delta = 80;
130         $("takes_ne").style.left = 800 - cards_width - 400 + 90 - ((90 - cards_width) /  2);
131         $("takes_ne").style.top  = (125 - cards_height)/2;
132         $("takes_ne").style.zIndex = 1;
133         $("takes_ne").style.visibility = "visible";
134     }
135     else
136         delta = 0;
137         
138
139     disp = 400 - delta - (2 * border_width);
140     if (car_n > 1) {
141         inter = parseInt((disp  - cards_width) / (car_n - 1));
142         if (inter > cards_width)
143             inter = cards_width;
144     }
145     else
146         inter = 0;
147     wcard = cards_width + inter * (car_n - 1);
148     start = 800 - cards_width - border_width - (400 - border_width - border_width - wcard - delta) / 2;
149
150     list = "LIST: ";
151     for (i = 0 ; i < car_n ; i++) {
152         $("card_ne" + cards_ne_pos[i]).style.left = start - ((car_n - i -1) * inter);
153         $("card_ne" + cards_ne_pos[i]).style.top  = (125 - cards_height)/2;
154         $("card_ne" + cards_ne_pos[i]).style.zIndex = 8-i;
155         $("card_ne" + cards_ne_pos[i]).style.visibility = "visible";
156     }
157
158     cards_ne_n = car_n;
159     takes_ne_n = tak_n;
160
161     return (0);
162
163
164 function cards_dispose_nw(car_n, tak_n) {
165     // tak_n = 2;
166
167     if (tak_n > 0) {
168         delta = 80;
169         $("takes_nw").style.left = 400 - cards_width - 400 + 90 - ((90 - cards_width) /  2);
170         $("takes_nw").style.top  = (125 - cards_height)/2;
171         $("takes_nw").style.zIndex = 1;
172         $("takes_nw").style.visibility = "visible";
173     }
174     else
175         delta = 0;
176         
177
178     disp = 400 - delta - (2 * border_width);
179     if (car_n > 1) {
180         inter = parseInt((disp  - cards_width) / (car_n - 1));
181         if (inter > cards_width)
182             inter = cards_width;
183     }
184     else
185         inter = 0;
186     wcard = cards_width + inter * (car_n - 1);
187     // start = 0 + delta + border_width + (400 - border_width - border_width - wcard - delta) / 2;
188     start = 400 - cards_width - border_width - (400 - border_width - border_width - wcard - delta) / 2;
189
190     list = "LIST: ";
191     for (i = 0 ; i < car_n ; i++) {
192         $("card_nw" + cards_nw_pos[i]).style.left = start - ((car_n-i-1) * inter);
193         $("card_nw" + cards_nw_pos[i]).style.top  = (125 - cards_height)/2;
194         $("card_nw" + cards_nw_pos[i]).style.zIndex = (8-i);
195         $("card_nw" + cards_nw_pos[i]).style.visibility = "visible";
196         // alert("xx "+start + (i * inter)+" yy " + (125 - cards_height)/2);
197     }
198
199     cards_nw_n = car_n;
200     takes_nw_n = tak_n;
201
202     return (0);
203
204
205 function cards_dispose_ea(car_n, tak_n) {
206     if (tak_n > 0) {
207         delta = 80;
208         $("takes_ea").style.left = 675 + (125 - cards_height)/2;
209         $("takes_ea").style.top  = 125 + ((90 - cards_width) /  2);
210         $("takes_ea").style.zIndex = 1;
211         $("takes_ea").style.visibility = "visible";
212     }
213     else
214         delta = 0;
215
216     disp = 400 - delta - (2 * border_width);
217     if (car_n > 1) {
218         inter = parseInt((disp  - cards_width) / (car_n - 1));
219         if (inter > cards_width)
220             inter = cards_width;
221     }
222     else
223         inter = 0;
224     wcard = cards_width + inter * (car_n - 1);
225     start = 125 + delta + border_width + (400 - border_width - border_width - wcard - delta) / 2;
226
227     list = "LIST: ";
228     for (i = 0 ; i < car_n ; i++) {
229         $("card_ea" + cards_ea_pos[i]).style.left = 675 + (125 - cards_height)/2;
230         $("card_ea" + cards_ea_pos[i]).style.top  = start + (i * inter);
231         $("card_ea" + cards_ea_pos[i]).style.zIndex = 8 - i;
232         $("card_ea" + cards_ea_pos[i]).style.visibility = "visible";
233         // alert("xx "+ (675 + (125 - cards_height)/2) +" yy " + start + (i * inter));
234     }
235
236     cards_ea_n = car_n;
237     takes_ea_n = tak_n;
238
239     return (0);
240
241
242 function cards_dispose_we(car_n, tak_n) 
243 {
244     if (tak_n > 0) {
245         delta = 80;
246         $("takes_we").style.left = (125 - cards_height)/2;
247         // $("takes_we").style.top  = 125 + 400 - 90 + ((90 - cards_width) /  2);
248         $("takes_we").style.top  = 525 - cards_width - 400 + 90 - ((90 - cards_width) /  2);
249         $("takes_we").style.zIndex = 1;
250         $("takes_we").style.visibility = "visible";
251     }
252     else
253         delta = 0;
254         
255     /* pixel a disposizione per mettere le carte: 400 - delta - 2 bordi */
256     disp = 400 - delta - (2 * border_width);
257     /* se c'e' piu' di una carta calcola di quanti pixel devono rimanere scoperte le carte dopo la prima */
258     if (car_n > 1) {
259         inter = parseInt((disp  - cards_width) / (car_n - 1));
260         if (inter > cards_width)
261             inter = cards_width;
262     }
263     else
264         inter = 0;
265
266     /* dopo avere fatto tutti i conti ricalcola quanti pixel effettivamente verranno occupati dalle carte */
267     wcard = cards_width + inter * (car_n - 1);
268
269     /* calcola il punto d'inizio da dove disporre le carte: DELTAY + lo spessore del bordo + la meta' di quello
270        che resta della larghezza totale meno tutti gli altri ingombri */
271     // start = 125 + border_width + (400 - border_width - border_width - wcard - delta) / 2;
272     start = 525 - cards_width - border_width - (400 - border_width - border_width - wcard - delta) / 2;
273         
274     for (i = 0 ; i < car_n ; i++) {
275         $("card_we" + cards_we_pos[i]).style.left = (125 - cards_height)/2;
276         $("card_we" + cards_we_pos[i]).style.top  = start - (i * inter);
277         $("card_we" + cards_we_pos[i]).style.zIndex = 8 - i;
278         $("card_we" + cards_we_pos[i]).style.visibility = "visible";
279     }
280         
281     cards_we_n = car_n;
282     takes_we_n = tak_n;
283
284     return (0);
285
286
287 var cards_dispose_arr = new Array(cards_dispose_so, cards_dispose_ea,
288                                   cards_dispose_ne, cards_dispose_nw,
289                                   cards_dispose_we);
290
291 function cards_dispose(player_pos, cards, takes)
292 {
293     var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
294
295     return (cards_dispose_arr[idx](cards,takes));
296 }
297
298
299
300
301 function card_mouseup_cb(o) {
302     var idx = o.id.substring(4);
303     var briskid = o.briskid;
304     var delta, disp;
305     var wcard;
306     var start;
307     var old_idx;
308     var tst;
309     /* case swap in the group */
310
311     // alert("mouseup");
312     if (parseInt(o.style.top) > 475 && 
313         parseInt(o.style.left) >= 200 && parseInt(o.style.left) < 600) {
314         /* Rearrange cards */
315         
316         // $("sandbox3").innerHTML = "REARRANGE: "+idx;
317
318         if (takes_n > 0) 
319             delta = 80;
320         else
321             delta = 0;
322         
323         /* found the associated index of the current card. */
324         for (i = 0 ; i < cards_n ; i++) 
325             if (cards_pos[i] == idx) 
326                 break;
327         old_idx = i;
328
329         disp = 400 - delta - (2 * border_width);
330         if (cards_n > 1) {
331             inter = parseInt((disp  - cards_width) / (cards_n - 1));
332             if (inter > cards_width)
333                 inter = cards_width;
334         }
335         else
336             inter = 0;
337         wcard = cards_width + inter * (cards_n - 1);
338         start = 200 + border_width + (400 - border_width - border_width - wcard - delta) / 2;
339         
340         for (i = 0 ; i < cards_n ; i++) {
341             /* $("sandbox").innerHTML =  */
342             // alert( "LEFT: " + o.style.left  + "VALUE " + (cards_width + start + (i * (cards_width / 2))));
343             // $("sandbox3").innerHTML += "<br>LEFT: "+parseInt(o.style.left)+"  START["+i+"]: "+(start + ((i+1) * inter));
344             if (i < cards_n - 1)
345                 tst = (parseInt(o.style.left) < start + ((i+1) * inter));
346             else
347                 tst = (parseInt(o.style.left) > start + (i * inter));
348             if (tst) {
349                 // $("sandbox2").innerHTML = "old: " +old_idx+ " i: " +i+ "left: " + parseInt(o.style.left) + "comp: " + (start + (cards_width / 2) + (i * (cards_width / 2)));
350
351                 if (i == old_idx) 
352                     break;
353                 if (i > old_idx) {
354                     /* moved to right */
355                     for (e = old_idx ; e < i ; e++)
356                         cards_pos[e] = cards_pos[e+1];
357                 }
358                 if (i < old_idx) {
359                     /* moved to left */
360                     for (e = old_idx ; e > i ; e--)
361                         cards_pos[e] = cards_pos[e-1];
362                 }
363                 cards_pos[i] = idx;
364                 break;
365             }
366         }
367         
368         cards_dispose_so(cards_n,takes_n);
369
370         return (0);
371     }
372     else if (is_my_time && 
373              parseInt(o.style.top) >= 250 && 
374              parseInt(o.style.top) + cards_height < 450 &&
375              parseInt(o.style.left) >= 300 && 
376              (parseInt(o.style.left) + cards_width) < 500) {
377         /* Played card */
378
379         $("sandbox2").innerHTML = "PLAYED";
380
381         for (i = 0 ; i < cards_n ; i++) {
382             if (cards_pos[i] == idx) {
383                 /* $("sandbox").innerHTML = "Pippo: "+ i; */
384                 for (e = i ; e < cards_n-1 ; e++) {
385                     cards_pos[e] = cards_pos[e+1];
386                 }
387                 cards_pos[cards_n-1] = idx;
388                 cards_n--; 
389                 cards_dispose_so(cards_n, takes_n);
390
391                 is_my_time = false;
392                 act_play(briskid,o.style.left,o.style.top);
393                 return (1);
394             }
395         }
396         cards_dispose_so(cards_n, takes_n);
397
398         return (0);
399     }
400     else {
401         $("sandbox2").innerHTML = "TO ORIGINAL";
402         /* alert("out card " + parseInt(o.style.top)); */
403         /* return to the original position */
404         cards_dispose_so(cards_n, takes_n);
405                 
406         return (0);
407     }
408 }
409
410 /* CARD_SEND */
411 function card_send_so(id,card,free,ct)
412 {
413     var img = $("card"+id);
414     img.src = getcard(-1,0);
415     img.briskid = card;
416
417     img.style.left = 400 - cards_width_d2;
418     img.style.top  = 300 - cards_height_d2;
419     img.style.zIndex = 100;
420
421     var movimg = new slowimg(img,400 - cards_width / 2,475 + (125 - cards_height)/2,25,free,"cards_dispose_so("+ct+", 0)",getcard(card,0));
422     movimg.settime(G_send_time);
423     movimg.start(gst);
424 }
425
426 function card_send_ea(id,card,free,ct)
427 {
428     var img = $("card_ea"+id);
429     img.src = getcard(card,1);
430     img.briskid = card;
431
432     img.style.left = 400 - cards_height_d2;
433     img.style.top  = 300 - cards_width_d2;
434     img.style.zIndex = 100;
435
436     var movimg = new slowimg(img,686,296,25,free,"cards_dispose_ea("+ct+", 0);",getcard(card,1));
437     movimg.settime(G_send_time);
438     movimg.start(gst);
439 }
440
441 function card_send_ne(id,card,free,ct)
442 {
443     var img = $("card_ne"+id);
444     img.src = getcard(card,2);
445     img.briskid = card;
446
447     img.style.left = 400 - cards_width_d2;
448     img.style.top  = 300 - cards_height_d2;
449     img.style.zIndex = 100;
450
451     var movimg = new slowimg(img,571,11,25,free,"cards_dispose_ne("+ct+", 0);",getcard(card,2));
452     movimg.settime(G_send_time);
453     movimg.start(gst);
454 }
455
456 function card_send_nw(id,card,free,ct)
457 {
458     var img = $("card_nw"+id);
459     img.src = getcard(card,3);
460     img.briskid = card;
461
462     img.style.left = 400 - cards_width_d2;
463     img.style.top  = 300 - cards_height_d2;
464     img.style.zIndex = 100;
465
466     var movimg = new slowimg(img,171,11,25,free,"cards_dispose_nw("+ct+", 0);",getcard(card,3));
467     movimg.settime(G_send_time);
468     movimg.start(gst);
469 }
470
471 function card_send_we(id,card,free,ct)
472 {
473     var img = $("card_we"+id);
474     img.src = getcard(card,4);
475     img.briskid = card;
476
477     if (id < 0 || id > 39)
478         alert("ID ERRATO"+id);
479     
480     img.style.left = 400 - cards_height_d2;
481     img.style.top  = 300 - cards_width_d2;
482     img.style.zIndex = 100;
483     var movimg = new slowimg(img,11,296,25,free,"cards_dispose_we("+ct+", 0);",getcard(card,4));
484     movimg.settime(G_send_time);
485     movimg.start(gst);
486 }
487
488 var card_send_arr = new Array(card_send_so, card_send_ea, 
489                               card_send_ne, card_send_nw,
490                               card_send_we);
491
492 function card_send(player_pos,id,card,free,ct)
493 {
494     var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
495
496     card_send_arr[idx](id,card,free,ct);
497 }
498
499 function getcard(card,pos_id)
500 {
501     if (card < 0)
502         return ("img/cover"+sux[pos_id]+".png");
503     else if (card < 10)
504         return ("img/0"+card+sux[pos_id]+".png");
505     else 
506         return ("img/"+card+sux[pos_id]+".png");
507 }
508
509 function card_setours(zer,uno,due,tre,qua,cin,sei,set)
510 {
511     var i;
512     var arg = new Array(zer,uno,due,tre,qua,cin,sei,set);
513
514     for (i = 0 ; i < 8 ; i++) {
515         $("card"+i).src = getcard(arg[i], 0);
516         $("card"+i).briskid = arg[i];
517     }
518 }
519
520 /* CARD_PLAY_SO */
521
522 function card_play_so(card_idx, x, y)
523 {
524     alert("card_play_so: unreachable function.");
525 }
526
527 /* CARD_PLAY_EA */
528 function card_postplay_ea(card_pos)
529 {
530     var img = $("card_ea"+card_pos);
531     
532     img.className = "";
533     for (i = 0 ; i < cards_ea_n ; i++) {
534         if (cards_ea_pos[i] == card_pos) {
535             for (e = i ; e < cards_ea_n-1 ; e++) {
536                 cards_ea_pos[e] = cards_ea_pos[e+1];
537             }
538             cards_ea_pos[cards_ea_n-1] = card_pos;
539             cards_ea_n--; 
540             cards_dispose_ea(cards_ea_n, takes_ea_n);
541             break;
542         }
543     }
544 }
545
546 function card_play_ea(card_idx, x, y)
547 {
548     // var card_pos = RANGE 0 <= x < cards_ea_n
549     var card_pos = rnd_int(0,cards_ea_n-1);
550     var img = $("card_ea"+cards_ea_pos[card_pos]);
551     // alert("IMMO CON "+cards_ea_pos[card_pos]);
552     var newname = getcard(card_idx,1);
553     var x1, y1;
554
555     x1 = 500 + ((y-250) * (125 - cards_height) / (200 - cards_height));
556     y1 = 450 - cards_width - (x - 300);    
557
558     var movimg = new slowimg(img, x1, y1, 25, 1, "card_postplay_ea("+cards_ea_pos[card_pos]+");", newname);
559     movimg.settime(G_play_time);
560     movimg.start(gst);
561 }
562
563 /* CARD_PLAY_NE */
564 function card_postplay_ne(card_pos)
565 {
566     var img = $("card_ne"+card_pos);
567     
568     img.className = "";
569     for (i = 0 ; i < cards_ne_n ; i++) {
570         if (cards_ne_pos[i] == card_pos) {
571             for (e = i ; e < cards_ne_n-1 ; e++) {
572                 cards_ne_pos[e] = cards_ne_pos[e+1];
573             }
574             cards_ne_pos[cards_ne_n-1] = card_pos;
575             cards_ne_n--; 
576             cards_dispose_ne(cards_ne_n, takes_ne_n);
577             break;
578         }
579     }
580 }
581
582 function card_play_ne(card_idx, x, y)
583 {
584     var card_pos = rnd_int(0,cards_ne_n-1);
585     var img = $("card_ne"+cards_ne_pos[card_pos]);
586     var newname = getcard(card_idx,2);
587     var x1, y1;
588
589     x1 = 600 - cards_width - (x - 300);    
590     y1 = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
591
592     var movimg = new slowimg(img, x1, y1, 25, 1, "card_postplay_ne("+cards_ne_pos[card_pos]+");", newname);
593     movimg.settime(G_play_time);
594     movimg.start(gst);
595 }
596
597 /* CARD_PLAY_NW */
598 function card_postplay_nw(card_pos)
599 {
600     var img = $("card_nw"+card_pos);
601     
602     img.className = "";
603     for (i = 0 ; i < cards_nw_n ; i++) {
604         if (cards_nw_pos[i] == card_pos) {
605             for (e = i ; e < cards_nw_n-1 ; e++) {
606                 cards_nw_pos[e] = cards_nw_pos[e+1];
607             }
608             cards_nw_pos[cards_nw_n-1] = card_pos;
609             cards_nw_n--; 
610             cards_dispose_nw(cards_nw_n, takes_nw_n);
611             break;
612         }
613     }
614 }
615
616 function card_play_nw(card_idx, x, y)
617 {
618     var card_pos = rnd_int(0,cards_nw_n-1);
619     var img = $("card_nw"+cards_nw_pos[card_pos]);
620     var newname = getcard(card_idx,3);
621     var x1, y1;
622
623     x1 = 400 - cards_width - (x - 300);    
624     y1 = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
625
626     var movimg = new slowimg(img, x1, y1, 25, 1, "card_postplay_nw("+cards_nw_pos[card_pos]+");", newname);
627     movimg.settime(G_play_time);
628     movimg.start(gst);
629 }
630
631 /* CARD_PLAY_WE */
632 function card_postplay_we(card_pos)
633 {
634     var img = $("card_we"+card_pos);
635     
636     img.className = "";
637     for (i = 0 ; i < cards_we_n ; i++) {
638         if (cards_we_pos[i] == card_pos) {
639             for (e = i ; e < cards_we_n-1 ; e++) {
640                 cards_we_pos[e] = cards_we_pos[e+1];
641             }
642             cards_we_pos[cards_we_n-1] = card_pos;
643             cards_we_n--; 
644             cards_dispose_we(cards_we_n, takes_we_n);
645             break;
646         }
647     }
648 }
649
650 function card_play_we(card_idx, x, y)
651 {
652     var card_pos = rnd_int(0,cards_we_n-1);
653     var img = $("card_we"+cards_we_pos[card_pos]);
654     var newname = getcard(card_idx,4);
655     var x1, y1;
656
657     x1 = 300 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
658     y1 = 250 + x - 300;    
659
660     var movimg = new slowimg(img, x1, y1, 25, 1, "card_postplay_we("+cards_we_pos[card_pos]+");", newname);
661     movimg.settime(G_play_time);
662     movimg.start(gst);
663 }
664
665 var card_play_arr = new Array( card_play_so, card_play_ea, card_play_ne, card_play_nw, card_play_we);
666
667 /* card_play(player_pos, card_pos, card_idx, x, y)
668    player_pos - position of the player on the table
669    card_pos   - position of the card in the hand of the player
670    card_idx   - id of the card (to show it after the move)
671    x, y       - coordinates of the card on the original table
672
673    orig 200x200 dest 200x125
674 */
675 function card_play(player_pos, card_idx, x, y)
676 {
677     var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
678
679     card_play_arr[idx](card_idx, x, y);
680 }
681
682
683 /* CARD_PLACE_SO */
684 function card_place_so(card_pos, card_idx, x, y)
685 {
686     var img = $("card"+card_pos);
687
688     // alert("card_place_so"+card_pos);
689
690     img.style.left = x;
691     img.style.top  = y;
692     img.style.visibility  = "visible";
693     img.src = getcard(card_idx,0);
694 }
695
696 /* CARD_PLACE_EA */
697 function card_place_ea(card_pos, card_idx, x, y)
698 {
699     var img = $("card_ea"+card_pos);
700
701     // alert("card_place_ea");
702
703     img.style.left = 500 + ((y-250) * (125 - cards_height) / (200 - cards_height));
704     img.style.top  = 450 - cards_width - (x - 300);
705     img.style.visibility  = "visible";
706     img.src = getcard(card_idx,1);
707 }
708
709 /* CARD_PLACE_NE */
710 function card_place_ne(card_pos, card_idx, x, y)
711 {
712     var img = $("card_ne"+card_pos);
713
714     // alert("card_place_ne");
715
716     img.style.left = 600 - cards_width - (x - 300);
717     img.style.top  = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
718     img.style.visibility  = "visible";
719     img.src = getcard(card_idx,2);
720 }
721
722 /* CARD_PLACE_NW */
723 function card_place_nw(card_pos, card_idx, x, y)
724 {
725     var img = $("card_nw"+card_pos);
726
727     // alert("card_place_nw");
728
729     img.style.left = 400 - cards_width - (x - 300);
730     img.style.top  = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
731     img.style.visibility  = "visible";
732     img.src = getcard(card_idx,3);
733 }
734
735 /* CARD_PLACE_WE */
736 function card_place_we(card_pos, card_idx, x, y)
737 {
738     var img = $("card_we"+card_pos);
739
740     // alert("card_place_we");
741
742     img.style.left = 300 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
743     img.style.top  = 250 + x - 300;
744     img.style.visibility  = "visible";
745     img.src = getcard(card_idx,4);
746 }
747
748 var card_place_arr = new Array( card_place_so, card_place_ea, card_place_ne, card_place_nw, card_place_we );
749
750 /* CARD_PLACE */
751 function card_place(player_pos, card_pos, card_idx, x, y)
752 {
753     var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
754
755     // alert("card_place"+idx);
756
757     card_place_arr[idx](card_pos, card_idx, x, y);
758 }
759
760
761
762 function card_post_take(card)
763 {
764     var img = $("card"+card);
765     img.style.visibility = "hidden";
766     cards_dispose_so(cards_n, takes_n);
767 }
768
769 function card_ea_post_take(card)
770 {
771     var img = $("card_ea"+card);
772     img.style.visibility = "hidden";
773     cards_dispose_ea(cards_ea_n, takes_ea_n);
774 }
775
776 function card_ne_post_take(card)
777 {
778     var img = $("card_ne"+card);
779     img.style.visibility = "hidden";
780     cards_dispose_ne(cards_ne_n, takes_ne_n);
781 }
782
783 function card_nw_post_take(card)
784 {
785     var img = $("card_nw"+card);
786     img.style.visibility = "hidden";
787     cards_dispose_nw(cards_nw_n, takes_nw_n);
788 }
789
790 function card_we_post_take(card)
791 {
792     var img = $("card_we"+card);
793     img.style.visibility = "hidden";
794     cards_dispose_we(cards_we_n, takes_we_n);
795 }
796
797
798 function cards_take(win)
799 {
800     var taker = (win - table_pos + PLAYERS_N) % PLAYERS_N;
801
802     // 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);
803
804     switch(taker) {
805         case 0:
806             takes_n += PLAYERS_N;  break;
807         case 1:
808             takes_ea_n += PLAYERS_N;  break;
809         case 2:
810             takes_ne_n += PLAYERS_N;  break;
811         case 3:
812             takes_nw_n += PLAYERS_N;  break;
813         case 4:
814             takes_we_n += PLAYERS_N;  break;
815     default:
816         break;
817     }
818
819     var img = $("card"+cards_pos[cards_n]);
820     var movimg = new slowimg(img, 
821                              take_x[taker] - cards_width_d2,
822                              take_y[taker] - cards_height_d2,
823                              25, 0, "card_post_take("+cards_pos[cards_n]+");", null);
824     movimg.settime(G_take_time);
825     movimg.start(gst);
826
827     var img = $("card_ea"+cards_ea_pos[cards_ea_n]);
828     var movimg = new slowimg(img, 
829                              take_x[taker] - cards_height_d2,
830                              take_y[taker] - cards_width_d2,
831                              25, 0, "card_ea_post_take("+cards_ea_pos[cards_ea_n]+");", null);
832     movimg.settime(G_take_time);
833     movimg.start(gst);
834
835     var img = $("card_ne"+cards_ne_pos[cards_ne_n]);
836     var movimg = new slowimg(img,
837                              take_x[taker] - cards_width_d2,
838                              take_y[taker] - cards_height_d2,
839                              25, (PLAYERS_N == 3 ? 1 : 0), "card_ne_post_take("+cards_ne_pos[cards_ne_n]+");", null);
840     movimg.settime(G_take_time);
841     movimg.start(gst);
842     if (PLAYERS_N > 3) {
843         var img = $("card_nw"+cards_nw_pos[cards_nw_n]);
844         var movimg = new slowimg(img, 
845                                  take_x[taker] - cards_width_d2,
846                                  take_y[taker] - cards_height_d2,
847                                  25, 0, "card_nw_post_take("+cards_nw_pos[cards_nw_n]+");", null);
848         movimg.settime(G_take_time);
849         movimg.start(gst);
850         
851         var img = $("card_we"+cards_we_pos[cards_we_n]);
852         var movimg = new slowimg(img, 
853                                  take_x[taker] - cards_height_d2,
854                                  take_y[taker] - cards_width_d2,
855                                  25, 1, "card_we_post_take("+cards_we_pos[cards_we_n]+");", null);
856         movimg.settime(G_take_time);
857         movimg.start(gst);
858     }
859 }