// window.addEventListener('message', function(e) { // console.log(e.data) // if (e.data == "click") { // document.body.click() // } // if (e.data == "ready") { // app.ready() // } // }) var TWO_PI = Math.PI * 2 var DEG_TO_RAD = Math.PI/180 var RAD_TO_DEG = 180/Math.PI function gray(n) { var s = Math.round(n * 255).toString(16) + "" if (s.length == 1) s = "0" + s return "#" + s + s + s } function sanitize (s){ return (s || "").replace(new RegExp("[<>&]", 'g'), "") } function rand(n){ return (Math.random()*n) } function randint(n){ return rand(n)|0 } function randrange(a,b){ return a + rand(b-a) } function randsign(){ return Math.random() > 0.5 ? 1 : -1 } function choice(a){ return a[randint(a.length)] } function clamp(n,a,b){ return n 0; i--){ var r = randint(i) var swap = a[i-1] a[i-1] = a[r] a[r] = swap } return a } function defaults (dest, src) { dest = dest || {} for (var i in src) { dest[i] = typeof dest[i] == 'undefined' ? src[i] : dest[i] } return dest } function getFirstTouch(fn){ return function(e){ e.preventDefault() var touch = e.touches[0] fn(touch) } } function offsetFromPoint(event, element) { function a(width) { var l = 0, r = 200; while (r - l > 0.0001) { var mid = (r + l) / 2; var a = document.createElement('div'); a.style.cssText = 'position: absolute;left:0;top:0;background: red;z-index: 1000;'; a.style[width ? 'width' : 'height'] = mid.toFixed(3) + '%'; a.style[width ? 'height' : 'width'] = '100%'; element.appendChild(a); var x = document.elementFromPoint(event.clientX, event.clientY); element.removeChild(a); if (x === a) { r = mid; } else { if (r === 200) { return null; } l = mid; } } return mid; } var l = a(1), t = a(0); return l && t ? { left: l / 100, top: t / 100, toString: function () { return 'left: ' + l + '%, top: ' + t + '%'; } } : null; } // Check if supports 3D transforms function has3d(){ var el = $('

')[0], $iframe = $('