PageSourceSearch

https://www.wahanaritelindo.com/assets/js/script.js?t=1790948832410

js wahanaritelindo.com collected 2026-10-02 13:47:48 UTC 33,136 bytes, 1,144 lines download raw bytes

1var site = {
2	init:function(){
3		$('[data-toggle="tooltip"]').tooltip()
4		$(document).on('click', '.dropdown-menu', function (e) {
5			e.stopPropagation();
6		});
7		
8		$('.input-number').focusin(function(){
9			$(this).data('oldValue', $(this).val());
10		});
11		$('.input-number').change(function() { 
12			minValue =  parseInt($(this).attr('min'));
13			maxValue =  parseInt($(this).attr('max'));
14			valueCurrent = parseInt($(this).val());
15			name = $(this).attr('name');
16			if(valueCurrent >= minValue) {
17				$(".btn-number[data-type='minus'][data-field='"+name+"']").removeAttr('disabled')
18			} else {
19				alert('Sorry, the minimum value was reached');
20				$(this).val($(this).data('oldValue'));
21			}
22			
23			if(valueCurrent <= maxValue) {
24				$(".btn-number[data-type='plus'][data-field='"+name+"']").removeAttr('disabled')
25			} else {
26				alert('Sorry, the maximum value was reached');
27				$(this).val($(this).data('oldValue'));
28			}
29		});
30		$(".input-number").keydown(function (e) {
31				// Allow: backspace, delete, tab, escape, enter and .
32				if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 190]) !== -1 ||
33					 // Allow: Ctrl+A
34					(e.keyCode == 65 && e.ctrlKey === true) || 
35					 // Allow: home, end, left, right
36					(e.keyCode >= 35 && e.keyCode <= 39)) {
37						 // let it happen, don't do anything
38						 return;
39				}
40				// Ensure that it is a number and stop the keypress
41				if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
42					e.preventDefault();
43				}
44		});
45		site.initButtonNumber();
46	},
47	initButtonNumber:function(){
48		$('.btn-number').off("click");
49		$('.btn-number').click(function(e){
50			e.preventDefault();
51			fieldName = $(this).attr('data-field');
52			type      = $(this).attr('data-type');
53			var input = $(this).parent().parent().find("input[name='"+fieldName+"']");
54			var currentVal = parseInt(input.val());
55			if (!isNaN(currentVal)) {
56				if(type == 'minus') {
57					
58					if(currentVal > input.attr('min')) {
59						input.val(currentVal - 1).change();
60					} 
61					
62
63				} else if(type == 'plus') {
64
65					if(currentVal < input.attr('max')) {
66						input.val(currentVal + 1).change();
67					}
68					
69
70				}
71			} else {
72				input.val(0);
73			}
74		});
75		$("input[name=foto]").off("change");
76		$("input[name=foto]").on("change",function(){
77			var val = $(this).val().replace(/^.*[\\\/]/, '');
78			var id  = $(this).attr("id");
79			$("label[for="+id+"]").text(val);
80		})
81	},
82	forgotPassword:function(){
83		App.page.lock('');
84		$("#frm-forgot-password").upload({
85			extradata:false,
86			callback:function(data){
87				App.page.unlock();
88				var result = App.data.parseJSON(data);
89				if(!result ){
90					bootbox.alert("server response <pre>"+data+"</pre>")
91					return;
92				}
93				bootbox.alert(result.message,function(){
94					if(result.error){
95						return;
96					}
97					location="/";
98				});
99			}
100		});
101	},
102	resetPassword:function(){
103		App.page.lock('');
104		$("#frm-reset-password").upload({
105			extradata:false,
106			callback:function(data){
107				App.page.unlock();
108				var result = App.data.parseJSON(data);
109				if(!result ){
110					bootbox.alert("server response <pre>"+data+"</pre>")
111					return;
112				}
113				bootbox.alert(result.message,function(){
114					if(result.error){
115						return;
116					}
117					location="/";
118				});
119			}
120		});
121	},
122	loadFaqList:function(obj,id){
123		$(obj).parent().siblings().find("a").removeClass("selected");
124		$("#faq-list").html("loading");
125		App.getHtml("/ajax/faq-list",{categoryID:id},function(data){
126			$(obj).addClass("selected");
127			$("#faq-list").html(data);
128		});
129	},
130	submitcv:function(){
131		App.uploadForm('#frmsubmitcv',function(result){
132			bootbox.alert(result.message,function(){
133				location.reload();
134			});
135		});
136	},
137	articleparam:{},
138	loadArticle:function(obj,params){
139		for(var prop in params){
140			site.articleparam[prop] = params[prop]
141		}
142		$(obj).parent().siblings().find("a").removeClass("selected");
143		$("#article-list").html("loading");
144		App.getHtml("/ajax/article-list",site.articleparam,function(data){
145			$(obj).addClass("selected");
146			$("#article-list").html(data);
147		});
148	},
149	selectPaymentChannel:function(obj){
150		var val=$(obj).val();
151		$("[name=channel]").empty();
152		$("[name=channel]").append($("#"+val).html());
153	},
154	searchArticle:function(e){
155		if ( e.keyCode ==13){
156			site.loadArticle(false,{q:$("[name=search]").val()});
157		}
158	},
159	register:function(){
160		App.page.lock('');
161		$("#frmsignup").upload({
162				extradata:{city_id:$("[name=city] option:selected").attr("city_id"),province_id:$("[name=city] option:selected").attr("province_id")},
163				callback:function(data){
164					App.page.unlock();
165					var result = App.data.parseJSON(data);
166					if(!result ){
167						bootbox.alert("server response <pre>"+data+"</pre>")
168						return;
169					}
170					if(result.error){
171						bootbox.alert(result.message);
172						return;
173					}
174					bootbox.alert(result.message,function(){
175						location="/";
176					});
177				}
178		});
179	},
180	login:function(){
181		App.uploadForm("#frmlogin",function(result){
182			if(result.error){
183				bootbox.alert(result.message);
184				return;
185			}
186			location="/";
187		})
188	},
189	loginMobile:function(){
190		App.uploadForm("#frmloginmobile",function(result){
191			if(result.error){
192				bootbox.alert(result.message);
193				return;
194			}
195			location="/";
196		})
197	},
198	changeEmail:function(){
199		App.uploadForm("#frmchangeemail",function(result){
200			if(result.error){
201				bootbox.alert(result.message);
202				return;
203			}
204			location.reload();
205		})
206	},
207	changePassword:function(){
208		App.uploadForm("#frmchangepassword",function(result){
209			if(result.error){
210				bootbox.alert(result.message);
211				return;
212			}
213			location.reload();
214		})
215	},
216	submitConnectivity:function(){
217		App.uploadForm("#frmsmartconnectivity",function(result){
218			if(result.error){
219				bootbox.alert(result.message);
220				return;
221			}
222			location.reload();
223		})
224	},
225	submitTestRide:function(){
226		App.uploadForm("#frmtestride",function(result){
227			bootbox.alert(result.message,function(){
228				if(!result.error){
229					location.reload();
230					return;
231				}
232			});
233			goog_report_conversion();
234		})
235	},
236	registerHomeService:function(){
237		App.uploadForm("#frmregisterHomeService",function(result){
238			if(result.error){
239				bootbox.alert(result.message);
240				return;
241			}
242			
243			bootbox.alert(result.message,function(){
244				location.reload();
245			});
246			goog_report_conversion()
247		})
248	},
249	registerBookingService:function(){
250		App.uploadForm("#frmregisterBookingService",function(result){
251			if(result.error){
252				bootbox.alert(result.message);
253				return;
254			}
255			
256			// bootbox.alert(result.message,function(){
257			// 	location.reload();
258			// });
259			goog_report_conversion()
260			window.location.href ="/success";
261		})
262	},
263
264	addGarage:function(){
265		$('#AddGarageModal').modal('hide');
266		App.uploadForm("#frmregistersubmitGarage",function(result){
267			if(result.error){
268				bootbox.alert(result.message);
269				return;
270			}
271			
272			// bootbox.alert(result.message,function(){
273			// 	location.reload();
274			// });
275			goog_report_conversion()
276			window.location.reload();
277			bootbox.alert(result.message);
278		})
279	},
280
281	orderSparepart:function(){
282		App.getJSON("/api/user/isProfileCompleted",{},function(response){
283			if(!response || !response.status || response.status !="incomplete"){
284				App.uploadForm("#frmordersparepart",function(result){
285					if(result.error){
286						bootbox.alert(result.message);
287						return;
288					}
289					bootbox.alert(result.message,function(){
290						location.reload();
291					});
292					goog_report_conversion();
293				})
294				return;
295			}
296			bootbox.alert("Mohon lengkapi data diri Anda sebelum melanjutkan pesanan",function(){
297				location = "/profil?modal=active";
298			})
299			
300		})
301		
302	},
303	orderCart:function(){
304		var orderItem = [];
305		$("[cart-id]").each(function(){
306			orderItem.push({
307				id:$(this).attr("cart-id"),
308				jumlah:$(this).val()
309				
310			})
311		});
312		var orderData={}
313		if($("#address-info [name=alamat]").size()>0){
314			if($("#address-info [name=alamat]").val==""){
315				bootbox.alert("Mohon Lengkapi alamat");
316				return;
317			}
318			orderData.alamat = $("#address-info [name=alamat]").val();
319			if(!$("#address-info [name=province]").val()){
320				bootbox.alert("Mohon Lengkapi Provinsi");
321				return;
322			}
323			orderData.province = $("#address-info [name=province]").val();
324			
325			if(!$("#address-info [name=city]").val()){
326				bootbox.alert("Mohon Lengkapi City");
327				return;
328			}
329			
330			orderData.province_id = $("#address-info [name=city] option:selected").attr("province_id");
331			orderData.city = $("#address-info [name=city]").val();
332			orderData.city_id = $("#address-info [name=city] option:selected").attr("city_id");
333			
334		}
335		if(!$("[name=metode]:checked").val()){
336			bootbox.alert("Mohon Pilih Metode Pengiriman");
337			return;
338		}
339		orderData.metode_pengiriman = $("[name=metode]:checked").val();
340		orderData.ongkos_kirim = $("[name=metode]:checked").attr("data-ongkir");
341		if(orderData.metode_pengiriman=="dealer"){
342			if(!$("[name=cabangID]").val()){
343				bootbox.alert("Mohon Pilih Dealer untuk pengambilan barang");
344				return;
345			}
346			orderData.cabangID = $("[name=cabangID]").val();
347		}
348		orderData.items = orderItem;
349		App.page.lock('');
350		App.action("/api/order/fromCart",orderData,function(data){
351			App.page.unlock();
352			var result = App.data.parseJSON(data);
353			if (!result) {
354				bootbox.alert('server error returned:<pre>' + data + '</pre>');
355				return;
356			}
357			bootbox.alert(result.message, function () {
358				if (!result.error) {
359					location="/pesanan";
360					return;
361				}
362			});
363		})
364	},
365	orderCartNew:function(){
366		var orderItem = [];
367		$("[cart-id]").each(function(){
368			orderItem.push({
369				id:$(this).attr("cart-id"),
370				jumlah:$(this).val()
371				
372			})
373		});
374		var orderData={}
375		if($("#address-info [name=alamat]").size()>0){
376			if($("#address-info [name=alamat]").val==""){
377				bootbox.alert("Mohon Lengkapi alamat");
378				return;
379			}
380			orderData.alamat = $("#address-info [name=alamat]").val();
381			if(!$("#address-info [name=province]").val()){
382				bootbox.alert("Mohon Lengkapi Provinsi");
383				return;
384			}
385			orderData.province = $("#address-info [name=province]").val();
386			
387			if(!$("#address-info [name=city]").val()){
388				bootbox.alert("Mohon Lengkapi City");
389				return;
390			}
391			
392			orderData.province_id = $("#address-info [name=city] option:selected").attr("province_id");
393			orderData.city = $("#address-info [name=city]").val();
394			orderData.city_id = $("#address-info [name=city] option:selected").attr("city_id");
395			
396		}
397		if(!$("[name=metode]:checked").val()){
398			bootbox.alert("Mohon Pilih Metode Pengiriman");
399			return;
400		}
401		orderData.metode_pengiriman = $("[name=metode]:checked").val();
402		orderData.ongkos_kirim = $("[name=metode]:checked").attr("data-ongkir");
403		if(orderData.metode_pengiriman=="dealer"){
404			if(!$("[name=cabangID]").val()){
405				bootbox.alert("Mohon Pilih Dealer untuk pengambilan barang");
406				return;
407			}
408			orderData.cabangID = $("[name=cabangID]").val();
409		}
410		orderData.items = orderItem;
411		orderData.payment_method=$("[name=method]").val();
412		orderData.payment_channel=$("[name=channel]").val();
413		App.page.lock('');
414		App.action("/api/order/fromCartNew",orderData,function(data){
415			App.page.unlock();
416			var result = App.data.parseJSON(data);
417			if (!result) {
418				bootbox.alert('server error returned:<pre>' + data + '</pre>');
419				return;
420			}
421			bootbox.alert(result.message, function () {
422				if (!result.error) {
423					location="/pesanan";
424					return;
425				}
426			});
427		})
428	},
429	orderCartSnap:function(){
430		App.getJSON("/api/user/isProfileCompleted",{},function(response){
431			if(!response || !response.status || response.status !="incomplete"){
432				var orderItem = [];
433				$("[cart-id]").each(function(){
434					orderItem.push({
435						id:$(this).attr("cart-id"),
436						jumlah:$(this).val()
437						
438					})
439				});
440				var orderData={}
441				if($("#address-info [name=alamat]").size()>0){
442					if($("#address-info [name=alamat]").val==""){
443						bootbox.alert("Mohon Lengkapi alamat");
444						return;
445					}
446					orderData.alamat = $("#address-info [name=alamat]").val();
447					if(!$("#address-info [name=province]").val()){
448						bootbox.alert("Mohon Lengkapi Provinsi");
449						return;
450					}
451					orderData.province = $("#address-info [name=province]").val();
452					
453					if(!$("#address-info [name=city]").val()){
454						bootbox.alert("Mohon Lengkapi City");
455						return;
456					}
457					
458					orderData.province_id = $("#address-info [name=city] option:selected").attr("province_id");
459					orderData.city = $("#address-info [name=city]").val();
460					orderData.city_id = $("#address-info [name=city] option:selected").attr("city_id");
461					
462				}
463				if(!$("[name=metode]:checked").val()){
464					bootbox.alert("Mohon Pilih Metode Pengiriman");
465					return;
466				}
467				orderData.metode_pengiriman = $("[name=metode]:checked").val();
468				orderData.ongkos_kirim = $("[name=metode]:checked").attr("data-ongkir");
469				if(orderData.metode_pengiriman=="dealer"){
470					if(!$("[name=cabangID]").val()){
471						bootbox.alert("Mohon Pilih Dealer untuk pengambilan barang");
472						return;
473					}
474					orderData.cabangID = $("[name=cabangID]").val();
475				}
476				orderData.items = orderItem;
477				orderData.kode_promo=$("[name=kode_promo]").val()
478				App.page.lock('');
479				App.action("/api/order/fromCartSnap",orderData,function(data){
480					App.page.unlock();
481					var result = App.data.parseJSON(data);
482					if (!result) {
483						bootbox.alert('server error returned:<pre>' + data + '</pre>');
484						return;
485					}
486					goog_report_conversion();
487					if(result.redirect_url) {
488						location=result.redirect_url;
489						return;
490					}
491					bootbox.alert(result.message);
492				})
493				return;
494			}
495			bootbox.alert("Mohon lengkapi data diri Anda sebelum melanjutkan pesanan",function(){
496				location = "/profil?modal=active";
497			})
498		})
499	},
500	cekKodePromo:function(){
501		var orderItem = [];
502		$("[cart-id]").each(function(){
503			orderItem.push({
504				id:$(this).attr("cart-id"),
505				jumlah:$(this).val()
506				
507			})
508		});
509		var postData={
510			kode_promo:$("[name=kode_promo]").val(),
511			items:orderItem
512		}
513		App.page.lock('');
514		App.action("/api/kode_promo/check",postData,function(data){
515			App.page.unlock();
516			var result = App.data.parseJSON(data);
517			if (!result) {
518				bootbox.alert('server error returned:<pre>' + data + '</pre>');
519				return;
520			}
521			if (result.error) {
522				bootbox.alert(result.message);
523				return;
524			}
525			$("#discount").attr("data-discount-value",result.data);
526			$("#discount").html("Rp "+ result.data.toLocaleString().replace(/,/g, '.'));
527			
528			
529			bootbox.alert(result.message,()=>{
530				setTimeout(()=>{
531					calculate();
532				},1000)
533			});
534		});
535	},
536	addToCart:function(cartData){
537		App.page.lock('');
538				App.action("/api/user/addToCart",cartData,function(data){
539					App.page.unlock();
540                    var result = App.data.parseJSON(data);
541                    if (!result) {
542                        bootbox.alert('server error returned:<pre>' + data + '</pre>');
543                        return;
544                    }
545					if (!result.error) {
546						bootbox.alert(result.message, function () {
547                            location.reload();
548						});
549						return;
550					}
551                    if(result.wishlistOption && result.wishlistData){
552						bootbox.confirm(result.message,function(ok){
553							if(!ok){return;}
554							site.addToWishlist(result.wishlistData);
555						})
556					}else{
557						bootbox.alert(result.message);
558					}
559				})
560	},
561	addToWishlist:function(wishlistData){
562		App.page.lock('');
563		App.action("/api/user/addToWishlist",wishlistData,function(data){
564			App.page.unlock();
565			var result = App.data.parseJSON(data);
566			if (!result) {
567				bootbox.alert('server error returned:<pre>' + data + '</pre>');
568				return;
569			}
570			bootbox.alert(result.message);
571		})
572	},
573	removeWishlist:function(id){
574		bootbox.confirm("Hapus item ini dari wishlist Anda?",function(ok){
575			if(!ok){
576				return;
577			}
578			App.page.lock('');
579			App.action("/api/user/removeWishlist",{id:id},function(data){
580				App.page.unlock();
581				var result = App.data.parseJSON(data);
582				if (!result) {
583					bootbox.alert('server error returned:<pre>' + data + '</pre>');
584					return;
585				}
586				bootbox.alert(result.message,function(){
587					location.reload();
588				});
589			})
590		})
591		
592	},
593	removeFromCart:function(id){
594		App.page.lock('');
595		App.action("/api/user/removeFromCart",{id:id},function(data){
596			App.page.unlock();
597            var result = App.data.parseJSON(data);
598			if (!result) {
599				bootbox.alert('server error returned:<pre>' + data + '</pre>');
600				return;
601			}
602			bootbox.alert(result.message, function () {
603				if (!result.error) {
604					location.reload();;
605				}
606			});
607		})
608	},
609	getPartStock:function(part_number,callback){
610		App.getJSON("/api/getStock",{part_number:part_number},function(data){
611			callback(data);
612		})
613	},
614	registerChat:function(){
615		App.uploadForm("#frmchatregister",function(result){
616			if(result.error){
617				bootbox.alert(result.message);
618				return;
619			}
620			location="/chat-list";
621		})
622	},
623	startChat:function(){
624		if(!$("[name=cabangID]:checked").val()){
625			bootbox.alert("Mohon pilih cabang yang ingin Anda hubungi")
626			return;
627		}
628		App.action("/api/user/startChat",{cabangID:$("[name=cabangID]:checked").val()},function(data){
629			App.page.unlock();
630            var result = App.data.parseJSON(data);
631			if (!result) {
632				bootbox.alert('server error returned:<pre>' + data + '</pre>',function(){
633					location="/hubungi-kami";
634				});
635				return;
636			}
637			location="/chat";
638		})
639	},
640	checkChatSubmit:function(e){
641		if ( e.keyCode ==13){
642			site.sendChatMessage();
643		}
644	},
645	sendChatMessage:function(){
646		if(!site.chatAnswered){
647			return;
648		}
649		var msg={
650			chatID:roomid,
651			message:$("[name=message]").val()
652		}
653		
654		
655		$("[name=message]").val("");
656		$("#chat-from-self #message").text(msg.message);
657		$("#chat-log").append($("#chat-from-self").html());
658		var tgt = $("#chat-log").find('.base_sent').last();
659		socket.emit("message_to_room",msg,function(){
660			$(tgt).find('.checkmark').removeClass('hidden')
661			console.log(tgt,'callback');
662		});
663	},
664	pesanMotor:function(){
665		if(!extradata || !extradata.metode_pembayaran){
666			return;
667		}
668		if(extradata.metode_pembayaran=="kredit"){
669			if($("#rincian-kredit").find("[name=uangmuka]").size()<1){
670				bootbox.alert("Silakan tentukan lokasi Anda untuk mendapatkan rincian harga kredit")
671				return;
672			}
673			if(!$("#rincian-kredit").find("[name=uangmuka]").val()){
674				bootbox.alert("Silakan tentukan jumlah uang muka");
675				return;
676			}
677			if($("#rincian-kredit").find("[name=angsuran]").size()<1){
678				bootbox.alert("Silakan tentukan lokasi Anda untuk mendapatkan rincian harga kredit")
679				return;
680			}
681			if(!$("#rincian-kredit").find("[name=angsuran]").val()){
682				bootbox.alert("Silakan tentukan periode kredit");
683				return;
684			}
685			if(!$("#tab1").find("[name=agree]").prop("checked")){
686				bootbox.alert("Mohon tandai bahwa Anda menyetujui syarat dan ketentuan dari Kami");
687				return;
688			}
689			
690			extradata.uangmuka = $("#rincian-kredit").find("[name=uangmuka]").val();
691			extradata.tenor = $("#rincian-kredit").find("[name=angsuran]").val();
692			extradata.angsuran = $("#rincian-kredit").find("[name=angsuran] option:selected").attr("angsuran");
693			extradata.aksesoris=[];
694			$("#tab1").find("[name*=aksesoris]").each(function(){
695				if($(this).prop("checked")){
696					extradata.aksesoris.push($(this).val());
697				}
698			});
699			extradata.kode_promo=$(".promo-credit-block").find("[name=kode_promo]").val();
700			extradata.motor_code = $("#frmpesanmotor").find("[name=cabangID] option:selected").attr("data-motor-code")
701			
702		}
703		if(extradata.metode_pembayaran=="cash"){
704			if(!$("#tab2").find("[name=agree]").prop("checked")){
705				bootbox.alert("Mohon tandai bahwa Anda menyetujui syarat dan ketentuan dari Kami");
706				return;
707			}
708			extradata.aksesoris=[];
709			$("#tab2").find("[name*=aksesoris]").each(function(){
710				if($(this).prop("checked")){
711					extradata.aksesoris.push($(this).val());
712				}
713			})
714			extradata.kode_promo=$(".promo-cash-block").find("[name=kode_promo]").val();
715			extradata.motor_code = $("#frmpesanmotor").find("[name=cabangID] option:selected").attr("data-motor-code")
716		}
717		
718		App.page.lock('');
719		$("#frmpesanmotor").upload({
720			extradata:extradata,
721			callback:function(data){
722				App.page.unlock();
723				var result = App.data.parseJSON(data);
724				if(!result ){
725					bootbox.alert("server response <pre>"+data+"</pre>")
726					return;
727				}
728				if(!result.error){
729					if(extradata.metode_pembayaran=="kredit"){
730						goog_report_conversion_credit();
731					}
732					if(extradata.metode_pembayaran=="cash"){
733						goog_report_conversion_cash();
734					}
735				}
736				bootbox.alert(result.message,function(){
737					if(!result.error){
738						location.reload();
739					}
740					
741				});
742			}
743		})
744	},
745	cekPromoMotorCredit:function(){
746		if(!extradata || !extradata.metode_pembayaran || extradata.metode_pembayaran!="kredit"){
747			return;
748		}
749		var postData={
750			metode_pembayaran:"kredit"
751		}
752
753		if($("#rincian-kredit").find("[name=uangmuka]").size()<1){
754			bootbox.alert("Silakan tentukan lokasi Anda untuk mendapatkan rincian harga kredit")
755			return;
756		}
757		if(!$("#rincian-kredit").find("[name=uangmuka]").val()){
758			bootbox.alert("Silakan tentukan jumlah uang muka");
759			return;
760		}
761		if($("#rincian-kredit").find("[name=angsuran]").size()<1){
762			bootbox.alert("Silakan tentukan lokasi Anda untuk mendapatkan rincian harga kredit")
763			return;
764		}
765		if(!$("#rincian-kredit").find("[name=angsuran]").val()){
766			bootbox.alert("Silakan tentukan periode kredit");
767			return;
768		}
769		
770		postData.uangmuka = $("#rincian-kredit").find("[name=uangmuka]").val();
771		postData.tenor = $("#rincian-kredit").find("[name=angsuran]").val();
772		postData.angsuran = $("#rincian-kredit").find("[name=angsuran] option:selected").attr("angsuran");		
773		postData.productID=$("#frmpesanmotor").find("[name=productID]").val();
774		postData.cabangID=$("#frmpesanmotor").find("[name=cabangID]").val();
775		postData.kode_promo=$(".promo-credit-block").find("[name=kode_promo]").val();
776		postData.motor_code = $("#frmpesanmotor").find("[name=cabangID] option:selected").attr("data-motor-code")
777
778		App.page.lock('');
779		App.action("/api/kode_promo/cekPromoMotorCredit",postData,function(res){
780			App.page.unlock();
781			bootbox.alert(res.message);
782			if(!res.error){
783				$('#rincian-kredit').find("#diskon").removeClass("hidden");
784				$('#rincian-kredit').find("#selected-diskon").text(`Rp ${res.data.toLocaleString()}`);
785				$('#rincian-kredit').find("#total-dp").removeClass("hidden");
786				$("#selected-dp").css({"text-decoration":"line-through"});
787				var dp = parseFloat($("#selected-dp").attr("data-float"));
788				var dp_after_diskon = dp - parseFloat(res.data);
789				$('#rincian-kredit').find("#selected-total-dp").text(`Rp ${dp_after_diskon.toLocaleStr
789ing()}`);
790			}
791		});
792		
793	},
794	cekPromoMotorCash:function(){
795		if(!extradata || !extradata.metode_pembayaran || extradata.metode_pembayaran!="cash"){
796			return;
797		}
798		var postData={
799			metode_pembayaran:"kredit"
800		}
801		postData.productID=$("#frmpesanmotor").find("[name=productID]").val();
802		postData.cabangID=$("#frmpesanmotor").find("[name=cabangID]").val();
803		postData.motor_code = $("#frmpesanmotor").find("[name=cabangID] option:selected").attr("data-motor-code")
804		postData.kode_promo=$(".promo-cash-block").find("[name=kode_promo]").val();
805		
806		App.page.lock('');
807		App.action("/api/kode_promo/cekPromoMotorCash",postData,function(res){
808			App.page.unlock();
809			bootbox.alert(res.message);
810			if(res.error){
811				return;
812			}
813			$("#total-harga").css({"text-decoration": "line-through"});
814			$(".total-cash-block").empty();
815			$(".total-cash-block").append(`
816				<div class="col-md-4 ">
817					<h3 class="txt-bold inter-bold font-italic txt-up txt-black">Diskon</h3>  
818				</div>
819				<div class="col-md-8 txt-r-to-l">
820					<h3 class="txt-red txt-bold inter-bold font-italic txt-up" id="total-diskon" data-diskon="${res.data}">Rp ${res.data.toLocaleString().split(",").join(".")}</h3>
821				</div>  
822			`);
823			var total = parseFloat($("#total-harga").attr("data-harga"));
824			var grand_total = total - res.data;
825			$(".total-cash-block").append(`
826				<div class="col-md-4 ">
827					<h3 class="txt-bold inter-bold font-italic txt-up txt-black">Grand Total</h3>  
828				</div>
829				<div class="col-md-8 txt-r-to-l">
830					<h3 class="txt-red txt-bold inter-bold font-italic txt-up" id="grand-total" data-grand-total="${grand_total}">Rp ${grand_total.toLocaleString().split(",").join(".")}</h3>
831				</div>  
832			`);
833			$(".total-cash-block h3").css({"margin":0})
834		});
835		
836	},
837	sendChatAttachment:function(){
838		if(!site.chatAnswered){
839			return;
840		}
841		$("input[name=attachment]").on("change",function(){
842			var file = $(this)[0].files[0];
843			if(file.size > 1024 * 1024 * 25){
844				bootbox.alert("Maaf, maksimal ukuran file adalah 25 MB");
845				return;
846			}
847			var upload = new Upload(file);
848			var temp = $("<div />");
849			var temp_id=new Date().getTime();
850			$(temp).attr("id",temp_id);
851			temp_id = '#' + temp_id;
852			$(temp).html(file.name +" - 0%");
853			$("#chat-log").append(temp[0])
854			upload.doUpload("/api/chat/attachment",
855				function(err){
856					bootbox.alert("Upload error, server return <pre> "+err+"</pre>",function(){
857						$(temp_id).remove();
858					});
859				},
860				function(event){
861					var percent = 0;
862					var position = event.loaded || event.position;
863					var total = event.total;
864					if (event.lengthComputable) {
865						percent = Math.ceil(position / total * 100);
866					}
867					console.log(percent);
868					$(temp_id).html(file.name +" - "+percent+"%")
869				},
870				function(rv){
871					$(temp_id).remove();
872					if(rv && rv.data && rv.data.url){
873						var msg={
874							chatID:roomid,
875							message:"<a href='"+rv.data.url+"' target='_blank'>"+file.name+"</a>"
876						}
877						socket.emit("message_to_room",msg);
878						$("#chat-from-self #message").html(msg.message);
879						$("#chat-log").append($("#chat-from-self").html());
880					}
881				}
882			);
883			$(this).off("change");
884		});
885		$("input[name=attachment]").trigger("click");
886	},
887	fblogin:function(){
888		var win = window.open('/dialog/fblogin','Login Via Facebook','left=20,top=20,width=500,height=500,toolbar=1,resizable=0');
889		var pollTimer = window.setInterval(function() {
890			if (win.closed !== false) { // !== is required for compatibility with Opera
891				window.clearInterval(pollTimer);
892				App.getJSON("/api/user/isProfileCompleted",{},function(response){
893					if(!response || !response.status || response.status !="incomplete"){
894						location.reload();
895						return;
896					}
897					location = "/profil?modal=active";
898				})
899				
900			}
901		}, 200);
902	},
903	googleLogin:function(){
904		var win = window.open('/dialog/google-login','Login Via Google','left=20,top=20,width=500,height=500,toolbar=1,resizable=0');
905		var pollTimer = window.setInterval(function() {
906			if (win.closed !== false) { // !== is required for compatibility with Opera
907				window.clearInterval(pollTimer);
908				App.getJSON("/api/user/isProfileCompleted",{},function(response){
909					if(!response || !response.status || response.status !="incomplete"){
910						location.reload();
911						return;
912					}
913					location = "/profil?modal=active";
914				})
915			}
916		}, 200);
917	},
918	updateProfile:function(){
919		App.page.lock('');
920		$("#frmupdateprofile").upload({
921			extradata:false,
922			callback:function(data){
923				App.page.unlock();
924				var result = App.data.parseJSON(data);
925				if(!result ){
926					bootbox.alert("server response <pre>"+data+"</pre>")
927					return;
928				}
929				bootbox.alert(result.message,function(){
930					if(!result.error){
931						location.reload();
932						return;
933					}
934					$("#modal-update-profile").modal();
935				});
936			}
937		})
938	},
939	semokBookingList:[],
940	findSemokByDate:function(){
941		var tgl = $("[name=tgl]").val();
942		var bln = $("[name=bln]").val();
943		var thn = $("[name=thn]").val();
944		var date=thn +"-" + bln + "-" + tgl;
945		App.getJSON("/api/semok/findScheduleByDate",{date:date},function(result){
946			$("[name=schedule_id]").empty();
947			$("[name=schedule_id]").append(`
948				<option selected disabled>Tidak ada jadwal</option>
949			`);
950			if(result.error){
951				//bootbox.alert(result.message);
952				return;
953			}
954			if(!result.data || result.data.length <1){
955				//bootbox.alert("Tidak ada jadwal semok");
956				return;
957			}
958			site.semokBookingList = [];
959			$("[name=schedule_id]").empty();
960			result.data.forEach(function(r){
961				$("[name=schedule_id]").append(`
962					<option value="${r.id}">${r.name},${r.area}</option>
963				`);
964				site.semokBookingList.push({
965					id:r.id,
966					open_pit:r.open_pit,
967					address:r.address,
968					booking:r.booking
969				});
970			});
971			$("[name=schedule_id]").off("change");
972			$("[name=schedule_id]").on("change",function(){
973				var id=$(this).val();
974				$(".jam-list").removeClass("disabled");
975				$(".jam-list").removeClass("selected");
976				var sel = site.semokBookingList.filter(function(n){return n.id ==id})[0];
977				if(!sel){
978					return;
979				}
980				$(".address").text(sel.address);
981				var bookingList = sel.booking;
982				$(".jam-list").each(function(){
983					var jam = $(this).text()+":00";
984					var len = bookingList.filter(function(m){return m.jam===jam}).length;
985					if(len >=sel.open_pit){
986						$(this).addClass("disabled");
987						$(this).removeClass("selected");
988					}
989				});
990				$(".jam-list").off("click");
991				$(".jam-list").on("click",function(){
992					if($(this).hasClass("disabled")){
993						return;
994					}
995					$(this).addClass("selected");
996					$(this).parent().siblings().find(".jam-list").removeClass("selected");
997					$("[name=jam]").val($(this).text());
998				})
999			});
1000			$("[name=schedule_id]").trigger("change");
1001
1002		})
1003	},
1004	findBookingSlot: function () {
1005		var date = $("[name=tgl]").val();
1006		var branch_id = $("[name=cabangID]").val();
1007		
1008		if (!branch_id || !date) {
1009			return;
1010		}
1011	
1012		$(".jam-area").empty('');
1013		$(".jam-area").append('Loading');
1014	
1015		// Get the current client's local time
1016		var clientCurrentTime = new Date();
1017	
1018		// Subtract 2 hours from the client's local time
1019		var minBookingTime = new Date(clientCurrentTime.getTime() + (2 * 60 * 60 * 1000));
1020	
1021		App.getJSON("/app/booking/findSlot", { date: date, branch_id: branch_id }, function (result) {
1022			if (!result.data) {
1023				return;
1024			}
1025	
1026			$(".jam-area").empty();
1027	
1028			result.data.forEach(function (r) {
1029				var available = parseInt(r.free_slot);
1030				var disabled = "";
1031	
1032				// Parse time strings into Date objects for comparison
1033				var slotTime = new Date(date + ' ' + r.list_hour);
1034	
1035				// Compare the time slots with the calculated minimum booking time
1036				if (minBookingTime >= slotTime || available < 1) {
1037					disabled = "disabled";
1038				}
1039	
1040				$(".jam-area").append(`
1041					<div class="col-md-2 col-sm-3 col-xs-4 margin-right-10" >
1042						<p class="jam-list ${disabled}">${r.list_hour}</p>
1043					</div>
1044				`);
1045			});
1046	
1047			$(".jam-list").off("click");
1048			$(".jam-list").on("click", function () {
1049				if ($(this).hasClass("disabled")) {
1050					return;
1051				}
1052				if ($(this).hasClass("selected")) {
1053					$(this).removeClass("selected");
1054					return;
1055				}
1056				$(this).addClass("selected");
1057				$(this).parent().siblings().find(".jam-list").removeClass("selected");
1058				$("[name=jam]").val($(this).text());
1059			});
1060		});
1061	},
1062	registerSemok:function(){
1063		App.uploadForm("#frmregisterSemokService",function(result){
1064			if(result.error){
1065				bootbox.alert(result.message);
1066				return;
1067			}
1068			
1069			// bootbox.alert(result.message,function(){
1070			// 	location.reload();
1071			// });
1072			goog_report_conversion()
1073			window.location.href ="/success";
1074		})
1075	},
1076	submitSurveyRating:function(){
1077		App.uploadForm("#frmSubmitSurveyRating",function(result){
1078			if(result.error){
1079				bootbox.alert(result.message);
1080				return;
1081			}
1082			
1083			// bootbox.alert(result.message,function(){
1084			// 	location.reload();
1085			// });
1086			goog_report_conversion()
1087			window.location.href ="/success";
1088			bootbox.alert(result.message);
1089		})
1090	},
1091}
1092var Upload = function (file) {
1093    this.file = file;
1094};
1095
1096Upload.prototype.getType = function() {
1097    return this.file.type;
1098};
1099Upload.prototype.getSize = function() {
1100    return this.file.size;
1101};
1102Upload.prototype.getName = function() {
1103    return this.file.name;
1104};
1105
1106Upload.prototype.doUpload = function (url,error_handler,progress_handler,finish_handler) {
1107    var that = this;
1108    var formData = new FormData();
1109
1110    // add assoc key values, this will be posts values
1111    formData.append("file", this.file, this.getName());
1112    formData.append("upload_file", true);
1113
1114    $.ajax({
1115        type: "POST",
1116        url: url,
1117        xhr: function () {
1118            var myXhr = $.ajaxSettings.xhr();
1119            if (myXhr.upload) {
1120                myXhr.upload.addEventListener('progress', progress_handler, false);
1121            }
1122            return myXhr;
1123        },
1124        success: function (data) {
1125            if(finish_handler && typeof finish_handler=="function"){
1126				finish_handler(data);
1127				return;
1128			}
1129        },
1130        error: function (data) {
1131			if(error_handler && typeof error_handler=="function"){
1132				error_handler(data);
1133				return;
1134			}
1135            
1136        },
1137        async: true,
1138        data: formData,
1139        cache: false,
1140        contentType: false,
1141        processData: false,
1142        timeout: 60000
1143    });
1144};

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.