;(function(window) { if (BX.PopupWindowManager) return; BX.PopupWindowManager = { _popups : [], _currentPopup : null, create : function(uniquePopupId, bindElement, params) { var index = -1; if ( (index = this._getPopupIndex(uniquePopupId)) !== -1) return this._popups[index]; var popupWindow = new BX.PopupWindow(uniquePopupId, bindElement, params); BX.addCustomEvent(popupWindow, "onPopupShow", BX.delegate(this.onPopupShow, this)); BX.addCustomEvent(popupWindow, "onPopupClose", BX.delegate(this.onPopupClose, this)); BX.addCustomEvent(popupWindow, "onPopupDestroy", BX.delegate(this.onPopupDestroy, this)); this._popups.push(popupWindow); return popupWindow; }, onPopupShow : function(popupWindow) { if (this._currentPopup !== null) this._currentPopup.close(); this._currentPopup = popupWindow; }, onPopupClose : function(popupWindow) { this._currentPopup = null; }, onPopupDestroy : function(popupWindow) { var index = -1; if ( (index = this._getPopupIndex(popupWindow.uniquePopupId)) !== -1) this._popups = BX.util.deleteFromArray(this._popups, index); }, getCurrentPopup : function() { return this._currentPopup; }, isPopupExists : function(uniquePopupId) { return this._getPopupIndex(uniquePopupId) !== -1 }, _getPopupIndex : function(uniquePopupId) { var index = -1; for (var i = 0; i < this._popups.length; i++) if (this._popups[i].uniquePopupId == uniquePopupId) return i; return index; } }; BX.PopupWindow = function(uniquePopupId, bindElement, params) { BX.onCustomEvent("onPopupWindowInit", [uniquePopupId, bindElement, params ]); this.uniquePopupId = uniquePopupId; this.params = params || {}; this.params.zIndex = parseInt(this.params.zIndex); this.params.zIndex = isNaN(this.params.zIndex) ? 0 : this.params.zIndex; this.buttons = this.params.buttons && BX.type.isArray(this.params.buttons) ? this.params.buttons : []; this.offsetTop = BX.PopupWindow.getOption("offsetTop", 0); this.offsetLeft = BX.PopupWindow.getOption("offsetLeft", 0); this.firstShow = false; this.bordersWidth = 20; this.bindElementPos = null; this.closeIcon = null; this.angle = null; this.overlay = null; this.titleBar = null; this.bindOptions = typeof(this.params.bindOptions) == "object" ? this.params.bindOptions : {}; this.isAutoHideBinded = false; this.closeByEsc = !!this.params.closeByEsc; this.isCloseByEscBinded = false; this.dragged = false; this.dragPageX = 0; this.dragPageY = 0; if (this.params.events) { for (var eventName in this.params.events) BX.addCustomEvent(this, eventName, this.params.events[eventName]); } this.popupContainer = document.createElement("DIV"); BX.adjust(this.popupContainer, { props : { id : uniquePopupId }, style : { zIndex: this.getZindex(), position: "absolute", display: "none", top: "0px", left: "0px" } }); var tableClassName = "popup-window"; if (params.lightShadow) tableClassName += " popup-window-light"; if (params.titleBar) tableClassName += params.lightShadow ? " popup-window-titlebar-light" : " popup-window-titlebar"; if (params.className && BX.type.isNotEmptyString(params.className)) tableClassName += " " + params.className; this.popupContainer.innerHTML = [' \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
'].join(""); document.body.appendChild(this.popupContainer); if (params.closeIcon) { this.popupContainer.appendChild( (this.closeIcon = BX.create("a", { props : { className: "popup-window-close-icon" + (params.titleBar ? " popup-window-titlebar-close-icon" : ""), href : ""}, style : (typeof(params.closeIcon) == "object" ? params.closeIcon : {} ), events : { click : BX.proxy(this._onCloseIconClick, this) } } ) ) ); if (BX.browser.IsIE()) BX.adjust(this.closeIcon, { attrs: { hidefocus: "true" } }); } this.contentContainer = BX("popup-window-content-" + uniquePopupId); this.titleBar = BX("popup-window-titlebar-" + uniquePopupId); this.buttonsContainer = this.buttonsHr = null; if (params.angle) this.setAngle(params.angle); if (params.overlay) this.setOverlay(params.overlay); this.setOffset(this.params); this.setBindElement(bindElement); this.setTitleBar(this.params.titleBar); this.setContent(this.params.content); this.setButtons(this.params.buttons); if (this.params.bindOnResize !== false) { BX.bind(window, "resize", BX.proxy(this._onResizeWindow, this)); } }; BX.PopupWindow.prototype.setContent = function(content) { if (!this.contentContainer || !content) return; if (BX.type.isElementNode(content)) { BX.cleanNode(this.contentContainer); this.contentContainer.appendChild(content.parentNode ? content.parentNode.removeChild(content) : content ); content.style.display = "block"; } else if (BX.type.isString(content)) { this.contentContainer.innerHTML = content; } else this.contentContainer.innerHTML = " "; }; BX.PopupWindow.prototype.setButtons = function(buttons) { this.buttons = buttons && BX.type.isArray(buttons) ? buttons : []; if (this.buttonsHr) BX.remove(this.buttonsHr); if (this.buttonsContainer) BX.remove(this.buttonsContainer); if (this.buttons.length > 0 && this.contentContainer) { var newButtons = []; for (var i = 0; i < this.buttons.length; i++) { var button = this.buttons[i]; if (button == null || !BX.is_subclass_of(button, BX.PopupWindowButton)) continue; button.popupWindow = this; newButtons.push(button.render()); } this.buttonsHr = this.contentContainer.parentNode.appendChild( BX.create("div",{ props : { className : "popup-window-hr popup-window-buttons-hr" }, children : [ BX.create("i", {}) ] }) ); this.buttonsContainer = this.contentContainer.parentNode.appendChild( BX.create("div",{ props : { className : "popup-window-buttons" }, children : newButtons }) ); } }; BX.PopupWindow.prototype.setBindElement = function(bindElement) { if (!bindElement || typeof(bindElement) != "object") return; if (BX.type.isDomNode(bindElement) || (BX.type.isNumber(bindElement.top) && BX.type.isNumber(bindElement.left))) this.bindElement = bindElement; else if (BX.type.isNumber(bindElement.clientX) && BX.type.isNumber(bindElement.clientY)) { BX.fixEventPageXY(bindElement); this.bindElement = { left : bindElement.pageX, top : bindElement.pageY, bottom : bindElement.pageY }; } }; BX.PopupWindow.prototype.getBindElementPos = function(bindElement) { if (BX.type.isDomNode(bindElement)) { return BX.pos(bindElement, false); } else if (bindElement && typeof(bindElement) == "object") { if (!BX.type.isNumber(bindElement.bottom)) bindElement.bottom = bindElement.top; return bindElement; } else { var windowSize = BX.GetWindowInnerSize(); var windowScroll = BX.GetWindowScrollPos(); var popupWidth = this.popupContainer.offsetWidth; var popupHeight = this.popupContainer.offsetHeight; return { left : windowSize.innerWidth/2 - popupWidth/2 + windowScroll.scrollLeft, top : windowSize.innerHeight/2 - popupHeight/2 + windowScroll.scrollTop, bottom : windowSize.innerHeight/2 - popupHeight/2 + windowScroll.scrollTop, //for optimisation purposes windowSize : windowSize, windowScroll : windowScroll, popupWidth : popupWidth, popupHeight : popupHeight }; } }; BX.PopupWindow.prototype.setAngle = function(params) { var className = this.params.lightShadow ? "popup-window-light-angly" : "popup-window-angly"; if (this.angle == null) { var position = this.bindOptions.position && this.bindOptions.position == "top" ? "bottom" : "top"; var angleMinLeft = BX.PopupWindow.getOption(position == "top" ? "angleMinTop" : "angleMinBottom", 7); var defaultOffset = BX.type.isNumber(params.offset) ? params.offset : 0; // if (defaultOffset > 0 && angleMinLeft > 7 && defaultOffset < angleMinLeft) // defaultOffset += (angleMinLeft - 7); this.angle = { element : BX.create("div", { props : { className: className + " " + className +"-" + position }}), position : position, offset : 0, defaultOffset : Math.max(defaultOffset, angleMinLeft) //Math.max(BX.type.isNumber(params.offset) ? params.offset : 0, angleMinLeft) }; this.popupContainer.appendChild(this.angle.element); } if (typeof(params) == "object" && params.position && BX.util.in_array(params.position, ["top", "right", "bottom", "left", "hide"])) { BX.removeClass(this.angle.element, className + "-" + this.angle.position); BX.addClass(this.angle.element, className + "-" + params.position); this.angle.position = params.position; } if (typeof(params) == "object" && BX.type.isNumber(params.offset)) { var offset = params.offset; var minOffset, maxOffset; if (this.angle.position == "top") { minOffset = BX.PopupWindow.getOption("angleMinTop", 7); maxOffset = this.popupContainer.offsetWidth - BX.PopupWindow.getOption("angleMaxTop", 25); maxOffset = maxOffset < minOffset ? Math.max(minOffset, offset) : maxOffset; this.angle.offset = Math.min(Math.max(minOffset, offset), maxOffset); this.angle.element.style.left = this.angle.offset + "px"; this.angle.element.style.marginLeft = "auto"; } else if (this.angle.position == "bottom") { minOffset = BX.PopupWindow.getOption("angleMinBottom", 7); maxOffset = this.popupContainer.offsetWidth - BX.PopupWindow.getOption("angleMaxBottom", 25); maxOffset = maxOffset < minOffset ? Math.max(minOffset, offset) : maxOffset; this.angle.offset = Math.min(Math.max(minOffset, offset), maxOffset); this.angle.element.style.marginLeft = this.angle.offset + "px"; this.angle.element.style.left = "auto"; } else if (this.angle.position == "right") { minOffset = BX.PopupWindow.getOption("angleMinRight", 10); maxOffset = this.popupContainer.offsetHeight - BX.PopupWindow.getOption("angleMaxRight", 10); maxOffset = maxOffset < minOffset ? Math.max(minOffset, offset) : maxOffset; this.angle.offset = Math.min(Math.max(minOffset, offset), maxOffset); this.angle.element.style.top = this.angle.offset + "px"; } else if (this.angle.position == "left") { minOffset = BX.PopupWindow.getOption("angleMinLeft", 10); maxOffset = this.popupContainer.offsetHeight - BX.PopupWindow.getOption("angleMaxLeft", 10); maxOffset = maxOffset < minOffset ? Math.max(minOffset, offset) : maxOffset; this.angle.offset = Math.min(Math.max(minOffset, offset), maxOffset); this.angle.element.style.top = this.angle.offset + "px"; } } }; BX.PopupWindow.prototype.isTopAngle = function() { return this.angle != null && this.angle.position == "top"; }; BX.PopupWindow.prototype.isBottomAngle = function() { return this.angle != null && this.angle.position == "bottom"; }; BX.PopupWindow.prototype.isTopOrBottomAngle = function() { return this.angle != null && BX.util.in_array(this.angle.position, ["top", "bottom"]); }; BX.PopupWindow.prototype.getAngleHeight = function() { return (this.isTopOrBottomAngle() ? BX.PopupWindow.getOption("angleTopOffset", 8) : 0); }; BX.PopupWindow.prototype.setOffset = function(params) { if (typeof(params) != "object") return; if (params.offsetLeft && BX.type.isNumber(params.offsetLeft)) this.offsetLeft = params.offsetLeft + BX.PopupWindow.getOption("offsetLeft", 0); if (params.offsetTop && BX.type.isNumber(params.offsetTop)) this.offsetTop = params.offsetTop + BX.PopupWindow.getOption("offsetTop", 0); }; BX.PopupWindow.prototype.setTitleBar = function(params) { if (!this.titleBar || typeof(params) != "object" || !BX.type.isDomNode(params.content)) return; this.titleBar.innerHTML = ""; this.titleBar.appendChild(params.content); if (this.params.draggable) { this.titleBar.parentNode.style.cursor = "move"; BX.bind(this.titleBar.parentNode, "mousedown", BX.proxy(this._startDrag, this)); } }; BX.PopupWindow.prototype.setClosingByEsc = function(enable) { enable = !!enable; if (enable) { this.closeByEsc = true; if (!this.isCloseByEscBinded) { BX.bind(document, "keyup", BX.proxy(this._onKeyUp, this)); this.isCloseByEscBinded = true; } } else { this.closeByEsc = false; if (this.isCloseByEscBinded) { BX.unbind(document, "keyup", BX.proxy(this._onKeyUp, this)); this.isCloseByEscBinded = false; } } }; BX.PopupWindow.prototype.setOverlay = function(params) { if (this.overlay == null) { this.overlay = { element : BX.create("div", { props : { className: "popup-window-overlay", id : "popup-window-overlay-" + this.uniquePopupId } }) }; this.adjustOverlayZindex(); this.resizeOverlay(); document.body.appendChild(this.overlay.element); } if (params && params.opacity && BX.type.isNumber(params.opacity) && params.opacity >= 0 && params.opacity <= 100) { if (BX.browser.IsIE() && !BX.browser.IsIE9()) this.overlay.element.style.filter = "alpha(opacity=" + params.opacity +")"; else { this.overlay.element.style.filter = "none"; this.overlay.element.style.opacity = parseFloat(params.opacity/100).toPrecision(3); } } if (params && params.backgroundColor) this.overlay.element.style.backgroundColor = params.backgroundColor; }; BX.PopupWindow.prototype.removeOverlay = function() { if (this.overlay != null && this.overlay.element != null) BX.remove(this.overlay.element); this.overlay = null; }; BX.PopupWindow.prototype.hideOverlay = function() { if (this.overlay != null && this.overlay.element != null) this.overlay.element.style.display = "none"; }; BX.PopupWindow.prototype.showOverlay = function() { if (this.overlay != null && this.overlay.element != null) this.overlay.element.style.display = "block"; }; BX.PopupWindow.prototype.resizeOverlay = function() { if (this.overlay != null && this.overlay.element != null) { var windowSize = BX.GetWindowScrollSize(); this.overlay.element.style.width = windowSize.scrollWidth + "px"; this.overlay.element.style.height = windowSize.scrollHeight + "px"; } }; BX.PopupWindow.prototype.getZindex = function() { if (this.overlay != null) return BX.PopupWindow.getOption("popupOverlayZindex", 1100) + this.params.zIndex; else return BX.PopupWindow.getOption("popupZindex", 1000) + this.params.zIndex; }; BX.PopupWindow.prototype.adjustOverlayZindex = function() { if (this.overlay != null && this.overlay.element != null) { this.overlay.element.style.zIndex = parseInt(this.popupContainer.style.zIndex) - 1; } }; BX.PopupWindow.prototype.show = function() { if (!this.firstShow) { BX.onCustomEvent(this, "onPopupFirstShow", [this]); this.firstShow = true; } BX.onCustomEvent(this, "onPopupShow", [this]); this.showOverlay(); this.popupContainer.style.display = "block"; this.adjustPosition(); BX.onCustomEvent(this, "onAfterPopupShow", [this]); if (this.closeByEsc && !this.isCloseByEscBinded) { BX.bind(document, "keyup", BX.proxy(this._onKeyUp, this)); this.isCloseByEscBinded = true; } if (this.params.autoHide && !this.isAutoHideBinded) { setTimeout( BX.proxy(function() { this.isAutoHideBinded = true; BX.bind(this.popupContainer, "click", this.cancelBubble); BX.bind(document, "click", BX.proxy(this.close, this)); }, this), 0 ); } }; BX.PopupWindow.prototype.isShown = function() { return this.popupContainer.style.display == "block"; }; BX.PopupWindow.prototype.cancelBubble = function(event) { if(!event) event = window.event; if (event.stopPropagation) event.stopPropagation(); else event.cancelBubble = true; }; BX.PopupWindow.prototype.close = function(event) { if (!this.isShown()) return; if (event && !(BX.getEventButton(event)&BX.MSLEFT)) return true; BX.onCustomEvent(this, "onPopupClose", [this, event]); this.hideOverlay(); this.popupContainer.style.display = "none"; if (this.isCloseByEscBinded) { BX.unbind(document, "keyup", BX.proxy(this._onKeyUp, this)); this.isCloseByEscBinded = false; } setTimeout(BX.proxy(this._close, this), 0); }; BX.PopupWindow.prototype._close = function() { if (this.params.autoHide && this.isAutoHideBinded) { this.isAutoHideBinded = false; BX.unbind(this.popupContainer, "click", this.cancelBubble); BX.unbind(document, "click", BX.proxy(this.close, this)); } }; BX.PopupWindow.prototype._onCloseIconClick = function(event) { event = event || window.event; this.close(event); BX.PreventDefault(event); }; BX.PopupWindow.prototype._onKeyUp = function(event) { event = event || window.event; if (event.keyCode == 27) this.close(event); }; BX.PopupWindow.prototype.destroy = function() { BX.onCustomEvent(this, "onPopupDestroy", [this]); BX.unbindAll(this); BX.unbind(document, "keyup", BX.proxy(this._onKeyUp, this)); BX.unbind(document, "click", BX.proxy(this.close, this)); BX.unbind(document, "mousemove", BX.proxy(this._moveDrag, this)); BX.unbind(document, "mouseup", BX.proxy(this._stopDrag, this)); BX.unbind(window, "resize", BX.proxy(this._onResizeWindow, this)); BX.remove(this.popupContainer); this.removeOverlay(); }; BX.PopupWindow.prototype.adjustPosition = function(bindOptions) { if (bindOptions && typeof(bindOptions) == "object") this.bindOptions = bindOptions; var bindElementPos = this.getBindElementPos(this.bindElement); if (!this.bindOptions.forceBindPosition && this.bindElementPos != null && bindElementPos.top == this.bindElementPos.top && bindElementPos.left == this.bindElementPos.left ) return; this.bindElementPos = bindElementPos; var windowSize = bindElementPos.windowSize ? bindElementPos.windowSize : BX.GetWindowInnerSize(); var windowScroll = bindElementPos.windowScroll ? bindElementPos.windowScroll : BX.GetWindowScrollPos(); var popupWidth = bindElementPos.popupWidth ? bindElementPos.popupWidth : this.popupContainer.offsetWidth; var popupHeight = bindElementPos.popupHeight ? bindElementPos.popupHeight : this.popupContainer.offsetHeight; var angleTopOffset = BX.PopupWindow.getOption("angleTopOffset", 8); var left = this.bindElementPos.left + this.offsetLeft - (this.isTopOrBottomAngle() ? BX.PopupWindow.getOption("angleLeftOffset", 15) : 0); if ( !this.bindOptions.forceLeft && (left + popupWidth + this.bordersWidth) >= (windowSize.innerWidth + windowScroll.scrollLeft) && (windowSize.innerWidth + windowScroll.scrollLeft - popupWidth - this.bordersWidth) > 0) { var bindLeft = left; left = windowSize.innerWidth + windowScroll.scrollLeft - popupWidth - this.bordersWidth; if (this.isTopOrBottomAngle()) { this.setAngle({ offset : bindLeft - left + this.angle.defaultOffset}); } } else if (this.isTopOrBottomAngle()) { this.setAngle({ offset : this.angle.defaultOffset + (left < 0 ? left : 0) }); } if (left < 0) left = 0; var top = 0; if (this.bindOptions.position && this.bindOptions.position == "top") { top = this.bindElementPos.top - popupHeight - this.offsetTop - (this.isBottomAngle() ? angleTopOffset : 0); if (top < 0 || (!this.bindOptions.forceTop && top < windowScroll.scrollTop)) { top = this.bindElementPos.bottom + this.offsetTop; if (this.angle != null) { top += angleTopOffset; this.setAngle({ position: "top"}); } } else if (this.isTopAngle()) { top = top - angleTopOffset + BX.PopupWindow.getOption("positionTopXOffset", 0); this.setAngle({ position: "bottom"}); } else { top += BX.PopupWindow.getOption("positionTopXOffset", 0); } } else { top = this.bindElementPos.bottom + this.offsetTop + this.getAngleHeight(); if ( !this.bindOptions.forceTop && (top + popupHeight) > (windowSize.innerHeight + windowScroll.scrollTop) && (this.bindElementPos.top - popupHeight - this.getAngleHeight()) >= 0) //Can we place the PopupWindow above the bindElement? { //The PopupWindow doesn't place below the bindElement. We should place it above. top = this.bindElementPos.top - popupHeight; if (this.isTopOrBottomAngle()) { top -= angleTopOffset; this.setAngle({ position: "bottom"}); } top += BX.PopupWindow.getOption("positionTopXOffset", 0); } else if (this.isBottomAngle()) { top += angleTopOffset; this.setAngle({ position: "top"}); } } if (top < 0) top = 0; BX.adjust(this.popupContainer, { style: { top: top + "px", left: left + "px", zIndex: this.getZindex() }}); this.adjustOverlayZindex(); }; BX.PopupWindow.prototype._onResizeWindow = function(event) { if (this.isShown()) { this.adjustPosition(); if (this.overlay != null) this.resizeOverlay(); } }; BX.PopupWindow.prototype.move = function(offsetX, offsetY) { var left = parseInt(this.popupContainer.style.left) + offsetX; var top = parseInt(this.popupContainer.style.top) + offsetY; if (typeof(this.params.draggable) == "object" && this.params.draggable.restrict) { //Left side if (left < 0) left = 0; //Right side var scrollSize = BX.GetWindowScrollSize(); var floatWidth = this.popupContainer.offsetWidth; var floatHeight = this.popupContainer.offsetHeight; if (left > (scrollSize.scrollWidth - floatWidth)) left = scrollSize.scrollWidth - floatWidth; if (top > (scrollSize.scrollHeight - floatHeight)) top = scrollSize.scrollHeight - floatHeight; //Top side if (top < 0) top = 0; } this.popupContainer.style.left = left + "px"; this.popupContainer.style.top = top + "px"; }; BX.PopupWindow.prototype._startDrag = function(event) { event = event || window.event; BX.fixEventPageXY(event); this.dragPageX = event.pageX; this.dragPageY = event.pageY; this.dragged = false; BX.bind(document, "mousemove", BX.proxy(this._moveDrag, this)); BX.bind(document, "mouseup", BX.proxy(this._stopDrag, this)); if (document.body.setCapture) document.body.setCapture(); //document.onmousedown = BX.False; document.body.ondrag = BX.False; document.body.onselectstart = BX.False; document.body.style.cursor = "move"; document.body.style.MozUserSelect = "none"; this.popupContainer.style.MozUserSelect = "none"; return BX.PreventDefault(event); }; BX.PopupWindow.prototype._moveDrag = function(event) { event = event || window.event; BX.fixEventPageXY(event); if(this.dragPageX == event.pageX && this.dragPageY == event.pageY) return; this.move((event.pageX - this.dragPageX), (event.pageY - this.dragPageY)); this.dragPageX = event.pageX; this.dragPageY = event.pageY; if (!this.dragged) { BX.onCustomEvent(this, "onPopupDragStart"); this.dragged = true; } BX.onCustomEvent(this, "onPopupDrag"); }; BX.PopupWindow.prototype._stopDrag = function(event) { if(document.body.releaseCapture) document.body.releaseCapture(); BX.unbind(document, "mousemove", BX.proxy(this._moveDrag, this)); BX.unbind(document, "mouseup", BX.proxy(this._stopDrag, this)); //document.onmousedown = null; document.body.ondrag = null; document.body.onselectstart = null; document.body.style.cursor = ""; document.body.style.MozUserSelect = ""; this.popupContainer.style.MozUserSelect = ""; BX.onCustomEvent(this, "onPopupDragEnd"); this.dragged = false; return BX.PreventDefault(event); }; BX.PopupWindow.options = {}; BX.PopupWindow.setOptions = function(options) { if (!options || typeof(options) != "object") return; for (var option in options) BX.PopupWindow.options[option] = options[option]; }; BX.PopupWindow.getOption = function(option, defaultValue) { if (typeof(BX.PopupWindow.options[option]) != "undefined") return BX.PopupWindow.options[option]; else return defaultValue; }; /*========================================Buttons===========================================*/ BX.PopupWindowButton = function(params) { this.popupWindow = null; this.params = params || {}; this.text = this.params.text || ""; this.id = this.params.id || ""; this.className = this.params.className || ""; this.events = this.params.events || {}; this.contextEvents = {}; for (var eventName in this.events) this.contextEvents[eventName] = BX.proxy(this.events[eventName], this); this.nameNode = BX.create("span", { props : { className : "popup-window-button-text"}, text : this.text } ); this.buttonNode = BX.create( "span", { props : { className : "popup-window-button" + (this.className.length > 0 ? " " + this.className : ""), id : this.id }, children : [ BX.create("span", { props : { className : "popup-window-button-left"} } ), this.nameNode, BX.create("span", { props : { className : "popup-window-button-right"} } ) ], events : this.contextEvents } ); }; BX.PopupWindowButton.prototype.render = function() { return this.buttonNode; }; BX.PopupWindowButton.prototype.setName = function(name) { this.text = name || ""; if (this.nameNode) { BX.cleanNode(this.nameNode); BX.adjust(this.nameNode, { text : this.text} ); } }; BX.PopupWindowButton.prototype.setClassName = function(className) { if (this.buttonNode) { if (BX.type.isString(this.className) && (this.className != '')) BX.removeClass(this.buttonNode, this.className); BX.addClass(this.buttonNode, className) } this.className = className; }; BX.PopupWindowButtonLink = function(params) { BX.PopupWindowButtonLink.superclass.constructor.apply(this, arguments); this.nameNode = BX.create("span", { props : { className : "popup-window-button-link-text" }, text : this.text, events : this.contextEvents }); this.buttonNode = BX.create( "span", { props : { className : "popup-window-button popup-window-button-link" + (this.className.length > 0 ? " " + this.className : ""), id : this.id }, children : [this.nameNode] } ); }; BX.extend(BX.PopupWindowButtonLink, BX.PopupWindowButton); BX.PopupMenu = { Data : {}, currentItem : null, stack : [], onkeypresslistener: null, show : function(Id, bindElement, menuItems, params, level) { if (!level) level = 0; if (level < this.stack.length) { for (var i = this.stack.length-1; i >= level; i--) { this.currentItem = this.stack.pop(); if (this.currentItem) this.currentItem.popupWindow.close(); if (i > 0) this.currentItem = this.stack[i-1]; } } if (!this.Data[Id]) { this.Data[Id] = { id : Id, bindElement : bindElement, params : params }; this.Data[Id].popupWindow = this.__createPopup(this.Data[Id], menuItems, params); } this.currentItem = this.Data[Id]; this.stack[level] = this.currentItem; this.currentItem.popupWindow.show(); if (!this.onkeypresslistener) { this.onkeypresslistener = BX.delegate(function(e) { e = e || window.event; if (e && e.keyCode == 27) { this.currentItem = this.stack.pop(); if (this.currentItem) this.currentItem.popupWindow.close(); if (this.stack.length > 0) this.currentItem = this.stack[this.stack.length - 1]; } }, this); BX.bind(document, 'keypress', this.onkeypresslistener); } }, __createPopup : function(node, menuItems, params) { var items = []; for (var i = 0; i < menuItems.length; i++) { var item = menuItems[i]; if (!item) continue; if (i > 0) items.push(BX.create("div", { props : { className : "popup-window-hr" }, html:''})); if (!!item.delimiter) { var a = BX.create('span', {props:{className:'popup-window-delimiter'},html:''}); } else if (!!item.text && BX.type.isNotEmptyString(item.text)) { var a = BX.create(!!item.href ? "a" : "span", { props : { className: "menu-popup-item" + (BX.type.isNotEmptyString(item.className) ? " " + item.className : "")}, attrs : { title : item.title ? item.title : "", onclick: item.onclick && BX.type.isString(item.onclick) ? item.onclick : null}, events : item.onclick && BX.type.isFunction(item.onclick) ? { click : BX.proxy(item.onclick, node) } : null, html : '' + item.text + '' }); if (item.href) a.href = item.href; } items.push(a); } var popupWindow = new BX.PopupWindow("menu-popup-" + node.id, node.bindElement, { closeByEsc : false, autoHide : typeof(params.autoHide) != "undefined" ? params.autoHide : true, offsetTop : params.offsetTop ? params.offsetTop : 1, offsetLeft : params.offsetLeft ? params.offsetLeft : 0, lightShadow : typeof(params.lightShadow) != "undefined" ? params.lightShadow : true, angle : typeof(params.angle) != "undefined" ? params.angle : false, content : BX.create("div", { props : { className : "menu-popup" }, children: [ BX.create("div", { props : { className : "menu-popup-items" }, children: items}) ]}) }); if (params && params.events) { for (var eventName in params.events) BX.addCustomEvent(popupWindow, eventName, params.events[eventName]); } return popupWindow; } }; // TODO: copypaste/update/enhance CSS and images from calendar to MAIN CORE // this.values = [{ID: 1, NAME : '111', DESCRIPTION: '111', URL: 'href://...'}] window.BXInputPopup = function(params) { this.id = params.id || 'bx-inp-popup-' + Math.round(Math.random() * 1000000); this.handler = params.handler || false; this.values = params.values || false; this.pInput = params.input; this.bValues = !!this.values; this.defaultValue = params.defaultValue || ''; this.openTitle = params.openTitle || ''; this.className = params.className || ''; this.noMRclassName = params.noMRclassName || 'ec-no-rm'; this.emptyClassName = params.noMRclassName || 'ec-label'; var _this = this; this.curInd = false; if (this.bValues) { this.pInput.onfocus = this.pInput.onclick = function(e) { if (this.value == _this.defaultValue) { this.value = ''; this.className = ''; } _this.ShowPopup(); return BX.PreventDefault(e); }; this.pInput.onblur = function() { if (_this.bShowed) setTimeout(function(){_this.ClosePopup(true);}, 200); _this.OnChange(); }; } else { this.pInput.className = this.noMRclassName; this.pInput.onblur = BX.proxy(this.OnChange, this); } } BXInputPopup.prototype = { ShowPopup: function() { if (this.bShowed) return; var _this = this; if (!this.oPopup) { var pRow, pWnd = BX.create("DIV", {props:{className: "bxecpl-loc-popup " + this.className}}); for (var i = 0, l = this.values.length; i < l; i++) { pRow = pWnd.appendChild(BX.create("DIV", { props: {id: 'bxecmr_' + i, title: this.values[i].DESCRIPTION}, text: this.values[i].NAME, events: { mouseover: function(){this.className = 'bxecplloc-over';}, mouseout: function(){this.className = '';}, click: function() { var ind = this.id.substr('bxecmr_'.length); _this.pInput.value = _this.values[ind].NAME; _this.curInd = ind; _this.OnChange(); _this.ClosePopup(true); } } })); if (this.values[i].URL) pRow.appendChild(BX.create('A', {props: {href: this.values[i].URL, className: 'bxecplloc-view', target: '_blank', title: this.openTitle}})); } this.oPopup = new BX.PopupWindow(this.id, this.pInput, { autoHide : true, offsetTop : 1, offsetLeft : 0, lightShadow : true, closeByEsc : true, content : pWnd }); BX.addCustomEvent(this.oPopup, 'onPopupClose', BX.proxy(this.ClosePopup, this)); } this.oPopup.show(); this.pInput.select(); this.bShowed = true; BX.onCustomEvent(this, 'onInputPopupShow', [this]); }, ClosePopup: function(bClosePopup) { this.bShowed = false; if (this.pInput.value == '') this.OnChange(); BX.onCustomEvent(this, 'onInputPopupClose', [this]); if (bClosePopup === true) this.oPopup.close(); }, OnChange: function() { var val = this.pInput.value; if (this.bValues) { if (this.pInput.value == '' || this.pInput.value == this.defaultValue) { this.pInput.value = this.defaultValue; this.pInput.className = this.emptyClassName; val = ''; } else { this.pInput.className = ''; } } if (isNaN(parseInt(this.curInd)) || this.curInd !==false && val != this.values[this.curInd].NAME) this.curInd = false; else this.curInd = parseInt(this.curInd); BX.onCustomEvent(this, 'onInputPopupChanged', [this, this.curInd, val]); if (this.handler && typeof this.handler == 'function') this.handler({ind: this.curInd, value: val}); }, Set: function(ind, val, bOnChange) { this.curInd = ind; if (this.curInd !== false) this.pInput.value = this.values[this.curInd].NAME; else this.pInput.value = val; if (bOnChange !== false) this.OnChange(); }, Get: function(ind) { var id = false; if (typeof ind == 'undefined') ind = this.curInd; if (ind !== false && this.values[ind]) id = this.values[ind].ID; return id; }, GetIndex: function(id) { for (var i = 0, l = this.values.length; i < l; i++) if (this.values[i].ID == id) return i; return false; }, Deactivate: function(bDeactivate) { if (this.pInput.value == '' || this.pInput.value == this.defaultValue) { if (bDeactivate) { this.pInput.value = ''; this.pInput.className = this.noMRclassName; } else if (this.oEC.bUseMR) { this.pInput.value = this.defaultValue; this.pInput.className = this.emptyClassName; } } this.pInput.disabled = bDeactivate; } }; })(window); /* playback timings (ms): LoadShardBlock: 48.47 (3) esindex: 0.002 captures_list: 61.29 CDXLines.iter: 9.841 (3) PetaboxLoader3.datanode: 321.465 (5) exclusion.robots.fetch: 0.251 (4) exclusion.robots: 0.582 exclusion.robots.policy: 0.175 RedisCDXSource: 0.643 PetaboxLoader3.resolve: 191.646 (2) load_resource: 511.846 */