/* lulc.js: Functions for South Florida LULC */

// Global variables
var LULCViewURL = "../python/viewlulc/view_lulc";
var LULCChangeURL = "../python/changelulc/change_lulc";
var LULCQueryURL = "../python/querylulc/query_lulc";
var LULCWindows = { upload: {url: "lulcupload.html", height: 200, width:500, window: null} };
var NewLULCs = new Array();

// Button functions
function UploadLULC() {
  OpenLULCWindow("upload");
}

function ViewLULC() {
  // Clear out previous data which may have changed
  var lulcViewList = document.getElementById("lulcViewList");
  var queryViewList = document.getElementById("queryViewList");
  var fragstatsViewList = document.getElementById("fragstatsViewList");
  var lulcViewBoxes = document.getElementById("lulcViewBoxes");
  var fragstatsViewBoxes = document.getElementById("fragstatsViewBoxes");
  lulcViewList.innerHTML = "";
  queryViewList.innerHTML = "";
  fragstatsViewList.innerHTML = "";
  lulcViewBoxes.innerHTML = "";
  fragstatsViewBoxes.innerHTML = "";
  var HandleViewResponse = function() {         // Handle AJAX response
    if ( view_xmlhttp.readyState == 4 )	{
      var oResponseXML = (new DOMParser()).parseFromString(view_xmlhttp.responseText, "text/xml");
      if (oResponseXML.documentElement.tagName == "response") {
        MapURLPrefix = oResponseXML.documentElement.getElementsByTagName("urlpre")[0].firstChild.nodeValue;
        QueryURLPrefix = oResponseXML.documentElement.getElementsByTagName("qurlpre")[0].firstChild.nodeValue;
        FragstatsURLPrefix = oResponseXML.documentElement.getElementsByTagName("furlpre")[0].firstChild.nodeValue;
        var datasets = oResponseXML.documentElement.getElementsByTagName("dataset");
        var querys = oResponseXML.documentElement.getElementsByTagName("query");
        var fragstats = oResponseXML.documentElement.getElementsByTagName("fragstats");
        for (var i = 0; i < datasets.length; i++) {
          var dataset = datasets[i];
          var option = document.createElement("option");
          option.id = "opt_" + dataset.getElementsByTagName("gridname")[0].firstChild.nodeValue;
          option.value = dataset.getElementsByTagName("name")[0].firstChild.nodeValue;
          option.text = dataset.getElementsByTagName("title")[0].firstChild.nodeValue;
          if (dataset.getElementsByTagName("desc").length > 0) 
            option.title = dataset.getElementsByTagName("desc")[0].firstChild.nodeValue;
          try {
            lulcViewList.add(option, null);
          }
          catch(ex) {
            lulcViewList.add(option);   // IE
          }
          var span = document.createElement("span");
          span.id = "box" + dataset.getElementsByTagName("name")[0].firstChild.nodeValue;
          span.innerHTML += dataset.getElementsByTagName("ulx")[0].firstChild.nodeValue;
          span.innerHTML += ",";
          span.innerHTML += dataset.getElementsByTagName("uly")[0].firstChild.nodeValue;
          span.innerHTML += ",";
          span.innerHTML += dataset.getElementsByTagName("lrx")[0].firstChild.nodeValue;
          span.innerHTML += ",";
          span.innerHTML += dataset.getElementsByTagName("lry")[0].firstChild.nodeValue;
          lulcViewBoxes.insertBefore(span, null);
        }
        for (var i = 0; i < querys.length; i++) {
          var query = querys[i];
          var option = document.createElement("option");
          option.id = "opt_" + query.getElementsByTagName("gridname")[0].firstChild.nodeValue;
          option.value = query.getElementsByTagName("name")[0].firstChild.nodeValue;
          option.text = query.getElementsByTagName("title")[0].firstChild.nodeValue;
          if (query.getElementsByTagName("desc")[0].childNodes.length > 0)
            option.title = query.getElementsByTagName("desc")[0].firstChild.nodeValue;
          try {
            queryViewList.add(option, null);
          }
          catch(ex) {
            queryViewList.add(option);   // IE
          }
        }
        for (var i = 0; i < fragstats.length; i++) {
          var fragstat = fragstats[i];
          var option = document.createElement("option");
          option.id = "opt_" + fragstat.getElementsByTagName("gridname")[0].firstChild.nodeValue;
          option.value = fragstat.getElementsByTagName("name")[0].firstChild.nodeValue;
          option.text = fragstat.getElementsByTagName("title")[0].firstChild.nodeValue;
          if (fragstat.getElementsByTagName("desc")[0].childNodes.length > 0)
            option.title = fragstat.getElementsByTagName("desc")[0].firstChild.nodeValue;
          try {
            fragstatsViewList.add(option, null);
          }
          catch(ex) {
            fragstatsViewList.add(option);   // IE
          }
          // full county LULC has no bounds
          if (fragstat.getElementsByTagName("ulx")[0].firstChild.nodeValue != "0") {
            var span = document.createElement("span");
            span.id = "box" + fragstat.getElementsByTagName("name")[0].firstChild.nodeValue;
            span.innerHTML += fragstat.getElementsByTagName("ulx")[0].firstChild.nodeValue;
            span.innerHTML += ",";
            span.innerHTML += fragstat.getElementsByTagName("uly")[0].firstChild.nodeValue;
            span.innerHTML += ",";
            span.innerHTML += fragstat.getElementsByTagName("lrx")[0].firstChild.nodeValue;
            span.innerHTML += ",";
            span.innerHTML += fragstat.getElementsByTagName("lry")[0].firstChild.nodeValue;
            fragstatsViewBoxes.insertBefore(span, null);
          }
        }
        OpenCSSPopup("lulcView");
      }
      else if (view_xmlhttp.responseText.length == 0) {
        alert("Server error");
      }
      else {
        alert(view_xmlhttp.responseText);
      }
    }
  };
      
  var view_xmlhttp = GetNewXMLHttpRequest();
  view_xmlhttp.onreadystatechange = HandleViewResponse;
  view_xmlhttp.open("GET", LULCViewURL, true);
  view_xmlhttp.setRequestHeader('Content-Type', 'text/xml');
  view_xmlhttp.setRequestHeader('Cache-Control', 'no-cache');
  view_xmlhttp.send(null);
}

