PageSourceSearch

https://www.jungheinrich-shop.si/modules/quotes/views/js/showdetails.js

js jungheinrich-shop.si collected 2026-10-09 01:46:22 UTC 25,150 bytes, 543 lines download raw bytes

1/**
2 * 2007-2020 PrestaShop
3 *
4 * NOTICE OF LICENSE
5 *
6 * This source file is subject to the Academic Free License (AFL 3.0)
7 * that is bundled with this package in the file LICENSE.txt.
8 * It is also available through the world-wide-web at this URL:
9 * http://opensource.org/licenses/afl-3.0.php
10 * If you did not receive a copy of the license and are unable to
11 * obtain it through the world-wide-web, please send an email
12 * to [email protected] so we can send you a copy immediately.
13 *
14 * DISCLAIMER
15 *
16 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
17 * versions in the future. If you wish to customize PrestaShop for your
18 * needs please refer to http://www.prestashop.com for more information.
19 *
20 * @author    Buy-addons    <[email protected]>
21 * @copyright 2007-2020 Buy-addons
22 * @license   http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
23 *  International Registered Trademark & Property of PrestaShop SA
24 */
25var requestSent = false;
26
27function ask_quote_quick_view(ob) {
28    if (requestSent == true) {
29        return;
30    }
31    requestSent = true;
32
33    var id_product = jQuery(ob).attr("data-id-product");
34    var coverImageUrl = jQuery(ob).attr("data-image-url");
35    var infor_product = jQuery("#product-details").attr("data-product");
36
37    var session_id_doubleboo = ss_id;
38    var qty_pro_pre = jQuery('#quantity_wanted').val();
39
40    var id_condition = 0;
41    var combi_id = jQuery('#id_product_attribute').val();
42
43    if (combi_id == '' || combi_id === undefined) {
44        combi_id = 0;
45        if (infor_product == "" || infor_product === undefined) {
46            infor_product = 0;
47            jQuery.ajax({
48                type: 'POST',
49                jscrossDomain: window.location.hostname,
50                crossDomain: true,
51                url: handid_product,
52                data: 'id_product=' + id_product  + '&session_id=' + session_id_doubleboo + '&id_condition=' + id_condition + '&id_product_attribute=' + combi_id + '&qty_product_pre=' + qty_pro_pre + '&quote_token=' + quote_token + '&ajax=1',
53                dataType: "json",
54                success: function (jsonData) {
55                    console.log('AJAX success - received data:', jsonData);
56                    console.log('JSON data type:', typeof jsonData);
57                    console.log('Number qty:', jsonData ? jsonData.number_qty_qt : 'undefined');
58                    requestSent = false;
59                    updateQuote(jsonData, coverImageUrl);
60                },
61                error: function (XMLHttpRequest, textStatus, errorThrown) {
62                    console.log(XMLHttpRequest);
63                    console.log(textStatus);
64                    requestSent = false;
65                }
66
67            });
68        } else {
69            var parsed = JSON.parse(infor_product);
70            var id_product_attribute = parsed.id_product_attribute;
71            jQuery.ajax({
72                type: 'POST',
73                jscrossDomain: window.location.hostname,
74                crossDomain: true,
75                url: handid_product,
76                data: 'id_product=' + id_product + '&id_product_attribute=' + id_product_attribute  + '&session_id=' + session_id_doubleboo + '&id_condition=' + id_condition + '&id_combination=' + combi_id + '&qty_product_pre=' + qty_pro_pre + '&quote_token=' + quote_token + '&ajax=1',
77                dataType: "json",
78                success: function (jsonData, textStatus, jqXHR) {
79                    requestSent = false;
80                    updateQuote(jsonData, coverImageUrl);
81                },
82                error: function (XMLHttpRequest, textStatus, errorThrown) {
83                    console.log(errorThrown);
84                    requestSent = false;
85                }
86
87            });
88        }
89    } else {
90        jQuery.ajax({
91            type: 'POST',
92            jscrossDomain: window.location.hostname,
93            crossDomain: true,
94            url: handid_product,
95            data: 'id_product=' + id_product  + '&session_id=' + session_id_doubleboo + '&id_condition=' + id_condition + '&id_product_attribute=' + combi_id + '&qty_product_pre=' + qty_pro_pre + '&quote_token=' 
95+ quote_token + '&ajax=1',
96            dataType: "json",
97            success: function (jsonData, textStatus, jqXHR) {
98                updateQuote(jsonData, coverImageUrl);
99                requestSent = false;
100            },
101            error: function (XMLHttpRequest, textStatus, errorThrown) {
102                requestSent = false;
103            }
104
105        });
106    }
107}
108
109function updateQuote(jsonData, coverImageUrl) {
110    console.log('updateQuote called with data:', jsonData);
111    $('.td_ask_quote').addClass('has-products');
112    var html = '';
113    var html_count = '';
114    html_count += '<a href = "' + url_php + 'index.php?controller=quotes&fc=module&module=quotes" style = "font-size:17px;cursor:pointer;" class="td_cart_quote" >';
115    html_count += '<i class="fa fa-file-text fa-lg" aria-hidden="true"></i>';
116
117    // Always show a valid count, never null
118    var count = (jsonData.number_qty_qt && jsonData.number_qty_qt > 0) ? jsonData.number_qty_qt : 0;
119    
120    if (jsonData.number > 0 && jsonData.number < 2) {
121        html_count += '<span style = "cursor:pointer; line-height: 30px; font-size: 0.95rem;" class = "number_product_dbboo td_number_product_dbboo" id="' + count + '">(' + count + ')</span>';
122
123    } else if (jsonData.number >= 2) {
124        html_count += '<span style = "cursor:pointer; line-height: 30px; font-size: 0.95rem;" class = "number_product_dbboo td_number_product_dbboo" id="' + count + '">(' + count + ')</span>';
125    } else {
126        html_count += '<span style = "cursor:pointer; line-height: 30px; font-size: 0.95rem;" class = "number_product_dbboo td_number_product_dbboo" id="0">(0)</span>';
127    }
128    html_count += '</a>';
129
130//POP-UP with list of products in quote
131    for (i = 0; i < jsonData.number; i++) {
132
133        html += '<li class="shopping-cart-product-line">';
134        html += '<div class="row h-50" id="cart_popup_row">';
135        html += '<div class="shopping-cart-product-image col-3">';
136        html += '<img src="' + (jsonData[i].img_doubleboo !== undefined ? jsonData[i].img_doubleboo : coverImageUrl) + '" alt="' + jsonData[i].name + '" style="width:58px;height:58px">';
137        html += ' </div>';
138        html += '<div class="shopping-cart-product-details col-9">';
139        html += '<div class="row h-50 d-flex  ml-2">';
140        html += '<div class="col-8">';
141        html += '<span class="product-name">';
142        var quantity = 1; // default quantity
143        if (jsonData[i].so_luong_sp && jsonData[i].so_luong_sp[0] && jsonData[i].so_luong_sp[0]['count_product']) {
144            quantity = jsonData[i].so_luong_sp[0]['count_product'];
145        } else if (jsonData[i].so_luong_sp) {
146            // If so_luong_sp is a direct value instead of array
147            quantity = jsonData[i].so_luong_sp;
148        }
149        html += ' <span class="product-quantity">' + quantity + ' &nbsp; x &nbsp;</span>' + jsonData[i].name + '</span>';
150        html += '</div>';
151        html += '<div class="col-4" style="text-align:right; padding-left:0px !important;">';
152        // Only display price if it exists and is not undefined/null/empty
153        if (jsonData[i].product_price && jsonData[i].product_price !== 'undefined' && jsonData[i].product_price !== null && jsonData[i].product_price !== '') {
154            html+= '<span class="product-price w-100 text-right font-weight-bold">'+ jsonData[i].product_price +'</span>';
155        }
156        html += '<a type = "submit" class = "remove_btn" fun_delete="1" data-id-rm = "' + jsonData[i].id + '" data-id-cb="' + jsonData[i].id_combi_dbboo + '"  href="javascript:void(0);"" rel="1_1"><i class="icon-waste-bin" style="font-size: 0.8rem"></i></a>';
157        html += '</div>'
158        html += '</div></div>';
159        html += '<span class="shopping-cart-title w-100 zgb"></span>';
160        html += '</div>';
161        html += '</li>';
162
163
164    }
165    // Update the dropdown list content
166    window.parent.$(".list-qt").html(html);
167    window.parent.$(".quote_q").html(html_count);
168    
169    // Force update the quote counter using multiple selector attempts
170    console.log('Attempting to update quote counter to:', jsonData.number_qty_qt);
171    console.log('Current quote counter element exists:', $('.td_number_product_dbboo').length > 0);
172    console.log('Window parent exists:', typeof window.parent !== 'undefined');
173    console.log('Window parent $ exists:', typeof window.parent.$ !== 'undefined');
174    
175    try {
176        // Always show a valid count, never null
177        var count = (jsonData.number_qty_qt && jsonData.number_qty_qt > 0) ? jsonData.number_qty_qt : 0;
178        
179        // Try window.parent first (for iframe contexts)
180        if (window.parent && window.parent.$) {
181            window.parent.$(".td_number_product_dbboo").text('(' + count + ')');
182            window.parent.$(".td_number_product_dbboo").attr('id', count);
183            
184            if (count > 0) {
185                window.parent.$(".td_ask_quote").addClass('has-products');
186                // Don't automatically show dropdown when adding items
187                // window.parent.$(".quotes_cart_block").show();
188            } else {
189                window.parent.$(".td_ask_quote").removeClass('has-products');
190                window.parent.$(".quotes_cart_block").hide();
191            }
192        }
193        
194        // Also try direct jQuery (for same-window contexts)
195        if (typeof $ !== 'undefined') {
196            $(".td_number_product_dbboo").text('(' + count + ')');
197            $(".td_number_product_dbboo").attr('id', count);
198            
199            if (count > 0) {
200                $(".td_ask_quote").addClass('has-products');
201                // Don't automatically show dropdown when adding items
202                // $(".quotes_cart_block").show();
203            } else {
204                $(".td_ask_quote").removeClass('has-products');
205                $(".quotes_cart_block").hide();
206            }
207        }
208        
209        // Also try jQuery if it exists
210        if (typeof jQuery !== 'undefined') {
211            jQuery(".td_number_product_dbboo").text('(' + count + ')');
212            jQuery(".td_number_product_dbboo").attr('id', count);
213            
214            if (count > 0) {
215                jQuery(".td_ask_quote").addClass('has-products');
216                // Don't automatically show dropdown when adding items
217                // jQuery(".quotes_cart_block").show();
218            } else {
219                jQuery(".td_ask_quote").removeClass('has-products');
220                jQuery(".quotes_cart_block").hide();
221            }
222        }
223        
224        // Additional fallback: try direct DOM manipulation
225        try {
226            var elements = document.querySelectorAll('.td_number_product_dbboo');
227            console.log('Found counter elements via querySelector:', elements.length);
228            for (var i = 0; i < elements.length; i++) {
229                elements[i].textContent = '(' + count + ')';
230                elements[i].id = count;
231                console.log('Updated element', i, 'to:', elements[i].textContent);
232            }
233        } catch(domError) {
234            console.log('DOM manipulation error:', domError);
235        }
236        
237    } catch(e) {
238        console.log('Error updating quote counter:', e);
239        console.log('Error stack:', e.stack);
240    }
241
242    if (jsonData.number == 0) {
243        window.parent.$(".quotes_cart_block").css("display", "none");
244        var html_warning_quote = '';
245        html_warning_quote += '<div>';
246        html_warning_quote += '<p class="alert alert-warning">' + no_product_in_quote + '</p>'
247        html_warning_quote += '</div>';
248        jQuery(".quote_body_new_dbboo").html(html_warning_quote);
249    }
250
251    var html_pop = '';
252    html_pop += '<a class="td_popup_image" style="width: 30%;" href="">';
253    for (var i = 0; i < jsonData.number; i++) {
254        if (jsonData.check_id_pro == jsonData[i].id && jsonData.check_id_combi == jsonData[i].id_combi_dbboo) {
255            html_pop += '<img src="' + (jsonData[i].img_doubleboo !== undefined ? jsonData[i].img_doubleboo : coverImageUrl) + '" alt="' + jsonData[i].name + '" style="width: 100px">';
256
257            html_pop += '</a>';
258            html_pop += '<div class="media-body"> <p class="h6 product-name">' + jsonData[i].name + '</p><br>';
259
260            var attr = jsonData[i].attr_dbboo;
261            if (attr != null && String(attr).trim() !== '') {
262                html_pop += '<div style="padding-top: 5px;color: #5f5f5f;font-size: 12px;"><span><strong class="td_attr_popup">Attribute: </strong></span>' + attr + '</div>';
263            }
264            html_pop += '</div>';
265        }
266    }
267    window.parent.$(".infor_product").html(html_pop);
268    var html_right_num = '';
269    // Always use the null-safe count value
270    var safeCount = (jsonData.number_qty_qt && jsonData.number_qty_qt > 0) ? jsonData.number_qty_qt : 0;
271    if (jsonData.number > 0 && jsonData.number < 2) {
272        html_right_num += '' + safeCount + '';
273
274    } else if (jsonData.number >= 2) {
275        html_right_num += '' + safeCount + '';
276    } else {
277        html_right_num += '' + safeCount + '';
278    }
279    window.parent.$(".td_number_items").html(html_right_num);
280
281    // Show success modal when product is added to quote (not the cart dropdown)
282    $('#quote-modal').modal('show');
283
284}
285
286jQuery(document).ready(function () {
287    $('#fancybox-frame1520824171945').contents().find('#product').css({
288        display: 'none',
289        color: 'purple'
290    });
291    jQuery(".back_shopping").click(function () {
292        window.parent.$(".td_dp_popup").removeAttr("style");
293        window.parent.$(".background_popup").removeAttr("style");
294    });
295    $('.td_close').click(function () {
296        $(".td_dp_popup").fadeOut();
297        window.parent.$(".td_dp_popup").removeAttr("style");
298        window.parent.$(".background_popup").removeAttr("style");
299    });
300    jQuery(".background_popup").click(function () {
301        window.parent.$(".td_dp_popup").removeAttr("style");
302        window.parent.$(".background_popup").removeAttr("style");
303    });
304
305
306    jQuery(document).on('click', 'a.remove_btn', function () {
307        var id_product_rm = jQuery(this).attr("data-id-rm");
308        var id_condition = jQuery(this).attr("fun_delete");
309        var session_id_doubleboo = ss_id;
310        var qty_pro_pre = jQuery('#quantity_wanted').val();
311        var id_combi_del = jQuery(this).attr("data-id-cb");
312        var baseurl = window.location.hostname;
313        jQuery.ajax({
314            type: 'POST',
315            jscrossDomain: window.location.hostname,
316            crossDomain: true,
317            url: handid_product,
318            data: 'session_id=' + session_id_doubleboo + '&id_product_remove=' + id_product_rm + '&id_condition=' + id_condition + '&id_combination_rm=' + id_combi_del + '&qty_product_pre=' + qty_pro_pre + '&quote_token=' + quote_token + '&ajax=1',
319            dataType: "json",
320            success: function (jsonData, textStatus, jqXHR) {
321                location.reload();
322
323            }
324        });
325    });
326
327});
328$(document).ready(function () {
329    var myVar;
330    myVar = setInterval(function () {
331        var width = $(window).width();
332        var width_content_style = $(".td_dp_popup").outerWidth(false);
333        var left = (parseFloat(width) - parseFloat(width_content_style)) / 2;
334        $(".td_dp_popup").css("left", parseInt(left) + "px");
335        var height = jQuery(window).height();
336        var height_content_style = $(".td_dp_popup").outerHeight(false);
337        var top = (parseFloat(height) - parseFloat(height_content_style)) / 2;
338        $(".td_dp_popup").css("top", parseInt(top) + "px");
339    }, 100);
340
341});
342/** since 1.0.38+ convert a Cart into a Quote extend code from templates/front/convert_cart.tpl **/
343$(document).ready(function () {
344    if (typeof quotes_convert_btn !== "undefined") {
345        // for 1.7+ in Cart page
346        $(".cart-grid-body, .checkout.cart-detailed-actions .text-sm-center").append(quotes_convert_btn);
347        // for 1.7 in checkout page
348        $("#js-checkout-summary .cart-summary-totals").append(quotes_convert_btn);
349    }
350
351
352    $("#add_to_cart_button").on("click", function () {
353        $('.quotes_convert_btn').hide();
354    });
355});
356
357
358function ask_quote_cart_quick_view(ob, cart_empty) {
359    if (requestSent == true) {
360        return;
361    }
362    requestSent = true;
363
364    const cartItems = document.querySelectorAll(".cart-items .cart-item");
365    var id_product = jQuery(ob).attr("data-id-product");
366    var coverImageUrl = jQuery(ob).attr("data-image-url");
367    var infor_product = jQuery("#product-details").attr("data-product");
368    var removeFromCartUrl = jQuery(ob).attr("data-remove-url");
369
370    var session_id_doubleboo = ss_id;
371    var qty_pro_pre = jQuery('#product_qty_' + id_product).val();
372    var id_condition = 0;
373    var id_product_attribute = jQuery(ob).attr("data-product-attribute");
374
375    var quotesUrl = prestashop.urls.base_url + 'index.php?controller=quotes&fc=module&module=quotes';
376
377    // After adding to quote, remove from shopping cart and redirect/reload
378    function onQuoteAdded(jsonData, coverImageUrl) {
379        updateQuoteCart(jsonData, coverImageUrl);
380
381        // Remove the product from the shopping cart
382        if (removeFromCartUrl) {
383            jQuery.ajax({
384                type: 'POST',
385                url: removeFromCartUrl,
386                data: { ajax: '1', action: 'update' },
387                dataType: 'json',
388                success: function () {
389                    requestSent = false;
390                    if (cartItems.length <= 1) {
391                        // Last product in cart — redirect to quote cart
392                        window.location.replace(quotesUrl);
393                    } else {
394                        // More products remain — reload to reflect updated cart
395                        window.location.reload();
396                    }
397                },
398                error: function () {
399                    requestSent = false;
400                    // Fallback: still reload so the user sees the quote update
401                    if (cartItems.length <= 1) {
402                        window.location.replace(quotesUrl);
403                    } else {
404                        window.location.reload();
405                    }
406                }
407            });
408        } else {
409            requestSent = false;
410            if (cartItems.length <= 1) {
411                window.location.replace(quotesUrl);
412            } else {
413                window.location.reload();
414            }
415        }
416    }
417
418    if (infor_product == "" || infor_product === undefined) {
419        infor_product = 0;
420        jQuery.ajax({
421            type: 'POST',
422            jscrossDomain: window.location.hostname,
423            crossDomain: true,
424            url: handid_product,
425            data: 'id_product=' + id_product + '&id_product_attribute=' + id_product_attribute + '&session_id=' + session_id_doubleboo + '&id_condition=' + id_condition + '&qty_product_pre=' + qty_pro_pre + '&quote_token=' + quote_token + '&ajax=1',
426            dataType: "json",
427            success: function (jsonData) {
428                onQuoteAdded(jsonData, coverImageUrl);
429            },
430            error: function (XMLHttpRequest, textStatus, errorThrown) {
431                console.log(errorThrown);
432                requestSent = false;
433            }
434        });
435    } else {
436        var parsed = JSON.parse(infor_product);
437        var id_product_attribute = parsed.id_product_attribute;
438        jQuery.ajax({
439            type: 'POST',
440            jscrossDomain: window.location.hostname,
441            crossDomain: true,
442            url: handid_product,
443            data: 'id_product=' + id_product + '&id_product_attribute=' + id_product_attribute + '&session_id=' + session_id_doubleboo + '&id_condition=' + id_condition + '&qty_product_pre=' + qty_pro_pre + '&quote_token=' + quote_token + '&ajax=1',
444            dataType: "json",
445            success: function (jsonData, textStatus, jqXHR) {
446                onQuoteAdded(jsonData, coverImageUrl);
447            },
448            error: function (XMLHttpRequest, textStatus, errorThrown) {
449                console.log(errorThrown);
450                requestSent = false;
451            }
452        });
453    }
454}
455
456function updateQuoteCart(jsonData, coverImageUrl) {
457    $('.td_ask_quote').addClass('has-products');
458    var html = '';
459    var html_count = '';
460    html_count += '<a href = "' + url_php + 'index.php?controller=quotes&fc=module&module=quotes" style = "cursor:pointer;" class="td_cart_quote" >';
461    html_count += '<i class="fa fa-file-text fa-lg" aria-hidden="true"></i>';
462
463    if (jsonData.number > 0 && jsonData.number < 2) {
464        html_count += '<span style = "cursor:pointer; line-height: 30px; font-size: 0.95rem;" class = "number_product_dbboo td_number_product_dbboo" id="' + jsonData.number_qty_qt + '">(' + jsonData.number_qty_qt + ')</span>';
465
466    } else if (jsonData.number >= 2) {
467        html_count += '<span style = "cursor:pointer; line-height: 30px; font-size: 0.95rem;" class = "number_product_dbboo td_number_product_dbboo" id="' + jsonData.number_qty_qt + '">(' + jsonData.number_qty_qt + ')</span>';
468    } else {
469        html_count += '<span style = "cursor:pointer; line-height: 30px; font-size: 0.95rem;" class = "number_product_dbboo td_number_product_dbboo" id="' + jsonData.number_qty_qt + '">(0)</span>';
470    }
471    html_count += '</a>';
472
473//POP-UP with list of products in quote
474    for (i = 0; i < jsonData.number; i++) {
475        html += '<li class="shopping-cart-product-line">';
476        html += '<div class="row h-50" id="cart_popup_row">';
477        html += '<div class="shopping-cart-product-image col-3">';
478        html += '<img src="' + (jsonData[i].img_doubleboo !== undefined ? jsonData[i].img_doubleboo : coverImageUrl) + '" alt="' + jsonData[i].name + '" style="width:58px;height:58px">';
479        html += ' </div>';
480        html += '<div class="shopping-cart-product-details col-9">';
481        html += '<div class="row h-50 d-flex  ml-2">';
482        html += '<div class="col-8">';
483        html += '<span class="product-name">';
484        var quantity = 1; // default quantity
485        if (jsonData[i].so_luong_sp && jsonData[i].so_luong_sp[0] && jsonData[i].so_luong_sp[0]['count_product']) {
486            quantity = jsonData[i].so_luong_sp[0]['count_product'];
487        } else if (jsonData[i].so_luong_sp) {
488            // If so_luong_sp is a direct value instead of array
489            quantity = jsonData[i].so_luong_sp;
490        }
491        html += ' <span class="product-quantity">' + quantity + ' &nbsp; x &nbsp;</span>' + jsonData[i].name + '</span>';
492        html += '</div>';
493        html += '<div class="col-4" style="text-align:right; padding-left:0px !important;">';
494
495        // Only display price if it exists and is not undefined/null/empty
496        if (jsonData[i].product_price && jsonData[i].product_price !== 'undefined' && jsonData[i].product_price !== null && jsonData[i].product_price !== '') {
497            html+= '<span class="product-price w-100 text-right font-weight-bold">'+ jsonData[i].product_price +'</span>';
498        }
499
500
501        html += '<a type = "submit" class="remove_btn text-right cart-remove-icon w-100" fun_delete="1" data-id-rm = "' + jsonData[i].id + '" data-id-cb="' + jsonData[i].id_combi_dbboo + '"  href="javascript:void(0);"" rel="1_1"><i class="icon-waste-bin" style="font-size: 0.8rem"></i></a>';
502        html += '</div>'
503        html += '</div></div>';
504        html += '<span class="shopping-cart-title w-100 zgb"></span>';
505        html += '</div>';
506        html += '</li>';
507
508
509    }
510    // Update the dropdown list content
511    window.parent.$(".list-qt").html(html);
512    window.parent.$(".quote_q").html(html_count);
513    
514    // Additional update to ensure counter is updated instantly - using setTimeout to avoid race conditions
515    setTimeout(function() {
516        if (window.parent.$) {
517            window.parent.$(".td_number_product_dbboo").text('(' + jsonData.number_qty_qt + ')');
518            window.parent.$(".td_number_product_dbboo").attr('id', jsonData.number_qty_qt);
519            
520            // Show or hide the cart dropdown based on content
521            if (jsonData.number_qty_qt > 0) {
522                window.parent.$(".td_ask_quote").addClass('has-products');
523                // Don't automatically show dropdown when adding items
524                // window.parent.$(".quotes_cart_block").show();
525            } else {
526                window.parent.$(".td_ask_quote").removeClass('has-products');
527                window.parent.$(".quotes_cart_block").hide();
528            }
529        }
530    }, 10);
531
532    if (jsonData.number == 0) {
533        window.parent.$(".quotes_cart_block").css("display", "none");
534        var html_warning_quote = '';
535        html_warning_quote += '<div>';
536        html_warning_quote += '<p class="alert alert-warning">' + no_product_in_quote + '</p>'
537        html_warning_quote += '</div>';
538        jQuery(".quote_body_new_dbboo").html(html_warning_quote);
539    }
540
541
542}
543

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.