var schultypen = [];
var markers    = [];
var gmap2;
var lists      = ["schools", "partners", "projects"];

function initialize() {
  var map = document.getElementById("map");
  if (GBrowserIsCompatible()) {
    var gmap = new GMap2(map);
    gmap.addControl(new GSmallMapControl());
    gmap.setCenter (new GLatLng(48.955844, 13.1021263), 6);
    gmap.enableContinuousZoom();
    gmap.enableScrollWheelZoom();
    
    return gmap;
  } else {
    alert(de_en("Ihr Browser unterstützt leider die Verwendung von Google Maps nicht.", "Sorry, your browser cannot handle Google Maps"));
    return false;
  }
}

/* (Un)-Load */
window.onunload = GUnload;

$(function() {
  gmap2 = initialize();
  load(gmap2, true, true, true, "");
  if ($(".map_changer").size() > 0) {
    $(".map_changer").click(function() {
      gmap2.clearOverlays();
      load(gmap2, $("#chk-projects").attr("checked"), $("#chk-partners").attr("checked"), $("#chk-schools").attr("checked"), $("#schultypen").val());
    });
  }
});

/* Google Maps Funktionalitäten */
function load(gmap, show_projects, show_partners, show_schools, school_type) {
  GDownloadUrl("/dbproxy.php?path=" + escape("geo/?project_id=" + project_id + "&lang=" + lang + "&bereich=" + bereich + "&date=" + new Date()), function(data, responseCode) {
    clearLists(); 
    parseJson(gmap, data, show_projects, show_partners, show_schools, school_type);
    fitMap(gmap, markers);
    if (project_id == "" && $("#schultypen")[0].options.length == 1) { setSchoolTypes(); }
    if (project_id == "") {
      $(lists).each(function(list) {
        makeListCollapsible(lists[list]); 
        toggleList(lists[list]);
      });
    }
    setStatistics();
  });
}

function parseJson(gmap, doc, show_projects, show_partners, show_schools, school_type) {
  markers = [];
  var jsonData = eval("(" + doc + ")");
  
  if (show_projects) {
    for(var i = 0; i < jsonData.projects.length; i++) {
      var marker = createMarker(jsonData.projects[i], "project");
      gmap.addOverlay(marker);
      markers.push(marker);
    }
  }
  
  if (show_partners) {
    for(i = 0; i < jsonData.partners.length; i++) {
      var marker = createMarker(jsonData.partners[i], "partner");
      gmap.addOverlay(marker);
      if (project_id != "" || jsonData.partners[i].staat == "" || jsonData.partners[i].staat == "Österreich" || jsonData.partners[i].staat == undefined) {
        markers.push(marker);
      }
    }
  }

  if (show_schools) {
    for(i = 0; i < jsonData.schools.length; i++) {
      if (school_type == "" || (school_type != "" && jsonData.schools[i].typ == school_type)) {
        var marker = createMarker(jsonData.schools[i], "school");
        gmap.addOverlay(marker);
        if (project_id != "" || jsonData.schools[i].staat == "" || jsonData.schools[i].staat == "Österreich" || jsonData.schools[i].staat == undefined) {
          markers.push(marker);
        }
      }
    }
  }
}

function makeIcon(type) {
  var icon = new GIcon();
  icon.image = "/_img/marker-" + type + "-small.png";
  icon.iconSize = new GSize(13, 22);
  icon.iconAnchor = new GPoint(8, 16);
  icon.infoWindowAnchor = new GPoint(8, 1);	
  return icon;
}

function createMarker(item, type) {
  /* Marker erstellen */
  var marker = new GMarker(new GLatLng(item.lat, item.lng), makeIcon(type));

  /* Eventlistener hinzufügen */
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(createHtmlGrid(item, type));
  });

  /* Schultyp zu Array hinzufügen */
  if (type == "school" && $.inArray(item.typ, schultypen) == -1) { schultypen.push(item.typ); }
  
  /* Objekt zu passender Liste unter Map hinzufügen */
  $("#" + type + 's-list').append(createSidebarEntry(marker, item.name, item.strasse + ", " + item.plz + " " + item.ort));

  return marker;
}

function fitMap(gmap, markers) {
   var bounds = new GLatLngBounds();
   for (var i=0; i< markers.length; i++) {
     bounds.extend(markers[i].getPoint());
   }
   gmap.setZoom(gmap.getBoundsZoomLevel(bounds) - ((project_id != '' || bereich == 'schulforschung') ? 1 : 0));
   gmap.setCenter(bounds.getCenter());
}

function createSidebarEntry(marker, name, address) {
  /* adaptiert von http://code.google.com/intl/en/apis/maps/articles/phpsqlsearch.html */
  var div = document.createElement('li');
  var html = name;
  if (project_id != "") { html += "<br>(" + address + ")"; }
  $(div).html(html);
  GEvent.addDomListener(div, 'click', function() {
    GEvent.trigger(marker, 'click');
    mapOffset = $("#map").offset();
    window.scrollTo(mapOffset.left, mapOffset.top - 5);
  });
  return div;
}

