//
// Jacilla Map Library
//

var map;
var basis;
var basisMap;
var satelliteMap;
var popups = new Array();
var popupDests = new Array();
var tracks;

function viewTrackMap(token, trackName, trackTypeCategory) { // Uses global variavle trackName
  var client = new AjaxService('/legacy-rpc', 'RemoteService');
  t = eval(client.invoke('getTrackByName', [token, trackName]));
  tracks = eval(client.invoke('getTracksWithTrackPointsForDestination', [token, new String(t.destinationId), trackTypeCategory]));
  
  map = createMap();
  bb = new GLatLngBounds(new GLatLng(t.bbullat, t.bbullng), new GLatLng(t.bbbrlat, t.bbbrlng));
  map.setCenter(bb.getCenter(), map.getBoundsZoomLevel(bb));

  var currentTrackIdx = -1;
  for(i=0;i<tracks.length;i++) {
    if(tracks[i].name==t.name) {
      currentTrackIdx = i;
    } else {
      tps = tracks[i].trackPoints;
      tpList = new Array();
      for(n=0;n<tps.length;n++) {
        tpList.push(new GLatLng(tps[n].lat, tps[n].lng));
      }
      map.addOverlay(new GPolyline(tpList, "#999999", 3, 1));
      tpList.length = 0;
    }
  }

  // Draw the hightlighted track
  lastLat = -1;
  lastLng = -1;
  tpList = new Array();
  tps = tracks[currentTrackIdx].trackPoints;
  lastCategory = tps[0].category;
  for(n=0;n<tps.length;n++) {
    if(tps[n].category == lastCategory) {
      tpList.push(new GLatLng(tps[n].lat, tps[n].lng));
      lastLat = tps[n].lat;
      lastLng = tps[n].lng
    } else {
      map.addOverlay(new GPolyline(tpList, getColorForCategory(trackTypeCategory, lastCategory), 4, 1));
      tpList.length = 0;
      tpList.push(new GLatLng(lastLat, lastLng));
      tpList.push(new GLatLng(tps[n].lat, tps[n].lng));
      lastCategory = tps[n].category;
    }
  }
  map.addOverlay(new GPolyline(tpList, getColorForCategory(trackTypeCategory, lastCategory), 4, 1));
  tpList.length = 0;

  startIcon = createBaseIcon();
  startIcon.image = "http://static.skisporet.no/images/control_play_blue.png";
  startIcon.shadow = "http://static.skisporet.no/images/shadow.png";
  startIcon.shadowSize = new GSize(24, 16 );
  startMarker = createMarker(new GLatLng(tps[0].lat, tps[0].lng), startIcon, "Start", "Start på løype");
  map.addOverlay(startMarker);
  sluttIcon = createBaseIcon();
  sluttIcon.image = "http://static.skisporet.no/images/control_stop_blue.png";
  sluttIcon.shadow = "http://static.skisporet.no/images/shadow.png";
  sluttIcon.shadowSize = new GSize(24, 16 );
  sluttMarker = createMarker(new GLatLng(tps[tps.length-1].lat, tps[tps.length-1].lng), sluttIcon, "Slutt", "Slutt på løype");
  map.addOverlay(sluttMarker);

  if(trackTypeCategory==0) {
    addVehiclesToMap(eval(client.invoke('getVehiclesForDestination', [token, new String(t.destinationId)])), map);
  }
}

