function getCurrentStatId(){
	var el_stat = document.getElementById('stat_id')
	return (el_stat) ? parseInt(el_stat.options[el_stat.selectedIndex].value) : 0
}

function getCurrentDesignId(){
	var el_design = document.getElementById('design_id')
	return (el_design) ? parseInt(el_design.options[el_design.selectedIndex].value) : 0
}

function changeLocation(href, full){
	var stat_id = getCurrentStatId()
	var stat_str = ''
	var design_id = ( full ) ? getCurrentDesignId() : 0
	var design_str = ''
	if(stat_id){
		var stat_str = '?stat_id=' + stat_id
		if(design_id){
			var design_str = '&design_id=' + design_id
		}
	}
	document.location.href = href + stat_str + design_str
}

function ui(health, armor, speed, influence, slots, max_weight, weight, space, unit_type, view_type, view_range){
	u = new Array()
	u['health'] = health
	u['armor'] = armor
	u['speed'] = speed
	u['influence'] = influence
	u['slots'] = slots
	u['max_weight'] = max_weight
	u['weight'] = weight
	u['space'] = space
	u['unit_type'] = unit_type
	u['view_type'] = view_type
	u['view_range'] = view_range
	return u
}

function ei(arr){
	var e = new Array()
	var idx = new Array()
	for( var i = 0; i < arr.length; i++ ){
		idx[arr[i]] = i
	}
	e['info'] = arr
	e['index'] = idx
	e['checked'] = 0
	e['rows'] = new Array()
	return e
}

function checkRange(value, min, max){
	if(isNaN(value) || value < min){
		return min
	} else {
		if(value > max) {
			return max
		} else {
			return value
		}
	}
}

function getValue(id){
	var el = document.getElementById(id)
	if(el){
		switch(el.tagName){
			case 'INPUT':
				return parseInt(el.value)
				break
			case 'SELECT':
				return parseInt(el.options[el.selectedIndex].value)
				break
			default:
				return parseInt(el.firstChild.nodeValue)
		}
	}
}

function setInfo(id, value, min, max){
	var el = document.getElementById(id)
	if(el){
		el.removeChild(el.firstChild)
		if( min != undefined || max != undefined ){
			if( (min != undefined && value < min) || (max != undefined && value > max) ){
				applyCssClass(el, 'warning')
			} else {
				removeCssClass(el, 'warning')
			}
		}
		el.appendChild(document.createTextNode(value))
	}
}

function fillCell(cell, value){
	cell.removeChild(cell.firstChild)
	cell.appendChild(document.createTextNode( value ))
}

function checkField(id, min, max){
	var el = document.getElementById(id)
	if(el){
		var value = checkRange(el.value, min, max)
		if( el.value != value ){
			el.value = value
		}
		return parseInt(value)
	} else {
		return 0
	}
}

function checkDivisionFields(){
	attr_total = 40 + checkField('points',0,1000)
	for( var i = 1; i <= 4; i++ ){
		division[i] = checkField('division_'+i,1,99)
		var a = ( parseInt(division[i]) > 50 ) ? 50 : parseInt(division[i])
		attr_total = attr_total + a - 1
	}
	setInfo('attr_total', attr_total)
}

function highlight(checked_name, range_name){
	var checked_el = document.getElementById(checked_name)
	if(checked_el){
		if(getValue(checked_name) > getValue(range_name)){
			checked_el.className = 'warning'
		} else {
			checked_el.className = ''
		}
	}
}

function calcUnitsCount() {
	return 6 + Math.floor(stat['tactics'] / 20)
}

function calcUnitTL() {
	var tl = ( is_organic ) ? Math.floor( ( stat['edu'] + stat['ma'] ) / 2 ) : Math.floor( stat['edu'] / 2 )
	return tl + checkField('level', 1, 60)
}

