1(function() { 2 /** 3 * @param {Function} callback 4 */ 5 function ready(callback) { 6 if (document.readyState === 'complete') { 7 callback.call(null); 8 return; 9 } 10 var clearListeners = function() { 11 window.removeEventListener('load', delegate); 12 document.removeEventListener('DOMContentLoaded', delegate); 13 }; 14 var delegate = function() { 15 clearListeners(); 16 callback.call(null); 17 }; 18 window.addEventListener('load', delegate); 19 document.addEventListener('DOMContentLoaded', delegate); 20 } 21 /** 22 * Decoding helper function 23 * 24 * @param {number} charCode 25 * @param {number} start 26 * @param {number} end 27 * @param {number} offset 28 * @return {string} 29 */ 30 function decryptCharcode(charCode, start, end, offset) { 31 charCode = charCode + offset; 32 if (offset > 0 && charCode > end) { 33 charCode = start + (charCode - end - 1); 34 } else if (offset < 0 && charCode < start) { 35 charCode = end - (start - charCode - 1); 36 } 37 return String.fromCharCode(charCode); 38 } 39 /** 40 * Decodes string 41 * 42 * @param {string} value 43 * @param {number} offset 44 * @return {string} 45 */ 46 function decryptString(value, offset) { 47 var result = ''; 48 for (var i=0; i < value.length; i++) { 49 var charCode = value.charCodeAt(i); 50 if (charCode >= 0x2B && charCode <= 0x3A) { 51 result += decryptCharcode(charCode,0x2B,0x3A,offset); /* 0-9 . , - + / : */ 52 } else if (charCode >
52= 0x40 && charCode <= 0x5A) { 53 result += decryptCharcode(charCode,0x40,0x5A,offset); /* A-Z @ */ 54 } else if (charCode >= 0x61 && charCode <= 0x7A) { 55 result += decryptCharcode(charCode,0x61,0x7A,offset); /* a-z */ 56 } else { 57 result += value.charAt(i); 58 } 59 } 60 return result; 61 } 62 63 /** 64 * Opens URL in new window. 65 * 66 * @param {string} url 67 * @param {string|null} target 68 * @param {string|null} features 69 * @return {Window} 70 */ 71 function windowOpen(url, target, features) { 72 var windowRef = window.open(url, target, features); 73 if (windowRef) { 74 windowRef.focus(); 75 } 76 return windowRef; 77 } 78 79 // @deprecated Will be removed in TYPO3 v12.0 80 if (typeof window['linkTo_UnCryptMailto'] === 'undefined') { 81 window['linkTo_UnCryptMailto'] = function(value, offset) { 82 console.warn('Function linkTo_UnCryptMailto() is deprecated and will be remove in TYPO3 v12.0'); 83 if (value && offset) { 84 document.location.href = decryptString(value, offset); 85 } 86 }; 87 } 88 89 ready(function() { 90 var mailtoElements = document.querySelectorAll('a[data-mailto-token][data-mailto-vector]'); 91 // `Array.from` for IE compatibility 92 Array.from(mailtoElements).forEach(function(element) { 93 element.addEventListener('click', function(evt) { 94 evt.preventDefault(); 95 var dataset = evt.currentTarget.dataset; 96 var value = dataset.mailtoToken; 97 var offset = parseInt(dataset.mailtoVector, 10) * -1; 98 document.location.href = decryptString(value, offset); 99 }); 100 }); 101 var openElements = document.querySelectorAll('a[data-window-url]'); 102 // `Array.from` for IE compatibility 103 Array.from(openElements).forEach(function(element) { 104 element.addEventListener('click', function(evt) { 105 evt.preventDefault(); 106 var dataset = evt.currentTarget.dataset; 107 var url = dataset.windowUrl; 108 var target = dataset.windowTarget || null; 109 var features = dataset.windowFeatures || null; 110 windowOpen(url, target, features); 111 }); 112 }); 113 }); 114})();
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.