trusty-cms 3.1.8 → 3.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (215) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -1
  3. data/Gemfile.lock +13 -9
  4. data/app/assets/images/admin/move_higher.png +0 -0
  5. data/app/assets/images/admin/move_lower.png +0 -0
  6. data/app/assets/images/admin/move_to_bottom.png +0 -0
  7. data/app/assets/images/admin/move_to_top.png +0 -0
  8. data/app/assets/images/admin/remove.png +0 -0
  9. data/app/assets/stylesheets/admin/_multi_site_main.scss +85 -0
  10. data/app/assets/stylesheets/admin/_site_chooser.scss +76 -0
  11. data/app/assets/stylesheets/admin/main.scss +3 -0
  12. data/app/controllers/admin/sites_controller.rb +14 -0
  13. data/app/helpers/scoped_helper.rb +19 -0
  14. data/app/helpers/sites_helper.rb +10 -0
  15. data/app/models/site.rb +86 -0
  16. data/app/models/snippet.rb +23 -0
  17. data/app/models/snippet_finder.rb +24 -0
  18. data/app/models/snippet_tags.rb +80 -0
  19. data/app/users/_choose_site.html.haml +8 -0
  20. data/app/views/admin/layouts/_choose_site.html.haml +8 -0
  21. data/app/views/admin/layouts/_site_chooser.html.haml +11 -0
  22. data/app/views/admin/sites/_form.haml +50 -0
  23. data/app/views/admin/sites/edit.haml +7 -0
  24. data/app/views/admin/sites/index.haml +43 -0
  25. data/app/views/admin/sites/new.haml +7 -0
  26. data/app/views/admin/snippets/_choose_site.html.haml +6 -0
  27. data/app/views/{snippets → admin/snippets}/_form.html.haml +0 -0
  28. data/app/views/{snippets → admin/snippets}/_popups.html.haml +0 -0
  29. data/app/views/{snippets → admin/snippets}/edit.html.haml +0 -0
  30. data/app/views/{snippets → admin/snippets}/index.html.haml +0 -0
  31. data/app/views/{snippets → admin/snippets}/new.html.haml +0 -0
  32. data/app/views/{snippets → admin/snippets}/remove.html.haml +0 -0
  33. data/app/views/admin/users/_choose_site.html.haml +8 -0
  34. data/config/application.rb +0 -2
  35. data/config/initializers/trusty_cms_config.rb +6 -0
  36. data/config/routes.rb +8 -0
  37. data/coverage/index.html +3837 -2759
  38. data/db/migrate/006_remove_user_login_index.rb +8 -0
  39. data/db/migrate/010_create_sites.rb +13 -0
  40. data/db/migrate/011_add_order_to_sites.rb +9 -0
  41. data/db/migrate/022_add_admin_fields_to_sites.rb +17 -0
  42. data/db/migrate/023_add_sites.rb +13 -0
  43. data/db/migrate/024_site_abbreviation.rb +9 -0
  44. data/db/migrate/025_recreate_non_unique_index_on_snippets_name.rb +11 -0
  45. data/db/migrate/026_add_site_id_to_pages.rb +24 -0
  46. data/db/migrate/027_add_base_domain_to_sites.rb +9 -0
  47. data/lib/trusty_cms.rb +1 -1
  48. data/spec/dummy/db/schema.rb +20 -2
  49. data/spec/dummy/log/test.log +44621 -0
  50. data/spec/dummy/node_modules/jquery/AUTHORS.txt +301 -0
  51. data/spec/dummy/node_modules/jquery/LICENSE.txt +36 -0
  52. data/spec/dummy/node_modules/jquery/README.md +67 -0
  53. data/spec/dummy/node_modules/jquery/bower.json +14 -0
  54. data/spec/dummy/node_modules/jquery/dist/core.js +476 -0
  55. data/spec/dummy/node_modules/jquery/dist/jquery.js +10253 -0
  56. data/spec/dummy/node_modules/jquery/dist/jquery.min.js +4 -0
  57. data/spec/dummy/node_modules/jquery/dist/jquery.min.map +1 -0
  58. data/spec/dummy/node_modules/jquery/dist/jquery.slim.js +8160 -0
  59. data/spec/dummy/node_modules/jquery/dist/jquery.slim.min.js +4 -0
  60. data/spec/dummy/node_modules/jquery/dist/jquery.slim.min.map +1 -0
  61. data/spec/dummy/node_modules/jquery/external/sizzle/LICENSE.txt +36 -0
  62. data/spec/dummy/node_modules/jquery/external/sizzle/dist/sizzle.js +2272 -0
  63. data/spec/dummy/node_modules/jquery/external/sizzle/dist/sizzle.min.js +3 -0
  64. data/spec/dummy/node_modules/jquery/external/sizzle/dist/sizzle.min.map +1 -0
  65. data/spec/dummy/node_modules/jquery/package.json +97 -0
  66. data/spec/dummy/node_modules/jquery/src/ajax/jsonp.js +102 -0
  67. data/spec/dummy/node_modules/jquery/src/ajax/load.js +76 -0
  68. data/spec/dummy/node_modules/jquery/src/ajax/parseXML.js +30 -0
  69. data/spec/dummy/node_modules/jquery/src/ajax/script.js +77 -0
  70. data/spec/dummy/node_modules/jquery/src/ajax/var/location.js +5 -0
  71. data/spec/dummy/node_modules/jquery/src/ajax/var/nonce.js +7 -0
  72. data/spec/dummy/node_modules/jquery/src/ajax/var/rquery.js +5 -0
  73. data/spec/dummy/node_modules/jquery/src/ajax/xhr.js +169 -0
  74. data/spec/dummy/node_modules/jquery/src/ajax.js +855 -0
  75. data/spec/dummy/node_modules/jquery/src/attributes/attr.js +141 -0
  76. data/spec/dummy/node_modules/jquery/src/attributes/classes.js +174 -0
  77. data/spec/dummy/node_modules/jquery/src/attributes/prop.js +143 -0
  78. data/spec/dummy/node_modules/jquery/src/attributes/support.js +33 -0
  79. data/spec/dummy/node_modules/jquery/src/attributes/val.js +190 -0
  80. data/spec/dummy/node_modules/jquery/src/attributes.js +13 -0
  81. data/spec/dummy/node_modules/jquery/src/callbacks.js +234 -0
  82. data/spec/dummy/node_modules/jquery/src/core/DOMEval.js +16 -0
  83. data/spec/dummy/node_modules/jquery/src/core/access.js +70 -0
  84. data/spec/dummy/node_modules/jquery/src/core/init.js +128 -0
  85. data/spec/dummy/node_modules/jquery/src/core/nodeName.js +13 -0
  86. data/spec/dummy/node_modules/jquery/src/core/parseHTML.js +65 -0
  87. data/spec/dummy/node_modules/jquery/src/core/ready-no-deferred.js +96 -0
  88. data/spec/dummy/node_modules/jquery/src/core/ready.js +86 -0
  89. data/spec/dummy/node_modules/jquery/src/core/readyException.js +13 -0
  90. data/spec/dummy/node_modules/jquery/src/core/stripAndCollapse.js +14 -0
  91. data/spec/dummy/node_modules/jquery/src/core/support.js +20 -0
  92. data/spec/dummy/node_modules/jquery/src/core/var/rsingleTag.js +6 -0
  93. data/spec/dummy/node_modules/jquery/src/core.js +476 -0
  94. data/spec/dummy/node_modules/jquery/src/css/addGetHookIf.js +26 -0
  95. data/spec/dummy/node_modules/jquery/src/css/adjustCSS.js +71 -0
  96. data/spec/dummy/node_modules/jquery/src/css/curCSS.js +65 -0
  97. data/spec/dummy/node_modules/jquery/src/css/hiddenVisibleSelectors.js +15 -0
  98. data/spec/dummy/node_modules/jquery/src/css/showHide.js +105 -0
  99. data/spec/dummy/node_modules/jquery/src/css/support.js +89 -0
  100. data/spec/dummy/node_modules/jquery/src/css/var/cssExpand.js +5 -0
  101. data/spec/dummy/node_modules/jquery/src/css/var/getStyles.js +17 -0
  102. data/spec/dummy/node_modules/jquery/src/css/var/isHiddenWithinTree.js +34 -0
  103. data/spec/dummy/node_modules/jquery/src/css/var/rmargin.js +5 -0
  104. data/spec/dummy/node_modules/jquery/src/css/var/rnumnonpx.js +7 -0
  105. data/spec/dummy/node_modules/jquery/src/css/var/swap.js +26 -0
  106. data/spec/dummy/node_modules/jquery/src/css.js +438 -0
  107. data/spec/dummy/node_modules/jquery/src/data/Data.js +161 -0
  108. data/spec/dummy/node_modules/jquery/src/data/var/acceptData.js +19 -0
  109. data/spec/dummy/node_modules/jquery/src/data/var/dataPriv.js +7 -0
  110. data/spec/dummy/node_modules/jquery/src/data/var/dataUser.js +7 -0
  111. data/spec/dummy/node_modules/jquery/src/data.js +179 -0
  112. data/spec/dummy/node_modules/jquery/src/deferred/exceptionHook.js +21 -0
  113. data/spec/dummy/node_modules/jquery/src/deferred.js +391 -0
  114. data/spec/dummy/node_modules/jquery/src/deprecated.js +40 -0
  115. data/spec/dummy/node_modules/jquery/src/dimensions.js +56 -0
  116. data/spec/dummy/node_modules/jquery/src/effects/Tween.js +123 -0
  117. data/spec/dummy/node_modules/jquery/src/effects/animatedSelector.js +15 -0
  118. data/spec/dummy/node_modules/jquery/src/effects.js +699 -0
  119. data/spec/dummy/node_modules/jquery/src/event/ajax.js +22 -0
  120. data/spec/dummy/node_modules/jquery/src/event/alias.js +29 -0
  121. data/spec/dummy/node_modules/jquery/src/event/focusin.js +55 -0
  122. data/spec/dummy/node_modules/jquery/src/event/support.js +11 -0
  123. data/spec/dummy/node_modules/jquery/src/event/trigger.js +185 -0
  124. data/spec/dummy/node_modules/jquery/src/event.js +746 -0
  125. data/spec/dummy/node_modules/jquery/src/exports/amd.js +26 -0
  126. data/spec/dummy/node_modules/jquery/src/exports/global.js +34 -0
  127. data/spec/dummy/node_modules/jquery/src/jquery.js +41 -0
  128. data/spec/dummy/node_modules/jquery/src/manipulation/_evalUrl.js +23 -0
  129. data/spec/dummy/node_modules/jquery/src/manipulation/buildFragment.js +104 -0
  130. data/spec/dummy/node_modules/jquery/src/manipulation/getAll.js +32 -0
  131. data/spec/dummy/node_modules/jquery/src/manipulation/setGlobalEval.js +22 -0
  132. data/spec/dummy/node_modules/jquery/src/manipulation/support.js +35 -0
  133. data/spec/dummy/node_modules/jquery/src/manipulation/var/rcheckableType.js +5 -0
  134. data/spec/dummy/node_modules/jquery/src/manipulation/var/rscriptType.js +5 -0
  135. data/spec/dummy/node_modules/jquery/src/manipulation/var/rtagName.js +5 -0
  136. data/spec/dummy/node_modules/jquery/src/manipulation/wrapMap.js +29 -0
  137. data/spec/dummy/node_modules/jquery/src/manipulation.js +488 -0
  138. data/spec/dummy/node_modules/jquery/src/offset.js +229 -0
  139. data/spec/dummy/node_modules/jquery/src/queue/delay.js +24 -0
  140. data/spec/dummy/node_modules/jquery/src/queue.js +145 -0
  141. data/spec/dummy/node_modules/jquery/src/selector-native.js +237 -0
  142. data/spec/dummy/node_modules/jquery/src/selector-sizzle.js +19 -0
  143. data/spec/dummy/node_modules/jquery/src/selector.js +3 -0
  144. data/spec/dummy/node_modules/jquery/src/serialize.js +130 -0
  145. data/spec/dummy/node_modules/jquery/src/traversing/findFilter.js +106 -0
  146. data/spec/dummy/node_modules/jquery/src/traversing/var/dir.js +22 -0
  147. data/spec/dummy/node_modules/jquery/src/traversing/var/rneedsContext.js +8 -0
  148. data/spec/dummy/node_modules/jquery/src/traversing/var/siblings.js +17 -0
  149. data/spec/dummy/node_modules/jquery/src/traversing.js +191 -0
  150. data/spec/dummy/node_modules/jquery/src/var/ObjectFunctionString.js +7 -0
  151. data/spec/dummy/node_modules/jquery/src/var/arr.js +5 -0
  152. data/spec/dummy/node_modules/jquery/src/var/class2type.js +6 -0
  153. data/spec/dummy/node_modules/jquery/src/var/concat.js +7 -0
  154. data/spec/dummy/node_modules/jquery/src/var/document.js +5 -0
  155. data/spec/dummy/node_modules/jquery/src/var/documentElement.js +7 -0
  156. data/spec/dummy/node_modules/jquery/src/var/fnToString.js +7 -0
  157. data/spec/dummy/node_modules/jquery/src/var/getProto.js +5 -0
  158. data/spec/dummy/node_modules/jquery/src/var/hasOwn.js +7 -0
  159. data/spec/dummy/node_modules/jquery/src/var/indexOf.js +7 -0
  160. data/spec/dummy/node_modules/jquery/src/var/pnum.js +5 -0
  161. data/spec/dummy/node_modules/jquery/src/var/push.js +7 -0
  162. data/spec/dummy/node_modules/jquery/src/var/rcssNum.js +9 -0
  163. data/spec/dummy/node_modules/jquery/src/var/rnothtmlwhite.js +8 -0
  164. data/spec/dummy/node_modules/jquery/src/var/slice.js +7 -0
  165. data/spec/dummy/node_modules/jquery/src/var/support.js +6 -0
  166. data/spec/dummy/node_modules/jquery/src/var/toString.js +7 -0
  167. data/spec/dummy/node_modules/jquery/src/wrap.js +77 -0
  168. data/spec/dummy/node_modules/jquery-ui-bundle/AUTHORS.txt +333 -0
  169. data/spec/dummy/node_modules/jquery-ui-bundle/LICENSE.txt +43 -0
  170. data/spec/dummy/node_modules/jquery-ui-bundle/external/jquery/jquery.js +11008 -0
  171. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_444444_256x240.png +0 -0
  172. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_555555_256x240.png +0 -0
  173. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_777620_256x240.png +0 -0
  174. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_777777_256x240.png +0 -0
  175. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_cc0000_256x240.png +0 -0
  176. data/spec/dummy/node_modules/jquery-ui-bundle/images/ui-icons_ffffff_256x240.png +0 -0
  177. data/spec/dummy/node_modules/jquery-ui-bundle/index.html +559 -0
  178. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.css +1312 -0
  179. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.js +18706 -0
  180. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.min.css +7 -0
  181. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.min.js +13 -0
  182. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.structure.css +886 -0
  183. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.structure.min.css +5 -0
  184. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.theme.css +443 -0
  185. data/spec/dummy/node_modules/jquery-ui-bundle/jquery-ui.theme.min.css +5 -0
  186. data/spec/dummy/node_modules/jquery-ui-bundle/package.json +33 -0
  187. data/spec/dummy/node_modules/jquery-ujs/CONTRIBUTING.md +109 -0
  188. data/spec/dummy/node_modules/jquery-ujs/MIT-LICENSE +20 -0
  189. data/spec/dummy/node_modules/jquery-ujs/README.md +86 -0
  190. data/spec/dummy/node_modules/jquery-ujs/RELEASE.md +23 -0
  191. data/spec/dummy/node_modules/jquery-ujs/bower.json +19 -0
  192. data/spec/dummy/node_modules/jquery-ujs/package.json +26 -0
  193. data/spec/dummy/node_modules/jquery-ujs/src/rails.js +555 -0
  194. data/spec/dummy/tmp/cache/747/A70/TrustyCms%3A%3AConfig +0 -0
  195. data/spec/dummy/tmp/cache/85C/FA0/TrustyCms.cache_mtime +0 -0
  196. data/vendor/extensions/multi-site-extension/lib/multi_site/admin_ui.rb +45 -0
  197. data/vendor/extensions/multi-site-extension/lib/multi_site/application_controller_extensions.rb +40 -0
  198. data/vendor/extensions/multi-site-extension/lib/multi_site/application_controller_filter_extensions.rb +22 -0
  199. data/vendor/extensions/multi-site-extension/lib/multi_site/engine.rb +10 -0
  200. data/vendor/extensions/multi-site-extension/lib/multi_site/page_extensions.rb +81 -0
  201. data/vendor/extensions/multi-site-extension/lib/multi_site/pages_controller_extensions.rb +55 -0
  202. data/vendor/extensions/multi-site-extension/lib/multi_site/resource_controller_extensions.rb +42 -0
  203. data/vendor/extensions/multi-site-extension/lib/multi_site/route_extensions.rb +22 -0
  204. data/vendor/extensions/multi-site-extension/lib/multi_site/route_set_extensions.rb +17 -0
  205. data/vendor/extensions/multi-site-extension/lib/multi_site/scoped_model.rb +133 -0
  206. data/vendor/extensions/multi-site-extension/lib/multi_site/scoped_validation.rb +33 -0
  207. data/vendor/extensions/multi-site-extension/lib/multi_site/site_chooser_helper.rb +14 -0
  208. data/vendor/extensions/multi-site-extension/lib/multi_site/site_controller_extensions.rb +30 -0
  209. data/vendor/extensions/multi-site-extension/lib/tasks/multi_site_extension_tasks.rake +28 -0
  210. data/vendor/extensions/multi-site-extension/lib/tasks/scoped_admin_extension_tasks.rake +28 -0
  211. data/vendor/extensions/multi-site-extension/lib/trusty-multi-site-extension.rb +1 -0
  212. data/vendor/extensions/multi-site-extension/multi_site_extension.rb +61 -0
  213. data/vendor/extensions/snippets-extension/lib/trusty-snippets-extension.rb +0 -0
  214. data/vendor/extensions/snippets-extension/snippets_extension.rb +46 -0
  215. metadata +347 -8
