var cursor = '';

/* The order here should be consistent with the images! */
var card_s = [ 'c', 'd', 'h', 's' ];
var card_k = [ 'A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4', '3', '2' ];
/* Also the size */
var board_w = 611;
var board_h = 244;

var RQ = null;

var max_num_cards = 6;
var min_num_players = 2;
var max_num_players = 10;

var min_submit_cards = 2;
var max_submit_cards = 2;

function select_box(id)
{
	elem = document.getElementById(id);
	if(!elem) return;
	elem.select();
	elem.focus();
}

function obj(id)
{
	return document.getElementById(id);
}

function current_num_players()
{
	var o = obj('n');
	return o ? parseInt(o.value) : null;
}

function update_num_players()
{
	var i, n, c;

	n = current_num_players();
	for(i = 2; i <= n; i++)
		if((o = obj('prow' + i)))
			o.className = '';
	for(; i <= 10; i++)
		if((o = obj('prow' + i)))
			o.className = 'nd';
	for(i = n + 1; i <= 10; i++)
		for(c = 1; c <= 4; c++)
			remove_cursor_mark_single('p' + i + 'c' + c);

	if(cursor != '' && cursor != null)
		if(cursor != 'd' && cursor != 'b' && parseInt(cursor) > n)
			focus_input_field(n);
}

function f(div)
{
	var id = div.id;
	focus_input_field(id.substr(2));
}

function focus_input_field(mark)
{
	if(cursor != '' && cursor != null)
		if((o = obj('ss' + cursor)))
			o.className = 'nofocus';
	cursor = mark;
	if((o = obj('ss' + cursor)))
		o.className = 'focus';
	else
		cursor = '';
}

function c(td) 
{
	var id = td.id;
	var mark = td.getAttribute('mark');
	if(!cursor || cursor == null)
		focus_input_field('1');
	if(mark == null || mark == '' || mark == '-') {
		if((step = place_under_or_after_cursor(cursor, id)) != null) {
			td.setAttribute('mark', step);
			td.className = 'mark-' + step + ' ' + ('c_'+id);
			adjust_bg_pos(td);
		}
	} else {
		remove_cursor_mark(id);
		td.setAttribute('mark', '');
		td.className = '';
		td.style.backgroundPosition = '0px 0px';
	}
}

function adjust_bg_pos(td)
{
	var id = td.id;
	var cr = null;
	var cc = null;

	for(var i in card_s) {
		if(card_s[i] == id.charAt(1))
			cr = i;
	}
	for(var i in card_k)	
		if(card_k[i] == id.charAt(0))
			cc = i;

	if(cr == null || cc == null)
		return;

	dx = -cc * board_w / card_k.length;
	dy = -cr * board_h / card_s.length;
	obj(id).style.backgroundPosition = dx + "px" + " " + dy + "px";
}

function place_under_cursor(cur, card)
{
	if(cur == '' || cur == null)
		return null;

	var pref;
	var step;
	if(cur == 'b') {
		pref = cur;
		step = 'b';
	} else if(cur == 'd') {
		pref = cur;
		step = 'd';
	} else {
		pref = 'p' + cur;
		step = 'p';
	}

	//alert("Trying " + card + " at " + cur + " pref=" + pref + " step=" + step);

	var i;
	var o;
	for(i = 1; i <= 10 && (o = obj(pref + 'c' + i)); i++) {
		var mark = o.getAttribute('mark');
		if(mark == null || mark == '') {
			focus_input_field(cur);
			// ok, free space here
			o.src = BASE + 'images/cards-small/' + card + '.gif';
			o.setAttribute('mark', card);
			//alert("Set mark=" + card + " on " + o.id);
			return step;
		}
	}

	return null;
}

function seq(f, t)
{
	var n = t - f;
	var a = new Array(n);
	var i, p;

	for(p = 0, i = f; i <= t; i++, p++)
		a[p] = i;

	return a;
}

function place_under_or_after_cursor(cur, card)
{
	var cc;					// cursors
	var np = current_num_players();		// num players
	var bc = obj('trboard') ? !obj('trboard').disabled : false;
						// (if there are) board cards

	if(cur == 'b') {
		cc = new Array('b', 'd');
	} else if(cur == 'd') {
		cc = new Array('d');
	} else {
		var n = parseInt(cur);
		var z = bc ? new Array('b', 'd') : new Array('d');
		cc = seq(n > 0 ? n : 1, np).concat(z);
	};

	//alert("Placing " + card + " at (" + cc + ")");

	var ci;		// cc index
	var st;		// step -- see place_under_cursor
	for(ci in cc)
		if((st = place_under_cursor(cc[ci], card)) != null)
			return st;			
}