function viewDestinationMap(token, destinationName, trackTypeCategory) {
  var client = new AjaxService('/legacy-rpc', 'RemoteService');
  var dresult = client.invoke('getDestinationByName', [token, destinationName]);
  d = eval(dresult);

  map = createMap();
  bb = new GLatLngBounds(new GLatLng(d.bbullat, d.bbullng), new GLatLng(d.bbbrlat, d.bbbrlng));
  map.setCenter(bb.getCenter(), map.getBoundsZoomLevel(bb));

  tracks = eval(client.invoke('getTracksWithTrackPointsForDestination', [token, new String(d.id), trackTypeCategory]));
  lastLat = -1;
  lastLng = -1;
  tpList = new Array();
  for(i=0;i<tracks.length;i++) {
    tps = tracks[i].trackPoints;
    lastCategory = tps[0].category;
    for(n=0;n<tps.length;n++) {
      if(tps[n].category == lastCategory) {
        tpList.push(new GLatLng(tps[n].lat, tps[n].lng));
        lastLat = tps[n].lat;
        lastLng = tps[n].lng;
      } else {
//        line = new BDCCPolyline(tpList, getColorForCategory(trackTypeCategory, lastCategory), 4, 1, tracks[i].name, "solid");
//        GEvent.addListener(line, "click", function() {
//          location.href=(location.href+"/"+escape(this.tooltip)); // tooltip is a local variable in BDCCPolyline that holds the name of the track
//        });
        line = new GPolyline(tpList, getColorForCategory(trackTypeCategory, lastCategory), 4, 1);
        map.addOverlay(line);
        tpList.length = 0;
        tpList.push(new GLatLng(lastLat, lastLng));
        tpList.push(new GLatLng(tps[n].lat, tps[n].lng));
        lastCategory = tps[n].category;
      }
    }
//    line = new BDCCPolyline(tpList, getColorForCategory(trackTypeCategory, lastCategory), 4, 1, tracks[i].name, "solid");
//    GEvent.addListener(line, "click", function() {
//      location.href=(location.href+"/"+escape(this.tooltip)); // tooltip is a local variable in BDCCPolyline that holds the name of the track
//    });
    line = new GPolyline(tpList, getColorForCategory(trackTypeCategory, lastCategory), 4, 1);
    map.addOverlay(line);
    // map.addOverlay(new BDCCPolyline(tpList, getColorForCategory(trackTypeCategory, lastCategory), 4, 1, tracks[i].name, "solid")); //tracks[i].strokeWidth, 1.0));
    tpList.length = 0;
  }

  addPoisToMap(eval(client.invoke('getPOIsForDestination', [token, new String(d.id)])), map);

  if(trackTypeCategory==0) {
    addVehiclesToMap(eval(client.invoke('getVehiclesForDestination', [token, new String(d.id)])), map);
  }
}


function addVehiclesToMap(vehicles, map) {
  for(n=0;n<vehicles.length;n++) {
    v = vehicles[n];
    marker = createMarker(
      new GLatLng(v.lat, v.lng),
      createIcon( {
        width: 16,
        height: 16,
        anchorX: 8,
        anchorY: 8,
        infoWindowAnchorX: 7,
        infoWindowAnchorY: 0,
        url: createVehicleIconUrl(v),
        shadowUrl: "http://static.skisporet.no/images/shadow.png",
        shadowWidth: 24,
        shadowHeight: 16 
      } ),
      v.name,
      createVehicleHtml(v)  
    );
    map.addOverlay(marker);
  }
}

function createVehicleIconUrl(v) {
  d = new Date();
  d.setTime(v.lastUpdateTimestamp*1000);
  if(vehicleInMotion(d)) {
    return "http://static.skisporet.no/images/lorry.gif";
  } else {
    return "http://static.skisporet.no/images/lorry_flatbed.png";
  }
}

function createVehicleHtml(v) {
  d = new Date();
  d.setTime(v.lastUpdateTimestamp*1000);
  s = "<p><h1>"+v.name+"</h1>Status : ";
  if(vehicleInMotion(d)) {
    s=s+"Maskin i bevegelse<br/>Hastighet : "+v.speed.toFixed(2)+" km/t<br/>";
  } else {
    s=s+"Maskin er stanset<br/>";
  }
  s=s+"Høyde : "+v.altitude.toFixed(0)+" moh<br/>";
  if(v.name.substr(0,1)!=".") {
    s=s+"Siste oppdatering : "+d.toLocaleString();
  }
  s=s+"</p>";
  return s;
}

function vehicleInMotion(date) {
  now = new Date().getTime();
  then = date.getTime();
  return ((now-then)<=1000*60*5); // 5 minutes
}

function addPoisToMap(pois, map) {
  for(n=0;n<pois.length;n++) {
    poi = pois[n];
    html = "<h1>"+poi.name+"</h1><p>"+poi.description+"</p>";
    if(poi.targetUrl!=null) {
      html+="<p><a href='"+poi.targetUrl+"'>"+poi.name+"</a></p>";
    }
    marker = createMarker(new GLatLng(poi.lat, poi.lng), createIcon(poi.icon), poi.name, html);
    map.addOverlay(marker);
  } 
}

function createMarker(point, icon, title, html) {
  marker = new GMarker(point, { icon: icon, title: title, clickable: true, draggable: false });
  GEvent.addListener(marker, "click", function() {
    this.openInfoWindowHtml(html);
  });
  return marker;
}

function createIcon(i) {
//  var b = new GIcon();
  var b = createBaseIcon();
//  b.iconSize = new GSize(i.width, i.height);
//  b.iconAnchor = new GPoint(i.anchorX, i.anchorY);
//  b.infoWindowAnchor = new GPoint(i.infoWindowAnchorX, i.infoWindowAnchorY);
  b.image = i.url;
//  if(i.shadowUrl!=null) {
//    b.shadow = i.shadowUrl;
//    b.shadowSize = new GSize(i.shadowWidth, i.shadowHeight);
//  }
  return b;
}

function viewCountyMap(token, countryCode, countyName, trackTypeCategory) {
  var client = new AjaxService('/legacy-rpc', 'RemoteService');
  var result = client.invoke('getDestinationsForCounty', [token, countryCode, countyName, trackTypeCategory]);
  var county = eval(result);

  map = createMap();
  bb = new GLatLngBounds(new GLatLng(county.bbullat, county.bbullng), new GLatLng(county.bbbrlat, county.bbbrlng));
  map.setCenter(bb.getCenter(), map.getBoundsZoomLevel(bb));

  var baseIcon = createBaseIcon();
  destinationList = county.destinations;
  for(i=0;i<destinationList.length;i++) {
    destination = destinationList[i];
    point = new GLatLng(destination["lat"], destination["lng"]);
    icon = new GIcon(baseIcon);
    icon.image = "/icons/flag_"+getColorNameForCategory(trackTypeCategory, destination["lastTrackUpdateCategory"])+".png";
    marker = new GMarker(point, {icon:icon, title:destination["name"]});
    marker.destinationName = destination["name"];
    marker.countyName = countyName;
    marker.countryCode = countryCode;
    map.addOverlay(marker);
  }

  GEvent.addListener(map, "click", function(marker, point) {
    if(marker) {
      location.pathname = "/"+escape(marker.countryCode.toLowerCase())+"/"+escape(marker.countyName.toLowerCase())+"/"+escape(marker.destinationName.toLowerCase());
    }
  });

}

function viewCountryMap(token, countryCode, trackTypeCategory) { 
  var client = new AjaxService('/legacy-rpc', 'RemoteService');
  var result = client.invoke('getDestinationsForCountry', [token, countryCode, trackTypeCategory]);
  var obj = eval(result);

  map = createMap();
  bb = new GLatLngBounds(new GLatLng(59.0, 5.0), new GLatLng(69.1, 14.0)); 
  map.setCenter(bb.getCenter(), map.getBoundsZoomLevel(bb)); 

  var baseIcon = createBaseIcon();
  for(fylkesNavn in obj) {
    destinationList = obj[fylkesNavn];
    for(i=0;i<destinationList.length;i++) {
      destination = destinationList[i];
      point = new GLatLng(destination["lat"], destination["lng"]);
      icon = new GIcon(baseIcon);
      icon.image = "/icons/flag_"+getColorNameForCategory(trackTypeCategory, destination["lastTrackUpdateCategory"])+".png";
      marker = new GMarker(point, {icon:icon, title:destination["name"]});
      marker.destinationName = destination["name"];
      marker.countyName = fylkesNavn;
      marker.countryCode = countryCode;
      map.addOverlay(marker);
    }
  }

  GEvent.addListener(map, "click", function(marker, point) {
    if(marker) {
      location.pathname = "/"+escape(marker.countryCode.toLowerCase())+"/"+escape(marker.countyName.toLowerCase())+"/"+escape(marker.destinationName.toLowerCase());
    }
  });

}

function createBaseIcon() {
  var b = new GIcon();
  b.iconSize = new GSize(16, 16);
  b.iconAnchor = new GPoint(8, 16);
  b.infoWindowAnchor = new GPoint(8, 2);
  return b;
}

function createMap() {
  m = new GMap2(document.getElementById("mapDiv"));
  document.getElementById("mapDiv").style.backgroundColor="#97c9ff";

  copyCollection = new GCopyrightCollection('Norge');
  copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, " ©2006-2008 Jacilla.no");
  copyCollection.addCopyright(copyright);

  basis = new GTileLayer(copyCollection, 1, 17);
  basis.myLayers='world_f,N5000_land_f,N5000_areal_f,N5000_vann_f,N5000_vann_l,N5000_fylke_f,N5000_komm_f,N250_arealdekke_f,N250_admin_omr_l,N250_hoyde_l,N250_bekk_l,N250_veg_l,N250_bane_l,N250_stedsnavn_p,N50_markslag_f,N50_statsallmenning_f,N50_grunnrissbygg_f,N50_vann_f,N50_vann_l,N50_bekk_l,N50_admin_omr_l,N50_hoydekurve_l,N50_veg_l,N50_bane_l,N50_anlegg_l,N50_bygg_p,N50_hoydepunkt_p,N50_stedsnavn_p';
  basis.myFormat='image/png';
  basis.myBaseURL='metis.jacilla.com/wms?';
  basis.getTileUrl=CustomGetTileUrl;
  basis.getOpacity = function() { return 1.0; }

  basisMap = new GMapType([basis], G_NORMAL_MAP.getProjection(), "Norge", G_SATELLITE_MAP);
  satelliteMap = new GMapType([G_SATELLITE_MAP.getTileLayers()[0]], G_SATELLITE_MAP.getProjection(), "Satelitt", G_SATELLITE_MAP);
  terrainMap = new GMapType([G_PHYSICAL_MAP.getTileLayers()[0]], G_PHYSICAL_MAP.getProjection(), "Terreng", G_PHYSICAL_MAP);

  //m.getMapTypes().length = 0;
  m.removeMapType(G_NORMAL_MAP);
  m.addMapType(basisMap);
  m.removeMapType(G_SATELLITE_MAP);
  m.addMapType(satelliteMap);
  m.removeMapType(G_HYBRID_MAP);
  m.addMapType(terrainMap);

  m.addControl(new GLargeMapControl());
  m.addControl(new GMapTypeControl());
  m.addControl(new GScaleControl());

  return m;
}

function createJacillaLayer() {
  return new OpenLayers.Layer.WMS("Basiskart", "http://metis.jacilla.com/cgi-bin/wms3", {layers: 'world_f,N5000_land_f,N5000_areal_f,N5000_vann_f,N5000_vann_l,N5000_fylke_f,N5000_komm_f,N250_arealdekke_f,N250_admin_omr_l,N250_hoyde_l,N250_bekk_l,N250_veg_l,N250_bane_l,N250_stedsnavn_p,N50_markslag_f,N50_statsallmenning_f,N50_grunnrissbygg_f,N50_vann_f,N50_vann_l,N50_bekk_l,N50_admin_omr_l,N50_hoydekurve_l,N50_veg_l,N50_bane_l,N50_anlegg_l,N50_bygg_p,N50_hoydepunkt_p,N50_stedsnavn_p', format: 'image/png', transparent: "true" } );
}

function createSkiforeLayer() {
  return new OpenLayers.Layer.WMS("SkifÃ¸re", "http://metis.jacilla.com/cgi-bin/wms3", {layers: 'ski,N5000_vann_l,N5000_fylke_f,N5000_komm_f,N250_admin_omr_l,N250_hoyde_l,N250_bekk_l,N250_veg_l,N250_bane_l,N250_stedsnavn_p,N50_bekk_l,N50_admin_omr_l,N50_hoydekurve_l,N50_veg_l,N50_bane_l,N50_anlegg_l,N50_bygg_p,N50_hoydepunkt_p,N50_stedsnavn_p', format: 'image/png', transparent: "true" } );
}

function createSnotilstandLayer() {
  return new OpenLayers.Layer.WMS("SnÃ¸tilstand", "http://metis.jacilla.com/cgi-bin/wms3", {layers: 'lwc,N5000_vann_l,N5000_fylke_f,N5000_komm_f,N250_admin_omr_l,N250_hoyde_l,N250_bekk_l,N250_veg_l,N250_bane_l,N250_stedsnavn_p,N50_bekk_l,N50_admin_omr_l,N50_hoydekurve_l,N50_veg_l,N50_bane_l,N50_anlegg_l,N50_bygg_p,N50_hoydepunkt_p,N50_stedsnavn_p', format: 'image/png', transparent: "true" } );
}

