// initLayerSelector() must be called after the page is loaded
// and before any other methods in this file are called.
var layerSelectionForm = null;

function updateSelectedLayersButtons() {
  var selectedLayers = layerSelectionForm.selectedLayers;
  var nItems = selectedLayers.length;
  if (nItems < 1 || selectedLayers.selectedIndex < 0) {
    layerSelectionForm.moveUpButton.disabled = true;
    layerSelectionForm.moveDownButton.disabled = true;
    layerSelectionForm.removeButton.disabled = true;
  }
  else {
    layerSelectionForm.moveUpButton.disabled =
      (selectedLayers.options[0].selected);
    layerSelectionForm.moveDownButton.disabled =
      (selectedLayers.options[nItems-1].selected);
    layerSelectionForm.removeButton.disabled = false;
  }
}

function addLayer() {
  var layers = layerSelectionForm.layers;
  var layerIndex = layers.selectedIndex;
  var layer = layers.options[layerIndex].text;

  if (layer == noneString) return;

  var styles = layerSelectionForm.styles;
  var styleIndex = styles.selectedIndex;
  var style = styles.options[styleIndex].text;

  if (style != defaultString)
    layer = layer + " {" + style + "}";

  var selectedLayers = layerSelectionForm.selectedLayers;
  var i;
  for (i=0; i<selectedLayers.length; i++) {
    if (selectedLayers.options[i].text == layer) {
      alert("The " + layer + " layer is already selected.");
      return;
    }
  }

  selectedLayers.length = selectedLayers.length + 1;
  selectedLayerIndex = selectedLayers.selectedIndex;
  for (i=selectedLayers.length-2; i>selectedLayerIndex; i--) {
    selectedLayers.options[i+1].text = selectedLayers.options[i].text;
    selectedLayers.options[i+1].selected = selectedLayers.options[i].selected;
  }
  selectedLayers.options[selectedLayerIndex+1].text = layer;
  selectedLayers.options[selectedLayerIndex+1].selected = false;
  updateSelectedLayersButtons();
  updateLayersToPlotList();
}

function removeLayers() {
  var selectedLayers = layerSelectionForm.selectedLayers;
  a = selectedLayers.selectedIndex;
  if (a >= 0) {
    b = a + 1;
    while (b < selectedLayers.length) {
      while (b < selectedLayers.length && selectedLayers.options[b].selected)
        b++;
      if (b < selectedLayers.length) {
        selectedLayers.options[a].text = selectedLayers.options[b].text;
        selectedLayers.options[a].selected = false;
      }
      a++;
      b++;
    }
    selectedLayers.length = selectedLayers.length - (b - a);
    selectedLayers.selectedIndex = -1;
  }
  updateSelectedLayersButtons();
  updateLayersToPlotList();
}

function moveLayersUp() {
  var selectedLayers = layerSelectionForm.selectedLayers;
  var i;
  for (i=0; i<selectedLayers.length && selectedLayers.options[i].selected; i++)
    ;
  for (i++; i<selectedLayers.length; i++) {
    if (selectedLayers.options[i].selected) {
      tmp = selectedLayers.options[i-1].text;
      selectedLayers.options[i-1].text = selectedLayers.options[i].text;
      selectedLayers.options[i].text = tmp;
      selectedLayers.options[i-1].selected = true;
      selectedLayers.options[i].selected = false;
    }
  }
  updateSelectedLayersButtons();
  updateLayersToPlotList();
}

function moveLayersDown() {
  var selectedLayers = layerSelectionForm.selectedLayers;
  var i;
  for (i=selectedLayers.length-1; i>=0 && selectedLayers.options[i].selected; i--)
    ;
  for (i--; i>=0; i--) {
    if (selectedLayers.options[i].selected) {
      tmp = selectedLayers.options[i+1].text;
      selectedLayers.options[i+1].text = selectedLayers.options[i].text;
      selectedLayers.options[i].text = tmp;
      selectedLayers.options[i+1].selected = true;
      selectedLayers.options[i].selected = false;
    }
  }
  updateSelectedLayersButtons();
  updateLayersToPlotList();
}

function updateLayersToPlotList() {
  var newList = "";
  var selectedLayers = layerSelectionForm.selectedLayers;
  for (var i=0; i<selectedLayers.length; i++) {
    if (i != 0) newList = newList + "|";
    newList = newList + selectedLayers.options[i].text;
  }
  layerSelectionForm.layersToPlot.value = newList;
}

function initLayerSelector(theForm) {
  layerSelectionForm = theForm;
  updateSelectedLayersButtons();
  updateLayersToPlotList();
  if (layerSelectionForm.themes != null)
    initSelectionLists();
}

function initSelectionLists() {
  if (dataStoreList.length > 1) {
    var themeIndex = layerSelectionForm.themes.selectedIndex;
    if (themeIndex < 1) themeIndex = 1;
    updateThemeList();
    layerSelectionForm.themes.selectedIndex = themeIndex;
  }

  var layerIndex = layerSelectionForm.layers.selectedIndex;
  if (layerIndex < 1) layerIndex = 1;
  updateLayerList();
  layerSelectionForm.layers.selectedIndex = layerIndex;

  var styleIndex = layerSelectionForm.styles.selectedIndex;
  if (styleIndex < 1) styleIndex = 1;
  updateStyleList();
  layerSelectionForm.styles.selectedIndex = styleIndex;
}