function ChangeLULC() {
  OpenCSSPopup("lulcChange");
}

function QueryLULC() {
  document.getElementById("msgQuery").style.display = "none";  
  document.getElementById("strName").value = "";
  document.getElementById("cboOverwrite").checked = false;
  document.getElementById("strDesc").value = "";
  document.getElementById("txtGridQuery").value = "";
  document.getElementById("queryGrid").checked = true;
  ToggleParcelQuery();
  OpenCSSPopup("lulcQuery");
}

function OpenLULCWindow(lulcwintype) {
  var lulcwin = LULCWindows[lulcwintype];
  var openNewWindow = lulcwin.window ? lulcwin.window.closed : true;
  if (!openNewWindow && navigator.appName == "Netscape") { // To get around Firefox Bug 355482 (if Raise & Lower Windows not on)
    lulcwin.window.close();
    openNewWindow = true;
  }
  if (openNewWindow) {
    var features = "dependent,height=" + lulcwin.height + ",width=" + lulcwin.width + ",left=" +
                   (screen.width - lulcwin.width) / 2 + ",top=" + (screen.height - lulcwin.height) / 2;
    lulcwin.window = window.open(lulcwin.url, "lulc" + lulcwintype, features);
  }
}

function SelectViewList(selectid) {
  document.getElementById(selectid == "lulcViewList" ? "queryViewList" : "lulcViewList").selectedIndex = -1;
  EnablePopupOK('btnViewOK', selectid);
}

