var DESIGNSECTORID = 0;
var OLDSELECTION = "";
var TONNAGE_COST = 13.5;

function canDesign(sectorId) {
	var rv = false;
	if (getAvailableRU(sectorId) > 0) {
		rv = true;
	}
	return rv;
}

function computeCostAndTonnage(design, hull) {
	var tGuns = hull.tonnageguns;
	var tDP = hull.tonnagedp;
	var tEngines = hull.tonnageengines;
	var tScan = hull.tonnagescan;
	var tRacks = hull.tonnageracks;

	var cGuns = hull.costguns;
	var cDP = hull.costdp;
	var cEngines = hull.costengines;
	var cScan = hull.costscan;
	var cRacks = hull.costracks;

	var addGuns = design.guns - hull.guns;
	var addDP = design.dp - hull.dp;
	var addEngines = design.engines - hull.engines;
	var addScan = design.scan - hull.scan;
	var addRacks = design.racks - hull.racks;

	var missile = isMissileHull(hull);

	var tonnage;
	var cost;
	if (missile) {
		tonnage = design.tonnage;
		cost = Math.exp(addGuns / (TONNAGE_COST * tonnage));
	} else {
		tonnage = hull.tonnage;
		cost = hull.cost;
		if (addGuns > 0) {
			tonnage += Math.exp(addGuns / tGuns);
			cost += Math.exp(addGuns / cGuns);
		}
		if (addDP > 0) {
			tonnage += Math.exp(addDP / tDP);
			cost += Math.exp(addDP / cDP);
		}
		if (addEngines > 0) {
			tonnage += Math.exp(addEngines / tEngines);
			cost += Math.exp(addEngines / cEngines);
		}
		if (addScan > 0) {
			tonnage += Math.exp(addScan / tScan);
			cost += Math.exp(addScan / cScan);
		}
		if (addRacks > 0) {
			tonnage += Math.exp(addRacks / tRacks);
			cost += Math.exp(addRacks / cRacks);
		}
	}
	tonnage = Math.round(tonnage);
	cost = Math.round(cost);
	var values = {
		"tonnage" : tonnage,
		"cost" : cost
	};
	updateOrder(DESIGNSECTORID, ordertypes.design, design.id, values);
}

function createDesignRow(designId, rowId) {
	var num = 0;
	var shipclassId = 0;
	var hullName = "Select hull";
	var name = "";
	var cost = 0;
	var hullId = 0;
	var guns = 0;
	var dp = 0;
	var engines = 0;
	var scan = 0;
	var racks = 0;
	var tonnage = 0;
	var missile = false;

	if (designId > 0) {
		var design = getOrder(DESIGNSECTORID, ordertypes.design, designId);
		hullId = design.hull;
		hull = hulls[hullId];
		hullName = hull.name;
		name = design.name;
		cost = design.cost;
		guns = design.guns;
		dp = design.dp;
		engines = design.engines;
		scan = design.scan;
		racks = design.racks;
		tonnage = design.tonnage;
		missile = isMissileHull(hull);
	}
	var row = "<tr class='design-row' designid='"
			+ designId
			+ "'>"
			+ addCell("", rowId)
			+ addSelectCell("design-hulls", hullId, hullName)
			+ addSelectCell("design-comp-guns", guns, guns)
			+ addSelectCell("design-comp-dp", dp, dp)
			+ addSelectCell("design-comp-engines", engines, engines)
			+ addSelectCell("design-comp-scan", scan, scan)
			+ addSelectCell("design-comp-racks", racks, racks)
			+ (missile ? addSelectCell("design-comp-tonnage", tonnage, tonnage)
					: addCell("design-tonnage", tonnage))
			+ addCell("design-cost", cost)
			+ addTextCell("design-name", 12, 20, name)
			+ addImageCell("design-delete", "cancel.png") + "</tr>";
	return row;
}

function populateDesignOrderRows() {
	var rows = "";
	var designs = getOrders(DESIGNSECTORID, ordertypes.design);
	var rowId = 1;
	for ( var designId in designs) {
		var row = createDesignRow(designId, rowId++);
		rows += row;
	}
	$("#design-table > tbody > tr:first").after(rows);
}

function populateBlankDesignRow() {
	var available = getAvailableRU(DESIGNSECTORID);
	if (available > 0) {
		var row = createDesignRow(0, "");
		$("#design-table > tbody > tr:last").after(row);
		$("#design-table > tbody > tr:last").find(".design-delete").hide();
	}
}

function getTotalDesignCost() {
	var totalCost = 0;
	var designs = getOrders(DESIGNSECTORID, ordertypes.design);
	for ( var id in designs) {
		var design = designs[id];
		totalCost += design.cost;
	}
	return totalCost;
}

function rebuildDesignList() {
	$("#design-table").find("tr:gt(0)").remove();
	populateBlankDesignRow();
	populateDesignOrderRows();
	updateDesignRULabel();
}

function deleteDesign(row) {
	var designId = $(row).attr('designid');
	deleteOrder(DESIGNSECTORID, ordertypes.design, designId);
	$(row).fadeOut('slow', function() {
		rebuildDesignList();
	});
}

function updateDesignRULabel() {
	var available = getAvailableRU(DESIGNSECTORID);
	$('#design-label').text(available);
}

function getBuildableHullList(available) {
	var rv = {};
	for ( var hullId in hulls) {
		var hull = hulls[hullId];
		if (hull.cost <= available) {
			rv[hullId] = hull.name;
		}
	}
	return rv;
}

