nexus site path corrected
[portal.git] / ecomp-portal-FE / client / bower_components / angular-gestures / gestures.js
1 'use strict';
2
3 angular.module('angular-gestures', []);
4
5 /**
6  * Inspired by AngularJS' implementation of "click dblclick mousedown..."
7  *
8  * This ties in the Hammer 2 events to attributes like:
9  *
10  * hm-tap="add_something()" hm-swipe="remove_something()"
11  *
12  * and also has support for Hammer options with:
13  *
14  * hm-tap-opts="{hold: false}"
15  *
16  * or any other of the "hm-event" listed underneath.
17  */
18 var HGESTURES = {
19     hmDoubleTap: 'doubletap',
20     hmDragstart: 'panstart', // will bedeprecated soon, us Pan*
21     hmDrag: 'pan', // will bedeprecated soon, us Pan*
22     hmDragUp: 'panup', // will bedeprecated soon, us Pan*
23     hmDragDown: 'pandown', // will bedeprecated soon, us Pan*
24     hmDragLeft: 'panleft', // will bedeprecated soon, us Pan*
25     hmDragRight: 'panright', // will bedeprecated soon, us Pan*
26     hmDragend: 'panend', // will bedeprecated soon, us Pan*
27     hmPanstart: 'panstart',
28     hmPan: 'pan',
29     hmPanUp: 'panup',
30     hmPanDown: 'pandown',
31     hmPanLeft: 'panleft',
32     hmPanRight: 'panright',
33     hmPanend: 'panend',
34     hmHold: 'press',
35     hmPinch: 'pinch',
36     hmPinchIn: 'pinchin',
37     hmPinchOut: 'pinchout',
38     hmPress: 'press',
39     hmRelease: 'release',
40     hmRotate: 'rotate',
41     hmSwipe: 'swipe',
42     hmSwipeUp: 'swipeup',
43     hmSwipeDown: 'swipedown',
44     hmSwipeLeft: 'swipeleft',
45     hmSwipeRight: 'swiperight',
46     hmTap: 'tap',
47     hmTouch: 'touch',
48     hmTransformstart: 'transformstart',
49     hmTransform: 'transform',
50     hmTransformend: 'transformend'
51   };
52
53 var HRECOGNIZERS = {
54     hmDoubleTap: [Hammer.Tap, 'Hammer.Tap'],
55     hmDragstart: [Hammer.Pan, 'Hammer.Pan'],
56     hmDrag: [Hammer.Pan, 'Hammer.Pan'],
57     hmDragUp: [Hammer.Pan, 'Hammer.Pan'],
58     hmDragDown: [Hammer.Pan, 'Hammer.Pan'],
59     hmDragLeft: [Hammer.Pan, 'Hammer.Pan'],
60     hmDragRight: [Hammer.Pan, 'Hammer.Pan'],
61     hmDragend: [Hammer.Pan, 'Hammer.Pan'],
62     hmPanstart: [Hammer.Pan, 'Hammer.Pan'],
63     hmPan: [Hammer.Pan, 'Hammer.Pan'],
64     hmPanUp: [Hammer.Pan, 'Hammer.Pan'],
65     hmPanDown: [Hammer.Pan, 'Hammer.Pan'],
66     hmPanLeft: [Hammer.Pan, 'Hammer.Pan'],
67     hmPanRight: [Hammer.Pan, 'Hammer.Pan'],
68     hmPanend: [Hammer.Pan, 'Hammer.Pan'],
69     hmHold: [Hammer.Press, 'Hammer.Press'],
70     hmPinch: [Hammer.Pinch, 'Hammer.Pinch'],
71     hmPinchIn: [Hammer.Pinch, 'Hammer.Pinch'],
72     hmPinchOut: [Hammer.Pinch, 'Hammer.Pinch'],
73     hmPress: [Hammer.Press, 'Hammer.Press'],
74     hmRotate: [Hammer.Rotate, 'Hammer.Rotate'],
75     hmSwipe: [Hammer.Swipe, 'Hammer.Swipe'],
76     hmSwipeUp: [Hammer.Swipe, 'Hammer.Swipe'],
77     hmSwipeDown: [Hammer.Swipe, 'Hammer.Swipe'],
78     hmSwipeLeft: [Hammer.Swipe, 'Hammer.Swipe'],
79     hmSwipeRight: [Hammer.Swipe, 'Hammer.Swipe'],
80     hmTap: [Hammer.Tap, 'Hammer.Tap']
81   };
82
83 var VERBOSE = false;
84
85 angular.forEach(HGESTURES, function(eventName, directiveName) {
86     angular.module('angular-gestures').directive(directiveName, ['$parse', '$log', '$timeout', 'hammerDefaultOpts', function($parse, $log, $timeout, hammerDefaultOpts) {
87         return function(scope, element, attr) {
88             var handler;
89             attr.$observe(directiveName, function(value) {
90                 var callback = $parse(value);
91                 var opts = $parse(attr[directiveName + 'Opts'])(scope, {});
92                 var defaultOpts = angular.copy(hammerDefaultOpts);
93
94                 angular.extend(defaultOpts, opts);
95
96                 if (angular.isUndefined(element.hammertime)) {
97
98                   // validate that needed recognizer is enabled
99                   var recognizers = angular.isDefined(defaultOpts.recognizers) ? defaultOpts.recognizers : [];
100                   var recognizer = HRECOGNIZERS[directiveName];
101                   if(angular.isDefined(recognizer)) {
102                     var enabled = false;
103                     angular.forEach(recognizers, function(r) {
104                       if (recognizer[0] === r[0]) {
105                         if (angular.isUndefined(r[1].enable) || r[1].enable === true) {
106                           enabled = true;  
107                         }
108                       }
109                     });
110                     if (!enabled) {
111                       throw new Error('Directive ' + directiveName + ' requires gesture recognizer [' + recognizer[1] + '] to be enabled');
112                     }
113                   }
114
115                   element.hammer = new Hammer.Manager(element[0], defaultOpts);
116                   scope.$on('$destroy', function() {
117                     element.hammer.off(eventName);
118                     element.hammer.destroy();
119                   });
120                 }
121
122                 handler = function(event) {
123                   if (VERBOSE) {
124                     $log.debug('angular-gestures: ', eventName, event);
125                   }
126                   var callbackHandler = function () {
127                     var cb = callback(scope, { $event : event});
128                     if (typeof cb === 'function') {
129                       cb.call(scope, event);
130                     }
131                   };
132
133                   if (scope.$root.$$phase === '$apply' ||
134                     scope.$root.$$phase === '$digest') {
135                     callbackHandler();
136                   } else {
137                     scope.$apply(callbackHandler);
138                   }
139
140                 };
141                 // register actual event
142                 element.hammer.on(eventName, handler);
143               });
144           };
145       }]);
146   });
147
148 angular.module('angular-gestures').provider('hammerDefaultOpts', function HammerDefaultOptsProvider() {
149     var opts = {};
150
151     this.set = function(value) {
152         opts = value;
153       };
154
155     this.$get = function() {
156         return opts;
157       };
158   });