function getPureDamage(dmg, cd, armor, units, time ){
	if( dmg && cd ) {
    	var value = ( dmg - armor > 0 ) ? dmg - armor : 1
    	return round(value * units * round(time / cd))
    } else {
    	return '--'
    }
}

function checkStatFields(){
	stat['tactics'] = checkField('tactics', 5, 120)
	stat['clout'] = checkField('clout',5,120)
	stat['edu'] = checkField('edu',5,120)
	stat['ma'] = checkField('ma',5,120)
	setInfo('units_in_set',calcUnitsCount())
	var total_units_in_stock = 48 + getValue('reinc') * 2
	var units_count = calcUnitsCount()
	setInfo('sets_count',Math.floor(total_units_in_stock / units_count) + '/' + total_units_in_stock % units_count)
	setInfo('division_influence',Math.floor(stat['clout'] / 2) + checkField('division_' + unit_division, 1, 99))
	setInfo('unit_max_influence',Math.floor(stat['clout'] / 2) + checkField('level', 1, 60))
	setInfo('max_tech_level', calcUnitTL())
	setInfo('attr_available', attr_total - (stat['tactics'] + stat['clout'] + stat['edu'] + stat['ma']), 0)
}

function calcHp(base_health, unit_level, honor, tactics, equip_health, is_have_bio){
	var bio_health = (is_have_bio == 1) ? 300 : 0
	return round(base_health + (unit_level*10 + tactics*5 + equip_health + bio_health) * (1 + honor/10000))
}

function calcUnitWeight(base_weight, ma) {
	return Math.floor(base_weight * (1 + ma/120))
}

function changeChassis(){
	var el_chassis = document.getElementById('chassis')
	var uid_list = el_chassis.options[el_chassis.selectedIndex].value
	var uid_mk_el = document.getElementById('uid_mk')
	var mk_prev = uid_mk_el.selectedIndex
	uid_mk_el.selectedIndex = -1
	for(var m = uid_mk_el.options.length-1; m >= 0; m-- ){
		uid_mk_el.options[m] = null
	}
	var uid_arr = uid_list.split(',')
	var cnt = 0
	var num = 0
	for( var m = 0; m < uid_arr.length; m++ ){
		cnt = cnt + chassis_mk[uid_arr[m]].length - 1
	}
	uid_mk_el.options.length = cnt
	for( var m = 0; m < uid_arr.length; m++ ){
		for( var n = 1; n < chassis_mk[uid_arr[m]].length; n++ ){
			uid_mk_el.options[num].value = uid_arr[m] + ',' + chassis_mk[uid_arr[m]][n]
			if(uid_arr.length > 1){
				uid_mk_el.options[num].text = chassis_mk[uid_arr[m]][0] + '-' + mk[chassis_mk[uid_arr[m]][n]-1]
			} else {
				uid_mk_el.options[num].text = mk[chassis_mk[uid_arr[m]][n]-1]
			}
			num++
		}
	}
	uid_mk_el.selectedIndex = (mk_prev < uid_mk_el.options.length) ? mk_prev : uid_mk_el.options.length - 1
}

