sharding on sockets with input data
[brisk.git] / web / briskin5 / dnd.js
1 /*
2  *  brisk - dnd.js
3  *
4  *  Copyright (C) 2006-2012 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  */
23 /* number of players */
24 var PLAYERS_N = 3;
25 /* initial number of cards in hand */
26 var CARD_HAND = 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 (CARD_HAND);
71 var cards_ea_pos = new Array (CARD_HAND);
72 var cards_ne_pos = new Array (CARD_HAND);
73 var cards_nw_pos = new Array (CARD_HAND);
74 var cards_we_pos = new Array (CARD_HAND);
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 < CARD_HAND ; 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 = CARD_HAND - 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     // console.log(car_n);
229     for (i = 0 ; i < car_n ; i++) {
230         $("card_ea" + cards_ea_pos[i]).style.left = 675 + (125 - cards_height)/2;
231         $("card_ea" + cards_ea_pos[i]).style.top  = start + (i * inter);
232         $("card_ea" + cards_ea_pos[i]).style.zIndex = CARD_HAND - i;
233         $("card_ea" + cards_ea_pos[i]).style.visibility = "visible";
234         // alert("xx "+ (675 + (125 - cards_height)/2) +" yy " + start + (i * inter));
235     }
236
237     cards_ea_n = car_n;
238     takes_ea_n = tak_n;
239
240     return (0);
241
242
243 function cards_dispose_we(car_n, tak_n) 
244 {
245     if (tak_n > 0) {
246         delta = 80;
247         $("takes_we").style.left = (125 - cards_height)/2;
248         // $("takes_we").style.top  = 125 + 400 - 90 + ((90 - cards_width) /  2);
249         $("takes_we").style.top  = 525 - cards_width - 400 + 90 - ((90 - cards_width) /  2);
250         $("takes_we").style.zIndex = 1;
251         $("takes_we").style.visibility = "visible";
252     }
253     else
254         delta = 0;
255         
256     /* pixel a disposizione per mettere le carte: 400 - delta - 2 bordi */
257     disp = 400 - delta - (2 * border_width);
258     /* se c'e' piu' di una carta calcola di quanti pixel devono rimanere scoperte le carte dopo la prima */
259     if (car_n > 1) {
260         inter = parseInt((disp  - cards_width) / (car_n - 1));
261         if (inter > cards_width)
262             inter = cards_width;
263     }
264     else
265         inter = 0;
266
267     /* dopo avere fatto tutti i conti ricalcola quanti pixel effettivamente verranno occupati dalle carte */
268     wcard = cards_width + inter * (car_n - 1);
269
270     /* calcola il punto d'inizio da dove disporre le carte: DELTAY + lo spessore del bordo + la meta' di quello
271        che resta della larghezza totale meno tutti gli altri ingombri */
272     // start = 125 + border_width + (400 - border_width - border_width - wcard - delta) / 2;
273     start = 525 - cards_width - border_width - (400 - border_width - border_width - wcard - delta) / 2;
274         
275     for (i = 0 ; i < car_n ; i++) {
276         $("card_we" + cards_we_pos[i]).style.left = (125 - cards_height)/2;
277         $("card_we" + cards_we_pos[i]).style.top  = start - (i * inter);
278         $("card_we" + cards_we_pos[i]).style.zIndex = CARD_HAND - i;
279         $("card_we" + cards_we_pos[i]).style.visibility = "visible";
280     }
281         
282     cards_we_n = car_n;
283     takes_we_n = tak_n;
284
285     return (0);
286
287
288 var cards_dispose_arr = new Array(cards_dispose_so, cards_dispose_ea,
289                                   cards_dispose_ne, cards_dispose_nw,
290                                   cards_dispose_we);
291
292 function cards_dispose(player_pos, cards, takes)
293 {
294     var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
295
296     return (cards_dispose_arr[idx](cards,takes));
297 }
298
299
300
301
302 function card_mouseup_cb(o) {
303     var idx = o.id.substring(4);
304     var briskid = o.briskid;
305     var delta, disp;
306     var wcard;
307     var start;
308     var old_idx;
309     var tst;
310     /* case swap in the group */
311
312     // alert("mouseup");
313     if (parseInt(o.style.top) > 475 && 
314         parseInt(o.style.left) >= 200 && parseInt(o.style.left) < 600) {
315         /* Rearrange cards */
316         
317         // $("sandbox3").innerHTML = "REARRANGE: "+idx;
318
319         if (takes_n > 0) 
320             delta = 80;
321         else
322             delta = 0;
323         
324         /* found the associated index of the current card. */
325         for (i = 0 ; i < cards_n ; i++) 
326             if (cards_pos[i] == idx) 
327                 break;
328         old_idx = i;
329
330         disp = 400 - delta - (2 * border_width);
331         if (cards_n > 1) {
332             inter = parseInt((disp  - cards_width) / (cards_n - 1));
333             if (inter > cards_width)
334                 inter = cards_width;
335         }
336         else
337             inter = 0;
338         wcard = cards_width + inter * (cards_n - 1);
339         start = 200 + border_width + (400 - border_width - border_width - wcard - delta) / 2;
340         
341         for (i = 0 ; i < cards_n ; i++) {
342             /* $("sandbox").innerHTML =  */
343             // alert( "LEFT: " + o.style.left  + "VALUE " + (cards_width + start + (i * (cards_width / 2))));
344             // $("sandbox3").innerHTML += "<br>LEFT: "+parseInt(o.style.left)+"  START["+i+"]: "+(start + ((i+1) * inter));
345             if (i < cards_n - 1)
346                 tst = (parseInt(o.style.left) < start + ((i+1) * inter));
347             else
348                 tst = (parseInt(o.style.left) > start + (i * inter));
349             if (tst) {
350                 // $("sandbox2").innerHTML = "old: " +old_idx+ " i: " +i+ "left: " + parseInt(o.style.left) + "comp: " + (start + (cards_width / 2) + (i * (cards_width / 2)));
351
352                 if (i == old_idx) 
353                     break;
354                 if (i > old_idx) {
355                     /* moved to right */
356                     for (e = old_idx ; e < i ; e++)
357                         cards_pos[e] = cards_pos[e+1];
358                 }
359                 if (i < old_idx) {
360                     /* moved to left */
361                     for (e = old_idx ; e > i ; e--)
362                         cards_pos[e] = cards_pos[e-1];
363                 }
364                 cards_pos[i] = idx;
365                 break;
366             }
367         }
368         
369         cards_dispose_so(cards_n,takes_n);
370
371         return (0);
372     }
373     else if (is_my_time && 
374              parseInt(o.style.top) >= 250 && 
375              parseInt(o.style.top) + cards_height < 450 &&
376              parseInt(o.style.left) >= 300 && 
377              (parseInt(o.style.left) + cards_width) < 500) {
378         /* Played card */
379
380         $("sandbox2").innerHTML = "PLAYED";
381
382         for (i = 0 ; i < cards_n ; i++) {
383             if (cards_pos[i] == idx) {
384                 /* $("sandbox").innerHTML = "Pippo: "+ i; */
385                 for (e = i ; e < cards_n-1 ; e++) {
386                     cards_pos[e] = cards_pos[e+1];
387                 }
388                 cards_pos[cards_n-1] = idx;
389                 cards_n--; 
390                 cards_dispose_so(cards_n, takes_n);
391
392                 is_my_time = false;
393                 act_play(briskid,o.style.left,o.style.top);
394                 return (1);
395             }
396         }
397         cards_dispose_so(cards_n, takes_n);
398
399         return (0);
400     }
401     else {
402         $("sandbox2").innerHTML = "TO ORIGINAL";
403         /* alert("out card " + parseInt(o.style.top)); */
404         /* return to the original position */
405         cards_dispose_so(cards_n, takes_n);
406                 
407         return (0);
408     }
409 }
410
411 /* CARD_SEND */
412 function card_send_so(id,card,free,ct)
413 {
414     var img = $("card"+id);
415     img.src = getcard(-1,0);
416     img.briskid = card;
417
418     img.style.left = 400 - cards_width_d2;
419     img.style.top  = 300 - cards_height_d2;
420     img.style.zIndex = 100;
421
422     var movimg = new slowimg(img,400 - cards_width / 2,475 + (125 - cards_height)/2,25,free,"cards_dispose_so("+ct+", 0)",getcard(card,0));
423     movimg.settime(G_send_time);
424     movimg.start(gst);
425 }
426
427 function card_send_ea(id,card,free,ct)
428 {
429     var img = $("card_ea"+id);
430     img.src = getcard(card,1);
431     img.briskid = card;
432
433     img.style.left = 400 - cards_height_d2;
434     img.style.top  = 300 - cards_width_d2;
435     img.style.zIndex = 100;
436
437     var movimg = new slowimg(img,686,296,25,free,"cards_dispose_ea("+ct+", 0);",getcard(card,1));
438     movimg.settime(G_send_time);
439     movimg.start(gst);
440 }
441
442 function card_send_ne(id,card,free,ct)
443 {
444     var img = $("card_ne"+id);
445     img.src = getcard(card,2);
446     img.briskid = card;
447
448     img.style.left = 400 - cards_width_d2;
449     img.style.top  = 300 - cards_height_d2;
450     img.style.zIndex = 100;
451
452     var movimg = new slowimg(img,571,11,25,free,"cards_dispose_ne("+ct+", 0);",getcard(card,2));
453     movimg.settime(G_send_time);
454     movimg.start(gst);
455 }
456
457 function card_send_nw(id,card,free,ct)
458 {
459     var img = $("card_nw"+id);
460     img.src = getcard(card,3);
461     img.briskid = card;
462
463     img.style.left = 400 - cards_width_d2;
464     img.style.top  = 300 - cards_height_d2;
465     img.style.zIndex = 100;
466
467     var movimg = new slowimg(img,171,11,25,free,"cards_dispose_nw("+ct+", 0);",getcard(card,3));
468     movimg.settime(G_send_time);
469     movimg.start(gst);
470 }
471
472 function card_send_we(id,card,free,ct)
473 {
474     var img = $("card_we"+id);
475     img.src = getcard(card,4);
476     img.briskid = card;
477
478     if (id < 0 || id > 39)
479         alert("ID ERRATO"+id);
480     
481     img.style.left = 400 - cards_height_d2;
482     img.style.top  = 300 - cards_width_d2;
483     img.style.zIndex = 100;
484     var movimg = new slowimg(img,11,296,25,free,"cards_dispose_we("+ct+", 0);",getcard(card,4));
485     movimg.settime(G_send_time);
486     movimg.start(gst);
487 }
488
489 var card_send_arr = new Array(card_send_so, card_send_ea, 
490                               card_send_ne, card_send_nw,
491                               card_send_we);
492
493 function card_send(player_pos,id,card,free,ct)
494 {
495     var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
496
497     card_send_arr[idx](id,card,free,ct);
498 }
499
500 function getcard(card,pos_id)
501 {
502     if (card < 0)
503         return ("img/cover"+sux[pos_id]+".png");
504     else if (card < 10)
505         return ("img/0"+card+sux[pos_id]+".png");
506     else 
507         return ("img/"+card+sux[pos_id]+".png");
508 }
509
510 function card_setours(zer,uno,due,tre,qua,cin,sei,set)
511 {
512     var i;
513     var arg = new Array(zer,uno,due,tre,qua,cin,sei,set);
514
515     for (i = 0 ; i < CARD_HAND ; i++) {
516         $("card"+i).src = getcard(arg[i], 0);
517         $("card"+i).briskid = arg[i];
518     }
519 }
520
521 /* CARD_PLAY_SO */
522
523 function card_play_so(card_idx, x, y)
524 {
525     alert("card_play_so: unreachable function.");
526 }
527
528 /* CARD_PLAY_EA */
529 function card_postplay_ea(card_pos)
530 {
531     var img = $("card_ea"+card_pos);
532     
533     img.className = "";
534     for (i = 0 ; i < cards_ea_n ; i++) {
535         if (cards_ea_pos[i] == card_pos) {
536             for (e = i ; e < cards_ea_n-1 ; e++) {
537                 cards_ea_pos[e] = cards_ea_pos[e+1];
538             }
539             cards_ea_pos[cards_ea_n-1] = card_pos;
540             cards_ea_n--; 
541             cards_dispose_ea(cards_ea_n, takes_ea_n);
542             break;
543         }
544     }
545 }
546
547 function card_play_ea(card_idx, x, y)
548 {
549     // var card_pos = RANGE 0 <= x < cards_ea_n
550     var card_pos = rnd_int(0,cards_ea_n-1);
551     var img = $("card_ea"+cards_ea_pos[card_pos]);
552     // alert("IMMO CON "+cards_ea_pos[card_pos]);
553     var newname = getcard(card_idx,1);
554     var x1, y1;
555
556     x1 = 500 + ((y-250) * (125 - cards_height) / (200 - cards_height));
557     y1 = 450 - cards_width - (x - 300);    
558
559     var movimg = new slowimg(img, x1, y1, 25, 1, "card_postplay_ea("+cards_ea_pos[card_pos]+");", newname);
560     movimg.settime(G_play_time);
561     movimg.start(gst);
562 }
563
564 /* CARD_PLAY_NE */
565 function card_postplay_ne(obj,card_pos)
566 {
567     var img = $("card_ne"+card_pos);
568     
569     img.className = "";
570
571     for (i = 0 ; i < cards_ne_n ; i++) {
572         if (cards_ne_pos[i] == card_pos) {
573             for (e = i ; e < cards_ne_n-1 ; e++) {
574                 cards_ne_pos[e] = cards_ne_pos[e+1];
575             }
576             cards_ne_pos[cards_ne_n-1] = card_pos;
577             cards_ne_n--; 
578             cards_dispose_ne(cards_ne_n, takes_ne_n);
579             break;
580         }
581     }
582 }
583
584 function card_play_ne(card_idx, x, y)
585 {
586     var card_pos = rnd_int(0,cards_ne_n-1);
587     var img = $("card_ne"+cards_ne_pos[card_pos]);
588     var newname = getcard(card_idx,2);
589     var x1, y1;
590
591     x1 = 600 - cards_width - (x - 300);    
592     y1 = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
593
594     var movimg = new slowimg(img, x1, y1, 25, 1, "card_postplay_ne(this,"+cards_ne_pos[card_pos]+");", newname);
595     movimg.settime(G_play_time);
596     movimg.start(gst);
597 }
598
599 /* CARD_PLAY_NW */
600 function card_postplay_nw(card_pos)
601 {
602     var img = $("card_nw"+card_pos);
603     
604     img.className = "";
605     for (i = 0 ; i < cards_nw_n ; i++) {
606         if (cards_nw_pos[i] == card_pos) {
607             for (e = i ; e < cards_nw_n-1 ; e++) {
608                 cards_nw_pos[e] = cards_nw_pos[e+1];
609             }
610             cards_nw_pos[cards_nw_n-1] = card_pos;
611             cards_nw_n--; 
612             cards_dispose_nw(cards_nw_n, takes_nw_n);
613             break;
614         }
615     }
616 }
617
618 function card_play_nw(card_idx, x, y)
619 {
620     var card_pos = rnd_int(0,cards_nw_n-1);
621     var img = $("card_nw"+cards_nw_pos[card_pos]);
622     var newname = getcard(card_idx,3);
623     var x1, y1;
624
625     x1 = 400 - cards_width - (x - 300);    
626     y1 = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
627
628     var movimg = new slowimg(img, x1, y1, 25, 1, "card_postplay_nw("+cards_nw_pos[card_pos]+");", newname);
629     movimg.settime(G_play_time);
630     movimg.start(gst);
631 }
632
633 /* CARD_PLAY_WE */
634 function card_postplay_we(card_pos)
635 {
636     var img = $("card_we"+card_pos);
637     
638     img.className = "";
639     for (i = 0 ; i < cards_we_n ; i++) {
640         if (cards_we_pos[i] == card_pos) {
641             for (e = i ; e < cards_we_n-1 ; e++) {
642                 cards_we_pos[e] = cards_we_pos[e+1];
643             }
644             cards_we_pos[cards_we_n-1] = card_pos;
645             cards_we_n--; 
646             cards_dispose_we(cards_we_n, takes_we_n);
647             break;
648         }
649     }
650 }
651
652 function card_play_we(card_idx, x, y)
653 {
654     var card_pos = rnd_int(0,cards_we_n-1);
655     var img = $("card_we"+cards_we_pos[card_pos]);
656     var newname = getcard(card_idx,4);
657     var x1, y1;
658
659     x1 = 300 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
660     y1 = 250 + x - 300;    
661
662     var movimg = new slowimg(img, x1, y1, 25, 1, "card_postplay_we("+cards_we_pos[card_pos]+");", newname);
663     movimg.settime(G_play_time);
664     movimg.start(gst);
665 }
666
667 var card_play_arr = new Array( card_play_so, card_play_ea, card_play_ne, card_play_nw, card_play_we);
668
669 /* card_play(player_pos, card_pos, card_idx, x, y)
670    player_pos - position of the player on the table
671    card_pos   - position of the card in the hand of the player
672    card_idx   - id of the card (to show it after the move)
673    x, y       - coordinates of the card on the original table
674
675    orig 200x200 dest 200x125
676 */
677 function card_play(player_pos, card_idx, x, y)
678 {
679     var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
680
681     card_play_arr[idx](card_idx, x, y);
682 }
683
684
685 /* CARD_PLACE_SO */
686 function card_place_so(card_pos, card_idx, x, y)
687 {
688     var img = $("card"+card_pos);
689
690     // alert("card_place_so"+card_pos);
691
692     img.style.left = x;
693     img.style.top  = y;
694     img.style.visibility  = "visible";
695     img.src = getcard(card_idx,0);
696 }
697
698 /* CARD_PLACE_EA */
699 function card_place_ea(card_pos, card_idx, x, y)
700 {
701     var img = $("card_ea"+card_pos);
702
703     // alert("card_place_ea");
704
705     img.style.left = 500 + ((y-250) * (125 - cards_height) / (200 - cards_height));
706     img.style.top  = 450 - cards_width - (x - 300);
707     img.style.visibility  = "visible";
708     img.src = getcard(card_idx,1);
709 }
710
711 /* CARD_PLACE_NE */
712 function card_place_ne(card_pos, card_idx, x, y)
713 {
714     var img = $("card_ne"+card_pos);
715
716     // alert("card_place_ne");
717
718     img.style.left = 600 - cards_width - (x - 300);
719     img.style.top  = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
720     img.style.visibility  = "visible";
721     img.src = getcard(card_idx,2);
722 }
723
724 /* CARD_PLACE_NW */
725 function card_place_nw(card_pos, card_idx, x, y)
726 {
727     var img = $("card_nw"+card_pos);
728
729     // alert("card_place_nw");
730
731     img.style.left = 400 - cards_width - (x - 300);
732     img.style.top  = 250 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
733     img.style.visibility  = "visible";
734     img.src = getcard(card_idx,3);
735 }
736
737 /* CARD_PLACE_WE */
738 function card_place_we(card_pos, card_idx, x, y)
739 {
740     var img = $("card_we"+card_pos);
741
742     // alert("card_place_we");
743
744     img.style.left = 300 - cards_height - ((y-250) * (125 - cards_height) / (200 - cards_height));
745     img.style.top  = 250 + x - 300;
746     img.style.visibility  = "visible";
747     img.src = getcard(card_idx,4);
748 }
749
750 var card_place_arr = new Array( card_place_so, card_place_ea, card_place_ne, card_place_nw, card_place_we );
751
752 /* CARD_PLACE */
753 function card_place(player_pos, card_pos, card_idx, x, y)
754 {
755     var idx = (player_pos - table_pos + PLAYERS_N) % PLAYERS_N;
756
757     // alert("card_place"+idx);
758
759     card_place_arr[idx](card_pos, card_idx, x, y);
760 }
761
762
763
764 function card_post_take(card)
765 {
766     var img = $("card"+card);
767     img.style.visibility = "hidden";
768     cards_dispose_so(cards_n, takes_n);
769 }
770
771 function card_ea_post_take(card)
772 {
773     var img = $("card_ea"+card);
774     img.style.visibility = "hidden";
775     cards_dispose_ea(cards_ea_n, takes_ea_n);
776 }
777
778 function card_ne_post_take(card)
779 {
780     var img = $("card_ne"+card);
781     img.style.visibility = "hidden";
782     cards_dispose_ne(cards_ne_n, takes_ne_n);
783 }
784
785 function card_nw_post_take(card)
786 {
787     var img = $("card_nw"+card);
788     img.style.visibility = "hidden";
789     cards_dispose_nw(cards_nw_n, takes_nw_n);
790 }
791
792 function card_we_post_take(card)
793 {
794     var img = $("card_we"+card);
795     img.style.visibility = "hidden";
796     cards_dispose_we(cards_we_n, takes_we_n);
797 }
798
799
800 function cards_take(win)
801 {
802     var taker = (win - table_pos + PLAYERS_N) % PLAYERS_N;
803
804     // 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
806     switch(taker) {
807         case 0:
808             takes_n += PLAYERS_N;  break;
809         case 1:
810             takes_ea_n += PLAYERS_N;  break;
811         case 2:
812             takes_ne_n += PLAYERS_N;  break;
813         case 3:
814             takes_nw_n += PLAYERS_N;  break;
815         case 4:
816             takes_we_n += PLAYERS_N;  break;
817     default:
818         break;
819     }
820
821     var img = $("card"+cards_pos[cards_n]);
822     var movimg = new slowimg(img, 
823                              take_x[taker] - cards_width_d2,
824                              take_y[taker] - cards_height_d2,
825                              25, 0, "card_post_take("+cards_pos[cards_n]+");", null);
826     movimg.settime(G_take_time);
827     movimg.start(gst);
828
829     var img = $("card_ea"+cards_ea_pos[cards_ea_n]);
830     var movimg = new slowimg(img, 
831                              take_x[taker] - cards_height_d2,
832                              take_y[taker] - cards_width_d2,
833                              25, 0, "card_ea_post_take("+cards_ea_pos[cards_ea_n]+");", null);
834     movimg.settime(G_take_time);
835     movimg.start(gst);
836
837     var img = $("card_ne"+cards_ne_pos[cards_ne_n]);
838     var movimg = new slowimg(img,
839                              take_x[taker] - cards_width_d2,
840                              take_y[taker] - cards_height_d2,
841                              25, (PLAYERS_N == 3 ? 1 : 0), "card_ne_post_take("+cards_ne_pos[cards_ne_n]+");", null);
842     movimg.settime(G_take_time);
843     movimg.start(gst);
844     if (PLAYERS_N > 3) {
845         var img = $("card_nw"+cards_nw_pos[cards_nw_n]);
846         var movimg = new slowimg(img, 
847                                  take_x[taker] - cards_width_d2,
848                                  take_y[taker] - cards_height_d2,
849                                  25, 0, "card_nw_post_take("+cards_nw_pos[cards_nw_n]+");", null);
850         movimg.settime(G_take_time);
851         movimg.start(gst);
852         
853         var img = $("card_we"+cards_we_pos[cards_we_n]);
854         var movimg = new slowimg(img, 
855                                  take_x[taker] - cards_height_d2,
856                                  take_y[taker] - cards_width_d2,
857                                  25, 1, "card_we_post_take("+cards_we_pos[cards_we_n]+");", null);
858         movimg.settime(G_take_time);
859         movimg.start(gst);
860     }
861 }