IITC_DX_INTEGRATION

Integrate Dx Fielding Simulation

当前为 2015-01-22 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @id             IITC_DX_INTEGRATION
// @name           IITC_DX_INTEGRATION
// @version        0.1.2.1
// @namespace      IITC_DX_INTEGRATION
// @description    Integrate Dx Fielding Simulation
// @include        https://www.ingress.com/intel*
// @include        http://www.ingress.com/intel*
// @match          https://www.ingress.com/intel*
// @match          http://www.ingress.com/intel*
// @grant          none
// @locale			en-US
// ==/UserScript==


function wrapper() {
	// in case IITC is not available yet, define the base plugin object
	if (typeof window.plugin !== "function") {
		window.plugin = function() {
		};
	}
	// base context for plugin
	window.plugin.dxplugin = function() {
	};
	var self = window.plugin.dxplugin;
	window.plugin.dxplugin.dxMarkers = [];
	window.plugin.dxplugin.dxLayer = null;
	window.plugin.dxplugin.dxPortals = [];
	// custom dialog wrapper with more flexibility
	self.import = function importJSON() {
		$('#dxWrapperExport').remove();
		if ($('#dxWrapper').is(':visible'))
		{
			$('#dxWrapper').remove();
			return;
		}
		$('#dxWrapper').remove();
		var wrapper = $('<div id="dxWrapper" style="margin: 10px;padding:5px;"></div>');
		var textarea = $('<textarea style="width:100%;max-width:100%;height: 200px;" id="dxJSONinput"></textarea>');
		var buttonSubmit = $('<input type="button" id="dxJSONinputSubmit" value="Process" style="cursor:pointer;"/>');
		var buttonCancel = $('<input type="button" id="dxJSONinputCancel" value="Cancel" style="cursor:pointer;"/>');
		var buttonDiscard = $('<input type="button" id="dxJSONinputDiscard" value="Discard" style="cursor:pointer;"/>');
		buttonSubmit.click(function() {
			if ($('#dxJSONinput').val() !== '')
			{
				self.processJSON($.parseJSON($('#dxJSONinput').val()));
			}
		});
		buttonDiscard.click(function() {
			self.discard();
		});
		buttonCancel.click(function() {
			self.discard();
			$('#dxWrapper').remove();
		});
		wrapper.append(textarea);
		wrapper.append(buttonSubmit);
		wrapper.append(buttonCancel);
		wrapper.append(buttonDiscard);
		$("#toolbox").append(wrapper);
	};
	//Process submit JSON String
	self.processJSON = function(jsonObject)
	{
		if (jsonObject.markers !== undefined && jsonObject.markers.length > 0)
		{
			self.discard();
			//markers
			window.plugin.dxplugin.dxMarkers = jsonObject.markers;
			//links
			if (jsonObject.links !== '')
			{
				$.each(jsonObject.links, function(i, link) {

					var nodes = self.__explode('_', link);
					var org = self.getPortalData(nodes[0]);
					var dst = self.getPortalData(nodes[1]);
					var latlngs = [
						L.latLng(org.lat, org.lng),
						L.latLng(dst.lat, dst.lng)
					];
					self.add(L.geodesicPolyline(latlngs, self.getPolyOptions()));
				});
			}
		}
	};

	//REturn the Portal DAta
	self.getPortalData = function(id)
	{
		var portal = null;
		$.each(window.plugin.dxplugin.dxMarkers, function(i, marker) {
			var val = self.__explode(':', marker);
			if (val[0] === id)
			{
				portal = {
					id: val[0],
					name: val[1],
					lat: parseFloat(val[2]),
					lng: parseFloat(val[3]),
					value: marker
				};
			}
		});
		return portal;
	};

	// this.createLinkEntity(ent);
	//Add dxObject
	self.add = function(poly)
	{
		if (window.plugin.dxplugin.dxLayer === null)
		{
			window.plugin.dxplugin.dxLayer = L.layerGroup();
			map.addLayer(window.plugin.dxplugin.dxLayer, true);
		}
		window.plugin.dxplugin.dxLayer.addLayer(poly);
	};

	//Remove all dxObjects
	self.discard = function()
	{
		if (window.plugin.dxplugin.dxLayer !== null)
		{
			map.removeLayer(window.plugin.dxplugin.dxLayer);
		}
		window.plugin.dxplugin.dxLayer = null;
	};

	self.getPolyOptions = function()
	{
		var color = '#FFA500';
		var options = {
			opacity: 1,
			weight: 1,
			clickable: false,
			color: color
		};
		return options;
	};

	//When portaldetailsIs updated
	self.portalDetailsUpdated = function(obj)
	{
		self.createPortalActionLink(obj.portalData.latE6, obj.portalData.lngE6, obj.portalData.title);
	};

	//Create links
	self.createPortalActionLink = function(latE6, lngE6, title)
	{
		$('#dxPortalDetailsLink').remove();
		var portalDetailsLink = '<a href="#" onclick="window.plugin.dxplugin.addPortal(' + latE6 + ', ' + lngE6 + ', \'' + title + '\')" title="Add to Dx Portals">Add to Dx</a>';
		if (self.getPortal(latE6, lngE6) !== false)
		{
			portalDetailsLink = '<a href="#" style="color:red !important;" onclick="window.plugin.dxplugin.removePortal(' + latE6 + ', ' + lngE6 + ', \'' + title + '\')" title="Remove from Dx Portals">Remove from Dx</a>';
		}
		$('#portaldetails .linkdetails').append('<aside id="dxPortalDetailsLink">' + portalDetailsLink + '</aside>');
	};

	//Add Portal
	self.addPortal = function(latE6, lngE6, title)
	{
		var id = latE6 + 'x' + lngE6;
		window.plugin.dxplugin.dxPortals[id] = id + ':' + title + ':' + (latE6 / 1E6) + ':' + (lngE6 / 1E6);
		self.createPortalActionLink(latE6, lngE6, title);
		self.updateExport();
		self.export(true);
	};
	//Remove portal
	self.removePortal = function(latE6, lngE6, title)
	{
		var id = latE6 + 'x' + lngE6;
		if (window.plugin.dxplugin.dxPortals.hasOwnProperty(id))
		{
			window.plugin.dxplugin.dxPortals[id] = null;
			delete window.plugin.dxplugin.dxPortals[id];
			self.createPortalActionLink(latE6, lngE6, title);
			self.updateExport();
			self.export(true);
		}
	};

	//Check if portal was already added
	self.getPortal = function(latE6, lngE6)
	{
		var id = latE6 + 'x' + lngE6;
		var ret = false;
		if (window.plugin.dxplugin.dxPortals.hasOwnProperty(id))
		{
			ret = window.plugin.dxplugin.dxPortals[id];
		}
		return ret;
	};

	//Update Export
	self.updateExport = function()
	{
		var portalDatas = [];
		var jsonObject = {};
		for (var key in window.plugin.dxplugin.dxPortals) {
			if (window.plugin.dxplugin.dxPortals.hasOwnProperty(key))
			{
				portalDatas.push(window.plugin.dxplugin.dxPortals[key]);
			}
		}
		jsonObject.markers = portalDatas;
		$('#dxJSONinputExport').val(JSON.stringify(jsonObject));
	};

	//Export selected portals
	self.export = function(update)
	{
		$('#dxWrapper').remove();
		if (update === undefined)
		{
			if ($('#dxWrapperExport').is(':visible'))
			{
				$('#dxWrapperExport').remove();
				return;
			}
		}
		$('#dxWrapperExport').remove();
		var wrapper = $('<div id="dxWrapperExport" style="margin: 10px;padding:5px;"></div>');
		var textarea = $('<textarea style="width:100%;max-width:100%;height: 200px;" id="dxJSONinputExport"></textarea>');
		var buttonClose = $('<input type="button" id="dxJSONinputCloseExport" value="Close" style="cursor:pointer;"/>');
		buttonClose.click(function() {
			$('#dxWrapperExport').remove();
			return;
		});
		wrapper.append(textarea);
		wrapper.append(buttonClose);
		wrapper.append('<br /><br />Copy and Import to <a href="http://ingress.dennesabing.com">Dx Field Simulator</a></a>');
		$("#toolbox").append(wrapper);
		self.updateExport();
	};

	//Self PHP JS Explode
	self.__explode = function(delimiter, string, limit)
	{
		if (arguments.length < 2 || typeof delimiter === 'undefined' || typeof string === 'undefined')
			return null;
		if (delimiter === '' || delimiter === false || delimiter === null)
			return false;
		if (typeof delimiter === 'function' || typeof delimiter === 'object' || typeof string === 'function' || typeof string ===
				'object') {
			return {
				0: ''
			};
		}
		if (delimiter === true)
			delimiter = '1';
		delimiter += '';
		string += '';
		var s = string.split(delimiter);
		if (typeof limit === 'undefined')
			return s;
		if (limit === 0)
			limit = 1;
		if (limit > 0) {
			if (limit >= s.length)
				return s;
			return s.slice(0, limit - 1)
					.concat([s.slice(limit - 1)
								.join(delimiter)
					]);
		}
		if (-limit >= s.length)
			return [];
		s.splice(s.length + limit);
		return s;
	};
	// setup function called by IITC
	self.setup = function init() {
		var linkImport = $("<a onclick=\"window.plugin.dxplugin.import();\" title=\"Import Dx JSON String\">Import DxJSON</a>");
		var linkExport = $("<a onclick=\"window.plugin.dxplugin.export();\" title=\"Export Dx JSON Portals\">Export DxPortals</a>");
		var linkDx = $("<a target=\"_blank\" href=\"http://ingress.dennesabing.com\" title=\"Dx Field Simulator\">DxFieldSim</a>");
		$("#toolbox").append(linkImport);
		$("#toolbox").append(linkExport);
		$("#toolbox").append(linkDx);

		window.addHook('portalDetailsUpdated', function(e) {
			self.portalDetailsUpdated(e);
		});

		delete self.setup;
	};

	// IITC plugin setup
	if (window.iitcLoaded && typeof self.setup === "function") {
		self.setup();
	} else if (window.bootPlugins) {
		window.bootPlugins.push(self.setup);
	} else {
		window.bootPlugins = [self.setup];
	}
}
// inject plugin into page
var script = document.createElement("script");
script.appendChild(document.createTextNode("(" + wrapper + ")();"));
(document.body || document.head || document.documentElement).appendChild(script);