function updateAll(){
	zz = 0
	
	checkDivisionFields()
	checkStatFields()

	uid_mk_el = document.getElementById('uid_mk')
	if(uid_mk_el && uid_mk_el.selectedIndex >= 0){
		var mkid = uid_mk_el.options[uid_mk_el.selectedIndex].value
	} else {
		var mkid = 0
	}
	honor = checkField('honor',0,2000)
	
	clearUnusableMarkers()

//alert('=' + calcFieldString('name') + '=' + equip[2]['index']['complexity'])

	if(!skip_equip){
		// var is_have_bio = (calcFieldString('name').indexOf('Biostimulator') >= 0) ? 1 : 0
		var is_have_bio = 0
		var unit_space = 0
		var unit_weight = 0
		
		if(mkid){
			unit_space = unit[mkid]['space']
			setInfo('unit_space', unit_space)

			unit_weight = calcUnitWeight(unit[mkid]['max_weight'], stat['ma'])
			setInfo('unit_weight', unit_weight)

			setInfo('armor', unit[mkid]['armor'] + calcFieldInt('armor') + is_have_bio * 3)
			setInfo('speed', unit[mkid]['speed'])
			setInfo('unit_type', unit[mkid]['unit_type'])
			setInfo('view_type', unit[mkid]['view_type'])
			setInfo('view_range', unit[mkid]['view_range'] + calcFieldInt('view_range') + calcFieldFloat('view_range_addon') + is_have_bio * 0.5)
			setInfo('unit_influence', unit[mkid]['influence'], 0, getValue('unit_max_influence'))
			
			setInfo('health',calcHp(unit[mkid]['health'], checkField('level', 1, 60), honor, stat['tactics'], calcFieldInt('health'), 0))
		}

		var space = calcFieldInt('space')
		setInfo('used_space', space)
		setUnusableMarkers('space', space, unit_space)
		
		var weight = calcFieldInt('weight')
		setInfo('used_weight', weight)
		setUnusableMarkers('weight', weight, unit_weight)

    	var complexity = calcFieldInt('complexity')
		setInfo('complexity', complexity)
    	var max_complexity = calcFieldInt('max_complexity')
		setInfo('max_complexity', max_complexity)
		setUnusableMarkers('complexity', complexity, max_complexity)
		setUnusableMarkers('max_complexity', 0, complexity, tMin)
		
		var max_equip_level = calcFieldMax('tech_level')
		setInfo('max_equip_level', max_equip_level)
		setUnusableMarkers('tech_level', 0, calcUnitTL(), tMax)

		var weapon_type = 'None'
		var weapon_damage = 0
		var weapon_cooldown = 0
		var weapon_range = 0
    	
		ground_cooldown = calcFieldFloat('ground_cooldown')
		air_cooldown = calcFieldFloat('air_cooldown')

		if(ground_cooldown){
			weapon_range = calcFieldFloat('ground_range')
			weapon_damage = calcFieldInt('ground_damage')
			weapon_cooldown = ground_cooldown
			if(air_cooldown){
				weapon_type = 'Versable'
			} else {
				weapon_type = 'Ground'
			}
		} else {
			if(air_cooldown){
				weapon_range = calcFieldFloat('air_range')
				weapon_type = 'Air'
				weapon_damage = calcFieldInt('air_damage')
				weapon_cooldown = air_cooldown
			}
		}
		weapon_damage = weapon_damage + calcFieldFloat('damage_addon')
		weapon_range = round(weapon_range + calcFieldFloat('range_addon') + is_have_bio * 0.5, 10) 
		weapon_cooldown = round(weapon_cooldown + calcFieldFloat('cooldown_addon') + is_have_bio * 0.1, 10)
		setInfo('weapon_type', weapon_type)
		setInfo('weapon_range', weapon_range)
		setInfo('weapon_cooldown', weapon_cooldown)
		setInfo('weapon_damage', weapon_damage)
		
		var units_in_set = calcUnitsCount()
		setInfo('weapon_damage_set',weapon_damage * units_in_set)
		
		if(weapon_cooldown){
			var weapon_damage_eff = round(weapon_damage / weapon_cooldown, 10)
			var weapon_damage_eff_set = round(weapon_damage * units_in_set / weapon_cooldown)
		} else {
			var weapon_damage_eff = 0
			var weapon_damage_eff_set = 0
		}
		setInfo('weapon_damage_eff', weapon_damage_eff)
		setInfo('weapon_damage_eff_set', weapon_damage_eff_set)
    	
    	var ar_dmg = getFirstChild(document.getElementById('weapon_damage_eff_arm'), 'TABLE')
    	if(ar_dmg){
    		for( var i = 2; i < ar_dmg.rows.length; i++ ){
   				var row = ar_dmg.rows[i]
   				var armor = row.cells[0].firstChild.nodeValue
    			fillCell(row.cells[1], getPureDamage(weapon_damage, weapon_cooldown, armor, units_in_set, 45))
    			fillCell(row.cells[2], getPureDamage(weapon_damage, weapon_cooldown, armor, units_in_set, 60))
    			fillCell(row.cells[3], getPureDamage(weapon_damage, weapon_cooldown, armor, units_in_set, 75))
    		}
    	}
    	
		setInfo('energy', calcFieldInt('max_energy'))
		setInfo('energy_drain', calcFieldInt('energy_drain'))
		setInfo('energy_recharge', calcFieldInt('energy_recharge'))
		setInfo('energy_use', calcFieldFloat('energy_use'))
		setInfo('energy_use_eff', calcEffEnergyUsage(weapon_cooldown))
    	
		var special = calcFieldString('special')
		var xp_bonus = calcFieldInt('xp_bonus')
		if( xp_bonus != 0 ){
			var xp_bonus_string = 'XP bonus (' + xp_bonus + ')'
		} else {
			xp_bonus_string = ''
		}
		if( special == '' ){
			if( xp_bonus_string != '' ){
				special = xp_bonus_string
			} else {
				special = 'None'
			}
		} else {
			if( xp_bonus_string != '' ){
				special += ', ' + xp_bonus_string
			}
		}
		setInfo('special',special)

		highlight('unit_influence', 'unit_max_influence')
		highlight('max_equip_level', 'max_tech_level')
    	
		highlight('complexity', 'max_complexity')
		highlight('used_space', 'unit_space')
		highlight('used_weight', 'unit_weight')
	}
}

