1/*globals icl_vars, wpml_xdomain_data */ 2 3var WPMLCore = WPMLCore || {}; 4 5WPMLCore.XdomainData = function() { 6 this.links = document.querySelectorAll('.' + wpml_xdomain_data.css_selector + ' a'); 7 8 var self = this; 9 10 for(var i = 0; i < this.links.length; i++) { 11 this.links[i].addEventListener('click', function(e) { 12 var link = self.getClosestLink(e.target); 13 var currentUrl = window.location.href; 14 var targetUrl = link.getAttribute('href'); 15 16 if ('#' !== targetUrl && currentUrl !== targetUrl) { 17 e.preventDefault(); 18 self.onLinkClick(link); 19 } 20 }); 21 } 22}; 23 24WPMLCore.XdomainData.prototype = { 25 getClosestLink: function(maybeLink) { 26 var tagName = maybeLink.nodeName.toLowerCase(); 27 if(tagName === 'a') { 28 return maybeLink; 29 } 30 31 return this.getClosestLink(maybeLink.parentNode); 32 }, 33 34 onLinkClick: function(link) { 35 var self = this; 36 var originalUrl = link.getAttribute('href'); 37 // Filter out xdomain_data if already in the url 38 originalUrl = originalUrl.replace(/&xdomain_data(=[^&]*)?(?=&|$)|xdomain_data(=[^&]*)?(&|$)/, ''); 39 originalUrl = originalUrl.replace(/\?$/, ''); 40 41 var data = { 42 action: 'switching_language', 43 from_language: wpml_xdomain_data.current_language, 44 _nonce: wpml_xdomain_data._nonce, 45 }; 46 var params = []; 47 for(var prop in data) { 48 if(typeof data[prop] !== 'undefined') { 49 params.push(encodeURIComponent(prop) + '=' + encodeURIComponent(data[prop])); 50 } 51 } 52 params = params.join('&', params); 53 54 /** @namespace icl_vars.current_language */ 55 var req = new XMLHttpRequest(); 56 req.open("POST", wpml_xdomain_data.ajax_url); 57 req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 58 req.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 59 req.setRequestHeader('Accept', 'application/json, text/javascript, */*; q=0.01'); 60 61 req.onload = function() { 62 const response = JSON.parse(req.response); 63 self.onSuccess(response, originalUrl); 64 }; 65 req.onerror = function() { 66 location.href = originalUrl; 67 }; 68 69 req.send(params); 70 }, 71 72 onSuccess: function(response, originalUrl) { 73 var argsGlue; 74 var url; 75 var hash; 76 var urlSplit; 77 var xdomain; 78 var form; 79 80 if (response.data.xdomain_data) { 81 if (response.success) { 82 if ('post' === response.data.method) { 83 84 // POST 85 form = document.createElement('form'); 86 form.setAttribute('method', 'post'); 87 form.setAttribute('action', originalUrl); 88 xdomain = document.createElement('input'); 89 xdomain.setAttribute('type', 'hidden'); 90 xdomain.setAttribute('name', 'xdomain_data'); 91 xdomain.setAttribute('value', response.data.xdomain_data); 92 93 form.appendChild(xdomain); 94 document.body.appendChild(form); 95 96 form.submit(); 97 98 } else { 99 // GET 100 urlSplit = originalUrl.split('#'); 101 hash = ''; 102 if (1 < urlSplit.length) { 103 hash = '#' + urlSplit[1]; 104 } 105 url = urlSplit[0]; 106 if (url.indexOf('?') === -1) {argsGlue = '?';} else {argsGlue = '&';} 107 /** @namespace response.data.xdomain_data */ 108 url = originalUrl + argsGlue + 'xdomain_data=' + response.data.xdomain_data + hash; 109 location.href = url; 110 } 111 112 } else { 113 url = originalUrl; 114 location.href = url; 115 } 116 } else { 117 location.href = originalUrl; 118 } 119 }, 120}; 121 122document.addEventListener('DOMContentLoaded', function() { 123 var xd = new WPMLCore.XdomainData(); 124});
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.