PageSourceSearch

https://www.promotionchoice.com/public/assets/js/pc-custom.js?ts=1790922169

js promotionchoice.com collected 2026-10-02 06:23:05 UTC 114,003 bytes, 2,629 lines download raw bytes

1const baseURL = 'https://www.promotionchoice.com/';
2const currURL = window.location.href;
3const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
4const currPageUrl = window.location.href;
5var pgbar_id = 'progressBar';
6var status_id = 'status';
7var label_id = 'label_artworkUpload';
8var upload_rel = 1;
9var currentElm = '';
10function uploadFile(file_field,upload_url,upload_dir,upload_type,ret_nm,ret_id){
11	//pgbar_id = pgbar; status_id = status;
12	//$("#"+pgbar_id).css({"display":"block"});
13	//$("#"+status_id).removeClass('note_gr_text').removeClass('note_text');
14	var file = document.getElementById(file_field).files[0];
15    label_id = 'label_'+file_field;
16    upload_rel = file_field.substring(file_field.lastIndexOf('_')+1);
17    var csrfToken = $('input[name*="csrf"]').val();
18	var formdata = new FormData();
19	
20	formdata.append("upload_file", file);
21	formdata.append("upload_dir", upload_dir);
22	formdata.append("upload_type", upload_type);
23	formdata.append("ret_filename", ret_nm);
24	formdata.append("ret_fileid", ret_id);
25	var ajax = new XMLHttpRequest();
26	ajax.upload.addEventListener("progress", progressHandler, false);
27	ajax.addEventListener("load", completeHandler, false);
28	ajax.addEventListener("error", errorHandler, false);
29	ajax.addEventListener("abort", abortHandler, false);
30	ajax.open("POST", baseURL+upload_url);
31    ajax.setRequestHeader("X-CSRF-Token", csrfToken);
32	ajax.send(formdata);
33}
34
35function progressHandler(event){
36	/*var percent = (event.loaded / event.total) * 100;
37	$("#"+pgbar_id).val(Math.round(percent));
38	$("#"+status_id).html(Math.round(percent)+"% uploaded... please wait");*/
39    $("#"+label_id).html('<i class="fa fa-spinner fa-lg fa-spin"></i>');
40}
41
42function completeHandler(event){
43	$("#"+label_id).html(event.target.responseText);
44	//$("#"+pgbar_id).val(100);
45
46	/*if(parseInt(status_id.lastIndexOf('artworkUploadStatus')) > -1){
47        $("#"+status_id).find('input.form-control').addClass('cart-fields');
48        let fileName = $("#"+status_id).find('input.form-control').val();
49        $("#"+label_id).parent("a.upload_file").attr('href',baseURL+'public/assets/rawArtworks/'+fileName).attr("target", "_blank");
50    }*/
51    //$("#"+label_id).html('View');
52    $("#delArtworkUpload_"+upload_rel).removeClass('d-none');
53
54	//var res_txt = event.target.responseText;
55	//var err_f = res_txt.substring(0,res_txt.indexOf(':'));
56	//if(err_f=='ERROR') $("#"+status_id).addClass('text-danger');
57	//else $("#"+status_id).addClass('text-success');
58}
59
60function errorHandler(event){
61	$("#"+status_id).html("Upload Failed");
62	$("#"+status_id).addClass('note_text');
63}
64
65function abortHandler(event){
66	$("#"+status_id).html("Upload Aborted");
67	$("#"+status_id).addClass('note_text');
68}
69
70function convertSpacesToPlus(searchPhrase) {
71    // Use a regular expression to replace spaces with '+'
72	searchPhrase = $.trim(searchPhrase);
73	//searchPhrase.replace(/ /g, '+');
74    return searchPhrase.replace(/\s+/g, '+');
75}
76
77$(document).on('keypress','.numeric',function(e){
78    var keycode = (e.keyCode ? e.keyCode : e.which);
79    if(keycode>=48 && keycode<=57) return true;
80    else return false;
81});
82
83$(document).on('keydown','.zipNumeric',function(e){
84     var keycode = e.which || e.keyCode;
85
86    // Numbers 0-9
87    if (keycode >= 48 && keycode <= 57) return true;
88
89    // Numpad numbers
90    if (keycode >= 96 && keycode <= 105) return true;
91
92    // Hyphen keys
93    if (keycode == 189 || keycode == 109) return true;
94
95    // Allow backspace, delete, tab, arrows
96    if ($.inArray(keycode, [8, 9, 37, 39, 46]) !== -1) return true;
97
98    e.preventDefault();
99});
100
101$(document).on('change',".change-upload",function(e){
102    var fld_id = $(this).attr('id');
103    //var fld_val = $(this).val();
104    var fileName = e. target. files[0]. name;
105    //$(this).parents('div.form-group').children('div.custom-file').children('label.custom-file-label').html(fileName);
106    $(this).parents('div.custom_browse_btn').children('label.custom-file-label').text(fileName);
107    var upload_dir = $(this).attr('data-upload-dir');
108    var upload_type = $(this).attr('data-upload-type');
109    var upload_url = "ajax/file-upload-parser";
110    var ret_name = $(this).parents('div.form-group').children('label.upload_file').
110children('input').attr('name');
111    var ret_id = $(this).parents('div.form-group').children('label.upload_file').children('input').attr('id');
112    uploadFile(fld_id,upload_url,upload_dir,upload_type,ret_name,ret_id);
113    if(fld_id=='customerFileUpload'){
114        $("#"+fld_id).parent('div.upload_btn_wrapper').addClass('disabled');
115    }
116});
117
118$(document).on('click','.del-upload',function(){
119    let elem_id = $(this).attr('id');
120    let rel_id = elem_id.substring(elem_id.lastIndexOf('_')+1);
121    let file_name = $("#artFile_"+rel_id).val();
122    $.ajax({
123        type: 'POST',
124        url: baseURL+'ajax/remove-art-upload',
125        data: {'file_name':file_name,'dir':'writable/uploads/rawArtworks'},
126        headers: {
127            "X-CSRF-TOKEN": $('input[name*="csrf"]').val() // CSRF token in header
128        },
129        success: function(resp){
130            $("#label_artworkUpload_"+rel_id).html('Upload Art '+rel_id+'<input type="hidden" name="artfile[]" id="artFile_'+rel_id+'" class="form-control cart-fields" value="">');
131            $("#"+elem_id).addClass('d-none');
132        }
133    });
134});
135
136function _copyClipBoard(text){
137    if(text.search(/\S/)!==-1){
138        navigator.clipboard.writeText(text).then(() => {
139            // Show bootstrap toast
140            let toastEl = document.getElementById('copyToast');
141            let toast = new bootstrap.Toast(toastEl);
142            toast.show();   
143        });
144    }
145}
146
147$(document).ready(function(){
148	
149	$(document).on('click',".ajaxContent:not(.disabled):visible",function(){
150		var URL = baseURL+'ajax/content';
151		var form_data = new FormData();var flag = true;
152		var target = $(this).is('[data-record-target]')?$(this).attr('data-record-target'):$(this).attr('data-bs-target');
153		var action = $(this).is('[data-record-type]')?$(this).attr('data-record-type'):'';
154	    form_data.append($('input[name*="csrf"]:first').attr('name'),$('input[name*="csrf"]:first').val());
155		form_data.append('action',action);
156		if($(this).is('[data-id]')) form_data.append('id',$(this).attr('data-id'));
157		if($(this).is('[data-misc]')) form_data.append('misc',$(this).attr('data-misc'));
158		if($(this).is('[data-segment]')) form_data.append('segment',$(this).attr('data-segment'));
159		if(action.indexOf('submit')!==-1){
160			URL  = currURL; 
161			if($(target+':visible').find(':input[name!=""]:enabled,select[name!=""]:enabled').length>=1){
162				$(target+':visible').find(':input[name!=""]:enabled').each(function(){
163					if($(this).hasClass('mandatory')){
164						if(($(this).is('select') && !$(this).val()) || (!$(this).is('select') && $(this).val().search(/\S/)==-1)){
165							$(this).after('<span class="error top-arrow">This field is required.</span>');
166							flag = false;
167						}
168						else if($(this).is('[name]') && !$(this).is(':checkbox') && !$(this).is(':radio')) form_data.append($(this).attr('name'),$(this).val());
169						else if($(this).is('[name]') && $(this).is(':checked') && ($(this).is(':checkbox') || $(this).is(':radio'))) form_data.append($(this).attr('name'),$(this).val());
170					}
171					else if($(this).is('[name]') && !$(this).is(':checkbox') && !$(this).is(':radio')) form_data.append($(this).attr('name'),$(this).val());
172					else if($(this).is('[name]') && $(this).is(':checked') && ($(this).is(':checkbox') || $(this).is(':radio'))) form_data.append($(this).attr('name'),$(this).val());
173				});
174			}
175		}
176		if(flag){
177			$.ajax({
178				type       :'POST',
179				url        :URL,
180				data       :form_data,
181				cache      :false,
182				contentType:false,
183				processData:false,
184				timeout    :10000, 
185				context    :this,
186				beforeSend: function(){
187					if(typeof target!=='undefined' && $(target).find('div.modal-body').length) $(target).find('div.modal-body').html('<div class="loader_wrap vh-100 d-block"><div class="loader_inner"><div class="loader"></div></div></div>');
188					else if(typeof target==='undefined' && $("div.page_content_wrap:last").children("div.loader_wrap").length) $("div.page_content_wrap:last").children("div.loader_wrap").show();
189				},
190				success: function(resp){
191                    $("div.page_content_wrap:last").children("div.loader_wrap:visible").hide();
192					if(resp.search(/\S/)!=-1){
193						resp = $.parseJSON(resp);
194						if(typeof resp.redirect!=='undefined' && resp.redirect) window.location.replace(resp.redirect);
195						else if($(target).find('div.modal-body').length) $(target).find('div.modal-body').html(resp.view);
196						return false;
197					}else if(action==='submit') window.location.reload();
198				}
199			});
200		}
201	});
202	
203	$('#commonModal').on('show.bs.modal', function(e){
204		if(typeof $(e.relatedTarget).html()!=='undefined'){
205			var title  = $(e.relatedTarget).is('[data-modal-title]')?$(e.relatedTarget).data('modal-title'):'';
206			var size   = $(e.relatedTarget).is('[data-modal-size]')?$(e.relatedTarget).data('modal-size'):'';
207			var scrol  = $(e.relatedTarget).is('[data-modal-scroll]')?true:false;
208			if(title!=='') $("#commonModalLabel").html(title);
209			$("#commonModal").find('div.modal-dialog').removeClass('modal-xl').removeClass('modal-lg').removeClass('modal-md');
210			if(size!=='') $("#commonModal").find('div.modal-dialog').addClass('modal-'+size);
211			if(scrol)     $("#commonModal").find('div.modal-dialog').addClass('modal-dialog-scrollable');
212			else          $("#commonModal").find('div.modal-dialog').removeClass('modal-dialog-scrollable');
213			$("#commonModal").find('div.modal-footer').addClass('d-none');
214		}else{
215			if($("#commonModal").find('div.modal-dialog').hasClass('onload_newsletter')) $("#commonModal").find('div.modal-footer').addClass('d-none');
216			else $("#commonModal").find('div.modal-dialog').removeClass('modal-xl').removeClass('modal-lg').find('div.modal-footer').removeClass('d-none');
217		}	
218	});
219	
220    $('.SliderHeaderBanner').slick({
221        arrows:true,
222        dots:false,
223        speed:1200,
224        infinite:true,
225        autoplay:true,
226        slidesToShow:1,
227        //vertical:true,
228        slidesToScroll:1,
229    });
230
231    $('.selling_slider').slick({
232        arrows:true,
233        dots:false,
234        speed:1200,
235        infinite:false,
236        autoplay:false,
237        slidesToShow:5,
238        //vertical:true,
239        slidesToScroll:5,
240        responsive:[
241            {
242                breakpoint:1200,
243                settings:{
244                    dots:false,
245                    slidesToShow:4,
246                    slidesToScroll:4,
247                }
248            },
249            {
250                breakpoint:992,
251                settings:{
252                    dots:false,
253                    slidesToShow:3,
254                    slidesToScroll:3,
255                }
256            },
257            {
258                breakpoint:768,
259                settings:{
260                    dots:false,
261                    slidesToShow:2,
262                    slidesToScroll:2,
263                }
264            },
265            {
266                breakpoint:576,
267                settings:{
268                    dots:false,
269                    slidesToShow:1,
270                    slidesToScroll:1,
271                }
272            },
273        ]
274    });
275
276    $('.related_slider').slick({
277        arrows:true,
278        dots:false,
279        speed:1200,
280        infinite:false,
281        autoplay:false,
282        slidesToShow:5,
283        //vertical:true,
284        slidesToScroll:1,
285        responsive:[
286            {
287                breakpoint:1300,
288                settings:{
289                    dots:false,
290                    slidesToShow:4,
291                    slidesToScroll:1,                    
292                }
293            },
294            {
295                breakpoint:1025,
296                settings:{
297                    dots:false,
298                    slidesToShow:3,
299                    slidesToScroll:1,                    
300                }
301            },
302
303            {
304                breakpoint:768,
305                settings:{
306                    dots:false,
307                    slidesToShow:2,
308                    slidesToScroll:1,                    
309                }
310            },
311
312            {
313                breakpoint:520,
314                settings:{
315                    dots:false,
316                    slidesToShow:1,
317                    slidesToScroll:1,                    
318                }
319            },
320        ]
321    });
322
323
324    $('.productSize_slider').slick({
325        arrows:true,
326        dots:false,
327        speed:1200,
328        infinite:false,
329        autoplay:false,
330        slidesToShow:9,
331        //vertical:true,
332        slidesToScroll:9,
333        responsive:[
334            {
335                breakpoint:1400,
336                settings:{
337                    dots:false,
338                    slidesToShow:7,
339                    slidesToScroll:7,                    
340                }
341            },
342            {
343                breakpoint:768,
344                settings:{
345                    dots:false,
346                    slidesToShow:4,
347                    slidesToScroll:4,                    
348                }
349            },
350        ]
351    });
352
353
354    $('.color_slider').slick({
355        arrows:true,
356        dots:false,
357        speed:1200,
358        infinite:false,
359        autoplay:false,
360        slidesToShow:10,
361        //vertical:true,
362        slidesToScroll:6,
363        responsive:[
364            {
365                breakpoint:1400,
366                settings:{
367                    dots:false,
368                    slidesToShow:8,
369                    slidesToScroll:4,
370                    
371                }
372            },
373            {
374                breakpoint:992,
375                settings:{
376                    dots:false,
377                    slidesToShow:10,
378                    slidesToScroll:6,
379                }
380            },
381            {
382                breakpoint:768,
383                settings:{
384                    dots:false,
385                    slidesToShow:8,
386                    slidesToScroll:4,
387                }
388            },
389
390            {
391                breakpoint:576,
392                settings:{
393                    dots:false,
394                    slidesToShow:6,
395                    slidesToScroll:3,
396                }
397            },
398        ]
399    });
400
401    $('.size_slider').slick({
402        arrows:true,
403        dots:false,
404        speed:1200,
405        infinite:false,
406        autoplay:false,
407        slidesToShow:8,
408        //vertical:true,
409        slidesToScroll:4,
410        responsive:[
411            {
412                breakpoint:1400,
413                settings:{
414                    dots:false,
415                    slidesToShow:6,
416                    slidesToScroll:3,
417                    
418                }
419            },
420            {
421                breakpoint:992,
422                settings:{
423                    dots:false,
424                    slidesToShow:7,
425                    slidesToScroll:4,                    
426                }
427            },
428            {
429                breakpoint:768,
430                settings:{
431                    dots:false,
432                    slidesToShow:5,
433                    slidesToScroll:3,
434                }
435            },
436        ]
437    });
438
439    $('.sliderQtyItem').slick({
440        arrows:true,
441        dots:false,
442        speed:1200,
443        infinite:false,
444        autoplay:false,
445        slidesToShow:7,
446        //vertical:true,
447        slidesToScroll:6,
448        responsive:[
449            {
450                breakpoint:1400,
451                settings:{
452                    dots:false,
453                    slidesToShow:6,
454                    slidesToScroll:5,
455                }
456            },
457            {
458                breakpoint:1200,
459                settings:{
460                    dots:false,
461                    slidesToShow:3,
462                    slidesToScroll:3,
463                }
464            },
465            {
466                breakpoint:992,
467                settings:{
468                    dots:false,
469                    slidesToShow:6,
470                    slidesToScroll:6,
471                }
472            },
473            {
474                breakpoint:768,
475                settings:{
476                    dots:false,
477                    slidesToShow:5,
478                    slidesToScroll:5,
479                }
480            },
481            {
482                breakpoint:576,
483                settings:{
484                    dots:false,
485                    slidesToShow:3,
486                    slidesToScroll:3,
487                }
488            },
489        ]
490    });
491
492
493    $('.slider-for').slick({
494        slidesToShow:1,
495        slidesToScroll:1,
496        arrows:true,
497        infinite:false,
498        fade:true,
499        asNavFor:'.slider-nav'
500    });
501
502    $('.slider-nav').slick({
503        slidesToShow:6,
504        slidesToScroll:3,
505        asNavFor: '.slider-for',
506        dots: false,
507        centerMode: false,
508        infinite:false,
509        focusOnSelect: true,
510
511        responsive:[
512            {
513                breakpoint:768,
514                settings:{
515                    dots:false,
516                    slidesToShow:5,
517                    slidesToScroll:3,                    
518                }
519            },
520            {
521                breakpoint:576,
522                settings:{
523                    dots:false,
524                    slidesToShow:4,
525                    slidesToScroll:2,
526                }
527            },
528        ]
529    });
530
531    $('.slider-for').on('beforeChange', function(event, slick, currentSlide, nextSlide) {
532        var currentIframe = $(slick.$slides[currentSlide]).find('iframe');
533    
534        if (currentIframe.length) {
535            var src = currentIframe.attr('src');
536            currentIframe.attr('src', src); // Reset -> stops video
537        }
538    });
539
540    if(currURL.indexOf('categories/')!=-1 || currURL.indexOf('pages/testimonial')!=-1 || currURL.indexOf('search-results/')!=-1){
541        var single_item_class = 'category_items';
542        if(currURL.indexOf('pages/testimonial')!=-1) single_item_class = 'review-items';
543		var ajaxLoading = false;
544		var loadMoreItems = function(){
545			let pageNum = parseInt($("#curPage").val())+1;
546			let sort_type = '';
547			$.ajax({
548				url: currURL,
549				type: 'POST',
550				data: {'cur_page': pageNum, 'call_type':'ajax'},
551				beforeSend: function(){
552					ajaxLoading = true;
553				},
554				success: function(html){
555					if(html.search(/\S/)!=-1){
556						$("."+single_item_class+":last").after(html);
557						ajaxLoading = false;
558						$("#curPage").val(pageNum);
559						if(!$("#scrollPageLoader").hasClass('d-none')) $("#scrollPageLoader").addClass('d-none');
560					}
561				}
562			});
563		};
564
565        $(window).scroll(function() {
566            var minusHeight = 500;
567            if(currURL.indexOf('categories/')!=-1){
568                var bottomHeight = $("div.category_content_block").outerHeight() + $("footer").outerHeight;
569                var adjustmentHeight = 350;
570                minusHeight = parseFloat(bottomHeight) + parseInt(adjustmentHeight);
571            }
572			if ($(window).scrollTop() + $(window).height() >= $(document).height() - parseFloat(minusHeight)) {
573				if(!ajaxLoading){
574					let curPage = $("#curPage").val();
575					let totPage = $("#totPage").val();
576					console.log('Ajax scroll pagination called.');
577					if(parseInt(curPage) < parseInt(totPage)){
578						$("#scrollPageLoader").removeClass('d-none');
579						loadMoreItems();
580					}
581				}
582			}
583		});
584    }
585
586    $(document).on('click','.review_more',function(){
587        let curPage = $("#curPage").val();
588        let totPage = $("#totPage").val();
589        if(parseInt(curPage) < parseInt(totPage)){
590            let pageNum = parseInt($("#curPage").val())+1;
591            let prodId = $("#reviewProduct").val();
592            $("#ReadtReviews").find("#scrollPageLoader").removeClass('d-none');
593            $.ajax({
594				url: baseURL+'ajax/get-more-reviews',
595				type: 'POST',
596				data: {'product_id':prodId, 'cur_page':pageNum, 'call_type':'ajax'},
597				success: function(html){
598					if(html.search(/\S/)!=-1){
599						$(".read_view_block:last").after(html);
600						$("#curPage").val(pageNum);
601						if(!$("#scrollPageLoader").hasClass('d-none')) $("#ReadtReviews").find("#scrollPageLoader").addClass('d-none');
602					}
603				}
604			});
605            if(parseInt(pageNum) == parseInt(totPage)){
606                $(".review_more").addClass('d-none');
607            }
608        }
609    });
610
611    $(document).on('keydown keyup keypress search','#searchBox',function(e){
612        var keycode = (e.keyCode ? e.keyCode : e.which);
613        var srch_err = 0;
614        if(keycode==13 || e.key=='Enter'){
615            e.preventDefault();
616            if($(this).val().search(/\S/)==-1){
617				$("#searchBox").after('<label class="error top-arrow">Please enter search keyword.</label>');
618				srch_err++;
619			}else{
620				let search_phrase = convertSpacesToPlus($(this).val());
621				window.location.replace(baseURL+'search-results/'+search_phrase);
622				return true;
623			}
624            if(parseInt(srch_err)>0){
625				setTimeout(function(){
626					$("label.error").fadeOut(8000,function(){
627						$("label.error").remove();
628					});
629				},2000);
630				return false;
631			}
632        }else{
633            $(this).autocomplete({
634                source: function (request, response) {
635                    if($("#searchBox").parents('div.search_box').find('i.search-spinner').length==0) $("#searchBox").after('<i class="text-primary fa fa-spinner fa-spin fa-2x search-spinner"></i>');
636                    $.ajax({
637                        url: baseURL+'ajax/get-search-results',
638                        type: 'POST', 
639                        dataType: "json",
640                        data: { 'search_key': request.term },
641                        headers: {
642                            "X-CSRF-TOKEN": $('input[name*="csrf"]').val() // CSRF token in header
643                        },
644                        success: function (data) {
645                            response(data);
646                            $("#searchBox").parents('div.search_box').find('i.search-spinner').remove();
647                        }
648                    });
649                },
650                minLength: 2,
651                select: function (event, ui) {
652                if (ui.item.url) {
653                    window.location.href = baseURL+ui.item.url;
654                }
655                }
656            }).autocomplete("instance")._renderMenu = function (ul, items) {
657                let currentCategory = "";
658                $.each(items, function (index, item) {
659                if (item.category !== currentCategory) {
660                    ul.append(`<li class='ui-autocomplete-category'>${item.category}</li>`);
661                    currentCategory = item.category;
662                }
663                this._renderItemData(ul, item);
664                }.bind(this));
665            };
666        }
667    });
668
669    $(document).on('keydown search','#mobSearchBox',function(e){
670        var keycode = (e.keyCode ? e.keyCode : e.which);
671        var srch_err = 0;
672        if(keycode === 13 || e.key === 'Enter'){
673            e.preventDefault();
674            e.stopPropagation();
675
676            if($(this).val().search(/\S/)==-1){
677				$("#mobSearchBox").after('<label class="error top-arrow">Please enter search keyword.</label>');
678				srch_err++;
679			}else{
680				let search_phrase = convertSpacesToPlus($(this).val());
681				window.location.replace(baseURL+'search-results/'+search_phrase);
682				return true;
683			}
684            if(parseInt(srch_err)>0){
685				setTimeout(function(){
686					$("label.error").fadeOut(8000,function(){
687						$("label.error").remove();
688					});
689				},2000);
690				return false;
691			}
692        }else{
693            $(this).autocomplete({
694                source: function (request, response) {
695                    if($("#mobSearchBox").parents('div.search_box').find('i.search-spinner').length==0) $("#mobSearchBox").after('<i class="text-primary fa fa-spinner fa-spin fa-2x search-spinner"></i>');
696                    $.ajax({
697                        url: baseURL+'ajax/get-search-results',
698                        type: 'POST', 
699                        dataType: "json",
700                        data: { 'search_key': request.term },
701                        headers: {
702                            "X-CSRF-TOKEN": $('input[name*="csrf"]').val() // CSRF token in header
703                        },
704                        success: function (data) {
705                            response(data);
706                            $("#mobSearchBox").parents('div.search_box').find('i.search-spinner').remove();
707                        }
708                    });
709                },
710                minLength: 2,
711                select: function (event, ui) {
712                    if (ui.item.url) {
713                        window.location.href = baseURL+ui.item.url;
714                    }
715                }
716            }).autocomplete("instance")._renderMenu = function (ul, items) {
717                let currentCategory = "";
718                $.each(items, function (index, item) {
719                if (item.category !== currentCategory) {
720                    ul.append(`<li class='ui-autocomplete-category'>${item.category}</li>`);
721                    currentCategory = item.category;
722                }
723                this._renderItemData(ul, item);
724                }.bind(this));
725            };
726        }
727    });
728	
729	$(document).on('click','#clickSearch',function(){
730		let inputValue = $(this).prev().find(':input').val().trim();
731		if(inputValue.length){
732			let search_phrase = convertSpacesToPlus(inputValue);
733			window.location.replace(baseURL+'search-results/'+search_phrase);
734		}
735	});
736
737    $(document).on('click','#mobClickSearch',function(){
738		let inputValue = $(this).prev().find(':input').val().trim();
739		if(inputValue.length){
740			let search_phrase = convertSpacesToPlus(inputValue);
741			window.location.replace(baseURL+'search-results/'+search_phrase);
742		}
743	});
744
745    $(".submenu-hideshow").click(function(){
746        let hideshow_li_cnt = $(this).parents("div.category_link").find("li.d-none").length;
747        if(parseInt(hideshow_li_cnt)>0){
748            $(this).parents("div.category_link").find("li.hideshow-links").removeClass('d-none');
749            $(this).text("- Show Less");
750        }else{
751            $(this).parents("div.category_link").find("li.hideshow-links").addClass('d-none');
752            $(this).text("+ Show More");
753        }
754    });
755
756    $.ajaxSetup({
757        headers: {
758            'X-CSRF-TOKEN': $('input[name*="csrf"]').val()
759        }
760    });
761
762    var _genShipOptions = function(elem_id){
763        let zip_val = $("#productShippingZip").val();
764        let dec_id = $(".product-decoration:checked").val();
765        let product_id = $("#productId").val();
766        let prod_qty = $("#prodQuantity_"+dec_id).val();
767        let production = $("#production_"+dec_id).val();
768        let proof = $("#productVirtualProof").val();
769        let cart_edit_select = $("#productShipMethod").data('edit-select');
770        let ship_opt_id = ($("#productShipMethod").val().search(/\S/)!=-1)?$("#productShipMethod").val():'';
771	    let options = {};
772		if(cart_edit_select!='' && ship_opt_id=='') ship_opt_id = cart_edit_select;
773		if(dec_id && $(':input.price-params.fields-'+dec_id).length){
774			$(':input.price-params.fields-'+dec_id).each(function(){
775				if($(this).val()){
776					var name      = $(this).attr('name').replace('[]','').split('[').pop();name = name.replace(']','');
777					options[name] = $(this).val();
778				}
779			});
780		}
781        if(zip_val.length==5 || zip_val.length==10){
782            $.ajax({
783                url: baseURL+'ajax/get-ship-options',
784                method: 'POST', 
785                beforeSend: function(){
786					$('#productShippingZip').next('.error').remove();
787                    if(elem_id=='productShippingZip'){
788                        $("#productShippingZip").after('<i class="fa fa-spinner fa-lg fa-spin ajax-spinner" aria-hidden="true"></i>');
789                    }
790                },
791                data: {'product_id':product_id,'prod_qty':prod_qty,'dec_id':dec_id,'ship_zip':zip_val,'production':production,'proof':proof,'select_ship':ship_opt_id,options},
792                headers: {
793                    "X-CSRF-TOKEN": $("#frmProductDetails").find('input[name*="csrf"]').val() // CSRF token in header
794                },
795                success: function(resp){
796                    if(resp.search(/\S/)!=-1){
797						if(resp.indexOf('<option')!==-1){
798							$("#productShipMethod").html(resp);
799							$("#productShipMethod").removeAttr('disabled');
800							$("#productShippingZip").parent('div.form-group').find('i.ajax-spinner').remove();
801							$("#productShipMethod").trigger('change');
802						}else{
803							$("#productShipMethod").prop('disabled',true).find('option[value!=""]').remove();
804							$("#productShippingZip").parent('div.form-group').find('i.ajax-spinner').remove();
805							$("#productShippingZip").after('<label class="error top-arrow">'+resp+'</label>');
806						}
807                    }
808                }
809            });
810        }
811    };
812
813    $("#productShippingZip").change(function(){
814        let elem_id = $(this).attr('id');
815        _genShipOptions(elem_id);
816    });
817
818    $.ajaxSetup({
819        headers: {
820            'X-CSRF-TOKEN': $('input[name*="csrf"]').val()
821        }
822    });
823
824    $(document).on('change','#field_35',function(){
825        if($(this).val().search(/\S/)!=-1){
826            if($('#inkColors').length>0){
827                $('#inkColors option').prop('disabled', false);
828                $('#inkColors').multiselect('deselectAll', false);
829                $('#inkColors').multiselect('refresh');
830            }
831        }
832        if($(this).is('[data-target]')){
833            let decoration  = $(this).data('target').match(/\d+/);
834            let productionData = $("#production_json_"+decoration).val();
835            let target      = '#'+$(this).data('target');
836            let $prodSelect = $(target);
837            let selectedOption = $(this).find(':selected');
838            let productionIds = selectedOption.data('production');
839
840            $prodSelect.empty().append('<option value="">Production Time</option>');
841
842            if (productionIds) {
843                let productionDataObj = JSON.parse(productionData);
844                let ids = productionIds.toString().split(',').map(id => id.trim());
845            
846                // Loop through all production entries
847                Object.values(productionDataObj).forEach(function (p) {
848                    if (ids.includes(p.id.toString())) {
849                        let label = p.name;
850                        if (p.price > 0) {
851						   label += " +$" + p.price.toFixed(2);
852						   if(p.multiple) label += " / " + p.multiple + " Pcs";
853                        }
854                        $prodSelect.append(
855                            $('<option>', {
856                                value: p.id,
857                                text: label,
858                                'data-minimum': p.minimum
859                            })
860                        );
861                    }
862                });
863            }
864            var minimum = $(this).find('option:selected').data('minimum').toString();
865            if(decoration){
866                $('label.error').remove();
867                if(minimum!=='0'){
868                    $('#prodQuantity_'+decoration).attr('data-minimum',minimum);
869                    if(!$(".prod-size-qty").length && minimum>parseInt($('#prodQuantity_'+decoration).val())){
870						$('#prodQuantity_'+decoration).val(minimum).change();
871                    }
872                }
873            }
874        }		
875    });
876    
877    $(document).on('change','input[id^="prodQuantity_"]',function(){
878        var decoration  = $(this).attr('id').match(/\d+/);
879        var currQty = parseInt($(this).val());
880        var minimum = parseInt($("#minQuantity_"+decoration).val());
881        if($(this).is('[data-minimum]')) minimum = parseInt($(this).data('minimum'));
882        if(isNaN(currQty)){
883            currQty = minimum;
884            $("#prodQuantity_"+decoration).val(minimum);
885        }
886        if(minimum>parseInt(currQty)){
887            $('label.error').remove();
888            $("#prodQuantity_"+decoration).val(minimum).change().parent("div.form-group").after('<label class="error top-arrow">Quantity cannot be less than '+minimum+' pieces.</label>');
889        }	
890    });
891
892    $(document).on('change','#productShipMethod',function(){
893        if($(this).val().search(/\S/)!=-1){
894            let ship_method = $(this).find('option:selected').text();
895            let ship_price = $(this).find('option:selected').data('price');
896            let delivery_date = $(this).find('option:selected').data('etd');
897            let raw_delivery_date = $(this).find('option:selected').data('raw-etd');
898
899            ship_method = ship_method.replace(' - FREE','');
900
901            $("#deliveryDate").html(delivery_date + '<input type="hidden" name="ship_etd" class="cost-params" value="'+raw_delivery_date+'">');
902            $(".estimated_date").removeClass('d-none');
903            $("#chargeDetails").find("td.ship-method").html('Shipping '+(ship_method!==''?'('+ship_method+')':'')+'' + '<input type="hidden" name="ship_method_name" class="cost-params" value="'+ship_method+'">');
904            $("#chargeDetails").find("td.ship-charge").html((parseFloat(ship_price)==0?'<span class="text-danger">FREE</span>':'$'+ship_price.toFixed(2)) + '<input type="hidden" name="ship_cost" class="cost-params" value="'+ship_price.toFixed(2)+'">');
905            $("#chargeDetails").find("tr#shipCharges_holder").removeClass('d-none');
906
907            let totalCost = parseFloat($("#orderTotal").val());
908            totalCost += parseFloat(ship_price);
909
910            $("#totalCost").text(totalCost.toFixed(2));
911        }
912    });
913
914    $(document).on('change','.price-params',function(){
915        let elem_id = $(this).attr('id');
916        let dec_id = $(".product-decoration:checked").val();
917        let product_id = $("#productId").val();
918        let ship_opt_id = $("#productShipMethod").val();
919        let ship_method = '';
920        let ship_weight = 0;
921        let ship_price = '';
922        if(elem_id.indexOf('prodSize_')!=-1){
923            return false;
924        }
925        if(elem_id=='productVirtualProof' && $("#productVirtualProof").val().search(/\S/)!=-1){
926            if(!$(this).hasClass('params-'+dec_id)) $(this).addClass('params-'+dec_id);
927            if(!$(this).hasClass('cart-fields-'+dec_id)) $(this).addClass('cart-fields-'+dec_id);
928        }
929        if(elem_id.indexOf('prodQuantity_')!=-1 && parseInt($("#prodQuantity_"+dec_id).val()) < parseInt($("#minQuantity_"+dec_id).val())){
930            $("#prodQuantity_"+dec_id).val(parseInt($("#minQuantity_"+dec_id).val()));
931            $("#prodQuantity_"+dec_id).parent("div.form-group").after('<label class="error">Quantity cannot be less than '+parseInt($("#minQuantity_"+dec_id).val())+' pieces.</label>');
932        }
933        if($("#productShipMethod").val().search(/\S/)!=-1){
934            ship_method = $("#productShipMethod").find('option:selected').text();
935            ship_method = ship_method.replace(' - FREE','');
936            ship_price = $("#productShipMethod").find('option:selected').data('price');
937            ship_weight = $("#productShipMethod").find('option:selected').data('unit-weight');
938        }
939        $.ajax({
940            url: baseURL+'ajax/get-order-cost',
941            method: 'POST', 
942            data: {'product_id':product_id,'decoration':dec_id,'ship_method':ship_method,'ship_price':ship_price,'ship_weight':ship_weight,'params':$(".params-"+dec_id).serializeArray()},
943            headers: {
944                "X-CSRF-TOKEN": $("#frmProductDetails").find('input[name*="csrf"]').val() // CSRF token in header
945            },
946            success: function(resp){
947                if(resp.search(/\S/)!=-1){
948                    let priceObj = $.parseJSON(resp);
949                    var totalCost = 0;
950                    var productTotal = 0;
951                    if(dec_id=='Sample'){
952                        $("#unitPrice_"+dec_id).val(0);
953                        totalCost = parseFloat(priceObj.total_cost);
954                        productTotal = 0;
955                        ship_price = priceObj.cost.Shipping.toFixed(2);
956                    }else{
957                        $("#unitPrice_"+dec_id).val(priceObj.price.toFixed(2));
958                        $("#unitPriceDisp_"+dec_id).text('x $'+priceObj.price.toFixed(2)+'ea');
959                        totalCost = parseFloat(priceObj.total_cost);
960                        productTotal = parseFloat(priceObj.total_cost);
961                        if(parseFloat(ship_price)>0){
962                            totalCost += parseFloat(ship_price);
963                        }
964                    }
965                    $("#totalCost").text(totalCost.toFixed(2));
966                    $("#orderTotal").val(productTotal.toFixed(2));
967                    $("#chargeDetails").html(priceObj.charges_html);
968                    if(elem_id.indexOf('prodQuantity_')!=-1 || elem_id.indexOf('production_')!=-1 || elem_id=='productVirtualProof' || priceObj.adjust_shipping==1){
969                        _genShipOptions(elem_id);
970                    }
971                }
972            }
973        });
974    });
975
976    $(document).on('change','.prod-size-qty',function(){
977        let tot_qty = 0;
978        let tot_size_qty = 0;
979        let elem_id = $(this).attr('id');
980        let currQty = parseInt($(this).val());
981        let dec_id = $(".product-decoration:checked").val();
982        let minimum = parseInt($("#minQuantity_"+dec_id).val());
983        if(isNaN(currQty)){
984            $("#"+elem_id).val(0);
985            $(".prod-size-qty:visible").each(function(){
986                tot_size_qty += parseInt($(this).val());
987            });
988            if(parseInt(tot_size_qty) < parseInt(minimum)){
989                let def_qty = parseInt(minimum-tot_size_qty);
990                $("#"+elem_id).val(def_qty);
991            }
992        }
993        $(".prod-size-qty:visible").each(function(){
994            tot_qty += parseInt($(this).val());
995        });
996        if(tot_qty && $("#totalQuantity_"+dec_id).length) $("#totalQuantity_"+dec_id).text(tot_qty);
997        $("#prodQuantity_"+dec_id).val(tot_qty).trigger('change');
998    });
999
1000    $(document).on('click','.product-decoration',function(){
1001        let dec_id = $(this).val();
1002        if(dec_id.search(/\S/)!=-1){
1003            $(".weight-grid").not(".d-none").addClass('d-none');
1004            $("#weightGrid_"+dec_id).removeClass('d-none');
1005
1006            $(".price-grid").not(".d-none").addClass('d-none');
1007            $("#priceGrid_"+dec_id).removeClass('d-none');
1008
1009            $(".production-time").not(".d-none").addClass('d-none');
1010            $("select.production").val('');
1011            $("#productionTime_"+dec_id).removeClass('d-none');
1012
1013            if(dec_id=='Sample' || dec_id==15){
1014                $("#artworkBlock").addClass('d-none');
1015                $("#vpHolder").addClass('d-none');
1016                if(dec_id=='Sample'){
1017                    $("#ptHolder").addClass('d-none');
1018                    $("#productionShippingBlock").addClass('d-none');
1019                    $("#btnAddtoCart").removeClass('disabled');
1020                }else{
1021                    $("#ptHolder").removeClass('d-none');
1022                    $("#productionShippingBlock").removeClass('d-none');
1023                    $("#noPrintInstHolder").removeClass('d-none');
1024                    if(!$("#btnAddtoCart").hasClass('disabled')) $("#btnAddtoCart").addClass('disabled');
1025                    if(!$("#continueStep2Holder").hasClass('d-none')) $("#continueStep2Holder").addClass('d-none');
1026                }
1027            }else{
1028                $("#productionShippingBlock").removeClass('d-none');
1029                $("#continueStep2Holder").removeClass('d-none');
1030                if(!$("#noPrintInstHolder").hasClass('d-none')) $("#noPrintInstHolder").addClass('d-none');
1031                $("#noPrintInstHolder").find("#artInfoNoPrint").val('');
1032                if(!$("#btnAddtoCart").hasClass('disabled')) $("#btnAddtoCart").addClass('disabled');
1033                $("#artworkBlock").removeClass('d-none');
1034                $("#vpHolder").removeClass('d-none');
1035                $("#ptHolder").removeClass('d-none');
1036            }
1037        }
1038    });
1039
1040    $(document).on('click','#viewCharges',function(){
1041        let link_text = $(this).text();
1042        if(link_text=='View Charges') $(this).text('Hide Charges');
1043        else $(this).text('View Charges');
1044    });
1045
1046    $(document).on('click','.color-check',function(){
1047        let elem_id  = $(this).attr('id');
1048        let color_id = elem_id.substring(elem_id.lastIndexOf('_')+1);
1049        let dec_id   = $(".product-decoration:checked").val();
1050		let panel_id = $(this).data('panel-id')?$(this).data('panel-id'):0;
1051        if($(this).hasClass('image-changer') && $(this).prop('checked') && $("#thumbImage_"+color_id).length>0){
1052            $("#thumbImage_"+color_id).trigger('click');
1053        }
1054		if($('.select_color_wrap').length){
1055			$('.select_color_wrap').each(function(){
1056                let colorArr = [];
1057				if($(this).find('input[type="checkbox"]').length){
1058					$(this).find('.color-check').each(function(){
1059						if($(this).is(':checked') && $(this).data('color-name')) colorArr.push($(this).data('color-name'));
1060					}); 
1061					if(panel_id) $(this).find("#selectColorList_"+dec_id+"_"+panel_id).text(colorArr.join(", "));
1062					else $(this).find("#selectColorList_"+dec_id).text(colorArr.join(", "));
1063					if(!colorArr.length){
1064						if(panel_id) $(this).find("#selectColorList_"+dec_id+"_"+panel_id).text('');
1065						else $(this).find("#selectColorList_"+dec_id).text('');
1066						if($(this).hasClass('image-changer')) $(".thumb_item:first").trigger('click');
1067					}
1068				}
1069			});
1070		}
1071    });
1072
1073    if(currURL.indexOf('/products/') !== -1){
1074		let dec_id = $(".product-decoration:checked").val();
1075        $(".product-decoration:checked").trigger('click');
1076        $("#prodQuantity_"+dec_id).trigger('change');
1077	}
1078
1079    $(document).on('click',".delete_cart_item",function(){
1080		var elm_id = $(this).attr('id');
1081		var cart_key = elm_id.substring(elm_id.lastIndexOf('_')+1);
1082        $("#miniCart").find('div.loader_wrap').show();
1083		$.ajax({
1084			type: 'POST',
1085			url: baseURL+'ajax/remove-mcart-item',
1086			data: {'cart_key':cart_key},
1087            headers: {
1088                "X-CSRF-TOKEN": $("#miniCart").find('input[name*="csrf"]').val() // CSRF token in header
1089            },
1090			success: function(resp){
1091				if(resp.search(/\S/)!=-1){
1092                    $("#miniCart").find('div.loader_wrap').hide();
1093					_refreshMCart();
1094					if(parseInt($("#cartCount").text())>0) $("#cartCount").text(parseInt($("#cartCount").text())-1);
1095				}
1096			}
1097		});
1098	});
1099
1100    $(document).on('click', '[data-bs-dismiss="offcanvas"]', function () {
1101        const instance = new bootstrap.Offcanvas(document.getElementById("miniCart"));
1102        if ($('.offcanvas').hasClass('show')) {
1103            instance.hide();
1104            if($('.offcanvas').hasClass('show')){
1105                $('.offcanvas').removeClass('show');
1106                $('.offcanvas-backdrop').remove();
1107                $('body').removeClass('offcanvas-backdrop-open');
1108            }
1109        }
1110    });
1111
1112    var _refreshMCart = function(){
1113        const instance = new bootstrap.Offcanvas($("#miniCart")[0]);
1114        if (!$('.offcanvas').hasClass('show')) {
1115            instance.show();
1116        }
1117        $("#miniCart").find('div.loader_wrap').show();
1118        $.ajax({
1119			type: 'GET',
1120			url: baseURL+'ajax/refresh-mcart',
1121			success: function(resp){
1122                $("#miniCart").find('div.loader_wrap').hide();
1123                $("#miniCartContent").html(resp);
1124			}
1125		});
1126    };
1127
1128    var _buildSearchURL = function(){
1129		var currentUrl = window.location.origin + window.location.pathname;
1130		if($(".filter-params").length){
1131			var obj = {};
1132			obj['current'] = currentElm; 
1133			$(".filter-params:checked").each(function(){
1134				var elm  = $(this).attr('name').replace('[]','').split('[').pop();elm = elm.replace(']','');
1135				if(typeof obj[elm]!=='undefined') obj[elm] = obj[elm]+'|'+$(this).val();
1136				else obj[elm] = $(this).val()
1137			});
1138			if(Object.keys(obj).length){
1139				var encrypt    = decodeURIComponent(btoa(JSON.stringify(obj)));
1140				currentUrl += '?filter='+encrypt;
1141			}
1142			window.location.href = currentUrl;
1143		}
1144	};
1145	
1146	$(document).on('click','.filter-params',function(){
1147		currentElm = $(this).attr('name').replace('[]','').split('[').pop();currentElm = currentElm.replace(']','');
1148		_buildSearchURL();
1149	});
1150
1151	$(document).on('click','#clearAllFilter',function(){
1152		let curr_url = new URL(window.location.origin + window.location.pathname);
1153		let updatedUrl = curr_url.toString();
1154		window.location.href = decodeURIComponent(updatedUrl);
1155	});
1156
1157	$(document).on('click','.remove-filter',function(){
1158		let filterIdVal = $(this).attr('data-filter-id');
1159		let filterElemId = $(this).attr('data-filter-type');
1160		if($(".remove-filter").length==1) $("#clearAllFilter").trigger('click');
1161		else{
1162            if(isNaN(filterIdVal)){
1163                $('input[type="checkbox"][value="'+filterIdVal+'"]').trigger('click');
1164            }else{
1165                if(filterElemId=='filterPrice' || filterElemId=='filterQuantity'){
1166                    $("#"+filterElemId+filterIdVal).prop('checked',false);
1167                    _buildSearchURL();
1168                }else{
1169                    $("#"+filterElemId+filterIdVal).trigger('click');
1170                }
1171            }									  
1172		}
1173	});
1174
1175	$(document).on('click','.filter-hideshow',function(){
1176		$(this).toggleClass('filter-arrow');
1177		$(".filter_section").children('div.filter_box').toggleClass('d-none');
1178	});
1179
1180    $(document).on('click','#headerCart',function(e){
1181		_refreshMCart();
1182	});
1183
1184    $(document).on('change','.mc-quantity',function(e){
1185        let elm_id = $(this).attr('id');
1186		let cart_key = elm_id.substring(elm_id.lastIndexOf('_')+1);
1187        $("#miniCart").find('div.loader_wrap').show();
1188		$.ajax({
1189			type: 'POST',
1190			url: baseURL+'ajax/update-mcart',
1191            data: {'cart_key':cart_key,'quantity':$(this).val()},
1192            headers: {
1193                "X-CSRF-TOKEN": $("#miniCart").find('input[name*="csrf"]').val() // CSRF token in header
1194            },
1195			success: function(resp){
1196                $("#miniCart").find('div.loader_wrap').hide();
1197                _refreshMCart();
1198			}
1199		});
1200	});
1201
1202    $(document).on('change','.mc-prod-size-qty',function(e){
1203        let elm_id = $(this).attr('id');
1204		let cart_key = elm_id.substring(elm_id.lastIndexOf('_')+1);
1205        let tot_qty = 0;
1206        
1207        $("#prodSizeHolder_"+cart_key).find("input.mc-prod-size-qty").each(function(){
1208            tot_qty += parseInt($(this).val());
1209        });
1210        $("#prodQty_"+cart_key).val(tot_qty);
1211        $("#miniCart").find('div.loader_wrap').show();
1212        $.ajax({
1213			type: 'POST',
1214			url: baseURL+'ajax/update-mcart',
1215            data: {'cart_key':cart_key,'quantity':tot_qty,'sizeqty':$("#prodSizeHolder_"+cart_key).find("input.mc-prod-size-qty").serializeArray()},
1216            headers: {
1217                "X-CSRF-TOKEN": $("#miniCart").find('input[name*="csrf"]').val() // CSRF token in header
1218            },
1219			success: function(resp){
1220                $("#miniCart").find('div.loader_wrap').hide();
1221                _refreshMCart();
1222			}
1223		});
1224	});
1225
1226    $(".review-scroll").click(function() {
1227        $("html, body").animate({
1228            scrollTop: $("#prodReviewHolder").offset().top - 150
1229        }, 800); // 800ms animation
1230    });
1231
1232    $(".plus_minus_icon").on("click", function() {
1233        var flag = '0';
1234        if($(this).next(".menu_sublinks").css('display') == 'block'){
1235            flag='1';
1236        }
1237        $(".menu_sublinks").slideUp("slow");
1238
1239        if( flag == '1')  $(this).next(".menu_sublinks").slideUp( "slow" );
1240        else  $(this).next(".menu_sublinks").slideToggle( "slow" );
1241    });
1242
1243    var reviewValidation = $("#frmPostReview").validate({
1244        ignore: [],
1245        rules: {
1246            name: {
1247                required: true,
1248                minlength: 3
1249            },
1250            email: {
1251                required: true,
1252                email: true
1253            },
1254            rating: {
1255                required: true
1256            },
1257            comments: {
1258                required: true
1259            }
1260        },
1261        messages: {
1262            name: {
1263                required: "Please enter your name.",
1264                minlength: "Name should be at least 3 characters long."
1265            },
1266            email: {
1267                required: "Please enter your email.",
1268                email: "Please enter a valid email."
1269            },
1270            rating: "Please provide a rating.",
1271            comments: {
1272                required: "Please provide comments."
1273            }
1274        }
1275    });
1276
1277    $(document).on('click','#reviewSubmit',function(){
1278		let err_cnt = 0;
1279        if($("#reviewerName").val().search(/\S/)==-1){
1280            if($("#reviewerName").parent('div.form-group').find('label.error').length==0){
1281                $("#reviewerName").after('<label class="error top-arrow">Please enter your name.</label>');
1282            }
1283			err_cnt++;
1284        }
1285        if($("#reviewTitle").val().search(/\S/)==-1){
1286            if($("#reviewTitle").parent('div.form-group').find('label.error').length==0){
1287                $("#reviewTitle").after('<label class="error top-arrow">Please enter a review title.</label>');
1288            }
1289			err_cnt++;
1290        }
1291        if($("#reviewRating").val().search(/\S/)==-1 || $("#reviewRating").val()==='0.0'){
1292            if($("#reviewRating").parent('div.form-group').find('label.error').length==0){
1293                $("#reviewRating").after('<label class="error top-arrow">Please provide a rating.</label>');
1294            }
1295			err_cnt++;
1296        }
1297        if($("#reviewComments").val().search(/\S/)==-1){
1298            if($("#reviewComments").parent('div.form-group').find('label.error').length==0){
1299                $("#reviewComments").after('<label class="error top-arrow">Please provide comments.</label>');
1300            }
1301			err_cnt++;
1302        }
1303		if(!err_cnt){
1304			let form_data = new FormData();		
1305            $("#frmPostReview").find(':input.review-fields').each(function(){
1306				if($(this).is('[name]') && !$(this).is(':checkbox') && !$(this).is(':radio')) form_data.append($(this).attr('name'),$(this).val());
1307				else if($(this).is('[name]') && $(this).is(':checked') && ($(this).is(':checkbox') || $(this).is(':radio'))) form_data.append($(this).attr('name'),$(this).val());
1308			}); 			
1309			$.ajax({
1310				type       :'POST',
1311                url        : baseURL+'ajax/post-review',
1312				data       :form_data,
1313				cache      :false,
1314				contentType:false,
1315				processData:false,
1316				context    :this,
1317				success: function(resp){
1318					if(resp.search(/\S/)!=-1){
1319						var respObj = $.parseJSON(resp);
1320						$("#reviewMSG").removeClass('d-none').html(respObj.message);
1321					    $("#frmPostReview").find(':input.review-fields').val('');
1322						$(".review-rating").starRating("setRating", 0);
1323					}
1324				}
1325			});
1326        }else{
1327            setTimeout(function(){
1328                $("label.error").fadeOut(8000,function(){
1329                    $("label.error").remove();
1330                });
1331            },2000);
1332            return false;
1333		}
1334    });
1335
1336    $(document).on('change','#coSavedAddress',function(){
1337        let elem_val = $(this).val();
1338        if(elem_val=='new'){
1339            if(!$("#lastShipAddress").hasClass('d-none')) $("#lastShipAddress").addClass('d-none');
1340            $(".shipping-fields").val('');
1341            $("#si_country").val(226);
1342            $("#shippingFieldsHolder").removeClass('d-none');
1343        }else{
1344            if(elem_val.search(/\S/)!=-1){
1345                let company = $(this).find('option:selected').data('company');
1346                let fname = $(this).find('option:selected').data('fname');
1347                let lname = $(this).find('option:selected').data('lname');
1348                let email = $(this).find('option:selected').data('email');
1349                let phone = $(this).find('option:selected').data('phone');
1350                let address1 = $(this).find('option:selected').data('address1');
1351                let address2 = $(this).find('option:selected').data('address2');
1352                let city = $(this).find('option:selected').data('city');
1353                let state = $(this).find('option:selected').data('state');
1354                let stateabbr = $(this).find('option:selected').data('stateabbr');
1355                let zip = $(this).find('option:selected').data('zip');
1356                let country = $(this).find('option:selected').data('country');
1357                let countryabbr = $(this).find('option:selected').data('countryabbr');
1358
1359                $("#si_company").val(company);
1360                $("#si_firstName").val(fname);
1361                $("#si_lastName").val(lname);
1362                $("#si_email").val(email);
1363                $("#si_phone").val(phone);
1364                $("#si_address1").val(address1);
1365                $("#si_address2").val(address2);
1366                $("#si_city").val(city);
1367                $("#si_state").val(state);
1368                $("#si_postalCode").val(zip);
1369                $("#si_country").val(country);
1370
1371                if(!$("#lastShipAddress").hasClass('d-none')){
1372                    let addr_str = fname+' '+lname+'<br>'+address1+' '+address2+'<br>'+city+' '+stateabbr+'. '+zip+'<br>'+countryabbr+'<br>'+phone;
1373                    $("#lastShipAddress").find('p').html(addr_str);
1374                }
1375
1376                if($("#sameAsShipping").prop('checked')){
1377                    _copyShipAddress();
1378                }
1379
1380                $("#si_state").trigger('change');
1381            }
1382        }
1383    });
1384
1385    $(document).on('click','#sameAsShipping',function(){
1386        if($(this).prop('checked')){
1387            _copyShipAddress();
1388            if(!$("#lastBillAddress").hasClass('d-none')) $("#lastBillAddress").addClass('d-none');
1389            $("#billingFieldsHolder").removeClass('d-none');
1390        }else{
1391            $(".billing-fields").val('');
1392            $("#bi_country").val(226);
1393            $("#billingFieldsHolder").removeClass('d-none');
1394        }
1395    });
1396
1397    $(document).on('click','#changeBillAddress',function(){
1398        if(!$("#lastBillAddress").hasClass('d-none')) $("#lastBillAddress").addClass('d-none');
1399        /*$(".billing-fields").val('');
1400        $("#bi_country").val(226);*/
1401        $("#billingFieldsHolder").removeClass('d-none');
1402    });
1403
1404    $(document).on('click','#changeShipAddress',function(){
1405        if(!$("#lastShipAddress").hasClass('d-none')) $("#lastShipAddress").addClass('d-none');
1406        /*$(".shipping-fields").val('');
1407        $("#si_country").val(226);*/
1408        $("#shippingFieldsHolder").removeClass('d-none');
1409    });
1410
1411    $(document).on('click','#continueShipping',function(){
1412        $("#shippingFieldsHolder").find('label.error').remove();
1413        var err_cnt = 0;
1414
1415        if($("#si_firstName").val().search(/\S/)==-1){
1416            if($("#si_firstName").parent('div.form-group').find('label.error').length==0){
1417                $("#si_firstName").after('<label class="error top-arrow">Please enter your first name.</label>');
1418                err_cnt++;
1419            }
1420            return false;
1421        }
1422        if($("#si_lastName").val().search(/\S/)==-1){
1423            if($("#si_lastName").parent('div.form-group').find('label.error').length==0){
1424                $("#si_lastName").after('<label class="error top-arrow">Please enter your last name.</label>');
1425                err_cnt++;
1426            }
1427            return false;
1428        }
1429        if($("#si_email").val().search(/\S/)==-1 || emailRegex.test($("#si_email").val())!==true){
1430            if($("#si_email").parent('div.form-group').find('label.error').length==0){
1431                $("#si_email").after('<label class="error top-arrow">Please enter valid email address.</label>');
1432                err_cnt++;
1433            }
1434            return false;
1435        }
1436        if($("#si_phone").val().search(/\S/)==-1){
1437            if($("#si_phone").parent('div.form-group').find('label.error').length==0){
1438                $("#si_phone").after('<label class="error top-arrow">Please enter your phone number.</label>');
1439                err_cnt++;
1440            }
1441            return false;
1442        }
1443        if($("#si_address1").val().search(/\S/)==-1){
1444            if($("#si_address1").parent('div.form-group').find('label.error').length==0){
1445                $("#si_address1").after('<label class="error top-arrow">Please enter your shipping address.</label>');
1446                err_cnt++;
1447            }
1448            return false;
1449        }
1450        if($("#si_city").val().search(/\S/)==-1){
1451            if($("#si_city").parent('div.form-group').find('label.error').length==0){
1452                $("#si_city").after('<label class="error top-arrow">Please enter your city.</label>');
1453                err_cnt++;
1454            }
1455            return false;
1456        }
1457        if($("#si_state").val().search(/\S/)==-1){
1458            if($("#si_state").parent('div.form-group').find('label.error').length==0){
1459                $("#si_state").after('<label class="error top-arrow">Please choose your state.</label>');
1460                err_cnt++;
1461            }
1462            return false;
1463        }
1464        if($("#si_postalCode").val().search(/\S/)==-1){
1465            if($("#si_postalCode").parent('div.form-group').find('label.error').length==0){
1466                $("#si_postalCode").after('<label class="error top-arrow">Please enter your postal code.</label>');
1467                err_cnt++;
1468            }
1469            return false;
1470        }
1471        if($("#si_country").val().search(/\S/)==-1){
1472            if($("#si_country").parent('div.form-group').find('label.error').length==0){
1473                $("#si_country").after('<label class="error top-arrow">Please choose your country.</label>');
1474                err_cnt++;
1475            }
1476            return false;
1477        }
1478
1479        if(err_cnt>0){
1480            if($("#shippingFieldsHolder").hasClass('d-none')) $("#shippingFieldsHolder").removeClass('d-none');
1481        }else{
1482            /*$("html, body").animate({
1483                scrollTop: $("#billingFieldsHolder").offset().top
1484            }, 800);*/
1485            $("#shipAddrHead").trigger('click');
1486            $("#billAddrHead").attr('data-bs-target','#BillingCollapse').trigger('click');
1487        }
1488    });
1489
1490    $(document).on('click','#continueBilling',function(){
1491        $("#billingFieldsHolder").find('label.error').remove();
1492        var err_cnt = 0;
1493
1494        if($("#bi_firstName").val().search(/\S/)==-1){
1495            if($("#bi_firstName").parent('div.form-group').find('label.error').length==0){
1496                $("#bi_firstName").after('<label class="error top-arrow">Please enter your first name.</label>');
1497                err_cnt++;
1498            }
1499            return false;
1500        }
1501        if($("#bi_lastName").val().search(/\S/)==-1){
1502            if($("#bi_lastName").parent('div.form-group').find('label.error').length==0){
1503                $("#bi_lastName").after('<label class="error top-arrow">Please enter your last name.</label>');
1504                err_cnt++;
1505            }
1506            return false;
1507        }
1508        if($("#bi_email").val().search(/\S/)==-1 || emailRegex.test($("#bi_email").val())!==true){
1509            if($("#bi_email").parent('div.form-group').find('label.error').length==0){
1510                $("#bi_email").after('<label class="error top-arrow">Please enter valid email address.</label>');
1511                err_cnt++;
1512            }
1513            return false;
1514        }
1515        if($("#bi_phone").val().search(/\S/)==-1){
1516            if($("#bi_phone").parent('div.form-group').find('label.error').length==0){
1517                $("#bi_phone").after('<label class="error top-arrow">Please enter your phone number.</label>');
1518                err_cnt++;
1519            }
1520            return false;
1521        }
1522        if($("#bi_address1").val().search(/\S/)==-1){
1523            if($("#bi_address1").parent('div.form-group').find('label.error').length==0){
1524                $("#bi_address1").after('<label class="error top-arrow">Please enter your billing address.</label>');
1525                err_cnt++;
1526            }
1527            return false;
1528        }
1529        if($("#bi_city").val().search(/\S/)==-1){
1530            if($("#bi_city").parent('div.form-group').find('label.error').length==0){
1531                $("#bi_city").after('<label class="error top-arrow">Please enter your city.</label>');
1532                err_cnt++;
1533            }
1534            return false;
1535        }
1536        if($("#bi_state").val().search(/\S/)==-1){
1537            if($("#bi_state").parent('div.form-group').find('label.error').length==0){
1538                $("#bi_state").after('<label class="error top-arrow">Please choose your state.</label>');
1539                err_cnt++;
1540            }
1541            return false;
1542        }
1543        if($("#bi_postalCode").val().search(/\S/)==-1){
1544            if($("#bi_postalCode").parent('div.form-group').find('label.error').length==0){
1545                $("#bi_postalCode").after('<label class="error top-arrow">Please enter your postal code.</label>');
1546                err_cnt++;
1547            }
1548            return false;
1549        }
1550        if($("#bi_country").val().search(/\S/)==-1){
1551            if($("#bi_country").parent('div.form-group').find('label.error').length==0){
1552                $("#bi_country").after('<label class="error top-arrow">Please choose your country.</label>');
1553                err_cnt++;
1554            }
1555            return false;
1556        }
1557
1558        if(err_cnt>0){
1559            if($("#billingFieldsHolder").hasClass('d-none')) $("#billingFieldsHolder").removeClass('d-none');
1560        }else{
1561            /*$("html, body").animate({
1562                scrollTop: $("div.payment_method").offset().top
1563            }, 800);*/
1564
1565            $("#billAddrHead").trigger('click');
1566            $("#paymentHead").attr('data-bs-target','#PaymentCollapse').trigger('click');
1567        }
1568    });
1569
1570    $(document).on('change','#si_state',function(){
1571        if($(this).val().search(/\S/)!=-1){
1572            $(this).after('<i class="fa fa-spinner fa-lg fa-spin ajax-spinner" aria-hidden="true"></i>');
1573            $.ajax({
1574                type: 'POST',
1575                url: baseURL+'ajax/cart-sales-tax',
1576                data: {'checkout':$(".checkout-fields").serializeArray(),'ship_state':$(this).val()},
1577                dataType:"json",
1578                cache: false,
1579                headers: {
1580                    "X-CSRF-TOKEN": $('input[name*="csrf"]').val() // CSRF token in header
1581                },
1582                /*beforeSend: function() {
1583                    $("div.signin_wrap").children("div.loader_wrap").show();
1584                },*/
1585                success: function(resp){
1586                    if(resp!=''){
1587                        var respObj = resp;
1588                        if(resp.status=='success'){
1589                            $("#si_state").parent('div.form-group').find('i.ajax-spinner').remove();
1590                            //$(location).attr('href',CUR_PAGE_URL);
1591                            $(location).attr('href',baseURL+'cart/checkout');
1592                            return true;
1593                        }
1594                    }
1595                }
1596            });
1597        }
1598    });
1599
1600    $(document).on('click','#applyDiscountCoupon',function(){
1601        if($("#coCouponCode").val().search(/\S/)!=-1){
1602            $("#coCouponCode").after('<i class="fa fa-spinner fa-lg fa-spin ajax-spinner" aria-hidden="true"></i>');
1603            $.ajax({
1604                type: 'POST',
1605                url: baseURL+'ajax/cart-apply-coupon',
1606                data: {'checkout':$(".checkout-fields").serializeArray(),'coupon_code':$("#coCouponCode").val()},
1607                dataType:"json",
1608                cache: false,
1609                headers: {
1610                    "X-CSRF-TOKEN": $('input[name*="csrf"]').val() // CSRF token in header
1611                },
1612                /*beforeSend: function() {
1613                    $("div.signin_wrap").children("div.loader_wrap").show();
1614                },*/
1615                success: function(resp){
1616                    if(resp!=''){
1617                        var respObj = resp;
1618                        if(resp.status=='success'){
1619                            $("#coCouponCode").parent('div.form-group').find('i.ajax-spinner').remove();
1620                            if($("#si_state").val().search(/\S/)!=-1){
1621                                $("#si_state").trigger('change');
1622                            }else{
1623                                $(location).attr('href',baseURL+'cart/checkout');
1624                            }
1625                        }else{
1626                            $(location).attr('href',baseURL+'cart/checkout'); 
1627                        }
1628                    }
1629                }
1630            });
1631        }
1632    });
1633
1634    $(document).on('click','#removeDiscountCoupon',function(){
1635        if($("#coCouponCode").val().search(/\S/)!=-1){
1636            $.ajax({
1637                type: 'POST',
1638                url: baseURL+'ajax/cart-remove-coupon',
1639                data: {'checkout':$(".checkout-fields").serializeArray(),'coupon_code':$("#coCouponCode").val()},
1640                dataType:"json",
1641                cache: false,
1642                headers: {
1643                    "X-CSRF-TOKEN": $('input[name*="csrf"]').val() // CSRF token in header
1644                },
1645                /*beforeSend: function() {
1646                    $("div.signin_wrap").children("div.loader_wrap").show();
1647                },*/
1648                success: function(resp){
1649                    if(resp!=''){
1650                        var respObj = resp;
1651                        if(resp.status=='success'){
1652                            $(location).attr('href',baseURL+'cart/checkout');
1653                        }
1654                    }
1655                }
1656            });
1657        }
1658    });
1659
1660    $(document).on('click','#btnPlaceOrder',function(){
1661        $("#frmCheckout").find('label.error').remove();
1662        var err_cnt = 0;
1663
1664        if($("#si_firstName").val().search(/\S/)==-1){
1665            if($("#si_firstName").parent('div.form-group').find('label.error').length==0){
1666                $("#si_firstName").after('<label class="error top-arrow">Please enter your first name.</label>');
1667                err_cnt++;
1668            }
1669            return false;
1670        }
1671        if($("#si_lastName").val().search(/\S/)==-1){
1672            if($("#si_lastName").parent('div.form-group').find('label.error').length==0){
1673                $("#si_lastName").after('<label class="error top-arrow">Please enter your last name.</label>');
1674                err_cnt++;
1675            }
1676            return false;
1677        }
1678        if($("#si_email").val().search(/\S/)==-1 || emailRegex.test($("#si_email").val())!==true){
1679            if($("#si_email").parent('div.form-group').find('label.error').length==0){
1680                $("#si_email").after('<label class="error top-arrow">Please enter valid email address.</label>');
1681                err_cnt++;
1682            }
1683            return false;
1684        }
1685        if($("#si_phone").val().search(/\S/)==-1){
1686            if($("#si_phone").parent('div.form-group').find('label.error').length==0){
1687                $("#si_phone").after('<label class="error top-arrow">Please enter your phone number.</label>');
1688                err_cnt++;
1689            }
1690            return false;
1691        }
1692        if($("#si_address1").val().search(/\S/)==-1){
1693            if($("#si_address1").parent('div.form-group').find('label.error').length==0){
1694                $("#si_address1").after('<label class="error top-arrow">Please enter your shipping address.</label>');
1695                err_cnt++;
1696            }
1697            return false;
1698        }
1699        if($("#si_city").val().search(/\S/)==-1){
1700            if($("#si_city").parent('div.form-group').find('label.error').length==0){
1701                $("#si_city").after('<label class="error top-arrow">Please enter your city.</label>');
1702                err_cnt++;
1703            }
1704            return false;
1705        }
1706        if($("#si_state").val().search(/\S/)==-1){
1707            if($("#si_state").parent('div.form-group').find('label.error').length==0){
1708                $("#si_state").after('<label class="error top-arrow">Please choose your state.</label>');
1709                err_cnt++;
1710            }
1711            return false;
1712        }
1713        if($("#si_postalCode").val().search(/\S/)==-1){
1714            if($("#si_postalCode").parent('div.form-group').find('label.error').length==0){
1715                $("#si_postalCode").after('<label class="error top-arrow">Please enter your postal code.</label>');
1716                err_cnt++;
1717            }
1718            return false;
1719        }
1720        if($("#si_country").val().search(/\S/)==-1){
1721            if($("#si_country").parent('div.form-group').find('label.error').length==0){
1722                $("#si_country").after('<label class="error top-arrow">Please choose your country.</label>');
1723                err_cnt++;
1724            }
1725            return false;
1726        }
1727        /*if($("#co_EventDate").val().search(/\S/)==-1){
1728            if($("#co_EventDate").parent('div.form-group').find('label.error').length==0){
1729                $("#co_EventDate").after('<label class="error top-arrow">Please enter your Event Details.</label>');
1730                err_cnt++;
1731            }
1732            return false;
1733        }*/
1734        if($("#bi_firstName").val().search(/\S/)==-1){
1735            if($("#bi_firstName").parent('div.form-group').find('label.error').length==0){
1736                $("#bi_firstName").after('<label class="error top-arrow">Please enter your first name.</label>');
1737                err_cnt++;
1738            }
1739            return false;
1740        }
1741        if($("#bi_lastName").val().search(/\S/)==-1){
1742            if($("#bi_lastName").parent('div.form-group').find('label.error').length==0){
1743                $("#bi_lastName").after('<label class="error top-arrow">Please enter your last name.</label>');
1744                err_cnt++;
1745            }
1746            return false;
1747        }
1748        if($("#bi_email").val().search(/\S/)==-1 || emailRegex.test($("#bi_email").val())!==true){
1749            if($("#bi_email").parent('div.form-group').find('label.error').length==0){
1750                $("#bi_email").after('<label class="error top-arrow">Please enter valid email address.</label>');
1751                err_cnt++;
1752            }
1753            return false;
1754        }
1755        if($("#bi_phone").val().search(/\S/)==-1){
1756            if($("#bi_phone").parent('div.form-group').find('label.error').length==0){
1757                $("#bi_phone").after('<label class="error top-arrow">Please enter your phone number.</label>');
1758                err_cnt++;
1759            }
1760            return false;
1761        }
1762        if($("#bi_address1").val().search(/\S/)==-1){
1763            if($("#bi_address1").parent('div.form-group').find('label.error').length==0){
1764                $("#bi_address1").after('<label class="error top-arrow">Please enter your billing address.</label>');
1765                err_cnt++;
1766            }
1767            return false;
1768        }
1769        if($("#bi_city").val().search(/\S/)==-1){
1770            if($("#bi_city").parent('div.form-group').find('label.error').length==0){
1771                $("#bi_city").after('<label class="error top-arrow">Please enter your city.</label>');
1772                err_cnt++;
1773            }
1774            return false;
1775        }
1776        if($("#bi_state").val().search(/\S/)==-1){
1777            if($("#bi_state").parent('div.form-group').find('label.error').length==0){
1778                $("#bi_state").after('<label class="error top-arrow">Please choose your state.</label>');
1779                err_cnt++;
1780            }
1781            return false;
1782        }
1783        if($("#bi_postalCode").val().search(/\S/)==-1){
1784            if($("#bi_postalCode").parent('div.form-group').find('label.error').length==0){
1785                $("#bi_postalCode").after('<label class="error top-arrow">Please enter your postal code.</label>');
1786                err_cnt++;
1787            }
1788            return false;
1789        }
1790        if($("#bi_country").val().search(/\S/)==-1){
1791            if($("#bi_country").parent('div.form-group').find('label.error').length==0){
1792                $("#bi_country").after('<label class="error top-arrow">Please choose your country.</label>');
1793                err_cnt++;
1794            }
1795            return false;
1796        }
1797        if($(".payment-method:checked").val()=='CreditCard' && $(".exist-card-token").length>0 && $(".exist-card-token:checked").length==0){
1798            if($("#CreditCard").find('label.error').length==0){
1799                $("#nounce").after('<label class="error top-arrow">Please choose payment option.</label>');
1800                err_cnt++;
1801            }
1802            return false;
1803        }
1804        if($(".payment-method:checked").val()=='PayPal' && $(".exist-paypal-token").length>0 && $(".exist-paypal-token:checked").length==0){
1805            if($("#Paypal").find('label.error').length==0){
1806                $("#new_paypal").before('<label class="error top-arrow">Please choose PayPal account.</label>');
1807                err_cnt++;
1808            }
1809            return false;
1810        }
1811        if($("#coWhoHelped").val().search(/\S/)==-1){
1812            if($("#coWhoHelped").parent('div.form-group').find('label.error').length==0){
1813                $("#coWhoHelped").after('<label class="error top-arrow">Please choose who helped you.</label>');
1814                err_cnt++;
1815            }
1816            return false;
1817        }
1818        if(err_cnt==0){
1819            var returns = HostedFieldsValidation();
1820            if(returns){
1821			    $("#frmCheckout").find('label.error').remove();
1822                if(!$("#btnPlaceOrder").hasClass('disabled')) $("#btnPlaceOrder").addClass('disabled');
1823                $("div.checkout_section").find("div.loader_wrap").show();
1824                if($(".payment-method:checked").val()=='CreditCard' && $(".exist-card-token:checked").val()=='new'){
1825                    setTimeout(function(){
1826                        $("#frmCheckout").attr('action','/cart/placeorder').submit();
1827                    },800);
1828                }else if($(".payment-method:checked").val()=='PayPal' && $(".exist-paypal-token:checked").val()=='new'){
1829                    setTimeout(function(){
1830                        $("#frmCheckout").attr('action','/cart/placeorder').submit();
1831                    },800);
1832                }else{
1833                    $("#frmCheckout").attr('action','/cart/placeorder').submit();
1834                }
1835            }
1836        }
1837    });
1838
1839    $(document).on('click','#submitGuest',function(){
1840        $("#Guest").find('label.error').remove();
1841        err_cnt = 0;
1842        if($("#guestEmail").val().search(/\S/)==-1 || emailRegex.test($("#guestEmail").val())!==true){
1843            if($("#guestEmail").parent('div.form-group').find('label.error').length==0){
1844                $("#guestEmail").after('<label class="error top-arrow">Please enter valid email address.</label>');
1845                err_cnt++;
1846            }
1847            return false;
1848        }
1849        if($("#guestConfEmail").val().search(/\S/)==-1 || emailRegex.test($("#guestConfEmail").val())!==true){
1850            if($("#guestConfEmail").parent('div.form-group').find('label.error').length==0){
1851                $("#guestConfEmail").after('<label class="error top-arrow">Please enter valid email address.</label>');
1852                err_cnt++;
1853            }
1854            return false;
1855        }
1856        if($("#guestEmail").val().search(/\S/)!=-1 && $("#guestConfEmail").val().search(/\S/)!=-1 && $("#guestEmail").val()!=$("#guestConfEmail").val()){
1857            if($("#guestConfEmail").parent('div.form-group').find('label.error').length==0){
1858                $("#guestConfEmail").after('<label class="error top-arrow">Please confirm your email address.</label>');
1859                err_cnt++;
1860            }
1861            return false;
1862        }
1863        if($("#guestPhone").val().search(/\S/)==-1){
1864            if($("#guestPhone").parent('div.form-group').find('label.error').length==0){
1865                $("#guestPhone").after('<label class="error top-arrow">Please enter your phone number.</label>');
1866                err_cnt++;
1867            }
1868            return false;
1869        }
1870
1871        if(err_cnt==0){
1872            $("#Signup").find('label.error').remove();
1873            $.ajax({
1874				type: 'POST',
1875				url: baseURL+'ajax/create-guest-account',
1876				data: {'frmData':$(".guest-fields").serializeArray()},
1877				dataType:"json",
1878				cache: false,
1879                headers: {
1880                    "X-CSRF-TOKEN": $('input[name*="csrf"]').val() // CSRF token in header
1881                },
1882				/*beforeSend: function() {
1883					$("div.signin_wrap").children("div.loader_wrap").show();
1884				},*/
1885				success: function(resp){
1886					if(resp!=''){
1887						var respObj = resp;
1888						if(resp.status=='error'){
1889							/*$("div.signin_wrap").children("div.loader_wrap").hide();
1890							$("#loginEmail,#loginPass").val('');
1891							$("#loginEmail").focus();
1892							$("#frmLogin").before('<div class="alert alert-danger d-flex align-items-center" role="alert"><i class="fa fa-exclamation-circle me-2 fa-2x"></i><div>'+authObj.message+'</div></div>');
1893							$('html, body').animate({
1894								scrollTop: 0
1895							}, 1000);
1896							setTimeout(function(){
1897								$("div.alert").fadeOut(8000,function(){
1898									$("div.alert").remove();
1899								});
1900							},2000);
1901							return false;*/							
1902						}else if(resp.status=='success'){
1903							//$(location).attr('href',CUR_PAGE_URL);
1904							$(location).attr('href',baseURL+'cart/checkout');
1905							return true;
1906						}
1907					}
1908				}
1909			});
1910        }
1911    });
1912
1913    $(document).on('click','#submitUserSignup',function(){
1914        $("#Signup").find('label.error').remove();
1915        err_cnt = 0;
1916        if($("#su_firstName").val().search(/\S/)==-1){
1917            if($("#su_firstName").parent('div.form-group').find('label.error').length==0){
1918                $("#su_firstName").after('<label class="error top-arrow">Please enter your first name.</label>');
1919                err_cnt++;
1920            }
1921            return false;
1922        }
1923        if($("#su_lastName").val().search(/\S/)==-1){
1924            if($("#su_lastName").parent('div.form-group').find('label.error').length==0){
1925                $("#su_lastName").after('<label class="error top-arrow">Please enter your last name.</label>');
1926                err_cnt++;
1927            }
1928            return false;
1929        }
1930        if($("#su_email").val().search(/\S/)==-1 || emailRegex.test($("#su_email").val())!==true){
1931            if($("#su_email").parent('div.form-group').find('label.error').length==0){
1932                $("#su_email").after('<label class="error top-arrow">Please enter valid email address.</label>');
1933                err_cnt++;
1934            }
1935            return false;
1936        }
1937        if($("#su_phone").val().search(/\S/)==-1){
1938            if($("#su_phone").parent('div.form-group').find('label.error').length==0){
1939                $("#su_phone").after('<label class="error top-arrow">Please enter your phone number.</label>');
1940                err_cnt++;
1941            }
1942            return false;
1943        }
1944
1945        if(err_cnt==0){
1946            $("#Signup").find('label.error').remove();
1947            $.ajax({
1948				type: 'POST',
1949				url: baseURL+'ajax/create-account',
1950				data: {'frmData':$(".signup-fields").serializeArray()},
1951				dataType:"json",
1952				cache: false,
1953                headers: {
1954                    "X-CSRF-TOKEN": $('input[name*="csrf"]').val() // CSRF token in header
1955                },
1956				success: function(resp){
1957					if(resp!=''){
1958						var respObj = resp;
1959						if(resp.status=='error'){
1960							/*$("div.signin_wrap").children("div.loader_wrap").hide();
1961							$("#loginEmail,#loginPass").val('');
1962							$("#loginEmail").focus();
1963							$("#frmLogin").before('<div class="alert alert-danger d-flex align-items-center" role="alert"><i class="fa fa-exclamation-circle me-2 fa-2x"></i><div>'+authObj.message+'</div></div>');
1964							$('html, body').animate({
1965								scrollTop: 0
1966							}, 1000);
1967							setTimeout(function(){
1968								$("div.alert").fadeOut(8000,function(){
1969									$("div.alert").remove();
1970								});
1971							},2000);
1972							return false;*/							
1973						}else if(resp.status=='success'){
1974							//$(location).attr('href',CUR_PAGE_URL);
1975							$(location).attr('href',baseURL+'cart/checkout');
1976							return true;
1977						}
1978					}
1979				}
1980			});
1981        }
1982    });
1983
1984    $(document).on('click','#existUserLogin',function(){
1985        $("#ExistingUser").find('label.error').remove();
1986        err_cnt = 0;
1987        if($("#existLoginUser").val().search(/\S/)==-1 || emailRegex.test($("#existLoginUser").val())!==true){
1988            if($("#existLoginUser").parent('div.form-group').find('label.error').length==0){
1989                $("#existLoginUser").after('<label class="error top-arrow">Please enter valid login email.</label>');
1990                err_cnt++;
1991            }
1992            return false;
1993        }
1994        if($("#existLoginPass").val().search(/\S/)==-1){
1995            if($("#existLoginPass").parent('div.form-group').find('label.error').length==0){
1996                $("#existLoginPass").after('<label class="error top-arrow">Please enter account password.</label>');
1997                err_cnt++;
1998            }
1999            return false;
2000        }
2001
2002        if(err_cnt==0){
2003            $("#ExistingUser").find('label.error').remove();
2004            $.ajax({
2005				type: 'POST',
2006				url: baseURL+'ajax/authorize-login',
2007				data: {'login_email':$("#existLoginUser").val(),'login_pass':$("#existLoginPass").val()},
2008				dataType:"json",
2009				cache: false,
2010                headers: {
2011                    "X-CSRF-TOKEN": $('input[name*="csrf"]').val() // CSRF token in header
2012                },
2013				/*beforeSend: function() {
2014					$("div.signin_wrap").children("div.loader_wrap").show();
2015				},*/
2016				success: function(auth){
2017					if(auth!=''){
2018						var authObj = auth;
2019						if(authObj.status=='error'){
2020							/*$("div.signin_wrap").children("div.loader_wrap").hide();
2021							$("#loginEmail,#loginPass").val('');
2022							$("#loginEmail").focus();
2023							$("#frmLogin").before('<div class="alert alert-danger d-flex align-items-center" role="alert"><i class="fa fa-exclamation-circle me-2 fa-2x"></i><div>'+authObj.message+'</div></div>');
2024							$('html, body').animate({
2025								scrollTop: 0
2026							}, 1000);
2027							setTimeout(function(){
2028								$("div.alert").fadeOut(8000,function(){
2029									$("div.alert").remove();
2030								});
2031							},2000);
2032							return false;*/							
2033						}else if(authObj.status=='success'){
2034							//$(location).attr('href',CUR_PAGE_URL);
2035							$(location).attr('href',baseURL+'cart/checkout');
2036							return true;
2037						}
2038					}
2039				}
2040			});
2041        }
2042    });
2043	
2044	var _getCookie = function(name) {
2045		const nameEQ = name + "=";
2046		const ca = document.cookie.split(';');
2047	    for (let i = 0; i < ca.length; i++) {
2048			let c = ca[i];
2049			while(c.charAt(0)===' ') c = c.substring(1, c.length);
2050			if(c.indexOf(nameEQ)===0) return c.substring(nameEQ.length, c.length);
2051		}
2052		return null;
2053	};
2054
2055	var _setCookie = function(name, value, days){
2056		let expires = "";
2057		if(days){
2058			const date = new Date();
2059			date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
2060			expires = "; expires=" + date.toGMTString();
2061		}
2062		document.cookie = name + "=" + (value || "") + expires + "; path=/; SameSite=Lax;";
2063	};
2064	
2065	var _deleteCookie = function(name){
2066		 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/';
2067	};
2068	
2069	var _getNewsLetterModal = function(){
2070		var modal = $('#commonModal');
2071		$.ajax({
2072			url: baseURL+'ajax/content',
2073			method: 'POST',
2074			data: {'action':'newsletter'},
2075			success: function(response){
2076				if(response.search(/\S/)!==-1){
2077					response = $.parseJSON(response);
2078					if(typeof response.redirect!=='undefined' && response.redirect) window.location.replace(response.redirect);
2079					else if(response.view){
2080						if(!_getCookie('newsletter')) _setCookie('newsletter','true',0);
2081						modal.find('.modal-header').addClass('d-none').after('<button type="button" class="btn-close position-absolute" data-bs-dismiss="modal" aria-label="Close"><i class="fas fa-times text-white"></i></button>');
2082						modal.find('.modal-dialog').addClass('modal-dialog-centered onload_newsletter modal-lg');
2083						modal.find('.modal-body').html(response.view);
2084						modal.modal('show');
2085					}
2086					return false;
2087				}
2088			},
2089			error: function() {
2090				if(!_getCookie('newsletter')) _getNewsLetterModal();
2091			}
2092		});
2093	}
2094	
2095	setTimeout(function(){
2096		if(!_getCookie('newsletter')) _getNewsLetterModal();
2097	},5000);
2098	
2099	$(document).on('click','#subscribeMe:enabled',function(){
2100		let flag = true;
2101		let form_data = new FormData();
2102		if($('#commonModal:visible').find(':input[name!=""]:enabled').length>=1){
2103			$('label.error').remove();
2104			$('#commonModal:visible').find(':input[name!=""]:enabled').each(function(){
2105				if($(this).hasClass('mandatory')){
2106					if(($(this).is('select') && !$(this).val()) || (!$(this).is('select') && $(this).val().search(/\S/)===-1)){
2107						$(this).after('<label class="error top-arrow">'+($(this).is('[placeholder]')?$(this).attr('placeholder').toLowerCase():'This field')+' is required.</label>');
2108						flag = false;
2109					}else if($(this).is('[name]') && !$(this).is(':checkbox') && !$(this).is(':radio')){
2110						if($(this).attr('type')==='email' && !emailRegex.test($(this).val())){
2111							$(this).after('<label class="error top-arrow">Please enter a valid email.</label>');
2112							flag = false;
2113						}else form_data.append($(this).attr('name'),$(this).val());
2114					}else if($(this).is('[name]') && $(this).is(':checked') && ($(this).is(':checkbox') || $(this).is(':radio'))) form_data.append($(this).attr('name'),$(this).val());
2115				}
2116				else if($(this).is('[name]') && !$(this).is(':checkbox') && !$(this).is(':radio')) form_data.append($(this).attr('name'),$(this).val());
2117				else if($(this).is('[name]') && $(this).is(':checked') && ($(this).is(':checkbox') || $(this).is(':radio'))) form_data.append($(this).attr('name'),$(this).val());
2118			});
2119		}
2120		if(flag){
2121			$('label.error').remove();
2122			$.ajax({
2123				type       :'POST',
2124				url        :baseURL+'ajax/subscription',
2125				data       :form_data,
2126				cache      :false,
2127				contentType:false,
2128				processData:false,
2129				context    :this,
2130				success: function(resp){
2131					if(resp.search(/\S/)!=-1){
2132						resp = $.parseJSON(resp);
2133						if(resp.message){
2134							if(resp.status){
2135								$(this).parent().replaceWith(resp.message);
2136						        if(!_getCookie('newsletter')) _setCookie('newsletter','true',0);
2137								setTimeout(function(){
2138									$('#commonModal').modal('hide');
2139								},3000);
2140							}else{
2141								if(resp.field && $(this).parent().find(':input[name="'+resp.field+'"]').length) $(this).parent().find(':input[name="'+resp.field+'"]').after('<label class="error top-arrow">'+resp.message+'</label>'); 
2142								else console.log(resp.message);
2143							}	
2144						}	
2145					}
2146				}
2147			});	
2148		}else _deleteCookie('newsletter');
2149		return false;
2150	});
2151			
2152    $(document).on('click','.toggle-block',function(){
2153        let block_elem_id = $(this).data('target');
2154        $(block_elem_id).slideToggle();
2155        $(this).toggleClass('arrow-up');
2156    });
2157
2158    $(document).on('click','.continueStep1',function(){
2159        let err_cnt = 0;
2160        let dec_id = $(".product-decoration:checked").val();
2161        $("#PMTab_"+dec_id).find("label.error").remove();
2162
2163        if($("#prodQuantity_"+dec_id).val().search(/\S/)==-1){
2164            $("#prodQuantity_"+dec_id).after('<label class="error top-arrow">Please enter product quantity.</label>');
2165            err_cnt++;
2166        }
2167        if(parseInt($("#prodQuantity_"+dec_id).val()) < parseInt($("#minQuantity_"+dec_id).val())){
2168            $("#prodQuantity_"+dec_id).after('<label class="error top-arrow">Quantity cannot be less than '+parseInt($("#minQuantity_"+dec_id).val())+' pieces.</label>');
2169            err_cnt++;
2170        }
2171		if($('#PMTab_'+dec_id).find('.select_color_wrap').length){
2172			$('#PMTab_'+dec_id).find('.select_color_wrap').each(function(){
2173                let colorArr = [];
2174				if($(this).find('input[type="checkbox"]').length){
2175					let panel_id = $(this).find('.color-check:first').data('panel-id')?$(this).find('.color-check:first').data('panel-id'):0;
2176					$(this).find('.color-check:checked').each(function(){
2177						panel_id = $(this).data('panel-id')?$(this).data('panel-id'):0;
2178						if($(this).data('color-name')) colorArr.push($(this).data('color-name'));
2179					}); 
2180					if(!colorArr.length){
2181						let label = 'product color';
2182						if(panel_id) label = $(this).find('#selectColorList_'+dec_id+'_'+panel_id).parent().text().trim().toLowerCase();
2183						else label = $(this).find('#selectColorList_'+dec_id).parent().text().trim().toLowerCase();
2184						$(this).find("div.select_color").after('<label class="error top-arrow">Please '+label+'.</label>');
2185						err_cnt++;
2186					}
2187				}
2188			});
2189		}
2190        if($(".fields-"+dec_id).length > 0){
2191            $(".fields-"+dec_id).each(function(){
2192                let field_name = $(this).data('field-name');
2193
2194                if($(this).val().search(/\S/)==-1){
2195                    $(this).after('<label class="error top-arrow">Please '+field_name+'.</label>');
2196                    err_cnt++;
2197                }
2198            });
2199        }
2200        if($("#colorDrop_"+dec_id+":visible").length > 0){
2201            let selectInkColors = $('#inkColors_'+dec_id).val();
2202            if(!selectInkColors || selectInkColors.search(/\S/)==-1){
2203                $("#PMTab_"+dec_id).find("div.choose_color_box").after('<label class="error top-arrow">Please choose ink color.</label>');
2204                err_cnt++;
2205            }
2206        }
2207        if($("#colorDrop_"+dec_id+":visible").length > 0){
2208            let color_cnt = 0;
2209            if($("#field_35").length > 0 && $("#field_35").val().search(/\S/)!=-1){
2210                color_cnt = $("#field_35").find('option:selected').data('color-count');
2211            }else color_cnt = 1;
2212
2213            let selectInkColors = $('#inkColors_'+dec_id).val();
2214            if(selectInkColors.search(/\S/)!==-1 && parseInt($("#colorDrop_"+dec_id).find('input.ink-color-check:checked').length) > parseInt(color_cnt)){
2215                $("#PMTab_"+dec_id).find("div.choose_color_box").after('<label class="error top-arrow">Sorry, cannot select ink colors more than '+parseInt(color_cnt)+'.</label>');
2216                err_cnt++;
2217            }else if(selectInkColors.search(/\S/)!==-1 && parseInt($("#colorDrop_"+dec_id).find('input.ink-color-check:checked').length) < parseInt(color_cnt)){
2218                $("#PMTab_"+dec_id).find("div.choose_color_box").after('<label class="error top-arrow">Sorry, you must choose '+parseInt(color_cnt)+' colors.</label>');
2219                err_cnt++;
2220            }
2221
2222            if($("#pmsColorCheck_"+dec_id+"_98:checked").length==1 && $("#pmsColors_"+dec_id+"_98").val().search(/\S/)==-1){
2223                $("#PMTab_"+dec_id).find("div.choose_color_box").after('<label class="error top-arrow">Please input PMS color I.</label>');
2224                $("#inkcolor_box_"+dec_id).trigger('click');
2225                $("#pmsColors_"+dec_id+"_98").focus();
2226                err_cnt++;
2227            }
2228            else if($("#pmsColorCheck_"+dec_id+"_99:checked").length==1 && $("#pmsColors_"+dec_id+"_99").val().search(/\S/)==-1){
2229                $("#PMTab_"+dec_id).find("div.choose_color_box").after('<label class="error top-arrow">Please input PMS color II.</label>');
2230                $("#inkcolor_box_"+dec_id).trigger('click');
2231                $("#pmsColors_"+dec_id+"_99").focus();
2232                err_cnt++;
2233            }
2234            else if($("#pmsColorCheck_"+dec_id+"_100:checked").length==1 && $("#pmsColors_"+dec_id+"_100").val().search(/\S/)==-1){
2235                $("#PMTab_"+dec_id).find("div.choose_color_box").after('<label class="error top-arrow">Please input PMS color III.</label>');
2236                $("#inkcolor_box_"+dec_id).trigger('click');
2237                $("#pmsColors_"+dec_id+"_100").focus();
2238                err_cnt++;
2239            }
2240            else if($("#pmsColorCheck_"+dec_id+"_101:checked").length==1 && $("#pmsColors_"+dec_id+"_101").val().search(/\S/)==-1){
2241                $("#PMTab_"+dec_id).find("div.choose_color_box").after('<label class="error top-arrow">Please input PMS color IV.</label>');
2242                $("#inkcolor_box_"+dec_id).trigger('click');
2243                $("#pmsColors_"+dec_id+"_101").focus();
2244                err_cnt++;
2245            }
2246        }
2247
2248        if(err_cnt==0){
2249            $("#blockHeadingStep1").addClass('toggle-block');
2250            $("#blockHeadingStep1").toggleClass('arrow-up');
2251            $("#blockBodyStep1").slideToggle();
2252            if(!$("#productionShippingBlock").hasClass('d-none')){
2253                if(!$("#blockBodyStep2").is(":visible")) $("#blockBodyStep2").slideDown();
2254                $("#blockHeadingStep2").toggleClass('arrow-up');
2255            }
2256            if(dec_id==15){
2257                $("#btnAddtoCart").removeClass('disabled');
2258            }
2259        }else{
2260            setTimeout(function(){
2261                $("label.error").fadeOut(8000,function(){
2262                    $("label.error").remove();
2263                });
2264            },2000);
2265            return false;
2266        }
2267    });
2268
2269    $(document).on('click','#continueStep2',function(){
2270        let err_cnt = 0;
2271        let dec_id = $(".product-decoration:checked").val();
2272        $("#blockBodyStep2").find("label.error").remove();
2273        if($("#production_"+dec_id).length > 0 && $("#production_"+dec_id).val().search(/\S/)==-1){
2274            $("#production_"+dec_id).after('<label class="error top-arrow">Please select Production Time.</label>');
2275            err_cnt++;
2276        }else if(!$("#production_"+dec_id).length){
2277			if($('#production_json_'+dec_id).length){
2278				let data = $('#production_json_'+dec_id).val();
2279				let applicable = '';
2280				if($('select#field_35.fields-'+dec_id).length) applicable = $('select#field_35.fields-'+dec_id).find('option:selected').data('production');
2281				data = $.parseJSON(data);
2282				$('#production_json_'+dec_id).before(
2283				  $('<select/>', {
2284					id: 'production_'+dec_id,
2285					name: 'production',
2286					class: 'production form-control price-params params-'+dec_id+' cart-fields-'+dec_id
2287				  }).append(
2288				    $('<option/>',{text:'Production Time', disabled: true, selected: true }),
2289					$.map(data, d => applicable.indexOf(d.id)===-1?null:$('<option/>', {
2290					  value: d.id,
2291					  'data-minimum': d.minimum,
2292					  text: d.name + (
2293						d.price > 0
2294						  ? ' +$' + Number(d.price).toFixed(2) +
2295							(d.multiple > 0 ? ' / ' + d.multiple : '')
2296						  : ''
2297					  )
2298					}))
2299				  )
2300				);
2301                $("#production_"+dec_id).after('<label class="error top-arrow">Please select Production Time.</label>');
2302            }
2303			err_cnt++;
2304		}	
2305        if($("#productVirtualProof").is(":visible") && $("#productVirtualProof").val().search(/\S/)==-1){
2306            $("#productVirtualProof").after('<label class="error top-arrow">Please select Virtual Proof.</label>');
2307            err_cnt++;
2308        }else if(!$("#productVirtualProof").length) err_cnt++;
2309        if($("#productShippingZip").val().search(/\S/)==-1){
2310            $("#productShippingZip").after('<label class="error top-arrow">Please enter Shipping Zip.</label>');
2311            err_cnt++;
2312        }
2313        if($("#productShipMethod").val().search(/\S/)==-1){
2314            $("#productShipMethod").after('<label class="error top-arrow">Please select Shipping Method.</label>');
2315            err_cnt++;
2316        }
2317
2318        if(err_cnt==0){
2319            if(!$("#productShippingZip").hasClass('cart-fields-'+dec_id)) $("#productShippingZip").addClass('cart-fields-'+dec_id);
2320            if(!$("#productShipMethod").hasClass('cart-fields-'+dec_id)) $("#productShipMethod").addClass('cart-fields-'+dec_id);
2321
2322            $("#blockHeadingStep2").addClass('toggle-block');
2323            $("#blockHeadingStep2").toggleClass('arrow-up');
2324            $("#blockBodyStep2").slideToggle();
2325            if(!$("#artworkBlock").hasClass('d-none')){
2326                if(!$("#blockBodyStep3").is(":visible")) $("#blockBodyStep3").slideToggle();
2327                $("#blockHeadingStep3").toggleClass('arrow-up');
2328            }
2329            $("#btnAddtoCart").removeClass('disabled');
2330        }else{
2331            setTimeout(function(){
2332                $("label.error").fadeOut(8000,function(){
2333                    $("label.error").remove();
2334                });
2335            },2000);
2336            return false;
2337        }
2338    });
2339
2340    /*$(document).on('click','#continueStep3',function(){
2341        let err_cnt = 0;
2342        let dec_id = $(".product-decoration:checked").val();
2343        let artOption = $(".art-option:checked").val();
2344        $("#blockBodyStep3").find("label.error").remove();
2345
2346        if(artOption=='upload'){
2347            if($("#artFile_1").val().search(/\S/)==-1 && $("#artFile_2").val().search(/\S/)==-1 && $("#artFile_3").val().search(/\S/)==-1){
2348                $("div.art_work_info").after('<label class="error top-arrow">Please choose your artwork file.</label>');
2349                err_cnt++;
2350                return false;
2351            }
2352        }
2353        if(artOption=='repeat'){
2354            if($("#artInfo").val().search(/\S/)==-1){
2355                $("#artInfo").after('<label class="error top-arrow">
2355Please enter your art / order instructions.</label>');
2356                err_cnt++;
2357                return false;
2358            }
2359        }
2360
2361        if(err_cnt==0){
2362            if(artOption=='upload'){
2363                if(!$("#UploadArt").hasClass('cart-fields-'+dec_id)) $("#UploadArt").addClass('cart-fields-'+dec_id);
2364                $("#artFile_1,#artFile_2,#artFile_3").addClass('cart-fields-'+dec_id);
2365                //$("#artOfOrder").removeClass('cart-fields-'+dec_id);
2366            }else if(artOption=='repeat'){
2367                if(!$("#RepeatArt").hasClass('cart-fields-'+dec_id)) $("#RepeatArt").addClass('cart-fields-'+dec_id);
2368                //$("#artOfOrder").addClass('cart-fields-'+dec_id);
2369                $("#artFile_1,#artFile_2,#artFile_3").removeClass('cart-fields-'+dec_id);
2370            }else{
2371                if(!$("#EmailArt").hasClass('cart-fields-'+dec_id)) $("#EmailArt").addClass('cart-fields-'+dec_id);  
2372            }
2373            $("#artInfo").addClass('cart-fields-'+dec_id);
2374
2375            $("#blockHeadingStep3").addClass('toggle-block');
2376            $("#blockHeadingStep3").toggleClass('arrow-up');
2377            $("#blockBodyStep3").slideToggle();
2378            $("#btnAddtoCart").removeClass('disabled');
2379        }
2380        setTimeout(function(){
2381            $("label.error").fadeOut(8000,function(){
2382                $("label.error").remove();
2383            });
2384        },2000);
2385    });*/
2386
2387    $(document).on('click','#btnAddtoCart',function(){
2388        if($(this).hasClass('disabled')) return false;
2389        let err_cnt = 0;
2390        let dec_id = $(".product-decoration:checked").val();
2391        let artOption = $(".art-option:checked").val();
2392
2393        if(dec_id=='Sample'){
2394            if($("#prodQuantity_"+dec_id).val().search(/\S/)==-1){
2395                $("#prodQuantity_"+dec_id).after('<label class="error top-arrow">Please enter product quantity.</label>');
2396                err_cnt++;
2397            }
2398            if(parseInt($("#prodQuantity_"+dec_id).val()) < parseInt($("#minQuantity_"+dec_id).val())){
2399                $("#prodQuantity_"+dec_id).after('<label class="error top-arrow">Quantity cannot be less than '+parseInt($("#minQuantity_"+dec_id).val())+' pieces.</label>');
2400                err_cnt++;
2401            }
2402            if($(".color-"+dec_id).length > 0 && $(".color-"+dec_id+":checked").length==0){
2403                $("#SampleTab").find("div.color_slider").after('<label class="error top-arrow">Please choose product color.</label>');
2404                err_cnt++;
2405            }
2406            if($(".color-"+dec_id).length > 0 && $(".color-"+dec_id+":checked").length > parseInt($("#minQuantity_"+dec_id).val())){
2407                $("#SampleTab").find("div.color_slider").after('<label class="error top-arrow">Color selection cannot be greater than max quantity.</label>');
2408                err_cnt++;
2409            }
2410            if($(".color-"+dec_id).length > 0 && $(".color-"+dec_id+":checked").length==0){
2411                $("#SampleTab").find("div.color_slider").after('<label class="error top-arrow">Please choose product color.</label>');
2412                err_cnt++;
2413            }								  
2414        }
2415
2416        if(dec_id==15){
2417            if($("#production_"+dec_id).length > 0 && $("#production_"+dec_id).val().search(/\S/)==-1){
2418                $("#production_"+dec_id).after('<label class="error top-arrow">Please select Production Time.</label>');
2419                err_cnt++;
2420            }
2421            if($("#productVirtualProof").is(":visible") && $("#productVirtualProof").val().search(/\S/)==-1){
2422                $("#productVirtualProof").after('<label class="error top-arrow">Please select Virtual Proof.</label>');
2423                err_cnt++;
2424            }
2425            if($("#productShippingZip").val().search(/\S/)==-1){
2426                $("#productShippingZip").after('<label class="error top-arrow">Please enter Shipping Zip.</label>');
2427                err_cnt++;
2428            }
2429            if($("#productShipMethod").val().search(/\S/)==-1){
2430                $("#productShipMethod").after('<label class="error top-arrow">Please select Shipping Method.</label>');
2431                err_cnt++;
2432            }
2433        }
2434
2435        if($(".art-option:visible").length > 0 && artOption=='upload'){
2436            if($("#artFile_1").val().search(/\S/)==-1 && $("#artFile_2").val().search(/\S/)==-1 && $("#artFile_3").val().search(/\S/)==-1){
2437                $("div.art_work_info").after('<label class="error top-arrow">Please choose your artwork file.</label>');
2438                err_cnt++;
2439            }
2440        }
2441        if($(".art-option:visible").length > 0 && artOption=='repeat'){
2442            if($("#artInfoCommon").val().search(/\S/)==-1){
2443                $("#artInfoCommon").after('<label class="error top-arrow">
2443Please enter your art / order instructions.</label>');
2444                err_cnt++;
2445            }
2446        }
2447
2448        if(err_cnt==0){
2449            if(dec_id==15){
2450                if(!$("#productShippingZip").hasClass('cart-fields-'+dec_id)) $("#productShippingZip").addClass('cart-fields-'+dec_id);
2451                if(!$("#productShipMethod").hasClass('cart-fields-'+dec_id)) $("#productShipMethod").addClass('cart-fields-'+dec_id);
2452                if(!$("#noPrintInstHolder").find("#artInfoNoPrint").hasClass('cart-fields-'+dec_id)) $("#noPrintInstHolder").find("#artInfoNoPrint").addClass('cart-fields-'+dec_id);
2453            }
2454
2455            if($(".art-option:visible").length > 0){
2456                if(artOption=='upload'){
2457                    if(!$("#UploadArt").hasClass('cart-fields-'+dec_id)) $("#UploadArt").addClass('cart-fields-'+dec_id);
2458                    $("#artFile_1,#artFile_2,#artFile_3").addClass('cart-fields-'+dec_id);
2459                }else if(artOption=='repeat'){
2460                    if(!$("#RepeatArt").hasClass('cart-fields-'+dec_id)) $("#RepeatArt").addClass('cart-fields-'+dec_id);
2461                    $("#artFile_1,#artFile_2,#artFile_3").removeClass('cart-fields-'+dec_id);
2462                }else{
2463                    if(!$("#EmailArt").hasClass('cart-fields-'+dec_id)) $("#EmailArt").addClass('cart-fields-'+dec_id);  
2464                }
2465                $("#blockBodyStep3").find("#artInfoCommon").addClass('cart-fields-'+dec_id);
2466            }
2467			if($('#productShipMethod').length && $('#productShipMethod').val()){
2468			   let selection = $('#productShipMethod').find('option:selected');
2469			   if($('#deliveryDate').length){
2470				   let date = $('#deliveryDate').find('input.cost-params').val();
2471				   if(selection.is('[data-id]')){
2472					  date = selection.attr('data-id');
2473					  date = JSON.parse(window.atob(date));	
2474					  date = date.delivery.date+' '+date.delivery.time;     							  
2475				   }
2476				   else if(selection.is('[data-raw-etd]')) date = selection.attr('data-raw-etd');
2477				   else{
2478					   date = ((selection.is('[data-etd]'))?selection.attr('data-etd'):$('#deliveryDate').text());
2479					   const data = new Date(date);
2480					   const pad = (n) => n.toString().padStart(2, '0');
2481					   date = data.getFullYear()+'-' +pad(data.getMonth() + 1)+'-'+pad(data.getDate())+' '+pad(data.getHours())+':'+pad(data.getMinutes());
2482				   }
2483				   if(date!=='') $('#deliveryDate').find('input.cost-params').val(date);
2484			   }
2485			}
2486            $("#productFormHolder").find('div.loader_wrap').show();
2487            let product_id = $("#productId").val();
2488            $.ajax({
2489                type: 'POST',
2490                url: baseURL+'ajax/add-to-mcart',
2491                data: {'product_id':product_id,'decoration':dec_id,'unit_cost':$("#unitPrice_"+dec_id).val(),'cost_params':$(".cost-params").serializeArray(),'params':$(".cart-fields-"+dec_id).serializeArray(),'ship_zip':$("#productShippingZip").val(),'ship_method':$("#productShipMethod").val(),'cart_key':$("#cartKey").val()},
2492                success: function(resp){
2493                    if(resp.search(/\S/)!=-1){
2494                        _refreshMCart();
2495                        if(parseInt($("#cartKey").val())==0){
2496                            $("#cartCount").text(parseInt($("#cartCount").text())+1);
2497                        }
2498                        $("#productFormHolder").find('div.loader_wrap').hide();
2499                        _clearProductForm();
2500                    }
2501                }
2502            });
2503        }else{
2504            setTimeout(function(){
2505                $("label.error").fadeOut(8000,function(){
2506                    $("label.error").remove();
2507                });
2508            },2000);
2509            return false;
2510        }
2511    });
2512
2513    var _clearProductForm = function(){
2514        let dec_id = $(".product-decoration:checked").val();
2515		if($("#totalQuantity_"+dec_id).length) $("#totalQuantity_"+dec_id).text($("#minQuantity_"+dec_id).val()); 
2516        $("#prodQuantity_"+dec_id).val($("#minQuantity_"+dec_id).val());
2517        if($(".color-"+dec_id).length>0) $(".color-"+dec_id).prop('checked',false);
2518        if($(".panel-colors-"+dec_id).length>0) $(".panel-colors-"+dec_id).prop('checked',false);
2519        if($(".body-colors-"+dec_id).length>0) $(".body-colors-"+dec_id).prop('checked',false);
2520        if($(".fields-"+dec_id).length > 0){
2521            $(".fields-"+dec_id).each(function(){
2522                $(this).val('');
2523            });
2524        }
2525        if($("#inkColors").hasClass('cart-fields-'+dec_id)){
2526            $('#inkColors').multiselect('deselectAll', false);
2527            $('#inkColors').multiselect('updateButtonText');
2528        }
2529        if($("#production_"+dec_id).length > 0){
2530            $("#production_"+dec_id).val('');
2531        }
2532        $("#productVirtualProof").val('');
2533        $("#productShippingZip").val('');
2534        $("#productShipMethod").html('<option value="">Shipping Method</option>');
2535        $("#productShipMethod").val('');
2536        $("#UploadArt").prop('checked',true);
2537        $("#artFile_1,#artFile_2,#artFile_3").val('');
2538        $("#label_artworkUpload_1").find('a').remove().html('Upload <input type="hidden" name="artfile[]" id="artFile_1" class="form-control cart-fields" value="">');
2539        $("#label_artworkUpload_2").find('a').remove().html('Upload <input type="hidden" name="artfile[]" id="artFile_2" class="form-control cart-fields" value="">');
2540        $("#label_artworkUpload_3").find('a').remove().html('Upload <input type="hidden" name="artfile[]" id="artFile_3" class="form-control cart-fields" value="">');
2541
2542        if(!$("#delArtworkUpload_1").hasClass('d-none')) $("#delArtworkUpload_1").addClass('d-none');
2543        if(!$("#delArtworkUpload_2").hasClass('d-none')) $("#delArtworkUpload_2").addClass('d-none');
2544        if(!$("#delArtworkUpload_3").hasClass('d-none')) $("#delArtworkUpload_3").addClass('d-none');
2545        $("#artInfoNoPrint, #artInfoCommon").val('');
2546
2547        $("#blockHeadingStep1").removeClass('toggle-block');
2548        if(!$("#blockHeadingStep1").hasClass('arrow-up')) $("#blockHeadingStep1").addClass('arrow-up');
2549        $("#blockBodyStep1").slideDown();
2550        $("#blockHeadingStep2").removeClass('toggle-block').removeClass('arrow-up');
2551        $("#blockBodyStep2").slideUp();
2552        $("#blockBodyStep3").slideUp();
2553        $("#blockHeadingStep3").removeClass('arrow-up');
2554        $("#btnAddtoCart").addClass('disabled').text('Add to Cart');
2555        $("#deliveryDate").html('--');
2556        $("div.estimated_date").addClass('d-none');
2557        $("#chargesHolder").find("shipCharges_holder").remove();
2558
2559        $(".product-decoration:first").prop('checked',true).trigger('click');
2560        $(".product-decoration").trigger('change');
2561    };
2562
2563    $(document).on('click','#createReorder',function(){
2564        if($(this).hasClass('disabled')) return false;
2565        if($(".order-items:checked").length==0){
2566            $("#createReorder").after('<label class="error top-arrow">Please select items to reorder.</label>');
2567            setTimeout(function(){
2568                $("label.error").fadeOut(8000,function(){
2569                    $("label.error").remove();
2570                });
2571            },2000);
2572            return false;
2573        }
2574        $(this).addClass('disabled');
2575        $.ajax({
2576            type: 'POST',
2577            url: baseURL+'ajax/reorder-to-mcart',
2578            data: {'order_items':$(".order-items:checked").serializeArray()},
2579            dataType:"json",
2580            success: function(resp){
2581                if(resp!=""){
2582                    $("#createReorder").removeClass('disabled');
2583                    if(resp.status=='success'){
2584                        if(resp.redirect.search(/\S/)!=-1){
2585                            window.location.href = baseURL+resp.redirect;
2586                        }
2587                    }else{
2588                        $("#createReorder").after('<label class="error top-arrow">Sorry, could not add the selected item(s) to cart.</label>');
2589                        setTimeout(function(){
2590                            $("label.error").fadeOut(8000,function(){
2591                                $("label.error").remove();
2592                            });
2593                        },2000);
2594                        return false;
2595                    }
2596                }
2597            }
2598        });
2599    });
2600	
2601    $(document).on('click','#orderTrack',function(){
2602        if($(this).hasClass('disabled')) return false;
2603        if($('#trackNo').length){
2604			if($('#trackNo').val().search(/\S/)!=-1) var track = $.trim($('#trackNo').val());
2605			else{
2606				$('#trackNo').after('<label class="error top-arrow">'+$('#trackNo').attr('placeholder')+'</label>');
2607				setTimeout(function(){
2608					$("label.error").fadeOut(8000,function(){
2609						$("label.error").remove();
2610					});
2611				},2000);
2612				return false;
2613			}
2614        }
2615		if(typeof track!=='undefined'){
2616			$(this).addClass('disabled');
2617			$('#trackResult').html('<div class="loader_wrap vh-100 d-block"><div class="loader_inner"><div class="loader"></div></div></div>');
2618			$.ajax({
2619				type: 'POST',
2620				url: baseURL+'ajax/track-order',
2621				data: {'track':track},
2622				success: function(resp){
2623					$('#trackResult').html(resp);
2624					$('#orderTrack').removeClass('disabled');
2625				}
2626			});
2627		}
2628    });
2629});

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.