/**
 * Skisporet Library, Paul René Jørgensen, paulrene@jacilla.no
 *
**/
var map = 0;
var plines = [];

function initGMap() {
  //
}

function createMap(divId, config, validGold) {
  var mapDiv = document.getElementById(divId);
  var map = new google.maps.Map2(mapDiv);
//  mapDiv.style.backgroundColor="#ff0000";
  if(config!=null && config.lat!=null) {
    map.setCenter(new GLatLng(fix(config.lat), fix(config.lng)), config.zoom);
  } else {
    var bb = new google.maps.LatLngBounds(new GLatLng(59.0, 5.0), new GLatLng(69.1, 14.0));
    map.setCenter(bb.getCenter(), map.getBoundsZoomLevel(bb));
  }

  if(config!=null && config.statkart) {
    var cc = new GCopyrightCollection("Skisporet.no");
    cc.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, "&copy; Statens kartverk, Geovekst og kommuner"));
    var statkartTileLayer =  new GTileLayer(cc, 0, 20, {
      tileUrlTemplate: 'http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo2&zoom={Z}&x={X}&y={Y}',
      isPng:true,
      opacity:1.0
    });
    var statkartMap = new GMapType([statkartTileLayer], G_NORMAL_MAP.getProjection(), "S.Kartverk", G_NORMAL_MAP);
    map.addMapType(statkartMap);
  }

  if(config!=null && config.nve) {
    var cc = new GCopyrightCollection("Skisporet.no");
    cc.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, "&copy; NVE"));
    var nveTileLayer =  new GTileLayer(cc, 0, 20, {
      tileUrlTemplate: 'http://api.skisporet.no/service/nveproxy?layers=ski&zoom={Z}&x={X}&y={Y}',
      isPng:true,
      opacity:1.0
    });
    var nveMap = new GMapType([nveTileLayer], G_NORMAL_MAP.getProjection(), "Skiføre", G_NORMAL_MAP);
    map.addMapType(nveMap);
  }


  var ui = map.getDefaultUI();
  ui.zoom.scrollwheel = false;
//  ui.controls.menumaptypecontrol = true;
//  ui.controls.maptypecontrol = false;
  if(config!=null && config.clean) {
    ui.controls = false;
  }
  map.setUI(ui);
  map.removeMapType(G_NORMAL_MAP);
  map.removeMapType(G_HYBRID_MAP);
  map.removeMapType(G_SATELLITE_MAP);
  map.removeMapType(G_PHYSICAL_MAP);

/*
  Can be removed if new statkartTileLayer is working ok
  if(validGold) {
    mapDiv.style.backgroundColor="#97c9ff"; //#97c9ff #E6F6F9 #fff0d1
    var cc = new GCopyrightCollection("Skisporet.no");
    cc.addCopyright(new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, "&copy; Jacilla AS"));
    var norge = new GTileLayer(cc, 1, 17);
    norge.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';
    norge.myFormat='image/png';
    norge.myBaseURL='metis.jacilla.com/wms?';
    norge.getTileUrl=CustomGetTileUrl;
    norge.getOpacity = function() { return 1.0; }
    var norgeMap = new GMapType([norge], G_NORMAL_MAP.getProjection(), "S.Kartverk", G_NORMAL_MAP);
    map.addMapType(norgeMap);
    map.removeMapType(G_PHYSICAL_MAP);
    map.addMapType(G_PHYSICAL_MAP);
  }*/


  map.addMapType(G_NORMAL_MAP);
  map.addMapType(G_SATELLITE_3D_MAP);

  return map;
}

function centerMapOnUserLocation(zoom, addBreadcrumbs) {
  if(google.loader.ClientLocation) {
    var cl = google.loader.ClientLocation;
    var location = [cl.address.region, cl.address.city].join(', ');
    if(cl.address.country=="Norway") {
      map.setCenter(new google.maps.LatLng(cl.latitude, cl.longitude), zoom);
      if(addBreadcrumbs) {
        $("span[id='breadcrumbs-extralocation']").html(" - Kartutsnittet ("+location+") er beregnet ut fra din internettadresse");
      }
      return true;
    }
  }
  return false;
}

