// ==UserScript== // @id iitc-plugin-show-linked-portals@fstopienski // @name IITC plugin: Show linked portals // @category Portal Info // @version 0.3.1.@@DATETIMEVERSION@@ // @namespace https://github.com/jonatkins/ingress-intel-total-conversion // @updateURL @@UPDATEURL@@ // @downloadURL @@DOWNLOADURL@@ // @description [@@BUILDNAME@@-@@BUILDDATE@@] Try to show the linked portals (image, name and link direction) in portal detail view and jump to linked portal on click. Some details may not be available if the linked portal is not in the current view. // @include https://*.ingress.com/intel* // @include http://*.ingress.com/intel* // @match https://*.ingress.com/intel* // @match http://*.ingress.com/intel* // @include https://*.ingress.com/mission/* // @include http://*.ingress.com/mission/* // @match https://*.ingress.com/mission/* // @match http://*.ingress.com/mission/* // @grant none // ==/UserScript== @@PLUGINSTART@@ // PLUGIN START //////////////////////////////////////////////////////// // use own namespace for plugin window.plugin.showLinkedPortal = function () { }; plugin.showLinkedPortal.previewOptions = { color: "#C33", opacity: 1, weight: 5, fill: false, dashArray: "1,6", radius: 18, }; window.plugin.showLinkedPortal.portalDetail = function (data) { plugin.showLinkedPortal.removePreview(); var portalLinks = getPortalLinks(data.guid); var length = portalLinks.in.length + portalLinks.out.length var c = 1; $('
',{id:'showLinkedPortalContainer'}).appendTo('#portaldetails'); function renderLinkedPortal(linkGuid) { if(c > 16) return; var key = this; // passed by Array.prototype.forEach var link = window.links[linkGuid].options.data; var guid = link[key + 'Guid']; var lat = link[key + 'LatE6']/1E6; var lng = link[key + 'LngE6']/1E6; var length = L.latLng(link.oLatE6/1E6, link.oLngE6/1E6).distanceTo([link.dLatE6/1E6, link.dLngE6/1E6]); var lengthFull = digits(Math.round(length)) + 'm'; var lengthShort = length < 100000 ? lengthFull : digits(Math.round(length/1000)) + 'km' var div = $('
').addClass('showLinkedPortalLink showLinkedPortalLink' + c + (key=='d' ? ' outgoing' : ' incoming')); var title; var data = (portals[guid] && portals[guid].options.data) || portalDetail.get(guid) || null; if(data && data.title) { title = data.title; div.append($('').attr({ 'src': fixPortalImageUrl(data.image), 'class': 'minImg', 'alt': title, })); } else { title = 'Go to portal'; div .addClass('outOfRange') .append($('') .html('Portal not loaded.
' + lengthShort)); } div .attr({ 'data-guid': guid, 'data-lat': lat, 'data-lng': lng, 'title': $('
') .append($('').text(title)) .append($('
')) .append($('').text(key=='d' ? '↴ outgoing link' : '↳ incoming link')) .append($('
')) .append($('').html(lengthFull)) .html(), }) .appendTo('#showLinkedPortalContainer'); c++; } portalLinks.out.forEach(renderLinkedPortal, 'd'); portalLinks.in.forEach(renderLinkedPortal, 'o'); if(length > 16) { $('
') .addClass('showLinkedPortalLink showLinkedPortalOverflow') .text(length-16 + ' more') .appendTo('#showLinkedPortalContainer'); } $('#showLinkedPortalContainer') .on('click', '.showLinkedPortalLink', plugin.showLinkedPortal.onLinkedPortalClick) .on('mouseover', '.showLinkedPortalLink', plugin.showLinkedPortal.onLinkedPortalMouseOver) .on('mouseout', '.showLinkedPortalLink', plugin.showLinkedPortal.onLinkedPortalMouseOut); } plugin.showLinkedPortal.onLinkedPortalClick = function() { plugin.showLinkedPortal.removePreview(); var element = $(this); var guid = element.attr('data-guid'); var lat = element.attr('data-lat'); var lng = element.attr('data-lng'); if(!guid) return; // overflow var position = L.latLng(lat, lng); if(!map.getBounds().contains(position)) map.setView(position); if(portals[guid]) renderPortalDetails(guid); else zoomToAndShowPortal(guid, position); }; plugin.showLinkedPortal.onLinkedPortalMouseOver = function() { plugin.showLinkedPortal.removePreview(); var element = $(this); var lat = element.attr('data-lat'); var lng = element.attr('data-lng'); if(!(lat && lng)) return; // overflow var remote = L.latLng(lat, lng); var local = portals[selectedPortal].getLatLng(); plugin.showLinkedPortal.preview = L.layerGroup().addTo(map); L.circleMarker(remote, plugin.showLinkedPortal.previewOptions) .addTo(plugin.showLinkedPortal.preview); L.geodesicPolyline([local, remote], plugin.showLinkedPortal.previewOptions) .addTo(plugin.showLinkedPortal.preview); }; plugin.showLinkedPortal.onLinkedPortalMouseOut = function() { plugin.showLinkedPortal.removePreview(); }; plugin.showLinkedPortal.removePreview = function() { if(plugin.showLinkedPortal.preview) map.removeLayer(plugin.showLinkedPortal.preview); plugin.showLinkedPortal.preview = null; }; var setup = function () { window.addHook('portalDetailsUpdated', window.plugin.showLinkedPortal.portalDetail); $('