view markers.js @ 289:07530034b221 gmap2

Add instance flag. Not used here yet, tho.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 17 Nov 2016 15:42:07 +0200
parents 8a14983244b0
children 5c15b45947f2
line wrap: on
line source

// $Id: markers.js 2284 2009-09-21 12:47:20Z jeskko $

// Marker types
var LOCF_M_SCENIC1      = (0x000001);   /* '?' Scenic marker */
var LOCF_M_SCENIC2      = (0x000002);   /* '%' Shrine marker/etc */
var LOCF_M_PCITY        = (0x000004);   /* 'C' Player city */
var LOCF_M_CITY         = (0x000008);   /* 'c' City */
var LOCF_M_MASK         = (0x00000F);

// Location types
var LOCF_T_SHRINE       = (0x000010);   /* 'S' Raceshrine */
var LOCF_T_GUILD        = (0x000020);   /* 'G' Guild */
var LOCF_T_SS           = (0x000040);   /* 'P' Player guild/Secret Society */
var LOCF_T_MONSTER      = (0x000080);   /* 'M' Special monster */
var LOCF_T_TRAINER      = (0x000100);   /* 'T' Guild trainer */
var LOCF_T_FORT         = (0x000200);   /* 'F' Regions fort */
var LOCF_T_MASK         = (0x00FFF0);
var LOCF_MASK           = (LOCF_M_MASK | LOCF_T_MASK);

// Extra flags
var LOCF_INVIS          = (0x010000);   /* '-' Invisible marker / Don't show label */
var LOCF_CLOSED         = (0x020000);   /* '!' Area is CLOSED */
var LOCF_INSTANCED      = (0x040000);   /* 'I' Location is "instanced" for each player */
var LOCF_INVALID        = (0x400000);   /* Possibly invalid location */
var LOCF_NOMARKER       = (0x800000);   /* Location has no marker in mapdata or explicitly defined */
var LOCF_Q_MASK         = (0xFF0000);


// List of marker types
var pmapMarkerTypes =
[
  ["Guilds",    "guild"],
  ["PCities",   "pcity"],
  ["Shrines",   "shrine"],
  ["Areas",     "default"],
  ["Mob",       "monster"],
  ["Trn",       "trainer"],
];


// Some global vars
var pmapMMgr;
var pmapAreas = [];
var pmapMarkers = [];
var pmapMIndex;
var pmapMarkerInfo = [];
var pmapSideBuiltinHTML, pmapSidePublicHTML, pmapSidePrivateHTML;
var pmapInfoWindow;


function pmapMyClick(i)
{
  pmap.panTo(pmapMarkers[i].getPosition());
  setTimeout("pmapShowInfo("+ i +")", 1000);
}


function pmapShowInfo(i)
{
  google.maps.event.trigger(pmapMarkers[i], "click");
}


function pmapLocGetLocationType(flags, def)
{
  switch (flags & LOCF_M_MASK)
  {
    case LOCF_M_CITY:   return "city";
    case LOCF_M_PCITY:  return "pcity";
    default:
      switch (flags & LOCF_T_MASK)
      {
        case LOCF_T_SHRINE:  return "shrine";
        case LOCF_T_GUILD:   return "guild";
        case LOCF_T_SS:      return "ss";
        case LOCF_T_MONSTER: return "monster";
        case LOCF_T_TRAINER: return "trainer";
        case LOCF_T_FORT:    return "fort";
      }
      break;
  }
  return def ? def : "default";
}


