/**
 * Checkroom of online RPG APEHA.ru
 * Special for zarctvo.ru (Царство Небесное)
 * 
 * Copyright (c) 2009 FINTER
 * email: blinovsv@gmail.com
 *
 * Date: 20-10-2009 
 * City: Moscow
 */

// Constansts
 
var races = {
	"El": {start: {str: 3, dex: 5, rea: 4, ang: 2, lck: 3, vit: 3, acc: 10, oeve: 10, oret: 10 }, perlvl: {"dex": 1, "vit": 1}},
	"Hm": {start: {str: 3, dex: 3, rea: 3, ang: 3, lck: 3, vit: 3, fist: 5, acc: 5, oeve: 5, oret: 10, olck: 10, ocrt: 5 }, perlvl: {"str": 1, "vit": 1}},
	"Hb": {start: {str: 3, dex: 4, rea: 4, ang: 2, lck: 5, vit: 2, def: 5, olck: 10, ocrt: 10 }, perlvl: {"rea": 1, "vit": 1}},
	"Dr": {start: {str: 3, dex: 3, rea: 3, ang: 3, lck: 3, vit: 3, oeve: 10, oret: 10, olck: 10, ocrt: 10 }, perlvl: {"vit": 2}},
	"Or": {start: {str: 5, dex: 2, rea: 2, ang: 5, lck: 3, vit: 4, fist: 5, weap: 5, ocrt: 10 }, perlvl: {"ang": 1, "vit": 1}},
	"Gn": {start: {str: 4, dex: 2, rea: 3, ang: 2, lck: 3, vit: 5, def: 5, weap: 5, oret: 10, olck: 10 }, perlvl: {"lck": 1, "vit": 1}}
};

var params = {
	"lvl"  : ["Уровень           ", true , ""     , ""       ,  0],
	"hp"   : ["Жизнь             ", false, ""     , ""       ,  0],
	"mp"   : ["Мана              ", false, ""     , ""       ,  0],
	"rate" : ["Рейт              ", false, ""     , ""       ,  0],
	"cost" : ["Цена              ", false, ""     , ""       ,  0],
	"str"  : ["Сила              ", true , ""     , "stat"   ,  1],
	"dex"  : ["Ловкость          ", true , ""     , "stat"   ,  1],
	"rea"  : ["Реакция           ", true , ""     , "stat"   ,  1],
	"ang"  : ["Злость            ", true , ""     , "stat"   ,  1],
	"lck"  : ["Удача             ", true , ""     , "stat"   ,  1],
	"vit"  : ["Сложение          ", true , ""     , "stat"   ,  1],
	"int"  : ["Интеллект         ", true , ""     , "stat"   ,  1],
	"fist" : ["Кулачный бой      ", true , "plus" , "mastery",  5],
	"def"  : ["Защита            ", true , "plus" , "mastery",  5],
	"weap" : ["Вл. оружием       ", true , "plus" , "mastery",  5],
	"acc"  : ["Меткость          ", true , "plus" , "mastery",  5],
	"afist": ["Кулачный бой прот.", false, "minus", "mastery",  5],
	"adef" : ["Защита прот.      ", false, "minus", "mastery",  5],
	"aweap": ["Вл. оружием прот. ", false, "minus", "mastery",  5],
	"aacc" : ["Меткость прот.    ", false, "minus", "mastery",  5],
	"oeve" : ["Об. уворота       ", false, "plus" , "obereg" ,  5],
	"oret" : ["Об. ответа        ", false, "plus" , "obereg" ,  5],
	"olck" : ["Об. удачи         ", false, "plus" , "obereg" ,  5],
	"ocrt" : ["Об. крита         ", false, "plus" , "obereg" ,  5],
	"aoeve": ["Антиоб. уворота   ", false, "minus", "obereg" ,  5],
	"aoret": ["Антиоб. ответа    ", false, "minus", "obereg" ,  5],
	"aolck": ["Антиоб. удачи     ", false, "minus", "obereg" ,  5],
	"aocrt": ["Антиоб. крита     ", false, "minus", "obereg" ,  5],
	"ldmg" : ["Урон лев.         ", false, ""     , "damag"  ,  0],
	"rdmg" : ["Урон прав.        ", false, ""     , "damag"  ,  0],
	"armt" : ["Броня головы      ", false, ""     , "armor"  ,  0],
	"armc" : ["Броня корпуса     ", false, ""     , "armor"  ,  0],
	"arml" : ["Броня лев. руки   ", false, ""     , "armor"  ,  0],
	"armr" : ["Броня прав. руки  ", false, ""     , "armor"  ,  0],
	"armb" : ["Броня ног         ", false, ""     , "armor"  ,  0],
	"range": ["Радиус действия   ", false, ""     , ""       ,  0],
	"strmod":["Влияние силы      ", false, ""     , ""       ,  0],
	"race" : ["Требуемая раса    ", false, ""     , ""       ,  0],
	"chrg" : ["Количество зарядов", false, ""     , ""       ,  0]
};

