{"version":3,"sources":["../src/jquery-captcha.js"],"names":["$","fn","captcha","settings","_getHtml","ajax","method","url","captchaEndpoint","data","get","c","captchaStyleName","_validateUnsafe","captchaCode","onSuccess","instance","_getInstance","validationUrl","i","success","isCorrect","_registerUserInputBlurValidation","options","userInputID","on","trim","this","val","length","reloadImage","trigger","_getScript","extend","dataType","cache","_loadScriptIncludes","captchaId","done","setTimeout","_onLoadScriptsSuccess","_useUserInputBlurValidation","undefined","attr","window","botdetect","getInstanceByStyleName","_getCaptchaEndpointHandler","splited","split","_getBackendBaseUrl","captchaEndpointHandler","lastIndex","lastIndexOf","substring","_changeRelativeToAbsoluteUrls","originCaptchaHtml","backendUrl","replace","relativeUrl","relativeUrlPrefixPattern","absoluteUrl","relativeUrls","match","changedCaptchaHtml","slice","RegExp","_displayHtml","captchaHtml","element","html","Error","styleName","init","getCaptchaId","getCaptchaCode","userInput","value","getUserEnteredCaptchaCode","validateUnsafe","callback","isHuman","jQuery"],"mappings":"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","file":"jquery-captcha.min.js","sourcesContent":["(function($) {\r\n 'use strict';\r\n \r\n $.fn.captcha = function(settings) {\r\n \r\n var element = this;\r\n \r\n if (element.length === 0) {\r\n throw new Error('Captcha html element cound not be found.');\r\n }\r\n\r\n if (!settings || !settings.captchaEndpoint) {\r\n throw new Error('The captchaEndpoint setting is required.');\r\n }\r\n \r\n // normalize captcha endpoint path\r\n settings.captchaEndpoint = settings.captchaEndpoint.replace(/\\/+$/g, '');\r\n \r\n var captchaStyleName = _getCaptchaStyleName();\r\n \r\n // get captcha style name\r\n function _getCaptchaStyleName() {\r\n var styleName;\r\n\r\n styleName = element.data('captchastylename');\r\n if (styleName) {\r\n return styleName;\r\n }\r\n\r\n // backward compatibility\r\n styleName = element.data('stylename');\r\n if (styleName) {\r\n return styleName;\r\n }\r\n\r\n throw new Error('The data-captchastylename attribute is not found or its value is not set.');\r\n };\r\n \r\n // get captcha html markup\r\n function _getHtml() {\r\n return $.ajax({\r\n method: 'GET',\r\n url: settings.captchaEndpoint,\r\n data: {\r\n get: 'html',\r\n c: captchaStyleName\r\n }\r\n });\r\n };\r\n\r\n // ajax validate captcha\r\n function _validateUnsafe(captchaCode, onSuccess) {\r\n var instance = _getInstance();\r\n\r\n $.ajax({\r\n method: 'GET',\r\n url: instance.validationUrl,\r\n data: {\r\n i: captchaCode\r\n },\r\n success: function (isCorrect) {\r\n onSuccess(isCorrect);\r\n }\r\n });\r\n };\r\n \r\n // ajax validate captcha on blur event and trigging the \r\n // custom 'validatecaptcha' event to fire the validation result\r\n function _registerUserInputBlurValidation() {\r\n var instance = _getInstance();\r\n\r\n $('#' + instance.options.userInputID).on('blur', function() {\r\n var captchaCode = $.trim($(this).val());\r\n if (captchaCode.length === 0) { return; }\r\n\r\n var userInputID = this;\r\n _validateUnsafe(captchaCode, function(isCorrect) {\r\n if (!isCorrect) {\r\n instance.reloadImage();\r\n }\r\n $(userInputID).trigger('validatecaptcha', [isCorrect]);\r\n });\r\n });\r\n };\r\n \r\n // a custom of $.getScript(), which lets changing the options\r\n function _getScript(url, options) {\r\n options = $.extend({\r\n dataType: 'script',\r\n cache: false,\r\n url: url\r\n }, options || {});\r\n return $.ajax(options);\r\n };\r\n \r\n // load botdetect scripts and execute them\r\n function _loadScriptIncludes() {\r\n var captchaId = $('#BDC_VCID_' + captchaStyleName).val();\r\n var scriptIncludeUrl = settings.captchaEndpoint + '?get=script-include&c=' + captchaStyleName + '&t=' + captchaId + '&cs=2';\r\n _getScript(scriptIncludeUrl).done(function() {\r\n setTimeout(_onLoadScriptsSuccess, 200);\r\n });\r\n };\r\n \r\n // use user input blur validation if the input element has data-correct-captcha attribute\r\n function _useUserInputBlurValidation() {\r\n var instance = _getInstance();\r\n return ($('#' + instance.options.userInputID).attr('data-correct-captcha') !== undefined);\r\n };\r\n \r\n // fire the custom event when botdetect scripts are loaded\r\n function _onLoadScriptsSuccess() {\r\n if (_useUserInputBlurValidation()) {\r\n _registerUserInputBlurValidation();\r\n }\r\n }\r\n \r\n // get botdetect captcha client-side instance\r\n function _getInstance() {\r\n var instance = null;\r\n if (typeof window.botdetect !== 'undefined') {\r\n return window.botdetect.getInstanceByStyleName(captchaStyleName);\r\n }\r\n return instance;\r\n };\r\n\r\n // get captcha endpoint handler from configued captchaEndpoint value,\r\n // the result can be \"simple-captcha-endpoint.ashx\", \"botdetectcaptcha\",\r\n // or \"simple-botdetect.php\"\r\n function _getCaptchaEndpointHandler() {\r\n var splited = settings.captchaEndpoint.split('/');\r\n return splited[splited.length - 1];\r\n };\r\n\r\n // get backend base url from configued captchaEndpoint value\r\n function _getBackendBaseUrl(captchaEndpointHandler) {\r\n var lastIndex = settings.captchaEndpoint.lastIndexOf(captchaEndpointHandler);\r\n return settings.captchaEndpoint.substring(0, lastIndex);\r\n };\r\n\r\n // change relative to absolute urls in captcha html markup\r\n function _changeRelativeToAbsoluteUrls(originCaptchaHtml) {\r\n var captchaEndpointHandler = _getCaptchaEndpointHandler();\r\n var backendUrl = _getBackendBaseUrl(captchaEndpointHandler);\r\n\r\n originCaptchaHtml = originCaptchaHtml.replace(//g, '');\r\n var relativeUrls = originCaptchaHtml.match(/(src|href)=\\\"([^\"]+)\\\"/g);\r\n \r\n var relativeUrl, relativeUrlPrefixPattern, absoluteUrl,\r\n changedCaptchaHtml = originCaptchaHtml;\r\n\r\n for (var i = 0; i < relativeUrls.length; i++) {\r\n relativeUrl = relativeUrls[i].slice(0, -1).replace(/src=\\\"|href=\\\"/, '');\r\n relativeUrlPrefixPattern = new RegExp(\".*\" + captchaEndpointHandler);\r\n absoluteUrl = relativeUrl.replace(relativeUrlPrefixPattern, backendUrl + captchaEndpointHandler);\r\n changedCaptchaHtml = changedCaptchaHtml.replace(relativeUrl, absoluteUrl);\r\n }\r\n\r\n return changedCaptchaHtml;\r\n };\r\n \r\n // display captcha html markup in view\r\n function _displayHtml() {\r\n _getHtml(settings.captchaEndpoint, captchaStyleName).done(function(captchaHtml) {\r\n captchaHtml = _changeRelativeToAbsoluteUrls(captchaHtml) ;\r\n element.html(captchaHtml);\r\n _loadScriptIncludes();\r\n });\r\n }\r\n \r\n // plugin initialization - we display the captcha html markup in view\r\n element.init = function() {\r\n _displayHtml();\r\n return element;\r\n };\r\n \r\n // captcha id for validating captcha at server-side\r\n element.getCaptchaId = function() {\r\n var instance = _getInstance();\r\n return instance.captchaId;\r\n };\r\n\r\n // get the user entered captcha code\r\n // keep this function for backward compatibility\r\n element.getCaptchaCode = function() {\r\n var instance = _getInstance();\r\n return instance.userInput.value;\r\n };\r\n\r\n element.getUserEnteredCaptchaCode = function() {\r\n return element.getCaptchaCode();\r\n };\r\n \r\n // reload new captcha image\r\n element.reloadImage = function() {\r\n var instance = _getInstance();\r\n instance.reloadImage();\r\n };\r\n\r\n // validate captcha on client-side and execute user callback function on ajax success\r\n element.validateUnsafe = function(callback) {\r\n var instance = _getInstance();\r\n var captchaCode = $.trim($('#' + instance.options.userInputID).val());\r\n _validateUnsafe(captchaCode, function(isHuman) {\r\n callback(isHuman);\r\n if (!_useUserInputBlurValidation() && !isHuman) {\r\n instance.reloadImage();\r\n }\r\n });\r\n };\r\n\r\n return element.init();\r\n };\r\n \r\n}(jQuery));\r\n"]}