{"version":3,"file":"kendo.captcha.min.js","sources":["kendo.captcha.js"],"sourcesContent":["(function (f, define) {\n define('kendo.captcha',[\"./kendo.core\", \"./kendo.slider\", \"./kendo.textbox\", \"./kendo.skeletoncontainer\"], f);\n})(function () {\n\n var __meta__ = { // jshint ignore:line\n id: \"captcha\",\n name: \"Captcha\",\n category: \"web\",\n description: \"The Captcha widget displays captcha validation image and an input so that user case be validated against captcha value.\",\n depends: [\"core\", \"slider\", \"textbox\", \"skeletoncontainer\"]\n };\n\n (function ($, undefined) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n extend = $.extend,\n ajax = $.ajax,\n isFunction = kendo.isFunction,\n\n STRING = \"string\",\n\n DOT = \".\",\n NS = DOT + \"kendoCaptcha\",\n\n CLICK = \"click\",\n BLUR = \"blur\",\n\n CHANGE = \"change\",\n REQUEST_START = \"requestStart\",\n REQUEST_END = \"requestEnd\",\n ERROR = \"error\";\n\n var CaptchaStyles = {\n wrapper: \"k-widget k-captcha\",\n textbox: \"k-textbox\",\n button: \"k-button k-button-md k-rounded-md k-button-solid k-button-solid-base\",\n buttonIcon: \"k-button-icon\",\n iconButton: \"k-icon-button\",\n resetIcon: \"k-icon k-i-reload\",\n audioIcon: \"k-icon k-i-volume-up\",\n disabled: \"k-state-disabled\",\n inputWrapper: \"k-captcha-input k-vstack\",\n imageWrapper: \"k-captcha-image-wrap k-hstack\",\n captchaImage: \"k-captcha-image\",\n buttonsWrapper: \"k-captcha-image-controls k-vstack\",\n volumeControlWrapper: \"k-captcha-volume-control k-vstack k-pos-absolute\",\n hidden: \"k-hidden\",\n success: \"k-captcha-validation-message k-text-success\",\n loading: \"k-captcha-loading\"\n };\n\n var Captcha = Widget.extend({\n init: function (element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that._captchaField = that.options.dataCaptchaField;\n that._valueField = that.element.attr(\"name\") || \"captcha\";\n that._captchaIdField = that.options.dataCaptchaIdField;\n\n that._wrapper();\n that._idInput();\n that._captchaImage();\n\n if(that.options.audioButton || that.options.resetButton) {\n that._buttons();\n\n }\n\n if (!that.options.captcha || !that.options.captchaId) {\n that._resetHandler();\n }\n\n if (that.options.validateOnBlur) {\n that.element.on(BLUR + NS, function() {\n that._validationHandler();\n });\n }\n\n that.element.on(CHANGE + NS, function(ev) {\n delete that._isValid;\n that.trigger(CHANGE, { value: that.element.val(), originalEvent: ev });\n });\n\n kendo.notify(that);\n },\n\n events: [\n CHANGE,\n REQUEST_START,\n REQUEST_END,\n ERROR\n ],\n\n options: {\n name: \"Captcha\",\n dataCaptchaField: \"captcha\",\n dataCaptchaIdField: \"captchaId\",\n captchaId: \"\",\n captcha: null,\n handler: null,\n audioHandler: null,\n validationHandler: null,\n validateOnBlur: false,\n resetButton: true,\n audioButton: true,\n volumeControl: true,\n messages: {\n reset: \"Reset captcha\",\n audio: \"Speak captcha\",\n imageAlt: \"Type the Captcha code from the image\",\n success: \"Verification successful\"\n }\n },\n\n destroy: function() {\n var that = this;\n\n that.textbox.destroy();\n\n if (that.resetButton) {\n that.resetButton.off(NS);\n }\n\n if (that.audioButton) {\n that.audioButton.off(NS);\n }\n\n that.element.off(NS);\n\n // Just in case, destroy slider.\n that._audioEnded();\n\n Widget.fn.destroy.call(that);\n },\n\n _wrapper: function () {\n var that = this,\n styles = Captcha.styles,\n wrapper = \"
\",\n imageWrapper = \"
\",\n cssText = that.element[0].style.cssText;\n\n that.element.css(\"width\", \"auto\");\n that.element.css(\"height\", \"auto\");\n that.textbox = that.element.kendoTextBox().data(\"kendoTextBox\");\n that._inputWrapper = that.textbox.wrapper;\n that.wrapper = that._inputWrapper.wrap(wrapper).parent().parent();\n that.wrapper[0].style.cssText = cssText;\n that.imageWrapper = $(imageWrapper);\n that.wrapper.prepend(that.imageWrapper);\n },\n\n _captchaImage: function () {\n var that = this,\n options = that.options,\n messages = options.messages,\n styles = Captcha.styles;\n\n\n that.captchaImage = $(\"
\" +\n \"\\\"\"\" +\n \"
\").find(\"img\");\n\n that.imageWrapper.append(that.captchaImage.parent());\n\n that._tabindex(that.captchaImage);\n },\n\n _idInput: function () {\n var that = this,\n options = that.options,\n nameAttr = that._captchaIdField;\n\n that.idInput = $(\"\");\n that._inputWrapper.after(that.idInput);\n },\n\n _buttons: function () {\n var that = this,\n styles = Captcha.styles;\n\n that.buttonsWrapper = $(\"
\");\n that.imageWrapper.append(that.buttonsWrapper);\n\n if(that.options.audioButton) {\n that._audioButton();\n }\n\n if(that.options.resetButton) {\n that._resetButton();\n }\n },\n\n _resetButton: function () {\n var that = this,\n messages = that.options.messages,\n styles = Captcha.styles;\n\n that.resetButton = $(\"\");\n\n that.buttonsWrapper.append(that.resetButton);\n\n that.resetButton.on(CLICK + NS, that._resetHandler.bind(that, true));\n },\n\n _audioButton: function () {\n var that = this,\n messages = that.options.messages,\n styles = Captcha.styles;\n\n that.audioButton = $(\"\");\n\n that.buttonsWrapper.append(that.audioButton);\n\n that.audioButton.on(CLICK + NS, that._audioHandler.bind(that));\n },\n\n _resetHandler: function (focusResetButton) {\n var that = this,\n handler = that.options.handler,\n deferred = $.Deferred(),\n success = that._resetCaptcha.bind(that, deferred);\n\n delete that._isValid;\n that._toggleSuccessMessage(false);\n that._audioEnded();\n that._progress(true);\n\n if (!handler) {\n window.console.error(\"Captcha's handler option is not defined!\");\n deferred.reject({ msg: \"Captcha's handler option is not defined!\", error: \"handler_not_defined\" });\n that._progress(false);\n return deferred.promise();\n }\n\n that._callHandler(\"reset\", handler, success)\n .done(function(){\n if (focusResetButton) {\n that.resetButton.trigger(\"focus\");\n }\n })\n .fail(function(args){\n that._progress(false);\n deferred.reject(args);\n });\n return deferred.promise();\n },\n\n _audioHandler: function () {\n var that = this,\n handler = that.options.audioHandler,\n deferred = $.Deferred(),\n success = that._playAudio.bind(that, deferred),\n data = {};\n\n data[that._captchaIdField] = that.idInput.val();\n\n if (!handler) {\n window.console.error(\"Captcha's audioHandler option is not defined!\");\n deferred.reject({ msg: \"Captcha's audioHandler option is not defined!\", error: \"handler_not_defined\" });\n return deferred.promise();\n }\n\n that._callHandler(\"audio\", handler, success, data).fail(deferred.reject);\n return deferred.promise();\n },\n\n _validationHandler: function () {\n var that = this,\n handler = that.options.validationHandler,\n deferred = $.Deferred(),\n success = that._validate.bind(that, deferred),\n data = {};\n\n delete that._isValid;\n\n data[that._captchaIdField] = that.idInput.val();\n data[that._valueField] = that.element.val();\n\n if (!handler) {\n window.console.error(\"Captcha's validationHandler option is not defined!\");\n deferred.reject({ msg: \"Captcha's validationHandler option is not defined!\", error: \"handler_not_defined\" });\n return deferred.promise();\n }\n\n that._callHandler(\"validation\", handler, success, data).fail(deferred.reject);\n return deferred.promise();\n },\n\n _callHandler: function(type, handler, success, data){\n var that = this,\n error = that._error.bind(that, type),\n requestEnd = that._requestEnd.bind(that, type),\n args;\n\n if (isFunction(handler)) {\n handler({success: success, data: data});\n return $.Deferred().promise();\n } else {\n args = typeof handler === STRING ? { url: handler, cache: false } : extend({}, handler);\n args.success = success;\n args.data = extend({}, data, args.data);\n\n if(!that.trigger(REQUEST_START, { type: type, data: data })){\n return ajax(args).done(requestEnd).fail(error);\n }\n }\n },\n\n _requestEnd: function (type, data) {\n var that = this;\n that.trigger(REQUEST_END, {type: type, data: data});\n },\n\n _error: function (type, jqXHR, textStatus, errorThrown) {\n var that = this;\n that.trigger(ERROR, {type: type, jqXHR: jqXHR, textStatus: textStatus, errorThrown: errorThrown});\n },\n\n _resetCaptcha: function (deferred, data) {\n var that = this,\n id = data[that._captchaIdField],\n captcha = data[that._captchaField];\n\n that.idInput.val(id);\n that.captchaImage.attr(\"src\", captcha || \"\");\n\n that.captchaImage.one(\"load\", function(){\n that._progress(false);\n });\n\n deferred.resolve(data);\n },\n\n _playAudio: function (deferred, data) {\n var that = this;\n\n if(that._canPlayWav()) {\n if(that.audioElement) {\n return;\n }\n\n that.audioElement = new Audio(data);\n that.audioElement.volume = that._audioVolume || that.audioElement.volume;\n\n if (that.options.volumeControl) {\n $(that.audioElement).on(\"loadeddata\" + NS, function () {\n that._showVolumeControl(that.audioElement.volume);\n });\n }\n\n $(that.audioElement).on(\"ended\" + NS + \" error\" + NS, that._audioEnded.bind(that, deferred));\n\n that.audioElement.play();\n } else if(that._canPlayWithPlugin()) {\n if(that.audioElement) {\n that.audioElement.play();\n return;\n }\n\n that.audioElement = that._createEmbedElement(data);\n that.wrapper.append(that.audioElement);\n }\n },\n\n _createEmbedElement: function(src) {\n var that = this,\n objectElement = document.createElement(\"embed\");\n\n objectElement.setAttribute(\"src\", src);\n objectElement.setAttribute(\"autostart\", \"true\");\n objectElement.setAttribute(\"pluginspage\", that._audioPlugin);\n objectElement.setAttribute(\"enablejavascript\", \"true\");\n objectElement.setAttribute(\"type\", \"audio/wav\");\n objectElement.setAttribute(\"tabIndex\", \"-1\");\n\n objectElement.style.width = \"0px\";\n objectElement.style.height = \"0px\";\n objectElement.style.position = \"absolute\";\n objectElement.style.top = 0;\n objectElement.style.left = 0;\n\n return objectElement;\n },\n\n _showVolumeControl: function (volume) {\n var that = this,\n styles = Captcha.styles,\n volumeControlWrapper = $(\"
\");\n\n if(that.volumeControl) {\n return;\n }\n\n that.volumeControlElm = $(\"\");\n that.volumeControlWrapper = volumeControlWrapper.append(that.volumeControlElm);\n that.imageWrapper.append(volumeControlWrapper);\n that.volumeControlWrapper.css(that._isRtl() ? \"right\" : \"left\", that.wrapper.width());\n\n that.volumeControl = that.volumeControlElm.kendoSlider({\n min: 0,\n max: 1,\n smallStep: 0.1,\n largeStep: 0.5,\n orientation: \"vertical\",\n showButtons: false,\n tickPlacement: \"none\",\n value: volume,\n tooltip: {\n enabled: false\n },\n change: function (ev) {\n that._audioVolume = that.audioElement.volume = ev.value;\n }\n }).data(\"kendoSlider\");\n },\n\n _audioEnded: function (deferred) {\n var that = this;\n\n if($(document.activeElement).is(\"a.k-draghandle\")) {\n that.audioButton.trigger(\"focus\");\n }\n\n if (that.volumeControl) {\n that.volumeControl.destroy();\n that.volumeControl.wrapper.remove();\n delete that.volumeControl;\n that.volumeControlElm.remove();\n that.volumeControlWrapper.remove();\n delete that.volumeControlElm;\n delete that.volumeControlWrapper;\n }\n\n if(that.audioElement) {\n that.audioElement.pause();\n }\n\n $(that.audioElement).off(NS);\n $(that.audioElement).remove();\n delete that.audioElement;\n\n if(deferred && deferred.resolve) {\n deferred.resolve();\n }\n },\n\n _canPlayWav: function () {\n var that = this,\n audio;\n\n if (that._canPlayAudio) {\n return that._canPlayAudio;\n }\n\n audio = new Audio();\n that._canPlayAudio = audio.canPlayType(\"audio/wav\").replace(/no/gi, \"\") !== \"\";\n\n return that._canPlayAudio;\n },\n\n _canPlayWithPlugin: function () {\n var that = this;\n\n if (that._audioPlugin) {\n return that._audioPlugin;\n }\n\n that._audioPlugin = that._getPlugin();\n return that._audioPlugin;\n },\n\n _getPlugin: function () {\n var testNavigatorPlugins = function (name) {\n var plugins = navigator.plugins;\n for (var i = 0; i < plugins.length; i++) {\n\n var pluginName = plugins[i].name;\n\n if (pluginName.indexOf(name) !== -1) {\n return true;\n }\n }\n return false;\n };\n\n var testActiveXAvailability = function (objectName) {\n try {\n var control = new window.ActiveXObject(objectName);\n return !!control;\n } catch (e) {\n return false;\n }\n };\n\n if (testActiveXAvailability('QuickTime.QuickTime') ||\n testActiveXAvailability('QuickTimeCheckObject.QuickTimeCheck') ||\n testNavigatorPlugins(\"QuickTime Plug-in\")) {\n return \"http://www.apple.com/quicktime/download/\";\n }\n\n if (testActiveXAvailability('WMPlayer.OCX') || testNavigatorPlugins(\"Windows Media\")) {\n return \"http://www.microsoft.com/Windows/MediaPlayer\";\n }\n },\n\n _validate: function (deferred, data) {\n var that = this;\n that._isValid = data;\n that._toggleSuccessMessage(that._isValid);\n deferred.resolve(data);\n },\n\n _toggleSuccessMessage: function (toggle) {\n var that = this,\n idAttr = (that.element.attr(\"id\") || that.element.attr(\"name\")) + \"-success\",\n messages = that.options.messages;\n\n $(that.successMessage).remove();\n that.element.removeAttr(\"aria-describedby\");\n\n if (toggle) {\n that.successMessage = $(\"\" + messages.success + \"\");\n that._inputWrapper.after(that.successMessage);\n that.element.attr(\"aria-describedby\", idAttr);\n }\n },\n\n _toggleButtons: function (toggle) {\n var that = this;\n\n if (that.resetButton) {\n that.resetButton.prop(\"disabled\", !toggle);\n }\n\n if (that.audioButton) {\n that.audioButton.prop(\"disabled\", !toggle);\n }\n },\n\n _progress: function (toggle) {\n var that = this;\n\n that.wrapper.toggleClass(Captcha.styles.loading, toggle);\n that._inputWrapper.toggleClass(Captcha.styles.disabled, toggle);\n that._toggleButtons(!toggle);\n that._toggleSkeleton(toggle);\n },\n\n _toggleSkeleton: function (toggle) {\n var that = this;\n\n if (that.skeleton) {\n that.skeleton.remove();\n }\n\n if (toggle) {\n that.skeleton = $(\"\");\n that.captchaImage.before(that.skeleton);\n }\n },\n\n _isRtl: function () {\n return kendo.support.isRtl(this.wrapper);\n },\n\n value: function () {\n return this.element.val();\n },\n\n getCaptchaId: function () {\n return this.idInput.val();\n },\n\n toJSON: function () {\n var that = this,\n obj = {};\n\n obj[that._valueField] = that.value();\n obj[that._captchaIdField] = that.getCaptchaId();\n\n return obj;\n },\n\n validate: function () {\n return this._validationHandler();\n },\n\n isValid: function () {\n return this._isValid;\n },\n\n enable: function (toggle) {\n var that = this;\n\n toggle = toggle !== false;\n\n that._toggleButtons(toggle);\n\n that.textbox.enable(toggle);\n\n if(toggle) {\n that.captchaImage.removeAttr(\"tabIndex\");\n that._tabindex(that.captchaImage);\n } else {\n that.captchaImage.attr(\"tabIndex\", \"-1\");\n }\n\n that.captchaImage.toggleClass(Captcha.styles.disabled, !toggle);\n that.wrapper.toggleClass(Captcha.styles.disabled, !toggle);\n },\n\n readonly: function (toggle) {\n var that = this;\n\n toggle = toggle !== false;\n\n if (that.resetButton) {\n that.resetButton.prop(\"disabled\", toggle);\n }\n\n that.textbox.readonly(toggle);\n },\n\n speak: function () {\n return this._audioHandler();\n },\n\n reset: function () {\n return this._resetHandler();\n }\n });\n\n kendo.ui.plugin(Captcha);\n\n extend(true, Captcha, { styles: CaptchaStyles });\n\n })(window.kendo.jQuery);\n\n return window.kendo;\n\n}, typeof define == 'function' && define.amd ? define : function(a1, a2, a3){ (a3 || a2)(); });\n\n"],"names":["define","__meta__","id","name","category","description","depends","$","window","kendo","jQuery","undefined","Widget","ui","extend","ajax","isFunction","STRING","DOT","NS","CLICK","BLUR","CHANGE","REQUEST_START","REQUEST_END","ERROR","CaptchaStyles","wrapper","textbox","button","buttonIcon","iconButton","resetIcon","audioIcon","disabled","inputWrapper","imageWrapper","captchaImage","buttonsWrapper","volumeControlWrapper","hidden","success","loading","Captcha","init","element","options","that","this","fn","call","_captchaField","dataCaptchaField","_valueField","attr","_captchaIdField","dataCaptchaIdField","_wrapper","_idInput","_captchaImage","audioButton","resetButton","_buttons","captcha","captchaId","_resetHandler","validateOnBlur","on","_validationHandler","ev","_isValid","trigger","value","val","originalEvent","notify","events","handler","audioHandler","validationHandler","volumeControl","messages","reset","audio","imageAlt","destroy","off","_audioEnded","styles","cssText","style","css","kendoTextBox","data","_inputWrapper","wrap","parent","prepend","find","append","_tabindex","nameAttr","idInput","ns","after","_audioButton","_resetButton","bind","_audioHandler","focusResetButton","deferred","Deferred","_resetCaptcha","_toggleSuccessMessage","_progress","console","error","reject","msg","promise","_callHandler","done","fail","args","_playAudio","_validate","type","_error","requestEnd","_requestEnd","url","cache","jqXHR","textStatus","errorThrown","one","resolve","_canPlayWav","audioElement","Audio","volume","_audioVolume","_showVolumeControl","play","_canPlayWithPlugin","_createEmbedElement","src","objectElement","document","createElement","setAttribute","_audioPlugin","width","height","position","top","left","volumeControlElm","_isRtl","kendoSlider","min","max","smallStep","largeStep","orientation","showButtons","tickPlacement","tooltip","enabled","change","activeElement","is","remove","pause","_canPlayAudio","canPlayType","replace","_getPlugin","testNavigatorPlugins","plugins","navigator","i","length","pluginName","indexOf","testActiveXAvailability","objectName","control","ActiveXObject","e","toggle","idAttr","successMessage","removeAttr","_toggleButtons","prop","toggleClass","_toggleSkeleton","skeleton","before","support","isRtl","getCaptchaId","toJSON","obj","validate","isValid","enable","readonly","speak","plugin","amd","a1","a2","a3"],"mappings":"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"}