{"version":3,"names":[],"mappings":"","sources":["controller.min.js"],"sourcesContent":["function FormTest() {\n \n}\n\nFormTest.prototype = {\n constructor: FormTest\n};\n\nFormTest.test = function(formElem) {\n for (var inputs = formElem.querySelectorAll('input[type=text],input[type=tel],input[type=email]'), i = 0;\n i < inputs.length;\n ++i) {\n inputs[i].value = 'test é input: ' + i;\n }\n\n for (var textAreas = formElem.querySelectorAll('textarea'), i = 0; i < textAreas.length; ++i) {\n textAreas[i].value = 'test é textarea: ' + i;\n }\n\n for (var select = formElem.querySelectorAll('select'), i = 0; i < select.length; ++i) {\n select[i].selectedIndex = 1;\n }\n}; function FormModal(userOptions) {\n\n this.options = {\n elemContainer: null\n }\n\n if (userOptions) {\n Global.extend(this.options, userOptions);\n }\n\n if (!this.options.elemContainer) {\n throw new Error('Cant find element container');\n }\n}\n\nFormModal.prototype = {\n constructor: FormModal,\n init: function() {\n var _this = this;\n var closeButtons = null;\n var i;\n\n try {\n closeButtons = this.options.elemContainer.querySelectorAll('.js-FormModal-button--close');\n for (i = 0; i < closeButtons.length; ++i) {\n closeButtons[i].addEventListener('click', function(e) {\n e.preventDefault();\n\n _this._onClickCloseButton();\n });\n }\n } catch (e) {\n \n }\n },\n _onClickCloseButton: function() {\n FormModal.closeModal(this.options.elemContainer);\n }\n};\n\nFormModal.openModal = function (elem) {\n Velocity(elem, 'fadeIn');\n}\n\nFormModal.closeModal = function (elem) {\n Velocity(elem, 'fadeOut');\n} /* global FileUploader:true */\n\nfunction FormJS(userOptions) {\n 'use strict';\n\n var _this = this;\n\n this.fileUpload = null;\n this.mask = null;\n\n this.httpRequest = null;\n\n this.answerElem = null;\n this.sendButtonElem = null;\n this.isSubmitButtonDisabled = false;\n\n this.options = {\n hasMask: true,\n hasFileupload: false,\n hasFieldValidation: true,\n classes: {\n answer: 'js-Form-answer',\n isRequired: 'js-Form-field--isRequired',\n sendButton: 'js-Form-submitButton',\n checkboxGroup: 'js-Form-checkboxs',\n radioGroup: 'js-Form-radios',\n fieldError: 'js-Form-field--error',\n fieldErrorCSS: 'Form-field--error',\n inputText: 'js-Form-field--input',\n textarea: 'js-Form-field--textArea',\n select: 'js-Form-field--select',\n fieldFocus: 'js-Form-focus',\n friendlyName: 'data-user-friendly-name',\n fieldErrorInfo: 'js-Form-errorInfo'\n },\n formElem: document.querySelector('.js-Form'),\n disable: this.isSubmitButtonDisabled,\n formSendOptions: {\n url: '',\n method: 'POST',\n /** The data that return from server can be 'html' or 'json' or 'text' */\n dataReturnType: 'json',\n headers: {}\n },\n messages: {\n emptyField: 'Este campo é obrigatório',\n invalidEmail: 'O email é inválido'\n },\n callbacks: {\n /** Ajax call returned error */\n onAjaxError: function () {\n },\n /** Ajax call returned success (before check if data has 'error' == true */\n onAjaxSuccess: function () {\n },\n /** Before sending */\n onAjaxBefore: function () {\n },\n /** After sending */\n onAjaxAfter: function () {\n },\n /** Data returned from AJAX has variable 'error' == true */\n onAjaxDataError: function () {\n },\n /** Data returned from AJAX has variable 'error' == false */\n onAjaxDataSuccess: function () {\n },\n /**\n * Validation of form returned error\n * @param {Array} errors List of erros\n */\n onValidationError: function (errors) {\n var fields = document.querySelectorAll('.' + _this.options.classes.fieldError);\n fields[0].focus();\n for (var i = 0; i < fields.length; i++) {\n _this._onKeyUpClearError(fields[i]);\n var errorElem = fields[i].parentElement.appendChild(document.createElement('p'));\n errorElem.innerHTML = errors[i];\n errorElem.classList.add('Form-errorInfo');\n errorElem.classList.add('js-Form-errorInfo');\n fields[i].parentElement.classList.add(_this.options.classes.fieldErrorCSS);\n }\n },\n },\n disableButtonOnSending: true,\n /** If the submit button will send by 'ajax' or by 'submit' */\n sendBy: FormJS.SEND_BY.ajax\n };\n\n if (userOptions) {\n Global.extend(this.options, userOptions);\n }\n\n if (this.options.formSendOptions.url === '') {\n throw new Error('URL is empty')\n }\n\n if (this.options.formSendOptions.method === '') {\n throw new Error('Method is empty');\n }\n\n if (!this.options.formElem || typeof this.options.formElem !== typeof {}) {\n throw new Error('Form element is invalid');\n }\n}\n\n/**\n * What type of send will be used. Ajax is by ajax. Submit is with the default form submit.\n * @type {{ajax: string, submit: string}}\n */\nFormJS.SEND_BY = {\n ajax: 'ajax',\n submit: 'submit'\n};\n\n/**\n * What type of data return is waited from ajax\n * @type {{html: string, text: string, json: string}}\n */\nFormJS.DATA_RETURN_TYPE = {\n html: 'html',\n text: 'text',\n json: 'json'\n};\n\nFormJS.prototype = {\n constructor: FormJS,\n init: function () {\n 'use strict';\n\n var _this = this;\n var i = 0;\n var fields;\n\n this.answerElem = this.options.formElem.querySelector('.' + this.options.classes.answer);\n this.sendButtonElem = this.options.formElem.querySelector('.' + this.options.classes.sendButton);\n\n if (this.options.hasMask) {\n this._initMask();\n }\n\n if (this.options.hasFileupload) {\n this._initFileUpload();\n }\n\n if (this.options.sendBy === FormJS.SEND_BY.ajax) {\n if (!this.sendButtonElem) {\n throw new Error('Cant find element send button');\n }\n\n this.sendButtonElem.addEventListener('click', function (e) {\n e.preventDefault();\n\n _this._sendForm(e);\n });\n }\n\n fields = this.options.formElem.querySelectorAll('.' + this.options.classes.fieldFocus);\n for (i = 0; i < fields.length; ++i) {\n fields[i].addEventListener('blur', function () {\n _this._onInputFocus(this);\n });\n }\n\n // Clear error class from field container\n var inputTextArea = this.options.formElem.querySelectorAll('.' + this.options.classes.inputText + ',' + '.' + this.options.classes.textarea);\n for (var i = 0; i < inputTextArea.length; ++i) {\n inputTextArea[i].addEventListener('keyup', function (e) {\n if (this.value !== '' && this.value !== '-1') {\n _this._onKeyUpClearError(this);\n }\n });\n }\n\n // Clear error class from field container\n var select = this.options.formElem.querySelectorAll('.' + this.options.classes.select);\n for (var i = 0; i < select.length; ++i) {\n select[i].addEventListener('change', function (e) {\n if (this.value !== '' && this.value !== '-1') {\n _this._onKeyUpClearError(this);\n }\n });\n }\n },\n\n _onKeyUpClearError: function(item) {\n if (item.parentElement.classList.contains(this.options.classes.fieldErrorCSS)) {\n item.parentElement.classList.remove(this.options.classes.fieldError);\n item.parentElement.classList.remove(this.options.classes.fieldErrorCSS);\n item.parentElement.removeChild(item.parentElement.querySelector('.' + this.options.classes.fieldErrorInfo));\n }\n },\n\n _onInputFocus: function (elem) {\n \"use strict\";\n if (elem.value) {\n elem.classList.add('used');\n }\n else {\n elem.classList.remove('used');\n }\n },\n _initMask: function () {\n 'use strict';\n\n },\n _initFileUpload: function () {\n 'use strict';\n\n this.fileUpload = new FileUploader();\n this.fileUpload.init();\n },\n _sendForm: function (e) {\n 'use strict'\n\n var postData = null;\n var data = {};\n var errors;\n var keys;\n var i;\n\n if (this.isSubmitButtonDisabled) {\n return;\n }\n this.isSubmitButtonDisabled = true;\n\n errors = this._processFieldData(data);\n if (errors && errors.length >= 0) {\n this.options.callbacks.onValidationError(errors);\n return;\n }\n\n this.options.callbacks.onAjaxBefore();\n\n this.httpRequest = new XMLHttpRequest();\n this.httpRequest.onreadystatechange = this._onAjaxProcess.bind(this);\n this.httpRequest.open(this.options.formSendOptions.method.toUpperCase(), this.options.formSendOptions.url);\n\n keys = Object.keys(this.options.formSendOptions.headers);\n for (i = 0; i < keys.length; ++i) {\n this.httpRequest.setRequestHeader(keys[i], this.options.formSendOptions.headers[keys[i]]);\n }\n\n this.httpRequest.setRequestHeader('content-type', 'application/json');\n\n if (this.options.formSendOptions.method.toUpperCase() === 'POST') {\n postData = JSON.stringify({ formData: data });\n }\n\n this.httpRequest.send(postData);\n\n this.options.callbacks.onAjaxAfter();\n },\n /**\n * Verify for erros in form and get fields data\n * @param data\n * @returns {Array} Array of errors\n * @private\n */\n _processFieldData: function (data) {\n 'use strict';\n\n if (this.options.hasFieldValidation) {\n var errors = this._validateFields();\n if (errors.length > 0) {\n return errors;\n }\n }\n\n this.getData(data);\n },\n /**\n * Get all fields data\n * @param data\n */\n getData: function (data) {\n 'use strict';\n\n var i;\n var allRadioGroups = this.options.formElem.querySelectorAll('.' + this.options.classes.radioGroup + ' input:checked');\n var allCheckGroups = this.options.formElem.querySelectorAll('.' + this.options.classes.checkboxGroup + ' input:checked');\n var allTextarea = this.options.formElem.querySelectorAll('textarea.' + this.options.classes.textarea);\n var allInputs = this.options.formElem.querySelectorAll('input.' + this.options.classes.inputText);\n var allSelect = this.options.formElem.querySelectorAll('select.' + this.options.classes.select);\n\n for (i = 0; i < allInputs.length; ++i) {\n data[allInputs[i].getAttribute('name')] = allInputs[i].value;\n }\n\n for (i = 0; i < allTextarea.length; ++i) {\n data[allTextarea[i].getAttribute('name')] = allTextarea[i].value;\n }\n\n for (i = 0; i < allCheckGroups.length; ++i) {\n data[allCheckGroups[i].getAttribute('name')] = allCheckGroups[i].value;\n }\n\n for (i = 0; i < allRadioGroups.length; ++i) {\n data[allRadioGroups[i].getAttribute('name')] = allRadioGroups[i].value;\n }\n\n for (i = 0; i < allSelect.length; ++i) {\n data[allSelect[i].getAttribute('name')] = allSelect[i].value;\n }\n },\n /**\n * Validate if fields has error\n * @returns {Array}\n * @private\n */\n _validateFields: function () {\n 'use strict';\n var i;\n var errors = [];\n var errorStr = '';\n\n var allRadioGroups = this.options.formElem.querySelectorAll('.' + this.options.classes.radioGroup + '.' + this.options.classes.isRequired);\n var allCheckGroups = this.options.formElem.querySelectorAll('.' + this.options.classes.checkboxGroup + '.' + this.options.classes.isRequired);\n var allTextarea = this.options.formElem.querySelectorAll('textarea.' + this.options.classes.isRequired);\n var allInputs = this.options.formElem.querySelectorAll('input.' + this.options.classes.isRequired);\n var allSelect = this.options.formElem.querySelectorAll('select.' + this.options.classes.isRequired);\n\n for (i = 0; i < allInputs.length; ++i) {\n errorStr = this._validateInputText(allInputs[i]);\n if (errorStr !== '') {\n errors.push(errorStr);\n } else {\n this._removeErrorFromField(allInputs[i]);\n }\n }\n\n for (i = 0; i < allTextarea.length; ++i) {\n errorStr = this._validateTextarea(allTextarea[i]);\n if (errorStr !== '') {\n errors.push(errorStr);\n } else {\n this._removeErrorFromField(allTextarea[i]);\n }\n }\n\n for (i = 0; i < allCheckGroups.length; ++i) {\n errorStr = this._validateInputCheckbox(allCheckGroups[i]);\n if (errorStr !== '') {\n errors.push(errorStr);\n } else {\n this._removeErrorFromField(allCheckGroups[i]);\n }\n }\n\n for (i = 0; i < allRadioGroups.length; ++i) {\n errorStr = this._validateInputRadio(allRadioGroups[i]);\n if (errorStr !== '') {\n errors.push(errorStr);\n } else {\n this._removeErrorFromField(allRadioGroups[i]);\n }\n }\n\n for (i = 0; i < allSelect.length; ++i) {\n errorStr = this._validateSelect(allSelect[i]);\n if (errorStr !== '') {\n errors.push(errorStr);\n } else {\n this._removeErrorFromField(allSelect[i]);\n }\n }\n\n return errors;\n },\n /**\n * Validate if select has error\n * @param {Element} fieldElem Select field\n * @return {string} Error\n * @private\n */\n _validateSelect: function (fieldElem) {\n 'use strict';\n\n if (fieldElem.value === '-1') {\n this._putFieldErrorClass(fieldElem);\n return this._getEmptyFieldError(fieldElem);\n }\n\n return '';\n },\n /**\n * Validate if textarea has error\n * @param fieldElem\n * @returns {*}\n * @private\n */\n _validateTextarea: function (fieldElem) {\n 'use strict';\n\n if (fieldElem.value === '') {\n this._putFieldErrorClass(fieldElem);\n return this._getEmptyFieldError(fieldElem);\n }\n\n return '';\n },\n\n /**\n * Validate if input text has error\n * @param fieldElem\n * @returns {*}\n * @private\n */\n _validateInputText: function (fieldElem) {\n 'use strict';\n\n if (fieldElem.value === '') {\n this._putFieldErrorClass(fieldElem);\n return this._getEmptyFieldError(fieldElem);\n }\n\n return '';\n },\n\n /**\n * Validate if checkbox has error\n * @param groupElem\n * @returns {*}\n * @private\n */\n _validateInputCheckbox: function (groupElem) {\n 'use strict';\n\n if (groupElem.querySelectorAll('input:checked').length === 0) {\n this._putFieldErrorClass(groupElem);\n return this._getEmptyFieldError(groupElem);\n }\n\n groupElem.classList.remove(this.options.classes.fieldError);\n return '';\n },\n\n /**\n * Validate if radio button has error\n * @param groupElem\n * @returns {*}\n * @private\n */\n _validateInputRadio: function (groupElem) {\n 'use strict';\n\n if (groupElem.querySelectorAll('input:checked').length === 0) {\n this._putFieldErrorClass(groupElem);\n return this._getEmptyFieldError(groupElem);\n }\n\n groupElem.classList.remove(this.options.classes.fieldError);\n return '';\n },\n\n /**\n * Create error message to empty fields\n * @param elem\n * @returns {string|*}\n * @private\n */\n _getEmptyFieldError: function (elem) {\n 'use strict';\n\n return this.options.messages.emptyField;\n },\n\n /**\n * Remove error style from field\n * @param elem\n * @private\n */\n _removeErrorFromField: function (elem) {\n 'use strict';\n\n elem.classList.remove(this.options.classes.fieldError);\n// elem.parentElement.querySelector('p').innerHTML = '';\n elem.parentElement.classList.remove(this.options.classes.fieldError);\n },\n\n /**\n * Put error class in field with error\n * @param elem\n * @private\n */\n _putFieldErrorClass: function (elem) {\n 'use strict';\n\n elem.classList.add(this.options.classes.fieldError);\n },\n _onAjaxProcess: function () {\n 'use strict';\n\n var returnData;\n\n if (this.httpRequest.readyState === XMLHttpRequest.DONE) {\n this.isSubmitButtonDisabled = false;\n\n if (this.httpRequest.status === 200) {\n if (this.options.formSendOptions.dataReturnType === FormJS.DATA_RETURN_TYPE.json) {\n this.options.callbacks.onAjaxSuccess(this.httpRequest);\n\n returnData = this.httpRequest.responseText;\n if (returnData.error) {\n this.options.callbacks.onAjaxDataError(this.httpRequest);\n } else {\n this.options.callbacks.onAjaxDataSuccess(this.httpRequest);\n }\n// this.answerElem.innerHTML = returnData;\n }\n } else {\n this.options.callbacks.onAjaxError(this.httpRequest);\n }\n }\n }\n};\n function FileUploader(userOptions) {\n\t'use strict';\n\n\tvar _this = this;\n\n\tthis.fileUpload = null;\n\tthis.fileuploadContainer = null;\n\tthis.templateContainer = null;\n this.listContainer = null;\n\n this.hasList = false;\n this.hasTemplate = false;\n\n\t/*\n\t [] = DOM block element\n\t */\n\tthis.files = [];\n\n\tthis.options = {\n\t\tcomponentContainer: null,\n\t\tclasses: {\n\t\t\tanimation: {\n\t\t\t\tuploaderButton: 'ImageUploader-uploader--mini'\n\t\t\t},\n\t\t\tuploaderContainer: 'js-ImageUploader-uploader',\n\t\t\tlistContainer: 'js-ImageUploader-list',\n\t\t\tcomponentContainer: 'js-ImageUploader',\n\t\t\ttemplateContainer: 'js-ImageUploader-template',\n\t\t\ttemplate: {\n\t\t\t\timg: 'js-BlockImage-image',\n\t\t\t\tinput: {\n\t\t\t\t\tfileName: 'js-BlockImage-inputFileName',\n\t\t\t\t\tID: 'js-BlockImage-inputID',\n\t\t\t\t},\n\t\t\t\tdeleteButton: 'js-BlockImage-buttonDelete a'\n\t\t\t}\n\t\t},\n\t\tcallbacks: {\n\t\t\t/**\n\t\t\t * Return an object\n\t\t\t */\n\t\t\tonAddParamsBeforeSubmit: null,\n\t\t\tonBeforeAppendTemplate: null,\n\t\t\tonComplete: null,\n\t\t\t/** function (this.files[id], uploadedBytes, totalBytes) */\n\t\t\tonFileProgress: null\n\t\t},\n\t\tfileUploadOptions: {\n\t\t\tautoUpload: true,\n\t\t\t/** Specify an element to use as the 'select files' button. Cannot be a