    var Game = {
        form: {
            Register: function() {
                var error = false;
                if ((document.getElementById("login").value).length>25) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.register.too_long_username + '</p>';
                    error = true;
                }
                else if (!/^[a-zA-Zа-яА-Я0-9=_-]{1,25}$/.test(document.getElementById("login").value)) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.register.incorrectly_stated_username + '</p>';
                    error = true;
                }
                else if (!/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z_-]+\.)+[a-z]{2,4}$/i.test(document.getElementById("email").value)) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.register.incorrectly_stated_email + '</p>';
                    error = true;
                }
                else if ((document.getElementById("password").value).length<4) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.register.short_password + '</p>';
                    error = true;
                }
                else if (document.getElementById("password").value!=document.getElementById("password2").value) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.register.passwords_not_match + '</p>';
                    error = true;
                }

                if (!error) return true;
                return false;
            },


            Remind: function() {
                var error = false;
                if (document.getElementById("login_email").value=="") {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.remind.enter_login + '</p>';
                    error = true;
                }

                if (!error) return true;
                return false;
            },


            RemindPass: function() {
                var error = false;

                if (document.getElementById("code").value=="") {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.remind.wrong_code + '</p>';
                    error = true;
                }
                else if ((document.getElementById("new_password").value).length<4) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.register.short_password + '</p>';
                    error = true;
                }
                else if (document.getElementById("new_password").value!=document.getElementById("new_password_confirm").value) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.register.passwords_not_match + '</p>';
                    error = true;
                }

                if (!error) return true;
                return false;
            },


            changeSettings: function() {
                var error = false;
                var data = new Object;

                data["sendmail"] = (document.getElementById("sendmail").checked) ? 1 : 0;
                data["maxmess"] = parseInt(document.getElementById("maxmess").value);

                if (isNaN(data.maxmess) || data.maxmess <= 0) {
                    document.getElementById("chSetMessage").innerHTML = '<p class="error">' + lang.advanced.incorrectly_number_messages + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("chSetMessage").innerHTML = '';
                    ajax.chSettings(data);
                }
                return false;
            },


            changeEmail: function() {
                var error = false;

                if (!/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z_-]+\.)+[a-z]{2,4}$/i.test(document.getElementById("email").value)) {
                    document.getElementById("chEmailMessage").innerHTML = '<p class="error">' + lang.register.incorrectly_stated_email + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("chEmailMessage").innerHTML = '';
                    ajax.chEmail(document.getElementById("email").value);
                }
                return false;
            },


            changePass: function() {
                var error = false;
                var data = new Object;

                data["nowpass"] = document.getElementById("nowpass").value;
                data["password"] = document.getElementById("password").value;
                data["password_confirm"] = document.getElementById("password_confirm").value;

                if (data.nowpass == '') {
                    document.getElementById("chPassMessage").innerHTML = '<p class="error">' + lang.advanced.invalid_current_password + '</p>';
                    error = true;
                }
                else if (data.password == '') {
                    document.getElementById("chPassMessage").innerHTML = '<p class="error">' + lang.advanced.invalid_new_password + '</p>';
                    error = true;
                }
                else if ((data.password).length < 4) {
                    document.getElementById("chPassMessage").innerHTML = '<p class="error">' + lang.register.short_password + '</p>';
                    error = true;
                }
                else if (data.password != data.password_confirm) {
                    document.getElementById("chPassMessage").innerHTML = '<p class="error">' + lang.register.passwords_not_match + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("chPassMessage").innerHTML = '';
                    ajax.chPassword(data);
                }
                return false;
            },


            newAlliance: function() {
                var error = false;
                var alName = document.getElementById("alName").value;

                if (!/^[a-zA-Zа-яА-Я0-9=_@.-]{1,30}$/.test(alName)) {
                    document.getElementById("al_message").innerHTML = '<p class="error">' + lang.alliance.invalid_alliance_name + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("al_message").innerHTML = '';
                    ajax.newAl(alName);
                }

                return false;
            },

