Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/* ======================================================== *\
**			igloo frontend manager - init
**			@author Kangaroopower
**			igloo concept and initial code by Alex Barley (User:Ale_jrb on Wikipedia)
\* ======================================================== */

function iglooInitControl() {
	var iglooInit = this,
		remoteConnect = false,
		firstRun = false,
		connectLocal = false, //this is never used except when iglooNet is down
		sessionKey;
		
	// initialisation sequence
	this.init = function(callback) {
		switch (callback) {
			default:
				document.title = 'igloo is loading - please wait';
				igLauncher.runIglooInterface.startInterface();
				break;
			case '1':
				igLauncher.runIglooInterface.addStatus('- Checking for usergroups...');
				var groups = mw.config.get('wgUserGroups');

				for ( var i = 0; i < groups.length; i ++ ) {
					if ( (groups[i] === 'rollbacker') || (groups[i] === 'users') || (groups[i] === 'Unit388') ) { 
						igLauncher.runIglooInterface.addStatus('- Usergroup OK!'); 
						setTimeout(function() { 
							igLauncher.runIglooInit.init('2'); 
						}, 500); 
						return true; 
					}
				}

				igLauncher.runIglooInterface.addStatus('<div style="color: #dd6666;">- Warning: rollback rights are required to use igloo. Loading stopped.</div>', true);
				break;
			case '2':
				igLauncher.runIglooInterface.addStatus('- Checking read API...');

				if (true === true) { 
					igLauncher.runIglooInterface.addStatus('- Read API OK!'); 
				} else { 
					igLauncher.runIglooInterface.addStatus('<div style="color: #dd6666;">- Warning: read API access is requried for igloo for run. Loading stopped.</div>', true); 
					return false; 
				}

				igLauncher.runIglooInterface.addStatus('- Checking write API...');
					
				if (true === true) { 
					igLauncher.runIglooInterface.addStatus('- Write API OK!'); 
				} else { 
					igLauncher.runIglooInterface.addStatus('<div style="color: #dd6666;">- Warning: write API access is requried for igloo for run. Loading stopped.</div>', true); 
					return false; 
				}

				setTimeout(function() { 
					igLauncher.runIglooInit.init('3'); 
				}, 500);
				break;
			case '3':
				igLauncher.runIglooInterface.addStatus('');
				igLauncher.runIglooInterface.addStatus('- Retrieving resources...');
				
				iglooImport('https://raw.github.com/Kangaroopower/Igloo/'+ iglooBranch +'/src/glooMain.js', true).onload = function () {
					igLauncher.runIglooInterface.addStatus('- Retrieved Resources!');
					setTimeout(function() {
						igLauncher.runIglooInit.init('4'); 
					}, 500);
				};

				break;
			case '4':
				igLauncher.runIglooInterface.addStatus('');
				igLauncher.runIglooInterface.addStatus('- Retrieving settings...');
				
				if (mw.user.options.get('userjs-iglooFirstRun') === null) {
					firstRun = true;
					Flash('preferences').load({key: 'userjs-iglooFirstRun', value: 'false'}).wait(function (data) {
						setTimeout(function() {
							igLauncher.runIglooInit.init('5'); 
						}, 500);
					}).run();
				} else {
					setTimeout(function() {
						igLauncher.runIglooInit.init('5'); 
					}, 500);
				}

				break;
			case '5':
				if (/*mw.user.options.get('userjs-iglooRemoteConnect') === null ||*/ firstRun === true) {
					var remoteClick = false;
					firstRun = true;

					/*igLauncher.runIglooInterface.addStatus('Note: This appears to be your first time connecting to igloo');
					igLauncher.runIglooInterface.addStatus('<span style="font-color:red">You should no that there are two ways to store data in igloo- iglooNet and locally</span>');
					igLauncher.runIglooInterface.addStatus('');
					igLauncher.runIglooInterface.addStatus('iglooNet is a remote server hosted on Wikimedia Labs, but run by igloo developers.');
					igLauncher.runIglooInterface.addStatus('<span style="color:red">We don\'t collect IP adresses or any other personal info, just user defined settings and a session key tied to your account</span>'); 
					igLauncher.runIglooInterface.addStatus('');
					igLauncher.runIglooInterface.addStatus('Connecting locally means that your settings are stored on Wikipedia.');
					igLauncher.runIglooInterface.addStatus('<span style="font-color:red">This is less reliable, and settings may vanish, but it also means that nobody else (except the WMF) can see your settings.</span>');
					igLauncher.runIglooInterface.addStatus('');
					igLauncher.runIglooInterface.addStatus('Before we proceed further, igloo will require you to choose a method of connection');
					igLauncher.runIglooInterface.addStatus('You will always be allowed to reset your method of storage later through the settings module in igloo.');
					igLauncher.runIglooInterface.addStatus('');
					igLauncher.runIglooInterface.addStatus('One last note: If you choose to connect to iglooNet, igloo still stores settings locally as a backup in case iglooNet is down.');
					igLauncher.runIglooInterface.addStatus('However, if you store settings only locally and they are lost, there is no way to retrieve them.');
					igLauncher.runIglooInterface.addStatus('');
					igLauncher.runIglooInterface.addStatus('<center><span id="ig-remoteConnect" style="margin:auto; width: 170px; border: 1px solid rgb(68, 68, 68); background-color: rgb(241, 241, 241); color: #0b0080; font-size: 1.35em; font-weight: bold; text-align: center; cursor: pointer;">Connect Remotely</span>&nbsp;<span id="ig-localConnect" style="margin:auto; width: 170px; border: 1px solid rgb(68, 68, 68); background-color: rgb(241, 241, 241); color: #0b0080; font-size: 1.35em; font-weight: bold; text-align: center; cursor: pointer;">Connect Locally</span></center>');
					igLauncher.runIglooInterface.addStatus(''); */

					igLauncher.runIglooInterface.addStatus('Note: This appears to be your first time connecting to igloo');
					igLauncher.runIglooInterface.addStatus('Please note that Igloo stores your settings on Wikipedia\'s servers and has no access to it');

					/* $('#ig-remoteConnect').click(function () {
						remoteClick = true;
						Flash('preferences').load({key: 'userjs-iglooRemoteConnect', value: 'true'}).wait(function (data) {
							igLauncher.runIglooInterface.addStatus('You have decided to store settings remotely. You can change this later in igloo settings.');
							remoteConnect = true;

							//connect to server here and retrieve session key

							setTimeout(function() {
								igLauncher.runIglooInit.init('6'); 
							}, 500);
						}).run();
					}); */

					//$('#ig-localConnect').click(function () {
					//	if (remoteClick) return;
						
						Flash('preferences').load({key: 'userjs-iglooRemoteConnect', value: 'false'}).wait(function (data) {
							igLauncher.runIglooInterface.addStatus('You have decided to store settings locally. You can change this later in igloo settings.');
							remoteConnect = false;
							sessionKey = null;

							setTimeout(function() {
								igLauncher.runIglooInit.init('6'); 
							}, 500);
						}).run();
					//});

				} /*else if (mw.user.options.get('userjs-iglooRemoteConnect') === "true" && connectLocal !== true) {
					firstRun = false;
					remoteConnect = true;

					igLauncher.runIglooInterface.addStatus('<span style="font-color:red">At some time in the past, you decided to connect to iglooNet.</span>'); 
					igLauncher.runIglooInterface.addStatus('If you wish to connect locally instead, please change this in your igloo settings.');
					igLauncher.runIglooInterface.addStatus('Remember, igloo only stores settings and a session id- no IP adresses or personal info.');
					igLauncher.runIglooInterface.addStatus('');

					//Connect to server here
					//include way to see if server is online, and if not, redo iglooInit step 5
					//except with the way to connect locally instead

					setTimeout(function() {
						igLauncher.runIglooInit.init('6'); 
					}, 500);
				} */else {
					remoteConnect = false;
					firstRun = false;
					sessionKey = null;

					/*igLauncher.runIglooInterface.addStatus('You have decided to connect locally, hosting your settings on Wikipedia servers'); 
					igLauncher.runIglooInterface.addStatus('This means igloo does not host any info on you, but your info can also be lost more easily.');
					igLauncher.runIglooInterface.addStatus('If you wish to change and connect to iglooNet, you may do so in iglooSettings');
					igLauncher.runIglooInterface.addStatus('');*/

					setTimeout(function() {
						igLauncher.runIglooInit.init('6'); 
					}, 500);
				}

				break;
			case '6':
				igLauncher.runIglooInterface.addStatus('Loading complete! igloo will launch in a few seconds...');
				setTimeout(function() {
					iglooHandleLaunch({
						isFirstRun: firstRun,
						doRemoteConnect: remoteConnect,
						sessionId: sessionKey,
						isDown: connectLocal
					});
				}, 1000);

				break;
		}
	};
}
	
