/*
  infotool.js: Used for performing a GetFeatureInfo and displaying the results.
*/

OpenLayers.Control.InfoTool =
    OpenLayers.Class( OpenLayers.Control, {
    type: OpenLayers.Control.TYPE_TOOL,
    activate: function() {
      mainTabs.set("activeIndex", 2);                      // Set tabs to query results
      return OpenLayers.Control.prototype.activate.apply(this,arguments);
    },
    draw: function() {
      this.handler = new OpenLayers.Handler.Point( this, {done: this.doAction}, {keyMask: this.keyMask} );
    },
    doAction: function(position) {
      mainTabs.set("activeIndex", 2);       // Set tabs to query results
      this.highlightQueryValue();           // unhighlight active query values   
      var lon = position.x;
      var lat = position.y;
      var pixel = this.map.getPixelFromLonLat(new OpenLayers.LonLat(lon, lat));
      var queryLayers = this.getQueryableLayers();
      if (queryLayers.length == 0) {  // no visible layer found: end function
        this.handler.deactivate();    // to prevent extra point from appearing
        alert("No layer currently selected for point info tool.");
        this.handler.activate();      
      }
      else {
        // Mark location
        this.querymark = AddMarker(lat, lon, this.queryicon);
        // Query each selected layer in turn
        for (var j = 0; j < queryLayers.length; j++) {
          // This function must be defined for each application individually
          this.queryLayer(queryLayers[j], lat, lon, pixel.x, pixel.y);
        }
      } 
    },
    queryLayer: function(layer, lat, lon, pixelx, pixely) {
      var queryLayerName = layer.name;
      var queryLayers = queryLayerName; 
      var queryLayerTitle = (layer.title.substr(0,11) == "FLUCCS 2004") ? 
        layer.title.replace("(Land Cover)", "LC").replace("(Land Use)", "LU") :
        layer.title.replace(/ \(.*\)/, "").replace(/ /g, "_");
      var mapExtent = map.getExtent();
      
      // Set layers to query
      var begstr = queryLayerName.split("_")[0];
      if (begstr == "main" || begstr == "bio" || begstr == "tes" || begstr == "rare" || 
          begstr == "buf" || begstr == "lpf" || begstr == "rest") {
        var runName = queryLayerName.substr(begstr.length);
        queryLayers = "rest" + runName + ",lpf" + runName + ",buf" + runName + ",rare" + runName + ",tes" + runName + 
                      ",bio" + runName + ",main" + runName;
        queryLayerTitle = map.getLayersByName("main" + runName)[0].title;
      }
      else if (queryLayerName.substr(0,7) == "pref_lu" && (queryLayerName.substr(12) == "_changes" || queryLayerName.substr(12) == "_nochanges")) {
        queryLayers = queryLayerName.substr(0,12);
      }
      
      // Use LegendURL because Server may be pointing to a tilecache
      var baseURL = layer.legendURL.substr(0, layer.legendURL.indexOf(".map")) + 
        ((queryLayerName.substr(0,7) == "pref_lu") ? ".map" : "_query.map");
        
      var firstJoin = "?";
      if (baseURL.substr(baseURL.length - 1) == "?") { 
        firstJoin = "";
      }
      else if (baseURL.contains("?")) { 
        firstJoin = "&";
      }
      // Create GetFeatureInfo URL
      var callURL = baseURL + firstJoin + "VERSION=1.1.1&REQUEST=GetFeatureInfo&LAYERS=" + queryLayers + "&SRS=" + map.projection + 
                   "&BBOX=" + mapExtent.left + "," + mapExtent.bottom + "," + mapExtent.right + "," + mapExtent.top + "&WIDTH=" +
                   YAHOO.util.Dom.getStyle("map", "width").replace("px", "") + "&HEIGHT=" +
                   YAHOO.util.Dom.getStyle("map", "height").replace("px", "") + "&INFO_FORMAT=text/html&FEATURE_COUNT=1&QUERY_LAYERS=" +
                   queryLayers + "&X= " + pixelx + "&Y=" + pixely + "&FORMAT=image/png&STYLES=";
                   
                    
      var doResponse = function() {
        if ( (geo_xmlhttp.readyState == 4) && (geo_xmlhttp.status < 400) )	{
          var htmlResponse = geo_xmlhttp.responseText;  // HTML is sent back in responseText
          if (htmlResponse.length == 0) {  // no value at that location
            return;
          }
          // Create new response div 
          var newDiv = document.createElement("div");
          newDiv.className = "queryresults";
          newDiv.title = "Click here to see query location";
          newDiv.lat = lat;    // Set for use in onclick function
          newDiv.lon = lon;    // Set for use in onclick function
          // Event handler must be done this way because of IE
          newDiv.onclick = function(){ infoTool.highlightQueryValue(this); infoTool.markQueryLocation(lat, lon, true, this); };
          newDiv.innerHTML = htmlResponse.replace(/\[.*\]/,"");
          var EPMResultQuery = Boolean(htmlResponse.match("Result Value"));
          var MainEPMResult = true;
          newDiv.style.backgroundColor = infoTool.queryHighlightColor;
          
          // Convert response to user-friendly values
          var htmlSpans = newDiv.getElementsByTagName("span");
          for (var j = 0; j < htmlSpans.length; j++) {
            switch(htmlSpans[j].className) {
              case "queryx":
                htmlSpans[j].innerHTML = lon.toFixed(3);    // longitude
                break;
              case "queryy":
                htmlSpans[j].innerHTML = lat.toFixed(3);    // latitude
                break;
              case "querytitle":
                queryLayerTitle = queryLayerTitle.replace(/Euclidean_Nearest_Neighbor_Mean$/, "ENN Mean");
                queryLayerTitle = queryLayerTitle.replace(/Fractal_Dimension_Area-weighted_Mean$/, "FRAC Area-weighted Mean");
                queryLayerTitle = queryLayerTitle.replace(/Simpson\'s_Diversity_Index$/, "SIDI");
                htmlSpans[j].innerHTML = queryLayerTitle.replace(/_/g, " ");
                break;
              case "querydollar":
                var num = parseFloat(htmlSpans[j].innerHTML.substr(1));
                if (num < 0) {   // no value at that location
                  return;
                }
                htmlSpans[j].innerHTML = "$" + ((num < 1000) ? num.toFixed(2) : infoTool.addCommas(num));
                break;
              case "queryboolean":
                htmlSpans[j].innerHTML = (htmlSpans[j].innerHTML == "1") ? "Yes" : "No";
                break;
              case "queryfloat":
                if (htmlSpans[j].innerHTML < 0) {   // no value at that location
                  return;
                }
                var regex = /[0-9]\.[0-9]*e[-+][0-9][0-9][0-9]/;
                if (htmlSpans[j].innerHTML.match(regex)) {
                  var num = parseFloat(htmlSpans[j].innerHTML.match(regex)[0]);
                  htmlSpans[j].innerHTML = 
                    htmlSpans[j].innerHTML.replace(regex, (num < 1000) ? num.toFixed(2) : infoTool.addCommas(num));
                }
                else {
                  htmlSpans[j].innerHTML = parseFloat(htmlSpans[j].innerHTML).toFixed(3);
                }
                break;
              case "queryvalue":  // map returned query value to description string
                if (htmlSpans[j].innerHTML == "255" || htmlSpans[j].innerHTML == "-32768") {   // no value at that location
                  return;
                }
                if (EPMResultQuery) {
                  if (MainEPMResult) {
                    MainEPMResult = false;   // don't modify main EPM result (show as integer)
                  }
                  else if (Math.abs(htmlSpans[j].innerHTML) > 1000) {     // No value (such as for Restoration Potential)
                    htmlSpans[j].innerHTML = "-";
                  }
                  else {
                    htmlSpans[j].innerHTML = parseFloat(htmlSpans[j].innerHTML).toFixed(1);   // round floating point values to 1 place
                  }
                }
                else {
                  if (mapClasses[queryLayerName]) {
                    if (mapClasses[queryLayerName][htmlSpans[j].innerHTML]) {
                      htmlSpans[j].innerHTML = mapClasses[queryLayerName][htmlSpans[j].innerHTML];
                    }
                  }
                }
             }
          }
          // Add response to beginning of query results
          var infoarea = document.getElementById("infoarea");
          infoarea.insertBefore(newDiv, infoarea.firstChild);           
        }
      }
    
      var geo_xmlhttp = GetNewXMLHttpRequest();
      geo_xmlhttp.onreadystatechange = doResponse;
      geo_xmlhttp.open("GET", callURL, true);
      geo_xmlhttp.setRequestHeader('Content-Type', 'text/xml');	        // correct request type
      geo_xmlhttp.setRequestHeader('Cache-Control', 'no-cache');	      // don't cache the requests!
      geo_xmlhttp.send(null);
    },
    getQueryableLayers: function() {
      // get list of layers that are queryable and currently visible
      var queryList = new Array();
      for (var i = 0; i < map.layers.length; i++) {
        if (map.layers[i].queryable && map.layers[i].visibility) {
          queryList.push(map.layers[i]);
        }
      }
      return queryList;
    },
    addCommas: function(num) {
      var numstr = num.toFixed(0);
      var rgx = /(\d+)(\d{3})/;
      while (rgx.test(numstr)) {
        numstr = numstr.replace(rgx, '$1' + ',' + '$2');
      }
      return numstr;
    },
    markQueryLocation: function(lat, lon, flash, div) {
      var extent = map.getExtent();
      // Only center on point if it's not currently in view
      if (lon <= extent.left || lat >= extent.top || lon >= extent.right || lat <= extent.bottom) {
        map.setCenter(new OpenLayers.LonLat(lon,lat), map.getZoom());
        if (div) div.style.backgroundColor = this.queryHighlightColor;    // to deal with bbox listener call of HighlightQueryValue()
      }
      
      // remove previous query marker
      if (this.querymark) this.querymark = RemoveMarker(this.querymark);
      this.querymark = AddMarker(lat, lon, this.queryicon);
      if (flash) this.flashQueryMarker();
    },
    flashQueryMarker: function() {
      this.querymark.display(false);
      setTimeout("infoTool.querymark.display(true)", 200);
    },
    highlightQueryValue: function(div) {
      if (this.querymark) this.querymark = RemoveMarker(this.querymark);       // clear query marker (if it exists)
      var divs = document.getElementById("infoarea").getElementsByTagName("div");
      for (var i = 0; i < divs.length; i++) {
        divs[i].style.backgroundColor = "";
      }
      if (div != null) {
        div.style.backgroundColor = this.queryHighlightColor;
      }
    },
  
    queryicon: new OpenLayers.Icon("/images_shared/redcross.gif", new OpenLayers.Size(14,14)),
    querymark: null,
    queryHighlightColor: "#ffffcc",
    CLASS_NAME: "OpenLayers.Control.InfoTool"
  });


