function shuffleArray(myArray){ var i = myArray.length; if (i == 0) return false; while (--i){ var j = Math.floor( Math.random() * ( i + 1 ) ); var tempi = myArray[i]; var tempj = myArray[j]; myArray[i] = tempj; myArray[j] = tempi; } return myArray; } function getMousePosition(element, evt){ var elementOffset = $(element).offset(); var currentMouseX = 0; var currentMouseY = 0; //TODO evil iPad hack if (evt.pageX != 0 && evt.pageY != 0){ currentMouseX = evt.pageX; currentMouseY = evt.pageY; } //TODO /evil iPad hack return { x: currentMouseX - elementOffset.left, y: currentMouseY - elementOffset.top }; }; function isCanvasSupported(){ var elem = document.createElement('canvas'); return !!(elem.getContext && elem.getContext('2d')); } window.accurateInterval = function(time, fn) { var cancel, nextAt, timeout, wrapper, _ref; nextAt = new Date().getTime() + time; timeout = null; if (typeof time === 'function') _ref = [time, fn], fn = _ref[0], time = _ref[1]; wrapper = function(){ nextAt += time; timeout = setTimeout(wrapper, nextAt - new Date().getTime()); return fn(); }; cancel = function() { return clearTimeout(timeout); }; timeout = setTimeout(wrapper, nextAt - new Date().getTime()); return { cancel: cancel }; };