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 + '"e_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 + '"e_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 + '"e_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 + ' x </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 + '"e_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 + '"e_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 + '"e_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 + ' x </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.