| /*Strike by Appiphony | 
|   | 
| Version: 1.0.0 | 
| Website: http://www.lightningstrike.io | 
| GitHub: https://github.com/appiphony/Strike-Components | 
| License: BSD 3-Clause License*/ | 
| ({ | 
|     onInit: function(component, event, helper) { | 
|         component.handleClick = $A.getCallback(function() { | 
|             if (!component.isValid()) { | 
|                 window.removeEventListener('click', component.handleClick); | 
|   | 
|                 return; | 
|             } | 
|   | 
|             helper.closeMenu(component, event, helper); | 
|         }); | 
|   | 
|         window.addEventListener('click', component.handleClick); | 
|   | 
|         component.set('v.initCallsRunning', 3); | 
|   | 
|         helper.getRecentRecords(component, event, helper); | 
|         helper.getRecordByValue(component, event, helper); | 
|         helper.getRecordLabel(component, event, helper); | 
|   | 
|         var randomNumber = Math.floor(1000 + Math.random() * 9000); | 
|   | 
|         component.set('v.idNumber', randomNumber); | 
|          | 
|         component.set('v.isMobile', $A.get('$Browser.formFactor') === 'DESKTOP' ? false : true); | 
|     }, | 
|     handleInputClick: function(component, event, helper) { | 
|         event.stopPropagation(); | 
|     }, | 
|     handleSearchingClick: function(component, event, helper) { | 
|         component.set('v.searching', false); | 
|     }, | 
|     handleInputFocus: function(component, event, helper) { | 
|         $A.util.addClass(component.find('lookup'), 'sl-lookup--open'); | 
|          | 
|         if (component.get('v.disabled')) { | 
|             return; | 
|         } | 
|   | 
|         helper.getRecordsBySearchTerm(component, event, helper); | 
|     }, | 
|     cancelLookup: function(component, event, helper) { | 
|         helper.closeMobileLookup(component, event, helper); | 
|     }, | 
|     handleInputKeyDown: function(component, event, helper) { | 
|         if (component.get('v.disabled')) { | 
|             return; | 
|         } | 
|   | 
|         var KEYCODE_TAB = 9; | 
|   | 
|         var keyCode = event.which || event.keyCode || 0; | 
|   | 
|         if (keyCode === KEYCODE_TAB) { | 
|             helper.closeMenu(component, event, helper); | 
|         } | 
|     }, | 
|     handleInputKeyPress: function(component, event, helper) { | 
|         if (component.get('v.disabled')) { | 
|             return; | 
|         } | 
|     }, | 
|     handleInputKeyUp: function(component, event, helper) { | 
|         if (component.get('v.disabled')) { | 
|             return; | 
|         } | 
|   | 
|         var KEYCODE_ENTER = 13; | 
|         var KEYCODE_UP = 38; | 
|         var KEYCODE_DOWN = 40; | 
|   | 
|         var keyCode = event.which || event.keyCode || 0; | 
|   | 
|         if (keyCode === KEYCODE_ENTER) { | 
|             helper.updateValueByFocusIndex(component, event, helper); | 
|         } else if (keyCode === KEYCODE_UP) { | 
|             helper.moveRecordFocusUp(component, event, helper); | 
|         } else if (keyCode === KEYCODE_DOWN) { | 
|             helper.moveRecordFocusDown(component, event, helper); | 
|         } else { | 
|             helper.getRecordsBySearchTerm(component, event, helper); | 
|         } | 
|     }, | 
|   | 
|     handleRecordClick: function(component, event, helper) { | 
|         event.preventDefault(); | 
|         event.stopPropagation(); | 
|   | 
|         var focusIndex = event.currentTarget.dataset.index; | 
|   | 
|         component.set('v.focusIndex', focusIndex); | 
|   | 
|         helper.updateValueByFocusIndex(component, event, helper); | 
|     }, | 
|     handleNewRecordClick: function(component, event, helper) { | 
|         event.preventDefault(); | 
|         event.stopPropagation(); | 
|   | 
|         helper.addNewRecord(component, event, helper); | 
|     }, | 
|     handlePillClick: function(component, event, helper) { | 
|         event.preventDefault(); | 
|         event.stopPropagation(); | 
|   | 
|         component.set('v.value', ''); | 
|   | 
|         helper.getRecordsBySearchTerm(component, event, helper); | 
|   | 
|         window.setTimeout($A.getCallback(function() { | 
|             component.find('lookupInput').getElement().focus(); | 
|         }), 1); | 
|     }, | 
|   | 
|     handleFocusIndexChange: function(component, event, helper) { | 
|         var focusIndex = component.get('v.focusIndex'); | 
|         var lookupMenu = component.find('lookupMenu').getElement(); | 
|   | 
|         if (!$A.util.isEmpty(lookupMenu)) { | 
|             var options = lookupMenu.getElementsByTagName('li'); | 
|             var focusScrollTop = 0; | 
|             var focusScrollBottom = 0; | 
|   | 
|             for (var i = 0; i < options.length; i++) { | 
|                 var optionSpan = options[i].getElementsByTagName('span')[0]; | 
|   | 
|                 if (i === focusIndex) { | 
|                     $A.util.addClass(optionSpan, 'slds-has-focus'); | 
|                 } else { | 
|                     if (i < focusIndex) { | 
|                         focusScrollTop += options[i].scrollHeight; | 
|                     } | 
|   | 
|                     $A.util.removeClass(optionSpan, 'slds-has-focus'); | 
|                 } | 
|             } | 
|   | 
|             if (focusIndex !== null) { | 
|                 focusScrollBottom = focusScrollTop + options[focusIndex].scrollHeight; | 
|             } | 
|   | 
|             if (focusScrollTop < lookupMenu.scrollTop) { | 
|                 lookupMenu.scrollTop = focusScrollTop; | 
|             } else if (focusScrollBottom > lookupMenu.scrollTop + lookupMenu.clientHeight) { | 
|                 lookupMenu.scrollTop = focusScrollBottom - lookupMenu.clientHeight; | 
|             } | 
|         } | 
|     }, | 
|     handleValueChange: function(component, event, helper) { | 
|         var value = component.get('v.value'); | 
|   | 
|         if ($A.util.isEmpty(value)) { | 
|             component.set('v.valueLabel', ''); | 
|         } else if ($A.util.isEmpty(component.get('v.valueLabel'))) { | 
|             helper.getRecordByValue(component, event, helper); | 
|         } | 
|     }, | 
|   | 
|     handleFilterChange: function(component, event, helper) { | 
|         component.set('v.initCallsRunning', 2); | 
|   | 
|         helper.getRecordByValue(component, event, helper); | 
|         helper.getRecentRecords(component, event, helper); | 
|   | 
|         component.find('lookupInput').getElement().value = ''; | 
|         helper.getRecordsBySearchTerm(component, event, helper); | 
|     }, | 
|     handleLimitChange: function(component, event, helper) { | 
|         component.find('lookupInput').getElement().value = ''; | 
|         helper.getRecordsBySearchTerm(component, event, helper); | 
|     }, | 
|     handleObjectChange: function(component, event, helper) { | 
|         component.set('v.initCallsRunning', 3); | 
|   | 
|         helper.getRecentRecords(component, event, helper); | 
|         helper.getRecordByValue(component, event, helper); | 
|         helper.getRecordLabel(component, event, helper); | 
|   | 
|         component.find('lookupInput').getElement().value = ''; | 
|         helper.getRecordsBySearchTerm(component, event, helper); | 
|     }, | 
|     handleOrderChange: function(component, event, helper) { | 
|         component.set('v.initCallsRunning', 1); | 
|   | 
|         helper.getRecentRecords(component, event, helper); | 
|   | 
|         component.find('lookupInput').getElement().value = ''; | 
|         helper.getRecordsBySearchTerm(component, event, helper); | 
|     }, | 
|     handleSearchfieldChange: function(component, event, helper) { | 
|         component.set('v.initCallsRunning', 2); | 
|   | 
|         helper.getRecentRecords(component, event, helper); | 
|         helper.getRecordByValue(component, event, helper); | 
|   | 
|         component.find('lookupInput').getElement().value = ''; | 
|         helper.getRecordsBySearchTerm(component, event, helper); | 
|     }, | 
|     handleSubtitlefieldChange: function(component, event, helper) { | 
|         component.set('v.initCallsRunning', 1); | 
|   | 
|         helper.getRecentRecords(component, event, helper); | 
|   | 
|         component.find('lookupInput').getElement().value = ''; | 
|         helper.getRecordsBySearchTerm(component, event, helper); | 
|     }, | 
|   | 
|     showError: function(component, event, helper) { | 
|         var errorMessage = event.getParam('arguments').errorMessage; | 
|   | 
|         component.set('v.errorMessage', errorMessage); | 
|         component.set('v.error', true); | 
|     }, | 
|     hideError: function(component, event, helper) { | 
|         component.set('v.errorMessage', null); | 
|         component.set('v.error', false); | 
|     } | 
| }) | 
| /*Copyright 2017 Appiphony, LLC | 
|   | 
| Redistribution and use in source and binary forms, with or without modification, are permitted provided that the  | 
| following conditions are met: | 
|   | 
| 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following  | 
| disclaimer. | 
| 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following  | 
| disclaimer in the documentation and/or other materials provided with the distribution. | 
| 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote  | 
| products derived from this software without specific prior written permission. | 
|   | 
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,  | 
| INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE  | 
| DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  | 
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR  | 
| SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  | 
| WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE  | 
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.*/ |