var NAME = 0;
var HEAT = 1;
var BV = 2;
var LOC = 3;
var CRITS = 4;

var hasCASE = false;
var CASERT = false;
var CASELT = false;

var weaponsArray = new Array();
var defensiveArray = new Array();
var ammoArray = new Array();

function calculateBattleValues(){

	var DBR = getDefensiveBattleValue();
	var OBR = getOffensiveBattleValue();
	document.getElementById('txtDefensiveBV').innerHTML = DBR;
	document.getElementById('txtOffensiveBV').innerHTML = OBR;
	document.getElementById('txtTotalBV').innerHTML = parseInt(DBR)+parseInt(OBR);
	document.frmMech.TotalBV.value = document.getElementById('txtTotalBV').innerHTML;

}
function getSpeedFactor() {

	try{
		var run;
		var jump;
		var speedFactor;
	
		run = Math.round(Number(document.getElementById('Walking').value) * 1.5);
		jump = Math.round(document.getElementById('Jumping').value/2);

		speedFactor = 0;
	
		//Masc
		if ( document.getElementById('AdvanceMP').value == 1 ) 
			run = Number(document.getElementById('Walking').value) * 2;
		else if ( document.getElementById('AdvanceMP').value == 2) //TSM
			run = (Number(document.getElementById('Walking').value) + 1.5) * 1.5;
	
		speedFactor = (1+(run+(jump)-5)/10);
		speedFactor = Math.pow(speedFactor,1.2);
		speedFactor = Number(speedFactor).toFixed(2);
		
		return speedFactor;
	}catch(e){
		alert("battlevalue.getSpeedFactor: "+e);
		return 1.0;
	}
}

function getDefensiveBattleValue(){
	
	var ArmorBV;
	var InternalBV;
	var GyroBV;
	var DefensiveEquipmentBV;
	var DefensiveBV;
	var explosiveBV;
	var defensiveFactor;

	populateArrays();

	ArmorBV = Number(Number(getTotalArmor()).toFixed(2)*2.5*1.0).toFixed(2);
	InternalBV = Number(getTotalInternalStructure()).toFixed(2);
	InternalBV *= 1.5;
	InternalBV *= 1.0;
	InternalBV *= Number(getEngineTypeModifier()).toFixed(2);
	GyroBV = Number(document.getElementById('Tonnage').value).toFixed(2)*Number(getGyroModifier()).toFixed(2);
	DefensiveEquipmentBV = Number(getDefensiveEquipmentBV()).toFixed(2);
	DefensiveBV = Number(ArmorBV)+Number(InternalBV)+Number(GyroBV)+Number(DefensiveEquipmentBV);

	explosiveBV = Number(getExplosiveBV()).toFixed(2);
	
	DefensiveBV -= explosiveBV;

	defensiveFactor = Number(getDefensiveFactor()).toFixed(2);

	DefensiveBV *= defensiveFactor;

document.getElementById('txtDBRArmor').innerHTML = ArmorBV;
document.getElementById('txtDBRInternal').innerHTML = InternalBV;
document.getElementById('txtDBRGyro').innerHTML = GyroBV;
document.getElementById('txtDBREquipment').innerHTML = DefensiveEquipmentBV;
document.getElementById('txtDBRAmmo').innerHTML = explosiveBV;
document.getElementById('txtDBRFactor').innerHTML = defensiveFactor;

	if ( isNaN(DefensiveBV) )
		return 0;

	return Number(DefensiveBV).toFixed(2);	
}

function getTotalArmor(){
	var ArmorTotal;

	ArmorTotal = Number(document.getElementById('ArmorHead').value) + Number(document.getElementById('ArmorCT').value) + Number(document.getElementById('ArmorCTR').value) + Number(document.getElementById('ArmorRT').value) + Number(document.getElementById('ArmorRTR').value) + Number(document.getElementById('ArmorLT').value) + Number(document.getElementById('ArmorLTR').value) + Number(document.getElementById('ArmorRA').value) + Number(document.getElementById('ArmorLA').value) + Number(document.getElementById('ArmorRL').value) + Number(document.getElementById('ArmorLL').value);

	if ( isNaN(ArmorTotal) ){
		return 0;
	}

	return ArmorTotal;
}

