// Name: PopupExtender.PopupBehavior.debug.js // Assembly: AjaxControlToolkit // Version: 4.5.7.1213 // FileVersion: 4.5.7.1213 // (c) 2010 CodePlex Foundation /// /// /// /// /// (function() { var scriptName = "ExtendedPopup"; function execute() { Type.registerNamespace('Sys.Extended.UI'); Sys.Extended.UI.PopupBehavior = function(element) { /// /// The PopupBehavior is used to show/hide an element at a position /// relative to another element /// /// /// The DOM element the behavior is associated with /// Sys.Extended.UI.PopupBehavior.initializeBase(this, [element]); this._x = 0; this._y = 0; this._positioningMode = Sys.Extended.UI.PositioningMode.Absolute; this._parentElement = null; this._parentElementID = null; this._moveHandler = null; this._firstPopup = true; this._originalParent = null; this._visible = false; this._onShow = null; this._onHide = null; this._onShowEndedHandler = Function.createDelegate(this, this._onShowEnded); this._onHideEndedHandler = Function.createDelegate(this, this._onHideEnded); } Sys.Extended.UI.PopupBehavior.prototype = { initialize: function() { /// /// Initialize the PopupBehavior /// Sys.Extended.UI.PopupBehavior.callBaseMethod(this, 'initialize'); this._hidePopup(); this.get_element().style.position = "absolute"; }, dispose: function() { /// /// Dispose the PopupBehavior /// var element = this.get_element(); if (element) { if (this._visible) { this.hide(); } if (this._originalParent) { element.parentNode.removeChild(element); this._originalParent.appendChild(element); this._originalParent = null; } element._hideWindowedElementsIFrame = null; } this._parentElement = null; if (this._onShow && this._onShow.get_animation()) { this._onShow.get_animation().remove_ended(this._onShowEndedHandler); } this._onShow = null; if (this._onHide && this._onHide.get_animation()) { this._onHide.get_animation().remove_ended(this._onHideEndedHandler); } this._onHide = null; Sys.Extended.UI.PopupBehavior.callBaseMethod(this, 'dispose'); }, show: function() { /// /// Show the popup /// if (this._visible) { return; } var eventArgs = new Sys.CancelEventArgs(); this.raiseShowing(eventArgs); if (eventArgs.get_cancel()) { return; } this._visible = true; var element = this.get_element(); $common.setVisible(element, true); this.setupPopup(); if (this._onShow) { $common.setVisible(element, false); this.onShow(); } else { this.raiseShown(Sys.EventArgs.Empty); } }, hide: function() { /// /// Hide the popup /// if (!this._visible) { return; } var eventArgs = new Sys.CancelEventArgs(); this.raiseHiding(eventArgs); if (eventArgs.get_cancel()) { return; } this._visible = false; if (this._onHide) { this.onHide(); } else { this._hidePopup(); this._hideCleanup(); } }, getBounds: function() { /// /// Get the expected bounds of the popup relative to its parent /// /// /// Bounds of the popup relative to its parent /// /// /// The actual final position can only be calculated after it is /// initially set and we can verify it doesn't bleed off the edge /// of the screen. /// var element = this.get_element(); var offsetParent = element.offsetParent || document.documentElement; var diff; var parentBounds; if (this.get_parentElement()) { parentBounds = $common.getBounds(this.get_parentElement()); var offsetParentLocation = $common.getLocation(offsetParent); diff = { x: parentBounds.x - offsetParentLocation.x, y: parentBounds.y - offsetParentLocation.y }; } else { parentBounds = $common.getBounds(offsetParent); diff = { x: 0, y: 0 }; } var width = element.offsetWidth - (element.clientLeft ? element.clientLeft * 2 : 0); var height = element.offsetHeight - (element.clientTop ? element.clientTop * 2 : 0); if (this._firstpopup) { element.style.width = width + "px"; this._firstpopup = false; } var position, pos; switch (this._positioningMode) { case Sys.Extended.UI.PositioningMode.Center: pos = { x: Math.round(parentBounds.width / 2 - width / 2), y: Math.round(parentBounds.height / 2 - height / 2), altX: Math.round(parentBounds.width / 2 - width / 2), altY: Math.round(parentBounds.height / 2 - height / 2) }; break; case Sys.Extended.UI.PositioningMode.BottomLeft: pos = { x: 0, y: parentBounds.height, altX: parentBounds.width - width, altY: 0 - height } break; case Sys.Extended.UI.PositioningMode.BottomRight: pos = { x: parentBounds.width - width, y: parentBounds.height, altX: 0, altY: 0 - height } break; case Sys.Extended.UI.PositioningMode.TopLeft: pos = { x: 0, y: -element.offsetHeight, altX: parentBounds.width - width, altY: parentBounds.height } break; case Sys.Extended.UI.PositioningMode.TopRight: pos = { x: parentBounds.width - width, y: -element.offsetHeight, altX: 0, altY: parentBounds.height } break; case Sys.Extended.UI.PositioningMode.Right: pos = { x: parentBounds.width, y: 0, altX: -element.offsetWidth, altY: parentBounds.height - height } break; case Sys.Extended.UI.PositioningMode.Left: pos = { x: -element.offsetWidth, y: 0, altX: parentBounds.width, altY: parentBounds.height - height } break; default: pos = { x: 0, y: 0, altX: 0, altY: 0 }; } pos.x += this._x + diff.x; pos.altX += this._x + diff.x; pos.y += this._y + diff.y; pos.altY += this._y + diff.y; position = this._verifyPosition(pos, width, height, parentBounds); return new Sys.UI.Bounds(position.x, position.y, width, height); }, _verifyPosition: function(pos, elementWidth, elementHeight, parentBounds) { /// /// Checks whether the popup is entirely visible and attempts to change its position to make it entirely visihle. /// var newX = 0, newY = 0; var windowBounds = this._getWindowBounds(); if (!((pos.x + elementWidth > windowBounds.x + windowBounds.width) || (pos.x < windowBounds.x))) { newX = pos.x; } else { newX = pos.altX; if (pos.altX < windowBounds.x) { if (pos.x > pos.altX) { newX = pos.x; } } else if (windowBounds.width + windowBounds.x - pos.altX < elementWidth) { var xDiff = pos.x > pos.altX ? Math.abs(windowBounds.x - pos.x) : (windowBounds.x - pos.x); if (xDiff < elementWidth - windowBounds.width - windowBounds.x + pos.altX) { newX = pos.x; } } } if (!((pos.y + elementHeight > windowBounds.y + windowBounds.height) || (pos.y < windowBounds.y))) { newY = pos.y; } else { newY = pos.altY; if (pos.altY < windowBounds.y) { if (windowBounds.y - pos.altY > elementHeight - windowBounds.height - windowBounds.y + pos.y) { newY = pos.y; } } else if (windowBounds.height + windowBounds.y - pos.altY < elementHeight) { if (windowBounds.y - pos.y < elementHeight - windowBounds.height - windowBounds.y + pos.altY) { newY = pos.y; } } } return { x: newX, y: newY }; }, _getWindowBounds: function() { var bounds = { x: this._getWindowScrollLeft(), y: this._getWindowScrollTop(), width: this._getWindowWidth(), height: this._getWindowHeight() }; return bounds; }, _getWindowHeight: function() { var windowHeight = 0; if (document.documentElement && document.documentElement.clientHeight) { windowHeight = document.documentElement.clientHeight; } else if (document.body && document.body.clientHeight) { windowHeight = document.body.clientHeight; } return windowHeight; }, _getWindowWidth: function() { var windowWidth = 0; if (document.documentElement && document.documentElement.clientWidth) { windowWidth = document.documentElement.clientWidth; } else if (document.body && document.body.clientWidth) { windowWidth = document.body.clientWidth; } return windowWidth; }, _getWindowScrollTop: function() { var scrollTop = 0; if (typeof (window.pageYOffset) == 'number') { scrollTop = window.pageYOffset; } if (document.body && document.body.scrollTop) { scrollTop = document.body.scrollTop; } else if (document.documentElement && document.documentElement.scrollTop) { scrollTop = document.documentElement.scrollTop; } return scrollTop; }, _getWindowScrollLeft: function() { var scrollLeft = 0; if (typeof (window.pageXOffset) == 'number') { scrollLeft = window.pageXOffset; } else if (document.body && document.body.scrollLeft) { scrollLeft = document.body.scrollLeft; } else if (document.documentElement && document.documentElement.scrollLeft) { scrollLeft = document.documentElement.scrollLeft; } return scrollLeft; }, adjustPopupPosition: function(bounds) { /// /// Adjust the position of the popup after it's originally bet set /// to make sure that it's visible on the page. /// /// /// Original bounds of the parent element /// var element = this.get_element(); if (!bounds) { bounds = this.getBounds(); } var newPosition = $common.getBounds(element); var updateNeeded = false; if (newPosition.x < 0) { bounds.x -= newPosition.x; updateNeeded = true; } if (newPosition.y < 0) { bounds.y -= newPosition.y; updateNeeded = true; } if (updateNeeded) { $common.setLocation(element, bounds); } }, addBackgroundIFrame: function() { /// /// Add an empty IFRAME behind the popup (for IE6 only) so that SELECT, etc., won't /// show through the popup. /// var element = this.get_element(); if ((Sys.Browser.agent === Sys.Browser.InternetExplorer) && (Sys.Browser.version < 7)) { var childFrame = element._hideWindowedElementsIFrame; if (!childFrame) { childFrame = document.createElement("iframe"); childFrame.src = "javascript:'';"; childFrame.style.position = "absolute"; childFrame.style.display = "none"; childFrame.scrolling = "no"; childFrame.frameBorder = "0"; childFrame.tabIndex = "-1"; childFrame.style.filter = "progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)"; element.parentNode.insertBefore(childFrame, element); element._hideWindowedElementsIFrame = childFrame; this._moveHandler = Function.createDelegate(this, this._onMove); Sys.UI.DomEvent.addHandler(element, "move", this._moveHandler); } $common.setBounds(childFrame, $common.getBounds(element)); childFrame.style.left = element.style.left; childFrame.style.top = element.style.top; childFrame.style.display = element.style.display; if (element.currentStyle && element.currentStyle.zIndex) { childFrame.style.zIndex = element.currentStyle.zIndex; } else if (element.style.zIndex) { childFrame.style.zIndex = element.style.zIndex; } } }, setupPopup: function() { /// /// Position the popup relative to its parent /// var element = this.get_element(); var bounds = this.getBounds(); $common.setLocation(element, bounds); this.adjustPopupPosition(bounds); element.style.zIndex = 1000; this.addBackgroundIFrame(); }, _hidePopup: function() { /// /// Internal hide implementation /// var element = this.get_element(); $common.setVisible(element, false); if (element.originalWidth) { element.style.width = element.originalWidth + "px"; element.originalWidth = null; } }, _hideCleanup: function() { /// /// Perform cleanup after hiding the element /// var element = this.get_element(); if (this._moveHandler) { Sys.UI.DomEvent.removeHandler(element, "move", this._moveHandler); this._moveHandler = null; } if (Sys.Browser.agent === Sys.Browser.InternetExplorer) { var childFrame = element._hideWindowedElementsIFrame; if (childFrame) { childFrame.style.display = "none"; } } this.raiseHidden(Sys.EventArgs.Empty); }, _onMove: function() { /// /// Track the popup's movements so the hidden IFrame (IE6 only) can /// be moved along with it /// var element = this.get_element(); if (element._hideWindowedElementsIFrame) { element.parentNode.insertBefore(element._hideWindowedElementsIFrame, element); element._hideWindowedElementsIFrame.style.top = element.style.top; element._hideWindowedElementsIFrame.style.left = element.style.left; } }, get_onShow: function() { /// /// Generic OnShow Animation's JSON definition /// return this._onShow ? this._onShow.get_json() : null; }, set_onShow: function(value) { if (!this._onShow) { this._onShow = new Sys.Extended.UI.Animation.GenericAnimationBehavior(this.get_element()); this._onShow.initialize(); } this._onShow.set_json(value); var animation = this._onShow.get_animation(); if (animation) { animation.add_ended(this._onShowEndedHandler); } this.raisePropertyChanged('onShow'); }, get_onShowBehavior: function() { /// /// Generic OnShow Animation's behavior /// return this._onShow; }, onShow: function() { /// /// Play the OnShow animation /// /// if (this._onShow) { if (this._onHide) { this._onHide.quit(); } this._onShow.play(); } }, _onShowEnded: function() { /// /// Handler for the OnShow Animation's Ended event /// this.adjustPopupPosition(); this.addBackgroundIFrame(); this.raiseShown(Sys.EventArgs.Empty); }, get_onHide: function() { /// /// Generic OnHide Animation's JSON definition /// return this._onHide ? this._onHide.get_json() : null; }, set_onHide: function(value) { if (!this._onHide) { this._onHide = new Sys.Extended.UI.Animation.GenericAnimationBehavior(this.get_element()); this._onHide.initialize(); } this._onHide.set_json(value); var animation = this._onHide.get_animation(); if (animation) { animation.add_ended(this._onHideEndedHandler); } this.raisePropertyChanged('onHide'); }, get_onHideBehavior: function() { /// /// Generic OnHide Animation's behavior /// return this._onHide; }, onHide: function() { /// /// Play the OnHide animation /// /// if (this._onHide) { if (this._onShow) { this._onShow.quit(); } this._onHide.play(); } }, _onHideEnded: function() { /// /// Handler for the OnHide Animation's Ended event /// this._hideCleanup(); }, get_parentElement: function() { /// /// Parent dom element. /// if (!this._parentElement && this._parentElementID) { this.set_parentElement($get(this._parentElementID)); } return this._parentElement; }, set_parentElement: function(element) { this._parentElement = element; this.raisePropertyChanged('parentElement'); }, get_parentElementID: function() { /// /// Parent dom element. /// if (this._parentElement) { return this._parentElement.id } return this._parentElementID; }, set_parentElementID: function(elementID) { this._parentElementID = elementID; if (this.get_isInitialized()) { this.set_parentElement($get(elementID)); } }, get_positioningMode: function() { /// /// Positioning mode. /// return this._positioningMode; }, set_positioningMode: function(mode) { this._positioningMode = mode; this.raisePropertyChanged('positioningMode'); }, get_x: function() { /// /// X coordinate. /// return this._x; }, set_x: function(value) { if (value != this._x) { this._x = value; if (this._visible) { this.setupPopup(); } this.raisePropertyChanged('x'); } }, get_y: function() { /// /// Y coordinate. /// return this._y; }, set_y: function(value) { if (value != this._y) { this._y = value; if (this._visible) { this.setupPopup(); } this.raisePropertyChanged('y'); } }, get_visible: function() { /// /// Whether or not the popup is currently visible /// return this._visible; }, add_showing: function(handler) { /// /// Add an event handler for the showing event /// /// /// Event handler /// /// this.get_events().addHandler('showing', handler); }, remove_showing: function(handler) { /// /// Remove an event handler from the showing event /// /// /// Event handler /// /// this.get_events().removeHandler('showing', handler); }, raiseShowing: function(eventArgs) { /// /// Raise the showing event /// /// /// Event arguments for the showing event /// /// var handler = this.get_events().getHandler('showing'); if (handler) { handler(this, eventArgs); } }, add_shown: function(handler) { /// /// Add an event handler for the shown event /// /// /// Event handler /// /// this.get_events().addHandler('shown', handler); }, remove_shown: function(handler) { /// /// Remove an event handler from the shown event /// /// /// Event handler /// /// this.get_events().removeHandler('shown', handler); }, raiseShown: function(eventArgs) { /// /// Raise the shown event /// /// /// Event arguments for the shown event /// /// var handler = this.get_events().getHandler('shown'); if (handler) { handler(this, eventArgs); } }, add_hiding: function(handler) { /// /// Add an event handler for the hiding event /// /// /// Event handler /// /// this.get_events().addHandler('hiding', handler); }, remove_hiding: function(handler) { /// /// Remove an event handler from the hiding event /// /// /// Event handler /// /// this.get_events().removeHandler('hiding', handler); }, raiseHiding: function(eventArgs) { /// /// Raise the hiding event /// /// /// Event arguments for the hiding event /// /// var handler = this.get_events().getHandler('hiding'); if (handler) { handler(this, eventArgs); } }, add_hidden: function(handler) { /// /// Add an event handler for the hidden event /// /// /// Event handler /// /// this.get_events().addHandler('hidden', handler); }, remove_hidden: function(handler) { /// /// Remove an event handler from the hidden event /// /// /// Event handler /// /// this.get_events().removeHandler('hidden', handler); }, raiseHidden: function(eventArgs) { /// /// Raise the hidden event /// /// /// Event arguments for the hidden event /// /// var handler = this.get_events().getHandler('hidden'); if (handler) { handler(this, eventArgs); } } } Sys.Extended.UI.PopupBehavior.registerClass('Sys.Extended.UI.PopupBehavior', Sys.Extended.UI.BehaviorBase); Sys.registerComponent(Sys.Extended.UI.PopupBehavior, { name: "popup" }); Sys.Extended.UI.PositioningMode = function() { /// /// Positioning mode describing how the popup should be positioned /// relative to its specified parent /// /// /// /// /// /// /// /// /// throw Error.invalidOperation(); } Sys.Extended.UI.PositioningMode.prototype = { Absolute: 0, Center: 1, BottomLeft: 2, BottomRight: 3, TopLeft: 4, TopRight: 5, Right: 6, Left: 7 } Sys.Extended.UI.PositioningMode.registerEnum('Sys.Extended.UI.PositioningMode'); } // execute if (window.Sys && Sys.loader) { Sys.loader.registerScript(scriptName, ["ExtendedAnimations", "ExtendedAnimationBehavior"], execute); } else { execute(); } })();