(function(){ 'use strict'; angular.module('shared') .factory('menuItemPopoverAmbassador', ['$rootScope', dataService]); function dataService($rootScope){ var UPDATE_MENU_ITEM_EVENT = 'updateMenuItemEvent'; var ACTIVATED_MENU_ITEM_EVENT = 'activatedMenuItemEvent'; var activeMenuItemPopoverCtrl; var initFirstSubMenuOpen = false; return { setInitFirstSubMenuOpen: setInitFirstSubMenuOpen, getInitFirstSubMenuOpen: getInitFirstSubMenuOpen, registerOnUpdateMenuItem: registerOnUpdateMenuItem, emitUpdateMenuItem: emitUpdateMenuItem, registerOnActivatedMenuItem: registerOnActivatedMenuItem, emitActivatedMenuItem: emitActivatedMenuItem, setActivePopoverCtrl: setActivePopoverCtrl, getActivePopoverCtrl: getActivePopoverCtrl, resetActivePopoverCtrl: resetActivePopoverCtrl, isInTriangle: isInTriangle, getTriangleCoordinates: getTriangleCoordinates }; function setInitFirstSubMenuOpen(initOpen){ initFirstSubMenuOpen = initOpen; } function getInitFirstSubMenuOpen() { return initFirstSubMenuOpen; } function registerOnUpdateMenuItem(scope, callback) { var eventListenerDestructor = $rootScope.$on(UPDATE_MENU_ITEM_EVENT, callback); scope.$on('$destroy', eventListenerDestructor); } function emitUpdateMenuItem(eventTarget){ $rootScope.$emit(UPDATE_MENU_ITEM_EVENT, eventTarget); } function registerOnActivatedMenuItem(scope, callback) { var eventListenerDestructor = $rootScope.$on(ACTIVATED_MENU_ITEM_EVENT, callback); scope.$on('$destroy', eventListenerDestructor); } function emitActivatedMenuItem(eventTarget){ $rootScope.$emit(ACTIVATED_MENU_ITEM_EVENT, eventTarget); } function setActivePopoverCtrl(popoverCtrl) { activeMenuItemPopoverCtrl = popoverCtrl; } function getActivePopoverCtrl() { return activeMenuItemPopoverCtrl; } function resetActivePopoverCtrl() { activeMenuItemPopoverCtrl = null; } function isInTriangle(px,py,triangleCoordinateObj) { var ax = triangleCoordinateObj.aX; var ay = triangleCoordinateObj.aY; var bx = triangleCoordinateObj.bX; var by = triangleCoordinateObj.bY; var cx = triangleCoordinateObj.cX; var cy = triangleCoordinateObj.cY; //credit: http://www.blackpawn.com/texts/pointinpoly/default.html var v0 = [cx-ax,cy-ay]; var v1 = [bx-ax,by-ay]; var v2 = [px-ax,py-ay]; var dot00 = (v0[0]*v0[0]) + (v0[1]*v0[1]); var dot01 = (v0[0]*v1[0]) + (v0[1]*v1[1]); var dot02 = (v0[0]*v2[0]) + (v0[1]*v2[1]); var dot11 = (v1[0]*v1[0]) + (v1[1]*v1[1]); var dot12 = (v1[0]*v2[0]) + (v1[1]*v2[1]); var invDenom = 1/ (dot00 * dot11 - dot01 * dot01); var u = (dot11 * dot02 - dot01 * dot12) * invDenom; var v = (dot00 * dot12 - dot01 * dot02) * invDenom; return ((u >= 0) && (v >= 0) && (u + v < 1)); } function getTriangleCoordinates(event) { var coordinateObject = {}; var buffer = 25; var menuContainer = angular.element('.js-dropdownContainer'); var menuCumulativeOffset = menuContainer.offset(); coordinateObject.aX = event.pageX; // x-position of mouse when leaving target coordinateObject.aY = event.pageY; // y-position of mouse when leaving target coordinateObject.bX = menuCumulativeOffset.left + menuContainer.width(); // x-position of the top of the fly-out coordinateObject.bY = menuCumulativeOffset.top - buffer; // y-position of the top of the fly-out coordinateObject.cX = coordinateObject.bX; // x-position of the bottom of the fly-out coordinateObject.cY = menuCumulativeOffset.top + menuContainer.height() + buffer; // y-position of the bottom of the fly-out return coordinateObject; } } }());