1BX.namespace('Aspro'); 2 3BX.Aspro.Utils = { 4 isFunction: (func) => { 5 return typeof func == 'function' || typeof window[func] === 'function'; 6 }, 7 8 readyDOM: (callback) => { 9 if (document.readyState !== 'loading') { 10 callback(); 11 } 12 else { 13 document.addEventListener('DOMContentLoaded', callback) 14 15 // BX.ready(() => { 16 // callback() 17 // }); 18 } 19 }, 20}; 21 22BX.namespace('Aspro.Loader'); 23BX.namespace('Aspro.Observer'); 24 25(() => { 26 /** 27 * class JAsproLoader 28 */ 29 30 const addedCss = []; 31 const addedJs = []; 32 const addedExt = []; 33 34 class JAsproLoader { 35 constructor() { 36 } 37 38 addCss(...items) { 39 return new Promise((resolve, reject) => { 40 items = items.filter((css) => { 41 return BX.type.isString(css) && !~addedCss.indexOf(css); 42 }); 43 44 if (items.length) { 45 BX.load(items, () => { 46 items.forEach((css) => { 47 addedCss.push(css); 48 }); 49 50 resolve(); 51 }); 52 } 53 else { 54 resolve(); 55 } 56 }); 57 } 58 59 addJs(...items) { 60 return new Promise((resolve, reject) => { 61 items = items.filter((js) => { 62 return BX.type.isString(js) &&!~addedJs.indexOf(js); 63 }); 64 65 if (items.length) { 66 BX.loadScript(items, () => { 67 items.forEach((js) => { 68 addedJs.push(js); 69 }); 70 71 resolve(); 72 }); 73 } 74 else { 75 resolve(); 76 } 77 }); 78 } 79 80 addExt(...extensions) { 81 return new Promise((resolve, reject) => { 82 extensions = extensions.map((extension) => { 83 return `aspro_${extension}`; 84 }); 85 86 extensions = extensions.filter((extension) => { 87 return BX.type.isString(extension) && !~addedExt.indexOf(extension); 88 }); 89 90 if (extensions.length) { 91 BX.loadExt(extensions).then(() => { 92 extensions.forEach((extension) => { 93 addedExt.push(extension); 94 }); 95 96 resolve(); 97 }); 98 } 99 else { 100 resolve(); 101 } 102 }); 103 } 104 105 added(item) { 106 if (BX.type.isString(item) && item) { 107 return !!~addedCss.indexOf(item) || !!~addedJs.indexOf(item) || !!~addedExt.indexOf(`aspro_${item}`); 108 } 109 else { 110 return { 111 ext: addedExt, 112 css: addedCss, 113 js: addedJs, 114 }; 115 } 116 } 117 118 add(params) { 119 params = BX.type.isObject(params) ? params : {}; 120 let extensions = params.ext ? (BX.type.isArray(params.ext) ? params.ext : [params.ext]) : []; 121 let cssItems = params.css ? (BX.type.isArray(params.css) ? params.css : [params.css]) : []; 122 let jsItems = params.js ? (BX.type.isArray(params.js) ? params.js : [params.js]) : []; 123 124 return new Promise((resolve, reject) => { 125 this.addExt(...extensions).then(() => { 126 this.addCss(...cssItems).then(() => { 127 this.addJs(...jsItems).then(() => { 128 resolve(); 129 }); 130 }); 131 }); 132 }); 133 } 134 135 once(params) { 136 params = BX.type.isObject(params) ? params : {}; 137 138 params.appear = BX.type.isString(params.appear) ? [params.appear] : (BX.type.isArray(params.appear) ? params.appear : null); 139 params.add = BX.type.isObject(params.add) ? params.add : null; 140 141 return new Promise((resolve, reject) => { 142 if (params.appear) { 143 BX.Aspro.Observer.appear(...params.appear).then(() => { 144 if (params.add) { 145 this.add(params.add).then(resolve); 146 } 147 else { 148 resolve(); 149 } 150 }); 151 } 152 else if (params.add) { 153 this.add(params.add).then(resolve); 154 } 155 else { 156 resolve(); 157 } 158 }); 159 } 160 } 161 162 BX.Aspro.Loader = new JAsproLoader(); 163 164 /** 165 * class JAsproObserver 166 */ 167 168 const intersectionConfig = { 169 root: null, 170 rootMargin: '0px', 171 threshold: 0, 172 }; 173 174 class JAsproObserver { 175 constructor() { 176 this.mkIntersectionConfig(); 177 } 178 179 mkIntersectionConfig(config) { 180 if (BX.type.isObject(config)) { 181 intersectionConfig.root = config.root; 182 intersectionConfig.rootMargin = config.rootMargin; 183 intersectionConfig.threshold = config.threshold; 184 } 185 else { 186 intersectionConfig.rootMargin = '0px'; 187 } 188 } 189 190 appear(node, config) { 191 config = BX.type.isObject(config) && config ? config : intersectionConfig; 192 193 return new Promise((resolve, reject) => { 194 if (BX.type.isString(node)) { 195 let nodes = document.querySelectorAll(node); 196 if (nodes.length) { 197 let observer = new IntersectionObserver( 198 (entries, observer) => {
199 entries.forEach(entry => { 200 if (entry.isIntersecting) { 201 observer.unobserve(entry.target); 202 203 resolve(); 204 } 205 }); 206 }, 207 config 208 ); 209 210 nodes.forEach((node) => { 211 observer.observe(node); 212 }); 213 } 214 else { 215 resolve(); 216 } 217 } 218 else if (BX.type.isDomNode(node)) { 219 new IntersectionObserver( 220 (entries, observer) => { 221 entries.forEach(entry => { 222 if (entry.isIntersecting) { 223 observer.unobserve(entry.target); 224 225 resolve(); 226 } 227 }); 228 }, 229 config 230 ).observe(node); 231 } 232 else { 233 resolve(); 234 } 235 }); 236 } 237 } 238 239 BX.Aspro.Observer = new JAsproObserver(); 240})(); 241 242['click', 'keyup', 'change'].forEach((name) => { 243 document.addEventListener(name, (event) => { 244 BX.onCustomEvent(`app.document.${name}`, [event]); 245 }); 246});
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.