var REPAIRSECTORID = 0;
var OLDSELECTION = "";
var DPS_REPAIRED_PER_RU = 2;
var ORBITAL_DPS_REPAIRED_PER_RU = 3;

function canRepair(sectorId) {
	var rv = false;
	var stockpile = getStockpile(sectorId);
	if (stockpile > 0) {
		var world = getWorld(sectorId);
		if (world != undefined) {
			if (!world.interdicted) {
				rv = true;
			}
		}
	}
	return rv;
}

function hasExistingRepairOrder(shipId) {
	var rv = false;
	var repairs = getOrders(REPAIRSECTORID, ordertypes.repair);
	for (var repairId in repairs) {
		var repair = repairs[repairId];
		var repairShipId = repair.ship;
		if (repairShipId == shipId) {
			rv = true;
			break;
		}
	}
	return rv;
}

function getRepairables(sectorId) {
	var repairables = {};
	var oblique = undefined;
	var y = undefined;
	if (sectorId != undefined) {
		var sector = sectors[sectorId];
		oblique = sector.oblique;
		y = sector.y;
	}

	for (var shipId in ships) {
		if (!isMissile(shipId)) {
			if (!isDevice(shipId)) {
				var ship = ships[shipId];
				var shipclass = getShipclass(shipId);
				var ar = shipclass.ar;
				var dpremaining = ship.dpremaining;
				var dp = shipclass.dp;
				if (dpremaining + ar < dp) {
					var ownerId = ship.empire;
					if (ownerId == empire.id || isAllied(ownerId)) {
						if (sectorId == undefined || (ship.oblique == oblique && ship.y == y)) {
							var carrierId = ship.carrier;
							if (!isOrbital(carrierId)) {
								if (!hasExistingRepairOrder(shipId)) {
    							    repairables[shipId] = ship;
								}
								// else alread have a repair order in this sector for this ship
							}
							// else ship will be fully repaired in orbital
						}
						// else ship not repairable from this sector
					}
					// else not owned/allied ship
				}
				// else ship will auto repair on its own
			}
			// else devices are not repairable
		}
		// else missiles are not repairable
	}
	return repairables;
}

function repairsort(a, b) {
}

function updateRepairList(list) {
	var sectorId = undefined;
	var world = getWorld(REPAIRSECTORID);
	if (world.blockaded) {
		sectorId = REPAIRSECTORID;
	}
	var repairables = getRepairables(sectorId);
	// repairables.sort(repairsort);
	var opts = {};
	for ( var shipId in repairables) {
		var ship = repairables[shipId];
		var shipclassId = ship.shipclass;
		var shipclass = shipclasses[shipclassId];
		var name = ship.handle + " (" + ship.dpremaining + "+"
				+ shipclass.ar + "/" + shipclass.dp + ")";
		var ownerId = ship.empire;
		if (ownerId != empire.id) {
			var owner = empires[ownerId];
			name += " [" + owner.name + "]";
		}
		opts[shipId] = name;
	}
	$(list).empty();
	$(list).append(
			$("<option></option>").attr("value", '0').text("Select ship").attr(
					"disabled", true));
	addSelectOptions(list, opts);
}

function getRepairPerRU(shipId) {
	var repairPerRU = isOrbital(shipId) ? ORBITAL_DPS_REPAIRED_PER_RU : DPS_REPAIRED_PER_RU;
	return repairPerRU;
}

function getMaxRepairNeeded(shipId) {
	var ship = ships[shipId];
	var shipclass = getShipclass(shipId);
	var dpremaining = ship.dpremaining;
	var dp = shipclass.dp;
	var ar = shipclass.ar;
	var maxNeeded = dp - dpremaining - ar;
	return maxNeeded;
}

function selectedRepair(list) {
	var row = $(list).parents('tr');
	var repairId = $(row).attr('repairid');
	var shipId = $(row).find("[class*='repair-ship']").val();
	var repairPerRU = getRepairPerRU(shipId);
	if (repairId > 0) {
		var amountToRepair = $(row).find("[class*='repair-dp']").val();
		var cost = Math.ceil(amountToRepair / repairPerRU);
		var values = {
				"dp": amountToRepair,
				"cost": cost
		};
		updateOrder(REPAIRSECTORID, ordertypes.repair, repairId, values);
	}
	else {
		var sector = sectors[REPAIRSECTORID];
		var worldId = sector.world;

		var available = getAvailableRU(REPAIRSECTORID);
		var maxNeeded = getMaxRepairNeeded(shipId);
		var amountToRepair = Math.max(0, maxNeeded);

		var cost = Math.ceil(amountToRepair / repairPerRU);
		if (cost > available) {
			amountToRepair = repairPerRU * available;
			cost = available;
		}

		var repair = {
			"ship" : shipId,
			"dp" : amountToRepair,
			"cost" : cost,
			"world": worldId
		};
		repairId = addOrder(REPAIRSECTORID, ordertypes.repair, repair);
	}
	rebuildRepairList();
}

