// (c) Copyright Microsoft Corporation.
// This source is subject to the Microsoft Permissive License.
// See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
// All other rights reserved.
Type.registerNamespace('Microsoft.Mtps.Rendering.Behaviors.Ajax');
Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode = function() {
throw Error.invalidOperation();
}
Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode.prototype = {
Absolute: 0,
Center: 1,
BottomLeft: 2,
BottomRight: 3,
TopLeft: 4,
TopRight: 5
}
Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode.registerEnum('Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode');
Microsoft.Mtps.Rendering.Behaviors.Ajax.PopupBehavior = function(element) {
/// The DOM element the behavior is associated with.
Microsoft.Mtps.Rendering.Behaviors.Ajax.PopupBehavior.initializeBase(this, [element]);
this._x = 0;
this._y = 0;
this._positioningMode = Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode.Absolute;
this._parentElement = null;
this._parentElementID = null;
this._moveHandler = null;
this._firstPopup = true;
this._originalParent = null;
}
Microsoft.Mtps.Rendering.Behaviors.Ajax.PopupBehavior.prototype = {
get_parentElement : function() {
/// Parent dom element.
if (!this._parentElement && this._parentElementID) {
this.set_parentElement($get(this._parentElementID));
Sys.Debug.assert(this._parentElement != null, String.format(Microsoft.Mtps.Rendering.Behaviors.Ajax.Resources.PopupExtender_NoParentElement, 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 (Sys.UI.DomElement.getVisible(this.get_element())) {
this.show();
}
this.raisePropertyChanged('x');
}
},
get_y : function() {
/// Y coordinate.
return this._y;
},
set_y : function(value) {
if (value != this._y) {
this._y = value;
if (Sys.UI.DomElement.getVisible(this.get_element())) {
this.show();
}
this.raisePropertyChanged('y');
}
},
hide : function() {
var elt = this.get_element();
Sys.UI.DomElement.setVisible(elt, false);
if (this._moveHandler) {
Sys.UI.DomEvent.removeHandler(elt, "move", this._moveHandler);
this._moveHandler = null;
}
if (elt.originalWidth) {
elt.style.width = elt.originalWidth + "px";
elt.originalWidth = null;
}
if (Sys.Browser.agent === Sys.Browser.InternetExplorer) {
var childFrame = elt._hideWindowedElementsIFrame;
if (childFrame) {
childFrame.style.display = "none";
}
}
},
show : function() {
var elt = this.get_element();
Sys.UI.DomElement.setVisible(elt, true);
// offsetParent (doc element if absolutely positioned or no offsetparent available)
var offsetParent = elt.offsetParent || document.documentElement;
// diff = difference in position between element's offsetParent and the element we will attach popup to.
// this is basically so we can position the popup in the right spot even though it may not be absolutely positioned
var diff;
var parentBounds;
if(this._parentElement) {
// we will be positioning the element against the assigned parent
parentBounds = CommonToolkitScripts.getBounds(this._parentElement);
var offsetParentLocation = CommonToolkitScripts.getLocation(offsetParent);
diff = {x: parentBounds.x - offsetParentLocation.x, y:parentBounds.y - offsetParentLocation.y};
}
else {
// we will be positioning the element against the offset parent by default, since no parent element given
parentBounds = CommonToolkitScripts.getBounds(offsetParent);
diff = {x:0, y:0};
}
// width/height of the element, needed for calculations that involve width like centering
var width = elt.offsetWidth - (elt.clientLeft ? elt.clientLeft * 2 : 0);
if ( width < 0 ) width = 0;
var height = elt.offsetHeight - (elt.clientTop ? elt.clientTop * 2 : 0);
var position;
switch (this._positioningMode) {
case Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode.Center:
position = {
x: Math.round(parentBounds.width / 2 - width / 2),
y: Math.round(parentBounds.height / 2 - height / 2)
};
break;
case Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode.BottomLeft:
position = {
x: 0,
y: parentBounds.height
};
break;
case Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode.BottomRight:
position = {
x: parentBounds.width - width,
y: parentBounds.height
};
break;
case Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode.TopLeft:
position = {
x: 0,
y: -elt.offsetHeight
};
break;
case Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode.TopRight:
position = {
x: parentBounds.width - width,
y: -elt.offsetHeight
};
break;
default:
position = {x: 0, y: 0};
}
position.x += this._x + diff.x;
position.y += this._y + diff.y;
CommonToolkitScripts.setLocation(elt, position);
if(this._firstPopup) {
// 23098: Setting the width causes the element to grow by border+passing every time. But not setting it
// causes strange behavior in safari. Just set it once.
elt.style.width = width + "px";
}
this._firstPopup = false;
var newPosition = CommonToolkitScripts.getBounds(elt);
var updateNeeded = false;
var documentWidth = self.innerWidth ? self.innerWidth : document.documentElement.clientWidth;
// CONSIDER: Create a generic function to return this information.
if (!documentWidth) {
documentWidth = document.body.clientWidth;
}
if (newPosition.x + newPosition.width > documentWidth - 5) {
position.x -= newPosition.x + newPosition.width - documentWidth + 5;
updateNeeded = true;
}
if (newPosition.x < 0) {
position.x -= newPosition.x;
updateNeeded = true;
}
if (newPosition.y < 0) {
position.y -= newPosition.y;
updateNeeded = true;
}
if (updateNeeded) {
CommonToolkitScripts.setLocation(elt, position);
}
elt.zIndex = 1000;
if ((Sys.Browser.agent === Sys.Browser.InternetExplorer) && (Sys.Browser.version < 7)) {
var childFrame = elt._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)";
elt.parentNode.insertBefore(childFrame, elt);
elt._hideWindowedElementsIFrame = childFrame;
this._moveHandler = Function.createDelegate(this, this._onMove);
Sys.UI.DomEvent.addHandler(elt, "move", this._moveHandler);
}
CommonToolkitScripts.setBounds(childFrame, newPosition);
childFrame.style.display = elt.style.display;
if (elt.currentStyle && elt.currentStyle.zIndex) {
childFrame.style.zIndex = elt.currentStyle.zIndex;
}
else if (elt.style.zIndex) {
childFrame.style.zIndex = elt.style.zIndex;
}
}
},
initialize : function() {
Microsoft.Mtps.Rendering.Behaviors.Ajax.PopupBehavior.callBaseMethod(this, 'initialize');
this.hide();
this.get_element().style.position = "absolute";
},
dispose : function() {
var elt = this.get_element();
if (elt) {
if (Sys.UI.DomElement.getVisible(elt)) {
this.hide();
}
if (this._originalParent) {
elt.parentNode.removeChild(elt);
this._originalParent.appendChild(elt);
this._originalParent = null;
}
}
this._parentElement = null;
Microsoft.Mtps.Rendering.Behaviors.Ajax.PopupBehavior.callBaseMethod(this, 'dispose');
},
_onMove : function() {
var elt = this.get_element();
if (elt._hideWindowedElementsIFrame) {
elt.parentNode.insertBefore(elt._hideWindowedElementsIFrame, elt);
elt._hideWindowedElementsIFrame.style.top = elt.style.top;
elt._hideWindowedElementsIFrame.style.left = elt.style.left;
}
}
}
//Microsoft.Mtps.Rendering.Behaviors.Ajax.PopupBehavior.descriptor = {
// properties: [ {name: 'parentElement', attributes: [ Sys.Attributes.Element, true ] },
// {name: 'positioningMode', type: Microsoft.Mtps.Rendering.Behaviors.Ajax.PositioningMode},
// {name: 'x', type: Number},
// {name: 'y', type: Number} ],
// events: [ {name: 'show'},
// {name: 'hide'} ]
//}
Microsoft.Mtps.Rendering.Behaviors.Ajax.PopupBehavior.registerClass('Microsoft.Mtps.Rendering.Behaviors.Ajax.PopupBehavior', Microsoft.Mtps.Rendering.Behaviors.Ajax.BehaviorBase);
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();