//
// Copyright (C) 2007, 2008 Johan Euphrosine <proppy@aminche.com>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301, USA.
//

var webserviceJSON = {
    //url: 'http://localhost:8080/?&jsoncallback=?',
	//not sure why put pylons/libeval don't play well together. For
	//now I am going to use the default cgi script.
    url: '/sandbox/poker/hand_evaluator_webservice/?&jsoncallback=?',
	//url: 'http://tomfmason.net/poker-eval-webservice/?&jsoncallback=?',
    get: $.getJSON,
    parse: function(data){return data;},
    iterations: 10000,
    max_iterations: 750000
};

var webserviceGET = {
    url: '/',
    get: $.get,
    parse: JSON.parse,
    iterations: 10000,
    max_iterations: 750000
};

var webservice = webserviceJSON;

function pockets2JSON(pockets)
{
    var hands = pockets.split("\n");
    result = $.map(hands, function(hand) {
	    if ($.trim(hand) == "")
		return null;
	    var cards = hand.split(" ");
	    if (cards.length == 1)
		cards = cards[0].split(",");
	    return [$.map(cards, function(card) {
			if (card == "")
			    return null;
			return card
			    })];
	});
    return result;
}

function board2JSON(board)
{
    var cards;
    if (!board || board == "")
	cards = [];
    else
	{
	    cards = board.split(" ");
	    if (cards.length == 1)
		cards = cards[0].split(",");
	}
    return cards;
}

function dead2JSON(dead)
{
    if (!dead || dead == "")
	return undefined
    var cards;
    cards = dead.split(" ");
    if (cards.length == 1)
	cards = cards[0].split(",");
    return cards;
}

function PokerEvalWidget(selector, query, callback)
{
    function updateResult()
    {
	$(".load img", selector).attr("src", "/images/load.gif");
	var params = {game: $(".game select option:selected", selector).val(),
		      pockets: $(".pockets textarea", selector).val(),
		      board: $(".board input", selector).val()};
	var dead = $(".dead input", selector).val();
	if (dead && dead != "") params.dead = dead;


	var iterations = $(".iterations input", selector).val();
	if (iterations != webservice.iterations) params.iterations = parseInt(iterations);

	var paramsJSON = {game: params.game,
			  pockets: pockets2JSON(params.pockets),
			  board: board2JSON(params.board)};
	if (params.dead)
	    paramsJSON.dead = dead2JSON(params.dead);
	if (params.iterations)
	    paramsJSON.iterations = params.iterations

	var paramsGET = {};
	$.each(paramsJSON, function(key, val) {
		paramsGET[key] = JSON.stringify(val);
	    });

	webservice.get(webservice.url, paramsGET, function(data) {
		$(".error", selector).html("");
		$(".load img", selector).attr("src", "/images/none.gif");
		var resultSelector = $(".result", selector);
		resultSelector.empty();
		if (data.error != undefined)
		    {
			$(".error", selector).html("<p>Error</p>"+ data.error);
			if (callback)
			    callback();
			return;
		    }
		var title = $("<p>Result</p>").appendTo(resultSelector);
		var table = $("<table>").appendTo(resultSelector);
		var header = "<tr class='header'><td>cards</td><td>winhi</td><td>losehi</td><td>tiehi</td><td>winlo</td><td>loselo</td><td>tielo</td><td>scoop</td><td>ev</td></tr>";
		table.append(header);
		var result = webservice.parse(data);
		$.each(result.eval, function(i) {
			var pockets = paramsJSON.pockets;
			var content = {cards: pockets[i].join(" "),
				       winhi: this.winhi,
				       losehi: this.losehi,
				       winlo: this.winlo,
				       loselo: this.loselo,
				       tiehi: this.tiehi,
				       tielo: this.tielo,
				       scoop: this.scoop,
				       ev: this.ev/1000.0};
			var line = "<tr><td>%cards</td><td>%winhi</td><td>%losehi</td><td>%tiehi</td><td>%winlo</td><td>%loselo</td><td>%tielo</td><td>%scoop</td><td>%ev</td></tr>";
			$.each(content, function(key, val) {
				line = line.replace("%"+key, val);
			    });
			table.append(line);
		    });
		var query = $.query.empty();
		$.each(params, function(key, val) {
			if ((val != undefined) && (val != ""))
			    query = query.set(key, val);
		    });
		resultSelector.append("<p><a href="+query.toString()+">"+location.protocol+"//"+location.host+location.pathname+query.toString()+"</a></p>");
		resultSelector.trigger("change");
	    });
    }
    var template = '';
    var game = {"holdem":   "Holdem" ,
		"holdem8":  "Holdem Hi/Low 8-or-better" ,
		"omaha":    "Omaha" ,
		"omaha8":   "Omaha Hi/Low 8-or-better" ,
		"7stud":    "7-card Stud Hi" ,
		"7stud8":   "7-card Stud Hi/Low 8-or-better" ,
		"7studnsq":  "7-card Stud Hi/Low no qualifier" ,
		"razz":     "Razz" ,
		"5draw":    "5-card Draw Hi with joker" ,
		"5draw8":   "5-card Draw Hi/Low 8-or-better with joker" ,
		"5drawnsq": "5-card Draw Hi/Low no qualifier with joker" ,
		"lowball":  "5-card Draw A-5 Lowball with joker" ,
		"lowball27":"5-card Draw 2-7 Lowball" };
    template += '<div class="game"><p>Game</p><select>';
    $.each(game, function(key, val) {
	    template += '<option value="'+key+'">'+val+'</option>';
	});
    template += '</select></div>';
    template += '<div class="pockets"><p>Hands</p><textarea rows="4" cols="50" /></div>';
    template += '<div class="board"><p>Board</p><input type="text" size="20" /></div>';
    template += '<div class="dead"><p>Dead</p><input type="text" size="20" /></div>';
    template += '<div class="iterations"><p>Iterations</p><input type="text" size="10" /></div>';
    template += '<div class="call"><p></p><input type="submit" value="Calculate Odds" style="margin-top:10px;" /></div>';
    template += '<div class="load"><img src="/images/none.gif"/></div>';
    template += '<div class="error"></div>';
    template += '<div class="result"></div>';
    selector.html(template);

    $(".iterations input").val(webservice.iterations);
    $(".iterations input", selector).change(function() {
	    if ($(this).val() > webservice.max_iterations)
		$(this).val(webservice.max_iterations);
	});
    $(".call input", selector).click(updateResult);
    if (callback)
	$(".result", selector).change(callback);
    $(".error", selector).ajaxError(function (event, XMLHttpRequest, ajaxOptions, thrownError) {
	    // thrownError only passed if an error was caught
	    $(".result", selector).html("");
	    $(".load img", selector).attr("src", "/images/none.gif");
	    $(this).html("<p>Error</p>An error has occured, please check you have entered the hands correctly");
	    if (callback)
		callback();
	});

    if (!query)
	query = $.query
    if (query.has("game"))
	$(".game select", selector).val(decodeURIComponent(query.get("game")));
    if (query.has("pockets"))
	$(".pockets textarea", selector).val(decodeURIComponent(query.get("pockets")));
    if (query.has("board"))
	$(".board input", selector).val(decodeURIComponent(query.get("board")));
    if (query.has("dead"))
	$(".dead input", selector).val(decodeURIComponent(query.get("dead")));
    if (query.has("iterations"))
	$(".iterations input", selector).val(decodeURIComponent(query.get("iterations")));
    if (query.has("game") && query.has("pockets"))
	$(".call input", selector).click();

    return selector;
}