function centerMap(lat, lng, zoom) {
  map.setCenter(new google.maps.LatLng(lat, lng), zoom);
}

function showDestinationOrTrackMap(tracks, vehicles, pois, bb, divId, trackId, validGold, params) {
  if(GBrowserIsCompatible()) {
    map = createMap(divId, params, validGold);

    bb = new GLatLngBounds(new GLatLng(fix(bb.minLat), fix(bb.minLng)), new GLatLng(fix(bb.maxLat), fix(bb.maxLng)));
    map.setCenter(bb.getCenter(), map.getBoundsZoomLevel(bb));

    var addLast = false;
    var addThisLast = [];

    for(var n=0;n<tracks.length;n++) {
      var track = tracks[n];
      for(var i=0;i<track.segments.length;i++) {
        var segment = track.segments[i];
        if(trackId!=null) {
	  if(trackId!=track.id) {
            segment.color = "ffffff";
            addLast = false;
          } else {
            addLast = true;
          }
        }

        var line = new Array();
        for(var t=0;t<segment.simpler.length;t+=2) {
          line.push(new GLatLng(segment.simpler[t]/16384.0, segment.simpler[t+1]/16384.0));
        }
        var gpl = new GPolyline(line,"#"+segment.color,4,0.8);

/*
        var gpl = new GPolyline.fromEncoded({
          color: "#"+segment.color,
          weight: 4,
          opacity: 0.8,
          points: segment.points,
          levels: segment.levels,
          zoomFactor: 2,
          numLevels: 18
        });*/
        gpl.html=generateTrackBoxHtml(track, segment, trackId==null);
        gpl.trackId=track.id;
        plines.push(gpl);
        GEvent.addListener(gpl, "click", function(latlon) {
          map.openInfoWindowHtml(latlon, this.html);
        });
        // Highlight burde highlightet alle polylinjene som tilhører løypa
        GEvent.addListener(gpl, "mouseover", function() {
          map.getDragObject().setDraggableCursor("pointer");
          for(var m=0;m<plines.length;m++) {
            var gpl = plines[m];
            if(gpl.trackId==this.trackId) {
              gpl.setStrokeStyle( { weight: 8 } );
            }
          }
        } );
        GEvent.addListener(gpl, "mouseout", function() {
          for(var m=0;m<plines.length;m++) {
            var gpl = plines[m];
            if(gpl.trackId==this.trackId) {
              gpl.setStrokeStyle( { weight: 4 } );
            }
          }
          map.getDragObject().setDraggableCursor("url(http://maps.google.com/intl/en_us/mapfiles/openhand.cur), default");
        } );
        if(addLast) {
          addThisLast.push(gpl);
        } else {
          map.addOverlay(gpl);
        }
      }
    }
    if(addThisLast.length>0) {
      for(var n=0;n<addThisLast.length;n++) {
        map.addOverlay(addThisLast[n]);
      }
    }
    if(pois!=undefined) {
      for(var n=0;n<pois.length;n++) {
        map.addOverlay(createPOIMarker(pois[n]));
      }
    }
    if(vehicles!=undefined) {
      for(var n=0;n<vehicles.length;n++) {
        map.addOverlay(createVehicleMarker(vehicles[n]));
      }
    }
  }
}