function pmapCreateMarker(m, mclass)
{
  type = pmapLocGetLocationType(m["flags"], m["type"]);
  if (m["name"].indexOf('FERRY') == 0)
    type = "ferry";

  pname = (type != "default" ? type.toUpperCase()+" " : "") + m["name"];

  if (m["flags"] & LOCF_CLOSED)
    pname += " (CLOSED)";

  var marker = new MarkerWithLabel(
  {
    position: pmapMapCoordsToLatLng(new google.maps.Point(m["x"] * 2 + 1, m["y"] * 2 + 1), 7),
    icon: pmapIcons[type],
    draggable: false,
    labelContent: m["name"],
    labelAnchor: new google.maps.Point(25, 0),
    labelClass: "labels",
    labelStyle: {opacity: 0.75}
  });

  google.maps.event.addListener(marker, "click", function()
  {
    pmapInfoWindow.setContent("<div class=\"infowin\">"+ m["html"] +"</div>");
    pmapInfoWindow.open(pmap, this);
  });

  if (mclass == "builtin") pmapSideBuiltinHTML += '<div id="marker'+ pmapMIndex +'" class="c_'+ m["continent"].toLowerCase()+'"><div>&nbsp;</div><a href="javascript:pmapMyClick('+ pmapMIndex +')">'+ pname +'</a></div>';
  if (mclass == "private") pmapSidePrivateHTML += '<a href="javascript:pmapMyClick(' + pmapMIndex + ')">' + pname + '</a><br>';
  if (mclass == "public") pmapSidePublicHTML += '<a href="javascript:pmapMyClick(' + pmapMIndex + ')">' + pname + '</a><br>';

  pmapMarkers[pmapMIndex] = marker;
  pmapMarkerInfo[pmapMIndex] = [type, m["continent"], m];
  pmapMIndex++;

  if (pmapAreas[type] == undefined)
    pmapAreas[type] = [];

  pmapAreas[type].push(marker);

  return marker;
}


// Wrapper function for adding markers,
// checks if the array is defined first.
function pmapAddMarkers(mlist, minzoom, maxzoom)
{
  if (mlist)
    pmapMMgr.addMarkers(mlist, minzoom, maxzoom);
}


function pmapInitializeMarkers()
{
  pmapInfoWindow = new google.maps.InfoWindow;

  google.maps.event.addListener(pmap, 'click', function()
  {
    pmapInfoWindow.close();
  });

  pmapMMgr = new MarkerManager(pmap);
  google.maps.event.addListener(pmapMMgr, 'loaded', pmapLoadMarkers);
}


function pmapLoadMarkers()
{
  pmapMIndex = 0;

  //
  // Parse regular markers from JSON
  //
  XDownloadUrl("markers.json", function(data, responseCode)
  {
    var markers = JSON.parse(data);
    pmapSideBuiltinHTML = "";
    pmapSidePublicHTML = "";
    pmapSidePrivateHTML = "";

    for (var nid = 0; nid < markers.length; nid++)
    {
      pmapCreateMarker(markers[nid], "builtin");
    }

    pmapAddMarkers(pmapAreas["default"], 7, 11);
    pmapAddMarkers(pmapAreas["guild"],   6, 11);
    pmapAddMarkers(pmapAreas["shrine"],  6, 11);
    pmapAddMarkers(pmapAreas["trainer"],  6, 11);
    pmapAddMarkers(pmapAreas["ferry"],   4, 11);
    pmapAddMarkers(pmapAreas["city"],    4, 11);

    pmapAddMarkers(pmapAreas["monster"],  8, 11);
    pmapAddMarkers(pmapAreas["pcity"],   8, 11);
    pmapAddMarkers(pmapAreas["fort"],    8, 11);
    pmapMMgr.refresh();

    google.maps.event.trigger(pmap, "foobar");
    document.getElementById("sidecontent").innerHTML = pmapSideBuiltinHTML;
  });

  //
  // Parse tradelane markers from another JSON
  //
  XDownloadUrl("tradelane.json", function(data,responseCode)
  {
    var markers = JSON.parse(data);

    for (var nid = 0; nid < markers.length; nid++)
    {
      pmapCreateMarker(markers[nid], "tradelane");
    }

    pmapAddMarkers(pmapAreas["tradelane"], 5, 11);
    pmapMMgr.refresh();
  });

  //
  // Create GMap polylines from tradelane line data
  //
  XDownloadUrl("trlines.json", function(data,responseCode)
  {
    var lines = JSON.parse(data);

    // Go through array of line elements
    for (var nid = 0; nid < lines.length; nid++)
    {
      var points = lines[nid];
      var coords = [];

      // Create polyline points
      for (var npt = 0; npt < points.length; npt++)
      {
        var pt = points[npt];
        coords.push(pmapMapCoordsToLatLng(new google.maps.Point(pt["x"] * 2 + 1, pt["y"] * 2 + 1), 7));
      }

      // Create new polyline and add it to map overlay
      var poly = new google.maps.Polyline({
        path: coords,
        strokeColor: "#ffffff",
        strokeWeight: 2,
        strokeOpacity: 0.6
      });
      
      poly.setMap(pmap);
    }
  });


  //
  // Create map control elements
  //
  var str = "";
  var n = 0;
  for (var i = 0; i < pmapContinents.length; i++)
  {
    var c = pmapContinents[i][0];
    str += "<span id=\"sp"+c+"\"><a href=\"javascript:pmapToggleVisContinent('"+c+"')\">"+c+"</a></span>\n";
    if (n == 2) str += "<br />\n";
    n++;
  }	

  str += "<span id=\"spall_c\"><a href=\"javascript:pmapToggleVisContinent('all_c')\">All</a></span>\n";

  str += "<br /><br />\n";

  n = 0;
  for (var i = 0; i < pmapMarkerTypes.length; i++)
  {
    var q = pmapMarkerTypes[i];
    if (q != null)
    {
      var c = q[1];
      str += "<span id=\"sp"+c+"\"><a href=\"javascript:pmapToggleVisType('"+c+"')\">"+pmapMarkerTypes[i][0]+"</a></span>\n";
      if (n == 2) str += "<br />\n";
      n++;
    }
  }	

  str += "<span id=\"spall_t\"><a href=\"javascript:pmapToggleVisType('all_t')\">All</a></span>\n";

  document.getElementById("controls").innerHTML = str;

  //
  // Set default states
  //
  pmapSetVisContinent("all_c", true);
  pmapSetVisType("all_t", true);
  pmapUpdateVisible();
}