function calcFieldInt(equip_type){
	var value = 0
	for( var i = 0; i < equip.length; i++ ){
		if( equip[i]['index'][equip_type] != undefined ){
			value += getCellValue(getCheckedTr(i), equip[i]['index'][equip_type])
		}
	}
	return value
}

function calcFieldFloat(equip_type){
	var value = 0
	for( var i = 0; i < equip.length; i++ ){
		if( equip[i]['index'][equip_type] != undefined ){
			value += getCellValue(getCheckedTr(i), equip[i]['index'][equip_type])
		}
	}
	return value
}

function calcFieldMax(equip_type){
	var value = 0
	for( var i = 0; i < equip.length; i++ ){
		if( equip[i]['index'][equip_type] != undefined ){
			var lv = getCellValue(getCheckedTr(i), equip[i]['index'][equip_type])
			if( lv > value ){
				value = lv
			}
		}
	}
	return value
}

function calcFieldString(equip_type){
	var value = ''
	for( var i = 0; i < equip.length; i++ ){
		if( equip[i]['index'][equip_type] != undefined ){
			var lv = getCellValue(getCheckedTr(i), equip[i]['index'][equip_type])
			if( lv != '' && lv != null ){
				var eff = ''
				if( equip_type == 'special' && equip[i]['index']['effectiveness'] != undefined ){
					eff = getCellValue(getCheckedTr(i), equip[i]['index']['effectiveness'])
				}
				if ( value != '' ){ value += ', ' }
				value += lv
				if( eff != '' ){
					value += ' (' + eff + ')'
				}
			}
		}
	}
	return value
}


function calcEffEnergyUsage(cooldown){
	var value = 0
	var equip_type_name = 'energy_use'
	for( var i = 0; i < equip.length; i++ ){
		var cd = 1
		if( equip[i]['index']['ground_cooldown'] != undefined || equip[i]['index']['air_cooldown'] != undefined ){
			var cd = cooldown
		}
		if( !cd ){
			var cd = 1
		}
		if( equip[i]['index'][equip_type_name] != undefined ){
			value += getCellValue(getCheckedTr(i), equip[i]['index'][equip_type_name]) / cd
		}
	}
	return round(value)
}