function AddLULCLayer(title, ulx, uly, lrx, lry, opacity, gridname) {
  var name = "";
  var mapName = "";
  var nonquery = true;
  var mapservDir = "";
  if (title) {
    if (LULCWindows["upload"].window) LULCWindows["upload"].window.close();
    nonquery = !title.match(/Query/);
    mapName = name = title.replace(/ Query$/, "").replace(/ /g, "_");
    mapservDir = nonquery ? "upload" : "query";
  }
  else {
    // lulclist and selection are only used if AddLULCLayer() was called by View and not by Upload
    var lulclist = document.getElementById("lulcViewList");
    var querylist = document.getElementById("queryViewList");
    var fragstatslist = document.getElementById("fragstatsViewList");
    var fragstats = fragstatslist.selectedIndex > -1
    nonquery = lulclist.selectedIndex > -1 || fragstats;  // Needed because of CloseCSSPopup()
    var selection = null;
    if (nonquery) {
      if (fragstats) {
        selection = fragstatslist.options[fragstatslist.selectedIndex];
        mapservDir = "fragmap";
      }
      else {
        selection = lulclist.options[lulclist.selectedIndex];
        mapservDir = "upload";
      }
    }
    else {
      selection = querylist.options[querylist.selectedIndex];
      mapservDir = "query";
    }
    CloseCSSPopup("lulcView");
    name = selection.value;
    title = selection.text;
    gridname = (nonquery && !fragstats) ? selection.id.substr(4) : name;
    if (!nonquery) title += " Query";
    if (fragstats) {
      var epmrun = name.replace(/_ca$/,"").replace(/_cohesion$/,"").replace(/_core_mn$/,"");
      epmrun = epmrun.replace(/_enn_mn$/,"").replace(/_frac_am$/,"").replace(/_sidi$/,"")
      mapName = "fragstats_" + epmrun;
    }
    else {
      mapName = name;
    }
    opacity = overlayOpacity;
  }
  if (map.getLayersByName(name).length > 0) {
    alert(title + " already on map.");
    return;
  }
  TurnOffLULCLayers(true);
  var newLayer = NewMapserverLayer(name, mapservDir + "/" + mapName, title, "user", true, true, overlayOpacity, nonquery);
  map.addLayer(newLayer);
  mapClasses[name] = fluccs2004Classes;    // for Info Tool

  // Add to LULC to change and query list (if not query)
  if (nonquery) {
    var lulcChangeList = document.getElementById("lulcChangeList");
    var lulcQueryList = document.getElementById("lulcQueryList");
    var option = document.createElement("option");
    var option2 = document.createElement("option");
    // Commented out this line because of problem if uploaded name != gridname
    //option.value = option2.value = !gridname ? name : gridname;
    option.value = option2.value = name;
    option.text = option2.text = title;
    if (ulx) {    // For zooming into query or change LULC area
      option.setAttribute("ulx", ulx);
      option2.setAttribute("ulx", ulx);
      option.setAttribute("uly", uly);
      option2.setAttribute("uly", uly);
      option.setAttribute("lrx", lrx);
      option2.setAttribute("lrx", lrx);
      option.setAttribute("lry", lry);
      option2.setAttribute("lry", lry);
    }
    else if (document.getElementById("box" + name)) {
      var bounds = document.getElementById("box" + name).innerHTML.split(",");
      option.setAttribute("ulx", bounds[0]);
      option2.setAttribute("ulx", bounds[0]);
      option.setAttribute("uly", bounds[1]);
      option2.setAttribute("uly", bounds[1]);
      option.setAttribute("lrx", bounds[2]);
      option2.setAttribute("lrx", bounds[2]);
      option.setAttribute("lry", bounds[3]);
      option2.setAttribute("lry", bounds[3]);
    }
    try {
      if (!fragstats) lulcChangeList.add(option, null);
      lulcQueryList.add(option2, null);
    }
    catch(ex) {
      if (!fragstats) lulcChangeList.add(option);   // IE
      lulcQueryList.add(option2);    // IE
    }
  }

  // Zoom to layer
  if (ulx) {
    map.zoomToExtent(new OpenLayers.Bounds(ulx, lry, lrx, uly));
  }
  else if (document.getElementById("box" + name)) {
    var bounds = document.getElementById("box" + name).innerHTML.split(",");
    map.zoomToExtent(new OpenLayers.Bounds(bounds[0], bounds[3], bounds[2], bounds[1]));
  }
  else {   // no bounds: zoom to whole county
    map.zoomToMaxExtent();
  } 
  RefreshMarkers();
  layerSwitcher.openOrCollapse("lulc", false);    // open user group in layer list
  mainTabs.set("activeIndex", 0);                 // Set tabs to layer list
}

function TurnOffLULCLayers(doUpdate) {
  document.getElementById("rdo_lulc_none").checked = true;
  // Turn off radio buttons/layers in other subgroups
  var off = false;
  var existingInputs = layerSwitcher.groupDivs["existing"].getElementsByTagName("input");
  for (var i = 0; i < existingInputs.length; i++) {
    if (existingInputs[i].checked) {
      existingInputs[i].checked = false;
      off = true;
      break;
    }
  }
  if (!off) {
    var ksInputs = layerSwitcher.groupDivs["ks"].getElementsByTagName("input");
    for (var i = 0; i < ksInputs.length; i++) {
      if (ksInputs[i].checked) {
        ksInputs[i].checked = false;
        off = true;
        break;
      }
    }
  }
  if (!off) {
    var userInputs = layerSwitcher.groupDivs["user"].getElementsByTagName("input");
    for (var i = 0; i < userInputs.length; i++) {
      if (userInputs[i].checked) {
        userInputs[i].checked = false;
        off = true;
        break;
      }
    }
  }
  layerSwitcher.updateMap(true);
  document.getElementById("rdo_user").checked = true;
}