function getTotalInternalStructure(){

	var ISC;
	var IST;
	var ISL;
	var ISA;
	var ISH = 3;

	ISC = Number(document.getElementById('txtMaxC').innerHTML);
	IST = Number(document.getElementById('txtMaxLT').innerHTML);
	IST += Number(document.getElementById('txtMaxRT').innerHTML);
	ISA = Number(document.getElementById('txtMaxLA').innerHTML);
	ISA += Number(document.getElementById('txtMaxRA').innerHTML);
	ISL = Number(document.getElementById('txtMaxLL').innerHTML);
	ISL += Number(document.getElementById('txtMaxRL').innerHTML);

	return ((ISC+IST+ISL+ISA)/2)+ISH;
}

function getEngineTypeModifier(){

	var EngineBV;

	switch (document.getElementById('Engine').value) {
		case 1: // Fusion XL
			if ( document.getElementById('Tech').value == 1 )
				EngineBV = 0.5;
			else
				EngineBV = 0.75;
			break;
		case 2: // Fusion XXL
			EngineBV = 0.5;
			break;
		case 3: // Fusion Large
			EngineBV = 1.5;
			break;
		case 4: // Fusion XL Large
			EngineBV = 1.75;
			break;
		case 5: // Fusion XXL Large
			EngineBV = 1.5;
			break;
		case 6: // Light
			EngineBV = .75;
			break;
		case 7: // Compact
			EngineBV = 1.0;
			break;
		case 8: // ICE
			EngineBV = 1.0;
			break;
		default: // Standard
			EngineBV = 1.0;
			break;
	}

	return EngineBV;
}

function getGyroModifier(){
	var GyroBV;

	switch (document.getElementById('Gyro').value) {
	case 1: // Compact
		GyroBV = 0.5;
		break;
	case 2: // Heavy-duty
		GyroBV = 1.0;
		break;
	case 3: // XL
		GyroBV = 0.5;
		break;
	default: // Standard
		GyroBV = 0.5;
		break;
	}

	return GyroBV;
}

function getDefensiveEquipmentBV(){

	try{
		var equipmentBV = 0;

		for (var x = 0; x < ammoArray.length; x++){

			if ( ammoArray[x][NAME] == "Ammo (AMS) 12" ){
//				alert("AMS Ammo Found!");
				equipmentBV += 11;
				continue;
			}
			if ( ammoArray[x][NAME] == "Ammo (AMS) 24"  ){
//				alert("AMS Ammo Found!");
				equipmentBV += 22;
				continue;
			}
		}
	
		for (var x = 0; x < defensiveArray.length; x++){
			equipmentBV += Number(defensiveArray[x][BV]);
		}

		return equipmentBV;
	}
	catch(e){
		alert("battleValue.js: "+e);
		return 0;
	}
}

function getExplosiveBV(){

	var returnBV = 0;

	if ( document.getElementById('Tech').value == 1 )
		returnBV = getISExplosiveBV();
	else
		returnBV = getClanExplosiveBV();

	return returnBV;
}

function getClanExplosiveBV(){
	try{
		var AmmoBV = 0;

		if ( EquipmentCount < 1 )
			return 0;
		
		for (var x = 0; x < ammoArray.length; x++){
			if ((ammoArray[x][LOC] == "H" ||
				ammoArray[x][LOC] == "RL" ||
				ammoArray[x][LOC] == "LL" ||
				ammoArray[x][LOC] == "CT")){
				if ( ammoArray[x][NAME].toLowerCase().indexOf("gauss") != -1 ||
					ammoArray[x][NAME].indexOf("HAG") != -1 )
					continue;
				AmmoBV += 15;
			}
		}
	
		for ( var x = 0; x < weaponsArray.length; x++ ){
		//add weaponsArray Check
			if ( weaponsArray[x][NAME].toLowerCase().indexOf("gauss") != -1 ) {
				AmmoBV += Number(weaponsArray[x][CRITS]);
			} else if ( weaponsArray[x][NAME].indexOf("HAG") != -1 ) {
				AmmoBV += Number(weaponsArray[x][CRITS]);
			}
		}
		return AmmoBV;
	}
	catch(e){
		alert("battleValue.js: "+e);
		return 0;
	}
}

