window.check = function (thing, feature) { return !!thing || !!(feature && console.warn('Feature not available: ' + feature)); }; /* environment */ var // mode /** @const {Boolean} @readonly @desc Indicates whether code is running in the Star2Star Application Framework. */ ISORION = !!window.OrionSystem, /** @const {Boolean} @readonly @desc Indicates whether Framework is running in developer mode. */ DEVELOPER = OrionFramework.developerMode, // server /** @const {Boolean} @readonly @desc Indicates whether resources are to be loaded from Production server. @see {@link TEST} */ PRODUCTION = !!~OrionFramework.apiURL.indexOf('.com'), /** @const {Boolean} @readonly @desc Indicates whether resources are to be loaded from Test server. @see {@link PRODUCTION} */ TEST = !PRODUCTION, // platform /** @const {Boolean} @readonly @desc Indicates whether Framework is running on the Mac platform. @see {@link WIN} */ MAC = OrionFramework.platform === 'mac', /** @const {Boolean} @readonly @desc Indicates whether Framework is running on the Windows platform. @see {@link MAC} */ WIN = !MAC, /** @enum {Number} @readonly @desc Values identifying browser platform. @see {@link BrowserArchitecture} */ BrowserPlatform = { 'Unknown': 0, 'Mac' : 1, 'Windows': 2, 'Linux' : 3, 'iOS' : 4, 'Android': 5 }, /** @enum {Number} @readonly @desc Values identifying browser architecture. @see {@link BrowserPlatform} */ BrowserArchitecture = { 'Unknown': 0, 'x86' : 1, 'x86_64' : 2, 'ARM' : 3, 'PPC' : 4, 'ia64' : 5 }, // location /** @const {String} @readonly @desc Hostname of current location. */ HOST = window.location.hostname, /** @const {String} @readonly @desc Protocol + hostname of current location. */ ORIGIN = window.location.origin, /** @const {String} @readonly @desc Full path of current location including filename. */ PATH = window.location.pathname, /** @const {String} @readonly @desc Base path of current location. */ ROOT = PATH.substring(0, PATH.lastIndexOf('/')), /** @const {String} @readonly @desc Fragment of current location. */ HASH = window.location.hash.substring(1), // features /** @const {Boolean} @readonly @desc Indicates whether HTML imports are supported. Even if true, a <link>'s 'import' property will be null if: The <link> doesn't have rel="import". The <link> has not been added to the DOM. The <link> has been removed from the DOM. The resource is not CORS-enabled. */ F_IMPORT = check('import' in document.createElement('link'), 'HTML Imports'), /** @const {Boolean} @readonly @desc Indicates whether HTML templates are supported. */ F_TEMPLATE = check('content' in document.createElement('template'), 'HTML Templates'), /** @const {Boolean} @readonly @desc Indicates whether Shadow DOM is supported. */ F_SHADOW = check(document.createElement('div').createShadowRoot, 'Shadow DOM'), /** @const {Boolean} @readonly @desc Indicates whether custom elements are supported. */ F_CUSTOM = check(document.registerElement, 'Custom Elements'), /** @const {Boolean} @readonly @desc Indicates whether the features comprising components are supported. */ F_COMPONENT = check(F_IMPORT && F_TEMPLATE && F_SHADOW && F_CUSTOM, 'Components'), /** @const {Boolean} @readonly @desc Indicates whether Objects are observable. */ F_OBSERVE = check(Object.observe, 'Observables'), /** @const {Boolean} @readonly @desc Indicates whether WebSockets are supported. */ F_SOCKET = check(window.WebSocket, 'WebSockets'), /** @const {Boolean} @readonly @desc Indicates whether WebWorkers are supported. */ F_WORKER = check(window.Worker, 'WebWorkers'), /** @const {Boolean} @readonly @desc Indicates whether ServiceWorkers are supported. */ F_SERVICE = check(navigator.serviceWorker, 'ServiceWorkers'); /* precomputed */ var // time /** @const {Number} @readonly @desc Time: Precomputed ms value of 1/100th of 1 second. */ T_HUNDREDTH = 10, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1/10th of 1 second. */ T_TENTH = 100, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1/4th of 1 second. */ T_QUARTER = 250, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1/3rd of 1 second. */ T_THIRD = 333, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1/2 of 1 second. */ T_HALF = 500, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1 second. */ T_SECOND = 1000, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1 minute. */ T_MINUTE = T_SECOND * 60, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1 hour. */ T_HOUR = T_MINUTE * 60, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1 day. */ T_DAY = T_HOUR * 24, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1 week. */ T_WEEK = T_DAY * 7, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1 month (30 days). */ T_MONTH = T_DAY * 30, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1 year (365 days). */ T_YEAR = T_DAY * 365, /** @const {Number} @readonly @desc Time: Precomputed ms value of 1 leap year (366 days). */ T_LEAPYEAR = T_DAY * 366; /* levels */ var // logging /** @const {Number} @readonly @desc Log level: Silence, only for setting display level. */ L_OFF = 0, // • off (display) /** @const {Number} @readonly @desc Log level: Show regardless of display level (avoid). */ L_ALWAYS = 0, // • general/prominent/severe /** @const {Number} @readonly @desc Log level: Something's gone wrong. */ L_ERROR = 1, // ↓ /** @const {Number} @readonly @desc Log level: Potential problem or something to avoid. */ L_WARN = 2, // ↓ /** @const {Number} @readonly @desc Log level: Primary occurrences only, e.g. foundational happenings. */ L_MAIN = 3, // ↓ /** @const {Number} @readonly @desc Log level: Noting a function ran, stepping stone on a path. */ L_FUNC = 4, // ↓ /** @const {Number} @readonly @desc Log level: Processing details. */ L_INFO = 5, // ↓ /** @const {Number} @readonly @desc Log level: Arguments and presence are {@link deval}ed. */ L_DEBUG = 6, // • specific/detailed /** @const {Number} @readonly @desc Log level: Silence, only for setting squelch display level. */ L_NEVER = 7, // • off (arguments, presence) // starlets /** @const {Number} @readonly @desc Starlet state: Starlet not loaded. */ S_CLOSED = 0, /** @const {Number} @readonly @desc Starlet state: Starlet's WebView instantiated, location set. */ S_OPENED = 1, /** @const {Number} @readonly @desc Starlet state: Starlet initialized and responsive. */ S_REGISTERED = 2, /** @const {Number} @readonly @desc Starlet state: Starlet's onRun has fired and UI initialized. */ S_READY = 3; /* groupings */ var // starlets /** @const {Array.<String>} @readonly @desc Starlet details: List of accepted Starlet types. */ S_TYPES = ['connection', 'navigation', 'shoebox', 'notification', 'trusted_starlet', 'untrusted_starlet'], /** @const {Array.<String>} @readonly @desc Starlet details: List of Starlet types within main application window. */ S_TYPES_MAIN = ['navigation', 'shoebox', 'trusted_starlet', 'untrusted_starlet'], /** @const {Array.<String>} @readonly @desc Starlet details: List of crucial Starlet properties. */ S_PROPERTIES = ['type', 'url', 'name', 'identifier', 'title', 'width', 'height', 'order', 'state'], /** @const {Array.<String>} @readonly @desc Starlet details: List of possible Starlet modes. */ S_MODES = ['main', 'overlay', 'lightbox', 'tearoff', 'minitearoff'], /** @const {Array.<String>} @readonly @desc Starlet details: List of application window states. */ S_STATES = ['visible', 'active', 'focused', 'minimized', 'hidden', 'mouse'], /** @const {Array.<String>} @readonly @desc Starlet details: List of Starlet overlay types. */ S_NAMES_OVERLAYS = ['shoebox', 'navigation', 'notification'], /** @const {Array.<String>} @readonly @desc Starlet details: List of recognized lightbox names. */ S_NAMES_LIGHTBOXES = ['help', 'whatsnew', 'feedback'], // methods /** @const {Array.<String>} @readonly @desc Minishoebox: List of possible modes. */ MINISHOEBOX_MODES = ['starchat', 'starvideo', 'starfax', 'shoebox'], /** @const {Array.<String>} @readonly @desc Popovers: List of accepted placement strings. */ POPOVER_PLACEMENTS = ['left', 'top', 'right', 'bottom'], // analytics /** @const {Array.<String>} @readonly @desc Analytics: List of query selectors outlining elements to track. */ TRACKABLES = [ '[data-ga-title]', 'button:not(.ga-notrack)', 'input[type=button]:not(.ga-notrack)', 'input[type=submit]:not(.ga-notrack)', 'input[type=reset]:not(.ga-notrack)', 'a:not(.ga-notrack)', '.button:not(.ga-notrack)', '.btn:not(.ga-notrack)', '[class*=btn-]:not(.btn-group):not(.ga-notrack)', '.ga-trackable' ]; /* input */ var // modifiers /** @const {Number} @readonly @desc Modifiers: OR-able value for Alt. @see {@link M_CONTROL} @see {@link M_COMMAND} @see {@link M_SHIFT} @see {@link Modifiers} */ M_ALT = 1, /** @const {Number} @readonly @desc Modifiers: OR-able value for Control. @see {@link M_ALT} @see {@link M_COMMAND} @see {@link M_SHIFT} @see {@link Modifiers} */ M_CONTROL = 2, /** @const {Number} @readonly @desc Modifiers: OR-able value for Command. @see {@link M_ALT} @see {@link M_CONTROL} @see {@link M_SHIFT} @see {@link Modifiers} */ M_COMMAND = 4, /** @const {Number} @readonly @desc Modifiers: OR-able value for Shift. @see {@link M_ALT} @see {@link M_CONTROL} @see {@link M_COMMAND} @see {@link Modifiers} */ M_SHIFT = 8, /** @enum {Number} @readonly @desc Modifiers: OR-able values representing cross-platform keys. @see {@link M_ALT} @see {@link M_CONTROL} @see {@link M_COMMAND} @see {@link M_SHIFT} */ Modifiers = { Alt : 1, Crtl : 2, Command: 4, Shift : 8 }, /* key mapping*/ /** @enum {Number} @readonly @desc Hashlike index of keycodes and corresponding values. */ KEYCODES = { '\t': 9, '0': 48, ')': 48, '1': 49, '!': 49, '2': 50, '@': 50, '3': 51, '#': 51, '4': 52, '$': 52, '5': 53, '%': 53, '6': 54, '^': 54, '7': 55, '&': 55, '8': 56, '*': 56, '9': 57, '(': 57, 'a': 65, 'b': 66, 'c': 67, 'd': 68, 'e': 69, 'f': 70, 'g': 71, 'h': 72, 'i': 73, 'j': 74, 'k': 75, 'l': 76, 'm': 77, 'n': 78, 'o': 79, 'p': 80, 'q': 81, 'r': 82, 's': 83, 't': 84, 'u': 85, 'v': 86, 'w': 87, 'x': 88, 'y': 89, 'z': 90, ';' : 186, ':': 186, '=' : 187, '+': 187, ',' : 188, '<': 188, '-' : 189, '_': 189, '.' : 190, '>': 190, '/' : 191, '?': 191, '`' : 192, '~': 192, '[' : 219, '{': 219, '\\': 220, '|': 220, ']' : 221, '}': 221, '\'': 222, '"': 222 }; /* config */ /** @const {Number} @readonly @desc Maximum number of concurrent chat sessions. */ var CHATSESSIONS_LIMIT = 50; delete window.check;