function getIntValue(value){
	var v = parseInt(value)
	return isNaN(v) ? 0 : v
}

function getFloatValue(value){
	var v = parseFloat(value)
	return isNaN(v) ? 0 : v
}

function getCellValue(tr, column_number){
	return tr[column_number+1]
}

function initEquip(){
	var arrInput = document.getElementsByTagName('INPUT')

	for ( var i=0; i<arrInput.length; i++ ) {
		if( arrInput[i].getAttribute('type') == 'text' ){
			arrInput[i].onblur = updateAll
		}
	}

	for( var i = 0; i < equip.length; i++ ){
//		var tr = getFirstChild(document.getElementById('tbody_' + i), 'TR')
		var rows = document.getElementById('tbody_' + i).rows
		var j = 0
		for ( var z = 0; z < rows.length; z++ ){
//		while ( tr ){
			var tr = rows[z]
			if( tr.nodeName == 'TR' && tr.className != 'thead' ){
				equip[i]['rows'][j] = new Array()

				tr.onclick = selectRow
				tr.onmouseout = function() {hi(this, false)}
				tr.onmouseover = function() {hi(this, true)}
				if(tr.className == 'checked'){
					equip[i]['checked'] = j
				}

				equip[i]['rows'][j][0] = tr
				var k = 0
				var td = getFirstChild(tr, 'TD')
				while ( td ){
					if( td.nodeName == 'TD' ){
						td.className = equip[i]['info'][k]
						switch(equip[i]['info'][k]){
							case 'name':
							case 'special':
								equip[i]['rows'][j][k+1] = td.firstChild.nodeValue
								break
							case 'view_range':
							case 'energy_use':
							case 'ground_cooldown':
							case 'air_cooldown':
							case 'ground_range':
							case 'air_range':
							case 'view_range_addon':
							case 'cooldown_addon':
							case 'damage_addon':
							case 'range_addon':
								equip[i]['rows'][j][k+1] =  getFloatValue(td.firstChild.nodeValue)
								break
							default:
								equip[i]['rows'][j][k+1] =  getIntValue(td.firstChild.nodeValue)
						}
						k++
					}
					td = td.nextSibling
				}
				j++
			}
//			tr = tr.nextSibling
		}
	}
//	alert(getCellValue(equip[0]['rows'][1], equip[0]['index']['name']))
}

function clearUnusableMarkers(){
	for( var i = 0; i < equip.length; i++ ){
		for( var j = 0; j < equip[i]['rows'].length; j++ ){
			if( equip[i]['rows'][j][0].className != '' ){
				equip[i]['rows'][j][0].className = ''
			}
		}
		getCheckedTr(i)[0].className = 'checked'
	}
}


function getCheckedTr(equip_type){
	return equip[equip_type]['rows'][equip[equip_type]['checked']]
}


function setUnusableMarkers(equip_type, current_value, edge_value, calc_type){
	for( var i = 0; i < equip.length; i++ ){
		if( equip[i]['index'][equip_type] != undefined ){
			if( calc_type == tMin || calc_type == tMax ){
				var cur = 0
			} else {
				var cur = current_value - getCellValue(getCheckedTr(i), equip[i]['index'][equip_type])
			}
			for( var k = 0; k < equip[i]['rows'].length; k++ ){
				var v = cur + getCellValue(equip[i]['rows'][k], equip[i]['index'][equip_type])
				if( (calc_type == tMin && v < edge_value) || (calc_type != tMin && v > edge_value) ){
					applyCssClass(equip[i]['rows'][k][0], equip_type)
				}
			}
		}
	}
}

function showTime(firsttime, lasttime, title){
	var time = lasttime - firsttime
	alert(title + ':' + time)
}

function round(value, precition){
	return (precition) ? Math.round(value * precition) / precition : Math.round(value)
}

