Current Path : /var/www/www-root/data/webdav/www/www.monolith-realty.ru/bitrix/js/main/ |
Current File : /var/www/www-root/data/webdav/www/www.monolith-realty.ru/bitrix/js/main/ajax.js |
/*********************************************************** Bitrix AJAX library ver 6.5 alpha ***********************************************************/ /* private CAjaxThread class - description of current AJAX request thread. */ function CAjaxThread(TID) { this.TID = TID; this.httpRequest = this._CreateHttpObject(); this.arAction = []; } CAjaxThread.prototype._CreateHttpObject = function() { var obj = null; if (window.XMLHttpRequest) { try {obj = new XMLHttpRequest();} catch(e){} } else if (window.ActiveXObject) { try {obj = new ActiveXObject("Microsoft.XMLHTTP");} catch(e){} if (!obj) try {obj = new ActiveXObject("Msxml2.XMLHTTP");} catch (e){} } return obj; } CAjaxThread.prototype.addAction = function(obHandler) { this.arAction.push(obHandler); } CAjaxThread.prototype.clearActions = function() { this.arAction = []; } CAjaxThread.prototype.nextAction = function() { return this.arAction.shift(); } CAjaxThread.prototype.Clear = function() { this.arAction = null; this.httpRequest = null; } /* public CAjax main class */ function CAjax() { this.arThreads = {}; this.obTemporary = null; } CAjax.prototype._PrepareData = function(arData, prefix) { var data = ''; if (null != arData) { for(var i in arData) { if (data.length > 0) data += '&'; var name = jsAjaxUtil.urlencode(i); if(prefix) name = prefix + '[' + name + ']'; if(typeof arData[i] == 'object') data += this._PrepareData(arData[i], name) else data += name + '=' + jsAjaxUtil.urlencode(arData[i]) } } return data; } CAjax.prototype.GetThread = function(TID) { return this.arThreads[TID]; } CAjax.prototype.InitThread = function() { while (true) { var TID = 'TID' + Math.floor(Math.random() * 1000000); if (!this.arThreads[TID]) break; } this.arThreads[TID] = new CAjaxThread(TID); return TID; } CAjax.prototype.AddAction = function(TID, obHandler) { if (this.arThreads[TID]) { this.arThreads[TID].addAction(obHandler); } } CAjax.prototype._OnDataReady = function(TID, result) { if (!this.arThreads[TID]) return; while (obHandler = this.arThreads[TID].nextAction()) { obHandler(result); } } CAjax.prototype._Close = function(TID) { if (!this.arThreads[TID]) return; this.arThreads[TID].Clear(); this.arThreads[TID] = null; } CAjax.prototype._SetHandler = function(TID) { var oAjax = this; function __cancelQuery(e) { if (!e) e = window.event if (!e) return; if (e.keyCode == 27) { oAjax._Close(TID); jsEvent.removeEvent(document, 'keypress', this); } } function __handlerReadyStateChange() { if (oAjax.bCancelled) return; if (!oAjax.arThreads[TID]) return; if (!oAjax.arThreads[TID].httpRequest) return; if (oAjax.arThreads[TID].httpRequest.readyState == 4) { var status = oAjax.arThreads[TID].httpRequest.getResponseHeader('X-Bitrix-Ajax-Status'); var bRedirect = (status == 'Redirect'); var s = oAjax.arThreads[TID].httpRequest.responseText; jsAjaxParser.mode = 'implode'; s = jsAjaxParser.process(s); if (!bRedirect) oAjax._OnDataReady(TID, s); oAjax.__prepareOnload(); if (jsAjaxParser.code.length > 0) jsAjaxUtil.EvalPack(jsAjaxParser.code); oAjax.__runOnload(); //setTimeout(function() {alert(1); oAjax.__runOnload(); alert(2)}, 30); oAjax._Close(TID); } } this.arThreads[TID].httpRequest.onreadystatechange = __handlerReadyStateChange; jsEvent.addEvent(document, "keypress", __cancelQuery); } CAjax.prototype.__prepareOnload = function() { this.obTemporary = window.onload; window.onload = null; } CAjax.prototype.__runOnload = function() { if (window.onload) window.onload(); window.onload = this.obTemporary; this.obTemporary = null; } CAjax.prototype.Send = function(TID, url, arData) { if (!this.arThreads[TID]) return; if (null != arData) var data = this._PrepareData(arData); else var data = ''; if (data.length > 0) { if (url.indexOf('?') == -1) url += '?' + data; else url += '&' + data; } if(this.arThreads[TID].httpRequest) { this.arThreads[TID].httpRequest.open("GET", url, true); this._SetHandler(TID); return this.arThreads[TID].httpRequest.send(""); } } CAjax.prototype.Post = function(TID, url, arData) { var data = ''; if (null != arData) data = this._PrepareData(arData); if(this.arThreads[TID].httpRequest) { this.arThreads[TID].httpRequest.open("POST", url, true); this._SetHandler(TID); this.arThreads[TID].httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); return this.arThreads[TID].httpRequest.send(data); } } /* public CAjaxForm - class to send forms via iframe */ function CAjaxForm(obForm, obHandler, bFirst) { this.obForm = obForm; this.obHandler = obHandler; this.obFrame = null; this.isFormProcessed = false; if (null == bFirst) this.bFirst = false; else this.bFirst = bFirst; this.__tmpFormTarget = ''; this.obAJAXIndicator = null; this.currentBrowserDetected = ""; if (window.opera) this.currentBrowserDetected = "Opera"; else if (navigator.userAgent) { if (navigator.userAgent.indexOf("MSIE") != -1) this.currentBrowserDetected = "IE"; else if (navigator.userAgent.indexOf("Firefox") != -1) this.currentBrowserDetected = "Firefox"; } this.IsIE9 = !!document.documentMode && document.documentMode >= 9; } CAjaxForm.prototype.setProcessedFlag = function(value) { if (null == value) value = true; else value = value ? true : false; this.obForm.bxAjaxProcessed = value; this.isFormProcessed = value; } CAjaxForm.isFormProcessed = function(obForm) { if (obForm.bxAjaxProcessed) return obForm.bxAjaxProcessed; else return false; } CAjaxForm.prototype.process = function() { var _this = this; function __formResultHandler() { if (!_this.obFrame.contentWindow.document || _this.obFrame.contentWindow.document.body.innerHTML.length == 0) return; if (null != _this.obHandler) { _this.obHandler(_this.obFrame.contentWindow.document.body.innerHTML); } if (_this.obFrame.contentWindow.AJAX_runExternal) _this.obFrame.contentWindow.AJAX_runExternal(); if (_this.obFrame.contentWindow.AJAX_runGlobal) _this.obFrame.contentWindow.AJAX_runGlobal(); if (_this.bFirst) { try { _this.obForm.target = _this.__tmpFormTarget; _this.obAJAXIndicator.parentNode.removeChild(_this.obAJAXIndicator); _this.obForm.bxAjaxProcessed = false; } catch (e) { _this.obForm = null; } _this.obAJAXIndicator = null; if (this.currentBrowserDetected != 'IE') jsEvent.removeAllEvents(_this.obFrame); // fixing another strange bug. Now for FF var TimerID = setTimeout("document.body.removeChild(document.getElementById('" + _this.obFrame.id + "'));", 100); _this.obFrame = null; if (window.onFormLoaded) { window.onFormLoaded(); window.onFormLoaded = null; } } } if (this.obForm.target && this.obForm.target.substring(0, 5) == 'AJAX_') return; if (this.currentBrowserDetected == 'IE') { if (this.IsIE9) { this.obAJAXIndicator = document.createElement('input'); this.obAJAXIndicator.setAttribute('name', 'AJAX_CALL'); this.obAJAXIndicator.setAttribute('type', 'hidden'); } else { this.obAJAXIndicator = document.createElement('<input name="AJAX_CALL" type="hidden" />'); } } else { this.obAJAXIndicator = document.createElement('INPUT'); this.obAJAXIndicator.type = 'hidden'; this.obAJAXIndicator.name = 'AJAX_CALL'; } this.obAJAXIndicator.value = 'Y'; this.obForm.appendChild(this.obAJAXIndicator); var frameName = 'AJAX_' + Math.round(Math.random() * 100000); if (this.currentBrowserDetected == 'IE') if (this.IsIE9) { this.obFrame = document.createElement('iframe'); this.obFrame.setAttribute('name', frameName); } else { this.obFrame = document.createElement('<iframe name="' + frameName + '"></iframe>'); } else this.obFrame = document.createElement('IFRAME'); this.obFrame.style.display = 'none'; this.obFrame.src = 'javascript:\'\''; this.obFrame.id = frameName; this.obFrame.name = frameName; document.body.appendChild(this.obFrame); this.__tmpFormTarget = this.obForm.target; this.obForm.target = frameName; // one more strange bug in IE.. if (this.currentBrowserDetected == 'IE') this.obFrame.attachEvent("onload", __formResultHandler); else jsEvent.addEvent(this.obFrame, 'load', __formResultHandler); this.setProcessedFlag(); } var jsAjaxParser = { code: [], mode: 'implode', regexp: null, regexp_src: null, process: function(s) { this.code = []; if (null == this.regexp) this.regexp = /(<script([^>]*)>)([\S\s]*?)(<\/script>)/i; do { var arMatch = s.match(this.regexp); if (null == arMatch) break; var pos = arMatch.index; var len = arMatch[0].length; if (pos > 0) this.code.push({TYPE: 'STRING', DATA: s.substring(0, pos)}); if (typeof arMatch[1] == 'undefined' || arMatch[1].indexOf('src=') == -1) { var script = arMatch[3]; script = script.replace('<!--', ''); this.code.push({TYPE: 'SCRIPT', DATA: script}); } else { if (null == this.regexp_src) this.regexp_src = /src="([^"]*)?"/i; var arResult = this.regexp_src.exec(arMatch[1]); if (null != arResult && arResult[1]) { this.code.push({TYPE: 'SCRIPT_EXT', DATA: arResult[1]}); } } s = s.substring(pos + len); } while (true); if (s.length > 0) { this.code.push({TYPE: 'STRING', DATA: s}); } if (this.mode == 'implode') { s = ''; for (var i = 0, cnt = this.code.length; i < cnt; i++) { if (this.code[i].TYPE == 'STRING') s += this.code[i].DATA; } return s; } else return this.code; } } /* public jsAjaxUtil - utility object */ var jsAjaxUtil = { // remove all DOM node children (with events) RemoveAllChild: function(pNode) { try { while(pNode.childNodes.length>0) { jsEvent.clearObject(pNode.childNodes[0]); pNode.removeChild(pNode.childNodes[0]); } } catch(e) {} }, // evaluate js string in window scope EvalGlobal: function(script) { if (window.execScript) window.execScript(script, 'javascript'); else if (jsAjaxUtil.IsSafari()) window.setTimeout(script, 0); else window.eval(script); }, arLoadedScripts: [], __isScriptLoaded: function (script_src) { for (var i=0; i<jsAjaxUtil.arLoadedScripts.length; i++) if (jsAjaxUtil.arLoadedScripts[i] == script_src) return true; return false; }, // evaluate external script EvalExternal: function(script_src) { if ( /\/bitrix\/js\/main\/ajax.js$/i.test(script_src) || /\/bitrix\/js\/main\/core\/core.js$/i.test(script_src) ) return; if (jsAjaxUtil.__isScriptLoaded(script_src)) return; jsAjaxUtil.arLoadedScripts.push(script_src); var obAjaxThread = new CAjaxThread(); obAjaxThread.httpRequest.open("GET", script_src, false); // make *synchronous* request for script source obAjaxThread.httpRequest.send(""); var s = obAjaxThread.httpRequest.responseText; obAjaxThread.Clear(); obAjaxThread = null; jsAjaxUtil.EvalGlobal(s); // evaluate script source }, EvalPack: function(code) { for (var i = 0, cnt = code.length; i < cnt; i++) { if (code[i].TYPE == 'SCRIPT_EXT' || code[i].TYPE == 'SCRIPT_SRC') jsAjaxUtil.EvalExternal(code[i].DATA); else if (code[i].TYPE == 'SCRIPT') jsAjaxUtil.EvalGlobal(code[i].DATA); } }, // urlencode js version urlencode: function(s) { return escape(s).replace(new RegExp('\\+','g'), '%2B'); }, // trim js version trim: function(s) { var r, re; re = /^[ \r\n]+/g; r = s.replace(re, ""); re = /[ \r\n]+$/g; r = r.replace(re, ""); return r; }, GetWindowSize: function() { var innerWidth, innerHeight; if (self.innerHeight) // all except Explorer { innerWidth = self.innerWidth; innerHeight = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) // Explorer 6 Strict Mode { innerWidth = document.documentElement.clientWidth; innerHeight = document.documentElement.clientHeight; } else if (document.body) // other Explorers { innerWidth = document.body.clientWidth; innerHeight = document.body.clientHeight; } var scrollLeft, scrollTop; if (self.pageYOffset) // all except Explorer { scrollLeft = self.pageXOffset; scrollTop = self.pageYOffset; } else if (document.documentElement && document.documentElement.scrollTop) // Explorer 6 Strict { scrollLeft = document.documentElement.scrollLeft; scrollTop = document.documentElement.scrollTop; } else if (document.body) // all other Explorers { scrollLeft = document.body.scrollLeft; scrollTop = document.body.scrollTop; } var scrollWidth, scrollHeight; if ( (document.compatMode && document.compatMode == "CSS1Compat")) { scrollWidth = document.documentElement.scrollWidth; scrollHeight = document.documentElement.scrollHeight; } else { if (document.body.scrollHeight > document.body.offsetHeight) scrollHeight = document.body.scrollHeight; else scrollHeight = document.body.offsetHeight; if (document.body.scrollWidth > document.body.offsetWidth || (document.compatMode && document.compatMode == "BackCompat") || (document.documentElement && !document.documentElement.clientWidth) ) scrollWidth = document.body.scrollWidth; else scrollWidth = document.body.offsetWidth; } return {"innerWidth" : innerWidth, "innerHeight" : innerHeight, "scrollLeft" : scrollLeft, "scrollTop" : scrollTop, "scrollWidth" : scrollWidth, "scrollHeight" : scrollHeight}; }, // get element position relative to the whole window GetRealPos: function(el) { if (el.getBoundingClientRect) { var obRect = el.getBoundingClientRect(); var obWndSize = jsAjaxUtil.GetWindowSize(); var arPos = { left: obRect.left + obWndSize.scrollLeft, top: obRect.top + obWndSize.scrollTop, right: obRect.right + obWndSize.scrollLeft, bottom: obRect.bottom + obWndSize.scrollTop }; return arPos; } if(!el || !el.offsetParent) return false; var res = Array(); res["left"] = el.offsetLeft; res["top"] = el.offsetTop; var objParent = el.offsetParent; while(objParent && objParent.tagName != "BODY") { res["left"] += objParent.offsetLeft; res["top"] += objParent.offsetTop; objParent = objParent.offsetParent; } res["right"] = res["left"] + el.offsetWidth; res["bottom"] = res["top"] + el.offsetHeight; return res; }, IsIE: function() { return (document.attachEvent && !jsAjaxUtil.IsOpera()); }, IsOpera: function() { return (navigator.userAgent.toLowerCase().indexOf('opera') != -1); }, IsSafari: function() { var userAgent = navigator.userAgent.toLowerCase(); return (/webkit/.test(userAgent)); }, // simple ajax data loading method (without any visual effects) LoadData: function(url, obHandler) { if (!obHandler) return; var TID = jsAjax.InitThread(); jsAjax.AddAction(TID, obHandler); jsAjax.Send(TID, url); return TID; }, // simple ajax data post method (without any visual effects) PostData: function(url, arData, obHandler) { if (!obHandler) return; var TID = jsAjax.InitThread(); jsAjax.AddAction(TID, obHandler); jsAjax.Post(TID, url, arData); return TID; }, __LoadDataToDiv: function(url, cont, bReplace, bShadow) { if (null == bReplace) bReplace = true; if (null == bShadow) bShadow = true; if (typeof cont == 'string' || typeof cont == 'object' && cont.constructor == String) var obContainerNode = document.getElementById(cont); else var obContainerNode = cont; if (!obContainerNode) return; var rnd_tid = Math.round(Math.random() * 1000000); function __putToContainer(data) { if (!obContainerNode) return; //setTimeout('jsAjaxUtil.CloseLocalWaitWindow(\'' + rnd_tid + '\', \'' + obContainerNode.id + '\')', 100); jsAjaxUtil.CloseLocalWaitWindow(rnd_tid, obContainerNode); if (bReplace) { jsAjaxUtil.RemoveAllChild(obContainerNode); obContainerNode.innerHTML = data; } else obContainerNode.innerHTML += data; } jsAjaxUtil.ShowLocalWaitWindow(rnd_tid, obContainerNode, bShadow); var TID = jsAjaxUtil.LoadData(url, __putToContainer); }, // insert ajax data to container (with visual effects) InsertDataToNode: function(url, cont, bShadow) { if (null == bShadow) bShadow = true; jsAjaxUtil.__LoadDataToDiv(url, cont, true, bShadow); }, // append ajax data to container (with visual effects) AppendDataToNode: function(url, cont, bShadow) { if (null == bShadow) bShadow = true; jsAjaxUtil.__LoadDataToDiv(url, cont, false, bShadow); }, GetStyleValue: function(el, styleProp) { if(el.currentStyle) var res = el.currentStyle[styleProp]; else if(window.getComputedStyle) var res = document.defaultView.getComputedStyle(el, null).getPropertyValue(styleProp); return res; }, // show ajax visuality ShowLocalWaitWindow: function (TID, cont, bShadow) { if (typeof cont == 'string' || typeof cont == 'object' && cont.constructor == String) var obContainerNode = document.getElementById(cont); else var obContainerNode = cont; if (obContainerNode.getBoundingClientRect) { var obRect = obContainerNode.getBoundingClientRect(); var obWndSize = jsAjaxUtil.GetWindowSize(); var arContainerPos = { left: obRect.left + obWndSize.scrollLeft, top: obRect.top + obWndSize.scrollTop, right: obRect.right + obWndSize.scrollLeft, bottom: obRect.bottom + obWndSize.scrollTop }; } else var arContainerPos = jsAjaxUtil.GetRealPos(obContainerNode); var container_id = obContainerNode.id; if (!arContainerPos) return; if (null == bShadow) bShadow = true; if (bShadow) { var obWaitShadow = document.body.appendChild(document.createElement('DIV')); obWaitShadow.id = 'waitshadow_' + container_id + '_' + TID; obWaitShadow.className = 'waitwindowlocalshadow'; obWaitShadow.style.top = (arContainerPos.top - 5) + 'px'; obWaitShadow.style.left = (arContainerPos.left - 5) + 'px'; obWaitShadow.style.height = (arContainerPos.bottom - arContainerPos.top + 10) + 'px'; obWaitShadow.style.width = (arContainerPos.right - arContainerPos.left + 10) + 'px'; } var obWaitMessage = document.body.appendChild(document.createElement('DIV')); obWaitMessage.id = 'wait_' + container_id + '_' + TID; obWaitMessage.className = 'waitwindowlocal'; var div_top = arContainerPos.top + 5; if (div_top < document.body.scrollTop) div_top = document.body.scrollTop + 5; obWaitMessage.style.top = div_top + 'px'; obWaitMessage.style.left = (arContainerPos.left + 5) + 'px'; if(jsAjaxUtil.IsIE()) { var frame = document.createElement("IFRAME"); frame.src = "javascript:''"; frame.id = 'waitframe_' + container_id + '_' + TID; frame.className = "waitwindowlocal"; frame.style.width = obWaitMessage.offsetWidth + "px"; frame.style.height = obWaitMessage.offsetHeight + "px"; frame.style.left = obWaitMessage.style.left; frame.style.top = obWaitMessage.style.top; document.body.appendChild(frame); } function __Close(e) { if (!e) e = window.event if (!e) return; if (e.keyCode == 27) { jsAjaxUtil.CloseLocalWaitWindow(TID, cont); jsEvent.removeEvent(document, 'keypress', __Close); } } jsEvent.addEvent(document, 'keypress', __Close); }, // hide ajax visuality CloseLocalWaitWindow: function(TID, cont) { if (typeof cont == 'string' || typeof cont == 'object' && cont.constructor == String) var obContainerNode = document.getElementById(cont); else var obContainerNode = cont; var container_id = obContainerNode.id; var obWaitShadow = document.getElementById('waitshadow_' + container_id + '_' + TID); if (obWaitShadow) document.body.removeChild(obWaitShadow); var obWaitMessageFrame = document.getElementById('waitframe_' + container_id + '_' + TID); if (obWaitMessageFrame) document.body.removeChild(obWaitMessageFrame); var obWaitMessage = document.getElementById('wait_' + container_id + '_' + TID); if (obWaitMessage) document.body.removeChild(obWaitMessage); }, // simple form sending vithout visual effects. use onsubmit="SendForm(this, MyFunction)" SendForm: function(obForm, obHandler) { if (typeof obForm == 'string' || typeof obForm == 'object' && obForm.constructor == String) var obFormHandler = document.getElementById(obForm); else var obFormHandler = obForm; if (!obFormHandler.name || obFormHandler.name.length <= 0) { obFormHandler.name = 'AJAXFORM_' + Math.floor(Math.random() * 1000000); } var obFormMigrate = new CAjaxForm(obFormHandler, obHandler, true); obFormMigrate.process(); return true; }, // ajax form submit with visuality and put data to container. use onsubmit="InsertFormDataToNode(this, 'cont_id')" InsertFormDataToNode: function(obForm, cont, bShadow) { if (null == bShadow) bShadow = true; return jsAjaxUtil.__LoadFormToDiv(obForm, cont, true, bShadow); }, // similiar with InsertFormDataToNode but append data to container AppendFormDataToNode: function(obForm, cont, bShadow) { if (null == bShadow) bShadow = true; return jsAjaxUtil.__LoadFormToDiv(obForm, cont, false, bShadow); }, __LoadFormToDiv: function(obForm, cont, bReplace, bShadow) { if (null == bReplace) bReplace = true; if (null == bShadow) bShadow = true; if (typeof cont == 'string' || typeof cont == 'object' && cont.constructor == String) var obContainerNode = document.getElementById(cont); else var obContainerNode = cont; if (!obContainerNode) return; function __putToContainer(data) { if (!obContainerNode) return; if (bReplace) { jsAjaxUtil.RemoveAllChild(obContainerNode); obContainerNode.innerHTML = data; } else obContainerNode.innerHTML += data; jsAjaxUtil.CloseLocalWaitWindow(obContainerNode.id, obContainerNode); } jsAjaxUtil.ShowLocalWaitWindow(obContainerNode.id, obContainerNode, bShadow); return jsAjaxUtil.SendForm(obForm, __putToContainer); }, // load to page new title, css files or script code strings UpdatePageData: function (arData) { if (arData.TITLE) jsAjaxUtil.UpdatePageTitle(arData.TITLE); if (arData.NAV_CHAIN) jsAjaxUtil.UpdatePageNavChain(arData.NAV_CHAIN); if (arData.CSS && arData.CSS.length > 0) jsAjaxUtil.UpdatePageCSS(arData.CSS); if (arData.SCRIPTS && arData.SCRIPTS.length > 0) jsAjaxUtil.UpdatePageScripts(arData.SCRIPTS); }, UpdatePageScripts: function(arScripts) { for (var i = 0; i < arScripts.length; i++) { jsAjaxUtil.EvalExternal(arScripts[i]); } }, UpdatePageCSS: function (arCSS) { jsStyle.UnloadAll(); for (var i = 0; i < arCSS.length; i++) { jsStyle.Load(arCSS[i]); } }, UpdatePageTitle: function(title) { var obTitle = document.getElementById('pagetitle'); if (obTitle) { obTitle.removeChild(obTitle.firstChild); if (!obTitle.firstChild) obTitle.appendChild(document.createTextNode(title)); else obTitle.insertBefore(document.createTextNode(title), obTitle.firstChild); } document.title = title; }, UpdatePageNavChain: function(nav_chain) { var obNavChain = document.getElementById('navigation'); if (obNavChain) { obNavChain.innerHTML = nav_chain; } }, ScrollToNode: function(node) { if (typeof node == 'string' || typeof node == 'object' && node.constructor == String) var obNode = document.getElementById(node); else var obNode = node; if (obNode.scrollIntoView) obNode.scrollIntoView(true); else { var arNodePos = jsAjaxUtil.GetRealPos(obNode); window.scrollTo(arNodePos.left, arNodePos.top); } } } /* public jsStyle - external CSS manager */ var jsStyle = { arCSS: {}, bInited: false, Init: function() { var arStyles = document.getElementsByTagName('LINK'); if (arStyles.length > 0) { for (var i = 0; i<arStyles.length; i++) { if (arStyles[i].href) { var filename = arStyles[i].href; var pos = filename.indexOf('://'); if (pos != -1) filename = filename.substr(filename.indexOf('/', pos + 3)); arStyles[i].bxajaxflag = false; this.arCSS[filename] = arStyles[i]; } } } this.bInited = true; }, Load: function(filename) { if (!this.bInited) this.Init(); if (null != this.arCSS[filename]) { this.arCSS[filename].disabled = false; return; } /* var cssNode = document.createElement('link'); cssNode.type = 'text/css'; cssNode.rel = 'stylesheet'; cssNode.href = filename; document.getElementsByTagName("head")[0].appendChild(cssNode); */ var link = document.createElement("STYLE"); link.type = 'text/css'; var head = document.getElementsByTagName("HEAD")[0]; head.insertBefore(link, head.firstChild); //head.appendChild(link); if (jsAjaxUtil.IsIE()) { link.styleSheet.addImport(filename); } else { var obAjaxThread = new CAjaxThread(); obAjaxThread.httpRequest.onreadystatechange = null; obAjaxThread.httpRequest.open("GET", filename, false); // make *synchronous* request for css source obAjaxThread.httpRequest.send(""); var s = obAjaxThread.httpRequest.responseText; // convert relative resourse paths in css to absolute. current path to css will be lost. var pos = filename.lastIndexOf('/'); if (pos != -1) { var dirname = filename.substring(0, pos); s = s.replace(/url\(([^\/\\].*?)\)/gi, 'url(' + dirname + '/$1)'); } obAjaxThread.Clear(); obAjaxThread = null; link.appendChild(document.createTextNode(s)); } }, Unload: function(filename) { if (!this.bInited) this.Init(); if (null != this.arCSS[filename]) { this.arCSS[filename].disabled = true; } }, UnloadAll: function() { if (!this.bInited) this.Init(); else for (var i in this.arCSS) { if (this.arCSS[i].bxajaxflag) this.Unload(i); } } } /* public jsEvent - cross-browser event manager object */ var jsEvent = { objectList: [null], objectEventList: [null], __eventManager: function(e) { if (!e) e = window.event var result = true; // browser comptiability try { if (e.srcElement) e.currentTarget = e.srcElement; } catch (e) {} if (this.bxEventIndex && jsEvent.objectEventList[this.bxEventIndex] && jsEvent.objectEventList[this.bxEventIndex][e.type]) { var len = jsEvent.objectEventList[this.bxEventIndex][e.type].length; for (var i=0; i<len; i++) { if (jsEvent.objectEventList[this.bxEventIndex][e.type] && jsEvent.objectEventList[this.bxEventIndex][e.type][i]) { var tmp_result = jsEvent.objectEventList[this.bxEventIndex][e.type][i](e); if ('boolean' == typeof tmp_result) result = result && tmp_result; if (!result) return false; } } } return true; }, addEvent: function(obElement, event, obHandler) { if (!obElement.bxEventIndex) { obElement.bxEventIndex = jsEvent.objectList.length; jsEvent.objectList[obElement.bxEventIndex] = obElement; } if (!jsEvent.objectEventList[obElement.bxEventIndex]) jsEvent.objectEventList[obElement.bxEventIndex] = {}; if (!jsEvent.objectEventList[obElement.bxEventIndex][event]) { jsEvent.objectEventList[obElement.bxEventIndex][event] = []; if (obElement['on' + event]) jsEvent.objectEventList[obElement.bxEventIndex][event].push(obElement['on' + event]); obElement['on' + event] = null; obElement['on' + event] = jsEvent.__eventManager; } jsEvent.objectEventList[obElement.bxEventIndex][event].push(obHandler); }, removeEvent: function(obElement, event, obHandler) { if (obElement.bxEventIndex) { if (jsEvent.objectEventList[obElement.bxEventIndex][event]) { for (var i=0; i<jsEvent.objectEventList[obElement.bxEventIndex][event].length; i++) { if (obHandler == jsEvent.objectEventList[obElement.bxEventIndex][event][i]) { delete jsEvent.objectEventList[obElement.bxEventIndex][event][i]; return; } } } } }, removeAllHandlers: function(obElement, event) { if (obElement.bxEventIndex) { if (jsEvent.objectEventList[obElement.bxEventIndex][event]) { // possible memory leak. must be checked; jsEvent.objectEventList[obElement.bxEventIndex][event] = []; } } }, removeAllEvents: function(obElement) { if (obElement.bxEventIndex) { if (jsEvent.objectEventList[obElement.bxEventIndex]) { // possible memory leak. must be checked; jsEvent.objectEventList[obElement.bxEventIndex] = []; } } }, clearObject: function(obElement) { if (obElement.bxEventIndex) { if (jsEvent.objectEventList[obElement.bxEventIndex]) { // possible memory leak. must be checked; delete jsEvent.objectEventList[obElement.bxEventIndex]; } if (jsEvent.objectList[obElement.bxEventIndex]) { // possible memory leak. must be checked; delete jsEvent.objectList[obElement.bxEventIndex]; } delete obElement.bxEventIndex; } } } var jsAjaxHistory = { expected_hash: '', counter: 0, bInited: false, obFrame: null, obImage: null, bHashCollision: false, obTimer: null, __hide_object: function(ob) { ob.style.position = 'absolute'; ob.style.top = '-1000px'; ob.style.left = '-1000px'; ob.style.height = '10px'; ob.style.width = '10px'; }, init: function(node) { if (jsAjaxHistory.bInited) return; jsAjaxHistory.expected_hash = window.location.hash; if (!jsAjaxHistory.expected_hash || jsAjaxHistory.expected_hash == '#') jsAjaxHistory.expected_hash = '__bx_no_hash__'; var obCurrentState = {'node': node, 'title':window.document.title, 'data': document.getElementById(node).innerHTML}; var obNavChain = document.getElementById('navigation'); if (null != obNavChain) obCurrentState.nav_chain = obNavChain.innerHTML; jsAjaxHistoryContainer.put(jsAjaxHistory.expected_hash, obCurrentState); jsAjaxHistory.obTimer = setTimeout(jsAjaxHistory.__hashListener, 500); if (jsAjaxUtil.IsIE()) { jsAjaxHistory.obFrame = document.createElement('IFRAME'); jsAjaxHistory.__hide_object(jsAjaxHistory.obFrame); document.body.appendChild(jsAjaxHistory.obFrame); jsAjaxHistory.obFrame.contentWindow.document.open(); jsAjaxHistory.obFrame.contentWindow.document.write(jsAjaxHistory.expected_hash); jsAjaxHistory.obFrame.contentWindow.document.close(); jsAjaxHistory.obFrame.contentWindow.document.title = window.document.title; } else if (jsAjaxUtil.IsOpera()) { jsAjaxHistory.obImage = document.createElement('IMG'); jsAjaxHistory.__hide_object(jsAjaxHistory.obImage); document.body.appendChild(jsAjaxHistory.obImage); jsAjaxHistory.obImage.setAttribute('src', 'javascript:location.href = \'javascript:jsAjaxHistory.__hashListener();\';'); } jsAjaxHistory.bInited = true; }, __hashListener: function() { if (jsAjaxHistory.obTimer) { window.clearTimeout(jsAjaxHistory.obTimer); jsAjaxHistory.obTimer = null; } if (null != jsAjaxHistory.obFrame) var current_hash = jsAjaxHistory.obFrame.contentWindow.document.body.innerText; else var current_hash = window.location.hash; if (!current_hash || current_hash == '#') current_hash = '__bx_no_hash__'; if (current_hash.indexOf('#') == 0) current_hash = current_hash.substring(1); if (current_hash != jsAjaxHistory.expected_hash) { var state = jsAjaxHistoryContainer.get(current_hash); if (state) { document.getElementById(state.node).innerHTML = state.data; jsAjaxUtil.UpdatePageTitle(state.title); if (state.nav_chain) jsAjaxUtil.UpdatePageNavChain(state.nav_chain); jsAjaxHistory.expected_hash = current_hash; if (null != jsAjaxHistory.obFrame) { var __hash = current_hash == '__bx_no_hash__' ? '' : current_hash; if (window.location.hash != __hash && window.location.hash != '#' + __hash) window.location.hash = __hash; } } } jsAjaxHistory.obTimer = setTimeout(jsAjaxHistory.__hashListener, 500); }, put: function(node, new_hash) { //alert(new_hash); var state = { 'node': node, 'title': window.document.title, 'data': document.getElementById(node).innerHTML }; var obNavChain = document.getElementById('navigation'); if (obNavChain) state.nav_chain = obNavChain.innerHTML; //var new_hash = '#cnt' + (++jsAjaxHistory.counter); jsAjaxHistoryContainer.put(new_hash, state); jsAjaxHistory.expected_hash = new_hash; window.location.hash = jsAjaxUtil.urlencode(new_hash); if (null != jsAjaxHistory.obFrame) { jsAjaxHistory.obFrame.contentWindow.document.open(); jsAjaxHistory.obFrame.contentWindow.document.write(new_hash); jsAjaxHistory.obFrame.contentWindow.document.close(); jsAjaxHistory.obFrame.contentWindow.document.title = state.title; } }, checkRedirectStart: function(param_name, param_value) { var current_hash = window.location.hash; if (current_hash.substring(0, 1) == '#') current_hash = current_hash.substring(1); if (current_hash.substring(0, 5) == 'view/') { jsAjaxHistory.bHashCollision = true; document.write('<' + 'div id="__ajax_hash_collision_' + param_value + '" style="display: none;">'); } }, checkRedirectFinish: function(param_name, param_value) { document.write('</div>'); var current_hash = window.location.hash; if (current_hash.substring(0, 1) == '#') current_hash = current_hash.substring(1); jsEvent.addEvent(window, 'load', function () { //alert(current_hash); if (current_hash.substring(0, 5) == 'view/') { var obColNode = document.getElementById('__ajax_hash_collision_' + param_value); var obNode = obColNode.firstChild; jsAjaxUtil.RemoveAllChild(obNode); obColNode.style.display = 'block'; // IE, Opera and Chrome automatically modifies hash with urlencode, but FF doesn't ;-( if (!jsAjaxUtil.IsIE() && !jsAjaxUtil.IsOpera() && !jsAjaxUtil.IsSafari()) current_hash = jsAjaxHistory.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; //jsAjaxHistory.urlencode(current_hash); jsAjaxUtil.InsertDataToNode(url, obNode, false); } }); }, urlencode: function(s) { if (window.encodeURIComponent) return encodeURIComponent(s); else if (window.encodeURI) return encodeURI(s); else return jsAjaxUtil.urlencode(s); } } var jsAjaxHistoryContainer = { arHistory: {}, put: function(hash, state) { this.arHistory[hash] = state; }, get: function(hash) { return this.arHistory[hash]; } } // for compatibility with IE 5.0 browser if (![].pop) { Array.prototype.pop = function() { if (this.length <= 0) return false; var element = this[this.length-1]; delete this[this.length-1]; this.length--; return element; } Array.prototype.shift = function() { if (this.length <= 0) return false; var tmp = this.reverse(); var element = tmp.pop(); this.prototype = tmp.reverse(); return element; } Array.prototype.push = function(element) { this[this.length] = element; } } var jsAjax = new CAjax();