// determine language
var lang_ext = '';
var substrStart = '9';
var seite = document.URL.match(/index\.php.+\?/); // confinements
if (!seite) // remaining portal
{
  seite = document.URL.match(/index\.html.+/);
  substrStart++;
}
if (seite)
{
  lang_ext = String(seite).substr(substrStart,3);
}

// define language variables for CeDiS request
if (lang_ext  == '.en')
{
  var locale = 'locale=en&';
  var titleAllText = 'show all results on &quot;Zwangsarbeit 1939 - 1945&quot;';
  var titleOneText = 'show result on &quot;Zwangsarbeit 1939 - 1945&quot;';
  var pluralText = 's';
  var resultText = ' result';
  var onText = 'on &quot;Zwangsarbeit 1939 - 1945&quot;';
  var languageText = ', language of interview: ';
  var translatedText = ', translated';
  var placeActionText = ', place of labour: ';
  var reqLang = 'en';
}
else
{
  var locale = '';
  var titleAllText = 'alle Ergebnisse auf &quot;Zwangsarbeit 1939 - 1945&quot; anzeigen';
  var titleOneText = 'Ergebnis auf &quot;Zwangsarbeit 1939 - 1945&quot; anzeigen';
  var pluralText = 'se';
  var resultText = ' Ergebnis';
  var onText = 'auf &quot;Zwangsarbeit 1939 - 1945&quot;';
  var languageText = ', Interviewsprache: ';
  var translatedText = ', &uuml;bersetzt';
  var placeActionText = ', Einsatzort: ';
  var reqLang = 'de';
}

// show/hide infos
function toggle_info(field_id, src_id)
{
  if (document.getElementById(field_id).className == 'infoHidden')
  {
    document.getElementById(field_id).className = 'infoBox';
    if (src_id)
    {
      document.getElementById(src_id).src = '/zwangsarbeit/images/arrow_block_down.gif';
    }
  }
  else
  {
    document.getElementById(field_id).className = 'infoHidden';
    if (src_id)
    {
      document.getElementById(src_id).src = '/zwangsarbeit/images/arrow_block_rightdown.gif';
    }
  }
}

function scrollbars(feature)
{
  if (feature.popup.size.h > 365)
  {
    feature.popup.contentDiv.style.overflow = 'scroll';
    feature.popup.contentDiv.style.height = '311px';
    feature.popup.contentDiv.style.width = '540px';
  }
}

// produce a popup for the marker
function addMarker(layer, lon, lat, name, popupContentHTML, marker, map, numberRecords) {
  var index = layer.markers.length;
  var ll = new OpenLayers.LonLat((lon), (lat));
  var feature = new OpenLayers.Feature(layer, ll); 
  cloned_Icon = icon.clone();

  feature.closeBox = true;
  feature.multiple = true;
  feature.data.popupContentHTML = '<h6>' + name + ':</h6>' + popupContentHTML;
  feature.popupClass = OpenLayers.Class(OpenLayers.Popup.FramedCloud);
  feature.data.overflow = 'hidden';

  // define individual callback function for each popup (jQuery can do this on the fly but it's buggy on old machines)
  fName = 'addToPopup' + index;
  eval ('var ' + fName + ';');
  window[fName] = function (data){
    markerIndex = index;
    if (data.results.length)
    {
      feature = markers.markers[markerIndex].feature;
      var plural = '';
      if (data.results.length != 1)
      {
        plural = pluralText;
      }
      popupExists = (feature.popup != null);
      popupShown = false;
      if (popupExists)
      {
        popupShown = feature.popup.visible();
        map.removePopup(feature.popup);
        feature.destroyPopup();
      }
      feature.data.overflow = 'hidden';
      feature.data.popupContentHTML += '<h6 class="fub"><a class="external" href="http://zwangsarbeit-archiv.de/archiv/webservice/ortssuche.html' + locale + '?location=' + name + '&longitude=' + lon + '&latitude=' + lat + '" title="' + titleAllText + '">' + data.results.length + resultText + plural + '</a> ' + onText + ':</h6>';

      for (i=0; i<data.results.length; i++)
      {
        feature.data.popupContentHTML += '<a class="external indent" href="http://zwangsarbeit-archiv.de/archiv/webservice/ortssuche.html?' + locale + 'location=' + name + '&longitude=' + lon + '&latitude=' + lat + '#' + data.results[i].interviewId + '" title="' + titleOneText + '">Interview ' + data.results[i].interviewId + ', ' + data.results[i].interviewee + ', ' + data.results[i].experienceGroup + languageText + data.results[i].language;
        if (data.results[i].translated)
        {
          feature.data.popupContentHTML += translatedText;
        }
        feature.data.popupContentHTML += placeActionText + data.results[i].location + '</a>';
      }

      feature.popupClass = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {size: new OpenLayers.Size(581, 0)});
      if (popupExists)
      {
        feature.popup = markers.markers[index].feature.createPopup(true);
        feature.popup.getContentDivPadding().left = 5;
        feature.popup.getContentDivPadding().right = 5;
        feature.popup.getContentDivPadding().top = 5;
        feature.popup.getContentDivPadding().bottom = 5;
        feature.popup.padding = 5;
        map.addPopup(feature.popup, false);
        if (popupShown)
        {
          feature.popup.show();
          scrollbars(feature);
        }
      }
    }
  }

  // send CEDIS web service request
  $.getJSON('https://zwangsarbeit-archiv.de/archiv/webservice/ortssuche.js?location=' + name + '&longitude=' + lon + '&latitude=' + lat + 'language' + reqLang+ '&callback=?', window[fName]);

  // create marker
  var marker = new OpenLayers.Marker(ll, cloned_Icon);
  marker.feature = feature;

  onMarkerClick = function (event) 
  {
    if (this.popup == null) // create popup on click
    {
      this.popup = this.createPopup(true);
      this.popup.getContentDivPadding().left = 5;
      this.popup.getContentDivPadding().right = 5;
      this.popup.getContentDivPadding().top = 5;
      this.popup.getContentDivPadding().bottom = 5;
      this.popup.padding = 5;
      map.addPopup(this.popup, false);
      this.popup.show();
    }
    else // toggle existing popup 
    {
      this.popup.contentDiv.style.overflow = 'hidden';
      this.popup.updateSize();
      this.popup.toggle();
    }

    scrollbars(this);
    OpenLayers.Event.stop(event);
  }; 
  marker.events.register('click', feature, onMarkerClick);   
  layer.addMarker(marker);
}

