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.