{"version":3,"file":"vfs_used_detail_page_entry.213d79c73e26b8c81013.min.js","mappings":"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","sources":["webpack://parkers/webpack/runtime/chunk loaded","webpack://parkers/./Assets/Js/jquery.panzoom.js","webpack://parkers/./Assets/Js/parkers/api/submit-api.js","webpack://parkers/./Assets/Js/parkers/components/contact-dealer.js","webpack://parkers/./Assets/Js/parkers/components/full-screen-gallery.js","webpack://parkers/./Assets/Js/parkers/entry/vfs-used-detail-page-entrypoint.js","webpack://parkers/./Assets/Js/parkers/utils/youtube.js","webpack://parkers/./node_modules/jquery-mousewheel/jquery.mousewheel.js","webpack://parkers/external var \"React\"","webpack://parkers/external var \"jQuery\"","webpack://parkers/webpack/bootstrap","webpack://parkers/webpack/runtime/define property getters","webpack://parkers/webpack/runtime/global","webpack://parkers/webpack/runtime/hasOwnProperty shorthand","webpack://parkers/webpack/runtime/make namespace object","webpack://parkers/webpack/runtime/jsonp chunk loading","webpack://parkers/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","/**\n * @license jquery.panzoom.js v3.2.2\n * Updated: Sun Aug 28 2016\n * Add pan and zoom functionality to any element\n * Copyright (c) timmy willison\n * Released under the MIT license\n * https://github.com/timmywil/jquery.panzoom/blob/master/MIT-License.txt\n */\n\n(function(global, factory) {\n\t// AMD\n\tif (typeof define === 'function' && define.amd) {\n\t\tdefine([ 'jquery' ], function(jQuery) {\n\t\t\treturn factory(global, jQuery);\n\t\t});\n\t// CommonJS/Browserify\n\t} else if (typeof exports === 'object') {\n\t\tfactory(global, require('jquery'));\n\t// Global\n\t} else {\n\t\tfactory(global, global.jQuery);\n\t}\n}(typeof window !== 'undefined' ? window : this, function(window, $) {\n\t'use strict';\n\n\tvar document = window.document;\n\tvar datakey = '__pz__';\n\tvar slice = Array.prototype.slice;\n\tvar rIE11 = /trident\\/7./i;\n\tvar supportsInputEvent = (function() {\n\t\t// IE11 returns a false positive\n\t\tif (rIE11.test(navigator.userAgent)) {\n\t\t\treturn false;\n\t\t}\n\t\tvar input = document.createElement('input');\n\t\tinput.setAttribute('oninput', 'return');\n\t\treturn typeof input.oninput === 'function';\n\t})();\n\n\t// Regex\n\tvar rupper = /([A-Z])/g;\n\tvar rsvg = /^http:[\\w\\.\\/]+svg$/;\n\n\tvar floating = '(\\\\-?\\\\d[\\\\d\\\\.e-]*)';\n\tvar commaSpace = '\\\\,?\\\\s*';\n\tvar rmatrix = new RegExp(\n\t\t'^matrix\\\\(' +\n\t\tfloating + commaSpace +\n\t\tfloating + commaSpace +\n\t\tfloating + commaSpace +\n\t\tfloating + commaSpace +\n\t\tfloating + commaSpace +\n\t\tfloating + '\\\\)$'\n\t);\n\n\t/**\n\t * Utility for determining transform matrix equality\n\t * Checks backwards to test translation first\n\t * @param {Array} first\n\t * @param {Array} second\n\t */\n\tfunction matrixEquals(first, second) {\n\t\tvar i = first.length;\n\t\twhile(--i) {\n\t\t\tif (Math.round(+first[i]) !== Math.round(+second[i])) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\t/**\n\t * Creates the options object for reset functions\n\t * @param {Boolean|Object} opts See reset methods\n\t * @returns {Object} Returns the newly-created options object\n\t */\n\tfunction createResetOptions(opts) {\n\t\tvar options = { range: true, animate: true };\n\t\tif (typeof opts === 'boolean') {\n\t\t\toptions.animate = opts;\n\t\t} else {\n\t\t\t$.extend(options, opts);\n\t\t}\n\t\treturn options;\n\t}\n\n\t/**\n\t * Represent a transformation matrix with a 3x3 matrix for calculations\n\t * Matrix functions adapted from Louis Remi's jQuery.transform (https://github.com/louisremi/jquery.transform.js)\n\t * @param {Array|Number} a An array of six values representing a 2d transformation matrix\n\t */\n\tfunction Matrix(a, b, c, d, e, f, g, h, i) {\n\t\tif ($.type(a) === 'array') {\n\t\t\tthis.elements = [\n\t\t\t\t+a[0], +a[2], +a[4],\n\t\t\t\t+a[1], +a[3], +a[5],\n\t\t\t\t 0, 0, 1\n\t\t\t];\n\t\t} else {\n\t\t\tthis.elements = [\n\t\t\t\ta, b, c,\n\t\t\t\td, e, f,\n\t\t\t\tg || 0, h || 0, i || 1\n\t\t\t];\n\t\t}\n\t}\n\n\tMatrix.prototype = {\n\t\t/**\n\t\t * Multiply a 3x3 matrix by a similar matrix or a vector\n\t\t * @param {Matrix|Vector} matrix\n\t\t * @return {Matrix|Vector} Returns a vector if multiplying by a vector\n\t\t */\n\t\tx: function(matrix) {\n\t\t\tvar isVector = matrix instanceof Vector;\n\n\t\t\tvar a = this.elements,\n\t\t\t\tb = matrix.elements;\n\n\t\t\tif (isVector && b.length === 3) {\n\t\t\t\t// b is actually a vector\n\t\t\t\treturn new Vector(\n\t\t\t\t\ta[0] * b[0] + a[1] * b[1] + a[2] * b[2],\n\t\t\t\t\ta[3] * b[0] + a[4] * b[1] + a[5] * b[2],\n\t\t\t\t\ta[6] * b[0] + a[7] * b[1] + a[8] * b[2]\n\t\t\t\t);\n\t\t\t} else if (b.length === a.length) {\n\t\t\t\t// b is a 3x3 matrix\n\t\t\t\treturn new Matrix(\n\t\t\t\t\ta[0] * b[0] + a[1] * b[3] + a[2] * b[6],\n\t\t\t\t\ta[0] * b[1] + a[1] * b[4] + a[2] * b[7],\n\t\t\t\t\ta[0] * b[2] + a[1] * b[5] + a[2] * b[8],\n\n\t\t\t\t\ta[3] * b[0] + a[4] * b[3] + a[5] * b[6],\n\t\t\t\t\ta[3] * b[1] + a[4] * b[4] + a[5] * b[7],\n\t\t\t\t\ta[3] * b[2] + a[4] * b[5] + a[5] * b[8],\n\n\t\t\t\t\ta[6] * b[0] + a[7] * b[3] + a[8] * b[6],\n\t\t\t\t\ta[6] * b[1] + a[7] * b[4] + a[8] * b[7],\n\t\t\t\t\ta[6] * b[2] + a[7] * b[5] + a[8] * b[8]\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false; // fail\n\t\t},\n\t\t/**\n\t\t * Generates an inverse of the current matrix\n\t\t * @returns {Matrix}\n\t\t */\n\t\tinverse: function() {\n\t\t\tvar d = 1 / this.determinant(),\n\t\t\t\ta = this.elements;\n\t\t\treturn new Matrix(\n\t\t\t\td * ( a[8] * a[4] - a[7] * a[5]),\n\t\t\t\td * (-(a[8] * a[1] - a[7] * a[2])),\n\t\t\t\td * ( a[5] * a[1] - a[4] * a[2]),\n\n\t\t\t\td * (-(a[8] * a[3] - a[6] * a[5])),\n\t\t\t\td * ( a[8] * a[0] - a[6] * a[2]),\n\t\t\t\td * (-(a[5] * a[0] - a[3] * a[2])),\n\n\t\t\t\td * ( a[7] * a[3] - a[6] * a[4]),\n\t\t\t\td * (-(a[7] * a[0] - a[6] * a[1])),\n\t\t\t\td * ( a[4] * a[0] - a[3] * a[1])\n\t\t\t);\n\t\t},\n\t\t/**\n\t\t * Calculates the determinant of the current matrix\n\t\t * @returns {Number}\n\t\t */\n\t\tdeterminant: function() {\n\t\t\tvar a = this.elements;\n\t\t\treturn a[0] * (a[8] * a[4] - a[7] * a[5]) - a[3] * (a[8] * a[1] - a[7] * a[2]) + a[6] * (a[5] * a[1] - a[4] * a[2]);\n\t\t}\n\t};\n\n\t/**\n\t * Create a vector containing three values\n\t */\n\tfunction Vector(x, y, z) {\n\t\tthis.elements = [ x, y, z ];\n\t}\n\n\t/**\n\t * Get the element at zero-indexed index i\n\t * @param {Number} i\n\t */\n\tVector.prototype.e = Matrix.prototype.e = function(i) {\n\t\treturn this.elements[ i ];\n\t};\n\n\t/**\n\t * Create a Panzoom object for a given element\n\t * @constructor\n\t * @param {Element} elem - Element to use pan and zoom\n\t * @param {Object} [options] - An object literal containing options to override default options\n\t * (See Panzoom.defaults for ones not listed below)\n\t * @param {jQuery} [options.$zoomIn] - zoom in buttons/links collection (you can also bind these yourself\n\t * e.g. $button.on('click', function(e) { e.preventDefault(); $elem.panzoom('zoomIn'); });)\n\t * @param {jQuery} [options.$zoomOut] - zoom out buttons/links collection on which to bind zoomOut\n\t * @param {jQuery} [options.$zoomRange] - zoom in/out with this range control\n\t * @param {jQuery} [options.$reset] - Reset buttons/links collection on which to bind the reset method\n\t * @param {Function} [options.on[Start|Change|Zoom|Pan|End|Reset] - Optional callbacks for panzoom events\n\t */\n\tfunction Panzoom(elem, options) {\n\n\t\t// Allow instantiation without `new` keyword\n\t\tif (!(this instanceof Panzoom)) {\n\t\t\treturn new Panzoom(elem, options);\n\t\t}\n\n\t\t// Sanity checks\n\t\tif (elem.nodeType !== 1) {\n\t\t\t$.error('Panzoom called on non-Element node');\n\t\t}\n\t\tif (!$.contains(document, elem)) {\n\t\t\t$.error('Panzoom element must be attached to the document');\n\t\t}\n\n\t\t// Don't remake\n\t\tvar d = $.data(elem, datakey);\n\t\tif (d) {\n\t\t\treturn d;\n\t\t}\n\n\t\t// Extend default with given object literal\n\t\t// Each instance gets its own options\n\t\tthis.options = options = $.extend({}, Panzoom.defaults, options);\n\t\tthis.elem = elem;\n\t\tvar $elem = this.$elem = $(elem);\n\t\tthis.$set = options.$set && options.$set.length ? options.$set : $elem;\n\t\tthis.$doc = $(elem.ownerDocument || document);\n\t\tthis.$parent = $elem.parent();\n\t\tthis.parent = this.$parent[0];\n\n\t\t// This is SVG if the namespace is SVG\n\t\t// However, while elements are SVG, we want to treat those like other elements\n\t\tthis.isSVG = rsvg.test(elem.namespaceURI) && elem.nodeName.toLowerCase() !== 'svg';\n\n\t\tthis.panning = false;\n\n\t\t// Save the original transform value\n\t\t// Save the prefixed transform style key\n\t\t// Set the starting transform\n\t\tthis._buildTransform();\n\n\t\t// Build the appropriately-prefixed transform style property name\n\t\t// De-camelcase\n\t\tthis._transform = $.cssProps.transform.replace(rupper, '-$1').toLowerCase();\n\n\t\t// Build the transition value\n\t\tthis._buildTransition();\n\n\t\t// Build containment dimensions\n\t\tthis.resetDimensions();\n\n\t\t// Add zoom and reset buttons to `this`\n\t\tvar $empty = $();\n\t\tvar self = this;\n\t\t$.each([ '$zoomIn', '$zoomOut', '$zoomRange', '$reset' ], function(i, name) {\n\t\t\tself[ name ] = options[ name ] || $empty;\n\t\t});\n\n\t\tthis.enable();\n\n\t\tthis.scale = this.getMatrix()[0];\n\t\tthis._checkPanWhenZoomed();\n\n\t\t// Save the instance\n\t\t$.data(elem, datakey, this);\n\t}\n\n\t// Attach regex for possible use (immutable)\n\tPanzoom.rmatrix = rmatrix;\n\n\tPanzoom.defaults = {\n\t\t// Should always be non-empty\n\t\t// Used to bind jQuery events without collisions\n\t\t// A guid is not added here as different instantiations/versions of panzoom\n\t\t// on the same element is not supported, so don't do it.\n\t\teventNamespace: '.panzoom',\n\n\t\t// Whether or not to transition the scale\n\t\ttransition: true,\n\n\t\t// Default cursor style for the element\n\t\tcursor: 'move',\n\n\t\t// There may be some use cases for zooming without panning or vice versa\n\t\tdisablePan: false,\n\t\tdisableZoom: false,\n\n\t\t// Pan only on the X or Y axes\n\t\tdisableXAxis: false,\n\t\tdisableYAxis: false,\n\n\t\t// Set whether you'd like to pan on left (1), middle (2), or right click (3)\n\t\twhich: 1,\n\n\t\t// The increment at which to zoom\n\t\t// adds/subtracts to the scale each time zoomIn/Out is called\n\t\tincrement: 0.3,\n\n\t\t// Turns on exponential zooming\n\t\t// If false, zooming will be incremented linearly\n\t\texponential: true,\n\n\t\t// Pan only when the scale is greater than minScale\n\t\tpanOnlyWhenZoomed: false,\n\n\t\t// min and max zoom scales\n\t\tminScale: 0.3,\n\t\tmaxScale: 6,\n\n\t\t// The default step for the range input\n\t\t// Precendence: default < HTML attribute < option setting\n\t\trangeStep: 0.05,\n\n\t\t// Animation duration (ms)\n\t\tduration: 200,\n\t\t// CSS easing used for scale transition\n\t\teasing: 'ease-in-out',\n\n\t\t// Indicate that the element should be contained within it's parent when panning\n\t\t// Note: this does not affect zooming outside of the parent\n\t\t// Set this value to 'invert' to only allow panning outside of the parent element (basically the opposite of the normal use of contain)\n\t\t// 'invert' is useful for a large panzoom element where you don't want to show anything behind it\n\t\tcontain: false\n\t};\n\n\tPanzoom.prototype = {\n\t\tconstructor: Panzoom,\n\n\t\t/**\n\t\t * @returns {Panzoom} Returns the instance\n\t\t */\n\t\tinstance: function() {\n\t\t\treturn this;\n\t\t},\n\n\t\t/**\n\t\t * Enable or re-enable the panzoom instance\n\t\t */\n\t\tenable: function() {\n\t\t\t// Unbind first\n\t\t\tthis._initStyle();\n\t\t\tthis._bind();\n\t\t\tthis.disabled = false;\n\t\t},\n\n\t\t/**\n\t\t * Disable panzoom\n\t\t */\n\t\tdisable: function() {\n\t\t\tthis.disabled = true;\n\t\t\tthis._resetStyle();\n\t\t\tthis._unbind();\n\t\t},\n\n\t\t/**\n\t\t * @returns {Boolean} Returns whether the current panzoom instance is disabled\n\t\t */\n\t\tisDisabled: function() {\n\t\t\treturn this.disabled;\n\t\t},\n\n\t\t/**\n\t\t * Destroy the panzoom instance\n\t\t */\n\t\tdestroy: function() {\n\t\t\tthis.disable();\n\t\t\t$.removeData(this.elem, datakey);\n\t\t},\n\n\t\t/**\n\t\t * Builds the restricing dimensions from the containment element\n\t\t * Also used with focal points\n\t\t * Call this method whenever the dimensions of the element or parent are changed\n\t\t */\n\t\tresetDimensions: function() {\n\t\t\t// Reset container properties\n\t\t\tthis.container = this.parent.getBoundingClientRect();\n\n\t\t\t// Set element properties\n\t\t\tvar elem = this.elem;\n\t\t\t// getBoundingClientRect() works with SVG, offsetWidth does not\n\t\t\tvar dims = elem.getBoundingClientRect();\n\t\t\tvar absScale = Math.abs(this.scale);\n\t\t\tthis.dimensions = {\n\t\t\t\twidth: dims.width,\n\t\t\t\theight: dims.height,\n\t\t\t\tleft: $.css(elem, 'left', true) || 0,\n\t\t\t\ttop: $.css(elem, 'top', true) || 0,\n\t\t\t\t// Borders and margins are scaled\n\t\t\t\tborder: {\n\t\t\t\t\ttop: $.css(elem, 'borderTopWidth', true) * absScale || 0,\n\t\t\t\t\tbottom: $.css(elem, 'borderBottomWidth', true) * absScale || 0,\n\t\t\t\t\tleft: $.css(elem, 'borderLeftWidth', true) * absScale || 0,\n\t\t\t\t\tright: $.css(elem, 'borderRightWidth', true) * absScale || 0\n\t\t\t\t},\n\t\t\t\tmargin: {\n\t\t\t\t\ttop: $.css(elem, 'marginTop', true) * absScale || 0,\n\t\t\t\t\tleft: $.css(elem, 'marginLeft', true) * absScale || 0\n\t\t\t\t}\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Return the element to it's original transform matrix\n\t\t * @param {Boolean} [options] If a boolean is passed, animate the reset (default: true). If an options object is passed, simply pass that along to setMatrix.\n\t\t * @param {Boolean} [options.silent] Silence the reset event\n\t\t */\n\t\treset: function(options) {\n\t\t\toptions = createResetOptions(options);\n\t\t\t// Reset the transform to its original value\n\t\t\tvar matrix = this.setMatrix(this._origTransform, options);\n\t\t\tif (!options.silent) {\n\t\t\t\tthis._trigger('reset', matrix);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Only resets zoom level\n\t\t * @param {Boolean|Object} [options] Whether to animate the reset (default: true) or an object of options to pass to zoom()\n\t\t */\n\t\tresetZoom: function(options) {\n\t\t\toptions = createResetOptions(options);\n\t\t\tvar origMatrix = this.getMatrix(this._origTransform);\n\t\t\toptions.dValue = origMatrix[ 3 ];\n\t\t\tthis.zoom(origMatrix[0], options);\n\t\t},\n\n\t\t/**\n\t\t * Only reset panning\n\t\t * @param {Boolean|Object} [options] Whether to animate the reset (default: true) or an object of options to pass to pan()\n\t\t */\n\t\tresetPan: function(options) {\n\t\t\tvar origMatrix = this.getMatrix(this._origTransform);\n\t\t\tthis.pan(origMatrix[4], origMatrix[5], createResetOptions(options));\n\t\t},\n\n\t\t/**\n\t\t * Sets a transform on the $set\n\t\t * For SVG, the style attribute takes precedence\n\t\t * and allows us to animate\n\t\t * @param {String} transform\n\t\t */\n\t\tsetTransform: function(transform) {\n\t\t\tvar $set = this.$set;\n\t\t\tvar i = $set.length;\n\t\t\twhile(i--) {\n\t\t\t\t$.style($set[i], 'transform', transform);\n\n\t\t\t\t// Support IE9-11, Edge 13-14+\n\t\t\t\t// Set attribute alongside style attribute\n\t\t\t\t// since IE and Edge do not respect style settings on SVG\n\t\t\t\t// See https://css-tricks.com/transforms-on-svg-elements/\n\t\t\t\tif (this.isSVG) {\n\t\t\t\t\t$set[i].setAttribute('transform', transform);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Retrieving the transform is different for SVG\n\t\t * (unless a style transform is already present)\n\t\t * Uses the $set collection for retrieving the transform\n\t\t * @param {String} [transform] Pass in an transform value (like 'scale(1.1)')\n\t\t * to have it formatted into matrix format for use by Panzoom\n\t\t * @returns {String} Returns the current transform value of the element\n\t\t */\n\t\tgetTransform: function(transform) {\n\t\t\tvar $set = this.$set;\n\t\t\tvar transformElem = $set[0];\n\t\t\tif (transform) {\n\t\t\t\tthis.setTransform(transform);\n\t\t\t} else {\n\n\t\t\t\t// IE and Edge still set the transform style properly\n\t\t\t\t// They just don't render it on SVG\n\t\t\t\t// So we get a correct value here\n\t\t\t\ttransform = $.style(transformElem, 'transform');\n\n\t\t\t\tif (this.isSVG && (!transform || transform === 'none')) {\n\t\t\t\t\ttransform = $.attr(transformElem, 'transform') || 'none';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Convert any transforms set by the user to matrix format\n\t\t\t// by setting to computed\n\t\t\tif (transform !== 'none' && !rmatrix.test(transform)) {\n\n\t\t\t\t// Get computed and set for next time\n\t\t\t\tthis.setTransform(transform = $.css(transformElem, 'transform'));\n\t\t\t}\n\n\t\t\treturn transform || 'none';\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the current transform matrix for $elem (or turn a transform into it's array values)\n\t\t * @param {String} [transform] matrix-formatted transform value\n\t\t * @returns {Array} Returns the current transform matrix split up into it's parts, or a default matrix\n\t\t */\n\t\tgetMatrix: function(transform) {\n\t\t\tvar matrix = rmatrix.exec(transform || this.getTransform());\n\t\t\tif (matrix) {\n\t\t\t\tmatrix.shift();\n\t\t\t}\n\t\t\treturn matrix || [ 1, 0, 0, 1, 0, 0 ];\n\t\t},\n\n\t\t/**\n\t\t * Given a matrix object, quickly set the current matrix of the element\n\t\t * @param {Array|String} matrix\n\t\t * @param {Object} [options]\n\t\t * @param {Boolean|String} [options.animate] Whether to animate the transform change, or 'skip' indicating that it is unnecessary to set\n\t\t * @param {Boolean} [options.contain] Override the global contain option\n\t\t * @param {Boolean} [options.range] If true, $zoomRange's value will be updated.\n\t\t * @param {Boolean} [options.silent] If true, the change event will not be triggered\n\t\t * @returns {Array} Returns the newly-set matrix\n\t\t */\n\t\tsetMatrix: function(matrix, options) {\n\t\t\tif (this.disabled) { return; }\n\t\t\tif (!options) { options = {}; }\n\t\t\t// Convert to array\n\t\t\tif (typeof matrix === 'string') {\n\t\t\t\tmatrix = this.getMatrix(matrix);\n\t\t\t}\n\t\t\tvar scale = +matrix[0];\n\t\t\tvar contain = typeof options.contain !== 'undefined' ? options.contain : this.options.contain;\n\n\t\t\t// Apply containment\n\t\t\tif (contain) {\n\t\t\t\tvar dims = options.dims;\n\t\t\t\tif (!dims) {\n\t\t\t\t\tthis.resetDimensions();\n\t\t\t\t\tdims = this.dimensions;\n\t\t\t\t}\n\t\t\t\tvar spaceWLeft, spaceWRight, scaleDiff;\n\t\t\t\tvar container = this.container;\n\t\t\t\tvar width = dims.width;\n\t\t\t\tvar height = dims.height;\n\t\t\t\tvar conWidth = container.width;\n\t\t\t\tvar conHeight = container.height;\n\t\t\t\tvar zoomAspectW = conWidth / width;\n\t\t\t\tvar zoomAspectH = conHeight / height;\n\n\t\t\t\t// If the element is not naturally centered,\n\t\t\t\t// assume full space right\n\t\t\t\tif (this.$parent.css('textAlign') !== 'center' || $.css(this.elem, 'display') !== 'inline') {\n\t\t\t\t\t// offsetWidth gets us the width without the transform\n\t\t\t\t\tscaleDiff = (width - this.elem.offsetWidth) / 2;\n\t\t\t\t\tspaceWLeft = scaleDiff - dims.border.left;\n\t\t\t\t\tspaceWRight = width - conWidth - scaleDiff + dims.border.right;\n\t\t\t\t} else {\n\t\t\t\t\tspaceWLeft = spaceWRight = ((width - conWidth) / 2);\n\t\t\t\t}\n\t\t\t\tvar spaceHTop = ((height - conHeight) / 2) + dims.border.top;\n\t\t\t\tvar spaceHBottom = ((height - conHeight) / 2) - dims.border.top - dims.border.bottom;\n\n\t\t\t\tif (contain === 'invert' || contain === 'automatic' && zoomAspectW < 1.01) {\n\t\t\t\t\tmatrix[4] = Math.max(Math.min(matrix[4], spaceWLeft - dims.border.left), -spaceWRight);\n\t\t\t\t} else {\n\t\t\t\t\tmatrix[4] = Math.min(Math.max(matrix[4], spaceWLeft), -spaceWRight);\n\t\t\t\t}\n\n\t\t\t\tif (contain === 'invert' || (contain === 'automatic' && zoomAspectH < 1.01)) {\n\t\t\t\t\tmatrix[5] = Math.max(Math.min(matrix[5], spaceHTop - dims.border.top), -spaceHBottom);\n\t\t\t\t} else {\n\t\t\t\t\tmatrix[5] = Math.min(Math.max(matrix[5], spaceHTop), -spaceHBottom);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Animate\n\t\t\tif (options.animate !== 'skip') {\n\t\t\t\t// Set transition\n\t\t\t\tthis.transition(!options.animate);\n\t\t\t}\n\n\t\t\t// Update range element\n\t\t\tif (options.range) {\n\t\t\t\tthis.$zoomRange.val(scale);\n\t\t\t}\n\n\t\t\t// Set the matrix on this.$set\n\t\t\tif (this.options.disableXAxis || this.options.disableYAxis) {\n\t\t\t\tvar originalMatrix = this.getMatrix();\n\t\t\t\tif (this.options.disableXAxis) {\n\t\t\t\t\tmatrix[4] = originalMatrix[4];\n\t\t\t\t}\n\t\t\t\tif (this.options.disableYAxis) {\n\t\t\t\t\tmatrix[5] = originalMatrix[5];\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.setTransform('matrix(' + matrix.join(',') + ')');\n\n\t\t\tthis.scale = scale;\n\n\t\t\t// Disable/enable panning if zooming is at minimum and panOnlyWhenZoomed is true\n\t\t\tthis._checkPanWhenZoomed(scale);\n\n\t\t\tif (!options.silent) {\n\t\t\t\tthis._trigger('change', matrix);\n\t\t\t}\n\n\t\t\treturn matrix;\n\t\t},\n\n\t\t/**\n\t\t * @returns {Boolean} Returns whether the panzoom element is currently being dragged\n\t\t */\n\t\tisPanning: function() {\n\t\t\treturn this.panning;\n\t\t},\n\n\t\t/**\n\t\t * Apply the current transition to the element, if allowed\n\t\t * @param {Boolean} [off] Indicates that the transition should be turned off\n\t\t */\n\t\ttransition: function(off) {\n\t\t\tif (!this._transition) { return; }\n\t\t\tvar transition = off || !this.options.transition ? 'none' : this._transition;\n\t\t\tvar $set = this.$set;\n\t\t\tvar i = $set.length;\n\t\t\twhile(i--) {\n\t\t\t\t// Avoid reflows when zooming\n\t\t\t\tif ($.style($set[i], 'transition') !== transition) {\n\t\t\t\t\t$.style($set[i], 'transition', transition);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Pan the element to the specified translation X and Y\n\t\t * Note: this is not the same as setting jQuery#offset() or jQuery#position()\n\t\t * @param {Number} x\n\t\t * @param {Number} y\n\t\t * @param {Object} [options] These options are passed along to setMatrix\n\t\t * @param {Array} [options.matrix] The matrix being manipulated (if already known so it doesn't have to be retrieved again)\n\t\t * @param {Boolean} [options.silent] Silence the pan event. Note that this will also silence the setMatrix change event.\n\t\t * @param {Boolean} [options.relative] Make the x and y values relative to the existing matrix\n\t\t */\n\t\tpan: function(x, y, options) {\n\t\t\tif (this.options.disablePan) { return; }\n\t\t\tif (!options) { options = {}; }\n\t\t\tvar matrix = options.matrix;\n\t\t\tif (!matrix) {\n\t\t\t\tmatrix = this.getMatrix();\n\t\t\t}\n\t\t\t// Cast existing matrix values to numbers\n\t\t\tif (options.relative) {\n\t\t\t\tx += +matrix[4];\n\t\t\t\ty += +matrix[5];\n\t\t\t}\n\t\t\tmatrix[4] = x;\n\t\t\tmatrix[5] = y;\n\t\t\tthis.setMatrix(matrix, options);\n\t\t\tif (!options.silent) {\n\t\t\t\tthis._trigger('pan', matrix[4], matrix[5]);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Zoom in/out the element using the scale properties of a transform matrix\n\t\t * @param {Number|Boolean} [scale] The scale to which to zoom or a boolean indicating to transition a zoom out\n\t\t * @param {Object} [opts] All global options can be overwritten by this options object. For example, override the default increment.\n\t\t * @param {Boolean} [opts.noSetRange] Specify that the method should not set the $zoomRange value (as is the case when $zoomRange is calling zoom on change)\n\t\t * @param {jQuery.Event|Object} [opts.focal] A focal point on the panzoom element on which to zoom.\n\t\t * If an object, set the clientX and clientY properties to the position relative to the parent\n\t\t * @param {Boolean} [opts.animate] Whether to animate the zoom (defaults to true if scale is not a number, false otherwise)\n\t\t * @param {Boolean} [opts.silent] Silence the zoom event\n\t\t * @param {Array} [opts.matrix] Optionally pass the current matrix so it doesn't need to be retrieved\n\t\t * @param {Number} [opts.dValue] Think of a transform matrix as four values a, b, c, d\n\t\t * where a/d are the horizontal/vertical scale values and b/c are the skew values\n\t\t * (5 and 6 of matrix array are the tx/ty transform values).\n\t\t * Normally, the scale is set to both the a and d values of the matrix.\n\t\t * This option allows you to specify a different d value for the zoom.\n\t\t * For instance, to flip vertically, you could set -1 as the dValue.\n\t\t */\n\t\tzoom: function(scale, opts) {\n\t\t\t// Shuffle arguments\n\t\t\tif (typeof scale === 'object') {\n\t\t\t\topts = scale;\n\t\t\t\tscale = null;\n\t\t\t} else if (!opts) {\n\t\t\t\topts = {};\n\t\t\t}\n\t\t\tvar options = $.extend({}, this.options, opts);\n\t\t\t// Check if disabled\n\t\t\tif (options.disableZoom) { return; }\n\t\t\tvar animate = false;\n\t\t\tvar matrix = options.matrix || this.getMatrix();\n\t\t\tvar startScale = +matrix[0];\n\n\t\t\t// Calculate zoom based on increment\n\t\t\tif (typeof scale !== 'number') {\n\t\t\t\t// Just use a number a little greater than 1\n\t\t\t\t// Below 1 can use normal increments\n\t\t\t\tif (options.exponential && startScale - options.increment >= 1) {\n\t\t\t\t\tscale = Math[scale ? 'sqrt' : 'pow'](startScale, 2);\n\t\t\t\t} else {\n\t\t\t\t\tscale = startScale + (options.increment * (scale ? -1 : 1));\n\t\t\t\t}\n\t\t\t\tanimate = true;\n\t\t\t}\n\n\t\t\t// Constrain scale\n\t\t\tif (scale > options.maxScale) {\n\t\t\t\tscale = options.maxScale;\n\t\t\t} else if (scale < options.minScale) {\n\t\t\t\tscale = options.minScale;\n\t\t\t}\n\n\t\t\t// Calculate focal point based on scale\n\t\t\tvar focal = options.focal;\n\t\t\tif (focal && !options.disablePan) {\n\t\t\t\t// Adapted from code by Florian Günther\n\t\t\t\t// https://github.com/florianguenther/zui53\n\t\t\t\tthis.resetDimensions();\n\t\t\t\tvar dims = options.dims = this.dimensions;\n\t\t\t\tvar clientX = focal.clientX;\n\t\t\t\tvar clientY = focal.clientY;\n\n\t\t\t\t// Adjust the focal point for transform-origin 50% 50%\n\t\t\t\t// SVG elements have a transform origin of 0 0\n\t\t\t\tif (!this.isSVG) {\n\t\t\t\t\tclientX -= (dims.width / startScale) / 2;\n\t\t\t\t\tclientY -= (dims.height / startScale) / 2;\n\t\t\t\t}\n\n\t\t\t\tvar clientV = new Vector(clientX, clientY, 1);\n\t\t\t\tvar surfaceM = new Matrix(matrix);\n\t\t\t\t// Supply an offset manually if necessary\n\t\t\t\tvar o = this.parentOffset || this.$parent.offset();\n\t\t\t\tvar offsetM = new Matrix(1, 0, o.left - this.$doc.scrollLeft(), 0, 1, o.top - this.$doc.scrollTop());\n\t\t\t\tvar surfaceV = surfaceM.inverse().x(offsetM.inverse().x(clientV));\n\t\t\t\tvar scaleBy = scale / matrix[0];\n\t\t\t\tsurfaceM = surfaceM.x(new Matrix([scaleBy, 0, 0, scaleBy, 0, 0]));\n\t\t\t\tclientV = offsetM.x(surfaceM.x(surfaceV));\n\t\t\t\tmatrix[4] = +matrix[4] + (clientX - clientV.e(0));\n\t\t\t\tmatrix[5] = +matrix[5] + (clientY - clientV.e(1));\n\t\t\t}\n\n\t\t\t// Set the scale\n\t\t\tmatrix[0] = scale;\n\t\t\tmatrix[3] = typeof options.dValue === 'number' ? options.dValue : scale;\n\n\t\t\t// Calling zoom may still pan the element\n\t\t\tthis.setMatrix(matrix, {\n\t\t\t\tanimate: typeof options.animate !== 'undefined' ? options.animate : animate,\n\t\t\t\t// Set the zoomRange value\n\t\t\t\trange: !options.noSetRange\n\t\t\t});\n\n\t\t\t// Trigger zoom event\n\t\t\tif (!options.silent) {\n\t\t\t\tthis._trigger('zoom', matrix[0], options);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Get/set option on an existing instance\n\t\t * @returns {Array|undefined} If getting, returns an array of all values\n\t\t * on each instance for a given key. If setting, continue chaining by returning undefined.\n\t\t */\n\t\toption: function(key, value) {\n\t\t\tvar options;\n\t\t\tif (!key) {\n\t\t\t\t// Avoids returning direct reference\n\t\t\t\treturn $.extend({}, this.options);\n\t\t\t}\n\n\t\t\tif (typeof key === 'string') {\n\t\t\t\tif (arguments.length === 1) {\n\t\t\t\t\treturn this.options[ key ] !== undefined ?\n\t\t\t\t\t\tthis.options[ key ] :\n\t\t\t\t\t\tnull;\n\t\t\t\t}\n\t\t\t\toptions = {};\n\t\t\t\toptions[ key ] = value;\n\t\t\t} else {\n\t\t\t\toptions = key;\n\t\t\t}\n\n\t\t\tthis._setOptions(options);\n\t\t},\n\n\t\t/**\n\t\t * Internally sets options\n\t\t * @param {Object} options - An object literal of options to set\n\t\t * @private\n\t\t */\n\t\t_setOptions: function(options) {\n\t\t\t$.each(options, $.proxy(function(key, value) {\n\t\t\t\tswitch(key) {\n\t\t\t\t\tcase 'disablePan':\n\t\t\t\t\t\tthis._resetStyle();\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tcase '$zoomIn':\n\t\t\t\t\tcase '$zoomOut':\n\t\t\t\t\tcase '$zoomRange':\n\t\t\t\t\tcase '$reset':\n\t\t\t\t\tcase 'disableZoom':\n\t\t\t\t\tcase 'onStart':\n\t\t\t\t\tcase 'onChange':\n\t\t\t\t\tcase 'onZoom':\n\t\t\t\t\tcase 'onPan':\n\t\t\t\t\tcase 'onEnd':\n\t\t\t\t\tcase 'onReset':\n\t\t\t\t\tcase 'eventNamespace':\n\t\t\t\t\t\tthis._unbind();\n\t\t\t\t}\n\t\t\t\tthis.options[ key ] = value;\n\t\t\t\tswitch(key) {\n\t\t\t\t\tcase 'disablePan':\n\t\t\t\t\t\tthis._initStyle();\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tcase '$zoomIn':\n\t\t\t\t\tcase '$zoomOut':\n\t\t\t\t\tcase '$zoomRange':\n\t\t\t\t\tcase '$reset':\n\t\t\t\t\t\t// Set these on the instance\n\t\t\t\t\t\tthis[ key ] = value;\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tcase 'disableZoom':\n\t\t\t\t\tcase 'onStart':\n\t\t\t\t\tcase 'onChange':\n\t\t\t\t\tcase 'onZoom':\n\t\t\t\t\tcase 'onPan':\n\t\t\t\t\tcase 'onEnd':\n\t\t\t\t\tcase 'onReset':\n\t\t\t\t\tcase 'eventNamespace':\n\t\t\t\t\t\tthis._bind();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cursor':\n\t\t\t\t\t\t$.style(this.elem, 'cursor', value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'minScale':\n\t\t\t\t\t\tthis.$zoomRange.attr('min', value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'maxScale':\n\t\t\t\t\t\tthis.$zoomRange.attr('max', value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'rangeStep':\n\t\t\t\t\t\tthis.$zoomRange.attr('step', value);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'startTransform':\n\t\t\t\t\t\tthis._buildTransform();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'duration':\n\t\t\t\t\tcase 'easing':\n\t\t\t\t\t\tthis._buildTransition();\n\t\t\t\t\t\t/* falls through */\n\t\t\t\t\tcase 'transition':\n\t\t\t\t\t\tthis.transition();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'panOnlyWhenZoomed':\n\t\t\t\t\t\tthis._checkPanWhenZoomed();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase '$set':\n\t\t\t\t\t\tif (value instanceof $ && value.length) {\n\t\t\t\t\t\t\tthis.$set = value;\n\t\t\t\t\t\t\t// Reset styles\n\t\t\t\t\t\t\tthis._initStyle();\n\t\t\t\t\t\t\tthis._buildTransform();\n\t\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}, this));\n\t\t},\n\n\t\t/**\n\t\t * Disable/enable panning depending on whether the current scale\n\t\t * matches the minimum\n\t\t * @param {Number} [scale]\n\t\t * @private\n\t\t */\n\t\t_checkPanWhenZoomed: function(scale) {\n\t\t\tvar options = this.options;\n\t\t\tif (options.panOnlyWhenZoomed) {\n\t\t\t\tif (!scale) {\n\t\t\t\t\tscale = this.getMatrix()[0];\n\t\t\t\t}\n\t\t\t\tvar toDisable = scale <= options.minScale;\n\t\t\t\tif (options.disablePan !== toDisable) {\n\t\t\t\t\tthis.option('disablePan', toDisable);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Initialize base styles for the element and its parent\n\t\t * @private\n\t\t */\n\t\t_initStyle: function() {\n\t\t\tvar styles = {\n\t\t\t\t// Set the same default whether SVG or HTML\n\t\t\t\t// transform-origin cannot be changed to 50% 50% in IE9-11 or Edge 13-14+\n\t\t\t\t'transform-origin': this.isSVG ? '0 0' : '50% 50%'\n\t\t\t};\n\t\t\t// Set elem styles\n\t\t\tif (!this.options.disablePan) {\n\t\t\t\tstyles.cursor = this.options.cursor;\n\t\t\t}\n\t\t\tthis.$set.css(styles);\n\n\t\t\t// Set parent to relative if set to static\n\t\t\tvar $parent = this.$parent;\n\t\t\t// No need to add styles to the body\n\t\t\tif ($parent.length && !$.nodeName(this.parent, 'body')) {\n\t\t\t\tstyles = {\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t};\n\t\t\t\tif ($parent.css('position') === 'static') {\n\t\t\t\t\tstyles.position = 'relative';\n\t\t\t\t}\n\t\t\t\t$parent.css(styles);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Undo any styles attached in this plugin\n\t\t * @private\n\t\t */\n\t\t_resetStyle: function() {\n\t\t\tthis.$elem.css({\n\t\t\t\t'cursor': '',\n\t\t\t\t'transition': ''\n\t\t\t});\n\t\t\tthis.$parent.css({\n\t\t\t\t'overflow': '',\n\t\t\t\t'position': ''\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Binds all necessary events\n\t\t * @private\n\t\t */\n\t\t_bind: function() {\n\t\t\tvar self = this;\n\t\t\tvar options = this.options;\n\t\t\tvar ns = options.eventNamespace;\n\t\t\tvar str_down = 'mousedown' + ns + ' pointerdown' + ns + ' MSPointerDown' + ns;\n\t\t\tvar str_start = 'touchstart' + ns + ' ' + str_down;\n\t\t\tvar str_click = 'touchend' + ns + ' click' + ns + ' pointerup' + ns + ' MSPointerUp' + ns;\n\t\t\tvar events = {};\n\t\t\tvar $reset = this.$reset;\n\t\t\tvar $zoomRange = this.$zoomRange;\n\n\t\t\t// Bind panzoom events from options\n\t\t\t$.each([ 'Start', 'Change', 'Zoom', 'Pan', 'End', 'Reset' ], function() {\n\t\t\t\tvar m = options[ 'on' + this ];\n\t\t\t\tif ($.isFunction(m)) {\n\t\t\t\t\tevents[ 'panzoom' + this.toLowerCase() + ns ] = m;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Bind $elem drag and click/touchdown events\n\t\t\t// Bind touchstart if either panning or zooming is enabled\n\t\t\tif (!options.disablePan || !options.disableZoom) {\n\t\t\t\tevents[ str_start ] = function(e) {\n\t\t\t\t\tvar touches;\n\t\t\t\t\tif (e.type === 'touchstart' ?\n\t\t\t\t\t\t// Touch\n\t\t\t\t\t\t(touches = e.touches || e.originalEvent.touches) &&\n\t\t\t\t\t\t\t((touches.length === 1 && !options.disablePan) || touches.length === 2) :\n\t\t\t\t\t\t// Mouse/Pointer: Ignore unexpected click types\n\t\t\t\t\t\t// Support: IE10 only\n\t\t\t\t\t\t// IE10 does not support e.button for MSPointerDown, but does have e.which\n\t\t\t\t\t\t!options.disablePan && (e.which || e.originalEvent.which) === options.which) {\n\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\te.stopPropagation();\n\t\t\t\t\t\tself._startMove(e, touches);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\t// Prevent the contextmenu event\n\t\t\t\t// if we're binding to right-click\n\t\t\t\tif (options.which === 3) {\n\t\t\t\t\tevents.contextmenu = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.$elem.on(events);\n\n\t\t\t// Bind reset\n\t\t\tif ($reset.length) {\n\t\t\t\t$reset.on(str_click, function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tself.reset();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Set default attributes for the range input\n\t\t\tif ($zoomRange.length) {\n\t\t\t\t$zoomRange.attr({\n\t\t\t\t\t// Only set the range step if explicit or\n\t\t\t\t\t// set the default if there is no attribute present\n\t\t\t\t\tstep: options.rangeStep === Panzoom.defaults.rangeStep &&\n\t\t\t\t\t\t$zoomRange.attr('step') ||\n\t\t\t\t\t\toptions.rangeStep,\n\t\t\t\t\tmin: options.minScale,\n\t\t\t\t\tmax: options.maxScale\n\t\t\t\t}).prop({\n\t\t\t\t\tvalue: this.getMatrix()[0]\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// No bindings if zooming is disabled\n\t\t\tif (options.disableZoom) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar $zoomIn = this.$zoomIn;\n\t\t\tvar $zoomOut = this.$zoomOut;\n\n\t\t\t// Bind zoom in/out\n\t\t\t// Don't bind one without the other\n\t\t\tif ($zoomIn.length && $zoomOut.length) {\n\t\t\t\t// preventDefault cancels future mouse events on touch events\n\t\t\t\t$zoomIn.on(str_click, function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tself.zoom();\n\t\t\t\t});\n\t\t\t\t$zoomOut.on(str_click, function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tself.zoom(true);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ($zoomRange.length) {\n\t\t\t\tevents = {};\n\t\t\t\t// Cannot prevent default action here\n\t\t\t\tevents[ str_down ] = function() {\n\t\t\t\t\tself.transition(true);\n\t\t\t\t};\n\t\t\t\t// Zoom on input events if available and change events\n\t\t\t\t// See https://github.com/timmywil/jquery.panzoom/issues/90\n\t\t\t\tevents[ (supportsInputEvent ? 'input' : 'change') + ns ] = function() {\n\t\t\t\t\tself.zoom(+this.value, { noSetRange: true });\n\t\t\t\t};\n\t\t\t\t$zoomRange.on(events);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Unbind all events\n\t\t * @private\n\t\t */\n\t\t_unbind: function() {\n\t\t\tthis.$elem\n\t\t\t\t.add(this.$zoomIn)\n\t\t\t\t.add(this.$zoomOut)\n\t\t\t\t.add(this.$reset)\n\t\t\t\t.off(this.options.eventNamespace);\n\t\t},\n\n\t\t/**\n\t\t * Builds the original transform value\n\t\t * @private\n\t\t */\n\t\t_buildTransform: function() {\n\t\t\t// Save the original transform\n\t\t\t// Retrieving this also adds the correct prefixed style name\n\t\t\t// to jQuery's internal $.cssProps\n\t\t\treturn this._origTransform = this.getTransform(this.options.startTransform);\n\t\t},\n\n\t\t/**\n\t\t * Set transition property for later use when zooming\n\t\t * @private\n\t\t */\n\t\t_buildTransition: function() {\n\t\t\tif (this._transform) {\n\t\t\t\tvar options = this.options;\n\t\t\t\tthis._transition = this._transform + ' ' + options.duration + 'ms ' + options.easing;\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Calculates the distance between two touch points\n\t\t * Remember pythagorean?\n\t\t * @param {Array} touches\n\t\t * @returns {Number} Returns the distance\n\t\t * @private\n\t\t */\n\t\t_getDistance: function(touches) {\n\t\t\tvar touch1 = touches[0];\n\t\t\tvar touch2 = touches[1];\n\t\t\treturn Math.sqrt(Math.pow(Math.abs(touch2.clientX - touch1.clientX), 2) + Math.pow(Math.abs(touch2.clientY - touch1.clientY), 2));\n\t\t},\n\n\t\t/**\n\t\t * Constructs an approximated point in the middle of two touch points\n\t\t * @returns {Object} Returns an object containing pageX and pageY\n\t\t * @private\n\t\t */\n\t\t_getMiddle: function(touches) {\n\t\t\tvar touch1 = touches[0];\n\t\t\tvar touch2 = touches[1];\n\t\t\treturn {\n\t\t\t\tclientX: ((touch2.clientX - touch1.clientX) / 2) + touch1.clientX,\n\t\t\t\tclientY: ((touch2.clientY - touch1.clientY) / 2) + touch1.clientY\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Trigger a panzoom event on our element\n\t\t * The event is passed the Panzoom instance\n\t\t * @param {String|jQuery.Event} event\n\t\t * @param {Mixed} arg1[, arg2, arg3, ...] Arguments to append to the trigger\n\t\t * @private\n\t\t */\n\t\t_trigger: function (event) {\n\t\t\tif (typeof event === 'string') {\n\t\t\t\tevent = 'panzoom' + event;\n\t\t\t}\n\t\t\tthis.$elem.triggerHandler(event, [this].concat(slice.call(arguments, 1)));\n\t\t},\n\n\t\t/**\n\t\t * Starts the pan\n\t\t * This is bound to mouse/touchmove on the element\n\t\t * @param {jQuery.Event} event An event with pageX, pageY, and possibly the touches list\n\t\t * @param {TouchList} [touches] The touches list if present\n\t\t * @private\n\t\t */\n\t\t_startMove: function(event, touches) {\n\t\t\tif (this.panning) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar moveEvent, endEvent,\n\t\t\t\tstartDistance, startScale, startMiddle,\n\t\t\t\tstartPageX, startPageY, touch;\n\t\t\tvar self = this;\n\t\t\tvar options = this.options;\n\t\t\tvar ns = options.eventNamespace;\n\t\t\tvar matrix = this.getMatrix();\n\t\t\tvar original = matrix.slice(0);\n\t\t\tvar origPageX = +original[4];\n\t\t\tvar origPageY = +original[5];\n\t\t\tvar panOptions = { matrix: matrix, animate: 'skip' };\n\t\t\tvar type = event.type;\n\n\t\t\t// Use proper events\n\t\t\tif (type === 'pointerdown') {\n\t\t\t\tmoveEvent = 'pointermove';\n\t\t\t\tendEvent = 'pointerup';\n\t\t\t} else if (type === 'touchstart') {\n\t\t\t\tmoveEvent = 'touchmove';\n\t\t\t\tendEvent = 'touchend';\n\t\t\t} else if (type === 'MSPointerDown') {\n\t\t\t\tmoveEvent = 'MSPointerMove';\n\t\t\t\tendEvent = 'MSPointerUp';\n\t\t\t} else {\n\t\t\t\tmoveEvent = 'mousemove';\n\t\t\t\tendEvent = 'mouseup';\n\t\t\t}\n\n\t\t\t// Add namespace\n\t\t\tmoveEvent += ns;\n\t\t\tendEvent += ns;\n\n\t\t\t// Remove any transitions happening\n\t\t\tthis.transition(true);\n\n\t\t\t// BAUER EDIT - PAR-2784 - Comment this line to fix pan/zoom on Android Chrome 55\n\t\t\t// See: https://github.com/timmywil/jquery.panzoom/issues/303#issuecomment-267853623\n\t\t\t// Indicate that we are currently panning\n\t\t\t//this.panning = true;\n\n\t\t\t// Trigger start event\n\t\t\tthis._trigger('start', event, touches);\n\n\t\t\tvar setStart = function(event, touches) {\n\t\t\t\tif (touches) {\n\t\t\t\t\tif (touches.length === 2) {\n\t\t\t\t\t\tif (startDistance != null) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstartDistance = self._getDistance(touches);\n\t\t\t\t\t\tstartScale = +matrix[0];\n\t\t\t\t\t\tstartMiddle = self._getMiddle(touches);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (startPageX != null) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif ((touch = touches[0])) {\n\t\t\t\t\t\tstartPageX = touch.pageX;\n\t\t\t\t\t\tstartPageY = touch.pageY;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (startPageX != null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tstartPageX = event.pageX;\n\t\t\t\tstartPageY = event.pageY;\n\t\t\t};\n\n\t\t\tsetStart(event, touches);\n\n\t\t\tvar move = function(e) {\n\t\t\t\tvar coords;\n\t\t\t\te.preventDefault();\n\t\t\t\ttouches = e.touches || e.originalEvent.touches;\n\t\t\t\tsetStart(e, touches);\n\n\t\t\t\tif (touches) {\n\t\t\t\t\tif (touches.length === 2) {\n\n\t\t\t\t\t\t// Calculate move on middle point\n\t\t\t\t\t\tvar middle = self._getMiddle(touches);\n\t\t\t\t\t\tvar diff = self._getDistance(touches) - startDistance;\n\n\t\t\t\t\t\t// Set zoom\n\t\t\t\t\t\tself.zoom(diff * (options.increment / 100) + startScale, {\n\t\t\t\t\t\t\tfocal: middle,\n\t\t\t\t\t\t\tmatrix: matrix,\n\t\t\t\t\t\t\tanimate: 'skip'\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// Set pan\n\t\t\t\t\t\tself.pan(\n\t\t\t\t\t\t\t+matrix[4] + middle.clientX - startMiddle.clientX,\n\t\t\t\t\t\t\t+matrix[5] + middle.clientY - startMiddle.clientY,\n\t\t\t\t\t\t\tpanOptions\n\t\t\t\t\t\t);\n\t\t\t\t\t\tstartMiddle = middle;\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcoords = touches[0] || { pageX: 0, pageY: 0 };\n\t\t\t\t}\n\n\t\t\t\tif (!coords) {\n\t\t\t\t\tcoords = e;\n\t\t\t\t}\n\n\t\t\t\tself.pan(\n\t\t\t\t\torigPageX + coords.pageX - startPageX,\n\t\t\t\t\torigPageY + coords.pageY - startPageY,\n\t\t\t\t\tpanOptions\n\t\t\t\t);\n\t\t\t};\n\n\t\t\t// Bind the handlers\n\t\t\t$(document)\n\t\t\t\t.off(ns)\n\t\t\t\t.on(moveEvent, move)\n\t\t\t\t.on(endEvent, function(e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\t// Unbind all document events\n\t\t\t\t\t$(this).off(ns);\n\t\t\t\t\tself.panning = false;\n\t\t\t\t\t// Trigger our end event\n\t\t\t\t\t// Simply set the type to \"panzoomend\" to pass through all end properties\n\t\t\t\t\t// jQuery's `not` is used here to compare Array equality\n\t\t\t\t\te.type = 'panzoomend';\n\t\t\t\t\tself._trigger(e, matrix, !matrixEquals(matrix, original));\n\t\t\t\t});\n\t\t}\n\t};\n\n\t// Add Panzoom as a static property\n\t$.Panzoom = Panzoom;\n\n\t/**\n\t * Extend jQuery\n\t * @param {Object|String} options - The name of a method to call on the prototype\n\t * or an object literal of options\n\t * @returns {jQuery|Mixed} jQuery instance for regular chaining or the return value(s) of a panzoom method call\n\t */\n\t$.fn.panzoom = function(options) {\n\t\tvar instance, args, m, ret;\n\n\t\t// Call methods widget-style\n\t\tif (typeof options === 'string') {\n\t\t\tret = [];\n\t\t\targs = slice.call(arguments, 1);\n\t\t\tthis.each(function() {\n\t\t\t\tinstance = $.data(this, datakey);\n\n\t\t\t\tif (!instance) {\n\t\t\t\t\tret.push(undefined);\n\n\t\t\t\t// Ignore methods beginning with `_`\n\t\t\t\t} else if (options.charAt(0) !== '_' &&\n\t\t\t\t\ttypeof (m = instance[ options ]) === 'function' &&\n\t\t\t\t\t// If nothing is returned, do not add to return values\n\t\t\t\t\t(m = m.apply(instance, args)) !== undefined) {\n\n\t\t\t\t\tret.push(m);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// Return an array of values for the jQuery instances\n\t\t\t// Or the value itself if there is only one\n\t\t\t// Or keep chaining\n\t\t\treturn ret.length ?\n\t\t\t\t(ret.length === 1 ? ret[0] : ret) :\n\t\t\t\tthis;\n\t\t}\n\n\t\treturn this.each(function() { new Panzoom(this, options); });\n\t};\n\n\treturn Panzoom;\n}));\n","'use strict';\n\nvar baseApi = require('./base-api.js');\n\nvar endpoints = {\n\townerReviewSubmit: 'cars/submit',\n\tforSale: 'for-sale'\n};\n\nfunction getApiUrl(type, url) {\n\n\tif (type) {\n\t\turl += '/' + type;\n\t}\n\n\treturn url;\n}\n\nmodule.exports = {\n\tsubmitOwnerReview: function(data, options) {\n\t\tvar url = getApiUrl('owner-review', endpoints.ownerReviewSubmit);\n\t\tbaseApi.post(url, data, options);\n\t},\n\n\tsubmitDealerContact: function(data, options) {\n\t\tvar url = getApiUrl('contact-dealer', endpoints.forSale);\n\t\tbaseApi.post(url, data, options);\n\t}\n};","'use strict';\n\nvar $ = require('jquery');\nvar submitApi = require('../api/submit-api.js');\nvar logger = require('../utils/logger.js');\nvar analytics = require('../utils/analytics.js');\n\nvar classNames = {\n\talertBox: 'alert-box',\n\tcontactDealer: 'contact-dealer',\n\trequestForm: 'request-form',\n\trequestFormValidationSummary: 'request-form__validation-summary',\n\tsubmitError: 'submit-error',\n\tsubmitSuccess: 'submit-success',\n\tsubmitButton: 'submit-button',\n\taskDealerAQuestionShowFormTrigger: 'ask-dealer-a-question-form-trigger',\n\taskDealerAQuestionMessageTemplate: 'ask-dealer-a-question-message-template',\n\tcontactDealerShowFormTrigger: 'show-contact-dealer-form-trigger',\n\tcontactDealerMessageTemplate: 'contact-dealer-message-template',\n\temailDealer: 'email-dealer',\n\temailDealerTemplate: 'email-dealer-template',\n\trequestPhotos: 'request-photos',\n\trequestPhotosTemplate: 'request-photos-template',\n\trequestPhotosFromGalleryShowFormTrigger: 'show-request-photos-from-gallery-form-trigger',\n\trequestPhotosFromGalleryMessageTemplate: 'request-photos-from-gallery-template',\n\tclose: 'close'\n};\n\nvar trackingCategory = {\n\tdefaultEmailDealer: 'Email Dealer',\n\tdefaultRequestPhotos: 'Request Photos',\n\tdefaultAskDealerQuestion: 'Ask Dealer Question'\n};\n\nvar trackingAction = {\n\tsuccessMessage: 'Submit Message',\n\tsuccessMessageGallery: 'Submit Message (from gallery)',\n\tfailMessage: 'Message Send Fail',\n\tfailMessageGallery: 'Message Send Fail (from gallery)'\n};\n\nvar trackingData = {\n\temailDealer: {\n\t\tcategory: trackingCategory.defaultEmailDealer,\n\t\tactionSuccess: trackingAction.successMessage,\n\t\tactionFail: trackingAction.failMessage\n\t},\n\temailDealerGallery: {\n\t\tcategory: trackingCategory.defaultEmailDealer,\n\t\tactionSuccess: trackingAction.successMessageGallery,\n\t\tactionFail: trackingAction.failMessageGallery\n\t},\n\trequestPhotos: {\n\t\tcategory: trackingCategory.defaultRequestPhotos,\n\t\tactionSuccess: trackingAction.successMessage,\n\t\tactionFail: trackingAction.failMessage\n\t},\n\trequestPhotosGallery: {\n\t\tcategory: trackingCategory.defaultRequestPhotos,\n\t\tactionSuccess: trackingAction.successMessageGallery,\n\t\tactionFail: trackingAction.failMessageGallery\n\t},\n\taskDealerQuestion: {\n\t\tcategory: trackingCategory.defaultAskDealerQuestion,\n\t\tactionSuccess: trackingAction.successMessage,\n\t\tactionFail: trackingAction.failMessage\n\t},\n};\n\nvar $modal;\nvar $form;\nvar $formMessageInput;\nvar $formMessageType;\n\nvar tracking = {\n\tgetData: function () {\n\t\tvar $submitMessageButton = $.findByBem(classNames.contactDealer, classNames.submitButton);\n\n\t\t// clear jQuery's internal cache before fetching the data value.\n\t\t$($submitMessageButton).removeData('ga');\n\t\treturn $($submitMessageButton).data('ga');\n\t},\n\n\ttrackEvent: function (messageSent) {\n\t\tvar trackingData = tracking.getData();\n\n\t\tif (!trackingData) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar eventAction = messageSent ? trackingData.actionSuccess : trackingData.actionFail;\n\t\tanalytics.trackEvent(trackingData.category, eventAction, trackingData.stockId);\n\t}\n};\n\nvar contactForm = {\n\tinit: function () {\n\t\t$modal = $('#contactDealerModal');\n\n\t\t$form = $.findByBem(classNames.contactDealer, classNames.requestForm);\n\t\tif ($form.length === 0) {\n\t\t\tlogger.error('CFS: Contact dealer form could not be initialised');\n\t\t\t$modal.foundation('reveal', 'close');\n\t\t\treturn;\n\t\t}\n\n\t\t$formMessageInput = $form.find('textarea[name=\"message\"]');\n\t\t$formMessageType = $form.find('input[name=\"messageType\"]');\n\n\t\tcontactForm.setLayout();\n\t\tcontactForm.setControls();\n\t},\n\n\tsetLayout: function () {\n\t\t$.findByBem(classNames.contactDealer, classNames.submitError).hide();\n\t\t$.findByBem(classNames.contactDealer, classNames.submitSuccess).hide();\n\t},\n\n\tsend: function () {\n\t\tvar disabledClass = $.getBemClass(classNames.contactDealer, classNames.submitButton, 'submitting');\n\t\t$.findByBem(classNames.contactDealer, classNames.submitButton).disable(disabledClass);\n\n\t\tsubmitApi.submitDealerContact($form.serialize(), {\n\t\t\tsuccessCallback: function () {\n\t\t\t\t$($form).slideUp();\n\t\t\t\t$.findByBem(classNames.contactDealer, classNames.submitSuccess).show();\n\n\t\t\t\tvar messageSent = true;\n\t\t\t\ttracking.trackEvent(messageSent);\n\t\t\t},\n\t\t\terrorCallback: function () {\n\t\t\t\t$.findByBem(classNames.contactDealer, classNames.submitError).show();\n\n\t\t\t\tvar messageSent = false;\n\t\t\t\ttracking.trackEvent(messageSent);\n\t\t\t},\n\t\t\tcompleteCallback: function () {\n\t\t\t\t$.findByBem(classNames.contactDealer, classNames.submitButton).enable(disabledClass);\n\t\t\t}\n\t\t});\n\t},\n\n\tsetControls: function () {\n\t\tvar self = this;\n\n\t\tfunction setShowFormTriggerHandler(showFormTriggerClassNames, messageTemplateClassNames, trackingData) {\n\t\t\tvar $trigger = $.findByBem.apply(null, showFormTriggerClassNames);\n\n\t\t\t$trigger.on('click', function (e) {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tvar $messageTemplate = $.findByBem.apply(null, messageTemplateClassNames);\n\t\t\t\tif ($messageTemplate.length === 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar messageTemplate = $messageTemplate.text().trim();\n\t\t\t\t$formMessageInput.val(messageTemplate);\n\n\t\t\t\tvar messageType = $messageTemplate.data('message-type');\n\t\t\t\t$formMessageType.val(messageType);\n\n\t\t\t\tvar formTriggerElement = e.currentTarget;\n\t\t\t\tself.attachSubmitMessageTracking(formTriggerElement, trackingData);\n\n\t\t\t\t$modal.foundation('reveal', 'open');\n\t\t\t});\n\t\t}\n\n\t\t// reset the form when the modal opens.\n\t\t$(document).on('opened.fndtn.reveal', '#contactDealerModal[data-reveal]', function () {\n\t\t\tself.reset();\n\t\t});\n\n\t\t$.findByBem(classNames.contactDealer, classNames.submitButton).on('click', function () {\n\t\t\t$.findByBem(classNames.contactDealer, classNames.alertBox).hide();\n\t\t});\n\n\t\tsetShowFormTriggerHandler(\n\t\t\t[classNames.askDealerAQuestionShowFormTrigger],\n\t\t\t[classNames.contactDealer, classNames.askDealerAQuestionMessageTemplate],\n\t\t\ttrackingData.askDealerQuestion);\n\n\t\tsetShowFormTriggerHandler(\n\t\t\t[classNames.contactDealerShowFormTrigger],\n\t\t\t[classNames.contactDealer, classNames.contactDealerMessageTemplate],\n\t\t\ttrackingData.emailDealerGallery);\n\n\t\tsetShowFormTriggerHandler(\n\t\t\t[classNames.contactDealer, classNames.emailDealer],\n\t\t\t[classNames.contactDealer, classNames.emailDealerTemplate],\n\t\t\ttrackingData.emailDealer);\n\n\t\tsetShowFormTriggerHandler(\n\t\t\t[classNames.contactDealer, classNames.requestPhotos],\n\t\t\t[classNames.contactDealer, classNames.requestPhotosTemplate],\n\t\t\ttrackingData.requestPhotos);\n\n\t\tsetShowFormTriggerHandler(\n\t\t\t[classNames.requestPhotosFromGalleryShowFormTrigger],\n\t\t\t[classNames.contactDealer, classNames.requestPhotosFromGalleryMessageTemplate],\n\t\t\ttrackingData.requestPhotosGallery);\n\n\t\t$.findByBem(classNames.contactDealer, classNames.close).on('click', function () {\n\t\t\t$modal.foundation('reveal', 'close');\n\t\t});\n\t},\n\n\treset: function () {\n\t\t$form.find('input')\n\t\t\t.not(':button, :submit, :input[name=\"postcode\"], :input[type=\"hidden\"], textarea')\n\t\t\t.val('');\n\n\t\t$.findByBem(classNames.contactDealer, classNames.alertBox).hide();\n\n\t\tif ($($form).not(':visible')) {\n\t\t\t$($form).slideDown();\n\t\t}\n\t},\n\n\tattachSubmitMessageTracking: function(formTriggerElement, trackingData) {\n\t\tif (!formTriggerElement || !trackingData) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar $submitMessageButton = $.findByBem(classNames.contactDealer, classNames.submitButton);\n\n\t\t// Each of the buttons that triggers the submit message form has tracking data for other events.\n\t\t// The tracking categories from those are all relevant to this tracking.\n\t\t// Hence, we can retrieve and apply those categories here.\n\t\tvar gaTracking = $(formTriggerElement).data('ga-track');\n\n\t\tif (gaTracking) {\n\t\t\ttrackingData.category = gaTracking.category;\n\n\t\t\t// label contains car stock Id or VFS Id\n\t\t\ttrackingData.stockId = gaTracking.label;\n\t\t}\n\n\t\t$($submitMessageButton).attr('data-ga', JSON.stringify(trackingData));\n\t}\n};\n\nvar validation = {\n\tinit: function () {\n\t\tvalidation.addEmailValidator();\n\t\tvalidation.addPhoneValidator();\n\t\tvalidation.addPostcodeValidator();\n\n\t\tvar $validationSummary = $.findByBem(classNames.contactDealer, classNames.requestFormValidationSummary).hide();\n\n\t\t$form.validate({\n\t\t\trules: {\n\t\t\t\tfirstName: { required: true },\n\t\t\t\tlastName: { required: true },\n\t\t\t\temail: {\n\t\t\t\t\trequired: true,\n\t\t\t\t\temailValid: true\n\t\t\t\t},\n\t\t\t\tphoneNumber: {\n\t\t\t\t\trequired: false,\n\t\t\t\t\tphoneValid: true\n\t\t\t\t},\n\t\t\t\tpostcode: {\n\t\t\t\t\trequired: false,\n\t\t\t\t\tpostcodeValid: true\n\t\t\t\t}\n\t\t\t},\n\t\t\tmessages: {\n\t\t\t\tfirstName: 'First Name is required.',\n\t\t\t\tlastName: 'Last Name is required.',\n\t\t\t\temail: { required: 'Email is required.' }\n\t\t\t},\n\t\t\terrorPlacement: function (error, $element) {\n\t\t\t\terror.insertAfter($element);\n\t\t\t\terror.addClass('alert-box alert');\n\t\t\t\terror.addBemClass(classNames.ownerReviewForm, 'validation-error');\n\t\t\t},\n\t\t\tfocusInvalid: false,\n\t\t\tinvalidHandler: function () {\n\t\t\t\t$validationSummary.show();\n\t\t\t},\n\t\t\tsubmitHandler: function (form, event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\t$validationSummary.hide();\n\t\t\t\tcontactForm.send();\n\t\t\t}\n\t\t});\n\t},\n\n\taddPhoneValidator: function () {\n\t\t$.validator.addMethod('phoneValid', function (value) {\n\t\t\tif (value === '') {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn value.match(/^[\\d\\s]+$/);\n\t\t}, 'Please enter a valid phone number.');\n\t},\n\n\taddPostcodeValidator: function () {\n\t\t$.validator.addMethod('postcodeValid', function (value) {\n\t\t\tif (value === '') {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn value.match(/^((((([A-PR-UWYZ][0-9][0-9A-HJKS-UW]?)|([A-PR-UWYZ][A-HK-Y][0-9][0-9ABEHMNPRV-Y]?))\\s{0,1}[0-9]([ABD-HJLNP-UW-Z]{2}))|(GIR\\s{0,2}0AA)))$/i);\n\t\t}, 'Please enter a valid postcode.');\n\t},\n\n\taddEmailValidator: function () {\n\t\t$.validator.addMethod('emailValid', function (value) {\n\t\t\treturn value.match(/^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$/);\n\t\t}, 'Please enter a valid email address');\n\t},\n};\n\nmodule.exports = {\n\tinit: function () {\n\t\tcontactForm.init();\n\t\tvalidation.init();\n\t}\n};","'use strict';\n\nvar $ = require('jquery');\n\nvar advert = require('../adverts/advert.js');\nvar analytics = require('../utils/analytics.js');\nvar config = require('../utils/config.js');\nvar heightWatcher = require('../watchers/height-watcher.js');\nvar layout = require('../ui/layout.js');\nvar tagManager = require('../utils/tagManager.js');\nvar youtube = require('../utils/youtube.js');\nvar timer = require('../utils/timer.js');\n\nvar royalSlider = require('royalslider');\nrequire('jquery-panzoom');\nrequire('jquery-mousewheel');\n\nvar classNames = {\n\tfullScreenGallery: 'full-screen-gallery',\n\troyalSliderOverflow: 'rsOverflow',\n\tslider: 'slider',\n\ttopAd: 'top-ad'\n};\n\nvar modifiers = {\n\tvideoLoaded: 'video-loaded'\n};\n\nvar slider, $gallery, $galleryControls, galleryLoaded = false;\nvar placementHtml, mobileAdFrequency, mobileAdDuration, remainingMobileAdDuration, desktopAdViewedDuration, desktopAdTimeout;\nvar isMobileLayout = false;\nvar listenForIndexChange = true;\nvar isNavigationEnabled = true;\nvar showCaption = true;\nvar mobileAdDurationTimer;\nvar inactivityTimer;\nvar pageLocation;\n\nvar viewCount = 0;\nvar gaPageOverride = config.dataLayer.page.galleryGaLocation;\n\nfunction getSlider() {\n\treturn $.findByBem(classNames.fullScreenGallery, 'slider').data('royalSlider');\n}\n\nfunction toggleMobileTopAd() {\n\t// top (bottom) ad interferes with navigation controls in some mobile browsers\n\tif (layout.isMobile()) {\n\t\t$.findByBem(classNames.topAd).toggle();\n\t}\n}\n\nfunction mobileAdsEnabled() {\n\treturn placementHtml && mobileAdFrequency > 0;\n}\n\nfunction isImageSlide(id) {\n\tvar image = slider.slides[id].content.filter('.rsImg');\n\treturn image.length > 0;\n}\n\nfunction isVideoSlide(id) {\n\tvar video = slider.slides[id].content.filter('[data-gallery-video]');\n\treturn video.length > 0;\n}\n\nfunction getGalleryTemplateName() {\n\tvar galleryTemplate = 'CarGallery';\n\tif (window.location.pathname.startsWith('/vans-pickups/')) {\n\t\tgalleryTemplate = 'VanGallery';\n\t}\n\treturn galleryTemplate;\n}\n\nfunction logView(segment) {\n\tvar pageTemplateName = config.dataLayer.page.templateName;\n\tvar galleryTemplate = getGalleryTemplateName();\n\n\t// NOTE: this format of 'push' into the datalayer results in the\n\t// datalayer variable defined by the dot-notation-path being created/updated\n\ttagManager.pushToDataLayer({\n\t\t'page.templateName': galleryTemplate\n\t});\n\n\tanalytics.trackPageview(gaPageOverride + segment + '/');\n\n\t// Revert to the underlying page's template name in case\n\t// the value is required before a subsequent logView\n\ttagManager.pushToDataLayer({\n\t\t'page.templateName': pageTemplateName\n\t});\n\n\tanalytics.trackIpsosIrisPageView();\n}\n\nfunction logImageView(imageIndex) {\n\tvar action = pageLocation ? 'Image viewed - ' + pageLocation : 'Image viewed';\n\tanalytics.trackEvent('Full Screen Gallery', action, config.dataLayer.vehicle.modelName);\n\n\tvar imageNumber = imageIndex + 1;\n\tlogView(imageNumber);\n}\n\nfunction logVideoSlideView(slideIndex) {\n\tanalytics.trackEvent('Full Screen Gallery', 'Video slide viewed', config.dataLayer.vehicle.modelName);\n\n\tvar videoNumber = slideIndex + 1;\n\tlogView('video/' + videoNumber);\n}\n\nfunction logSlideView(slideIndex) {\n\tanalytics.trackEvent('Full Screen Gallery', 'Slide viewed', config.dataLayer.vehicle.modelName);\n\n\tvar $slideContent = slider.slides[slideIndex].content.filter('.rsContent');\n\tvar slideName = $slideContent.data('ga-slide-name') || 'content-slide';\n\n\tlogView(slideName);\n}\n\nfunction logViewByContentType(slideIndex) {\n\tif (isImageSlide(slideIndex)) {\n\t\tlogImageView(slideIndex);\n\t}\n\telse if (isVideoSlide(slideIndex)) {\n\t\tlogVideoSlideView(slideIndex);\n\t}\n\telse {\n\t\tlogSlideView(slideIndex);\n\t}\n}\n\nfunction logVideoPlay() {\n\tanalytics.trackEvent('Full Screen Gallery', 'Video played', config.dataLayer.vehicle.modelName);\n}\n\nfunction removeAdSlides(retainIndexId) {\n\tvar adSlides = $.grep(slider.slides, function (slide) {\n\t\tvar adContainer = slide.content.filter('.mpu-container');\n\t\treturn adContainer.length > 0;\n\t});\n\n\t$.each(adSlides, function (index) {\n\t\tif (!retainIndexId || adSlides[index].id !== retainIndexId) {\n\t\t\tslider.removeSlide(adSlides[index].id);\n\n\t\t\t// we've just removed a slide so the the retain index id needs to be\n\t\t\t// updated to keep in line\n\t\t\tif (retainIndexId) {\n\t\t\t\tretainIndexId--;\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction appendAdSlide() {\n\t$('.mpu-container', $gallery).each(function () {\n\t\t$(this).remove();\n\t});\n\n\tremoveAdSlides();\n\n\t// append slide so an ad appears if navigated to previous\n\tslider.appendSlide(placementHtml, slider.currSlideId === 0 ? slider.numSlides + 1 : slider.currSlideId);\n\n\t// append slide so an ad appears if navigated to next\n\tslider.appendSlide(placementHtml, slider.currSlideId + 1);\n}\n\nfunction slideContainsAd(id) {\n\tvar adContainer = slider.slides[id].content.filter('.mpu-container');\n\treturn adContainer.length > 0;\n}\n\nfunction currentSlideContainsAd() {\n\treturn slideContainsAd(slider.currSlideId);\n}\n\nfunction nextSlideContainsAd(direction) {\n\tvar previousSlideId = slider.currSlideId === 0 ? slider.numSlides - 1 : slider.currSlideId - 1;\n\tvar nextSlideId = slider.currSlideId + 1 === slider.numSlides ? 0 : slider.currSlideId + 1;\n\n\tif ((direction === \"prev\" && slideContainsAd(previousSlideId)) ||\n\t\t(direction === \"next\" && slideContainsAd(nextSlideId))) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction setTransitionSpeed(speed) {\n\tvar transitionSpeed = layout.isMobile() ? 300 : 600;\n\tslider.st.transitionSpeed = speed ? speed : transitionSpeed;\n}\n\nfunction updateCaption() {\n\tvar $caption = $.findByBem(classNames.fullScreenGallery, 'caption');\n\tvar caption = $('.rsGCaption').text().trim();\n\n\t$.findByBem(classNames.fullScreenGallery, 'caption__text').text(caption);\n\n\tif (showCaption) {\n\t\tif (!caption || currentSlideContainsAd()) {\n\t\t\t$caption.slideUp();\n\t\t}\n\t\telse if (caption && !currentSlideContainsAd() && !$caption.is(':visible')) {\n\t\t\t$caption.slideDown();\n\t\t}\n\t}\n}\n\nfunction disableNavigation() {\n\tslider.st.sliderDrag = false;\n\tslider.st.sliderTouch = false;\n\tisNavigationEnabled = false;\n\n\t$('.full-screen-gallery__slider').addClass('rsNoDrag');\n\t$('.full-screen-gallery__controls').slideUp();\n}\n\nfunction enableNavigation() {\n\tslider.st.sliderDrag = true;\n\tslider.st.sliderTouch = true;\n\tisNavigationEnabled = true;\n\n\t$('.full-screen-gallery__slider').removeClass('rsNoDrag');\n\t$('.full-screen-gallery__controls').slideDown();\n}\n\nfunction getActiveSlideImage() {\n\treturn $('.rsActiveSlide > .rsImg', $gallery);\n}\n\nfunction getActivePanzoomContainer() {\n\treturn $('.rsActiveSlide > .panzoomContainer', $gallery);\n}\n\nfunction initPanzoom() {\n\tvar $panzoomContainer = getActivePanzoomContainer();\n\tvar $activeImage = getActiveSlideImage();\n\n\tif ($panzoomContainer.length || !$activeImage.length) {\n\t\t// panzoom is already init'd or active slide image not found\n\t\treturn;\n\t}\n\n\t$activeImage.wrap(\"
\");\n\n\t$panzoomContainer = getActivePanzoomContainer();\n\n\t$panzoomContainer.panzoom({\n\t\tcursor: 'grab',\n\t\tcontain: 'automatic',\n\t\tincrement: 0.3,\n\t\tminScale: 1,\n\t\tmaxScale: 2,\n\t\tpanOnlyWhenZoomed: true\n\t});\n\n\t$panzoomContainer.on('mousewheel', function (event) {\n\t\tevent.preventDefault();\n\t\tvar delta = event.delta || event.originalEvent.wheelDelta;\n\t\tvar zoomOut = delta ? delta < 0 : event.originalEvent.deltaY > 0;\n\t\t$(this).panzoom('zoom', zoomOut);\n\t});\n}\n\nfunction getYouTubeIFrames() {\n\treturn $.findByBem('full-screen-gallery__slider__youtube-player', 'iframe', null, $gallery);\n}\n\nfunction getYouTubePlayerIFrame() {\n\treturn $.findByBem('full-screen-gallery', 'slider__youtube-player__iframe', null, $gallery);\n}\n\nfunction stopYouTubeVideos() {\n\tvar $iframes = getYouTubeIFrames();\n\t$iframes.each(function () {\n\t\tyoutube.stopVideo($(this).attr('id'));\n\t});\n}\n\nfunction initYouTubeVideos() {\n\tyoutube.init($gallery);\n\n\t// subscribe to the first youtube video play event and log it\n\tvar $iframes = getYouTubeIFrames();\n\t$iframes.each(function () {\n\t\t$(this).on('youtube-video-playing', function () {\n\t\t\tlogVideoPlay();\n\t\t\t$(this).off('youtube-video-playing');\n\t\t});\n\n\t\tif (layout.isMobile()) {\n\t\t\t$(this).attr('allowfullscreen', '');\n\t\t}\n\t});\n}\n\nfunction resetInactivityTimer() {\n\tif (inactivityTimer) {\n\t\ttimer.cancel(inactivityTimer);\n\t}\n\n\tinactivityTimer = timer.begin(function () {\n\t\tadvert.disableGalleryAdsAutoRefresh();\n\t}, 30000);\n}\n\nfunction updateAdSlideTimer() {\n\tvar durationMessage = '';\n\tvar $durationElement = $.findByBem(classNames.fullScreenGallery, 'adverts__remaining-ad-duration');\n\n\tif (remainingMobileAdDuration > 0) {\n\t\tdurationMessage = ' - You can skip in ' + remainingMobileAdDuration + 's';\n\t}\n\telse {\n\t\twindow.clearInterval(mobileAdDurationTimer);\n\t}\n\n\t$durationElement.text(durationMessage);\n\tremainingMobileAdDuration -= 1;\n}\n\nfunction mobileSlideChange() {\n\tif (!mobileAdsEnabled()) {\n\t\treturn;\n\t}\n\n\t// stop listening for index change events, they fire when dynamically adding & removing slides\n\tlistenForIndexChange = false;\n\n\tif (currentSlideContainsAd()) {\n\t\tviewCount = 0;\n\t\tremainingMobileAdDuration = mobileAdDuration / 1000;\n\n\t\tvar $context = $.findByBem(classNames.fullScreenGallery, 'slider');\n\t\tvar googleQueryId = $('.rsActiveSlide .mpu-ad', $context).data('google-query-id');\n\n\t\tif (!googleQueryId) {\n\t\t\tremoveAdSlides(slider.currSlideId);\n\t\t\tadvert.loadMobileGalleryAds($('.rsActiveSlide', $context));\n\t\t}\n\n\t\tupdateAdSlideTimer();\n\t\tmobileAdDurationTimer = setInterval(function () {\n\t\t\tupdateAdSlideTimer();\n\t\t}, 1000);\n\n\t\tsetTimeout(function () {\n\t\t\tenableNavigation();\n\t\t}, mobileAdDuration);\n\t}\n\telse if (viewCount >= mobileAdFrequency) {\n\t\tappendAdSlide();\n\t}\n\telse {\n\t\tremoveAdSlides();\n\t}\n\n\tlistenForIndexChange = true;\n}\n\nfunction onIndexChange() {\n\tstopYouTubeVideos();\n\tupdateCaption();\n\n\tviewCount++;\n\n\tif (layout.isMobile()) {\n\t\tmobileSlideChange();\n\t}\n\n\tif (!layout.isMobile() || (layout.isMobile() && !currentSlideContainsAd())) {\n\t\tif (isImageSlide(slider.currSlideId)) {\n\t\t\tinitPanzoom();\n\t\t}\n\n\t\tlogViewByContentType(slider.currSlideId);\n\t}\n\n\tresetInactivityTimer();\n}\n\nfunction onBeforeIndexChange(direction) {\n\tgetActivePanzoomContainer().panzoom(\"reset\");\n\n\tvar relativeDirection = direction;\n\tif (relativeDirection !== 'next' && relativeDirection !== 'prev') {\n\t\t// Drag gives target slide rather than direction so work out which way its going\n\t\tvar currentSlideIndex = slider.currSlideId;\n\n\t\tif (currentSlideIndex < direction) {\n\t\t\trelativeDirection = 'next';\n\t\t} else {\n\t\t\trelativeDirection = 'prev';\n\t\t}\n\t}\n\n\tif (layout.isMobile() && mobileAdsEnabled() && nextSlideContainsAd(relativeDirection)) {\n\t\tdisableNavigation();\n\t}\n}\n\nfunction onContentSet() {\n\tinitPanzoom();\n}\n\nfunction setYouTubeVideosFullscreenAttribute(allowFullScreen) {\n\tvar $iframes = getYouTubeIFrames();\n\t$iframes.each(function () {\n\t\tif (allowFullScreen) {\n\t\t\t$(this).attr('allowfullscreen', '');\n\t\t}\n\t\telse {\n\t\t\t$(this).removeAttr('allowfullscreen');\n\t\t}\n\t});\n}\n\nfunction shouldResizeVideoPlayer() {\n\tvar $sliderContainer = $.findByBem(classNames.fullScreenGallery, classNames.slider);\n\treturn $sliderContainer.hasBemClass(classNames.fullScreenGallery, classNames.slider, modifiers.videoLoaded) && $sliderContainer.is(':visible');\n}\n\nfunction adjustVideoSizeBasedOnUserResolution() {\n\tvar $sliderOverflow = $.findByBem(classNames.fullScreenGallery, classNames.slider).find('.' + classNames.royalSliderOverflow);\n\tvar videoContainerHeight = parseInt($sliderOverflow.css('height'), 10);\n\tvar videoContainerWidth = parseInt($sliderOverflow.css('width'), 10);\n\n\tif (!shouldResizeVideoPlayer()) {\n\t\treturn;\n\t}\n\n\tvar percentage = 0.75;\n\tvar heightRatio = 9 / 16;\n\tvar widthRatio = 16 / 9;\n\tvar height = 0;\n\tvar width = 0;\n\n\t//reduce the size of the Youtube video container by 25%. \n\t//This will provide us with the available dimensions in order to fit the video.\n\t//The higher is the percentage the smaller the video will be.\n\t//25% is a good balance between reduction and video size.\n\tvar availableHeight = videoContainerHeight * percentage;\n\tvar availableWidth = videoContainerWidth * percentage;\n\n\t//the top margin needs to be calculate.The difference between the Youtube video container will give the absolute distance between \n\t// the X and Y. By dividing to 100 we will take the 100th part of that. It is similar to a percentage.\n\t//Eg 1600 - 500 = 1100; margin = 1100 / 100 = 11\n\tvar marginTop = Math.abs(videoContainerWidth - videoContainerHeight) / 100;\n\n\t//Calculate the required height from the container width and multiply it by the heightRatio\n\tvar requiredHeight = videoContainerWidth * heightRatio;\n\n\tif (requiredHeight > availableHeight) {\n\t\t//if so calculate the width as a proportion of the availble height and the width ratio\n\t\t//the height remain unchanged.\n\t\twidth = availableHeight * widthRatio;\n\t\theight = availableHeight;\n\t} else {\n\t\t//otherwise calculate the height as a proportion of the availble width and the width ratio heightRatio\n\t\t//the width remain unchanged.\n\t\twidth = availableWidth;\n\t\theight = availableWidth * heightRatio;\n\t}\n\n\tvar ytiFrame = getYouTubePlayerIFrame();\n\tytiFrame.css({\n\t\theight: height + 'px',\n\t\t'margin-top': marginTop + 'rem',\n\t\twidth: width + 'px'\n\t});\n}\n\nfunction onWindowResize() {\n\tvar $thumbnails = $('.rsNav');\n\n\tif (isMobileLayout && !layout.isMobile()) {\n\t\t// handle window resize from small -> large\n\t\tremoveAdSlides();\n\t\t$.findByBem(classNames.fullScreenGallery, 'adverts__inner__mpu').html(placementHtml);\n\t\t$thumbnails.show();\n\t\tsetYouTubeVideosFullscreenAttribute(false);\n\t} else if (!isMobileLayout && layout.isMobile()) {\n\t\t// handle window resize from large -> small\n\t\t$thumbnails.hide();\n\t\tsetYouTubeVideosFullscreenAttribute(true);\n\t\tadvert.disableGalleryAdsAutoRefresh();\n\t}\n\n\tsetTransitionSpeed();\n\n\tif (!layout.isMobile()) {\n\t\tadjustVideoSizeBasedOnUserResolution();\n\t} else {\n\t\tvar ytiFrame = getYouTubePlayerIFrame();\n\t\tytiFrame.css({\n\t\t\theight: '',\n\t\t\tmargin: '',\n\t\t\twidth: ''\n\t\t});\n\t}\n\n\tisMobileLayout = layout.isMobile();\n}\n\nfunction closeGallery() {\n\n\tadvert.resetTargeting();\n\tadvert.disableGalleryAdsAutoRefresh();\n\n\tif (inactivityTimer) {\n\t\ttimer.cancel(inactivityTimer);\n\t}\n\n\tif (layout.isMobile()) {\n\t\tlistenForIndexChange = false;\n\t\tremoveAdSlides();\n\t\tlistenForIndexChange = true;\n\t\ttoggleMobileTopAd();\n\t}\n\n\t$(\"body\").off(\"touchmove\");\n\n\t$.findByBem(classNames.fullScreenGallery, 'container').fadeOut('slow');\n\t$.findByBem(classNames.fullScreenGallery, 'adverts__inner__mpu').html(placementHtml);\n\n\tstopYouTubeVideos();\n}\n\nfunction handleGalleryEscape(event) {\n\tif (!$gallery.is(':visible')) {\n\t\treturn;\n\t}\n\n\tvar isEscape = false;\n\n\tif (\"key\" in event && event.key) {\n\t\tisEscape = event.key === \"Escape\" || event.key === \"Esc\";\n\t} else {\n\t\tisEscape = event.keyCode === 27;\n\t}\n\n\tif (isEscape) {\n\t\tcloseGallery();\n\t}\n}\n\nfunction initGalleryControls() {\n\t$galleryControls = $.findByBem(classNames.fullScreenGallery, 'controls');\n\n\t$('[data-elem=\"prev\"]', $galleryControls).on('click.full-screen-gallery-prev', function () {\n\t\tif (isNavigationEnabled) {\n\t\t\tslider.prev();\n\t\t}\n\t});\n\n\t$('[data-elem=\"next\"]', $galleryControls).on('click.full-screen-gallery-next', function () {\n\t\tif (isNavigationEnabled) {\n\t\t\tslider.next();\n\t\t}\n\t});\n\n\t$('[data-elem=\"zoomIn\"]', $galleryControls).on('click.full-screen-gallery-zoomIn', function () {\n\t\tgetActivePanzoomContainer().panzoom('zoom');\n\t});\n\n\t$('[data-elem=\"zoomOut\"]', $galleryControls).on('click.full-screen-gallery-zoomOut', function () {\n\t\tgetActivePanzoomContainer().panzoom('zoom', true);\n\t});\n\n\t$('[data-elem=\"close\"]', $gallery).on('click.full-screen-gallery-close', function () {\n\t\tcloseGallery();\n\t});\n\n\t$('[data-elem=\"captionToggle\"]', $galleryControls).on('click.full-screen-gallery-captionToggle', function () {\n\t\tvar $caption = $.findByBem(classNames.fullScreenGallery, 'caption');\n\t\t$caption.slideToggle('slow', function () {\n\t\t\tshowCaption = $(this).is(':visible');\n\t\t});\n\t});\n\n\t$('[data-elem=\"thumbsToggle\"]', $galleryControls).on('click.full-screen-gallery-thumbsToggle', function () {\n\t\t$('.rsNav').slideToggle('slow');\n\t});\n}\n\nfunction initAdProperties() {\n\tvar $adverts = $.findByBem(classNames.fullScreenGallery, 'adverts__inner');\n\tplacementHtml = $adverts.findByBem(classNames.fullScreenGallery, 'adverts__inner__mpu').html();\n\tmobileAdFrequency = $adverts.data('mobile-ad-frequency');\n\tmobileAdDuration = $adverts.data('mobile-ad-duration');\n\tdesktopAdViewedDuration = $adverts.data('desktop-ad-viewed-duration');\n\tdesktopAdTimeout = $adverts.data('desktop-ad-timeout');\n}\n\nfunction initEvents() {\n\tslider.ev.on('rsBeforeMove', function (event, type) {\n\t\tonBeforeIndexChange(type);\n\t});\n\n\tslider.ev.on('rsAfterSlideChange', function () {\n\t\tif (listenForIndexChange) {\n\t\t\tonIndexChange();\n\t\t}\n\t});\n\n\tslider.ev.on('rsAfterContentSet', function () {\n\t\tif (listenForIndexChange) {\n\t\t\tonContentSet();\n\t\t}\n\t});\n\n\t$(window).on('resize', function () {\n\t\tsetTimeout(function () {\n\t\t\tonWindowResize();\n\t\t}, 250);\n\t});\n\n\t$(document).on('keydown.full-screen-gallery-escape', function (event) {\n\t\thandleGalleryEscape(event);\n\t});\n\n\tgetYouTubePlayerIFrame().on('load', function () {\n\t\tvar $sliderContainer = $.findByBem(classNames.fullScreenGallery, classNames.slider);\n\t\t$sliderContainer.addBemClass(classNames.fullScreenGallery, classNames.slider, modifiers.videoLoaded);\n\n\t\tif (!layout.isMobile()) {\n\t\t\tadjustVideoSizeBasedOnUserResolution();\n\t\t}\n\t});\n}\n\nfunction numImagesToPreload() {\n\tif (layout.isMobile()) {\n\t\treturn 2;\n\t}\n\n\treturn 4;\n}\n\nfunction watchInsuranceQuoteContainerSpace() {\n\t//watch mpu and hide insurance quote link if it is a dmpu\n\theightWatcher.watchElementHeight($.findByBem(classNames.fullScreenGallery, 'adverts__inner__mpu'), 2000, function () {\n\t\tif ($.findByBem(classNames.fullScreenGallery, 'adverts__inner__mpu').height() > 250) {\n\t\t\t$.findByBem(classNames.fullScreenGallery, 'insurance-quote-container').removeBemClass(classNames.fullScreenGallery, 'insurance-quote-container', 'show');\n\t\t\t$.findByBem(classNames.fullScreenGallery, 'insurance-quote-container').addBemClass(classNames.fullScreenGallery, 'insurance-quote-container', 'hide');\n\t\t}\n\t\telse {\n\t\t\t$.findByBem(classNames.fullScreenGallery, 'insurance-quote-container').removeBemClass(classNames.fullScreenGallery, 'insurance-quote-container', 'hide');\n\t\t\t$.findByBem(classNames.fullScreenGallery, 'insurance-quote-container').addBemClass(classNames.fullScreenGallery, 'insurance-quote-container', 'show');\n\t\t}\n\t});\n}\n\nfunction chooseImagesForScreensize() {\n\tvar screenSize = layout.getScreenSize();\n\t$('a.rsImg').each(function () {\n\t\tvar link = $(this);\n\t\tvar href = link.attr('data-href-' + screenSize);\n\t\tif (href) {\n\t\t\tlink.attr('href', href);\n\t\t}\n\t});\n}\n\nfunction loadRoyalSlider(callback) {\n\tchooseImagesForScreensize();\n\n\t$('.royalSlider').royalSlider({\n\t\tcontrolNavigation: 'thumbnails',\n\t\taddActiveClass: true,\n\t\tautoScaleSlider: true,\n\t\tloop: true,\n\t\timageScaleMode: 'fit',\n\t\timageAlignCenter: true,\n\t\tnavigateByClick: false,\n\t\tnumImagesToPreload: numImagesToPreload(),\n\t\tarrowsNav: false,\n\t\tkeyboardNavEnabled: true,\n\t\tfadeinLoadedSlide: true,\n\t\tglobalCaption: true,\n\t\tglobalCaptionInside: true,\n\t\tcontrolsInside: false\n\t});\n\n\tslider = getSlider();\n\tinitGalleryControls();\n\tinitAdProperties();\n\tinitYouTubeVideos();\n\tinitEvents();\n\n\tupdateCaption();\n\n\tisMobileLayout = layout.isMobile();\n\n\tgalleryLoaded = true;\n\n\tcallback();\n}\n\nfunction openGalleryAtIndex(index, initialOpen, requestOrigin) {\n\n\tvar galleryTemplate = getGalleryTemplateName();\n\tadvert.overridePageType(galleryTemplate);\n\n\tif (typeof royalSlider !== 'undefined') {\n\t\tvar action = pageLocation ? 'Opened - ' + pageLocation : 'Opened';\n\t\tanalytics.trackEvent('Full Screen Gallery', action, requestOrigin);\n\n\t\tslider = getSlider();\n\n\t\tif (slider) {\n\t\t\t// If the requested index is the same as the current one then manually log the view and reset the inactivity timer. \n\t\t\t// If the gallery is already init'd it will fire an onChange event if the index is different.\n\t\t\tif (slider.currSlideId === index) {\n\t\t\t\tlogViewByContentType(slider.currSlideId);\n\t\t\t\tresetInactivityTimer();\n\t\t\t}\n\n\t\t\t// If this is the first time open and the first slide selected then\n\t\t\t// the index change event won't fire, manually increase the viewcount.\n\t\t\tif (initialOpen && index === 0) {\n\t\t\t\tviewCount = 1;\n\t\t\t}\n\n\t\t\ttoggleMobileTopAd();\n\t\t\tsetTransitionSpeed(0);\n\t\t\tslider.goTo(index);\n\t\t\tsetTransitionSpeed();\n\n\t\t\t$.findByBem(classNames.fullScreenGallery, 'container').fadeIn(300, function () {\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tslider.updateSliderSize(true);\n\t\t\t\t\tslider.updateSliderSize(true); //this must be triggered twice as jQuery 3 changed the height/width calc, causing images to be too small\n\t\t\t\t}, 10);\n\n\t\t\t\t$('body').on('touchmove', function (event) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tif (layout.isMobile()) {\n\t\t\t\tadvert.loadMobileGalleryAds($gallery, true);\n\t\t\t} else {\n\t\t\t\tadvert.loadDesktopGalleryAds($gallery, desktopAdViewedDuration, desktopAdTimeout);\n\t\t\t}\n\n\t\t\twatchInsuranceQuoteContainerSpace();\n\n\t\t\tvar $sliderOverflow = $.findByBem(classNames.fullScreenGallery, classNames.slider).find('.' + classNames.royalSliderOverflow);\n\t\t\theightWatcher.watchElementHeight($sliderOverflow, 500, function () {\n\t\t\t\tadjustVideoSizeBasedOnUserResolution();\n\t\t\t});\n\t\t}\n\t}\n}\n\nfunction showIndex(index, requestOrigin) {\n\tindex = parseInt(index);\n\n\tif (!isNaN(index)) {\n\t\tif (!galleryLoaded) {\n\t\t\tloadRoyalSlider(function () {\n\t\t\t\twindow.setTimeout(function () {\n\t\t\t\t\topenGalleryAtIndex(index, true, requestOrigin);\n\t\t\t\t}, 100);\n\t\t\t});\n\t\t} else {\n\t\t\topenGalleryAtIndex(index, false, requestOrigin);\n\t\t}\n\t}\n}\n\nfunction initGalleryLinks(context) {\n\t$('a[data-gallery-index]', context).off('click.full-screen-gallery').on('click.full-screen-gallery', function (e) {\n\t\te.preventDefault();\n\n\t\tvar index = $(this).data('gallery-index');\n\t\tvar origin = $(this).data('gallery-launch-origin');\n\t\tpageLocation = $(this).data('gallery-page-location');\n\n\t\tshowIndex(index, origin);\n\t});\n}\n\nmodule.exports = {\n\tinit: function (context) {\n\t\t$gallery = $.findByBem(classNames.fullScreenGallery);\n\n\t\tif ($gallery.length > 0) {\n\t\t\tinitGalleryLinks(context);\n\t\t}\n\t},\n\n\topen: function (index) {\n\t\tif ($gallery.length > 0) {\n\t\t\tshowIndex(index);\n\t\t}\n\t}\n};","'use strict';\n\nvar $ = require('jquery');\nvar basePage = require('../pages/base-page.js');\nvar fullScreenGallery = require('../components/full-screen-gallery.js');\nvar tagManager = require('../utils/tagManager.js');\nvar contactDealer = require('../components/contact-dealer.js');\nvar contactDealerButtonByPhone = require('../components/contact-dealer-button.js');\n\nvar classNames = {\n\tvfsUsedDetailsPage: 'vfs-used-details-page',\n\tbuyingConfidence: 'vfs-used-details-page__dealer__buying-confidence',\n\tlinkList: 'link-list',\n\tdisclaimerReveal: 'vfs-used-details-page__disclaimer-reveal',\n\tdisclaimerIcon: 'vfs-used-details-page__disclaimer-icon'\n};\n\nfunction setVanDealerClick($context){\n\tvar $dealerLink = $context.findByBem(classNames.buyingConfidence, 'link');\n\t$dealerLink.on('click.vfsUsedDetails', function(e){\n\t\te.preventDefault();\n\t\tvar $container = $context.findByBem(classNames.buyingConfidence);\n\n\t\tvar $text = $container.findByBem(classNames.buyingConfidence, 'text');\n\t\tvar $link = $container.findByBem(classNames.linkList, 'item');\n\n\t\tif ($text.hasBemClass(classNames.buyingConfidence, 'text', 'expanded') && $link.hasBemClass(classNames.linkList, 'item', 'expanded')){\n\t\t\t$text.removeBemClass(classNames.buyingConfidence, 'text', 'expanded').slideUp('fast');\n\t\t\t$link.removeBemClass(classNames.linkList, 'item', 'expanded');\n\t\t}\n\t\telse{\n\t\t\t$text.addBemClass(classNames.buyingConfidence, 'text', 'expanded').slideDown('fast');\n\t\t\t$link.addBemClass(classNames.linkList, 'item', 'expanded');\n\t\t}\n\t});\n}\n\nfunction setPhoneInfoClick($context) {\n\tvar $icon = $context.findByBem(classNames.disclaimerIcon);\n\tvar $disclaimer = $context.findByBem(classNames.disclaimerReveal);\n\n\t$icon.on('click', function(e) {\n\t\te.preventDefault();\n\t\t$disclaimer.slideToggle();\n\t});\n}\n\nfunction pushVehicleIdToDataLayer() {\n\tvar $page = $.findByBem(classNames.vfsUsedDetailsPage);\n\tvar vehicleId = $page.data('vehicle-id');\n\n\ttagManager.pushToDataLayer({\n\t\t'vehicleId' : vehicleId\n\t});\n}\n\nbasePage.init = function() {\n\tbasePage.initBasePage();\n\n\tvar $context = $('#vfsUsedDetailsPage');\n\n\tfullScreenGallery.init($context);\n\tsetVanDealerClick($context);\n\tsetPhoneInfoClick($context);\n\tpushVehicleIdToDataLayer();\n\t\n\tcontactDealer.init();\n\tcontactDealerButtonByPhone.init();\n};\n\nmodule.exports = basePage;","'use strict';\n\nvar $ = require('jquery');\n\nvar players = {};\n\nfunction stopVideo(id) {\n\tvar player = players[id];\n\n\tif (player) {\n\t\tplayer.stopVideo();\n\t}\n}\n\nfunction onPlayerStateChange(event, id) {\n\tif (event.data === window.YT.PlayerState.PLAYING) {\n\t\t$('#' + id).trigger('youtube-video-playing');\n\t}\n}\n\nfunction init($context) {\n\t$('iframe[src*=\"youtube\"]', $context).each(function() {\n\t\tvar id = $(this).attr('id');\n\t\tvar jsApiEnabled = $(this).attr('src').indexOf('enablejsapi=1') > 0;\n\n\t\tif (jsApiEnabled) {\n\t\t\tplayers[id] = new window.YT.Player(id, {\n\t\t\t\tevents: {\n\t\t\t\t\t'onStateChange': function (event) {\n\t\t\t\t\t\tonPlayerStateChange(event, id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n}\n\nmodule.exports = {\n\tinit: function ($context) {\n\t\twindow.onYouTubeIframeAPIReady = init($context);\n\t},\n\n\tstopVideo: function (id) {\n\t\tstopVideo(id);\n\t}\n};","/*!\n * jQuery Mousewheel 3.1.13\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n */\n\n(function (factory) {\n if ( typeof define === 'function' && define.amd ) {\n // AMD. Register as an anonymous module.\n define(['jquery'], factory);\n } else if (typeof exports === 'object') {\n // Node/CommonJS style for Browserify\n module.exports = factory;\n } else {\n // Browser globals\n factory(jQuery);\n }\n}(function ($) {\n\n var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],\n toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?\n ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],\n slice = Array.prototype.slice,\n nullLowestDeltaTimeout, lowestDelta;\n\n if ( $.event.fixHooks ) {\n for ( var i = toFix.length; i; ) {\n $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;\n }\n }\n\n var special = $.event.special.mousewheel = {\n version: '3.1.12',\n\n setup: function() {\n if ( this.addEventListener ) {\n for ( var i = toBind.length; i; ) {\n this.addEventListener( toBind[--i], handler, false );\n }\n } else {\n this.onmousewheel = handler;\n }\n // Store the line height and page height for this particular element\n $.data(this, 'mousewheel-line-height', special.getLineHeight(this));\n $.data(this, 'mousewheel-page-height', special.getPageHeight(this));\n },\n\n teardown: function() {\n if ( this.removeEventListener ) {\n for ( var i = toBind.length; i; ) {\n this.removeEventListener( toBind[--i], handler, false );\n }\n } else {\n this.onmousewheel = null;\n }\n // Clean up the data we added to the element\n $.removeData(this, 'mousewheel-line-height');\n $.removeData(this, 'mousewheel-page-height');\n },\n\n getLineHeight: function(elem) {\n var $elem = $(elem),\n $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();\n if (!$parent.length) {\n $parent = $('body');\n }\n return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;\n },\n\n getPageHeight: function(elem) {\n return $(elem).height();\n },\n\n settings: {\n adjustOldDeltas: true, // see shouldAdjustOldDeltas() below\n normalizeOffset: true // calls getBoundingClientRect for each event\n }\n };\n\n $.fn.extend({\n mousewheel: function(fn) {\n return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');\n },\n\n unmousewheel: function(fn) {\n return this.unbind('mousewheel', fn);\n }\n });\n\n\n function handler(event) {\n var orgEvent = event || window.event,\n args = slice.call(arguments, 1),\n delta = 0,\n deltaX = 0,\n deltaY = 0,\n absDelta = 0,\n offsetX = 0,\n offsetY = 0;\n event = $.event.fix(orgEvent);\n event.type = 'mousewheel';\n\n // Old school scrollwheel delta\n if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }\n if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }\n if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }\n if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }\n\n // Firefox < 17 horizontal scrolling related to DOMMouseScroll event\n if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\n deltaX = deltaY * -1;\n deltaY = 0;\n }\n\n // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy\n delta = deltaY === 0 ? deltaX : deltaY;\n\n // New school wheel delta (wheel event)\n if ( 'deltaY' in orgEvent ) {\n deltaY = orgEvent.deltaY * -1;\n delta = deltaY;\n }\n if ( 'deltaX' in orgEvent ) {\n deltaX = orgEvent.deltaX;\n if ( deltaY === 0 ) { delta = deltaX * -1; }\n }\n\n // No change actually happened, no reason to go any further\n if ( deltaY === 0 && deltaX === 0 ) { return; }\n\n // Need to convert lines and pages to pixels if we aren't already in pixels\n // There are three delta modes:\n // * deltaMode 0 is by pixels, nothing to do\n // * deltaMode 1 is by lines\n // * deltaMode 2 is by pages\n if ( orgEvent.deltaMode === 1 ) {\n var lineHeight = $.data(this, 'mousewheel-line-height');\n delta *= lineHeight;\n deltaY *= lineHeight;\n deltaX *= lineHeight;\n } else if ( orgEvent.deltaMode === 2 ) {\n var pageHeight = $.data(this, 'mousewheel-page-height');\n delta *= pageHeight;\n deltaY *= pageHeight;\n deltaX *= pageHeight;\n }\n\n // Store lowest absolute delta to normalize the delta values\n absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );\n\n if ( !lowestDelta || absDelta < lowestDelta ) {\n lowestDelta = absDelta;\n\n // Adjust older deltas if necessary\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n lowestDelta /= 40;\n }\n }\n\n // Adjust older deltas if necessary\n if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n // Divide all the things by 40!\n delta /= 40;\n deltaX /= 40;\n deltaY /= 40;\n }\n\n // Get a whole, normalized value for the deltas\n delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);\n deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);\n deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);\n\n // Normalise offsetX and offsetY properties\n if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {\n var boundingRect = this.getBoundingClientRect();\n offsetX = event.clientX - boundingRect.left;\n offsetY = event.clientY - boundingRect.top;\n }\n\n // Add information to the event object\n event.deltaX = deltaX;\n event.deltaY = deltaY;\n event.deltaFactor = lowestDelta;\n event.offsetX = offsetX;\n event.offsetY = offsetY;\n // Go ahead and set deltaMode to 0 since we converted to pixels\n // Although this is a little odd since we overwrite the deltaX/Y\n // properties with normalized deltas.\n event.deltaMode = 0;\n\n // Add event and delta to the front of the arguments\n args.unshift(event, delta, deltaX, deltaY);\n\n // Clearout lowestDelta after sometime to better\n // handle multiple device types that give different\n // a different lowestDelta\n // Ex: trackpad = 3 and mouse wheel = 120\n if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }\n nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);\n\n return ($.event.dispatch || $.event.handle).apply(this, args);\n }\n\n function nullLowestDelta() {\n lowestDelta = null;\n }\n\n function shouldAdjustOldDeltas(orgEvent, absDelta) {\n // If this is an older event and the delta is divisable by 120,\n // then we are assuming that the browser is treating this as an\n // older mouse wheel event and that we should divide the deltas\n // by 40 to try and get a more usable deltaFactor.\n // Side note, this actually impacts the reported scroll distance\n // in older browsers and can cause scrolling to be slower than native.\n // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.\n return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;\n }\n\n}));\n","module.exports = React;","module.exports = jQuery;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t845: 0\n};\n\n// no chunk on demand loading\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n__webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkparkers\"] = self[\"webpackChunkparkers\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","// startup\n// Load entry module and return exports\n// This entry module depends on other loaded chunks and execution need to be delayed\nvar __webpack_exports__ = __webpack_require__.O(undefined, [258], () => (__webpack_require__(9683)))\n__webpack_exports__ = __webpack_require__.O(__webpack_exports__);\n"],"names":["deferred","global","window","this","jQuery","$","document","datakey","slice","Array","prototype","rIE11","supportsInputEvent","test","navigator","userAgent","input","createElement","setAttribute","oninput","rupper","rsvg","floating","commaSpace","rmatrix","RegExp","createResetOptions","opts","options","range","animate","extend","Matrix","a","b","c","d","e","f","g","h","i","type","elements","Vector","x","y","z","Panzoom","elem","nodeType","error","contains","data","defaults","$elem","$set","length","$doc","ownerDocument","$parent","parent","isSVG","namespaceURI","nodeName","toLowerCase","panning","_buildTransform","_transform","cssProps","transform","replace","_buildTransition","resetDimensions","$empty","self","each","name","enable","scale","getMatrix","_checkPanWhenZoomed","matrix","isVector","inverse","determinant","eventNamespace","transition","cursor","disablePan","disableZoom","disableXAxis","disableYAxis","which","increment","exponential","panOnlyWhenZoomed","minScale","maxScale","rangeStep","duration","easing","contain","constructor","instance","_initStyle","_bind","disabled","disable","_resetStyle","_unbind","isDisabled","destroy","removeData","container","getBoundingClientRect","dims","absScale","Math","abs","dimensions","width","height","left","css","top","border","bottom","right","margin","reset","setMatrix","_origTransform","silent","_trigger","resetZoom","origMatrix","dValue","zoom","resetPan","pan","setTransform","style","getTransform","transformElem","attr","exec","shift","spaceWLeft","spaceWRight","scaleDiff","conWidth","conHeight","zoomAspectW","zoomAspectH","offsetWidth","spaceHTop","spaceHBottom","max","min","$zoomRange","val","originalMatrix","join","isPanning","off","_transition","relative","startScale","focal","clientX","clientY","clientV","surfaceM","o","parentOffset","offset","offsetM","scrollLeft","scrollTop","surfaceV","scaleBy","noSetRange","option","key","value","arguments","undefined","_setOptions","proxy","toDisable","styles","overflow","position","ns","str_down","str_start","str_click","events","$reset","m","isFunction","touches","originalEvent","preventDefault","stopPropagation","_startMove","contextmenu","on","step","prop","$zoomIn","$zoomOut","add","startTransform","_getDistance","touch1","touch2","sqrt","pow","_getMiddle","event","triggerHandler","concat","call","moveEvent","endEvent","startDistance","startMiddle","startPageX","startPageY","touch","original","origPageX","origPageY","panOptions","setStart","pageX","pageY","coords","middle","diff","first","second","round","matrixEquals","fn","panzoom","args","ret","charAt","apply","push","factory","baseApi","getApiUrl","url","module","exports","submitOwnerReview","post","submitDealerContact","$modal","$form","$formMessageInput","$formMessageType","submitApi","logger","analytics","classNames","alertBox","contactDealer","requestForm","requestFormValidationSummary","submitError","submitSuccess","submitButton","askDealerAQuestionShowFormTrigger","askDealerAQuestionMessageTemplate","contactDealerShowFormTrigger","contactDealerMessageTemplate","emailDealer","emailDealerTemplate","requestPhotos","requestPhotosTemplate","requestPhotosFromGalleryShowFormTrigger","requestPhotosFromGalleryMessageTemplate","close","trackingCategory","trackingAction","trackingData","category","actionSuccess","actionFail","emailDealerGallery","requestPhotosGallery","askDealerQuestion","tracking","getData","$submitMessageButton","findByBem","trackEvent","messageSent","eventAction","stockId","contactForm","init","foundation","find","setLayout","setControls","hide","send","disabledClass","getBemClass","serialize","successCallback","slideUp","show","errorCallback","completeCallback","setShowFormTriggerHandler","showFormTriggerClassNames","messageTemplateClassNames","$messageTemplate","messageTemplate","text","trim","messageType","formTriggerElement","currentTarget","attachSubmitMessageTracking","not","slideDown","gaTracking","label","JSON","stringify","validation","addEmailValidator","addPhoneValidator","addPostcodeValidator","$validationSummary","validate","rules","firstName","required","lastName","email","emailValid","phoneNumber","phoneValid","postcode","postcodeValid","messages","errorPlacement","$element","insertAfter","addClass","addBemClass","ownerReviewForm","focusInvalid","invalidHandler","submitHandler","form","validator","addMethod","match","advert","config","heightWatcher","layout","tagManager","youtube","timer","royalSlider","slider","$gallery","$galleryControls","placementHtml","mobileAdFrequency","mobileAdDuration","remainingMobileAdDuration","desktopAdViewedDuration","desktopAdTimeout","mobileAdDurationTimer","inactivityTimer","pageLocation","modifiers","galleryLoaded","isMobileLayout","listenForIndexChange","isNavigationEnabled","showCaption","viewCount","gaPageOverride","dataLayer","page","galleryGaLocation","getSlider","toggleMobileTopAd","isMobile","toggle","mobileAdsEnabled","isImageSlide","id","slides","content","filter","getGalleryTemplateName","galleryTemplate","location","pathname","startsWith","logView","segment","pageTemplateName","templateName","pushToDataLayer","trackPageview","trackIpsosIrisPageView","logViewByContentType","slideIndex","imageIndex","action","vehicle","modelName","logVideoSlideView","logSlideView","removeAdSlides","retainIndexId","adSlides","grep","slide","index","removeSlide","slideContainsAd","currentSlideContainsAd","currSlideId","setTransitionSpeed","speed","transitionSpeed","st","updateCaption","$caption","caption","is","getActivePanzoomContainer","initPanzoom","$panzoomContainer","$activeImage","wrap","delta","wheelDelta","zoomOut","deltaY","getYouTubeIFrames","getYouTubePlayerIFrame","stopYouTubeVideos","stopVideo","resetInactivityTimer","cancel","begin","disableGalleryAdsAutoRefresh","updateAdSlideTimer","durationMessage","$durationElement","clearInterval","setYouTubeVideosFullscreenAttribute","allowFullScreen","removeAttr","adjustVideoSizeBasedOnUserResolution","$sliderOverflow","videoContainerHeight","parseInt","videoContainerWidth","$sliderContainer","hasBemClass","heightRatio","availableHeight","availableWidth","marginTop","closeGallery","resetTargeting","fadeOut","html","initEvents","ev","direction","relativeDirection","previousSlideId","numSlides","nextSlideId","nextSlideContainsAd","sliderDrag","sliderTouch","onBeforeIndexChange","$context","loadMobileGalleryAds","setInterval","setTimeout","removeClass","remove","appendSlide","mobileSlideChange","$thumbnails","keyCode","handleGalleryEscape","loadRoyalSlider","callback","screenSize","$adverts","getScreenSize","link","href","controlNavigation","addActiveClass","autoScaleSlider","loop","imageScaleMode","imageAlignCenter","navigateByClick","numImagesToPreload","arrowsNav","keyboardNavEnabled","fadeinLoadedSlide","globalCaption","globalCaptionInside","controlsInside","prev","next","slideToggle","openGalleryAtIndex","initialOpen","requestOrigin","overridePageType","goTo","fadeIn","updateSliderSize","loadDesktopGalleryAds","watchElementHeight","removeBemClass","showIndex","isNaN","context","origin","initGalleryLinks","open","basePage","fullScreenGallery","contactDealerButtonByPhone","initBasePage","vehicleId","$container","$text","$link","setVanDealerClick","$icon","$disclaimer","setPhoneInfoClick","players","onYouTubeIframeAPIReady","indexOf","YT","Player","PlayerState","PLAYING","trigger","onPlayerStateChange","player","nullLowestDeltaTimeout","lowestDelta","toFix","toBind","documentMode","fixHooks","mouseHooks","special","mousewheel","version","setup","addEventListener","handler","onmousewheel","getLineHeight","getPageHeight","teardown","removeEventListener","settings","adjustOldDeltas","normalizeOffset","orgEvent","deltaX","absDelta","offsetX","offsetY","fix","detail","wheelDeltaY","wheelDeltaX","axis","HORIZONTAL_AXIS","deltaMode","lineHeight","pageHeight","shouldAdjustOldDeltas","boundingRect","deltaFactor","unshift","clearTimeout","nullLowestDelta","dispatch","handle","bind","unmousewheel","unbind","React","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","O","result","chunkIds","priority","notFulfilled","Infinity","fulfilled","j","Object","keys","every","splice","r","definition","defineProperty","enumerable","get","globalThis","Function","obj","hasOwnProperty","Symbol","toStringTag","installedChunks","chunkId","webpackJsonpCallback","parentChunkLoadingFunction","moreModules","runtime","some","chunkLoadingGlobal","forEach","__webpack_exports__"],"sourceRoot":""}