PageSourceSearch

https://gca.org/wp-content/themes/gca/acf-blocks/custom/gca_event-…/js/gca_event-form2.js?ver=1790907638

js gca.org collected 2026-10-02 02:23:23 UTC 18,562 bytes, 475 lines download raw bytes

1jQuery(document).ready(function($){
2    const request = ( params = {}, url = gca.ajaxurl, method = 'GET', file = null ) => {
3        let options = {
4            method,
5            credentials: 'same-origin',
6        };
7        if(!file) {
8            options.headers = {
9                'Content-Type': 'application/x-www-form-urlencoded',
10                'Cache-Control': 'no-cache',
11            }
12        }
13        if ( 'GET' === method ) {
14            url += '?' + ( new URLSearchParams( params ) ).toString();
15        } else {
16            if(file) {
17                const form = new FormData();
18                for ( var key in params ) {
19                    if('organization_logo'==key){
20                        let files = params[key];
21                        if(files.length>0){
22                            for(let i=0; i<files.length; i++){
23                                form.append(key, files[i]);
24                            }
25                        }
26                    }
27                    if('event_photos_videos'==key){
28                        let files = params[key];
29                        if(files.length>0){
30                            for(let i=0; i<files.length; i++){
31                                form.append(key+''+(i+1), files[i]);
32                            }
33                        }
34                    }
35                    else{
36                        form.append(key, params[key]);
37                    }
38                }
39                options.body = form;
40            } else {
41                const form = new FormData();
42                for ( var key in params ) {
43                    form.append(key, params[key]);
44                }
45                options.body = new URLSearchParams(form);
46            }
47        }
48    
49        return fetch( url, options ).then( response => response.json() );
50    };
51    
52    const get = ( params, url ) => request( params, url, 'GET' );
53    const post = ( params, url ) => request( params, url, 'POST' );
54    const post_with_file = ( params, url ) => request( params, url, 'POST', true );
55
56    const ajaxSend = async (formData, button = null) => {
57        return await $.ajax({
58            type: "POST",
59            dataType: "json",
60            url: gca.ajaxurl,
61            data: {nonce: gca.nonce, ...formData},
62            success: function(res) {
63                if (button) {
64                    $(button).removeClass('disabled');
65                }
66                return res;
67            },
68            error: function(x, xhr, e) {
69                console.error(x, xhr, e);
70                if (button) {
71                    $(button).removeClass('disabled');
72                }
73                return {
74                    status: 0,
75                    message: 'Unexpected error'
76                };
77            },
78        });
79    }
80
81    $('.js-gca_event-form2 textarea').on('keyup', function(){
82        let val = $.trim($(this).val());
83        let length = val.length ?? 0;
84        $(this).closest('.gfield').find('.js-textarea-count').text(length);
85    });
86
87    const form2FieldsState1 = [
88        '.js-gca_event-form2 [name="email"]',
89        '.js-gca_event-form2 [name="full_name"]',
90    ];
91
92    const form2FieldsVerification = [
93        '.js-gca_event-form2 [name="verification_code"]',
94    ];
95
96    const form2FieldsState2 = [
97        '.js-gca_event-form2 [name="country"]',
98        '.js-gca_event-form2 [name="city"]',
99        '.js-gca_event-form2 [name="organization_type"]',
100        '.js-gca_event-form2 [name="organization_name"]',
101        '.js-gca_event-form2 [name="organization_logo"]',
102        '.js-gca_event-form2 [name="event_impact"]',
103        '.js-gca_event-form2 [name="event_coverage"]',
104        '.js-gca_event-form2 [name="event_photos_videos"]',
105    ];
106
107    let maxFileSize = 5;
108    let maxFileSizeTotal = 25;
109
110    let organization_logo_input = document.querySelector('.js-gca_event-form2 [name="organization_logo"]');
111    let event_photos_videos_input = document.querySelector('.js-gca_event-form2 [name="event_photos_videos"]');
112    let organization_logo_drop_area = document.querySelector('.js-gca_event-form2 .js-organization_logo-drop_area');
113    let event_photos_videos_drop_area = document.querySelector('.js-gca_event-form2 .js-event_photos_videos-drop_area');
114    if(organization_logo_input){
115        organization_logo_input.addEventListener('change', (e) => {
116            e.preventDefault();
117            let files = organization_logo_input.files ?? '';
118            handleFiles(organization_logo_input, files, true);
119        })
120    }
121    if(event_photos_videos_input){
122        event_photos_videos_input.addEventListener('change', (e) => {
123            e.preventDefault();
124            let files = event_photos_videos_input.files ?? '';
125            handleFiles(event_photos_videos_input, files, true);
126        })
127    }
128    $('.js-gca_event-form2').on('click', '.js-remove-file-item', function(e){
129        e.preventDefault();
130        let multiple = $(this).closest('.gfield').hasClass('gfield--type-file-multiple');
131        if(multiple){
132            let index = Number($(this).attr('data-index'));
133            removeFileFromFileList(index);
134        }
135        else{
136            $(this).closest('.gfield').find('input').val('');
137            $(this).closest('.gfield').find('.js-selected-files-items').html('');
138        }
139    });
140
141    function removeFileFromFileList(index) {
142        const dt = new DataTransfer();
143        let files = document.querySelector('.js-gca_event-form2 [name="event_photos_videos"]').files ?? '';
144        if(files.length>0){
145            for(let i=0; i<files.length; i++){
146                if(i!=index){
147                    dt.items.add(files[i]);
148                }
149            }
150        }
151        event_photos_videos_input.files = dt.files;
152        handleFiles(event_photos_videos_input, event_photos_videos_input.files, true);
153    }
154
155    // drop file
156
157    function handleDrop_organization_logo(e) {
158        e.preventDefault();
159        organization_logo_drop_area.classList.remove('drag-over');
160        const files = e.dataTransfer.files;
161      
162        if (files.length) {
163            organization_logo_input.files = files;
164            handleFiles(organization_logo_input, organization_logo_input.files, false);
165        }
166    }
167
168    function handleDrop_event_photos_videos(e) {
169        e.preventDefault();
170        const files = e.dataTransfer.files;
171        
172        if (files.length) {
173            const dt = new DataTransfer();
174            let dFiles = document.querySelector('.js-gca_event-form2 [name="event_photos_videos"]').files ?? '';
175            let dFilesName = [];
176            if(dFiles.length>0){
177                for(let i=0; i<dFiles.length; i++){
178                    dt.items.add(dFiles[i]);
179                    dFilesName.push(dFiles[i].name);
180                }
181            }
182            for(let i=0; i<files.length; i++){
183                if(dFilesName.length<=0){
184                    dt.items.add(files[i]);
185                }
186                else{
187                    if(!dFilesName.includes(files[i].name)){
188                        dt.items.add(files[i]);
189                    }
190                }
191            }
192            event_photos_videos_input.files = dt.files;
193            handleFiles(event_photos_videos_input, event_photos_videos_input.files, true);
194        }
195    }
196      
197    function handleFiles(selector, files, multiple=false) {
198        if(files){
199            let selected_item = '';
200            for(let i=0; i<files.length; i++){
201                selected_item +=
202                `<div class="item">
203                    <div class="item-inner">
204                        <div class="title">${files[i].name}</div>
205                        <div class="icon js-remove-file-item" data-index="${i}">
206                            <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
207                                <path d="M14 5.99884L5.9988 14.0012" stroke="#1A1A1A" stroke-linecap="square" stroke-linejoin="round"/>
208                                <path d="M14 14.0012L5.9988 5.99878" stroke="#1A1A1A" stroke-linecap="square" stroke-linejoin="round"/>
209                            </svg>
210                        </div>
211                    </div>
212                </div>`;
213                if(!multiple){
214                    break;
215                }
216            }
217            $(selector).closest('.gfield').find('.js-selected-files-items').html(selected_item);
218        }
219        else{
220            $(selector).closest('.gfield').find('.js-selected-files-items').html('');
221        }
222    }
223
224    // Utility function to prevent default browser behavior
225    function preventDefaults(e) {
226        e.preventDefault();
227        e.stopPropagation();
228    }
229
230    // // Preventing default browser behavior when dragging a file over the container
231    // organization_logo_drop_area.addEventListener('dragover', preventDefaults);
232    // organization_logo_drop_area.addEventListener('dragenter', preventDefaults);
233    // organization_logo_drop_area.addEventListener('dragleave', preventDefaults);
234
235    // // Handling dropping files into the area
236    // organization_logo_drop_area.addEventListener('drop', handleDrop_organization_logo);
237    // organization_logo_drop_area.addEventListener('dragover', (e) => {
238    //     organization_logo_drop_area.classList.add('drag-over');
239    // });
240
241    // organization_logo_drop_area.addEventListener('dragleave', (e) => {
242    //     organization_logo_drop_area.classList.remove('drag-over');
243    // });
244
245    // Preventing default browser behavior when dragging a file over the container
246    if(event_photos_videos_drop_area) {
247        event_photos_videos_drop_area.addEventListener('dragover', preventDefaults);
248        event_photos_videos_drop_area.addEventListener('dragenter', preventDefaults);
249        event_photos_videos_drop_area.addEventListener('dragleave', preventDefaults);
250    
251        // Handling dropping files into the area
252        event_photos_videos_drop_area.addEventListener('drop', handleDrop_event_photos_videos);
253        event_photos_videos_drop_area.addEventListener('dragover', (e) => {
254            event_photos_videos_drop_area.classList.add('drag-over');
255        });
256    
257        event_photos_videos_drop_area.addEventListener('dragleave', (e) => {
258            event_photos_videos_drop_area.classList.remove('drag-over');
259        });
260    }
261
262    
263    
264    // $('.js-gca_event-form2 ');
265    $('.js-gca_event-form2 #gca_event_form_verify_button').on('click', async function(e){
266        e.preventDefault();
267        let _this = this;
268        if($(_this).hasClass('disabled')) return;
269        $(_this).addClass('disabled');
270
271        clearForm2FieldError();
272
273        let state = $(_this).attr('data-state');
274
275        //debug
276        // state = '3';
277        //
278
279        let email = $('.js-gca_event-form2 [name="email"]').val();
280        let full_name = $('.js-gca_event-form2 [name="full_name"]').val();
281        let event_version = $('.js-gca_event-form2 [name="event_version"]').val();
282
283        let formData = {
284            action : 'gca_event_form_get_code',
285            form_type : 'form2',
286            email : email,
287            full_name : full_name,
288            event_version : event_version,
289        }
290
291        if(state=="2" || state=="3"){
292            formData.action = 'gca_event_form_verify_code';
293
294            formData.verification_code = $('.js-gca_event-form2 [name="verification_code"]').val();
295        }
296
297        if(state=="3"){
298            formData.action = 'gca_event_form2_submit';
299
300            formData.country = $('.js-gca_event-form2 [name="country"]').val() ?? '';
301            formData.city = $('.js-gca_event-form2 [name="city"]').val();
302            formData.organization_type = $('.js-gca_event-form2 [name="organization_type"]').val() ?? '';
303            formData.organization_name = $('.js-gca_event-form2 [name="organization_name"]').val();
304            formData.organization_logo = document.querySelector('.js-gca_event-form2 [name="organization_logo"]').files ?? '';
305            formData.event_impact = $('.js-gca_event-form2 [name="event_impact"]').val();
306            formData.event_coverage = $('.js-gca_event-form2 [name="event_coverage"]').val();
307            formData.event_photos_videos = document.querySelector('.js-gca_event-form2 [name="event_photos_videos"]').files ?? '';
308
309            if(formData.event_photos_videos.length>7){
310                setFormFieldError($('.js-gca_event-form2 [name="event_photos_videos"]'), 'Exceeds max upload files.');
311                $(_this).removeClass('disabled');
312                return;
313            }
314        }
315
316
317        let res = await post_with_file(formData);
318        
319        if(res.errors){
320            for (const [key, value] of Object.entries(res.errors)) {
321                let field = $(`.js-gca_event-form2 form [name="${key}"]`);
322                setFormFieldError(field, value);
323            }
324        }
325        
326        if(res.status==1){
327            
328            $('.js-gca_event-form2 .form-message').removeClass('success-message').text('').hide();
329
330            if(state=="1"){
331                $(_this).attr('data-state', '2');
332                $(_this).val($(_this).attr('data-state2'));
333
334                $('.js-gca_event-form2 .verification_code-wrapper').removeClass('hide');
335                disableForm2FieldError("1");
336
337            }
338            if(state=="2"){
339                $(_this).attr('data-state', '3');
340                $(_this).val($(_this).attr('data-state3'));
341
342                $('.js-gca_event-form2 .form-step-info').removeClass('hide');
343                disableForm2FieldError("2");
344            }
345
346            if(state=="3"){
347                $(_this).attr('data-state', '1');
348                $(_this).val($(_this).attr('data-state1'));
349
350                resetForm2();
351                $('.js-gca_event-form2 .verification_code-wrapper').addClass('hide');
352                $('.js-gca_event-form2 .form-step-info').addClass('hide');
353                $('.js-gca_event-form2 .form-step-verify').addClass('hide');
354                $('.js-gca_event-form2 .form-step-submit').addClass('hide');
355                
356                $('.js-gca_event-form2 .form-message').addClass('success-message');
357                $('.js-gca_event-form2 .form-message').text(res.message).show();
358
359                $('.js-gca_event-form2 .form-step-download').removeClass('hide');
360                $('.js-gca_event-form2 .form-step-download a').attr('href', res.download.url);
361                $('.js-gca_event-form2 .form-step-download a').attr('download', res.download.name);
362                $('.js-gca_event-form2 .form-step-download a').attr('target', '_blank');
363            }
364
365            
366        }
367        else{
368            if(res.message){
369                $('.js-gca_event-form2 .form-message').text(res.message).show();
370            }
371            else{
372                $('.js-gca_event-form2 .verification_code-wrapper').removeClass('hide');
373            }
374        }
375        $(_this).removeClass('disabled');
376    });
377
378    function clearForm2FieldError($clearValue=false){
379        for(let i=0; i<form2FieldsState1.length; i++){
380            $(form2FieldsState1[i]).closest('.gfield').find('.gfield_validation_message').remove();
381            $(form2FieldsState1[i]).closest('.gfield').removeClass('gfield_error');
382            if($clearValue){
383                $(form2FieldsState1[i]).val('');
384            }
385        }
386
387        for(let i=0; i<form2FieldsVerification.length; i++){
388            $(form2FieldsVerification[i]).closest('.gfield').find('.gfield_validation_message').remove();
389            $(form2FieldsVerification[i]).closest('.gfield').removeClass('gfield_error');
390            if($clearValue){
391                $(form2FieldsVerification[i]).val('');
392            }
393        }
394
395        for(let i=0; i<form2FieldsState2.length; i++){
396            $(form2FieldsState2[i]).closest('.gfield').find('.gfield_validation_message').remove();
397            $(form2FieldsState2[i]).closest('.gfield').removeClass('gfield_error');
398            if($clearValue){
399                $(form2FieldsState2[i]).val('');
400            }
401        }
402
403        $('.js-gca_event-form2 .form-message').hide();
404    }
405
406    function disableForm2FieldError(state="1"){
407        for(let i=0; i<form2FieldsState1.length; i++){
408            $(form2FieldsState1[i]).attr('disabled', true);
409        }
410        if(state=="2"){
411            for(let i=0; i<form2FieldsVerification.length; i++){
412                $(form2FieldsVerification[i]).attr('disabled', true);
413                $(form2FieldsVerification[i]).closest('.gfield').addClass('gfield_success');
414                setFormFieldSuccess($(form2FieldsVerification[i]), 'Code confirmed');
415            }
416        }
417    }
418
419    function enableForm2FieldError(){
420        for(let i=0; i<form2FieldsState1.length; i++){
421            $(form2FieldsState1[i]).attr('disabled', false);
422        }
423    }
424
425    function resetForm2(){
426        clearForm2FieldError(true);
427        let top = $('.js-gca_event-form2').position().top - 100;
428        $('html, body').animate({
429            scrollTop: top,
430        });
431    }
432
433    // 
434
435    function setFormFieldError(field, message){
436        if (field.length<=0) return;
437        let formField = field.closest('.gfield');
438        if (formField.length>0) {
439            formField.addClass('gfield_error');
440            let el = formField.find('.gfield_validation_message');
441            if(el.length>0){
442                el.text(message);
443            }
444            else{
445                const p = document.createElement('div');
446                p.classList.add('gfield_description');
447                p.classList.add('validation_message');
448                p.classList.add('gfield_validation_message');
449                p.innerHTML = message;
450                formField.append(p);
451            }
452        }
453    }
454
455    function setFormFieldSuccess(field, message){
456        if (field.length<=0) return;
457        let formField = field.closest('.gfield');
458        if (formField.length>0) {
459            formField.addClass('gfield_success');
460            let el = formField.find('.gfield_validation_message');
461            if(el.length>0){
462                el.text(message);
463            }
464            else{
465                const p = document.createElement('div');
466                p.classList.add('gfield_description');
467                p.classList.add('validation_message');
468                p.classList.add('gfield_validation_message');
469                p.innerHTML = message;
470                formField.append(p);
471            }
472        }
473    }
474
475});

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.