function createNysnoSisteDognLayer() {
  return new OpenLayers.Layer.WMS("NysnÃ¸dybde siste dÃ¸gn", "http://metis.jacilla.com/cgi-bin/wms3", {layers: 'sdfsw,N5000_vann_l,N5000_fylke_f,N5000_komm_f,N250_admin_omr_l,N250_hoyde_l,N250_bekk_l,N250_veg_l,N250_bane_l,N250_stedsnavn_p,N50_bekk_l,N50_admin_omr_l,N50_hoydekurve_l,N50_veg_l,N50_bane_l,N50_anlegg_l,N50_bygg_p,N50_hoydepunkt_p,N50_stedsnavn_p', format: 'image/png', transparent: "true" } );
}

function createSnodybdeLayer() {
  return new OpenLayers.Layer.WMS("SnÃ¸dybde", "http://metis.jacilla.com/cgi-bin/wms3", {layers: 'sd,N5000_vann_l,N5000_fylke_f,N5000_komm_f,N250_admin_omr_l,N250_hoyde_l,N250_bekk_l,N250_veg_l,N250_bane_l,N250_stedsnavn_p,N50_bekk_l,N50_admin_omr_l,N50_hoydekurve_l,N50_veg_l,N50_bane_l,N50_anlegg_l,N50_bygg_p,N50_hoydepunkt_p,N50_stedsnavn_p', format: 'image/png', transparent: "true" } );
}

function createMiddelTempSisteDognLayer() {
  return new OpenLayers.Layer.WMS("Middeltemp siste dÃ¸gn", "http://metis.jacilla.com/cgi-bin/wms3", {layers: 'tam,N5000_vann_l,N5000_fylke_f,N5000_komm_f,N250_admin_omr_l,N250_hoyde_l,N250_bekk_l,N250_veg_l,N250_bane_l,N250_stedsnavn_p,N50_bekk_l,N50_admin_omr_l,N50_hoydekurve_l,N50_veg_l,N50_bane_l,N50_anlegg_l,N50_bygg_p,N50_hoydepunkt_p,N50_stedsnavn_p', format: 'image/png', transparent: "true" } );
}

function createNedborSisteDognLayer() {
  return new OpenLayers.Layer.WMS("NedbÃ¸r siste dÃ¸gn", "http://metis.jacilla.com/cgi-bin/wms3", {layers: 'rr,N5000_vann_l,N5000_fylke_f,N5000_komm_f,N250_admin_omr_l,N250_hoyde_l,N250_bekk_l,N250_veg_l,N250_bane_l,N250_stedsnavn_p,N50_bekk_l,N50_admin_omr_l,N50_hoydekurve_l,N50_veg_l,N50_bane_l,N50_anlegg_l,N50_bygg_p,N50_hoydepunkt_p,N50_stedsnavn_p', format: 'image/png', transparent: "true" } );
}

function getColorNameForCategory(trackTypeCategory, idx) {
  if(trackTypeCategory==0) { // Skiloyper
    switch(idx) {
      case 0: return "pink";
      case 1: return "yellow";
      case 2: return "orange";
      case 3: return "green";
      case 4: return "blue";
      case 5: return "red";
      default: return "purple";
    }
  }
  if(trackTypeCategory==1) { // Sykkelstier
    return "red";
  }
}

function getColorForCategory(trackTypeCategory, idx) {
  if(trackTypeCategory==0) { // Skiloyper
    switch(idx) {
      case 0: return "#666666";
      case 1: return "#ffff33";
      case 2: return "#ff7733";
      case 3: return "#33ff33";
      case 4: return "#3333ff";
      case 5: return "#cc3333";
      case 6: return "#996666";
      default: return "#666666";
    }
  }
  if(trackTypeCategory==1) { // Sykkelstier
    return "#cc3333";
  }
}

function toggleMapSize() {
  var d = document.getElementById("mapDiv");
  if(d.style.height=="500px") {
    d.style.height="800px";
    map.checkResize();
    point = map.fromLatLngToDivPixel(map.getCenter());
    point.y-=150;
    map.panTo(map.fromDivPixelToLatLng(point));
  } else {
    d.style.height="500px";
    map.checkResize();
    point = map.fromLatLngToDivPixel(map.getCenter());
    point.y+=150;
    map.panTo(map.fromDivPixelToLatLng(point));
  }
}

function toggleMapOpacity() {
  if(basis.getOpacity()==1.0) {
    basis.getOpacity = function() { return 0.6; }
  } else {
    basis.getOpacity = function() { return 1.0; }
  }
  map.setMapType(G_NORMAL_MAP);
  map.setMapType(basisMap);
}

