{"version":3,"sources":["javascripts/vendor.bundles/knockout.custom.bundle/knockout.custom.extenders.js","javascripts/vendor.bundles/knockout.custom.bundle/knockout.custom.bindinghandlers.js","javascripts/vendor.bundles/knockout.custom.bundle/knockout.custom.viewmodels.js","javascripts/vendor.bundles/knockout.custom.bundle/knockout.validation.extenders.js"],"names":["ko","extenders","inputByRegex","target","regex","result","pureComputed","read","write","newValue","current","valueToWrite","replace","notifySubscribers","extend","notify","fireOnce","fired","computed","isDirty","isDirtyFlag","formBehavior","options","formatThenValidate","formatted","unformatted","disallowedInput","format","defaultValue","default","number","parseFloat","isNaN","toFixed","length","substring","item","errorMessage","characterType","numeric","required","exactLength","displayName","minLength","maxLength","RegExp","test","regexMessage","numericLength","errorMessages","utils","arrayForEach","v","name","error","push","alkamiviewmodels","ErrorMessage","remove","hasError","observable","runOnInit","subscribe","isRequired","overrideMessage","summaryMessage","validate","isEmpty","requiredMessage","hasServerError","validationMessage","validationSummary","areEqual","ignoreCase","otherVal","toUpperCase","message","other","regexMatch","re","isregexmatch","subscribable","fn","trimmed","$","trim","this","value","valueHasMutated","owner","minimumValue","minValue","minimumMessage","bindingHandlers","autofocus","update","element","valueAccessor","attr","document","createElement","focus","removeAttr","readonly","enterKey","init","allBindings","viewModel","callback","keypress","event","which","keyCode","call","on","ctrlKey","shiftKey","preventDefault","currency","phone","fadeVisible","toggle","toJS","unwrap","fadeIn","fadeOut","KEY_CODE_NAME_MAP","13","32","37","38","39","40","46","91","145","keyPressHandlerFactory","handlers","data","e","bubbleAction","key","toLowerCase","altKeyName","handlerKey","Object","keys","find","prop","handlerName","stopPropogation","stopPropagation","bindingContext","newValueAccessor","keydown","models","id","template","isGlobalTemplate","isFirst","isLast","nextCallback","backCallback","steps","self","submitting","observableArray","step","WizardStep","currentStep","nextLabel","backLabel","nextStep","previousStep","canGoForward","canGoBack","moveForward","isFunction","moveBack","validation","rules","validator","val","registerExtenders"],"mappings":"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","file":"knockout.custom.bundle.min.js","sourcesContent":["/// Custom library of knockout extenders ///\r\n\r\nko.extenders.inputByRegex = function (target, regex) {\r\n //create a writable computed observable to intercept writes to our observable\r\n var result = ko.pureComputed({\r\n read: target, //always return the original observables value\r\n write: function (newValue) {\r\n var current = target(),\r\n valueToWrite = newValue.replace(regex, '');\r\n\r\n //only write if it changed\r\n //if the new value is the same, but a different value was written, force a notification for the current field\r\n if (valueToWrite !== current) {\r\n target(valueToWrite);\r\n } else if (newValue !== current) {\r\n target.notifySubscribers(valueToWrite);\r\n }\r\n }\r\n }).extend({ notify: 'always' });\r\n\r\n //initialize with current value\r\n result(target());\r\n\r\n //return the new computed observable\r\n return result;\r\n}\r\n\r\n// http://stackoverflow.com/questions/13701728/how-to-create-knockout-observable-subscription-that-fires-only-once\r\nko.extenders.fireOnce = function (target) {\r\n var fired = false;\r\n var result = ko.computed({\r\n read: target,\r\n write: function (newValue) {\r\n var current = target();\r\n if (newValue !== current && !fired) {\r\n fired = true;\r\n target(newValue);\r\n }\r\n }\r\n });\r\n result(target());\r\n return result;\r\n};\r\n\r\nko.extenders.isDirty = function (target, isDirtyFlag) {\r\n var result = ko.computed({\r\n read: target,\r\n write: function (newValue) {\r\n var current = target();\r\n if (newValue !== current) {\r\n target(newValue);\r\n if (isDirtyFlag) {\r\n isDirtyFlag(true);\r\n } else {\r\n console.error('isDirty extender does not have isDirtyFlag.');\r\n }\r\n }\r\n }\r\n });\r\n result(target());\r\n return result;\r\n};\r\n\r\nko.extenders.formBehavior = function (target, options) {\r\n //add some sub-observables to our observable\r\n target.hasError = ko.observable();\r\n target.error = ko.observable();\r\n target.unformatted = ko.observable();\r\n\r\n if (!options.displayName) {\r\n console.error('displayName is not provided. Cannot generate error messages.');\r\n }\r\n \r\n // required fields: \r\n // displayName: used to generate error messages\r\n //\r\n // optional validation fields:\r\n // required: value must be present and cannot be whitespace\r\n // length options: exactLength, minLength, maxLength (exactLength trumps min/max)\r\n // regex options: regex, regexMessage. regexMessage is not required, but defaults to 'DisplayName has an invalid format'\r\n // numericLength: the length of the digits (ignores non-numerics)\r\n //\r\n // optional formatting fields:\r\n // format: currency, phone\r\n // defaultValue: force it to take a default such as 0.00 for currency\r\n // disallowedInput: user can only type these values\r\n\r\n // formatting\r\n function formatThenValidate(newValue) {\r\n\r\n var formatted = newValue;\r\n var unformatted = newValue;\r\n\r\n // Treat nulls like empty strings\r\n if (newValue === null || typeof newValue === \"undefined\") {\r\n newValue = '';\r\n } else if (options.disallowedInput) {\r\n newValue = newValue.replace(options.disallowedInput, '');\r\n }\r\n\r\n switch (options.format) {\r\n case 'currency':\r\n var defaultValue = options.default || null;\r\n\r\n var number = parseFloat(newValue.replace(/[^0-9\\.]/g, ''));\r\n if (isNaN(number)) {\r\n formatted = defaultValue;\r\n unformatted = defaultValue;\r\n } else {\r\n unformatted = number.toFixed(2);\r\n formatted = unformatted.replace(/(\\d)(?=(\\d{3})+\\.)/g, '$1,'); // Add commas\r\n }\r\n\r\n break;\r\n case 'phone':\r\n\r\n unformatted = newValue.replace(/[^0-9]/g, '');\r\n if (unformatted.length === 0) {\r\n formatted = '';\r\n } else if (unformatted.length < 4) {\r\n formatted = unformatted.replace(/(\\d{1,3})/, '($1');\r\n } else if (unformatted.length < 7) {\r\n formatted = unformatted.replace(/(\\d{3})(\\d{1,3})/, '($1) $2');\r\n } else {\r\n formatted = unformatted.substring(0, 10).replace(/(\\d{3})(\\d{3})(\\d{0,4})/, '($1) $2-$3');\r\n }\r\n\r\n break;\r\n }\r\n\r\n // Now set any validation messages. Use the formatted value.\r\n var errorMessage = '';\r\n var characterType = options.numeric ? ' digits' : ' characters';\r\n\r\n newValue = formatted;\r\n\r\n if (options.required && (!newValue || !newValue.replace(/\\s/g, ''))) {\r\n errorMessage = options.displayName + ' is required.';\r\n } else if (newValue && newValue.length > 0) {\r\n if (options.exactLength && options.exactLength !== newValue.length) {\r\n errorMessage = options.displayName + ' must be ' + options.exactLength + characterType + ' long.';\r\n } else if (options.minLength && options.minLength > newValue.length) {\r\n errorMessage = options.displayName + ' must be at least ' + options.minLength + characterType + ' long.';\r\n } else if (options.maxLength && options.maxLength < newValue.length) {\r\n errorMessage = options.displayName + ' cannot be more than ' + options.maxLength + characterType + ' long.';\r\n } else if (options.regex && !RegExp(options.regex).test(newValue)) {\r\n errorMessage = options.regexMessage || options.displayName + ' has an invalid format.';\r\n } else if (options.numericLength && options.numericLength !== newValue.replace(/[^0-9]/g, '').length) {\r\n errorMessage = options.displayName + ' must be ' + options.numericLength + ' digits long.';\r\n }\r\n }\r\n\r\n // If we are using a grouped error message container, push it.\r\n if (options.errorMessages) {\r\n\r\n var item;\r\n ko.utils.arrayForEach(options.errorMessages(), function (v) {\r\n if (v.name() === options.displayName) {\r\n item = v;\r\n }\r\n });\r\n\r\n // If we need to add the error message and there is already an item, update it.\r\n // If we have an error message but no item, add it.\r\n // If we have no new error but we have an old item, remove it.\r\n if (errorMessage && item) {\r\n item.error(errorMessage);\r\n } else if (errorMessage) {\r\n options.errorMessages.push(new alkamiviewmodels.ErrorMessage({ name: options.displayName, error: errorMessage }));\r\n } else if (item) {\r\n options.errorMessages.remove(item);\r\n }\r\n }\r\n\r\n target.hasError(errorMessage !== '');\r\n target.error(errorMessage);\r\n target.unformatted(unformatted); // The clean, unformatted value is a sub-observable\r\n\r\n if (target() !== formatted) {\r\n target(formatted); // The observable shows the formatted result to the user\r\n }\r\n \r\n }\r\n\r\n // format and validate it.\r\n if (options.runOnInit) {\r\n formatThenValidate(target());\r\n }\r\n\r\n //validate whenever the value changes\r\n target.subscribe(formatThenValidate);\r\n\r\n //return the original observable\r\n return target;\r\n};\r\n\r\nko.extenders.isRequired = function (target, options) {\r\n var overrideMessage = '';\r\n var summaryMessage = '';\r\n\r\n if (typeof(options) === 'string') {\r\n overrideMessage = options;\r\n summaryMessage = overrideMessage;\r\n } else {\r\n overrideMessage = options.overrideMessage;\r\n summaryMessage = options.summaryMessage;\r\n }\r\n\r\n target.hasError = ko.observable();\r\n target.hasServerError = ko.observable();\r\n target.validationMessage = ko.observable();\r\n target.validationSummary = ko.observable();\r\n target.isEmpty = ko.observable();\r\n target.requiredMessage = ko.observable();\r\n\r\n function validate(newValue) {\r\n target.isEmpty(newValue ? false : true);\r\n target.requiredMessage(newValue ? \"\" : overrideMessage || \"This field is required\");\r\n if (target.isEmpty()) {\r\n target.hasServerError(false);\r\n target.validationMessage(target.requiredMessage());\r\n target.validationSummary(summaryMessage);\r\n }\r\n }\r\n validate(target());\r\n target.subscribe(validate);\r\n\r\n return target;\r\n};\r\n\r\nko.extenders.areEqual = function (target, options) {\r\n target.hasError = ko.observable();\r\n target.validationMessage = ko.observable();\r\n\r\n function validate(newValue) {\r\n if (options.ignoreCase && options.otherVal() != null && newValue != null)\r\n target.hasError(options.otherVal().toUpperCase() !== newValue.toUpperCase());\r\n else\r\n target.hasError(options.otherVal() !== newValue);\r\n\r\n target.validationMessage(!options.message ? '' : options.message || \"Values are not the same\");\r\n }\r\n validate(target());\r\n target.subscribe(validate);\r\n\r\n function otherChanged(other) {\r\n if (options.ignoreCase && other != null && target() != null)\r\n target.hasError(other.toUpperCase() !== target().toUpperCase());\r\n else\r\n target.hasError(other !== target());\r\n\r\n target.validationMessage(!options.message ? '' : options.message || \"Values are not the same\");\r\n }\r\n options.otherVal.subscribe(otherChanged);\r\n\r\n return target;\r\n};\r\n\r\nko.extenders.regexMatch = function (target, options) {\r\n target.hasError = ko.observable();\r\n target.isregexmatch = ko.observable();\r\n target.validationMessage = ko.observable();\r\n\r\n function validate(newValue) {\r\n var re = new RegExp(options.regex());\r\n target.hasError(!re.test(newValue));\r\n target.isregexmatch(!re.test(newValue));\r\n target.validationMessage(!options.message ? '' : options.message || \"Does not match pattern\");\r\n }\r\n validate(target());\r\n target.subscribe(validate);\r\n\r\n return target;\r\n};\r\n\r\nko.subscribable.fn.trimmed = function () {\r\n return ko.computed({\r\n read: function () {\r\n return $.trim(this());\r\n },\r\n write: function (value) {\r\n this($.trim(value));\r\n this.valueHasMutated();\r\n },\r\n owner: this\r\n }).extend({ notify: 'always' });\r\n};\r\n\r\nko.extenders.minimumValue = function (target, options) {\r\n target.hasError = ko.observable();\r\n target.validationMessage = ko.observable();\r\n target.validationSummary = ko.observable();\r\n\r\n function validate(newValue) {\r\n var hasError = false;\r\n var errorMessage = '';\r\n if (options.minValue())\r\n {\r\n var val = parseFloat(newValue.replace(/[^0-9.]/g, ''));\r\n if (val < options.minValue()) {\r\n errorMessage = options.minimumMessage() || \"This field does not meet the minimum value of \" + options.minValue();\r\n hasError = true;\r\n }\r\n }\r\n target.hasError(hasError);\r\n target.validationMessage(errorMessage);\r\n target.validationSummary(options.summaryMessage);\r\n }\r\n validate(target());\r\n target.subscribe(validate);\r\n\r\n return target;\r\n}","ko.bindingHandlers.autofocus = {\r\n update: function (element, valueAccessor) {\r\n if (valueAccessor()) {\r\n $(element).attr('autofocus', 'autofocus');\r\n\r\n // IE 9 doesn't support autofocus, but the iOS keyboard next/previous buttons don't work if .focus() is called.\r\n if (!('autofocus' in document.createElement('input')))\r\n $(element).focus();\r\n } else {\r\n $(element).removeAttr('autofocus');\r\n }\r\n }\r\n};\r\n\r\nko.bindingHandlers.readonly = {\r\n update: function (element, valueAccessor) {\r\n if (valueAccessor()) {\r\n $(element).attr('readonly', 'readonly');\r\n } else {\r\n $(element).removeAttr('readonly');\r\n }\r\n }\r\n};\r\n\r\n// Source: http://stackoverflow.com/questions/23087721/call-function-on-enter-key-press-knockout-js\r\nko.bindingHandlers.enterKey = {\r\n init: function (element, valueAccessor, allBindings, viewModel) {\r\n var callback = valueAccessor();\r\n $(element).keypress(function (event) {\r\n var keyCode = (event.which ? event.which : event.keyCode);\r\n if (keyCode === 13) {\r\n callback.call(viewModel);\r\n return false;\r\n }\r\n return true;\r\n });\r\n }\r\n};\r\n\r\n// numeric allows 0 through 9 only\r\nko.bindingHandlers.numeric = {\r\n init: function (element, valueAccessor) {\r\n $(element).on(\"keydown\", function (event) {\r\n // Allow: backspace, delete, tab, escape, and enter\r\n if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||\r\n // Allow: Ctrl+A, Ctrl+V, Ctrl+C, Ctrl+X\r\n ((event.keyCode == 65 || event.keyCode == 86 || event.keyCode == 67 || event.keyCode == 88) && event.ctrlKey === true) ||\r\n // Allow: home, end, left, right\r\n (event.keyCode >= 35 && event.keyCode <= 39)) {\r\n // let it happen, don't do anything\r\n return;\r\n }\r\n else {\r\n // Ensure that it is a number and stop the keypress\r\n if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\n// Currency allows 0 through 9, periods and commas\r\nko.bindingHandlers.currency = {\r\n init: function (element, valueAccessor) {\r\n $(element).on(\"keydown\", function (event) {\r\n // Allow: backspace, delete, tab, escape, and enter\r\n if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||\r\n // Allow: Ctrl+A, Ctrl+V, Ctrl+C, Ctrl+X\r\n ((event.keyCode == 65 || event.keyCode == 86 || event.keyCode == 67 || event.keyCode == 88) && event.ctrlKey === true) ||\r\n // Allow: . ,\r\n (event.keyCode == 188 || event.keyCode == 190 || event.keyCode == 110) ||\r\n // Allow: home, end, left, right\r\n (event.keyCode >= 35 && event.keyCode <= 39)) {\r\n // let it happen, don't do anything\r\n return;\r\n }\r\n else {\r\n // Ensure that it is a number and stop the keypress\r\n if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\n// phone allows 0 through 9 and +-() and space\r\nko.bindingHandlers.phone = {\r\n init: function (element, valueAccessor) {\r\n $(element).on(\"keydown\", function (event) {\r\n // Allow: backspace, delete, tab, escape, and enter\r\n if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||\r\n // Allow: Ctrl+A, Ctrl+V, Ctrl+C, Ctrl+X\r\n ((event.keyCode == 65 || event.keyCode == 86 || event.keyCode == 67 || event.keyCode == 88) && event.ctrlKey === true) ||\r\n // Allow: . - and space\r\n (event.keyCode == 190 || event.keyCode == 110 || event.keyCode == 32 || event.keyCode == 189) ||\r\n // Allow: + ( )\r\n (event.shiftKey && (event.keyCode == 187 || event.keyCode == 57 || event.keyCode == 48)) ||\r\n // Allow: home, end, left, right\r\n (event.keyCode >= 35 && event.keyCode <= 39)) {\r\n // let it happen, don't do anything\r\n return;\r\n }\r\n else {\r\n // Ensure that it is a number and stop the keypress\r\n if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\n// Custom ko binding that makes elements shown/hidden via jquery fadeIn/fadeOut\r\nko.bindingHandlers.fadeVisible = {\r\n init: function (element, valueAccessor) {\r\n var value = valueAccessor();\r\n $(element).toggle(ko.toJS(value));\r\n },\r\n update: function (element, valueAccessor) {\r\n var value = valueAccessor();\r\n ko.unwrap(value) ? $(element).fadeIn() : $(element).fadeOut();\r\n }\r\n};\r\n\r\n//Keypress event handler\r\n(function(){\r\n var KEY_CODE_NAME_MAP = {\r\n '13': 'Enter',\r\n '32': 'Spacebar',\r\n '37': 'Left',\r\n '38': 'Up',\r\n '39': 'Right',\r\n '40': 'Down',\r\n '46': 'Del',\r\n '91': 'OS',\r\n '145': 'Scroll'\r\n };\r\n\r\n var keyPressHandlerFactory = function (handlers) {\r\n var keyPressHandler = function (data, e) {\r\n var event = e || data; //this is so that we can support non-knockout event handlers.\r\n\r\n var bubbleAction = true;\r\n var keyCode = event.keyCode;\r\n var key = event.key.toLowerCase();\r\n var altKeyName = (KEY_CODE_NAME_MAP[keyCode] || key).toLowerCase();\r\n var handlerKey = Object.keys(handlers).find(function (prop) {\r\n var handlerName = prop.toLowerCase();\r\n return handlerName === keyCode || handlerName === key || handlerName === altKeyName;\r\n });\r\n\r\n if (handlerKey) {\r\n bubbleAction = handlers[handlerKey](data, event) || false;\r\n }\r\n\r\n //knockout uses jQuery by default. Let's handle the case where jQuery is not used.\r\n if (!bubbleAction && event.preventDefault && event.stopPropogation) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n //to support IE and jQuery's event structure.\r\n return bubbleAction;\r\n };\r\n\r\n return keyPressHandler;\r\n }\r\n\r\n var keyPressValueAccessorFactory = function (handlers) {\r\n return function () {\r\n return { keydown: keyPressHandlerFactory(handlers) };\r\n };\r\n };\r\n\r\n ko.bindingHandlers.keypress = {\r\n init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {\r\n var newValueAccessor = keyPressValueAccessorFactory(valueAccessor());\r\n return ko.bindingHandlers['event']['init'].call(this, element, newValueAccessor, allBindings, viewModel, bindingContext);\r\n }\r\n };\r\n})();\r\n","// Global KO view models. Used by forms, modals, etc.\r\nvar alkamiviewmodels = (function () {\r\n\r\n var models = {};\r\n\r\n models.WizardStep = function (data) {\r\n var self = this;\r\n\r\n self.id = ko.observable(data.id);\r\n self.template = ko.observable(data.template);\r\n self.isGlobalTemplate = ko.observable(data.isGlobalTemplate);\r\n self.isFirst = ko.observable(data.id === 0);\r\n self.isLast = ko.observable(data.isLast); // Multiple steps can be final steps\r\n\r\n self.nextCallback = data.nextCallback;\r\n self.backCallback = data.backCallback;\r\n }\r\n\r\n models.WizardModal = function (steps) {\r\n var self = this;\r\n\r\n /*** Observables and Computeds ***/\r\n self.submitting = ko.observable(false);\r\n self.steps = ko.observableArray([]);\r\n\r\n ko.utils.arrayForEach(steps, function (step) {\r\n self.steps.push(new models.WizardStep(step));\r\n });\r\n\r\n self.currentStep = ko.observable(self.steps()[0]); // Default to first step\r\n\r\n /*** Override these computeds to control movement and behavior ***/\r\n\r\n self.nextLabel = ko.computed(function () {\r\n if (self.currentStep().isLast()) {\r\n return self.submitting() ? 'Saving...' : 'Save';\r\n }\r\n\r\n return 'Next';\r\n });\r\n\r\n self.backLabel = ko.computed(function () {\r\n return 'Back';\r\n });\r\n\r\n self.nextStep = ko.computed(function () {\r\n // There is no next step if you are on the last step\r\n if (self.currentStep().isLast()) {\r\n return self.currentStep();\r\n }\r\n\r\n // Default to plus 1 step\r\n return self.steps()[(self.currentStep().id() + 1)];\r\n });\r\n\r\n self.previousStep = ko.computed(function () {\r\n // There is no previous step if you are on the first step\r\n if (self.currentStep().isFirst()) {\r\n return self.currentStep();\r\n }\r\n\r\n // Default to minus 1 step\r\n return self.steps()[(self.currentStep().id() - 1)];\r\n });\r\n \r\n self.canGoForward = ko.computed(function () {\r\n // Default to allow movement as long as you aren't submitting.\r\n return !self.submitting();\r\n });\r\n\r\n self.canGoBack = ko.computed(function () {\r\n // Default to allow movement as long as you aren't submitting.\r\n return !self.submitting();\r\n });\r\n\r\n /*** Movement Functions. Do not override! ***/\r\n\r\n self.moveForward = function () {\r\n if (self.canGoForward() && self.nextStep()) {\r\n\r\n if ($.isFunction(self.nextStep().nextCallback)) {\r\n self.nextStep().nextCallback();\r\n }\r\n\r\n self.currentStep(self.nextStep());\r\n }\r\n }\r\n\r\n self.moveBack = function () {\r\n if (self.canGoBack() && self.previousStep()) {\r\n\r\n if ($.isFunction(self.previousStep().backCallback)) {\r\n self.previousStep().backCallback();\r\n }\r\n\r\n self.currentStep(self.previousStep());\r\n }\r\n }\r\n }\r\n\r\n models.ErrorMessage = function (data) {\r\n var self = this;\r\n\r\n self.name = ko.observable(data.name); // The display name for the property.\r\n self.error = ko.observable(data.error); // The error message\r\n }\r\n\r\n return models;\r\n})();","ko.validation.rules['greaterThan'] = {\r\n validator: function (val, otherVal) {\r\n return val > otherVal;\r\n },\r\n message: 'The field must be greater than {0}'\r\n};\r\n\r\nko.validation.registerExtenders();"]}