{"version":3,"file":"lifeblood.min.js","sources":["lifeblood.min.js"],"sourcesContent":["/*\r\n * Watch Event Listener\r\n *\r\n * @author Darcy Clarke\r\n *\r\n * Copyright (c) 2014 Darcy Clarke\r\n * Dual licensed under the MIT and GPL licenses.\r\n *\r\n * Usage:\r\n * watch(element, 'width height', function(){\r\n * console.log(this.style.width, this.style.height);\r\n * });\r\n */\r\n\r\n(function (window) {\r\n\r\n var _watch = function (elements, props, options, callback){\r\n\r\n // Setup\r\n var self = this;\r\n var check;\r\n var toArray;\r\n\r\n // Object to Array\r\n toArray = function (obj) {\r\n\r\n var arr = [];\r\n\r\n for (var i = obj.length >>> 0; i--;) {\r\n arr[i] = obj[i];\r\n }\r\n\r\n return arr;\r\n\r\n };\r\n\r\n // Check if we should fire callback\r\n check = function (e) {\r\n\r\n var self = this;\r\n\r\n for (var i = 0; i < self.watching.length; i++) {\r\n\r\n var data = self.watching[i];\r\n var changed = true;\r\n var temp;\r\n\r\n // Iterate through properties\r\n for (var j = 0; j < data.props.length; j++) {\r\n temp = self.attributes[data.props[j]] || self.style[data.props[j]];\r\n if (data.vals[j] != temp) {\r\n data.vals[j] = temp;\r\n data.changed[j] = true;\r\n }\r\n }\r\n\r\n // Check changed attributes\r\n for (var k = 0; k < data.props.length; k++) {\r\n if (!data.changed[k]) {\r\n changed = false;\r\n break;\r\n }\r\n }\r\n\r\n // Run callback if property has changed\r\n if (changed && data.callback) {\r\n data.callback.apply(self, e);\r\n }\r\n\r\n };\r\n\r\n };\r\n\r\n // Elements from node list to array\r\n elements = toArray(elements);\r\n\r\n // Type check options\r\n if (typeof(options) == 'function') {\r\n callback = options;\r\n options = {};\r\n }\r\n\r\n // Type check callback\r\n if (typeof(callback) != 'function') {\r\n callback = function(){};\r\n }\r\n\r\n // Set throttle\r\n options.throttle = options.throttle || 10;\r\n\r\n // Iterate over elements\r\n for (var i = 0; i < elements.length; i++) {\r\n\r\n var element = elements[i];\r\n var data = {\r\n props: props.split(' '),\r\n vals: [],\r\n changed: [],\r\n callback: callback\r\n };\r\n\r\n // Grab each property's initial value\r\n for (var j = 0; j < data.props.length; j++) {\r\n data.vals[j] = element.attributes[data.props[j]] || element.style[data.props[j]];\r\n data.changed[j] = false;\r\n }\r\n\r\n // Set watch array\r\n if (!element.watching) {\r\n element.watching = [];\r\n }\r\n\r\n // Store data in watch array\r\n element.watching.push(data);\r\n\r\n // Create new Mutation Observer\r\n var observer = new MutationObserver(function (mutations) {\r\n // console.log(mutations);\r\n for (var k = 0; k < mutations.length; k++) {\r\n check.call(mutations[k].target, mutations[k]);\r\n }\r\n });\r\n\r\n // Start observing\r\n observer.observe(element, { subtree: false, attributes: true });\r\n\r\n }\r\n\r\n // Return elements to enable chaining\r\n return self;\r\n\r\n };\r\n\r\n // Expose watch to window\r\n window.watch = function () {\r\n return _watch.apply(arguments[0], arguments);\r\n };\r\n\r\n // Expose watch to jQuery\r\n (function ($) {\r\n $.fn.watch = function () {\r\n Array.prototype.unshift.call(arguments, this);\r\n return _watch.apply(this, arguments);\r\n };\r\n })(jQuery);\r\n\r\n})(window);\r\n\r\n/*\r\n * Copyright 2012 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n\r\nif (typeof WeakMap === 'undefined') {\r\n (function() {\r\n var defineProperty = Object.defineProperty;\r\n var counter = Date.now() % 1e9;\r\n\r\n var WeakMap = function() {\r\n this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\r\n };\r\n\r\n WeakMap.prototype = {\r\n set: function(key, value) {\r\n var entry = key[this.name];\r\n if (entry && entry[0] === key)\r\n entry[1] = value;\r\n else\r\n defineProperty(key, this.name, {value: [key, value], writable: true});\r\n },\r\n get: function(key) {\r\n var entry;\r\n return (entry = key[this.name]) && entry[0] === key ?\r\n entry[1] : undefined;\r\n },\r\n delete: function(key) {\r\n var entry = key[this.name];\r\n if (!entry) return false;\r\n var hasValue = entry[0] === key;\r\n entry[0] = entry[1] = undefined;\r\n return hasValue;\r\n },\r\n has: function(key) {\r\n var entry = key[this.name];\r\n if (!entry) return false;\r\n return entry[0] === key;\r\n }\r\n };\r\n\r\n window.WeakMap = WeakMap;\r\n })();\r\n}\r\n\r\n/*\r\n * Copyright 2012 The Polymer Authors. All rights reserved.\r\n * Use of this source code is goverened by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n\r\n(function(global) {\r\n\r\n var registrationsTable = new WeakMap();\r\n\r\n // We use setImmediate or postMessage for our future callback.\r\n var setImmediate = window.msSetImmediate;\r\n\r\n // Use post message to emulate setImmediate.\r\n if (!setImmediate) {\r\n var setImmediateQueue = [];\r\n var sentinel = String(Math.random());\r\n window.addEventListener('message', function(e) {\r\n if (e.data === sentinel) {\r\n var queue = setImmediateQueue;\r\n setImmediateQueue = [];\r\n queue.forEach(function(func) {\r\n func();\r\n });\r\n }\r\n });\r\n setImmediate = function(func) {\r\n setImmediateQueue.push(func);\r\n window.postMessage(sentinel, '*');\r\n };\r\n }\r\n\r\n // This is used to ensure that we never schedule 2 callas to setImmediate\r\n var isScheduled = false;\r\n\r\n // Keep track of observers that needs to be notified next time.\r\n var scheduledObservers = [];\r\n\r\n /**\r\n * Schedules |dispatchCallback| to be called in the future.\r\n * @param {MutationObserver} observer\r\n */\r\n function scheduleCallback(observer) {\r\n scheduledObservers.push(observer);\r\n if (!isScheduled) {\r\n isScheduled = true;\r\n setImmediate(dispatchCallbacks);\r\n }\r\n }\r\n\r\n function wrapIfNeeded(node) {\r\n return window.ShadowDOMPolyfill &&\r\n window.ShadowDOMPolyfill.wrapIfNeeded(node) ||\r\n node;\r\n }\r\n\r\n function dispatchCallbacks() {\r\n // http://dom.spec.whatwg.org/#mutation-observers\r\n\r\n isScheduled = false; // Used to allow a new setImmediate call above.\r\n\r\n var observers = scheduledObservers;\r\n scheduledObservers = [];\r\n // Sort observers based on their creation UID (incremental).\r\n observers.sort(function(o1, o2) {\r\n return o1.uid_ - o2.uid_;\r\n });\r\n\r\n var anyNonEmpty = false;\r\n observers.forEach(function(observer) {\r\n\r\n // 2.1, 2.2\r\n var queue = observer.takeRecords();\r\n // 2.3. Remove all transient registered observers whose observer is mo.\r\n removeTransientObserversFor(observer);\r\n\r\n // 2.4\r\n if (queue.length) {\r\n observer.callback_(queue, observer);\r\n anyNonEmpty = true;\r\n }\r\n });\r\n\r\n // 3.\r\n if (anyNonEmpty)\r\n dispatchCallbacks();\r\n }\r\n\r\n function removeTransientObserversFor(observer) {\r\n observer.nodes_.forEach(function(node) {\r\n var registrations = registrationsTable.get(node);\r\n if (!registrations)\r\n return;\r\n registrations.forEach(function(registration) {\r\n if (registration.observer === observer)\r\n registration.removeTransientObservers();\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * This function is used for the \"For each registered observer observer (with\r\n * observer's options as options) in target's list of registered observers,\r\n * run these substeps:\" and the \"For each ancestor ancestor of target, and for\r\n * each registered observer observer (with options options) in ancestor's list\r\n * of registered observers, run these substeps:\" part of the algorithms. The\r\n * |options.subtree| is checked to ensure that the callback is called\r\n * correctly.\r\n *\r\n * @param {Node} target\r\n * @param {function(MutationObserverInit):MutationRecord} callback\r\n */\r\n function forEachAncestorAndObserverEnqueueRecord(target, callback) {\r\n for (var node = target; node; node = node.parentNode) {\r\n var registrations = registrationsTable.get(node);\r\n\r\n if (registrations) {\r\n for (var j = 0; j < registrations.length; j++) {\r\n var registration = registrations[j];\r\n var options = registration.options;\r\n\r\n // Only target ignores subtree.\r\n if (node !== target && !options.subtree)\r\n continue;\r\n\r\n var record = callback(options);\r\n if (record)\r\n registration.enqueue(record);\r\n }\r\n }\r\n }\r\n }\r\n\r\n var uidCounter = 0;\r\n\r\n /**\r\n * The class that maps to the DOM MutationObserver interface.\r\n * @param {Function} callback.\r\n * @constructor\r\n */\r\n function JsMutationObserver(callback) {\r\n this.callback_ = callback;\r\n this.nodes_ = [];\r\n this.records_ = [];\r\n this.uid_ = ++uidCounter;\r\n }\r\n\r\n JsMutationObserver.prototype = {\r\n observe: function(target, options) {\r\n target = wrapIfNeeded(target);\r\n\r\n // 1.1\r\n if (!options.childList && !options.attributes && !options.characterData ||\r\n\r\n // 1.2\r\n options.attributeOldValue && !options.attributes ||\r\n\r\n // 1.3\r\n options.attributeFilter && options.attributeFilter.length &&\r\n !options.attributes ||\r\n\r\n // 1.4\r\n options.characterDataOldValue && !options.characterData) {\r\n\r\n throw new SyntaxError();\r\n }\r\n\r\n var registrations = registrationsTable.get(target);\r\n if (!registrations)\r\n registrationsTable.set(target, registrations = []);\r\n\r\n // 2\r\n // If target's list of registered observers already includes a registered\r\n // observer associated with the context object, replace that registered\r\n // observer's options with options.\r\n var registration;\r\n for (var i = 0; i < registrations.length; i++) {\r\n if (registrations[i].observer === this) {\r\n registration = registrations[i];\r\n registration.removeListeners();\r\n registration.options = options;\r\n break;\r\n }\r\n }\r\n\r\n // 3.\r\n // Otherwise, add a new registered observer to target's list of registered\r\n // observers with the context object as the observer and options as the\r\n // options, and add target to context object's list of nodes on which it\r\n // is registered.\r\n if (!registration) {\r\n registration = new Registration(this, target, options);\r\n registrations.push(registration);\r\n this.nodes_.push(target);\r\n }\r\n\r\n registration.addListeners();\r\n },\r\n\r\n disconnect: function() {\r\n this.nodes_.forEach(function(node) {\r\n var registrations = registrationsTable.get(node);\r\n for (var i = 0; i < registrations.length; i++) {\r\n var registration = registrations[i];\r\n if (registration.observer === this) {\r\n registration.removeListeners();\r\n registrations.splice(i, 1);\r\n // Each node can only have one registered observer associated with\r\n // this observer.\r\n break;\r\n }\r\n }\r\n }, this);\r\n this.records_ = [];\r\n },\r\n\r\n takeRecords: function() {\r\n var copyOfRecords = this.records_;\r\n this.records_ = [];\r\n return copyOfRecords;\r\n }\r\n };\r\n\r\n /**\r\n * @param {string} type\r\n * @param {Node} target\r\n * @constructor\r\n */\r\n function MutationRecord(type, target) {\r\n this.type = type;\r\n this.target = target;\r\n this.addedNodes = [];\r\n this.removedNodes = [];\r\n this.previousSibling = null;\r\n this.nextSibling = null;\r\n this.attributeName = null;\r\n this.attributeNamespace = null;\r\n this.oldValue = null;\r\n }\r\n\r\n function copyMutationRecord(original) {\r\n var record = new MutationRecord(original.type, original.target);\r\n record.addedNodes = original.addedNodes.slice();\r\n record.removedNodes = original.removedNodes.slice();\r\n record.previousSibling = original.previousSibling;\r\n record.nextSibling = original.nextSibling;\r\n record.attributeName = original.attributeName;\r\n record.attributeNamespace = original.attributeNamespace;\r\n record.oldValue = original.oldValue;\r\n return record;\r\n };\r\n\r\n // We keep track of the two (possibly one) records used in a single mutation.\r\n var currentRecord, recordWithOldValue;\r\n\r\n /**\r\n * Creates a record without |oldValue| and caches it as |currentRecord| for\r\n * later use.\r\n * @param {string} oldValue\r\n * @return {MutationRecord}\r\n */\r\n function getRecord(type, target) {\r\n return currentRecord = new MutationRecord(type, target);\r\n }\r\n\r\n /**\r\n * Gets or creates a record with |oldValue| based in the |currentRecord|\r\n * @param {string} oldValue\r\n * @return {MutationRecord}\r\n */\r\n function getRecordWithOldValue(oldValue) {\r\n if (recordWithOldValue)\r\n return recordWithOldValue;\r\n recordWithOldValue = copyMutationRecord(currentRecord);\r\n recordWithOldValue.oldValue = oldValue;\r\n return recordWithOldValue;\r\n }\r\n\r\n function clearRecords() {\r\n currentRecord = recordWithOldValue = undefined;\r\n }\r\n\r\n /**\r\n * @param {MutationRecord} record\r\n * @return {boolean} Whether the record represents a record from the current\r\n * mutation event.\r\n */\r\n function recordRepresentsCurrentMutation(record) {\r\n return record === recordWithOldValue || record === currentRecord;\r\n }\r\n\r\n /**\r\n * Selects which record, if any, to replace the last record in the queue.\r\n * This returns |null| if no record should be replaced.\r\n *\r\n * @param {MutationRecord} lastRecord\r\n * @param {MutationRecord} newRecord\r\n * @param {MutationRecord}\r\n */\r\n function selectRecord(lastRecord, newRecord) {\r\n if (lastRecord === newRecord)\r\n return lastRecord;\r\n\r\n // Check if the the record we are adding represents the same record. If\r\n // so, we keep the one with the oldValue in it.\r\n if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))\r\n return recordWithOldValue;\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Class used to represent a registered observer.\r\n * @param {MutationObserver} observer\r\n * @param {Node} target\r\n * @param {MutationObserverInit} options\r\n * @constructor\r\n */\r\n function Registration(observer, target, options) {\r\n this.observer = observer;\r\n this.target = target;\r\n this.options = options;\r\n this.transientObservedNodes = [];\r\n }\r\n\r\n Registration.prototype = {\r\n enqueue: function(record) {\r\n var records = this.observer.records_;\r\n var length = records.length;\r\n\r\n // There are cases where we replace the last record with the new record.\r\n // For example if the record represents the same mutation we need to use\r\n // the one with the oldValue. If we get same record (this can happen as we\r\n // walk up the tree) we ignore the new record.\r\n if (records.length > 0) {\r\n var lastRecord = records[length - 1];\r\n var recordToReplaceLast = selectRecord(lastRecord, record);\r\n if (recordToReplaceLast) {\r\n records[length - 1] = recordToReplaceLast;\r\n return;\r\n }\r\n } else {\r\n scheduleCallback(this.observer);\r\n }\r\n\r\n records[length] = record;\r\n },\r\n\r\n addListeners: function() {\r\n this.addListeners_(this.target);\r\n },\r\n\r\n addListeners_: function(node) {\r\n var options = this.options;\r\n if (options.attributes)\r\n node.addEventListener('DOMAttrModified', this, true);\r\n\r\n if (options.characterData)\r\n node.addEventListener('DOMCharacterDataModified', this, true);\r\n\r\n if (options.childList)\r\n node.addEventListener('DOMNodeInserted', this, true);\r\n\r\n if (options.childList || options.subtree)\r\n node.addEventListener('DOMNodeRemoved', this, true);\r\n },\r\n\r\n removeListeners: function() {\r\n this.removeListeners_(this.target);\r\n },\r\n\r\n removeListeners_: function(node) {\r\n var options = this.options;\r\n if (options.attributes)\r\n node.removeEventListener('DOMAttrModified', this, true);\r\n\r\n if (options.characterData)\r\n node.removeEventListener('DOMCharacterDataModified', this, true);\r\n\r\n if (options.childList)\r\n node.removeEventListener('DOMNodeInserted', this, true);\r\n\r\n if (options.childList || options.subtree)\r\n node.removeEventListener('DOMNodeRemoved', this, true);\r\n },\r\n\r\n /**\r\n * Adds a transient observer on node. The transient observer gets removed\r\n * next time we deliver the change records.\r\n * @param {Node} node\r\n */\r\n addTransientObserver: function(node) {\r\n // Don't add transient observers on the target itself. We already have all\r\n // the required listeners set up on the target.\r\n if (node === this.target)\r\n return;\r\n\r\n this.addListeners_(node);\r\n this.transientObservedNodes.push(node);\r\n var registrations = registrationsTable.get(node);\r\n if (!registrations)\r\n registrationsTable.set(node, registrations = []);\r\n\r\n // We know that registrations does not contain this because we already\r\n // checked if node === this.target.\r\n registrations.push(this);\r\n },\r\n\r\n removeTransientObservers: function() {\r\n var transientObservedNodes = this.transientObservedNodes;\r\n this.transientObservedNodes = [];\r\n\r\n transientObservedNodes.forEach(function(node) {\r\n // Transient observers are never added to the target.\r\n this.removeListeners_(node);\r\n\r\n var registrations = registrationsTable.get(node);\r\n for (var i = 0; i < registrations.length; i++) {\r\n if (registrations[i] === this) {\r\n registrations.splice(i, 1);\r\n // Each node can only have one registered observer associated with\r\n // this observer.\r\n break;\r\n }\r\n }\r\n }, this);\r\n },\r\n\r\n handleEvent: function(e) {\r\n // Stop propagation since we are managing the propagation manually.\r\n // This means that other mutation events on the page will not work\r\n // correctly but that is by design.\r\n e.stopImmediatePropagation();\r\n\r\n switch (e.type) {\r\n case 'DOMAttrModified':\r\n // http://dom.spec.whatwg.org/#concept-mo-queue-attributes\r\n\r\n var name = e.attrName;\r\n var namespace = e.relatedNode.namespaceURI;\r\n var target = e.target;\r\n\r\n // 1.\r\n var record = new getRecord('attributes', target);\r\n record.attributeName = name;\r\n record.attributeNamespace = namespace;\r\n\r\n // 2.\r\n var oldValue =\r\n e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;\r\n\r\n forEachAncestorAndObserverEnqueueRecord(target, function(options) {\r\n // 3.1, 4.2\r\n if (!options.attributes)\r\n return;\r\n\r\n // 3.2, 4.3\r\n if (options.attributeFilter && options.attributeFilter.length &&\r\n options.attributeFilter.indexOf(name) === -1 &&\r\n options.attributeFilter.indexOf(namespace) === -1) {\r\n return;\r\n }\r\n // 3.3, 4.4\r\n if (options.attributeOldValue)\r\n return getRecordWithOldValue(oldValue);\r\n\r\n // 3.4, 4.5\r\n return record;\r\n });\r\n\r\n break;\r\n\r\n case 'DOMCharacterDataModified':\r\n // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata\r\n var target = e.target;\r\n\r\n // 1.\r\n var record = getRecord('characterData', target);\r\n\r\n // 2.\r\n var oldValue = e.prevValue;\r\n\r\n\r\n forEachAncestorAndObserverEnqueueRecord(target, function(options) {\r\n // 3.1, 4.2\r\n if (!options.characterData)\r\n return;\r\n\r\n // 3.2, 4.3\r\n if (options.characterDataOldValue)\r\n return getRecordWithOldValue(oldValue);\r\n\r\n // 3.3, 4.4\r\n return record;\r\n });\r\n\r\n break;\r\n\r\n case 'DOMNodeRemoved':\r\n this.addTransientObserver(e.target);\r\n // Fall through.\r\n case 'DOMNodeInserted':\r\n // http://dom.spec.whatwg.org/#concept-mo-queue-childlist\r\n var target = e.relatedNode;\r\n var changedNode = e.target;\r\n var addedNodes, removedNodes;\r\n if (e.type === 'DOMNodeInserted') {\r\n addedNodes = [changedNode];\r\n removedNodes = [];\r\n } else {\r\n\r\n addedNodes = [];\r\n removedNodes = [changedNode];\r\n }\r\n var previousSibling = changedNode.previousSibling;\r\n var nextSibling = changedNode.nextSibling;\r\n\r\n // 1.\r\n var record = getRecord('childList', target);\r\n record.addedNodes = addedNodes;\r\n record.removedNodes = removedNodes;\r\n record.previousSibling = previousSibling;\r\n record.nextSibling = nextSibling;\r\n\r\n forEachAncestorAndObserverEnqueueRecord(target, function(options) {\r\n // 2.1, 3.2\r\n if (!options.childList)\r\n return;\r\n\r\n // 2.2, 3.3\r\n return record;\r\n });\r\n\r\n }\r\n\r\n clearRecords();\r\n }\r\n };\r\n\r\n global.JsMutationObserver = JsMutationObserver;\r\n\r\n if (!global.MutationObserver)\r\n global.MutationObserver = JsMutationObserver;\r\n\r\n\r\n})(this);\r\n\nvar ARCLB2C = ARCLB2C || {};\r\nARCLB2C.Passwords = ARCLB2C.Passwords || {};\r\n\r\n(function (ARCLB2C, $, window, document, undefined) {\r\n\r\n /*------Show/Hide Password Toggler ------*/\r\n\r\n function makePwdToggler(pwd) {\r\n // Create show-password checkbox\r\n var checkbox = document.createElement('input');\r\n checkbox.setAttribute('type', 'checkbox');\r\n var id = pwd.id + 'togglercheckbox';\r\n checkbox.setAttribute('id', id);\r\n checkbox.setAttribute('class', 'password-toggler-checkbox sr-only');\r\n checkbox.setAttribute('tabindex', '-1');\r\n\r\n var label = document.createElement('label');\r\n label.setAttribute('for', id);\r\n\r\n var icon = document.createElement('i');\r\n icon.setAttribute('class', 'fa fa-eye');\r\n icon.setAttribute('aria-hidden', 'true');\r\n label.appendChild(icon);\r\n\r\n var container = document.createElement('span');\r\n container.id = id + 'icon';\r\n container.className = 'password-toggler';\r\n container.appendChild(checkbox);\r\n container.appendChild(label);\r\n\r\n // Add show-password checkbox under password input\r\n pwd.insertAdjacentElement('afterend', container);\r\n\r\n // Add toggle password callback\r\n function toggle(e) {\r\n if (e.keyCode !== 32 && e.keyCode !== 9) { // spacebar and tab fires the 'onclick' event (as well as 'onkeydown' event), and because this function handles both, we ignore the spacebar and tab key onkeydown event here\r\n if (pwd.type === 'password') {\r\n pwd.type = 'text';\r\n } else {\r\n pwd.type = 'password';\r\n }\r\n icon.classList.toggle('fa-eye-slash');\r\n }\r\n }\r\n checkbox.onclick = toggle;\r\n // For non-mouse usage\r\n checkbox.onkeydown = toggle;\r\n }\r\n\r\n function setupPwdTogglers() {\r\n var pwdInputs = document.querySelectorAll('input[type=password]');\r\n for (var i = 0; i < pwdInputs.length; i++) {\r\n makePwdToggler(pwdInputs[i]);\r\n }\r\n }\r\n\r\n setupPwdTogglers();\r\n\r\n/*------ Change Password Validation ------*/\r\n\r\n function delay(callback, ms) {\r\n var timer = 0;\r\n return function () {\r\n var context = this, args = arguments;\r\n clearTimeout(timer);\r\n timer = setTimeout(function () {\r\n callback.apply(context, args);\r\n }, ms || 0);\r\n };\r\n }\r\n\r\n var newPasswordInput = $('#newPassword');\r\n var reenterPasswordInput = $('#reenterPassword');\r\n\r\n function handlePasswordChange(e) {\r\n\r\n var validIconHtml = '