/* SETTINGS */

//By default setting mapServiceHost to the test server.
var mapServiceHost = "factmaps.sodir.no";

var hostname = window.location.hostname;
//	if (hostname != 'localhost'){
//If the hostname is not localhost
//	    mapServiceHost = hostname
//	}

console.log("mapServiceHost:", mapServiceHost);
var factmaps_full_client_path = "https://" + mapServiceHost + "/map/";
var url_query_mapservice =
  "https://" +
  mapServiceHost +
  "/api/rest/services/Factmaps/FactMapsED50UTM32/MapServer";
var url_lyr_background2 =
  "https://" +
  mapServiceHost +
  "/api/rest/services/Factmaps/FactMapsED50UTM32/MapServer/805";
var lyr_background2_visibleLayers = [0];
var url_lyr_background =
  "https://factmaps.sodir.no/api/rest/services/Basemap/Basemap_simple_yellow/MapServer";
var lyr_background_visibleLayers = [0, 1, 2, 3, 4, 5];

var legendUrls = [url_lyr_background2, url_query_mapservice];
var legendUrlsNames = ["Area Status", "FactMaps"];

var input_url = window.location;
// var hide_nav = null;

// støtte for å ta bort navigering
var hide_nav = getUrlParameterByName("hide_nav", input_url);
var expand_factor = getUrlParameterByName("expand_factor", input_url);

// laget for å støtte å sette expand factor i url.
var query_result_extent_expand_factor = 1.3;
if (expand_factor != null) {
  query_result_extent_expand_factor = expand_factor;
}
var highlight_color_rgba_ol = [0, 255, 255, 0.7];
var highlight_color_rgba = [110, 132, 137, 0.1];
var highlight_ol_width = 3;

console.log("hide_nav:", hide_nav);

function getUrlParameterByName(name, url) {
  if (!url) url = window.location.href;
  name = name.replace(/[\[\]]/g, "\\$&");
  var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
    results = regex.exec(url);
  if (!results) return null;
  if (!results[2]) return "";
  return decodeURIComponent(results[2].replace(/\+/g, " "));
}

function contains(a, obj) {
  var i = a.length;
  while (i--) {
    if (a[i] === obj) {
      return true;
    }
  }
  return false;
}