function updateAmountList(list) {
	var row = $(list).parents('tr');
	var repairId = $(row).attr('repairid');
	var shipId = $(row).attr('shipid');
	if (repairId > 0) {
		var repairPerRU = getRepairPerRU(shipId);
		OLDSELECTION = $(list).val();
		var repair = getOrder(REPAIRSECTORID, ordertypes.repair, repairId);
		var available = getAvailableRU(REPAIRSECTORID) + repair.cost;
		var maxCanRepair = getMaxRepairNeeded(shipId);
		var cost = Math.ceil(maxCanRepair / repairPerRU);
		if (cost > available) {
			maxCanRepair = repairPerRU * available;
		}

		var opts = {};
		for (var i = 1; i <= maxCanRepair; i++) {
			opts[i] = i;
		}
		$(list).empty();
		$(list).val(OLDSELECTION);
		addSelectOptions(list, opts);
	}
}

function selectedAmount(list) {
	var row = $(list).parents('tr');
	var repairId = $(row).attr('repairid');
	var shipId = $(row).attr('shipid');
	var repairPerRU = getRepairPerRU(shipId);
	var amountToRepair = $(list).val();
	var cost = Math.ceil(amountToRepair / repairPerRU);
	if (amountToRepair > 0) {
		var values = {
				"dp": amountToRepair,
				"cost": cost
		};
		updateOrder(REPAIRSECTORID, ordertypes.repair, repairId, values);
		rebuildRepairList();
	}
	else {
		$(list).val(OLDSELECTION);
	}
}

function deleteRepair(row) {
	var repairId = $(row).attr('repairid');
	deleteOrder(REPAIRSECTORID, ordertypes.repair, repairId);
	$(row).fadeOut('slow', function() {
		rebuildRepairList();
	});
}

function createRepairRow(repairId, rowId) {
	var repairDP = 0;
	var name = "Select ship";
	var shipId = "";
	var cost = 0;
	var row;

	if (repairId > 0) {
		var repair = getOrder(REPAIRSECTORID, ordertypes.repair, repairId);
		shipId = repair.ship;
		var ship = ships[shipId];
		var name = ship.handle;
		repairDP = repair.dp;
		cost = repair.cost;
		var ownerId = ship.empire;
		if (ownerId != empire.id) {
			var owner = empires[ownerId];
			name += " [" + owner.name + "]";
		}
		row = "<tr class='repair-row' repairid='" + repairId + "' shipid='" + shipId + "'>"
			+ addCell("", rowId) + addCell("repair-ship", name)
			+ addSelectCell("repair-dp", repairDP, repairDP)
			+ addCell("repair-cost", cost, cost)
			+ addImageCell("repair-delete", "cancel.png") + "</tr>";
	}
	else {
	    row = "<tr class='repair-row' repairid='" + repairId + "'>"
			+ addCell("", rowId) + addSelectCell("repair-ship", shipId, name)
			+ addSelectCell("repair-dp", repairDP, repairDP)
			+ addCell("repair-cost", cost, cost)
			+ addImageCell("repair-delete", "cancel.png") + "</tr>";
	}
	return row;
}

function populateBlankRepairRow() {
	var available = getAvailableRU(REPAIRSECTORID);
	if (available > 0) {
		var row = createRepairRow(0, "");
		$("#repair-table > tbody > tr:last").after(row);
		$("#repair-table > tbody > tr:last").find(".repair-delete").hide();
	}
}

function populateRepairOrderRows() {
	var rows = "";
	var repairs = getOrders(REPAIRSECTORID, ordertypes.repair);
	var rowId = 1;
	for ( var repairId in repairs) {
		var row = createRepairRow(repairId, rowId++);
		rows += row;
	}
	$("#repair-table > tbody > tr:first").after(rows);
}

function rebuildRepairList() {
	$("#repair-table").find("tr:gt(0)").remove();
	populateBlankRepairRow();
	populateRepairOrderRows();
	updateRepairRULabel();
}

function getTotalRepairCost() {
	var totalCost = 0;
	var repairs = getOrders(REPAIRSECTORID, ordertypes.repair);
	for (var repairId in repairs) {
		var repair = repairs[repairId];
		totalCost += repair.cost;
	}
	return totalCost;
}

function updateRepairRULabel() {
	var available = getAvailableRU(REPAIRSECTORID);
	$('#repair-label').text(available);
	// TODO change label to indicate world can only repair ships in same sector
}

function showRepairDialog(sectorId) {
	REPAIRSECTORID = sectorId;
	rebuildRepairList();
	$(".repair-delete").live('click', function(event) {
		var row = $(this).parents('tr');
		deleteRepair(row);
		event.preventDefault();
	});

	$(".repair-ship").live('mousedown', function() {
		updateRepairList(this);
	});
	$(".repair-ship").live('mouseup', function() {
		selectedRepair(this);
		return false;
	});
	$(".repair-dp").live('mousedown', function() {
		updateAmountList(this);
	});
	$(".repair-dp").live('mouseup', function() {
		selectedAmount(this);
		return false;
	});

	$('#repair-dialog').dialog('option', 'title',
			"Repair Ships " + getTitle(sectorId));
	$('#repair-dialog').dialog('open');
}