// set markers for confinements
function mark_confinements(confinement, icon)
{
  cloned_Icon = icon.clone();
  unique_markers = new Array(); 
  
  // combine flags for same places
  for (var k = 0; k < confinement.length; k++)
  {
    if (confinement[k][1] > 0)
    {
      unique_markers.push(new Array(confinement[k]));
      for (var j = k + 1; j < confinement.length; j++)
      {
      // criterion: identical coordinates
        if ((confinement[k][0] != 0) && (confinement[k][1] != 0) && (confinement[k][0] == confinement[j][0]) && (confinement[k][1] == confinement[j][1]))
        {
          unique_markers[unique_markers.length-1].push(confinement[j]);
          confinement[j][1] = -confinement[j][1];
        }
      }
    }
  }

  // create popupContentHTML
  for (var i = 0; i < unique_markers.length; i++)
  {
    marker = new OpenLayers.Marker(new OpenLayers.LonLat(unique_markers[i][0][0], unique_markers[i][0][1]), cloned_Icon);
    marker.setOpacity(1);
    if (unique_markers[i][0][4] != '')
    {
      name = unique_markers[i][0][4];
    }
    else
    {
      if (lang_ext == '.en'){
        name = 'location name unknown';
      }
      else{
        name = 'Ortsname unbekannt';
      }
    }
    popupContentHTML = '';
    numberRecords=0;
    for (var l = 0; l < unique_markers[i].length; l++)
    {
      popupContentHTML = popupContentHTML + '<a class="intern" href="/zwangsarbeit/haftstaetten/index.php?action=2.2&id=' + unique_markers[i][l][3] + '">' + unique_markers[i][l][2] + '</a>';
      numberRecords++;
    }
    addMarker(markers, unique_markers[i][0][0], unique_markers[i][0][1], name, popupContentHTML, marker, map, numberRecords);
  }
}

// determine marker position
function choose_markers(zoomlevel)
{
  toplevel = zoomlevel - 2;
  for (var i = 0; i < geo_places.length; i++)
  {
    if (geo_places[i][3] < toplevel)
    {
      numberRecords='';
      cloned_Icon= icon.clone();
      marker = new OpenLayers.Marker(new OpenLayers.LonLat(geo_places[i][0], geo_places[i][1]), cloned_Icon);
      marker.setOpacity(1);
      name = geo_places[i][2];

      // if same location name, add link to popupContentHTML
      popupContentHTML = '';
      for (j = 0; j < geo_data.length; j++)
      {
         if (geo_data[j][2] == geo_places[i][2])
         {
           popupContentHTML = popupContentHTML + '<a href="/zwangsarbeit/archiv/archivdaten/index.html?id=' + geo_data[j][0] + keyword + toggle + stype +'">'+geo_data[j][1]+'</a>';
           numberRecords++;
         }
      }
      addMarker(markers, geo_places[i][0], geo_places[i][1], name, popupContentHTML, marker, map, numberRecords)
    }
  }
}