function renderDifficulty(trackId, plus, minus, voteable) {
  if((plus+minus==0)) { plus = 1; minus = 1; }
  var value = (50 + (plus / (plus+minus) - minus / (plus+minus)) * 100).toFixed(0);
  var img = "http://chart.apis.google.com/chart?chs=38x19&cht=gom&chco=3333ff,ff3333,333333&chd=t:"+value;
  return ((voteable && canVoteDifficulty(trackId))?"<img id='difficultyMinusImg"+trackId+"' src='http://beta.skisporet.no/icons/bullet_toggle_minus.png' width='16' height='16' onclick='voteDifficulty("+trackId+", -1);' />":"")+"<img src='"+img+"' width='38' height='19' />"+((voteable && canVoteDifficulty(trackId))?"<img id='difficultyPlusImg"+trackId+"' src='http://beta.skisporet.no/icons/bullet_toggle_plus.png' width='16' height='16' onclick='voteDifficulty("+trackId+", 1);' />":"");
}

function renderScenery(trackId, plus, minus, voteable) {
  if((plus+minus==0)) { plus = 1; minus = 1; }
  var value = (50 + (plus / (plus+minus) - minus / (plus+minus)) * 100).toFixed(0);
  var img = "http://chart.apis.google.com/chart?chs=38x19&cht=gom&chco=ff0000,ffffcc,00ff00&chd=t:"+value;
  return ((voteable && canVoteScenery(trackId))?"<img id='sceneryMinusImg"+trackId+"' src='http://beta.skisporet.no/icons/bullet_toggle_minus.png' width='16' height='16' onclick='voteScenery("+trackId+", -1);' />":"")+"<img src='"+img+"' width='38' height='19' />"+((voteable && canVoteScenery(trackId))?"<img id='sceneryPlusImg"+trackId+"' src='http://beta.skisporet.no/icons/bullet_toggle_plus.png' width='16' height='16' onclick='voteScenery("+trackId+", 1);' />":"");
}

function canVoteDifficulty(trackId) {
  return getCookie("trackDifficultyT"+trackId)!=1;
}

function canVoteScenery(trackId) {
  return getCookie("trackSceneryT"+trackId)!=1;
}

function showCountryMap(data, divId, config) {
  if(google.maps.BrowserIsCompatible()) {
    map = createMap(divId, config, false);

    var markers = new Array();
    var cluster = new ClusterMarker(map, { clusteringEnabled: false } );
    for(var n=0;n<data.destinations.length;n++) {
      var d = data.destinations[n];
      var marker = createDestinationMarker(d);
      marker.ssConfig = config;
      markers.push(marker);
    }

    cluster.addMarkers(markers);
    if(config==null) {
      cluster.fitMapToMarkers();
    }
    cluster.refresh(true);

    google.maps.Event.addListener(map, "click", function(marker, point) {
      if(marker) {
        if(marker.ssConfig!=null && marker.ssConfig.media) {
          location.href = "http://skisporet.no/media.php?county="+marker.d.countyUrlName+"&destination="+marker.d.urlName+"&width="+marker.ssConfig.width+"&apikey="+gup("apikey");
        } else {
          location.pathname = "/"+marker.d.countyUrlName+"/"+marker.d.urlName;
        }
      }
    });
  }
}

function createIcon(image) {
  var b = createBaseIcon(16, 16);
  b.image = image;
  return b;
}

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

function createDestinationMarker(d) {
  var i = createBaseIcon(12, 12);
  i.image = "/img/map/"+d.icon;
  i.zIndex = d.zIndex;
  var m = new google.maps.Marker(new google.maps.LatLng(d.lat, d.lng), { icon: i, title: d.name, zIndexProcess: dMarkerZIndexProcess });
  m.d = d;
  return m;
}

function dMarkerZIndexProcess(marker) {
  return this.icon.zIndex;
}