function getBuildableHulls(designId) {
	var available = getAvailableRU(DESIGNSECTORID);
	if (designId > 0) {
		var design = getOrder(DESIGNSECTORID, ordertypes.design, designId);
		cost = design.cost;
		available += cost;
	}
	var rv = getBuildableHullList(available);
	return rv;
}

function updateHullList(hullList) {
	var row = $(hullList).parents('tr');
	OLDSELECTION = $(hullList).val();
	var designId = $(row).attr('designid');
	var opts = getBuildableHulls(designId);
	$(hullList).empty();
	$(hullList).append(
			$("<option></option>").attr("value", '0').text("Select hull").attr(
					"disabled", true));
	addSelectOptions(hullList, opts);
}

function selectedHull(hullList) {
	var row = $(hullList).parents('tr');
	var designId = $(row).attr('designid');
	var hullId = $(hullList).val();
	if (hullId > 0) {
		var hull = hulls[hullId];
		guns = hull.guns;
		dp = hull.dp;
		engines = hull.engines;
		scan = hull.scan;
		racks = hull.racks;
		tonnage = hull.tonnage;
		cost = hull.cost;
		if (designId > 0) {
			var values = {
				"hull" : hullId,
				"guns" : guns,
				"dp" : dp,
				"engines" : engines,
				"scan" : scan,
				"racks" : racks,
				"cost" : cost,
				"tonnage" : tonnage,
				"name" : name
			};
			updateOrder(DESIGNSECTORID, ordertypes.design, designId, values);
		} else {
			var design = {
				"hull" : hullId,
				"guns" : guns,
				"dp" : dp,
				"engines" : engines,
				"scan" : scan,
				"racks" : racks,
				"tonnage" : tonnage,
				"cost" : cost,
				"name" : name
			};
			designId = addOrder(DESIGNSECTORID, ordertypes.design, design);
		}
		rebuildDesignList();
	} else {
		$(hullList).val(OLDSELECTION);
	}
}

function updateDesignList(list, type) {
	var designId = $(list).parents('tr').attr('designid');
	if (designId > 0) {
		OLDSELECTION = $(list).val();
		var design = getOrder(DESIGNSECTORID, ordertypes.design, designId);
		var val = design[type];
		var hullId = design.hull;
		var hull = hulls[hullId];
		var min = hull[type];
		var max = hull["max" + type];
		var available = getAvailableRU(DESIGNSECTORID);
		var componentCost = hull["cost" + type];
		if (isMissileHull(hull)) {
			available += (design.cost - 1);
			switch (type) {
			case "guns":
				var tonnage = design.tonnage;
				max = Math.log(available) * TONNAGE_COST * tonnage;
				break;
			case "tonnage":
				var guns = design.guns;
				min = Math.ceil(guns / (Math.log(available) * TONNAGE_COST));
				window.status = "g: " + guns + ", min: " + min;
				max = 10;
				break;
			}
		}
		else {
			// add RU spent on this component (over starting value)
			var current = design[type];
			var added = current - min;
			if (added > 0) {
			    available += Math.ceil(Math.exp(added / componentCost));
			}
			var affordableExtra = 0;
			if (available > 0) {
				affordableExtra = Math.floor(Math.log(available) * componentCost);
			}
			if (max == -1) {
				max = min + affordableExtra;
			}
			else {
				max = Math.min(min + affordableExtra, max);
			}
		}
		var opts = {};
		for ( var i = min; i <= max; i++) {
			opts[i] = i;
		}
		$(list).empty();
		addSelectOptions(list, opts);
		$(list).val(OLDSELECTION);
	}
}

function selectedDesignList(list, type) {
	var row = $(list).parents('tr');
	var designId = $(row).attr('designid');
	if (designId > 0) {
		var value = $(list).val();
		if (value != undefined && value != OLDSELECTION) {
			var design = getOrder(DESIGNSECTORID, ordertypes.design, designId);
			design[type] = parseInt(value);
			computeCostAndTonnage(design, hull);
			rebuildDesignList();
		} else {
			$(list).val(OLDSELECTION);
		}
	}
}

function updateDesignName(nameField) {
	var designId = $(nameField).parents('tr').attr('designid');
	if (designId > 0) {
		var name = $(nameField).val();
		updateOrder(DESIGNSECTORID, ordertypes.design, designId, {
			"name" : name
		});
	}
}

function showDesignDialog(sectorId) {
	DESIGNSECTORID = sectorId;
	DESIGNSTOCKPILE = getStockpile(sectorId);
	rebuildDesignList();
	$(".design-delete").live('click', function(event) {
		var row = $(this).parents('tr');
		deleteDesign(row);
		event.preventDefault();
	});

	$(".design-hulls").live('mousedown', function() {
		updateHullList(this);
	});
	$(".design-hulls").live('mouseup', function() {
		selectedHull(this);
		return false;
	});
	$("[class*='design-comp-']").live('mousedown', function() {
		var tokens = $(this).attr('class').split('-');
		var className = tokens[2];
		updateDesignList(this, className);
	});
	$("[class*='design-comp-']").live('mouseup', function() {
		var tokens = $(this).attr('class').split('-');
		var className = tokens[2];
		selectedDesignList(this, className);
		return false;
	});
	$(".design-name").live('change keyup', function() {
		updateDesignName(this);
		return false;
	});

	$('#design-dialog').dialog('option', 'title',
			"Create Designs " + getTitle(sectorId));
	$('#design-dialog').dialog('open');
}