// set markers
function displayZoom()
{
  var i = 0;
  var j = 0;

  zoomgrad = map.getZoom(); 
  if (zoomgrad < 4)
  {
   zoomgrad = 4;
  }

  markers = new OpenLayers.Layer.Markers('Markers');   
  map.addLayer(markers);   
  markers.setVisibility(true);

  var size = new OpenLayers.Size(12,16);
  var offset = new OpenLayers.Pixel(-size.w/2-2, -size.h);
  icon = new OpenLayers.Icon('../images/flag_yellow.png',size,offset);  

  keyword = '&keyword=' + this.fulltext;
  toggle = '&toggle=1';
  stype = '&s_type=string';

  if (fulltext != '' || place != '')
  {
    if (geo_places.length > 1)
    {
      zoomgrad = 5;
    }
    choose_markers(6);
  }
  else
  {  
    choose_markers(zoomgrad);
  }

  map.zoomTo(zoomgrad);

  // zoom out further if needed to show all flags
  if (typeof area != 'undefined')
  {
    if ((area.getWidth()*1.05 > map.getExtent().getWidth()) ||(area.getHeight()*1.1 > map.getExtent().getHeight()))
    {
      map.zoomToExtent(new OpenLayers.Bounds(0,0,area.getWidth()*1.05, area.getHeight()*1.1));
      map.setCenter(area.getCenterLonLat());
    }
  }

  if (typeof confinement != 'undefined')
  {
    mark_confinements(confinement, icon);
  }
}

// change Zoom
function displayAfterZoom()
{
  var i = 0;
  var j = 0;

  places_len = geo_places.length;
  data_len = geo_data.length;

  zoomgrad = map.getZoom();

  if (markers)
  {
    markers.destroy();
  }
  markers = new OpenLayers.Layer.Markers( "Markers" );

  map.addLayer(markers);
  markers.setVisibility(true);

  var size = new OpenLayers.Size(12,16);
  var offset = new OpenLayers.Pixel(-size.w / 2, -size.h);
  var lonlat = map.getLonLatFromPixel(offset);
  icon = new OpenLayers.Icon('../images/flag_yellow.png',size,offset);

  keyword = "&keyword=" + this.fulltext;
  toggle = "&toggle=1";
  stype = "&s_type=string";

  if (zoomgrad < 4)
  {
    zoomgrad = 4;
  }
  map.zoomTo(zoomgrad);

  if ( (fulltext != "")  || (place != "") )
  {
    choose_markers(6);
  }
  else
  {
    choose_markers(zoomgrad);
  }
  if (typeof confinement != "undefined")
  {
    mark_confinements(confinement, icon);
  }
}

function init_geo(lon, lat)
{
  // set default values for map center if not passed
  if (typeof lon == 'undefined')
  {
    var lon = 13;
  }
  if (typeof lat == 'undefined')
  {
    var lat = 51;
  }
  var i = 0;
  var j = 0;
  var numberRecords;
  var popupContentHTML = '';

  // define map and controls
  var navControl = new OpenLayers.Control.Navigation(); 
  var panzoom = new OpenLayers.Control.PanZoomBar();
  panzoom.zoomWorldIcon = false;
  var pan =  new OpenLayers.Control.PanZoom();
  var mousePos = new OpenLayers.Control.MousePosition();

  var map = new OpenLayers.Map('map', {resolution: 1.40625, center: new OpenLayers.LonLat(lon, lat), numZoomLevels: 6}, {controls: [new OpenLayers.Control.Attribution(), navControl, mousePos, panzoom]});
  var markers = new OpenLayers.Layer.Markers('Markers');

  // define wms map
  var wms = new OpenLayers.Layer.WMS('OpenLayers WMS', 'http://www.bundesarchiv.de/cgi-bin/mapserv.sh?map=/depot/www/htdocs/mapserver/mapdatei.map', {layers: 'countries,bld,frankreich,niederlande,belgien,polen,tschechien,oestereich,estland,lettland,litauen,russland,belarus,ukraine,staedte,bund,bund_first', format: 'image/gif'}, {isBaseLayer: 'True', transistionEffect: 'resize', wrapDateLine: 'True', numZoomLevels:9, projection: new OpenLayers.Projection('EPSG:4326')});

  map.addLayers([wms]); 
  this.map = map;

  // show map    
  displayZoom();

  // show map again after zooming
  map.events.register('zoomend', null, displayAfterZoom);

  // remove world button and reposition zoom out button
  var sz = new OpenLayers.Size(18, 18);
  var centered = map.controls[1].position.clone();
  centered.x = centered.x + sz.w / 2;
  centered.y = centered.x + 4 * sz.h - 4;
  map.controls[1]._removeButton(map.controls[1].buttons[6]);
  map.controls[1]._removeButton(map.controls[1].buttons[5]);
  map.controls[1]._addButton('zoomout', 'zoom-minus-mini.png', centered, sz);
}