function getISExplosiveBV(){

	if ( !hasCASE )
		return getAllISExplosiveBV();

	var location = '';

	try{
		var AmmoBV = 0;
		for (var x = 0; x < ammoArray.length; x++){

			location = ammoArray[x][LOC];

			if ( CASERT && ( location == 'RT' || location == 'RA' ) )
				continue;

			if ( CASELT && ( location == 'LT' || location == 'LA' ) )
				continue;

			if ( ammoArray[x][NAME].toLowerCase().indexOf("gauss") != -1 ) {
				continue;
			} else if ( ammoArray[x][NAME].indexOf("HAG") != -1 ) {
				continue;
			}
			
				AmmoBV += 15;
		}

		for ( var x = 0; x < weaponsArray.length; x++ ){
			if ( weaponsArray[x][NAME].toLowerCase().indexOf("gauss") != -1 ) {
				AmmoBV += Number(weaponsArray[x][CRITS]);
			} else if ( weaponsArray[x][NAME].indexOf("HAG") != -1 ) {
				AmmoBV += Number(weaponsArray[x][CRITS]);
			}
		}	
		
		return AmmoBV;
	}
	catch(e){
		alert("battleValue.js: "+e);
		return 0;
	}

}

function getAllISExplosiveBV(){
	try{
		var AmmoBV = 0;

		for (var x = 0; x < ammoArray.length; x++){

			if ( ammoArray[x][NAME].toLowerCase().indexOf("gauss") != -1 ) {
				continue;
			} else if ( ammoArray[x][NAME].indexOf("HAG") != -1 ) {
				continue;
			}
			AmmoBV += 15;
		}

		for ( var x = 0; x < weaponsArray.length; x++ ){
			if ( weaponsArray[x][NAME].toLowerCase().indexOf("gauss") != -1 ) {
				AmmoBV += Number(weaponsArray[x][CRITS]);
			} else if ( weaponsArray[x][NAME].indexOf("HAG") != -1 ) {
				AmmoBV += Number(weaponsArray[x][CRITS]);
			}
		}	

		return AmmoBV;
	}
	catch(e){
		alert("battleValue.js: "+e);
		return 0;
	}
}

function getDefensiveFactor(){

	var Factor = 1;
	var run;
	var jump;
	var runModifier;
	var jumpModifier;

	run = Math.round(Number(document.getElementById('Walking').value) * 1.5);
	jump = Number(document.getElementById('Jumping').value);

	if ( document.getElementById('AdvanceMP').value == 1 ) //MASC
		run = Number(document.getElementById('Walking').value) * 2;
	else if ( document.getElementById('AdvanceMP').value == 2) //TSM
		run = (Number(document.getElementById('Walking').value) + 1.5) * 1.5;

	runModifier = getMovementModifier(run);

	if ( jump > 0 )
		jumpModifier =getMovementModifier(jump)+1;	
	else
		jumpModifier = 0;
	
	
	if ( runModifier > jumpModifier )
		Factor += runModifier/10;
	else
		Factor += jumpModifier/10;

	if ( isNaN(Factor) )
		return 1;

	return Factor;
}

function getMovementModifier(move){

	if ( move <= 2 )
		return 0;

	if ( move <= 4 )
		return 1;
	if ( move <= 6 )
		return 2;
	if ( move <= 9 )
		return 3;
	if ( move <= 17 )
		return 4;
	if ( move <= 24 )
		return 5;

	return 6;
}

