apex4x
Version:
The Comprehensive ARIA Development Suite
1,276 lines (1,131 loc) • 48.1 kB
JavaScript
/*@license
ARIA Combobox Module 3.7 for Apex 4X
Author: Bryan Garaventa (https://www.linkedin.com/in/bgaraventa)
Home: WhatSock.com : Download: https://github.com/whatsock/apex
License: MIT (https://opensource.org/licenses/MIT)
Required dependencies: SmoothScroll.js, AccName.js, CurrentDevice.js
*/
(function () {
if (!("Combobox" in $A)) {
$A.import(["CurrentDevice", "SmoothScroll", "AccName"], {
name: "ComboboxModule",
props: props,
once: true,
call: function (props) {
$A.extend({
Combobox: function (config) {
var sel = config.select || false,
combobox = config.input || false,
accName =
($A.isFn($A.getAccName) && $A.getAccName(config.input).name) ||
"",
child = config.childNode || false;
if (!sel || !combobox) return null;
var isInput =
["input", "textarea"].indexOf(combobox.nodeName.toLowerCase()) !==
-1;
if (!isInput && !child) return null;
$A.setAttr(combobox, {
role: "combobox",
"aria-expanded": "false",
"aria-autocomplete": "list",
"aria-haspopup": "listbox",
});
var baseId = $A.genId(),
that = this,
start = false;
if (!combobox.id) combobox.id = baseId;
var options = {
id: baseId,
role: "List",
returnFocus: false,
exposeBounds: true,
exposeHiddenClose: true,
delay: config.delay || 1000,
style: config.style,
animate: config.animate,
hiddenCloseName: "Close Popup",
displayHiddenClose: false,
className: "toplevel-div clearfix",
middleClass: "middle-div clearfix",
listboxClass: "listbox clearfix",
optionClass: "option clearfix",
activeClass: "active",
toggleClassName: "pressed",
triggerNode: combobox,
widgetType: "Combobox",
autoCloseSameWidget: true,
cb: {
selected: [],
select: function (dc, o, select) {
if (!$A.isNode(o) || !o.id) {
$A.remAttr(dc.triggerNode, [
"aria-activedescendant",
"aria-controls",
]);
dc.cb.activeDescendant = false;
return;
}
$A.remClass(dc.cb.selected, dc.activeClass);
dc.cb.selected = [];
if (select) {
$A.setAttr(dc.triggerNode, "aria-activedescendant", o.id);
dc.cb.activeDescendant = true;
$A.addClass(o, dc.activeClass);
dc.cb.selected.push(o);
that.scrollIntoView(o, dc.scrollCallback, dc);
} else {
$A.remAttr(dc.triggerNode, [
"aria-activedescendant",
"aria-controls",
]);
dc.cb.activeDescendant = false;
}
},
key: "",
charMin: 0,
baseId: baseId,
baseInc: 1,
options: {},
optionNodes: [],
size: 0,
readonly: false,
multiple: false,
checked: false,
multipleDivider: function (values) {
return values.join("");
},
required: false,
parentTag: config.parentTag || "ul",
childTag: config.childTag || "li",
names: [],
values: [],
matches: [],
value: "",
showAll: false,
substringMatch: false,
wordMatch: false,
autoComplete: false,
currentOption: null,
activeDescendant: false,
sIndex: -1,
clicked: false,
mClicked: false,
isInput: isInput,
setDefault: true,
bound: false,
fn: {
update: function () {
var dc = this.dc;
that.close();
dc.cb.options = {};
dc.cb.currentOption = null;
dc.cb.names = [];
dc.cb.values = [];
dc.cb.readonly = dc.cb.isInput
? combobox.readOnly
? true
: false
: true;
dc.cb.required = dc.cb.isInput
? combobox.required
? true
: false
: $A.getAttr(dc.triggerNode, "aria-required") === "true"
? true
: false;
dc.cb.multiple = $A.getAttr(dc.cb.sel, "multiple")
? true
: false;
dc.cb.optionNodes = $A.query("option", dc.cb.sel);
if (dc.cb.readonly) {
dc.cb.substringMatch = dc.cb.wordMatch = false;
}
for (var i = 0; i < dc.cb.optionNodes.length; i++) {
dc.cb.baseInc++;
var name = $A
.trim($A.getText(dc.cb.optionNodes[i]))
.replace(/<|>/g, ""),
oId = dc.cb.baseId + dc.cb.baseInc,
o =
"<" +
dc.cb.childTag +
' role="option" tabindex="-1" id="' +
oId +
'" data-value="' +
dc.cb.optionNodes[i].value +
'" class="' +
dc.optionClass +
'" ';
if (dc.cb.multiple) o += 'aria-selected="false" ';
o +=
"><a><span>" +
name +
"</span></a></" +
dc.cb.childTag +
">";
dc.cb.options[dc.cb.optionNodes[i].value] = {
content: o,
id: oId,
so: dc.cb.optionNodes[i],
checked: dc.cb.optionNodes[i].selected,
no: name,
v: dc.cb.optionNodes[i].value,
i: i,
};
dc.cb.names.push(name);
dc.cb.values.push(dc.cb.optionNodes[i].value);
}
dc.cb.sel.selectedIndex =
dc.cb.sel.selectedIndex >= 0
? dc.cb.sel.selectedIndex
: 0;
if (!dc.cb.multiple)
dc.cb.fn.setValue(
dc.cb.options[
dc.cb.optionNodes[dc.cb.sel.selectedIndex].value
],
true,
);
else {
dc.cb.autoComplete = true;
dc.cb.fn.setValue(false, true);
}
if (dc.cb.required && dc.cb.isInput)
$A.setAttr(dc.triggerNode, {
"aria-required": "true",
});
},
render: function (pass, scroll, noRecheck) {
var dc = this.dc;
if (dc.cb.multiple && !noRecheck) {
for (var value in dc.cb.options) {
var option = dc.cb.options[value];
$A.setAttr(
option.o,
"aria-selected",
option.checked ? "true" : "false",
);
} // End for loop
}
if (dc.cb.readonly) {
var pShowAll = dc.cb.showAll;
dc.cb.showAll = true;
}
if (!dc.cb.readonly && !dc.cb.showAll && !dc.cb.value) {
dc.cb.showAll = pShowAll;
return true;
}
if (!scroll) {
dc.cb.sIndex = dc.cb.sel.selectedIndex;
dc.cb.matches = [];
if (dc.loaded) {
that.close(function () {
that.open(true);
});
return dc;
}
}
if (scroll && dc.cb.key) {
var v = dc.cb.key.toLowerCase(),
fd = false,
oI = dc.cb.sIndex;
dc.cb.sIndex++;
for (var i = dc.cb.sIndex; i < dc.cb.names.length; i++) {
if ($A.inArray(v, dc.cb.names[i].toLowerCase()) === 0) {
fd = true;
dc.cb.sIndex = i;
break;
}
}
if (!fd) {
dc.cb.sIndex = 0;
for (var i = dc.cb.sIndex; i < oI; i++) {
if (
$A.inArray(v, dc.cb.names[i].toLowerCase()) === 0
) {
fd = true;
dc.cb.sIndex = i;
break;
}
}
}
if (!fd) dc.cb.sIndex = oI;
else {
if (!dc.cb.multiple) {
dc.cb.currentOption =
dc.cb.options[dc.cb.values[dc.cb.sIndex]];
dc.cb.value = dc.cb.currentOption.no;
} else {
dc.cb.currentOption = [];
dc.cb.currentOption[0] =
dc.cb.options[dc.cb.values[dc.cb.sIndex]];
dc.cb.value = dc.cb.currentOption[0].no;
}
if (!dc.cb.multiple) {
dc.cb.select(dc, dc.cb.currentOption.o, true);
} else {
dc.cb.select(dc, dc.cb.currentOption[0].o, true);
}
}
} else {
if (pass || dc.cb.showAll || dc.cb.readonly) {
dc.cb.matches = dc.cb.values;
} else {
for (var i = 0; i < dc.cb.names.length; i++) {
if (dc.cb.wordMatch) {
var vA = $A
.trim(dc.cb.value)
.toLowerCase()
.split(" "),
nA = $A
.trim(dc.cb.names[i])
.toLowerCase()
.split(" "),
vx = 0,
nx = 0;
for (var z = 0; z < vA.length; z++) {
for (var y = 0; y < nA.length; y++) {
if (
$A.trim(vA[z]) &&
$A.trim(nA[y]) &&
$A.inArray($A.trim(vA[z]), $A.trim(nA[y])) !==
-1 &&
$A.trim(vA[z]).length ===
$A.trim(nA[y]).length
) {
nx++;
break;
}
}
vx++;
}
if (vx && nx && vx <= nx) {
dc.cb.matches.push(dc.cb.values[i]);
}
} else if (
(!dc.cb.wordMatch &&
!dc.cb.substringMatch &&
$A.inArray(
dc.cb.value.toLowerCase(),
dc.cb.names[i].toLowerCase(),
) === 0) ||
(!dc.cb.wordMatch &&
dc.cb.substringMatch &&
$A.inArray(
dc.cb.value.toLowerCase(),
dc.cb.names[i].toLowerCase(),
) !== -1)
)
dc.cb.matches.push(dc.cb.values[i]);
}
}
if (!dc.cb.matches.length) return true;
if (dc.cb.readonly)
dc.cb.sIndex = dc.cb.sel.selectedIndex;
else dc.cb.sIndex = 0;
if (dc.cb.readonly) {
dc.cb.showAll = pShowAll;
dc.cb.currentObject =
dc.cb.options[dc.cb.matches[dc.cb.sIndex]];
}
}
return false;
},
setAltTrigger: function (o) {
if (!o || o.nodeType !== 1) return;
var dc = this.dc;
$A.setAttr(o, {
role: "button",
"aria-expanded": "false",
});
$A.setAttr(o, {
"aria-label":
($A.isFn($A.getAccName) &&
$A.getAccName(dc.triggerNode).name) ||
$A.getText(dc.triggerNode),
});
dc.cb.altClicked = false;
$A.off(o, "click");
$A.on(o, "click", function (ev) {
if (!dc.cb.altClicked) {
dc.cb.altClicked = true;
if (!dc.loaded) {
that.open();
} else {
if (dc.cb.multiple && dc.cb.mClicked) {
dc.cb.fn.setValue(false, false, true);
dc.cb.mClicked = false;
}
that.close();
}
dc.triggerNode.focus();
setTimeout(function () {
dc.cb.altClicked = false;
}, 300);
}
ev.stopPropagation();
ev.preventDefault();
});
dc.cb.altTrigger = o;
},
setValue: function (option, pass, manual) {
var dc = this.dc;
if (option && !dc.cb.multiple) {
dc.cb.value = option.no;
dc.cb.currentOption = option;
if (!pass) option.so.selected = true;
if (
!pass &&
dc.cb.fn.onSelect &&
$A.isFn(dc.cb.fn.onSelect)
) {
var nv = dc.cb.fn.onSelect.apply(dc.triggerNode, [
option.no,
option.v,
dc.triggerNode,
dc.cb.sel,
]);
if (nv || $A.isStr(nv)) dc.cb.value = nv;
} else if (dc.cb.isInput) {
if (manual || dc.cb.setDefault)
dc.triggerNode.value = dc.cb.value;
} else {
if (manual || dc.cb.setDefault) {
dc.cb.child.innerHTML = dc.cb.value;
}
}
} else if (!option && dc.cb.multiple) {
var soNodes = [];
if (pass) {
soNodes = $A.query("option[selected]", dc.cb.sel);
for (var i = 0; i < soNodes.length; i++) {
dc.cb.options[soNodes[i].value].checked = true;
}
}
dc.cb.currentOption = [];
dc.cb.value = "";
var vals = [];
for (var value in dc.cb.options) {
var option = dc.cb.options[value];
if (!pass) {
option.checked =
$A.getAttr(option.o, "aria-selected") === "true";
option.so.selected = option.checked;
}
if (option.checked) {
dc.cb.currentOption.push(option);
soNodes.push(option.so);
vals.push(option.no);
}
} // End for loop
dc.cb.value = dc.cb.multipleDivider(vals);
if (
!pass &&
dc.cb.fn.onSelect &&
$A.isFn(dc.cb.fn.onSelect)
) {
var nv = dc.cb.fn.onSelect.apply(dc.triggerNode, [
dc.cb.value,
soNodes,
dc.triggerNode,
dc.cb.sel,
]);
if (nv || $A.isStr(nv)) dc.cb.value = nv;
} else if (dc.cb.isInput) {
if (manual || dc.cb.setDefault)
dc.triggerNode.value = dc.cb.value;
} else {
if (manual || dc.cb.setDefault) {
dc.cb.child.innerHTML = dc.cb.value;
}
}
}
dc.cb.pValue = dc.cb.value;
},
checkValue: function (v) {
var dc = this.dc;
if (!(v && v.length >= dc.cb.charMin)) return -1;
for (var i = 0; i < dc.cb.names.length; i++) {
if (
$A.trim(v) &&
$A.trim(v.toLowerCase()) ==
$A.trim(dc.cb.names[i].toLowerCase())
) {
return i;
}
}
return -1;
},
unsetValue: function (pass) {
var dc = this.dc;
if (!pass && dc.cb.sel.selectedIndex >= 0)
dc.cb.optionNodes[dc.cb.sel.selectedIndex].selected =
false;
dc.cb.currentOption = null;
if (dc.cb.isInput) {
dc.cb.value = dc.triggerNode.value;
} else {
dc.cb.value = $A.getText(dc.cb.child);
}
},
bind: function () {
var dc = this.dc;
if (dc.cb.bound) return;
$A.off(dc.triggerNode, ".4XCombobox");
var touched = false,
touchDelay = null,
handleClick = function (ev) {
if (!dc.cb.altTrigger) {
if (!dc.loaded) {
that.open();
} else if (dc.loaded) that.close();
}
};
$A.on(
dc.triggerNode,
{
touchstart: function (ev) {
touched = true;
if (!touchDelay && dc.loaded)
handleClick.call(this, ev);
touchDelay = setTimeout(function () {
touchDelay = null;
}, 1000);
},
mousedown: function (ev) {
// if (dc.cb.isInput) handleClick.call(this, ev);
ev.stopPropagation();
},
click: function (ev) {
if (!dc.cb.isInput) handleClick.call(this, ev);
ev.stopPropagation();
},
keydown: function (ev) {
var e = this,
k = $A.keyEvent(ev);
ev.stopPropagation();
if (k === 9) {
if (dc.loaded) {
if (
dc.cb.autoComplete &&
dc.cb.activeDescendant
) {
if (!dc.cb.multiple)
dc.cb.fn.setValue(
dc.cb.options[dc.cb.matches[dc.cb.sIndex]],
false,
true,
);
else dc.cb.fn.setValue(false, false, true);
}
that.close();
}
} else if (
(k === 13 || k === 32) &&
!dc.cb.isInput &&
!dc.cb.activeDescendant &&
!dc.loaded
) {
that.open();
ev.preventDefault();
} else if (
!dc.cb.multiple &&
(k === 13 || k === 32) &&
dc.cb.activeDescendant &&
dc.loaded
) {
dc.cb.fn.setValue(
dc.cb.options[dc.cb.matches[dc.cb.sIndex]],
false,
true,
);
that.close();
announceVal();
ev.preventDefault();
} else if (
dc.cb.multiple &&
k === 13 &&
dc.cb.activeDescendant &&
dc.loaded
) {
dc.cb.fn.setValue(false, false, true);
that.close();
announceVal();
ev.preventDefault();
} else if (
dc.cb.multiple &&
k === 32 &&
dc.cb.activeDescendant &&
dc.loaded
) {
$A.setAttr(
dc.cb.options[dc.cb.matches[dc.cb.sIndex]].o,
"aria-selected",
$A.getAttr(
dc.cb.options[dc.cb.matches[dc.cb.sIndex]].o,
"aria-selected",
) === "true"
? "false"
: "true",
);
if (dc.cb.autoSaveIfChecked) {
dc.cb.fn.setValue(false, false, true);
}
ev.preventDefault();
} else if (
dc.cb.readonly &&
((k >= 48 && k <= 57) || (k >= 65 && k <= 90))
) {
dc.cb.key += String.fromCharCode(k);
dc.cb.fn.render(false, true, true);
if (dc.cb.keyReset) clearTimeout(dc.cb.keyReset);
dc.cb.keyReset = setTimeout(function () {
dc.cb.key = "";
}, 1500);
}
if (dc.cb.showAllIfEmpty && e.value) {
dc.cb.showAll = dc.fn.showAll;
}
if (
dc.cb.readonly &&
dc.loaded &&
(k === 37 || k === 39)
) {
ev.preventDefault();
} else if (
k === 40 &&
!dc.cb.activeDescendant &&
!dc.loaded &&
!e.value &&
dc.cb.showAllIfEmpty
) {
dc.cb.showAll = true;
dc.cb.sIndex =
(dc.cb.readonly || dc.cb.showAll) &&
dc.cb.sel.selectedIndex >= 0
? dc.cb.sel.selectedIndex
: 0;
if (!$A.isNum(dc.cb.sIndex)) dc.cb.sIndex = 0;
that.open();
ev.preventDefault();
} else if (
k === 40 &&
!dc.cb.activeDescendant &&
!dc.loaded &&
dc.cb.readonly
) {
dc.cb.sIndex =
(dc.cb.readonly || dc.cb.showAll) &&
dc.cb.sel.selectedIndex >= 0
? dc.cb.sel.selectedIndex
: 0;
if (!$A.isNum(dc.cb.sIndex)) dc.cb.sIndex = 0;
that.open();
ev.preventDefault();
} else if (
k === 40 &&
!dc.cb.activeDescendant &&
dc.loaded
) {
dc.cb.sIndex =
dc.cb.readonly &&
dc.cb.showAll &&
dc.cb.sel.selectedIndex >= 0
? dc.cb.sel.selectedIndex
: 0;
dc.cb.select(
dc,
dc.cb.options[dc.cb.matches[dc.cb.sIndex]].o,
true,
);
ev.preventDefault();
} else if (
k === 40 &&
dc.cb.activeDescendant &&
dc.loaded
) {
if (dc.cb.sIndex < dc.cb.matches.length - 1)
dc.cb.sIndex++;
else dc.cb.sIndex = 0;
dc.cb.select(
dc,
dc.cb.options[dc.cb.matches[dc.cb.sIndex]].o,
true,
);
ev.preventDefault();
} else if (
ev.altKey &&
k === 38 &&
dc.cb.activeDescendant &&
dc.loaded
) {
if (!dc.cb.multiple)
dc.cb.fn.setValue(
dc.cb.options[dc.cb.matches[dc.cb.sIndex]],
false,
true,
);
else dc.cb.fn.setValue(false, false, true);
that.close();
announceVal();
ev.preventDefault();
} else if (
k === 38 &&
dc.cb.activeDescendant &&
dc.loaded
) {
if (dc.cb.sIndex > 0) dc.cb.sIndex--;
else dc.cb.sIndex = dc.cb.matches.length - 1;
dc.cb.select(
dc,
dc.cb.options[dc.cb.matches[dc.cb.sIndex]].o,
true,
);
ev.preventDefault();
} else if (k === 27 || k === 37 || k === 39) {
dc.cb.select(dc);
if (k === 27) that.close();
}
},
keyup: function (ev) {
var e = this,
k = $A.keyEvent(ev);
if (!dc.cb.readonly && k !== 9) {
if (dc.cb.isInput) dc.cb.value = e.value;
var x = dc.cb.fn.checkValue(dc.cb.value);
if (dc.cb.value && x !== -1) {
var option = dc.cb.options[dc.cb.values[x]];
if (!dc.cb.multiple) dc.cb.currentOption = option;
else {
dc.cb.currentOption = [];
dc.cb.currentOption[0] = option;
}
option.so.selected = true;
that.close();
} else {
if (
dc.cb.value &&
dc.cb.value.length >= dc.cb.charMin
) {
var skp =
dc.cb.isInput && !dc.cb.readonly
? true
: false;
if (skp) {
if (
!dc.cb.pValue ||
dc.cb.pValue !== combobox.value
) {
dc.cb.pValue = combobox.value;
skp = false;
}
}
if (!skp) {
dc.cb.fn.render();
that.open(true);
}
} else if (
!(dc.cb.multiple || k === 38 || k === 40)
) {
that.close();
}
}
}
},
focus: function (ev) {},
blur: function (ev) {
if (!touched && !dc.cb.multiple) {
setTimeout(function () {
if (!dc.cb.altClicked) {
if (dc.loaded) {
if (
dc.cb.autoComplete &&
dc.cb.activeDescendant &&
!dc.cb.clicked
)
dc.cb.fn.setValue(
dc.cb.options[
dc.cb.matches[dc.cb.sIndex]
],
false,
true,
);
that.close();
}
dc.cb.clicked = false;
}
}, 150);
}
},
},
null,
".4XCombobox",
);
dc.cb.bound = true;
},
set: function () {
var dc = this.dc;
dc.cb.select(dc);
$A.setAttr(dc.triggerNode, {
"aria-expanded": "false",
});
if (!dc.cb.isInput) {
dc.cb.baseInc++;
if (!dc.cb.child.id)
$A.setAttr(dc.cb.child, {
tabindex: "-1",
id: dc.cb.baseId + dc.cb.baseInc,
});
$A.addIdRef(
dc.triggerNode,
"aria-labelledby",
dc.cb.child.id,
);
}
},
onSelect: null,
onOpen: null,
onClose: null,
onTriggerChange: null,
setSize: function () {
var dc = this.dc,
s =
(dc.cb.size || 5) <= dc.cb.matches.length
? dc.cb.size || 5
: dc.cb.matches.length,
o = dc.cb.options[dc.cb.matches[0]].o,
h = $A.elementHeight(o);
h +=
parseInt($A.css(o, "margin-top"), 10) +
parseInt($A.css(o, "margin-bottom"), 10);
h =
s * h +
(parseInt($A.css(dc.content, "padding-top"), 10) +
parseInt($A.css(dc.content, "padding-bottom"), 10));
$A.css(dc.content, "height", h);
},
},
},
click: function (ev, dc) {
ev.stopPropagation();
},
beforeRender: function (dc) {
if (!dc.cb.matches.length) return (dc.cancel = true);
dc.fn.matches = dc.cb.matches;
dc.cb.baseInc++;
dc.content = that.listboxNode = $A.create(
dc.cb.parentTag,
{
role: "listbox",
"aria-label": accName,
id: dc.cb.baseId + dc.cb.baseInc,
"aria-multiselectable": dc.cb.multiple ? "true" : "false",
},
null,
dc.listboxClass,
);
for (var i = 0; i < dc.cb.matches.length; i++) {
if (!$A.isNode(dc.cb.options[dc.cb.matches[i]].o))
dc.cb.options[dc.cb.matches[i]].o = $A.toNode(
dc.cb.options[dc.cb.matches[i]].content,
true,
);
dc.content.appendChild(dc.cb.options[dc.cb.matches[i]].o);
}
},
duringRender: function (dc) {
$A.addClass(dc.container, dc.middleClass);
},
afterRender: function (dc) {
$A.setAttr(that.combobox, "aria-controls", that.listboxNode.id);
if (dc.cb.matches !== dc.fn.matches) {
dc.beforeRender(dc);
dc.insert(dc.content);
}
$A.query(dc.cb.matches, function (i, v) {
$A.off(dc.cb.options[v].o, "click");
$A.on(dc.cb.options[v].o, {
click: function (ev) {
if (!dc.cb.multiple) {
dc.cb.fn.setValue(dc.cb.options[v], false, true);
dc.cb.clicked = true;
that.close();
announceVal();
} else {
var o = dc.cb.options[v].o;
if (o)
$A.setAttr(
o,
"aria-selected",
$A.getAttr(o, "aria-selected") === "true"
? "false"
: "true",
);
dc.cb.mClicked = true;
}
ev.preventDefault();
},
focus: function (ev) {},
});
});
if (!(dc.cb.sIndex >= 0)) dc.cb.sIndex = 0;
if (dc.cb.readonly) {
dc.cb.select(
dc,
dc.cb.options[dc.cb.matches[dc.cb.sIndex]].o,
true,
);
}
dc.cb.fn.setSize();
if ($A.device.type !== "desktop")
setTimeout(function () {
$A.announce(
dc.cb.options[dc.cb.matches[dc.cb.sIndex]].no,
false,
);
}, 1);
$A.setAttr(dc.triggerNode, "aria-expanded", "true");
if (dc.cb.altTrigger && dc.cb.altTrigger.nodeType === 1) {
$A.addClass(dc.cb.altTrigger, dc.toggleClassName);
$A.setAttr(dc.cb.altTrigger, "aria-expanded", "true");
if (
dc.cb.fn.onTriggerChange &&
$A.isFn(dc.cb.fn.onTriggerChange)
)
dc.cb.fn.onTriggerChange.apply(dc.cb.altTrigger, [
dc.cb.altTrigger,
dc.loaded,
]);
}
if (dc.cb.fn.onOpen && $A.isFn(dc.cb.fn.onOpen))
dc.cb.fn.onOpen.apply(dc.triggerNode, [dc]);
},
beforeRemove: function (dc) {
if (dc.loaded) {
if (dc.cb.multiple && dc.cb.mClicked) {
dc.cb.fn.setValue(false, false, true);
}
}
},
afterRemove: function (dc) {
dc.cb.mClicked = false;
dc.cb.select(dc);
$A.setAttr(dc.triggerNode, {
"aria-expanded": "false",
});
if (dc.cb.altTrigger && dc.cb.altTrigger.nodeType === 1) {
$A.remClass(dc.cb.altTrigger, dc.toggleClassName);
$A.setAttr(dc.cb.altTrigger, {
"aria-expanded": "false",
});
if (
dc.cb.fn.onTriggerChange &&
$A.isFn(dc.cb.fn.onTriggerChange)
)
dc.cb.fn.onTriggerChange.apply(dc.cb.altTrigger, [
dc.cb.altTrigger,
dc.loaded,
]);
}
if (dc.cb.fn.onClose && $A.isFn(dc.cb.fn.onClose))
dc.cb.fn.onClose.apply(dc.triggerNode, [dc]);
},
onCreate: function (dc) {
that.combobox = dc.triggerNode;
that.select = dc.cb.sel;
},
scrollConfig: config.scrollConfig || {},
};
$A.extend(options, config.override || {});
var dc = $A([options])[0];
dc.cb.dc = dc.cb.fn.dc = that.dc = dc;
dc.cb.sel = sel;
dc.cb.child = child;
var announceVal = function () {
if (!(dc.cb.fn.onSelect && $A.isFn(dc.cb.fn.onSelect))) {
setTimeout(function () {
if (!dc.cb.multiple || dc.cb.isInput) {
$A.announce(dc.cb.value.toString(), false, true);
} else if (dc.cb.child) {
$A.announce(dc.cb.child, false, true);
}
}, 150);
}
};
that.setCharMin = function (v) {
if ($A.isNum(v) && v >= 0) dc.cb.charMin = v;
};
that.setShowAll = function (v) {
dc.cb.showAll = dc.fn.showAll = v ? true : false;
};
that.setShowAllIfEmpty = function (v) {
dc.cb.showAllIfEmpty = v ? true : false;
};
that.setAutoSaveIfChecked = function (v) {
dc.cb.autoSaveIfChecked = v ? true : false;
};
that.setSubstringMatch = function (v) {
dc.cb.substringMatch = v ? true : false;
};
that.setWordMatch = function (v) {
dc.cb.wordMatch = v ? true : false;
};
that.setTags = function (o) {
if (o.parentTag) dc.cb.parentTag = o.parentTag;
if (o.childTag) dc.cb.childTag = o.childTag;
};
that.setOffset = function (o) {
if (!isNaN(o.left)) dc.offsetLeft = o.left;
if (!isNaN(o.top)) dc.offsetTop = o.top;
};
that.setAutoComplete = function (v) {
dc.cb.autoComplete = v ? true : false;
};
that.close = function (f) {
dc.remove(f);
};
that.open = function (passive) {
if (dc.loaded) return;
if (start) {
dc.cb.fn.render();
dc.render(function () {
if ($A.device.type === "desktop")
dc.cb.select(
dc,
dc.cb.options[dc.cb.matches[dc.cb.sIndex]].o,
true,
);
});
}
};
that.setAltTrigger = function (o) {
dc.cb.fn.setAltTrigger(o);
};
that.setAutoPosition = function (n) {
if (!isNaN(n) && n < 10) dc.autoPosition = n;
};
that.setSize = function (n) {
if (!isNaN(n) && n > 0) dc.cb.size = n;
};
that.setPosAnchor = function (o) {
dc.posAnchor = o;
};
that.setTargetNode = function (o) {
dc.targetNode = o;
};
that.setClassNames = function (o) {
if (o.toplevelClass) dc.className = o.toplevelClass;
if (o.middleClass) dc.middleClass = o.middleClass;
if (o.listboxClass) dc.listboxClass = o.listboxClass;
if (o.optionClass) dc.optionClass = o.optionClass;
if (o.activeClass) dc.activeClass = o.activeClass;
if (o.toggleClass) dc.toggleClassName = o.toggleClass;
};
that.setDefault = function (v) {
dc.cb.setDefault = v ? true : false;
};
that.setMultipleDivider = function (fn) {
if (fn && $A.isFn(fn)) dc.cb.multipleDivider = fn;
};
that.clearAll = function () {
that.close();
for (var value in dc.cb.options) {
var option = dc.cb.options[value];
option.so.selected = false;
option.checked = false;
$A.setAttr(option.o, "aria-selected", "false");
} // End for loop
if (dc.cb.isInput) dc.triggerNode.value = "";
else if (dc.cb.child) {
if (!dc.cb.multiple) $A.empty(dc.cb.child);
else dc.cb.fn.setValue(false, true);
}
};
that.update = function () {
dc.cb.fn.update();
};
that.start = function () {
start = true;
dc.cb.fn.bind();
dc.cb.fn.update();
if (
document.activeElement === combobox &&
(dc.cb.readonly || dc.cb.value)
) {
that.open();
}
};
that.stop = function () {
start = false;
that.close();
};
that.onSelect = function (fn) {
if (fn && $A.isFn(fn)) dc.cb.fn.onSelect = fn;
};
that.onOpen = function (fn) {
if (fn && $A.isFn(fn)) dc.cb.fn.onOpen = fn;
};
that.onClose = function (fn) {
if (fn && $A.isFn(fn)) dc.cb.fn.onClose = fn;
};
that.onTriggerChange = function (fn) {
if (fn && $A.isFn(fn)) dc.cb.fn.onTriggerChange = fn;
};
that.setPromptText = function (s) {
$A.setAttr(combobox, "aria-description", s);
};
that.setCloseText = function (s) {
if (!s) {
dc.exposeHiddenClose = false;
} else {
dc.exposeHiddenClose = true;
dc.hiddenCloseName = s;
}
};
that.scrollIntoView = function (o, cb, dc) {
$A.scrollTo(
o,
$A.extend(
{
duration: 100,
container: that.listboxNode,
complete: function () {
if ($A.isFn(cb)) cb.call(o, o);
},
},
dc.scrollConfig || {},
),
);
};
that.getValue = function () {
if (!dc.cb.multiple) return dc.cb.sel.value;
else {
var r = [];
for (var value in dc.cb.options) {
var option = dc.cb.options[value];
if (option.checked && option.so.selected) r.push(option.so);
} // End for loop
return r;
}
};
$A.on(window, "resize." + baseId, function () {
if (dc && dc.loaded) {
dc.setPosition();
dc.cb.fn.setSize();
}
});
$A(combobox).on("remove", function (mutation, node) {
$A.off(window, "." + baseId);
});
if (!dc.cb.isInput && !$A.getAttr(dc.triggerNode, "tabindex"))
$A.setAttr(dc.triggerNode, "tabindex", "0");
dc.cb.fn.set();
$A.remAttr(dc.triggerNode, ["data-controls"]);
return that;
},
});
},
});
}
})();