function remove_cursor_mark(mark)
{
	var i, p;

	//alert("Trying to remove mark=" + mark);
	for(i = 1; i <= 10; i++) {
		remove_cursor_try_single_marked('bc' + i, mark);
		remove_cursor_try_single_marked('dc' + i, mark);
		for(p = 1; p <= 10; p++) {
			remove_cursor_try_single_marked('p' + p + 'c' + i, mark);
		}
	}
}

function remove_cursor_try_single_marked(id, mark)
{
	var o = obj(id);
	if(!o) return;

	var m = o.getAttribute('mark');
	if(m != mark) return;

	o.src = BASE + 'images/cards-small/__.gif';
	o.setAttribute('mark', '');
}

function u(div)
{
	remove_cursor_mark_single(div.id);
}

function remove_cursor_mark_single(id)
{
	var o = obj(id);
	if(!o) return;
	var m = o.getAttribute('mark');
	//alert("remove_cursor_mark_single(" + id + ") marked " + m);
	if(!m || m == '' || m == '-') return;
	var cl = obj(m);
	if(!cl) return;

	c(cl);
}

function chain_request(rq, name, value)
{
	if(!value || value == '')
		return rq;
	
	if(!rq || rq == '')
		return name + '=' + escape(value);
	else
		return rq + '&' + name + '=' + escape(value);
}

function make_request_line()
{
	var i;
	var n = current_num_players();
	var r = '';

	r = chain_request(r, 'format', obj('frformat').value);
	r = chain_request(r, 'type', obj('frtype').value);
	r = chain_request(r, 'n', current_num_players());
	for(i = 1; i <= n; i++)
		r = chain_request(r, 'h' + i, make_cards_list("p" + i, 4));

	r = chain_request(r, 'board', make_cards_list('b', 5));
	r = chain_request(r, 'dead', make_cards_list('d', 10));

	return r;
}

function make_cards_list(pref, n)
{
	var i;
	var r = '';

	for(i = 1; i <= n; i++)
		if((o = obj(pref + 'c' + i))) {
			var v = o.getAttribute('mark');
			if(!v || v == '' || v == '-')
				continue;
			if(r != '')
				r += ',';
			r += v;
		}
	
	return r;	
}

function hide_element(id, style)
{
	var o = obj(id);
	if(!o) return;
	o.className = 'nd';
	o.setAttribute('mark', '-');
}

function unhide_element(id, style)
{
	var o = obj(id);
	if(!o) return;
	o.className = style;
	var m = o.getAttribute('mark');
	if(m == '-')
		o.setAttribute('mark', '');
}

function frprocess()
{
	if(!check_players_card_count())
		return;

	//hide_element('toptable', '');
	hide_element('cardtable', '');
	unhide_element('status', 'message');
	//hide_element('formtable', '');
	update_status_message('Loading...');
	send_async_request();	
	obj('btns').value = 'Resubmit';
	hide_element('btns', 'button');
}

function send_async_request()
{
	req = make_request_line();

	if(window.XMLHttpRequest) {
		RQ = new XMLHttpRequest();
	} else {
		// (*&^$#(*%&#% IE
		RQ = null;
		var XV = ["Microsoft.XMLHTTP", "MSXML2.XMLHTTP", "MSXML2.XMLHTTP.5.0",
		    		"MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0"];
		for(var i in XV) {
			try {
				RQ = new ActiveXObject(XV[i]);
				break;
			} catch(err) {
				// do nothing
			};
		} if(!RQ) {
			alert("Can't create XMLHttpRequest");
		}
	}
	RQ.open('POST', BASE + 'odds_text.php', true);
	RQ.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	RQ.setRequestHeader("Content-length", req.length);
	RQ.setRequestHeader("Connection", "close");
	RQ.onreadystatechange = recv_async_request;
	RQ.send(req);
}

function recv_async_request()
{
	if(RQ.readyState) 
		if(RQ.readyState != 4)
			return;
	if(RQ.status == 200) {
		update_status_message('Got response');
		var data = RQ.responseText.split(/--!!--/);
		frarrived(data[0], data[1], data[2]);
	} else if(RQ.status == 500) {
		update_status_message("Error: " + RQ.responseText);	
	} else {
		update_status_message(RQ.status + " " + RQ.statusText);
	}
}

