PageSourceSearch

https://www.merrittpress.com/Scripts/checkout/address.js?v=2026.10.1.2

js merrittpress.com collected 2026-10-09 22:36:36 UTC 7,450 bytes, 213 lines download raw bytes

1(function (window, $) {
2    "use strict";
3
4    var virtualPageSize = 50;
5    var virtualItemHeight = 48;
6    var nonVirtualPageSizeBuffer = 20;
7
8    function getFilterValue(filter) {
9        if (!filter) {
10            return "";
11        }
12
13        if (filter.filters && filter.filters.length) {
14            return getFilterValue(filter.filters[0]);
15        }
16
17        return filter.value || "";
18    }
19
20    function valueMapper($input, options) {
21        var currentValue = $input.val();
22        var currentText = $input.attr("data-selected-text");
23        var values = $.isArray(options.value) ? options.value : [options.value];
24        var mappedItems = [];
25
26        if (currentValue && currentText) {
27            $.each(values, function (_, value) {
28                if (String(value).toLowerCase() === String(currentValue).toLowerCase()) {
29                    mappedItems.push({
30                        addressId: currentValue,
31                        displayText: currentText
32                    });
33                }
34            });
35        }
36
37        options.success(mappedItems);
38    }
39
40    function getAddressDisplayText(data) {
41        if (!data) {
42            return "";
43        }
44
45        return typeof data === "string" ? data : data.displayText || "";
46    }
47
48    function addressItemTemplate(data) {
49        var text = getAddressDisplayText(data);
50        var encoded = kendo.htmlEncode(text);
51
52        return '<span class="address-dropdown-item" title="' + encoded + '">' + encoded + '</span>';
53    }
54
55    function getAvailableAddressCount($input) {
56        var availableAddressCount = parseInt($input.attr("data-available-address-count"), 10);
57
58        return availableAddressCount > 0 ? availableAddressCount : 0;
59    }
60
61    function getDropDownPageSize($input, useVirtualScroll) {
62        if (useVirtualScroll) {
63            return virtualPageSize;
64        }
65
66        var availableAddressCount = getAvailableAddressCount($input);
67
68        return availableAddressCount > 0 ? availableAddressCount + nonVirtualPageSizeBuffer : virtualPageSize;
69    }
70
71    function createDataSource(dropDownPageSize) {
72        return new kendo.data.DataSource({
73            serverFiltering: true,
74            serverPaging: true,
75            pageSize: dropDownPageSize,
76            transport: {
77                read: {
78                    url: "/checkout/searchAddresses",
79                    type: "GET",
80                    dataType: "json"
81                },
82                parameterMap: function (data, type) {
83                    if (type !== "read") {
84                        return data;
85                    }
86
87                    return {
88                        search: getFilterValue(data.filter),
89                        page: Math.max((data.page || 1) - 1, 0),
90                        pageSize: data.pageSize || dropDownPageSize
91                    };
92                }
93            },
94            schema: {
95                data: "items",
96                total: "totalItems"
97            }
98        });
99    }
100
101
102    function initializeAddressDropDowns(container) {
103        var $container = container ? $(container) : $(document);
104
105        $container.find("input.js-address-dropdown").each(function () {
106            var $input = $(this);
107            if ($input.data("kendoDropDownList")) {
108                return;
109            }
110
111            var selectedValue = $input.val();
112            var selectedText = $input.attr("data-selected-text");
113            var useVirtualScroll = $input.attr("data-virtual-scroll") !== "false";
114            var dropDownPageSize = getDropDownPageSize($input, useVirtualScroll);
115            var options = {
116                autoBind: $input.attr("data-auto-bind") === "true",
117                dataTextField: "displayText",
118                dataValueField: "addressId",
119                filter: "contains",
120                height: 320,
121                dataSource: createDataSource(dropDownPageSize),
122                template: addressItemTemplate,
123                valueTemplate: addressItemTemplate,
124                select: function (e) {
125                    var selectedAddressId = e.dataItem && e.dataItem.addressId ? e.dataItem.addressId : "";
126                    $input.trigger("addressdropdownselecting", [this.value()]);
127                    $input.trigger("addressdropdownselected", [selectedAddressId]);
128                },
129                change: function () {
130                    $input.trigger("addressdropdownchange", [this.value()]);
131                },
132                open: function () {
133                    this.popup.element
134                        .toggleClass("address-dropdown-popup--virtual", useVirtualScroll)
135                        .toggleClass("address-dropdown-popup--wrap", !useVirtualScroll);
136                }
137            };
138
139            if (useVirtualScroll) {
140                options.virtual = {
141                    itemHeight: virtualItemHeight,
142                    mapValueTo: "dataItem",
143                    valueMapper: function (mapperOptions) {
144                        valueMapper($input, mapperOptions);
145                    }
146                };
147            }
148
149            var optionLabel = $input.attr("data-option-label");
150            if (optionLabel) {
151                var optionLabelValue = $input.attr("data-option-label-value");
152                options.optionLabel = optionLabelValue ? {
153                    displayText: optionLabel,
154                    addressId: optionLabelValue
155                } : optionLabel;
156            }
157
158            if (selectedValue && selectedText) {
159                options.value = selectedValue;
160                options.text = selectedText;
161            }
162
163            var addAddressText = $input.attr("data-add-address-text");
164            if (addAddressText) {
165                options.footerTemplate = '<div class="dropdown-footer"><a href="\\#" class="btn-add-ship-to">' +
166                    kendo.htmlEncode(addAddressText) + '</a></div>';
167            }
168
169            $input.kendoDropDownList(options);
170
171        });
172    }
173
174    function destroyAddressDropDowns(container) {
175        $(container).find("input.js-address-dropdown").each(function () {
176            var widget = $(this).data("kendoDropDownList");
177            if (widget) {
178                widget.destroy();
179            }
180        });
181    }
182
183    function setAddressDropDownValue(selector, addressId, displayText, triggerChange) {
184        var $input = $(selector);
185        var widget = $input.data("kendoDropDownList");
186        var item = {
187            addressId: addressId,
188            displayText: displayText || ""
189        };
190
191        $input.val(addressId);
192        if (displayText) {
193            $input.attr("data-selected-text", displayText);
194        }
195
196        if (widget && displayText) {
197            widget.dataSource.add(item);
198            widget.value(addressId);
199        }
200
201        if (triggerChange) {
202            $input.trigger("addressdropdownchange", [addressId]);
203        }
204    }
205
206    window.initializeAddressDropDowns = initializeAddressDropDowns;
207    window.destroyAddressDropDowns = destroyAddressDropDowns;
208    window.setAddressDropDownValue = setAddressDropDownValue;
209
210    $(function () {
211        initializeAddressDropDowns(document);
212    });
213}(window, jQuery));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.