function PopulateLULCSelect() {
  var select = document.getElementById("lulcSelectList");
  for (var cls in fluccs2004Classes) {
    var option = document.createElement("option");
    option.value = cls;
    option.text = fluccs2004Classes[cls];
    try {
      select.add(option, null);
    }
    catch(ex) {
      select.add(option);   // IE
    }
  }
}

function RunLULCChange() {
  var lulclist = document.getElementById("lulcChangeList");
  if (lulclist.selectedIndex == -1) {
    alert("You must select a dataset.");
    return;
  }
  var lulcoption = lulclist.options[lulclist.selectedIndex];
  var lulc = lulcoption.value;
  CloseCSSPopup("lulcChange");
  // Zoom into LULC that we are changing
  /*if (lulcoption.hasAttribute("ulx")) {
    map.zoomToExtent(new OpenLayers.Bounds(lulcoption.getAttribute("ulx"),
      lulcoption.getAttribute("lry"), lulcoption.getAttribute("lrx"), lulcoption.getAttribute("uly")));
  }*/
  NewLULCs = new Array(lulc);
  TurnOffLULCLayers(false);
  // Turn on the LULC to change (convoluted stuff needs to be done to make sure first layer in group isn't turned on
  if (lulc == "fluccs_lc2004") {
    document.getElementById("rdo_existing").checked = true;
    document.getElementById("rdo_fluccs_lc2004").checked = true;
  }
  else {
    document.getElementById("rdo_user").checked = true;
    document.getElementById("rdo_" + lulc).checked = true;
  }
  layerSwitcher.updateMap(true);
  selectPolygon.handler.activate();     // Turn on polygon selection
}

// Add polygon to new LULC list
function AddToNewLULCList(lonlats) {
  NewLULCs.push(new Array(lonlats));
  OpenCSSPopup("lulcSelect");
  selectPolygon.handler.deactivate();
}

// Add FLUCCS code to new LULC list
function SetNewLULCCode() {
  var fluccslist = document.getElementById("lulcSelectList");
  var fluccs = fluccslist.options[fluccslist.selectedIndex].value;
  // Add selected FLUCCS code to final polygon in array
  NewLULCs[NewLULCs.length - 1].push(fluccs);
  OpenCSSPopup("lulcChangeContinue");
}

// Make another LULC polygon selection
function ContinueLULCChange() {
  CloseCSSPopup("lulcChangeContinue");
  selectPolygon.handler.activate();     // Turn on polygon selection again
}

// Enter name of new LULC
function EnterNewLULCName() {
  CloseCSSPopup("lulcChangeContinue");
  document.getElementById("newlulcname").value = "";
  document.getElementById("btnChangeNameOK").style.display = "inline";
  document.getElementById("divChangeName").style.display = "inline";
  document.getElementById("msgChangeName").style.display = "none";
  document.getElementById("btnChangeNameCancel").innerHTML = "Cancel";
  OpenCSSPopup("lulcChangeName");
}

