{"version":3,"sources":["components/autocomplete.js"],"names":["dmx","Component","extends","initialData","selectedItem","attributes","data","type","Array","default","matchcase","Boolean","matchstart","matchaccent","optiontext","String","optionvalue","noresultslabel","events","noresults","Event","render","node","BaseComponent","prototype","call","this","dataItems","props","value","updateValue","$node","disabled","input","cloneNode","removeAttribute","setAttribute","addEventListener","onBlur","bind","onInput","onKeydown","list","document","createElement","style","display","updateData","update","mounted","parentNode","insertBefore","form","onReset","equal","repeatItems","map","item","index","parse","DataScope","label","updated","setValue","event","find","set","isDefault","defaultValue","focus","disable","valid","i","length","evt","createEvent","initEvent","dispatchEvent","closeList","currentFocus","innerHTML","forEach","matches","div","getItemHtml","preventDefault","stopPropagation","appendChild","children","textContent","showList","keyCode","updateActive","divs","getElementsByTagName","normalize","toLowerCase","substring","indexOf","html","htmlEncode","matcher","RegExp","escapeRegExp","replace","m","str","result","split","c","charCodeAt","fromCharCode","join","classList","remove","add","left","offsetLeft","top","offsetTop","offsetHeight","nextSibling","removeChild"],"mappings":"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","file":"../dmxAutocomplete/dmxAutocomplete.js","sourcesContent":["dmx.Component('autocomplete', {\r\n\r\n extends: 'input',\r\n\r\n initialData: {\r\n selectedItem: null\r\n },\r\n\r\n attributes: {\r\n data: {\r\n type: Array,\r\n default: []\r\n },\r\n\r\n matchcase: {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n matchstart: {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n matchaccent: {\r\n type: Boolean,\r\n default: false\r\n },\r\n\r\n optiontext: {\r\n type: String,\r\n default: '$value'\r\n },\r\n\r\n optionvalue: {\r\n type: String,\r\n default: '$value'\r\n },\r\n\r\n noresultslabel: {\r\n type: String,\r\n default: 'No Results...'\r\n }\r\n },\r\n\r\n events: {\r\n noresults: Event\r\n },\r\n\r\n render: function(node) {\r\n dmx.BaseComponent.prototype.render.call(this, node);\r\n\r\n this.dataItems = [];\r\n\r\n if (!this.props.value) {\r\n this.props.value = this.$node.value;\r\n } else {\r\n this.updateValue = true;\r\n }\r\n\r\n this.$node.disabled = this.props.disabled;\r\n\r\n this.input = this.$node.cloneNode();\r\n this.input.removeAttribute('id');\r\n this.input.removeAttribute('name');\r\n this.input.setAttribute('autocomplete', 'off');\r\n this.input.setAttribute('form', 'dummy'); // form should ignore this input\r\n this.input.addEventListener('blur', this.onBlur.bind(this));\r\n this.input.addEventListener('input', this.onInput.bind(this));\r\n this.input.addEventListener('keydown', this.onKeydown.bind(this));\r\n\r\n this.list = document.createElement('div');\r\n this.list.setAttribute('class', 'dmx-autocomplete-items');\r\n\r\n this.$node.style.display = 'none';\r\n this.$node.addEventListener('change', this.updateData.bind(this));\r\n this.$node.addEventListener('invalid', this.updateData.bind(this));\r\n\r\n this.update({});\r\n },\r\n\r\n mounted: function() {\r\n this.$node.parentNode.insertBefore(this.input, this.$node);\r\n\r\n if (this.$node.form) {\r\n this.$node.form.addEventListener('reset', this.onReset.bind(this));\r\n }\r\n },\r\n\r\n update: function(props) {\r\n if (!dmx.equal(this.props.data, props.data) || this.props.optiontext != props.optiontext || this.props.optionvalue != props.optionvalue) {\r\n this.dataItems = dmx.repeatItems(this.props.data).map(function(item, index) {\r\n return {\r\n index: index,\r\n value: dmx.parse(this.props.optionvalue, dmx.DataScope(item, this)),\r\n label: dmx.parse(this.props.optiontext, dmx.DataScope(item, this)),\r\n item: item\r\n }\r\n }, this);\r\n\r\n this.updateValue = true;\r\n }\r\n\r\n if (this.props.value != props.value) {\r\n this.updateValue = true;\r\n }\r\n\r\n if (this.props.disabled != props.disabled) {\r\n this.$node.disabled = this.props.disabled;\r\n this.input.disabled = this.props.disabled;\r\n }\r\n\r\n this.updateData();\r\n },\r\n\r\n updated: function() {\r\n if (this.updateValue) {\r\n this.updateValue = false;\r\n this.setValue(this.props.value, true);\r\n this.updateData();\r\n }\r\n },\r\n\r\n updateData: function(event) {\r\n dmx.Component('form-element').prototype.updateData.call(this, event);\r\n var selectedItem = this.dataItems.find(function(item) {\r\n return item.value == this.$node.value;\r\n }, this);\r\n this.set('selectedItem', selectedItem ? selectedItem.item : null);\r\n },\r\n\r\n setValue: function(value, isDefault) {\r\n var selectedItem = this.dataItems.find(function(item) {\r\n return item.value == value;\r\n }, this);\r\n\r\n this.$node.value = selectedItem ? selectedItem.value : '';\r\n this.input.value = selectedItem ? selectedItem.label : '';\r\n\r\n if (isDefault) {\r\n this.$node.defaultValue = selectedItem ? selectedItem.value : '';\r\n this.input.defaultValue = selectedItem ? selectedItem.label : '';\r\n }\r\n },\r\n\r\n focus: function() {\r\n this.input.focus();\r\n },\r\n\r\n disable: function(disable) {\r\n this.$node.disabled = (disable === true);\r\n this.input.disabled = (disable === true);\r\n this.updateData();\r\n },\r\n\r\n onReset: function(event) {\r\n this.$node.value = this.$node.defaultValue;\r\n this.input.value = this.input.defaultValue;\r\n },\r\n\r\n onBlur: function(event) {\r\n var valid = false;\r\n\r\n if (this.dataItems) {\r\n for (var i = 0; i < this.dataItems.length; i++) {\r\n if (this.dataItems[i].label == this.input.value) {\r\n this.$node.value = this.dataItems[i].value;\r\n valid = true;\r\n }\r\n }\r\n }\r\n\r\n if (!valid) {\r\n this.input.value = '';\r\n this.$node.value = '';\r\n }\r\n\r\n var evt = document.createEvent(\"HTMLEvents\");\r\n evt.initEvent(\"change\", false, true);\r\n this.$node.dispatchEvent(evt);\r\n\r\n this.closeList();\r\n },\r\n\r\n onInput: function(event) {\r\n var $node = this.$node;\r\n var input = this.input;\r\n var value = input.value;\r\n\r\n this.closeList();\r\n\r\n if (!value) return;\r\n if (!this.dataItems.length) return;\r\n\r\n this.currentFocus = -1;\r\n\r\n this.list.innerHTML = '';\r\n\r\n this.dataItems.forEach(function(item) {\r\n if (this.matches(item.label, value)) {\r\n var div = document.createElement('div');\r\n div.setAttribute('class', 'dmx-autocomplete-item');\r\n div.innerHTML = this.getItemHtml(item.label, value);\r\n div.item = item;\r\n\r\n div.addEventListener('mousedown', function(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n $node.value = item.value;\r\n input.value = item.label;\r\n this.closeList();\r\n var evt = document.createEvent(\"HTMLEvents\");\r\n evt.initEvent(\"change\", false, true);\r\n $node.dispatchEvent(evt);\r\n }.bind(this));\r\n\r\n this.list.appendChild(div);\r\n }\r\n }, this);\r\n\r\n if (!this.list.children.length) {\r\n //this.list.innerHTML = '
' + this.props.noresultslabel + '
';\r\n var div = document.createElement('div');\r\n div.setAttribute('class', 'dmx-autocomplete-item');\r\n div.textContent = this.props.noresultslabel;\r\n div.addEventListener('mousedown', function(event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.closeList();\r\n this.dispatchEvent('noresults', null, { value: value });\r\n }.bind(this));\r\n this.list.appendChild(div);\r\n }\r\n\r\n this.showList();\r\n },\r\n\r\n onKeydown: function(event) {\r\n if (event.keyCode == 40) {\r\n event.preventDefault();\r\n this.currentFocus++;\r\n this.updateActive();\r\n this.showList();\r\n } else if (event.keyCode == 38) {\r\n event.preventDefault();\r\n this.currentFocus--;\r\n this.updateActive();\r\n this.showList();\r\n } else if (event.keyCode == 27) {\r\n event.preventDefault();\r\n this.currentFocus = -1;\r\n this.closeList();\r\n } else if (event.keyCode == 13) {\r\n // prevent the form from being submitted\r\n event.preventDefault();\r\n\r\n if (this.currentFocus > -1) {\r\n var divs = this.list.getElementsByTagName('div');\r\n var evt = document.createEvent(\"HTMLEvents\");\r\n evt.initEvent(\"mousedown\", false, true);\r\n if (divs) divs[this.currentFocus].dispatchEvent(evt);\r\n }\r\n }\r\n },\r\n\r\n matches: function(item, value) {\r\n if (item == null) return false;\r\n\r\n if (!this.props.matchaccent) {\r\n item = this.normalize(item);\r\n value = this.normalize(value);\r\n }\r\n\r\n if (!this.props.matchcase) {\r\n item = item.toLowerCase();\r\n value = value.toLowerCase();\r\n }\r\n\r\n if (this.props.matchstart) {\r\n item = item.substring(0, value.length);\r\n }\r\n\r\n return item.indexOf(value) != -1;\r\n },\r\n\r\n getItemHtml: function(item, value) {\r\n var html = this.htmlEncode(item);\r\n var matcher = new RegExp((this.props.matchstart ? '^' : '') + dmx.escapeRegExp(this.htmlEncode(value)), this.props.matchcase ? 'g' : 'gi');\r\n\r\n html = html.replace(matcher, function(m) {\r\n return '' + m + '';\r\n });\r\n\r\n return html;\r\n },\r\n\r\n htmlEncode: function(html) {\r\n html = html.replace(/&/g, '&');\r\n html = html.replace(/\"/g, '"');\r\n html = html.replace(//g, '>');\r\n return html;\r\n },\r\n\r\n normalize: function(str) {\r\n if (str.normalize) {\r\n return str.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\r\n }\r\n\r\n var TAB_00C0 = 'AAAAAAACEEEEIIIIDNOOOOO*OUUUUYIsaaaaaaaceeeeiiii?nooooo/ouuuuy?yAaAaAaCcCcCcCcDdDdEeEeEeEeEeGgGgGgGgHhHhIiIiIiIiIiJjJjKkkLlLlLlLlLlNnNnNnnNnOoOoOoOoRrRrRrSsSsSsSsTtTtTtUuUuUuUuUuUuWwYyYZzZzZzF';\r\n var result = str.split('');\r\n\r\n for (var i = 0; i < result.length; i++) {\r\n var c = str.charCodeAt(i);\r\n if (c >= 0x00c0 && c <= 0x017f) {\r\n result[i] = String.fromCharCode(TAB_00C0.charCodeAt(c - 0x00c0));\r\n } else if (c > 127) {\r\n result[i] = '?';\r\n }\r\n }\r\n\r\n return result.join('');\r\n },\r\n\r\n updateActive: function() {\r\n var divs = this.list.getElementsByTagName('div');\r\n\r\n if (!divs) return;\r\n if (this.currentFocus >= divs.length) this.currentFocus = 0;\r\n if (this.currentFocus < 0) this.currentFocus = divs.length - 1;\r\n\r\n for (var i = 0; i < divs.length; i++) {\r\n divs[i].classList.remove('dmx-autocomplete-active');\r\n }\r\n\r\n divs[this.currentFocus].classList.add('dmx-autocomplete-active');\r\n },\r\n\r\n showList: function() {\r\n if (!this.input.value) return;\r\n\r\n this.list.style.left = this.input.offsetLeft + 'px';\r\n this.list.style.top = (this.input.offsetTop + this.input.offsetHeight) + 'px';\r\n\r\n if (this.$node.nextSibling) {\r\n this.$node.parentNode.insertBefore(this.list, this.$node.nextSibling);\r\n } else {\r\n this.$node.parentNode.appendChild(this.list);\r\n }\r\n },\r\n\r\n closeList: function() {\r\n if (this.list.parentNode) {\r\n this.list.parentNode.removeChild(this.list);\r\n }\r\n }\r\n\r\n});\r\n"]}