function iglooInitInterface() {
	var iglooInterface	= this;
	this.iglooStatus = [];
		
	this.startInterface = function() {
		// blank page, generate interface object to work with.
		this.canvas = new jin.Canvas();
		this.canvas.setFullScreen(true);

		// Create Background
		this.iglooBack = new jin.Panel();
		this.iglooBack.setPosition(0, 0);
		this.iglooBack.setSize(0, 0);
		this.iglooBack.setColour(jin.Colour.LIGHT_GREY);
			
		//Secondary Background
		this.initInterface = new jin.Panel();
		this.initInterface.setPosition(0, 0);
		this.initInterface.setSize(650, 400);
		this.initInterface.setColour(jin.Colour.LIGHT_GREY);
			
		//Status Window	
		this.initInterfaceStatus = new jin.Panel();
		this.initInterfaceStatus.setPosition(100, 17);
		this.initInterfaceStatus.setSize(450, 350);
		this.initInterfaceStatus.setColour(jin.Colour.WHITE);
			
		// Combine interface elements.
		this.initInterface.add(this.initInterfaceStatus);
		this.canvas.add(this.iglooBack);
		this.canvas.add(this.initInterface);
			
		// Do initial render.
		this.canvas.render(jin.getDocument());

		//Content and extra css
		this.center(this.initInterface.panel, [0, -50]);

		$(this.initInterfaceStatus.panel).css({
			padding: '7px',
			border: '1px solid '+ jin.Colour.DARK_GREY,
			'font-size': '10px'
		});

		$(this.initInterfaceStatus.panel).append('<div style="padding-top: 9px;">Welcome to igloo! Please be patient while igloo starts up, as this can take some time.<div id="iglooStatusContent" style="padding-top: 6px;"></div></div>');
			
			
		setTimeout(function() { 
			igLauncher.runIglooInit.init('1'); 
		}, 500);
	};
		
	this.addStatus = function(message, noEndline) {
		// add a message to the status output, and display it.
		if (this.iglooStatus.length > 20) this.iglooStatus.splice(0, 1);
			
		if (!noEndline) {
			message += '<br />';
		}
			
		this.iglooStatus.push(message);			
		
		if (document.getElementById('iglooStatusContent') !== null) {
			document.getElementById('iglooStatusContent').innerHTML = this.iglooStatus.join('');
			return true;
		} else { 
			return false;
		}
	};

	this.center = function (el, offset) {
		// center - places the window in the centre of the user's screen. set maintainCenter to true and this position will be kept even if
		// the window is resized.
	 
		var screenWidth = parseInt(this.canvas.canvasBase.children[0].style.width, 10),
			screenHeight = parseInt(this.canvas.canvasBase.children[0].style.height, 10),
			myWidth = el.offsetWidth,
			myHeight = el.offsetHeight,
			leftPos	= ((screenWidth / 2) - (myWidth / 2)),
			topPos	= ((screenHeight / 2) - (myHeight / 2)),
			me = this;
	 
		if ($.isArray(offset)) {
			leftPos += offset[0];
			topPos	+= offset[1];
		}

		$(el).css({
			'left': leftPos + 'px',
			'top':  topPos + 'px'
		});

		$(window).resize(function() {
			me.center(el, offset);
		});

		return true;
	};
}
	

function iglooInit () {
	//Perform page checks
	this.runIglooInterface = new iglooInitInterface();
	this.runIglooInit = new iglooInitControl();

	this.launch = function () {
		if (mw.config.get('wgPageName') !== 'Wikipedia:Igloo/run' || mw.config.get('wgAction') !== 'view') return;
		this.runIglooInit.init();
	};
}

var igLauncher = new iglooInit();
igLauncher.launch();