/**
 * This script contains functions for the Sudoku game in expert mode.
 *
 * uses JQuery >= 1.1.3
 *
 * @author Mario Volke <mario.volke@webholics.de>
 * @copyright 2007 Mario Volke
 */
 
var SUDOKU_GAME_STARTED = false;
var SUDOKU_GAME_START_TIME = false;
var SUDOKU_GAME_HELP = false;
var SUDOKU_GAME_CHANGE_URL = false;
var SUDOKU_GAME_FINISHED_URL = false;
 
function gameStart(_url, _changeUrl, _finishedUrl) {

    SUDOKU_GAME_CHANGE_URL = _changeUrl;
    SUDOKU_GAME_FINISHED_URL = _finishedUrl;

    // show button query
    $('#game_button_start').addClass('invisible');
    $('#game_button_query').removeClass('invisible');

    $('#sudokuMessage').css('display', 'none');
    
     $.ajax({type: 'POST',
             url: _url,
             dataType: 'json',
             success: function(json) {
                $.each(json.game.values, function(name, value) {
                    $('#sudoku_box_' + value.position).addClass('boxGiven');
                    $('#sudoku_box_' + value.position + '_value').removeClass('value').text(value.value).removeAttr('onclick');
                });

                // show button stop
                $('#game_button_query').addClass('invisible');
                $('#game_button_stop').removeClass('invisible');

                // show export
                if(json.game.exportImg && json.game.exportPdf) {
                    $('#subMenuExportLinkImage').attr('href', json.game.exportImg);
                    $('#subMenuExportLinkPdf').attr('href', json.game.exportPdf);
                    $('#subMenuExportHeader').css('display', 'block');
                    $('#subMenuExportBody').css('display', 'block');
                }

                SUDOKU_GAME_STARTED = true;
                var now = new Date();
                SUDOKU_GAME_START_TIME = now.getTime();
                
                gameUpdateTime();
                window.setInterval('gameUpdateTime()', 1000);
                
                if(json.game.help == 'true') {
                    SUDOKU_GAME_HELP = true;
                }
             }
    });
}

function gameUpdateTime() {
    var now = new Date();
    var cur_time = new Date();
    var str = '';
    var cur_str = '';

    cur_time.setTime(now.getTime() - SUDOKU_GAME_START_TIME);
    
    cur_str = String(cur_time.getUTCHours());
    if(cur_str.length == 1) {
        cur_str = '0' + cur_str;
    }
    str += cur_str + ':';
    
    cur_str = String(cur_time.getUTCMinutes());
    if(cur_str.length == 1) {
        cur_str = '0' + cur_str;
    }
    str += cur_str + ':';

    cur_str = String(cur_time.getUTCSeconds());
    if(cur_str.length == 1) {
        cur_str = '0' + cur_str;
    }
    str += cur_str;

    $('#sudokuGameTime').text(str);
}

function showValues(_pos) {
    if(SUDOKU_GAME_STARTED) {
        $('#sudoku_box_' + _pos + '_value').text('').addClass('invisible');
        $('#sudoku_box_' + _pos).removeClass('boxError');

        for(var i = 1; i <= 9; i++) {
            $('#sudoku_box_' + _pos + '_value' + i).removeClass('invisible');
        }
    }
}

function toggleValue(_pos, _value) {
    if(SUDOKU_GAME_STARTED) {
        var obj = $('#sudoku_box_' + _pos + '_value' + _value)
        if(obj.text() == '') {
            obj.text(_value);
        }
        else {
            obj.text('');
        }

        var values = 0;
        var lock = '';
        for(var i = 1; i <= 9; i++) {
            if($('#sudoku_box_' + _pos + '_value' + i).text() != '') {
                values++;
                lock = $('#sudoku_box_' + _pos + '_value' + i).text();
            }
        }

        //lockValue
        if(values == 1) {
            lockValue(_pos, lock);
        }
    }
}

function lockValue(_pos, _value) {
    if(SUDOKU_GAME_STARTED) {
        $('#sudoku_box_' + _pos + '_value').text(_value).removeClass('invisible');

        for(var i = 1; i <= 9; i++) {
            $('#sudoku_box_' + _pos + '_value' + i).text(String(i)).addClass('invisible');
        }

        gameChange();
    }
}

function gameChange() {

    if(SUDOKU_GAME_STARTED) {
        $.ajax({type: 'POST',
                url: SUDOKU_GAME_CHANGE_URL,
                data: {state: getPuzzleString()},
                dataType: 'json',
                success: function(json) {
                    if(json.game.finished == 'true') {
                        $('#game_button_stop').addClass('invisible');
                        window.location.href = SUDOKU_GAME_FINISHED_URL;
                        
                        // do not allow new inputs
                        SUDOKU_GAME_STARTED = false;
                    }
                    else {
                        if(SUDOKU_GAME_HELP) {
                            $.each(json.game.values, function (box_name, box_value) {
                                switch(box_value.status) {
                                    case 'start':
                                    case 'correct':
                                        $('#sudoku_box_' + box_value.position).removeClass('boxError');
                                        break;
                                    case 'incorrect':
                                        $('#sudoku_box_' + box_value.position).addClass('boxError');
                                        break;
                                }
                            });
                        }
                        else {
                            if(json.game.values) {
                                $.each(json.game.values, function (box_name, box_value) {
                                    switch(box_value.status) {
                                        case 'start':
                                        case 'correct':
                                            $('#sudoku_box_' + box_value.position).removeClass('boxError');
                                            break;
                                        case 'incorrect':
                                            $('#sudoku_box_' + box_value.position).addClass('boxError');
                                            break;
                                    }
                                });
                            }
                        }
                    }
                }
        });
    }
}

function getPuzzleString() {
    var str = '';
    
    for(var i = 0; i < 81; i++) {
        var value = parseInt($('#sudoku_box_' + i + '_value').text());

        if(value >= 1 && value <= 9) {
            str += String(value);
        }
        else {
            str += '0';
        }
    }
    
    return str;
}
