var upg = new Array(21);
var coeff = new Array(21);
for (i=0; i<=20; i++) upg[i] = Math.pow(1.007, i) - 1;
for (i=0; i<=20; i++) coeff[i] = Math.pow(i, 0.8);
var b = [100, 100, 200, 160];
var k = [6, 4, 8, 6];
var CC = 450;

function rebuildUpgs(_unit_stats) {
	var result = Array(21);
	result[0] = Array(4);
	result[1] = Array(4);
	for(r=0; r<4; r++) {
		result[0][r] = k[r] * _unit_stats.cost[r] + b[r];
		result[1][r] = (_unit_stats.cost[r] * 7 + b[r]) / _unit_stats.cu;
	}
	for(l=20; l>0; l--) {
		if(!result[l]) result[l] = Array(4);
		for(r=0; r<4; r++) {
			result[l][r] = Round5(result[1][r] * coeff[l]);
		}
	}
	return result;
}

function rebuildUpgTime(_unit_stats, _smith_lvl, _spd) {
	var result = Array(21);
	result[0] = timeS2R(_unit_stats.rs_time) / _spd;
	result[1] = result[0] * Math.pow(0.964, _smith_lvl-1);
	for(l=2; l<=20; l++) {
		result[l] = result[1] * coeff[l];
	}
	return result;
}

function rebuildStats(_stats, u_lvl, is_nature) {
	var war_stats = ['off', 'def_i', 'def_c'];
	var result = Array(10);
	for (u = 0; u < 10; u++) {
		result[u] = Array(3);
		for (j = 0; j < 3; j++) {
			var idx = war_stats[j];
			v = _stats[u][idx];
			if ((u < 8) && !is_nature)
				v += (_stats[u][idx] + 300*_stats[u].cu/7) * upg[u_lvl];
			result[u][j] = Math.round(v*10)/10;
		}
	}
	return result;
}

function std_upg(stat, cu, lvl) {
	return stat + (stat + 300*cu/7) * upg[lvl];
}

function calc_upg(_unit_stats, type, lvl) {
	switch (type) {
		case 'off':		return std_upg(_unit_stats.off,   _unit_stats.cu, lvl); break;
		case 'def_i':	return std_upg(_unit_stats.def_i, _unit_stats.cu, lvl); break;
		case 'def_c':	return std_upg(_unit_stats.def_c, _unit_stats.cu, lvl); break;
		case 'scan':	return std_upg(35, _unit_stats.cu, lvl); break;
		case 'def_s':	return std_upg(20, _unit_stats.cu, lvl); break;
		case 'dmlsh':	return Math.round(200 * Math.pow(1.0205, lvl)) / 10; break;
	default:
		return 0;
	}
}

function cost_upg(_unit_stats, lvl) {
	var result = Array(4);
	for(var r=0; r<4; r++) {
		result[r] = Round5(
			coeff[lvl] * (_unit_stats.cost[r] * 7 + b[r])
			/	_unit_stats.cu
		);
	}
	return result;
}

function calc_at(_unit_stats, type, lvl) {
	return sum(cost_upg(_unit_stats, lvl+1)) * calc_upg(_unit_stats, type, lvl) /
	((sum(_unit_stats.cost) + CC*_unit_stats.cu) * (calc_upg(_unit_stats, type, lvl+1) - calc_upg(_unit_stats, type, lvl)));
}

function rebuildUnitStats(_unit_stats) {
	var result = Array(21);
	var j;
	for (lvl = 0; lvl <= 20; lvl++) {
		result[lvl] = [];
		if (_unit_stats.mask & 0x01) result[lvl].push(calc_upg(_unit_stats, 'off', lvl));
		if (_unit_stats.mask & 0x02) result[lvl].push(calc_upg(_unit_stats, 'def_i', lvl));
		if (_unit_stats.mask & 0x04) result[lvl].push(calc_upg(_unit_stats, 'def_c', lvl));
		if (_unit_stats.mask & 0x10) result[lvl].push(calc_upg(_unit_stats, 'scan', lvl));
		if (_unit_stats.mask & 0x20) result[lvl].push(calc_upg(_unit_stats, 'def_s', lvl));
		if (_unit_stats.mask & 0x40) result[lvl].push(calc_upg(_unit_stats, 'dmlsh', lvl));
	}
	return result;
}

function rebuildUnitAt(_unit_stats) {
	var result = Array(20);
	var j;
	for (lvl = 0; lvl < 20; lvl++) {
		result[lvl] = [];
		if (_unit_stats.mask & 0x01) result[lvl].push(calc_at(_unit_stats, 'off', lvl));
		if (_unit_stats.mask & 0x02) result[lvl].push(calc_at(_unit_stats, 'def_i', lvl));
		if (_unit_stats.mask & 0x04) result[lvl].push(calc_at(_unit_stats, 'def_c', lvl));
		if (_unit_stats.mask & 0x10) result[lvl].push(calc_at(_unit_stats, 'scan', lvl));
		if (_unit_stats.mask & 0x20) result[lvl].push(calc_at(_unit_stats, 'def_s', lvl));
		if (_unit_stats.mask & 0x40) result[lvl].push(calc_at(_unit_stats, 'dmlsh', lvl));
	}
	return result;
}

function rebuildTime(_stats, speed, lvl) {
	result = Array(10);
	for (i = 0; i < 10; i++) {
		time = speed * timeS2R(_stats[i].time) * Math.pow(0.9, lvl-1);
		result[i] = "<span title='" + Math.round(1/time) + "/"+day_name+"'>" + timeR2S(time) + "</span>";
	}
	return result;
}

function calcUnits(unit_cost, res) {
	var sum = 0;
	var tc = 0;
	var r;
	for (r = 0; r < 4; r++) {
		tc += unit_cost[r];
		sum += res[r]; 
	}
	var result = {
		nr: sum / tc,
		res: [0,0,0,0]
	}
	var accum = 0;
	for (r = 0; r < 4; r++) {
		accum += unit_cost[r] * result.nr;
		result.res[r] = Math.round(accum);
	}
	r = 3; while (r > 0) { result.res[r] -= result.res[--r]; }
	return result;
}