function getOffensiveBattleValue(){

	var OffensiveBV = 0;
	var HeatEfficiency = 0;
	var MaxWeaponsHeat = 0;
	var equipmentBV = 0
	var weaponsBV = 0;
	var speedFactorBV = 0;
	var tonnageBV = 0;

	//populateArrays();
	HeatEfficiency = Number(getHeatEfficiency()).toFixed(2);
	MaxWeaponsHeat = Number(getMaxWeaponsHeat()).toFixed(2);
//alert("HeatEfficiency: "+HeatEfficiency+" MaxWeaponsHeat: "+MaxWeaponsHeat);
	if ( HeatEfficiency >= MaxWeaponsHeat )
		weaponsBV = Number(getTotalWeaponsBV()).toFixed(2);
	else
		weaponsBV = Number(weaponsWithHeatBV(HeatEfficiency)).toFixed(2);
	
	equipmentBV = Number(getTotalEquipmentBV()).toFixed(2);

	//Add Tonnage. If TSM then tonnage is 1.5x Normal
	if ( document.getElementById('AdvanceMP').value == 2 )
		tonnageBV = Number(Number(document.getElementById('Tonnage').value)*1.5).toFixed(2);
	else
		tonnageBV = Number(document.getElementById('Tonnage').value).toFixed(2);

	OffensiveBV = Number(weaponsBV)+Number(equipmentBV)+Number(tonnageBV);
	speedFactorBV = Number(getSpeedFactor()).toFixed(3);

	OffensiveBV *= speedFactorBV;

document.getElementById('txtOBRheatEff').innerHTML = HeatEfficiency;
document.getElementById('txtOBRMaxHeat').innerHTML = MaxWeaponsHeat;
document.getElementById('txtOBREquipment').innerHTML = equipmentBV;
document.getElementById('txtOBRWeapons').innerHTML = weaponsBV;
document.getElementById('txtOBRTonnage').innerHTML = tonnageBV;
document.getElementById('txtOBRFactor').innerHTML = speedFactorBV;

	return Number(OffensiveBV).toFixed(2);

}

function getHeatEfficiency(){

	try{
		var HeatSinks = Number(document.getElementById('txtTotalHeatSinks').innerHTML)+6;
		var jump = Number(document.getElementById('Jumping').value);

		if (isNaN(HeatSinks))
			return 0;

		if ( document.getElementById('Engine').value == 8 && jump == 0)
			return HeatSinks;
	
		//No Jump Jets so return a HS - 2 for running.
		if ( jump == 0 )
			return HeatSinks -2;
	
		if (document.frmMech.ImproveJJ.checked)
			jump /= 2;
		
		//Jumping always does 3 heat so we have to make sure the heat is at least 3
		jump = Math.max(jump,3);

		return HeatSinks - jump;

	}catch(e){ return 0; }
}

function getMaxWeaponsHeat(){

	var heat = 0;
	var weaponHeat = 0;

	try{
		for (var x = 0; x < weaponsArray.length; x++){

			weaponHeat = Number(weaponsArray[x][HEAT]);

			//alert("weaponHeat: "+weaponHeat);

			if ( weaponsArray[x][NAME].indexOf("ultra") != -1 ) {
				weaponHeat *= 2;
			}else if ( weaponsArray[x][NAME].indexOf("rotary") != -1 ) {
				weaponHeat *= 6;
			}else if ( weaponsArray[x][NAME].indexOf("streak") != -1 ) {
				weaponHeat /= 2;
			}else if ( weaponsArray[x][NAME].indexOf("(os)") != -1 ) {
				weaponHeat /= 4;
			}else if ( weaponsArray[x][NAME].indexOf("one shot") != -1 ) {
				weaponHeat /= 4;
			}else if ( weaponsArray[x][NAME].indexOf("oneshot") != -1 ) {
				weaponHeat /= 4;
			}
			heat += weaponHeat;

		}
	}catch (e){ 
		alert("battlevalue.getMaxWeaponsHeat: "+e);
		return 0; 
	}

	//alert("heat: "+heat);
	if ( isNaN(heat) )
		return 0;

	return heat;
}

function getMaxMovementHeat(){

	try{
		var run = 2;
		var jump = Number(document.getElementById('Jumping').value);
		var heat = 0;	

		if ( document.getElementById('Engine').value == 8 && jump == 0)
			return heat;
	
		//XXL engines
		if ( document.getElementById('Engine').value == 2)
			run = 6;

		//No Jump Jets so return a HS - 2 for running.
		if ( jump == 0 ){

			return run;
		}
	
		if (document.frmMech.ImproveJJ.checked)
			jump = Math.round(jump / 2);
		
		//Jumping always does 3 heat so we have to make sure the heat is at least 3
		//And then check that aginst running heat.
		jump = Math.max(Math.max(jump,3),run);
	
		if ( isNaN(jump) )
			return 0;

		return jump;
	}catch(e){ return 0; }
}

