isolated script scope

This commit is contained in:
e7d 2016-11-11 10:01:18 +01:00
parent 76576ef297
commit bf1bbfd141

View File

@ -1,302 +1,304 @@
$.urlParam = function(name) { (function(window, document, undefined) {
var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href); $.urlParam = function(name) {
if (results === null) { var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
return null; if (results === null) {
} else { return null;
return decodeURIComponent(results[1]) || 0; } else {
} return decodeURIComponent(results[1]) || 0;
}; }
};
var haveEvents = 'ongamepadconnected' in window; var haveEvents = 'ongamepadconnected' in window;
var gamepads = {}; var gamepads = {};
var $gamepad = $('.gamepad'); var $gamepad = $('.gamepad');
var $nogamepad = $('.no-gamepad'); var $nogamepad = $('.no-gamepad');
var $help = $('.help'); var $help = $('.help');
var gamepadIdentifiers = { var gamepadIdentifiers = {
'ds4': { 'ds4': {
'id': /054c.*?05c4/, 'id': /054c.*?05c4/,
'colors': ['black', 'white', 'red', 'blue'] 'colors': ['black', 'white', 'red', 'blue']
}, },
'xbox-one': { 'xbox-one': {
'id': /xinput|XInput/, 'id': /xinput|XInput/,
'colors': ['black', 'white'] 'colors': ['black', 'white']
} }
}; };
var gamepadHelpTimeout = null; var gamepadHelpTimeout = null;
var gamepadHelpDelay = 10000; var gamepadHelpDelay = 10000;
var activeGamepadIndex = null; var activeGamepadIndex = null;
var activeGamepadType = null; var activeGamepadType = null;
var activeGamepadIdentifier = null; var activeGamepadIdentifier = null;
var activeGamepadColorIndex = null; var activeGamepadColorIndex = null;
var activeGamepadColorName = null; var activeGamepadColorName = null;
var activeGamepadZoomLevel = 1; var activeGamepadZoomLevel = 1;
var mapping = { var mapping = {
buttons: [], buttons: [],
axes: [] axes: []
}; };
window.addEventListener("gamepadconnected", onGamepadConnect); window.addEventListener("gamepadconnected", onGamepadConnect);
window.addEventListener("gamepaddisconnected", onGamepadDisconnect); window.addEventListener("gamepaddisconnected", onGamepadDisconnect);
window.addEventListener("keydown", onKeyDown); window.addEventListener("keydown", onKeyDown);
displayGamepadHelp();
function displayGamepadHelp() {
gamepadHelpTimeout = window.setTimeout(function() {
$nogamepad.fadeIn();
}, gamepadHelpDelay);
}
function hideGamepadHelp() {
window.clearTimeout(gamepadHelpTimeout);
$nogamepad.hide();
}
function onGamepadConnect(e) {
addGamepad(e.gamepad);
}
function onGamepadDisconnect(e) {
removeGamepad(e.gamepad.index);
}
function onKeyDown(e) {
switch (e.code) {
case "Delete":
case "Escape":
removeGamepad(activeGamepadIndex);
break;
case "KeyC":
changeGamepadColor();
break;
case "KeyH":
toggleHelp();
break;
case "NumpadAdd":
case "Equal":
changeZoom("+");
break;
case "NumpadSubtract":
case "Minus":
changeZoom("-");
break;
case "Numpad0":
case "Digit0":
changeZoom("0");
break;
}
}
function getGamepads() {
return navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);
}
function addGamepad(gamepad) {
gamepads[gamepad.index] = gamepad;
}
function removeGamepad(gamepadIndex) {
if (gamepadIndex === activeGamepadIndex) {
activeGamepadIndex = null;
$gamepad.empty();
}
delete gamepads[gamepadIndex];
displayGamepadHelp(); displayGamepadHelp();
} function displayGamepadHelp() {
gamepadHelpTimeout = window.setTimeout(function() {
setInterval(scanGamepads, 500); $nogamepad.fadeIn();
function scanGamepads() { }, gamepadHelpDelay);
if (null !== activeGamepadIndex) { }
return; function hideGamepadHelp() {
window.clearTimeout(gamepadHelpTimeout);
$nogamepad.hide();
} }
gamepads = getGamepads(); function onGamepadConnect(e) {
for (var gamepadIndex = 0; gamepadIndex < gamepads.length; gamepadIndex++) { addGamepad(e.gamepad);
var gamepad = gamepads[gamepadIndex]; }
if (gamepad) {
if (gamepad.index in gamepads) { function onGamepadDisconnect(e) {
gamepads[gamepad.index] = gamepad; removeGamepad(e.gamepad.index);
}
function onKeyDown(e) {
switch (e.code) {
case "Delete":
case "Escape":
removeGamepad(activeGamepadIndex);
break;
case "KeyC":
changeGamepadColor();
break;
case "KeyH":
toggleHelp();
break;
case "NumpadAdd":
case "Equal":
changeZoom("+");
break;
case "NumpadSubtract":
case "Minus":
changeZoom("-");
break;
case "Numpad0":
case "Digit0":
changeZoom("0");
break;
}
}
function getGamepads() {
return navigator.getGamepads ? navigator.getGamepads() : (navigator.webkitGetGamepads ? navigator.webkitGetGamepads() : []);
}
function addGamepad(gamepad) {
gamepads[gamepad.index] = gamepad;
}
function removeGamepad(gamepadIndex) {
if (gamepadIndex === activeGamepadIndex) {
activeGamepadIndex = null;
$gamepad.empty();
}
delete gamepads[gamepadIndex];
displayGamepadHelp();
}
setInterval(scanGamepads, 500);
function scanGamepads() {
if (null !== activeGamepadIndex) {
return;
}
gamepads = getGamepads();
for (var gamepadIndex = 0; gamepadIndex < gamepads.length; gamepadIndex++) {
var gamepad = gamepads[gamepadIndex];
if (gamepad) {
if (gamepad.index in gamepads) {
gamepads[gamepad.index] = gamepad;
}
for (var buttonIndex = 0; buttonIndex < gamepad.buttons.length; buttonIndex++) {
button = gamepad.buttons[buttonIndex];
if (null === activeGamepadIndex && button.pressed) {
mapGamepad(gamepad);
}
}
}
}
}
function mapGamepad(gamepad) {
var button;
var axis;
activeGamepadIndex = gamepad.index;
hideGamepadHelp();
for (var gamepadType in gamepadIdentifiers) {
if (gamepadIdentifiers[gamepadType].id.test(gamepad.id)) {
activeGamepadType = gamepadType;
activeGamepadIdentifier = gamepadIdentifiers[gamepadType];
activeGamepadColorIndex = 0;
}
}
$.ajax(
'templates/' + activeGamepadType + '/template.html', {
async: true
}
).done(function(template) {
$gamepad.html(template);
if ($.urlParam('color')) {
changeGamepadColor($.urlParam('color'));
}
if ($.urlParam('c')) {
changeGamepadColor($.urlParam('c'));
} }
if ($.urlParam('zoom')) {
changeZoom($.urlParam('zoom'));
}
if ($.urlParam('z')) {
changeZoom($.urlParam('z'));
}
mapping.buttons = [];
for (var buttonIndex = 0; buttonIndex < gamepad.buttons.length; buttonIndex++) { for (var buttonIndex = 0; buttonIndex < gamepad.buttons.length; buttonIndex++) {
button = gamepad.buttons[buttonIndex]; button = gamepad.buttons[buttonIndex];
if (null === activeGamepadIndex && button.pressed) { mapping.buttons[buttonIndex] = $('[data-button=' + buttonIndex + ']');
mapGamepad(gamepad); }
}
mapping.axes = [];
for (var axisIndex = 0; axisIndex < gamepad.axes.length; axisIndex++) {
axis = gamepad.axes[axisIndex];
mapping.axes[axisIndex] = $('[data-axis-x=' + axisIndex + '], [data-axis-y=' + axisIndex + '], [data-axis-z=' + axisIndex + ']');
}
updateVisualStatus();
});
}
function updateVisualStatus() {
if (null === activeGamepadIndex) {
return;
}
gamepads = getGamepads();
var activeGamepad = gamepads[activeGamepadIndex];
if (!activeGamepad) {
return;
}
requestAnimationFrame(updateVisualStatus);
var button;
var $button;
for (var buttonIndex = 0; buttonIndex < activeGamepad.buttons.length; buttonIndex++) {
$button = mapping.buttons[buttonIndex];
if (!$button) {
break;
}
button = activeGamepad.buttons[buttonIndex];
$button.attr('data-pressed', button.pressed);
$button.attr('data-value', button.value);
if ("function" === typeof updateButton) {
updateButton($button);
}
}
var axis;
var $axis;
for (var axisIndex = 0; axisIndex < activeGamepad.axes.length; axisIndex++) {
$axis = mapping.axes[axisIndex];
if (!$axis) {
break;
}
axis = activeGamepad.axes[axisIndex];
if ($axis.is('[data-axis-x=' + axisIndex + ']')) {
$axis.attr('data-value-x', axis);
}
if ($axis.is('[data-axis-y=' + axisIndex + ']')) {
$axis.attr('data-value-y', axis);
}
if ($axis.is('[data-axis-z=' + axisIndex + ']')) {
$axis.attr('data-value-z', axis);
}
if ("function" === typeof updateAxis) {
updateAxis($axis);
} }
} }
} }
}
function mapGamepad(gamepad) { function changeGamepadColor(gamepadColor) {
var button; if (! activeGamepadIdentifier) {
var axis; return;
activeGamepadIndex = gamepad.index;
hideGamepadHelp();
for (var gamepadType in gamepadIdentifiers) {
if (gamepadIdentifiers[gamepadType].id.test(gamepad.id)) {
activeGamepadType = gamepadType;
activeGamepadIdentifier = gamepadIdentifiers[gamepadType];
activeGamepadColorIndex = 0;
}
}
$.ajax(
'templates/' + activeGamepadType + '/template.html', {
async: true
}
).done(function(template) {
$gamepad.html(template);
if ($.urlParam('color')) {
changeGamepadColor($.urlParam('color'));
}
if ($.urlParam('c')) {
changeGamepadColor($.urlParam('c'));
} }
if ($.urlParam('zoom')) { if (!! gamepadColor) {
changeZoom($.urlParam('zoom')); if (! isNaN(parseInt(gamepadColor))) {
} activeGamepadColorIndex = gamepadColor;
if ($.urlParam('z')) { activeGamepadColorName = activeGamepadIdentifier.colors[activeGamepadColorIndex];
changeZoom($.urlParam('z')); } else {
} activeGamepadColorName = gamepadColor;
activeGamepadColorIndex = 0;
mapping.buttons = []; for (var gamepadColorName in activeGamepadIdentifier.colors) {
for (var buttonIndex = 0; buttonIndex < gamepad.buttons.length; buttonIndex++) { if (activeGamepadColorName === gamepadColorName) {
button = gamepad.buttons[buttonIndex]; break;
mapping.buttons[buttonIndex] = $('[data-button=' + buttonIndex + ']'); }
} activeGamepadColorIndex++;
}
mapping.axes = []; }
for (var axisIndex = 0; axisIndex < gamepad.axes.length; axisIndex++) {
axis = gamepad.axes[axisIndex];
mapping.axes[axisIndex] = $('[data-axis-x=' + axisIndex + '], [data-axis-y=' + axisIndex + '], [data-axis-z=' + axisIndex + ']');
}
updateVisualStatus();
});
}
function updateVisualStatus() {
if (null === activeGamepadIndex) {
return;
}
gamepads = getGamepads();
var activeGamepad = gamepads[activeGamepadIndex];
if (!activeGamepad) {
return;
}
requestAnimationFrame(updateVisualStatus);
var button;
var $button;
for (var buttonIndex = 0; buttonIndex < activeGamepad.buttons.length; buttonIndex++) {
$button = mapping.buttons[buttonIndex];
if (!$button) {
break;
}
button = activeGamepad.buttons[buttonIndex];
$button.attr('data-pressed', button.pressed);
$button.attr('data-value', button.value);
if ("function" === typeof updateButton) {
updateButton($button);
}
}
var axis;
var $axis;
for (var axisIndex = 0; axisIndex < activeGamepad.axes.length; axisIndex++) {
$axis = mapping.axes[axisIndex];
if (!$axis) {
break;
}
axis = activeGamepad.axes[axisIndex];
if ($axis.is('[data-axis-x=' + axisIndex + ']')) {
$axis.attr('data-value-x', axis);
}
if ($axis.is('[data-axis-y=' + axisIndex + ']')) {
$axis.attr('data-value-y', axis);
}
if ($axis.is('[data-axis-z=' + axisIndex + ']')) {
$axis.attr('data-value-z', axis);
}
if ("function" === typeof updateAxis) {
updateAxis($axis);
}
}
}
function changeGamepadColor(gamepadColor) {
if (! activeGamepadIdentifier) {
return;
}
if (!! gamepadColor) {
if (! isNaN(parseInt(gamepadColor))) {
activeGamepadColorIndex = gamepadColor;
activeGamepadColorName = activeGamepadIdentifier.colors[activeGamepadColorIndex];
} else { } else {
activeGamepadColorName = gamepadColor; activeGamepadColorIndex++;
activeGamepadColorIndex = 0; if (activeGamepadColorIndex > activeGamepadIdentifier.colors.length - 1) {
for (var gamepadColorName in activeGamepadIdentifier.colors) { activeGamepadColorIndex = 0;
if (activeGamepadColorName === gamepadColorName) {
break;
}
activeGamepadColorIndex++;
} }
}
} else { activeGamepadColorName = activeGamepadIdentifier.colors[activeGamepadColorIndex];
activeGamepadColorIndex++;
if (activeGamepadColorIndex > activeGamepadIdentifier.colors.length - 1) {
activeGamepadColorIndex = 0;
} }
activeGamepadColorName = activeGamepadIdentifier.colors[activeGamepadColorIndex]; $gamepad.attr('data-color', activeGamepadColorName);
} }
$gamepad.attr('data-color', activeGamepadColorName); function changeZoom(zoomLevel) {
} if (! activeGamepadIdentifier) {
return;
}
function changeZoom(zoomLevel) { if (! zoomLevel) {
if (! activeGamepadIdentifier) { return;
return; }
if ('0' === zoomLevel) {
activeGamepadZoomLevel = 1;
}
else if ('+' === zoomLevel && activeGamepadZoomLevel < 2) {
activeGamepadZoomLevel += 0.1;
}
else if ('-' === zoomLevel && activeGamepadZoomLevel > 0.2) {
activeGamepadZoomLevel -= 0.1;
}
else if (! isNaN(zoomLevel = parseFloat(zoomLevel))) {
activeGamepadZoomLevel = zoomLevel;
}
// hack: fix js float issues
activeGamepadZoomLevel = +activeGamepadZoomLevel.toFixed(1);
$gamepad.css('transform', 'translate(-50%, -50%) scale(' + activeGamepadZoomLevel + ', ' + activeGamepadZoomLevel + ')');
} }
if (! zoomLevel) { function toggleHelp(zoomLevel) {
return; $help.toggleClass('active');
} }
})(window, document);
if ('0' === zoomLevel) {
activeGamepadZoomLevel = 1;
}
else if ('+' === zoomLevel && activeGamepadZoomLevel < 2) {
activeGamepadZoomLevel += 0.1;
}
else if ('-' === zoomLevel && activeGamepadZoomLevel > 0.2) {
activeGamepadZoomLevel -= 0.1;
}
else if (! isNaN(zoomLevel = parseFloat(zoomLevel))) {
activeGamepadZoomLevel = zoomLevel;
}
// hack: fix js float issues
activeGamepadZoomLevel = +activeGamepadZoomLevel.toFixed(1);
$gamepad.css('transform', 'translate(-50%, -50%) scale(' + activeGamepadZoomLevel + ', ' + activeGamepadZoomLevel + ')');
}
function toggleHelp(zoomLevel) {
$help.toggleClass('active');
}