(function(){ "use strict"; angular.module('raz') .component('resourceSection', { templateUrl: '/js/angular/resource-slider/resource-section.html', controller: 'resourceSection', bindings: { resource: '<', displayType: '@' } }) .controller('resourceSection', ['resourcePopoverService', '$timeout', '$element','constantValues','$sce', function(resourcePopoverService, $timeout, $element,constantValues, $sce) { var ctrl = this; var isTouchDevice = clg.commonUtils.isTouchDevice(); var MS_POINTER_TYPE_TOUCH = 0x2; var eventNames = getEventNames(); ctrl.$onInit = function() { enableEventTriggers(); overrideLinkClickForTouch(); }; ctrl.trustAsHtml = $sce.trustAsHtml; ctrl.getHref = function() { if (ctrl.resource.resourceType === constantValues.TYPE_LEVELED_BOOKS) { return '/books/leveled-books/book/?id=' + ctrl.resource.resourceId + '&langId=' + ctrl.resource.languageId; } else if (ctrl.resource.resourceType === constantValues.TYPE_CLOSE_READ_PASSAGES) { return '/comprehension/close-read-passages/?close_read_passage_id=' + ctrl.resource.languageId; } else if (ctrl.resource.resourceType === constantValues.TYPE_DECODABLE_BOOK) { return '/book/decodable.php?id=' + ctrl.resource.level.substring(7); } else if (ctrl.resource.resourceType === constantValues.TYPE_CLASSIC_BOOKS) { return '/books/classics/classic/?id=' + ctrl.resource.resourceId; } else { return '/book.php?id=' + ctrl.resource.resourceId + '&langId=' + ctrl.resource.languageId; } }; function enableEventTriggers() { disableEventTriggers(); enablePopoverTargetEventTriggers(); } function disableEventTriggers() { if (ctrl.isTouchDevice) { $element.off(eventNames.startTouchEvent); } $element.off(eventNames.enterMouseEvent); $element.off(eventNames.leaveMouseEvent); } function overrideLinkClickForTouch() { $element.off('click'); $element.on('click', function(linkClickEvent) { if(isPointerAndTouch(linkClickEvent.originalEvent) || resourcePopoverService.popoverState.wasTouched) { linkClickEvent.preventDefault(); } }); } function enablePopoverTargetEventTriggers() { if (isTouchDevice) { $element.on(eventNames.startTouchEvent, handleTouch); } $element.on(eventNames.enterMouseEvent, handleMouseEnter); $element.on(eventNames.leaveMouseEvent, handleMouseLeave); } function handleTouch(startEvent) { if (isPointerAndNotTouch(startEvent.originalEvent) || !resourcePopoverService.popoverState.eventsEnabled){ return; } resourcePopoverService.popoverEnterVerifyUtil.resetPopoverEnterVerification(); startEvent.preventDefault(); displayPopover(startEvent, true); } function handleMouseEnter(enterEvent) { if (isPointerAndTouch(enterEvent.originalEvent) || !resourcePopoverService.popoverState.eventsEnabled) { return; } resourcePopoverService.popoverEnterVerifyUtil.resetPopoverEnterVerification(); resourcePopoverService.popoverState.enteredPopover = true; displayPopover(enterEvent, false); } function displayPopover(event, fromTouch) { event.stopImmediatePropagation(); resourcePopoverService.popoverState.wasTouched = fromTouch; var lessonId = ctrl.resource.level ? ctrl.resource.level.substring(7) : null; var resourceInfo = { resourceId: ctrl.resource.resourceId, languageId: ctrl.resource.languageId, lessonId: lessonId, nonbookPopoverInfo: ctrl.resource.nonbookPopoverInfo }; resourcePopoverService.displayPopover(event, fromTouch, isBook(), resourceInfo); } function handleMouseLeave(leaveEvent) { if(isPointerAndTouch(leaveEvent.originalEvent) || !resourcePopoverService.popoverState.eventsEnabled) { return; } resourcePopoverService.popoverState.enteredPopover = false; var delayInMs = 100; resourcePopoverService.popoverEnterVerifyUtil.setTimeoutToVerifyIfEnteredPopover(delayInMs); } function isPointerAndNotTouch(event) { return event.pointerType && (event.pointerType !== 'touch' && event.pointerType !== MS_POINTER_TYPE_TOUCH); } function isPointerAndTouch(event) { return event.pointerType && (event.pointerType === 'touch' || event.pointerType === MS_POINTER_TYPE_TOUCH); } function isBook() { if (ctrl.resource.deliverableType) { return ctrl.resource.deliverableType === 'book'; } return true; } function getEventNames() { if('ontouchstart' in window) return {startTouchEvent: 'touchstart', endTouchEvent: 'touchend', enterMouseEvent: 'mouseenter', leaveMouseEvent: 'mouseleave'}; else if(window.PointerEvent) return {startTouchEvent: 'pointerdown', endTouchEvent: 'pointerup', enterMouseEvent: 'pointerenter', leaveMouseEvent: 'pointerleave'}; else return {startTouchEvent: 'MSPointerDown', endTouchEvent: 'MSPointerUp', enterMouseEvent: 'mouseenter', leaveMouseEvent: 'mouseleave'}; } }]); })();