//
// Jacilla Map Library
//

var map;
var basis;
var basisMap;
var satelliteMap;
var popups = new Array();
var popupDests = new Array();
var tracks;
var mainToken;
var destinationId;
var vehicleList = new Array();
var mainClient;

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;
  lastCategory = null;
  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 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 GPolyline(tpList, getColorForCategory(trackTypeCategory, lastCategory), 4, 1);
    map.addOverlay(line);

    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);

    tpList.length = 0;
  }

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

  if(trackTypeCategory==0) {
    mainToken = token;
    destinationId = d.id;
    mainClient = client;
    updateVehicles();
    setInterval("updateVehicles();", 15000);
  }
}

function updateVehicles() {
  removeVehicles();
  addVehiclesToMap(eval(mainClient.invoke('getVehiclesForDestination', [mainToken, new String(destinationId)])), 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)  
    );
    vehicleList.push(marker);
    map.addOverlay(marker);
  }
}

function removeVehicles() {
  for(n=0;n<vehicleList.length;n++) {
    map.removeOverlay(vehicleList[n]);
  }
  vehicleList.length = 0;
}

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

function createVehicleHtml(v) {
  d = new Date();
  d.setTime(v.lastUpdateTimestamp*1000);
  s = "<p><h1>"+v.name+"</h1>Status : ";
  if(vehicleInMotion(d)) {
    s=s+"I bevegelse<br/>Hastighet : "+v.speed.toFixed(2)+" km/t<br/>";
  } else {
    s=s+"Utenfor dekning<br/>";
  }
  s=s+"Høyde : "+v.altitude.toFixed(0)+" moh<br/>Siste oppdatering : "+d.toLocaleString()+"</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 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-2009 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);
}
