var esPhinx; (function($, $module) { "use strict"; var CSS_CLASS = "esphinx ui", CSS_CLASS_QUERY = "." + CSS_CLASS.replace(/ +/g, "."); $module.extend({ panels: {autocomplete: {}} }); $.Extender.extend($module.panels.autocomplete, true, { // new: function(searchTextBox, originalList, options = {}, callback) { new: function(searchTextBox, originalList, options, callback) { var nodeListFound, referenceElement, spanizedSliceFound, mapped, ConstructorReference = $module.panels.autocomplete.new, self = this, created = false, iteratorblock = function(i) { spanizedSliceFound = $(mapped[i].span()); spanizedSliceFound.addClass(CSS_CLASS + " slice-found"); mapped[i] = spanizedSliceFound; }, spanize = function(map) { mapped = map; Object.keys(map).forEach(iteratorblock); return map; }, composeMatch = function(mapped, nodeText, nodeTextAsArr) { var leftUnitName, rightUnitName, searchIndex, sliceFound, span, composedArr = [], iteratorblock = function(value, i) { if (mapped.hasOwnProperty(i)) { span = mapped[i]; sliceFound = span.text(); searchIndex = value.search(sliceFound); leftUnitName = value.slice(0, searchIndex); rightUnitName = value .slice(searchIndex + sliceFound.length, value.length); if (!leftUnitName.isEmpty()) { composedArr.push(window.document .createTextNode(leftUnitName)); } else { span.text(span.text()); } composedArr.push(span.asNode()); if (!rightUnitName.isEmpty()) { composedArr.push(window.document .createTextNode(rightUnitName)); } } else { composedArr.push(window.document .createTextNode(value)); } }; nodeTextAsArr.spaceOut().forEach(iteratorblock); return composedArr; }, resolveResponse = function(found, maps) { var composed, nodeText, nodeTextAsArr, mapped, resolved = $(), callback = function(node, i) { nodeText = $(node).text().trim(); nodeTextAsArr = nodeText.split(" "); mapped = spanize(maps[i]); composed = composeMatch(mapped, nodeText, nodeTextAsArr); resolved.concat(true, composeName(composed, node)); }; found.each(callback); return resolved; }, composeName = function(composedArr, node) { var copy = $(node).clone(), iteratorblock = function(v) { copy.append(v); }; composedArr.forEach(iteratorblock); return copy; }, create = function(referenceElement) { var nodeListFound = $("
    ") .addClass(CSS_CLASS + " list-built-found"), width, borderBottom, border, marginBottom, hitTarget = function(target) { return target.is(nodeListFound.childElements()) || target.is(referenceElement); }; if (referenceElement.isA(window.HTMLInputElement)) { referenceElement.on("focus", function() { if (nodeListFound.childElements().some()) { nodeListFound.show(); } }); referenceElement.on("blur", function(e) { if (e.relatedTarget) { if (!$(e.relatedTarget).is(nodeListFound)) { self.hide(); } } }); // clicking outside the panel $(window.document).on("mouseup", function(e) { var target = $(e.target); // debugger if (!target.isA(window.HTMLInputElement) && !target.isA(window.HTMLLIElement)) { target = target.parent("ol" + CSS_CLASS_QUERY + ".list-built-found li"); } if (!hitTarget(target)) { self.hide(); } else if (target .isA(window.HTMLLIElement)) { if (target.hasClass("selected")) { target.removeClass("selected"); } else { target.addClass("selected"); } } }); marginBottom = referenceElement.css("margin-bottom"); width = referenceElement.width(); borderBottom = referenceElement.css("border-bottom"); border = referenceElement.css("border"); nodeListFound.css("margin-top", -marginBottom + "px"); // only after set width, otherwise doesn't can get your border nodeListFound.insertAfter(referenceElement); if (width) { nodeListFound.css("position", "absolute"); // nodeListFound.width(width); nodeListFound.css("min-width", width); } nodeListFound.show(); } else { nodeListFound.insertAfter(referenceElement); } return nodeListFound; }, show = function(autocompletedList) { var callback = function(li) { nodeListFound.append(li); }; $(nodeListFound).clean(); if (searchTextBox.value()) { if (originalList instanceof $) { originalList.hide(); } autocompletedList.each(callback); if (nodeListFound.childElements().some()) { nodeListFound.show(); } else { nodeListFound.hide(); } } else { if (originalList instanceof $) { originalList.show(); } self.hide(); } return nodeListFound.childElements(); }; if (!(this instanceof ConstructorReference)) { return new ConstructorReference(searchTextBox, originalList, options, callback); } if (Object.areFromClass(originalList, Object)) { referenceElement = searchTextBox; callback = options; options = originalList; } else { referenceElement = originalList; } searchTextBox.autocomplete(originalList, options, function(found, mapped) { var resolvedResponse; if (!created) { created = true; nodeListFound = create(referenceElement); } if (typeof callback == "function") { callback = function() {}; } resolvedResponse = resolveResponse(found, mapped); callback.call(self, show(resolvedResponse)); }); this.hide = function() { nodeListFound.hide(); }; } }); })(esPhinx, esPhinx.ui);