Welcome to IOPWiki, Commander.
We are searching for new editors to keep track of Girls' Frontline 2 content, as well as veteran players to complete existing Girls' Frontline and Project Neural Cloud articles.
You can contribute without an account. Learn how to contribute and join our Discord server.

MediaWiki:Gadget-tooltip.js

Welcome to IOP Wiki. This website is maintained by the Girls' Frontline community and is free to edit by anyone.
Revision as of 12:38, 7 November 2019 by Messing with data (talk | contribs) (Changed to new pattern)
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**
 * Tooltip.js
 * A basic script that applies a mouseover tooltip functionality to all elements of a page that have a data-tooltip attribute
 * Matthias Schuetz, http://matthiasschuetz.com
 *
 * Copyright (C) Matthias Schuetz
 * Free to use under the MIT license
 * 
 * --------
 * 
 * This is a modified version not using text but spans inside so I can display some more complex nodes.
 */

if (!window.tooltipGadget) {
	var tooltipEngine = {};

	tooltipEngine._options = {
		tooltipId: "tooltip",
		offsetDefault: 15
	};

	tooltipEngine._tooltips = [];
	tooltipEngine._tooltipsTemp = null;

	tooltipEngine._bindTooltips = function(resetTooltips) {
		console.log("Booting up tooltips.");
		
		if (resetTooltips) {
			tooltipEngine._tooltipsTemp = tooltipEngine._tooltips.concat();
			tooltipEngine._tooltips = [];
		}
		
		var tooltippedElements = document.querySelectorAll("[data-tooltip]");
		console.log("Tooltip element count: ", tooltippedElements.length);

		Array.prototype.forEach.call(tooltippedElements, function(elm, idx) {
			var tooltipText = null;
			var contents = elm.getElementsByClassName("tooltip-content");
			if (contents.length > 0) {
				tooltipText = contents[0];
				elm.removeChild(contents[0]);
				console.log("Tooltip set up for", elm);
			} else {
				console.log("No content found for tooltipped element:", elm);
			}
			var options;

			if (resetTooltips && tooltipEngine._tooltipsTemp.length && tooltipEngine._tooltipsTemp[idx] && tooltipEngine._tooltipsTemp[idx].text) {
				if (tooltipText.length === 0) {
					tooltipText = _tooltipsTemp[idx].text;
				}

				elm.removeEventListener("mousemove", tooltipEngine._onElementMouseMove);
				elm.removeEventListener("mouseout", tooltipEngine._onElementMouseOut);
				elm.removeEventListener("mouseover", tooltipEngine._onElementMouseOver);
			}

			if (tooltipText) {
				elm.setAttribute("data-tooltip-id", idx);
				options = tooltipEngine._parseOptions(elm.getAttribute("data-tooltip"));
				
				tooltipEngine._tooltips[idx] = {
					text: tooltipText,
					options: options
				};

				elm.addEventListener("mousemove", tooltipEngine._onElementMouseMove);
				elm.addEventListener("mouseout", tooltipEngine._onElementMouseOut);
				elm.addEventListener("mouseover", tooltipEngine._onElementMouseOver);
			}
		});

		if (resetTooltips) {
			tooltipEngine._tooltipsTemp = null;
		}
	};

	tooltipEngine._createTooltip = function(text, tooltipId) {
		var tooltipElm = document.createElement("div");
		var tooltipText = text;
		var options = tooltipId && tooltipEngine._tooltips[tooltipId] && tooltipEngine._tooltips[tooltipId].options;

		if (options && options["class"]) {
			tooltipElm.setAttribute("class", options["class"]);
		}

		tooltipElm.setAttribute("id", tooltipEngine._options.tooltipId);
		tooltipElm.appendChild(tooltipText);

		document.querySelector("body").appendChild(tooltipElm);
	};

	tooltipEngine._getTooltipElm = function() {
		return document.querySelector("#" + tooltipEngine._options.tooltipId);
	};

	tooltipEngine._onElementMouseMove = function(evt) {
		var tooltipId = this.getAttribute("data-tooltip-id");
		var tooltipElm = _getTooltipElm();
		var options = tooltipId && tooltipEngine._tooltips[tooltipId] && tooltipEngine._tooltips[tooltipId].options;
		var offset = options && options.offset || tooltipEngine._options.offsetDefault;
		var scrollY = window.scrollY || window.pageYOffset;
		var scrollX = window.scrollX || window.pageXOffset;
		var tooltipTop = evt.pageY + offset;
		var tooltipLeft = evt.pageX + offset;

		if (tooltipElm) {
			tooltipTop = (tooltipTop - scrollY + tooltipElm.offsetHeight + 20 >= window.innerHeight ? (tooltipTop - tooltipElm.offsetHeight - 20) : tooltipTop);
			tooltipLeft = (tooltipLeft - scrollX + tooltipElm.offsetWidth + 20 >= window.innerWidth ? (tooltipLeft - tooltipElm.offsetWidth - 20) : tooltipLeft);

			tooltipElm.style.top = tooltipTop + "px";
			tooltipElm.style.left = tooltipLeft + "px";
		}
	};

	tooltipEngine._onElementMouseOut = function(evt) {
		var tooltipElm = tooltipEngine._getTooltipElm();

		if (tooltipElm) {
			document.querySelector("body").removeChild(tooltipElm);
		}
	};

	tooltipEngine._onElementMouseOver = function(evt) {
		var tooltipId = this.getAttribute("data-tooltip-id");
		var tooltipText = tooltipId && tooltipEngine._tooltips[tooltipId] && tooltipEngine._tooltips[tooltipId].text;

		if (tooltipText) {
			tooltipEngine._createTooltip(tooltipText, tooltipId);	
		}
	};

	tooltipEngine._parseOptions = function(options) {
		var optionsObj;

		if (options.length) {
			try {
				optionsObj = JSON.parse(options.replace(/'/ig, "\""));
			} catch(err) {
				console.log(err);
			}
		}

		return optionsObj;
	};

	tooltipEngine._init = function() {
		console.log("Loading tooltips...");
		try {
			document.addEventListener("DOMContentLoaded", tooltipEngine._bindTooltips);
		} catch(err) {
			console.log(err);
		}
	}

	window.tooltipGadget = tooltipEngine;
}

window.tooltipGadget._init();