"use strict"; import $ from 'jquery'; // Core Foundation Utilities, utilized in a number of places. /** * Returns a boolean for RTL support */ function rtl() { return $('html').attr('dir') === 'rtl'; } /** * returns a random base-36 uid with namespacing * @function * @param {Number} length - number of random base-36 digits desired. Increase for more random strings. * @param {String} namespace - name of plugin to be incorporated in uid, optional. * @default {String} '' - if no plugin name is provided, nothing is appended to the uid. * @returns {String} - unique id */ function GetYoDigits(length, namespace){ length = length || 6; return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1) + (namespace ? `-${namespace}` : ''); } /** * Escape a string so it can be used as a regexp pattern * @function * @see https://stackoverflow.com/a/9310752/4317384 * * @param {String} str - string to escape. * @returns {String} - escaped string */ function RegExpEscape(str){ return str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); } function transitionend($elem){ var transitions = { 'transition': 'transitionend', 'WebkitTransition': 'webkitTransitionEnd', 'MozTransition': 'transitionend', 'OTransition': 'otransitionend' }; var elem = document.createElement('div'), end; for (var t in transitions){ if (typeof elem.style[t] !== 'undefined'){ end = transitions[t]; } } if(end){ return end; }else{ end = setTimeout(function(){ $elem.triggerHandler('transitionend', [$elem]); }, 1); return 'transitionend'; } } /** * Return an event type to listen for window load. * * If `$elem` is passed, an event will be triggered on `$elem`. If window is already loaded, the event will still be triggered. * If `handler` is passed, attach it to the event on `$elem`. * Calling `onLoad` without handler allows you to get the event type that will be triggered before attaching the handler by yourself. * @function * * @param {Object} [] $elem - jQuery element on which the event will be triggered if passed. * @param {Function} [] handler - function to attach to the event. * @returns {String} - event type that should or will be triggered. */ function onLoad($elem, handler) { const didLoad = document.readyState === 'complete'; const eventType = (didLoad ? '_didLoad' : 'load') + '.zf.util.onLoad'; const cb = () => $elem.triggerHandler(eventType); if ($elem) { if (handler) $elem.one(eventType, handler); if (didLoad) setTimeout(cb); else $(window).one('load', cb); } return eventType; } /** * Retuns an handler for the `mouseleave` that ignore disappeared mouses. * * If the mouse "disappeared" from the document (like when going on a browser UI element, See https://git.io/zf-11410), * the event is ignored. * - If the `ignoreLeaveWindow` is `true`, the event is ignored when the user actually left the window * (like by switching to an other window with [Alt]+[Tab]). * - If the `ignoreReappear` is `true`, the event will be ignored when the mouse will reappear later on the document * outside of the element it left. * * @function * * @param {Function} [] handler - handler for the filtered `mouseleave` event to watch. * @param {Object} [] options - object of options: * - {Boolean} [false] ignoreLeaveWindow - also ignore when the user switched windows. * - {Boolean} [false] ignoreReappear - also ignore when the mouse reappeared outside of the element it left. * @returns {Function} - filtered handler to use to listen on the `mouseleave` event. */ function ignoreMousedisappear(handler, { ignoreLeaveWindow = false, ignoreReappear = false } = {}) { return function leaveEventHandler(eLeave, ...rest) { const callback = handler.bind(this, eLeave, ...rest); // The mouse left: call the given callback if the mouse entered elsewhere if (eLeave.relatedTarget !== null) { return callback(); } // Otherwise, check if the mouse actually left the window. // In firefox if the user switched between windows, the window sill have the focus by the time // the event is triggered. We have to debounce the event to test this case. setTimeout(function leaveEventDebouncer() { if (!ignoreLeaveWindow && document.hasFocus && !document.hasFocus()) { return callback(); } // Otherwise, wait for the mouse to reeapear outside of the element, if (!ignoreReappear) { $(document).one('mouseenter', function reenterEventHandler(eReenter) { if (!$(eLeave.currentTarget).has(eReenter.target).length) { // Fill where the mouse finally entered. eLeave.relatedTarget = eReenter.target; callback(); } }); } }, 0); }; } export { rtl, GetYoDigits, RegExpEscape, transitionend, onLoad, ignoreMousedisappear };