PageSourceSearch

https://upsanat.ir/wp-content/plugins/woodmart-plus/assets/js/w-plus.js?ver=7.1.2

js upsanat.ir collected 2026-10-06 04:19:47 UTC 52,568 bytes, 1,491 lines download raw bytes

1(function($){
2    
3    $('body').on('click', '.htmltopdf', function() {
4        const element = document.getElementById('container_prefactor');
5        
6        if (!element) {
7            alert('عنصر container_prefactor پیدا نشد!');
8            return;
9        }
10        
11        // ذخیره استایل‌های اصلی
12        const originalStyles = {
13            paddingRight: element.style.paddingRight,
14            paddingLeft: element.style.paddingLeft,
15            paddingTop: element.style.paddingTop,
16            width: element.style.width,
17            margin: element.style.margin
18        };
19        
20        // اعمال استایل‌های بهینه برای PDF
21        element.style.paddingRight = '20px';     // تغییر از درصد به px
22        element.style.paddingLeft = '20px';
23        element.style.paddingTop = '20px';
24        element.style.width = '100%';
25        element.style.margin = '0 auto';
26        element.style.backgroundColor = '#ffffff';
27        element.style.boxSizing = 'border-box';
28        
29        // تنظیمات بهتر برای html2canvas
30        html2canvas(element, {
31            scale: 3,                    // افزایش کیفیت (3 برابر)
32            backgroundColor: '#ffffff',
33            logging: false,
34            useCORS: true,
35            windowWidth: element.scrollWidth,
36            windowHeight: element.scrollHeight,
37            onclone: function(clonedDoc, element) {
38                // اعمال فونت‌های مناسب در نسخه کلون شده
39                const clonedElement = clonedDoc.getElementById('container_prefactor');
40                if (clonedElement) {
41                    clonedElement.style.fontFamily = 'Arial, Helvetica, sans-serif';
42                    clonedElement.style.fontSize = '12px';
43                    clonedElement.style.lineHeight = '1.5';
44                }
45            }
46        }).then(function(canvas) {
47            // محاسبه دقیق ابعاد برای چیدمان بهتر
48            var imgWidth = 190;  // کاهش عرض برای حاشیه بهتر (mm)
49            var pageHeight = 277; // کاهش ارتفاع برای حاشیه (mm)
50            var marginX = 10;     // حاشیه چپ و راست (mm)
51            
52            var imgHeight = (canvas.height * imgWidth) / canvas.width;
53            var heightLeft = imgHeight;
54            
55            var doc = new jsPDF({
56                unit: 'mm',
57                format: 'a4',
58                orientation: 'portrait'
59            });
60            
61            var position = 0;
62            
63            // اضافه کردن تصویر با حاشیه مناسب
64            doc.addImage(canvas, 'JPEG', marginX, position, imgWidth, imgHeight, undefined, 'FAST');
65            heightLeft -= pageHeight;
66            
67            while (heightLeft >= 0) {
68                position = heightLeft - imgHeight;
69                doc.addPage();
70                doc.addImage(canvas, 'JPEG', marginX, position, imgWidth, imgHeight, undefined, 'FAST');
71                heightLeft -= pageHeight;
72            }
73            
74            doc.save('factor-Export.pdf');
75            
76            // بازگردانی استایل‌ها
77            element.style.paddingRight = originalStyles.paddingRight;
78            element.style.paddingLeft = originalStyles.paddingLeft;
79            element.style.paddingTop = originalStyles.paddingTop;
80            element.style.width = originalStyles.width;
81            element.style.margin = originalStyles.margin;
82            
83        }).catch(function(error) {
84            console.error('خطا:', error);
85            alert('خطا در ساخت PDF: ' + error.message);
86            
87            // بازگردانی استایل‌ها در صورت خطا
88            element.style.paddingRight = originalStyles.paddingRight;
89            element.style.paddingLeft = originalStyles.paddingLeft;
90            element.style.paddingTop = originalStyles.paddingTop;
91            element.style.width = originalStyles.width;
92            element.style.margin = originalStyles.margin;
93        });
94    });
95
96$('body').on('click', '.htmltoimg', function() {
97    const element = document.getElementById('container_prefactor');
98    
99    if (!element) {
100        alert('عنصر container_prefactor پیدا نشد!');
101        return;
102    }
103    
104    // اعمال استایل‌های موقت (مشابه PDF)
105    element.style.paddingRight = '20px';
106    element.style.paddingTop = '20px';
107    element.style.paddingLeft = '20px';
108    
109    html2canvas(element, {
110        scale: 2,
111        backgroundColor: '#ffffff',
112        logging: false
113    }).then(function(canvas) {
114        // روش 1: دانلود خودکار JPEG (مشابه کد img_saver شما)
115        var a = document.createElement('a');
116        a.href = canvas.toDataURL("image/jpeg").replace("image/jpeg", "image/octet-stream");
117        a.download = 'factor-Export.jpg';
118        a.click();
119        
120        // بازگردانی استایل‌ها
121        element.style.paddingRight = '';
122        element.style.paddingTop = '';
123        element.style.paddingLeft = '';
124        
125    }).catch(function(error) {
126        console.error('خطا:', error);
127        alert('خطا در ساخت تصویر: ' + error.message);
128        
129        // بازگردانی استایل‌ها در صورت خطا
130        element.style.paddingRight = '';
131        element.style.paddingTop = '';
132        element.style.paddingLeft = '';
133    });
134});
135
136    $(window).on("elementor/frontend/init", function() {
137            
138        elementorFrontend.hooks.addAction( "frontend/element_ready/plus_my_account_slider_dashboard_elementor.default",function( $scope ){
139                
140                if( $('.swiper_homepage').length && window.elementor )
141                {
142                    var swiperHomepage = new Swiper(".swiper_homepage", {
143                        slidesPerView: 1,
144                        loop: true,
145                        paginationClickable: true,
146                        navigation: {
147                        nextEl: ".swiper-button-next",
148                        prevEl: ".swiper-button-prev",
149                        },
150                        pagination: {
151                            el: ".swiper-pagination",
152                            clickable: true
153                        },
154                    });     
155                }
156        });
157    });
158    
159    $(document).ready(function(){
160
161        $('#avatar_image').on('change',function(e){
162            e.preventDefault();
163            var file_input = $(this);
164            var file = this.files[0];
165            var reader = new FileReader();
166            reader.onload = function(e){
167                var $avatar_image = file_input.parents('.dashboard_container').find('.avatar_image_account');
168                $avatar_image.find('img').attr('src',e.target.result);
169            };
170            reader.readAsDataURL(file);
171        });
172    });
173    
174    $(document).ready(function(){
175
176        $('.input_container').each(function(index,value){
177            var $this = $(this),
178                btn_clear = $this.find('.btn_clear'),
179                input_form = $this.find('input');
180                
181            $(btn_clear).on('click',function(e){
182                e.preventDefault();
183                input_form.val("");
184            });
185
186        });
187    });
188
189    $(document).ready(function(){
190        
191        if( $('.swiper_homepage').length )
192        {
193             var swiperHomepage = new Swiper(".swiper_homepage", {
194                slidesPerView: 1,
195                loop: true,
196                paginationClickable: true,
197                navigation: {
198                    nextEl: ".swiper-button-next",
199                    prevEl: ".swiper-button-prev",
200                },
201                pagination: {
202                    el: ".swiper-pagination",
203                    clickable: true
204                },
205            }); 
206        }
207    });
208
209
210  $(document).ready(function(){
211    $('.add_ticket__form').on('submit',function(e){
212
213        var $this = $(this);    
214        var select = $this.find('.ticket_select_items');
215        var hasError = false;
216        select.each(function(index,element){
217            if( $(element).attr('data-required') != 0 )
218            {
219                $(element).css({
220                    'border' : '1px solid red'
221                });
222                hasError = true;
223            }
224        });
225
226        if( hasError )
227        {
228            e.preventDefault();
229        }else{
230            $this.submit();
231        }
232    });
233
234    $('.ticket_select_items').each(function(index,element){
235
236        $(element).on('change',function(){
237            var $nextThis = $(this);
238            if( $nextThis.val() !== 'default' || $nextThis.val() !== 'departman_default' || $nextThis.val() !== 'priority_default' )
239            {
240                $(element).attr('data-required',0);
241                $(element).css('border','');
242            }
243        });
244    });
245  });
246
247
248  $(document).ready(function(){
249        
250      $('body').on('submit','form.aramis_login', function(e){
251
252          e.preventDefault();
253          var $this = $(this);
254          var alert = $('body').find('.alert');
255          var btn_sub = $(this).find('button');
256          
257          var $user_name = $(this).find('input[name="username"]').val();
258          var $password = $(this).find('input[name="password"]').val();
259          var $phone = $(this).find('input[name="phone_login"]').val();
260          var $nonce = $(this).find('.nonce_login_register').val();
261          var $checkRemember = $(this).find('#checkRemember').val();
262          var verify_otp = $('body').find('.verify_otp_login');
263          var $btn_form = $this.find('.aramis__login_btn');
264              $btn_form.addClass('loading');
265          var btn_text = $btn_form.html();
266
267            $btn_form.empty();
268
269          btn_sub.addClass('btn-loading');
270
271          $.ajax({
272
273              dataType:'json',type:'post',url : optionarray.plus_url,
274
275              data:{
276                  action:'process_login',
277                  user_name : $user_name,
278                  password : $password,
279                  phone : $phone,
280                  nonce : $nonce,
281                  checkRemember : $checkRemember
282              },
283              success:function(response)
284              {
285                
286                  $btn_form.html(btn_text);
287                  $btn_form.removeClass('loading');
288                  btn_sub.removeClass('btn-loading');
289                  
290
291                  alert.addClass('badge_green--border');
292                  alert.children().find('p').append(response.message);
293                  alert.show();
294                  btn_sub.removeClass('btn-loading');
295
296                  
297                  window.location.href = response.redirect_url;
298              },
299              error:function(error)
300              {
301                    $btn_form.html(btn_text);
302                    $btn_form.removeClass('loading');
303
304                  alert.addClass('badge_danger--border');
305                  alert.children().find('p').append(error.responseJSON.message);
306                  alert.show();
307                  btn_sub.removeClass('btn-loading');
308                  
309                  setTimeout(function(){
310                      alert.removeClass('badge_danger--border');
311                      alert.children().find('p').empty();
312                      alert.hide();
313                  },3000);
314              } 
315          
316
317          });
318  
319      });
320      
321  
322  });
323
324  // register
325  $(document).ready(function(){
326
327      $('body').on('submit','.aramis_register_form', function(e){
328          e.preventDefault();
329
330          var $this = $(this);
331          var detail_register = $('body').find('.detail_register');
332          var alert = $('body').find('.alert');
333          var $phone = $(this).find('input[name="phone"]').val();
334          var $nonce = $(this).find('#nonce_plus_register').val();
335          var verify_form = $('body').find('.verify_otp');
336          var btn_sub = $(this).find('button');
337
338          var $username = $(this).find('input[name="username"]').val();
339          var $password = $(this).find('input[name="password"]').val();
340          var $email = $(this).find('input[name="email"]').val();
341          var action = 'register_with_phone';
342
343          var $form_btn = $this.find('.aramis__register_btn');
344          var $form_btn_text = $form_btn.html();
345
346              $form_btn.addClass('loading');
347              $form_btn.empty();
348
349          if( $(this).find('input[name="email"]').length)
350          {
351              action = '_woocmmerce_register';    
352          }
353          
354          
355          btn_sub.addClass('btn-loading');
356          
357
358          $.ajax({
359
360              type:'post', dataType:'json', url: optionarray.plus_url,
361              data:{
362                  action: action,
363                  phone_number: $phone,
364                  nonce_register: $nonce,
365                  email : $email,
366                  password : $password,
367                  username : $username,
368                  role: 'customer'
369                  
370              },
371              success: function(response)
372              {
373                $form_btn.removeClass('loading');
374                $form_btn.html( $form_btn_text );
375                  if(response.register)
376                  {
377                    
378                      alert.children().find('p').append(response.msg);
379                      alert.addClass('badge_green--border');
380                      alert.show();
381                      
382                      setTimeout(function(){
383                          window.location.href = response.redirect_url;
384                      },1000)
385
386                      return;
387                  }
388                  $this.hide();
389                  detail_register.hide();
390                  verify_form.show();
391                  verify_form.children().find('.msg_detail_number').append(response.msg);
392                  verify_form.find('.phone_number').attr('data-phone_number',$phone);
393                  btn_sub.removeClass('btn-loading');
394                  var resendTime      = parseInt( optionarray.wating_time_resend_otp );
395                  var $timer          = verify_form.find('.time_resend');
396                  
397                  if( resendTime > 0 ) {
398                      // $resendLink.addClass('disabled');
399                      var resendTimer;
400                      clearInterval( resendTimer );
401                      $timer.addClass('disable');
402                      resendTimer = setInterval(function(){
403
404                          $timer.html('('+resendTime+') ثانیه');
405
406                          if( resendTime <= 0 ){
407                              clearInterval( resendTimer );
408                              
409                              $timer.removeClass('disable');
410                              // $resendLink.removeClass('disabled');
411                              $timer.html('');
412                              $timer.append('<a href="javascript:void(0);" class="resend_otp_sms">ارسال مجدد</a>');
413                          }
414                          resendTime--;
415
416                      },1000);
417                  }
418
419              },
420              error: function(error)
421              {
422
423                $form_btn.removeClass('loading');
424                $form_btn.html( $form_btn_text );
425                 
426                  btn_sub.removeClass('btn-loading');
427
428                  if(error.responseJSON.user_exists)
429                  {
430                      alert.children().find('p').append(error.responseJSON.msg + '<a href="'+optionarray.WcPage.myacc+'" > '+error.responseJSON.msg_login+' </a>');
431
432                  }else{
433
434                      alert.children().find('p').append(error.responseJSON.msg);
435                  }
436
437                  alert.addClass('badge_danger--border');
438                  alert.show();
439
440                  setTimeout(function(){
441                      alert.removeClass('badge_danger--border');
442                      alert.children().find('p').empty();
443                      alert.hide();
444                  },3000);
445              }
446
447          });
448
449      })
450  });
451
452  // verify_otp register
453  $(document).ready(function(){
454
455      $('body').on('submit', '.verify_otp', function(e){
456          e.preventDefault();
457          var $this = $(this);
458          var otp = '';
459          var $nonce = $(this).find('.nonce_verify_otp').val();
460          var $phone = $(this).find('.phone_number').data('phone_number');
461          var alert = $('body').find('.alert');
462          var btn_sub = $(this).find('button');
463          btn_sub.addClass('btn-loading');
464            
465          $this.find('.phone_validate').each( function( index, input ){
466            
467              otp += $(this).val();
468          });
469
470          $.ajax({
471              dataType: 'json', type:'post', url: optionarray.plus_url,
472              data:{
473                  action: 'verify_otp',
474                  otp_sended : otp,
475                  phone : $phone,
476                  nonce_verify_otp: $nonce
477              },
478              success:function(response)
479              {
480                  alert.addClass('badge_green--border');
481                  alert.children().find('p').append(response.msg);
482                  alert.show();
483                  btn_sub.removeClass('btn-loading');
484
485                  window.location.href = optionarray.WcPage.myacc;
486              },
487
488              error:function(error)
489              {
490                
491
492                alert.children().find('p').append(error.responseJSON.msg);
493
494                  alert.addClass('badge_danger--border');
495                  alert.show();
496                  btn_sub.removeClass('btn-loading');
497                  setTimeout(function(){
498                      alert.removeClass('badge_danger--border');
499                      alert.children().find('p').empty();
500                      alert.hide();
501                  },5000);
502              }
503
504          });
505      });
506
507  });
508
509
510  //resend_otp_sms
511
512  $(document).ready(function(){
513
514      $('body').on('click','.resend_otp_sms',function(e){
515          e.preventDefault();
516          var $this = $(this);
517          var parent = $this.parents('.form-box');
518          var hashed = parent.find('.step_otp').attr('data-hashed');
519
520          var verify_form = $('body').find('.verify_otp_all,.login_register_otp,.login_register_otp_email,.form-box');
521       
522          parent.addClass('loading-resend');
523          $.ajax({
524              dataType:'json',type:'post',url:optionarray.plus_url,
525              data:{
526                  action:'action_resend_otp',
527                  nonce_resend: optionarray.aramis_script_nonce,
528                  hashed : hashed
529              },
530              success:function(response)
531              {
532                
533                timer_resend(verify_form);
534                show_alert(parent,response.msg,'success');
535                  
536              },
537              error:function(error)
538              {
539                show_alert(parent,error.responseJSON.msg,'error');
540               
541              }
542              
543          });
544
545      });
546
547  });
548
549  // edit nummber section
550
551  $(document).ready(function(){
552
553      $('body').on('click','.edit_number', function(e){
554
555          var parent = $(this).closest('.verify_otp_all');
556          var detail_register = $('body').find('.detail_register');
557          var register_form  = $('body').find('.aramis_register_form');
558          var login_form = $('body').find('.parrent_aramis_login');
559          var cod_for_phone = $('body').find('.msg_detail_number');
560
561          var login_register_together = $(this).closest('.login_register_otp');
562
563          var time_resend = login_register_together.find('.time_resend');
564
565          var timerId = parseInt(time_resend.attr('data-timer_time'));
566          
567          clearInterval(timerId);
568          
569          cod_for_phone.empty();
570          
571
572          if( login_register_together.length )
573          {
574                login_register_together.hide();
575                $('body').find('.form__login_register').show();
576                return;
577          }
578
579
580          if(register_form.length)
581          {
582              register_form.css('display','flex');
583
584              parent.css('display','none');
585
586              detail_register.show();
587
588              return;
589          }
590
591          if(login_form.length)
592          {
593              login_form.css('display','block');
594              $('body').find('.verify_otp_login').css('display','none');
595              return;
596          }
597
598      });
599
600  });
601
602  //login and register now
603
604  $(document).ready(function(){
605
606    
607    $('body').on('submit','.form__login_register',function(e){
608        e.preventDefault();
609        var $this = $(this);
610        var $value = $(this).find('input[name="username"]').val();
611        var $nonce = $(this).find('.nonce_login_register').val();
612
613        var captcha_val = false;
614        
615        var $captcha = $(this).find('textarea[name="g-recaptcha-response"]');
616
617        if( optionarray.captcha_is_enable )
618        {
619            captcha_val = $captcha.val();
620        }
621
622        var $parents = $this.closest('.login_register__body,.login_register_smart');
623        var btn = $this.find('.login_register__submitbtn');
624            btn.addClass('loading');
625        var text_btn = btn.html();
626            btn.empty();
627        
628        $.ajax({
629            type: 'POST',dataType :'json', url: optionarray.plus_url,
630            data:{
631                action:'login_register_together',
632                value : $value,
633                captcha : captcha_val,
634                nonce : $nonce
635            },
636            success: function(response)
637            {
638                $this.hide();
639                btn.removeClass('loading');
640                btn.html(text_btn);
641
642                if( 'email_login' === response.status || 'account_login' === response.status )
643                {
644                    var $login_form = $parents.find('.form_login_email');
645                    $login_form.find('.login_register__description').empty();
646                    $login_form.find('.login_register__description').html( response.msg );
647                    $login_form.show();
648                    $login_form.append('<input name="username_sended" type="hidden" value="'+$value+'">');
649                    
650                }
651                
652                if( 'email_register' === response.status )
653                {
654
655                    var $register_otp_form = $parents.find('.login_register_otp_email');
656
657                    $register_otp_form.find('.msg_detail_number').append(response.msg)
658                    
659                    var resendTime      = parseInt( optionarray.wating_time_resend_otp );
660                    var $timer          = $register_otp_form.find('.time_resend');
661                    
662                    if( resendTime > 0 ) {
663                        // $resendLink.addClass('disabled');
664                        var resendTimer;
665                        clearInterval( resendTimer );
666                        
667                        resendTimer = setInterval(function(){
668
669                            $timer.html('('+resendTime+') ثانیه');
670                            
671                            if( resendTime <= 0 ){
672                                clearInterval( resendTimer );
673                                // $timer.empty().append('<a href="#" class="resend_otp_sms">ارسال مجدد</a>');
674                                // $resendLink.removeClass('disabled');
675                                $timer.html('');
676                                $timer.append('<a href="javascript:void(0);" class="resend_otp_sms" data-type_value="email">ارسال مجدد</a>');
677                            }
678                            resendTime--;
679
680                        },1000);
681                        $timer.attr('data-timer_time',resendTimer);
682
683                    }
684
685                    $register_otp_form.show();
686                    $register_otp_form.append('<input name="username_sended" type="hidden" value="'+$value+'">');
687                }
688
689                if( 'mobile' === response.status )
690                {
691                    var $form_otp = $parents.find('.login_register_otp');
692                    $form_otp.find('.msg_detail_number').append(response.msg)
693                    
694                    var resendTime      = parseInt( optionarray.wating_time_resend_otp );
695                    var $timer          = $form_otp.find('.time_resend');
696                    
697                    if( resendTime > 0 ) {
698                        
699                        var resendTimer;
700                        clearInterval( resendTimer );
701                        
702                        resendTimer = setInterval(function(){
703
704                            $timer.html('('+resendTime+') ثانیه');
705                            
706                            if( resendTime <= 0 ){
707                                clearInterval( resendTimer );
708                                // $timer.empty().append('<a href="#" class="resend_otp_sms">ارسال مجدد</a>');
709                                // $resendLink.removeClass('disabled');
710                                $timer.html('');
711                                $timer.append('<a href="javascript:void(0);" class="resend_otp_sms" data-type_value="mobile" >ارسال مجدد</a>');
712                            }
713                            resendTime--;
714
715                        },1000);
716                        $timer.attr('data-timer_time',resendTimer);
717
718                    }
719
720                    $form_otp.show();
721                    $form_otp.append('<input name="username_sended" type="hidden" value="'+$value+'">');
722                }
723            },
724            error:function( error )
725            {
726                btn.removeClass('loading');
727                btn.html(text_btn);
728                
729                if( 'error' === error.responseJSON.status )
730                {
731                    $this.find('.login_register__description').after(show_alert_message( error.responseJSON.msg,error.responseJSON.status ));
732
733                    setTimeout(function(e){
734                        $('body').find('.alert_message').remove();
735                    },3000);
736                    
737                    if ( optionarray.captcha_is_enable ) {
738                        if (!window.grecaptcha) {
739                        } else {
740                            grecaptcha.reset();
741                        }
742                    }
743                }
744            }
745        });
746    });
747
748    $('body').on('submit','.form_login_email',function(e){
749        e.preventDefault();
750        var $this = $(this);
751        var $password = $this.find('input[name="password"]').val();
752        var $nonce = $this.find('.nonce_login_email').val();
753        var $value = $this.find('input[name="username_sended"]').val();
754
755        var btn = $this.find('.login_register__submitbtn');
756        btn.addClass('loading');
757        var text_btn = btn.html();
758        btn.empty();
759      
760        $.ajax({
761            type: 'POST',dataType :'json', url: optionarray.plus_url,
762            data : {
763                action : 'email_or_account_login',
764                nonce : $nonce,
765                value : $value,
766                password : $password
767            },
768            success:function(response)
769            {
770                btn.removeClass('loading');
771                btn.html(text_btn);
772                if( 'success' === response.status )
773                {
774                    $this.find('.login_register__description').after(show_alert_message( response.msg,response.status ));
775                    window.location.href = optionarray.WcPage.myacc;
776                }
777            },
778            error:function( error )
779            {
780                btn.removeClass('loading');
781                btn.html(text_btn);
782                if( 'error' === error.responseJSON.status )
783                {
784                    $this.find('.login_register__description').after(show_alert_message( error.responseJSON.msg,error.responseJSON.status ));
785
786                    setTimeout(function(e){
787                        $('body').find('.alert_message').remove();
788                    },3000);
789                    
790                }
791            }
792        });
793
794    });
795
796  });
797
798  function show_alert_message( $msg , $class )
799  {
800     return $('<div class="alert_message '+$class+'"> <i class="fa-light fa-square-exclamation"></i> '+$msg+' </div>');
801  }
802
803  async function copyToClipboard(text) {
804    if (text === "") return;
805    try {
806      await navigator.clipboard.writeText(text);
807    } catch (err) {
808      console.error("Failed to copy: ", err);
809    }
810  }
811
812  const btn_copy__codes = document.querySelectorAll(".btn_copy__code");
813
814  const tabbar_buttons_container = document.querySelector(
815    ".tabbar_container__buttons"
816  );
817
818  const tabbar_contents_container = document.querySelector(
819    ".tabbar_container__contents"
820  );
821
822  const accordion_containers = document.querySelectorAll(".accordion_container");
823  
824  if (tabbar_buttons_container && tabbar_contents_container) {
825    const tabbar_buttons = Array.from(tabbar_buttons_container.children);
826    const tabbar_contents = Array.from(tabbar_contents_container.children);
827    tabbar_buttons.forEach((button, index) => {
828      const selectedTab = tabbar_contents[index];
829      button.addEventListener("click", () => {
830        tabbar_buttons.forEach((item) => item.classList.remove("show"));
831        tabbar_contents.forEach((item) => item.classList.remove("show"));
832        button.classList.add("show");
833        selectedTab.classList.add("show");
834      });
835    });
836  }
837
838  if (accordion_containers.length > 0) {
839    accordion_containers.forEach((menu) => {
840      const btn_open = menu.querySelector(".accordion_button");
841      btn_open.addEventListener("click", () => {
842        menu.classList.toggle("opened");
843      });
844    });
845  }
846  
847  if (btn_copy__codes.length > 0) {
848    btn_copy__codes.forEach((button) => {
849        const content = button.querySelector(".content");
850        const status = button.querySelector('.status');
851        button.addEventListener("click", () => {
852        copyToClipboard(content.innerHTML)
853        status.innerHTML = "کپی شد"
854        button.classList.add('active');
855        setTimeout(() => {
856            status.innerHTML = "کپی کردن"
857            button.classList.remove('active');
858        }, 5000);
859        });
860    });
861 }
862
863 $('.dashboard_sidebar__container .btn_toggle__sidebar').click(function() {
864    $('.dashboard_sidebar__container').toggleClass('opened');
865    $('.dashboard_sidebar__container').find(".blob").toggleClass('d-none');
866 });
867
868
869  //new form login register
870  $(document).ready(function(){
871
872    $('.first_step').on('submit',function(e){
873        e.preventDefault();
874        var $this = $(this);
875        var from_parent = $this.parents('.form-box');
876        var $value = $this.find('.username').val();
877        var $nonce = $(this).find('.nonce_login_register').val();
878
879        var captcha_val = false;
880        var $captcha = $(this).find('textarea[name="g-recaptcha-response"]');
881
882        //otp form
883        var form_otp = $('.step_otp');
884        var parent_formotp = form_otp.parents('.form-box');
885
886        if( optionarray.captcha_is_enable )
887        {
888            captcha_val = $captcha.val();
889        }
890
891        var passwod_form = $('.step_password');
892        var password_from_parent = passwod_form.parents('.form-box');
893
894        var register_form = $('.register_step');
895        var parent_register_form = register_form.parents('.form-box');
896        $this.find('.submit-btn').addClass('loading');
897        $this.find('.submit-btn').attr('disabled',true);
898        remove_show_password();
899        $.ajax({
900            type: 'POST',dataType :'json', url: optionarray.plus_url,
901            data:{
902                action:'login_register_together',
903                value : $value,
904                captcha : captcha_val,
905                nonce : $nonce
906            },
907            success:function(response){
908
909                $this.find('.submit-btn').removeClass('loading');
910                $this.find('.submit-btn').attr('disabled',false);
911
912                if( 'register_mobile' === response.status || 'register_email' === response.status || 'login' === response.status )
913                {
914                    if( 'login' === response.status )
915                    {
916                        show_password(parent_formotp);
917                        password_from_parent.find('.title_password').html(response.msg);
918                    }
919
920                    timer_resend(parent_formotp)
921                    from_parent.hide();
922                    parent_formotp.find('.title_otp').html(response.msg);
923                    parent_formotp.show();
924                    form_otp.attr('data-hashed',response.hashed);
925                    back_to_start(parent_formotp,from_parent,response.back_to_start);
926                    
927                    return;
928                }
929
930                if( !response?.tooltip_text?.step )
931                {
932                    $('a.tooltip.go_to_otp_auth').remove();
933                    $('a.tooltip.reset_pass').remove();
934                }else{
935                    $('a.tooltip.go_to_otp_auth').attr('data-tooltip',response.tooltip_text.send_otp);
936                    $('a.tooltip.reset_pass').attr('data-tooltip',response.tooltip_text.reset_password);
937                }
938                
939                from_parent.hide();
940                password_from_parent.show();
941                password_from_parent.find('.title_password').html(response.msg);
942                passwod_form.find('.go_to_otp_auth').attr('data-hashed',response.hashed);
943                show_alert(from_parent,response.msg,'success');
944                back_to_start(password_from_parent,from_parent,response.back_to_start);
945            },
946            error : function(error){
947                $this.find('.submit-btn').removeClass('loading');
948                $this.find('.submit-btn').attr('disabled',false);
949                show_alert(from_parent,error.responseJSON.msg,'error');
950            }
951        });
952
953    });
954
955    $('.step_password').on('submit',function(e){
956        e.preventDefault();
957        var $this = $(this);
958        var from_parent = $this.parents('.form-box');
959        var $nonce = $this.find('.nonce_login_email').val();
960        var $value = from_parent.find('.msg_strong').text();
961
962        var $password = $this.find('.password').val();
963
964        $this.find('.submit-btn').addClass('loading');
965        $this.find('.submit-btn').attr('disabled',true);
966  
967        $.ajax({
968            type: 'POST',dataType :'json', url: optionarray.plus_url,
969            data : {
970                action : 'email_or_account_login',
971                nonce : $nonce,
972                value : $value,
973                password : $password
974            },
975            success: function(response){
976
977                $this.find('.submit-btn').removeClass('loading');
978                $this.find('.submit-btn').attr('disabled',false);
979
980                show_alert(from_parent,response.msg,'success');
981                
982                setTimeout(() => {
983                    if( $('body.plus_is_checkout').length ){
984                        window.location.href = optionarray.checkout_url;
985                    }else{
986                        window.location.href = response.redirect_url;
987                    }
988                }, 1000);
989            },
990            error : function(error){
991                $this.find('.submit-btn').removeClass('loading');
992                $this.find('.submit-btn').attr('disabled',false);
993
994                show_alert(from_parent,error.responseJSON.msg,'error');
995            }
996        });
997
998    });
999
1000    var ajax_start = false;
1001    $('.go_to_otp_auth').on('click',function(e){
1002        e.preventDefault();
1003        if( ajax_start )
1004        {
1005            return;
1006        }
1007
1008        var $this = $(this);
1009        var from  = $this.parents('.step_password');
1010        var parents = from.parents('.form-box');
1011        var $nonce = from.find('.nonce_login_email').val();
1012        var form_otp = $('.step_otp');
1013        var parent_otp = form_otp.parents('.form-box');
1014        var hashed = $this.attr('data-hashed');
1015
1016        from.find('.submit-btn').addClass('loading');
1017        from.find('.submit-btn').attr('disabled',true);
1018        $this.attr('disabled',true);
1019        ajax_start = true;
1020        $.ajax({
1021            type: 'POST',dataType :'json', url: optionarray.plus_url,
1022            data : {
1023                action : 'send_otp',
1024                nonce : $nonce,
1025                hashed_data : hashed
1026            },
1027            success : function(response)
1028            {
1029                from.find('.submit-btn').removeClass('loading');
1030                from.find('.submit-btn').attr('disabled',false);
1031                $this.attr('disabled',false);
1032                form_otp.attr('data-hashed',response.hashed);
1033                from.parents('.form-box').hide();
1034                parent_otp.show();
1035                timer_resend(parent_otp);
1036                parent_otp.find('.title_otp').html(response.msg);
1037                ajax_start = false;
1038                back_to_start(parent_otp,$('body .first_step'),response.back_to_start)
1039            },
1040            error : function(error){
1041                from.find('.submit-btn').removeClass('loading');
1042                from.find('.submit-btn').attr('disabled',false);
1043                $this.attr('disabled',false);
1044                show_alert(parents,error.responseJSON.msg,'error');
1045                ajax_start = false;
1046                back_to_start(parent_otp,$('body .first_step'))
1047            }
1048        });
1049        
1050        
1051    });
1052
1053    $('.step_otp').on('submit',function(e){
1054
1055        e.preventDefault();
1056        var $this = $(this);
1057        var parent_otp = $this.parents('.form-box');
1058        var hashed = $this.attr('data-hashed');
1059        var $nonce = $(this).find('.nonce_verify_otp').val();
1060        var otp = '';
1061        
1062        //register
1063        var register_form = $('.register_step');
1064        var parent_register_form = register_form.parents('.form-box');
1065        
1066        $this.find('.otp-input').each( function( index, input ){
1067            
1068            otp += $(this).val();
1069        });
1070
1071        otp = toEnglishDigits(otp);
1072        
1073        $this.find('.submit-btn').addClass('loading');
1074        $this.find('.submit-btn').attr('disabled',true);
1075        $.ajax({
1076            dataType: 'json', type:'post', url: optionarray.plus_url,
1077              data:{
1078                  action: 'verify_otp',
1079                  otp_sended : otp,
1080                  hashed : hashed,
1081                  nonce_verify_otp: $nonce
1082              },
1083              success: function(response){
1084
1085                $this.find('.submit-btn').removeClass('loading');
1086                $this.find('.submit-btn').attr('disabled',false);
1087                 if('register' === response.step)
1088                 {
1089                    if( 'email' === response.register )
1090                    {
1091                        register_form.find('.email_here').empty();
1092                        $(`${'<input type="text" id="phone" name="phone" required autocomplete="off"><label for="phone">شماره موبایل</label><svg class="input-icon" width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M5 4H9L11 9L8.5 10.5C9.57096 12.6715 11.3285 14.429 13.5 15.5L15 13L20 15V19C20 19.5304 19.7893 20.0391 19.4142 20.4142C19.0391 20.7893 18.5304 21 18 21C14.0993 20.763 10.4202 19.1065 7.65683 16.3432C4.8935 13.5798 3.23705 9.90074 3 6C3 5.46957 3.21071 4.96086 3.58579 4.58579C3.96086 4.21071 4.46957 4 5 4" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" /> </svg></div>'}`).appendTo('.email_here');
1093                    }
1094                    parent_otp.hide();
1095                    register_form.attr('data-hashed',response.hashed);
1096                    parent_register_form.show();
1097                    return;
1098                 }
1099
1100                 if( 'rest_pass'=== response.step )
1101                 {
1102                    parent_otp.hide();
1103                    const from_rest_pass = $('.reset_password');
1104                    const parent_rest_pass = from_rest_pass.parents('.form-box');
1105                    from_rest_pass.attr('data-hashed',response.hashed);
1106                    parent_rest_pass.show();
1107                    return;
1108                 }
1109                 
1110                show_alert(parent_otp,response.msg,'success');
1111
1112                setTimeout(() => {
1113                    if( $('body.plus_is_checkout').length ){
1114                        window.location.href = optionarray.checkout_url;
1115                    }else{
1116                        window.location.href = response.redirect_url;
1117                    }
1118                    
1119                }, 1000);
1120
1121              },
1122              error : function(error){
1123
1124                $this.find('.submit-btn').removeClass('loading');
1125                $this.find('.submit-btn').attr('disabled',false);
1126
1127                show_alert(parent_otp,error.responseJSON.msg,'error');
1128              },
1129        });
1130    });
1131
1132    var isAjaxLoading = false;
1133    $('.reset_pass').on('click',function(e){
1134        e.preventDefault();
1135
1136        if (isAjaxLoading) {
1137            return; 
1138        }
1139        var $this = $(this);
1140        var parent = $this.parents('.step_password');
1141        var parents = parent.parents('.form-box');
1142        var hashed = parent.find('.go_to_otp_auth').attr('data-hashed');
1143
1144        var form_otp = $('.step_otp');
1145        var parent_otp = form_otp.parents('.form-box');
1146        
1147        parent.find('.submit-btn').addClass('loading');
1148        parent.find('.submit-btn').attr('disabled',true);
1149
1150        isAjaxLoading = true;
1151        $.ajax({
1152            dataType: 'json', type:'post', url: optionarray.plus_url,
1153              data:{
1154                  action: 'lets_reset_password',
1155                  hashed : hashed,
1156                  nonce_lets_reset : optionarray.nonce
1157              },
1158              success: function(response){
1159              
1160                parent.find('.submit-btn').removeClass('loading');
1161                parent.find('.submit-btn').attr('disabled',false);
1162                
1163                form_otp.attr('data-hashed',response.hashed);
1164                parent.parents('.form-box').hide();
1165                parent_otp.show();
1166                timer_resend(parent_otp);
1167                parent_otp.find('.title_otp').html(response.msg);
1168                isAjaxLoading = false;
1169              },
1170              error : function(error){
1171                
1172                parent.find('.submit-btn').removeClass('loading');
1173                parent.find('.submit-btn').attr('disabled',false);
1174
1175                show_alert(parents,error.responseJSON.msg,'error');
1176                isAjaxLoading = false;
1177              },
1178        });
1179
1180    });
1181
1182    $('.reset_password').on('submit',function(e){
1183        e.preventDefault();
1184        var $this = $(this);
1185        var newpassword = $this.find('.newpassword').val();
1186        var repatpassword = $this.find('.repeatpassword').val();
1187        var parent = $this.parents('.form-box');
1188
1189        if( newpassword !== repatpassword )
1190        {
1191            return show_alert(parent,'رمزعبور یکسان نیست','error');
1192        }
1193
1194        if(newpassword.length < 6) 
1195        {
1196            return show_alert(parent,'رمز عبور نمیتواند کوچک تر از 6 رقم باشد','error');
1197        }
1198
1199        var nonce_reset_password = $this.find('.nonce_reset_password').val();
1200        var hashed = $this.attr('data-hashed');
1201
1202        $this.find('.submit-btn').addClass('loading');
1203        $this.find('.submit-btn').attr('disabled',true);
1204
1205        $.ajax({
1206            dataType: 'json', type:'post', url: optionarray.plus_url,
1207              data:{
1208                  action: 'reset_password',
1209                  hashed : hashed,
1210                  nonce_reset_password: nonce_reset_password,
1211                  newpassword : newpassword
1212              },
1213              success: function(response){
1214
1215                $this.find('.submit-btn').removeClass('loading');
1216                $this.find('.submit-btn').attr('disabled',false);
1217
1218                show_alert(parent,response.msg,'success');
1219
1220                setTimeout(() => {
1221                    if( $('body.plus_is_checkout').length ){
1222                        window.location.href = optionarray.checkout_url;
1223                    }else{
1224                        window.location.href = response.redirect_url;
1225                    }
1226                    
1227                }, 1000);
1228              },
1229              error : function(error){
1230                $this.find('.submit-btn').removeClass('loading');
1231                $this.find('.submit-btn').attr('disabled',false);
1232                show_alert(parent,error.responseJSON.msg,'error');
1233              },
1234        });
1235   });
1236   
1237   $('.register_step').on('submit',function(e){
1238        e.preventDefault();
1239        var $this = $(this);
1240        var parent = $this.parent('.form-box');
1241        var username = $this.find('.user_name').val();
1242        var email = $this.find('.email').val();
1243        var phone = $this.find('#phone').val();
1244        var birth_day = $this.find('#birth_day').val();
1245        var newpassword = $this.find('.new_password').val();
1246        var repatpassword = $this.find('.repate_password').val();
1247        var nonce_register_form = $this.find('.nonce_form_register').val();
1248        var hashed = $this.attr('data-hashed');
1249
1250        var isValid = /^[a-zA-Z0-9_]+$/.test(username); 
1251
1252        if( !isValid )
1253        {
1254            return show_alert(parent,optionarray.errors.latinUsername,'error');
1255        }
1256
1257        if( newpassword !== repatpassword )
1258        {
1259            return show_alert(parent,optionarray.errors.passwordNotSame,'error');
1260        }
1261        
1262        if(newpassword.length < 6) 
1263        {
1264            return show_alert(parent,optionarray.errors.passwordLessThan,'error');
1265        }
1266
1267        $this.find('.submit-btn').addClass('loading');
1268        $this.find('.submit-btn').attr('disabled',true);
1269
1270        $.ajax({
1271
1272            dataType: 'json', type:'post', url: optionarray.plus_url,
1273              data:{
1274                  action: 'register_form',
1275                  hashed : hashed,
1276                  nonce_register_form: nonce_register_form,
1277                  username : username,
1278                  email : email,
1279                  phone : phone,
1280                  password : newpassword,
1281                  birth_day : birth_day
1282              },
1283              success:function(response){
1284
1285                $this.find('.submit-btn').removeClass('loading');
1286                $this.find('.submit-btn').attr('disabled',false);
1287
1288                show_alert(parent,response.msg,'success');
1289                
1290                setTimeout(() => {
1291                    if( $('body.plus_is_checkout').length ){
1292                        window.location.href = optionarray.checkout_url;
1293                    }else{
1294                        window.location.href = response.redirect_url;
1295                    }
1296                }, 1000);
1297        
1298              },
1299              error : function(error){
1300                $this.find('.submit-btn').removeClass('loading');
1301                $this.find('.submit-btn').attr('disabled',false);
1302
1303                show_alert(parent,error.responseJSON.msg,'error');
1304              }
1305        });
1306   });
1307
1308   if( $('#birth_day').length )
1309    {
1310        $("#birth_day").on("change", function () {
1311                if ($(this).val().trim() !== "") {
1312                $(this).addClass("has-value");
1313            } else {
1314                $(this).removeClass("has-value");
1315            }
1316        });
1317
1318        if ($("#birth_day").val().trim() !== "") {
1319            $("#birth_day").addClass("has-value");
1320        }
1321        kamaDatepicker('birth_day',
1322            {
1323                twodigit : false
1324            }
1325        );
1326    }
1327  });
1328
1329  function toEnglishDigits(str) {
1330    return str
1331        .replace(/[Û°-Û¹]/g, d => 'Û°Û±Û²Û³Û´ÛµÛ¶Û·Û¸Û¹'.indexOf(d))
1332        .replace(/[٠-٩]/g, d => '٠١٢٣٤٥٦٧٨٩'.indexOf(d));
1333 }
1334
1335 function back_to_start($current,$back,$text)
1336 {
1337    $('body').find('.back_to_start').text($text);
1338
1339    $('body').on('click','.back_to_start',function(){
1340        let $this = $(this);
1341        let current = $this.parents('.form-box');
1342
1343        var alert =  $back.find('.alert');
1344
1345        if( alert.length )
1346        {
1347            alert.hide();
1348        }
1349        current.hide();
1350
1351        $back.show();
1352    });
1353 }
1354
1355  function timer_resend( $form_otp )
1356  {
1357      var resendTime      = parseInt( optionarray.wating_time_resend_otp );
1358      var $timer          = $form_otp.find('.timer');
1359      
1360      if( resendTime > 0 ) {
1361          
1362          var resendTimer;
1363
1364          clearInterval( resendTimer );
1365          
1366          resendTimer = setInterval(function(){
1367
1368            if( !$timer.find('#countdown').length )
1369            {
1370                $timer.html(optionarray.resend_text+' <span id="countdown"></span>');
1371            }
1372              $timer.find('#countdown').html('('+resendTime+') ثانیه');
1373              
1374              if( resendTime <= 0 ){
1375                  clearInterval( resendTimer );
1376                  $timer.html('');
1377                  $timer.append('<a href="javascript:void(0);" class="resend_otp_sms" data-type_value="mobile" >ارسال مجدد</a>');
1378              }
1379              resendTime--;
1380
1381          },1000);
1382          $timer.attr('data-timer_time',resendTimer);
1383      }
1384  }
1385
1386  function show_alert( form,msg,type )
1387  {
1388    var alert =  form.find('.alert');
1389    var msg_box = alert.find('.alert_msg');
1390
1391    if( type == 'error' )
1392    {
1393        msg_box.html(msg);    
1394        alert.addClass('alert-error');
1395        alert.show();
1396
1397    }
1398
1399    if( type === 'success' )
1400    {
1401        msg_box.html(msg);    
1402        alert.addClass('alert-success');
1403        alert.show();
1404    }
1405    setTimeout(function(){
1406        if( alert.hasClass('alert-error') ){
1407            alert.removeClass('alert-error');
1408        }
1409        if( alert.hasClass('alert-success') ){
1410            alert.removeClass('alert-success');
1411        }
1412        alert.hide();
1413    },3000);
1414      
1415  }
1416
1417  function show_password($need_to_append)
1418  {
1419    
1420     $need_to_append.find('.extra-links').append('<a href="#" class="show_password" onclick="event.preventDefault();">'+optionarray.login_whit_password+'</a>');
1421
1422     $('body').on('click','.show_password',function(){
1423        let password_step = $('.step_password').parent('.form-box');
1424        password_step.find('.go_to_otp_auth').remove();
1425        password_step.show();
1426
1427        $(this).parents('.form-box').hide();
1428     });
1429  }
1430  function remove_show_password()
1431  {
1432    $('body').find('.extra-links .show_password').remove();
1433  }
1434  //checkout fixed
1435
1436    if( $('body.plus_is_checkout').length )
1437    {
1438    
1439        let login_register_wd = $('.wd-dropdown-register');
1440        let login_register_wd_side = $('.login-form-side');
1441        let wd_button_login = $('.wd-header-my-account');
1442
1443        if( login_register_wd.length || login_register_wd_side.length )
1444        {
1445            login_register_wd.remove();
1446            login_register_wd_side.remove();
1447            wd_button_login.removeClass('wd-with-overlay');
1448        }
1449    }
1450  
1451})( jQuery );
1452
1453function onloadCallbackCaptcha()
1454{
1455   if( optionarray.captcha_is_enable )
1456   {
1457       if (!window.grecaptcha) {
1458       } else {
1459           setTimeout(function(){
1460               var recaptchas = document.getElementsByClassName("ga-recaptcha");
1461               for(var i=0; i<recaptchas.length; i++) {
1462                   var recaptcha = recaptchas[i];
1463                   var sitekey = recaptcha.dataset.sitekey;
1464
1465                   grecaptcha.render(recaptcha, {
1466                       'sitekey' : sitekey
1467                   });
1468               }
1469           }, 500);
1470       }
1471   }
1472}
1473
1474
1475function myFunction() {
1476    document.getElementById("myDropdown").classList.toggle("show");
1477  }
1478  
1479  // Close the dropdown if the user clicks outside of it
1480window.onclick = function(event) {
1481    if (!event.target.matches('.dropbtn')) {
1482      var dropdowns = document.getElementsByClassName("dropdown-content");
1483      var i;
1484      for (i = 0; i < dropdowns.length; i++) {
1485        var openDropdown = dropdowns[i];
1486        if (openDropdown.classList.contains('show')) {
1487          openDropdown.classList.remove('show');
1488        }
1489      }
1490    }
1491}

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.