sett_mousemove = function (e) {
  if (!e) e = window.event;
  var x = e.layerX || e.offsetX;
  var y = e.layerY || e.offsetY;

  if (GAME_STATE == GS_NORMAL) {

  }
  else if (GAME_STATE == GS_ADDROAD) {

  }
  else if (GAME_STATE == GS_ADDSETT) {

  }
};


sett_click = function (e) {
  if (!e) e = window.event;
  var x = e.layerX || e.offsetX;
  var y = e.layerY || e.offsetY;

  if (GAME_STATE == GS_NORMAL) {

  }
  else if (GAME_STATE == GS_ADDROAD) {

  }
  else if (GAME_STATE == GS_ADDSETT) {
    if (this == BOARD.new_sett && this.ok) save_sett();
  }
};


function start_add_sett () {
  if (GAME_STATE == GS_ADDSETT) {
    cancel_sett();
    return;
  }
  else if (GAME_STATE != GS_NORMAL) {
    alert("You're busy doing something else!");
    return;
  }

  var sbox = $ID('sett_color');
  var color = sbox.options[sbox.selectedIndex].value;

  if (REMAINING['sett'][color] == 0) {
    alert("You don't have any settlements left!");
    return;
  }

  REMAINING['sett'][color]--;
  sbox.options[sbox.selectedIndex].text = color + " (" + REMAINING['sett'][color] + ")";
  add_sett(color);
}


function add_sett (color) {
  if (GAME_STATE != GS_NORMAL) return;

  var img = $EL('IMG', '', 'sett');
  img.color = color;
  img.onmousemove = sett_mousemove;
  img.onclick = sett_click;

  GAME_STATE = GS_ADDSETT;
  BOARD.appendChild(img);
  BOARD.new_sett = img;
}


function cancel_sett () {
  if (GAME_STATE != GS_ADDSETT) return;

  var sbox = $ID('sett_color');
  var color = sbox.options[sbox.selectedIndex].value;
  REMAINING['sett'][color]++;
  sbox.options[sbox.selectedIndex].text = color + " (" + REMAINING['sett'][color] + ")";

  BOARD.removeChild(BOARD.new_sett);
  GAME_STATE = GS_NORMAL;
}


function save_sett () {
  if (GAME_STATE != GS_ADDSETT) return;
  var hex_v = BOARD.new_sett.vertex;
  var this_h = BOARD.new_sett.hex;
  var vertex = VERTICES[this_h.n-18][hex_v];

  BOARD.setts[BOARD.new_sett.color] = 1;

  for (var h in HEX_AT_VERTEX[vertex]) {
    var hex_id = HEX_AT_VERTEX[vertex][h];
    BOARD.zones[hex_id[0]].setts[hex_id[1]] = BOARD.new_sett;
  }

  GAME_STATE = GS_NORMAL;
}


function can_place_sett (hex, v) {
  if (v == null) return false;
  var vertex = VERTICES[hex.n-18][v];
  var seen = [];

  // make sure we're not too close to another building
  for (var h in HEX_AT_VERTEX[vertex]) {
    var hex_id = HEX_AT_VERTEX[vertex][h];
    if (BOARD.zones[hex_id[0]].setts[hex_id[1]]) return false;
    if (BOARD.zones[hex_id[0]].cities[hex_id[1]]) return false;

    // get vertices adjacent to vertex and check them likewise
    for (var va in VERTEX_ADJACENCY[vertex]) {
      var vid = VERTEX_ADJACENCY[vertex][va];
      if (seen[vid]) continue;
      seen[vid] = 1;

      for (var hh in HEX_AT_VERTEX[vid]) {
        var hex_id2 = HEX_AT_VERTEX[vid][hh];
        if (BOARD.zones[hex_id2[0]].setts[hex_id2[1]]) return false;
        if (BOARD.zones[hex_id2[0]].cities[hex_id2[1]]) return false;
      }
    }
  }

  // now make sure we're touching a road we built
  // exception: first settlement of a color has free reign
  if (! BOARD.setts[BOARD.new_sett.color]) return true;

  var hexes = HEX_AT_VERTEX[vertex];
  for (var h in hexes) {
    var hex_id = hexes[h];

    var r = BOARD.zones[hex_id[0]].roads[hex_id[1]];
    if (r != null && r.color == BOARD.new_road.color) return true;
  }

  return false;
}