/* Private Methoden */

function de_en(german, english) {
  return (lang == "de") ? german : english;
}

function makeListCollapsible(list) {
  var h4 = $("#" + list + "-div h4");
  var link = "<a href=\"#\" onclick=\"toggleList('" + list + "'); return false;\" class='open'>" + $(h4).text() + "</a>";
  $(h4).empty().append(link);
}

function toggleList(list) {
  $("#" + list + "-div a").toggleClass("open");
  $("#" + list + "-div .list-toggle-info").toggle();
  $("#" + list + "-list").toggle();
}

/* UI Stuff */

function setStatistics() {
  $(lists).each(function(list) {
    var items = $("#" + lists[list] + "-list li").size();
    var orig  = $("#" + lists[list] + "-div h4").attr("title");
    var name  = orig + "&nbsp;(" + items + ")";
    var link  = " <a href=\"#\" onclick=\"toggleList('" + lists[list] + "'); return false;\">" + name + "</a>";
    $("#" + lists[list] + "-div h4").empty().append(link);
  });
}

function clearLists() {
  $(lists).each(function(list) {
    $("#" + lists[list] + "-list li").remove();
  });
}

function setSchoolTypes() {
  $(schultypen).each(function(typ) {
    if (schultypen[typ] != "") { $("#schultypen").append('<option>' + schultypen[typ] + '</option>'); }
  });
}

function createHtmlGrid(item, type) {
  var html  = "<div class=\"marker " + type + "\"  style='max-width: 300px;'>";
  if (project_id == "") {
    html     += "<h4 class=\"first\">" + de_en("Projekttitel", "Project name") + "</h4><h3><a href='/" + item.project_id + "?lang=" + lang + "'>" + item.kurztitel + "</a> (<a href='/" + item.project_id + "?lang=" + lang + "&page=map'>" + de_en("Kartenansicht", "Map") + "</a>)</h3>";
  }
  
  switch(type) {
    case "project":
      html += createProject(item);
      break;
    case "school":
      html += createSchool(item);
      break;
    case "partner":
      html += createPartner(item);
      break;
  }
  html     += "</div>";
  return html;
}

function createProject(item) {
  var html  = "<h4>" + de_en("Projektleitung", "Project office") + " ";
  html     += ((item.status == "gefördert") ? "Forschungsprojekt" : "Schulforschungsprojekt") + " ";
  html     += "(" + ((item.ausschreibung == 0) ? de_en("Pionierprojekt", "Pioneering project") : item.ausschreibung + ".&nbsp;" + de_en("Ausschreibung", "Call")) + ")";
  html     += "</h4>";
  html     += "<p>" + item.name + "<br>";
  html     += item.strasse + "<br>" + item.plz + " " + item.ort + "</p>";
  html     += createContactDetails(item);
  return html;
}

function createSchool(item) {
  var html  = "<h4>" + de_en("Beteiligte Schule", "School") + " ";
  html     += ((item.status == "gefördert") ? "Forschungsprojekt" : "Schulforschungsprojekt") + " ";
  html     += "(" + ((item.ausschreibung == 0) ? de_en("Pionierprojekt", "Pioneering project") : item.ausschreibung + ".&nbsp;" + de_en("Ausschreibung", "Call")) + ")";
  html     += "</h4>";
  html     += "<p>" + item.name + " (" + item.typ + ")<br>";
  html     += item.strasse + "<br>" + item.plz + " " + item.ort + "</p>";
  html     += createContactDetails(item);
  return html;
}

function createPartner(item) {
  var html  = "<h4>" + item.bereich + " ";
  html     += ((item.status == "gefördert") ? "Forschungsprojekt" : "Schulforschungsprojekt") + " ";
  html     += "(" + ((item.ausschreibung == 0) ? de_en("Pionierprojekt", "Pioneering project") : item.ausschreibung + ".&nbsp;" + de_en("Ausschreibung", "Call")) + ")";
  html     += "</h4>";
  html     += "<p>" + item.name + "<br>";
  html     += item.strasse + "<br>" + item.plz + " " + item.ort + "</p>";
  html     += createContactDetails(item);
  return html;
}

function createContactDetails(item) {
  if (item.tel == "" && item.homepage == "") { return ""; }

  var html = "<h4>" + de_en("Kontaktinformationen", "Contact information") + "</h4>";
  html    += "<p class='last'>";
  if (item.tel != "")      { html += "Tel: " + item.tel + "<br>"; }
  if (item.homepage != "") { html += "Web: <a href='http://" + item.homepage + "' target='_blank'>" + item.homepage + "</a>"; }
  html    += "</p>";
  return html;
}