var item_img_path = 'img/items/';

function int(s) {
    if (s === undefined || s == '') {
        return 0;
    }
    return parseInt(String(s).replace(/^([-]?)0*([1-9][0-9]+|[0])$/, "$1$2"));
}

function max(a, b) {
	return int(a) > int(b) ? int(a) : int(b);
}

function get_description_html(item_type, number){
	var item = items[item_type][number];
	var description = "<h3>" + item.name + "</h3>";
	description += "<ul>";
	for (var i in item.stats) {
		if (i == undefined) continue;
		if (i == "dmg") {
			description += "<li>Урон: <span>" + item.stats[i] + "</span> </li>";
			continue;
		}
		if (item_type != "weapon" && ( i == "range" || i == "strmod")) continue;
		description += "<li>" + params[i][0] + ": <span>" + item.stats[i] + "</span> </li>";
	}
	description += "</ul>";
	return description;
}

function get_gem_description_html(gem_type, gem_plus){
	var param = gem_type.replace(/^gem_type_(.+)$/ig, "$1");
	var number = gem_plus.replace(/^[+]([0-9]+)$/ig, "$1") - 1 + 1;
	var description = "<h3>" + $($("#" + gem_type + " > td")[1]).html() + " " + gem_plus + "</h3>";
	description += "<ul>";
	description += "<li>" + params[param][0] + ": <span>" + number * params[param][4] + "</span> </li>";
	description += "</ul>";
	return description;
}

function get_select_html(item_type, number) {
	var item = items[item_type][number];
	var result =
		'<div id="' + number + '" class="item">' +
		'<img src="' + item_img_path + item.img + '" />' +
		'<span>' + item.name + '</span>' +
		'<div class="description">' + get_description_html(item_type, number) +'</div>' +
		'</div>';
	return result;
}

function get_item_type(slot) {
	return slot.replace(/^([a-z]+).*$/ig, "$1");
}

function add_item(whom, slot, number) {
	var item_type = get_item_type(slot);
	var item = items[item_type][number];
	$('#' + whom).find('.' + slot)
		.html($('<img />').attr('src', item_img_path + item.img).attr('id', number))
		.append('<div class="description">' + get_description_html(item_type, number) +'</div>')
		.tooltip({
			track: true,
			bodyHandler: function () {
				return $(this).children('.description').html();
			},
			extraClass: "stats"
		});
	calc_all_stats();
}

function add_gem(whom, slot, gem_type, gem_plus) {
	$('#' + whom).find('.' + slot)
		.html($('<img />')
			.attr('src', $('#' + gem_type).find('img').attr('src'))
			.attr('id', gem_plus)
			.attr('class', gem_type)
		)
		.append('<span class="gem_plus">' + gem_plus + '</span>')
		.append('<div class="description">' + get_gem_description_html(gem_type, gem_plus) +'</div>')
		.tooltip({
			track: true,
			bodyHandler: function () {
				return $(this).children('.description').html();
			},
			extraClass: "stats"
		});
	calc_all_stats();
}

function add_raceperlvl_bonuses(lvl, race, side) {
	// stat = max ( можно, уже есть )
	for (var i in params) {
		var obj = $("#" + i);
		if (params[i][1] && i != "lvl") {
			var sum = 0;
			if (races[race].perlvl[i] !== undefined) sum += races[race].perlvl[i] * lvl;
			if (races[race].start[i] !== undefined) sum += races[race].start[i];
			
		    obj.find("input:" + side).val(max(sum, obj.find("input:" + side).val())); 
		    //obj.find("input:" + side).val(obj.find("input:" + side).val());
		}
	}
}

function get_rate(level, side) {
	k = 0.215 * level + 1.422;
	stat = 0;
	mastery = 0;
	obereg = 0;
	armor = 0;
	damag = 0;

	for (var i in params) {
		var obj = $('#' + i);
		switch (params[i][3]) {
			case "stat": stat += int(obj.find('.stat-' + side).html()); break;
			case "mastery": mastery += int(obj.find('.stat-' + side).html()); break;
			case "obereg": obereg += Math.abs(obj.find('.stat-' + side).html()); break;
			case "armor": armor += int(obj.find('.stat-' + side).html()); break;
			case "damag": 
				var array_dmg = obj.find('.stat-' + side).html().split("-");
				damag += int(array_dmg[0]) + int(array_dmg[1]);
				break;
			default : break;
		}
	}
	return Math.round((stat + (mastery + obereg)/5 + armor/10 + damag/4) * k)/10;
}

