@ -239,13 +239,15 @@
} ,
} ,
isRightSpaceLarger : function ( combo ) {
isRightSpaceLarger : function ( combo ) {
var windowBounds = BI . Widget . _renderEngine . createElement ( "body" ) . bounds ( ) ;
var comboBounds = combo . element [ 0 ] . getBoundingClientRect ( ) ,
return windowBounds . width - combo . element . offset ( ) . left - combo . element . bounds ( ) . width >= combo . element . offset ( ) . left ;
viewportBounds = document . documentElement . getBoundingClientRect ( ) ;
return viewportBounds . width - comboBounds . right >= comboBounds . left ;
} ,
} ,
isBottomSpaceLarger : function ( combo ) {
isBottomSpaceLarger : function ( combo ) {
var windowBounds = BI . Widget . _renderEngine . createElement ( "body" ) . bounds ( ) ;
var comboBounds = combo . element [ 0 ] . getBoundingClientRect ( ) ,
return windowBounds . height - combo . element . offset ( ) . top - combo . element . bounds ( ) . height >= combo . element . offset ( ) . top ;
viewportBounds = document . documentElement . getBoundingClientRect ( ) ;
return viewportBounds . height - comboBounds . bottom >= comboBounds . top ;
} ,
} ,
_getLeftAlignPosition : function ( combo , popup , extraWidth , container ) {
_getLeftAlignPosition : function ( combo , popup , extraWidth , container ) {
@ -279,9 +281,9 @@
} ;
} ;
} ,
} ,
getLeftAdaptPosition : function ( combo , popup , extraWidth ) {
getLeftAdaptPosition : function ( combo , popup , extraWidth , container ) {
if ( BI . DOM . isLeftSpaceEnough ( combo , popup , extraWidth ) ) {
if ( BI . DOM . isLeftSpaceEnough ( combo , popup , extraWidth , container ) ) {
return BI . DOM . getLeftPosition ( combo , popup , extraWidth ) ;
return BI . DOM . getLeftPosition ( combo , popup , extraWidth , container ) ;
}
}
return {
return {
left : 0
left : 0
@ -312,12 +314,12 @@
} ;
} ;
} ,
} ,
getRightAdaptPosition : function ( combo , popup , extraWidth ) {
getRightAdaptPosition : function ( combo , popup , extraWidth , container ) {
if ( BI . DOM . isRightSpaceEnough ( combo , popup , extraWidth ) ) {
if ( BI . DOM . isRightSpaceEnough ( combo , popup , extraWidth , container ) ) {
return BI . DOM . getRightPosition ( combo , popup , extraWidth ) ;
return BI . DOM . getRightPosition ( combo , popup , extraWidth , container ) ;
}
}
return {
return {
left : BI . Widget . _renderEngine . createElement ( "body" ) . bounds ( ) . width - popup . element . bounds ( ) . width
left : document . documentElement . getBoundingClientRect ( ) . width - popup . element [ 0 ] . getBoundingClientRect ( ) . width - container . getBoundingClientRect ( ) . left
} ;
} ;
} ,
} ,
@ -355,26 +357,28 @@
} ;
} ;
} ,
} ,
getTopAdaptPosition : function ( combo , popup , extraHeight , needAdaptHeight ) {
getTopAdaptPosition : function ( combo , popup , extraHeight , needAdaptHeight , positionRelativeElement ) {
var popupBounds = popup . element . bounds ( ) ,
var comboBounds = combo . element [ 0 ] . getBoundingClientRect ( ) ,
windowBounds = BI . Widget . _renderEngine . createElement ( "body" ) . bounds ( ) ;
popupBounds = popup . element [ 0 ] . getBoundingClientRect ( ) ,
positionRelativeElementRect = positionRelativeElement . getBoundingClientRect ( ) ,
viewportBounds = document . documentElement . getBoundingClientRect ( ) ;
if ( BI . DOM . isTopSpaceEnough ( combo , popup , extraHeight ) ) {
if ( BI . DOM . isTopSpaceEnough ( combo , popup , extraHeight ) ) {
return BI . DOM . getTopPosition ( combo , popup , extraHeight ) ;
return BI . DOM . getTopPosition ( combo , popup , extraHeight ) ;
}
}
if ( needAdaptHeight ) {
if ( needAdaptHeight ) {
return {
return {
top : 0 ,
top : 0 - positionRelativeElementRect . top ,
adaptHeight : combo . element . offset ( ) . top - extraHeight
adaptHeight : comboBounds . top - extraHeight
} ;
} ;
}
}
if ( popupBounds . height + extraHeight > window Bounds. height ) {
if ( popupBounds . height + extraHeight > viewport Bounds. height ) {
return {
return {
top : 0 ,
top : 0 - positionRelativeElementRect . top ,
adaptHeight : window Bounds. height - extraHeight
adaptHeight : viewport Bounds. height - extraHeight
} ;
} ;
}
}
return {
return {
top : 0
top : 0 - positionRelativeElementRect . top
} ;
} ;
} ,
} ,
@ -412,26 +416,28 @@
} ;
} ;
} ,
} ,
getBottomAdaptPosition : function ( combo , popup , extraHeight , needAdaptHeight ) {
getBottomAdaptPosition : function ( combo , popup , extraHeight , needAdaptHeight , positionRelativeElement ) {
var comboBounds = combo . element [ 0 ] . getBoundingClientRect ( ) , popupBounds = popup . element [ 0 ] . getBoundingClientRect ( ) ,
var comboBounds = combo . element [ 0 ] . getBoundingClientRect ( ) ,
windowBounds = BI . Widget . _renderEngine . createElement ( "body" ) . bounds ( ) ;
popupBounds = popup . element [ 0 ] . getBoundingClientRect ( ) ,
viewportBounds = document . documentElement . getBoundingClientRect ( ) ,
positionRelativeElementRect = positionRelativeElement . getBoundingClientRect ( ) ;
if ( BI . DOM . isBottomSpaceEnough ( combo , popup , extraHeight ) ) {
if ( BI . DOM . isBottomSpaceEnough ( combo , popup , extraHeight ) ) {
return BI . DOM . getBottomPosition ( combo , popup , extraHeight ) ;
return BI . DOM . getBottomPosition ( combo , popup , extraHeight , positionRelativeElement ) ;
}
}
if ( needAdaptHeight ) {
if ( needAdaptHeight ) {
return {
return {
top : comboBounds . top + comboBounds . height + extraHeight ,
top : comboBounds . top + comboBounds . height + extraHeight - positionRelativeElementRect . top ,
adaptHeight : window Bounds. height - comboBounds . top - comboBounds . height - extraHeight
adaptHeight : viewport Bounds. height - comboBounds . top - comboBounds . height - extraHeight
} ;
} ;
}
}
if ( popupBounds . height + extraHeight > window Bounds. height ) {
if ( popupBounds . height + extraHeight > viewport Bounds. height ) {
return {
return {
top : extraHeight ,
top : extraHeight - positionRelativeElementRect . top ,
adaptHeight : window Bounds. height - extraHeight
adaptHeight : viewport Bounds. height - extraHeight
} ;
} ;
}
}
return {
return {
top : window Bounds. height - popupBounds . height - extraHeight
top : viewport Bounds. height - popupBounds . height - extraHeight - positionRelativeElementRect . top
} ;
} ;
} ,
} ,
@ -638,10 +644,10 @@
case "left" :
case "left" :
case "right" :
case "right" :
if ( BI . DOM . isRightSpaceLarger ( combo ) ) {
if ( BI . DOM . isRightSpaceLarger ( combo ) ) {
left = BI . DOM . getRightAdaptPosition ( combo , popup , extraWidth ) . left ;
left = BI . DOM . getRightAdaptPosition ( combo , popup , extraWidth , container ) . left ;
firstDir = "right" ;
firstDir = "right" ;
} else {
} else {
left = BI . DOM . getLeftAdaptPosition ( combo , popup , extraWidth ) . left ;
left = BI . DOM . getLeftAdaptPosition ( combo , popup , extraWidth , container ) . left ;
firstDir = "left" ;
firstDir = "left" ;
}
}
if ( topBottom [ 0 ] === "bottom" ) {
if ( topBottom [ 0 ] === "bottom" ) {
@ -656,19 +662,19 @@
return pos ;
return pos ;
default :
default :
if ( BI . DOM . isBottomSpaceLarger ( combo ) ) {
if ( BI . DOM . isBottomSpaceLarger ( combo ) ) {
top = BI . DOM . getBottomAdaptPosition ( combo , popup , extraHeight , needAdaptHeight ) . top ;
top = BI . DOM . getBottomAdaptPosition ( combo , popup , extraHeight , needAdaptHeight , container ) . top ;
firstDir = "bottom" ;
firstDir = "bottom" ;
} else {
} else {
top = BI . DOM . getTopAdaptPosition ( combo , popup , extraHeight , needAdaptHeight ) . top ;
top = BI . DOM . getTopAdaptPosition ( combo , popup , extraHeight , needAdaptHeight , container ) . top ;
firstDir = "top" ;
firstDir = "top" ;
}
}
if ( leftRight [ 0 ] === "right" ) {
if ( leftRight [ 0 ] === "right" ) {
pos = BI . DOM . getLeftAlignPosition ( combo , popup , extraWidth ) ;
pos = BI . DOM . getLeftAlignPosition ( combo , popup , extraWidth , container ) ;
pos . top = top ;
pos . top = top ;
pos . dir = firstDir + "," + pos . dir ;
pos . dir = firstDir + "," + pos . dir ;
return pos ;
return pos ;
}
}
pos = BI . DOM . getRightAlignPosition ( combo , popup , extraWidth ) ;
pos = BI . DOM . getRightAlignPosition ( combo , popup , extraWidth , container ) ;
pos . top = top ;
pos . top = top ;
pos . dir = firstDir + "," + pos . dir ;
pos . dir = firstDir + "," + pos . dir ;
return pos ;
return pos ;