PageSourceSearch

https://satruck.org/scripts/devnext.satruck.pickupitems.js?t=134347155855029904

js satruck.org collected 2026-09-24 09:26:52 UTC 29,917 bytes, 836 lines download raw bytes

1
2(function ($) 
3{
4	ItemChooser = function (selector, options) 
5	{
6		var self = this;
7		this.items = [];
8		//this.mobileitems = [];
9		this.settings = $.extend({}, $.fn.itemChooser.defaults, options);
10		this.context = $(selector);
11		this.id = $(selector).attr('id');
12
13		this.selectors =
14		{
15			container: '#' + this.id,
16			commonItemsList: "#" + this.id + " .other-item-block #item-select-common",
17			itemsJSONField: "input[name*='donatedItemsJSONString']",
18			itemsStringField: "input[name*='donatedItemsString']",
19			pickupSizeField: "input[name*='donatedItemsSize']",
20			maxItemSizeField: "input[name*='maxItemSize']",
21			sizeExactField: "input[name*='donatedItemsSizeExact']",
22			customItemToggle: "#" + this.id + " #custom-item-toggle",
23			customItemContainer: "#" + this.id + " #custom-item-controls",
24			newItemField: "",
25			newItemDescField: "#custom-item-controls #custom-item-name",
26			commonCategoryList: "#custom-item-controls #category-select",
27			addItemRow: "#" + this.id + " .add-item-row",
28			selectedItemsContainer: "#" + this.id + " #item-selected-rows",
29			hasCustomItemField: "input[name*='hasCustomItem']",
30			hasAddOnItemMatchField: "input[name*='hasAddOnItemMatch']"
31		};
32	}
33
34	ItemChooser.prototype.init = function() 
35	{
36		var self = this;
37
38		$('#item-select-common').change(function() 
39		{
40			self.addOtherItem();	
41		});
42
43		$("#custom-item-add").on("click", function (e) 
44		{
45			e.preventDefault();
46			//1. validate
47			var qty = $("#custom-item-qty-list").val();
48			self.addDescItem(qty); 
49			var valid = ($("input[name*='donatedItemsSize']").val() > 0 && $.trim($("input[name*='donatedItemsString']").val()) != "");
50			if(valid)
51			{
52				$('.pickup-next').addClass('opaque');
53			}
54		});
55
56		if (typeof editingExisting == 'undefined') {
57			editingExisting = false;
58		}
59	}
60
61	ItemChooser.prototype.setAllItems = function(commonItemsArray, badItems, topItems) 
62	{
63		var self = this;
64		if (commonItemsArray) 
65		{
66			self.settings.commonItems = commonItemsArray;
67
68			var options = '<option value="" selected="selected">Select an Item</option>';
69			$.each(self.settings.commonItems, function(index, ci)
70			{
71				if (!ci.IsTopItem)
72				{
73					options = options + '<option value="' + ci.Name + '">' + ci.Name + '</option>';
74				}
75			});
76
77			$("#mobile-item-chooser #item-select-common").each(function(i)
78			{
79				$(this).empty().append(options);
80			});
81		}
82		if (topItems)
83		{
84			self.settings.topItems = topItems;
85			self.settings.matchId = -1;
86
87			if (topItems.length)
88			{
89				$.each(topItems, function(idx, ti)
90				{
91					var topitemindex = ti.TopItemIndex;
92					var id = ti.Id;
93
94					switch(topitemindex) 
95					{
96						case 0:
97							$("#item-qty-clothes").data("id", id);
98							self.settings.matchId = id;
99							break;
100						case 1:
101							$("#item-qty-books").data("id", id);
102							break;
103						case 2:
104							$("#item-qty-misc").data("id", id);
105							break;
106						case 3:
107							$("#item-qty-household").data("id", id);
108							break;
109						case 4:
110							$("#item-qty-chair").data("id", id);
111							break;
112						case 5:
113							$("#item-qty-couch").data("id", id);
114							break;
115						default:
116							break;
117					}
118				});
119			}
120		}
121		if (badItems) 
122		{
123			self.settings.badItems = badItems;
124		}
125		var badItemsHtml = '<div class="bad-items-list">';
126		if (badItems && badItems.length > 0)
127		{
128			for (var i = 0; i < badItems.length; i++)
129			{
130				badItemsHtml += '<div class="bad-item">' + badItems[i] + '</div>';
131			}
132		}
133		else
134		{
135			badItemsHtml += '<div class="bad-item">None</div>';
136		}
137		badItemsHtml += '</div>';
138
139		$('#bad-items-container').html(badItemsHtml);
140
141	}
142
143	ItemChooser.prototype.setCategories = function(commonCategories) 
144	{
145		var self = this;
146		if (commonCategories) 
147		{
148			self.settings.commonCategories = commonCategories;
149			var options = '<option value="0" selected="selected">(Please select a category)</option>';
150			$.each(self.settings.commonCategories, function(index, cc)
151			{
152				options = options + '<option value="' + cc.Id + '">' + cc.Name + '</option>';
153			});
154			$(self.selectors.commonCategoryList).empty().append(options);
155		}
156	}
157
158	ItemChooser.prototype.setRouteDefaults = function(routeDefaults) 
159	{
160		var self = this;
161		if (routeDefaults) 
162		{
163			self.settings.routeDefaults = routeDefaults;
164			self.settings.defaultSize = routeDefaults.DefaultSize ? routeDefaults.DefaultSize : 0.2;
165		}
166	}
167
168	ItemChooser.prototype.renderItemRow = function(idx) 
169	{
170		var self = this;
171		var item = self.items[idx];
172
173		if (item.isCustom || item.isPossibleBadItem)
174		{
175			var rowMarkup = '<div class="row red-bg-shade-7 other-item-block rendered-other-item">'+
176					'<div class="col-xs-6 col-xs-offset-1 item-name top-space-sm">' +
177						'<span class="other-item-name">' + item.CustomItemDisplayName + '</span>' +
178					'</div>'+
179					'<div class="col-xs-5 item-qty">'+
180						'<span class="sa-icon minus" data-value="decrease" data-target="#item-qty-list' + idx + '" data-toggle="spinner"></span>' +
181						'<input class="mobile-pickup-item" id="item-qty-list' + idx + '" data-name="' + item.ItemName +'" data-size="5" data-avg="10" data-min="0" value="' + item.quantity + '" disabled="">' + 
182						'<span class="sa-icon plus" data-value="increase" data-target="#item-qty-list' + idx + '" data-toggle="spinner"></span>' +
183					'</div>'+
184				'</div>';
185			$(rowMarkup).insertBefore($("#other-item-picker"));
186		}
187		else
188		{
189			var rowMarkup = '<div class="row red-bg-shade-7 other-item-block rendered-other-item">'+
190					'<div class="col-xs-6 col-xs-offset-1 item-name top-space-sm">' +
191						'<span class="other-item-name">' + item.ItemName + '</span>' +
192					'</div>'+
193					'<div class="col-xs-5 item-qty">'+
194						'<span class="sa-icon minus" data-value="decrease" data-target="#item-qty-list' + idx + '" data-toggle="spinner"></span>' +
195						'<input class="mobile-pickup-item" id="item-qty-list' + idx + '" data-name="' + item.ItemName +'" data-size="5" data-avg="10" data-min="0" value="' + item.quantity + '" disabled="">' + 
196						'<span class="sa-icon plus" data-value="increase" data-target="#item-qty-list' + idx + '" data-toggle="spinner"></span>' +
197					'</div>'+
198				'</div>';
199			$(rowMarkup).insertBefore($("#other-item-picker"));
200		}
201
202	}
203
204	ItemChooser.prototype.indexOfItem = function(itemName, ismobile, mapid)
205	{
206		var self = this;
207		var _items = self.items;
208
209		//if (ismobile === true) { _items = self.mobileitems; }
210		if (_items.length > 0 && _items[0].ItemName !== null)
211		{
212			for (var i = 0; i < _items.length; i++)
213			{
214				if ((mapid && mapid == _items[i].Item_id) || _items[i].ItemName.toLowerCase() == itemName.toLowerCase()) return i;
215            }
216        }
217        return -1;
218    }
219    
220	ItemChooser.prototype.addItem = function(quantity, item, itemDisplayName, skipConfirm, size, isPossibleBadItem, isCustomItem, avg, catId, catName, catAvgValue, ismobile, ismapped, mapid) 
221	{
222        var self = this;
223
224        var silent = false;
225        if (skipConfirm) silent = skipConfirm;
226        var isCustom = false;
227		if (isCustomItem) isCustom = isCustomItem;
228		var isPBI = false;
229		if (isPossibleBadItem) isPBI = isPossibleBadItem;
230
231		var id = null;
232        var itemName;
233        var avgValue = avg ? avg : null;
234
235        var _items = self.items;
236        //if (ismobile === true) { _items = self.mobileitems; }
237
238        if (item) 
239		{
240            itemName = item;
241        } 
242		else 
243		{
244            itemName = $(self.selectors.commonItemsList + " :selected").val();
245            if (itemName == null) 
246			{
247				DN.Utils.ShowError("The item you entered is not in the list of common items we pickup. Please categorize this item so that we can best plan for the pickup.");
248                
249				if ($(self.selectors.customItemToggle).length == 1) { $(self.selectors.customItemToggle).click(); }
250
251                $(self.selectors.newItemDescField).val($(self.selectors.newItemField).val());
252                $(self.selectors.commonCategoryList).focus();
253                
254				return;
255            } 
256			else 
257			{
258                $(self.selectors.newItemField).val(itemName);
259            }
260        }
261        var itemSize = size ? size : self.settings.defaultSize;
262        var isFound = false;
263        var q = 1;
264
265        if (quantity && !isNaN(quantity)) q = Number(quantity);
266
267        itemName = itemName.replace(/^\s*|\s*$/g, "");
268        if (itemName.length == 0) {return;}
269
270        var idx = self.indexOfItem(itemName, ismobile);
271
272		var resetNewItemRow = true;
273        if (idx >= 0) 
274		{
275			resetNewItemRow = false;
276        	_items[idx].quantity += Number(q);
277
278			$("#item-qty-list"+idx).val(_items[idx].quantity);
279        }
280        else 
281		{
282			if (isCustomItem) resetNewItemRow = false;
283			//TODO need better way to check for item limit
284        	var existingitems = self.items;
285        	//if (ismobile === true) { existingitems = self.items.concat(self.mobileitems); }
286            if (!silent && (existingitems.length + itemName.length + 4) > 512) 
287			{
288                DN.Utils.ShowError("The pickup item number limit has been reached.  Unable to add item.");
289                return;
290            }
291
292			if ((ismobile && !ismapped) || isCustom || isPBI)
293			{
294				_items.push({ Item_id: id, ItemName: itemName, size: itemSize, quantity: Number(q), avgValue: avgValue, isCustom: isCustom, isPossibleBadItem: isPBI, Category_id: catId, Category: catName, CategoryAvgValue: catAvgValue, CustomItemDisplayName: itemDisplayName, isMobileItem: ismobile });
295				idx = _items.length - 1;
296			}
297			else if (self.settings.commonItems && self.settings.commonItems.length > 0) 
298			{
299                for (var i = 0; i < self.settings.commonItems.length; i++) 
300				{
301					//If the name matches -or- it's a mapped item and the Ids match
302                    if (self.settings.commonItems[i].Name.toLowerCase() == itemName.toLowerCase() ||
303						(ismapped && self.settings.commonItems[i].Id == mapid))
304                    {
305                        id = self.settings.commonItems[i].Id;
306                        itemSize = self.settings.commonItems[i].PickupSize;
307                        itemName = self.settings.commonItems[i].Name;
308                        avgValue = self.settings.commonItems[i].AvgValue;
309                        catId = self.settings.commonItems[i].CategoryId;
310                        catName = self.settings.commonItems[i].CategoryName;
311                        catAvgValue = self.settings.commonItems[i].CategoryAvgValue;
312
313                        if (!silent && self.settings.commonItems[i].MessagePrompt != null && self.settings.commonItems[i].MessagePrompt.length > 0 && editingExisting == false && $('.ui-dialog.ui-resizable:visible').find('.ui-dialog-title').text('Confirm').length <= 1)
314						{
315							var prompt = self.settings.commonItems[i].MessagePrompt + "\r\n\r\nClick OK to add this item, or CANCEL to 
315not add at this time.";
316							DN.Utils.ShowCustomConfirm
317							(
318								prompt, "Confirm",
319								[{
320									text: "OK",
321									click: function()
322									{
323										_items.push({ Item_id: id, ItemName: itemName, size: itemSize, quantity: Number(q), avgValue: avgValue, isCustom: isCustom, isPossibleBadItem: isPBI, Category_id: catId, Category: catName, CategoryAvgValue: catAvgValue, CustomItemDisplayName: itemDisplayName, isMobileItem: ismobile });
324										idx = _items.length - 1;
325										$(this).dialog("destroy");
326
327										self.updateItems(itemName);
328									},
329									'class' : 'btn btn-default dialog-confirm'
330								},
331								{
332									text: "CANCEL",
333									click: function()
334									{
335										$('input.mobile-pickup-item[data-name="'+ itemName +'"]').prev().trigger('click');
336										$(this).dialog("destroy");
337										self.updateItems(itemName);
338									},
339									'class' : 'btn btn-default dialog-cancel'
340								}]
341							);
342                        }
343						else
344						{
345							_items.push({ Item_id: id, ItemName: itemName, size: itemSize, quantity: Number(q), avgValue: avgValue, isCustom: isCustom, isPossibleBadItem: isPBI, Category_id: catId, Category: catName, CategoryAvgValue: catAvgValue, CustomItemDisplayName: itemDisplayName, isMobileItem: ismobile });
346							idx = _items.length - 1;
347						}
348                        break;
349                    }
350                }
351            }
352        }
353
354        if (!ismobile && resetNewItemRow)
355        {
356			$("#item-select-common").val("");
357        	$("#item-qty-other").val("0");
358        }
359        self.updateItems(itemName);
360    }
361
362	ItemChooser.prototype.changeQuantity = function(newQuantity, idx, ismobile, replaceQTY) 
363	{
364		var self = this;
365		var _items = self.items;
366
367		//if (ismobile === true) { _items = self.mobileitems; }
368		if (idx >= 0)
369		{
370			var _item = _items[idx];
371			var _itemName = _item.ItemName;
372			var _oldQty = _item.quantity;
373			var _updateQTY = Number(newQuantity);
374			if (!replaceQTY)
375			{
376				_updateQTY = _oldQty + Number(newQuantity);
377			}
378        
379			_item.quantity = Number(_updateQTY);
380			if (_item.quantity < 0) _item.quantity = 0;
381			_items[idx] = _item;
382
383			var _newitems = [];
384			$.each(_items, function(i, t)
385			{
386				if (t.quantity > 0) _newitems.push(t);
387			});
388			self.items = _newitems;
389			if (satruck.mydonations &&
390				satruck.mydonations !== null &&
391				satruck.mydonations.config.donationsList &&
392				satruck.mydonations.config.donationsList !== null &&
393				satruck.mydonations.config.donationsList !== undefined) {
394				var existingDonation = _.find(satruck.mydonations.config.donationsList, function (donation) {
395					return donation.DonationTypeSummary.Pickup_id == satruck.mydonations.wipId;
396				});
397				existingDonation.DonationDetails.DonationTypeDetail.PickupOrderItems = _newitems;
398			}
399		}
400
401        self.updateItems(_itemName);
402	}
403
404	ItemChooser.prototype.updateItems = function(saveItemIdxName) 
405	{
406		var self = this;
407        var options = '';
408        var isSelected = false;
409        var totalSize = 0; 
410		var maxItemSize = 0;
411		var itemsStr = '';
412		var itemsJSON = [];
413        var badItemsList = '';
414        //var isPossibleBadItem = false;
415        var matchingBadItems = [];
416        var allBadItems = [];
417        var searchStr;
418        var saveIdx = 0;
419        var ct = 0;
420		var hasCustomItem = false;
421		var tealium_name_string = "";
422		var tealium_qty_string = "";
423		var tealium_value_string = "";
424		var add_on_match_id = self.settings.matchId;
425		var has_add_on_match_id = false;
426
427		//combine items for wip
428        var _items = self.items;
429		//if (satruck.config.ismobile == true) { _items = self.items.concat(self.mobileitems); }
430
431		//clear markup to re-render
432		$($('.rendered-other-item')).remove();
433        for (var i = 0; i < _items.length; i++) 
434		{
435            if (_items[i].quantity >= 1) 
436			{
437                if (self.settings.badItems && self.settings.badItems.length > 0) 
438				{
439                    // isPossibleBadItem = false;
440                    searchStr = _items[i].ItemName.toLowerCase();
441                    if (searchStr.length > 5) 
442					{
443						searchStr = searchStr.substring(0, 5);
444					}
445                    matchingBadItems = $.grep(self.settings.badItems, function (val) 
446					{
447                        if (val.toLowerCase().indexOf(searchStr) >= 0)
448                            return true;
449                        else
450                            return false;
451                    });
452                    if (matchingBadItems.length > 0) 
453					{
454                        $.merge(allBadItems, matchingBadItems);
455                    }
456                }
457
458				//Markup added
459				if (!_items[i].isMobileItem) self.renderItemRow(i);
460
461                itemsJSON.push(_items[i]);
462                itemsStr += (i > 0 ? ',' : '') + _items[i].ItemName + '-' + _items[i].quantity + (_items[i].isPossibleBadItem ? '*' : '');
463                totalSize += (_items[i].quantity * _items[i].size);
464				tealium_name_string += (i > 0 ? ',' : '') + _items[i].ItemName;
465				tealium_qty_string += (i > 0 ? ',' : '') + _items[i].quantity;
466				tealium_value_string += (i > 0 ? ',' : '') + (_items[i].avgValue ? _items[i].avgValue : "0.00");
467                
468				if (_items[i].size > maxItemSize) 
469				{ 
470					maxItemSize = _items[i].size; 
471				}
472
473				if (_items[i].Item_id == add_on_match_id)
474				{
475					has_add_on_match_id = true;
476				}
477                ct++;
478            } 
479            else if (saveItemIdxName == _items[i].ItemName)
480			{
481                saveIdx = ct;
482            }
483
484			if (_items[i].isCustom == true)
485			{
486				hasCustomItem = true;
487			}
488        }
489
490        if (allBadItems.length > 0)
491        {
492            for (var i = 0; i < allBadItems.length; i++) 
493			{
494            	badItemsList += '<option>' + allBadItems[i] + '</option>';
495            }
496        }
497
498        // round when saving
499        var intSize = 0;
500        if (totalSize <= 0.5)
501            intSize = 1;
502        else
503            intSize = Math.round(totalSize);
504
505        $(self.selectors.itemsJSONField).val(JSON.stringify(itemsJSON));
506        $(self.selectors.itemsStringField).val(itemsStr);
507        $(self.selectors.pickupSizeField).val(intSize);
508		$(self.selectors.hasAddOnItemMatchField).val(has_add_on_match_id);
509
510		$(self.selectors.hasCustomItemField).val(hasCustomItem);
511
512		//Tealium
513		utag_data.donate_DonatedItems = itemsStr;
514		utag_data.donate_PickupSize = intSize;
515		utag_data.product_id = itemsStr;
516		utag_data.product_name = tealium_name_string;
517		utag_data.unit_price = tealium_value_string;
518		utag_data.product_quantity = tealium_qty_string;
519		utag_data.donate_HasCustomItem = hasCustomItem;
520		utag_data.donate_ItemArray = _items;
521		utag_data.donate_ItemQty = tealium_qty_string;
522	    //New Tealium Tags
523		utag_view = utag_data;
524		utag_view.login_status = satruck.account.is_logged_in() ? "Logged In" : "Not Logged In";
525		utag_view.page_name = "ARC |  schedule pickup:select items"
526		utag_view.site_section = "Schedule Pickup";
527		utag_view.site_type = "ARC";
528		if (typeof utag != 'undefined' && utag != null) {
529		    utag.view(utag_view);
530		}
531
532		//utag_data.site_section = "Schedule Pickup";
533		//utag_data.site_type = "ARC";
534	    //utag_data.login_status = satruck.account.is_logged_in() ? "Logged In" : "Not Logged In";
535
536		//Added to handle updating items when there is an add-on during confirmation
537		var today = new Date();
538		var UTC_TIMESTAMP = today.toUTCString();
539		var wip = satruck.config._loadWorkflowData();
540
541		if (wip.id && wip.id !== undefined && !satruck.mydonations) {
542			wip.donation.items = $.parseJSON($("input[name*='donatedItemsJSONString']").val());
543			wip.donation.itemsString = $("input[name*='donatedItemsString']").val();
544			wip.donation.pickupSize = $("input[name*='donatedItemsSize']").val();
545			wip.donation.hasCustomItem = $("input[name*='hasCustomItem']").val();
546			wip.donation.sizeExact = $("input[name*='donatedItemsSizeExact']").val();
547			wip.donation.maxSize = $("input[name*='maxItemSize']").val();
548			wip.donation.hasMatchId = $("input[name*='hasAddOnItem']").val();
549			wip.donation.matchId = add_on_match_id;
550			satruck.config._persistWorkflowData(wip);
551			$("#confirm-items").text(wip.donation.itemsString);
552		} else if (window._ && window._ !== null && satruck.mydonations.config.donationsList && satruck.mydonations.config.donationsList !== null) {
553
554		// The following applies to editing an existing donation in the MyDonations workflow
555
556			// Identify the existing donation being edited from the global donations array
557			var existingDonation = _.find(satruck.mydonations.config.donationsList, function (donation) {
558				return donation.DonationTypeSummary.Pickup_id == satruck.mydonations.wipId;
559			});
560
561			var tempString = '';
562
563			// This method cleans up the PickupOrderItems array of this existing donation
564			_.each(existingDonation.DonationDetails.DonationTypeDetail.PickupOrderItems, function (item) {
565				if (item.quantity && item.quantity !== undefined) {
566					item.Quantity = item.quantity;
567					item.AvgValue = item.avgValue;
568					item.IsCustom = item.isCustom || (item.IsCustom === true);
569					item.IsPossibleBadItem = item.isPossibleBadItem;
570					item.Size = item.size;
571					item.Category_id = item.category_id || item.Category_id;
572					item.Category = item.category || item.Category;
573					item.CategoryAvgValue = item.categoryAvgValue || item.CategoryAvgValue;
574				}
575
576				if (item.IsCustom === true) {
577					existingDonation.DonationDetails.DonationTypeDetail.HasCustomItem = true;
578				}
579				tempString += ''+ item.ItemName + '-' + item.Quantity + ', ';
580
581			});
582
583			var updatedItemCount = _.sum(existingDonation.DonationDetails.DonationTypeDetail.PickupOrderItems, function (item) {
584				return item.Quantity;
585			});
586
587			existingDonation.DonationDetails.DonationTypeDetail.Items = tempString.slice(0, -2);
588			existingDonation.DonationDetails.DonationTypeDetail.ItemCount = updatedItemCount;
589			existingDonation.DonationTypeSummary.ItemCount = updatedItemCount;
590			existingDonation.DonationDetails.DonationTypeDetail.PickupSize = Number($("input[name*='donatedItemsSize']").val());
591		}		
592    }
593
594	ItemChooser.prototype.addOtherItem = function()
595	{
596		//var parentDiv = $ctl.parents().eq(2);
597		var item = $('#item-select-common').val();
598		var quantity = $("#item-qty-other").val();
599		var itemindex = $("#mobile-item-chooser").itemChooser("indexOfItem", item, true);
600		if (quantity == 0) quantity = 1;
601		if (itemindex < 0)
602		{
603		    $("#mobile-item-chooser").itemChooser("addItem", quantity, item, item, false, null, null, null, null, null, null, null, null, null, false);
604		}
605		else
606		{
607			$("#mobile-item-chooser").itemChooser("changeQuantity", quantity, itemindex, false);
608		}
609	}
610
611	ItemChooser.prototype.addDescItem = function(quantity) 
612	{
613		var self = this;
614        /// <summary>Add a user described item and verify that it doesn't match against the bad items list</summary>
615        var itemName = $(self.selectors.newItemDescField).val().replace(/-/g, " ");
616        //var id = $(self.selectors.commonCategoryList).val();
617		var avgValue;
618		var size = "0";
619		var catId = Number($(self.selectors.commonCategoryList).val());
620		var catName;
621		var catAvgValue;
622        var isPossibleBadItem = false;
623		var isCustom = true;
624
625		if (self.settings.commonCategories && self.settings.commonCategories.length)
626		{
627			var cc = self.settings.commonCategories.findObject("Name", $(self.selectors.commonCategoryList + " :selected").text());
628			if (cc)
629			{
630				//This may still be null, but using it if it exists
631				//avgValue = cc.AvgValue ? cc.AvgValue : 0.00;
632				size = cc.PickupSize;
633				catName = cc.Name;
634				catAvgValue = cc.AvgValue ? cc.AvgValue : 0.00;
635			}
636		}
637		
638		if (catId == "0") 
639		{
640            DN.Utils.ShowError("Please select a category for this item.");
641            $(self.selectors.commonCategoryList).focus();
642            return false;
643        } 
644		else if (!itemName) 
645		{
646            DN.Utils.ShowError("Please enter a description for this item.");
647            $(self.selectors.newItemDescField).focus();
648            return false;
649		}
650
651		if (self.settings.badItems && self.settings.badItems.length > 0) 
652		{
653            var matchingBadItems = [];
654            matchingBadItems = $.grep(self.settings.badItems, function (val) 
655			{
656                var words = itemName.split(" ");
657                var lval = val.toLowerCase();
658                for (var j = 0; j < words.length; j++)
659                    if (lval.indexOf(words[j].toLowerCase()) >= 0) return true;
660                return false;
661            });
662
663            if (matchingBadItems.length > 0 && editingExisting == false)
664			{
665                var prompt = itemName + " may be on the Items We Can't Use list.  Would you still like to schedule it?\r";
666                DN.Utils.ShowConfirm
667				(
668					prompt, "Confirm",
669					function()
670					{
671						isPossibleBadItem = true;
672						//isCustom = false;
673						avgValue = null;
674						catAvgValue = null;
675
676						var itemDisplayName = itemName;
677						itemName = itemName + "[" + size + "X]";
678						self.addItem(quantity, itemName, itemDisplayName, false, size, isPossibleBadItem, isCustom, avgValue, catId, catName, catAvgValue);
679						$(self.selectors.hasCustomItemField).val("true");
680						//Clear custom item select
681						$(self.selectors.newItemDescField).val("");
682						$(self.selectors.commonCategoryList).val("0");
683						$("#custom-item-qty-list").val("1");
684					},
685					function(){}
686				);
687            }
688            else if (matchingBadItems.length > 0 && editingExisting == true) {
689            	isPossibleBadItem = true;
690            	avgValue = null;
691            	catAvgValue = null;
692
693            	var itemDisplayName = itemName;
694            	itemName = itemName + "[" + size + "X]";
695            	avgValue = catAvgValue;
696            	self.addItem(quantity, itemName, itemDisplayName, false, size, isPossibleBadItem, isCustom, avgValue, catId, catName, catAvgValue, false);
697            	$(self.selectors.hasCustomItemField).val("true");
698            	//Clear custom item select
699            	$(self.selectors.newItemDescField).val("");
700            	$(self.selectors.commonCategoryList).val("0");
701            	$("#custom-item-qty-list").val("1");
702            }
703			else
704			{
705                var itemDisplayName = itemName;
706                itemName = itemName + "[" + size + "X]";
707                avgValue = catAvgValue;
708                self.addItem(quantity, itemName, itemDisplayName, false, size, isPossibleBadItem, isCustom, avgValue,  catId, catName, catAvgValue, false);
709				$(self.selectors.hasCustomItemField).val("true");
710				//Clear custom item select
711				$(self.selectors.newItemDescField).val("");
712				$(self.selectors.commonCategoryList).val("0");
713				$("#custom-item-qty-list").val("1");
714			}
715        }
716		else
717		{
718			var itemDisplayName = itemName;
719		    itemName = itemName + "[" + size + "X]";
720			self.addItem(quantity, itemName, itemDisplayName, false, size, isPossibleBadItem, isCustom, avgValue, catId, catName, catAvgValue, false);
721			$(self.selectors.hasCustomItemField).val("true");
722			//Clear custom item select
723			$(self.selectors.newItemDescField).val("");
724			$(self.selectors.commonCategoryList).val("0");
725			$("#custom-item-qty-list").val("1");
726		}
727	}
728
729	ItemChooser.prototype.setInitialItems = function (initialItems, callback) {
730
731		var self = this;
732		this.items = [];
733
734		var existingDonation = _.find(satruck.mydonations.config.donationsList, function (donation) {
735			return donation.DonationTypeSummary.Pickup_id == satruck.mydonations.wipId;
736		});
737
738		// Rest value on each load
739		$('.mobile-pickup-item').each(function (i, v) {
740			$(this).val(0);
741		});
742
743		$('.other-item-block.rendered-other-item').each(function () {
744			$(this).remove();
745		});
746
747		$.each(initialItems, function (i, n) {
748
749			$('.mobile-pickup-item:not(.common):not([data-name="Other"])').each(function (i, v) {
750
751				if (n.Item_id !== null) {
752					if (Number($(this).data("id")) === n.Item_id) {
753						var qty = n.Quantity;
754						for (var i = 1; i <= qty; i++) {
755							$(this).next().trigger('click');
756						}
757					}
758				} else {
759					if (Number($(this).data("name")) == n.ItemName) {
760						var qty = n.Quantity;
761						for (var i = 1; i <= qty; i++) {
762							$(this).next().trigger('click');
763						}
764					}
765				}
766				
767			});
768
769			if (n.IsCustom === false) {
770
771				$('#item-select-common option').each(function () {
772					if (this.value == n.ItemName) {
773						$('#item-select-common').val(n.ItemName).trigger('change');
774						var qty = n.Quantity;
775						for (var i = 1; i < qty; i++) {
776							$('.mobile-pickup-item[data-name="' + n.ItemName + '"]').next().trigger('click');
777						}
778					}
779				});
780			} else {
781				var cleanName = n.ItemName.replace(/\[.*?\]/gmi, '');
782				$('#custom-item-name').val(cleanName);
783				if (n.Category_id == null || n.Category_id == undefined) {
784					$('#category-select option:last').prop('selected', true);
785				} else {
786					$('#category-select option[value=' + n.Category_id + ']').prop('selected', true);
787				}
788				
789				$('#custom-item-add').trigger('click');
790				var qty = n.Quantity;
791				for (var i = 1; i < qty; i++) {category-select
792					$('.mobile-pickup-item[data-name^="' + cleanName + '"]').next().trigger('click');
793				}
794			}
795
796		});
797
798		callback();
799	}
800	
801	$.fn.itemChooser = function (param) 
802	{
803		// Determine if this element had been initialized (searchPanel object stored in elements data store) 
804		if (typeof this.data("itemchooser_obj") == "undefined") 
805		{
806			// Create a new plugin object and store a reference in this elements data store
807			var _ic = new ItemChooser(this, param);
808			_ic.init();
809
810			this.data("itemchooser_obj", _ic);
811		}
812		else 
813		{
814			// Get this elements SearchPanel reference 
815			var _ic = this.data("itemchooser_obj");
816
817			// Determine if the first passed parameter is a plugin method
818			if (_ic[param]) 
819			{
820				// Call the method
821				return _ic[param].apply(_ic, Array.prototype.slice.call(arguments,1
821));
822			}
823			else
824				throw 'ITEMCHOOSER_METHOD_NOT_FOUND';
825		}
826	}
827	$.fn.itemChooser.defaults = 
828	{
829		badItems: [],
830        commonItems: [{Name:'2 Pcs Sectional Sofa'},{Name:'3 Pcs Sectional Sofa'},{Name:'4 Pcs or up Sectional Sofa'},{Name:'Air Conditioner'},{Name:'Chair'},{Name:'Crib'},{Name:'Daybed'},{Name:'Footboard'},{Name:'Guitar'}],
831		commonCategories: [],
832        defaultSize: 0.2,
833        afterUpdate: null
834	}
835
836})(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.