{"version":3,"file":"js/application-33614d56e6472d19662a.js","sources":["webpack:///webpack/bootstrap","webpack:///./app/javascript/controllers sync _controller\\.js$","webpack:///./app/javascript/controllers/index.js","webpack:///./app/javascript/init/clearForm.js","webpack:///./app/javascript/init/controllers sync _controller\\.js$","webpack:///./app/javascript/init/controllers/ac_controller.js","webpack:///./app/javascript/init/controllers/auto_submit_controller.js","webpack:///./app/javascript/init/controllers/check_all_controller.js","webpack:///./app/javascript/init/controllers/ckeditor_controller.js","webpack:///./app/javascript/init/controllers/conditional_toggle_controller.js","webpack:///./app/javascript/init/controllers/tooltip_controller.js","webpack:///./app/javascript/init/controllers/uploader_controller.js","webpack:///./app/javascript/init/datePicker.js","webpack:///./app/javascript/init/flashMessages.js","webpack:///./app/javascript/init/index.js","webpack:///./app/javascript/init/masks.js","webpack:///./app/javascript/init/modals.js","webpack:///./app/javascript/init/select2Setup.js","webpack:///./app/javascript/lib/fileuploader.js","webpack:///./app/javascript/lib/jquery.maskMoney.js","webpack:///./app/javascript/packs/application.js","webpack:///./node_modules/@popperjs/core/lib/createPopper.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/contains.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getWindow.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","webpack:///./node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","webpack:///./node_modules/@popperjs/core/lib/enums.js","webpack:///./node_modules/@popperjs/core/lib/index.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/applyStyles.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/arrow.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/computeStyles.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/eventListeners.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/flip.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/hide.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/index.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/offset.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","webpack:///./node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","webpack:///./node_modules/@popperjs/core/lib/popper-lite.js","webpack:///./node_modules/@popperjs/core/lib/popper.js","webpack:///./node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/computeOffsets.js","webpack:///./node_modules/@popperjs/core/lib/utils/debounce.js","webpack:///./node_modules/@popperjs/core/lib/utils/detectOverflow.js","webpack:///./node_modules/@popperjs/core/lib/utils/expandToHashMap.js","webpack:///./node_modules/@popperjs/core/lib/utils/format.js","webpack:///./node_modules/@popperjs/core/lib/utils/getAltAxis.js","webpack:///./node_modules/@popperjs/core/lib/utils/getBasePlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","webpack:///./node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","webpack:///./node_modules/@popperjs/core/lib/utils/getVariation.js","webpack:///./node_modules/@popperjs/core/lib/utils/mergeByName.js","webpack:///./node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","webpack:///./node_modules/@popperjs/core/lib/utils/orderModifiers.js","webpack:///./node_modules/@popperjs/core/lib/utils/rectToClientRect.js","webpack:///./node_modules/@popperjs/core/lib/utils/uniqueBy.js","webpack:///./node_modules/@popperjs/core/lib/utils/validateModifiers.js","webpack:///./node_modules/@popperjs/core/lib/utils/within.js","webpack:///./node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js-exposed","webpack:///./node_modules/@stimulus/core/dist/action.js","webpack:///./node_modules/@stimulus/core/dist/action_descriptor.js","webpack:///./node_modules/@stimulus/core/dist/application.js","webpack:///./node_modules/@stimulus/core/dist/binding.js","webpack:///./node_modules/@stimulus/core/dist/binding_observer.js","webpack:///./node_modules/@stimulus/core/dist/blessing.js","webpack:///./node_modules/@stimulus/core/dist/class_map.js","webpack:///./node_modules/@stimulus/core/dist/class_properties.js","webpack:///./node_modules/@stimulus/core/dist/context.js","webpack:///./node_modules/@stimulus/core/dist/controller.js","webpack:///./node_modules/@stimulus/core/dist/data_map.js","webpack:///./node_modules/@stimulus/core/dist/definition.js","webpack:///./node_modules/@stimulus/core/dist/dispatcher.js","webpack:///./node_modules/@stimulus/core/dist/event_listener.js","webpack:///./node_modules/@stimulus/core/dist/guide.js","webpack:///./node_modules/@stimulus/core/dist/index.js","webpack:///./node_modules/@stimulus/core/dist/inheritable_statics.js","webpack:///./node_modules/@stimulus/core/dist/module.js","webpack:///./node_modules/@stimulus/core/dist/router.js","webpack:///./node_modules/@stimulus/core/dist/schema.js","webpack:///./node_modules/@stimulus/core/dist/scope.js","webpack:///./node_modules/@stimulus/core/dist/scope_observer.js","webpack:///./node_modules/@stimulus/core/dist/selectors.js","webpack:///./node_modules/@stimulus/core/dist/string_helpers.js","webpack:///./node_modules/@stimulus/core/dist/target_properties.js","webpack:///./node_modules/@stimulus/core/dist/target_set.js","webpack:///./node_modules/@stimulus/core/dist/value_observer.js","webpack:///./node_modules/@stimulus/core/dist/value_properties.js","webpack:///./node_modules/@stimulus/multimap/dist/index.js","webpack:///./node_modules/@stimulus/multimap/dist/indexed_multimap.js","webpack:///./node_modules/@stimulus/multimap/dist/multimap.js","webpack:///./node_modules/@stimulus/multimap/dist/set_operations.js","webpack:///./node_modules/@stimulus/mutation-observers/dist/attribute_observer.js","webpack:///./node_modules/@stimulus/mutation-observers/dist/element_observer.js","webpack:///./node_modules/@stimulus/mutation-observers/dist/index.js","webpack:///./node_modules/@stimulus/mutation-observers/dist/string_map_observer.js","webpack:///./node_modules/@stimulus/mutation-observers/dist/token_list_observer.js","webpack:///./node_modules/@stimulus/mutation-observers/dist/value_list_observer.js","webpack:///./node_modules/@stimulus/webpack-helpers/dist/index.js","webpack:///./node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js","webpack:///./node_modules/jquery/dist/jquery.js","webpack:///./node_modules/bootstrap/dist/js/bootstrap.esm.js","webpack:///./node_modules/jquery/dist/jquery.js-exposed","webpack:///./node_modules/flatpickr/dist/esm/index.js","webpack:///./node_modules/flatpickr/dist/esm/l10n/default.js","webpack:///./node_modules/flatpickr/dist/esm/types/options.js","webpack:///./node_modules/flatpickr/dist/esm/utils/dates.js","webpack:///./node_modules/flatpickr/dist/esm/utils/dom.js","webpack:///./node_modules/flatpickr/dist/esm/utils/formatting.js","webpack:///./node_modules/flatpickr/dist/esm/utils/index.js","webpack:///./node_modules/flatpickr/dist/esm/utils/polyfills.js","webpack:///./node_modules/flatpickr/dist/l10n/pt.js","webpack:///./node_modules/jquery-mask-plugin/dist/jquery.mask.js","webpack:///./node_modules/jquery/dist/jquery.js-exposed?ec18","webpack:///./node_modules/select2/dist/js/i18n/pt-BR.js","webpack:///./node_modules/select2/dist/js/select2.js","webpack:///./node_modules/stimulus/index.js","webpack:///./node_modules/stimulus/webpack-helpers.js","webpack:///./node_modules/turbolinks/dist/turbolinks.js","webpack:///(webpack)/buildin/global.js"],"sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/packs/\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./app/javascript/packs/application.js\");\n","function webpackEmptyContext(req) {\n\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\te.code = 'MODULE_NOT_FOUND';\n\tthrow e;\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = \"./app/javascript/controllers sync recursive _controller\\\\.js$\";","// Load all the controllers within this directory and all subdirectories.\n// Controller files must be named *_controller.js.\n\nimport { Application } from \"stimulus\"\nimport { definitionsFromContext } from \"stimulus/webpack-helpers\"\n\nconst application = Application.start()\nconst context = require.context(\"controllers\", true, /_controller\\.js$/)\napplication.load(definitionsFromContext(context))\n\nconst init_context = require.context(\"init/controllers\", true, /_controller\\.js$/)\napplication.load(definitionsFromContext(init_context))","export default () => {\n\n $(\".simple_form .clear\").on(\"click\", (e) => {\n e.preventDefault();\n\n $(\".simple_form input[type=text]\").each(function() {\n $(this).val(\"\");\n });\n\n $(\".simple_form input[type=checkbox]\").each(function() {\n $(this).prop(\"checked\", false);\n });\n\n $(\".simple_form select\").each(function() {\n $(this)\n .not(\".custom_select\")\n .val(null)\n .trigger(\"change\");\n });\n\n $(\".custom_select\").each(function() {\n $(this).val([]);\n });\n\n });\n\n}\n","var map = {\n\t\"./ac_controller.js\": \"./app/javascript/init/controllers/ac_controller.js\",\n\t\"./auto_submit_controller.js\": \"./app/javascript/init/controllers/auto_submit_controller.js\",\n\t\"./check_all_controller.js\": \"./app/javascript/init/controllers/check_all_controller.js\",\n\t\"./ckeditor_controller.js\": \"./app/javascript/init/controllers/ckeditor_controller.js\",\n\t\"./conditional_toggle_controller.js\": \"./app/javascript/init/controllers/conditional_toggle_controller.js\",\n\t\"./tooltip_controller.js\": \"./app/javascript/init/controllers/tooltip_controller.js\",\n\t\"./uploader_controller.js\": \"./app/javascript/init/controllers/uploader_controller.js\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"./app/javascript/init/controllers sync recursive _controller\\\\.js$\";","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n static targets = [ \"parent\", \"child\" ]\n\n connect() {\n\n $(this.parentTarget).on('change', (e) => {\n if (this.selectedParent) {\n this.childTargets.forEach(t => this.fetchChildren(t))\n } else {\n this.childTargets.forEach(t => this.clearItens(t))\n }\n })\n\n if (this.selectedParent) this.childTargets.forEach(t => this.fetchChildren(t))\n\n }\n\n fetchChildren(target) {\n $.get({\n url: target.dataset.url,\n data: { parent_id: this.selectedParent }\n })\n .done( (response) => this.setItens(response, target) )\n }\n\n setItens(itens, target) {\n const options = itens.map(item => new Option(item.nome, item.id, false, false))\n target.innerHTML = \"\"\n $(target).append(options).trigger('change');\n\n if (itens.length == 1) {\n $(target).val(itens[0].id).trigger('change');\n } else {\n $(target).val(target.dataset.preSelected).trigger('change');\n }\n }\n\n clearItens(target) {\n target.innerHTML = \"\";\n $(target).val(null).trigger('change');\n }\n\n get selectedParent() {\n return this.parentTarget.value\n }\n\n}\n","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n static targets = [ \"form\", \"input\", \"select2\" ]\n\n connect() {\n this.inputTargets.forEach(t => {\n t.addEventListener('change', e => this.formTarget.submit())\n // t.addEventListener('change', e => console.log(e))\n })\n\n this.select2Targets.forEach(t => {\n $(t).on('select2:select', e => this.formTarget.submit())\n $(t).on('select2:clear', e => this.formTarget.submit())\n })\n\n }\n\n}\n","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n static targets = [ \"main\", \"check\" ]\n\n connect() {\n this.mainTarget.addEventListener('change', e => this.toggle())\n }\n\n toggle() {\n this.checkTargets.forEach(t => {\n if (!t.disabled)\n t.checked = this.mainTarget.checked\n })\n }\n\n}\n","// import { Controller } from \"stimulus\"\n// import \"../../lib/ckeditor\"\n\n// export default class extends Controller {\n// static targets = [ \"input\" ]\n\n// static toolbar_simple = [\n// \t'bold',\n// \t'italic',\n// \t'strikethrough',\n// \t'code',\n// \t'link',\n// \t'|',\n// \t'bulletedList',\n// \t'numberedList',\n// \t'|',\n// \t'removeFormat',\n// \t'undo',\n// \t'redo'\n// ]\n\n// static toolbar_odf = [\n// 'bold',\n// \t'italic',\n// \t'underline',\n// \t'|',\n// \t'blockQuote',\n// \t'|',\n// \t'removeFormat',\n// \t'undo',\n// \t'redo'\n// ]\n\n// connect() {\n// this.setupEditor()\n// }\n\n// setupEditor(initialData) {\n// var editor_options = {\n// toolbar: {\n// items: toolbar,\n// viewportTopOffset: 107\n// }\n// }\n\n// if (!this.data.has('toolbar') || this.data.get('toolbar') == 'odf') {\n// editor_options.toolbar.items = this.constructor.toolbar_odf\n// } else {\n// editor_options.toolbar.items = this.constructor.toolbar_simple\n// }\n\n// ClassicEditor\n// .create( this.inputTarget, editor_options )\n// .then( editor => {\n// // console.log( editor );\n// } )\n// .catch( error => {\n// console.error( error );\n// } )\n// }\n\n// }\n","import { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n static targets = [ \"field\", \"toggle\" ]\n\n\n connect() {\n if (this.hasFieldTarget) {\n\n $(this.fieldTarget).on('change', (e) => {\n this.onChangeValue(this.fieldTarget.value)\n })\n\n this.onChangeValue(this.fieldTarget.value)\n\n } else if (this.data.has('initial-value')) {\n this.onChangeValue(this.data.get('initial-value'))\n }\n }\n\n onChangeValue(value) {\n this.value = value\n this.toggleTargets.forEach(t => this.toggle(t))\n }\n\n change(event) {\n this.onChangeValue(event.target.value)\n }\n\n toggle(t) {\n const showToggle = (this.data.has('boolean') && this.fieldTarget.checked) || // field é um checkBox\n this.includeValue(this.data.get('show-value')) || // show-value geral, definido no controller\n this.includeValue(t.dataset.showValue) || // show-value específico, definido no proprio toggleTarget\n this.notIncludeValue(this.data.get('hide-value')) || // hide-value geral, definido no controller\n this.notIncludeValue(t.dataset.hideValue) // hide-value específico, definido no proprio toggleTarget\n\n if (showToggle) {\n this.show(t)\n } else {\n this.hide(t)\n }\n }\n\n show(el) { el.style.display = 'block'; }\n hide(el) { el.style.display = 'none'; }\n\n includeValue(where) {\n return where && where.split('|').includes(this.value)\n }\n\n notIncludeValue(where) {\n return where && ! where.split('|').includes(this.value)\n }\n\n}\n\n//
\n//\n// <%= f.input :contrato, as: :boolean, wrapper: :vertical_form,\n// label: false,\n// input_html: {\n// data: { target: 'conditional-toggle.field' }\n// } %>\n//\n//
\n// <%= f.input :numero_contrato %>\n//
\n//\n//
\n","import \"bootstrap\";\nimport { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n connect() {\n $(this.element).tooltip();\n }\n}\n","import qq from \"../../lib/fileuploader\";\n\nimport { Controller } from \"stimulus\"\n\nexport default class extends Controller {\n static targets = [ \"button\" ]\n\n connect() {\n\n const uploader = new qq.FileUploaderBasic({\n button: (this.hasButtonTarget ? this.buttonTarget : this.element),\n action: this.data.get(\"url\"),\n multiple: false,\n debug: false,\n method: this.httpMetohd,\n params: {\n authenticity_token: $(\"meta[name='csrf-token']\").attr(\"content\")\n },\n onSubmit: this.onSubmit,\n onComplete: this.onComplete\n })\n\n }\n\n onSubmit() {\n console.log('implementar onSubmit na subclasse')\n }\n\n onComplete(id, fileName, response) {\n console.log('implementar onComplete na subclasse')\n // $('#arquivos_pedido').load('<%= pedido_arquivos_path(@pedido) %>');\n }\n\n get httpMetohd() { return 'POST' }\n\n}\n\n\n// Usar subclasse desse controller para tratar a UI especificamente para cada caso\n//\n// ex: controllers/pedido/arquivos_controller.js\n//\n// import UploaderController from \"../uploader_controller\";\n//\n// export default class extends UploaderController {\n//\n// onSubmit() {\n// // console.log('implementacao complexa de onSubmit')\n// }\n//\n// onComplete(id, fileName, json) {\n// $('#arquivos_pedido').html(json.html)\n// }\n//\n// }\n//\n// ---------------------------------------------\n// na view:\n//\n// <%= button_tag icon(:plus, 'Adicionar Arquivo'),\n// class: 'btn btn-success',\n// data: {\n// controller: 'pedido--arquivos',\n// 'pedido--arquivos-url': pedido_arquivos_path(@pedido)\n// } %>\n","import flatpickr from \"flatpickr\";\nimport \"flatpickr/dist/l10n/pt\";\n\nexport default function() {\n\n document.querySelectorAll('.datepicker').forEach(e => {\n const min = e.dataset.minDate;\n const max = e.dataset.minDate;\n const modal = 'static' in e.dataset;\n\n flatpickr(e, {\n dateFormat: \"d/m/Y\",\n locale: \"pt\",\n minDate: min,\n maxDate: max,\n static: modal\n })\n\n })\n\n}\n","const showAjaxMessage = function(msg, type) {\n const alert_type = type === \"notice\" ? \"alert-success\" : \"alert-danger\";\n\n msg = `\\\n
\n ${msg}\n
\\\n`;\n\n if ($(\".modal .flash-messages:visible\").length) {\n $(\".modal .flash-messages\").html(msg);\n } else {\n $(\".flash-messages\").html(msg);\n }\n\n $(`.${alert_type}`).delay(10_000)\n .slideUp(\"slow\");\n\n};\n\n$(document).on(\"ajax:complete\", function(event) {\n const [request, status] = Array.from(event.detail);\n const msg = request.getResponseHeader(\"X-Message\");\n const type = request.getResponseHeader(\"X-Message-Type\");\n\n if (msg != null) {\n showAjaxMessage(msg, type);\n }\n});\n","import './modals'\nimport './flashMessages'\n\nimport initMasks from './masks'\nimport initDate from './datePicker'\nimport clearForm from './clearForm'\nimport select2Setup from './select2Setup'\n\nexport const initApp = () => {\n select2Setup();\n initMasks();\n initDate();\n clearForm();\n\n $('[data-toggle=\"tooltip\"]').tooltip();\n \n}\n\n// $.ajaxSetup({headers: { 'X-CSRF-Token': Rails.csrfToken() }})\n\ndocument.addEventListener(\"turbolinks:load\", () => initApp());\n","import \"jquery-mask-plugin\";\nimport \"../lib/jquery.maskMoney\";\n\nexport default () => {\n\n $(\"[data-mask]\").each(function() {\n $(this).mask(this.getAttribute(\"data-mask\"), { autoclear: false });\n });\n\n $(\".currency\").maskMoney();\n\n}\n","import \"bootstrap\";\nimport { initApp } from './index'\n\n$(document).on(\"click\", \"[data-behavior~=load-modal]\", function(ev) {\n ev.preventDefault();\n\n const size = this.getAttribute(\"data-modal-size\")\n if (size) {\n $(\"#global_modal .modal-dialog\")\n .removeClass('modal-lg modal-sm')\n .addClass(`modal-${size}`);\n }\n\n const url = this.getAttribute(\"href\") || this.getAttribute(\"data-url\");\n $(\"#global_modal .modal-content\").load(url, initModals);\n\n $(\"#global_modal\").modal(\"show\");\n});\n\n\nconst initModals = function() {\n initApp();\n};\n\nwindow.globalModal = (content) => {\n $(\"#global_modal .modal-content\").html(content);\n initModals();\n};","import \"select2\";\nimport \"select2/dist/js/i18n/pt-BR\";\n\nexport default function() {\n\n const SEPARATOR = \"&&\";\n\n // para funcionar dentro do bootstrap modal\n $(\"select\")\n .not(\".custom_select\")\n .not(\".custom-select\")\n .not(\".select2_ajax\")\n .not(\".search select\").each(function() {\n\n const dropdownParent = $(this).data(\"parent-modal\");\n\n var opts = {\n placeholder: \"Selecione\",\n allowClear: true,\n theme: \"bootstrap\",\n escapeMarkup(markup) { return markup; },\n templateResult(item) {\n return renderResult(...item.text.split(SEPARATOR))\n },\n templateSelection(item) {\n return renderSelection(...item.text.split(SEPARATOR))\n }\n }\n\n if(dropdownParent) {\n opts['dropdownParent'] = $(dropdownParent)\n }\n\n $(this).select2(opts);\n });\n\n\n $(\".search select\")\n .not(\".custom_select\")\n .select2({\n placeholder: \"Selecione\",\n allowClear: true\n });\n\n $(\"select.select2_ajax\").each(function() {\n ajaxInit($(this));\n });\n\n $(\"[data-initial-option]\").each(function() {\n fillInitialOption($(this));\n });\n\n};\n\nconst ajaxInit = function(el) {\n const c = Object.assign({}, ajaxConfigs); // dup\n\n if (el.data(\"parent-modal\")) {\n c.dropdownParent = $(el.data(\"parent-modal\"));\n }\n\n c.ajax.url = el.data(\"url\")\n\n el.select2(c);\n};\n\nconst ajaxConfigs = {\n language: \"pt-BR\",\n allowClear: true,\n theme: \"bootstrap\",\n minimumInputLength: 2,\n placeholder: 'Selecione',\n width: \"100%\",\n ajax: {\n dataType: \"json\",\n delay: 250,\n cache: true,\n processResults(data, params) {\n return { results: data.items };\n }\n },\n\n escapeMarkup(markup) { return markup; },\n\n templateResult(item) {\n return renderResult(item.text, item.sub)\n },\n\n templateSelection(item) {\n return renderSelection(item.text, item.sub)\n }\n};\n\nconst renderResult = (text, sub) => {\n if (sub) {\n return `${text}${sub}`;\n } else {\n return text;\n }\n}\n\nconst renderSelection = (text, sub) => {\n if (sub) {\n return `${text}   \n ${sub}\n `;\n } else {\n return text;\n }\n}\n\nconst fillInitialOption = function(select) {\n const option = select.data(\"initial-option\");\n\n if (option.id) {\n const text = ajaxConfigs.templateSelection(option);\n const opt = new Option(text, option.id, true, true);\n\n select\n .append(opt)\n .trigger(\"change\");\n }\n}\n\ndocument.addEventListener(\"turbolinks:before-cache\", () =>\n $(\"select\").each(function() {\n if ($(this).hasClass(\"select2-hidden-accessible\"))\n $(this).select2(\"destroy\");\n })\n);\n","/**\n * http://github.com/valums/file-uploader\n *\n * Multiple file upload component with progress-bar, drag-and-drop.\n * © 2010 Andrew Valums ( andrew(at)valums.com )\n *\n * Licensed under GNU GPL 2 or later and GNU LGPL 2 or later, see license.txt.\n */\n\n//\n// Helper functions\n//\n\nvar qq = qq || {};\n\nexport default qq;\n\n/**\n * Adds all missing properties from second obj to first obj\n */\nqq.extend = function(first, second){\n for (var prop in second){\n first[prop] = second[prop];\n }\n};\n\n/**\n * Searches for a given element in the array, returns -1 if it is not present.\n * @param {Number} [from] The index at which to begin the search\n */\nqq.indexOf = function(arr, elt, from){\n if (arr.indexOf) return arr.indexOf(elt, from);\n\n from = from || 0;\n var len = arr.length;\n\n if (from < 0) from += len;\n\n for (; from < len; from++){\n if (from in arr && arr[from] === elt){\n return from;\n }\n }\n return -1;\n};\n\nqq.getUniqueId = (function(){\n var id = 0;\n return function(){ return id++; };\n})();\n\n//\n// Events\n\nqq.attach = function(element, type, fn){\n if (element.addEventListener){\n element.addEventListener(type, fn, false);\n } else if (element.attachEvent){\n element.attachEvent('on' + type, fn);\n }\n};\nqq.detach = function(element, type, fn){\n if (element.removeEventListener){\n element.removeEventListener(type, fn, false);\n } else if (element.attachEvent){\n element.detachEvent('on' + type, fn);\n }\n};\n\nqq.preventDefault = function(e){\n if (e.preventDefault){\n e.preventDefault();\n } else{\n e.returnValue = false;\n }\n};\n\n//\n// Node manipulations\n\n/**\n * Insert node a before node b.\n */\nqq.insertBefore = function(a, b){\n b.parentNode.insertBefore(a, b);\n};\nqq.remove = function(element){\n element.parentNode.removeChild(element);\n};\n\nqq.contains = function(parent, descendant){\n // compareposition returns false in this case\n if (parent == descendant) return true;\n\n if (parent.contains){\n return parent.contains(descendant);\n } else {\n return !!(descendant.compareDocumentPosition(parent) & 8);\n }\n};\n\n/**\n * Creates and returns element from html string\n * Uses innerHTML to create an element\n */\nqq.toElement = (function(){\n var div = document.createElement('div');\n return function(html){\n div.innerHTML = html;\n var element = div.firstChild;\n div.removeChild(element);\n return element;\n };\n})();\n\n//\n// Node properties and attributes\n\n/**\n * Sets styles for an element.\n * Fixes opacity in IE6-8.\n */\nqq.css = function(element, styles){\n if (styles.opacity != null){\n if (typeof element.style.opacity != 'string' && typeof(element.filters) != 'undefined'){\n styles.filter = 'alpha(opacity=' + Math.round(100 * styles.opacity) + ')';\n }\n }\n qq.extend(element.style, styles);\n};\nqq.hasClass = function(element, name){\n var re = new RegExp('(^| )' + name + '( |$)');\n return re.test(element.className);\n};\nqq.addClass = function(element, name){\n if (!qq.hasClass(element, name)){\n element.className += ' ' + name;\n }\n};\nqq.removeClass = function(element, name){\n var re = new RegExp('(^| )' + name + '( |$)');\n element.className = element.className.replace(re, ' ').replace(/^\\s+|\\s+$/g, \"\");\n};\nqq.setText = function(element, text){\n element.innerText = text;\n element.textContent = text;\n};\n\n//\n// Selecting elements\n\nqq.children = function(element){\n var children = [],\n child = element.firstChild;\n\n while (child){\n if (child.nodeType == 1){\n children.push(child);\n }\n child = child.nextSibling;\n }\n\n return children;\n};\n\nqq.getByClass = function(element, className){\n if (element.querySelectorAll){\n return element.querySelectorAll('.' + className);\n }\n\n var result = [];\n var candidates = element.getElementsByTagName(\"*\");\n var len = candidates.length;\n\n for (var i = 0; i < len; i++){\n if (qq.hasClass(candidates[i], className)){\n result.push(candidates[i]);\n }\n }\n return result;\n};\n\n/**\n * obj2url() takes a json-object as argument and generates\n * a querystring. pretty much like jQuery.param()\n *\n * how to use:\n *\n * `qq.obj2url({a:'b',c:'d'},'http://any.url/upload?otherParam=value');`\n *\n * will result in:\n *\n * `http://any.url/upload?otherParam=value&a=b&c=d`\n *\n * @param Object JSON-Object\n * @param String current querystring-part\n * @return String encoded querystring\n */\nqq.obj2url = function(obj, temp, prefixDone){\n var uristrings = [],\n prefix = '&',\n add = function(nextObj, i){\n var nextTemp = temp\n ? (/\\[\\]$/.test(temp)) // prevent double-encoding\n ? temp\n : temp+'['+i+']'\n : i;\n if ((nextTemp != 'undefined') && (i != 'undefined')) {\n uristrings.push(\n (typeof nextObj === 'object')\n ? qq.obj2url(nextObj, nextTemp, true)\n : (Object.prototype.toString.call(nextObj) === '[object Function]')\n ? encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj())\n : encodeURIComponent(nextTemp) + '=' + encodeURIComponent(nextObj)\n );\n }\n };\n\n if (!prefixDone && temp) {\n prefix = (/\\?/.test(temp)) ? (/\\?$/.test(temp)) ? '' : '&' : '?';\n uristrings.push(temp);\n uristrings.push(qq.obj2url(obj));\n } else if ((Object.prototype.toString.call(obj) === '[object Array]') && (typeof obj != 'undefined') ) {\n // we wont use a for-in-loop on an array (performance)\n for (var i = 0, len = obj.length; i < len; ++i){\n add(obj[i], i);\n }\n } else if ((typeof obj != 'undefined') && (obj !== null) && (typeof obj === \"object\")){\n // for anything else but a scalar, we will use for-in-loop\n for (var i in obj){\n add(obj[i], i);\n }\n } else {\n uristrings.push(encodeURIComponent(temp) + '=' + encodeURIComponent(obj));\n }\n\n return uristrings.join(prefix)\n .replace(/^&/, '')\n .replace(/%20/g, '+');\n};\n\n//\n//\n// Uploader Classes\n//\n//\n\nvar qq = qq || {};\n\n/**\n * Creates upload button, validates upload, but doesn't create file list or dd.\n */\nqq.FileUploaderBasic = function(o){\n this._options = {\n // set to true to see the server response\n debug: false,\n action: '/server/upload',\n method: 'POST',\n params: {},\n button: null,\n multiple: true,\n maxConnections: 3,\n // validation\n allowedExtensions: [],\n sizeLimit: 0,\n minSizeLimit: 0,\n // events\n // return false to cancel submit\n onSubmit: function(id, fileName){},\n onProgress: function(id, fileName, loaded, total){},\n onComplete: function(id, fileName, responseJSON){},\n onCancel: function(id, fileName){},\n // messages\n messages: {\n typeError: \"{file} has invalid extension. Only {extensions} are allowed.\",\n sizeError: \"{file} is too large, maximum file size is {sizeLimit}.\",\n minSizeError: \"{file} is too small, minimum file size is {minSizeLimit}.\",\n emptyError: \"{file} is empty, please select files again without it.\",\n onLeave: \"The files are being uploaded, if you leave now the upload will be cancelled.\"\n },\n showMessage: function(message){\n alert(message);\n }\n };\n qq.extend(this._options, o);\n\n // number of files being uploaded\n this._filesInProgress = 0;\n this._handler = this._createUploadHandler();\n\n if (this._options.button){\n this._button = this._createUploadButton(this._options.button);\n }\n\n this._preventLeaveInProgress();\n};\n\nqq.FileUploaderBasic.prototype = {\n setParams: function(params){\n this._options.params = params;\n },\n getInProgress: function(){\n return this._filesInProgress;\n },\n open: function() {\n this._button.getInput().click();\n },\n _createUploadButton: function(element){\n var self = this;\n\n return new qq.UploadButton({\n element: element,\n multiple: this._options.multiple && qq.UploadHandlerXhr.isSupported(),\n onChange: function(input){\n self._onInputChange(input);\n }\n });\n },\n _createUploadHandler: function(){\n var self = this,\n handlerClass;\n\n if(qq.UploadHandlerXhr.isSupported()){\n handlerClass = 'UploadHandlerXhr';\n } else {\n handlerClass = 'UploadHandlerForm';\n }\n\n var handler = new qq[handlerClass]({\n debug: this._options.debug,\n action: this._options.action,\n method: this._options.method,\n maxConnections: this._options.maxConnections,\n onProgress: function(id, fileName, loaded, total){\n self._onProgress(id, fileName, loaded, total);\n self._options.onProgress(id, fileName, loaded, total);\n },\n onComplete: function(id, fileName, result){\n self._onComplete(id, fileName, result);\n self._options.onComplete(id, fileName, result);\n },\n onCancel: function(id, fileName){\n self._onCancel(id, fileName);\n self._options.onCancel(id, fileName);\n }\n });\n\n return handler;\n },\n _preventLeaveInProgress: function(){\n var self = this;\n\n qq.attach(window, 'beforeunload', function(e){\n if (!self._filesInProgress){return;}\n\n var e = e || window.event;\n // for ie, ff\n e.returnValue = self._options.messages.onLeave;\n // for webkit\n return self._options.messages.onLeave;\n });\n },\n _onSubmit: function(id, fileName){\n this._filesInProgress++;\n },\n _onProgress: function(id, fileName, loaded, total){\n },\n _onComplete: function(id, fileName, result){\n this._filesInProgress--;\n if (result.error){\n this._options.showMessage(result.error);\n }\n },\n _onCancel: function(id, fileName){\n this._filesInProgress--;\n },\n _onInputChange: function(input){\n if (this._handler instanceof qq.UploadHandlerXhr){\n this._uploadFileList(input.files);\n } else {\n if (this._validateFile(input)){\n this._uploadFile(input);\n }\n }\n this._button.reset();\n },\n _uploadFileList: function(files){\n for (var i=0; i this._options.sizeLimit){\n this._error('sizeError', name);\n return false;\n\n } else if (size && size < this._options.minSizeLimit){\n this._error('minSizeError', name);\n return false;\n }\n\n return true;\n },\n _error: function(code, fileName){\n var message = this._options.messages[code];\n function r(name, replacement){ message = message.replace(name, replacement); }\n\n r('{file}', this._formatFileName(fileName));\n r('{extensions}', this._options.allowedExtensions.join(', '));\n r('{sizeLimit}', this._formatSize(this._options.sizeLimit));\n r('{minSizeLimit}', this._formatSize(this._options.minSizeLimit));\n\n this._options.showMessage(message);\n },\n _formatFileName: function(name){\n if (name.length > 33){\n name = name.slice(0, 19) + '...' + name.slice(-13);\n }\n return name;\n },\n _isAllowedExtension: function(fileName){\n var ext = (-1 !== fileName.indexOf('.')) ? fileName.replace(/.*[.]/, '').toLowerCase() : '';\n var allowed = this._options.allowedExtensions;\n\n if (!allowed.length){return true;}\n\n for (var i=0; i 99);\n\n return Math.max(bytes, 0.1).toFixed(1) + ['kB', 'MB', 'GB', 'TB', 'PB', 'EB'][i];\n }\n};\n\n\n/**\n * Class that creates upload widget with drag-and-drop and file list\n * @inherits qq.FileUploaderBasic\n */\nqq.FileUploader = function(o){\n // call parent constructor\n qq.FileUploaderBasic.apply(this, arguments);\n\n // additional options\n qq.extend(this._options, {\n element: null,\n // if set, will be used instead of qq-upload-list in template\n listElement: null,\n\n template: '
' +\n '
Drop files here to upload
' +\n '
Upload a file
' +\n '
    ' +\n '
    ',\n\n // template for one item in file list\n fileTemplate: '
  • ' +\n '' +\n '' +\n '' +\n 'Cancel' +\n 'Failed' +\n '
  • ',\n\n classes: {\n // used to get elements from templates\n button: 'qq-upload-button',\n drop: 'qq-upload-drop-area',\n dropActive: 'qq-upload-drop-area-active',\n list: 'qq-upload-list',\n\n file: 'qq-upload-file',\n spinner: 'qq-upload-spinner',\n size: 'qq-upload-size',\n cancel: 'qq-upload-cancel',\n\n // added to list item when upload completes\n // used in css to hide progress spinner\n success: 'qq-upload-success',\n fail: 'qq-upload-fail'\n }\n });\n // overwrite options with user supplied\n qq.extend(this._options, o);\n\n this._element = this._options.element;\n this._element.innerHTML = this._options.template;\n this._listElement = this._options.listElement || this._find(this._element, 'list');\n\n this._classes = this._options.classes;\n\n this._button = this._createUploadButton(this._find(this._element, 'button'));\n\n this._bindCancelEvent();\n this._setupDragDrop();\n};\n\n// inherit from Basic Uploader\nqq.extend(qq.FileUploader.prototype, qq.FileUploaderBasic.prototype);\n\nqq.extend(qq.FileUploader.prototype, {\n /**\n * Gets one of the elements listed in this._options.classes\n **/\n _find: function(parent, type){\n var element = qq.getByClass(parent, this._options.classes[type])[0];\n if (!element){\n throw new Error('element not found ' + type);\n }\n\n return element;\n },\n _setupDragDrop: function(){\n var self = this,\n dropArea = this._find(this._element, 'drop');\n\n var dz = new qq.UploadDropZone({\n element: dropArea,\n onEnter: function(e){\n qq.addClass(dropArea, self._classes.dropActive);\n e.stopPropagation();\n },\n onLeave: function(e){\n e.stopPropagation();\n },\n onLeaveNotDescendants: function(e){\n qq.removeClass(dropArea, self._classes.dropActive);\n },\n onDrop: function(e){\n dropArea.style.display = 'none';\n qq.removeClass(dropArea, self._classes.dropActive);\n self._uploadFileList(e.dataTransfer.files);\n }\n });\n\n dropArea.style.display = 'none';\n\n qq.attach(document, 'dragenter', function(e){\n if (!dz._isValidFileDrag(e)) return;\n\n dropArea.style.display = 'block';\n });\n qq.attach(document, 'dragleave', function(e){\n if (!dz._isValidFileDrag(e)) return;\n\n var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);\n // only fire when leaving document out\n if ( ! relatedTarget || relatedTarget.nodeName == \"HTML\"){\n dropArea.style.display = 'none';\n }\n });\n },\n _onSubmit: function(id, fileName){\n qq.FileUploaderBasic.prototype._onSubmit.apply(this, arguments);\n this._addToList(id, fileName);\n },\n _onProgress: function(id, fileName, loaded, total){\n qq.FileUploaderBasic.prototype._onProgress.apply(this, arguments);\n\n var item = this._getItemByFileId(id);\n var size = this._find(item, 'size');\n size.style.display = 'inline';\n\n var text;\n if (loaded != total){\n text = Math.round(loaded / total * 100) + '% from ' + this._formatSize(total);\n } else {\n text = this._formatSize(total);\n }\n\n qq.setText(size, text);\n },\n _onComplete: function(id, fileName, result){\n qq.FileUploaderBasic.prototype._onComplete.apply(this, arguments);\n\n // mark completed\n var item = this._getItemByFileId(id);\n qq.remove(this._find(item, 'cancel'));\n qq.remove(this._find(item, 'spinner'));\n\n if (result.success){\n qq.addClass(item, this._classes.success);\n } else {\n qq.addClass(item, this._classes.fail);\n }\n },\n _addToList: function(id, fileName){\n var item = qq.toElement(this._options.fileTemplate);\n item.qqFileId = id;\n\n var fileElement = this._find(item, 'file');\n qq.setText(fileElement, this._formatFileName(fileName));\n this._find(item, 'size').style.display = 'none';\n\n this._listElement.appendChild(item);\n },\n _getItemByFileId: function(id){\n var item = this._listElement.firstChild;\n\n // there can't be txt nodes in dynamically created list\n // and we can use nextSibling\n while (item){\n if (item.qqFileId == id) return item;\n item = item.nextSibling;\n }\n },\n /**\n * delegate click event for cancel link\n **/\n _bindCancelEvent: function(){\n var self = this,\n list = this._listElement;\n\n qq.attach(list, 'click', function(e){\n e = e || window.event;\n var target = e.target || e.srcElement;\n\n if (qq.hasClass(target, self._classes.cancel)){\n qq.preventDefault(e);\n\n var item = target.parentNode;\n self._handler.cancel(item.qqFileId);\n qq.remove(item);\n }\n });\n }\n});\n\nqq.UploadDropZone = function(o){\n this._options = {\n element: null,\n onEnter: function(e){},\n onLeave: function(e){},\n // is not fired when leaving element by hovering descendants\n onLeaveNotDescendants: function(e){},\n onDrop: function(e){}\n };\n qq.extend(this._options, o);\n\n this._element = this._options.element;\n\n this._disableDropOutside();\n this._attachEvents();\n};\n\nqq.UploadDropZone.prototype = {\n _disableDropOutside: function(e){\n // run only once for all instances\n if (!qq.UploadDropZone.dropOutsideDisabled ){\n\n qq.attach(document, 'dragover', function(e){\n if (e.dataTransfer){\n e.dataTransfer.dropEffect = 'none';\n e.preventDefault();\n }\n });\n\n qq.UploadDropZone.dropOutsideDisabled = true;\n }\n },\n _attachEvents: function(){\n var self = this;\n\n qq.attach(self._element, 'dragover', function(e){\n if (!self._isValidFileDrag(e)) return;\n\n var effect = e.dataTransfer.effectAllowed;\n if (effect == 'move' || effect == 'linkMove'){\n e.dataTransfer.dropEffect = 'move'; // for FF (only move allowed)\n } else {\n e.dataTransfer.dropEffect = 'copy'; // for Chrome\n }\n\n e.stopPropagation();\n e.preventDefault();\n });\n\n qq.attach(self._element, 'dragenter', function(e){\n if (!self._isValidFileDrag(e)) return;\n\n self._options.onEnter(e);\n });\n\n qq.attach(self._element, 'dragleave', function(e){\n if (!self._isValidFileDrag(e)) return;\n\n self._options.onLeave(e);\n\n var relatedTarget = document.elementFromPoint(e.clientX, e.clientY);\n // do not fire when moving a mouse over a descendant\n if (qq.contains(this, relatedTarget)) return;\n\n self._options.onLeaveNotDescendants(e);\n });\n\n qq.attach(self._element, 'drop', function(e){\n if (!self._isValidFileDrag(e)) return;\n\n e.preventDefault();\n self._options.onDrop(e);\n });\n },\n _isValidFileDrag: function(e){\n var dt = e.dataTransfer,\n // do not check dt.types.contains in webkit, because it crashes safari 4\n isWebkit = navigator.userAgent.indexOf(\"AppleWebKit\") > -1;\n\n // dt.effectAllowed is none in Safari 5\n // dt.types.contains check is for firefox\n return dt && dt.effectAllowed != 'none' &&\n (dt.files || (!isWebkit && dt.types.contains && dt.types.contains('Files')));\n\n }\n};\n\nqq.UploadButton = function(o){\n this._options = {\n element: null,\n // if set to true adds multiple attribute to file input\n multiple: false,\n // name attribute of file input\n name: 'file',\n onChange: function(input){},\n hoverClass: 'qq-upload-button-hover',\n focusClass: 'qq-upload-button-focus'\n };\n\n qq.extend(this._options, o);\n\n this._element = this._options.element;\n\n // make button suitable container for input\n qq.css(this._element, {\n position: 'relative',\n overflow: 'hidden',\n // Make sure browse button is in the right side\n // in Internet Explorer\n direction: 'ltr'\n });\n\n this._input = this._createInput();\n};\n\nqq.UploadButton.prototype = {\n /* returns file input element */\n getInput: function(){\n return this._input;\n },\n /* cleans/recreates the file input */\n reset: function(){\n if (this._input.parentNode){\n qq.remove(this._input);\n }\n\n qq.removeClass(this._element, this._options.focusClass);\n this._input = this._createInput();\n },\n _createInput: function(){\n var input = document.createElement(\"input\");\n\n if (this._options.multiple){\n input.setAttribute(\"multiple\", \"multiple\");\n }\n\n input.setAttribute(\"type\", \"file\");\n input.setAttribute(\"name\", this._options.name);\n\n qq.css(input, {\n position: 'absolute',\n // in Opera only 'browse' button\n // is clickable and it is located at\n // the right side of the input\n right: 0,\n top: 0,\n fontFamily: 'Arial',\n // 4 persons reported this, the max values that worked for them were 243, 236, 236, 118\n fontSize: '118px',\n margin: 0,\n padding: 0,\n cursor: 'pointer',\n opacity: 0\n });\n\n this._element.appendChild(input);\n\n var self = this;\n qq.attach(input, 'change', function(){\n self._options.onChange(input);\n });\n\n qq.attach(input, 'mouseover', function(){\n qq.addClass(self._element, self._options.hoverClass);\n });\n qq.attach(input, 'mouseout', function(){\n qq.removeClass(self._element, self._options.hoverClass);\n });\n qq.attach(input, 'focus', function(){\n qq.addClass(self._element, self._options.focusClass);\n });\n qq.attach(input, 'blur', function(){\n qq.removeClass(self._element, self._options.focusClass);\n });\n\n // IE and Opera, unfortunately have 2 tab stops on file input\n // which is unacceptable in our case, disable keyboard access\n if (window.attachEvent){\n // it is IE or Opera\n input.setAttribute('tabIndex', \"-1\");\n }\n\n return input;\n }\n};\n\n/**\n * Class for uploading files, uploading itself is handled by child classes\n */\nqq.UploadHandlerAbstract = function(o){\n this._options = {\n debug: false,\n action: '/upload.php',\n // maximum number of concurrent uploads\n maxConnections: 999,\n onProgress: function(id, fileName, loaded, total){},\n onComplete: function(id, fileName, response){},\n onCancel: function(id, fileName){}\n };\n qq.extend(this._options, o);\n\n this._queue = [];\n // params for files in queue\n this._params = [];\n};\nqq.UploadHandlerAbstract.prototype = {\n log: function(str){\n if (this._options.debug && window.console) console.log('[uploader] ' + str);\n },\n /**\n * Adds file or file input to the queue\n * @returns id\n **/\n add: function(file){},\n /**\n * Sends the file identified by id and additional query params to the server\n */\n upload: function(id, params){\n var len = this._queue.push(id);\n\n var copy = {};\n qq.extend(copy, params);\n this._params[id] = copy;\n\n // if too many active uploads, wait...\n if (len <= this._options.maxConnections){\n this._upload(id, this._params[id]);\n }\n },\n /**\n * Cancels file upload by id\n */\n cancel: function(id){\n this._cancel(id);\n this._dequeue(id);\n },\n /**\n * Cancells all uploads\n */\n cancelAll: function(){\n for (var i=0; i= max && i < max){\n var nextId = this._queue[max-1];\n this._upload(nextId, this._params[nextId]);\n }\n }\n};\n\n/**\n * Class for uploading files using form and iframe\n * @inherits qq.UploadHandlerAbstract\n */\nqq.UploadHandlerForm = function(o){\n qq.UploadHandlerAbstract.apply(this, arguments);\n\n this._inputs = {};\n};\n// @inherits qq.UploadHandlerAbstract\nqq.extend(qq.UploadHandlerForm.prototype, qq.UploadHandlerAbstract.prototype);\n\nqq.extend(qq.UploadHandlerForm.prototype, {\n add: function(fileInput){\n fileInput.setAttribute('name', 'qqfile');\n var id = 'qq-upload-handler-iframe' + qq.getUniqueId();\n\n this._inputs[id] = fileInput;\n\n // remove file input from DOM\n if (fileInput.parentNode){\n qq.remove(fileInput);\n }\n\n return id;\n },\n getName: function(id){\n // get input value and remove path to normalize\n return this._inputs[id].value.replace(/.*(\\/|\\\\)/, \"\");\n },\n _cancel: function(id){\n this._options.onCancel(id, this.getName(id));\n\n delete this._inputs[id];\n\n var iframe = document.getElementById(id);\n if (iframe){\n // to cancel request set src to something else\n // we use src=\"javascript:false;\" because it doesn't\n // trigger ie6 prompt on https\n iframe.setAttribute('src', 'javascript:false;');\n\n qq.remove(iframe);\n }\n },\n _upload: function(id, params){\n var input = this._inputs[id];\n\n if (!input){\n throw new Error('file with passed id was not added, or already uploaded or cancelled');\n }\n\n var fileName = this.getName(id);\n\n var iframe = this._createIframe(id);\n var form = this._createForm(iframe, params);\n form.appendChild(input);\n\n var self = this;\n this._attachLoadEvent(iframe, function(){\n self.log('iframe loaded');\n\n var response = self._getIframeContentJSON(iframe);\n\n self._options.onComplete(id, fileName, response);\n self._dequeue(id);\n\n delete self._inputs[id];\n // timeout added to fix busy state in FF3.6\n setTimeout(function(){\n qq.remove(iframe);\n }, 1);\n });\n\n form.submit();\n qq.remove(form);\n\n return id;\n },\n _attachLoadEvent: function(iframe, callback){\n qq.attach(iframe, 'load', function(){\n // when we remove iframe from dom\n // the request stops, but in IE load\n // event fires\n if (!iframe.parentNode){\n return;\n }\n\n // fixing Opera 10.53\n if (iframe.contentDocument &&\n iframe.contentDocument.body &&\n iframe.contentDocument.body.innerHTML == \"false\"){\n // In Opera event is fired second time\n // when body.innerHTML changed from false\n // to server response approx. after 1 sec\n // when we upload file with iframe\n return;\n }\n\n callback();\n });\n },\n /**\n * Returns json object received by iframe from server.\n */\n _getIframeContentJSON: function(iframe){\n // iframe.contentWindow.document - for IE<7\n var doc = iframe.contentDocument ? iframe.contentDocument: iframe.contentWindow.document,\n response;\n\n this.log(\"converting iframe's innerHTML to JSON\");\n this.log(\"innerHTML = \" + doc.body.innerHTML);\n\n try {\n response = eval(\"(\" + doc.body.innerHTML + \")\");\n } catch(err){\n response = {};\n }\n\n return response;\n },\n /**\n * Creates iframe with unique name\n */\n _createIframe: function(id){\n // We can't use following code as the name attribute\n // won't be properly registered in IE6, and new window\n // on form submit will open\n // var iframe = document.createElement('iframe');\n // iframe.setAttribute('name', id);\n\n var iframe = qq.toElement('