function getTotalWeaponsBV(){

	var totalBV = 0;
	var weaponsBV = 0;
	try{

		for (var x = 0; x < weaponsArray.length; x++){

//alert("Weapon: "+document.getElementById('Item'+x).value);

			weaponsBV = Number(weaponsArray[x][BV]);

			if ( weaponsArray[x][LOC] != null &&
			   isRearLocation(weaponsArray[x][LOC]) &&
			   !hasMoreRearThenFrontWeapons(weaponsArray[x][LOC]) )
				weaponsBV /= 2;

			if ( document.getElementById('Type'+x) == null 
				&& document.getElementById('Type'+x).value < 3 
				&& document.getElementById('Targeting').value == 1)
				weaponsBV *= 1.25;

			//alert("weaponHeat: "+weaponHeat);
	
			totalBV += weaponsBV;

		}
	}catch (e){ 
		alert("battlevalue.getTotalWeaponsBV: "+e);
		return 0; 
	}

	//alert("heat: "+heat);
	if ( isNaN(totalBV) )
		return 0;

	return totalBV;
}

function getTotalEquipmentBV(){

	var totalBV = 0;

	try{
		for (var x = 0; x < defensiveArray.length; x++){

			totalBV += Number(defensiveArray[x][BV]);

			//alert("bv: "+bv);

		}
		for (var x = 0; x < ammoArray.length; x++){

			totalBV += Number(ammoArray[x][BV]);

			//alert("bv: "+bv);

		}
//alert ("LA: "+document.getElementById('LAActuators').value );
		if ( document.getElementById('LAActuators').value == 4 )
			totalBV += getHatchetDamage() * 1.725;
		if ( document.getElementById('RAActuators').value == 4 )
			totalBV += getHatchetDamage() * 1.725;
		if ( document.getElementById('LAActuators').value == 5 )
			totalBV += getSwordDamage() * 1.725;
		if ( document.getElementById('RAActuators').value == 5 )
			totalBV += getSwordDamage() * 1.725;
	}catch (e){ 
		alert("battlevalue.getTotalEquipmentBV: "+e);
		return 0; 
	}


	return totalBV;
}


function getSwordDamage(){
	return Number(document.getElementById('Tonnage').value)/10;
}

function getHatchetDamage(){
	return Number(document.getElementById('Tonnage').value)/5;
}

function isRearLocation(location){

	if ( location == 'HR' ||
	   location == 'RTR' ||
	   location == 'LTR' ||
	   location == 'CTR' ||
	   location == 'LLR' ||
	   location == 'RLR' )
		return true;

	return false;
}

function hasMoreRearThenFrontWeapons(location){

	var fCount = 0;
	var rCount = 0;
	var fLocation;
	var rLocation;

	if ( location == 'H' || location == 'HR' ){
		fLocation = 'H';
		rLocation = 'HR';
	}else if ( location == 'CT' || location == 'CTR'){
		fLocation = 'CT';
		rLocation = 'CTR';
	}else if ( location == 'RT' || location == 'RTR'){
		fLocation = 'RT';
		rLocation = 'RTR';
	}else if ( location == 'LT' || location == 'LTR'){
		fLocation = 'LT';
		rLocation = 'LTR';
	}else if ( location == 'RL' || location == 'RLR'){
		fLocation = 'RL';
		rLocation = 'RLR';
	}else if ( location == 'LL' || location == 'LLR'){
		fLocation = 'LL';
		rLocation = 'LLR';
	}else
		return false;

	try{
		for (var x = 0; x < weaponsArray.length; x++){

			if ( weaponsArray[x][LOC] == fLocation )
				fCount += Number(document.getElementById('BV'+x).value);

			if ( weaponsArray[x][LOC] == rLocation )
				rCount += Number(document.getElementById('BV'+x).value);

		}
	}catch (e){ 
		alert("battlevalue.hasMoreRearThenFrontWeapons: "+e);
		return false; 
	}
	
	return rCount > fCount;
	
}


