clearSaveState(); var gameState=0; function Block(a, b, d, c, e) { this.settled = void 0 === e ? 0 : 1; this.height = settings.blockHeight; this.fallingLane = a; this.checked = 0; this.angle = 90 - (30 + 60 * a); this.angularVelocity = 0; this.targetAngle = this.angle; this.color = b; this.tint = this.removed = this.deleted = 0; this.initializing = this.opacity = 1; this.ict = MainHex.ct; this.iter = d; this.initLen = settings.creationDt; this.attachedLane = 0; this.distFromHex = c || settings.startDist * settings.scale; this.incrementOpacity = function() { if (this.deleted) { if (.925 <= this.opacity) { for (var b = this.attachedLane - MainHex.position, b = MainHex.sides - b; 0 > b;) b += MainHex.sides; b %= MainHex.sides; MainHex.shakes.push({ lane: b, magnitude: 3 * (window.devicePixelRatio ? window.devicePixelRatio : 1) * settings.scale }) } this.opacity -= .075; 0 >= this.opacity && (this.opacity = 0, this.deleted = 2, 1 != gameState && 0 != gameState || localStorage.setItem("saveState", exportSaveState())) } }; this.getIndex = function() { for (var b = MainHex.blocks[this.attachedLane], a = 0; a < b.length; a++) if (b[a] == this) return a }; this.draw = function(b, a) { this.height = settings.blockHeight; 1E-9 < Math.abs(settings.scale - settings.prevScale) && (this.distFromHex *= settings.scale / settings.prevScale); this.incrementOpacity(); this.angle > this.targetAngle ? this.angularVelocity -= angularVelocityConst : this.angle < this.targetAngle && (this.angularVelocity += angularVelocityConst); Math.abs(this.angle - this.targetAngle + this.angularVelocity) <= Math.abs(this.angularVelocity) ? (this.angle = this.targetAngle, this.angularVelocity = 0) : this.angle += this.angularVelocity; this.width = 2 * this.distFromHex / Math.sqrt(3); this.widthWide = 2 * (this.distFromHex + this.height) / Math.sqrt(3); var d, c, e, v; this.initializing ? (v = (MainHex.ct - this.ict) / this.initLen, d = rotatePoint(-this.width / 2 * v, this.height / 2, this.angle), c = rotatePoint(this.width / 2 * v, this.height / 2, this.angle), e = rotatePoint(this.widthWide / 2 * v, -this.height / 2, this.angle), v = rotatePoint(-this.widthWide / 2 * v, -this.height / 2, this.angle), MainHex.ct - this.ict >= this.initLen && (this.initializing = 0)) : (d = rotatePoint(-this.width / 2, this.height / 2, this.angle), c = rotatePoint(this.width / 2, this.height / 2, this.angle), e = rotatePoint(this.widthWide / 2, -this.height / 2, this.angle), v = rotatePoint(-this.widthWide / 2, -this.height / 2, this.angle)); this.deleted ? ctx.fillStyle = "#FFF" : 0 === gameState ? "r" == this.color.charAt(0) ? ctx.fillStyle = rgbColorsToTintedColors[this.color] : ctx.fillStyle = hexColorsToTintedColors[this.color] : ctx.fillStyle = this.color; ctx.globalAlpha = this.opacity; var w = trueCanvas.width / 2 + Math.sin(Math.PI / 180 * this.angle) * (this.distFromHex + this.height / 2) + gdx, n = trueCanvas.height / 2 - Math.cos(Math.PI / 180 * this.angle) * (this.distFromHex + this.height / 2) + gdy; ctx.beginPath(); ctx.moveTo(w + d.x, n + d.y); ctx.lineTo(w + c.x, n + c.y); ctx.lineTo(w + e.x, n + e.y); ctx.lineTo(w + v.x, n + v.y); ctx.closePath(); ctx.fill(); this.tint && (1 > this.opacity && (1 != gameState && 0 != gameState || localStorage.setItem("saveState", exportSaveState()), this.iter = 2.25, this.tint = 0), ctx.fillStyle = "#FFF", ctx.globalAlpha = this.tint, ctx.beginPath(), ctx.moveTo(w + d.x, n + d.y), ctx.lineTo(w + c.x, n + c.y), ctx.lineTo(w + e.x, n + e.y), ctx.lineTo(w + v.x, n + v.y), ctx.lineTo(w + d.x, n + d.y), ctx.closePath(), ctx.fill(), this.tint -= .02, 0 > this.tint && (this.tint = 0)); ctx.globalAlpha = 1 } } function findCenterOfBlocks(a) { for (var b = 0, d = 0, c = 0; c < a.length; c++) { for (var b = b + a[c].distFromHex, e = a[c].angle; 0 > e;) e += 360; d += e % 360 } b /= a.length; d /= a.length; return { x: trueCanvas.width / 2 + Math.cos(Math.PI / 180 * d) * b, y: trueCanvas.height / 2 + Math.sin(Math.PI / 180 * d) * b } }; function search(a, b) { for (var d = 0; d < a.length; d++) if (a[d][0] == b[0] && a[d][1] == b[1]) return !0; return !1 } function floodFill(a, b, d, c) { if (void 0 !== a.blocks[b] && void 0 !== a.blocks[b][d]) for (var e = a.blocks[b][d].color, f = -1; 2 > f; f++) for (var h = -1; 2 > h; h++) if (Math.abs(f) != Math.abs(h)) { var q = (b + f + a.sides) % a.sides, u = d + h; void 0 !== a.blocks[q] && void 0 !== a.blocks[q][u] && a.blocks[q][u].color == e && !1 === search(c, [q, u]) && 0 === a.blocks[q][u].deleted && (c.push([q, u]), floodFill(a, q, u, c)) } } function consolidateBlocks(a, b, d) { var c = [], e = [], f = []; e.push([b, d]); floodFill(a, b, d, e); if (!(3 > e.length)) { for (b = 0; b < e.length; b++) d = e[b], void 0 !== d && 2 == d.length && (-1 == c.indexOf(d[0]) && c.push(d[0]), a.blocks[d[0]][d[1]].deleted = 1, f.push(a.blocks[d[0]][d[1]])); c = MainHex.ct; c - a.lastCombo < settings.comboTime ? (settings.comboTime = 1 / settings.creationSpeedModifier * (waveone.nextGen / 16.666667) * 3, a.comboMultiplier += 1, a.lastCombo = c, c = findCenterOfBlocks(f), a.texts.push(new Text(c.x, c.y, "x " + a.comboMultiplier.toString(), "bold Q", "#fff", fadeUpAndOut))) : (settings.comboTime = 240, a.lastCombo = c, a.comboMultiplier = 1); e = e.length * e.length * a.comboMultiplier; a.texts.push(new Text(a.x, a.y, "+ " + e.toString(), "bold Q ", f[0].color, fadeUpAndOut)); a.lastColorScored = f[0].color; score += e } }; function drawTimer() { if (1 == gameState) { var a = [], b = []; if (MainHex.ct - MainHex.lastCombo < settings.comboTime) for (var d = 0; 6 > d; d++) { var c = MainHex.ct - MainHex.lastCombo; if (c < 1 / 6 * (5 - d) * settings.comboTime) a.push(calcSide(d, d + 1, 1, 1)), b.push(calcSide(12 - d, 11 - d, 1, 1)); else { a.push(calcSide(d, d + 1, 1 - 6 * c / settings.comboTime % 1, 1)); b.push(calcSide(12 - d, 11 - d, 1 - 6 * c / settings.comboTime % 1, 1)); break } } 0 !== b.length && drawSide(b); 0 !== a.length && drawSide(a) } } function calcSide(a, b, d, c) { a = (a + c) % 12; b = (b + c) % 12; ctx.globalAlpha = 1; ctx.beginPath(); ctx.lineCap = "round"; c = settings.rows * settings.blockHeight * (2 / Math.sqrt(3)) + settings.hexWidth; var e = c / 2, f = c * (Math.sqrt(3) / 2); c = [ [3 * e / 2, f / 2], [c, 0], [3 * e / 2, -f / 2], [e, -f], [0, -f], [-e, -f], [-(3 * e) / 2, -f / 2], [-c, 0], [-(3 * e) / 2, f / 2], [-e, f], [0, f], [e, f] ].reverse(); e = trueCanvas.width / 2 + c[a][0]; a = trueCanvas.height / 2 + c[a][1]; return [[e, a], [(trueCanvas.width / 2 + c[b][0] - e) * d + e, (trueCanvas.height / 2 + c[b][1] - a) * d + a]] } function drawSide(a) { ctx.strokeStyle = 0 === gameState ? hexColorsToTintedColors[MainHex.lastColorScored] : MainHex.lastColorScored; ctx.lineWidth = 4 * settings.scale; ctx.moveTo(a[0][0][0], a[0][0][1]); ctx.lineTo(a[0][1][0], a[0][1][1]); for (var b = 1; b < a.length; b++) ctx.lineTo(a[b][1][0], a[b][1][1]), ctx.moveTo(a[b][1][0], a[b][1][1]); ctx.closePath(); ctx.fill(); ctx.stroke() }; function Hex(a) { this.playThrough = 0; this.fillColor = [44, 62, 80]; this.tempColor = [44, 62, 80]; this.dy = this.position = this.angularVelocity = 0; this.sides = 6; this.blocks = []; this.targetAngle = this.angle = 180 / this.sides; this.shakes = []; this.sideLength = a; this.strokeColor = "blue"; this.x = trueCanvas.width / 2; this.y = trueCanvas.height / 2; this.ct = 0; this.lastCombo = this.ct - settings.comboTime; this.lastColorScored = "#000"; this.comboTime = 1; this.texts = []; this.lastRotate = Date.now(); for (a = 0; a < this.sides; a++) this.blocks.push([]); this.shake = function(b) { var a = 30 + 60 * b.lane, a = Math.PI / 180 * a, c = Math.cos(a) * b.magnitude, a = Math.sin(a) * b.magnitude; gdx -= c; gdy += a; b.magnitude /= 2; if (1 > b.magnitude) for (c = 0; c < this.shakes.length; c++) this.shakes[c] == b && this.shakes.splice(c, 1) }; this.addBlock = function(b) { if (1 == gameState || 0 === gameState) { b.settled = 1; b.tint = .6; var a = this.sides - b.fallingLane; this.shakes.push({ lane: b.fallingLane, magnitude: 4.5 * (window.devicePixelRatio ? window.devicePixelRatio : 1) * settings.scale }); a += this.position; a = (a + this.sides) % this.sides; b.distFromHex = MainHex.sideLength / 2 * Math.sqrt(3) + b.height * this.blocks[a].length; this.blocks[a].push(b); b.attachedLane = a; b.checked = 1 } }; this.doesBlockCollide = function(b, a, c) { b.settled || (void 0 !== a ? 0 >= a ? 0 >= b.distFromHex - b.iter * settings.scale - this.sideLength / 2 * Math.sqrt(3) ? (b.distFromHex = this.sideLength / 2 * Math.sqrt(3), b.settled = 1, b.checked = 1) : (b.settled = 0, b.iter = 1.5 + waveone.difficulty / 15 * 3) : c[a - 1].settled && 0 >= b.distFromHex - b.iter * settings.scale - c[a - 1].distFromHex - c[a - 1].height ? (b.distFromHex = c[a - 1].distFromHex + c[a - 1].height, b.settled = 1, b.checked = 1) : (b.settled = 0, b.iter = 1.5 + waveone.difficulty / 15 * 3) : (a = this.sides - b.fallingLane, a += this.position, a = (a + this.sides) % this.sides, c = this.blocks[a], 0 < c.length ? 0 >= b.distFromHex + b.iter * settings.scale - c[c.length - 1].distFromHex - c[c.length - 1].height && (b.distFromHex = c[c.length - 1].distFromHex + c[c.length - 1].height, this.addBlock(b)) : 0 >= b.distFromHex + b.iter * settings.scale - this.sideLength / 2 * Math.sqrt(3) && (b.distFromHex = this.sideLength / 2 * Math.sqrt(3), this.addBlock(b)))) }; this.rotate = function(a) { if (!(75 > Date.now() - this.lastRotate) || /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) if (1 === gameState || 0 === gameState) { this.position += a; history[this.ct] || (history[this.ct] = {}); for (history[this.ct].rotate = history[this.ct].rotate ? history[this.ct].rotate + a : a; 0 > this.position;) this.position += 6; this.position %= this.sides; this.blocks.forEach(function(d) { d.forEach(function(c) { c.targetAngle -= 60 * a }) }); this.targetAngle -= 60 * a; this.lastRotate = Date.now() } }; this.draw = function() { this.x = trueCanvas.width / 2; - 2 != gameState && (this.y = trueCanvas.height / 2); this.sideLength = settings.hexWidth; for (var a = gdy = gdx = 0; a < this.shakes.length; a++) this.shake(this.shakes[a]); this.angle > this.targetAngle ? this.angularVelocity -= angularVelocityConst : this.angle < this.targetAngle && (this.angularVelocity += angularVelocityConst); Math.abs(this.angle - this.targetAngle + this.angularVelocity) <= Math.abs(this.angularVelocity) ? (this.angle = this.targetAngle, this.angularVelocity = 0) : this.angle += this.angularVelocity; drawPolygon(this.x + gdx, this.y + gdy + this.dy, this.sides, this.sideLength, this.angle, arrayToColor(this.fillColor), 0, "rgba(0,0,0,0)") } } function arrayToColor(a) { return "rgb(" + a[0] + "," + a[1] + "," + a[2] + ")" }; $(document).ready(function() { initialize(); $("#bottombar").hide() }); function showbottombar() { "onLine" in navigator && !navigator.onLine ? setTimeout(showbottombar, 1E3) : (window.iframeHasLoaded = !0, 1 != gameState && $("#bottombar").fadeIn(150, "linear")) } function hidebottombar() { $("#bottombar").fadeOut(150, "linear"); $("#overlayMask").hide(); } function initialize(a) { window.iframHasLoaded = !1; window.colors = ["#e74c3c", "#f1c40f", "#3498db", "#2ecc71"]; window.hexColorsToTintedColors = { "#e74c3c": "rgb(241,163,155)", "#f1c40f": "rgb(246,223,133)", "#3498db": "rgb(151,201,235)", "#2ecc71": "rgb(150,227,183)" }; window.rgbToHex = { "rgb(231,76,60)": "#e74c3c", "rgb(241,196,15)": "#f1c40f", "rgb(52,152,219)": "#3498db", "rgb(46,204,113)": "#2ecc71" }; window.rgbColorsToTintedColors = { "rgb(231,76,60)": "rgb(241,163,155)", "rgb(241,196,15)": "rgb(246,223,133)", "rgb(52,152,219)": "rgb(151,201,235)", "rgb(46,204,113)": "rgb(150,227,183)" }; window.hexagonBackgroundColor = "rgb(236, 240, 241)"; window.hexagonBackgroundColorClear = "rgba(236, 240, 241, 0.5)"; window.centerBlue = "rgb(44,62,80)"; window.angularVelocityConst = 4; window.scoreOpacity = 0; window.textOpacity = 0; window.prevGameState = void 0; window.op = 0; window.saveState = localStorage.getItem("saveState") || "{}"; "{}" !== saveState && (op = 1); window.textShown = !1; window.requestAnimFrame = function() { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(a) { window.setTimeout(a, 1E3 / framerate) } }(); $("#clickToExit").bind("click", toggleDevTools); window.settings; /Mobile|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? settings = { platform: "mobile", startDist: 227, creationDt: 40, baseScale: 1.4, scale: 1, prevScale: 1, baseHexWidth: 87, hexWidth: 87, baseBlockHeight: 20, blockHeight: 20, rows: 7, speedModifier: 1.73, creationSpeedModifier: 0.73, comboTime: 240 } : (settings = { platform: "nonmobile", baseScale: 1, startDist: 340, creationDt: 9, scale: 1, prevScale: 1, hexWidth: 65, baseHexWidth: 87, baseBlockHeight: 20, blockHeight: 15, rows: 8, speedModifier: 1.65, creationSpeedModifier:0.65, comboTime: 240 }); window.canvas = document.getElementById("canvas"); window.ctx = canvas.getContext("2d"); window.trueCanvas = { width: canvas.width, height: canvas.height }; scaleCanvas(); window.framerate = 60; window.history = {}; window.score = 0; window.isGameOver = 3; window.scoreAdditionCoeff = 1; window.prevScore = 0; window.numHighScores = 3; highscores = []; if (localStorage.getItem("highscores")) try { highscores = JSON.parse(localStorage.getItem("highscores")) } catch (b) { highscores = [] } window.blocks = []; window.MainHex; window.gdx = 0; window.gdy = 0; window.devMode = 0; window.lastGen = void 0; window.prevTimeScored = void 0; window.nextGen = void 0; window.spawnLane = 0; window.importing = 0; window.importedHistory = void 0; window.startTime = void 0; window.gameState; setStartScreen(); if (1 != a) { window.canRestart = 1; $("#startBtn").off(); if ("mobile" == settings.platform) $("#startBtn").on("touchstart", startBtnHandler); else $("#startBtn").on("mousedown", startBtnHandler); document.addEventListener("touchmove", function(a) { a.preventDefault() }, !1); $(window).resize(scaleCanvas).resize(); $(window).unload(function() { 1 == gameState || -1 == gameState || 0 === gameState ? localStorage.setItem("saveState", exportSaveState()) : localStorage.setItem("saveState", "{}") }); addKeyListeners(); document.addEventListener("pause", handlePause, !1); document.addEventListener("backbutton", handlePause, !1); document.addEventListener("menubutton", handlePause, !1); setTimeout(function() { if ("mobile" == settings.platform) { try { document.body.removeEventListener("touchstart", handleTapBefore, !1) } catch (a) {} try { document.body.removeEventListener("touchstart", handleTap, !1) } catch (b) {} document.body.addEventListener("touchstart", handleTapBefore, !1) } else { try { document.body.removeEventListener("mousedown", handleClickBefore, !1) } catch (e) {} try { document.body.removeEventListener("mousedown", handleClick, !1) } catch (f) {} document.body.addEventListener("mousedown", handleClickBefore, !1) } }, 1) } } function startBtnHandler() { setTimeout(function() { if ("mobile" == settings.platform) { try { document.body.removeEventListener("touchstart", handleTapBefore, !1) } catch (a) {} try { document.body.removeEventListener("touchstart", handleTap, !1) } catch (b) {} document.body.addEventListener("touchstart", handleTap, !1) } else { try { document.body.removeEventListener("mousedown", handleClickBefore, !1) } catch (d) {} try { document.body.removeEventListener("mousedown", handleClick, !1) } catch (c) {} document.body.addEventListener("mousedown", handleClick, !1) } }, 5); if (!canRestart) return !1; $("#helpScreen").is(":visible") && $("#helpScreen").fadeOut(150, "linear"); 1 == importing ? init(1) : resumeGame(); } function handlePause() { 1 != gameState && 2 != gameState || pause() } function handleTap(a) { handleClickTap(a.changedTouches[0].clientX, a.changedTouches[0].clientY,a) } function handleClick(a) { handleClickTap(a.clientX, a.clientY,a) } function handleTapBefore(a) { var b = a.changedTouches[0].clientY; 120 > a.changedTouches[0].clientX && 50 > b && $(".helpText").is(":visible") && showHelp() } function handleClickBefore(a) { var b = a.clientY; 120 > a.clientX && 50 > b && $(".helpText").is(":visible") && showHelp() }; function addKeyListeners() { keypress.register_combo({ keys: "left", on_keydown: function() { MainHex && 0 !== gameState && MainHex.rotate(1) } }); keypress.register_combo({ keys: "right", on_keydown: function() { MainHex && 0 !== gameState && MainHex.rotate(-1) } }); keypress.register_combo({ keys: "a", on_keydown: function() { MainHex && 0 !== gameState && MainHex.rotate(1) } }); keypress.register_combo({ keys: "d", on_keydown: function() { MainHex && 0 !== gameState && MainHex.rotate(-1) } }); keypress.register_combo({ keys: "p", on_keydown: function() { pause() } }); keypress.register_combo({ keys: "q", on_keydown: function() { devMode && toggleDevTools() } }); keypress.register_combo({ keys: "enter", on_keydown: function() { 2 != gameState && 1 != gameState && 1 != importing || init(1); 0 === gameState && resumeGame() } }); $("#pauseBtn").on("touchstart mousedown", function() { if (1 == gameState || -1 == gameState) return $("#helpScreen").is(":visible") && $("#helpScreen").fadeOut(150, "linear"), pause(), !1 }); $("#colorBlindBtn").on("touchstart mousedown", function() { window.colors = ["#8e44ad", "#f1c40f", "#3498db", "#d35400" ]; window.hexColorsToTintedColors = { "#8e44ad": "rgb(229,152,102)", "#f1c40f": "rgb(246,223,133)", "#3498db": "rgb(151,201,235)", "#d35400": "rgb(210,180,222)" }; window.rgbToHex = { "rgb(142,68,173)": "#8e44ad", "rgb(241,196,15)": "#f1c40f", "rgb(52,152,219)": "#3498db", "rgb(211,84,0)": "#d35400" }; window.rgbColorsToTintedColors = { "rgb(142,68,173)": "rgb(229,152,102)", "rgb(241,196,15)": "rgb(246,223,133)", "rgb(52,152,219)": "rgb(151,201,235)", "rgb(46,204,113)": "rgb(210,180,222)" } }); if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)){ $("body").on("touchstart",".irestartBtn",function(){ init(1); canRestart = !1; }) $("body").on("touchstart",".moreGame",function(){ clickMore(); return false; }) } else { $("body").on("click",".irestartBtn",function(){ init(1); canRestart = !1; }) $("body").on("click",".moreGame",function(){ clickMore(); return false; }) } } function handleClickTap(a, b,evt) { if($(evt.target).hasClass("bt-play-share-tip")){ return false; } if(gameState==2){ return false; } 120 > a && 50 > b && $(".helpText").is(":visible") ? showHelp() : 2 == gameState && canRestart ? init(1) : MainHex && 0 !== gameState && -1 != gameState && (a < window.innerWidth / 2 && (1 != gameState && -2 != gameState && -1 != gameState && (0 === importing ? resumeGame() : init(1)), MainHex.rotate(1)), a > window.innerWidth / 2 && (1 != gameState && -2 != gameState && -1 != gameState && (0 === importing ? resumeGame() : init(1)), MainHex.rotate(-1))) }; function scaleCanvas() { canvas.width = $(window).width(); canvas.height = $(window).height(); settings.scale = canvas.height > canvas.width ? canvas.width / 800 * settings.baseScale : canvas.height / 800 * settings.baseScale; trueCanvas = { width: canvas.width, height: canvas.height }; if (window.devicePixelRatio) { var a = $("#canvas").attr("width"), b = $("#canvas").attr("height"); $("#canvas").attr("width", a * window.devicePixelRatio); $("#canvas").attr("height", b * window.devicePixelRatio); $("#canvas").css("width", a); $("#canvas").css("height", b); trueCanvas = { width: a, height: b }; ctx.scale(window.devicePixelRatio, window.devicePixelRatio) } $("html").css("font-size",~~$(window).width()*12/640+"px"); } function toggleDevTools() { $("#devtools").toggle() } function resumeGame() { gameState = 1; hideUIElements(); $("#pauseBtn").show(); $("#restartBtn").hide(); importing = 0; startTime = Date.now(); setTimeout(function() { 1 != gameState && 2 != gameState || $("#helpScreen").is(":visible") || $(".helpText").fadeOut(150, "linear") }, 7E3); checkVisualElements() } function checkVisualElements() { $(".helpText").is(":visible") || $(".helpText").fadeIn(150, "linear"); $("#pauseBtn").is(":visible") || $("#pauseBtn").fadeIn(150, "linear"); $("#restartBtn").is(":visible") || $("#restartBtn").fadeOut(150, "linear") } function hideUIElements() { $("#pauseBtn").hide(); $("#restartBtn").hide(); $("#startBtn").hide(); $("#attributions").hide(); $("#bottombar").hide(); $(".doudouLink").hide(); } function init(a) { a ? (hidebottombar(), $("#helpScreen").is(":visible") && $("#helpScreen").fadeOut(150, "linear"), setTimeout(function() { $(".helpText").fadeOut(150, "linear") }, 7E3), clearSaveState()) : void(0); $("#pauseBtnInner").html(''); hideUIElements(); a = localStorage.getItem("saveState") || "{}"; a = JSONfn.parse(a); document.getElementById("canvas").className = ""; history = {}; importedHistory = void 0; importing = 0; isGameOver = 2; score = a.score ||0; scoreOpacity = op = spawnLane = prevScore = 0; gameState = 1; $("#restartBtn").hide(); $("#pauseBtn").show(); void 0 !== a.hex && (gameState = 1); settings.blockHeight = settings.baseBlockHeight * settings.scale; settings.hexWidth = settings.baseHexWidth * settings.scale; MainHex = a.hex || new Hex(settings.hexWidth); a.hex && (MainHex.playThrough += 1); MainHex.sideLength = settings.hexWidth; var b, d; if (a.blocks) for (a.blocks.map(function(a) { rgbToHex[a.color] && (a.color = rgbToHex[a.color]) }), b = 0; b < a.blocks.length; b++) d = a.blocks[b], blocks.push(d); else blocks = []; gdx = a.gdx || 0; gdy = a.gdy || 0; comboTime = a.comboTime || 0; for (b = 0; b < MainHex.blocks.length; b++) for (d = 0; d < MainHex.blocks[b].length; d++) MainHex.blocks[b][d].height = settings.blockHeight, MainHex.blocks[b][d].settled = 0; MainHex.blocks.map(function(a) { a.map(function(a) { rgbToHex[a.color] && (a.color = rgbToHex[a.color]) }) }); MainHex.y = -100; startTime = Date.now(); waveone = a.wavegen || new waveGen(MainHex); MainHex.texts = []; MainHex.delay = 15; hideText(); document.getElementById('moregame2').style.display='none'; } function addNewBlock(a, b, d, c, e) { d *= settings.speedModifier; history[MainHex.ct] || (history[MainHex.ct] = {}); history[MainHex.ct].block = { blocklane: a, color: b, iter: d }; c && (history[MainHex.ct].distFromHex = c); e && (blockHist[MainHex.ct].settled = e); blocks.push(new Block(a, b, d, c, e)) } function exportHistory() { $("#devtoolsText").html(JSON.stringify(history)); toggleDevTools() } function setStartScreen() { $("#startBtn").show(); init(); importing = isStateSaved() ? 0 : 1; $("#pauseBtn").hide(); $("#restartBtn").hide(); $("#startBtn").show(); $(".doudouLink").show(); $("#attributions").show(); showbottombar(); gameState = 0; requestAnimFrame(animLoop) } setInterval(function() { 1 == gameState && (MainHex.delay ? MainHex.delay-- : update()) }, 17); function animLoop() { switch (gameState) { case 1: requestAnimFrame(animLoop); render(); if (checkGameOver() && !importing) { var a = localStorage.getItem("saveState") || "{}", a = JSONfn.parse(a); gameState = 2; setTimeout(function() { enableRestart() }, 150); $("#helpScreen").is(":visible") && $("#helpScreen").fadeOut(150, "linear"); $("#pauseBtn").is(":visible") && $("#pauseBtn").fadeOut(150, "linear"); $("#restartBtn").is(":visible") && $("#restartBtn").fadeOut(150, "linear"); $(".helpText").is(":visible") || $(".helpText").fadeIn(150, "linear"); showbottombar(); canRestart = 0; clearSaveState() } break; case 0: requestAnimFrame(animLoop); importing && update(); render(); break; case -1: requestAnimFrame(animLoop); render(); break; case 2: requestAnimFrame(animLoop); update(); render(); break; case 3: requestAnimFrame(animLoop); fadeOutObjectsOnScreen(); render(); break; case 4: setTimeout(function() { initialize(1) }, 1); render(); break; default: initialize(), setStartScreen() } } function enableRestart() { canRestart = 1 } function isInfringing(a) { for (var b = 0; b < a.sides; b++) { for (var d = 0, c = 0; c < a.blocks[b].length; c++) d += a.blocks[b][c].deleted; if (a.blocks[b].length - d > settings.rows) return !0 } return !1 } function checkGameOver() { for (var a = 0; a < MainHex.sides; a++) if (isInfringing(MainHex)) return -1 == highscores.indexOf(score) && highscores.push(score), writeHighScores(), gameOverDisplay(),(function(){ dp_submitScore(score); document.getElementById('moregame2').style.display='block'; })(), !0; return !1 } function showHelp() { 1 == gameState && pause(); $("#helpScreen").fadeToggle(150, "linear") }; function rotatePoint(a, b, d) { var c = Math.PI / 180 * d; d = Math.cos(c) * a - Math.sin(c) * b; a = Math.sin(c) * a + Math.cos(c) * b; return { x: d, y: a } } function randInt(a, b) { return Math.floor(Math.random() * b + a) }; function render() { var a = "#bdc3c7"; 0 === gameState && (a = "rgb(220, 223, 225)"); ctx.clearRect(0, 0, trueCanvas.width, trueCanvas.height); clearGameBoard(); if (1 === gameState || 2 === gameState || -1 === gameState || 0 === gameState) 1 > op && (op += .01), ctx.globalAlpha = 1, drawPolygon(trueCanvas.width / 2, trueCanvas.height / 2, 6, settings.rows * settings.blockHeight * (2 / Math.sqrt(3)) + settings.hexWidth, 30, a, !1, 6), drawTimer(), ctx.globalAlpha = 1; for (a = 0; a < MainHex.blocks.length; a++) for (var b = 0; b < MainHex.blocks[a].length; b++) MainHex.blocks[a][b].draw(!0, b); for (a = 0; a < blocks.length; a++) blocks[a].draw(); MainHex.draw(); 1 != gameState && -1 != gameState && 0 !== gameState || drawScoreboard(); for (a = 0; a < MainHex.texts.length; a++) MainHex.texts[a].draw() || (MainHex.texts.splice(a, 1), a--); 400 > MainHex.ct && 0 !== gameState && !MainHex.playThrough && (350 < MainHex.ct && (ctx.globalAlpha = (50 - (MainHex.ct - 350)) / 50), 50 > MainHex.ct && (ctx.globalAlpha = MainHex.ct / 50), renderBeginningText(), ctx.globalAlpha = 1); - 1 == gameState && (ctx.globalAlpha = 0.9, ctx.fillStyle = "rgb(236,240,241)", ctx.fillRect(0, 0, trueCanvas.width, trueCanvas.height), ctx.globalAlpha = 1); settings.prevScale = settings.scale; settings.hexWidth = settings.baseHexWidth * settings.scale; settings.blockHeight = settings.baseBlockHeight * settings.scale } function renderBeginningText() { renderText(trueCanvas.width / 2 + 1.5 * settings.scale, trueCanvas.height / 2 - 208 * settings.scale-20, 35, "#2c3e50", "\u63a7\u5236", "35px 微软雅黑"); renderText(trueCanvas.width / 2 - 85 * settings.scale, trueCanvas.height / 2 - 169 * settings.scale, 20, "#2c3e50", "\u65cb\u8f6c:", "20px 微软雅黑"); renderText(trueCanvas.width / 2 - 21 * settings.scale, trueCanvas.height / 2 - 141 * settings.scale+10, 14, "#2c3e50", "\u5de6", "14px 微软雅黑"); renderText(trueCanvas.width / 2 + 25 * settings.scale, trueCanvas.height / 2 - 141 * settings.scale+10,14, "#2c3e50", "\u53f3", "14px 微软雅黑"); /*加提示语*/ renderText(trueCanvas.width / 2 + 0 * settings.scale, trueCanvas.height / 2 - 121 * settings.scale+20, 16, "#2c3e50", "\u70b9\u51fb\u5c4f\u5e55\u5de6\u53f3\u6d4b\uff0c\u5411\u5de6\u3001\u5411\u53f3\u65cb\u8f6c\u516d\u8fb9\u5f62\u3002", "16px 微软雅黑"); drawKey("right", trueCanvas.width / 2 + 23 * settings.scale - 17.5 * settings.scale, trueCanvas.height / 2 - 195 * settings.scale); drawKey("left", trueCanvas.width / 2 - 23 * settings.scale - 17.5 * settings.scale, trueCanvas.height / 2 - 195 * settings.scale) } function drawKey(a, b, d) { ctx.save(); ctx.beginPath(); ctx.fillStyle = "#2c3e50"; ctx.strokeStyle = "#2c3e50"; ctx.lineWidth = 4 * settings.scale; ctx.rect(b + 2.5 * settings.scale, d + 2.5 * settings.scale, 35 * settings.scale, 35 * settings.scale); ctx.stroke(); switch (a) { case "left": ctx.translate(b + 28 * settings.scale, d + 13 * settings.scale); ctx.rotate(3.14159); ctx.font = "20px Fontawesome"; ctx.scale(settings.scale, settings.scale); ctx.fillText(String.fromCharCode("0xf04b"), 0, 0); break; case "right": ctx.font = "20px Fontawesome"; ctx.translate(b + 12.5 * settings.scale, d + 27.5 * settings.scale); ctx.scale(settings.scale, settings.scale); ctx.fillText(String.fromCharCode("0xf04b"), 0, 0); break; default: ctx.font = "35px Roboto", ctx.translate(b + 25 * settings.scale, d + 39.5 * settings.scale), ctx.scale(settings.scale, settings.scale), ctx.fillText(a, 0, 0) } ctx.restore() }; function exportSaveState() { var a = {}; if (1 == gameState || -1 == gameState || 0 === gameState && void 0 !== localStorage.getItem("saveState")) { a = { hex: $.extend(!0, {}, MainHex), blocks: $.extend(!0, [], blocks), score: score, wavegen: waveone, gdx: gdx, gdy: gdy, comboTime: settings.comboTime }; a.hex.blocks.map(function(a) { for (var b = 0; b < a.length; b++) a[b] = $.extend(!0, {}, a[b]); a.map(descaleBlock) }); for (var b = 0; b < a.blocks.length; b++) a.blocks[b] = $.extend(!0, {}, a.blocks[b]); a.blocks.map(descaleBlock) } localStorage.setItem("highscores", JSON.stringify(highscores)); return JSONfn.stringify(a) } function descaleBlock(a) { a.distFromHex /= settings.scale } function writeHighScores() { highscores.sort(function(a, b) { a = parseInt(a, 10); b = parseInt(b, 10); return a < b ? 1 : a > b ? -1 : 0 }); highscores = highscores.slice(0, 3); localStorage.setItem("highscores", JSON.stringify(highscores)) } function clearSaveState() { localStorage.setItem("saveState", "{}"); } function isStateSaved() { return "{}" != localStorage.getItem("saveState") && void 0 != localStorage.getItem("saveState") }; function Text(a, b, d, c, e, f) { this.x = a; this.y = b; this.font = c; this.color = e; this.opacity = 1; this.text = d; this.alive = 1; this.draw = function() { return 0 < this.alive ? (ctx.globalAlpha = this.opacity, renderText(this.x + gdx, this.y + gdy, 50, this.color, this.text), ctx.globalAlpha = 1, f(this), !0) : !1 } } function fadeUpAndOut(a) { a.opacity -= Math.pow(Math.pow(1 - a.opacity, 1 / 3) + 1, 3) / 100; a.alive = a.opacity; a.y -= 3 }; function update() { var a = MainHex.ct; 1 == gameState && (waveone.update(), 1E3 < a - waveone.prevTimeScored && (waveone.prevTimeScored = a)); var a = 99, b, d, c; for (b = 0; b < blocks.length; b++)(MainHex.doesBlockCollide(blocks[b]), blocks[b].settled) ? blocks[b].removed || (blocks[b].removed = 1) : blocks[b].initializing || (blocks[b].distFromHex -= blocks[b].iter * settings.scale); for (b = 0; b < MainHex.blocks.length; b++) for (d = 0; d < MainHex.blocks[b].length; d++) 1 == MainHex.blocks[b][d].checked && (consolidateBlocks(MainHex, MainHex.blocks[b][d].attachedLane, MainHex.blocks[b][d].getIndex()), MainHex.blocks[b][d].checked = 0); for (b = 0; b < MainHex.blocks.length; b++) { a = 99; for (d = 0; d < MainHex.blocks[b].length; d++) c = MainHex.blocks[b][d], 2 == c.deleted && (MainHex.blocks[b].splice(d, 1), blockDestroyed(), d < a && (a = d), d--); if (a < MainHex.blocks[b].length) for (d = a; d < MainHex.blocks[b].length; d++) MainHex.blocks[b][d].settled = 0 } for (b = 0; b < MainHex.blocks.length; b++) for (d = 0; d < MainHex.blocks[b].length; d++) c = MainHex.blocks[b][d], MainHex.doesBlockCollide(c, d, MainHex.blocks[b]), MainHex.blocks[b][d].settled || (MainHex.blocks[b][d].distFromHex -= c.iter * settings.scale); for (b = 0; b < blocks.length; b++) 1 == blocks[b].removed && (blocks.splice(b, 1), b--); MainHex.ct++ }; function easeOutCubic(a, b, d, c) { return d * ((a = a / c - 1) * a * a + 1) + b } function renderText(a, b, d, c, e, f) { ctx.save(); f || (f = "px/0 微软雅黑"); d *= settings.scale; ctx.font = d + f; ctx.textAlign = "center"; ctx.fillStyle = c; ctx.fillText(e, a, b + d / 2 - 9 * settings.scale); ctx.restore() } var doudouIcon=new Image(); doudouIcon.src="doudouIcon.png"; function drawScoreboard() { 1 > scoreOpacity && (scoreOpacity += .01, textOpacity += .01); ctx.globalAlpha = textOpacity; var a = 50, b = String(score); 6 == b.length ? a = 43 : 7 == b.length ? a = 35 : 8 == b.length ? a = 31 : 9 == b.length && (a = 27); 0 === gameState ? (renderText(trueCanvas.width / 2 + gdx + 6 * settings.scale, trueCanvas.height / 2 + gdy, 60, "rgb(236, 240, 241)", String.fromCharCode("0xf04b"), "px FontAwesome"), renderText(trueCanvas.width / 2 + gdx + 6 * settings.scale, trueCanvas.height / 2 + gdy - 170 * settings.scale, 150, "#2c3e50", "\u8f6c\u4f60\u59b9"), renderText(trueCanvas.width / 2 + gdx + 5 * settings.scale, trueCanvas.height / 2 + gdy + 100 * settings.scale, 20, "rgb(44,62,80)", "\u5f00\u59cb!"),ctx.drawImage(doudouIcon,0,0,266,120,trueCanvas.width / 2 -120 * settings.scale, trueCanvas.height / 2 +250 * settings.scale,266*settings.scale,120*settings.scale)) : (0 != gameState && 0 < textOpacity && (textOpacity -= .05, renderText(trueCanvas.width / 2 + gdx + 6 * settings.scale, trueCanvas.height / 2 + gdy, 60, "rgb(236, 240, 241)", String.fromCharCode("0xf04b"), "px FontAwesome"), renderText(trueCanvas.width / 2 + gdx + 6 * settings.scale, trueCanvas.height / 2 + gdy - 170 * settings.scale, 150, "#2c3e50", "\u8f6c\u4f60\u59b9"), renderText(trueCanvas.width / 2 + gdx + 5 * settings.scale, trueCanvas.height / 2 + gdy + 100 * settings.scale, 20, "rgb(44,62,80)", "\u5f00\u59cb!")), ctx.globalAlpha = scoreOpacity, renderText(trueCanvas.width / 2 + gdx, trueCanvas.height / 2 + gdy, a, "rgb(236, 240, 241)", score)); ctx.globalAlpha = 1 } function clearGameBoard() { drawPolygon(trueCanvas.width / 2, trueCanvas.height / 2, 6, trueCanvas.width / 2, 30, hexagonBackgroundColor, 0, "rgba(0,0,0,0)") } function drawPolygon(a, b, d, c, e, f, h, q) { ctx.fillStyle = f; ctx.lineWidth = h; ctx.strokeStyle = q; ctx.beginPath(); f = rotatePoint(0, c, e); ctx.moveTo(f.x + a, f.y + b); c = f.x; f = f.y; for (e = 0; e < d; e++) f = rotatePoint(c, f, 360 / d), ctx.lineTo(f.x + a, f.y + b), c = f.x, f = f.y; ctx.closePath(); ctx.fill(); ctx.stroke(); ctx.strokeStyle = "rgba(0,0,0,0)" } function toggleClass(a, b) { $(a).hasClass(b) ? $(a).removeClass(b) : $(a).addClass(b) } function showText(a) { var b = { paused: "
\u6682\u505c

\u6309 p \u7ee7\u7eed
", pausedMobile: "
\u6682\u505c

\u6309 \u7ee7\u7eed
", start: "
Press enter to start
", gameover: "
Game Over
得分
"+ score +"
" }; "paused" == a && "mobile" == settings.platform && (a = "pausedMobile"); if ("gameover" == a) { var d = 1, c, e; b.gameover += "
"; if (d) for (c = 0; c < highscores.length; c++) 0 !== highscores[c] && (d = 0) } $("#overlay").html(b[a]); $("#overlay").fadeIn("1000", "swing"); $("#overlayMask").show(); "gameover" == a && ("mobile" == settings.platform && $(".tg").css("margin-top", "4px")) } function setMainMenu() { gameState = 4; canRestart = !1; setTimeout(function() { canRestart = "s" }, 500); $("#restartBtn").hide(); - 1 == $($("#pauseBtn").children()[0]).attr("class").indexOf("pause") ? $("#pauseBtnInner").html('') : $("#pauseBtnInner").html('') } function hideText() { $("#overlay").fadeOut("1000", function() { $("#overlay").html("") }); $("#overlayMask").hide(); } function gameOverDisplay() { $("#attributions").show(); document.getElementById("canvas").className = "blur"; showText("gameover"); showbottombar(); } function pause(a) { writeHighScores(); a = a ? "" : "paused"; document.getElementById("canvas"); - 1 == gameState ? ($("#restartBtn").fadeOut(150, "linear"), $("#helpScreen").is(":visible") && $("#helpScreen").fadeOut(150, "linear"), $("#pauseBtnInner").html(''), $(".helpText").fadeOut(200, "linear"), hideText(), hidebottombar(), setTimeout(function() { gameState = prevGameState }, 200)) : -2 != gameState && 0 !== gameState && 2 !== gameState && ($("#restartBtn").fadeIn(150, "linear"), $(".helpText").fadeIn(200, "linear"), showbottombar(), "paused" == a && showText(a), $("#pauseBtnInner").html(''), prevGameState = gameState, gameState = -1) }; function blockDestroyed() { waveone.nextGen = 1350 < waveone.nextGen ? waveone.nextGen - 24 * settings.creationSpeedModifier : 600 < waveone.nextGen ? waveone.nextGen - 10 * settings.creationSpeedModifier : 600; waveone.difficulty = 35 > waveone.difficulty ? waveone.difficulty + .17 * settings.speedModifier : 35 } function waveGen(a) { this.last = this.lastGen = 0; this.nextGen = 2300; this.start = 0; this.colors = colors; this.ct = 0; this.hex = a; this.difficulty = 1; this.dt = 0; this.update = function() { this.currentFunction(); this.dt = 16.6666667 * MainHex.ct; this.computeDifficulty(); (this.dt - this.lastGen) * settings.creationSpeedModifier > this.nextGen && 600 < this.nextGen && (this.nextGen -= this.nextGen / 1300 * 10 * settings.creationSpeedModifier) }; this.randomGeneration = function() { if (this.dt - this.lastGen > this.nextGen) { this.ct++; this.lastGen = this.dt; var a = randInt(0, MainHex.sides); addNewBlock(a, colors[randInt(0, colors.length)], 1.6 + this.difficulty / 15 * 3); 5 < this.ct && (a = randInt(0, 24), 15 < a ? (this.ct = 0, this.currentFunction = this.doubleGeneration) : 10 < a ? (this.ct = 0, this.currentFunction = this.crosswiseGeneration) : 7 < a ? (this.ct = 0, this.currentFunction = this.spiralGeneration) : 4 < a ? (this.ct = 0, this.currentFunction = this.circleGeneration) : 1 < a && (this.ct = 0, this.currentFunction = this.halfCircleGeneration)) } }; this.computeDifficulty = function() { 35 > this.difficulty && (this.difficulty = 8 > this.difficulty ? this.difficulty + (this.dt - this.last) / 2566667 * settings.speedModifier : 15 > this.difficulty ? this.difficulty + (this.dt - this.last) / 53333333 * settings.speedModifier : this.difficulty + (this.dt - this.last) / 12E7 * settings.speedModifier) }; this.circleGeneration = function() { if (this.dt - this.lastGen > this.nextGen + 500) { var a = randInt(1, 4); 3 == a && (a = randInt(1, 4)); var d = [], c = 0; a: for (; c < a; c++) { var e = randInt(0, colors.length), f; for (f in d) if (d[f] == colors[e]) { c--; continue a } d.push(colors[e]) } for (c = 0; c < MainHex.sides; c++) addNewBlock(c, d[c % a], 1.5 + this.difficulty / 15 * 3); this.ct += 15; this.lastGen = this.dt; this.shouldChangePattern(1) } }; this.halfCircleGeneration = function() { if (this.dt - this.lastGen > (this.nextGen + 500) / 2) { var a = randInt(1, 3), d = colors[randInt(0, colors.length)], c = [d, d, d]; 2 == a && (c = [d, colors[randInt(0, colors.length)], d]); a = randInt(0, 6); for (d = 0; 3 > d; d++) addNewBlock((a + d) % 6, c[d], 1.5 + this.difficulty / 15 * 3); this.ct += 8; this.lastGen = this.dt; this.shouldChangePattern() } }; this.crosswiseGeneration = function() { if (this.dt - this.lastGen > this.nextGen) { var a = randInt(0, colors.length), d = randInt(0, colors.length); addNewBlock(d, colors[a], .6 + this.difficulty / 15 * 3); addNewBlock((d + 3) % MainHex.sides, colors[a], .6 + this.difficulty / 15 * 3); this.ct += 1.5; this.lastGen = this.dt; this.shouldChangePattern() } }; this.spiralGeneration = function() { var a = randInt(0, 2); this.dt - this.lastGen > 2 / 3 * this.nextGen && (a ? addNewBlock(5 - this.ct % MainHex.sides, colors[randInt(0, colors.length)], 1.5 + this.difficulty / 15 * 1.5) : addNewBlock(this.ct % MainHex.sides, colors[randInt(0, colors.length)], 1.5 + this.difficulty / 15 * 1.5), this.ct += 1, this.lastGen = this.dt, this.shouldChangePattern()) }; this.doubleGeneration = function() { if (this.dt - this.lastGen > this.nextGen) { var a = randInt(0, colors.length); addNewBlock(a, colors[randInt(0, colors.length)], 1.5 + this.difficulty / 15 * 3); addNewBlock((a + 1) % MainHex.sides, colors[randInt(0, colors.length)], 1.5 + this.difficulty / 15 * 3); this.ct += 2; this.lastGen = this.dt; this.shouldChangePattern() } }; this.setRandom = function() { this.ct = 0; this.currentFunction = this.randomGeneration }; this.shouldChangePattern = function(a) { if (a) switch (a = randInt(0, 4), this.ct = 0, a) { case 0: this.currentFunction = this.doubleGeneration; break; case 1: this.currentFunction = this.spiralGeneration; break; case 2: this.currentFunction = this.crosswiseGeneration } else if (8 < this.ct && 0 === randInt(0, 2)) return this.setRandom(), 1; return 0 }; this.currentFunction = this.randomGeneration }; ! function(a, b) { function d() { c.READY || (B.determineEventTypes(), g.each(c.gestures, function(a) { x.register(a) }), B.onTouch(c.DOCUMENT, y, x.detect), B.onTouch(c.DOCUMENT, r, x.detect), c.READY = !0) } var c = function K(a, b) { return new K.Instance(a, b || {}) }; c.VERSION = "1.1.2"; c.defaults = { behavior: { userSelect: "none", touchAction: "none", touchCallout: "none", contentZooming: "none", userDrag: "none", tapHighlightColor: "rgba(0,0,0,0)" } }; c.DOCUMENT = document; c.HAS_POINTEREVENTS = navigator.pointerEnabled || navigator.msPointerEnabled; c.HAS_TOUCHEVENTS = "ontouchstart" in a; c.IS_MOBILE = /mobile|tablet|ip(ad|hone|od)|android|silk/i.test(navigator.userAgent); c.NO_MOUSEEVENTS = c.HAS_TOUCHEVENTS && c.IS_MOBILE || c.HAS_POINTEREVENTS; c.CALCULATE_INTERVAL = 25; var e = {}, f = c.DIRECTION_DOWN = "down", h = c.DIRECTION_LEFT = "left", q = c.DIRECTION_UP = "up", u = c.DIRECTION_RIGHT = "right", A = c.POINTER_MOUSE = "mouse", v = c.POINTER_TOUCH = "touch", w = c.POINTER_PEN = "pen", n = c.EVENT_START = "start", y = c.EVENT_MOVE = "move", r = c.EVENT_END = "end", z = c.EVENT_RELEASE = "release", D = c.EVENT_TOUCH = "touch"; c.READY = !1; c.plugins = c.plugins || {}; c.gestures = c.gestures || {}; var g = c.utils = { extend: function(a, c, d) { for (var l in c)!c.hasOwnProperty(l) || a[l] !== b && d || (a[l] = c[l]); return a }, on: function(a, b, c) { a.addEventListener(b, c, !1) }, off: function(a, b, c) { a.removeEventListener(b, c, !1) }, each: function(a, c, d) { var l, e; if ("forEach" in a) a.forEach(c, d); else if (a.length !== b) for (l = 0, e = a.length; e > l && !1 !== c.call(d, a[l], l, a); l++); else for (l in a) if (a.hasOwnProperty(l) && !1 === c.call(d, a[l], l, a)) break }, inStr: function(a, b) { return -1 < a.indexOf(b) }, inArray: function(a, b) { if (a.indexOf) { var c = a.indexOf(b); return -1 === c ? !1 : c } for (var c = 0, d = a.length; d > c; c++) if (a[c] === b) return c; return !1 }, toArray: function(a) { return Array.prototype.slice.call(a, 0) }, hasParent: function(a, b) { for (; a;) { if (a == b) return !0; a = a.parentNode } return !1 }, getCenter: function(a) { var b = [], c = [], d = [], e = [], m = Math.min, f = Math.max; return 1 === a.length ? { pageX: a[0].pageX, pageY: a[0].pageY, clientX: a[0].clientX, clientY: a[0].clientY } : (g.each(a, function(a) { b.push(a.pageX); c.push(a.pageY); d.push(a.clientX); e.push(a.clientY) }), { pageX: (m.apply(Math, b) + f.apply(Math, b)) / 2, pageY: (m.apply(Math, c) + f.apply(Math, c)) / 2, clientX: (m.apply(Math, d) + f.apply(Math, d)) / 2, clientY: (m.apply(Math, e) + f.apply(Math, e)) / 2 }) }, getVelocity: function(a, b, c) { return { x: Math.abs(b / a) || 0, y: Math.abs(c / a) || 0 } }, getAngle: function(a, b) { return 180 * Math.atan2(b.clientY - a.clientY, b.clientX - a.clientX) / Math.PI }, getDirection: function(a, b) { var c = Math.abs(a.clientX - b.clientX), d = Math.abs(a.clientY - b.clientY); return c >= d ? 0 < a.clientX - b.clientX ? h : u : 0 < a.clientY - b.clientY ? q : f }, getDistance: function(a, b) { var c = b.clientX - a.clientX, d = b.clientY - a.clientY; return Math.sqrt(c * c + d * d) }, getScale: function(a, b) { return 2 <= a.length && 2 <= b.length ? this.getDistance(b[0], b[1]) / this.getDistance(a[0], a[1]) : 1 }, getRotation: function(a, b) { return 2 <= a.length && 2 <= b.length ? this.getAngle(b[1], b[0]) - this.getAngle(a[1], a[0]) : 0 }, isVertical: function(a) { return a == q || a == f }, setPrefixedCss: function(a, b, c, d) { var e = ["", "Webkit", "Moz", "O", "ms"]; b = g.toCamelCase(b); for (var f = 0; f < e.length; f++) { var s = b; if (e[f] && (s = e[f] + s.slice(0, 1).toUpperCase() + s.slice(1)), s in a.style) { a.style[s] = (null == d || d) && c || ""; break } } }, toggleBehavior: function(a, b, c) { if (b && a && a.style) { g.each(b, function(b, d) { g.setPrefixedCss(a, d, b, c) }); var d = c && function() { return !1 }; "none" == b.userSelect && (a.onselectstart = d); "none" == b.userDrag && (a.ondragstart = d) } }, toCamelCase: function(a) { return a.replace(/[_-]([a-z])/g, function(a) { return a[1].toUpperCase() }) } }, B = c.event = { preventMouseEvents: !1, started: !1, shouldDetect: !1, on: function(a, b, c, d) { b = b.split(" "); g.each(b, function(b) { g.on(a, b, c); d && d(b) }) }, off: function(a, b, c, d) { b = b.split(" "); g.each(b, function(b) { g.off(a, b, c); d && d(b) }) }, onTouch: function(a, b, d) { var l = this, f = function(e) { var f, F = e.type.toLowerCase(), h = c.HAS_POINTEREVENTS; (F = g.inStr(F, "mouse")) && l.preventMouseEvents || (F && b == n && 0 === e.button ? (l.preventMouseEvents = !1, l.shouldDetect = !0) : h && b == n ? l.shouldDetect = 1 === e.buttons : F || b != n || (l.preventMouseEvents = !0, l.shouldDetect = !0), h && b != r && C.updatePointer(b, e), l.shouldDetect && (f = l.doDetect.call(l, e, b, a, d)), f == r && (l.preventMouseEvents = !1, l.shouldDetect = !1, C.reset()), h && b == r && C.updatePointer(b, e)) }; return this.on(a, e[b], f), f }, doDetect: function(a, b, c, d) { var e = this.getTouchList(a, b), f = b, g = e.trigger, k = e.length; b == n ? g = D : b == r && (g = z, k = e.length - (a.changedTouches ? a.changedTouches.length : 1)); 0 < k && this.started && (f = y); this.started = !0; a = this.collectEventData(c, f, e, a); return b != r && d.call(x, a), g && (a.changedLength = k, a.eventType = g, d.call(x, a), a.eventType = f, delete a.changedLength), f == r && (d.call(x, a), this.started = !1), f }, determineEventTypes: function() { var b; return b = c.HAS_POINTEREVENTS ? a.PointerEvent ? ["pointerdown", "pointermove", "pointerup pointercancel lostpointercapture"] : ["MSPointerDown", "MSPointerMove", "MSPointerUp MSPointerCancel MSLostPointerCapture"] : c.NO_MOUSEEVENTS ? ["touchstart", "touchmove", "touchend touchcancel"] : ["touchstart mousedown", "touchmove mousemove", "touchend touchcancel mouseup"], e[n] = b[0], e[y] = b[1], e[r] = b[2], e }, getTouchList: function(a, b) { if (c.HAS_POINTEREVENTS) return C.getTouchList(); if (a.touches) { if (b == y) return a.touches; var d = [], l = [].concat(g.toArray(a.touches), g.toArray(a.changedTouches)), e = []; return g.each(l, function(a) { !1 === g.inArray(d, a.identifier) && e.push(a); d.push(a.identifier) }), e } return a.identifier = 1, [a] }, collectEventData: function(a, b, c, d) { a = v; return g.inStr(d.type, "mouse") || C.matchType(A, d) ? a = A : C.matchType(w, d) && (a = w), { center: g.getCenter(c), timeStamp: Date.now(), target: d.target, touches: c, eventType: b, pointerType: a, srcEvent: d, preventDefault: function() { var a = this.srcEvent; a.preventManipulation && a.preventManipulation(); a.preventDefault && a.preventDefault() }, stopPropagation: function() { this.srcEvent.stopPropagation() }, stopDetect: function() { return x.stopDetect() } } } }, C = c.PointerEvent = { pointers: {}, getTouchList: function() { var a = []; return g.each(this.pointers, function(b) { a.push(b) }), a }, updatePointer: function(a, b) { a == r || a != r && 1 !== b.buttons ? delete this.pointers[b.pointerId] : (b.identifier = b.pointerId, this.pointers[b.pointerId] = b) }, matchType: function(a, b) { if (!b.pointerType) return !1; var c = b.pointerType, d = {}; return d[A] = c === (b.MSPOINTER_TYPE_MOUSE || A), d[v] = c === (b.MSPOINTER_TYPE_TOUCH || v), d[w] = c === (b.MSPOINTER_TYPE_PEN || w), d[a] }, reset: function() { this.pointers = {} } }, x = c.detection = { gestures: [], current: null, previous: null, stopped: !1, startDetect: function(a, b) { this.current || (this.stopped = !1, this.current = { inst: a, startEvent: g.extend({}, b), lastEvent: !1, lastCalcEvent: !1, futureCalcEvent: !1, lastCalcData: {}, name: "" }, this.detect(b)) }, detect: function(a) { if (this.current && !this.stopped) { a = this.extendEventData(a); var b = this.current.inst, c = b.options; return g.each(this.gestures, function(d) { return !this.stopped && b.enabled && c[d.name] && !1 === d.handler.call(d, a, b) ? (this.stopDetect(), !1) : void 0 }, this), this.current && (this.current.lastEvent = a), a.eventType == r && this.stopDetect(), a } }, stopDetect: function() { this.previous = g.extend({}, this.current); this.current = null; this.stopped = !0 }, getCalculatedData: function(a, b, d, e, f) { var m = this.current, s = !1, k = m.lastCalcEvent, h = m.lastCalcData; k && a.timeStamp - k.timeStamp > c.CALCULATE_INTERVAL && (b = k.center, d = a.timeStamp - k.timeStamp, e = a.center.clientX - k.center.clientX, f = a.center.clientY - k.center.clientY, s = !0); a.eventType != D && a.eventType != z || (m.futureCalcEvent = a); (!m.lastCalcEvent || s) && (h.velocity = g.getVelocity(d, e, f), h.angle = g.getAngle(b, a.center), h.direction = g.getDirection(b, a.center), m.lastCalcEvent = m.futureCalcEvent || a, m.futureCalcEvent = a); a.velocityX = h.velocity.x; a.velocityY = h.velocity.y; a.interimAngle = h.angle; a.interimDirection = h.direction }, extendEventData: function(a) { var b = this.current, c = b.startEvent, b = b.lastEvent || c; a.eventType != D && a.eventType != z || (c.touches = [], g.each(a.touches, function(a) { c.touches.push({ clientX: a.clientX, clientY: a.clientY }) })); var d = a.timeStamp - c.timeStamp, e = a.center.clientX - c.center.clientX, f = a.center.clientY - c.center.clientY; return this.getCalculatedData(a, b.center, d, e, f), g.extend(a, { startEvent: c, deltaTime: d, deltaX: e, deltaY: f, distance: g.getDistance(c.center, a.center), angle: g.getAngle(c.center, a.center), direction: g.getDirection(c.center, a.center), scale: g.getScale(c.touches, a.touches), rotation: g.getRotation(c.touches, a.touches) }), a }, register: function(a) { var d = a.defaults || {}; return d[a.name] === b && (d[a.name] = !0), g.extend(c.defaults, d, !0), a.index = a.index || 1E3, this.gestures.push(a), this.gestures.sort(function(a, b) { return a.index < b.index ? -1 : a.index > b.index ? 1 : 0 }), this.gestures } }; c.Instance = function(a, b) { var e = this; d(); this.element = a; this.enabled = !0; g.each(b, function(a, c) { delete b[c]; b[g.toCamelCase(c)] = a }); this.options = g.extend(g.extend({}, c.defaults), b || {}); this.options.behavior && g.toggleBehavior(this.element, this.options.behavior, !0); this.eventStartHandler = B.onTouch(a, n, function(a) { e.enabled && a.eventType == n ? x.startDetect(e, a) : a.eventType == D && x.detect(a) }); this.eventHandlers = [] }; c.Instance.prototype = { on: function(a, b) { var c = this; return B.on(c.element, a, b, function(a) { c.eventHandlers.push({ gesture: a, handler: b }) }), c }, off: function(a, b) { var c = this; return B.off(c.element, a, b, function(a) { a = g.inArray({ gesture: a, handler: b }); !1 !== a && c.eventHandlers.splice(a, 1) }), c }, trigger: function(a, b) { b || (b = {}); var d = c.DOCUMENT.createEvent("Event"); d.initEvent(a, !0, !0); d.gesture = b; var e = this.element; return g.hasParent(b.target, e) && (e = b.target), e.dispatchEvent(d), this }, enable: function(a) { return this.enabled = a, this }, dispose: function() { var a, b; g.toggleBehavior(this.element, this.options.behavior, !1); for (a = -1; b = this.eventHandlers[++a];) g.off(this.element, b.gesture, b.handler); return this.eventHandlers = [], B.off(this.element, e[n], this.eventStartHandler), null } }; (function(a) { var b = !1; c.gestures.Drag = { name: a, index: 50, handler: function(c, d) { var e = x.current; if (!(0 < d.options.dragMaxTouches && c.touches.length > d.options.dragMaxTouches)) switch (c.eventType) { case n: b = !1; break; case y: if (c.distance < d.options.dragMinDistance && e.name != a) break; var m = e.startEvent.center; if (e.name != a && (e.name = a, d.options.dragDistanceCorrection && 0 < c.distance)) { var s = Math.abs(d.options.dragMinDistance / c.distance); m.pageX += c.deltaX * s; m.pageY += c.deltaY * s; m.clientX += c.deltaX * s; m.clientY += c.deltaY * s; c = x.extendEventData(c) }(e.lastEvent.dragLockToAxis || d.options.dragLockToAxis && d.options.dragLockMinDistance <= c.distance) && (c.dragLockToAxis = !0); e = e.lastEvent.direction; c.dragLockToAxis && e !== c.direction && (c.direction = g.isVertical(e) ? 0 > c.deltaY ? q : f : 0 > c.deltaX ? h : u); b || (d.trigger(a + "start", c), b = !0); d.trigger(a, c); d.trigger(a + c.direction, c); e = g.isVertical(c.direction); (d.options.dragBlockVertical && e || d.options.dragBlockHorizontal && !e) && c.preventDefault(); break; case z: b && c.changedLength <= d.options.dragMaxTouches && (d.trigger(a + "end", c), b = !1); break; case r: b = !1 } }, defaults: { dragMinDistance: 10, dragDistanceCorrection: !0, dragMaxTouches: 1, dragBlockHorizontal: !1, dragBlockVertical: !1, dragLockToAxis: !1, dragLockMinDistance: 25 } } })("drag"); c.gestures.Gesture = { name: "gesture", index: 1337, handler: function(a, b) { b.trigger(this.name, a) } }; (function(a) { var b; c.gestures.Hold = { name: a, index: 10, defaults: { holdTimeout: 500, holdThreshold: 2 }, handler: function(c, d) { var e = d.options, f = x.current; switch (c.eventType) { case n: clearTimeout(b); f.name = a; b = setTimeout(function() { f && f.name == a && d.trigger(a, c) }, e.holdTimeout); break; case y: c.distance > e.holdThreshold && clearTimeout(b); break; case z: clearTimeout(b) } } } })("hold"); c.gestures.Release = { name: "release", index: 1 / 0, handler: function(a, b) { a.eventType == z && b.trigger(this.name, a) } }; c.gestures.Swipe = { name: "swipe", index: 40, defaults: { swipeMinTouches: 1, swipeMaxTouches: 1, swipeVelocityX: .6, swipeVelocityY: .6 }, handler: function(a, b) { if (a.eventType == z) { var c = a.touches.length, d = b.options; c < d.swipeMinTouches || c > d.swipeMaxTouches || (a.velocityX > d.swipeVelocityX || a.velocityY > d.swipeVelocityY) && (b.trigger(this.name, a), b.trigger(this.name + a.direction, a)) } } }; (function(a) { var b = !1; c.gestures.Tap = { name: a, index: 100, handler: function(c, d) { var e, f, g = d.options, k = x.current, h = x.previous; switch (c.eventType) { case n: b = !1; break; case y: b = b || c.distance > g.tapMaxDistance; break; case r: "touchcancel" != c.srcEvent.type && c.deltaTime < g.tapMaxTime && !b && (e = h && h.lastEvent && c.timeStamp - h.lastEvent.timeStamp, f = !1, h && h.name == a && e && e < g.doubleTapInterval && c.distance < g.doubleTapDistance && (d.trigger("doubletap", c), f = !0), (!f || g.tapAlways) && (k.name = a, d.trigger(k.name, c))) } }, defaults: { tapMaxTime: 250, tapMaxDistance: 10, tapAlways: !0, doubleTapDistance: 20, doubleTapInterval: 300 } } })("tap"); c.gestures.Touch = { name: "touch", index: -1 / 0, defaults: { preventDefault: !1, preventMouse: !1 }, handler: function(a, b) { return b.options.preventMouse && a.pointerType == A ? void a.stopDetect() : (b.options.preventDefault && a.preventDefault(), void(a.eventType == D && b.trigger("touch", a))) } }; (function(a) { var b = !1; c.gestures.Transform = { name: a, index: 45, defaults: { transformMinScale: .01, transformMinRotation: 1 }, handler: function(c, d) { switch (c.eventType) { case n: b = !1; break; case y: if (2 > c.touches.length) break; var e = Math.abs(1 - c.scale), f = Math.abs(c.rotation); if (e < d.options.transformMinScale && f < d.options.transformMinRotation) break; x.current.name = a; b || (d.trigger(a + "start", c), b = !0); d.trigger(a, c); f > d.options.transformMinRotation && d.trigger("rotate", c); e > d.options.transformMinScale && (d.trigger("pinch", c), d.trigger("pinch" + (1 > c.scale ? "in" : "out"), c)); break; case z: b && 2 > c.changedLength && (d.trigger(a + "end", c), b = !1) } } } })("transform"); "function" == typeof define && define.amd ? define(function() { return c }) : "undefined" != typeof module && module.exports ? module.exports = c : a.Hammer = c }(window); (function(a) { a.stringify = function(a) { return JSON.stringify(a, function(a, b) { return b instanceof Function || "function" == typeof b ? b.toString() : b instanceof RegExp ? "_PxEgEr_" + b : b }) }; a.parse = function(a, d) { var c = d ? /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/ : !1; return JSON.parse(a, function(a, b) { var d; if ("string" != typeof b || 8 > b.length) return b; d = b.substring(0, 8); return c && b.match(c) ? new Date(b) : "function" === d ? eval("(" + b + ")") : "_PxEgEr_" === d ? eval(b.slice(8)) : b }) }; a.clone = function(b, d) { return a.parse(a.stringify(b), d) } })("undefined" === typeof exports ? window.JSONfn = {} : exports); (function() { var a, b, d, c, e, f, h, q, u, A, v, w, n, y, r, z, D, g, B, C, x, W, K, X, Y, l, F, m, s, k, Q, H, Z, R, I, S, L, J, T, M, t, U, N, E, O, V, P, aa, p = [].indexOf || function(a) { for (var b = 0, c = this.length; b < c; b++) if (b in this && this[b] === a) return b; return -1 }, ba = {}.hasOwnProperty; t = []; E = []; O = null; k = []; d = []; L = !1; R = "ctrl"; S = "meta alt option ctrl shift cmd".split(" "); P = []; u = { keys: [], count: 0 }; y = function(a, b) { var c; if (a.filter) return a.filter(b); var d, e, f; f = []; d = 0; for (e = a.length; d < e; d++) c = a[d], b(c) && f.push(c); return f }; H = function() { return console.log.apply(console, arguments) }; A = function(a, b) { var c, d, e; if (a.length !== b.length) return !1; d = 0; for (e = a.length; d < e; d++) if (c = a[d], !(0 <= p.call(b, c))) return !1; return !0 }; v = function(a, b) { var c, d, e; if (a.length !== b.length) return !1; c = d = 0; for (e = a.length; 0 <= e ? d < e : d > e; c = 0 <= e ? ++d : --d) if (a[c] !== b[c]) return !1; return !0 }; K = function(a, b) { var c, d, e; d = 0; for (e = a.length; d < e; d++) if (c = a[d], 0 > p.call(b, c)) return !1; return !0 }; X = function(a, b) { var c, d, e, f; e = d = 0; for (f = a.length; e < f; e++) if (c = a[e], c = b.indexOf(c), c >= d) d = c; else return !1; return !0 }; J = function(a, b) { if ((b || keypress.suppress_event_defaults) && !keypress.force_event_defaults && (a.preventDefault ? a.preventDefault() : a.returnValue = !1, a.stopPropagation)) return a.stopPropagation() }; f = function(a) { if (a.prevent_repeat) return !1; if ("function" === typeof a.on_keydown) return !0 }; Q = function(a) { var b, c, d, e; e = a.keys; c = 0; for (d = e.length; c < d; c++) if (a = e[c], 0 <= p.call(k, a)) { b = !0; break } return b }; r = function(a, b, c) { "function" === typeof b["on_" + a] && J(c, !1 === b["on_" + a].call(b["this"], c, b.count)); "release" === a && (b.count = 0); if ("keyup" === a) return b.keyup_fired = !0 }; Z = function(a, b) { var c, d, e; d = 0; for (e = t.length; d < e; d++) c = t[d], (c.is_ordered && v(a, c.keys) || !c.is_ordered && A(a, c.keys)) && b(c) }; z = function(a, b) { var c, d, e; d = 0; for (e = t.length; d < e; d++) c = t[d], (c.is_ordered && X(c.keys, a) || !c.is_ordered && K(c.keys, a)) && b(c) }; q = function(a) { return 0 <= p.call(k, "cmd") && 0 > p.call(a, "cmd") ? !1 : !0 }; D = function(a) { var b, c; b = []; c = y(k, function(b) { return b !== a }); c.push(a); Z(c, function(a) { if (q(a.keys)) return b.push(a) }); z(c, function(a) { if (!(0 <= p.call(b, a) || a.is_solitary) && q(a.keys)) return b.push(a) }); return b }; B = function(a) { var b, c, d, e; c = []; d = 0; for (e = t.length; d < e; d++) b = t[d], b.is_sequence || 0 <= p.call(b.keys, a) && q(b.keys) && c.push(b); return c }; e = function(a) { var b, c, e, f, G, g, k, h, l, m, n; g = !1; G = !0; e = !1; if (0 <= p.call(d, a)) return !0; if (d.length) for (f = k = 0, m = d.length; 0 <= m ? k < m : k > m; f = 0 <= m ? ++k : --k) if ((b = d[f]) && b.is_exclusive && a.is_exclusive) { b = b.keys; if (!g) for (h = 0, l = b.length; h < l; h++) if (c = b[h], g = !0, 0 > p.call(a.keys, c)) { g = !1; break } if (G && !g) for (n = a.keys, h = 0, l = n.length; h < l; h++) if (c = n[h], G = !1, 0 > p.call(b, c)) { G = !0; break } g && (e ? N(d.splice(f, 1)) : (N(d.splice(f, 1, a)), e = !0), G = !1) } G && d.unshift(a); return g || G }; U = function(a) { var b, c, e, f; c = e = 0; for (f = d.length; 0 <= f ? e < f : e > f; c = 0 <= f ? ++e : --e) if (b = d[c], b === a) { N(d.splice(c, 1)); break } }; N = function(a) { if (a) return a.count = null, a.keyup_fired = null }; c = function(a, b) { var c, d, e, f; E.push(a); d = g(); if (d.length) { e = 0; for (f = d.length; e < f; e++) c = d[e], J(b, c.prevent_default); O && clearTimeout(O); - 1 < keypress.sequence_delay && (O = setTimeout(function() { return E = [] }, keypress.sequence_delay)) } else E = [] }; g = function() { var a, b, c, d, e, f, g, k, h, l, m; d = []; f = 0; for (h = t.length; f < h; f++) for (a = t[f], b = g = 1, l = E.length; 1 <= l ? g <= l : g >= l; b = 1 <= l ? ++g : --g) if ((e = E.slice(-b), a.is_sequence) && (!(0 > p.call(a.keys, "shift")) || (e = y(e, function(a) { return "shift" !== a }), e.length))) { b = k = 0; for (m = e.length; 0 <= m ? k < m : k > m; b = 0 <= m ? ++k : --k) if (a.keys[b] === e[b]) c = !0; else { c = !1; break } c && d.push(a) } return d }; C = function(a) { var b, c, d, e, f, g, k, h, l, m, n; g = 0; for (l = t.length; g < l; g++) if (b = t[g], b.is_sequence) { c = k = 1; for (m = E.length; 1 <= m ? k <= m : k >= m; c = 1 <= m ? ++k : --k) if (f = y(E, function(a) { return 0 <= p.call(b.keys, "shift") ? !0 : "shift" !== a }).slice(-c), b.keys.length === f.length) for (c = h = 0, n = f.length; 0 <= n ? h < n : h > n; c = 0 <= n ? ++h : --h) if (e = f[c], !(0 > p.call(b.keys, "shift") && "shift" === e || "shift" === a && 0 > p.call(b.keys, "shift"))) if (b.keys[c] === e) d = !0; else { d = !1; break } if (d) return b } return !1 }; n = function(a, b) { var c; if (!b.shiftKey) return !1; c = s[a]; return null != c ? c : !1 }; x = function(a, b, c) { if (0 > p.call(a.keys, b)) return !1; J(c, a && a.prevent_default); if (0 <= p.call(k, b) && !f(a)) return !1; b = e(a, b); a.keyup_fired = !1; a.is_counting && "function" === typeof a.on_keydown && (a.count += 1); if (b) return r("keydown", a, c) }; Y = function(a, b) { var d, e, f, g; (e = n(a, b)) && (a = e); c(a, b); (e = C(a)) && r("keydown", e, b); for (d in I) e = I[d], b[e] && (d === a || 0 <= p.call(k, d) || k.push(d)); for (d in I) if (e = I[d], d !== a && 0 <= p.call(k, d) && !b[e]) for (e = f = 0, g = k.length; 0 <= g ? f < g : f > g; e = 0 <= g ? ++f : --f) k[e] === d && k.splice(e, 1); e = D(a); f = 0; for (g = e.length; f < g; f++) d = e[f], x(d, a, b); e = B(a); if (e.length) for (f = 0, g = e.length; f < g; f++) d = e[f], J(b, d.prevent_default); 0 > p.call(k, a) && k.push(a) }; W = function(a, b, c) { var d, e; e = Q(a); a.keyup_fired || (d = k.slice(), d.push(c), a.is_solitary && !A(d, a.keys)) || (r("keyup", a, b), a.is_counting && "function" === typeof a.on_keyup && "function" !== typeof a.on_keydown && (a.count += 1)); e || (r("release", a, b), U(a)) }; l = function(a, b) { var c, e, f, g, h, l; e = a; (f = n(a, b)) && (a = f); f = s[e]; b.shiftKey ? f && 0 <= p.call(k, f) || (a = e) : e && 0 <= p.call(k, e) || (a = f); (g = C(a)) && r("keyup", g, b); if (0 > p.call(k, a)) return !1; g = h = 0; for (l = k.length; 0 <= l ? h < l : h > l; g = 0 <= l ? ++h : --h) if ((c = k[g]) === a || c === f || c === e) { k.splice(g, 1); break } e = d.length; f = []; g = 0; for (h = d.length; g < h; g++) c = d[g], 0 <= p.call(c.keys, a) && f.push(c); g = 0; for (h = f.length; g < h; g++) c = f[g], W(c, b, a); if (1 < e) for (e = 0, g = d.length; e < g; e++) c = d[e], void 0 === c || 0 <= p.call(f, c) || Q(c) || U(c) }; M = function(a, b) { var c; if (L) k.length && (k = []); else if (b || k.length) if (c = w(a.keyCode)) return b ? Y(c, a) : l(c, a) }; V = function(a) { var b, c, d, e; e = []; b = c = 0; for (d = t.length; 0 <= d ? c < d : c > d; b = 0 <= d ? ++c : --c) if (a === t[b]) { t.splice(b, 1); break } else e.push(void 0); return e }; aa = function(a) { var b, c, d, e, f; a.keys.length || H("You're trying to bind a combo with no keys."); c = e = 0; for (f = a.keys.length; 0 <= f ? e < f : e > f; c = 0 <= f ? ++e : --e) d = a.keys[c], (b = F[d]) && (d = a.keys[c] = b), "meta" === d && a.keys.splice(c, 1, R), "cmd" === d && H('Warning: use the "meta" key rather than "cmd" for Windows compatibility'); f = a.keys; b = 0; for (e = f.length; b < e; b++) if (d = f[b], 0 > p.call(P, d)) return H('Do not recognize the key "' + d + '"'), !1; if (0 <= p.call(a.keys, "meta") || 0 <= p.call(a.keys, "cmd")) { b = a.keys.slice(); e = 0; for (f = S.length; e < f; e++) d = S[e], -1 < (c = b.indexOf(d)) && b.splice(c, 1); 1 < b.length && H("META and CMD key combos cannot have more than 1 non-modifier keys", a, b) } return !0 }; h = function(a) { var b; if (0 <= p.call(k, "cmd") && "cmd" !== (b = w(a.keyCode)) && "shift" !== b && "alt" !== b && "caps" !== b && "tab" !== b) return M(a, !1) }; window.keypress = {}; keypress.force_event_defaults = !1; keypress.suppress_event_defaults = !1; keypress.sequence_delay = 800; keypress.get_registered_combos = function() { return t }; keypress.reset = function() { t = [] }; keypress.combo = function(a, b, c) { null == c && (c = !1); return keypress.register_combo({ keys: a, on_keydown: b, prevent_default: c }) }; keypress.counting_combo = function(a, b, c) { null == c && (c = !1); return keypress.register_combo({ keys: a, is_counting: !0, is_ordered: !0, on_keydown: b, prevent_default: c }) }; keypress.sequence_combo = function(a, b, c) { null == c && (c = !1); return keypress.register_combo({ keys: a, on_keydown: b, is_sequence: !0, prevent_default: c }) }; keypress.register_combo = function(a) { var b, c; "string" === typeof a.keys && (a.keys = a.keys.split(" ")); for (b in u) ba.call(u, b) && (c = u[b], null == a[b] && (a[b] = c)); if (aa(a)) return t.push(a), !0 }; keypress.register_many = function(a) { var b, c, d, e; e = []; c = 0; for (d = a.length; c < d; c++) b = a[c], e.push(keypress.register_combo(b)); return e }; keypress.unregister_combo = function(a) { var b, c, d; if (!a) return !1; if (a.keys) return V(a); d = []; b = 0; for (c = t.length; b < c; b++)(a = t[b]) && (A(keys, a.keys) ? d.push(V(a)) : d.push(void 0)); return d }; keypress.unregister_many = function(a) { var b, c, d, e; e = []; c = 0; for (d = a.length; c < d; c++) b = a[c], e.push(keypress.unregister_combo(b)); return e }; keypress.listen = function() { return L = !1 }; keypress.stop_listening = function() { return L = !0 }; w = function(a) { return m[a] }; I = { cmd: "metaKey", ctrl: "ctrlKey", shift: "shiftKey", alt: "altKey" }; F = { escape: "esc", control: "ctrl", command: "cmd", "break": "pause", windows: "cmd", option: "alt", caps_lock: "caps", apostrophe: "'", semicolon: ";", tilde: "~", accent: "`", scroll_lock: "scroll", num_lock: "num" }; s = { "/": "?", ".": ">", ",": "<", "'": '"', ";": ":", "[": "{", "]": "}", "\\": "|", "`": "~", "=": "+", "-": "_", 1: "!", 2: "@", 3: "#", 4: "$", 5: "%", 6: "^", 7: "&", 8: "*", 9: "(", 0: ")" }; m = { 0: "\\", 8: "backspace", 9: "tab", 12: "num", 13: "enter", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause", 20: "caps", 27: "escape", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home", 37: "left", 38: "up", 39: "right", 40: "down", 44: "print", 45: "insert", 46: "delete", 48: "0", 49: "1", 50: "2", 51: "3", 52: "4", 53: "5", 54: "6", 55: "7", 56: "8", 57: "9", 65: "a", 66: "b", 67: "c", 68: "d", 69: "e", 70: "f", 71: "g", 72: "h", 73: "i", 74: "j", 75: "k", 76: "l", 77: "m", 78: "n", 79: "o", 80: "p", 81: "q", 82: "r", 83: "s", 84: "t", 85: "u", 86: "v", 87: "w", 88: "x", 89: "y", 90: "z", 91: "cmd", 92: "cmd", 93: "cmd", 96: "num_0", 97: "num_1", 98: "num_2", 99: "num_3", 100: "num_4", 101: "num_5", 102: "num_6", 103: "num_7", 104: "num_8", 105: "num_9", 106: "num_multiply", 107: "num_add", 108: "num_enter", 109: "num_subtract", 110: "num_decimal", 111: "num_divide", 124: "print", 144: "num", 145: "scroll", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", 221: "]", 222: "'", 223: "`", 224: "cmd", 57392: "ctrl", 63289: "num" }; for (b in m) a = m[b], P.push(a); for (b in s) a = s[b], P.push(a); - 1 !== navigator.userAgent.indexOf("Mac OS X") && (R = "cmd"); - 1 !== navigator.userAgent.indexOf("Opera") && (m["17"] = "cmd"); T = function(a) { return (document.attachEvent ? "complete" === document.readyState : "loading" !== document.readyState) ? a() : setTimeout(function() { return T(a) }, 9) }; T(function() { var a; a = function(a, b, c) { if (a.addEventListener) return a.addEventListener(b, c); if (a.attachEvent) return a.attachEvent("on" + b, c) }; a(document.body, "keydown", function(a) { a = a || window.event; M(a, !0); return h(a) }); a(document.body, "keyup", function(a) { a = a || window.event; return M(a, !1) }); return a(window, "blur", function() { var a, b, c; b = 0; for (c = k.length; b < c; b++) a = k[b], l(a, {}); k = []; return [] }) }) }).call(this);