var entity_and_layers = {
  field: {
    entity_legend_name: "field",
    query_layer_id: [502],
    query_field: "fldNpdidField",
    out_fields: ["OBJECTID", "fldNpdidField", "fldName"],
    visible_layers: [502, 503, 612, 616, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/fld.ashx?id=" + npdid,
  },
  facility: {
    entity_legend_name: "facility",
    query_layer_id: [307],
    query_field: "fclNpdidFacility",
    out_fields: ["OBJECTID", "fclNpdidFacility", "fclName"],
    visible_layers: [307, 311, 502, 503, 612, 616, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/fcl.ashx?id=" + npdid,
  },
  licence: {
    entity_legend_name: "licence",
    query_layer_id: [616],
    query_field: "prlNpdidLicence",
    out_fields: ["OBJECTID", "prlNpdidLicence", "prlName"],
    visible_layers: [502, 503, 612, 616, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/LicActive.ashx?id=" + npdid,
  },
  licence_smil: {
    query_layer_id: [616],
    query_field: "prlNpdidLicence",
    out_fields: ["OBJECTID", "prlNpdidLicence", "prlName"],
    visible_layers: [502, 503, 612, 616, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/LicActive.ashx?id=" + npdid,
  },
  pipeline: {
    entity_legend_name: "pipeline",
    query_layer_id: [311],
    query_field: "pplNpdidPipeline",
    out_fields: ["OBJECTID", "pplNpdidPipeline", "pplName"],
    visible_layers: [307, 311, 502, 503, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/pipLine.ashx?id=" + npdid,
  },
  wellbore_exp: {
    entity_legend_name: "exploration wellbore",
    query_layer_id: [204],
    query_field: "wlbNpdidWellbore",
    out_fields: ["OBJECTID", "wlbNpdidWellbore", "wlbWellboreName"],
    visible_layers: [204, 503, 612, 614, 626, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/wlbExp.ashx?id=" + npdid,
  },
  wellbore_dev: {
    entity_legend_name: "development wellbore",
    query_layer_id: [205],
    query_field: "wlbNpdidWellbore",
    out_fields: ["OBJECTID", "wlbNpdidWellbore", "wlbWellboreName"],
    visible_layers: [205, 503, 612, 614, 626, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/wlbDev.ashx?id=" + npdid,
  },
  wellbore_other: {
    entity_legend_name: "development wellbore",
    query_layer_id: [206],
    query_field: "wlbNpdidWellbore",
    out_fields: ["OBJECTID", "wlbNpdidWellbore", "wlbWellboreName"],
    visible_layers: [206, 503, 612, 614, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/wlbOth.ashx?id=" + npdid,
  },
  baa: {
    entity_legend_name: "business arrangement area",
    query_layer_id: [606],
    query_field: "baaNpdidBsnsArrArea",
    out_fields: ["OBJECTID", "baaNpdidBsnsArrArea", "baaName"],
    visible_layers: [502, 503, 606, 612, 616, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/baa.ashx?id=" + npdid,
  },
  exl: {
    entity_legend_name: "CO2 licence (EL/EXL)",
    query_layer_id: [627],
    query_field: "baaNpdidBsnsArrArea",
    out_fields: ["OBJECTID", "baaNpdidBsnsArrArea", "baaName"],
    visible_layers: [502, 503, 627, 612, 616, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/ccsLic.ashx?id=" + npdid,
  },
  discovery: {
    entity_legend_name: "discovery",
    query_layer_id: [503],
    query_field: "dscNpdidDiscovery",
    out_fields: ["OBJECTID", "dscNpdidDiscovery", "dscName"],
    visible_layers: [502, 503, 612, 616, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/dsc.ashx?id=" + npdid,
  },
  survey: {
    entity_legend_name: "survey",
    //'query_layer_id': [403,404,405,406,407,409,410,411,412,413,415,416,417,418,419,421,422,423],
    query_field: "seaNpdidSurvey",
    // tj test edit for query task
    query_layer_id: [420],
    out_fields: ["OBJECTID", "seaNpdidSurvey", "seaName", "seaPolygonKind"],
    visible_layers: [502, 503, 606, 612, 616, 803, 804],
    map_client_path:
      factmaps_full_client_path + "redirect/sea.ashx?id=" + npdid,
  },
};

console.log(
  "Querying entity:",
  entity,
  " for npdid:",
  npdid,
  "",
  entity_and_layers[entity]
);

var map;
require([
  "dojo/dom",
  "dojo/dom-style",
  "esri/geometry/Extent",
  "esri/layers/ArcGISDynamicMapServiceLayer",
  "esri/layers/FeatureLayer",
  "esri/layers/GraphicsLayer",
  "esri/tasks/FindTask",
  "esri/tasks/FindParameters",
  "esri/tasks/query",
  "esri/tasks/QueryTask",
  "esri/symbols/SimpleMarkerSymbol",
  "esri/symbols/SimpleFillSymbol",
  "esri/symbols/SimpleLineSymbol",
  "esri/Color",
  "esri/renderers/SimpleRenderer",
  "esri/SpatialReference",
  "esri/dijit/HomeButton",
  "esri/map",
  "esri/dijit/Legend",
  "dojo/_base/array",
  "dojo/on",
  "dojo/domReady!",
], function (
  dom,
  domStyle,
  Extent,
  ArcGISDynamicMapServiceLayer,
  FeatureLayer,
  GraphicsLayer,
  FindTask,
  FindParameters,
  Query,
  QueryTask,
  SimpleMarkerSymbol,
  SimpleFillSymbol,
  SimpleLineSymbol,
  Color,
  SimpleRenderer,
  SpatialReference,
  HomeButton,
  Map,
  Legend,
  arrayUtils,
  on
) {
  if (entity == null || npdid == null) {
    showQueryError({
      name: "Missing query parameters.",
      message: "entity=null or npdid=null.",
    });
    window.stop();
  }
  var geometry_types_with_extent = ["polygon", "polyline"];

  var lyr_background = new ArcGISDynamicMapServiceLayer(url_lyr_background);
  lyr_background.setVisibleLayers(lyr_background_visibleLayers);

  var lyr_background2 = new ArcGISDynamicMapServiceLayer(url_lyr_background2);
  lyr_background2.name = "Area status";
  lyr_background2.setVisibleLayers(lyr_background2_visibleLayers);

  var lyr_base = new ArcGISDynamicMapServiceLayer(url_query_mapservice);
  lyr_base.name = "FactMaps";
  var lyr_base_visible_layers = entity_and_layers[entity]["visible_layers"];

  var lyr_graphics = new GraphicsLayer();
  lyr_graphics.on("mouse-over", function (layer) {
    console.log(layer);
  });

  var lyr_feature;

  var symbol_highlight_poly = new SimpleFillSymbol(
    SimpleFillSymbol.STYLE_SOLID,
    new SimpleLineSymbol(
      SimpleLineSymbol.STYLE_SOLID,
      new Color(highlight_color_rgba_ol),
      highlight_ol_width
    ),
    new Color(highlight_color_rgba)
  );

  var symbol_highlight_line = new SimpleLineSymbol(
    SimpleLineSymbol.STYLE_SOLID,
    new Color(highlight_color_rgba_ol),
    highlight_ol_width
  );

  var symbol_highlight_point = new SimpleMarkerSymbol(
    SimpleMarkerSymbol.STYLE_CIRCLE,
    14,
    new SimpleLineSymbol(
      SimpleLineSymbol.STYLE_SOLID,
      new Color(highlight_color_rgba_ol),
      highlight_ol_width
    ),
    new Color(highlight_color_rgba)
  );

  // tj edit for query task
  var url_query_mapservice_lyr =
    url_query_mapservice + "/" + entity_and_layers[entity]["query_layer_id"];

  var query_str = entity_and_layers[entity]["query_field"] + "=" + npdid;

  var query = new Query();
  var queryTask = new QueryTask(url_query_mapservice_lyr);
  query.where = query_str;
  query.returnGeometry = true;
  query.outFields = entity_and_layers[entity]["out_fields"];
  queryTask.execute(query, getResultFeatures, showQueryError);

  //Setting up FindTask with FindParameters
  /*var params = new FindParameters();
    var find = new FindTask(url_query_mapservice);
    params.layerIds = entity_and_layers[entity]['query_layer_id'];
    params.searchFields = [entity_and_layers[entity]['query_field']];
    params.searchText = npdid;
    params.returnGeometry = true;
    find.execute(params, showQueryResults, showQueryError);*/

  function getResultFeatures(featureSet) {
    //console.log(featureSet);

    if (entity == "survey") {
      var featureGeomType = arrayUtils.map(
        featureSet.features,
        function (feature, index) {
          return feature.attributes["seaPolygonKind"] == "2D linje"
            ? "line"
            : "poly";
        }
      );

      var has2DLine = contains(featureGeomType, "line");
      if (has2DLine === true && featureGeomType.length > 1) {
        featureToRemovePos = arrayUtils.indexOf(featureGeomType, "poly");
        featureSet.features.splice(featureToRemovePos[0], 1);
      }
    }

    // Set result feature to the same format as the output from FindTask.
    var results = [];
    for (i = 0; i < featureSet.features.length; i++) {
      var obj = {};
      obj["feature"] = featureSet.features[i];
      results.push(obj);
    }

    // Create a feature layer of selected features for display in legend.
    var featureCollection = {
      layerDefinition: null,
      featureSet: featureSet,
    };

    featureCollection.layerDefinition = {
      geometryType: featureSet.geometryType,
      objectIdField: entity_and_layers[entity]["out_fields"][0],
      fields: featureSet.fields,
    };

    lyr_feature = new FeatureLayer(featureCollection, {
      id: "Selected features",
    });
    if (featureSet.geometryType == "esriGeometryPolygon") {
      renderer = new SimpleRenderer(symbol_highlight_poly);
      renderer.label =
        featureSet.features[0].attributes[
          entity_and_layers[entity]["out_fields"][2]
        ];
    } else if (featureSet.geometryType == "esriGeometryPolyline") {
      renderer = new SimpleRenderer(symbol_highlight_line);
      renderer.label =
        featureSet.features[0].attributes[
          entity_and_layers[entity]["out_fields"][2]
        ];
    } else if (featureSet.geometryType == "esriGeometryPoint") {
      renderer = new SimpleRenderer(symbol_highlight_point);
      renderer.label =
        featureSet.features[0].attributes[
          entity_and_layers[entity]["out_fields"][2]
        ];
    }

    lyr_feature.setRenderer(renderer);
    lyr_feature.name =
      "Selected " + [entity_and_layers[entity]["entity_legend_name"]];

    showQueryResults(results);
  }

  function showQueryError(error) {
    var error_node = dom.byId("error");
    var map_node = dom.byId("map");
    var map_link_node = dom.byId("FactMapsText");
    var btnLegendOnOff = dom.byId("legendOnOffButton");
    console.log("showQueryError", error);
    domStyle.set(error_node, "display", "block");
    domStyle.set(map_node, "display", "none");
    domStyle.set(map_link_node, "display", "none");
    domStyle.set(btnLegendOnOff, "display", "none");
    dom.byId("error_name").innerHTML = error.name;
    dom.byId("error_message").innerHTML = error.message;
  }

  function showQueryResults(resultFeatures) {
    //console.log(resultFeatures);

    var total_extent;
    if (resultFeatures.length == 0) {
      showQueryError({
        name: "No results.",
        message:
          'No objects found with query "' +
          query.where +
          '" in entity "' +
          entity +
          '".',
      });
    }

    var graphics_list = [];
    var numFeaturesWOGeometry = 0;
    //Loop through each feature returned
    for (var i = 0, il = resultFeatures.length; i < il; i++) {
      //Get the current feature from the resultFeatures.
      var layerId = resultFeatures[i].layerId;
      var graphic = resultFeatures[i].feature;
      var geometry = graphic.geometry;
      var hasGeometry = true;
      if (!contains(lyr_base_visible_layers, layerId)) {
        lyr_base_visible_layers.push(layerId);
      }
      if (geometry.type == "polygon") {
        graphic.setSymbol(symbol_highlight_poly);
        if (geometry.rings.length == 0) {
          //showQueryError({"name": "Empty geometry", "message": 'The object has no geometry.'});
          numFeaturesWOGeometry = numFeaturesWOGeometry + 1;
          hasGeometry = false;
        }
      } else if (geometry.type == "polyline") {
        graphic.setSymbol(symbol_highlight_line);
        if (geometry.paths.length == 0) {
          //showQueryError({"name": "Empty geometry", "message": 'The object has no geometry.'});
          numFeaturesWOGeometry = numFeaturesWOGeometry + 1;
          hasGeometry = false;
        }
      } else if (geometry.type == "point") {
        graphic.setSymbol(symbol_highlight_point);
        if (geometry.x == null || geometry.y == null) {
          //showQueryError({"name": "Empty geometry", "message": 'The object has no geometry.'});
          numFeaturesWOGeometry = numFeaturesWOGeometry + 1;
          hasGeometry = false;
        }
      }

      if (hasGeometry === true) {
        if (contains(geometry_types_with_extent, geometry.type)) {
          var current_extent = geometry.getExtent();
          if (total_extent) {
            total_extent = total_extent.union(current_extent);
          } else {
            total_extent = new esri.geometry.Extent(current_extent);
          }
          //total_extent = total_extent.expand(query_result_extent_expand_factor);
        } else {
          total_extent = new Extent(
            geometry.x - 5000,
            geometry.y - 5000,
            geometry.x + 5000,
            geometry.y + 5000,
            new SpatialReference({ wkid: 23032 })
          );
          //total_extent = total_extent.expand(query_result_extent_expand_factor);
        }

        dom.byId("OpenGCClientButtonAnchor").href =
          entity_and_layers[entity]["map_client_path"];
        graphics_list.push(graphic);
      }
    }
    total_extent = total_extent.expand(query_result_extent_expand_factor);
    if (numFeaturesWOGeometry === resultFeatures.length) {
      showQueryError({
        name: "Empty geometry",
        message: "The object has no geometry.",
      });
    }
    map = new Map("map", {
      logo: false,
      extent: total_extent,
    });

    //				map.on("click", function(layer){
    //					console.log(layer);
    //				});
    if (hide_nav == "true") {
      map.on("load", function () {
        map.disablePan();
        map.hideZoomSlider();
        map.disableScrollWheel();
        map.disableRubberBandZoom();
      });
      var logo = document.getElementById("OpenGCClientButtonAnchor");
      logo.style.display = "none";

      var infoBase = document.getElementById("infoBase");
      infoBase.style.display = "none";
    }

    var btnLegendOnOff = dom.byId("legendOnOffButton");
    on(btnLegendOnOff, "click", function () {
      var nodeId = "legendBase";
      var currentVisibility = domStyle.get(nodeId, "display");
      var currentText = btnLegendOnOff.innerHTML;
      if (currentVisibility === "block") {
        domStyle.set(nodeId, "display", "none");
        btnLegendOnOff.innerHTML = currentText.replace("-", "+");
        domStyle.set("legendOnOffButton", "border-bottom-right-radius", "10px");
      } else {
        domStyle.set(nodeId, "display", "block");
        domStyle.set("legendOnOffButton", "border-bottom-right-radius", "0px");
        btnLegendOnOff.innerHTML = currentText.replace("+", "-");
      }
    });

    map.on("layers-add-result", function (evt) {
      console.log("Generating legend...");
      var layerInfo = arrayUtils.map(evt.layers, function (layer, index) {
        var o = {
          layer: layer.layer,
          title: layer.layer.name,
          index: index,
          id: layer.layer.id,
          //visible: arrayUtils.indexOf(legendUrls, layer.layer.url)
          visible:
            layer.layer.id == "Selected features"
              ? 99
              : arrayUtils.indexOf(legendUrls, layer.layer.url),
        };
        return o;
      });

      // Filtering to show legend only for the url_query_mapservice.
      // Change here to optialnally show legend for other map layers.
      var layerInfoFiltered = arrayUtils.filter(layerInfo, function (item) {
        return item.visible !== -1;
        //return item.visible == -1
      });

      if (layerInfo.length > 0) {
        var legendDijit = new Legend(
          {
            map: map,
            layerInfos: layerInfoFiltered,
            respectCurrentMapScale: true,
          },
          "legendDiv"
        );
        legendDijit.startup();
      }
    });

    if (hide_nav != "true") {
      var home = new HomeButton(
        {
          map: map,
        },
        "HomeButton"
      );
      home.startup();
    }
    for (var i = 0; i < graphics_list.length; i++) {
      lyr_graphics.add(graphics_list[i]);
    }

    map.addLayers([
      lyr_background,
      lyr_background2,
      lyr_base,
      lyr_graphics,
      lyr_feature,
    ]);
    lyr_base.setVisibleLayers(lyr_base_visible_layers);
  }
});
