(function() { "use strict"; angular.module('shared') .component('popover', { bindings: { initOpen: ' 0; var isMessageBox = angular.element(event.target).closest('.message-box').length > 0; var isDatePicker = angular.element(event.target).closest('.ui-datepicker').length > 0; if (!isChild && !isMessageBox && !isDatePicker) { ctrl.close(); $scope.$digest(); } }; if (ctrl.is_open && ctrl.addClickOffHandlers) { ctrl.addClickOffHandler(); } }; ctrl.openOnHover = function () { return $attrs.openOnHover !== undefined; }; ctrl.stayOpenOnHoverOff = function() { return $attrs.stayOpenOnHoverOff !== undefined; }; ctrl.$onDestroy = function () { if (ctrl.is_open) { ctrl.removeClickOffHandler(); } }; ctrl.addClickOffHandler = function () { $document.on("mousedown", ctrl.handleLeave); }; ctrl.removeClickOffHandler = function () { $document.off("mousedown", ctrl.handleLeave); }; ctrl.autopositionContent = function () { if (ctrl.lightwindow) { $element.find('.popover').addClass('active'); return; } var positionTarget = ctrl.getPositionTarget(); ctrl.position.of = positionTarget || ctrl.getTargetElement(); directionClassTimer = $timeout(function() { ctrl.setDirectionClass(); angular.element($element.find('.popover')[0]).addClass('active'); }); }; ctrl.getTargetElement = function() { var targetElement = $element.find('.popover-target'); if(targetElement.length === 0) { targetElement = ctrl.targetElement; } return targetElement; }; ctrl.getPositionTarget = function () { var positionTarget = $element.find('.popover-position-target'); if(positionTarget.length !== 0) { return positionTarget; } }; ctrl.setDirectionClass = function () { var content = $element.find('.popover-content'); content.position(ctrl.position); var target = ctrl.getTargetElement(); if (!content.size() || !target.size()) { return; } var contentRect = content[0].getBoundingClientRect(); var targetRect = target[0].getBoundingClientRect(); target.removeClass('popover-content-above popover-content-below popover-content-left popover-content-right'); content.removeClass('popover-target-above popover-target-below popover-target-left popover-target-right'); if (contentRect.right <= targetRect.left) { target.addClass('popover-content-left'); content.addClass('popover-target-right') } else if (contentRect.left >= targetRect.right) { target.addClass('popover-content-right'); content.addClass('popover-target-left') } else if (contentRect.top >= targetRect.bottom) { target.addClass('popover-content-below'); content.addClass('popover-target-above') } else if (contentRect.bottom >= targetRect.top) { target.addClass('popover-content-above'); content.addClass('popover-target-below') } }; ctrl.setPosition = function (position) { angular.extend(ctrl.position, position) }; ctrl.getClass = function() { if (ctrl.overrideClass) { return ctrl.overrideClass; } else if (!ctrl.lightwindow && !ctrl.isLazModal) { return 'popover'; } else { return ''; } }; var hoverTimerPromise; ctrl.onEnter = function() { ctrl.cancelHoverTimer(); ctrl.applyOpen(); }; ctrl.applyOpen = function () { $scope.$apply(ctrl.open); }; ctrl.onLeave = function() { hoverTimerPromise = $timeout(ctrl.close, 25); }; ctrl.cancelHoverTimer = function() { if (hoverTimerPromise) { $timeout.cancel(hoverTimerPromise); } hoverTimerPromise = undefined; }; ctrl.keyboardKeys = { escape: 27 }; function cancelAutopositionTimer() { if (autopositionTimer) { $timeout.cancel(autopositionTimer); } autopositionTimer = undefined; } function cancelDirectionClassTimer() { if (directionClassTimer) { $timeout.cancel(directionClassTimer); } directionClassTimer = undefined; } function registerEvents() { $element.on('keydown', function(event) { if (event.keyCode === ctrl.keyboardKeys.escape) { $timeout(ctrl.close()); } }); } }]); })();