function generateTrackBoxHtml(track, segment, isDestinationPage) {
  var html = "<div class=\"infoWindowContainer\">";
  html+="<div class=\"smallTableModule\">";
  html+="<div class=\"smallGreenHeader\"><h2 title=\""+track.name+"\">"+track.shortName+"</h2></div>";
  html+="<table class=\"defaultTable\">";
  html+="<tr><td>Oppdatert</td><td class=\"value\">"+track.updated+"</td></tr>";
//  html+="<tr><td>Status</td><td class=\"value\">"+(track.availability==""?"Ukjent":track.availability)+"</td></tr>";
  html+="<tr><td>Lengde</td><td class=\"value\">"+track.distance+" km</td></tr>";
  if(track.commentText!=undefined) {
    html+="<tr><td>Kommentar</td><td class=\"value\">"+track.commentText+" ("+track.commentDate+")</td></tr>";
  }
  if(isDestinationPage) {
    html+="<tr><td>Detaljer</td><td class=\"value\"><a href=\""+document.location+"/"+track.id+"\">Gå til løypa</a></td></tr>";
  } else {
    html+="<tr><td>Detaljer</td><td class=\"value\"><a href=\""+track.id+"\">Gå til løypa</a></td></tr>";
  }
  html+="<tr><td style=\"text-align: center; font-size: 10px; padding-top: 8px;\" colspan=\"2\">";
  for(var n=0;n<track.heightmaps.length;n++) {
    html+="<img style=\"border: 1px solid #ccc\" src=\"http://chart.apis.google.com/chart?chs=256x64&cht=ls&chco=0077CC&chls=1.5,0,0&chd=t:";
    html+=track.heightmaps[n]+"\" width=\"256\" height=\"64\" />";
  }
  html+="<br/>Høydeprofil</td></tr>";

  html+="</table>";
  html+="</div>";
  html+="</div>";
  return html;

  var o = "<h3>"+track.name+"</h3>";
  o+="<p>"+track.description+"</p>";
  o+="<table>";
  o+="<tr><td>Status</td><td>"+track.availability+"</td></tr>";
  o+="<tr><td>Sist oppdatert</td><td>"+track.updated+"</td></tr>";
  o+="<tr><td>Lengde</td><td>"+track.distance+" km</td></tr>";
  o+="<tr><td>Vanskelighetsgrad</td><td>"+renderDifficulty(track.id, track.difficultyPlus, track.difficultyMinus, true)+"</td></tr>";
  o+="<tr><td>Opplevelse</td><td>"+renderScenery(track.id, track.sceneryPlus, track.sceneryMinus, true)+"</td></tr>";
  if(track.commentText) {
    o+="<tr><td>Kommentar</td><td>"+track.commentText+" ("+prettyDate(track.commentDate)+")</td></tr>";
  }
  o+="</table><br/>\n";
  for(var n=0;n<track.heightmaps.length;n++) {
    o+="<img src=\"http://chart.apis.google.com/chart?chs=256x64&cht=ls&chco=0077CC&chm=B,E6F2FA,0,0,0&chls=1,0,0&chd=t:"+track.heightmaps[n]+"\" width=\"256\" height=\"64\" />\n";
  }
  return o;
}

function createPOIMarker(p) {
  var html = "<div class=\"infoWindowContainer\">";
  html+="<div class=\"smallTableModule\">";
  html+="<div class=\"smallGreenHeader\"><h2>"+p.name+"</h2></div>";
  html+="<table cellpadding=\"0\" cellspacing=\"0\">";
  html+="<tr><td style=\"text-align: center;\">"+p.description+"</td></tr>";
  if(p.targetUrl!=null) {
    html+="<tr><td style=\"text-align:center;\"><a target=\"_blank\" href=\""+p.targetUrl+"\">"+p.targetUrl+"</a></td></tr>";
  }
  html+="</table>";
  html+="</div>";
  html+="</div>";
  return createMarker(
    new GLatLng(p.latitude, p.longitude),
    createPOIIcon(p),
    p.name,
    html
  );
}