function updateThemeList() {
  var dataStoreId = getSelectedDataStoreId();
  var themes = layerSelectionForm.themes;

  var dataStoreInfo = findDataStoreInfo(dataStoreId);
  if (dataStoreInfo == null) {
    themes.options.length = 2;
    themes.options[1].text = noneString;
  }
  else {
    var themeArray = dataStoreInfo[1];
    if (themeArray.length < 1) {
      themes.options.length = 2;
      themes.options[1].text = noneString;
    }
    else {
      themes.options.length = themeArray.length + 1;
      for (var i=0; i<themeArray.length; i++)
        themes.options[i+1].text = themeArray[i][0];
    }
  }
}

function updateLayerList() {
  var dataStoreId = getSelectedDataStoreId();
  var themeId = getSelectedThemeId();
  var layers = layerSelectionForm.layers;

  var themeInfo = findThemeInfo(dataStoreId, themeId);
  if (themeInfo == null) {
    layers.options.length = 2;
    layers.options[1].text = noneString;
  }
  else {
    var layerArray = themeInfo[1];
    if (layerArray.length < 1) {
      layers.options.length = 2;
      layers.options[1].text = noneString;
    }
    else {
      layers.options.length = layerArray.length + 1;
      for (var i=0; i<layerArray.length; i++)
        layers.options[i+1].text = layerArray[i][0];
    }
  }
}

function updateStyleList() {
  var dataStoreId = getSelectedDataStoreId();
  var themeId = getSelectedThemeId();
  var layerId = getSelectedLayerId();
  var styles = layerSelectionForm.styles;

  var layerInfo = findLayerInfo(dataStoreId, themeId, layerId);
  if (layerInfo == null) {
    styles.options.length = 2;
    styles.options[1].text = noneString;
  }
  else {
    var styleArray = layerInfo[1];
    styles.options.length = styleArray.length + 2;
    styles.options[1].text = defaultString;
    var j = 2;
    for (var i=0; i<styleArray.length; i++) {
      if (styleArray[i].toLowerCase() != "default")
        styles.options[j++].text = styleArray[i];
      else
        styles.options.length = styles.options.length - 1;
    }
  }
}

function newDataStoreSelected() {
  var dataStores = layerSelectionForm.dataStores;
  var dataStoreIndex = dataStores.selectedIndex;
  var themes = layerSelectionForm.themes;

  if (dataStoreIndex == 0) {
    dataStores.selectedIndex = 1;
    newDataStoreSelected();
    return;
  }

  updateThemeList();
  themes.selectedIndex = 1;
  newThemeSelected();
}

function newThemeSelected() {
  var themes = layerSelectionForm.themes;
  var themeIndex = themes.selectedIndex;
  var layers = layerSelectionForm.layers;

  if (themeIndex == 0) {
    themes.selectedIndex = 1;
    newThemeSelected();
    return;
  }

  updateLayerList();
  layers.selectedIndex = 1;
  newLayerSelected();
}

function newLayerSelected() {
  var layers = layerSelectionForm.layers;
  var layerIndex = layers.selectedIndex;
  var styles = layerSelectionForm.styles;

  if (layerIndex == 0) {
    layers.selectedIndex = 1;
    newLayerSelected();
    return;
  }

  updateStyleList();
  styles.selectedIndex = 1;

  if (layerSelectionForm.showBBox!=null && layerSelectionForm.showBBox.checked)
    showBBoxInContextImage(true);
}

function newStyleSelected() {
  var styles = layerSelectionForm.styles;
  if (styles.selectedIndex == 0)
    styles.selectedIndex = 1;
}

function getSelectedDataStoreId() {
  if (dataStoreList.length > 1) {
    var dataStores = layerSelectionForm.dataStores;
    var dataStoreIndex = dataStores.selectedIndex;
    return dataStores.options[dataStoreIndex].text;
  }
  else {
    return dataStoreList[0][0];
  }
}

function getSelectedThemeId() {
  var themes = layerSelectionForm.themes;
  var themeIndex = themes.selectedIndex;
  return themes.options[themeIndex].text;
}

function getSelectedLayerId() {
  var layers = layerSelectionForm.layers;
  var layerIndex = layers.selectedIndex;
  return layers.options[layerIndex].text;
}

function findDataStoreInfo(dataStoreId) {
  for (var i=0; i<dataStoreList.length; i++)
    if (dataStoreList[i][0] == dataStoreId) return dataStoreList[i];
  return null;
}

function findThemeInfo(dataStoreId, themeId) {
  var dataStoreInfo = findDataStoreInfo(dataStoreId);
  if (dataStoreInfo == null) return null;

  for (var i=0; i<dataStoreInfo[1].length; i++)
    if (dataStoreInfo[1][i][0] == themeId) return dataStoreInfo[1][i];
  return null;
}

function findLayerInfo(dataStoreId, themeId, layerId) {
  var themeInfo = findThemeInfo(dataStoreId, themeId);
  if (themeInfo == null) return null;

  for (var i=0; i<themeInfo[1].length; i++)
    if (themeInfo[1][i][0] == layerId) return themeInfo[1][i];
  return null;
}