function calc_items_stats(slots, side) {
	for (var i in slots) {
		var slot_name = $(slots[i]).parent().attr('class');
		var item_type = get_item_type($(slots[i]).parent().attr('class'));
		var number = parseInt($(slots[i]).attr('id'));
		var item = items[item_type][number];
		if (item) {
    		for (var j in item.stats) {
    			if (j == "lvl") continue;
    			if (j == "dmg") {
    				var obj;
    				if (slot_name == "weapon1") obj = $('#ldmg');
    				if (slot_name == "weapon2") obj = $('#rdmg');
    				obj.find('.stat-' + side).html(item.stats[j]);
    			} else {
    				var obj = $('#' + j);
    				var sum = parseFloat(obj.find('.stat-' + side).html()) + parseFloat(item.stats[j]);
    				obj.find('.stat-' + side).html(Math.round(sum*100)/100);
    			}
    		}
		}
	}
}

function calc_gems_stats(side) {
	var gems = $('#character-' + side + ' > .gems > div > img').get();
	for (var i in gems) {
		var type = $(gems[i]).attr('class').replace(/^gem_type_(.+)$/ig, "$1");
		var number = $(gems[i]).attr('id').replace(/^[+]([0-9]+)$/ig, "$1") - 1 + 1;
		
		number = number * params[type][4];
		
		var obj = $('#' + type);
		var sum = parseInt(obj.find('.stat-' + side).html()) + number;
		obj.find('.stat-' + side).html(sum);
	}
}

function get_race(side) {
    return $($('#character-' + side).find('.race').get()[0]).val();
}

function reset_all_stats (side) {
    lvl = int($("#lvl > td > input:" + ((side == "l") ? "first" : "last")).val());
    race = get_race(side);
    
	for (var i in params) {
		var obj = $("#" + i);
		if (params[i][1] && i != "lvl") {
			var sum = 0;
			if (races[race].perlvl[i] !== undefined) sum += races[race].perlvl[i] * lvl;
			if (races[race].start[i] !== undefined) sum += races[race].start[i];
		
		    obj.find("input:" + ((side == "l") ? "first" : "last")).val(sum);
		}
	}
}

function calc_all_stats() {
	var racel = get_race('l');
	var racer = get_race('r');
	var slotsl = $('#character-l > .equipment > div > img').get();
	var slotsr = $('#character-r > .equipment > div > img').get();
	
	//calc race+lvl bonuses
	add_raceperlvl_bonuses(int($("#lvl > td > input:first").val()), racel, 'first');
	add_raceperlvl_bonuses(int($("#lvl > td > input:last").val()),  racer, 'last');
	
	for (var i in params) {
		var obj = $('#' + i);
		if (params[i][1]) {
			obj.find('.stat-l').html(int(obj.find('input:first').val()));
			obj.find('.stat-r').html(int(obj.find('input:last').val()));
		} else {
			var null_value = '0';
			if (i == "ldmg" || i == "rdmg") null_value = '0-0';
			
			obj.find('.stat-l').html(races[racel].start[i] ? races[racel].start[i] : null_value);
			obj.find('.stat-r').html(races[racer].start[i] ? races[racer].start[i] : null_value);
		}
	}
	
	// calc items summ stats
	calc_items_stats(slotsl, 'l');
	calc_items_stats(slotsr, 'r');
	
	// calc gems
	calc_gems_stats('l');
	calc_gems_stats('r');
	
	// calc hp
	$("#hp > .stat-l").html(10 + 5 * int($("#vit > .stat-l").html()));
	$("#hp > .stat-r").html(10 + 5 * int($("#vit > .stat-r").html()));
	
	//calc mana
	if (int($("#int > .stat-l").html()) > 0) $("#mp > .stat-l").html(0 + 5 * int($("#int > .stat-l").html()));
	if (int($("#int > .stat-r").html()) > 0) $("#mp > .stat-r").html(0 + 5 * int($("#int > .stat-r").html()));
	
	//calc rate
	$("#rate > .stat-l").html(get_rate(int($("#lvl > .stat-l").html()),'l'));
	$("#rate > .stat-r").html(get_rate(int($("#lvl > .stat-r").html()),'r'));
}