// Make call to server to change LULC
function MakeLULCChangeServerCall() {
  var newlulcname = document.getElementById("newlulcname").value;
  var newlulcdesc = document.getElementById("newlulcdesc").value;
  var overwrite = document.getElementById("overwritelulc").checked ? "yes" : "no";
  if (newlulcname.length == 0) {
    alert("You must enter a name.");
    return;
  }
  if (!newlulcname.match(/^[A-Za-z]/)) {
    alert("Name must begin with an alphabetic character.");
    return;
  }
  // Change display properties of the change popup to show Running message
  document.getElementById("divChangeName").style.display = "none";
  document.getElementById("msgChangeName").style.display = "inline";
  document.getElementById("btnChangeNameOK").style.display = "none";
  document.getElementById("btnChangeNameCancel").innerHTML = "Close";
  
  // create list of parameters from list of LULC polygons and FLUCCS codes
  var LULCChangeParms = "lulcname=" + NewLULCs[0];                                     // Add land cover to change first
  LULCChangeParms += "&newlulcname=" + newlulcname;                                    // Add new land cover name next
  LULCChangeParms += "&newlulcdesc=" + newlulcdesc;
  LULCChangeParms += "&overwrite=" + overwrite;
  for (var i = 1; i < NewLULCs.length; i++) {
    LULCChangeParms += "&newlulc=" + NewLULCs[i][1] + ",";
    var polygon = NewLULCs[i][0];
    for (var j = 0; j < polygon.length; j++) {
      if (j > 0) LULCChangeParms += ",";          // prevent final comma
      LULCChangeParms += polygon[j][0].toFixed(5) + "," + polygon[j][1].toFixed(5);    // Round lat/lon to 5 decimal places 
    }
  }
  
  var HandleChangeResponse = function() {    // Handle AJAX response
    if (change_xmlhttp.readyState == 4) {
      CloseCSSPopup("lulcChangeName");
      if (change_xmlhttp.responseText.length > 0) {
        var features = "dependent,height=200,width=400,left=" + (screen.width - 400) / 2 + ",top=" + (screen.height - 200) / 2;
        var ChangeLULCResponseWindow = window.open("", "changeLULCResponse", features);
        ChangeLULCResponseWindow.document.write(change_xmlhttp.responseText);
        ChangeLULCResponseWindow.focus();
      }
      else {
        alert("Server error with Change LULC.");
      }
    }
  };
  
  var change_xmlhttp = GetNewXMLHttpRequest();
  change_xmlhttp.onreadystatechange = HandleChangeResponse;
  change_xmlhttp.open("POST", LULCChangeURL, true);
  change_xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  change_xmlhttp.setRequestHeader("Content-length", LULCChangeParms.length);
  change_xmlhttp.setRequestHeader("Connection", "close");
  change_xmlhttp.send(LULCChangeParms);
}

function ToggleParcelQuery() {
  var gridQuery = document.getElementById("queryGrid").checked;
  document.getElementById("txtParcelQuery").disabled = gridQuery;
  document.getElementById("parcelColumnList").disabled = gridQuery;
  document.getElementById("btnParcelColumnList").disabled = gridQuery;
  document.getElementById("opParcelList").disabled = gridQuery;
  document.getElementById("btnOpParcelList").disabled = gridQuery;
  if (gridQuery) document.getElementById("txtParcelQuery").value = "";
}

function PerformLULCQuery() {
  var resname = encodeURIComponent(document.getElementById("strName").value);
  if (resname.length == 0) {
    alert("You must have a Query Name.");
    return;
  }
  var overwrite = document.getElementById("cboOverwrite").checked ? "yes" : "no";
  var desc = encodeURIComponent(document.getElementById("strDesc").value);
  var qtype = document.getElementById("queryGrid").checked ? "G" : "P";
  var qstr = encodeURIComponent(document.getElementById("txtGridQuery").value);
  var pstr = encodeURIComponent(document.getElementById("txtParcelQuery").value);
  if (qtype == "G" && qstr.length == 0) {
    alert("A grid query string is required for a grid query.");
    return;
  }

  document.getElementById("msgQuery").style.display = "";  
  var QueryParms = "qtype=" + qtype + "&resname=" + resname + "&qstr=" + qstr + "&pstr=" + pstr +
                   "&overwrite=" + overwrite + "&desc=" + desc;
  var HandleQueryResponse = function() {     // Handle AJAX response
    if (query_xmlhttp.readyState == 4) {
      document.getElementById("msgQuery").style.display = "none";  
      if (query_xmlhttp.responseText.length > 0) {
        var features = "dependent,height=200,width=400,left=" + (screen.width - 400) / 2 + ",top=" + (screen.height - 200) / 2;
        var QueryLULCResponseWindow = window.open("", "queryLULCResponse", features);
        QueryLULCResponseWindow.document.write(query_xmlhttp.responseText);
        if (!query_xmlhttp.responseText.match("darkred")) CloseCSSPopup("lulcQuery");    // not an error, close popup
        QueryLULCResponseWindow.focus();
      }
      else {
        alert("Server error with Query LULC.");
      }
    }
  }
  
  var query_xmlhttp = GetNewXMLHttpRequest();
  query_xmlhttp.onreadystatechange = HandleQueryResponse;
  query_xmlhttp.open("POST", LULCQueryURL, true);
  query_xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  query_xmlhttp.setRequestHeader("Content-length", QueryParms.length);
  query_xmlhttp.setRequestHeader("Connection", "close");
  query_xmlhttp.send(QueryParms);
}

