/** * JTSage-DateBox * @fileOverview Responsible for positioning the widget * @author J.T.Sage <jtsage+datebox@gmail.com> * @author {@link https://github.com/jtsage/jtsage-datebox/contributors|GitHub Contributors} * @license {@link https://github.com/jtsage/jtsage-datebox/blob/master/LICENSE.txt|MIT} * @version 5.2.0 */ /** * Make sure a position number isn't less than zero * * @param {number} test Number to test * @return {number} Resulting number */ JTSageDateBox._posZero = function ( test ) { return ( test < 0 ) ? 0 : test; }; /** * Find position for modal * * @return {object} CSS for the datebox in modal mode */ JTSageDateBox.getModalPosition = function ( ) { var w = this, fixed = this.options.displayForcePosition, widget = w.d.mainWrap[ 0 ].getBoundingClientRect(); if ( fixed !== false ) { return { position : "absolute", top : fixed[0], left : fixed[1] }; } return { position : "fixed", top : "50%", left : "50%", "margin-left" : -1 * ( widget.width / 2 ), "margin-top" : -1 * ( widget.height / 2 ) }; }; /** * Find position for dropdown * * We do all of the possible calculations every time. Simple math is cheap. * * @return {object} CSS for the widget in dropdown mode. */ JTSageDateBox.getDropPosition = function ( placement ) { var w = this, compd, o = this.options, fixed = this.options.displayForcePosition, rect = w.d.wrap[0].getBoundingClientRect(), widget = w.d.mainWrap[0].getBoundingClientRect(), tOff = window.pageYOffset, lOff = window.pageXOffset, smallScr = ( Math.max(document.documentElement.clientWidth, window.innerWidth || 0) <= o.breakpointWidth.replace("px", "") ); compd = { centerLeft : { top : w._posZero( tOff + rect.top + ( rect.height / 2 ) - ( widget.height / 2 ) ), left : w._posZero( lOff + rect.left ) }, centerRight : { top : w._posZero( tOff + rect.top + ( rect.height / 2 ) - ( widget.height / 2 ) ), left : w._posZero( lOff + rect.left + rect.width - ( widget.width ) ) }, centerMiddle : { top : w._posZero( tOff + rect.top + ( rect.height / 2 ) - ( widget.height / 2 ) ), left : w._posZero( lOff + rect.left + ( rect.width / 2 ) - ( widget.width / 2 ) ) }, topLeft : { top : w._posZero( tOff + rect.top - widget.height - 1 ), left : w._posZero( lOff + rect.left ) }, topRight : { top : w._posZero( tOff + rect.top - widget.height - 1 ), left : w._posZero( lOff + rect.left + rect.width - ( widget.width ) ) }, topMiddle : { top : w._posZero( tOff + rect.top - widget.height - 1 ), left : w._posZero( lOff + rect.left + ( rect.width / 2 ) - ( widget.width / 2 ) ) }, bottomLeft : { top : w._posZero( tOff + rect.top + rect.height ), left : w._posZero( lOff + rect.left ) }, bottomRight : { top : w._posZero( tOff + rect.top + rect.height ), left : w._posZero( lOff + rect.left + rect.width - widget.width ) }, bottomMiddle : { top : w._posZero( tOff + rect.top + rect.height ), left : w._posZero( lOff + rect.left + ( rect.width / 2) - ( widget.width / 2 ) ) } }; if ( typeof compd[placement] === "undefined" ) { placement = "bottomRight"; } if ( fixed !== false ) { return { position : "absolute", top : fixed[0], left : fixed[1] }; } return { position : "absolute", top : compd[placement].top, left : ( smallScr ) ? 0 : compd[placement].left }; };