Current Path : /var/www/www-root/data/www.catalog.monolith-realty.ru/bitrix/admin/htmleditor2/ |
Current File : /var/www/www-root/data/www.catalog.monolith-realty.ru/bitrix/admin/htmleditor2/editor.js |
// ======================== var editor_js = true; // ======================== //pMainObj - name of MAIN object which contains all editor's methods. Used for coordinashion between different components and objects // pEditorFrame - link to IFRAME for visual editing // pFrame - link to table with editor // pDocument - parent document // pEditorDocument - document of edited file function BXHTMLEditor(name, start_func) { GLOBAL_pMainObj[name] = this; name_cur_obj = name; this.start_func = (start_func) ? start_func : function(){}; this.pMainObj = this; this.arBarHandlersCache = []; this.name = name; this.showTooltips4Components = true; this.visualEffects = true; this.arUndoBuffer = []; this.SessionLostStr = 'BX_EDITOR_ERROR_SESSION_EXPIRED'; this.iUndoPos = -1; this.sOnChangeLastType = ''; this.customToolbars = true; this.bDotNet = window.bDotNet || false; this.limit_php_access = limit_php_access; // Limit php access this.lastCursorId = 'bx-editor-cursor-id'; this.bxTags = {}; this.bLoadFinish = false; this.isSubmited = false; // *** Limit component access (LCA) *** if(window.lca) { _$lca_only = false; _$arComponents = window._$arComponents || false; _$lca_to_output = _$arComponents ? true : false; } this.fullEdit = (this.name == 'CONTENT'); // For template edit this.sOnChangeLastSubType = ''; this.sLastContent = ''; this.bSkipChanges = false; this.sFirstContent = null; if(BXEditorLoaded) this.OnBeforeLoad(); else BXEditorRegister(this); } BXHTMLEditor.prototype.CreateElement = BXCreateElement; BXHTMLEditor.prototype.OnBeforeLoad = function() { this.allowedTaskbars = window['ar_' + this.name + '_taskbars']; this.BXPreloader = new BXPreloader( [ {func: BX.proxy(this.GetConfig, this), params: []}, {obj: this, func: this.PreloadTaskbarsData} ], { obj : this, func: this.OnLoad } ); this.BXPreloader.LoadStep(); }; BXHTMLEditor.prototype.PreloadTaskbarsData = function(oCallBack) { var arTsbSet = SETTINGS[this.name].arTaskbarSettings; try{ if (this.bDotNet) { var bShow = !arTsbSet || !arTsbSet['ASPXComponentsTaskbar'] || arTsbSet['ASPXComponentsTaskbar'].show; if (this.allowedTaskbars['ASPXComponentsTaskbar'] && bShow) this.BXPreloader.AddStep({obj: this, func: this.LoadASPXComponents}); } else { var settings = false; if (arTsbSet) settings = arTsbSet['BXComponents2Taskbar']; if (this.allowedTaskbars['BXComponents2Taskbar'] && (!settings || settings.show)) this.BXPreloader.AddStep({obj: this, func: this.LoadComponents2}); } }catch(e){_alert(this.name+': ERROR: pMainObj.PreloadTaskbarsData');} oCallBack.func.apply(oCallBack.obj); }; BXHTMLEditor.prototype.OnLoad = function() { //try{ var obj = this; this.bShowed = true; this.bDragging = false; this.bNotSaved = false; this.bFirstClick = false; this.className = 'BXHTMLEditor'; this.arEventHandlers = []; this.pDocument = document; this.bTableBorder = false; this.pWnd = BX(this.name + '_object'); this.pValue = BX('bxed_' + this.name); this.arToolbarSet = []; this.toolArea = []; this.arTaskbarSet = []; this.pParser = new BXParser(this); this.bEditSource = false; this.arConfig = window['ar_' + this.name + '_config']; this.bRenderComponents = this.arConfig.renderComponents; this.bRenderStyleList = styleList_render_style; if (!this.pWnd || !BX.isNodeInDom(this.pWnd)) { BX.closeWait(); return; } this.bodyParams = ""; // Used to add some css for body if (this.arConfig.body_class) this.bodyParams += ' class="' + this.arConfig.body_class + '"'; if (this.arConfig.body_id) this.bodyParams += ' id="' + this.arConfig.body_id + '"'; if (BX.WindowManager) { BX.WindowManager.setStartZIndex(2010); BX.WindowManager.disableKeyCheck(); } this.oTransOverlay = new BXTransOverlay({edId: this.name}); this.fullEditMode = window.fullEditMode || false; this.pParser.ClearHBF(); // Init HBF window.CACHE_DISPATCHER = []; // GLOBAL CACHE if (this.arConfig.sBackUrl) this.arConfig.sBackUrl = this.arConfig.sBackUrl.replace(/&/gi, '&'); if (this.OnLoad_ex) this.OnLoad_ex(); // ******** List of entities to replace ********** if (this.arConfig["ar_entities"].toString() == '') this.arConfig["ar_entities"] = []; else this.arConfig["ar_entities"] = this.arConfig["ar_entities"].toString().split(','); var arAllEntities = {}, k; arAllEntities['umlya'] = ['¿','À','Á','Â','Ã','Ä','Å','Æ','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ð','Ñ','Ò','Ó','Ô','Õ','Ö','×','Ø','Ù','Ú','Û','Ü','Ý','Þ','ß','à','á','â','ã','ä','å','æ','ç','è','é','ê','ë','ì','í','î','ï','ð','ñ','ò','ó','ô','õ','ö','÷','ø','ù','ú','û','ü','ý','þ','ÿ','Œ','œ','Š','š','Ÿ']; arAllEntities['greek'] = ['Α','Β','Γ','Δ','Ε','Ζ','Η','Θ','Ι','Κ','Λ','Μ','Ν','Ξ','Ο','Π','Ρ','Σ','Τ','Υ','Φ','Χ','Ψ','Ω','α','β','γ','δ','ε','ζ','η','θ','ι','κ','λ','μ','ν','ξ','ο','π','ρ','ς','σ','τ','υ','φ','χ','ψ','ω','ϑ','ϒ','ϖ']; arAllEntities['other'] = ['¡','¢','£','¤','¥','¦','§','¨','©','ª','«','¬','®','¯','°','±','²','³','´','µ','¶','·','¸','¹','º','»','¼','½','¾','ˆ','˜',' ',' ',' ','‌','‍','‎','‏','–','—','‘','’','‚','“','”','„','†','‡','‰','‹','›','€','•','…','′','″','‾','⁄','℘','ℑ','ℜ','™','ℵ','←','↑','→','↓','↔','↵','⇐','⇑','⇒','⇓','⇔','∀','∂','∃','∅','∇','∈','∉','∋','∏','∑','−','∗','√','∝','∞','∠','∧','∨','∩','∪','∫','∴','∼','≅','≈','≠','≡','≤','≥','⊂','⊃','⊄','⊆','⊇','⊕','⊗','⊥','⋅','⌈','⌉','⌊','⌋','⟨','⟩','◊','♠','♣','♥','♦']; this.arEntities = []; for(k in this.arConfig["ar_entities"]) { if(arAllEntities[this.arConfig["ar_entities"][k]]) this.arEntities = this.arEntities.concat(arAllEntities[this.arConfig["ar_entities"][k]]); } this.arEntities_h = BX.create("span", {html: this.arEntities.join(',')}).innerHTML.split(','); this.arConfig.undosize = this.arConfig.undosize || 25; this.arConfig.width = this.arConfig.width || "750"; this.pWnd.style.width = parseInt(this.arConfig.width) + (this.arConfig.width.indexOf('%') == -1 ? "px" : '%'); this.arConfig.height = this.arConfig.height || "500"; this.pWnd.style.height = parseInt(this.arConfig.height) + (this.arConfig.height.indexOf('%') == -1 ? "px" : '%'); this.arToolbars = this.arConfig.arToolbars || ["standart", "style", "formating", "source", "template"]; if(this.arConfig["customToolbars"]) this.customToolbars = this.arConfig["customToolbars"]; this.pForm = BXFindParentByTagName(this.pWnd, "FORM"); if(this.pForm) addAdvEvent(this.pForm, 'submit', window['OnSubmit_' + this.name]); BX.addCustomEvent(window, "OnHtmlEditorRequestAuthFailure", BX.proxy(this.AuthFailureHandler, this)); //Table which makes structure of Toolbarsets, taskbarsets and editor area.... var pFrame = this.pDocument.getElementById(this.name+'_pFrame'); //Editor area this.cEditor = BX(this.name + '_cEditor'); window.IEplusDoctype = (lightMode && BX.browser.IsDoctype() && BX.browser.IsIE()); this.pFrame = pFrame; // Hack for render bug in IE if (BX.browser.IsIE()) { setTimeout(function() { obj.pFrame.style.position = 'absolute'; setTimeout(function(){obj.pFrame.style.position = 'static';}, 10); }, 800); } this.pEditorFrame = this.cEditor.appendChild(BX.create("IFRAME", {props: {id: "ed_" + this.name, className: "bx-editor-iframe", src: "javascript:void(0)", frameborder: 0}})); if(this.pEditorFrame.contentDocument && !BX.browser.IsIE()) this.pEditorDocument = this.pEditorFrame.contentDocument; else this.pEditorDocument = this.pEditorFrame.contentWindow.document; this.pEditorWindow = this.pEditorFrame.contentWindow; this.pEditorDocument.className = "pEditorDocument"; this.pEditorDocument.pMainObj = this; //Toolbarsets creation this.pTopToolbarset = BX(this.name + '_toolBarSet0'); if(!lightMode) { this.arToolbarSet[0] = new BXToolbarSet(this.pTopToolbarset, this, false); // top toolbar this.arToolbarSet[1] = new BXToolbarSet(BX(this.name + '_toolBarSet1'), this, true); // left toolbar } //Taskbarsets creation this.arTaskbarSet[2] = new BXTaskbarSet(BX(this.name + '_taskBarSet2'), this, 2); // Right taskbar this.arTaskbarSet[3] = new BXTaskbarSet(BX(this.name + '_taskBarSet3'), this, 3); // Bottom taskbar this.pTaskTabs = BX(this.name + '_taskBarTabs'); // Taskbar Tabs var ta = BX.create("TEXTAREA", {props: {className: "bxeditor-textarea"}, style: {height: '100%'}}); if (BX.browser.IsIE()) { this.pSourceDiv = this.cEditor.appendChild(this.CreateElement("DIV", {}, {display: 'none', height: '100%', width: '100%', overflowX: 'hidden', overflowY: 'auto', overflow: 'auto'})); this.pSourceFrame = this.pSourceDiv.appendChild(ta); } else { this.pSourceFrame = this.cEditor.appendChild(ta); } this.pSourceFrame.onkeydown = function (e) { var tabKeyCode = 9; var replaceWith = " "; if(window.event) { if(event.keyCode == tabKeyCode) { this.selection = document.selection.createRange(); this.selection.text = replaceWith; event.returnValue = false; return false; } } else { if(e.keyCode == tabKeyCode) { var selectionStart = this.selectionStart, selectionEnd = this.selectionEnd, scrollTop = this.scrollTop, scrollLeft = this.scrollLeft; this.value = this.value.substring(0, selectionStart)+ replaceWith + this.value.substring(selectionEnd); this.focus(); this.setSelectionRange(selectionStart + (selectionStart != selectionEnd?0:1), selectionStart + replaceWith.length); this.scrollTop = scrollTop; this.scrollLeft = scrollLeft; return false; } } }; this.pSourceFrame.onkeyup = function (){BX.onCustomEvent(obj, 'onChange');}; pBXEventDispatcher.__Add(this); if (this.bDotNet && this.pASPXParser && this.pASPXParser.OnLoadSystem) this.pASPXParser.OnLoadSystem(); BXHTMLEditor.prototype.OnDragDrop = function (e) { if (this.sEditorMode == 'code' || this.sEditorMode == 'split' && this.sEditorSplitMode == 'code') return; if(this.nLastDragNDropElement && this.nLastDragNDropElement.length > 0) { var obj = this; setTimeout(function () { var pEl = obj.pEditorDocument.getElementById(obj.nLastDragNDropElement); if (!pEl) pEl = BX(obj.nLastDragNDropElement); if(obj.pEditorWindow.getSelection) obj.pEditorWindow.getSelection().selectAllChildren(pEl); if (obj.nLastDragNDropElementFire !== false) obj.nLastDragNDropElementFire(pEl); obj.OnClick(e); }, 10); } }; BXHTMLEditor.prototype.__ShowTableBorder = function (pTable, bShow) { var arTableBorderStyles = ["border", "borderBottom", "borderBottomColor", "borderBottomStyle", "borderBottomWidth", "borderCollapse", "borderColor", "borderLeft", "borderLeftColor", "borderLeftStyle", "borderLeftWidth", "borderRight", "borderRightColor", "borderRightStyle", "borderRightWidth", "borderStyle", "borderTop", "borderTopColor", "borderTopStyle", "borderTopWidth", "borderWidth"]; if(!pTable.border || pTable.border == "0") { try{ if(bShow) { pTable.setAttribute("__bxborderCollapse", pTable.style.borderCollapse); pTable.style.borderCollapse = "collapse"; } else { pTable.style.borderCollapse = pTable.getAttribute("__bxborderCollapse"); pTable.removeAttribute("__bxborderCollapse"); } } catch(e){} var pCell, arCells = pTable.getElementsByTagName("TD"); for(var j = 0; j < arCells.length; j++) { pCell = arCells[j]; if(bShow) { if(!pCell.getAttribute("__bxborder")) { pCell.setAttribute("__bxborder", BXSerializeAttr(pCell.style, arTableBorderStyles)); pCell.style.border = "1px #ACACAC dashed"; } } else { if(pCell.getAttribute("__bxborder")) { pCell.style.borderWidth = ""; pCell.style.borderColor = ""; pCell.style.borderStyle = ""; BXUnSerializeAttr(pCell.getAttribute("__bxborder"), pCell.style, arTableBorderStyles); pCell.removeAttribute("__bxborder"); } } } } }; BXHTMLEditor.prototype.Show = function (flag) { this.bShowed = flag; if(flag && this.pWnd.style.display=='none') this.pWnd.style.display='block'; else if(!flag && this.pWnd.style.display != 'none') this.pWnd.style.display='none'; }; BXHTMLEditor.prototype.ShowTableBorder = function (bShow) { if(this.bTableBorder == bShow) return false; this.bTableBorder = bShow; var arTables = this.pEditorDocument.getElementsByTagName("TABLE"); for(var i=0; i<arTables.length; i++) this.__ShowTableBorder(arTables[i], bShow); return true; }; BXHTMLEditor.prototype.OnClick = function(e) { if (!e) e = this.pEditorWindow.event; if (!e) e = window.event; if (e) { var pElement = e.target || e.srcElement; if (pElement && pElement.nodeType == 1 && pElement.tagName && pElement.tagName.toLowerCase() == 'img') this.SelectElement(pElement); } if (this.__bMouseDownComp) // Prevent default for selecting other element after Rendered Component selection return; if(this.pOnChangeSelectionTimer) clearTimeout(this.pOnChangeSelectionTimer); BX.onCustomEvent(this, 'onChange'); this.bFirstClick = true; var obj = this; this.pOnChangeSelectionTimer = setTimeout(function (){obj.OnEvent("OnSelectionChange");}, 200); }; BXHTMLEditor.prototype.OnDblClick = function (e) { var pEl, oTag = false; if (!e) e = this.pEditorWindow.event; if (e.target) pEl = e.target; else if (e.srcElement) pEl = e.srcElement; if (pEl.nodeType == 3) pEl = pEl.parentNode; if (pEl && pEl.nodeName) oTag = this.GetBxTag(pEl); if (oTag) { if (oTag.tag == "img") this.OpenEditorDialog("image", null, 500, {pElement: pEl}); else if (oTag.tag == "a") this.OpenEditorDialog("editlink", null, 520); if (oTag.tag == "anchor") this.OpenEditorDialog("anchor", null, 400); if (oTag.tag == "flash") this.OpenEditorDialog("flash", null, 500, {bUseTabControl: true, pMainObj: this}); } obj.OnEvent("OnDblClick", [e]); }; BXHTMLEditor.prototype.OnMouseUp = function (e) { this.bFirstClick = true; if(this.pOnChangeSelectionTimer) clearTimeout(this.pOnChangeSelectionTimer); var obj = this; this.pOnChangeSelectionTimer = setTimeout(function (){obj.OnEvent("OnSelectionChange");}, 100); }; this.pSourceFrame.onblur = function (e){obj.pEditorFrame.onfocus(e);}; this.pSourceFrame.onfocus = function (e) { if(obj.bEditSource) return; obj.bEditSource = true; if(obj.sEditorMode == 'split') { obj.SaveContent(); obj.OnEvent('ClearResourcesBeforeChangeView'); obj.SetCodeEditorContent(obj.GetContent()); obj.sEditorSplitMode = 'code'; obj.OnEvent("OnChangeView", [this.sEditorMode, this.sEditorSplitMode]); } }; this.pEditorFrame.onfocus = function (e) { if(!obj.bEditSource) return; obj.bEditSource = false; if(obj.sEditorMode=='split') { obj.SetEditorContent(obj.GetCodeEditorContent()); obj.sEditorSplitMode = 'html'; obj.OnEvent("OnChangeView", [this.sEditorMode, this.sEditorSplitMode]); } }; this.value = this.pValue.value; BXStyleParser.Create(); this.oStyles = new BXStyles(this); if(this.arConfig["TEMPLATE"]) this.SetTemplate(this.arConfig["TEMPLATE"]["ID"], this.arConfig["TEMPLATE"], true); // *********************************************************************************************** // Adding all toolbars and buttons to them // *********************************************************************************************** var arAllowedToolbars = window['ar_' + this.name + '_toolbars']; var arSet; if (!SETTINGS[this.name].arToolbarSettings) SETTINGS[this.name].arToolbarSettings = arToolbarSettings_default; var arToolbarSettings = SETTINGS[this.name].arToolbarSettings; if (lightMode) { var pGlobalToolbar = new BXGlobalToolbar(this), arSourceToolbar = [], val; if (this.arConfig.toolbarConfig) { var _handledButtons = {}, _val; for(var j = 0, n = this.arConfig.toolbarConfig.length; j < n ; j++) { val = this.arConfig.toolbarConfig[j]; if (val.indexOf("-") === -1 && val == parseInt(val) && arGlobalToolbar[val]) { arSourceToolbar.push(arGlobalToolbar[val]); } _val = val.replace("-", ''); if (arGlobalToolbar[_val]) { _handledButtons[arGlobalToolbar[_val][1].id] = true; } } for(j = 0; j < arGlobalToolbar.length ; j++) { if (!_handledButtons[arGlobalToolbar[j][1].id]) { arSourceToolbar.push(arGlobalToolbar[j]); } } } else { arSourceToolbar = arGlobalToolbar; } pGlobalToolbar.LineBegin(true); for(var i = 0, l = arSourceToolbar.length; i < l ; i++) { var arButton = arSourceToolbar[i]; if(!arButton || (arButton[1] && arButton[1].hideCondition && arButton[1].hideCondition(this))) continue; if (typeof(arButton) == 'object') { pGlobalToolbar.AddButton(this.CreateCustomElement(arButton[0], arButton[1])); } else if(arButton == 'new_line') { pGlobalToolbar.LineEnd(); pGlobalToolbar.LineBegin(); } else if(arButton == 'separator') { pGlobalToolbar.AddButton(this.CreateCustomElement('BXButtonSeparator')); } } pGlobalToolbar.LineEnd(); } else // admin { for(var sToolBarId in arToolbars) { if (arAllowedToolbars !== false && !arAllowedToolbars[sToolBarId]) { delete arToolbars[sToolBarId]; continue; } //try{ if (!arToolbarSettings[sToolBarId]) { SETTINGS[this.name].arToolbarSettings[sToolBarId] = arToolbarSettings_default[sToolBarId]; arSet = arToolbarSettings_default[sToolBarId]; } else { arSet = arToolbarSettings[sToolBarId]; } if(BXSearchInd(this.arToolbars, sToolBarId) < 0 && this.customToolbars !== true) continue; var arSourceToolbar = [], val; if (this.arConfig.toolbarConfig && this.arConfig.toolbarConfig[sToolBarId]) { for(var j = 0, n = this.arConfig.toolbarConfig[sToolBarId].length; j < n ; j++) { val = this.arConfig.toolbarConfig[sToolBarId][j]; if (val.indexOf("-") === -1 && val == parseInt(val) && arToolbars[sToolBarId][1][val]) arSourceToolbar.push(arToolbars[sToolBarId][1][val]); } } else { arSourceToolbar = arToolbars[sToolBarId][1]; } var arButton, i, l = arSourceToolbar.length; if (!l) // All buttons was disabled { // Have to del toolbar delete arToolbars[sToolBarId]; continue; } var pToolbar = new BXToolbar(this, arToolbars[sToolBarId][0], sToolBarId); for(i = 0; i < l ; i++) { arButton = arSourceToolbar[i]; if(!arButton || (arButton[1] && arButton[1].hideCondition && arButton[1].hideCondition(this))) continue; if(arButton == 'separator') { pToolbar.AddButton(this.CreateCustomElement('BXButtonSeparator')); } else if(!arButton[1].id || !pToolbar.buttons[arButton[1].id]) { pToolbar.AddButton(this.CreateCustomElement(arButton[0], arButton[1])); pToolbar.buttons[arButton[1].id] = true; } } if (arSet.docked && arSet.position) arDefaultTBPositions[sToolBarId] = arSet.position; if(arDefaultTBPositions[sToolBarId]) this.arToolbarSet[arDefaultTBPositions[sToolBarId][0]].AddToolbar(pToolbar, arDefaultTBPositions[sToolBarId][1], arDefaultTBPositions[sToolBarId][2]); else this.arToolbarSet[0].AddToolbar(pToolbar, 100, 0); if (!arSet.docked && arSet.position) pToolbar.SetPosition(arSet.position.x,arSet.position.y); if (!arSet.show) { pToolbar.Close(); continue; } pToolbar = null; //}catch(e){_alert("Error: loading "+sToolBarId+" toolbar"); continue;} } arSet = null; } // Init event "OnCreate" : adding all taskbars setTimeout(function (){BXCreateTaskbars(obj, true);}, 50); this.SetView("html"); if(this.arConfig["fullscreen"]) { this.pDocument.body.style.display = 'block'; this.SetFullscreen(true); } this.start_func(this); pFrame.style.display = ''; // Show Editor frame setTimeout(function () { BX.closeWait(); obj.bLoadFinish = true; obj.SetFocus(); try{jsUtils.onCustomEvent('EditorLoadFinish_' + obj.name);}catch(e){} }, 10 ); //Table border = ON this.ShowTableBorder(true); oBXContextMenu = this.CreateCustomElement("BXContextMenu"); oBXContextMenu.Create(); this.oBXVM = new BXVisualMinimize(); jsUtils.addCustomEvent('OnToggleTabs', this.ClearPosCache, [], this); ar_BXTaskbarS = []; BXPopupWindow.bCreated = false; if (BX.WindowManager) { var wnd = BX.WindowManager.Get(); if (wnd) { BX.addCustomEvent(wnd, 'onWindowDragFinished', function() { CACHE_DISPATCHER['pEditorFrame_' + obj.name] = null; CACHE_DISPATCHER['pEditorFrame'] = null; }); } } //}catch(e){alert('ERROR: BXHTMLEditor.prototype.OnLoad'); alert(e);} // Autosave handlers var pForm = obj.pValue.form; if (pForm) { //BX.addCustomEvent(pForm, 'onAutoSavePrepare', function() //{ if (pForm && pForm.BXAUTOSAVE) { try{ BX.addCustomEvent(obj, 'onChange', function() { pForm.BXAUTOSAVE.Init(); }); BX.addCustomEvent(pForm, 'onAutoSave', function (ob, data) { if (obj.bShowed) { obj.SaveContent(); // Save editor content data[obj.name] = obj.GetContent(); // Get it from textarea and put to form_data to saving } }); BX.addCustomEvent(pForm, 'onAutoSaveRestore', function (ob, data) { if (obj.bShowed) { obj.SetContent(data[obj.name]); obj.LoadContent(); } }); }catch(e){} } //}); } }; BXHTMLEditor.prototype.SetContent = function(sContent) { this.OnEvent('SetContentBefore', [sContent]); this.pValue.value = this.value = sContent; this.OnEvent('SetContentAfter', [sContent]); }; BXHTMLEditor.prototype.GetContent = function() { this.OnEvent('GetContent'); return this.value.toString(); }; BXHTMLEditor.prototype.LoadContent = function() { this.OnEvent('LoadContentBefore'); var sContent = this.GetContent(); if(this.sFirstContent == null) this.sFirstContent = sContent; switch(this.sEditorMode) { case 'code': this.SetCodeEditorContent(sContent); break; case 'split': this.SetCodeEditorContent(sContent) this.SetEditorContent(sContent) break; case 'html': this.SetEditorContent(sContent); } this.OnEvent('LoadContentAfter'); }; BXHTMLEditor.prototype.SaveContent = function() { this.OnEvent('SaveContentBefore'); switch(this.sEditorMode) { case 'code': this.SetContent(this.GetCodeEditorContent()); break; case 'split': if(this.sEditorSplitMode == 'code') this.SetContent(this.GetCodeEditorContent()); else this.SetContent(this.GetEditorContent(true, true)); break; case 'html': this.SetContent(this.GetEditorContent(true, true)); } this.OnEvent('SaveContentAfter'); }; BXHTMLEditor.prototype.SetEditorContent = function(sContent) { var _this = this; sContent = this.pParser.SystemParse(sContent); if (this.pEditorDocument.designMode) { try{ this.pEditorDocument.designMode = 'off'; }catch(e){_alert('SetEditorContent: designMode=\'off\'');} } this.OnEvent('SetEditorContentBefore', [sContent]); //Writing content this.pEditorDocument.open(); this.pEditorDocument.write('<html><head></head><body' + this.bodyParams + '>' + sContent + '</body></html>'); this.pEditorDocument.close(); this.pEditorDocument.body.style.padding = "5px"; this.pEditorDocument.body.style.margin = "0"; this.pEditorDocument.body.style.borderWidth = "0"; //Handling DOM this.pParser.DOMHandle(); if(this.bTableBorder) { this.bTableBorder = false; this.ShowTableBorder(true); } if(BX.browser.IsIE()) { this.pEditorDocument.body.contentEditable = true; addAdvEvent(this.pEditorDocument, 'focus', window['onClick_'+this.name]); } else { this.pEditorWindow.__bxedname = this.name; this.pEditorWindow.addEventListener("focus", this.FFOnFocus, false); } this.oStyles.SetToDocument(this.pEditorDocument); this.pEditorDocument.className = 'pEditorDocument'; this.pEditorDocument.pMainObj = this; pBXEventDispatcher.SetEvents(this.pEditorDocument); addAdvEvent(this.pEditorDocument, 'contextmenu', window['onContextMenu_'+this.name]); addAdvEvent(this.pEditorDocument, 'click', window['onClick_'+this.name]); addAdvEvent(this.pEditorDocument, 'dblclick', window['onDblClick_'+this.name]); addAdvEvent(this.pEditorDocument, 'mouseup', window['onMouseUp_'+this.name]); addAdvEvent(this.pEditorDocument, 'dragdrop', window['onDragDrop_'+this.name]); addAdvEvent(this.pEditorDocument, 'keydown', BX.proxy(function(e){return this.OnKeyPress(e, true)}, this)); addAdvEvent(this.pEditorDocument, 'keyup', BX.proxy(function(e){_this.OnClick(e); _this.OnChange("keyup", "");}, this)); if(BX.browser.IsIE()) addAdvEvent(this.pEditorDocument.body, 'paste', window['onPaste_' + this.name]); addAdvEvent(this.pEditorDocument, 'keydown', window['onKeyDown_' + this.name]); pBXEventDispatcher.OnEditorEvent("OnSetEditorContent", this); this.OnEvent('SetEditorContentAfter'); }; BXHTMLEditor.prototype.GetEditorContent = function() { this.OnEvent('GetEditorContentBefore'); var bBorders = this.bTableBorder; if(bBorders) this.ShowTableBorder(false); this.pParser.Parse(); if(bBorders) this.ShowTableBorder(true); var sContent = this.pParser.GetHTML(true); sContent = this.pParser.ClearFromHBF(sContent); sContent = this.pParser.SystemUnParse(sContent); if (this.fullEditMode) sContent = this.pParser.AppendHBF(sContent, true); this.OnEvent('GetEditorContentAfter', [sContent]); return sContent; }; BXHTMLEditor.prototype.SetCodeEditorContent = function(sContent) { this.pSourceFrame.value = sContent; }; BXHTMLEditor.prototype.GetCodeEditorContent = function() { return this.PreparseHeaders(this.pSourceFrame.value); }; BXHTMLEditor.prototype.PreparseHeaders = function(sContent) { if (!this.fullEditMode) return sContent; return this.pParser.GetHBF(sContent, true); }; BXHTMLEditor.prototype.SetView = function(sType) { if (this.sEditorMode == sType) return; var _this = this; this.SaveContent(); switch(sType) { case 'code': this.pSourceFrame.style.height = "99%"; this.pEditorFrame.style.display = "none"; this._DisplaySourceFrame(); if (BX.browser.IsIE()) { this.pSourceFrame.rows = "50"; this.pSourceDiv.style.height = "99%"; this.pSourceDiv.style.display = "block"; } this.pSourceFrame.style.borderTop = "0px solid #808080"; // Hide taskbarsets var rightTaskbar = this.arTaskbarSet[2], bottomTaskbar = this.arTaskbarSet[3]; this.oTaskbarsInHtmlMode = { rightTaskbar: rightTaskbar.bShowing, bottomTaskbar: bottomTaskbar.bShowing }; if (rightTaskbar.bShowing) rightTaskbar.Display(false); if (bottomTaskbar.bShowing) bottomTaskbar.Display(false); this.oBXTaskTabs.Refresh(); this.SetCodeEditorContent(this.GetContent()); setTimeout(function(){_this.pSourceFrame.focus();}, 200); break; case 'split': this.pEditorFrame.style.height = "50%"; if (BX.browser.IsIE()) { this.pSourceFrame.style.height = "97%"; this.pSourceFrame.rows = "40"; this.pSourceDiv.style.overflow = "hidden"; this.pSourceDiv.style.height = "49%"; this.pSourceDiv.style.display = "block"; } else { this.pSourceFrame.style.height = "49%"; } this.pSourceFrame.style.borderTop = "2px solid #808080"; this._DisplaySourceFrame(); this.pEditorFrame.style.display = "block"; if(this.sEditorMode == 'code') this.SetEditorContent(this.GetContent()); else if(this.sEditorMode == 'html') this.SetCodeEditorContent(this.GetContent()); break; default: this.pEditorFrame.style.height = "100%"; this.pSourceFrame.style.display = "none"; this.pEditorFrame.style.display = "block"; if (IEplusDoctype) this.pSourceDiv.style.display = "none"; // Hide taskbarsets if (this.oTaskbarsInHtmlMode) { if (this.oTaskbarsInHtmlMode.rightTaskbar) this.arTaskbarSet[2].Display(true); //rightTaskbar if (this.oTaskbarsInHtmlMode.bottomTaskbar) this.arTaskbarSet[3].Display(true); // bottomTaskbar this.oBXTaskTabs.Refresh(); this.oTaskbarsInHtmlMode = null; } this.SetEditorContent(this.GetContent()); sType = "html"; } this.arTaskbarSet[3].Resize(); this.sEditorMode = sType; this.SetCursorFF(); this.OnEvent("OnChangeView", [this.sEditorMode, this.sEditorSplitMode]); }; // Dirty hack for Firefox (Chrome, Safari, Opera) BXHTMLEditor.prototype.SetCursorFF = function() { if (this.sEditorMode != 'code' && !BX.browser.IsIE()) { var _this = this; try{ this.pEditorFrame.blur(); this.pEditorFrame.focus(); setTimeout(function(){ _this.pEditorFrame.blur(); _this.pEditorFrame.focus(); }, 600); setTimeout(function(){ _this.pEditorFrame.blur(); _this.pEditorFrame.focus(); }, 1000); }catch(e){} } }; BXHTMLEditor.prototype._DisplaySourceFrame = function(bCheck) { if (bCheck && this.sEditorMode != 'code' && this.sEditorMode != 'split') return; if (BX.browser.IsIE()) { this.pSourceFrame.style.display = "none"; var _this = this; setTimeout(function(){_this.pSourceFrame.style.display = "block";}, 100); } else { this.pSourceFrame.style.display = "block"; } } BXHTMLEditor.prototype.PasteAsText = function(text) { text = bxhtmlspecialchars(text); text = text.replace(/\r/g, ''); text = text.replace(/\n/g, '<br/>'); this.insertHTML(text); }; BXHTMLEditor.prototype.CleanWordText = function(text, arParams) { text = text.replace(/<(P|B|U|I|STRIKE)> <\/\1>/g, ' '); text = text.replace(/<o:p>([\s\S]*?)<\/o:p>/ig, "$1"); //text = text.replace(/<o:p>[\s\S]*?<\/o:p>/ig, " "); text = text.replace(/<span[^>]*display:\s*?none[^>]*>([\s\S]*?)<\/span>/gi, ''); // Hide spans with display none text = text.replace(/<!--\[[\s\S]*?\]-->/ig, ""); //<!--[.....]--> - <!--[if gte mso 9]>...<![endif]--> text = text.replace(/<!\[[\s\S]*?\]>/ig, ""); // <! [if !vml]> text = text.replace(/<\\?\?xml[^>]*>/ig, ""); //<xml...>, </xml...> text = text.replace(/<o:p>\s*<\/o:p>/ig, ""); text = text.replace(/<\/?[a-z1-9]+:[^>]*>/gi, ""); //<o:p...>, </o:p> text = text.replace(/<([a-z1-9]+[^>]*) class=([^ |>]*)(.*?>)/gi, "<$1$3"); text = text.replace(/<([a-z1-9]+[^>]*) [a-z]+:[a-z]+=([^ |>]*)(.*?>)/gi, "<$1$3"); // xmlns:v="urn:schemas-microsoft-com:vml" if (arParams.spaces) { text = text.replace(/ /ig, ' '); text = text.replace(/\s+?/gi, ' '); } // Remove mso-xxx styles. text = text.replace(/\s*mso-[^:]+:[^;"]+;?/gi, ""); // Remove margin styles. text = text.replace(/\s*margin: 0cm 0cm 0pt\s*;/gi, ""); text = text.replace(/\s*margin: 0cm 0cm 0pt\s*"/gi, "\""); //if (removeIndents) if (arParams.indents) { text = text.replace(/\s*TEXT-INDENT: 0cm\s*;/gi, ""); text = text.replace(/\s*TEXT-INDENT: 0cm\s*"/gi, "\""); } text = text.replace(/\s*TEXT-ALIGN: [^\s;]+;?"/gi, "\""); text = text.replace(/\s*PAGE-BREAK-BEFORE: [^\s;]+;?"/gi, "\""); text = text.replace(/\s*FONT-VARIANT: [^\s;]+;?"/gi, "\""); text = text.replace(/\s*tab-stops:[^;"]*;?/gi, ""); text = text.replace(/\s*tab-stops:[^"]*/gi, ""); // Remove FONTS if (arParams.fonts) { text = text.replace(/<FONT[^>]*>([\s\S]*?)<\/FONT>/gi, '$1'); text = text.replace(/\s*face="[^"]*"/gi, ""); text = text.replace(/\s*face=[^ >]*/gi, ""); text = text.replace(/\s*FONT-FAMILY:[^;"]*;?/gi, ""); } // Remove Class attributes text = text.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3"); // Remove styles. if (arParams.styles) text = text.replace(/<(\w[^>]*) style="([^\"]*)"([^>]*)/gi, "<$1$3"); // Remove empty styles. text = text.replace(/\s*style="\s*"/gi, ''); // Remove Lang attributes text = text.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3"); var iter = 0; while (text.toLowerCase().indexOf('<span') != -1 && text.toLowerCase().indexOf('</span>') != -1 && iter++ < 20) text = text.replace(/<span[^>]*?>([\s\S]*?)<\/span>/gi, '$1'); var _text, i, tag, arFormatTags = ['b', 'strong', 'i', 'u', 'font', 'span', 'strike']; while (true) { _text = text; for (i in arFormatTags) { tag = arFormatTags[i]; text = text.replace(new RegExp('<' + tag + '[^>]*?>(\\s*?)<\\/' + tag + '>', 'gi'), '$1'); text = text.replace(new RegExp('<\\/' + tag + '[^>]*?>(\\s*?)<' + tag + '>', 'gi'), '$1'); } if (_text == text) break; } // Remove empty tags text = text.replace(/<(?:[^\s>]+)[^>]*>([\s\n\t\r]*)<\/\1>/g, "$1"); text = text.replace(/<(?:[^\s>]+)[^>]*>(\s*)<\/\1>/g, "$1"); text = text.replace(/<(?:[^\s>]+)[^>]*>(\s*)<\/\1>/g, "$1"); //text = text.replace(/<\/?xml[^>]*>/gi, ""); //<xml...>, </xml...> text = text.replace(/<xml[^>]*?(?:>\s*?<\/xml)?(?:\/?)?>/ig, ''); text = text.replace(/<meta[^>]*?(?:>\s*?<\/meta)?(?:\/?)?>/ig, ''); text = text.replace(/<link[^>]*?(?:>\s*?<\/link)?(?:\/?)?>/ig, ''); text = text.replace(/<style[\s\S]*?<\/style>/ig, ''); if (arParams.tableAtr) text = text.replace(/<table([\s\S]*?)>/gi, "<table>"); if (arParams.trtdAtr) { text = text.replace(/<tr([\s\S]*?)>/gi, "<tr>"); text = text.replace(/(<td[\s\S]*?)width=("|')[\s\S]*?\2([\s\S]*?>)/gi, "$1$3"); text = text.replace(/(<td[\s\S]*?)height=("|')[\s\S]*?\2([\s\S]*?>)/gi, "$1$3"); text = text.replace(/(<td[\s\S]*?)style=("|')[\s\S]*?\2([\s\S]*?>)/gi, "$1$3"); text = text.replace(/(<td[\s\S]*?)valign=("|')[\s\S]*?\2([\s\S]*?>)/gi, "$1$3"); text = text.replace(/(<td[\s\S]*?)nowrap=("|')[\s\S]*?\2([\s\S]*?>)/gi, "$1$3"); text = text.replace(/(<td[\s\S]*?)nowrap([\s\S]*?>)/gi, "$1$3"); text = text.replace(/(<col[\s\S]*?)width=("|')[\s\S]*?\2([\s\S]*?>)/gi, "$1$3"); text = text.replace(/(<col[\s\S]*?)style=("|')[\s\S]*?\2([\s\S]*?>)/gi, "$1$3"); } // For Opera (12.10+) only when in text we have reference links. if (BX.browser.IsOpera()) text = text.replace(/REF\s+?_Ref\d+?[\s\S]*?MERGEFORMAT\s([\s\S]*?)\s[\s\S]*?<\/xml>/gi, " $1 "); return text; }; BXHTMLEditor.prototype.PasteWord = function(text, arParams) { this.insertHTML(this.CleanWordText(text, arParams)); }; BXHTMLEditor.prototype.LoadTemplateParams = function(templateID) { var _this = this; return BX.ajax.post(editor_action_path + '&action=sitetemplateparams&lang=' + BXLang + '&site=' + BXSite + '&templateID=' + templateID, {}, function(){ setTimeout(function(){ _this.SetTemplate(window.bx_template_params["ID"], window.bx_template_params, false); }, 100); }); }; BXHTMLEditor.prototype.SetTemplate = function (templateID, arTemplateParams, bReload) { //try{ if(this.templateID && this.templateID == templateID || arTemplateParams === false) return; if(!arTemplateParams) return this.LoadTemplateParams(templateID); this.templateID = arTemplateParams["ID"]; if(this.pTemplateListbox) this.pTemplateListbox.SelectByVal(this.templateID); this.arTemplateParams = arTemplateParams; if (bReload) // Reload contents { this.SaveContent(); if (this.bDotNet) this.SetTemplate_ex(); this.LoadContent(); } // Change styles if (to_template_path && this.arTemplateParams.ID) this.oStyles.Parse(this.arTemplateParams["STYLES"], to_template_path + this.arTemplateParams.ID); var styleTitles = this.arTemplateParams["STYLES_TITLE"]; if (styleTitles) { // Workaround for Chrome for (var title in styleTitles) if (title && title != title.toLowerCase() && !styleTitles[title.toLowerCase()]) styleTitles[title.toLowerCase()] = styleTitles[title]; } // Set styles this.oStyles.SetToDocument(this.pEditorDocument); var _this = this; if (this.pParser.strStyleNodes) setTimeout(function(){_this.pParser.AppendCSS(_this.pParser.strStyleNodes);}, 300); this.OnEvent("OnTemplateChanged"); //}catch(e){_alert('ERROR: BXHTMLEditor.prototype.SetTemplate');} }; BXHTMLEditor.prototype.SetFocus = function () { if(!this.bEditSource) BX.focus(this.pEditorWindow.focus ? this.pEditorWindow : this.pEditorDocument.body); }; BXHTMLEditor.prototype.insertHTML = function(sValue) { this.SetFocus(); // Don't clear "try catch"... Some times browsers generetes failures try { if(BX.browser.IsIE()) { var oRng = this.pEditorDocument.selection.createRange(); oRng.pasteHTML(sValue); oRng.collapse(false); oRng.select(); } else if(BX.browser.IsIE11()) { this.PasteHtmlAtCaret(sValue); } else { this.pEditorWindow.document.execCommand('insertHTML', false, sValue); } } catch(e){} this.OnChange("insertHTML", ""); }; BXHTMLEditor.prototype.PasteHtmlAtCaret = function(html, selectPastedContent) { var win = this.pEditorWindow, doc = this.pEditorDocument, sel, range; if (win.getSelection) { // IE9 and non-IE sel = win.getSelection(); if (sel.getRangeAt && sel.rangeCount) { range = sel.getRangeAt(0); range.deleteContents(); // Range.createContextualFragment() would be useful here but is // only relatively recently standardized and is not supported in // some browsers (IE9, for one) var el = doc.createElement("div"); el.innerHTML = html; var frag = doc.createDocumentFragment(), node, lastNode; while ((node = el.firstChild)) lastNode = frag.appendChild(node); var firstNode = frag.firstChild; range.insertNode(frag); // Preserve the selection if (lastNode) { range = range.cloneRange(); range.setStartAfter(lastNode); if (selectPastedContent) range.setStartBefore(firstNode); else range.collapse(true); sel.removeAllRanges(); sel.addRange(range); } } } else if ((sel = doc.selection) && sel.type != "Control") { // IE < 9 var originalRange = sel.createRange(); originalRange.collapse(true); sel.createRange().pasteHTML(html); if (selectPastedContent) { range = sel.createRange(); range.setEndPoint("StartToStart", originalRange); range.select(); } } }; BXHTMLEditor.prototype.OnContextMenu = function (e, pElement, bNotFrame, arParams) { var obj = this, arFramePos; obj.OnEvent("OnSelectionChange"); if(obj.pEditorWindow.event) e = obj.pEditorWindow.event; if(!e) e = window.event; if (!pElement) pElement = e.target || e.srcElement; if(e.pageX || e.pageY) { e.realX = e.pageX; e.realY = e.pageY; if (!bNotFrame) { e.realX -= obj.pEditorDocument.body.scrollLeft; e.realY -= obj.pEditorDocument.body.scrollTop; } } else if(e.clientX || e.clientY) { e.realX = e.clientX; e.realY = e.clientY; if (bNotFrame) { e.realX += document.body.scrollLeft; e.realY += document.body.scrollTop; } } if(!bNotFrame) { if (!(arFramePos = CACHE_DISPATCHER['pEditorFrame_' + this.name])) CACHE_DISPATCHER['pEditorFrame_' + this.name] = arFramePos = BX.pos(obj.pEditorFrame); e.realX += arFramePos["left"]; e.realY += arFramePos["top"]; } oBXContextMenu.Show(2500, 0, {left : e.realX, top : e.realY}, pElement, arParams, this); return BX.PreventDefault(e); }; BXHTMLEditor.prototype.executeCommand = function(commandName, sValue) { this.SetFocus(); try{ var res = this.pEditorWindow.document.execCommand(commandName, false, sValue); }catch(e){}; this.SetFocus(); this.OnEvent("OnSelectionChange"); this.OnChange("executeCommand", commandName); return res; }; BXHTMLEditor.prototype.queryCommand = function(commandName) { var sValue = ''; try{ if(!this.pEditorDocument.queryCommandEnabled(commandName)) return null; }catch(e){return null;} try{ return this.pEditorDocument.queryCommandValue(commandName); }catch(e) {} return null; }; BXHTMLEditor.prototype.queryCommandState = function(commandName) { var sValue = ''; try { if(!this.pEditorDocument.queryCommandEnabled(commandName)) return 'DISABLED'; } catch(e){return 'DISABLED';} try { return (this.pEditorDocument.queryCommandState(commandName)?'CHECKED':'ENABLED'); } catch(e) {return 'ENABLED';} return 'DISABLED'; }; BXHTMLEditor.prototype.updateBody = function() { this.extractBodyParams(this._body); }; BXHTMLEditor.prototype.extractBodyParams = function(_body) { var sParams = _body.replace(/<body(.*?)>/i, "$1"); var arBodyParams_src = sParams.match(/\w+\s*=".*?"/ig); var arBodyParams = []; var _val; for (var i in arBodyParams_src) { if (parseInt(i).toString()=="NaN") continue; var arBodyParams_src = sParams.match(/(\w+)\s*=".*?"/ig); _val = arBodyParams_src[i].replace(/(\w+)\s*="(.*?)"/ig,"$2"); arBodyParams[RegExp.$1] = _val; } }; BXHTMLEditor.prototype.FFOnFocus = function(e) { try{ var pMainObj = GLOBAL_pMainObj[this.__bxedname]; if (pMainObj.pEditorDocument.designMode == 'on') return; pMainObj.pEditorDocument.designMode = "on"; //pMainObj.pEditorDocument.execCommand("useCSS", false, true); //deprecated pMainObj.pEditorDocument.execCommand("styleWithCSS", false, false); // new moz call setTimeout(function(){ try{pMainObj.pEditorDocument.execCommand("styleWithCSS", false, false);}catch(e){} }, 1000); this.document.execCommand("insertBrOnReturn", false, false); // new moz call }catch(e){/*_alert('Eror: pMainObj.FFOnFocus');*/} }; BXHTMLEditor.prototype.onSubmit = function(e) { if (!this.isSubmited) { this.isSubmited = true; BX.cleanNode(this.oPropertiesTaskbar.pCellProps); if (!this.sEditorMode) this.sEditorMode = 'html'; this.OnEvent('OnSubmit'); if(this.bShowed) this.SaveContent(); this.Show(false); } }; BXHTMLEditor.prototype.OnKeyDown = function (e) { if (!e) e = this.pEditorWindow.event; var key = e.which || e.keyCode; if (!BX.browser.IsIE() && !BX.browser.IsOpera()) { if (e.ctrlKey && !e.shiftKey && !e.altKey) { switch (key) { case 66 : // B case 98 : // b this.executeCommand('Bold'); return BX.PreventDefault(e); case 105 : // i case 73 : // I this.executeCommand('Italic'); return BX.PreventDefault(e); case 117 : // u case 85 : // U this.executeCommand('Underline'); return BX.PreventDefault(e); } } } // Tab and Shift+Tab if (key == 16) // Shift { var _this = this; this._bShiftPressed = true; setTimeout(function(){_this._bShiftPressed = false;}, 200); } else if (key == 9) { // It's SHIFT + TAB if (this._bShiftPressed || e.shiftKey) { this.executeCommand('Outdent'); return BX.PreventDefault(e); } else // It's TAB { this.executeCommand('Indent'); return BX.PreventDefault(e); } } // Ctrl + V or Shift + Ins if ((e.ctrlKey && key == 86) || ((this._bShiftPressed || e.shiftKey) && key == 45)) this.OnCtrlV(); }; BXHTMLEditor.prototype.OnCtrlV = function() { var arUsedId = {}, _this = this; setTimeout(function(){ CheckChilds(_this.pEditorDocument.body, { func: function(node) { if (node.nodeType != 1) return; var id = node.id; if (!id || id.substr(0, 5) != "bxid_") return; if (arUsedId[id] === true) { var oTag = _this.GetBxTag(node); if (oTag.tag) { oTag.id = null; delete oTag.id; node.id = ''; node.removeAttribute('id'); var newId = _this.SetBxTag(node, copyObj(oTag)); // Temp hack. TODO: save comp params in oTag.params if (oTag.tag == 'component2' && _this.pComponent2Taskbar) { _this.pComponent2Taskbar.SetParams({id: newId, params: copyObj(_this.pComponent2Taskbar.GetParams({id: id}))}); } arUsedId[newId] = true; } } else { arUsedId[id] = true; } }, obj: _this }); arUsedId = null; }, 500); }; BXHTMLEditor.prototype.OnPaste = function (e) { var clipboardHTML = this.GetClipboardHTML(); var AutoDetectWordContent = true; if (AutoDetectWordContent) { var RE_MS_WORD = /<\w[^>]*(( class="?MsoNormal"?)|(="mso-))/gi; if (RE_MS_WORD.test(clipboardHTML)) { if (confirm(BX_MESS.MaybeTextFromWord)) { this.bNotFocus = true; this.pMainObj.OpenEditorDialog("pasteword", false, 450); e.returnValue = false; e.cancelBubble = true; } else return; } } }; BXHTMLEditor.prototype.GetClipboardHTML = function() { var oDiv = document.createElement('DIV'); oDiv.style.visibility = 'hidden'; oDiv.style.overflow = 'hidden'; oDiv.style.position = 'absolute'; oDiv.style.width = 1; oDiv.style.height = 1; document.body.appendChild(oDiv); oDiv.innerHTML = ''; var oRange = document.body.createTextRange(); oRange.moveToElementText(oDiv); oRange.execCommand("Paste"); var sData = oDiv.innerHTML; oDiv.innerHTML = ''; return sData; }; BXHTMLEditor.prototype.OnKeyPress = function (e, bEdit) { this.bFirstClick = true; if(!e) e = window.event; if(e.keyCode == 27) { if (this.oPublicDialog && !this.CheckSubdialogs()) return this.oPublicDialog.Close(); if (window.oBXEditorDialog && window.oBXEditorDialog.isOpen) return window.oBXEditorDialog.Close(); if (window.oBXContextMenu && oBXContextMenu.menu && oBXContextMenu.menu.IsVisible()) oBXContextMenu.menu.PopupHide(); } if (!bEdit && e.keyCode == 13) { var target = e.target || e.srcElement; if (target && target.nodeName.toUpperCase() == 'TEXTAREA') return true; return BX.PreventDefault(e); } return true; }; BXHTMLEditor.prototype.RemoveElements = function (arParentElement, tagName, arAttributes, oRange) { var arChildren; arChildren = arParentElement.children; if(arChildren) { for(var i=0; i<arChildren.length; i++) { var elChild = arChildren[i]; this.RemoveElements(elChild, tagName, arAttributes); if(elChild.tagName.toLowerCase() != tagName.toLowerCase()) continue; var bEqual = true; for(var attrName in arAttributes) { attrValue = arAttributes[attrName]; switch(attrName.toLowerCase()) { case 'style': var styleValue = attrValue.toLowerCase(); var re = /([^:]+):[^;]+/g; var arr; while((arr = re.exec(styleValue)) != null) { var styleName = RegExp.$1; if(elChild.style.cssText.toLowerCase().indexOf(styleName.toLowerCase())==-1) { bEqual = false; break; } } break; case 'class' : if(elChild.getAttribute('className', 0) != attrValue) bEqual = false; break; default: if(elChild.getAttribute(attrNalue, 0) != attrValue) bEqual = false; } } if(bEqual) { elChild.insertAdjacentHTML('beforeBegin', elChild.innerHTML); elChild.parentElement.removeChild(elChild); } } } }; BXHTMLEditor.prototype.WrapSelectionWith = function (tagName, arAttributes) { this.SetFocus(); var oRange, oSelection; if (!tagName) tagName = 'SPAN'; var sTag = 'FONT', i, pEl, arTags, arRes = []; try{this.pEditorDocument.execCommand("styleWithCSS", false, false);}catch(e){} this.executeCommand("FontName", "bitrixtemp"); try{this.pEditorDocument.execCommand("styleWithCSS", false, false);}catch(e){} arTags = this.pEditorDocument.getElementsByTagName(sTag); for(i = arTags.length - 1; i >= 0; i--) { if (arTags[i].getAttribute('face') != 'bitrixtemp') continue; pEl = BX.create(tagName, arAttributes, this.pEditorDocument); arRes.push(pEl); while(arTags[i].firstChild) pEl.appendChild(arTags[i].firstChild); arTags[i].parentNode.insertBefore(pEl, arTags[i]); arTags[i].parentNode.removeChild(arTags[i]); } return arRes; }; BXHTMLEditor.prototype.RidOfNode = function (pNode, bHard) { if (!pNode || pNode.nodeType != 1) return; var i, nodeName = pNode.tagName.toLowerCase(); if (nodeName == 'span' || nodeName == 'strike' || nodeName == 'font') // Check node names { if (bHard !== true) { for (i = pNode.attributes.length - 1; i >= 0; i--) { if (BX.util.trim(pNode.getAttribute(pNode.attributes[i].nodeName.toLowerCase())) != "") return false; // Node have attributes, so we cant get rid of it without loosing info } } var arNodes = pNode.childNodes; while(arNodes.length > 0) pNode.parentNode.insertBefore(arNodes[0], pNode); pNode.parentNode.removeChild(pNode); this.OnEvent("OnSelectionChange"); return true; } return false; } BXHTMLEditor.prototype.GetToolbarSet = function () { return this.arToolbarSet; }; BXHTMLEditor.prototype.GetTaskbarSet = function () { return this.arTaskbarSet; }; BXHTMLEditor.prototype.SelectElement = function (pElement) { if(this.pEditorWindow.getSelection) { var oSel = this.pEditorWindow.getSelection(); oSel.selectAllChildren(pElement); oRange = oSel.getRangeAt(0); } else { this.pEditorDocument.selection.empty(); var oRange = this.pEditorDocument.selection.createRange(); if (oRange.moveToElementText) oRange.moveToElementText(pElement); oRange.select(); } return oRange; }; BXHTMLEditor.prototype.CollapseSelection = function () { if(this.pEditorWindow.getSelection) { var oSel = this.pEditorWindow.getSelection(); if (oSel.collapseToEnd) oSel.collapseToEnd(); } else if (this.pEditorDocument && this.pEditorDocument.selection && this.pEditorDocument.selection.empty) { this.pEditorDocument.selection.empty(); } } BXHTMLEditor.prototype.GetSelectedNode = function(bOnlyNode) { var oSelection; if(this.pEditorDocument.selection && !BX.browser.IsIE9()) // IE, exept IE9 { oSelection = this.pEditorDocument.selection; var s = oSelection.createRange(); if(oSelection.type=="Control") return s.commonParentElement(); if(s.parentElement() && (s.text == s.parentElement().innerText || bOnlyNode)) return (s.parentElement().childNodes.length == 1) ? s.parentElement().firstChild : s.parentElement(); return s; } else { oSelection = this.pEditorWindow.getSelection(); if(!oSelection || oSelection.rangeCount!=1) return false; var oRange, container; oRange = oSelection.getRangeAt(0); container = oRange.startContainer; if(container.nodeType != 3) { if(container.nodeType == 1 && container.childNodes.length <= 0) return container; else if(oRange.endOffset - oRange.startOffset == container.childNodes.length) return container else if(oRange.endOffset - oRange.startOffset < 2) return container.childNodes[oRange.startOffset]; else return false; } return container; } }; BXHTMLEditor.prototype.GetSelectionObjects = function () { var oSelection; if(this.pEditorDocument.selection && !BX.browser.IsIE9()) // IE, exept IE9 { oSelection = this.pEditorDocument.selection; var s = oSelection.createRange(); if(oSelection.type=="Control") return s.commonParentElement(); return s.parentElement(); } else // FF { oSelection = this.pEditorWindow.getSelection(); if(!oSelection) return false; var oRange; var container, temp; var res = []; for(var i = 0; i < oSelection.rangeCount; i++) { oRange = oSelection.getRangeAt(i); container = oRange.startContainer; if(container.nodeType != 3) { if(container.nodeType == 1 && container.childNodes.length <= 0) res[res.length] = container; else res[res.length] = container.childNodes[oRange.startOffset]; } else { temp = oRange.commonAncestorContainer; while(temp && temp.nodeType == 3) temp = temp.parentNode; res[res.length] = temp; } } if(res.length > 1) return res; return res[0]; } }; BXHTMLEditor.prototype.OptimizeHTML = function (str) { // TODO: kill links without text and names // TODO: Kill multiple line ends var iter = 0, bReplasing = true, arTags = ['b', 'em', 'font', 'h\\d', 'i', 'li', 'ol', 'small', 'span', 'strong', 'u', 'ul'], replaceEmptyTags = function(){i--; bReplasing = true; return ' ';}, re, tagName, i, l; while(iter++ < 20 && bReplasing) { bReplasing = false; for (i = 0, l = arTags.length; i < l; i++) { tagName = arTags[i]; re = new RegExp('<'+tagName+'[^>]*?>\\s*?</'+tagName+'>', 'ig'); str = str.replace(re, replaceEmptyTags); re = new RegExp('<' + tagName + '\\s+?[^>]*?/>', 'ig'); str = str.replace(re, replaceEmptyTags); // Replace <b>text1</b> <b>text2</b> ===>> <b>text1 text2</b> if (tagName !== 'li') { re = new RegExp('<((' + tagName + '+?)(?:\\s+?[^>]*?)?)>([\\s\\S]+?)<\\/\\2>\\s*?<\\1>([\\s\\S]+?)<\\/\\2>', 'ig'); str = str.replace(re, function(str, b1, b2, b3, b4) { bReplasing = true; return '<' + b1 + '>' + b3 + ' ' + b4 + '</' + b2 + '>'; } ); } } } return str; }; BXHTMLEditor.prototype.GetSelectionObject = function () { var res = this.GetSelectionObjects(); if(res && res.constructor == Array) { var root = res[0]; for(var i = 1; i < res.length; i++) root = BXFindParentElement(root, res[i]); return root; } return res; }; BXHTMLEditor.prototype.CreateEditorElement = function (sTagname, arParams, arStyles) { return BXCreateElement(sTagname, arParams, arStyles, this.pEditorDocument); }; BXHTMLEditor.prototype.CreateCustomElement = function(sTagName, arParams) { var ob = new window[sTagName](); ar_CustomElementS.push(ob); ob.pMainObj = this; ob.pDocument = this.pDocument; ob.CreateElement = BXCreateElement; if(arParams) { var sParamName; for(sParamName in arParams) if(sParamName.toLowerCase() == '_oncreate') arParams[sParamName].apply(ob); else ob[sParamName] = arParams[sParamName]; } if (ob._Create) ob._Create(); return ob; }; BXHTMLEditor.prototype.AddEventHandler = function (eventName, pEventHandler, pObject) { if(!this.arEventHandlers[eventName]) this.arEventHandlers[eventName] = []; this.arEventHandlers[eventName].push([pEventHandler, pObject]); }; BXHTMLEditor.prototype.OnEvent = function (eventName, arParams) { if(!this.arEventHandlers[eventName]) return true; var res = true; for(var i=0; i < this.arEventHandlers[eventName].length; i++) { if(this.arEventHandlers[eventName][i][1]) { if(!arParams) arParams = []; if(!this.arEventHandlers[eventName][i][0].apply(this.arEventHandlers[eventName][i][1], arParams)) res = false; } else { if(!this.arEventHandlers[eventName][i][0](arParams)) res = false; } } return res; }; BXHTMLEditor.prototype.FullResize = function() { var ws = BX.GetWindowInnerSize(); window.__fswindow.style.width = parseInt(ws.innerWidth) + "px"; window.__fswindow.style.height = parseInt(ws.innerHeight) + "px"; this.OnEvent('OnFullResize', []); }; BXHTMLEditor.prototype.ClearPosCache = function () { CACHE_DISPATCHER['BXTaskbarset_VPos_' + this.name] = null; CACHE_DISPATCHER['BXTasktab_VPos_' + this.name] = null; CACHE_DISPATCHER['pEditorFrame_' + this.name] = null; CACHE_DISPATCHER['pEditorFrame'] = null; CACHE_DISPATCHER['BXToolbarSet_pos_0'] = null; CACHE_DISPATCHER['BXToolbarSet_pos_1'] = null; CACHE_DISPATCHER['BXToolbarSet_pos_2'] = null; CACHE_DISPATCHER['BXToolbarSet_pos_3'] = null; }; BXHTMLEditor.prototype.SetFullscreen = function (bFull) { this.ClearPosCache(); var _this = this; if(bFull) { var ws = BX.GetWindowInnerSize(); BX.addClass(this.pWnd, "bxedmain-fullscreen"); this.pDocument.body.style.overflow = "hidden"; this.__oldSize = [this.pWnd.style.width, this.pWnd.style.height]; var innerWidth = parseInt(ws.innerWidth); var innerHeight = parseInt(ws.innerHeight); if(BX.browser.IsIE() && !IEplusDoctype) innerWidth += 18; this.pWnd.style.width = innerWidth + "px"; this.pWnd.style.height = innerHeight + "px"; window.scrollTo(0, 0); window.__fswindow = this.pWnd; window._bxonresize = window.onresize || null; window.onresize = function(){_this.FullResize();}; } else { BX.removeClass(this.pWnd, "bxedmain-fullscreen"); this.pDocument.body.style.overflow = "auto"; if (!this.__oldSize) return; this.pWnd.style.width = this.__oldSize[0]; this.pWnd.style.height = this.__oldSize[1]; window.__fswindow = null; window.onresize = window._bxonresize || null; var pWnd = this.arTaskbarSet[3].pWnd; if (parseInt(pWnd.offsetHeight) >= 245) { pWnd.style.height = '245px'; var pParWnd = this.arTaskbarSet[2].pParentWnd; var display = pParWnd.style.display; pParWnd.style.display = 'none'; var _this = this; setTimeout(function() {pParWnd.style.display = display; _this.IEplusDoctypePatchSizes();}, 10); } this._DisplaySourceFrame(true); } this.arTaskbarSet[2]._SetTmpClass(true); this.arTaskbarSet[2].Resize(); this.arTaskbarSet[3].Resize(); this.bFullscreen = bFull; if(this.pDocument.getElementById('fullscreen')) this.pDocument.getElementById('fullscreen').value = (bFull ? 'Y' : 'N'); if (IEplusDoctype) { this.IEplusDoctypePatchSizes(); // IE in standart mode needs to refresh DOM tree var pWnd = this.arTaskbarSet[3].arTaskbars[0].pWnd; pWnd.parentNode.appendChild(pWnd); // TODO: check this ?????????? } this.SetCursorFF(); this.OnEvent('OnFullscreen', [bFull]); }; BXHTMLEditor.prototype.ParseStyles = function () { this.arStyles = []; }; BXHTMLEditor.prototype._FuncOnChange = function(obj, type, subtype) { return function(){obj._OnChange(type, subtype);} }; BXHTMLEditor.prototype.OnChange = function(type, subtype) { if(this.bSkipChanges == true) return; if(!subtype) subtype = ""; if(this.sOnChangeLastType != type || this.sOnChangeLastSubType != subtype) { this._OnChange(type, subtype); return; } if(this.pOnChangeTimer) clearTimeout(this.pOnChangeTimer); this.pOnChangeTimer = setTimeout(this._FuncOnChange(this, type, subtype), 1000); }; BXHTMLEditor.prototype.IsChanged = function() { if (!this.bFirstClick) return false; if(this.bNotSaved) return true; this.SaveContent(); var firstContent = this.sFirstContent.trim(); var curContent = this.GetContent().trim(); if(firstContent.length == curContent.length && firstContent == curContent) return false; return true; }; BXHTMLEditor.prototype._OnChange = function(type, subtype) { this.sOnChangeLastType = type; this.sOnChangeLastSubType = subtype; var curContent = this.pEditorDocument.body.innerHTML; if(this.sLastContent.length==curContent.length && this.sLastContent == curContent) return; var xx = this.sLastContent; this.sLastContent = curContent; if(BX.browser.IsIE()) { if(type!='Undo' && type!='Redo') { var lastUndoItem = this.arUndoBuffer.length; if(this.iUndoPos + 1 < lastUndoItem) { this.arUndoBuffer.length = this.iUndoPos + 1; lastUndoItem = this.iUndoPos + 1; } var pos = false; if(this.pEditorDocument.selection) { if(this.pEditorDocument.selection.type == 'Text') pos = this.pEditorDocument.selection.createRange().getBookmark(); } this.arUndoBuffer.push({'type': type, 'subtype': subtype, 'content': curContent, 'pos': pos}); var cnt = lastUndoItem - this.arConfig["undosize"]; if(cnt>0) { this.arUndoBuffer.reverse(); this.arUndoBuffer.length = this.arUndoBuffer.length - cnt; this.arUndoBuffer.reverse(); } this.iUndoPos = this.arUndoBuffer.length - 1; } this.bNotSaved = (this.iUndoPos > 0); } else { if(this.iUndoPos < 0) this.iUndoPos = 0; else this.bNotSaved = true; } this.OnEvent("OnChange"); }; BXHTMLEditor.prototype.SetXXdo = function(type) { var arUndoInfo = this.arUndoBuffer[this.iUndoPos]; this.pEditorDocument.body.innerHTML = arUndoInfo['content']; this._OnChange(type); this.sLastContent = this.pEditorDocument.body.innerHTML; if(arUndoInfo['pos']) { if(this.pEditorDocument.selection) { var oRange = this.pEditorDocument.selection.createRange(); oRange.moveToBookmark(arUndoInfo['pos']); oRange.select(); } } }; BXHTMLEditor.prototype.UndoStatus = function() { return !(this.iUndoPos < 1 || this.arUndoBuffer.length <= 0); }; BXHTMLEditor.prototype.Undo = function(pos) { if(!this.UndoStatus()) return; if(this.iUndoPos<pos) this.iUndoPos = 0; else this.iUndoPos = this.iUndoPos - pos; this.SetXXdo("Undo"); }; BXHTMLEditor.prototype.RedoStatus = function(pos) { return !(this.iUndoPos + 1 >= this.arUndoBuffer.length || this.arUndoBuffer.length<=0); }; BXHTMLEditor.prototype.Redo = function(pos) { if(!this.RedoStatus()) return; if(this.iUndoPos + pos >= this.arUndoBuffer.length) this.iUndoPos = this.arUndoBuffer.length-1; else this.iUndoPos = this.iUndoPos + pos; this.SetXXdo("Redo"); }; BXHTMLEditor.prototype.Clean = function(pos) { return; this.pFrame = null; this.pWnd.pMainObj = null; this.pWnd = null; this.pForm = null; this.pComponent2Taskbar = null; this.pLoaderFrame = null; for (var evname in this.arEventHandlers) this.arEventHandlers[evname] = null; this.arEventHandlers = null; var l = this.arToolbarSet.length; for (var i=0;i<l;i++) this.arToolbarSet[i] = null; var l = this.arTaskbarSet.length; for (var i=0;i<l;i++) this.arTaskbarSet[i] = null; this.lineNumCont = null; this.pSourceFrame.onkeydown = null; this.pSourceFrame = null; this.pEditorWindow = null; this.pEditorFrame = null; this.pEditorDocument.pMainObj = null; this.pEditorDocument = null; this.pDocument = null; this.pParser = null; }; BXHTMLEditor.prototype.IEPatchSizesHandler = function(value) { var _this = this; setTimeout(function(){_this.IEplusDoctypePatchSizes()}, 100); } BXHTMLEditor.prototype.IEplusDoctypePatchSizes = function(value) { return; if (!IEplusDoctype) return; var tbs2 = this.arTaskbarSet[2]; var tbs3 = this.arTaskbarSet[3]; if (isNaN(value)) { if (tbs3.pWnd.style.display != 'none') value = parseInt(tbs3.pWnd.style.height); else value = 0; } else value = value - 35; if (value == 0) // padding-bottom when hide bottom taskbarset value = - 33; var edHeight = parseInt((this.bFullscreen) ? BX.GetWindowInnerSize().innerHeight : this.arConfig["height"]); var centerRowH = edHeight - value - 114; if (isNaN(centerRowH)) return; this.pFrame.rows[1].style.height = centerRowH + "px"; if (this.sEditorMode == 'html') { this.pEditorFrame.style.height = centerRowH + "px"; } else if (this.sEditorMode == 'split') { this.pEditorFrame.style.height = (Math.round(centerRowH / 2) - 3) + "px"; this.pSourceFrame.style.height = (Math.round(centerRowH / 2) - 4) + "px"; } else if (this.sEditorMode == 'code') { this.pSourceFrame.style.height = (centerRowH - 6)+ "px"; } if (tbs2.bShowing) { var tb, titleCell, dataCell; var l = tbs2.arTaskbars.length; var bH, tH = 25; if (l > 1) { bH = 25; tbs2.pWnd.style.height = (centerRowH - 45) + "px"; tbs2.pBottomColumn.style.height = bH + "px"; } else bH = 0; var dH = centerRowH - tH - bH - 6; for(var i = 0; i < l; i++) { tb = tbs2.arTaskbars[i].pWnd; tb.rows[0].cells[0].style.height = tH + "px"; // title cell tb.rows[1].cells[0].style.height = dH + "px"; // data cell } } var o, btt; }; BXHTMLEditor.prototype.OnSpellCheck = function() { BX.closeWait(); var alreadyCheck = false; if (this.pMainObj.arConfig["spellCheckFirstClient"] == "Y") alreadyCheck = SpellCheck_MS(this.pMainObj.pEditorDocument.body); var usePspell = this.pMainObj.arConfig["usePspell"]; //var useCustomSpell = this.pMainObj.arConfig["useCustomSpell"]; var useCustomSpell = "N"; if (!alreadyCheck) { if (usePspell == "Y" || useCustomSpell == "Y") { this.bNotFocus = true; this.pMainObj.OpenEditorDialog("spellcheck", false, 400, {BXLang: BXLang, usePspell: usePspell, useCustomSpell: useCustomSpell}, true); } else { alert(BX_MESS.SpellCheckNotInstalled); } } }; BXHTMLEditor.prototype.SaveConfig = function(sTarget, data) { if (typeof data != 'object') data = {}; data.edname = this.name; switch(sTarget) { case "tooltips": data.tooltips = this.showTooltips4Components ? "Y" : "N"; break; case "visual_effects": data.visual_effects = this.visualEffects ? "Y" : "N"; break; case "render_components": data.render_components = this.bRenderComponents ? "Y" : "N"; break; } return BX.ajax.post(settings_page_path + '&target=' + sTarget, data); }; BXHTMLEditor.prototype.GetConfig = function(oCallBack) { //Tooltips this.showTooltips4Components = SETTINGS[this.name].showTooltips4Components; // Visual effects this.visualEffects = SETTINGS[this.name].visualEffects; oCallBack.func.apply(oCallBack.obj); }; BXHTMLEditor.prototype.RestoreConfig = function() { return BX.ajax.post(settings_page_path + '&target=unset&edname=' + this.name, {}, function(){alert(BX_MESS.RestoreSettingsMess);}); }; BXHTMLEditor.prototype.GetTaskbarConfig = function(name) { if (SETTINGS[this.name].arTaskbarSettings[name]) return SETTINGS[this.name].arTaskbarSettings[name]; else if (arTaskbarSettings_default[name]) return arTaskbarSettings_default[name]; else return {show : true, set: 2, active: false}; } BXHTMLEditor.prototype.CheckTaskbar = function(taskbar) { return BXTaskbar && typeof BXTaskbar == 'object' && BXTaskbar.pMainObj && BXTaskbar.name && !BXTaskbar.bDeleted; }; BXHTMLEditor.prototype.SetBxTag = function(pElement, params) { var id; if (params.id || pElement && pElement.id) { id = params.id || pElement.id; } if (!id) { id = 'bxid_' + Math.round(Math.random() * 1000000); } else { if (this.bxTags[id]) { if (!params.tag) params.tag = this.bxTags[id].tag; } } params.id = id; if (pElement) pElement.id = params.id; this.bxTags[params.id] = params; return params.id; }; BXHTMLEditor.prototype.GetBxTag = function(id) { if (id) { if (typeof id != "string" && id.id) id = id.id; if (id && id.length > 0 && this.bxTags[id] && this.bxTags[id].tag) { this.bxTags[id].tag = this.bxTags[id].tag.toLowerCase(); return this.bxTags[id]; } } return {tag: false}; } BXHTMLEditor.prototype.Add2BxTag = function(id, params) { if (typeof id != "string") id = id.id; if (!id) return; var oTag = this.GetBxTag(id), k; for(k in params) { if (typeof params[k] != 'function') { oTag.params[k] = params[k]; } } }; BXHTMLEditor.prototype.CheckSubdialogs = function() { if (window.oBXEditorDialog && window.oBXEditorDialog.isOpen || this.oTransOverlay.bShowed) return true; return false; }; BXHTMLEditor.prototype.AuthFailureHandler = function(name, arAuthResult) { if (name != this.name || this._authShowed) return; var _this = this; function auth_callback() { _this._authShowed = false; if (_this.__authFailureHandlerCallback) _this.__authFailureHandlerCallback(); } this._authShowed = true; var authDialog = new BX.CAuthDialog({ content_url: '/bitrix/admin/fileman_editor_dialog.php', auth_result: arAuthResult, callback: BX.delegate(function(){ if (auth_callback) auth_callback() }, this) }); authDialog.Show(); BX.addCustomEvent(authDialog, 'onWindowUnRegister', function() { _this._authShowed = false; if (_this.__authFailureHandlerCallbackClose) _this.__authFailureHandlerCallbackClose(); }); }; BXHTMLEditor.prototype.InsertHtmlEx = function(html, timeout) { if (!timeout) timeout = 50; var id = 'tmp_bxid_' + Math.round(Math.random() * 1000000); this.insertHTML('<a id="' + id + '" href="#" _moz_editor_bogus_node="on">+</a>'); var pDoc = this.pEditorDocument; setTimeout(function(){ var pTmp = pDoc.getElementById(id); if (pTmp) { pTmp.innerHTML = html; setTimeout(function(){ var pTmp = pDoc.getElementById(id); if (pTmp) { for (var i = pTmp.childNodes.length - 1; i >= 0; i--) pTmp.parentNode.insertBefore(pTmp.childNodes[i], pTmp); if (pTmp.parentNode) pTmp.parentNode.removeChild(pTmp); } }, timeout); } }, timeout); } function BXContextMenuOnclick(e) { removeEvent(this.pMainObj.pEditorDocument, "click", BXContextMenuOnclick); oBXContextMenu.menu.PopupHide(); }; function BXStyles(pMainObj) { this.pMainObj = pMainObj; this.arStyles = []; this.sStyles = ''; BXStyles.prototype.Parse = function (styles, template_path) { this.templatePath = template_path || ''; this.sStyles = styles; this.arStyles = BXStyleParser.Parse(styles); }; BXStyles.prototype.GetStyles = function (sFilter) { if(this.arStyles[sFilter.toUpperCase()]) return this.arStyles[sFilter.toUpperCase()]; return []; }; BXStyles.prototype.SetToDocument = function(pDocument) { var pHeads = pDocument.getElementsByTagName("HEAD"); if(pHeads.length != 1) return; var cur = pDocument.getElementsByTagName("STYLE"); for(var i = 0; i < cur.length; i++) cur[i].parentNode.removeChild(cur[i]); var xStyle = pDocument.createElement("STYLE"); pHeads[0].appendChild(xStyle); var styles = this.sStyles; //try{ if(BX.browser.IsIE()) pDocument.styleSheets[0].cssText = styles; else xStyle.appendChild(pDocument.createTextNode(styles)); //}catch(e){} }; } BX.ready(BXEditorLoad);