;(function(window){ if (window.BX.ajax) return; var BX = window.BX, tempDefaultConfig = {}, defaultConfig = { method: 'GET', // request method: GET|POST dataType: 'html', // type of data loading: html|json|script timeout: 0, // request timeout in seconds. 0 for browser-default async: true, // whether request is asynchronous or not processData: true, // any data processing is disabled if false, only callback call scriptsRunFirst: false, // whether to run _all_ found scripts before onsuccess call. script tag can have an attribute "bxrunfirst" to turn this flag on only for itself emulateOnload: true, skipAuthCheck: false, // whether to check authorization failure (SHOUD be set to true for CORS requests) start: true, // send request immediately (if false, request can be started manually via XMLHttpRequest object returned) cache: true, // whether NOT to add random addition to URL preparePost: true, // whether set Content-Type x-www-form-urlencoded in POST headers: false, // add additional headers, example: [{'name': 'If-Modified-Since', 'value': 'Wed, 15 Aug 2012 08:59:08 GMT'}, {'name': 'If-None-Match', 'value': '0'}] lsTimeout: 30, //local storage data TTL. useless without lsId. lsForce: false //wheter to force query instead of using localStorage data. useless without lsId. /* other parameters: url: url to get/post data: data to post onsuccess: successful request callback. BX.proxy may be used. onfailure: request failure callback. BX.proxy may be used. onprogress: request progress callback. BX.proxy may be used. lsId: local storage id - for constantly updating queries which can communicate via localStorage. core_ls.js needed any of the default parameters can be overridden. defaults can be changed by BX.ajax.Setup() - for all further requests! */ }, ajax_session = null, loadedScripts = {}, loadedScriptsQueue = [], r = { 'url_utf': /[^\034-\254]+/g, 'script_self': /\/bitrix\/js\/main\/core\/core(_ajax)*.js$/i, 'script_self_window': /\/bitrix\/js\/main\/core\/core_window.js$/i, 'script_self_admin': /\/bitrix\/js\/main\/core\/core_admin.js$/i, 'script_onload': /window.onload/g }; // low-level method BX.ajax = function(config) { var status, data; if (!config || !config.url || !BX.type.isString(config.url)) { return false; } for (var i in tempDefaultConfig) if (typeof (config[i]) == "undefined") config[i] = tempDefaultConfig[i]; tempDefaultConfig = {}; for (i in defaultConfig) if (typeof (config[i]) == "undefined") config[i] = defaultConfig[i]; config.method = config.method.toUpperCase(); if (!BX.localStorage) config.lsId = null; if (BX.browser.IsIE()) { var result = r.url_utf.exec(config.url); if (result) { do { config.url = config.url.replace(result, BX.util.urlencode(result)); result = r.url_utf.exec(config.url); } while (result); } } if(config.dataType == 'json') config.emulateOnload = false; if (!config.cache && config.method == 'GET') config.url = BX.ajax._uncache(config.url); if (config.method == 'POST' && config.preparePost) { config.data = BX.ajax.prepareData(config.data); } var bXHR = true; if (config.lsId && !config.lsForce) { var v = BX.localStorage.get('ajax-' + config.lsId); if (v !== null) { bXHR = false; var lsHandler = function(lsData) { if (lsData.key == 'ajax-' + config.lsId && lsData.value != 'BXAJAXWAIT') { var data = lsData.value, bRemove = !!lsData.oldValue && data == null; if (!bRemove) BX.ajax.__run(config, data); else if (config.onfailure) config.onfailure("timeout"); BX.removeCustomEvent('onLocalStorageChange', lsHandler); } }; if (v == 'BXAJAXWAIT') { BX.addCustomEvent('onLocalStorageChange', lsHandler); } else { setTimeout(function() {lsHandler({key: 'ajax-' + config.lsId, value: v})}, 10); } } } if (bXHR) { config.xhr = BX.ajax.xhr(); if (!config.xhr) return; if (config.lsId) { BX.localStorage.set('ajax-' + config.lsId, 'BXAJAXWAIT', config.lsTimeout); } config.xhr.open(config.method, config.url, config.async); if (!config.skipBxHeader && !BX.ajax.isCrossDomain(config.url)) { config.xhr.setRequestHeader('Bx-ajax', 'true'); } if (config.method == 'POST' && config.preparePost) { config.xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); } if (typeof(config.headers) == "object") { for (i = 0; i < config.headers.length; i++) config.xhr.setRequestHeader(config.headers[i].name, config.headers[i].value); } if(!!config.onprogress) { BX.bind(config.xhr, 'progress', config.onprogress); } var bRequestCompleted = false; var onreadystatechange = config.xhr.onreadystatechange = function(additional) { if (bRequestCompleted) return; if (additional === 'timeout') { if (config.onfailure) { config.onfailure("timeout"); } BX.onCustomEvent(config.xhr, 'onAjaxFailure', ['timeout', '', config]); config.xhr.onreadystatechange = BX.DoNothing; config.xhr.abort(); if (config.async) { config.xhr = null; } } else { if (config.xhr.readyState == 4 || additional == 'run') { status = BX.ajax.xhrSuccess(config.xhr) ? "success" : "error"; bRequestCompleted = true; config.xhr.onreadystatechange = BX.DoNothing; if (status == 'success') { var authHeader = (!!config.skipAuthCheck || BX.ajax.isCrossDomain(config.url)) ? false : config.xhr.getResponseHeader('X-Bitrix-Ajax-Status'); if(!!authHeader && authHeader == 'Authorize') { if (config.onfailure) { config.onfailure("auth", config.xhr.status); } BX.onCustomEvent(config.xhr, 'onAjaxFailure', ['auth', config.xhr.status, config]); } else { var data = config.xhr.responseText; if (config.lsId) { BX.localStorage.set('ajax-' + config.lsId, data, config.lsTimeout); } BX.ajax.__run(config, data); } } else { if (config.onfailure) { config.onfailure("status", config.xhr.status); } BX.onCustomEvent(config.xhr, 'onAjaxFailure', ['status', config.xhr.status, config]); } if (config.async) { config.xhr = null; } } } }; if (config.async && config.timeout > 0) { setTimeout(function() { if (config.xhr && !bRequestCompleted) { onreadystatechange("timeout"); } }, config.timeout * 1000); } if (config.start) { config.xhr.send(config.data); if (!config.async) { onreadystatechange('run'); } } return config.xhr; } }; BX.ajax.xhr = function() { if (window.XMLHttpRequest) { try {return new XMLHttpRequest();} catch(e){} } else if (window.ActiveXObject) { try { return new window.ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch(e) {} try { return new window.ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch(e) {} try { return new window.ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {} try { return new window.ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} throw new Error("This browser does not support XMLHttpRequest."); } return null; }; BX.ajax.isCrossDomain = function(url, location) { location = location || window.location; //Relative URL gets a current protocol if (url.indexOf("//") === 0) { url = location.protocol + url; } //Fast check if (url.indexOf("http") !== 0) { return false; } var link = window.document.createElement("a"); link.href = url; return link.protocol !== location.protocol || link.hostname !== location.hostname || BX.ajax.getHostPort(link.protocol, link.host) !== BX.ajax.getHostPort(location.protocol, location.host); }; BX.ajax.getHostPort = function(protocol, host) { var match = /:(\d+)$/.exec(host); if (match) { return match[1]; } else { if (protocol === "http:") { return "80"; } else if (protocol === "http:") { return "443"; } } return ""; }; BX.ajax.__prepareOnload = function(scripts) { if (scripts.length > 0) { BX.ajax['onload_' + ajax_session] = null; for (var i=0,len=scripts.length;i< result['bxjs'].length; i++) { if(BX.type.isNotEmptyString(result['bxjs'][i])) { scripts.push({ "isInternal": false, "JS": result['bxjs'][i], "bRunFirst": config.scriptsRunFirst }); } else { scripts.push(result['bxjs'][i]) } } } if(!!result && BX.type.isArray(result['bxcss'])) { styles = result['bxcss']; } break; case 'SCRIPT': scripts.push({"isInternal": true, "JS": data, "bRunFirst": config.scriptsRunFirst}); result = data; break; default: // HTML var ob = BX.processHTML(data, config.scriptsRunFirst); result = ob.HTML; scripts = ob.SCRIPT; styles = ob.STYLE; break; } var bSessionCreated = false; if (null == ajax_session) { ajax_session = parseInt(Math.random() * 1000000); bSessionCreated = true; } if (styles.length > 0) BX.loadCSS(styles); if (config.emulateOnload) BX.ajax.__prepareOnload(scripts); var cb = BX.DoNothing; if(config.emulateOnload || bSessionCreated) { cb = BX.defer(function() { if (config.emulateOnload) BX.ajax.__runOnload(); if (bSessionCreated) ajax_session = null; BX.onCustomEvent(config.xhr, 'onAjaxSuccessFinish', [config]); }); } try { if (!!config.jsonFailure) { throw {type: 'json_failure', data: config.jsonResponse, bProactive: config.jsonProactive}; } config.scripts = scripts; BX.ajax.processScripts(config.scripts, true); if (config.onsuccess) { config.onsuccess(result); } BX.onCustomEvent(config.xhr, 'onAjaxSuccess', [result, config]); BX.ajax.processScripts(config.scripts, false, cb); } catch (e) { if (config.onfailure) config.onfailure("processing", e); BX.onCustomEvent(config.xhr, 'onAjaxFailure', ['processing', e, config]); } }; BX.ajax.processScripts = function(scripts, bRunFirst, cb) { var scriptsExt = [], scriptsInt = ''; cb = cb || BX.DoNothing; for (var i = 0, length = scripts.length; i < length; i++) { if (typeof bRunFirst != 'undefined' && bRunFirst != !!scripts[i].bRunFirst) continue; if (scripts[i].isInternal) scriptsInt += ';' + scripts[i].JS; else scriptsExt.push(scripts[i].JS); } scriptsExt = BX.util.array_unique(scriptsExt); var inlineScripts = scriptsInt.length > 0 ? function() { BX.evalGlobal(scriptsInt); } : BX.DoNothing; if (scriptsExt.length > 0) { BX.load(scriptsExt, function() { inlineScripts(); cb(); }); } else { inlineScripts(); cb(); } }; // TODO: extend this function to use with any data objects or forms BX.ajax.prepareData = function(arData, prefix) { var data = ''; if (BX.type.isString(arData)) data = arData; else if (null != arData) { for(var i in arData) { if (arData.hasOwnProperty(i)) { if (data.length > 0) data += '&'; var name = BX.util.urlencode(i); if(prefix) name = prefix + '[' + name + ']'; if(typeof arData[i] == 'object') data += BX.ajax.prepareData(arData[i], name); else data += name + '=' + BX.util.urlencode(arData[i]); } } } return data; }; BX.ajax.xhrSuccess = function(xhr) { return (xhr.status >= 200 && xhr.status < 300) || xhr.status === 304 || xhr.status === 1223 || xhr.status === 0; }; BX.ajax.Setup = function(config, bTemp) { bTemp = !!bTemp; for (var i in config) { if (bTemp) tempDefaultConfig[i] = config[i]; else defaultConfig[i] = config[i]; } }; BX.ajax.replaceLocalStorageValue = function(lsId, data, ttl) { if (!!BX.localStorage) BX.localStorage.set('ajax-' + lsId, data, ttl); }; BX.ajax._uncache = function(url) { return url + ((url.indexOf('?') !== -1 ? "&" : "?") + '_=' + (new Date()).getTime()); }; /* simple interface */ BX.ajax.get = function(url, data, callback) { if (BX.type.isFunction(data)) { callback = data; data = ''; } data = BX.ajax.prepareData(data); if (data) { url += (url.indexOf('?') !== -1 ? "&" : "?") + data; data = ''; } return BX.ajax({ 'method': 'GET', 'dataType': 'html', 'url': url, 'data': '', 'onsuccess': callback }); }; BX.ajax.getCaptcha = function(callback) { return BX.ajax.loadJSON('/bitrix/tools/ajax_captcha.php', callback); }; BX.ajax.insertToNode = function(url, node) { node = BX(node); if (!!node) { var eventArgs = { cancel: false }; BX.onCustomEvent('onAjaxInsertToNode', [{ url: url, node: node, eventArgs: eventArgs }]); if(eventArgs.cancel === true) { return; } var show = null; if (!tempDefaultConfig.denyShowWait) { show = BX.showWait(node); delete tempDefaultConfig.denyShowWait; } return BX.ajax.get(url, function(data) { node.innerHTML = data; BX.closeWait(node, show); }); } }; BX.ajax.post = function(url, data, callback) { data = BX.ajax.prepareData(data); return BX.ajax({ 'method': 'POST', 'dataType': 'html', 'url': url, 'data': data, 'onsuccess': callback }); }; /* load and execute external file script with onload emulation */ BX.ajax.loadScriptAjax = function(script_src, callback, bPreload) { if (BX.type.isArray(script_src)) { for (var i=0,len=script_src.length;i= len) callback(); }; for (var i = 0, len = arObs.length; i= len) callback(); break; case 'JSON': BX.ajax.loadJSON(arObs[i].url, BX.proxy(handler, arObs[i])); break; default: BX.ajax.get(arObs[i].url, '', BX.proxy(handler, arObs[i])); break; } } }; /* ajax form sending */ BX.ajax.submit = function(obForm, callback) { if (!obForm.target) { if (null == obForm.BXFormTarget) { var frame_name = 'formTarget_' + Math.random(); obForm.BXFormTarget = document.body.appendChild(BX.create('IFRAME', { props: { name: frame_name, id: frame_name, src: 'javascript:void(0)' }, style: { display: 'none' } })); } obForm.target = obForm.BXFormTarget.name; } obForm.BXFormCallback = callback; BX.bind(obForm.BXFormTarget, 'load', BX.proxy(BX.ajax._submit_callback, obForm)); BX.submit(obForm); return false; }; BX.ajax.submitComponentForm = function(obForm, container, bWait) { if (!obForm.target) { if (null == obForm.BXFormTarget) { var frame_name = 'formTarget_' + Math.random(); obForm.BXFormTarget = document.body.appendChild(BX.create('IFRAME', { props: { name: frame_name, id: frame_name, src: 'javascript:void(0)' }, style: { display: 'none' } })); } obForm.target = obForm.BXFormTarget.name; } if (!!bWait) var w = BX.showWait(container); obForm.BXFormCallback = function(d) { if (!!bWait) BX.closeWait(w); var callOnload = function(){ if(!!window.bxcompajaxframeonload) { setTimeout(function(){window.bxcompajaxframeonload();window.bxcompajaxframeonload=null;}, 10); } }; BX(container).innerHTML = d; BX.onCustomEvent('onAjaxSuccess', [null,null,callOnload]); }; BX.bind(obForm.BXFormTarget, 'load', BX.proxy(BX.ajax._submit_callback, obForm)); return true; }; // func will be executed in form context BX.ajax._submit_callback = function() { //opera and IE8 triggers onload event even on empty iframe try { if(this.BXFormTarget.contentWindow.location.href.indexOf('http') != 0) return; } catch (e) { return; } if (this.BXFormCallback) this.BXFormCallback.apply(this, [this.BXFormTarget.contentWindow.document.body.innerHTML]); BX.unbindAll(this.BXFormTarget); }; BX.ajax.prepareForm = function(obForm, data) { data = (!!data ? data : {}); var i, ii, el, _data = [], n = obForm.elements.length, files = 0, length = 0; if(!!obForm) { for (i = 0; i < n; i++) { el = obForm.elements[i]; if (el.disabled) continue; switch(el.type.toLowerCase()) { case 'text': case 'textarea': case 'password': case 'number': case 'hidden': case 'select-one': _data.push({name: el.name, value: el.value}); length += (el.name.length + el.value.length); break; case 'file': if (!!el.files) { for (ii = 0; ii < el.files.length; ii++) { files++; _data.push({name: el.name, value: el.files[ii], file : true}); length += el.files[ii].size; } } break; case 'radio': case 'checkbox': if(el.checked) { _data.push({name: el.name, value: el.value}); length += (el.name.length + el.value.length); } break; case 'select-multiple': for (var j = 0; j < el.options.length; j++) { if (el.options[j].selected) { _data.push({name : el.name, value : el.options[j].value}); length += (el.name.length + el.options[j].length); } } break; default: break; } } i = 0; length = 0; var current = data; while(i < _data.length) { var p = _data[i].name.indexOf('['); if (p == -1) { current[_data[i].name] = _data[i].value; current = data; i++; } else { var name = _data[i].name.substring(0, p); var rest = _data[i].name.substring(p+1); if(!current[name]) current[name] = []; var pp = rest.indexOf(']'); if(pp == -1) { current = data; i++; } else if(pp == 0) { //No index specified - so take the next integer current = current[name]; _data[i].name = '' + current.length; } else { //Now index name becomes and name and we go deeper into the array current = current[name]; _data[i].name = rest.substring(0, pp) + rest.substring(pp+1); } } } } return {data : data, filesCount : files, roughSize : length}; }; BX.ajax.submitAjax = function(obForm, config) { config = (!!config && typeof config == "object" ? config : {}); config.url = (config["url"] || obForm.getAttribute("action")); config.data = BX.ajax.prepareForm(obForm).data; if (!window["FormData"]) { BX.ajax(config); } else { var isFile = function(item) { var res = Object.prototype.toString.call(item); return (res == '[object File]' || res == '[object Blob]'); }, appendToForm = function(fd, key, val) { if (!!val && typeof val == "object" && !isFile(val)) { for (var ii in val) { if (val.hasOwnProperty(ii)) { appendToForm(fd, (key == '' ? ii : key + '[' + ii + ']'), val[ii]); } } } else fd.append(key, (!!val ? val : '')); }, prepareData = function(arData) { var data = {}; if (null != arData) { if(typeof arData == 'object') { for(var i in arData) { if (arData.hasOwnProperty(i)) { var name = BX.util.urlencode(i); if(typeof arData[i] == 'object' && arData[i]["file"] !== true) data[name] = prepareData(arData[i]); else if (arData[i]["file"] === true) data[name] = arData[i]["value"]; else data[name] = BX.util.urlencode(arData[i]); } } } else data = BX.util.urlencode(arData); } return data; }, fd = new window.FormData(); if (config.method !== 'POST') { config.data = BX.ajax.prepareData(config.data); if (config.data) { config.url += (config.url.indexOf('?') !== -1 ? "&" : "?") + config.data; config.data = ''; } } else { if (config.preparePost === true) config.data = prepareData(config.data); appendToForm(fd, '', config.data); config.data = fd; } config.preparePost = false; config.start = false; var xhr = BX.ajax(config); if (!!config["onprogress"]) xhr.upload.addEventListener( 'progress', function(e){ var percent = null; if(e.lengthComputable && (e.total || e["totalSize"])) { percent = e.loaded * 100 / (e.total || e["totalSize"]); } config["onprogress"](e, percent); } ); xhr.send(fd); } }; BX.ajax.UpdatePageData = function (arData) { if (arData.TITLE) BX.ajax.UpdatePageTitle(arData.TITLE); if (arData.WINDOW_TITLE || arData.TITLE) BX.ajax.UpdateWindowTitle(arData.WINDOW_TITLE || arData.TITLE); if (arData.NAV_CHAIN) BX.ajax.UpdatePageNavChain(arData.NAV_CHAIN); if (arData.CSS && arData.CSS.length > 0) BX.loadCSS(arData.CSS); if (arData.SCRIPTS && arData.SCRIPTS.length > 0) { var f = function(result,config,cb){ if(!!config && BX.type.isArray(config.scripts)) { for(var i=0,l=arData.SCRIPTS.length;i<' + 'div id="__ajax_hash_collision_' + param_value + '" style="display: none;">'); } }, checkRedirectFinish: function(param_name, param_value) { document.write(''); var current_hash = window.location.hash; if (current_hash.substring(0, 1) == '#') current_hash = current_hash.substring(1); BX.ready(function () { var test = current_hash.substring(0, 5); if (test == 'view/' || test == 'view%') { var obColNode = BX('__ajax_hash_collision_' + param_value); var obNode = obColNode.firstChild; BX.cleanNode(obNode); obColNode.style.display = 'block'; // IE, Opera and Chrome automatically modifies hash with urlencode, but FF doesn't ;-( if (test != 'view%') current_hash = BX.util.urlencode(current_hash); current_hash += (current_hash.indexOf('%3F') == -1 ? '%3F' : '%26') + param_name + '=' + param_value; var url = '/bitrix/tools/ajax_redirector.php?hash=' + current_hash; BX.ajax.insertToNode(url, obNode); } }); } }; BX.ajax.component = function(node) { this.node = node; }; BX.ajax.component.prototype.getState = function() { var state = { 'node': this.node, 'title': window.document.title, 'data': BX(this.node).innerHTML }; var obNavChain = BX('navigation'); if (null != obNavChain) state.nav_chain = obNavChain.innerHTML; BX.onCustomEvent(BX(state.node), "onComponentAjaxHistoryGetState", [state]); return state; }; BX.ajax.component.prototype.setState = function(state) { BX(state.node).innerHTML = state.data; BX.ajax.UpdatePageTitle(state.title); if (state.nav_chain) { BX.ajax.UpdatePageNavChain(state.nav_chain); } BX.onCustomEvent(BX(state.node), "onComponentAjaxHistorySetState", [state]); }; var jsAjaxHistoryContainer = { arHistory: {}, put: function(hash, state) { this.arHistory[hash] = state; }, get: function(hash) { return this.arHistory[hash]; } }; BX.ajax.FormData = function() { this.elements = []; this.files = []; this.features = {}; this.isSupported(); this.log('BX FormData init'); }; BX.ajax.FormData.isSupported = function() { var f = new BX.ajax.FormData(); var result = f.features.supported; f = null; return result; }; BX.ajax.FormData.prototype.log = function(o) { if (false) { try { if (BX.browser.IsIE()) o = JSON.stringify(o); console.log(o); } catch(e) {} } }; BX.ajax.FormData.prototype.isSupported = function() { var f = {}; f.fileReader = (window.FileReader && window.FileReader.prototype.readAsBinaryString); f.readFormData = f.sendFormData = !!(window.FormData); f.supported = !!(f.readFormData && f.sendFormData); this.features = f; this.log('features:'); this.log(f); return f.supported; }; BX.ajax.FormData.prototype.append = function(name, value) { if (typeof(value) === 'object') { // seems to be files element this.files.push({'name': name, 'value':value}); } else { this.elements.push({'name': name, 'value':value}); } }; BX.ajax.FormData.prototype.send = function(url, callbackOk, callbackProgress, callbackError) { this.log('FD send'); this.xhr = BX.ajax({ 'method': 'POST', 'dataType': 'html', 'url': url, 'onsuccess': callbackOk, 'onfailure': callbackError, 'start': false, 'preparePost':false }); if (callbackProgress) { this.xhr.upload.addEventListener( 'progress', function(e) { if (e.lengthComputable) callbackProgress(e.loaded / (e.total || e.totalSize)); }, false ); } if (this.features.readFormData && this.features.sendFormData) { var fd = new FormData(); this.log('use browser formdata'); for (var i in this.elements) { if(this.elements.hasOwnProperty(i)) fd.append(this.elements[i].name,this.elements[i].value); } for (i in this.files) { if(this.files.hasOwnProperty(i)) fd.append(this.files[i].name, this.files[i].value); } this.xhr.send(fd); } return this.xhr; }; BX.addCustomEvent('onAjaxFailure', BX.debug); })(window); /* FILE ARCHIVED ON 09:05:56 Oct 20, 2017 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 23:38:06 Dec 22, 2019. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). */ /* playback timings (ms): PetaboxLoader3.datanode: 65.603 (4) esindex: 0.008 exclusion.robots.policy: 0.1 RedisCDXSource: 0.516 captures_list: 73.336 CDXLines.iter: 10.432 (3) load_resource: 106.814 PetaboxLoader3.resolve: 82.892 exclusion.robots: 0.108 LoadShardBlock: 60.27 (3) */