@@ -0,0 +1,746 @@
1
+ define( [
2
+ "./core",
3
+ "./var/document",
4
+ "./var/documentElement",
5
+ "./var/rnothtmlwhite",
6
+ "./var/slice",
7
+ "./data/var/dataPriv",
8
+ "./core/nodeName",
9
+
10
+ "./core/init",
11
+ "./selector"
12
+ ], function( jQuery, document, documentElement, rnothtmlwhite, slice, dataPriv, nodeName ) {
13
+
14
+ "use strict";
15
+
16
+ var
17
+ rkeyEvent = /^key/,
18
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
19
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
20
+
21
+ function returnTrue() {
22
+ return true;
23
+ }
24
+
25
+ function returnFalse() {
26
+ return false;
27
+ }
28
+
29
+ // Support: IE <=9 only
30
+ // See #13393 for more info
31
+ function safeActiveElement() {
32
+ try {
33
+ return document.activeElement;
34
+ } catch ( err ) { }
35
+ }
36
+
37
+ function on( elem, types, selector, data, fn, one ) {
38
+ var origFn, type;
39
+
40
+ // Types can be a map of types/handlers
41
+ if ( typeof types === "object" ) {
42
+
43
+ // ( types-Object, selector, data )
44
+ if ( typeof selector !== "string" ) {
45
+
46
+ // ( types-Object, data )
47
+ data = data || selector;
48
+ selector = undefined;
49
+ }
50
+ for ( type in types ) {
51
+ on( elem, type, selector, data, types[ type ], one );
52
+ }
53
+ return elem;
54
+ }
55
+
56
+ if ( data == null && fn == null ) {
57
+
58
+ // ( types, fn )
59
+ fn = selector;
60
+ data = selector = undefined;
61
+ } else if ( fn == null ) {
62
+ if ( typeof selector === "string" ) {
63
+
64
+ // ( types, selector, fn )
65
+ fn = data;
66
+ data = undefined;
67
+ } else {
68
+
69
+ // ( types, data, fn )
70
+ fn = data;
71
+ data = selector;
72
+ selector = undefined;
73
+ }
74
+ }
75
+ if ( fn === false ) {
76
+ fn = returnFalse;
77
+ } else if ( !fn ) {
78
+ return elem;
79
+ }
80
+
81
+ if ( one === 1 ) {
82
+ origFn = fn;
83
+ fn = function( event ) {
84
+
85
+ // Can use an empty set, since event contains the info
86
+ jQuery().off( event );
87
+ return origFn.apply( this, arguments );
88
+ };
89
+
90
+ // Use same guid so caller can remove using origFn
91
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
92
+ }
93
+ return elem.each( function() {
94
+ jQuery.event.add( this, types, fn, data, selector );
95
+ } );
96
+ }
97
+
98
+ /*
99
+ * Helper functions for managing events -- not part of the public interface.
100
+ * Props to Dean Edwards' addEvent library for many of the ideas.
101
+ */
102
+ jQuery.event = {
103
+
104
+ global: {},
105
+
106
+ add: function( elem, types, handler, data, selector ) {
107
+
108
+ var handleObjIn, eventHandle, tmp,
109
+ events, t, handleObj,
110
+ special, handlers, type, namespaces, origType,
111
+ elemData = dataPriv.get( elem );
112
+
113
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
114
+ if ( !elemData ) {
115
+ return;
116
+ }
117
+
118
+ // Caller can pass in an object of custom data in lieu of the handler
119
+ if ( handler.handler ) {
120
+ handleObjIn = handler;
121
+ handler = handleObjIn.handler;
122
+ selector = handleObjIn.selector;
123
+ }
124
+
125
+ // Ensure that invalid selectors throw exceptions at attach time
126
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
127
+ if ( selector ) {
128
+ jQuery.find.matchesSelector( documentElement, selector );
129
+ }
130
+
131
+ // Make sure that the handler has a unique ID, used to find/remove it later
132
+ if ( !handler.guid ) {
133
+ handler.guid = jQuery.guid++;
134
+ }
135
+
136
+ // Init the element's event structure and main handler, if this is the first
137
+ if ( !( events = elemData.events ) ) {
138
+ events = elemData.events = {};
139
+ }
140
+ if ( !( eventHandle = elemData.handle ) ) {
141
+ eventHandle = elemData.handle = function( e ) {
142
+
143
+ // Discard the second event of a jQuery.event.trigger() and
144
+ // when an event is called after a page has unloaded
145
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
146
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
147
+ };
148
+ }
149
+
150
+ // Handle multiple events separated by a space
151
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
152
+ t = types.length;
153
+ while ( t-- ) {
154
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
155
+ type = origType = tmp[ 1 ];
156
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
157
+
158
+ // There *must* be a type, no attaching namespace-only handlers
159
+ if ( !type ) {
160
+ continue;
161
+ }
162
+
163
+ // If event changes its type, use the special event handlers for the changed type
164
+ special = jQuery.event.special[ type ] || {};
165
+
166
+ // If selector defined, determine special event api type, otherwise given type
167
+ type = ( selector ? special.delegateType : special.bindType ) || type;
168
+
169
+ // Update special based on newly reset type
170
+ special = jQuery.event.special[ type ] || {};
171
+
172
+ // handleObj is passed to all event handlers
173
+ handleObj = jQuery.extend( {
174
+ type: type,
175
+ origType: origType,
176
+ data: data,
177
+ handler: handler,
178
+ guid: handler.guid,
179
+ selector: selector,
180
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
181
+ namespace: namespaces.join( "." )
182
+ }, handleObjIn );
183
+
184
+ // Init the event handler queue if we're the first
185
+ if ( !( handlers = events[ type ] ) ) {
186
+ handlers = events[ type ] = [];
187
+ handlers.delegateCount = 0;
188
+
189
+ // Only use addEventListener if the special events handler returns false
190
+ if ( !special.setup ||
191
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
192
+
193
+ if ( elem.addEventListener ) {
194
+ elem.addEventListener( type, eventHandle );
195
+ }
196
+ }
197
+ }
198
+
199
+ if ( special.add ) {
200
+ special.add.call( elem, handleObj );
201
+
202
+ if ( !handleObj.handler.guid ) {
203
+ handleObj.handler.guid = handler.guid;
204
+ }
205
+ }
206
+
207
+ // Add to the element's handler list, delegates in front
208
+ if ( selector ) {
209
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
210
+ } else {
211
+ handlers.push( handleObj );
212
+ }
213
+
214
+ // Keep track of which events have ever been used, for event optimization
215
+ jQuery.event.global[ type ] = true;
216
+ }
217
+
218
+ },
219
+
220
+ // Detach an event or set of events from an element
221
+ remove: function( elem, types, handler, selector, mappedTypes ) {
222
+
223
+ var j, origCount, tmp,
224
+ events, t, handleObj,
225
+ special, handlers, type, namespaces, origType,
226
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
227
+
228
+ if ( !elemData || !( events = elemData.events ) ) {
229
+ return;
230
+ }
231
+
232
+ // Once for each type.namespace in types; type may be omitted
233
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
234
+ t = types.length;
235
+ while ( t-- ) {
236
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
237
+ type = origType = tmp[ 1 ];
238
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
239
+
240
+ // Unbind all events (on this namespace, if provided) for the element
241
+ if ( !type ) {
242
+ for ( type in events ) {
243
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
244
+ }
245
+ continue;
246
+ }
247
+
248
+ special = jQuery.event.special[ type ] || {};
249
+ type = ( selector ? special.delegateType : special.bindType ) || type;
250
+ handlers = events[ type ] || [];
251
+ tmp = tmp[ 2 ] &&
252
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
253
+
254
+ // Remove matching events
255
+ origCount = j = handlers.length;
256
+ while ( j-- ) {
257
+ handleObj = handlers[ j ];
258
+
259
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
260
+ ( !handler || handler.guid === handleObj.guid ) &&
261
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
262
+ ( !selector || selector === handleObj.selector ||
263
+ selector === "**" && handleObj.selector ) ) {
264
+ handlers.splice( j, 1 );
265
+
266
+ if ( handleObj.selector ) {
267
+ handlers.delegateCount--;
268
+ }
269
+ if ( special.remove ) {
270
+ special.remove.call( elem, handleObj );
271
+ }
272
+ }
273
+ }
274
+
275
+ // Remove generic event handler if we removed something and no more handlers exist
276
+ // (avoids potential for endless recursion during removal of special event handlers)
277
+ if ( origCount && !handlers.length ) {
278
+ if ( !special.teardown ||
279
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
280
+
281
+ jQuery.removeEvent( elem, type, elemData.handle );
282
+ }
283
+
284
+ delete events[ type ];
285
+ }
286
+ }
287
+
288
+ // Remove data and the expando if it's no longer used
289
+ if ( jQuery.isEmptyObject( events ) ) {
290
+ dataPriv.remove( elem, "handle events" );
291
+ }
292
+ },
293
+
294
+ dispatch: function( nativeEvent ) {
295
+
296
+ // Make a writable jQuery.Event from the native event object
297
+ var event = jQuery.event.fix( nativeEvent );
298
+
299
+ var i, j, ret, matched, handleObj, handlerQueue,
300
+ args = new Array( arguments.length ),
301
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
302
+ special = jQuery.event.special[ event.type ] || {};
303
+
304
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
305
+ args[ 0 ] = event;
306
+
307
+ for ( i = 1; i < arguments.length; i++ ) {
308
+ args[ i ] = arguments[ i ];
309
+ }
310
+
311
+ event.delegateTarget = this;
312
+
313
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
314
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
315
+ return;
316
+ }
317
+
318
+ // Determine handlers
319
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
320
+
321
+ // Run delegates first; they may want to stop propagation beneath us
322
+ i = 0;
323
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
324
+ event.currentTarget = matched.elem;
325
+
326
+ j = 0;
327
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
328
+ !event.isImmediatePropagationStopped() ) {
329
+
330
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
331
+ // a subset or equal to those in the bound event (both can have no namespace).
332
+ if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
333
+
334
+ event.handleObj = handleObj;
335
+ event.data = handleObj.data;
336
+
337
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
338
+ handleObj.handler ).apply( matched.elem, args );
339
+
340
+ if ( ret !== undefined ) {
341
+ if ( ( event.result = ret ) === false ) {
342
+ event.preventDefault();
343
+ event.stopPropagation();
344
+ }
345
+ }
346
+ }
347
+ }
348
+ }
349
+
350
+ // Call the postDispatch hook for the mapped type
351
+ if ( special.postDispatch ) {
352
+ special.postDispatch.call( this, event );
353
+ }
354
+
355
+ return event.result;
356
+ },
357
+
358
+ handlers: function( event, handlers ) {
359
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
360
+ handlerQueue = [],
361
+ delegateCount = handlers.delegateCount,
362
+ cur = event.target;
363
+
364
+ // Find delegate handlers
365
+ if ( delegateCount &&
366
+
367
+ // Support: IE <=9
368
+ // Black-hole SVG <use> instance trees (trac-13180)
369
+ cur.nodeType &&
370
+
371
+ // Support: Firefox <=42
372
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
373
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
374
+ // Support: IE 11 only
375
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
376
+ !( event.type === "click" && event.button >= 1 ) ) {
377
+
378
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
379
+
380
+ // Don't check non-elements (#13208)
381
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
382
+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
383
+ matchedHandlers = [];
384
+ matchedSelectors = {};
385
+ for ( i = 0; i < delegateCount; i++ ) {
386
+ handleObj = handlers[ i ];
387
+
388
+ // Don't conflict with Object.prototype properties (#13203)
389
+ sel = handleObj.selector + " ";
390
+
391
+ if ( matchedSelectors[ sel ] === undefined ) {
392
+ matchedSelectors[ sel ] = handleObj.needsContext ?
393
+ jQuery( sel, this ).index( cur ) > -1 :
394
+ jQuery.find( sel, this, null, [ cur ] ).length;
395
+ }
396
+ if ( matchedSelectors[ sel ] ) {
397
+ matchedHandlers.push( handleObj );
398
+ }
399
+ }
400
+ if ( matchedHandlers.length ) {
401
+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
402
+ }
403
+ }
404
+ }
405
+ }
406
+
407
+ // Add the remaining (directly-bound) handlers
408
+ cur = this;
409
+ if ( delegateCount < handlers.length ) {
410
+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
411
+ }
412
+
413
+ return handlerQueue;
414
+ },
415
+
416
+ addProp: function( name, hook ) {
417
+ Object.defineProperty( jQuery.Event.prototype, name, {
418
+ enumerable: true,
419
+ configurable: true,
420
+
421
+ get: jQuery.isFunction( hook ) ?
422
+ function() {
423
+ if ( this.originalEvent ) {
424
+ return hook( this.originalEvent );
425
+ }
426
+ } :
427
+ function() {
428
+ if ( this.originalEvent ) {
429
+ return this.originalEvent[ name ];
430
+ }
431
+ },
432
+
433
+ set: function( value ) {
434
+ Object.defineProperty( this, name, {
435
+ enumerable: true,
436
+ configurable: true,
437
+ writable: true,
438
+ value: value
439
+ } );
440
+ }
441
+ } );
442
+ },
443
+
444
+ fix: function( originalEvent ) {
445
+ return originalEvent[ jQuery.expando ] ?
446
+ originalEvent :
447
+ new jQuery.Event( originalEvent );
448
+ },
449
+
450
+ special: {
451
+ load: {
452
+
453
+ // Prevent triggered image.load events from bubbling to window.load
454
+ noBubble: true
455
+ },
456
+ focus: {
457
+
458
+ // Fire native event if possible so blur/focus sequence is correct
459
+ trigger: function() {
460
+ if ( this !== safeActiveElement() && this.focus ) {
461
+ this.focus();
462
+ return false;
463
+ }
464
+ },
465
+ delegateType: "focusin"
466
+ },
467
+ blur: {
468
+ trigger: function() {
469
+ if ( this === safeActiveElement() && this.blur ) {
470
+ this.blur();
471
+ return false;
472
+ }
473
+ },
474
+ delegateType: "focusout"
475
+ },
476
+ click: {
477
+
478
+ // For checkbox, fire native event so checked state will be right
479
+ trigger: function() {
480
+ if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
481
+ this.click();
482
+ return false;
483
+ }
484
+ },
485
+
486
+ // For cross-browser consistency, don't fire native .click() on links
487
+ _default: function( event ) {
488
+ return nodeName( event.target, "a" );
489
+ }
490
+ },
491
+
492
+ beforeunload: {
493
+ postDispatch: function( event ) {
494
+
495
+ // Support: Firefox 20+
496
+ // Firefox doesn't alert if the returnValue field is not set.
497
+ if ( event.result !== undefined && event.originalEvent ) {
498
+ event.originalEvent.returnValue = event.result;
499
+ }
500
+ }
501
+ }
502
+ }
503
+ };
504
+
505
+ jQuery.removeEvent = function( elem, type, handle ) {
506
+
507
+ // This "if" is needed for plain objects
508
+ if ( elem.removeEventListener ) {
509
+ elem.removeEventListener( type, handle );
510
+ }
511
+ };
512
+
513
+ jQuery.Event = function( src, props ) {
514
+
515
+ // Allow instantiation without the 'new' keyword
516
+ if ( !( this instanceof jQuery.Event ) ) {
517
+ return new jQuery.Event( src, props );
518
+ }
519
+
520
+ // Event object
521
+ if ( src && src.type ) {
522
+ this.originalEvent = src;
523
+ this.type = src.type;
524
+
525
+ // Events bubbling up the document may have been marked as prevented
526
+ // by a handler lower down the tree; reflect the correct value.
527
+ this.isDefaultPrevented = src.defaultPrevented ||
528
+ src.defaultPrevented === undefined &&
529
+
530
+ // Support: Android <=2.3 only
531
+ src.returnValue === false ?
532
+ returnTrue :
533
+ returnFalse;
534
+
535
+ // Create target properties
536
+ // Support: Safari <=6 - 7 only
537
+ // Target should not be a text node (#504, #13143)
538
+ this.target = ( src.target && src.target.nodeType === 3 ) ?
539
+ src.target.parentNode :
540
+ src.target;
541
+
542
+ this.currentTarget = src.currentTarget;
543
+ this.relatedTarget = src.relatedTarget;
544
+
545
+ // Event type
546
+ } else {
547
+ this.type = src;
548
+ }
549
+
550
+ // Put explicitly provided properties onto the event object
551
+ if ( props ) {
552
+ jQuery.extend( this, props );
553
+ }
554
+
555
+ // Create a timestamp if incoming event doesn't have one
556
+ this.timeStamp = src && src.timeStamp || jQuery.now();
557
+
558
+ // Mark it as fixed
559
+ this[ jQuery.expando ] = true;
560
+ };
561
+
562
+ // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
563
+ // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
564
+ jQuery.Event.prototype = {
565
+ constructor: jQuery.Event,
566
+ isDefaultPrevented: returnFalse,
567
+ isPropagationStopped: returnFalse,
568
+ isImmediatePropagationStopped: returnFalse,
569
+ isSimulated: false,
570
+
571
+ preventDefault: function() {
572
+ var e = this.originalEvent;
573
+
574
+ this.isDefaultPrevented = returnTrue;
575
+
576
+ if ( e && !this.isSimulated ) {
577
+ e.preventDefault();
578
+ }
579
+ },
580
+ stopPropagation: function() {
581
+ var e = this.originalEvent;
582
+
583
+ this.isPropagationStopped = returnTrue;
584
+
585
+ if ( e && !this.isSimulated ) {
586
+ e.stopPropagation();
587
+ }
588
+ },
589
+ stopImmediatePropagation: function() {
590
+ var e = this.originalEvent;
591
+
592
+ this.isImmediatePropagationStopped = returnTrue;
593
+
594
+ if ( e && !this.isSimulated ) {
595
+ e.stopImmediatePropagation();
596
+ }
597
+
598
+ this.stopPropagation();
599
+ }
600
+ };
601
+
602
+ // Includes all common event props including KeyEvent and MouseEvent specific props
603
+ jQuery.each( {
604
+ altKey: true,
605
+ bubbles: true,
606
+ cancelable: true,
607
+ changedTouches: true,
608
+ ctrlKey: true,
609
+ detail: true,
610
+ eventPhase: true,
611
+ metaKey: true,
612
+ pageX: true,
613
+ pageY: true,
614
+ shiftKey: true,
615
+ view: true,
616
+ "char": true,
617
+ charCode: true,
618
+ key: true,
619
+ keyCode: true,
620
+ button: true,
621
+ buttons: true,
622
+ clientX: true,
623
+ clientY: true,
624
+ offsetX: true,
625
+ offsetY: true,
626
+ pointerId: true,
627
+ pointerType: true,
628
+ screenX: true,
629
+ screenY: true,
630
+ targetTouches: true,
631
+ toElement: true,
632
+ touches: true,
633
+
634
+ which: function( event ) {
635
+ var button = event.button;
636
+
637
+ // Add which for key events
638
+ if ( event.which == null && rkeyEvent.test( event.type ) ) {
639
+ return event.charCode != null ? event.charCode : event.keyCode;
640
+ }
641
+
642
+ // Add which for click: 1 === left; 2 === middle; 3 === right
643
+ if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
644
+ if ( button & 1 ) {
645
+ return 1;
646
+ }
647
+
648
+ if ( button & 2 ) {
649
+ return 3;
650
+ }
651
+
652
+ if ( button & 4 ) {
653
+ return 2;
654
+ }
655
+
656
+ return 0;
657
+ }
658
+
659
+ return event.which;
660
+ }
661
+ }, jQuery.event.addProp );
662
+
663
+ // Create mouseenter/leave events using mouseover/out and event-time checks
664
+ // so that event delegation works in jQuery.
665
+ // Do the same for pointerenter/pointerleave and pointerover/pointerout
666
+ //
667
+ // Support: Safari 7 only
668
+ // Safari sends mouseenter too often; see:
669
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=470258
670
+ // for the description of the bug (it existed in older Chrome versions as well).
671
+ jQuery.each( {
672
+ mouseenter: "mouseover",
673
+ mouseleave: "mouseout",
674
+ pointerenter: "pointerover",
675
+ pointerleave: "pointerout"
676
+ }, function( orig, fix ) {
677
+ jQuery.event.special[ orig ] = {
678
+ delegateType: fix,
679
+ bindType: fix,
680
+
681
+ handle: function( event ) {
682
+ var ret,
683
+ target = this,
684
+ related = event.relatedTarget,
685
+ handleObj = event.handleObj;
686
+
687
+ // For mouseenter/leave call the handler if related is outside the target.
688
+ // NB: No relatedTarget if the mouse left/entered the browser window
689
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
690
+ event.type = handleObj.origType;
691
+ ret = handleObj.handler.apply( this, arguments );
692
+ event.type = fix;
693
+ }
694
+ return ret;
695
+ }
696
+ };
697
+ } );
698
+
699
+ jQuery.fn.extend( {
700
+
701
+ on: function( types, selector, data, fn ) {
702
+ return on( this, types, selector, data, fn );
703
+ },
704
+ one: function( types, selector, data, fn ) {
705
+ return on( this, types, selector, data, fn, 1 );
706
+ },
707
+ off: function( types, selector, fn ) {
708
+ var handleObj, type;
709
+ if ( types && types.preventDefault && types.handleObj ) {
710
+
711
+ // ( event ) dispatched jQuery.Event
712
+ handleObj = types.handleObj;
713
+ jQuery( types.delegateTarget ).off(
714
+ handleObj.namespace ?
715
+ handleObj.origType + "." + handleObj.namespace :
716
+ handleObj.origType,
717
+ handleObj.selector,
718
+ handleObj.handler
719
+ );
720
+ return this;
721
+ }
722
+ if ( typeof types === "object" ) {
723
+
724
+ // ( types-object [, selector] )
725
+ for ( type in types ) {
726
+ this.off( type, selector, types[ type ] );
727
+ }
728
+ return this;
729
+ }
730
+ if ( selector === false || typeof selector === "function" ) {
731
+
732
+ // ( types [, fn] )
733
+ fn = selector;
734
+ selector = undefined;
735
+ }
736
+ if ( fn === false ) {
737
+ fn = returnFalse;
738
+ }
739
+ return this.each( function() {
740
+ jQuery.event.remove( this, types, fn, selector );
741
+ } );
742
+ }
743
+ } );
744
+
745
+ return jQuery;
746
+ } );