1/** 2 * DVHydrate Utility 3 * Shared hydration logic for vehicles and forms 4 */ 5var DVHydrate = { 6 /** 7 * Collect data from an object, its closest .listing, or #fixed-info-container (VDP) 8 * @param {jQuery|HTMLElement} obj 9 * @returns {Object} 10 */ 11 collectData: function (obj) { 12 var combinedData = {}; 13 var $el = jQuery(obj); 14 var $listing = $el.closest('.listing'); 15 var $vdpContainer = jQuery("#fixed-info-container"); 16 17 // 1. Data from VDP container or Listing card 18 var $source = $vdpContainer.length ? $vdpContainer : $listing; 19 if ($source.length) { 20 jQuery.each($source.data(), function (key, value) { 21 combinedData[key] = value; 22 // Normalize 'vehicleYear' -> 'year', etc. 23 if (key.indexOf('vehicle') === 0 && key.length > 7) { 24 var shortKey = key.substring(7); 25 shortKey = shortKey.charAt(0).toLowerCase() + shortKey.slice(1); 26 if (combinedData[shortKey] === undefined) { 27 combinedData[shortKey] = value; 28 } 29 } 30 }); 31 } 32 33 // 2. Data from the element itself (overrides listing/vdp) 34 if (obj) { 35 jQuery.extend(combinedData, $el.data()); 36 } 37 38 // 3. Normalized helpers 39 if (combinedData.vehicleMakeModel && !combinedData.make) { 40 var parts = combinedData.vehicleMakeModel.split(" "); 41 combinedData.make = parts[0]; 42 combinedData.model = parts.slice(1).join(" "); 43 } 44 45 // Ensure some common fields are present under standard names 46 if (combinedData.vehicleVin && !combinedData.vin) combinedData.vin = combinedData.vehicleVin; 47 if (combinedData.vehicleStockNumber && !combinedData.stockNumber) combinedData.stockNumber = combinedData.vehicleStockNumber; 48 if (combinedData.vehiclePrice && !combinedData.finalPrice) combinedData.finalPrice = combinedData.vehiclePrice; 49 50 return combinedData; 51 }, 52 53 /** 54 * Format a number as money 55 * @param {number|string} amount 56 * @returns {string} 57 */ 58 formatMoney: function (amount) { 59 if (amount === undefined || amount === null || amount === "") return ""; 60 var val = parseFloat(String(amount).replace(/[^\d.]/g, '')); 61 if (isNaN(val)) return amount; 62 return "$" + val.toLocaleString("en-US", { 63 minimumFractionDigits: 0, 64 maximumFractionDigits: 0 65 }); 66 }, 67 68 /** 69 * Populate form fields based on data attributes and common classes 70 * @param {jQuery|HTMLElement} form 71 * @param {Object} data 72 */ 73 populateFormFields: function (form, data) { 74 var $form = jQuery(form); 75 if (!data) data = this.collectData(form); 76 77 // Map data to specific classes used in the project 78 var mappings = { 79 '.vehicle-id-field': data.id || data.vehicleId, 80 '.vin-field': data.vin || data.vehicleVin, 81 '.stock-number-field': data.stockNumber || data.vehicleStockNumber, 82 '.year-field': data.year || data.vehicleYear, 83 '.make-field': data.make, 84 '.model-field': data.model, 85 '.trim-field': data.trim || data.vehicleTrim, 86 '.msrp-field': this.formatMoney(data.msrp || data.vehicleMsrp), 87 '.final-price-field': this.formatMoney(data.finalPrice || data.vehiclePrice || data.price), 88 '.dealer-name-field': data.dealerName, 89 '.discount-matrix-field': this.formatMoney(data.discountMatrix || data.vehicleDiscountMatrix), 90 '.discount-matrix-value-field': this.formatMoney(data.discountMatrixValue || data.discountmatrix_value), 91 '.internet-price-field': this.formatMoney(data.internetPrice || data.vehicleInternetPrice), 92 '.condition-field': data.condition, 93 '.vehicle-url-field': data.vehicleUrl || data.agVdpUrl || data.vdpUrl 94 }; 95 96 jQuery.each(mappings, function (selector, value) { 97 if (value !== undefined) { 98 $form.find(selector).val(value); 99 } 100 }); 101 } 102};
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.