Advertisement
Guest User

Untitled

a guest
Jul 17th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Stage('Обработка и отправка постов на сервер',  'postsumbit',   Stage.DOMREADY,     function(){
  2.     if(!window.thread.board) return; //не запускаем на главной
  3.     var request;
  4.     var busy = false;
  5.     var valid = false;
  6.     var $qr = $('#qr');
  7.     var $forms =  $('#postform,#qr-postform');
  8.     var $submit_buttons = $('#qr-submit,#submit');
  9.     //todo просмотреть, можно ли ускорить кешируя ссылки на $("qr-blabla") в переменную
  10.     var sendForm = function(form) {
  11.         //@сафаридауны
  12.  
  13.         if(FormFiles.vip) $('.filer__input').val('');
  14.         var formData = new FormData(form);
  15.  
  16.         busy = true;
  17.        
  18.         //эта пипка для подмены пикч, если из мультиселекта было что-то удалено
  19.         if(FormFiles.vip) {
  20.             if (typeof formData.delete === "function") formData.delete('formimages[]');
  21.             for(var i=0, len=FormFiles.filtered.length; i<len; i++) {
  22.                 formData.append('formimages[]', FormFiles.filtered[i]);
  23.             }
  24.         }
  25.  
  26.         // var keys = [], vals = [];
  27.         // for (var value of formData.values()) {
  28.         //    vals.push(value);
  29.         // }
  30.         // for (var key of formData.keys()) {
  31.         //    keys.push(key) ;
  32.         // }
  33.         // for(let i = 0; i < keys.length; i++) {
  34.         //  console.log(keys[i] + ': ' + vals[i]);
  35.         // }
  36.  
  37.         request = $.ajax({
  38.             url: '/makaba/posting.fcgi?json=1',  //Server script to process data
  39.             type: 'POST',
  40.             dataType: 'json',
  41.             xhr: function() {  // Custom XMLHttpRequest
  42.                 var myXhr = $.ajaxSettings.xhr();
  43.                 if(myXhr.upload){ // Check if upload property exists
  44.                     myXhr.upload.addEventListener('progress', progressHandling, false); // For handling the progress of the upload
  45.                 }
  46.                 return myXhr;
  47.             },
  48.             //Ajax events
  49.             success: on_send_success,
  50.             error: on_send_error,
  51.             // Form data
  52.             data: formData,
  53.             //Options to tell jQuery not to process data or worry about content-type.
  54.             cache: false,
  55.             contentType: false,
  56.             processData: false
  57.         });
  58.  
  59.         renderSending();
  60.     };
  61.     window.sendForm = sendForm;
  62.  
  63.     var renderSending = function(){
  64.         /*var inputs = forms.find('input,select,textarea').not('[type=submit]');
  65.          inputs.attr('disabled','disabled');*/
  66.         $submit_buttons.attr('value', 'Отправка...');
  67.     };
  68.  
  69.     var renderSendingDone = function(){
  70.         /*var inputs = forms.find('input,select,textarea').not('[type=submit]');
  71.          inputs.removeAttr('disabled');*/
  72.         $submit_buttons.attr('value', 'Отправить');
  73.     };
  74.  
  75.     var progressHandling = function(e) {
  76.         var percent = 100/e.total*e.loaded;
  77.         if(percent >= 99) return $submit_buttons.attr('value', 'Обработка...');
  78.  
  79.         var bpercent = ( (Math.round(percent*100))/100 ).toString().split('.');
  80.         if(!bpercent[1]) bpercent[1] = 0;
  81.         bpercent = (bpercent[0].length==1?'0'+bpercent[0]:bpercent[0]) + '.' + (bpercent[1].length==1?bpercent[1]+'0':bpercent[1]);
  82.  
  83.         $('#qr-progress-bar').attr('value', e.loaded).attr('max', e.total);
  84.         $submit_buttons.attr('value', bpercent + '%');
  85.     };
  86.  
  87.     var on_send_error = function(request) {
  88.         if(request.statusText == 'abort') {
  89.             $alert('Отправка сообщения отменена');
  90.         }else{
  91.             $alert('Ошибка постинга: ' + request.statusText);
  92.         }
  93.  
  94.         on_complete();
  95.     };
  96.  
  97.     var on_send_success = function(data) {
  98.         if(data.Error) {
  99.             if(data.Id) {
  100.                 $alert(data.Reason + '<br><a href="/ban?Id=' + data.Id + '" target="_blank">Подробнее</a>', 'wait');
  101.             }else{
  102.                 $alert('Ошибка постинга: ' + (data.Reason || data.Error));
  103.             }
  104.         }else if(data.Status && data.Status == 'OK') {
  105.             $alert('Сообщение успешно отправлено');
  106.             var current_posts;
  107.             var num;
  108.             //Favorites если тред && other.autowatchmyposts, то авто-подпись на пост
  109.             if(Store.get('other.autowatchmyposts', true) && window.thread.id) {
  110.                 num = window.thread.id;
  111.                 if(!Favorites.isFavorited(window.thread.id)) {
  112.                     Favorites.add(num);
  113.                 }
  114.                 current_posts = Store.get('favorites.' + num + '.posts', false);
  115.                 if(current_posts) {
  116.                     Store.set('favorites.' + num + '.posts', current_posts.concat(data.Num));
  117.                 } else {
  118.                     Store.set('favorites.' + num + '.posts', [data.Num]);
  119.                 }  
  120.             }
  121.  
  122.             //сохранить номер поста и тред, если включа настройка higlight_myposts
  123.             if(Store.get('other.higlight_myposts',true)) {
  124.                 num = window.thread.id; //по хорошему это не сработает если постилось в тред с нулевой при включенной опции "не перенаправлять в тред"
  125.                 current_posts = Store.get('myposts.' + window.thread.board + '.' + num, []);
  126.                 Store.set('myposts.' + window.thread.board + '.' + num, current_posts.concat(data.Num));
  127.             }
  128.            
  129.             if(Store.get('other.qr_close_on_send', true)) $('#qr').hide();
  130.  
  131.             if(!window.thread.id) { //костыль
  132.                 var behavior = Store.get('other.on_reply_from_main', 1);
  133.                 if(behavior == 1) {
  134.                     window.location.href = '/' + window.board + '/res/' + $('#qr-thread').val() + '.html#' + data.Num;
  135.                 }
  136.             }else{
  137.                 var highlight_num = data.Num;
  138.                 PostF.updatePosts(function(data){
  139.                     if(Favorites.isFavorited(window.thread.id)) Favorites.setLastPost(data.data, window.thread.id);
  140.                     Post(highlight_num).highlight();
  141.                     //higlight_myposts
  142.                     //if(Store.get('other.higlight_myposts', true))  Post(highlight_num).highlight_myposts();
  143.                 });
  144.             }
  145.             resetInputs();
  146.         }else if(data.Status && data.Status == 'Redirect') {
  147.             var num = data.Target;
  148.             $alert('Тред №' + num + ' успешно создан');
  149.            
  150.             //костылик, при создании треда для автодобавления в избранное, если есть настройка autowatchmythreads
  151.             if(Store.get('other.autowatchmythreads', false)) Store.set('other.mythread_justcreated', true);
  152.  
  153.             window.location.href = '/' + window.board + '/res/' + num + '.html';
  154.         }else{
  155.             $alert('Ошибка постинга');
  156.         }
  157.  
  158.         on_complete();
  159.     };
  160.  
  161.     var on_complete = function() {
  162.         busy = false;
  163.         renderSendingDone();
  164.     };
  165.  
  166.     var resetInputs = function() {
  167.         $('#subject').val('');
  168.         $('#shampoo, #qr-shampoo').val('');
  169.         $('.postform__len').html(window.thread.max_comment);
  170.         if(window.FormFiles) window.FormFiles.reset();
  171.         $('.oekaki-image').val(''); //очистка оекаки
  172.         $('.oekaki-metadata').val(''); //очистка оекаки
  173.         $('.oekaki-clear').prop('disabled', true);
  174.         $('.message-sticker-preview').html(''); // sticker
  175.         $('.sticker-input').remove();
  176.     };
  177.  
  178.     var saveToStorage = function() {
  179.         Store.set('thread.postform.name', $('#name').val());
  180.         Store.set('thread.postform.email', $('#e-mail').val());
  181.         var icon = $('.anoniconsselectlist').val();
  182.         if(icon) Store.set('thread.postform.icon.' + window.thread.board, icon);
  183.     };
  184.  
  185.     var validator_error = window.postform_validator_error = function(id, msg) {
  186.         var $el = $('#' + id);
  187.         var $qr_el = $('#qr-' + id);
  188.  
  189.         if(msg) $alert(msg);
  190.  
  191.         $el.addClass('error');
  192.         $qr_el.addClass('error');
  193.         (activeForm.attr('id') == 'qr-shampoo') ? $qr_el.focus() : $el.focus();
  194.     };
  195.  
  196.     var validateForm = function(is_qr) {
  197.         var $c_id    = $('.captcha__key');
  198.         var len = unescape(encodeURIComponent($('#shampoo').val())).length;
  199.         var max_len = parseInt(window.thread.max_comment);
  200.  
  201.         if($('input[name=thread]').val()=='0' && window.FormFiles && window.FormFiles.max && !window.FormFiles.count && !is_qr && !window.thread.enable_oekaki) return $alert('Для создания треда загрузите картинку');
  202.         if($('input[name=thread]').val()=='0' && $('input[name=subject]').val()=='' && board == 'news') return $alert('Для создания треда заполните поле "Тема"');  //вкл. обязательное поле "тема" в news
  203.         if($('input[name=thread]').val()=='0' && $('input[name=tags]').val()=='' && ( board == 'vg' || board == 'tv' )) return $alert('Для создания треда заполните поле "Теги"'); //вкл. обязательное поле "теги" в vg
  204.         if(!len && window.FormFiles && window.FormFiles.max && !window.FormFiles.count && !FormFiles.oekaki && !FormFiles.sticker) return validator_error('shampoo', 'Вы ничего не ввели в сообщении'); //не проверять оекаки
  205.         if(len > max_len) return validator_error('shampoo', 'Максимальная длина сообщения ' + max_len + ' <b>байт</b>, вы ввели ' + len);
  206.  
  207.         return true;
  208.     };
  209.    
  210.     var renderCaptchaResolve = function(){
  211.         /*var inputs = forms.find('input,select,textarea').not('[type=submit]');
  212.          inputs.attr('disabled','disabled');*/
  213.         $submit_buttons.attr('value', 'Капча...');
  214.     };
  215.  
  216.     $forms.on('submit', function(){
  217.         if(typeof FormData == 'undefined') return; //старый браузер
  218.         if(busy) {
  219.             request.abort();
  220.             return false;
  221.         }
  222.         window.FormFiles.appendToForm(this);
  223.         var form = $(this);
  224.  
  225.         saveToStorage();
  226.        
  227.         //if(validateForm(form.attr('id') == 'qr-postform')) sendForm(form[0]);
  228.        
  229.         //@todo
  230.         //господи Иисуси это надо поправить как-нибудь...
  231.         var widgetQr;
  232.         var renderCaptcha = function() {
  233.             var key = window.config.captchaKey;
  234.             if(key == -1 || key == -2) {
  235.                 try {
  236.                     if(validateForm(form.attr('id') == 'qr-postform')) sendForm(form[0]);
  237.                     //sendForm(form[0]);
  238.                 } catch(e) {
  239.                     console.log(e);
  240.                     $alert('При отправке поста  с пасскодом возникла ошибка, проверьте консоль на наличие лога; key - ' + key);
  241.                     return false;
  242.                 }
  243.                    
  244.             }else{
  245.                 $('.captcha__key').val(key);
  246.                 if ( $('#captcha-widget').html()=='' ) {
  247.                     //проверка капчи до отправки файлов
  248.                     //@todo
  249.                     renderCaptchaResolve();
  250.                     widgetQr = grecaptcha.render('captcha-widget', {
  251.                         'sitekey' : key,
  252.                         'theme' : 'light',
  253.                         'size' : 'invisible',
  254.                         'callback': function(r) {
  255.                             //var r = grecaptcha.getResponse();
  256.                             var e = document.getElementById('captcha-widget-main');
  257.                             e.innerHTML = '';
  258.                             var input = document.createElement("input");
  259.                             input.type = 'hidden';
  260.                             input.name = 'g-recaptcha-response';
  261.                             input.value = r;
  262.                             e.appendChild(input);
  263.                             //sendForm(form[0]);
  264.                             if(validateForm(form.attr('id') == 'qr-postform')) sendForm(form[0]);
  265.                         },
  266.                     });
  267.                     grecaptcha.execute(widgetQr);
  268.                 } else {
  269.                     renderCaptchaResolve();
  270.                     grecaptcha.reset(widgetQr);
  271.                     grecaptcha.execute(widgetQr);
  272.                 }
  273.             }
  274.         }
  275.         //if(Store.get('other.captcha_provider','google') == '2chaptcha') {
  276.         //    sendForm(form[0]);
  277.         //} else if(validateForm(form.attr('id') == 'qr-postform')) {
  278.            renderCaptcha();
  279.         //}
  280.        
  281.         return false;
  282.     });
  283.  
  284.     $('#qr-cancel-upload').click(function(){
  285.         request.abort();
  286.     });
  287.  
  288.     resetInputs();
  289. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement