{"version":3,"sources":["webpack:///scripts/module.product-detail--d09cfbd70d1e0afe9417.js","webpack:///./node_modules/debug/src/browser.js","webpack:///./node_modules/debug/src/debug.js","webpack:///./node_modules/ms/index.js","webpack:///./node_modules/process/browser.js","webpack:///./project/client/src/core/lib/strings.js","webpack:///./project/client/src/scripts/module.product-detail.js"],"names":["str001WebpackJsonp","/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/debug/src/browser.js","module","exports","__webpack_require__","process","useColors","window","type","navigator","userAgent","toLowerCase","match","document","documentElement","style","WebkitAppearance","console","firebug","exception","table","parseInt","RegExp","$1","formatArgs","args","this","namespace","humanize","diff","c","color","splice","index","lastC","replace","log","_typeof","Function","prototype","apply","call","arguments","save","namespaces","storage","removeItem","debug","e","load","r","env","DEBUG","Symbol","iterator","obj","constructor","chrome","local","localStorage","colors","formatters","j","v","JSON","stringify","err","message","enable","/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/debug/src/debug.js","selectColor","i","hash","charCodeAt","Math","abs","length","createDebug","enabled","self","curr","Date","ms","prevTime","prev","Array","coerce","unshift","format","formatter","val","bind","destroy","init","instances","push","indexOf","names","skips","split","len","substr","instance","disable","name","test","Error","stack","/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/ms/index.js","parse","str","String","exec","n","parseFloat","y","d","h","m","s","fmtShort","round","fmtLong","plural","floor","ceil","options","isNaN","long","/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/process/browser.js","defaultSetTimout","defaultClearTimeout","runTimeout","fun","cachedSetTimeout","setTimeout","runClearTimeout","marker","cachedClearTimeout","clearTimeout","cleanUpNextTick","draining","currentQueue","queue","concat","queueIndex","drainQueue","timeout","run","Item","array","noop","nextTick","title","browser","argv","version","versions","on","addListener","once","off","removeListener","removeAllListeners","emit","prependListener","prependOnceListener","listeners","binding","cwd","chdir","dir","umask","/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/project/client/src/core/lib/strings.js","toCamelCase","p1","p2","toUpperCase","tmpl","context","result","Object","keys","forEach","item","$tmpl","element","$target","$","templateString","attr","text","mustache","template","parent","invert","get","ctx","path","pop","shift","render","output","isArray","inverted","childCode","depth","assign","","code","z","close","raw","comment","isRaw","partial","Option","innerHTML","defineProperty","value","_debug","_debug2","__esModule","default","/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/project/client/src/scripts/module.product-detail.js","_toConsumableArray","arr","arr2","from","getSliderOptions","$element","UA_IS_SAFARI","watchCSS","GetGalleryElement","Promise","resolve","reject","querySelector","InitGallery","then","flickity","Flickity","data","activate","GetGallery","DestroyGallery","$gallery","BindGalleryEvents","gallery","PauseVideo","PauseEmbed","UpdatePaginationStatus","SelectGalleryThumbnail","selectedIndex","total","current","ONE","_strings","SelectGallerySlide","slideIndex","select","thumbnail","$thumbnail","siblings","removeClass","addClass","querySelectorAll","video","pause","getYTPlayer","player","pauseVideo","ResizeGallery","reposition","resize","OnFlickityMainImageClick","event","Foundation","MediaQuery","atLeast","target","tagName","currentTarget","itemIndex","parentNode","children","foundation","OnFlickityThumbnailClick","jQueryBridget","userAgentContains","UA_HAS_SAFARI","UA_HAS_CHROME","ready","one","$modal","topPad","height","css","modalTargets","each","selector","addEventListener","multi /tool/project/client/src/scripts/module.product-detail.js"],"mappings":"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","file":"scripts/module.product-detail--d09cfbd70d1e0afe9417.js","sourcesContent":["str001WebpackJsonp([\"module.product-detail\"],{\n\n/***/ \"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/debug/src/browser.js\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(process) {\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = __webpack_require__(\"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/debug/src/debug.js\");\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome && 'undefined' != typeof chrome.storage ? chrome.storage.local : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n return true;\n }\n\n // Internet Explorer and Edge do not support colors.\n if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n return false;\n }\n\n // is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31 ||\n // double check webkit in userAgent just in case we are in a worker\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/);\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function (v) {\n try {\n return JSON.stringify(v);\n } catch (err) {\n return '[UnexpectedJSONParseError]: ' + err.message;\n }\n};\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '') + this.namespace + (useColors ? ' %c' : ' ') + args[0] + (useColors ? '%c ' : ' ') + '+' + exports.humanize(this.diff);\n\n if (!useColors) return;\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit');\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function (match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === (typeof console === 'undefined' ? 'undefined' : _typeof(console)) && console.log && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch (e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n var r;\n try {\n r = exports.storage.debug;\n } catch (e) {}\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n try {\n return window.localStorage;\n } catch (e) {}\n}\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(\"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/process/browser.js\")))\n\n/***/ }),\n\n/***/ \"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/debug/src/debug.js\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = __webpack_require__(\"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/ms/index.js\");\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n var hash = 0,\n i;\n\n for (i in namespace) {\n hash = (hash << 5) - hash + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n var prevTime;\n\n function debug() {\n // disabled?\n if (!debug.enabled) return;\n\n var self = debug;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // turn the `arguments` into a proper Array\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %O\n args.unshift('%O');\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function (match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n // apply env-specific formatting (colors, etc.)\n exports.formatArgs.call(self, args);\n\n var logFn = debug.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = exports.enabled(namespace);\n debug.useColors = exports.useColors();\n debug.color = selectColor(namespace);\n debug.destroy = destroy;\n\n // env-specific initialization logic for debug instances\n if ('function' === typeof exports.init) {\n exports.init(debug);\n }\n\n exports.instances.push(debug);\n\n return debug;\n}\n\nfunction destroy() {\n var index = exports.instances.indexOf(this);\n if (index !== -1) {\n exports.instances.splice(index, 1);\n return true;\n } else {\n return false;\n }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n exports.names = [];\n exports.skips = [];\n\n var i;\n var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n var len = split.length;\n\n for (i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n\n for (i = 0; i < exports.instances.length; i++) {\n var instance = exports.instances[i];\n instance.enabled = exports.enabled(instance.namespace);\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n if (name[name.length - 1] === '*') {\n return true;\n }\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n\n/***/ }),\n\n/***/ \"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/ms/index.js\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n options = options || {};\n var type = typeof val === 'undefined' ? 'undefined' : _typeof(val);\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isNaN(val) === false) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error('val is not a non-empty string or a valid number. val=' + JSON.stringify(val));\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n if (ms >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (ms >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (ms >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (ms >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n return plural(ms, d, 'day') || plural(ms, h, 'hour') || plural(ms, m, 'minute') || plural(ms, s, 'second') || ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) {\n return;\n }\n if (ms < n * 1.5) {\n return Math.floor(ms / n) + ' ' + name;\n }\n return Math.ceil(ms / n) + ' ' + name + 's';\n}\n\n/***/ }),\n\n/***/ \"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/process/browser.js\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout() {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n})();\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while (len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) {\n return [];\n};\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () {\n return '/';\n};\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function () {\n return 0;\n};\n\n/***/ }),\n\n/***/ \"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/project/client/src/core/lib/strings.js\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; /* global Loader:true $:true */\n\nexports.toCamelCase = toCamelCase;\nexports.tmpl = tmpl;\nexports.$tmpl = $tmpl;\nexports.mustache = mustache;\n\nvar _debug = __webpack_require__(\"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/debug/src/browser.js\");\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar MODULE_NAME = 'app.core/lib/strings';\nvar log = (0, _debug2.default)(MODULE_NAME);\n\nfunction toCamelCase(str) {\n return str.replace(/^([A-Z])|[\\s-_](\\w)/g, function (match, p1, p2) {\n if (p2) {\n return p2.toUpperCase();\n }\n\n return p1.toLowerCase();\n });\n}\n\nfunction tmpl(str, context) {\n var result = str;\n\n log('templating ' + result + ' with context: ', context);\n\n if (result) {\n\n Object.keys(context).forEach(function (item) {\n result = result.replace('{{' + item + '}}', context[item]);\n });\n\n log('templated ' + result);\n }\n\n return result;\n}\n\nfunction $tmpl(element, context) {\n var $target = $(element);\n var templateString = $target.attr('data-text-template');\n\n log('templating [' + templateString + '] with context: ', context);\n var result = tmpl(templateString, context);\n\n $target.text(result);\n}\n\n/**\r\n * https://github.com/aishikaty/tiny-mustache\r\n * https://mustache.github.io/\r\n * @param {String} template [description]\r\n * @param {[type]} self [description]\r\n * @param {[type]} parent [description]\r\n * @param {[type]} invert [description]\r\n * @return {[type]} [description]\r\n */\nfunction mustache(template, self, parent, invert) {\n var render = mustache;\n var output = \"\";\n var i;\n\n function get(ctx, path) {\n path = path.pop ? path : path.split(\".\");\n ctx = ctx[path.shift()] || \"\";\n return 0 in path ? get(ctx, path) : ctx;\n }\n\n self = Array.isArray(self) ? self : self ? [self] : [];\n self = invert ? 0 in self ? [] : [1] : self;\n\n for (i = 0; i < self.length; i++) {\n var childCode = '';\n var depth = 0;\n var inverted;\n var ctx = _typeof(self[i]) == \"object\" ? self[i] : {};\n ctx = Object.assign({}, parent, ctx);\n ctx[\"\"] = { \"\": self[i] };\n\n template.replace(/([\\s\\S]*?)({{((\\/)|(\\^)|#)(.*?)}}|$)/g, function (match, code, y, z, close, invert, name) {\n if (!depth) {\n output += code.replace(/{{{(.*?)}}}|{{(!?)(&?)(>?)(.*?)}}/g, function (match, raw, comment, isRaw, partial, name) {\n return raw ? get(ctx, raw) : isRaw ? get(ctx, name) : partial ? render(get(ctx, name), ctx) : !comment ? new Option(get(ctx, name)).innerHTML : \"\";\n });\n inverted = invert;\n } else {\n childCode += depth && !close || depth > 1 ? match : code;\n }\n if (close) {\n if (! --depth) {\n name = get(ctx, name);\n if (/^f/.test(typeof name === 'undefined' ? 'undefined' : _typeof(name))) {\n output += name.call(ctx, childCode, function (template) {\n return render(template, ctx);\n });\n } else {\n output += render(childCode, name, ctx, inverted);\n }\n childCode = \"\";\n }\n } else {\n ++depth;\n }\n });\n }\n return output;\n}\n\n/***/ }),\n\n/***/ \"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/project/client/src/scripts/module.product-detail.js\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _strings = __webpack_require__(\"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/project/client/src/core/lib/strings.js\");\n\nvar _debug = __webpack_require__(\"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/node_modules/debug/src/browser.js\");\n\nvar _debug2 = _interopRequireDefault(_debug);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /* global Loader:true $:true Foundation:true Flickity:true */\n//import 'babel-polyfill';\n\n\njQueryBridget('flickity', Flickity, $);\n\nwindow.Symbol = Symbol;\nvar ONE = 1;\nvar ZERO = 0;\nvar MODULE_NAME = 'module/product-detail';\nvar log = (0, _debug2.default)(MODULE_NAME);\nvar userAgentContains = function userAgentContains(str) {\n return navigator.userAgent.toLowerCase().indexOf(str.toLowerCase()) > -1;\n};\nvar UA_HAS_SAFARI = userAgentContains(\"Safari\");\nvar UA_HAS_CHROME = userAgentContains(\"Crhome\");\nvar UA_HAS_OPERA = userAgentContains(\"op\");\nvar UA_IS_SAFARI = UA_HAS_SAFARI && !UA_HAS_CHROME;\nvar UA_IS_CHROME = UA_HAS_CHROME && !UA_HAS_OPERA;\n\nfunction getSliderOptions($element) {\n var galleryOptionsAttr = 'data-flickity';\n var options = $element.attr(galleryOptionsAttr) || {};\n if (UA_IS_SAFARI) {\n options.watchCSS = false;\n }\n return options;\n}\n\nfunction GetGalleryElement() {\n return new Promise(function (resolve, reject) {\n var gallerySelector = '#modal-gallery .modal-gallery';\n var element = document.querySelector(gallerySelector);\n\n log('element', element);\n\n resolve(element);\n });\n}\n\nfunction InitGallery() {\n return new Promise(function (resolve, reject) {\n GetGalleryElement().then(function ($element) {\n var flickity = Flickity.data($element);\n if (!flickity) {\n var options = getSliderOptions($element);\n flickity = $element.flickity(options);\n }\n if (UA_IS_SAFARI && flickity.activate && typeof flickity.activate == 'function') {\n flickity.activate();\n }\n resolve(flickity);\n });\n });\n}\n\nfunction GetGallery() {\n return new Promise(function (resolve, reject) {\n GetGalleryElement().then(InitGallery).then(function (flickity) {\n log('resolved gallery', flickity);\n resolve(flickity);\n });\n });\n}\n\nfunction DestroyGallery() {\n GetGalleryElement().then(function ($element) {\n var $gallery = $element.data('flickity');\n if ($gallery) {\n $gallery.destroy();\n }\n });\n}\n\n// Flickity not initialised until carousel elements are visible\nfunction BindGalleryEvents(gallery) {\n return new Promise(function (resolve, reject) {\n if (!gallery) return;\n log('binding gallery events', gallery);\n\n $('#modal-gallery').on('closed.zf.reveal', function () {\n PauseVideo(gallery);\n PauseEmbed(gallery);\n });\n\n gallery.on('select', function () {\n log('[initGalleryCarousel] flickity.select');\n PauseVideo(gallery);\n PauseEmbed(gallery);\n UpdatePaginationStatus(gallery);\n SelectGalleryThumbnail(gallery.selectedIndex);\n });\n\n gallery.on('settle', function () {\n log('[initGalleryCarousel] flickity.settle');\n UpdatePaginationStatus(gallery);\n SelectGalleryThumbnail(gallery.selectedIndex);\n });\n\n resolve();\n });\n}\n\nfunction UpdatePaginationStatus(gallery) {\n return new Promise(function (resolve, reject) {\n var total = $('.modal-gallery__thumbnail').length;\n var current = gallery.selectedIndex + ONE;\n\n log('UpdatePaginationStatus', gallery, total, current);\n\n (0, _strings.$tmpl)('.modal-gallery__pagination-status', {\n total: total,\n current: current\n });\n });\n}\n\nfunction SelectGallerySlide(slideIndex) {\n return GetGallery().then(function ($gallery) {\n $gallery.select(slideIndex, false, true);\n return Promise.resolve($gallery);\n });\n}\n\nfunction SelectGalleryThumbnail(slideIndex) {\n var thumbnail = $('.modal-gallery__thumbnail').get(slideIndex);\n var $thumbnail = $(thumbnail);\n\n log('selecting slide [' + slideIndex + ']', thumbnail);\n\n $thumbnail.siblings().removeClass('is-selected');\n\n $thumbnail.addClass('is-selected');\n}\n\nfunction PauseVideo(gallery) {\n var videos = gallery.element.querySelectorAll('video');\n videos.forEach(function (video) {\n video.pause();\n });\n}\n\nfunction PauseEmbed(gallery) {\n var players = gallery.element.querySelectorAll('lite-youtube.lyt-activated');\n players.forEach(function (element) {\n element.getYTPlayer().then(function (player) {\n if (player && player.pauseVideo) {\n player.pauseVideo();\n }\n });\n });\n}\n\nfunction ResizeGallery(gallery) {\n return new Promise(function (resolve, reject) {\n log('repositioning gallery', gallery);\n gallery.reposition();\n log('resizing gallery', gallery);\n gallery.resize();\n resolve(gallery);\n });\n}\n\nfunction OnFlickityMainImageClick(event) {\n if (!Foundation.MediaQuery.atLeast('medium')) {\n DestroyGallery();\n return false;\n }\n\n if (event.target.tagName !== 'IMG') {\n return false;\n }\n\n var item = event.currentTarget;\n var itemIndex = [].concat(_toConsumableArray(item.parentNode.children)).indexOf(item);\n\n log('Setting up modal gallery');\n log('.image-gallery__main-image:click');\n\n GetGallery().then(function (gallery) {\n $('#modal-gallery').foundation('open');\n return gallery;\n }).then(function () {\n SelectGallerySlide(itemIndex);\n });\n}\n\nfunction OnFlickityThumbnailClick() {\n if (!Foundation.MediaQuery.atLeast('medium')) {\n DestroyGallery();\n return false;\n }\n\n var index = $(this).index();\n log('.modal-gallery__thumbnail:click');\n\n GetGallery().then(function (gallery) {\n $('#modal-gallery').foundation('open');\n return gallery;\n }).then(function (gallery) {\n SelectGallerySlide(index);\n });\n}\n\n$(document).ready(function () {\n\n // Initialise flickity only when revealed\n\n $('#modal-gallery').one('open.zf.reveal', function () {\n var $modal = $('#modal-gallery');\n log('revealing modal gallery');\n GetGallery().then(ResizeGallery).then(function (gallery) {\n var topPad = $(window).height() / 2 - $modal.height() / 2;\n $modal.css('top', topPad > 0 ? topPad : 0);\n });\n });\n\n /**\r\n * Removes foundation reveal modals.\r\n * see: https://jira.fusion.com.au/browse/DET001-105\r\n * > Mobile no modal appears only slider of main image sized images.\r\n */\n if (Foundation.MediaQuery.current === 'small') {\n log('removing product image gallery modal.');\n\n var modalTargets = {};\n\n $('.product-detail-image-gallery [data-open]').each(function GetModalTarget() {\n modalTargets[$(this).attr('data-open')] = true;\n });\n\n Object.keys(modalTargets).forEach(function (selector) {\n $('#' + selector).foundation('destroy');\n });\n }\n\n if (Foundation.MediaQuery.atLeast('medium')) {\n log('At least medium');\n\n document.querySelectorAll('.product-detail-image-gallery__carousel-item').forEach(function (item) {\n item.addEventListener('click', OnFlickityMainImageClick);\n });\n\n $('.modal-gallery__thumbnail, .product-detail-image-gallery__thumbnail-item').on('click', OnFlickityThumbnailClick);\n\n GetGallery().then(BindGalleryEvents);\n }\n});\n\n/***/ }),\n\n/***/ \"multi /tool/project/client/src/scripts/module.product-detail.js\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(\"/tool/node_modules/babel-loader/lib/index.js??ref--7-0!/tool/node_modules/eslint-loader/index.js!/tool/project/client/src/scripts/module.product-detail.js\");\n\n\n/***/ })\n\n},[\"multi /tool/project/client/src/scripts/module.product-detail.js\"]);\n\n\n// WEBPACK FOOTER //\n// scripts/module.product-detail--d09cfbd70d1e0afe9417.js","/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n return true;\n }\n\n // Internet Explorer and Edge do not support colors.\n if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n return false;\n }\n\n // is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n // double check webkit in userAgent just in case we are in a worker\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n try {\n return JSON.stringify(v);\n } catch (err) {\n return '[UnexpectedJSONParseError]: ' + err.message;\n }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return;\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit')\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n var r;\n try {\n r = exports.storage.debug;\n } catch(e) {}\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n try {\n return window.localStorage;\n } catch (e) {}\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/debug/src/browser.js","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n var hash = 0, i;\n\n for (i in namespace) {\n hash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n var prevTime;\n\n function debug() {\n // disabled?\n if (!debug.enabled) return;\n\n var self = debug;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // turn the `arguments` into a proper Array\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %O\n args.unshift('%O');\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n // apply env-specific formatting (colors, etc.)\n exports.formatArgs.call(self, args);\n\n var logFn = debug.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = exports.enabled(namespace);\n debug.useColors = exports.useColors();\n debug.color = selectColor(namespace);\n debug.destroy = destroy;\n\n // env-specific initialization logic for debug instances\n if ('function' === typeof exports.init) {\n exports.init(debug);\n }\n\n exports.instances.push(debug);\n\n return debug;\n}\n\nfunction destroy () {\n var index = exports.instances.indexOf(this);\n if (index !== -1) {\n exports.instances.splice(index, 1);\n return true;\n } else {\n return false;\n }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n exports.names = [];\n exports.skips = [];\n\n var i;\n var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n var len = split.length;\n\n for (i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n\n for (i = 0; i < exports.instances.length; i++) {\n var instance = exports.instances[i];\n instance.enabled = exports.enabled(instance.namespace);\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n if (name[name.length - 1] === '*') {\n return true;\n }\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/debug/src/debug.js","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isNaN(val) === false) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n if (ms >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (ms >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (ms >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (ms >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n return plural(ms, d, 'day') ||\n plural(ms, h, 'hour') ||\n plural(ms, m, 'minute') ||\n plural(ms, s, 'second') ||\n ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) {\n return;\n }\n if (ms < n * 1.5) {\n return Math.floor(ms / n) + ' ' + name;\n }\n return Math.ceil(ms / n) + ' ' + name + 's';\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/ms/index.js","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/process/browser.js","/* global Loader:true $:true */\r\n\r\nimport debug from \"debug\";\r\nconst MODULE_NAME = 'app.core/lib/strings';\r\nconst log = debug(MODULE_NAME);\r\n\r\n\r\nexport function toCamelCase (str) {\r\n\treturn str.replace(/^([A-Z])|[\\s-_](\\w)/g, (match, p1, p2) => {\r\n\t\tif (p2) {\r\n\t\t\treturn p2.toUpperCase();\r\n\t\t}\r\n\r\n\t\treturn p1.toLowerCase();\r\n\t});\r\n}\r\n\r\nexport function tmpl (str, context) {\r\n\tlet result = str;\r\n\r\n\tlog(`templating ${result} with context: `, context);\r\n\r\n\tif (result) {\r\n\r\n\t\tObject.keys(context)\r\n\t\t\t.forEach((item) => {\r\n\t\t\t\tresult = result.replace(`{{${item}}}`, context[item]);\r\n\t\t\t});\r\n\r\n\t\tlog(`templated ${result}`);\r\n\t}\r\n\r\n\treturn result;\r\n}\r\n\r\nexport function $tmpl (element, context) {\r\n const $target = $(element);\r\n const templateString = $target.attr('data-text-template');\r\n\r\n log(`templating [${templateString}] with context: `, context);\r\n const result = tmpl(templateString, context);\r\n\r\n $target.text(result);\r\n}\r\n\r\n/**\r\n * https://github.com/aishikaty/tiny-mustache\r\n * https://mustache.github.io/\r\n * @param {String} template [description]\r\n * @param {[type]} self [description]\r\n * @param {[type]} parent [description]\r\n * @param {[type]} invert [description]\r\n * @return {[type]} [description]\r\n */\r\nexport function mustache(template, self, parent, invert) {\r\n var render = mustache;\r\n var output = \"\";\r\n var i;\r\n\r\n function get (ctx, path) {\r\n path = path.pop ? path : path.split(\".\");\r\n ctx = ctx[path.shift()] || \"\";\r\n return (0 in path) ? get(ctx, path) : ctx;\r\n }\r\n\r\n self = Array.isArray(self) ? self : (self ? [self] : []);\r\n self = invert ? (0 in self) ? [] : [1] : self;\r\n\r\n for (i = 0; i < self.length; i++) {\r\n var childCode = '';\r\n var depth = 0;\r\n var inverted;\r\n var ctx = (typeof self[i] == \"object\") ? self[i] : {};\r\n ctx = Object.assign({}, parent, ctx);\r\n ctx[\"\"] = {\"\": self[i]};\r\n\r\n template.replace(/([\\s\\S]*?)({{((\\/)|(\\^)|#)(.*?)}}|$)/g,\r\n function(match, code, y, z, close, invert, name) {\r\n if (!depth) {\r\n output += code.replace(/{{{(.*?)}}}|{{(!?)(&?)(>?)(.*?)}}/g,\r\n function(match, raw, comment, isRaw, partial, name) {\r\n return raw ? get(ctx, raw)\r\n : isRaw ? get(ctx, name)\r\n : partial ? render(get(ctx, name), ctx)\r\n : !comment ? new Option(get(ctx, name)).innerHTML\r\n : \"\";\r\n }\r\n );\r\n inverted = invert;\r\n } else {\r\n childCode += depth && !close || depth > 1 ? match : code;\r\n }\r\n if (close) {\r\n if (!--depth) {\r\n name = get(ctx, name);\r\n if (/^f/.test(typeof name)) {\r\n output += name.call(ctx, childCode, function (template) {\r\n return render(template, ctx);\r\n });\r\n } else {\r\n output += render(childCode, name, ctx, inverted);\r\n }\r\n childCode = \"\";\r\n }\r\n } else {\r\n ++depth;\r\n }\r\n }\r\n );\r\n }\r\n return output;\r\n}\r\n\r\n\n\n\n// WEBPACK FOOTER //\n// ./project/client/src/core/lib/strings.js","/* global Loader:true $:true Foundation:true Flickity:true */\r\n//import 'babel-polyfill';\r\nimport {$tmpl, tmpl} from '@core/lib/strings';\r\n\r\nimport debug from \"debug\";\r\n\r\njQueryBridget( 'flickity', Flickity, $ );\r\n\r\nwindow.Symbol = Symbol;\r\nconst ONE = 1;\r\nconst ZERO = 0;\r\nconst MODULE_NAME = 'module/product-detail';\r\nconst log = debug(MODULE_NAME);\r\nconst userAgentContains = (str) => navigator.userAgent.toLowerCase().indexOf(str.toLowerCase()) > -1;\r\nconst UA_HAS_SAFARI = userAgentContains(\"Safari\");\r\nconst UA_HAS_CHROME = userAgentContains(\"Crhome\");\r\nconst UA_HAS_OPERA = userAgentContains(\"op\");\r\nconst UA_IS_SAFARI = UA_HAS_SAFARI && !UA_HAS_CHROME;\r\nconst UA_IS_CHROME = UA_HAS_CHROME && !UA_HAS_OPERA;\r\n\r\nfunction getSliderOptions ($element) {\r\n const galleryOptionsAttr = 'data-flickity';\r\n const options = $element.attr(galleryOptionsAttr) || {};\r\n if (UA_IS_SAFARI) {\r\n options.watchCSS = false;\r\n }\r\n return options;\r\n}\r\n\r\nfunction GetGalleryElement () {\r\n return new Promise( (resolve, reject) => {\r\n const gallerySelector = '#modal-gallery .modal-gallery';\r\n const element = document.querySelector(gallerySelector);\r\n\r\n log('element', element);\r\n\r\n resolve(element);\r\n });\r\n}\r\n\r\nfunction InitGallery () {\r\n return new Promise( (resolve, reject) => {\r\n GetGalleryElement()\r\n .then(($element) => {\r\n let flickity = Flickity.data($element);\r\n if (!flickity) {\r\n const options = getSliderOptions($element);\r\n flickity = $element.flickity(options);\r\n }\r\n if (UA_IS_SAFARI && flickity.activate && typeof flickity.activate == 'function') {\r\n flickity.activate();\r\n }\r\n resolve(flickity);\r\n });\r\n });\r\n}\r\n\r\n\r\nfunction GetGallery () {\r\n return new Promise( (resolve, reject) => {\r\n GetGalleryElement()\r\n .then(InitGallery)\r\n .then((flickity) => {\r\n log('resolved gallery', flickity);\r\n resolve(flickity);\r\n });\r\n });\r\n}\r\n\r\nfunction DestroyGallery () {\r\n GetGalleryElement()\r\n .then(($element) => {\r\n const $gallery = $element.data('flickity');\r\n if ($gallery) {\r\n $gallery.destroy();\r\n }\r\n });\r\n}\r\n\r\n// Flickity not initialised until carousel elements are visible\r\nfunction BindGalleryEvents (gallery) {\r\n return new Promise( (resolve, reject) => {\r\n if (!gallery) return;\r\n log('binding gallery events', gallery);\r\n\r\n $('#modal-gallery').on('closed.zf.reveal', () => {\r\n PauseVideo(gallery);\r\n PauseEmbed(gallery);\r\n });\r\n\r\n gallery.on('select', () => {\r\n log('[initGalleryCarousel] flickity.select');\r\n PauseVideo(gallery);\r\n PauseEmbed(gallery);\r\n UpdatePaginationStatus(gallery);\r\n SelectGalleryThumbnail(gallery.selectedIndex);\r\n });\r\n\r\n gallery.on('settle', () => {\r\n log('[initGalleryCarousel] flickity.settle');\r\n UpdatePaginationStatus(gallery);\r\n SelectGalleryThumbnail(gallery.selectedIndex);\r\n });\r\n\r\n resolve();\r\n });\r\n}\r\n\r\nfunction UpdatePaginationStatus (gallery) {\r\n return new Promise((resolve, reject) => {\r\n const total = $('.modal-gallery__thumbnail').length;\r\n const current = gallery.selectedIndex + ONE;\r\n\r\n log('UpdatePaginationStatus', gallery, total, current);\r\n\r\n $tmpl('.modal-gallery__pagination-status', {\r\n total: total,\r\n current: current\r\n });\r\n });\r\n}\r\n\r\nfunction SelectGallerySlide (slideIndex) {\r\n return GetGallery()\r\n .then( ($gallery) => {\r\n $gallery.select(slideIndex, false, true);\r\n return Promise.resolve($gallery);\r\n });\r\n}\r\n\r\nfunction SelectGalleryThumbnail (slideIndex) {\r\n const thumbnail = $('.modal-gallery__thumbnail').get(slideIndex);\r\n const $thumbnail = $(thumbnail);\r\n\r\n log(`selecting slide [${slideIndex}]`, thumbnail);\r\n\r\n $thumbnail\r\n .siblings()\r\n .removeClass('is-selected');\r\n\r\n $thumbnail\r\n .addClass('is-selected');\r\n\r\n}\r\n\r\nfunction PauseVideo (gallery) {\r\n const videos = gallery.element.querySelectorAll('video');\r\n videos.forEach((video) => {\r\n video.pause();\r\n });\r\n}\r\n\r\nfunction PauseEmbed (gallery) {\r\n const players = gallery.element.querySelectorAll('lite-youtube.lyt-activated');\r\n players.forEach((element)=>{\r\n element.getYTPlayer().then(player => {\r\n if(player && player.pauseVideo) {\r\n player.pauseVideo();\r\n }\r\n });\r\n });\r\n}\r\n\r\nfunction ResizeGallery (gallery) {\r\n return new Promise((resolve, reject) => {\r\n log('repositioning gallery', gallery);\r\n gallery.reposition();\r\n log('resizing gallery', gallery);\r\n gallery.resize();\r\n resolve(gallery);\r\n });\r\n}\r\n\r\nfunction OnFlickityMainImageClick (event) {\r\n if (!Foundation.MediaQuery.atLeast('medium')) {\r\n DestroyGallery();\r\n return false;\r\n }\r\n\r\n if(event.target.tagName !== 'IMG') {\r\n return false;\r\n }\r\n\r\n const item = event.currentTarget;\r\n const itemIndex = [...item.parentNode.children].indexOf(item);\r\n\r\n log('Setting up modal gallery');\r\n log('.image-gallery__main-image:click');\r\n\r\n GetGallery()\r\n .then((gallery) => {\r\n $('#modal-gallery').foundation('open');\r\n return gallery;\r\n })\r\n .then(() => {\r\n SelectGallerySlide(itemIndex);\r\n });\r\n}\r\n\r\nfunction OnFlickityThumbnailClick () {\r\n if (!Foundation.MediaQuery.atLeast('medium')) {\r\n DestroyGallery();\r\n return false;\r\n }\r\n\r\n const index = $(this).index();\r\n log('.modal-gallery__thumbnail:click');\r\n\r\n GetGallery()\r\n .then((gallery) => {\r\n $('#modal-gallery').foundation('open');\r\n return gallery;\r\n })\r\n .then((gallery) => {\r\n SelectGallerySlide(index);\r\n });\r\n}\r\n\r\n$(document).ready(() => {\r\n\r\n // Initialise flickity only when revealed\r\n\r\n $('#modal-gallery').one('open.zf.reveal', () => {\r\n const $modal = $('#modal-gallery');\r\n log('revealing modal gallery');\r\n GetGallery()\r\n .then(ResizeGallery)\r\n .then((gallery) => {\r\n const topPad = $(window).height() / 2 - $modal.height() / 2;\r\n $modal.css('top', topPad > 0 ? topPad : 0);\r\n });\r\n });\r\n\r\n\r\n\r\n /**\r\n * Removes foundation reveal modals.\r\n * see: https://jira.fusion.com.au/browse/DET001-105\r\n * > Mobile no modal appears only slider of main image sized images.\r\n */\r\n if (Foundation.MediaQuery.current === 'small') {\r\n log('removing product image gallery modal.');\r\n\r\n const modalTargets = {};\r\n\r\n $('.product-detail-image-gallery [data-open]')\r\n .each(function GetModalTarget () {\r\n modalTargets[$(this).attr('data-open')] = true;\r\n });\r\n\r\n Object.keys(modalTargets).forEach((selector) => {\r\n $(`#${selector}`).foundation('destroy');\r\n });\r\n\r\n }\r\n\r\n if (Foundation.MediaQuery.atLeast('medium')) {\r\n log('At least medium');\r\n\r\n document.querySelectorAll('.product-detail-image-gallery__carousel-item').forEach((item) => {\r\n item.addEventListener('click', OnFlickityMainImageClick);\r\n });\r\n\r\n $(`.modal-gallery__thumbnail, .product-detail-image-gallery__thumbnail-item`)\r\n .on('click', OnFlickityThumbnailClick);\r\n\r\n GetGallery()\r\n .then(BindGalleryEvents);\r\n }\r\n\r\n});\r\n\n\n\n// WEBPACK FOOTER //\n// ./project/client/src/scripts/module.product-detail.js"],"sourceRoot":""}