function pmapGetMarkerIndexByCoords(mx, my)
{
  for (var i = 0; i < pmapMarkerInfo.length; i++)
  {
    var m = pmapMarkerInfo[i][2];
    if (m["x"] == mx && m["y"] == my)
      return i;
  }
  
  return null;
}


//
// Map menu / sidebar control code
//
var markerVisStates = [];


function pmapSetFilterVisState(c, show)
{
  markerVisStates[c] = show;
  document.getElementById("sp" + c).style.background = show ? "white" : "red";
}


function pmapUpdateVisible()
{
  for (var i = 0; i < pmapMarkerInfo.length; i++)
  {
    var elem = document.getElementById("marker" + i);
    if (elem)
    {
      var show = markerVisStates[pmapMarkerInfo[i][0]] && markerVisStates[pmapMarkerInfo[i][1]];
      elem.style.display = show ? "block" : "none";
      pmapMarkers[i].setVisible(show);
    }
  }
}


function pmapSetVisContinent(c, show)
{
  if (c == "all_c")
  {
    for (var i = 0; i < pmapContinents.length; i++)
      pmapSetFilterVisState(pmapContinents[i][0], show);
  }
  pmapSetFilterVisState(c, show);
}


function pmapSetVisType(c, show)
{
  if (c == "all_t")
  {
    for (var i in pmapAreas)
      markerVisStates[i] = show;

    for (var i = 0; i < pmapMarkerTypes.length; i++)
      pmapSetFilterVisState(pmapMarkerTypes[i][1], show);
  }
  pmapSetFilterVisState(c, show);
}


function pmapToggleVisContinent(c)
{
  var first = true;
  if (c == "all_c")
    first = false;
  else
  {
    for (var i = 0; i < pmapContinents.length; i++)
    {
      var q = pmapContinents[i][0];
      if (!markerVisStates[q])
      {
        first = false;
        break;
      }
    }
  }

  if (first)
  {
    pmapSetVisContinent("all_c", false);
    pmapSetVisContinent(c, true);
  }
  else
    pmapSetVisContinent(c, !markerVisStates[c]);

  pmapUpdateVisible();
}


function pmapToggleVisType(c)
{
  var first = true;
  if (c == "all_t")
    first = false;
  else
  {
    for (var i = 0; i < pmapMarkerTypes.length; i++)
    {
      var q = pmapMarkerTypes[i][1];
      if (!markerVisStates[q])
      {
        first = false;
        break;
      }
    }
  }

  if (first)
  {
    pmapSetVisType("all_t", false);
    pmapSetVisType(c, true);
  }
  else
    pmapSetVisType(c, !markerVisStates[c]);

  pmapUpdateVisible();
}