MediaWiki:Gadget-trailblazer.js

From RuneRealm Wiki

This is an old revision of this page, as edited by Alex (talk | contribs) at 17:15, 17 October 2024. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Jump to navigation Jump to search

After saving, you may need to bypass your browser's cache to see the changes. For further information, see Wikipedia:Bypass your cache.

  • In most Windows and Linux browsers: Hold down Ctrl and press F5.
  • In Safari: Hold down ⇧ Shift and click the Reload button.
  • In Chrome and Firefox for Mac: Hold down both ⌘ Cmd+⇧ Shift and press R.
/**
* Displays locked/unlocked Trailblazer League regions
*
* @version 1.1
* @author Elessar2
* 
*/

/*
* Classses used:
* tbz-region/tbz-badge (to specify that it's an area element)
* tbz-int-button (opens the interface instead of link)
* attribute: data-tbz-area="[area id]" where [area id] is the area id (see tbareas below)
*
* Sets:
* tbz-locked
* tbz-unlocked
* tbz-int-button (to first link in tbz-region if #links > 1)
*/

/*global jQuery, mediaWiki, mw, rswiki, rs, ga */
'use strict';

;(function($, mw, rs){
var portletLink;

var rswtbz = {
	// localStorage key
	localKey: 'rsw-tbz-localstorage',

	formConst: false,
	formMade: false,

	// Settings
	settings: {
		dcache: '1970-01-01T01:00:00+00:00',
		areas: [ 'misthalin' ],
		cache: {
			curupdate: []
		}
	},

	/**
	 * Starts the events gadget
	 * @return {undefined}
	 */
	init: function () {
		mw.log('Starting Trailblazer Gadget');

		portletLink = mw.util.addPortletLink(
			'p-personal',
			'',
			'League',
			'pt-events',
			'Trailblazer Reloaded League preferences',
			null,
			$('#pt-userpage, #pt-anonuserpage')
		);

		$(portletLink).find('a').addClass('oo-ui-icon-calendar').click(rswtbz.openInt);
		rswtbz.initButtons();

		// Load settings and events from localStorage page load to handle locked/unlocked
		rswtbz.loadSettings().then( function () {
			if (rswtbz.settings.areas && rswtbz.settings.areas.length) {
				rswtbz.updateAreas();
			}
		}, function () {
			console.warn('Error loading events settings!');
		});
	},

	/**
	 * Opens the interface (and initialises if not done yet)
	 * Is a click() event handler
	 * @param  {eventObject} jQuery event object
	 * @return {undefined}
	 */
	openInt: function (e) {
		e.preventDefault();
		var openPopup = function() {
			mw.log('Open trailblazer popup');
			rswtbz.loadSettings().then(rswtbz.updateAll(), rswtbz.updateAll());

			// Google analytics tracker
			if (typeof ga === 'function') {
				ga('gtag_UA_126479006_1.send', 'event', 'Gadget-trailblazer', 'Open', 'Normal');
			}

			// Start constant update
			clearInterval(rswtbz.updatetimer);
			rswtbz.updatetimer = setInterval(rswtbz.update, 60000);
			
			window.OOUIWindowManager.openWindow( 'trailblazerPopup' );
		};
		if (!rswtbz.formMade && !rswtbz.formConst) {
			mw.log('Loading trailblazer modal script');
			rswtbz.formConst = true;
			mw.loader.using(['moment', 'mediawiki.api', 'oojs-ui-core', 'oojs-ui-windows', 'oojs-ui-widgets', 'ext.gadget.trailblazer-modal']).then( function () {
				rswtbz.initInt().then(openPopup);
			}, function (err) {
				mw.warn('Failed to load modal js');
				mw.log(err);
				rswtbz.formConst = false;
				throw 'Failed to load modal js';
			});
		} else if (!rswtbz.formConst) {
			openPopup();
		} else {
			mw.log('Waiting for initialisation to finish');
		}
	},

	/**
	 * Adds links to open interface to trailblazer region buttons
	 * @return {undefined}
	 */
	initButtons: function () {
		$('.tbz-int-button').each(function() {
			$(this).click(rswtbz.openInt);
		});
		$('.tbz-region,.tbz-badge').each(function() {
			if (!$(this).hasClass("tbz-no-global")) {
				$(this).click(rswtbz.openInt).children('a').click(function (e) {
					e.stopPropagation();
				});
			}
		});
	},

	/**
	 * Loads settings from browser localStorage
	 * @return {Promise}
	 */
	loadSettings: function () {
		mw.log('Loading settings');
		return new Promise( function (resolve, reject) {
			if (!rs.hasLocalStorage()) {
				console.warn('Browser does not support localStorage');
				reject();
			}

			var prefs = {};
			try {
				prefs = JSON.parse(localStorage.getItem(rswtbz.localKey));
			} catch (err) {
				prefs = {};
				console.warn('Error loading settings (events)');
			}
			for (var p in prefs) {
				rswtbz.settings[p] = prefs[p];
			}
			resolve();
		} );
	},

	/**
	 * Updates the areas unlocked
	 * @return {undefined}
	 */
	updateAreas: function () {
		mw.log('Updating areas');
		if (!Array.isArray(rswtbz.settings.areas)) {
			rswtbz.settings.areas = ['misthalin'];
		}

		$('.tbz-region,.tbz-badge').each(function() {
			if (!$(this).hasClass("tbz-no-global")) {
				var obj = $(this),
					areaid = obj.attr('data-tbz-area');
				var areaList = areaid.split('&');
				var allRegionsUnlocked = areaList.every(
					function(area) {
						return rswtbz.settings.areas.indexOf(area) !== -1;
					}
				);
				if (allRegionsUnlocked) {
					obj.removeClass('tbz-locked');
					obj.addClass('tbz-unlocked');
				} else {
					obj.removeClass('tbz-unlocked');
					obj.addClass('tbz-locked');
				}
			}
		});
	}
};

mw.loader.using(['ext.gadget.rsw-util'], function () {
	$(rswtbz.init);
	window.rswtbz = rswtbz;
});

}(jQuery, mediaWiki, rswiki));