// sort functions
function arrayCompare(e1,e2) {

	//alert("e1: "+e1[0]+" e2: "+e2[0]);
	if ( Number(e1[BV]) == Number(e2[BV]) ){
		if ( Number(e1[HEAT]) < Number(e2[HEAT]) )
			return -1;
		if ( Number(e1[HEAT]) == Number(e2[HEAT]) ){
			if ( isRearLocation(e1[LOC]) && isRearLocation(e2[LOC]) )
				return 0;
			if ( isRearLocation(e1[LOC]) && isRearLocation(e2[LOC]) )
				return -1;
			return 1;
		}
		return  1;
	}

	if ( Number(e1[BV]) < Number(e2[BV]) )
		return 1;

	return -1;

}

function weaponsWithHeatBV(maxHeat) {
	try{
		var arrayToSort;
		var array;
		var totalBV = 0;
	
		var currentHeat = 0;
		var bv = 0;

		do{
			var tempArray = weaponsArray.shift();
			currentHeat += Number(tempArray[HEAT]);
			
			if ( isRearLocation(tempArray[LOC]) &&  !hasMoreRearThenFrontWeapons(tempArray[LOC]) )
				totalBV += Number(tempArray[BV])/2;
			else
				totalBV += Number(tempArray[BV]);

		//alert("BV before heat: "+bv+"+"+tempArray[0]+" heat: "+currentHeat);
		}while ( Number(currentHeat) < Number(maxHeat) )

		while ( weaponsArray.length > 0){

			var tempArray = weaponsArray.shift();
			if ( isRearLocation(tempArray[LOC]) &&  !hasMoreRearThenFrontWeapons(tempArray[LOC]) )
				totalBV += Number(tempArray[BV])/4;
			else if ( tempArray[HEAT] == 0 )
				totalBV += Number(tempArray[BV]);
			else
				totalBV += Number(tempArray[BV])/2;
		//alert("BV after heat: "+bv+"+"+tempArray[0]);
		}
		//alert("BV2: "+arrayToSort);
		
		if ( isNaN(totalBV) )
			return 0;

		return totalBV;
	}catch(e){
		alert("battlevalue.arraySort: "+e);
		return 0;
	}
}

function populateArrays(){
	try{

		weaponsArray = new Array();
		defensiveArray = new Array();
		ammoArray = new Array();

		var EquipmentCount = document.getElementById('NumEquipment').value;
		for (x=0;x<EquipmentCount;x++) {	
		

			var tempArray = new Array();
			tempArray[NAME] = document.getElementById('Item'+x).value;
			tempArray[HEAT] = document.getElementById('Heat'+x).value;
			tempArray[BV] = document.getElementById('BV'+x).value;
			tempArray[LOC] = document.getElementById('Location'+x).value;
			tempArray[CRITS] = document.getElementById('ItemCrits'+x).value;

			if ( document.getElementById('Location'+x).value && 
				(document.getElementById('Location'+x).value == 'RT' ||
				document.getElementById('Location'+x).value == 'RA')&& 		
			  	document.getElementById('Item'+x).value.substring(0,4) == "CASE" ) {
				hasCASE = true;
				CASERT = true;
			}
			if ( document.getElementById('Location'+x).value && 
				(document.getElementById('Location'+x).value == 'LT' ||
				document.getElementById('Location'+x).value == 'LA')&& 		
			  	document.getElementById('Item'+x).value.substring(0,4) == "CASE" ) {
				hasCASE = true;
				CASELT = true;
			}

			//Only Offensive weapons get counted
			if ( document.getElementById('Def'+x) != null ){
				defensiveArray.push(tempArray);
			}else if ( document.getElementById('Item'+x).value.substring(0,4) == "Ammo" ){
				ammoArray.push(tempArray);
			}else {
				weaponsArray.push(tempArray);
			}
		}

		weaponsArray.sort(arrayCompare);
		
	}catch (e){
		alert("battleValue.populateArrays: "+e);
	}
}