/*
            addToAlliance: function() {
                var error = false;
                var data = new Object;

                data["login"] = document.getElementById("alUser").value;
                data["email"] = document.getElementById("alEmail").value;

                if (data["login"] == "") {
                    document.getElementById("al_message").innerHTML = '<p class="error">' + lang.other.have_not_select_player + '</p>';
                    error = true;
                }
                else if (data["email"] == "") {
                    document.getElementById("al_message").innerHTML = '<p class="error">' + lang.alliance.no_email + '</p>';
                    error = true;
                }
                else if (!/^[_\.0-9a-z-]+@([0-9a-z][0-9a-z_-]+\.)+[a-z]{2,4}$/i.test(data["email"])) {
                    document.getElementById("al_message").innerHTML = '<p class="error">' + lang.register.incorrectly_stated_email + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("al_message").innerHTML = '';
                    ajax.addToAl(data);
                }

                return false;
            },
*/

            collectAll: function(army) {
                for (unit in army) document.getElementById("army_" + unit).value = army[unit];
            },


            newArmy: function(units) {
                var error = false;

                var sum = 0;
                var data = new Object;

                for(var i=0; i<units.length; i++){
                    var val = parseInt(document.getElementById("army_"+units[i]).value);
                    if(val>0) {
                        if (units[i] != "stone" && units[i] != "cred") sum = sum + val;
                        data[units[i]] = val;
                    }
                }

                data["name"] = document.getElementById("army_name").value;

                if (data.name == "") {
                    document.getElementById("army_message").innerHTML = '<p class="error">' + lang.army.no_army_name + '</p>';
                    error = true;
                }
                else if (sum <= 0) {
                    document.getElementById("army_message").innerHTML = '<p class="error">' + lang.army.army_must_have_unit + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("army_message").innerHTML = '';
                    ajax.createArmy(data);
                }
                return false;
            },


            changeHouse: function(houseID) {
                document.getElementById('firstbase_x').value = '';
                document.getElementById('firstbase_y').value = '';

                MAPS.mapFirstBase.showArea(houseID);
            },


            firstBase: function(block) {
                var error = false;
                var data = new Object;
                var blockHouse = false;

                data["house"] = document.getElementById("house").value;
                data["name"] = document.getElementById("name").value;
                data["x"] = parseInt(document.getElementById("firstbase_x").value);
                data["y"] = parseInt(document.getElementById("firstbase_y").value);

                if (block) for(var i=0; i<block.length; i++){
                    if (block[i]==data.house) blockHouse = true;
                }

                if (data.house != 'Atreides' && data.house != 'Ordos' && data.house != 'Harkonnen') {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.firstBase.no_house + '</p>';
                    error = true;
                }
                else if ((data.name).length>30) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.firstBase.incorrectly_basename + '</p>';
                    error = true;
                }
                else if (!/^[^\/\\\<>|]{1,30}$/.test(data.name)) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.firstBase.incorrectly_basename + '</p>';
                    error = true;
                }
                else if (blockHouse) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.firstBase.too_many_players + '</p>';
                    error = true;
                }
                else if (isNaN(data.x) || isNaN(data.y) ) {
                    document.getElementById("message").innerHTML = '<p class="error">' + lang.firstBase.no_coordinates + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("message").innerHTML = '';
                    ajax.buildFirstBase(data);
                }
                return false;
            },


            death_hand: function(mapRadius) {
                var error = false;
                var data = new Object;

                data["x"] = parseInt(document.getElementById("death_hand_x").value);
                data["y"] = parseInt(document.getElementById("death_hand_y").value);

                if (0
                    || isNaN(data.x)
                    || isNaN(data.y)
                    || Math.abs(data.x) > mapRadius
                    || Math.abs(data.y) > mapRadius
                ) {
                    document.getElementById("death_hand_message").innerHTML = '<p class="error">' + lang.other.failed_set_coordinate + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("death_hand_message").innerHTML = '';
                    ajax.death_hand(data);
                }
                return false;
            },


            delMessages: function(type) {
                var data = new Object;
                data["type"] = type;

                var checkboxes = document.getElementById("delForm").elements;
                var n = 0;
                for (var i = 0; i < checkboxes.length; i++) {
                    if (checkboxes[i].type == "checkbox" && checkboxes[i].checked) {
                        data["message"+n] = checkboxes[i].value;
                        n++;
                    }
                }

                if (n) {ajax.delMessages(data)}
                return false;
            },


            changeRecipient: function(recipient) {
                document.getElementById("player").value = recipient;
            },


            changeText: function(text_id,login) {
                document.getElementById("message_text").value = "<i>" + lang.message.quote + " <b>"+login+"</b>\n---\n<blockquote>"+document.getElementById("text_"+text_id).innerHTML.split(/<br>/i).join("")+"</blockquote>\n---</i>\n\n";
            },


            message: function() {
                var error = false;
                var data = new Object;

                document.getElementById("message_message").innerHTML = '';

                data["text"] = document.getElementById("message_text").value;

                data["type"] = 1;
                try {if (document.getElementById("message_type2").checked) data["type"] = 2;} catch (e) {}
                if (document.getElementById("message_type3").checked) data["type"] = 5;


//                if (data.type != 2) data.type = 1;

                if (data.type == 1) {
                    data["player"] = document.getElementById("player").value;
                    if (data.player == "") {
                        document.getElementById("message_message").innerHTML = '<p class="error">' + lang.other.have_not_select_player + '</p>';
                        error = true;
                    }
                }

                if (data.text=="") {
                    document.getElementById("message_message").innerHTML = '<p class="error">' + lang.message.message_empty + '</p>';
                    error = true;
                }


                if (!error) {ajax.sendMessage(data);}
                return false;
            },


            saboteur: function() {
                var error = false;
                var data = new Object;

                data["base_id"] = parseInt(document.getElementById("saboteur_base").value);

                if (isNaN(data.base_id)) {
                    document.getElementById("saboteur_message").innerHTML = '<p class="error">' + lang.other.failed_set_targets + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("saboteur_message").innerHTML = '';
                    ajax.saboteur(data);
                }
                return false;
            },


            spaceport: function(units) {
                var error = false;

                var data = Game.spaceportCargo(units);
                if (data.length == 0) {
                    document.getElementById("spaceport_message").innerHTML = '<p class="error">' + lang.spaceport.did_not_indicate_cargo + '</p>';
                    error = true;
                }

                data["destination"] = parseInt(document.getElementById("destination").value);
                if (isNaN(data.destination)) {
                    document.getElementById("spaceport_message").innerHTML = '<p class="error">' + lang.spaceport.no_destination + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("spaceport_message").innerHTML = '';
                    ajax.spaceport(data);
                }
                return false;
            },


            splitArmy: function(army_id,units) {
                var error = false;

                var sum = 0;
                var data = new Object;

                for(var i=0; i<units.length; i++){
                    var val = parseInt(document.getElementById("army_"+units[i]).value);
                    if(val>0) {
                        if (units[i] != "stone" && units[i] != "cred") sum = sum + val;
                        data[units[i]] = val;
                    }
                }

                data["army_id"] = army_id;
                data["name"] = document.getElementById("army_name").value;

                if (data.name == "") {
                    document.getElementById("army_message").innerHTML = '<p class="error">' + lang.army.no_army_name + '</p>';
                    error = true;
                }
                else if (sum <= 0) {
                    document.getElementById("army_message").innerHTML = '<p class="error">' + lang.army.army_must_have_unit + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("army_message").innerHTML = '';
                    ajax.splitArmy(data);
                }
                return false;
            },


            spying: function(mapRadius) {
                var error = false;
                var data = new Object;

                data["x"] = parseInt(document.getElementById("spy_x").value);
                data["y"] = parseInt(document.getElementById("spy_y").value);

                if (0
                    || isNaN(data.x)
                    || isNaN(data.y)
                    || Math.abs(data.x) > mapRadius
                    || Math.abs(data.y) > mapRadius
                ) {
                    document.getElementById("spy_message").innerHTML = '<p class="error">' + lang.other.failed_set_coordinate + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("spy_message").innerHTML = '';
                    ajax.spy(data);
                }
                return false;
            },


            trade: function(units) {
                var error = false;

                var sum = 0;
                var data = new Object;

                for(var i=0; i<units.length; i++){
                    var val = parseInt(document.getElementById("send_"+units[i]).value);
                    if(val>0) {
                        sum = sum + val;
                        data[units[i]] = val;
                    }
                }

                if (sum <= 0) {
                    document.getElementById("trade_message").innerHTML = '<p class="error">' + lang.trade.did_not_indicate_order + '</p>';
                    error = true;
                }

                if (!error) {
                    document.getElementById("trade_message").innerHTML = '';
                    ajax.trade(data);
                }
                return false;
            },


            admin: {
                sendSysMessage: function() {
                    var error = false;

                    var text = document.getElementById("sysText").value;


                    if (text == '') {
                        document.getElementById("sendSysMessage").innerHTML = '<p class="error">' + lang.message.message_empty + '</p>';
                        error = true;
                    }

                    if (!error) {
                        document.getElementById("sendSysMessage").innerHTML = '';
                        ajax.sendSysMessage(text);
                    }
                    return false;
                },
                awarding: function() {
                    var error = false;

                    var data = new Object;
                    data['player'] = document.getElementById("player").value;
                    data['round'] = parseInt(document.getElementById("round").value);
                    data['medal'] = document.getElementById("medal").value;
                    data['comment'] = document.getElementById("comment").value;


                    if (data['player'] == '') {
                        document.getElementById("medalMessage").innerHTML = '<p class="error">' + lang.other.have_not_select_player + '</p>';
                        error = true;
                    }
                    if (data['round'] == 0) {
                        document.getElementById("medalMessage").innerHTML = '<p class="error">' + lang.error + '</p>';
                        error = true;
                    }
                    if (data['medal'] == '') {
                        document.getElementById("medalMessage").innerHTML = '<p class="error">' + lang.error + '</p>';
                        error = true;
                    }
                    if (data['comment'] == '') {
                        document.getElementById("medalMessage").innerHTML = '<p class="error">' + lang.error + '</p>';
                        error = true;
                    }

                    if (!error) {
                        document.getElementById("medalMessage").innerHTML = '';
                        ajax.awarding(data);
                    }
                    return false;
                }
            }
        },


        getUserStat: function(user) {window.location.href = '/game/stat/' + user + '/';},


        spaceportCargo: function(units) {
            var data = new Object;

            for(var i=0; i<units.length; i++){
                var val = parseInt(document.getElementById("send_"+units[i]).value);
                if(val>0) data[units[i]] = val;
            }

            return data;
        },


        spaceportPrice: function(info) {
            var cost = 0;

            var units = [];
            for (key in info.prices) units[units.length] = key;

            var cargo = Game.spaceportCargo(units);
            for (unit in cargo) cost += cargo[unit] * info.prices[unit];

            var destination = parseInt(document.getElementById("destination").value);

            var percent = info.percent.other;
            if (isNaN(destination));
            else if (in_array(destination, info.baseGroupByCost.quest)) percent = info.percent.quest;
            else if (in_array(destination, info.baseGroupByCost.local)) percent = info.percent.local;

            document.getElementById('spaceport_cost').innerHTML = Math.round(cost * percent / 100);
        },


        getHouseAreaCenters: function() {
            switch (duneLocation) {
                case 'sihaya':
                    return {
                        'Atreides':{x:67,y:59},
                        'Ordos':{x:0,y:-67},
                        'Harkonnen':{x:-59,y:67},
                        'Fremen':{x:0,y:0},
                        'Corrino':{x:0,y:0},
                        'Mercenaries':{x:0,y:0}
                    }
                    break;

                default:
                    return {
                        'Atreides':{x:35,y:20},
                        'Ordos':{x:0,y:-40},
                        'Harkonnen':{x:-35,y:20},
                        'Fremen':{x:0,y:0},
                        'Corrino':{x:0,y:0},
                        'Mercenaries':{x:0,y:0}
                    }
            }
        },


        tooltip: function(search) {
            $(search).tooltip({
                track: true,
                delay: 0,
                showURL: false,
                showBody: "/",
                fade: 250
            });
        }
    }
