");
+ $input.on("blur.tt", function($e) {
+ var active, isActive, hasActive;
+ active = document.activeElement;
+ isActive = $menu.is(active);
+ hasActive = $menu.has(active).length > 0;
+ if (_.isMsie() && (isActive || hasActive)) {
+ $e.preventDefault();
+ $e.stopImmediatePropagation();
+ _.defer(function() {
+ $input.focus();
+ });
+ }
+ });
+ $menu.on("mousedown.tt", function($e) {
+ $e.preventDefault();
+ });
+ },
+ _onSelectableClicked: function onSelectableClicked(type, $el) {
+ this.select($el);
+ },
+ _onDatasetCleared: function onDatasetCleared() {
+ this._updateHint();
+ },
+ _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) {
+ this._updateHint();
+ if (this.autoselect) {
+ var cursorClass = this.selectors.cursor.substr(1);
+ this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass);
+ }
+ this.eventBus.trigger("render", suggestions, async, dataset);
+ },
+ _onAsyncRequested: function onAsyncRequested(type, dataset, query) {
+ this.eventBus.trigger("asyncrequest", query, dataset);
+ },
+ _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {
+ this.eventBus.trigger("asynccancel", query, dataset);
+ },
+ _onAsyncReceived: function onAsyncReceived(type, dataset, query) {
+ this.eventBus.trigger("asyncreceive", query, dataset);
+ },
+ _onFocused: function onFocused() {
+ this._minLengthMet() && this.menu.update(this.input.getQuery());
+ },
+ _onBlurred: function onBlurred() {
+ if (this.input.hasQueryChangedSinceLastFocus()) {
+ this.eventBus.trigger("change", this.input.getQuery());
+ }
+ },
+ _onEnterKeyed: function onEnterKeyed(type, $e) {
+ var $selectable;
+ if ($selectable = this.menu.getActiveSelectable()) {
+ if (this.select($selectable)) {
+ $e.preventDefault();
+ $e.stopPropagation();
+ }
+ } else if (this.autoselect) {
+ if (this.select(this.menu.getTopSelectable())) {
+ $e.preventDefault();
+ $e.stopPropagation();
+ }
+ }
+ },
+ _onTabKeyed: function onTabKeyed(type, $e) {
+ var $selectable;
+ if ($selectable = this.menu.getActiveSelectable()) {
+ this.select($selectable) && $e.preventDefault();
+ } else if (this.autoselect) {
+ if ($selectable = this.menu.getTopSelectable()) {
+ this.autocomplete($selectable) && $e.preventDefault();
+ }
+ }
+ },
+ _onEscKeyed: function onEscKeyed() {
+ this.close();
+ },
+ _onUpKeyed: function onUpKeyed() {
+ this.moveCursor(-1);
+ },
+ _onDownKeyed: function onDownKeyed() {
+ this.moveCursor(+1);
+ },
+ _onLeftKeyed: function onLeftKeyed() {
+ if (this.dir === "rtl" && this.input.isCursorAtEnd()) {
+ this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());
+ }
+ },
+ _onRightKeyed: function onRightKeyed() {
+ if (this.dir === "ltr" && this.input.isCursorAtEnd()) {
+ this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());
+ }
+ },
+ _onQueryChanged: function onQueryChanged(e, query) {
+ this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();
+ },
+ _onWhitespaceChanged: function onWhitespaceChanged() {
+ this._updateHint();
+ },
+ _onLangDirChanged: function onLangDirChanged(e, dir) {
+ if (this.dir !== dir) {
+ this.dir = dir;
+ this.menu.setLanguageDirection(dir);
+ }
+ },
+ _openIfActive: function openIfActive() {
+ this.isActive() && this.open();
+ },
+ _minLengthMet: function minLengthMet(query) {
+ query = _.isString(query) ? query : this.input.getQuery() || "";
+ return query.length >= this.minLength;
+ },
+ _updateHint: function updateHint() {
+ var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;
+ $selectable = this.menu.getTopSelectable();
+ data = this.menu.getSelectableData($selectable);
+ val = this.input.getInputValue();
+ if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {
+ query = Input.normalizeQuery(val);
+ escapedQuery = _.escapeRegExChars(query);
+ frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i");
+ match = frontMatchRegEx.exec(data.val);
+ match && this.input.setHint(val + match[1]);
+ } else {
+ this.input.clearHint();
+ }
+ },
+ isEnabled: function isEnabled() {
+ return this.enabled;
+ },
+ enable: function enable() {
+ this.enabled = true;
+ },
+ disable: function disable() {
+ this.enabled = false;
+ },
+ isActive: function isActive() {
+ return this.active;
+ },
+ activate: function activate() {
+ if (this.isActive()) {
+ return true;
+ } else if (!this.isEnabled() || this.eventBus.before("active")) {
+ return false;
+ } else {
+ this.active = true;
+ this.eventBus.trigger("active");
+ return true;
+ }
+ },
+ deactivate: function deactivate() {
+ if (!this.isActive()) {
+ return true;
+ } else if (this.eventBus.before("idle")) {
+ return false;
+ } else {
+ this.active = false;
+ this.close();
+ this.eventBus.trigger("idle");
+ return true;
+ }
+ },
+ isOpen: function isOpen() {
+ return this.menu.isOpen();
+ },
+ open: function open() {
+ if (!this.isOpen() && !this.eventBus.before("open")) {
+ this.input.setAriaExpanded(true);
+ this.menu.open();
+ this._updateHint();
+ this.eventBus.trigger("open");
+ }
+ return this.isOpen();
+ },
+ close: function close() {
+ if (this.isOpen() && !this.eventBus.before("close")) {
+ this.input.setAriaExpanded(false);
+ this.menu.close();
+ this.input.clearHint();
+ this.input.resetInputValue();
+ this.eventBus.trigger("close");
+ }
+ return !this.isOpen();
+ },
+ setVal: function setVal(val) {
+ this.input.setQuery(_.toStr(val));
+ },
+ getVal: function getVal() {
+ return this.input.getQuery();
+ },
+ select: function select($selectable) {
+ var data = this.menu.getSelectableData($selectable);
+ if (data && !this.eventBus.before("select", data.obj, data.dataset)) {
+ this.input.setQuery(data.val, true);
+ this.eventBus.trigger("select", data.obj, data.dataset);
+ this.close();
+ return true;
+ }
+ return false;
+ },
+ autocomplete: function autocomplete($selectable) {
+ var query, data, isValid;
+ query = this.input.getQuery();
+ data = this.menu.getSelectableData($selectable);
+ isValid = data && query !== data.val;
+ if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) {
+ this.input.setQuery(data.val);
+ this.eventBus.trigger("autocomplete", data.obj, data.dataset);
+ return true;
+ }
+ return false;
+ },
+ moveCursor: function moveCursor(delta) {
+ var query, $candidate, data, suggestion, datasetName, cancelMove, id;
+ query = this.input.getQuery();
+ $candidate = this.menu.selectableRelativeToCursor(delta);
+ data = this.menu.getSelectableData($candidate);
+ suggestion = data ? data.obj : null;
+ datasetName = data ? data.dataset : null;
+ id = $candidate ? $candidate.attr("id") : null;
+ this.input.trigger("cursorchange", id);
+ cancelMove = this._minLengthMet() && this.menu.update(query);
+ if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) {
+ this.menu.setCursor($candidate);
+ if (data) {
+ if (typeof data.val === "string") {
+ this.input.setInputValue(data.val);
+ }
+ } else {
+ this.input.resetInputValue();
+ this._updateHint();
+ }
+ this.eventBus.trigger("cursorchange", suggestion, datasetName);
+ return true;
+ }
+ return false;
+ },
+ destroy: function destroy() {
+ this.input.destroy();
+ this.menu.destroy();
+ }
+ });
+ return Typeahead;
+ function c(ctx) {
+ var methods = [].slice.call(arguments, 1);
+ return function() {
+ var args = [].slice.call(arguments);
+ _.each(methods, function(method) {
+ return ctx[method].apply(ctx, args);
+ });
+ };
+ }
+ }();
+ (function() {
+ "use strict";
+ var old, keys, methods;
+ old = $.fn.typeahead;
+ keys = {
+ www: "tt-www",
+ attrs: "tt-attrs",
+ typeahead: "tt-typeahead"
+ };
+ methods = {
+ initialize: function initialize(o, datasets) {
+ var www;
+ datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);
+ o = o || {};
+ www = WWW(o.classNames);
+ return this.each(attach);
+ function attach() {
+ var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor;
+ _.each(datasets, function(d) {
+ d.highlight = !!o.highlight;
+ });
+ $input = $(this);
+ $wrapper = $(www.html.wrapper);
+ $hint = $elOrNull(o.hint);
+ $menu = $elOrNull(o.menu);
+ defaultHint = o.hint !== false && !$hint;
+ defaultMenu = o.menu !== false && !$menu;
+ defaultHint && ($hint = buildHintFromInput($input, www));
+ defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));
+ $hint && $hint.val("");
+ $input = prepInput($input, www);
+ if (defaultHint || defaultMenu) {
+ $wrapper.css(www.css.wrapper);
+ $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);
+ $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);
+ }
+ MenuConstructor = defaultMenu ? DefaultMenu : Menu;
+ eventBus = new EventBus({
+ el: $input
+ });
+ input = new Input({
+ hint: $hint,
+ input: $input,
+ menu: $menu
+ }, www);
+ menu = new MenuConstructor({
+ node: $menu,
+ datasets: datasets
+ }, www);
+ status = new Status({
+ $input: $input,
+ menu: menu
+ });
+ typeahead = new Typeahead({
+ input: input,
+ menu: menu,
+ eventBus: eventBus,
+ minLength: o.minLength,
+ autoselect: o.autoselect
+ }, www);
+ $input.data(keys.www, www);
+ $input.data(keys.typeahead, typeahead);
+ }
+ },
+ isEnabled: function isEnabled() {
+ var enabled;
+ ttEach(this.first(), function(t) {
+ enabled = t.isEnabled();
+ });
+ return enabled;
+ },
+ enable: function enable() {
+ ttEach(this, function(t) {
+ t.enable();
+ });
+ return this;
+ },
+ disable: function disable() {
+ ttEach(this, function(t) {
+ t.disable();
+ });
+ return this;
+ },
+ isActive: function isActive() {
+ var active;
+ ttEach(this.first(), function(t) {
+ active = t.isActive();
+ });
+ return active;
+ },
+ activate: function activate() {
+ ttEach(this, function(t) {
+ t.activate();
+ });
+ return this;
+ },
+ deactivate: function deactivate() {
+ ttEach(this, function(t) {
+ t.deactivate();
+ });
+ return this;
+ },
+ isOpen: function isOpen() {
+ var open;
+ ttEach(this.first(), function(t) {
+ open = t.isOpen();
+ });
+ return open;
+ },
+ open: function open() {
+ ttEach(this, function(t) {
+ t.open();
+ });
+ return this;
+ },
+ close: function close() {
+ ttEach(this, function(t) {
+ t.close();
+ });
+ return this;
+ },
+ select: function select(el) {
+ var success = false, $el = $(el);
+ ttEach(this.first(), function(t) {
+ success = t.select($el);
+ });
+ return success;
+ },
+ autocomplete: function autocomplete(el) {
+ var success = false, $el = $(el);
+ ttEach(this.first(), function(t) {
+ success = t.autocomplete($el);
+ });
+ return success;
+ },
+ moveCursor: function moveCursoe(delta) {
+ var success = false;
+ ttEach(this.first(), function(t) {
+ success = t.moveCursor(delta);
+ });
+ return success;
+ },
+ val: function val(newVal) {
+ var query;
+ if (!arguments.length) {
+ ttEach(this.first(), function(t) {
+ query = t.getVal();
+ });
+ return query;
+ } else {
+ ttEach(this, function(t) {
+ t.setVal(_.toStr(newVal));
+ });
+ return this;
+ }
+ },
+ destroy: function destroy() {
+ ttEach(this, function(typeahead, $input) {
+ revert($input);
+ typeahead.destroy();
+ });
+ return this;
+ }
+ };
+ $.fn.typeahead = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, [].slice.call(arguments, 1));
+ } else {
+ return methods.initialize.apply(this, arguments);
+ }
+ };
+ $.fn.typeahead.noConflict = function noConflict() {
+ $.fn.typeahead = old;
+ return this;
+ };
+ function ttEach($els, fn) {
+ $els.each(function() {
+ var $input = $(this), typeahead;
+ (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);
+ });
+ }
+ function buildHintFromInput($input, www) {
+ return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({
+ readonly: true,
+ required: false
+ }).removeAttr("id name placeholder").removeClass("required").attr({
+ spellcheck: "false",
+ tabindex: -1
+ });
+ }
+ function prepInput($input, www) {
+ $input.data(keys.attrs, {
+ dir: $input.attr("dir"),
+ autocomplete: $input.attr("autocomplete"),
+ spellcheck: $input.attr("spellcheck"),
+ style: $input.attr("style")
+ });
+ $input.addClass(www.classes.input).attr({
+ spellcheck: false
+ });
+ try {
+ !$input.attr("dir") && $input.attr("dir", "auto");
+ } catch (e) {}
+ return $input;
+ }
+ function getBackgroundStyles($el) {
+ return {
+ backgroundAttachment: $el.css("background-attachment"),
+ backgroundClip: $el.css("background-clip"),
+ backgroundColor: $el.css("background-color"),
+ backgroundImage: $el.css("background-image"),
+ backgroundOrigin: $el.css("background-origin"),
+ backgroundPosition: $el.css("background-position"),
+ backgroundRepeat: $el.css("background-repeat"),
+ backgroundSize: $el.css("background-size")
+ };
+ }
+ function revert($input) {
+ var www, $wrapper;
+ www = $input.data(keys.www);
+ $wrapper = $input.parent().filter(www.selectors.wrapper);
+ _.each($input.data(keys.attrs), function(val, key) {
+ _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);
+ });
+ $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);
+ if ($wrapper.length) {
+ $input.detach().insertAfter($wrapper);
+ $wrapper.remove();
+ }
+ }
+ function $elOrNull(obj) {
+ var isValid, $el;
+ isValid = _.isJQuery(obj) || _.isElement(obj);
+ $el = isValid ? $(obj).first() : [];
+ return $el.length ? $el : null;
+ }
+ })();
+});
\ No newline at end of file
diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/Documents/search.json b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/search.json
new file mode 100644
index 0000000..6393e8b
--- /dev/null
+++ b/docs/docsets/Clickstream.docset/Contents/Resources/Documents/search.json
@@ -0,0 +1 @@
+{"Typealiases.html#/s:11Clickstream0A9Attributea":{"name":"ClickstreamAttribute","abstract":"
the attribute for Clickstream which support String, Int, Int64, Double and Bool
"},"Extensions.html#/s:s5Int64V":{"name":"Int64","abstract":"
for support Int64 attribute value
"},"Extensions.html#/c:@SA@NSDecimal":{"name":"Decimal"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO7ITEM_IDSSvpZ":{"name":"ITEM_ID","abstract":"
The id of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO9ITEM_NAMESSvpZ":{"name":"ITEM_NAME","abstract":"
The name of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO11LOCATION_IDSSvpZ":{"name":"LOCATION_ID","abstract":"
The location id of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO10ITEM_BRANDSSvpZ":{"name":"ITEM_BRAND","abstract":"
The brand of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO8CURRENCYSSvpZ":{"name":"CURRENCY","abstract":"
The currency of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO5PRICESSvpZ":{"name":"PRICE","abstract":"
The price of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO8QUANTITYSSvpZ":{"name":"QUANTITY","abstract":"
The quantity of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13CREATIVE_NAMESSvpZ":{"name":"CREATIVE_NAME","abstract":"
The creative name of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13CREATIVE_SLOTSSvpZ":{"name":"CREATIVE_SLOT","abstract":"
The creative slot of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13ITEM_CATEGORYSSvpZ":{"name":"ITEM_CATEGORY","abstract":"
The category of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY2SSvpZ":{"name":"ITEM_CATEGORY2","abstract":"
The category2 of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY3SSvpZ":{"name":"ITEM_CATEGORY3","abstract":"
The category3 of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY4SSvpZ":{"name":"ITEM_CATEGORY4","abstract":"
The category4 of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY5SSvpZ":{"name":"ITEM_CATEGORY5","abstract":"
The category5 of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO11SCREEN_NAMESSvpZ":{"name":"SCREEN_NAME","abstract":"
Preset attribute screen name
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO16SCREEN_UNIQUE_IDSSvpZ":{"name":"SCREEN_UNIQUE_ID","abstract":"
Preset attribute screen unique id
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO015TRAFFIC_SOURCE_E0SSvpZ":{"name":"TRAFFIC_SOURCE_SOURCE","abstract":"
Preset attribute traffic source source
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO21TRAFFIC_SOURCE_MEDIUMSSvpZ":{"name":"TRAFFIC_SOURCE_MEDIUM","abstract":"
Preset attribute traffic source medium
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO23TRAFFIC_SOURCE_CAMPAIGNSSvpZ":{"name":"TRAFFIC_SOURCE_CAMPAIGN","abstract":"
Preset attribute traffic source campaign
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO26TRAFFIC_SOURCE_CAMPAIGN_IDSSvpZ":{"name":"TRAFFIC_SOURCE_CAMPAIGN_ID","abstract":"
Preset attribute traffic source campaign id
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19TRAFFIC_SOURCE_TERMSSvpZ":{"name":"TRAFFIC_SOURCE_TERM","abstract":"
Preset attribute traffic source term
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO22TRAFFIC_SOURCE_CONTENTSSvpZ":{"name":"TRAFFIC_SOURCE_CONTENT","abstract":"
Preset attribute traffic source content
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19TRAFFIC_SOURCE_CLIDSSvpZ":{"name":"TRAFFIC_SOURCE_CLID","abstract":"
Preset attribute traffic source clid
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO28TRAFFIC_SOURCE_CLID_PLATFORMSSvpZ":{"name":"TRAFFIC_SOURCE_CLID_PLATFORM","abstract":"
Preset attribute traffic source clid platform
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19APP_INSTALL_CHANNELSSvpZ":{"name":"APP_INSTALL_CHANNEL","abstract":"
Preset attribute app install channel
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO5VALUESSvpZ":{"name":"VALUE","abstract":"
Preset attribute event value
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO8CURRENCYSSvpZ":{"name":"CURRENCY","abstract":"
Preset attribute event currency
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/EventName.html#/s:11Clickstream0A9AnalyticsO9EventNameO11SCREEN_VIEWSSvpZ":{"name":"SCREEN_VIEW","parent_name":"EventName"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO7initSDKyyAA0A13ConfigurationCSgKFZ":{"name":"initSDK(_:)","abstract":"
Init ClickstreamAnalytics
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11recordEventyySSFZ":{"name":"recordEvent(_:)","abstract":"
Use this method to record event
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11recordEventyySS_SDySS7Amplify0B13PropertyValue_pGSayAGGtFZ":{"name":"recordEvent(_:_:_:)","abstract":"
The method to record event with ClickstreamAttribute
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11flushEventsyyFZ":{"name":"flushEvents()","abstract":"
Use this method to send events immediately
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO19addGlobalAttributesyySDySS7Amplify0B13PropertyValue_pGFZ":{"name":"addGlobalAttributes(_:)","abstract":"
Add global attributes
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO22deleteGlobalAttributesyySSd_tFZ":{"name":"deleteGlobalAttributes(_:)","abstract":"
Delete global attributes
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO17addUserAttributesyySDySS7Amplify0B13PropertyValue_pGFZ":{"name":"addUserAttributes(_:)","abstract":"
Add user attributes
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO9setUserIdyySSSgFZ":{"name":"setUserId(_:)","abstract":"
Set user id for login and logout
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO03getA13ConfigurationAA0aD0CyKFZ":{"name":"getClickstreamConfiguration()","abstract":"
Get Clickstream configuration, please config it after initialize sdk
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO7disableyyFZ":{"name":"disable()","abstract":"
Disable the SDK
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO6enableyyFZ":{"name":"enable()","abstract":"
Enable the SDK
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics/EventName.html":{"name":"EventName","abstract":"
ClickstreamAnalytics preset events
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics/Attr.html":{"name":"Attr","abstract":"
ClickstreamANalytics preset attributes
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics/Item.html":{"name":"Item","abstract":"
ClickstreamAnalytics preset item attributes","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html":{"name":"ClickstreamAnalytics","abstract":"
ClickstreamAnalytics api for swift
"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withAppId:":{"name":"withAppId(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withEndpoint:":{"name":"withEndpoint(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withSendEventInterval:":{"name":"withSendEventInterval(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackAppExceptionEvents:":{"name":"withTrackAppExceptionEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackScreenViewEvents:":{"name":"withTrackScreenViewEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackUserEngagementEvents:":{"name":"withTrackUserEngagementEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withCompressEvents:":{"name":"withCompressEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withLogEvents:":{"name":"withLogEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withAuthCookie:":{"name":"withAuthCookie(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withSessionTimeoutDuration:":{"name":"withSessionTimeoutDuration(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/s:11Clickstream0A13ConfigurationC27withInitialGlobalAttributesyACSDySS7Amplify22AnalyticsPropertyValue_pGF":{"name":"withInitialGlobalAttributes(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withInitialGlobalAttributesObjc:":{"name":"withInitialGlobalAttributesObjc(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_ID":{"name":"ITEM_ID","abstract":"
The id of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_NAME":{"name":"ITEM_NAME","abstract":"
The name of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)LOCATION_ID":{"name":"LOCATION_ID","abstract":"
The location id of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_BRAND":{"name":"ITEM_BRAND","abstract":"
The brand of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)CURRENCY":{"name":"CURRENCY","abstract":"
The currency of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)PRICE":{"name":"PRICE","abstract":"
The price of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)QUANTITY":{"name":"QUANTITY","abstract":"
The quantity of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)CREATIVE_NAME":{"name":"CREATIVE_NAME","abstract":"
The creative name of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)CREATIVE_SLOT":{"name":"CREATIVE_SLOT","abstract":"
The creative slot of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY":{"name":"ITEM_CATEGORY","abstract":"
The category of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY2":{"name":"ITEM_CATEGORY2","abstract":"
The category2 of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY3":{"name":"ITEM_CATEGORY3","abstract":"
The category3 of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY4":{"name":"ITEM_CATEGORY4","abstract":"
The category4 of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY5":{"name":"ITEM_CATEGORY5","abstract":"
The category5 of the item
","parent_name":"ClickstreamItemKey"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)SCREEN_NAME":{"name":"SCREEN_NAME","abstract":"
Preset attribute screen name
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)SCREEN_UNIQUE_ID":{"name":"SCREEN_UNIQUE_ID","abstract":"
Preset attribute screen unique id
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_SOURCE":{"name":"TRAFFIC_SOURCE_SOURCE","abstract":"
Preset attribute traffic source source
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_MEDIUM":{"name":"TRAFFIC_SOURCE_MEDIUM","abstract":"
Preset attribute traffic source medium
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CAMPAIGN":{"name":"TRAFFIC_SOURCE_CAMPAIGN","abstract":"
Preset attribute traffic source campaign
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CAMPAIGN_ID":{"name":"TRAFFIC_SOURCE_CAMPAIGN_ID","abstract":"
Preset attribute traffic source campaign id
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_TERM":{"name":"TRAFFIC_SOURCE_TERM","abstract":"
Preset attribute traffic source term
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CONTENT":{"name":"TRAFFIC_SOURCE_CONTENT","abstract":"
Preset attribute traffic source content
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CLID":{"name":"TRAFFIC_SOURCE_CLID","abstract":"
Preset attribute traffic source clid
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CLID_PLATFORM":{"name":"TRAFFIC_SOURCE_CLID_PLATFORM","abstract":"
Preset attribute traffic source clid platform
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)APP_INSTALL_CHANNEL":{"name":"APP_INSTALL_CHANNEL","abstract":"
Preset attribute app install channel
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)VALUE":{"name":"VALUE","abstract":"
Preset attribute event value
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)CURRENCY":{"name":"CURRENCY","abstract":"
Preset attribute event currency
","parent_name":"Attr"},"Classes/EventName.html#/c:@M@Clickstream@objc(cs)EventName(cpy)SCREEN_VIEW":{"name":"SCREEN_VIEW","abstract":"
Preset event screen view
","parent_name":"EventName"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)initSDKAndReturnError:":{"name":"initSDK()","abstract":"
Init the Clickstream sdk
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)initSDK:error:":{"name":"initSDK(_:)","abstract":"
Init the Clickstream sdk
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)recordEvent:":{"name":"recordEvent(_:)","abstract":"
Use this method to record event
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)recordEvent::":{"name":"recordEvent(_:_:)","abstract":"
The method to record event with attributes
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)recordEvent:::":{"name":"recordEvent(_:_:_:)","abstract":"
The method to record event with attributes and items
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)flushEvents":{"name":"flushEvents()","abstract":"
Use this method to send events immediately
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)addGlobalAttributes:":{"name":"addGlobalAttributes(_:)","abstract":"
Add global attributes
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)deleteGlobalAttributes:":{"name":"deleteGlobalAttributes(_:)","abstract":"
Delete global attributes
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)addUserAttributes:":{"name":"addUserAttributes(_:)","abstract":"
Add user attributes
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)setUserId:":{"name":"setUserId(_:)","abstract":"
Set user id for login and logout
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)getClickstreamConfigurationAndReturnError:":{"name":"getClickstreamConfiguration()","abstract":"
Get Clickstream configuration, please config it after initialize sdk
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)disable":{"name":"disable()","abstract":"
Disable the SDK
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)enable":{"name":"enable()","abstract":"
Enable the SDK
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html":{"name":"ClickstreamObjc","abstract":"
ClickstreamAnalytics api for objective-c
"},"Classes/EventName.html":{"name":"EventName","abstract":"
ClickstreamAnalytics preset events
"},"Classes/Attr.html":{"name":"Attr","abstract":"
ClickstreamANalytics preset attributes
"},"Classes/ClickstreamItemKey.html":{"name":"ClickstreamItemKey","abstract":"
ClickstreamAnalytics preset item keys for objective-c"},"Classes/ClickstreamConfiguration.html":{"name":"ClickstreamConfiguration","abstract":"
The configuration object for clickstream, modify the params after sdk initialize
"},"Classes.html":{"name":"Classes","abstract":"
The following classes are available globally.
"},"Enums.html":{"name":"Enumerations","abstract":"
The following enumerations are available globally.
"},"Extensions.html":{"name":"Extensions","abstract":"
The following extensions are available globally.
"},"Typealiases.html":{"name":"Type Aliases","abstract":"
The following type aliases are available globally.
"}}
\ No newline at end of file
diff --git a/docs/docsets/Clickstream.docset/Contents/Resources/docSet.dsidx b/docs/docsets/Clickstream.docset/Contents/Resources/docSet.dsidx
new file mode 100644
index 0000000..1014c58
Binary files /dev/null and b/docs/docsets/Clickstream.docset/Contents/Resources/docSet.dsidx differ
diff --git a/docs/docsets/Clickstream.tgz b/docs/docsets/Clickstream.tgz
new file mode 100644
index 0000000..3051717
Binary files /dev/null and b/docs/docsets/Clickstream.tgz differ
diff --git a/docs/images/add_amplify_config_json_file.png b/docs/images/add_amplify_config_json_file.png
new file mode 100644
index 0000000..f289edd
Binary files /dev/null and b/docs/images/add_amplify_config_json_file.png differ
diff --git a/docs/images/add_package.png b/docs/images/add_package.png
new file mode 100644
index 0000000..87db679
Binary files /dev/null and b/docs/images/add_package.png differ
diff --git a/docs/images/add_package_url.png b/docs/images/add_package_url.png
new file mode 100644
index 0000000..5c8f63c
Binary files /dev/null and b/docs/images/add_package_url.png differ
diff --git a/docs/img/carat.png b/docs/img/carat.png
new file mode 100755
index 0000000..29d2f7f
Binary files /dev/null and b/docs/img/carat.png differ
diff --git a/docs/img/dash.png b/docs/img/dash.png
new file mode 100755
index 0000000..6f694c7
Binary files /dev/null and b/docs/img/dash.png differ
diff --git a/docs/img/gh.png b/docs/img/gh.png
new file mode 100755
index 0000000..628da97
Binary files /dev/null and b/docs/img/gh.png differ
diff --git a/docs/img/spinner.gif b/docs/img/spinner.gif
new file mode 100644
index 0000000..e3038d0
Binary files /dev/null and b/docs/img/spinner.gif differ
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 0000000..1c7080c
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,398 @@
+
+
+
+
Clickstream Reference
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ AWS Solution Clickstream Analytics SDK for Swift
+Introduction
+
+Clickstream Swift SDK can help you easily collect and report in-app events from iOS devices to AWS. This SDK is part of an AWS solution - Clickstream Analytics on AWS , which provisions data pipeline to ingest and process event data into AWS services such as S3, Redshift.
+
+The SDK relies on the Amplify for Swift Core Library and is developed according to the Amplify Swift SDK plug-in specification. In addition, we’ve added features that automatically collect common user events and attributes (e.g., screen view, first open) to simplify data collection for users.
+
+Visit our Documentation site and to learn more about Clickstream Swift SDK.
+
+
+The Clickstream SDK supports iOS 13+.
+
+API Documentation
+
+
+Integrate SDK
+
+Clickstream requires Xcode 13.4 or higher to build.
+1.Add Package
+
+We use Swift Package Manager to distribute Clickstream Swift SDK, open your project in Xcode and select File > Add Pckages .
+
+
+
+Enter the Clickstream Library for Swift GitHub repo URL (https://github.com/awslabs/clickstream-swift
) into the search bar, you’ll see the Clickstream Library for Swift repository rules for which version of Clickstream you want Swift Package Manager to install. Choose Up to Next Major Version , then click Add Package , make the Clickstream product checked as default, and click Add Package again.
+
+
+2.Parameter configuration
+
+Downlod your amplifyconfiguration.json
file from your Clickstream solution control plane, and paste it to your project root folder:
+
+
+
+the json file will be as follows:
+{
+ "analytics" : {
+ "plugins" : {
+ "awsClickstreamPlugin " : {
+ "appId" : "appId" ,
+ "endpoint" : "https://example.com/collect" ,
+ "isCompressEvents" : true ,
+ "autoFlushEventsInterval" : 10000 ,
+ "isTrackAppExceptionEvents" : false
+ }
+ }
+ }
+ }
+
+
+Your appId
and endpoint
are already set up in it, here’s an explanation of each property:
+
+
+appId : the app id of your project in control plane.
+endpoint : the endpoint url you will upload the event to AWS server.
+isCompressEvents : whether to compress event content when uploading events, default is true
+autoFlushEventsInterval : event sending interval, the default is 10s
+isTrackAppExceptionEvents : whether auto track exception event in app, default is false
+
+3.Initialize the SDK
+
+Once you have configured the parameters, you need to initialize it in your app delegate’s application(_:didFinishLaunchingWithOptions:)
lifecycle method:
+3.1 Initialize the SDK with default configuration
+import Clickstream
+...
+func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ]?) -> Bool {
+ do {
+ try ClickstreamAnalytics . initSDK ()
+ } catch {
+ assertionFailure ( "Fail to initialize ClickstreamAnalytics: \( error ) " )
+ }
+ return true
+}
+
+3.2 Initialize the SDK with global attributes and custom configuration
+
+The following example code shows how to add traffic source fields as global attributes when initializing the SDK.
+import Clickstream
+...
+func application ( _ application : UIApplication , didFinishLaunchingWithOptions launchOptions : [ UIApplication . LaunchOptionsKey : Any ]?) -> Bool {
+ do {
+ let configuration = ClickstreamConfiguration ()
+ . withAppId ( "your appId" )
+ . withEndpoint ( "https://example.com/collect" )
+ . withLogEvents ( true )
+ . withInitialGlobalAttributes ([
+ ClickstreamAnalytics . Attr . TRAFFIC_SOURCE_SOURCE : "amazon" ,
+ ClickstreamAnalytics . Attr . TRAFFIC_SOURCE_MEDIUM : "cpc" ,
+ ClickstreamAnalytics . Attr . TRAFFIC_SOURCE_CAMPAIGN : "summer_promotion" ,
+ ClickstreamAnalytics . Attr . TRAFFIC_SOURCE_CAMPAIGN_ID : "summer_promotion_01" ,
+ ClickstreamAnalytics . Attr . TRAFFIC_SOURCE_TERM : "running_shoes" ,
+ ClickstreamAnalytics . Attr . TRAFFIC_SOURCE_CONTENT : "banner_ad_1" ,
+ ClickstreamAnalytics . Attr . TRAFFIC_SOURCE_CLID : "amazon_ad_123" ,
+ ClickstreamAnalytics . Attr . TRAFFIC_SOURCE_CLID_PLATFORM : "amazon_ads" ,
+ ClickstreamAnalytics . Attr . APP_INSTALL_CHANNEL : "App Store"
+ ])
+ try ClickstreamAnalytics . initSDK ( configuration )
+ } catch {
+ assertionFailure ( "Fail to initialize ClickstreamAnalytics: \( error ) " )
+ }
+ return true
+}
+
+
+By default, we will use the configurations in amplifyconfiguration.json
file. If you add a custom configuration, the added configuration items will override the default values.
+
+You can also add all the configuration parameters you need in the initSDK
method without using the amplifyconfiguration.json
file.
+3.3 SwiftUI configuration
+
+If your project is developed with SwiftUI, you need to create an application delegate and attach it to your App
through UIApplicationDelegateAdaptor
.
+@main
+struct YourApp : App {
+ @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
+ var body : some Scene {
+ WindowGroup {
+ YourView ()
+ }
+ }
+}
+
+
+Clickstream Swift SDK depends on method swizzling to automatically record screen views. SwiftUI apps must record screen view events manually , and disable automatic tracking of screen view events by setting configuration.withTrackScreenViewEvents(false)
when the SDK is initialized.
+4. Update Configuration
+import Clickstream
+
+// configure the sdk after initialize.
+do {
+ let configuration = try ClickstreamAnalytics . getClickstreamConfiguration ()
+ configuration . withAppId ( "your appId" )
+ . withEndpoint ( "https://example.com/collect" )
+ . withLogEvents ( true )
+ . withCompressEvents ( true )
+ . withSessionTimeoutDuration ( 1800000 )
+ . withTrackAppExceptionEvents ( true )
+ . withTrackScreenViewEvents ( true )
+ . withTrackUserEngagementEvents ( true )
+} catch {
+ print ( "Failed to config ClickstreamAnalytics: \( error ) " )
+}
+
+
+
Note
+
this configuation will override the default configuation in amplifyconfiguration.json
file
+
+
+Start using
+Recored event.
+
+Add the following code where you need to complete the event report.
+import Clickstream
+
+let attributes : ClickstreamAttribute = [
+ "Channel" : "apple" ,
+ "Successful" : true ,
+ "ProcessDuration" : 12.33 ,
+ "UserAge" : 20 ,
+]
+ClickstreamAnalytics . recordEvent ( "testEvent" , attributes )
+
+// for record an event with event name
+ClickstreamAnalytics . recordEvent ( "button_click" )
+
+Record event with items
+
+You can add the following code to log an event with an item.
+
+Note: Only pipelines from version 1.1+ can handle items with custom attribute.
+import Clickstream
+
+let attributes : ClickstreamAttribute = [
+ ClickstreamAnalytics . Item . ITEM_ID : "123" ,
+ ClickstreamAnalytics . Item . CURRENCY : "USD" ,
+ "event_category" : "recommended"
+]
+
+let item_book : ClickstreamAttribute = [
+ ClickstreamAnalytics . Item . ITEM_ID : 123 ,
+ ClickstreamAnalytics . Item . ITEM_NAME : "Nature" ,
+ ClickstreamAnalytics . Item . ITEM_CATEGORY : "book" ,
+ ClickstreamAnalytics . Item . PRICE : 99.9 ,
+ "book_publisher" : "Nature Research"
+]
+ClickstreamAnalytics . recordEvent ( "view_item" , attributes , [ item_book ])
+
+Record Screen View events manually
+
+By default, SDK will automatically track the preset _screen_view
event when ViewController triggers viewDidAppear
.
+
+You can also manually record screen view events whether or not automatic screen view tracking is enabled, add the following code to record a screen view event with two attributes.
+
+
+SCREEN_NAME
Required. Your screen’s name.
+SCREEN_UNIQUE_ID
Optional. Set the hashValue of your ViewController or UIView. If you do not set, SDK will set a default value based on the current ViewController’s hashValue.
+
+import Clickstream
+
+ClickstreamAnalytics . recordEvent ( ClickstreamAnalytics . EventName . SCREEN_VIEW , [
+ ClickstreamAnalytics . Attr . SCREEN_NAME : "HomeView" ,
+ ClickstreamAnalytics . Attr . SCREEN_UNIQUE_ID : homeView . hashValue
+])
+
+Add global attribute
+import Clickstream
+
+let globalAttribute : ClickstreamAttribute = [
+ ClickstreamAnalytics . Attr . APP_INSTALL_CHANNEL : "apple" ,
+ "class" : 6 ,
+ "level" : 5.1 ,
+ "isOpenNotification" : true ,
+]
+ClickstreamAnalytics . addGlobalAttributes ( globalAttribute )
+
+// for delete an global attribute
+ClickstreamAnalytics . deleteGlobalAttributes ( "level" )
+
+Login and logout
+import Clickstream
+
+// when user login usccess.
+ClickstreamAnalytics . setUserId ( "userId" )
+
+// when user logout
+ClickstreamAnalytics . setUserId ( nil )
+
+
+When we log into another user, we will clear the before user’s user attributes, after setUserId()
you need to add new user’s attribute.
+Add user attribute
+import Clickstream
+
+let userAttributes : ClickstreamAttribute = [
+ "_user_age" : 21 ,
+ "_user_name" : "carl"
+]
+ClickstreamAnalytics . addUserAttributes ( userAttributes )
+
+
+Current login user‘s attributes will be cached in disk, so the next time app launch you don’t need to set all user’s attribute again, of course you can update the current user’s attribute when it changes.
+Log the event json in debug mode
+import Clickstream
+
+// log the event in debug mode.
+do {
+ var configuration = try ClickstreamAnalytics . getClickstreamConfiguration ()
+ configuration . isLogEvents = true
+} catch {
+ print ( "Failed to config ClickstreamAnalytics: \( error ) " )
+}
+
+
+After config configuration.isLogEvents = true
and when you record an event, you can see the event json at your Xcode log pannel by filter EventRecorder
.
+
+import Clickstream
+// for send event immediately.
+ClickstreamAnalytics . flushEvents ()
+
+Disable SDK
+
+You can disable the SDK in the scenario you need. After disabling the SDK, the SDK will not handle the logging and sending of any events. Of course you can enable the SDK when you need to continue logging events.
+import Clickstream
+
+// disable SDK
+ClickstreamAnalytics . disable ()
+
+// enable SDK
+ClickstreamAnalytics . enable ()
+
+How to build&test locally
+
+
+Install swiftformat plugin in your Xcode, and config shortcut for code format.
+Config your code lint
+
+Install swiftlint , and execute the below command at the project root folder:
+swiftlint
+
+Build
+
+Open an termial window, at the root project folder to execute:
+swift build
+
+Test
+swift test
+
+Security
+
+See CONTRIBUTING for more information.
+License
+
+This library is licensed under Apache 2.0 License .
+
+
+
+
+
+
+
+
diff --git a/docs/js/jazzy.js b/docs/js/jazzy.js
new file mode 100755
index 0000000..1984416
--- /dev/null
+++ b/docs/js/jazzy.js
@@ -0,0 +1,74 @@
+// Jazzy - https://github.com/realm/jazzy
+// Copyright Realm Inc.
+// SPDX-License-Identifier: MIT
+
+window.jazzy = {'docset': false}
+if (typeof window.dash != 'undefined') {
+ document.documentElement.className += ' dash'
+ window.jazzy.docset = true
+}
+if (navigator.userAgent.match(/xcode/i)) {
+ document.documentElement.className += ' xcode'
+ window.jazzy.docset = true
+}
+
+function toggleItem($link, $content) {
+ var animationDuration = 300;
+ $link.toggleClass('token-open');
+ $content.slideToggle(animationDuration);
+}
+
+function itemLinkToContent($link) {
+ return $link.parent().parent().next();
+}
+
+// On doc load + hash-change, open any targetted item
+function openCurrentItemIfClosed() {
+ if (window.jazzy.docset) {
+ return;
+ }
+ var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token');
+ $content = itemLinkToContent($link);
+ if ($content.is(':hidden')) {
+ toggleItem($link, $content);
+ }
+}
+
+$(openCurrentItemIfClosed);
+$(window).on('hashchange', openCurrentItemIfClosed);
+
+// On item link ('token') click, toggle its discussion
+$('.token').on('click', function(event) {
+ if (window.jazzy.docset) {
+ return;
+ }
+ var $link = $(this);
+ toggleItem($link, itemLinkToContent($link));
+
+ // Keeps the document from jumping to the hash.
+ var href = $link.attr('href');
+ if (history.pushState) {
+ history.pushState({}, '', href);
+ } else {
+ location.hash = href;
+ }
+ event.preventDefault();
+});
+
+// Clicks on links to the current, closed, item need to open the item
+$("a:not('.token')").on('click', function() {
+ if (location == this.href) {
+ openCurrentItemIfClosed();
+ }
+});
+
+// KaTeX rendering
+if ("katex" in window) {
+ $($('.math').each( (_, element) => {
+ katex.render(element.textContent, element, {
+ displayMode: $(element).hasClass('m-block'),
+ throwOnError: false,
+ trust: true
+ });
+ }))
+}
diff --git a/docs/js/jazzy.search.js b/docs/js/jazzy.search.js
new file mode 100644
index 0000000..359cdbb
--- /dev/null
+++ b/docs/js/jazzy.search.js
@@ -0,0 +1,74 @@
+// Jazzy - https://github.com/realm/jazzy
+// Copyright Realm Inc.
+// SPDX-License-Identifier: MIT
+
+$(function(){
+ var $typeahead = $('[data-typeahead]');
+ var $form = $typeahead.parents('form');
+ var searchURL = $form.attr('action');
+
+ function displayTemplate(result) {
+ return result.name;
+ }
+
+ function suggestionTemplate(result) {
+ var t = '
';
+ t += '' + result.name + ' ';
+ if (result.parent_name) {
+ t += '' + result.parent_name + ' ';
+ }
+ t += '
';
+ return t;
+ }
+
+ $typeahead.one('focus', function() {
+ $form.addClass('loading');
+
+ $.getJSON(searchURL).then(function(searchData) {
+ const searchIndex = lunr(function() {
+ this.ref('url');
+ this.field('name');
+ this.field('abstract');
+ for (const [url, doc] of Object.entries(searchData)) {
+ this.add({url: url, name: doc.name, abstract: doc.abstract});
+ }
+ });
+
+ $typeahead.typeahead(
+ {
+ highlight: true,
+ minLength: 3,
+ autoselect: true
+ },
+ {
+ limit: 10,
+ display: displayTemplate,
+ templates: { suggestion: suggestionTemplate },
+ source: function(query, sync) {
+ const lcSearch = query.toLowerCase();
+ const results = searchIndex.query(function(q) {
+ q.term(lcSearch, { boost: 100 });
+ q.term(lcSearch, {
+ boost: 10,
+ wildcard: lunr.Query.wildcard.TRAILING
+ });
+ }).map(function(result) {
+ var doc = searchData[result.ref];
+ doc.url = result.ref;
+ return doc;
+ });
+ sync(results);
+ }
+ }
+ );
+ $form.removeClass('loading');
+ $typeahead.trigger('focus');
+ });
+ });
+
+ var baseURL = searchURL.slice(0, -"search.json".length);
+
+ $typeahead.on('typeahead:select', function(e, result) {
+ window.location = baseURL + result.url;
+ });
+});
diff --git a/docs/js/jquery.min.js b/docs/js/jquery.min.js
new file mode 100644
index 0000000..7f37b5d
--- /dev/null
+++ b/docs/js/jquery.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0
+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML=" ",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML=" ",le.option=!!xe.lastChild;var ke={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}();
diff --git a/docs/js/typeahead.jquery.js b/docs/js/typeahead.jquery.js
new file mode 100644
index 0000000..bcb734b
--- /dev/null
+++ b/docs/js/typeahead.jquery.js
@@ -0,0 +1,1695 @@
+/*!
+ * typeahead.js 1.3.3
+ * https://github.com/corejavascript/typeahead.js
+ * Copyright 2013-2024 Twitter, Inc. and other contributors; Licensed MIT
+ */
+
+
+(function(root, factory) {
+ if (typeof define === "function" && define.amd) {
+ define([ "jquery" ], function(a0) {
+ return factory(a0);
+ });
+ } else if (typeof module === "object" && module.exports) {
+ module.exports = factory(require("jquery"));
+ } else {
+ factory(root["jQuery"]);
+ }
+})(this, function($) {
+ var _ = function() {
+ "use strict";
+ return {
+ isMsie: function() {
+ return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false;
+ },
+ isBlankString: function(str) {
+ return !str || /^\s*$/.test(str);
+ },
+ escapeRegExChars: function(str) {
+ return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
+ },
+ isString: function(obj) {
+ return typeof obj === "string";
+ },
+ isNumber: function(obj) {
+ return typeof obj === "number";
+ },
+ isArray: $.isArray,
+ isFunction: $.isFunction,
+ isObject: $.isPlainObject,
+ isUndefined: function(obj) {
+ return typeof obj === "undefined";
+ },
+ isElement: function(obj) {
+ return !!(obj && obj.nodeType === 1);
+ },
+ isJQuery: function(obj) {
+ return obj instanceof $;
+ },
+ toStr: function toStr(s) {
+ return _.isUndefined(s) || s === null ? "" : s + "";
+ },
+ bind: $.proxy,
+ each: function(collection, cb) {
+ $.each(collection, reverseArgs);
+ function reverseArgs(index, value) {
+ return cb(value, index);
+ }
+ },
+ map: $.map,
+ filter: $.grep,
+ every: function(obj, test) {
+ var result = true;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (!(result = test.call(null, val, key, obj))) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ some: function(obj, test) {
+ var result = false;
+ if (!obj) {
+ return result;
+ }
+ $.each(obj, function(key, val) {
+ if (result = test.call(null, val, key, obj)) {
+ return false;
+ }
+ });
+ return !!result;
+ },
+ mixin: $.extend,
+ identity: function(x) {
+ return x;
+ },
+ clone: function(obj) {
+ return $.extend(true, {}, obj);
+ },
+ getIdGenerator: function() {
+ var counter = 0;
+ return function() {
+ return counter++;
+ };
+ },
+ templatify: function templatify(obj) {
+ return $.isFunction(obj) ? obj : template;
+ function template() {
+ return String(obj);
+ }
+ },
+ defer: function(fn) {
+ setTimeout(fn, 0);
+ },
+ debounce: function(func, wait, immediate) {
+ var timeout, result;
+ return function() {
+ var context = this, args = arguments, later, callNow;
+ later = function() {
+ timeout = null;
+ if (!immediate) {
+ result = func.apply(context, args);
+ }
+ };
+ callNow = immediate && !timeout;
+ clearTimeout(timeout);
+ timeout = setTimeout(later, wait);
+ if (callNow) {
+ result = func.apply(context, args);
+ }
+ return result;
+ };
+ },
+ throttle: function(func, wait) {
+ var context, args, timeout, result, previous, later;
+ previous = 0;
+ later = function() {
+ previous = new Date();
+ timeout = null;
+ result = func.apply(context, args);
+ };
+ return function() {
+ var now = new Date(), remaining = wait - (now - previous);
+ context = this;
+ args = arguments;
+ if (remaining <= 0) {
+ clearTimeout(timeout);
+ timeout = null;
+ previous = now;
+ result = func.apply(context, args);
+ } else if (!timeout) {
+ timeout = setTimeout(later, remaining);
+ }
+ return result;
+ };
+ },
+ stringify: function(val) {
+ return _.isString(val) ? val : JSON.stringify(val);
+ },
+ guid: function() {
+ function _p8(s) {
+ var p = (Math.random().toString(16) + "000000000").substr(2, 8);
+ return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p;
+ }
+ return "tt-" + _p8() + _p8(true) + _p8(true) + _p8();
+ },
+ noop: function() {}
+ };
+ }();
+ var WWW = function() {
+ "use strict";
+ var defaultClassNames = {
+ wrapper: "twitter-typeahead",
+ input: "tt-input",
+ hint: "tt-hint",
+ menu: "tt-menu",
+ dataset: "tt-dataset",
+ suggestion: "tt-suggestion",
+ selectable: "tt-selectable",
+ empty: "tt-empty",
+ open: "tt-open",
+ cursor: "tt-cursor",
+ highlight: "tt-highlight"
+ };
+ return build;
+ function build(o) {
+ var www, classes;
+ classes = _.mixin({}, defaultClassNames, o);
+ www = {
+ css: buildCss(),
+ classes: classes,
+ html: buildHtml(classes),
+ selectors: buildSelectors(classes)
+ };
+ return {
+ css: www.css,
+ html: www.html,
+ classes: www.classes,
+ selectors: www.selectors,
+ mixin: function(o) {
+ _.mixin(o, www);
+ }
+ };
+ }
+ function buildHtml(c) {
+ return {
+ wrapper: ' ',
+ menu: ''
+ };
+ }
+ function buildSelectors(classes) {
+ var selectors = {};
+ _.each(classes, function(v, k) {
+ selectors[k] = "." + v;
+ });
+ return selectors;
+ }
+ function buildCss() {
+ var css = {
+ wrapper: {
+ position: "relative",
+ display: "inline-block"
+ },
+ hint: {
+ position: "absolute",
+ top: "0",
+ left: "0",
+ borderColor: "transparent",
+ boxShadow: "none",
+ opacity: "1"
+ },
+ input: {
+ position: "relative",
+ verticalAlign: "top",
+ backgroundColor: "transparent"
+ },
+ inputWithNoHint: {
+ position: "relative",
+ verticalAlign: "top"
+ },
+ menu: {
+ position: "absolute",
+ top: "100%",
+ left: "0",
+ zIndex: "100",
+ display: "none"
+ },
+ ltr: {
+ left: "0",
+ right: "auto"
+ },
+ rtl: {
+ left: "auto",
+ right: " 0"
+ }
+ };
+ if (_.isMsie()) {
+ _.mixin(css.input, {
+ backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)"
+ });
+ }
+ return css;
+ }
+ }();
+ var EventBus = function() {
+ "use strict";
+ var namespace, deprecationMap;
+ namespace = "typeahead:";
+ deprecationMap = {
+ render: "rendered",
+ cursorchange: "cursorchanged",
+ select: "selected",
+ autocomplete: "autocompleted"
+ };
+ function EventBus(o) {
+ if (!o || !o.el) {
+ $.error("EventBus initialized without el");
+ }
+ this.$el = $(o.el);
+ }
+ _.mixin(EventBus.prototype, {
+ _trigger: function(type, args) {
+ var $e = $.Event(namespace + type);
+ this.$el.trigger.call(this.$el, $e, args || []);
+ return $e;
+ },
+ before: function(type) {
+ var args, $e;
+ args = [].slice.call(arguments, 1);
+ $e = this._trigger("before" + type, args);
+ return $e.isDefaultPrevented();
+ },
+ trigger: function(type) {
+ var deprecatedType;
+ this._trigger(type, [].slice.call(arguments, 1));
+ if (deprecatedType = deprecationMap[type]) {
+ this._trigger(deprecatedType, [].slice.call(arguments, 1));
+ }
+ }
+ });
+ return EventBus;
+ }();
+ var EventEmitter = function() {
+ "use strict";
+ var splitter = /\s+/, nextTick = getNextTick();
+ return {
+ onSync: onSync,
+ onAsync: onAsync,
+ off: off,
+ trigger: trigger
+ };
+ function on(method, types, cb, context) {
+ var type;
+ if (!cb) {
+ return this;
+ }
+ types = types.split(splitter);
+ cb = context ? bindContext(cb, context) : cb;
+ this._callbacks = this._callbacks || {};
+ while (type = types.shift()) {
+ this._callbacks[type] = this._callbacks[type] || {
+ sync: [],
+ async: []
+ };
+ this._callbacks[type][method].push(cb);
+ }
+ return this;
+ }
+ function onAsync(types, cb, context) {
+ return on.call(this, "async", types, cb, context);
+ }
+ function onSync(types, cb, context) {
+ return on.call(this, "sync", types, cb, context);
+ }
+ function off(types) {
+ var type;
+ if (!this._callbacks) {
+ return this;
+ }
+ types = types.split(splitter);
+ while (type = types.shift()) {
+ delete this._callbacks[type];
+ }
+ return this;
+ }
+ function trigger(types) {
+ var type, callbacks, args, syncFlush, asyncFlush;
+ if (!this._callbacks) {
+ return this;
+ }
+ types = types.split(splitter);
+ args = [].slice.call(arguments, 1);
+ while ((type = types.shift()) && (callbacks = this._callbacks[type])) {
+ syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args));
+ asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args));
+ syncFlush() && nextTick(asyncFlush);
+ }
+ return this;
+ }
+ function getFlush(callbacks, context, args) {
+ return flush;
+ function flush() {
+ var cancelled;
+ for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) {
+ cancelled = callbacks[i].apply(context, args) === false;
+ }
+ return !cancelled;
+ }
+ }
+ function getNextTick() {
+ var nextTickFn;
+ if (window.setImmediate) {
+ nextTickFn = function nextTickSetImmediate(fn) {
+ setImmediate(function() {
+ fn();
+ });
+ };
+ } else {
+ nextTickFn = function nextTickSetTimeout(fn) {
+ setTimeout(function() {
+ fn();
+ }, 0);
+ };
+ }
+ return nextTickFn;
+ }
+ function bindContext(fn, context) {
+ return fn.bind ? fn.bind(context) : function() {
+ fn.apply(context, [].slice.call(arguments, 0));
+ };
+ }
+ }();
+ var highlight = function(doc) {
+ "use strict";
+ var defaults = {
+ node: null,
+ pattern: null,
+ tagName: "strong",
+ className: null,
+ wordsOnly: false,
+ caseSensitive: false,
+ diacriticInsensitive: false
+ };
+ var accented = {
+ A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]",
+ B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]",
+ C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]",
+ D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]",
+ E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]",
+ F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]",
+ G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]",
+ H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]",
+ I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]",
+ J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]",
+ K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]",
+ L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]",
+ M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]",
+ N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]",
+ O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]",
+ P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]",
+ Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]",
+ R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]",
+ S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]",
+ T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]",
+ U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]",
+ V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]",
+ W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]",
+ X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]",
+ Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]",
+ Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]"
+ };
+ return function hightlight(o) {
+ var regex;
+ o = _.mixin({}, defaults, o);
+ if (!o.node || !o.pattern) {
+ return;
+ }
+ o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ];
+ regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive);
+ traverse(o.node, hightlightTextNode);
+ function hightlightTextNode(textNode) {
+ var match, patternNode, wrapperNode;
+ if (match = regex.exec(textNode.data)) {
+ wrapperNode = doc.createElement(o.tagName);
+ o.className && (wrapperNode.className = o.className);
+ patternNode = textNode.splitText(match.index);
+ patternNode.splitText(match[0].length);
+ wrapperNode.appendChild(patternNode.cloneNode(true));
+ textNode.parentNode.replaceChild(wrapperNode, patternNode);
+ }
+ return !!match;
+ }
+ function traverse(el, hightlightTextNode) {
+ var childNode, TEXT_NODE_TYPE = 3;
+ for (var i = 0; i < el.childNodes.length; i++) {
+ childNode = el.childNodes[i];
+ if (childNode.nodeType === TEXT_NODE_TYPE) {
+ i += hightlightTextNode(childNode) ? 1 : 0;
+ } else {
+ traverse(childNode, hightlightTextNode);
+ }
+ }
+ }
+ };
+ function accent_replacer(chr) {
+ return accented[chr.toUpperCase()] || chr;
+ }
+ function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) {
+ var escapedPatterns = [], regexStr;
+ for (var i = 0, len = patterns.length; i < len; i++) {
+ var escapedWord = _.escapeRegExChars(patterns[i]);
+ if (diacriticInsensitive) {
+ escapedWord = escapedWord.replace(/\S/g, accent_replacer);
+ }
+ escapedPatterns.push(escapedWord);
+ }
+ regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")";
+ return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i");
+ }
+ }(window.document);
+ var Input = function() {
+ "use strict";
+ var specialKeyCodeMap;
+ specialKeyCodeMap = {
+ 9: "tab",
+ 27: "esc",
+ 37: "left",
+ 39: "right",
+ 13: "enter",
+ 38: "up",
+ 40: "down"
+ };
+ function Input(o, www) {
+ var id;
+ o = o || {};
+ if (!o.input) {
+ $.error("input is missing");
+ }
+ www.mixin(this);
+ this.$hint = $(o.hint);
+ this.$input = $(o.input);
+ this.$menu = $(o.menu);
+ id = this.$input.attr("id") || _.guid();
+ this.$menu.attr("id", id + "_listbox");
+ this.$hint.attr({
+ "aria-hidden": true
+ });
+ this.$input.attr({
+ "aria-owns": id + "_listbox",
+ "aria-controls": id + "_listbox",
+ role: "combobox",
+ "aria-autocomplete": "list",
+ "aria-expanded": false
+ });
+ this.query = this.$input.val();
+ this.queryWhenFocused = this.hasFocus() ? this.query : null;
+ this.$overflowHelper = buildOverflowHelper(this.$input);
+ this._checkLanguageDirection();
+ if (this.$hint.length === 0) {
+ this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop;
+ }
+ this.onSync("cursorchange", this._updateDescendent);
+ }
+ Input.normalizeQuery = function(str) {
+ return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " ");
+ };
+ _.mixin(Input.prototype, EventEmitter, {
+ _onBlur: function onBlur() {
+ this.resetInputValue();
+ this.trigger("blurred");
+ },
+ _onFocus: function onFocus() {
+ this.queryWhenFocused = this.query;
+ this.trigger("focused");
+ },
+ _onKeydown: function onKeydown($e) {
+ var keyName = specialKeyCodeMap[$e.which || $e.keyCode];
+ this._managePreventDefault(keyName, $e);
+ if (keyName && this._shouldTrigger(keyName, $e)) {
+ this.trigger(keyName + "Keyed", $e);
+ }
+ },
+ _onInput: function onInput() {
+ this._setQuery(this.getInputValue());
+ this.clearHintIfInvalid();
+ this._checkLanguageDirection();
+ },
+ _managePreventDefault: function managePreventDefault(keyName, $e) {
+ var preventDefault;
+ switch (keyName) {
+ case "up":
+ case "down":
+ preventDefault = !withModifier($e);
+ break;
+
+ default:
+ preventDefault = false;
+ }
+ preventDefault && $e.preventDefault();
+ },
+ _shouldTrigger: function shouldTrigger(keyName, $e) {
+ var trigger;
+ switch (keyName) {
+ case "tab":
+ trigger = !withModifier($e);
+ break;
+
+ default:
+ trigger = true;
+ }
+ return trigger;
+ },
+ _checkLanguageDirection: function checkLanguageDirection() {
+ var dir = (this.$input.css("direction") || "ltr").toLowerCase();
+ if (this.dir !== dir) {
+ this.dir = dir;
+ this.$hint.attr("dir", dir);
+ this.trigger("langDirChanged", dir);
+ }
+ },
+ _setQuery: function setQuery(val, silent) {
+ var areEquivalent, hasDifferentWhitespace;
+ areEquivalent = areQueriesEquivalent(val, this.query);
+ hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false;
+ this.query = val;
+ if (!silent && !areEquivalent) {
+ this.trigger("queryChanged", this.query);
+ } else if (!silent && hasDifferentWhitespace) {
+ this.trigger("whitespaceChanged", this.query);
+ }
+ },
+ _updateDescendent: function updateDescendent(event, id) {
+ this.$input.attr("aria-activedescendant", id);
+ },
+ bind: function() {
+ var that = this, onBlur, onFocus, onKeydown, onInput;
+ onBlur = _.bind(this._onBlur, this);
+ onFocus = _.bind(this._onFocus, this);
+ onKeydown = _.bind(this._onKeydown, this);
+ onInput = _.bind(this._onInput, this);
+ this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown);
+ if (!_.isMsie() || _.isMsie() > 9) {
+ this.$input.on("input.tt", onInput);
+ } else {
+ this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) {
+ if (specialKeyCodeMap[$e.which || $e.keyCode]) {
+ return;
+ }
+ _.defer(_.bind(that._onInput, that, $e));
+ });
+ }
+ return this;
+ },
+ focus: function focus() {
+ this.$input.focus();
+ },
+ blur: function blur() {
+ this.$input.blur();
+ },
+ getLangDir: function getLangDir() {
+ return this.dir;
+ },
+ getQuery: function getQuery() {
+ return this.query || "";
+ },
+ setQuery: function setQuery(val, silent) {
+ this.setInputValue(val);
+ this._setQuery(val, silent);
+ },
+ hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() {
+ return this.query !== this.queryWhenFocused;
+ },
+ getInputValue: function getInputValue() {
+ return this.$input.val();
+ },
+ setInputValue: function setInputValue(value) {
+ this.$input.val(value);
+ this.clearHintIfInvalid();
+ this._checkLanguageDirection();
+ },
+ resetInputValue: function resetInputValue() {
+ this.setInputValue(this.query);
+ },
+ getHint: function getHint() {
+ return this.$hint.val();
+ },
+ setHint: function setHint(value) {
+ this.$hint.val(value);
+ },
+ clearHint: function clearHint() {
+ this.setHint("");
+ },
+ clearHintIfInvalid: function clearHintIfInvalid() {
+ var val, hint, valIsPrefixOfHint, isValid;
+ val = this.getInputValue();
+ hint = this.getHint();
+ valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;
+ isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow();
+ !isValid && this.clearHint();
+ },
+ hasFocus: function hasFocus() {
+ return this.$input.is(":focus");
+ },
+ hasOverflow: function hasOverflow() {
+ var constraint = this.$input.width() - 2;
+ this.$overflowHelper.text(this.getInputValue());
+ return this.$overflowHelper.width() >= constraint;
+ },
+ isCursorAtEnd: function() {
+ var valueLength, selectionStart, range;
+ valueLength = this.$input.val().length;
+ selectionStart = this.$input[0].selectionStart;
+ if (_.isNumber(selectionStart)) {
+ return selectionStart === valueLength;
+ } else if (document.selection) {
+ range = document.selection.createRange();
+ range.moveStart("character", -valueLength);
+ return valueLength === range.text.length;
+ }
+ return true;
+ },
+ destroy: function destroy() {
+ this.$hint.off(".tt");
+ this.$input.off(".tt");
+ this.$overflowHelper.remove();
+ this.$hint = this.$input = this.$overflowHelper = $("");
+ },
+ setAriaExpanded: function setAriaExpanded(value) {
+ this.$input.attr("aria-expanded", value);
+ }
+ });
+ return Input;
+ function buildOverflowHelper($input) {
+ return $('
').css({
+ position: "absolute",
+ visibility: "hidden",
+ whiteSpace: "pre",
+ fontFamily: $input.css("font-family"),
+ fontSize: $input.css("font-size"),
+ fontStyle: $input.css("font-style"),
+ fontVariant: $input.css("font-variant"),
+ fontWeight: $input.css("font-weight"),
+ wordSpacing: $input.css("word-spacing"),
+ letterSpacing: $input.css("letter-spacing"),
+ textIndent: $input.css("text-indent"),
+ textRendering: $input.css("text-rendering"),
+ textTransform: $input.css("text-transform")
+ }).insertAfter($input);
+ }
+ function areQueriesEquivalent(a, b) {
+ return Input.normalizeQuery(a) === Input.normalizeQuery(b);
+ }
+ function withModifier($e) {
+ return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey;
+ }
+ }();
+ var Dataset = function() {
+ "use strict";
+ var keys, nameGenerator;
+ keys = {
+ dataset: "tt-selectable-dataset",
+ val: "tt-selectable-display",
+ obj: "tt-selectable-object"
+ };
+ nameGenerator = _.getIdGenerator();
+ function Dataset(o, www) {
+ o = o || {};
+ o.templates = o.templates || {};
+ o.templates.notFound = o.templates.notFound || o.templates.empty;
+ if (!o.source) {
+ $.error("missing source");
+ }
+ if (!o.node) {
+ $.error("missing node");
+ }
+ if (o.name && !isValidName(o.name)) {
+ $.error("invalid dataset name: " + o.name);
+ }
+ www.mixin(this);
+ this.highlight = !!o.highlight;
+ this.name = _.toStr(o.name || nameGenerator());
+ this.limit = o.limit || 5;
+ this.displayFn = getDisplayFn(o.display || o.displayKey);
+ this.templates = getTemplates(o.templates, this.displayFn);
+ this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source;
+ this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async;
+ this._resetLastSuggestion();
+ this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name);
+ }
+ Dataset.extractData = function extractData(el) {
+ var $el = $(el);
+ if ($el.data(keys.obj)) {
+ return {
+ dataset: $el.data(keys.dataset) || "",
+ val: $el.data(keys.val) || "",
+ obj: $el.data(keys.obj) || null
+ };
+ }
+ return null;
+ };
+ _.mixin(Dataset.prototype, EventEmitter, {
+ _overwrite: function overwrite(query, suggestions) {
+ suggestions = suggestions || [];
+ if (suggestions.length) {
+ this._renderSuggestions(query, suggestions);
+ } else if (this.async && this.templates.pending) {
+ this._renderPending(query);
+ } else if (!this.async && this.templates.notFound) {
+ this._renderNotFound(query);
+ } else {
+ this._empty();
+ }
+ this.trigger("rendered", suggestions, false, this.name);
+ },
+ _append: function append(query, suggestions) {
+ suggestions = suggestions || [];
+ if (suggestions.length && this.$lastSuggestion.length) {
+ this._appendSuggestions(query, suggestions);
+ } else if (suggestions.length) {
+ this._renderSuggestions(query, suggestions);
+ } else if (!this.$lastSuggestion.length && this.templates.notFound) {
+ this._renderNotFound(query);
+ }
+ this.trigger("rendered", suggestions, true, this.name);
+ },
+ _renderSuggestions: function renderSuggestions(query, suggestions) {
+ var $fragment;
+ $fragment = this._getSuggestionsFragment(query, suggestions);
+ this.$lastSuggestion = $fragment.children().last();
+ this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions));
+ },
+ _appendSuggestions: function appendSuggestions(query, suggestions) {
+ var $fragment, $lastSuggestion;
+ $fragment = this._getSuggestionsFragment(query, suggestions);
+ $lastSuggestion = $fragment.children().last();
+ this.$lastSuggestion.after($fragment);
+ this.$lastSuggestion = $lastSuggestion;
+ },
+ _renderPending: function renderPending(query) {
+ var template = this.templates.pending;
+ this._resetLastSuggestion();
+ template && this.$el.html(template({
+ query: query,
+ dataset: this.name
+ }));
+ },
+ _renderNotFound: function renderNotFound(query) {
+ var template = this.templates.notFound;
+ this._resetLastSuggestion();
+ template && this.$el.html(template({
+ query: query,
+ dataset: this.name
+ }));
+ },
+ _empty: function empty() {
+ this.$el.empty();
+ this._resetLastSuggestion();
+ },
+ _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) {
+ var that = this, fragment;
+ fragment = document.createDocumentFragment();
+ _.each(suggestions, function getSuggestionNode(suggestion) {
+ var $el, context;
+ context = that._injectQuery(query, suggestion);
+ $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable);
+ fragment.appendChild($el[0]);
+ });
+ this.highlight && highlight({
+ className: this.classes.highlight,
+ node: fragment,
+ pattern: query
+ });
+ return $(fragment);
+ },
+ _getFooter: function getFooter(query, suggestions) {
+ return this.templates.footer ? this.templates.footer({
+ query: query,
+ suggestions: suggestions,
+ dataset: this.name
+ }) : null;
+ },
+ _getHeader: function getHeader(query, suggestions) {
+ return this.templates.header ? this.templates.header({
+ query: query,
+ suggestions: suggestions,
+ dataset: this.name
+ }) : null;
+ },
+ _resetLastSuggestion: function resetLastSuggestion() {
+ this.$lastSuggestion = $();
+ },
+ _injectQuery: function injectQuery(query, obj) {
+ return _.isObject(obj) ? _.mixin({
+ _query: query
+ }, obj) : obj;
+ },
+ update: function update(query) {
+ var that = this, canceled = false, syncCalled = false, rendered = 0;
+ this.cancel();
+ this.cancel = function cancel() {
+ canceled = true;
+ that.cancel = $.noop;
+ that.async && that.trigger("asyncCanceled", query, that.name);
+ };
+ this.source(query, sync, async);
+ !syncCalled && sync([]);
+ function sync(suggestions) {
+ if (syncCalled) {
+ return;
+ }
+ syncCalled = true;
+ suggestions = (suggestions || []).slice(0, that.limit);
+ rendered = suggestions.length;
+ that._overwrite(query, suggestions);
+ if (rendered < that.limit && that.async) {
+ that.trigger("asyncRequested", query, that.name);
+ }
+ }
+ function async(suggestions) {
+ suggestions = suggestions || [];
+ if (!canceled && rendered < that.limit) {
+ that.cancel = $.noop;
+ var idx = Math.abs(rendered - that.limit);
+ rendered += idx;
+ that._append(query, suggestions.slice(0, idx));
+ that.async && that.trigger("asyncReceived", query, that.name);
+ }
+ }
+ },
+ cancel: $.noop,
+ clear: function clear() {
+ this._empty();
+ this.cancel();
+ this.trigger("cleared");
+ },
+ isEmpty: function isEmpty() {
+ return this.$el.is(":empty");
+ },
+ destroy: function destroy() {
+ this.$el = $("
");
+ }
+ });
+ return Dataset;
+ function getDisplayFn(display) {
+ display = display || _.stringify;
+ return _.isFunction(display) ? display : displayFn;
+ function displayFn(obj) {
+ return obj[display];
+ }
+ }
+ function getTemplates(templates, displayFn) {
+ return {
+ notFound: templates.notFound && _.templatify(templates.notFound),
+ pending: templates.pending && _.templatify(templates.pending),
+ header: templates.header && _.templatify(templates.header),
+ footer: templates.footer && _.templatify(templates.footer),
+ suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate
+ };
+ function userSuggestionTemplate(context) {
+ var template = templates.suggestion;
+ return $(template(context)).attr("id", _.guid());
+ }
+ function suggestionTemplate(context) {
+ return $('
').attr("id", _.guid()).text(displayFn(context));
+ }
+ }
+ function isValidName(str) {
+ return /^[_a-zA-Z0-9-]+$/.test(str);
+ }
+ }();
+ var Menu = function() {
+ "use strict";
+ function Menu(o, www) {
+ var that = this;
+ o = o || {};
+ if (!o.node) {
+ $.error("node is required");
+ }
+ www.mixin(this);
+ this.$node = $(o.node);
+ this.query = null;
+ this.datasets = _.map(o.datasets, initializeDataset);
+ function initializeDataset(oDataset) {
+ var node = that.$node.find(oDataset.node).first();
+ oDataset.node = node.length ? node : $("
").appendTo(that.$node);
+ return new Dataset(oDataset, www);
+ }
+ }
+ _.mixin(Menu.prototype, EventEmitter, {
+ _onSelectableClick: function onSelectableClick($e) {
+ this.trigger("selectableClicked", $($e.currentTarget));
+ },
+ _onRendered: function onRendered(type, dataset, suggestions, async) {
+ this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
+ this.trigger("datasetRendered", dataset, suggestions, async);
+ },
+ _onCleared: function onCleared() {
+ this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty());
+ this.trigger("datasetCleared");
+ },
+ _propagate: function propagate() {
+ this.trigger.apply(this, arguments);
+ },
+ _allDatasetsEmpty: function allDatasetsEmpty() {
+ return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) {
+ var isEmpty = dataset.isEmpty();
+ this.$node.attr("aria-expanded", !isEmpty);
+ return isEmpty;
+ }, this));
+ },
+ _getSelectables: function getSelectables() {
+ return this.$node.find(this.selectors.selectable);
+ },
+ _removeCursor: function _removeCursor() {
+ var $selectable = this.getActiveSelectable();
+ $selectable && $selectable.removeClass(this.classes.cursor);
+ },
+ _ensureVisible: function ensureVisible($el) {
+ var elTop, elBottom, nodeScrollTop, nodeHeight;
+ elTop = $el.position().top;
+ elBottom = elTop + $el.outerHeight(true);
+ nodeScrollTop = this.$node.scrollTop();
+ nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10);
+ if (elTop < 0) {
+ this.$node.scrollTop(nodeScrollTop + elTop);
+ } else if (nodeHeight < elBottom) {
+ this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight));
+ }
+ },
+ bind: function() {
+ var that = this, onSelectableClick;
+ onSelectableClick = _.bind(this._onSelectableClick, this);
+ this.$node.on("click.tt", this.selectors.selectable, onSelectableClick);
+ this.$node.on("mouseover", this.selectors.selectable, function() {
+ that.setCursor($(this));
+ });
+ this.$node.on("mouseleave", function() {
+ that._removeCursor();
+ });
+ _.each(this.datasets, function(dataset) {
+ dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that);
+ });
+ return this;
+ },
+ isOpen: function isOpen() {
+ return this.$node.hasClass(this.classes.open);
+ },
+ open: function open() {
+ this.$node.scrollTop(0);
+ this.$node.addClass(this.classes.open);
+ },
+ close: function close() {
+ this.$node.attr("aria-expanded", false);
+ this.$node.removeClass(this.classes.open);
+ this._removeCursor();
+ },
+ setLanguageDirection: function setLanguageDirection(dir) {
+ this.$node.attr("dir", dir);
+ },
+ selectableRelativeToCursor: function selectableRelativeToCursor(delta) {
+ var $selectables, $oldCursor, oldIndex, newIndex;
+ $oldCursor = this.getActiveSelectable();
+ $selectables = this._getSelectables();
+ oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1;
+ newIndex = oldIndex + delta;
+ newIndex = (newIndex + 1) % ($selectables.length + 1) - 1;
+ newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex;
+ return newIndex === -1 ? null : $selectables.eq(newIndex);
+ },
+ setCursor: function setCursor($selectable) {
+ this._removeCursor();
+ if ($selectable = $selectable && $selectable.first()) {
+ $selectable.addClass(this.classes.cursor);
+ this._ensureVisible($selectable);
+ }
+ },
+ getSelectableData: function getSelectableData($el) {
+ return $el && $el.length ? Dataset.extractData($el) : null;
+ },
+ getActiveSelectable: function getActiveSelectable() {
+ var $selectable = this._getSelectables().filter(this.selectors.cursor).first();
+ return $selectable.length ? $selectable : null;
+ },
+ getTopSelectable: function getTopSelectable() {
+ var $selectable = this._getSelectables().first();
+ return $selectable.length ? $selectable : null;
+ },
+ update: function update(query) {
+ var isValidUpdate = query !== this.query;
+ if (isValidUpdate) {
+ this.query = query;
+ _.each(this.datasets, updateDataset);
+ }
+ return isValidUpdate;
+ function updateDataset(dataset) {
+ dataset.update(query);
+ }
+ },
+ empty: function empty() {
+ _.each(this.datasets, clearDataset);
+ this.query = null;
+ this.$node.addClass(this.classes.empty);
+ function clearDataset(dataset) {
+ dataset.clear();
+ }
+ },
+ destroy: function destroy() {
+ this.$node.off(".tt");
+ this.$node = $("
");
+ _.each(this.datasets, destroyDataset);
+ function destroyDataset(dataset) {
+ dataset.destroy();
+ }
+ }
+ });
+ return Menu;
+ }();
+ var Status = function() {
+ "use strict";
+ function Status(options) {
+ this.$el = $("
", {
+ role: "status",
+ "aria-live": "polite"
+ }).css({
+ position: "absolute",
+ padding: "0",
+ border: "0",
+ height: "1px",
+ width: "1px",
+ "margin-bottom": "-1px",
+ "margin-right": "-1px",
+ overflow: "hidden",
+ clip: "rect(0 0 0 0)",
+ "white-space": "nowrap"
+ });
+ options.$input.after(this.$el);
+ _.each(options.menu.datasets, _.bind(function(dataset) {
+ if (dataset.onSync) {
+ dataset.onSync("rendered", _.bind(this.update, this));
+ dataset.onSync("cleared", _.bind(this.cleared, this));
+ }
+ }, this));
+ }
+ _.mixin(Status.prototype, {
+ update: function update(event, suggestions) {
+ var length = suggestions.length;
+ var words;
+ if (length === 1) {
+ words = {
+ result: "result",
+ is: "is"
+ };
+ } else {
+ words = {
+ result: "results",
+ is: "are"
+ };
+ }
+ this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate.");
+ },
+ cleared: function() {
+ this.$el.text("");
+ }
+ });
+ return Status;
+ }();
+ var DefaultMenu = function() {
+ "use strict";
+ var s = Menu.prototype;
+ function DefaultMenu() {
+ Menu.apply(this, [].slice.call(arguments, 0));
+ }
+ _.mixin(DefaultMenu.prototype, Menu.prototype, {
+ open: function open() {
+ !this._allDatasetsEmpty() && this._show();
+ return s.open.apply(this, [].slice.call(arguments, 0));
+ },
+ close: function close() {
+ this._hide();
+ return s.close.apply(this, [].slice.call(arguments, 0));
+ },
+ _onRendered: function onRendered() {
+ if (this._allDatasetsEmpty()) {
+ this._hide();
+ } else {
+ this.isOpen() && this._show();
+ }
+ return s._onRendered.apply(this, [].slice.call(arguments, 0));
+ },
+ _onCleared: function onCleared() {
+ if (this._allDatasetsEmpty()) {
+ this._hide();
+ } else {
+ this.isOpen() && this._show();
+ }
+ return s._onCleared.apply(this, [].slice.call(arguments, 0));
+ },
+ setLanguageDirection: function setLanguageDirection(dir) {
+ this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl);
+ return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0));
+ },
+ _hide: function hide() {
+ this.$node.hide();
+ },
+ _show: function show() {
+ this.$node.css("display", "block");
+ }
+ });
+ return DefaultMenu;
+ }();
+ var Typeahead = function() {
+ "use strict";
+ function Typeahead(o, www) {
+ var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged;
+ o = o || {};
+ if (!o.input) {
+ $.error("missing input");
+ }
+ if (!o.menu) {
+ $.error("missing menu");
+ }
+ if (!o.eventBus) {
+ $.error("missing event bus");
+ }
+ www.mixin(this);
+ this.eventBus = o.eventBus;
+ this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
+ this.input = o.input;
+ this.menu = o.menu;
+ this.enabled = true;
+ this.autoselect = !!o.autoselect;
+ this.active = false;
+ this.input.hasFocus() && this.activate();
+ this.dir = this.input.getLangDir();
+ this._hacks();
+ this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this);
+ onFocused = c(this, "activate", "open", "_onFocused");
+ onBlurred = c(this, "deactivate", "_onBlurred");
+ onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed");
+ onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed");
+ onEscKeyed = c(this, "isActive", "_onEscKeyed");
+ onUpKeyed = c(this, "isActive", "open", "_onUpKeyed");
+ onDownKeyed = c(this, "isActive", "open", "_onDownKeyed");
+ onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed");
+ onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed");
+ onQueryChanged = c(this, "_openIfActive", "_onQueryChanged");
+ onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged");
+ this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this);
+ }
+ _.mixin(Typeahead.prototype, {
+ _hacks: function hacks() {
+ var $input, $menu;
+ $input = this.input.$input || $("
");
+ $menu = this.menu.$node || $("
");
+ $input.on("blur.tt", function($e) {
+ var active, isActive, hasActive;
+ active = document.activeElement;
+ isActive = $menu.is(active);
+ hasActive = $menu.has(active).length > 0;
+ if (_.isMsie() && (isActive || hasActive)) {
+ $e.preventDefault();
+ $e.stopImmediatePropagation();
+ _.defer(function() {
+ $input.focus();
+ });
+ }
+ });
+ $menu.on("mousedown.tt", function($e) {
+ $e.preventDefault();
+ });
+ },
+ _onSelectableClicked: function onSelectableClicked(type, $el) {
+ this.select($el);
+ },
+ _onDatasetCleared: function onDatasetCleared() {
+ this._updateHint();
+ },
+ _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) {
+ this._updateHint();
+ if (this.autoselect) {
+ var cursorClass = this.selectors.cursor.substr(1);
+ this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass);
+ }
+ this.eventBus.trigger("render", suggestions, async, dataset);
+ },
+ _onAsyncRequested: function onAsyncRequested(type, dataset, query) {
+ this.eventBus.trigger("asyncrequest", query, dataset);
+ },
+ _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) {
+ this.eventBus.trigger("asynccancel", query, dataset);
+ },
+ _onAsyncReceived: function onAsyncReceived(type, dataset, query) {
+ this.eventBus.trigger("asyncreceive", query, dataset);
+ },
+ _onFocused: function onFocused() {
+ this._minLengthMet() && this.menu.update(this.input.getQuery());
+ },
+ _onBlurred: function onBlurred() {
+ if (this.input.hasQueryChangedSinceLastFocus()) {
+ this.eventBus.trigger("change", this.input.getQuery());
+ }
+ },
+ _onEnterKeyed: function onEnterKeyed(type, $e) {
+ var $selectable;
+ if ($selectable = this.menu.getActiveSelectable()) {
+ if (this.select($selectable)) {
+ $e.preventDefault();
+ $e.stopPropagation();
+ }
+ } else if (this.autoselect) {
+ if (this.select(this.menu.getTopSelectable())) {
+ $e.preventDefault();
+ $e.stopPropagation();
+ }
+ }
+ },
+ _onTabKeyed: function onTabKeyed(type, $e) {
+ var $selectable;
+ if ($selectable = this.menu.getActiveSelectable()) {
+ this.select($selectable) && $e.preventDefault();
+ } else if (this.autoselect) {
+ if ($selectable = this.menu.getTopSelectable()) {
+ this.autocomplete($selectable) && $e.preventDefault();
+ }
+ }
+ },
+ _onEscKeyed: function onEscKeyed() {
+ this.close();
+ },
+ _onUpKeyed: function onUpKeyed() {
+ this.moveCursor(-1);
+ },
+ _onDownKeyed: function onDownKeyed() {
+ this.moveCursor(+1);
+ },
+ _onLeftKeyed: function onLeftKeyed() {
+ if (this.dir === "rtl" && this.input.isCursorAtEnd()) {
+ this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());
+ }
+ },
+ _onRightKeyed: function onRightKeyed() {
+ if (this.dir === "ltr" && this.input.isCursorAtEnd()) {
+ this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable());
+ }
+ },
+ _onQueryChanged: function onQueryChanged(e, query) {
+ this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty();
+ },
+ _onWhitespaceChanged: function onWhitespaceChanged() {
+ this._updateHint();
+ },
+ _onLangDirChanged: function onLangDirChanged(e, dir) {
+ if (this.dir !== dir) {
+ this.dir = dir;
+ this.menu.setLanguageDirection(dir);
+ }
+ },
+ _openIfActive: function openIfActive() {
+ this.isActive() && this.open();
+ },
+ _minLengthMet: function minLengthMet(query) {
+ query = _.isString(query) ? query : this.input.getQuery() || "";
+ return query.length >= this.minLength;
+ },
+ _updateHint: function updateHint() {
+ var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match;
+ $selectable = this.menu.getTopSelectable();
+ data = this.menu.getSelectableData($selectable);
+ val = this.input.getInputValue();
+ if (data && !_.isBlankString(val) && !this.input.hasOverflow()) {
+ query = Input.normalizeQuery(val);
+ escapedQuery = _.escapeRegExChars(query);
+ frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i");
+ match = frontMatchRegEx.exec(data.val);
+ match && this.input.setHint(val + match[1]);
+ } else {
+ this.input.clearHint();
+ }
+ },
+ isEnabled: function isEnabled() {
+ return this.enabled;
+ },
+ enable: function enable() {
+ this.enabled = true;
+ },
+ disable: function disable() {
+ this.enabled = false;
+ },
+ isActive: function isActive() {
+ return this.active;
+ },
+ activate: function activate() {
+ if (this.isActive()) {
+ return true;
+ } else if (!this.isEnabled() || this.eventBus.before("active")) {
+ return false;
+ } else {
+ this.active = true;
+ this.eventBus.trigger("active");
+ return true;
+ }
+ },
+ deactivate: function deactivate() {
+ if (!this.isActive()) {
+ return true;
+ } else if (this.eventBus.before("idle")) {
+ return false;
+ } else {
+ this.active = false;
+ this.close();
+ this.eventBus.trigger("idle");
+ return true;
+ }
+ },
+ isOpen: function isOpen() {
+ return this.menu.isOpen();
+ },
+ open: function open() {
+ if (!this.isOpen() && !this.eventBus.before("open")) {
+ this.input.setAriaExpanded(true);
+ this.menu.open();
+ this._updateHint();
+ this.eventBus.trigger("open");
+ }
+ return this.isOpen();
+ },
+ close: function close() {
+ if (this.isOpen() && !this.eventBus.before("close")) {
+ this.input.setAriaExpanded(false);
+ this.menu.close();
+ this.input.clearHint();
+ this.input.resetInputValue();
+ this.eventBus.trigger("close");
+ }
+ return !this.isOpen();
+ },
+ setVal: function setVal(val) {
+ this.input.setQuery(_.toStr(val));
+ },
+ getVal: function getVal() {
+ return this.input.getQuery();
+ },
+ select: function select($selectable) {
+ var data = this.menu.getSelectableData($selectable);
+ if (data && !this.eventBus.before("select", data.obj, data.dataset)) {
+ this.input.setQuery(data.val, true);
+ this.eventBus.trigger("select", data.obj, data.dataset);
+ this.close();
+ return true;
+ }
+ return false;
+ },
+ autocomplete: function autocomplete($selectable) {
+ var query, data, isValid;
+ query = this.input.getQuery();
+ data = this.menu.getSelectableData($selectable);
+ isValid = data && query !== data.val;
+ if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) {
+ this.input.setQuery(data.val);
+ this.eventBus.trigger("autocomplete", data.obj, data.dataset);
+ return true;
+ }
+ return false;
+ },
+ moveCursor: function moveCursor(delta) {
+ var query, $candidate, data, suggestion, datasetName, cancelMove, id;
+ query = this.input.getQuery();
+ $candidate = this.menu.selectableRelativeToCursor(delta);
+ data = this.menu.getSelectableData($candidate);
+ suggestion = data ? data.obj : null;
+ datasetName = data ? data.dataset : null;
+ id = $candidate ? $candidate.attr("id") : null;
+ this.input.trigger("cursorchange", id);
+ cancelMove = this._minLengthMet() && this.menu.update(query);
+ if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) {
+ this.menu.setCursor($candidate);
+ if (data) {
+ if (typeof data.val === "string") {
+ this.input.setInputValue(data.val);
+ }
+ } else {
+ this.input.resetInputValue();
+ this._updateHint();
+ }
+ this.eventBus.trigger("cursorchange", suggestion, datasetName);
+ return true;
+ }
+ return false;
+ },
+ destroy: function destroy() {
+ this.input.destroy();
+ this.menu.destroy();
+ }
+ });
+ return Typeahead;
+ function c(ctx) {
+ var methods = [].slice.call(arguments, 1);
+ return function() {
+ var args = [].slice.call(arguments);
+ _.each(methods, function(method) {
+ return ctx[method].apply(ctx, args);
+ });
+ };
+ }
+ }();
+ (function() {
+ "use strict";
+ var old, keys, methods;
+ old = $.fn.typeahead;
+ keys = {
+ www: "tt-www",
+ attrs: "tt-attrs",
+ typeahead: "tt-typeahead"
+ };
+ methods = {
+ initialize: function initialize(o, datasets) {
+ var www;
+ datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);
+ o = o || {};
+ www = WWW(o.classNames);
+ return this.each(attach);
+ function attach() {
+ var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor;
+ _.each(datasets, function(d) {
+ d.highlight = !!o.highlight;
+ });
+ $input = $(this);
+ $wrapper = $(www.html.wrapper);
+ $hint = $elOrNull(o.hint);
+ $menu = $elOrNull(o.menu);
+ defaultHint = o.hint !== false && !$hint;
+ defaultMenu = o.menu !== false && !$menu;
+ defaultHint && ($hint = buildHintFromInput($input, www));
+ defaultMenu && ($menu = $(www.html.menu).css(www.css.menu));
+ $hint && $hint.val("");
+ $input = prepInput($input, www);
+ if (defaultHint || defaultMenu) {
+ $wrapper.css(www.css.wrapper);
+ $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint);
+ $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null);
+ }
+ MenuConstructor = defaultMenu ? DefaultMenu : Menu;
+ eventBus = new EventBus({
+ el: $input
+ });
+ input = new Input({
+ hint: $hint,
+ input: $input,
+ menu: $menu
+ }, www);
+ menu = new MenuConstructor({
+ node: $menu,
+ datasets: datasets
+ }, www);
+ status = new Status({
+ $input: $input,
+ menu: menu
+ });
+ typeahead = new Typeahead({
+ input: input,
+ menu: menu,
+ eventBus: eventBus,
+ minLength: o.minLength,
+ autoselect: o.autoselect
+ }, www);
+ $input.data(keys.www, www);
+ $input.data(keys.typeahead, typeahead);
+ }
+ },
+ isEnabled: function isEnabled() {
+ var enabled;
+ ttEach(this.first(), function(t) {
+ enabled = t.isEnabled();
+ });
+ return enabled;
+ },
+ enable: function enable() {
+ ttEach(this, function(t) {
+ t.enable();
+ });
+ return this;
+ },
+ disable: function disable() {
+ ttEach(this, function(t) {
+ t.disable();
+ });
+ return this;
+ },
+ isActive: function isActive() {
+ var active;
+ ttEach(this.first(), function(t) {
+ active = t.isActive();
+ });
+ return active;
+ },
+ activate: function activate() {
+ ttEach(this, function(t) {
+ t.activate();
+ });
+ return this;
+ },
+ deactivate: function deactivate() {
+ ttEach(this, function(t) {
+ t.deactivate();
+ });
+ return this;
+ },
+ isOpen: function isOpen() {
+ var open;
+ ttEach(this.first(), function(t) {
+ open = t.isOpen();
+ });
+ return open;
+ },
+ open: function open() {
+ ttEach(this, function(t) {
+ t.open();
+ });
+ return this;
+ },
+ close: function close() {
+ ttEach(this, function(t) {
+ t.close();
+ });
+ return this;
+ },
+ select: function select(el) {
+ var success = false, $el = $(el);
+ ttEach(this.first(), function(t) {
+ success = t.select($el);
+ });
+ return success;
+ },
+ autocomplete: function autocomplete(el) {
+ var success = false, $el = $(el);
+ ttEach(this.first(), function(t) {
+ success = t.autocomplete($el);
+ });
+ return success;
+ },
+ moveCursor: function moveCursoe(delta) {
+ var success = false;
+ ttEach(this.first(), function(t) {
+ success = t.moveCursor(delta);
+ });
+ return success;
+ },
+ val: function val(newVal) {
+ var query;
+ if (!arguments.length) {
+ ttEach(this.first(), function(t) {
+ query = t.getVal();
+ });
+ return query;
+ } else {
+ ttEach(this, function(t) {
+ t.setVal(_.toStr(newVal));
+ });
+ return this;
+ }
+ },
+ destroy: function destroy() {
+ ttEach(this, function(typeahead, $input) {
+ revert($input);
+ typeahead.destroy();
+ });
+ return this;
+ }
+ };
+ $.fn.typeahead = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, [].slice.call(arguments, 1));
+ } else {
+ return methods.initialize.apply(this, arguments);
+ }
+ };
+ $.fn.typeahead.noConflict = function noConflict() {
+ $.fn.typeahead = old;
+ return this;
+ };
+ function ttEach($els, fn) {
+ $els.each(function() {
+ var $input = $(this), typeahead;
+ (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input);
+ });
+ }
+ function buildHintFromInput($input, www) {
+ return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({
+ readonly: true,
+ required: false
+ }).removeAttr("id name placeholder").removeClass("required").attr({
+ spellcheck: "false",
+ tabindex: -1
+ });
+ }
+ function prepInput($input, www) {
+ $input.data(keys.attrs, {
+ dir: $input.attr("dir"),
+ autocomplete: $input.attr("autocomplete"),
+ spellcheck: $input.attr("spellcheck"),
+ style: $input.attr("style")
+ });
+ $input.addClass(www.classes.input).attr({
+ spellcheck: false
+ });
+ try {
+ !$input.attr("dir") && $input.attr("dir", "auto");
+ } catch (e) {}
+ return $input;
+ }
+ function getBackgroundStyles($el) {
+ return {
+ backgroundAttachment: $el.css("background-attachment"),
+ backgroundClip: $el.css("background-clip"),
+ backgroundColor: $el.css("background-color"),
+ backgroundImage: $el.css("background-image"),
+ backgroundOrigin: $el.css("background-origin"),
+ backgroundPosition: $el.css("background-position"),
+ backgroundRepeat: $el.css("background-repeat"),
+ backgroundSize: $el.css("background-size")
+ };
+ }
+ function revert($input) {
+ var www, $wrapper;
+ www = $input.data(keys.www);
+ $wrapper = $input.parent().filter(www.selectors.wrapper);
+ _.each($input.data(keys.attrs), function(val, key) {
+ _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val);
+ });
+ $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input);
+ if ($wrapper.length) {
+ $input.detach().insertAfter($wrapper);
+ $wrapper.remove();
+ }
+ }
+ function $elOrNull(obj) {
+ var isValid, $el;
+ isValid = _.isJQuery(obj) || _.isElement(obj);
+ $el = isValid ? $(obj).first() : [];
+ return $el.length ? $el : null;
+ }
+ })();
+});
\ No newline at end of file
diff --git a/docs/search.json b/docs/search.json
new file mode 100644
index 0000000..6393e8b
--- /dev/null
+++ b/docs/search.json
@@ -0,0 +1 @@
+{"Typealiases.html#/s:11Clickstream0A9Attributea":{"name":"ClickstreamAttribute","abstract":"
the attribute for Clickstream which support String, Int, Int64, Double and Bool
"},"Extensions.html#/s:s5Int64V":{"name":"Int64","abstract":"
for support Int64 attribute value
"},"Extensions.html#/c:@SA@NSDecimal":{"name":"Decimal"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO7ITEM_IDSSvpZ":{"name":"ITEM_ID","abstract":"
The id of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO9ITEM_NAMESSvpZ":{"name":"ITEM_NAME","abstract":"
The name of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO11LOCATION_IDSSvpZ":{"name":"LOCATION_ID","abstract":"
The location id of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO10ITEM_BRANDSSvpZ":{"name":"ITEM_BRAND","abstract":"
The brand of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO8CURRENCYSSvpZ":{"name":"CURRENCY","abstract":"
The currency of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO5PRICESSvpZ":{"name":"PRICE","abstract":"
The price of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO8QUANTITYSSvpZ":{"name":"QUANTITY","abstract":"
The quantity of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13CREATIVE_NAMESSvpZ":{"name":"CREATIVE_NAME","abstract":"
The creative name of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13CREATIVE_SLOTSSvpZ":{"name":"CREATIVE_SLOT","abstract":"
The creative slot of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO13ITEM_CATEGORYSSvpZ":{"name":"ITEM_CATEGORY","abstract":"
The category of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY2SSvpZ":{"name":"ITEM_CATEGORY2","abstract":"
The category2 of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY3SSvpZ":{"name":"ITEM_CATEGORY3","abstract":"
The category3 of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY4SSvpZ":{"name":"ITEM_CATEGORY4","abstract":"
The category4 of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Item.html#/s:11Clickstream0A9AnalyticsO4ItemO14ITEM_CATEGORY5SSvpZ":{"name":"ITEM_CATEGORY5","abstract":"
The category5 of the item
","parent_name":"Item"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO11SCREEN_NAMESSvpZ":{"name":"SCREEN_NAME","abstract":"
Preset attribute screen name
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO16SCREEN_UNIQUE_IDSSvpZ":{"name":"SCREEN_UNIQUE_ID","abstract":"
Preset attribute screen unique id
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO015TRAFFIC_SOURCE_E0SSvpZ":{"name":"TRAFFIC_SOURCE_SOURCE","abstract":"
Preset attribute traffic source source
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO21TRAFFIC_SOURCE_MEDIUMSSvpZ":{"name":"TRAFFIC_SOURCE_MEDIUM","abstract":"
Preset attribute traffic source medium
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO23TRAFFIC_SOURCE_CAMPAIGNSSvpZ":{"name":"TRAFFIC_SOURCE_CAMPAIGN","abstract":"
Preset attribute traffic source campaign
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO26TRAFFIC_SOURCE_CAMPAIGN_IDSSvpZ":{"name":"TRAFFIC_SOURCE_CAMPAIGN_ID","abstract":"
Preset attribute traffic source campaign id
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19TRAFFIC_SOURCE_TERMSSvpZ":{"name":"TRAFFIC_SOURCE_TERM","abstract":"
Preset attribute traffic source term
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO22TRAFFIC_SOURCE_CONTENTSSvpZ":{"name":"TRAFFIC_SOURCE_CONTENT","abstract":"
Preset attribute traffic source content
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19TRAFFIC_SOURCE_CLIDSSvpZ":{"name":"TRAFFIC_SOURCE_CLID","abstract":"
Preset attribute traffic source clid
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO28TRAFFIC_SOURCE_CLID_PLATFORMSSvpZ":{"name":"TRAFFIC_SOURCE_CLID_PLATFORM","abstract":"
Preset attribute traffic source clid platform
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO19APP_INSTALL_CHANNELSSvpZ":{"name":"APP_INSTALL_CHANNEL","abstract":"
Preset attribute app install channel
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO5VALUESSvpZ":{"name":"VALUE","abstract":"
Preset attribute event value
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/Attr.html#/s:11Clickstream0A9AnalyticsO4AttrO8CURRENCYSSvpZ":{"name":"CURRENCY","abstract":"
Preset attribute event currency
","parent_name":"Attr"},"Enums/ClickstreamAnalytics/EventName.html#/s:11Clickstream0A9AnalyticsO9EventNameO11SCREEN_VIEWSSvpZ":{"name":"SCREEN_VIEW","parent_name":"EventName"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO7initSDKyyAA0A13ConfigurationCSgKFZ":{"name":"initSDK(_:)","abstract":"
Init ClickstreamAnalytics
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11recordEventyySSFZ":{"name":"recordEvent(_:)","abstract":"
Use this method to record event
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11recordEventyySS_SDySS7Amplify0B13PropertyValue_pGSayAGGtFZ":{"name":"recordEvent(_:_:_:)","abstract":"
The method to record event with ClickstreamAttribute
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO11flushEventsyyFZ":{"name":"flushEvents()","abstract":"
Use this method to send events immediately
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO19addGlobalAttributesyySDySS7Amplify0B13PropertyValue_pGFZ":{"name":"addGlobalAttributes(_:)","abstract":"
Add global attributes
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO22deleteGlobalAttributesyySSd_tFZ":{"name":"deleteGlobalAttributes(_:)","abstract":"
Delete global attributes
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO17addUserAttributesyySDySS7Amplify0B13PropertyValue_pGFZ":{"name":"addUserAttributes(_:)","abstract":"
Add user attributes
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO9setUserIdyySSSgFZ":{"name":"setUserId(_:)","abstract":"
Set user id for login and logout
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO03getA13ConfigurationAA0aD0CyKFZ":{"name":"getClickstreamConfiguration()","abstract":"
Get Clickstream configuration, please config it after initialize sdk
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO7disableyyFZ":{"name":"disable()","abstract":"
Disable the SDK
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html#/s:11Clickstream0A9AnalyticsO6enableyyFZ":{"name":"enable()","abstract":"
Enable the SDK
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics/EventName.html":{"name":"EventName","abstract":"
ClickstreamAnalytics preset events
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics/Attr.html":{"name":"Attr","abstract":"
ClickstreamANalytics preset attributes
","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics/Item.html":{"name":"Item","abstract":"
ClickstreamAnalytics preset item attributes","parent_name":"ClickstreamAnalytics"},"Enums/ClickstreamAnalytics.html":{"name":"ClickstreamAnalytics","abstract":"
ClickstreamAnalytics api for swift
"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withAppId:":{"name":"withAppId(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withEndpoint:":{"name":"withEndpoint(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withSendEventInterval:":{"name":"withSendEventInterval(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackAppExceptionEvents:":{"name":"withTrackAppExceptionEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackScreenViewEvents:":{"name":"withTrackScreenViewEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withTrackUserEngagementEvents:":{"name":"withTrackUserEngagementEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withCompressEvents:":{"name":"withCompressEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withLogEvents:":{"name":"withLogEvents(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withAuthCookie:":{"name":"withAuthCookie(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withSessionTimeoutDuration:":{"name":"withSessionTimeoutDuration(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/s:11Clickstream0A13ConfigurationC27withInitialGlobalAttributesyACSDySS7Amplify22AnalyticsPropertyValue_pGF":{"name":"withInitialGlobalAttributes(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamConfiguration.html#/c:@M@Clickstream@objc(cs)ClickstreamConfiguration(im)withInitialGlobalAttributesObjc:":{"name":"withInitialGlobalAttributesObjc(_:)","parent_name":"ClickstreamConfiguration"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_ID":{"name":"ITEM_ID","abstract":"
The id of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_NAME":{"name":"ITEM_NAME","abstract":"
The name of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)LOCATION_ID":{"name":"LOCATION_ID","abstract":"
The location id of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_BRAND":{"name":"ITEM_BRAND","abstract":"
The brand of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)CURRENCY":{"name":"CURRENCY","abstract":"
The currency of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)PRICE":{"name":"PRICE","abstract":"
The price of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)QUANTITY":{"name":"QUANTITY","abstract":"
The quantity of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)CREATIVE_NAME":{"name":"CREATIVE_NAME","abstract":"
The creative name of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)CREATIVE_SLOT":{"name":"CREATIVE_SLOT","abstract":"
The creative slot of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY":{"name":"ITEM_CATEGORY","abstract":"
The category of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY2":{"name":"ITEM_CATEGORY2","abstract":"
The category2 of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY3":{"name":"ITEM_CATEGORY3","abstract":"
The category3 of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY4":{"name":"ITEM_CATEGORY4","abstract":"
The category4 of the item
","parent_name":"ClickstreamItemKey"},"Classes/ClickstreamItemKey.html#/c:@M@Clickstream@objc(cs)ClickstreamItemKey(cpy)ITEM_CATEGORY5":{"name":"ITEM_CATEGORY5","abstract":"
The category5 of the item
","parent_name":"ClickstreamItemKey"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)SCREEN_NAME":{"name":"SCREEN_NAME","abstract":"
Preset attribute screen name
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)SCREEN_UNIQUE_ID":{"name":"SCREEN_UNIQUE_ID","abstract":"
Preset attribute screen unique id
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_SOURCE":{"name":"TRAFFIC_SOURCE_SOURCE","abstract":"
Preset attribute traffic source source
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_MEDIUM":{"name":"TRAFFIC_SOURCE_MEDIUM","abstract":"
Preset attribute traffic source medium
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CAMPAIGN":{"name":"TRAFFIC_SOURCE_CAMPAIGN","abstract":"
Preset attribute traffic source campaign
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CAMPAIGN_ID":{"name":"TRAFFIC_SOURCE_CAMPAIGN_ID","abstract":"
Preset attribute traffic source campaign id
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_TERM":{"name":"TRAFFIC_SOURCE_TERM","abstract":"
Preset attribute traffic source term
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CONTENT":{"name":"TRAFFIC_SOURCE_CONTENT","abstract":"
Preset attribute traffic source content
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CLID":{"name":"TRAFFIC_SOURCE_CLID","abstract":"
Preset attribute traffic source clid
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)TRAFFIC_SOURCE_CLID_PLATFORM":{"name":"TRAFFIC_SOURCE_CLID_PLATFORM","abstract":"
Preset attribute traffic source clid platform
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)APP_INSTALL_CHANNEL":{"name":"APP_INSTALL_CHANNEL","abstract":"
Preset attribute app install channel
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)VALUE":{"name":"VALUE","abstract":"
Preset attribute event value
","parent_name":"Attr"},"Classes/Attr.html#/c:@M@Clickstream@objc(cs)Attr(cpy)CURRENCY":{"name":"CURRENCY","abstract":"
Preset attribute event currency
","parent_name":"Attr"},"Classes/EventName.html#/c:@M@Clickstream@objc(cs)EventName(cpy)SCREEN_VIEW":{"name":"SCREEN_VIEW","abstract":"
Preset event screen view
","parent_name":"EventName"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)initSDKAndReturnError:":{"name":"initSDK()","abstract":"
Init the Clickstream sdk
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)initSDK:error:":{"name":"initSDK(_:)","abstract":"
Init the Clickstream sdk
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)recordEvent:":{"name":"recordEvent(_:)","abstract":"
Use this method to record event
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)recordEvent::":{"name":"recordEvent(_:_:)","abstract":"
The method to record event with attributes
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)recordEvent:::":{"name":"recordEvent(_:_:_:)","abstract":"
The method to record event with attributes and items
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)flushEvents":{"name":"flushEvents()","abstract":"
Use this method to send events immediately
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)addGlobalAttributes:":{"name":"addGlobalAttributes(_:)","abstract":"
Add global attributes
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)deleteGlobalAttributes:":{"name":"deleteGlobalAttributes(_:)","abstract":"
Delete global attributes
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)addUserAttributes:":{"name":"addUserAttributes(_:)","abstract":"
Add user attributes
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)setUserId:":{"name":"setUserId(_:)","abstract":"
Set user id for login and logout
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)getClickstreamConfigurationAndReturnError:":{"name":"getClickstreamConfiguration()","abstract":"
Get Clickstream configuration, please config it after initialize sdk
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)disable":{"name":"disable()","abstract":"
Disable the SDK
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html#/c:@M@Clickstream@objc(cs)ClickstreamObjc(cm)enable":{"name":"enable()","abstract":"
Enable the SDK
","parent_name":"ClickstreamObjc"},"Classes/ClickstreamObjc.html":{"name":"ClickstreamObjc","abstract":"
ClickstreamAnalytics api for objective-c
"},"Classes/EventName.html":{"name":"EventName","abstract":"
ClickstreamAnalytics preset events
"},"Classes/Attr.html":{"name":"Attr","abstract":"
ClickstreamANalytics preset attributes
"},"Classes/ClickstreamItemKey.html":{"name":"ClickstreamItemKey","abstract":"
ClickstreamAnalytics preset item keys for objective-c"},"Classes/ClickstreamConfiguration.html":{"name":"ClickstreamConfiguration","abstract":"
The configuration object for clickstream, modify the params after sdk initialize
"},"Classes.html":{"name":"Classes","abstract":"
The following classes are available globally.
"},"Enums.html":{"name":"Enumerations","abstract":"
The following enumerations are available globally.
"},"Extensions.html":{"name":"Extensions","abstract":"
The following extensions are available globally.
"},"Typealiases.html":{"name":"Type Aliases","abstract":"
The following type aliases are available globally.
"}}
\ No newline at end of file
diff --git a/docs/undocumented.json b/docs/undocumented.json
new file mode 100644
index 0000000..f5325ca
--- /dev/null
+++ b/docs/undocumented.json
@@ -0,0 +1,96 @@
+{
+ "warnings": [
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/ClickstreamAnalytics.swift",
+ "line": 111,
+ "symbol": "ClickstreamAnalytics.EventName.SCREEN_VIEW",
+ "symbol_kind": "source.lang.swift.decl.var.static",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 73,
+ "symbol": "ClickstreamConfiguration.withAppId(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 78,
+ "symbol": "ClickstreamConfiguration.withEndpoint(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 83,
+ "symbol": "ClickstreamConfiguration.withSendEventInterval(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 88,
+ "symbol": "ClickstreamConfiguration.withTrackAppExceptionEvents(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 93,
+ "symbol": "ClickstreamConfiguration.withTrackScreenViewEvents(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 98,
+ "symbol": "ClickstreamConfiguration.withTrackUserEngagementEvents(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 103,
+ "symbol": "ClickstreamConfiguration.withCompressEvents(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 108,
+ "symbol": "ClickstreamConfiguration.withLogEvents(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 113,
+ "symbol": "ClickstreamConfiguration.withAuthCookie(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 118,
+ "symbol": "ClickstreamConfiguration.withSessionTimeoutDuration(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 123,
+ "symbol": "ClickstreamConfiguration.withInitialGlobalAttributes(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ },
+ {
+ "file": "/Users/runner/work/clickstream-swift/clickstream-swift/Sources/Clickstream/Dependency/Clickstream/ClickstreamContext.swift",
+ "line": 128,
+ "symbol": "ClickstreamConfiguration.withInitialGlobalAttributesObjc(_:)",
+ "symbol_kind": "source.lang.swift.decl.function.method.instance",
+ "warning": "undocumented"
+ }
+ ],
+ "source_directory": "/Users/runner/work/clickstream-swift/clickstream-swift"
+}
\ No newline at end of file