function createVehicleMarker(v) {
  var html = "<div class=\"infoWindowContainer\">";
  html+="<div class=\"smallTableModule\">";
  html+="<div class=\"smallGreenHeader\"><h2>"+v.displayName+"</h2></div>";
  html+="<table class=\"defaultTable\">";
  if(v.displayName.indexOf("Oslo")==-1) {
    html+="<tr><td>Oppdatert</td><td class=\"updated\">"+v.updated+"</td></tr>";
    html+="<tr><td>Status</td><td class=\"value\">"+(v.inMotion==true?"I bevegelse":"Stanset")+"</td></tr>";
    if(v.inMotion==true) {
      html+="<tr><td>Hastighet</td><td class=\"value\">"+Math.round(v.speed)+" km/t</td></tr>";
      html+="<tr><td>Kompasskurs</td><td class=\"value\">"+Math.round(v.bearing)+"&deg;</td></tr>";
    } else {
      html+="<tr><td>Hastighet</td><td class=\"value\">0 km/t</td></tr>";
      html+="<tr><td>Kompasskurs</td><td class=\"value\">Ukjent</td></tr>";
    }
  }
  html+="<tr><td>Høyde over havet</td><td class=\"value\">"+Math.round(v.altitude)+" meter</td></tr>";
  html+="<tr><td>Eies / driftes av</td><td class=\"value\">"+v.organizationName+"</td></tr>";
  html+="</table>";
  html+="</div>";
  html+="</div>";
  return createMarker(
    new GLatLng(v.latitude, v.longitude),
//    createIcon(createVehicleIconUrl(v)),
    createVehicleIcon(v),
    v.displayName,
    html
  );
}

function createPOIIcon(p) {
  var b = new GIcon();
  b.iconAnchor = new GPoint(14, 14);
  b.infoWindowAnchor = new GPoint(14, 7);
  b.iconSize = new GSize(28, 28);
  if(p.type=="UTS") {
    b.image = "/img/mapIcons/lookoutPoint.png";
  } else if(p.type=="PAR") {
    b.image = "/img/mapIcons/parking.png";
  } else if(p.type=="IDR") {
    b.image = "/img/mapIcons/checkpoint.png";
  } else if(p.type=="TRI") {
    b.image = "/img/mapIcons/guestbook.png";
  } else if(p.type=="INF") {
    b.image = "/img/mapIcons/generalInfo.png";
  } else if(p.type=="CAM") {
    b.image = "/img/mapIcons/webcam.png";
  } else if(p.type=="PHO") {
    b.image = "/img/mapIcons/camera.png";
  } else if(p.type=="MEA") {
    b.image = "/img/mapIcons/measure.png";
  } else if(p.type=="TOI") {
    b.image = "/img/mapIcons/toilet.png";
  } else if(p.type=="HAZ") {
    b.image = "/img/mapIcons/hazard.png";
  } else if(p.type=="ACC") {
    b.image = "/img/mapIcons/accomodation.png";
  } else if(p.type=="CAF") {
    b.image = "/img/mapIcons/cafe.png";
  } else {
    b.image = "/img/mapIcons/generalInfo.png";
  }
  return b;
}


function createVehicleIcon(v) {
  var b = new GIcon();
  b.iconAnchor = new GPoint(14, 14);
  b.infoWindowAnchor = new GPoint(14, 7);
  if(v.inMotion==true) {
    b.iconSize = new GSize(20, 20);
    b.image  = "/img/mapIcons/snowmobileAnimation.gif";
    b.shadowSize = new GSize(28, 28);
    b.shadow = "/img/mapIcons/snowmobileOutline.png";
  } else {
    b.iconSize = new GSize(28, 28);
    b.image = "/img/mapIcons/snowmobile.png";
  }
  return b;
}

function createVehicleIconUrl(v) {
  if(v.type=="LØY" || v.type=="SCO") {
    if(v.inMotion==true) {
    	return "/img/mapIcons/snowmobileAnimation.gif";
    } else {
        return "/img/mapIcons/snowmobile.png";
    }
  } else {
    if(v.type=="MAN") {
      return "http://static.skisporet.no/images/user.png";
    }
    if(v.type=="FEM") {
      return "http://static.skisporet.no/images/user_female.png";
    }
  }
  return "http://static.skisporet.no/images/tux.png";
}

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

function fix(coord) {
  return coord.replace(",",".")
}