function frreset()
{
	RQ = null;
	unhide_element('toptable', '');
	unhide_element('cardtable', '');
	unhide_element('formtable', '');
	hide_element('btno');
	hide_element('btnr');
	unhide_element('btns');
	hide_element('status', 'message');
	update_status_message('Ready');
	hide_element('outpage', 'outpage');
	hide_element('outpad', 'outpad');
	hide_element('outlink', '');
	obj('btns').value = 'Submit';
}

function back_link_html(id)
{
	return '<a href="http://www.flopturnriver.com/Poker-Odds-' + id + '.html">Archive page: ' + id + '</a>';
}

function frarrived(id, outpage, outuser)
{
	if(!RQ) return;
	hide_element('toptable', '');
	hide_element('cardtable', '');
	hide_element('formtable', '');
	unhide_element('btno');
	unhide_element('btnr');
	//hide_element('btnc');
	hide_element('status', 'message');
	unhide_element('outpage', 'outpage');
	unhide_element('outpad', 'outpad');
	unhide_element('outlink', '');
	update_status_message('Done');

	obj('outpage').innerHTML = outpage;
	obj('output').innerHTML = outuser;
	obj('outlink').innerHTML = back_link_html(id);
}

function frclear()
{
	var c;
	var p;

	if(RQ != null) 
		frreset();

	for(p = 1; p <= max_num_players; p++)
		for(c = 1; c <= max_num_cards; c++)
			remove_cursor_mark_single('p' + p + 'c' + c);
	for(c = 1; c <= 5; c++)
		remove_cursor_mark_single('bc' + c);
	for(c = 1; c <= 10; c++)
		remove_cursor_mark_single('dc' + c);

	focus_input_field("1");
}

function update_status_message(msg)
{
	var o = obj('status');
	if(!o) return;
	o.innerHTML = msg;
}

function current_game_type()
{
	var o;
	return (o = obj("frtype")) ? o.value : null;
}

function update_game_type()
{
	var t = current_game_type();

	if(!t)
		return;
	switch(t[0]) {
		case 'h':
			set_num_cards(2, 2);
			unhide_element("trboard", '');
			break;
		case 'o':
			set_num_cards(4, 4);
			unhide_element("trboard", '');
			break;
		case '7':
		case 'r':
			set_num_cards(3, 6);
			unmark_board_cards();
			hide_element("trboard", '');
			break;
		case '5':
			set_num_cards(5, 5);
			unmark_board_cards();
			hide_element("trboard", '');
			break;
	}
	focus_input_field('1');
}

function set_num_cards(cmin, cmax)
{
	var p;
	var c;
	var log = '';

	min_submit_cards = cmin;
	max_submit_cards = cmax;
	for(p = 1; p <= max_num_players; p++) {
		for(c = 1; c <= cmax; c++)
			unhide_element('p' + p + 'c' + c);
		for(; c <= max_num_cards; c++) {
			log += 'p' + p + 'c' + c + ', ';
			remove_cursor_mark_single('p' + p + 'c' + c);
			hide_element('p' + p + 'c' + c);
		}
	}
	//alert("removed: " + log);
}

function unmark_board_cards()
{
	var c;
	for(c = 1; c < 5; c++)
		remove_cursor_mark_single('bc' + c);
}

function check_players_card_count()
{
	var p, c;
	var s, n = current_num_players();
	var o, m;

	for(p = 1; p <= n; p++) {
		s = 0;
		for(c = 1; c <= max_submit_cards; c++) {
			if(!(o = obj('p' + p + 'c' + c)))
				continue;
			m = o.getAttribute('mark');
			if(!m || m == '' || m == '-')
				continue;
			s++;
		}
		if(s > 0) { 
			if(s > max_submit_cards) {
				alert("Too many cards for player " + p + " (??!)");
				focus_input_field(p);
				return false;
			} else if(s < min_submit_cards) {
				if(max_submit_cards == min_submit_cards)
					alert("Please select " + english_num(max_submit_cards)
							+ " cards for player " + p);
				else
					alert("Please select at least " + english_num(min_submit_cards)
							+ " cards for player " + p);
				focus_input_field(p);
				return false;
			}
		}
	}

	return true;
}

function english_num(n)
{
	switch(n) {
		case 1: return "one";
		case 2: return "two";
		case 3: return "three";
		case 4: return "four";
		case 5: return "five";
		case 6: return "six";
		default: return n;
	}
}