function hi(el, mode) {
	el.style.backgroundColor = mode ? '#EEEEEE' : ''
}
/*
	if (mode){
		rollowerOriginClass = el.className
		el.className = 'rollover'
	} else {
		el.className = rollowerOriginClass
		rollowerOriginClass = ''
	}
*/

function getFirstChild(e, name){
	while ( e && e.nodeName != name ){
		e = ( e.firstChild.nodeType == 1 ) ? e.firstChild : e.firstChild.nextSibling
	}
	return e
}

function getElementId(e){
	var parts = e.id.split('_')
	return parts[1]
}

function getEquipTypeId(tr){
	return getElementId(tr.parentNode.parentNode)
}

function selectRow(e){
	var equipTypeId = getEquipTypeId(this)
	
	if( equip[equipTypeId]['checked'] ){
		getCheckedTr(equipTypeId).className = ''
	}
	
/*
	var el = this
	var n = 0
	while (el){
		if( el.nodeName == 'TR' && el.className != 'thead'){
			n++
		}
		el = el.previousSibling
	}
	equip[equipTypeId]['checked'] = n - 1
*/

	for ( var i = 0; i < equip[equipTypeId]['rows'].length; i++ ){
		if( this == equip[equipTypeId]['rows'][i][0] ){
			equip[equipTypeId]['checked'] = i
		}
	}

	document.getElementById('hidden_' + equipTypeId).value = getElementId(this)
	
	updateAll()
}


function bindElements(aElementId, cElementId) {
	var aElement = document.getElementById(aElementId)
	var cElement = document.getElementById(cElementId)

	if(aElement && cElement){
		aElement.setAttribute('content-id', cElementId)
		if( aElement.attachEvent ){
			aElement.attachEvent( 'onclick', toggleContent )
		} else {
			aElement.addEventListener( 'click', toggleContent, false )
		}
		
		aElement.src = (cElement.className == 'on') ? '/i/e.gif' : '/i/c.gif'
	}
}

function toggleContent(e){
	var src = ( document.all ) ? event.srcElement : this
	var el = document.getElementById(src.getAttribute('content-id'))
	if(el.className == 'on'){
		el.className = 'off'
		src.src = '/i/c.gif'
	} else {
		el.className = 'on'
		src.src = '/i/e.gif'
	}
}





/*****************************
**   Common class methods
******************************/
function applyCssClass(oElement, sClassName)
{
	oElement.className = oElement.className + ' ' + sClassName
}

function removeCssClass(oElement, sClassName)
{
	var oRegExp = new RegExp(sClassName, 'g')
	oElement.className = oElement.className.replace(oRegExp, '')
}


function switchCssClass( objNode, strCurrClass, strNewClass ) {
	if ( matchCssClass( objNode, strNewClass ) ) replaceCssClass( objNode, strCurrClass, strNewClass );
		else replaceCssClass( objNode, strNewClass, strCurrClass );
}

function removeCssClassNew( objNode, strCurrClass ) {
	replaceCssClass( objNode, '', strCurrClass );
}

function applyCssClassNew( objNode, strNewClass ) {
	replaceCssClass( objNode, strNewClass, '' );
}

function replaceCssClass( objNode, strNewClass, strCurrClass ) {
	var strOldClass = strNewClass;
	if ( strCurrClass && strCurrClass.length ){
		strCurrClass = strCurrClass.replace( /\s+(\S)/g, '|$1' );
		if ( strOldClass.length ) strOldClass += '|';
		strOldClass += strCurrClass;
	}
	objNode.className = objNode.className.replace( new RegExp('(^|\\s+)(' + strOldClass + ')($|\\s+)', 'g'), '$1' );
	objNode.className += ( (objNode.className.length)? ' ' : '' ) + strNewClass;
}

function matchCssClass( objNode, strCurrClass ) {
	return ( objNode.className.length && objNode.className.match( new RegExp('(^|\\s+)(' + strCurrClass + ')($|\\s+)') ) );
}


