Stream - Version 3.0.6

Version Description

  • April 31, 2015 =

  • New: Better support for default themes (#831)

  • New: Upgrade filter menus to Select2 4 (c3f6c65)

  • Fix: Security Fixes

  • Fix: Cron for purging old records has been fixed (#843)

  • Fix: Better at storing records for Super Admins (#835)

  • Fix: Allow Super Admins to be ignored and filtered (#835)

Props @chacha, @lukecarbis, @Stayallive, @barryceelen, Jonathan Desrosiers, @marcin-lawrowski

Download this release

Release Info

Developer lukecarbis
Plugin Icon 128x128 Stream
Version 3.0.6
Comparing to
See all releases

Code changes from version 3.0.5 to 3.0.6

Files changed (148) hide show
  1. classes/class-admin.php +11 -56
  2. classes/class-author.php +11 -9
  3. classes/class-connectors.php +1 -1
  4. classes/class-db.php +17 -11
  5. classes/class-export.php +6 -2
  6. classes/class-install.php +1 -1
  7. classes/class-list-table.php +28 -4
  8. classes/class-log.php +6 -1
  9. classes/class-plugin.php +4 -2
  10. classes/class-settings.php +26 -2
  11. connectors/class-connector-acf.php +4 -4
  12. connectors/class-connector-gravityforms.php +2 -1
  13. connectors/class-connector-settings.php +67 -14
  14. contributing.md +0 -106
  15. readme.md +0 -521
  16. readme.txt +23 -10
  17. stream.php +1 -1
  18. tests/bootstrap.php +0 -23
  19. tests/testcase.php +0 -74
  20. tests/tests/connectors/test-class-connector-posts.php +0 -6
  21. tests/tests/test-class-admin.php +0 -469
  22. tests/tests/test-class-author.php +0 -108
  23. tests/tests/test-class-connector.php +0 -225
  24. tests/tests/test-class-connectors.php +0 -38
  25. tests/tests/test-class-date-interval.php +0 -51
  26. tests/tests/test-class-db.php +0 -129
  27. tests/tests/test-class-export.php +0 -177
  28. tests/tests/test-class-exporter-csv.php +0 -37
  29. tests/tests/test-class-exporter-json.php +0 -35
  30. tests/tests/test-class-filter-input.php +0 -48
  31. tests/tests/test-class-plugin.php +0 -66
  32. ui/css/admin.css +11 -0
  33. ui/js/admin.js +50 -59
  34. ui/js/settings.js +4 -4
  35. ui/lib/select2/CONTRIBUTING.md +0 -107
  36. ui/lib/select2/LICENSE +0 -18
  37. ui/lib/select2/README.md +0 -115
  38. ui/lib/select2/bower.json +0 -8
  39. ui/lib/select2/component.json +0 -66
  40. ui/lib/select2/composer.json +0 -29
  41. ui/lib/select2/css/select2.css +484 -0
  42. ui/lib/select2/css/select2.min.css +1 -0
  43. ui/lib/select2/js/i18n/ar.js +3 -0
  44. ui/lib/select2/js/i18n/az.js +3 -0
  45. ui/lib/select2/js/i18n/bg.js +3 -0
  46. ui/lib/select2/js/i18n/ca.js +3 -0
  47. ui/lib/select2/js/i18n/cs.js +3 -0
  48. ui/lib/select2/js/i18n/da.js +3 -0
  49. ui/lib/select2/js/i18n/de.js +3 -0
  50. ui/lib/select2/js/i18n/el.js +3 -0
  51. ui/lib/select2/js/i18n/en.js +3 -0
  52. ui/lib/select2/js/i18n/es.js +3 -0
  53. ui/lib/select2/js/i18n/et.js +3 -0
  54. ui/lib/select2/js/i18n/eu.js +3 -0
  55. ui/lib/select2/js/i18n/fa.js +3 -0
  56. ui/lib/select2/js/i18n/fi.js +3 -0
  57. ui/lib/select2/js/i18n/fr.js +3 -0
  58. ui/lib/select2/js/i18n/gl.js +3 -0
  59. ui/lib/select2/js/i18n/he.js +3 -0
  60. ui/lib/select2/js/i18n/hi.js +3 -0
  61. ui/lib/select2/js/i18n/hr.js +3 -0
  62. ui/lib/select2/js/i18n/hu.js +3 -0
  63. ui/lib/select2/js/i18n/id.js +3 -0
  64. ui/lib/select2/js/i18n/is.js +3 -0
  65. ui/lib/select2/js/i18n/it.js +3 -0
  66. ui/lib/select2/js/i18n/ja.js +3 -0
  67. ui/lib/select2/js/i18n/km.js +3 -0
  68. ui/lib/select2/js/i18n/ko.js +3 -0
  69. ui/lib/select2/js/i18n/lt.js +3 -0
  70. ui/lib/select2/js/i18n/lv.js +3 -0
  71. ui/lib/select2/js/i18n/mk.js +3 -0
  72. ui/lib/select2/js/i18n/ms.js +3 -0
  73. ui/lib/select2/js/i18n/nb.js +3 -0
  74. ui/lib/select2/js/i18n/nl.js +3 -0
  75. ui/lib/select2/js/i18n/pl.js +3 -0
  76. ui/lib/select2/js/i18n/pt-BR.js +3 -0
  77. ui/lib/select2/js/i18n/pt.js +3 -0
  78. ui/lib/select2/js/i18n/ro.js +3 -0
  79. ui/lib/select2/js/i18n/ru.js +3 -0
  80. ui/lib/select2/js/i18n/sk.js +3 -0
  81. ui/lib/select2/js/i18n/sr-Cyrl.js +3 -0
  82. ui/lib/select2/js/i18n/sr.js +3 -0
  83. ui/lib/select2/js/i18n/sv.js +3 -0
  84. ui/lib/select2/js/i18n/th.js +3 -0
  85. ui/lib/select2/js/i18n/tr.js +3 -0
  86. ui/lib/select2/js/i18n/uk.js +3 -0
  87. ui/lib/select2/js/i18n/vi.js +3 -0
  88. ui/lib/select2/js/i18n/zh-CN.js +3 -0
  89. ui/lib/select2/js/i18n/zh-TW.js +3 -0
  90. ui/lib/select2/js/select2.full.js +6436 -0
  91. ui/lib/select2/js/select2.full.min.js +3 -0
  92. ui/lib/select2/js/select2.js +5725 -0
  93. ui/lib/select2/js/select2.min.js +3 -0
  94. ui/lib/select2/package.json +0 -20
  95. ui/lib/select2/release.sh +0 -79
  96. ui/lib/select2/select2-bootstrap.css +0 -87
  97. ui/lib/select2/select2-spinner.gif +0 -0
  98. ui/lib/select2/select2.css +0 -692
  99. ui/lib/select2/select2.jquery.json +0 -36
  100. ui/lib/select2/select2.js +0 -3558
  101. ui/lib/select2/select2.png +0 -0
  102. ui/lib/select2/select2_locale_ar.js +0 -19
  103. ui/lib/select2/select2_locale_az.js +0 -20
  104. ui/lib/select2/select2_locale_bg.js +0 -20
  105. ui/lib/select2/select2_locale_ca.js +0 -19
  106. ui/lib/select2/select2_locale_cs.js +0 -51
  107. ui/lib/select2/select2_locale_da.js +0 -19
  108. ui/lib/select2/select2_locale_de.js +0 -18
  109. ui/lib/select2/select2_locale_el.js +0 -19
  110. ui/lib/select2/select2_locale_en.js.template +0 -20
  111. ui/lib/select2/select2_locale_es.js +0 -19
  112. ui/lib/select2/select2_locale_et.js +0 -19
  113. ui/lib/select2/select2_locale_eu.js +0 -45
  114. ui/lib/select2/select2_locale_fa.js +0 -21
  115. ui/lib/select2/select2_locale_fi.js +0 -30
  116. ui/lib/select2/select2_locale_fr.js +0 -18
  117. ui/lib/select2/select2_locale_gl.js +0 -45
  118. ui/lib/select2/select2_locale_he.js +0 -19
  119. ui/lib/select2/select2_locale_hr.js +0 -24
  120. ui/lib/select2/select2_locale_hu.js +0 -17
  121. ui/lib/select2/select2_locale_id.js +0 -21
  122. ui/lib/select2/select2_locale_is.js +0 -17
  123. ui/lib/select2/select2_locale_it.js +0 -17
  124. ui/lib/select2/select2_locale_ja.js +0 -17
  125. ui/lib/select2/select2_locale_ka.js +0 -19
  126. ui/lib/select2/select2_locale_ko.js +0 -19
  127. ui/lib/select2/select2_locale_lt.js +0 -26
  128. ui/lib/select2/select2_locale_lv.js +0 -19
  129. ui/lib/select2/select2_locale_mk.js +0 -19
  130. ui/lib/select2/select2_locale_ms.js +0 -21
  131. ui/lib/select2/select2_locale_nb.js +0 -22
  132. ui/lib/select2/select2_locale_nl.js +0 -17
  133. ui/lib/select2/select2_locale_pl.js +0 -54
  134. ui/lib/select2/select2_locale_pt-BR.js +0 -18
  135. ui/lib/select2/select2_locale_pt-PT.js +0 -17
  136. ui/lib/select2/select2_locale_ro.js +0 -17
  137. ui/lib/select2/select2_locale_rs.js +0 -19
  138. ui/lib/select2/select2_locale_ru.js +0 -23
  139. ui/lib/select2/select2_locale_sk.js +0 -50
  140. ui/lib/select2/select2_locale_sv.js +0 -19
  141. ui/lib/select2/select2_locale_th.js +0 -19
  142. ui/lib/select2/select2_locale_tr.js +0 -20
  143. ui/lib/select2/select2_locale_ug-CN.js +0 -16
  144. ui/lib/select2/select2_locale_uk.js +0 -25
  145. ui/lib/select2/select2_locale_vi.js +0 -20
  146. ui/lib/select2/select2_locale_zh-CN.js +0 -16
  147. ui/lib/select2/select2_locale_zh-TW.js +0 -16
  148. ui/lib/select2/select2x2.png +0 -0
classes/class-admin.php CHANGED
@@ -171,15 +171,6 @@ class Admin {
171
 
172
  // Ajax users list.
173
  add_action( 'wp_ajax_wp_stream_filters', array( $this, 'ajax_filters' ) );
174
-
175
- // Ajax user's name by ID.
176
- add_action( 'wp_ajax_wp_stream_get_filter_value_by_id', array( $this, 'get_filter_value_by_id' ) );
177
-
178
- // Ajax users list.
179
- add_action( 'wp_ajax_wp_stream_filters', array( $this, 'ajax_filters' ) );
180
-
181
- // Ajax user's name by ID.
182
- add_action( 'wp_ajax_wp_stream_get_filter_value_by_id', array( $this, 'get_filter_value_by_id' ) );
183
  }
184
 
185
  /**
@@ -347,8 +338,8 @@ class Admin {
347
  * @return void
348
  */
349
  public function admin_enqueue_scripts( $hook ) {
350
- wp_register_script( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/select2.js', array( 'jquery' ), '3.5.2', true );
351
- wp_register_style( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/select2.css', array(), '3.5.2' );
352
  wp_register_script( 'wp-stream-timeago', $this->plugin->locations['url'] . 'ui/lib/timeago/jquery.timeago.js', array(), '1.4.1', true );
353
 
354
  $locale = strtolower( substr( get_locale(), 0, 2 ) );
@@ -855,6 +846,12 @@ class Admin {
855
  * @action wp_ajax_wp_stream_filters
856
  */
857
  public function ajax_filters() {
 
 
 
 
 
 
858
  switch ( wp_stream_filter_input( INPUT_GET, 'filter' ) ) {
859
  case 'user_id':
860
  $users = array_merge(
@@ -884,49 +881,7 @@ class Admin {
884
  }
885
 
886
  if ( isset( $results ) ) {
887
- echo wp_stream_json_encode( array_values( $results ) ); // xss ok
888
- }
889
-
890
- if ( defined( 'WP_STREAM_TESTS' ) && WP_STREAM_TESTS ) {
891
- return;
892
- }
893
-
894
- die();
895
- }
896
-
897
- /**
898
- * @action wp_ajax_wp_stream_get_filter_value_by_id
899
- */
900
- public function get_filter_value_by_id() {
901
- $filter = wp_stream_filter_input( INPUT_POST, 'filter' );
902
-
903
- switch ( $filter ) {
904
- case 'user_id':
905
- $id = wp_stream_filter_input( INPUT_POST, 'id' );
906
-
907
- if ( '0' === $id ) {
908
- $value = 'WP-CLI';
909
-
910
- break;
911
- }
912
-
913
- $user = get_userdata( $id );
914
-
915
- if ( ! $user || is_wp_error( $user ) ) {
916
- $value = '';
917
- } else {
918
- $value = $user->display_name;
919
- }
920
-
921
- break;
922
- default:
923
- $value = '';
924
- }
925
-
926
- echo wp_stream_json_encode( $value ); // xss ok
927
-
928
- if ( defined( 'WP_STREAM_TESTS' ) && WP_STREAM_TESTS ) {
929
- return;
930
  }
931
 
932
  die();
@@ -936,11 +891,11 @@ class Admin {
936
  $authors_records = array();
937
 
938
  foreach ( $authors as $user_id => $args ) {
939
- $author = new Author( $user_id );
940
 
941
  $authors_records[ $user_id ] = array(
942
  'text' => $author->get_display_name(),
943
- 'id' => $user_id,
944
  'label' => $author->get_display_name(),
945
  'icon' => $author->get_avatar_src( 32 ),
946
  'title' => '',
171
 
172
  // Ajax users list.
173
  add_action( 'wp_ajax_wp_stream_filters', array( $this, 'ajax_filters' ) );
 
 
 
 
 
 
 
 
 
174
  }
175
 
176
  /**
338
  * @return void
339
  */
340
  public function admin_enqueue_scripts( $hook ) {
341
+ wp_register_script( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/js/select2.js', array( 'jquery' ), '3.5.2', true );
342
+ wp_register_style( 'wp-stream-select2', $this->plugin->locations['url'] . 'ui/lib/select2/css/select2.css', array(), '3.5.2' );
343
  wp_register_script( 'wp-stream-timeago', $this->plugin->locations['url'] . 'ui/lib/timeago/jquery.timeago.js', array(), '1.4.1', true );
344
 
345
  $locale = strtolower( substr( get_locale(), 0, 2 ) );
846
  * @action wp_ajax_wp_stream_filters
847
  */
848
  public function ajax_filters() {
849
+ if ( ! defined( 'DOING_AJAX' ) || ! current_user_can( $this->plugin->admin->settings_cap ) ) {
850
+ wp_die( '-1' );
851
+ }
852
+
853
+ check_ajax_referer( 'stream_filters_user_search_nonce', 'nonce' );
854
+
855
  switch ( wp_stream_filter_input( INPUT_GET, 'filter' ) ) {
856
  case 'user_id':
857
  $users = array_merge(
881
  }
882
 
883
  if ( isset( $results ) ) {
884
+ echo wp_stream_json_encode( $results ); // xss ok
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
885
  }
886
 
887
  die();
891
  $authors_records = array();
892
 
893
  foreach ( $authors as $user_id => $args ) {
894
+ $author = new Author( $args->ID );
895
 
896
  $authors_records[ $user_id ] = array(
897
  'text' => $author->get_display_name(),
898
+ 'id' => $author->id,
899
  'label' => $author->get_display_name(),
900
  'icon' => $author->get_avatar_src( 32 ),
901
  'title' => '',
classes/class-author.php CHANGED
@@ -59,6 +59,13 @@ class Author {
59
  }
60
  }
61
 
 
 
 
 
 
 
 
62
  /**
63
  * Get the display name of the user
64
  *
@@ -173,14 +180,16 @@ class Author {
173
  function get_role() {
174
  global $wp_roles;
175
 
 
 
176
  if ( ! empty( $this->meta['user_role'] ) && isset( $wp_roles->role_names[ $this->meta['user_role'] ] ) ) {
177
  $user_role = $wp_roles->role_names[ $this->meta['user_role'] ];
178
  } elseif ( ! empty( $this->meta['user_role_label'] ) ) {
179
  $user_role = $this->meta['user_role_label'];
180
  } elseif ( isset( $this->user->roles[0] ) && isset( $wp_roles->role_names[ $this->user->roles[0] ] ) ) {
181
  $user_role = $wp_roles->role_names[ $this->user->roles[0] ];
182
- } else {
183
- $user_role = '';
184
  }
185
 
186
  return $user_role;
@@ -223,13 +232,6 @@ class Author {
223
  );
224
  }
225
 
226
- /**
227
- * @return string
228
- */
229
- function __toString() {
230
- return $this->get_display_name();
231
- }
232
-
233
  /**
234
  * Look at the environment to detect if an agent is being used
235
  *
59
  }
60
  }
61
 
62
+ /**
63
+ * @return string
64
+ */
65
+ function __toString() {
66
+ return $this->get_display_name();
67
+ }
68
+
69
  /**
70
  * Get the display name of the user
71
  *
180
  function get_role() {
181
  global $wp_roles;
182
 
183
+ $user_role = '';
184
+
185
  if ( ! empty( $this->meta['user_role'] ) && isset( $wp_roles->role_names[ $this->meta['user_role'] ] ) ) {
186
  $user_role = $wp_roles->role_names[ $this->meta['user_role'] ];
187
  } elseif ( ! empty( $this->meta['user_role_label'] ) ) {
188
  $user_role = $this->meta['user_role_label'];
189
  } elseif ( isset( $this->user->roles[0] ) && isset( $wp_roles->role_names[ $this->user->roles[0] ] ) ) {
190
  $user_role = $wp_roles->role_names[ $this->user->roles[0] ];
191
+ } elseif ( is_multisite() && is_super_admin( $this->id ) ) {
192
+ $user_role = $wp_roles->role_names['administrator'];
193
  }
194
 
195
  return $user_role;
232
  );
233
  }
234
 
 
 
 
 
 
 
 
235
  /**
236
  * Look at the environment to detect if an agent is being used
237
  *
classes/class-connectors.php CHANGED
@@ -83,7 +83,7 @@ class Connectors {
83
 
84
  $classes = array();
85
  foreach ( $connectors as $connector ) {
86
- include_once $this->plugin->locations['dir'] . '/connectors/class-connector-' . $connector .'.php';
87
  $class_name = sprintf( '\WP_Stream\Connector_%s', str_replace( '-', '_', $connector ) );
88
  if ( ! class_exists( $class_name ) ) {
89
  continue;
83
 
84
  $classes = array();
85
  foreach ( $connectors as $connector ) {
86
+ include_once $this->plugin->locations['dir'] . '/connectors/class-connector-' . $connector . '.php';
87
  $class_name = sprintf( '\WP_Stream\Connector_%s', str_replace( '-', '_', $connector ) );
88
  if ( ! class_exists( $class_name ) ) {
89
  continue;
classes/class-db.php CHANGED
@@ -73,11 +73,11 @@ class DB {
73
  /**
74
  * Insert a record
75
  *
76
- * @param array $recordarr
77
  *
78
  * @return int
79
  */
80
- public function insert( $recordarr ) {
81
  if ( defined( 'WP_IMPORTING' ) && WP_IMPORTING ) {
82
  return false;
83
  }
@@ -85,20 +85,26 @@ class DB {
85
  /**
86
  * Filter allows modification of record information
87
  *
88
- * @param array $recordarr
89
  *
90
  * @return array
91
  */
92
- $recordarr = apply_filters( 'wp_stream_record_array', $recordarr );
93
 
94
- if ( empty( $recordarr ) ) {
 
 
 
 
 
 
95
  return false;
96
  }
97
 
98
  global $wpdb;
99
 
100
  $fields = array( 'object_id', 'site_id', 'blog_id', 'user_id', 'user_role', 'created', 'summary', 'ip', 'connector', 'context', 'action' );
101
- $data = array_intersect_key( $recordarr, array_flip( $fields ) );
102
 
103
  $result = $wpdb->insert( $this->table, $data );
104
 
@@ -106,10 +112,10 @@ class DB {
106
  /**
107
  * Fires on a record insertion error
108
  *
109
- * @param array $recordarr
110
  * @param mixed $result
111
  */
112
- do_action( 'wp_stream_record_insert_error', $recordarr, $result );
113
 
114
  return $result;
115
  }
@@ -117,7 +123,7 @@ class DB {
117
  $record_id = $wpdb->insert_id;
118
 
119
  // Insert record meta
120
- foreach ( (array) $recordarr['meta'] as $key => $vals ) {
121
  // If associative array, serialize it, otherwise loop on its members
122
  $vals = ( is_array( $vals ) && 0 !== key( $vals ) ) ? array( $vals ) : $vals;
123
 
@@ -132,9 +138,9 @@ class DB {
132
  * Fires after a record has been inserted
133
  *
134
  * @param int $record_id
135
- * @param array $recordarr
136
  */
137
- do_action( 'wp_stream_record_inserted', $record_id, $recordarr );
138
 
139
  return absint( $record_id );
140
  }
73
  /**
74
  * Insert a record
75
  *
76
+ * @param array $record
77
  *
78
  * @return int
79
  */
80
+ public function insert( $record ) {
81
  if ( defined( 'WP_IMPORTING' ) && WP_IMPORTING ) {
82
  return false;
83
  }
85
  /**
86
  * Filter allows modification of record information
87
  *
88
+ * @param array $record
89
  *
90
  * @return array
91
  */
92
+ $record = apply_filters( 'wp_stream_record_array', $record );
93
 
94
+ array_walk( $record, function( &$value, &$key ) {
95
+ if ( ! is_array( $value ) ) {
96
+ $value = strip_tags( $value );
97
+ }
98
+ });
99
+
100
+ if ( empty( $record ) ) {
101
  return false;
102
  }
103
 
104
  global $wpdb;
105
 
106
  $fields = array( 'object_id', 'site_id', 'blog_id', 'user_id', 'user_role', 'created', 'summary', 'ip', 'connector', 'context', 'action' );
107
+ $data = array_intersect_key( $record, array_flip( $fields ) );
108
 
109
  $result = $wpdb->insert( $this->table, $data );
110
 
112
  /**
113
  * Fires on a record insertion error
114
  *
115
+ * @param array $record
116
  * @param mixed $result
117
  */
118
+ do_action( 'wp_stream_record_insert_error', $record, $result );
119
 
120
  return $result;
121
  }
123
  $record_id = $wpdb->insert_id;
124
 
125
  // Insert record meta
126
+ foreach ( (array) $record['meta'] as $key => $vals ) {
127
  // If associative array, serialize it, otherwise loop on its members
128
  $vals = ( is_array( $vals ) && 0 !== key( $vals ) ) ? array( $vals ) : $vals;
129
 
138
  * Fires after a record has been inserted
139
  *
140
  * @param int $record_id
141
+ * @param array $record
142
  */
143
+ do_action( 'wp_stream_record_inserted', $record_id, $record );
144
 
145
  return absint( $record_id );
146
  }
classes/class-export.php CHANGED
@@ -20,7 +20,6 @@ class Export {
20
  * Class constructor
21
  *
22
  * @param Plugin $plugin The plugin object.
23
- * @return void
24
  */
25
  public function __construct( $plugin ) {
26
  $this->plugin = $plugin;
@@ -38,6 +37,11 @@ class Export {
38
  * @return void
39
  */
40
  public function render_download() {
 
 
 
 
 
41
  $action = wp_stream_filter_input( INPUT_GET, 'record-actions' );
42
  if ( strpos( $action, 'export-' ) !== 0 ) {
43
  return;
@@ -179,7 +183,7 @@ class Export {
179
 
180
  $classes = array();
181
  foreach ( $exporters as $exporter ) {
182
- include_once $this->plugin->locations['dir'] . '/exporters/class-exporter-' . $exporter .'.php';
183
  $class_name = sprintf( '\WP_Stream\Exporter_%s', str_replace( '-', '_', $exporter ) );
184
  if ( ! class_exists( $class_name ) ) {
185
  continue;
20
  * Class constructor
21
  *
22
  * @param Plugin $plugin The plugin object.
 
23
  */
24
  public function __construct( $plugin ) {
25
  $this->plugin = $plugin;
37
  * @return void
38
  */
39
  public function render_download() {
40
+ $nonce = wp_stream_filter_input( INPUT_GET, 'stream_record_actions_nonce' );
41
+ if ( ! wp_verify_nonce( $nonce, 'stream_record_actions_nonce' ) ) {
42
+ return;
43
+ }
44
+
45
  $action = wp_stream_filter_input( INPUT_GET, 'record-actions' );
46
  if ( strpos( $action, 'export-' ) !== 0 ) {
47
  return;
183
 
184
  $classes = array();
185
  foreach ( $exporters as $exporter ) {
186
+ include_once $this->plugin->locations['dir'] . '/exporters/class-exporter-' . $exporter . '.php';
187
  $class_name = sprintf( '\WP_Stream\Exporter_%s', str_replace( '-', '_', $exporter ) );
188
  if ( ! class_exists( $class_name ) ) {
189
  continue;
classes/class-install.php CHANGED
@@ -316,7 +316,7 @@ class Install {
316
  <div class="updated">
317
  <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ) ?>" style="display:inline;">
318
  <p><strong><?php esc_html_e( 'Update Complete', 'stream' ) ?></strong></p>
319
- <p><?php esc_html_e( sprintf( 'Your Stream database has been successfully updated from %1$s to %2$s!', esc_html( $this->db_version ), esc_html( $this->plugin->get_version() ) ), 'stream' ) ?></p>
320
  <?php submit_button( esc_html__( 'Continue', 'stream' ), 'secondary', false ) ?>
321
  </form>
322
  </div>
316
  <div class="updated">
317
  <form method="post" action="<?php echo esc_url( remove_query_arg( 'wp_stream_update' ) ) ?>" style="display:inline;">
318
  <p><strong><?php esc_html_e( 'Update Complete', 'stream' ) ?></strong></p>
319
+ <p><?php printf( esc_html__( 'Your Stream database has been successfully updated from %1$s to %2$s!', 'stream' ), esc_html( $this->db_version ), esc_html( $this->plugin->get_version() ) ); ?></p>
320
  <?php submit_button( esc_html__( 'Continue', 'stream' ), 'secondary', false ) ?>
321
  </form>
322
  </div>
classes/class-list-table.php CHANGED
@@ -276,8 +276,8 @@ class List_Table extends \WP_List_Table {
276
  $user->get_avatar_img( 80 ),
277
  $user->get_display_name(),
278
  $user->is_deleted() ? sprintf( '<br /><small class="deleted">%s</small>', esc_html__( 'Deleted User', 'stream' ) ) : '',
279
- $user->get_role() ? sprintf( '<br /><small>%s</small>', $user->get_role() ) : '',
280
- $user->get_agent() ? sprintf( '<br /><small>%s</small>', $user->get_agent_label( $user->get_agent() ) ) : ''
281
  );
282
  break;
283
 
@@ -346,7 +346,11 @@ class List_Table extends \WP_List_Table {
346
  }
347
  }
348
 
349
- echo $out; // xss ok
 
 
 
 
350
  }
351
 
352
  public function get_action_links( $record ) {
@@ -453,7 +457,13 @@ class List_Table extends \WP_List_Table {
453
  $total_users = $user_count['total_users'];
454
 
455
  if ( $total_users > $this->plugin->admin->preload_users_max ) {
456
- return array();
 
 
 
 
 
 
457
  }
458
 
459
  $users = array_map(
@@ -463,6 +473,17 @@ class List_Table extends \WP_List_Table {
463
  get_users( array( 'fields' => 'ID' ) )
464
  );
465
 
 
 
 
 
 
 
 
 
 
 
 
466
  $users[] = new Author( 0, array( 'is_wp_cli' => true ) );
467
 
468
  foreach ( $users as $user ) {
@@ -606,6 +627,8 @@ class List_Table extends \WP_List_Table {
606
 
607
  $filters_string .= sprintf( '<input type="submit" id="record-query-submit" class="button" value="%s" />', __( 'Filter', 'stream' ) );
608
 
 
 
609
  // Parse all query vars into an array
610
  $query_vars = array();
611
 
@@ -812,6 +835,7 @@ class List_Table extends \WP_List_Table {
812
  );
813
  }
814
  echo '</select></div>';
 
815
  printf( '<input type="submit" name="" id="record-actions-submit" class="button" value="%s">', esc_attr__( 'Apply', 'stream' ) );
816
 
817
  return ob_get_clean();
276
  $user->get_avatar_img( 80 ),
277
  $user->get_display_name(),
278
  $user->is_deleted() ? sprintf( '<br /><small class="deleted">%s</small>', esc_html__( 'Deleted User', 'stream' ) ) : '',
279
+ sprintf( '<br /><small>%s</small>', $user->get_role() ),
280
+ sprintf( '<br /><small>%s</small>', $user->get_agent_label( $user->get_agent() ) )
281
  );
282
  break;
283
 
346
  }
347
  }
348
 
349
+ $allowed_tags = wp_kses_allowed_html( 'post' );
350
+ $allowed_tags['time'] = array( 'datetime' => true, 'class' => true );
351
+ $allowed_tags['img']['srcset'] = true;
352
+
353
+ echo wp_kses( $out, $allowed_tags );
354
  }
355
 
356
  public function get_action_links( $record ) {
457
  $total_users = $user_count['total_users'];
458
 
459
  if ( $total_users > $this->plugin->admin->preload_users_max ) {
460
+ $selected_user = wp_stream_filter_input( INPUT_GET, 'user_id' );
461
+ if ( $selected_user ) {
462
+ $user = new Author( $selected_user );
463
+ return array( $selected_user => $user->get_display_name() );
464
+ } else {
465
+ return array();
466
+ }
467
  }
468
 
469
  $users = array_map(
473
  get_users( array( 'fields' => 'ID' ) )
474
  );
475
 
476
+ if ( is_multisite() && is_super_admin() ) {
477
+ $super_admins = array_map(
478
+ function( $login ) {
479
+ $user = get_user_by( 'login', $login );
480
+ return new Author( $user->ID );
481
+ },
482
+ get_super_admins()
483
+ );
484
+ $users = array_unique( array_merge( $users, $super_admins ) );
485
+ }
486
+
487
  $users[] = new Author( 0, array( 'is_wp_cli' => true ) );
488
 
489
  foreach ( $users as $user ) {
627
 
628
  $filters_string .= sprintf( '<input type="submit" id="record-query-submit" class="button" value="%s" />', __( 'Filter', 'stream' ) );
629
 
630
+ $filters_string .= wp_nonce_field( 'stream_filters_user_search_nonce', 'stream_filters_user_search_nonce' );
631
+
632
  // Parse all query vars into an array
633
  $query_vars = array();
634
 
835
  );
836
  }
837
  echo '</select></div>';
838
+ wp_nonce_field( 'stream_record_actions_nonce', 'stream_record_actions_nonce' );
839
  printf( '<input type="submit" name="" id="record-actions-submit" class="button" value="%s">', esc_attr__( 'Apply', 'stream' ) );
840
 
841
  return ob_get_clean();
classes/class-log.php CHANGED
@@ -43,6 +43,8 @@ class Log {
43
  * @return mixed True if updated, otherwise false|WP_Error
44
  */
45
  public function log( $connector, $message, $args, $object_id, $context, $action, $user_id = null ) {
 
 
46
  if ( is_null( $user_id ) ) {
47
  $user_id = get_current_user_id();
48
  }
@@ -106,10 +108,13 @@ class Log {
106
 
107
  if ( ! empty( $user->roles ) ) {
108
  $roles = array_values( $user->roles );
109
- $role = $roles[0];
 
 
110
  } else {
111
  $role = '';
112
  }
 
113
  $recordarr = array(
114
  'object_id' => (int) $object_id,
115
  'site_id' => (int) is_multisite() ? get_current_site()->id : 1,
43
  * @return mixed True if updated, otherwise false|WP_Error
44
  */
45
  public function log( $connector, $message, $args, $object_id, $context, $action, $user_id = null ) {
46
+ global $wp_roles;
47
+
48
  if ( is_null( $user_id ) ) {
49
  $user_id = get_current_user_id();
50
  }
108
 
109
  if ( ! empty( $user->roles ) ) {
110
  $roles = array_values( $user->roles );
111
+ $role = $roles[0];
112
+ } elseif ( is_multisite() && is_super_admin() && $wp_roles->is_role( 'administrator' ) ) {
113
+ $role = 'administrator';
114
  } else {
115
  $role = '';
116
  }
117
+
118
  $recordarr = array(
119
  'object_id' => (int) $object_id,
120
  'site_id' => (int) is_multisite() ? get_current_site()->id : 1,
classes/class-plugin.php CHANGED
@@ -7,7 +7,7 @@ class Plugin {
7
  *
8
  * @const string
9
  */
10
- const VERSION = '3.0.5';
11
 
12
  /**
13
  * WP-CLI command
@@ -101,6 +101,8 @@ class Plugin {
101
  if ( is_admin() || ( defined( 'WP_STREAM_DEV_DEBUG' ) && WP_STREAM_DEV_DEBUG ) ) {
102
  $this->admin = new Admin( $this );
103
  $this->install = new Install( $this );
 
 
104
  }
105
 
106
  // Load WP-CLI command
@@ -193,7 +195,7 @@ class Plugin {
193
  $dir_url = trailingslashit( plugins_url( '', dirname( __FILE__ ) ) );
194
  $dir_path = plugin_dir_path( dirname( __FILE__ ) );
195
  $dir_basename = basename( $dir_path );
196
- $plugin_basename = trailingslashit( $dir_basename ) . $dir_basename. '.php';
197
 
198
  return compact( 'dir_url', 'dir_path', 'dir_basename', 'plugin_basename' );
199
  }
7
  *
8
  * @const string
9
  */
10
+ const VERSION = '3.0.6';
11
 
12
  /**
13
  * WP-CLI command
101
  if ( is_admin() || ( defined( 'WP_STREAM_DEV_DEBUG' ) && WP_STREAM_DEV_DEBUG ) ) {
102
  $this->admin = new Admin( $this );
103
  $this->install = new Install( $this );
104
+ } elseif ( defined( 'DOING_CRON' ) && DOING_CRON ) {
105
+ $this->admin = new Admin( $this );
106
  }
107
 
108
  // Load WP-CLI command
195
  $dir_url = trailingslashit( plugins_url( '', dirname( __FILE__ ) ) );
196
  $dir_path = plugin_dir_path( dirname( __FILE__ ) );
197
  $dir_basename = basename( $dir_path );
198
+ $plugin_basename = trailingslashit( $dir_basename ) . $dir_basename . '.php';
199
 
200
  return compact( 'dir_url', 'dir_path', 'dir_basename', 'plugin_basename' );
201
  }
classes/class-settings.php CHANGED
@@ -114,12 +114,29 @@ class Settings {
114
  if ( 0 === $users->get_total() ) {
115
  wp_send_json_error( $response );
116
  }
 
 
 
 
 
 
 
 
 
117
 
118
  $response->status = true;
119
  $response->message = '';
120
  $response->users = array();
 
 
 
 
 
 
 
 
 
121
 
122
- foreach ( $users->results as $key => $user ) {
123
  $author = new Author( $user->ID );
124
 
125
  $args = array(
@@ -142,6 +159,13 @@ class Settings {
142
  $response->users[] = $args;
143
  }
144
 
 
 
 
 
 
 
 
145
  if ( empty( $search ) || preg_match( '/wp|cli|system|unknown/i', $search ) ) {
146
  $author = new Author( 0 );
147
  $response->users[] = array(
@@ -235,7 +259,7 @@ class Settings {
235
  'name' => 'records_ttl',
236
  'title' => esc_html__( 'Keep Records for', 'stream' ),
237
  'type' => 'number',
238
- 'class' => 'small-text',
239
  'desc' => esc_html__( 'Maximum number of days to keep activity records.', 'stream' ),
240
  'default' => 30,
241
  'min' => 1,
114
  if ( 0 === $users->get_total() ) {
115
  wp_send_json_error( $response );
116
  }
117
+ $users_array = $users->results;
118
+
119
+ if ( is_multisite() && is_super_admin() ) {
120
+ $super_admins = get_super_admins();
121
+ foreach ( $super_admins as $admin ) {
122
+ $user = get_user_by( 'login', $admin );
123
+ $users_array[] = $user;
124
+ }
125
+ }
126
 
127
  $response->status = true;
128
  $response->message = '';
129
  $response->users = array();
130
+ $users_added_to_response = array();
131
+
132
+ foreach ( $users_array as $key => $user ) {
133
+ // exclude duplications:
134
+ if ( array_key_exists( $user->ID, $users_added_to_response ) ) {
135
+ continue;
136
+ } else {
137
+ $users_added_to_response[ $user->ID ] = true;
138
+ }
139
 
 
140
  $author = new Author( $user->ID );
141
 
142
  $args = array(
159
  $response->users[] = $args;
160
  }
161
 
162
+ usort(
163
+ $response->users,
164
+ function( $a, $b ) {
165
+ return strcmp( $a['text'], $b['text'] );
166
+ }
167
+ );
168
+
169
  if ( empty( $search ) || preg_match( '/wp|cli|system|unknown/i', $search ) ) {
170
  $author = new Author( 0 );
171
  $response->users[] = array(
259
  'name' => 'records_ttl',
260
  'title' => esc_html__( 'Keep Records for', 'stream' ),
261
  'type' => 'number',
262
+ 'class' => 'small-text hidden',
263
  'desc' => esc_html__( 'Maximum number of days to keep activity records.', 'stream' ),
264
  'default' => 30,
265
  'min' => 1,
connectors/class-connector-acf.php CHANGED
@@ -81,10 +81,10 @@ class Connector_ACF extends Connector {
81
  */
82
  public function get_action_labels() {
83
  return array(
84
- 'created' => esc_html__( 'Created', 'acf', 'stream' ),
85
- 'updated' => esc_html__( 'Updated', 'acf', 'stream' ),
86
- 'added' => esc_html__( 'Added', 'acf', 'stream' ),
87
- 'deleted' => esc_html__( 'Deleted', 'acf', 'stream' ),
88
  );
89
  }
90
 
81
  */
82
  public function get_action_labels() {
83
  return array(
84
+ 'created' => esc_html_x( 'Created', 'acf', 'stream' ),
85
+ 'updated' => esc_html_x( 'Updated', 'acf', 'stream' ),
86
+ 'added' => esc_html_x( 'Added', 'acf', 'stream' ),
87
+ 'deleted' => esc_html_x( 'Deleted', 'acf', 'stream' ),
88
  );
89
  }
90
 
connectors/class-connector-gravityforms.php CHANGED
@@ -481,9 +481,10 @@ class Connector_GravityForms extends Connector {
481
  $forms_titles = wp_list_pluck( $forms, 'title' );
482
 
483
  $this->log(
484
- __( '%d ' . $forms_label . ' imported', 'stream' ),
485
  array(
486
  'count' => $forms_total,
 
487
  'ids' => $forms_ids,
488
  'titles' => $forms_titles,
489
  ),
481
  $forms_titles = wp_list_pluck( $forms, 'title' );
482
 
483
  $this->log(
484
+ __( '%d %s imported', 'stream' ),
485
  array(
486
  'count' => $forms_total,
487
+ 'label' => $forms_label,
488
  'ids' => $forms_ids,
489
  'titles' => $forms_titles,
490
  ),
connectors/class-connector-settings.php CHANGED
@@ -93,6 +93,7 @@ class Connector_Settings extends Connector {
93
  // General
94
  'blogname' => esc_html__( 'Site Title', 'stream' ),
95
  'blogdescription' => esc_html__( 'Tagline', 'stream' ),
 
96
  'admin_email' => esc_html__( 'E-mail Address', 'stream' ),
97
  'new_admin_email' => esc_html__( 'E-mail Address', 'stream' ),
98
  'siteurl' => esc_html__( 'WordPress Address (URL)', 'stream' ),
@@ -112,6 +113,7 @@ class Connector_Settings extends Connector {
112
  'mailserver_login' => esc_html__( 'Login Name', 'stream' ),
113
  'mailserver_pass' => esc_html__( 'Password', 'stream' ),
114
  'default_email_category' => esc_html__( 'Default Mail Category', 'stream' ),
 
115
  'ping_sites' => esc_html__( 'Update Services', 'stream' ),
116
  // Reading
117
  'show_on_front' => esc_html__( 'Front page displays', 'stream' ),
@@ -319,17 +321,40 @@ class Connector_Settings extends Connector {
319
  return false;
320
  }
321
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
322
  /**
323
  * Find out if array keys in the option should be logged separately
324
  *
325
- * @param string $key
326
- * @param mixed $old_value
327
  * @param mixed $value
328
  *
329
  * @return bool Whether the option should be treated as a group
330
  */
331
- public function is_key_option_group( $key, $old_value, $value ) {
332
- if ( ! is_array( $old_value ) && ! is_array( $value ) ) {
333
  return false;
334
  }
335
 
@@ -377,14 +402,25 @@ class Connector_Settings extends Connector {
377
  $labels = array(
378
  'theme_mods' => array(
379
  // Custom Background
380
- 'background_image' => esc_html__( 'Background Image', 'stream' ),
381
- 'background_position_x' => esc_html__( 'Background Position', 'stream' ),
382
- 'background_repeat' => esc_html__( 'Background Repeat', 'stream' ),
383
- 'background_attachment' => esc_html__( 'Background Attachment', 'stream' ),
384
- 'background_color' => esc_html__( 'Background Color', 'stream' ),
385
  // Custom Header
386
- 'header_image' => esc_html__( 'Header Image', 'stream' ),
387
- 'header_textcolor' => esc_html__( 'Text Color', 'stream' ),
 
 
 
 
 
 
 
 
 
 
 
388
  ),
389
  );
390
 
@@ -632,7 +668,7 @@ class Connector_Settings extends Connector {
632
  public function callback_updated_option( $option, $old_value, $value ) {
633
  global $whitelist_options, $new_whitelist_options;
634
 
635
- if ( 0 === strpos( $option, '_transient_' ) || 0 === strpos( $option, '_site_transient_' ) ) {
636
  return;
637
  }
638
 
@@ -655,9 +691,8 @@ class Connector_Settings extends Connector {
655
  }
656
 
657
  $changed_options = array();
658
- $option_group = $this->is_key_option_group( $option, $old_value, $value );
659
 
660
- if ( $option_group ) {
661
  foreach ( $this->get_changed_keys( $old_value, $value ) as $field_key ) {
662
  if ( ! $this->is_key_ignored( $option, $field_key ) ) {
663
  $key_context = $this->get_context_by_key( $option, $field_key );
@@ -762,4 +797,22 @@ class Connector_Settings extends Connector {
762
  </script>
763
  <?php
764
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
765
  }
93
  // General
94
  'blogname' => esc_html__( 'Site Title', 'stream' ),
95
  'blogdescription' => esc_html__( 'Tagline', 'stream' ),
96
+ 'gmt_offset' => esc_html__( 'Timezone', 'stream' ),
97
  'admin_email' => esc_html__( 'E-mail Address', 'stream' ),
98
  'new_admin_email' => esc_html__( 'E-mail Address', 'stream' ),
99
  'siteurl' => esc_html__( 'WordPress Address (URL)', 'stream' ),
113
  'mailserver_login' => esc_html__( 'Login Name', 'stream' ),
114
  'mailserver_pass' => esc_html__( 'Password', 'stream' ),
115
  'default_email_category' => esc_html__( 'Default Mail Category', 'stream' ),
116
+ 'default_link_category' => esc_html__( 'Default Link Category', 'stream' ),
117
  'ping_sites' => esc_html__( 'Update Services', 'stream' ),
118
  // Reading
119
  'show_on_front' => esc_html__( 'Front page displays', 'stream' ),
321
  return false;
322
  }
323
 
324
+ /**
325
+ * Find out if the option should be ignored and not logged
326
+ *
327
+ * @param string $option_name
328
+ *
329
+ * @return bool Whether the option is ignored or not
330
+ */
331
+ public function is_option_ignored( $option_name ) {
332
+ if ( 0 === strpos( $option_name, '_transient_' ) || 0 === strpos( $option_name, '_site_transient_' ) ) {
333
+ return true;
334
+ }
335
+
336
+ if ( '$' === substr( $option_name, -1 ) ) {
337
+ return true;
338
+ }
339
+
340
+ $ignored = array(
341
+ 'image_default_link_type',
342
+ 'medium_large_size_w',
343
+ 'medium_large_size_h',
344
+ );
345
+
346
+ return in_array( $option_name, $ignored, true );
347
+ }
348
+
349
  /**
350
  * Find out if array keys in the option should be logged separately
351
  *
 
 
352
  * @param mixed $value
353
  *
354
  * @return bool Whether the option should be treated as a group
355
  */
356
+ public function is_option_group( $value ) {
357
+ if ( ! is_array( $value ) ) {
358
  return false;
359
  }
360
 
402
  $labels = array(
403
  'theme_mods' => array(
404
  // Custom Background
405
+ 'background_image' => esc_html__( 'Background Image', 'stream' ),
406
+ 'background_position_x' => esc_html__( 'Background Position', 'stream' ),
407
+ 'background_repeat' => esc_html__( 'Background Repeat', 'stream' ),
408
+ 'background_attachment' => esc_html__( 'Background Attachment', 'stream' ),
409
+ 'background_color' => esc_html__( 'Background Color', 'stream' ),
410
  // Custom Header
411
+ 'header_image' => esc_html__( 'Header Image', 'stream' ),
412
+ 'header_textcolor' => esc_html__( 'Text Color', 'stream' ),
413
+ 'header_background_color' => esc_html__( 'Header and Sidebar Background Color', 'stream' ),
414
+ // Featured Content
415
+ 'featured_content_layout' => esc_html__( 'Layout', 'stream' ),
416
+ // Custom Sidebar
417
+ 'sidebar_textcolor' => esc_html__( 'Header and Sidebar Text Color', 'stream' ),
418
+ // Custom Colors
419
+ 'color_scheme' => esc_html__( 'Color Scheme', 'stream' ),
420
+ 'main_text_color' => esc_html__( 'Main Text Color', 'stream' ),
421
+ 'secondary_text_color' => esc_html__( 'Secondary Text Color', 'stream' ),
422
+ 'link_color' => esc_html__( 'Link Color', 'stream' ),
423
+ 'page_background_color' => esc_html__( 'Page Background Color', 'stream' ),
424
  ),
425
  );
426
 
668
  public function callback_updated_option( $option, $old_value, $value ) {
669
  global $whitelist_options, $new_whitelist_options;
670
 
671
+ if ( $this->is_option_ignored( $option ) ) {
672
  return;
673
  }
674
 
691
  }
692
 
693
  $changed_options = array();
 
694
 
695
+ if ( $this->is_option_group( $value ) ) {
696
  foreach ( $this->get_changed_keys( $old_value, $value ) as $field_key ) {
697
  if ( ! $this->is_key_ignored( $option, $field_key ) ) {
698
  $key_context = $this->get_context_by_key( $option, $field_key );
797
  </script>
798
  <?php
799
  }
800
+
801
+ /**
802
+ * Find out if array keys in the option should be logged separately
803
+ *
804
+ * @deprecated 3.0.6
805
+ * @deprecated Use is_option_group()
806
+ * @see is_option_group()
807
+ *
808
+ * @param string $key
809
+ * @param mixed $old_value
810
+ * @param mixed $value
811
+ *
812
+ * @return bool Whether the option should be treated as a group
813
+ */
814
+ public function is_key_option_group( $key, $old_value, $value ) {
815
+ _deprecated_function( __FUNCTION__, '3.0.6', 'is_option_group' );
816
+ return $this->is_option_group( $value );
817
+ }
818
  }
contributing.md DELETED
@@ -1,106 +0,0 @@
1
- # Contributing to this project
2
-
3
- Please take a moment to review this document in order to make the contribution process easy and effective for everyone involved.
4
-
5
- Following these guidelines will help us get back to you more quickly, and will show that you care about making Stream better just like we do. In return, we'll do our best to respond to your issue or pull request as soon as possible with the same respect.
6
-
7
-
8
- ## Use the issue tracker
9
-
10
- The [issue tracker](https://github.com/wp-stream/stream/issues) is the preferred channel for [bug reports](#bugs), [features requests](#features) and [submitting pull requests](#pull-requests), but please respect the following restrictions:
11
-
12
- * Support issues or usage questions that are not bugs should be posted on the [Plugin Support Forum](http://wordpress.org/support/plugin/stream).
13
- * Please **do not** derail or troll issues. Keep the discussion on topic and respect the opinions of others.
14
-
15
-
16
- <a name="bugs"></a>
17
- ## Bug reports
18
-
19
- A bug is a _demonstrable problem_ that is caused by the code in the repository. Good bug reports with complete error messages, environment details and screenshots are extremely helpful &mdash; thank you!
20
-
21
- Guidelines for bug reports:
22
-
23
- 1. **Check if the bug has already been fixed** &mdash; Someone may already be on top of it, so try to reproduce it using the latest from the `master` branch.
24
-
25
- 2. **Use the [GitHub issue search](https://github.com/wp-stream/stream/search?type=Issues)** &mdash; Someone might already know about it, so please check if the issue has already been reported.
26
-
27
- 3. **Isolate the problem** &mdash; The better you can determine exactly what behavior(s) cause the issue, the faster and more effectively it can be resolved. “I’m getting an error message.” is not a good bug report. A good bug report shouldn't leave others needing to contact you for more information.
28
-
29
- Please try to be as detailed as possible in your report. What is your environment? What steps will reproduce the issue? What browser(s) experience the problem? What outcome did you expect, and how did it differ from what you actually saw? All these details will help people to fix any potential bugs.
30
-
31
- Example:
32
-
33
- > Short and descriptive example bug report title
34
- >
35
- > A summary of the issue and the environment/browser in which it occurs. If
36
- > suitable, include the steps required to reproduce the bug.
37
- >
38
- > 1. This is the first step
39
- > 2. This is the second step
40
- > 3. Further steps, etc.
41
- >
42
- > Any other information you want to share that is relevant to the issue being reported. This might include the lines of code that you have identified as causing the bug, and potential solutions (and your opinions on their merits).
43
-
44
- **Note:** In an effort to keep open issues to a manageable number, we will close any issues that do not provide enough information for us to be able to work on a solution. You will be encouraged to provide the necessary details, after which we will reopen the issue.
45
-
46
- <a name="features"></a>
47
- ## Feature requests
48
-
49
- Feature requests are very welcome! But take a moment to find out whether your idea fits with the scope and aims of the project. It's up to *you* to make a strong case to convince the project's developers of the merits of this feature. Please provide as much detail and context as possible.
50
-
51
- Building something great means choosing features carefully especially because it is much, much easier to add features than it is to take them away. Additions to Stream will be evaluated on a combination of scope (how well it fits into the project), maintenance burden and general usefulness to users.
52
-
53
- <a name="pull-requests"></a>
54
- ## Pull requests
55
-
56
- Good pull requests &mdash; patches, improvements, new features &mdash; are a fantastic help.
57
- They should remain focused in scope and avoid containing unrelated commits.
58
-
59
- **Please ask first** before embarking on any significant pull request (e.g. implementing features, refactoring code), otherwise you risk spending a lot of time working on something that the project's developers might not want to merge into the project. You can solicit feedback and opinions in an open enhancement issue, or [create a new one](https://github.com/wp-stream/stream/issues/new).
60
-
61
- Please use the [git flow for pull requests](#git-flow) and follow [WordPress Coding Standards](http://make.wordpress.org/core/handbook/coding-standards/) before submitting your work. Adhering to these guidelines is the best way to get your work included in Stream.
62
-
63
- <a name="git-flow"></a>
64
- #### Git Flow for pull requests
65
-
66
- 1. [Fork](http://help.github.com/fork-a-repo/) the project, clone your fork, and configure the remotes:
67
-
68
- ```bash
69
- # Clone your fork of the repo into the current directory
70
- git clone git@github.com:<YOUR_USERNAME>/stream.git
71
- # Navigate to the newly cloned directory
72
- cd stream
73
- # Assign the original repo to a remote called "upstream"
74
- git remote add upstream https://github.com/wp-stream/stream
75
- ```
76
-
77
- 2. If you cloned a while ago, get the latest changes from upstream:
78
-
79
- ```bash
80
- git checkout master
81
- git pull upstream master
82
- ```
83
-
84
- 3. Create a new topic branch (off the `master` branch) to contain your feature, change, or fix:
85
-
86
- ```bash
87
- git checkout -b <topic-branch-name>
88
- ```
89
-
90
- 4. Commit your changes in logical chunks. Please adhere to these [git commit message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) or your code is unlikely be merged into the main project. Use Git's [interactive rebase](https://help.github.com/articles/interactive-rebase) feature to tidy up your commits before making them public.
91
-
92
- 5. Locally merge (or rebase) the upstream development branch into your topic branch:
93
-
94
- ```bash
95
- git pull [--rebase] upstream master
96
- ```
97
-
98
- 6. Push your topic branch up to your fork:
99
-
100
- ```bash
101
- git push origin <topic-branch-name>
102
- ```
103
-
104
- 7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/) (with a clear title and description) to the `develop` branch.
105
-
106
- **IMPORTANT**: By submitting a patch, you agree to allow the project owner to license your work under the [GPL v2 license](http://www.gnu.org/licenses/gpl-2.0.html).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.md DELETED
@@ -1,521 +0,0 @@
1
- <!-- DO NOT EDIT THIS FILE; it is auto-generated from readme.txt -->
2
- # Stream
3
-
4
- ![Banner](assets/banner-1544x500.png)
5
- Stream is the easiest and safest way to track content changes happening to your WordPress site and then view them in beautifully organized detail.
6
-
7
- **Contributors:** [fjarrett](https://profiles.wordpress.org/fjarrett), [lukecarbis](https://profiles.wordpress.org/lukecarbis), [shadyvb](https://profiles.wordpress.org/shadyvb), [westonruter](https://profiles.wordpress.org/westonruter), [stream](https://profiles.wordpress.org/stream), [xwp](https://profiles.wordpress.org/xwp)
8
- **Tags:** [actions](https://wordpress.org/plugins/tags/actions), [activity](https://wordpress.org/plugins/tags/activity), [activity log](https://wordpress.org/plugins/tags/activity log), [activity logs](https://wordpress.org/plugins/tags/activity logs), [admin actions](https://wordpress.org/plugins/tags/admin actions), [analytics](https://wordpress.org/plugins/tags/analytics), [audit](https://wordpress.org/plugins/tags/audit), [audit log](https://wordpress.org/plugins/tags/audit log), [audit logs](https://wordpress.org/plugins/tags/audit logs), [change](https://wordpress.org/plugins/tags/change), [changes](https://wordpress.org/plugins/tags/changes), [dashboard](https://wordpress.org/plugins/tags/dashboard), [log](https://wordpress.org/plugins/tags/log), [logs](https://wordpress.org/plugins/tags/logs), [stream](https://wordpress.org/plugins/tags/stream), [tracking](https://wordpress.org/plugins/tags/tracking), [troubleshooting](https://wordpress.org/plugins/tags/troubleshooting), [wp stream](https://wordpress.org/plugins/tags/wp stream)
9
- **Requires at least:** 3.9
10
- **Tested up to:** 4.5
11
- **Stable tag:** 3.0.5
12
- **License:** [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html)
13
-
14
- [![Build Status](https://travis-ci.org/xwp/stream.svg?branch=master)](https://travis-ci.org/xwp/stream) [![Join the chat at https://gitter.im/xwp/stream](https://badges.gitter.im/Join Chat.svg)](https://gitter.im/xwp/stream)
15
-
16
- ## Description ##
17
-
18
- Never be in the dark about WP Admin activity again.
19
-
20
- Stream allows you to know exactly when changes to your site have been made, and more importantly, who did them.
21
-
22
- Every logged-in user action is displayed in an activity stream and organized for easy filtering by User, Role, Context, Action and IP address.
23
-
24
- **Built-In Tracking Integrations For Popular Plugins:**
25
-
26
- * Advanced Custom Fields
27
- * bbPress
28
- * BuddyPress
29
- * Easy Digital Downloads
30
- * Gravity Forms
31
- * Jetpack
32
- * User Switching
33
- * WooCommerce
34
- * WordPress SEO by Yoast
35
-
36
- **Built-In Tracking For Core Actions:**
37
-
38
- * Posts
39
- * Pages
40
- * Custom Post Types
41
- * Users
42
- * Themes
43
- * Plugins
44
- * Tags
45
- * Categories
46
- * Custom Taxonomies
47
- * Settings
48
- * Custom Backgrounds
49
- * Custom Headers
50
- * Menus
51
- * Media Library
52
- * Widgets
53
- * Comments
54
- * Theme Editor
55
- * WordPress Core Updates
56
-
57
- **Other Noteworthy Features:**
58
-
59
- * Multisite view of all activity records on a network
60
- * Limit who can view user activity records by user role
61
- * Set exclude rules to ignore certain kinds of user activity
62
- * Live update of user activity records in the Stream
63
- * Support for IPv6 addresses
64
- * WP-CLI command for querying records
65
-
66
- **See room for improvement?**
67
-
68
- Great! There are several ways you can get involved to help make Stream better:
69
-
70
- 1. **Report Bugs:** If you find a bug, error or other problem, please report it! You can do this by [creating a new topic](https://wordpress.org/support/plugin/stream) in the plugin forum. Once a developer can verify the bug by reproducing it, they will create an official bug report in GitHub where the bug will be worked on.
71
- 2. **Suggest New Features:** Have an awesome idea? Please share it! Simply [create a new topic](https://wordpress.org/support/plugin/stream) in the plugin forum to express your thoughts on why the feature should be included and get a discussion going around your idea.
72
- 3. **Issue Pull Requests:** If you're a developer, the easiest way to get involved is to help out on [issues already reported](https://github.com/x-team/wp-stream/issues) in GitHub. Be sure to check out the [contributing guide](https://github.com/x-team/wp-stream/blob/master/contributing.md) for developers.
73
-
74
- Thank you for wanting to make Stream better for everyone! We salute you.
75
-
76
- ## Screenshots ##
77
-
78
- ### Every logged-in user action is displayed in an activity stream and organized for easy filtering and searching.
79
-
80
- ![Every logged-in user action is displayed in an activity stream and organized for easy filtering and searching.](assets/screenshot-1.png)
81
-
82
- ### Enable live updates in Screen Options to watch your site activity appear in near real-time.
83
-
84
- ![Enable live updates in Screen Options to watch your site activity appear in near real-time.](assets/screenshot-2.png)
85
-
86
- ### Create rules for excluding certain kinds of records from appearing in Stream.
87
-
88
- ![Create rules for excluding certain kinds of records from appearing in Stream.](assets/screenshot-3.png)
89
-
90
- ## Changelog ##
91
-
92
- ### 3.0.5 - March 15, 2015 ###
93
- * New: Export your Stream records as CSV or JSON. ([#823](https://github.com/xwp/stream/pull/823))
94
- * Tweak: More mobile responsive list table ([#810](https://github.com/xwp/stream/pull/810))
95
- * Tweak: Better Javascript conflict prevention ([#812](https://github.com/xwp/stream/pull/812))
96
- * Tweak: Minor styling updates. It's about attention to detail. ([#826](https://github.com/xwp/stream/pull/826))
97
- * Fix: Gravity Forms error when adding a note ([#811](https://github.com/xwp/stream/pull/811))
98
- * Fix: In some instances, custom roles weren't being logged by Stream ([#824](https://github.com/xwp/stream/pull/824))
99
- * Fix: The Customiser fix you've been waiting for! Stream now properly records changes made from the Customiser. ([#827](https://github.com/xwp/stream/pull/827))
100
-
101
- Props [@chacha](https://github.com/chacha), [@lukecarbis](https://github.com/lukecarbis), [@Stayallive](https://github.com/Stayallive), [@barryceelen](https://github.com/barryceelen), Jonathan Desrosiers, [@marcin-lawrowski](https://github.com/marcin-lawrowski)
102
-
103
- ### 3.0.4 - November 27, 2015 ###
104
- * Tweak: Better descriptions when a post changes status ([0eada10](https://github.com/xwp/stream/commit/0eada108b443ed3b6f9bdae3f1e4c87c77128a0a))
105
- * Fix: Stream no longer crashes every time it tries to use a Jetpack ([#798](https://github.com/xwp/stream/pull/798))
106
- * Fix: You may now actually choose an item from the filter dropdown menus, instead of having everything greyed out ([#800](https://github.com/xwp/stream/pull/800))
107
- * Fix: Logging in / out of a Multisite install is now possible ([#801](https://github.com/xwp/stream/pull/801))
108
- * Fix: The Settings connector now works with WP CLI ([78a56b2](https://github.com/xwp/stream/commit/78a56b2c6b33b4f41c7b4f1f256a4d03ad42b2cb))
109
-
110
- Props [@lukecarbis](https://github.com/lukecarbis)
111
-
112
- ### 3.0.3 - November 6, 2015 ###
113
- * Tweak: Better compatibility with upcoming WordPress 4.4 ([2b2493c](https://github.com/xwp/stream/commit/2b2493ccb3ef6cba5aeb773433fdb5f0d414e8f3))
114
- * Tweak: Minor security improvements
115
- * Fix: New and improved Gravity Forms connector, works much better ([#780](https://github.com/xwp/stream/pull/780)) (thanks [Rob](https://github.com/rob)!)
116
- * Fix: Stream no longer explodes on < PHP 5.3, when trying to tell you that it explodes on < PHP 5.3 ([#781](https://github.com/xwp/stream/pull/781))
117
- * Fix: Fixed a smal typo ([62455c5](https://github.com/xwp/stream/commit/62455c518b95ddaf5e6c6c0733e7d03e5aa1311c))
118
- * Fix: Multiple Multisite Mistakes Mended ([#788](https://github.com/xwp/stream/pull/788))
119
- * Fix: Internet Explorer 8 fix!! IE8!? Come on, people, it's 2015. ([#789](https://github.com/xwp/stream/pull/789))
120
- * Fix: EDD connector bug ([#790](https://github.com/xwp/stream/pull/790))
121
-
122
- Props [@lukecarbis](https://github.com/lukecarbis), [@rob](https://github.com/rob), [greguly](https://github.com/greguly)
123
-
124
- ### 3.0.2 - October 2, 2015 ###
125
- * Tweak: Helper function for running Stream queries added ([#774](https://github.com/xwp/stream/pull/774))
126
- * Tweak: Migration dialog removed ([76e809f](https://github.com/xwp/stream/commit/76e809f9abb3dd691b755cf943b50a76a3ffb488))
127
- * Tweak: Better handling of draft saving and auto-saving ([#775](https://github.com/xwp/stream/pull/775))
128
- * Tweak: Records page title size now matches other admin pages ([afcced8](https://github.com/xwp/stream/commit/afcced8b590e047e8adfe6ae79483a7436c849f4))
129
- * Fix: Database update dialog is now displayed correctly ([#773](https://github.com/xwp/stream/pull/773))
130
- * Fix: The record's connector was being incorrectly stored as the connector name ([#773](https://github.com/xwp/stream/pull/773))
131
- * Fix: Record action links are back ([#773](https://github.com/xwp/stream/pull/773))
132
- * Fix: Jetpack is now able to connect without error while Stream is active ([#768](https://github.com/xwp/stream/pull/768))
133
- * Fix: Reset Filters text no longer wraps to a second line ([#765](https://github.com/xwp/stream/pull/765))
134
-
135
- Props [@lukecarbis](https://github.com/lukecarbis), Props [@sirjonathan](https://github.com/sirjonathan)
136
-
137
- ### 3.0.1 - September 2, 2015 ###
138
- * New: Stream and [User Switching](https://wordpress.org/plugins/user-switching/) are now besties ([#744](https://github.com/xwp/stream/pull/744))
139
- * New: You can now choose to keep your records indefinitely (probably not a good idea) ([#748](https://github.com/xwp/stream/pull/748))
140
- * Tweak: We're now using local styles for our datepicker, instead of loading them externally ([#751](https://github.com/xwp/stream/pull/751))
141
- * Fix: Updating from version 1.4.9 no longer breaks your records ([#749](https://github.com/xwp/stream/pull/749))
142
- * Fix: Stream now works with custom wp-content folder locations ([#745](https://github.com/xwp/stream/pull/745))
143
- * Fix: Live updates work again ([#739](https://github.com/xwp/stream/pull/739))
144
-
145
- Props [@lukecarbis](https://github.com/lukecarbis), [@johnbillion](https://github.com/johnbillion), [@rob](https://github.com/rob)
146
-
147
- ### 3.0.0 - August 25, 2015 ###
148
- * New: Activity logs are now stored locally in WordPress. No data is sent externally and no registration required.
149
- * New: Migration process for Stream 2 users to move records out of the cloud, and into your local database.
150
- * New: Various measures and database schema changes to improve Stream's performance.
151
- * Removed: Notifications and Reports have been removed to be reworked for an upcoming release.
152
-
153
- Props [@fjarrett](https://github.com/fjarrett), [@lukecarbis](https://github.com/lukecarbis)
154
-
155
- ### 2.0.5 - April 23, 2015 ###
156
- * Tweak: Compatibility with split terms introduced in WordPress 4.2 ([#702](https://github.com/wp-stream/stream/issues/702))
157
- * Tweak: Add support for future and pending post transitions ([#716](https://github.com/wp-stream/stream/pull/716))
158
- * Tweak: Match new default admin colors introduced in WordPress 4.2 ([#718](https://github.com/wp-stream/stream/pull/718))
159
- * Fix: Compatibility issues with WP-Cron Control plugin and system crons ([#715](https://github.com/wp-stream/stream/issues/715))
160
- * Fix: Broken date range filter on Reports screen ([#717](https://github.com/wp-stream/stream/pull/717))
161
-
162
- Props [@fjarrett](https://github.com/fjarrett)
163
-
164
- ### 2.0.4 - April 16, 2015 ###
165
- * New: Add reset button to reset search filters ([#144](https://github.com/wp-stream/stream/issues/144))
166
- * Tweak: WP-CLI command output improvements via `--format` option for table view, JSON and CSV ([#705](https://github.com/wp-stream/stream/pull/705))
167
- * Tweak: Add link to https://wp-stream.com in README ([#709](https://github.com/wp-stream/stream/issues/709))
168
- * Tweak: Better highlighting on multiple live update rows
169
- * Tweak: Limit custom range datepickers based on the Stream plan type
170
- * Tweak: Limit legacy record migrations based on the Stream plan type
171
- * Fix: Allow properties with values of zero to be included in queries ([#698](https://github.com/wp-stream/stream/issues/698))
172
- * Fix: Properly return record success/failure in log and store methods ([#711](https://github.com/wp-stream/stream/issues/711))
173
-
174
- Props [@fjarrett](https://github.com/fjarrett), [@szepeviktor](https://github.com/szepeviktor)
175
-
176
- ### 2.0.3 - January 23, 2015 ###
177
- * New: WP-CLI command now available for querying records via the command line ([#499](https://github.com/wp-stream/stream/issues/499))
178
- * Tweak: Silently disable Stream during content import ([#672](https://github.com/wp-stream/stream/issues/672))
179
- * Tweak: Search results now ordered by date instead of relevance ([#689](https://github.com/wp-stream/stream/issues/689))
180
- * Fix: Handle boolean values appropriately during wp_stream_log_data filter ([#680](https://github.com/wp-stream/stream/issues/680))
181
- * Fix: Hook into external class load methods on init rather than plugins_loaded ([#686](https://github.com/wp-stream/stream/issues/686))
182
- * Fix: N/A user not working in exclude rules ([#688](https://github.com/wp-stream/stream/issues/688))
183
- * Fix: Prevent Notification Rule meta from being saved to all post types ([#693](https://github.com/wp-stream/stream/issues/693))
184
- * Fix: PHP warning shown for some users when deleting plugins ([#695](https://github.com/wp-stream/stream/issues/695))
185
-
186
- Props [@fjarrett](https://github.com/fjarrett)
187
-
188
- ### 2.0.2 - January 15, 2015 ###
189
- * New: Full record backtrace now available to developers for debugging ([#467](https://github.com/wp-stream/stream/issues/467))
190
- * New: Unread count badge added to Stream menu, opt-out available in User Profile ([#588](https://github.com/wp-stream/stream/issues/588))
191
- * New: Stream connector to track Stream-specific contexts and actions ([#622](https://github.com/wp-stream/stream/issues/622))
192
- * Tweak: Inherit role access from Stream Settings for Notifications and Reports ([#641](https://github.com/wp-stream/stream/issues/641))
193
- * Tweak: Opt-in required for Akismet tracking ([#649](https://github.com/wp-stream/stream/issues/649))
194
- * Tweak: Ignore comments deleted when deleting parent post ([#652](https://github.com/wp-stream/stream/issues/652))
195
- * Tweak: Opt-in required for comment flood tracking ([#656](https://github.com/wp-stream/stream/issues/656))
196
- * Tweak: Opt-in required for WP Cron tracking ([#673](https://github.com/wp-stream/stream/issues/673))
197
- * Fix: Post revision action link pointing to wrong revision ID ([#585](https://github.com/wp-stream/stream/issues/585))
198
- * Fix: PHP warnings caused by Menu connector ([#663](https://github.com/wp-stream/stream/issues/663))
199
- * Fix: Non-static method called statically in WPSEO connector ([#668](https://github.com/wp-stream/stream/issues/668))
200
- * Fix: Prevent live updates from tampering with filtered results ([#675](https://github.com/wp-stream/stream/issues/675))
201
-
202
- Props [@fjarrett](https://github.com/fjarrett), [@lukecarbis](https://github.com/lukecarbis), [@shadyvb](https://github.com/shadyvb), [@jonathanbardo](https://github.com/jonathanbardo), [@westonruter](https://github.com/westonruter)
203
-
204
- ### 2.0.1 - September 30, 2014 ###
205
- * Tweak: Improved localisation strings throughout the plugin ([#644](https://github.com/wp-stream/stream/pull/644))
206
- * Tweak: Improved tooltip text explaining WP.com sign in
207
- * Fix: ACF Pro doesn't save custom field values when Stream enabled ([#642](https://github.com/wp-stream/stream/issues/642))
208
-
209
- Props [@lukecarbis](https://github.com/lukecarbis), [@fjarrett](https://github.com/fjarrett)
210
-
211
- ### 2.0.0 - September 27, 2014 ###
212
- * All activity is now stored only in the cloud over SSL, local MySQL storage dependence is over!
213
- * Connector and Context have merged in the UI, now just called Contexts
214
- * The Exclude Rules UI has been completely revamped
215
- * Notifications and Reports are now conveniently built into Stream for Pro subscribers
216
- * Connectors for tracking other popular plugins are now built into Stream, like BuddyPress, Jetpack, Gravity Forms, and more...
217
- * You create an account for Stream simply by signing in with your WordPress.com ID
218
-
219
- **NOTE:** Multisite view of all activity records in the Network Admin has been removed in this release. If you require this feature, please do not update Stream until version 2.1.0 is released.
220
-
221
- Props [@fjarrett](https://github.com/fjarrett), [@lukecarbis](https://github.com/lukecarbis), [@shadyvb](https://github.com/shadyvb), [@chacha](https://github.com/chacha), [@jonathanbardo](https://github.com/jonathanbardo), [@bordoni](https://github.com/bordoni), [@dero](https://github.com/dero), [@jeffmatson](https://github.com/jeffmatson), [@stipsan](https://github.com/stipsan), [@c3mdigital](https://github.com/c3mdigital), [@adamsilverstein](https://github.com/adamsilverstein), [@westonruter](https://github.com/westonruter), [@japh](https://github.com/japh), [@solace](https://github.com/solace), [@johnbillion](https://github.com/johnbillion)
222
-
223
- ### 1.4.9 - July 23, 2014 ###
224
- * Fix: Revert delayed log mechanism for post transition ([#585](https://github.com/x-team/wp-stream/issues/585))
225
- * Fix: Revert usage of get_taxonomy() ([#586](https://github.com/x-team/wp-stream/pull/586))
226
- * Fix: Notices not firing on correct action ([#589](https://github.com/x-team/wp-stream/issues/589))
227
-
228
- Props [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
229
-
230
- ### 1.4.8 - July 18, 2014 ###
231
- * New: Greatly improved widget tracking, including changes performed in Customizer ([#391](https://github.com/x-team/wp-stream/pull/391))
232
- * New: Now tracking when Akismet automatically marks comments as spam ([#587](https://github.com/x-team/wp-stream/pull/587))
233
- * Tweak: Log WP-CLI details to Stream author meta ([#470](https://github.com/x-team/wp-stream/issues/470))
234
- * Tweak: Track changes to options more deeply ([#573](https://github.com/x-team/wp-stream/pull/573))
235
- * Fix: Labels not seen for CPT registered on init with default priority ([#565](https://github.com/x-team/wp-stream/issues/565))
236
- * Fix: Stream menu appearing in Network menu when not network activated ([#582](https://github.com/x-team/wp-stream/issues/582))
237
- * Fix: Post Revision ID associated to record is not the most recent one ([#585](https://github.com/x-team/wp-stream/issues/585))
238
- * Fix: Incorrect action label for comment throttling ([#591](https://github.com/x-team/wp-stream/issues/591))
239
-
240
- Props [@westonruter](https://github.com/westonruter), [@fjarrett](https://github.com/fjarrett), [@shadyvb](https://github.com/shadyvb), [@lukecarbis](https://github.com/lukecarbis), [@chacha](https://github.com/chacha)
241
-
242
- ### 1.4.7 - June 27, 2014 ###
243
- * New: Comment Type support added to the Comments connector ([#558](https://github.com/x-team/wp-stream/issues/558))
244
- * Fix: Datepicker opens again with each paged view ([#568](https://github.com/x-team/wp-stream/issues/568))
245
- * Fix: PHP warning when deleting network users ([#579](https://github.com/x-team/wp-stream/issues/579))
246
- * Fix: Track user count setting changes ([#583](https://github.com/x-team/wp-stream/issues/583))
247
- * Fix: .po and .pot files out-of-date for translators ([#584](https://github.com/x-team/wp-stream/issues/584))
248
-
249
- Props [@lukecarbis](https://github.com/lukecarbis), [@fjarrett](https://github.com/fjarrett), [@bordoni](https://github.com/bordoni), [@shadyvb](https://github.com/shadyvb)
250
-
251
- ### 1.4.6 - May 30, 2014 ###
252
- * Tweak: Actions provided for trashed posts are irrelevant ([#523](https://github.com/x-team/wp-stream/issues/523))
253
- * Tweak: Use core language pack translations where possible ([#534](https://github.com/x-team/wp-stream/issues/534))
254
- * Tweak: Consolidate show filter and show column screen options ([#542](https://github.com/x-team/wp-stream/issues/542))
255
- * Tweak: Stop tracking failed login attempts ([#547](https://github.com/x-team/wp-stream/issues/547))
256
- * Tweak: Remove all uses of extract() from Stream ([#556](https://github.com/x-team/wp-stream/issues/556))
257
- * Fix: Excluding roles is not handled properly ([#527](https://github.com/x-team/wp-stream/issues/527))
258
- * Fix: Stream runs install routine twice ([#528](https://github.com/x-team/wp-stream/issues/528))
259
- * Fix: Widget records show sidebar slug instead of label ([#531](https://github.com/x-team/wp-stream/issues/531))
260
- * Fix: Fatal error when PHP version is less than 5.3 ([#538](https://github.com/x-team/wp-stream/issues/538))
261
- * Fix: Cannot exclude Custom Background context ([#543](https://github.com/x-team/wp-stream/issues/543))
262
- * Fix: Conflict with Jetpack body class in WP Admin ([#545](https://github.com/x-team/wp-stream/issues/545))
263
- * Fix: Stream settings exclude error for big wp_users table ([#551](https://github.com/x-team/wp-stream/issues/551))
264
-
265
- Props [@fjarrett](https://github.com/fjarrett), [@lukecarbis](https://github.com/lukecarbis), [@shadyvb](https://github.com/shadyvb), [@barryceelen](https://github.com/barryceelen), [@japh](https://github.com/japh)
266
-
267
- ### 1.4.5 - May 15, 2014 ###
268
- * New: Lightweight frontend indicator for sites using Stream ([#507](https://github.com/x-team/wp-stream/issues/507))
269
- * Tweak: Add filterable method for excluded comment types ([#487](https://github.com/x-team/wp-stream/issues/487))
270
- * Tweak: Rename "ID" column label to "Record ID" ([#490](https://github.com/x-team/wp-stream/issues/490))
271
- * Tweak: One admin notice for any missing DB tables ([#506](https://github.com/x-team/wp-stream/pull/506))
272
- * Fix: Custom authentication schemes not tracking user logins correctly ([#434](https://github.com/x-team/wp-stream/issues/434))
273
- * Fix: Taxonomy connector conflicts with Edit Flow plugin ([#498](https://github.com/x-team/wp-stream/issues/498))
274
- * Fix: Switching user is incorrectly tracked ([#501](https://github.com/x-team/wp-stream/issues/501))
275
- * Fix: Extension activation links broken when plugin folders are renamed ([#502](https://github.com/x-team/wp-stream/issues/502))
276
- * Fix: Author info showing up incorrectly ([#505](https://github.com/x-team/wp-stream/issues/505))
277
- * Fix: Incompatibility with multi-server environments ([#517](https://github.com/x-team/wp-stream/issues/517))
278
- * Fix: Warnings seen when Show Avatars is disabled ([#518](https://github.com/x-team/wp-stream/issues/518))
279
- * Fix: Notices for non-existent extension data after timeout ([#529](https://github.com/x-team/wp-stream/pull/529))
280
-
281
- Props [@fjarrett](https://github.com/fjarrett), [@shadyvb](https://github.com/shadyvb), [@lukecarbis](https://github.com/lukecarbis), [@japh](https://github.com/japh)
282
-
283
- ### 1.4.4 - May 6, 2014 ###
284
- * New: Admin pointers to highlight when new admin screens are introduced ([#466](https://github.com/x-team/wp-stream/issues/466))
285
- * Tweak: Filter introduced to allow the Stream admin menu position to be changed ([#99](https://github.com/x-team/wp-stream/issues/99))
286
- * Tweak: Provide option label for records that show when the Stream database has updated ([#444](https://github.com/x-team/wp-stream/pull/444))
287
- * Tweak: Better handling of authors in the list table ([#448](https://github.com/x-team/wp-stream/pull/448))
288
- * Tweak: Way for developers to set their Stream Extensions affiliate ID on links from the Extensions screen ([#482](https://github.com/x-team/wp-stream/issues/482))
289
- * Fix: Extensions screen CSS bug in Firefox ([#464](https://github.com/x-team/wp-stream/issues/464))
290
- * Fix: Error when installing extensions from the Network Admin ([#491](https://github.com/x-team/wp-stream/issues/491))
291
- * Fix: Undefined notice in admin.php ([#468](https://github.com/x-team/wp-stream/issues/468))
292
-
293
- Props [@westonruter](https://github.com/westonruter), [@fjarrett](https://github.com/fjarrett), [@japh](https://github.com/japh), [@lukecarbis](https://github.com/lukecarbis), [@jonathanbardo](https://github.com/jonathanbardo), [@bordoni](https://github.com/bordoni)
294
-
295
- ### 1.4.3 - April 26, 2014 ###
296
- * New: Introducing the Stream Extensions screen! ([#396](https://github.com/x-team/wp-stream/issues/396))
297
-
298
- Props [@jonathanbardo](https://github.com/jonathanbardo), [@lukecarbis](https://github.com/lukecarbis), [@shadyvb](https://github.com/shadyvb), [@c3mdigital](https://github.com/c3mdigital), [@fjarrett](https://github.com/fjarrett)
299
-
300
- ### 1.4.2 - April 24, 2014 ###
301
- * Fix: Update Database button redirecting to previous screen ([#443](https://github.com/x-team/wp-stream/issues/443))
302
- * Fix: Update routine hotfix that was causing records to disappear ([#447](https://github.com/x-team/wp-stream/issues/447))
303
-
304
- Props [@jonathanbardo](https://github.com/jonathanbardo), [@lukecarbis](https://github.com/lukecarbis), [@westonruter](https://github.com/westonruter), [@fjarrett](https://github.com/fjarrett)
305
-
306
- ### 1.4.1 - April 24, 2014 ###
307
- * Fix: Scripts and styles not using Stream version number ([#440](https://github.com/x-team/wp-stream/issues/440))
308
- * Fix: WP-CLI incorrectly referenced in records ([#441](https://github.com/x-team/wp-stream/issues/441))
309
-
310
- Props [@westonruter](https://github.com/westonruter), [@fjarrett](https://github.com/fjarrett)
311
-
312
- ### 1.4.0 - April 24, 2014 ###
313
- * New: Multisite is now fully supported, activate Stream network-wide ([#65](https://github.com/x-team/wp-stream/issues/65))
314
- * New: Separate API for handling DB update routines ([#379](https://github.com/x-team/wp-stream/issues/379))
315
- * New: WP-CLI compatibility, Stream now tracks changes made via WP-CLI ([#423](https://github.com/x-team/wp-stream/issues/423))
316
- * Tweak: Deprecate functions and hooks in favor of consistent naming conventions ([#267](https://github.com/x-team/wp-stream/issues/267))
317
- * Tweak: Use icon link instead of clicking the summary to filter by object ID ([#380](https://github.com/x-team/wp-stream/issues/380))
318
- * Tweak: Save additional author meta for better records ([#389](https://github.com/x-team/wp-stream/issues/389))
319
- * Tweak: More compact search filters for smaller screens ([#403](https://github.com/x-team/wp-stream/issues/403))
320
- * Fix: Fix AJAX loading of authors in dropdown filters ([#49](https://github.com/x-team/wp-stream/issues/49))
321
- * Fix: Custom capability conflict with W3 Total Cache plugin ([#296](https://github.com/x-team/wp-stream/issues/296))
322
- * Fix: Live updates remove last item in activity table ([#386](https://github.com/x-team/wp-stream/issues/386))
323
- * Fix: Live updates screen option checkbox not persisting ([#392](https://github.com/x-team/wp-stream/issues/392))
324
- * Fix: IP validator not respecting zero ([#394](https://github.com/x-team/wp-stream/issues/394))
325
- * Fix: Non-Administrator users seeing errors in Settings records ([#406](https://github.com/x-team/wp-stream/issues/406))
326
- * Fix: Uninstall confirmation message doesn't display ([#411](https://github.com/x-team/wp-stream/issues/411))
327
- * Fix: TTL purge schedule is never setup ([#412](https://github.com/x-team/wp-stream/issues/412))
328
- * Fix: NextGen compability issue ([#416](https://github.com/x-team/wp-stream/issues/416))
329
- * Fix: Stream Feeds Key not being automatically generated ([#420](https://github.com/x-team/wp-stream/issues/420))
330
-
331
- Props [@fjarrett](https://github.com/fjarrett), [@lukecarbis](https://github.com/lukecarbis), [@c3mdigital](https://github.com/c3mdigital), [@westonruter](https://github.com/westonruter), [@shadyvb](https://github.com/shadyvb), [@powelski](https://github.com/powelski), [@johnregan3](https://github.com/johnregan3), [@jonathanbardo](https://github.com/jonathanbardo), [@desaiuditd](https://github.com/desaiuditd)
332
-
333
- ### 1.3.1 - April 3, 2014 ###
334
- * New: Theme Editor connector for tracking changes made to theme files ([#313](https://github.com/x-team/wp-stream/issues/313))
335
- * New: Additional screen options to show/hide only the filters you care about ([#329](https://github.com/x-team/wp-stream/issues/329))
336
- * New: Visibility option in Exclude settings to hide past records from view ([#355](https://github.com/x-team/wp-stream/issues/355))
337
- * New: Stream Activity dashboard widget now supports live updates ([#356](https://github.com/x-team/wp-stream/issues/356))
338
- * New: Hover authors to reveal a tooltip with helpful user meta ([#338](https://github.com/x-team/wp-stream/issues/338))
339
- * New: Hover roles to reveal a tooltip with the number of authors assigned to that role ([#377](https://github.com/x-team/wp-stream/issues/377))
340
- * Tweak: Future dates now disabled in Start date field datepicker ([#334](https://github.com/x-team/wp-stream/issues/334))
341
- * Tweak: Now showing user Gravatars in Exclude Authors & Roles settings field ([#333](https://github.com/x-team/wp-stream/issues/333))
342
- * Tweak: ID column is now hidden by default in Screen Options ([#348](https://github.com/x-team/wp-stream/issues/348))
343
- * Tweak: Widget updated summary message improvement ([8818976](https://github.com/x-team/wp-stream/commit/88189761d4a8836038e8d9ec348096a0aab3072d))
344
- * Fix: Autocomplete not working correctly in Exclude IP Addressees settings field ([#335](https://github.com/x-team/wp-stream/issues/335))
345
- * Fix: Reset Stream Database link not clearing everything in all cases ([#347](https://github.com/x-team/wp-stream/issues/347))
346
- * Fix: PHP 5.3.3 compatibility issue with filter constant ([#351](https://github.com/x-team/wp-stream/issues/351))
347
- * Fix: Predefined date range intervals not honoring the site timezone setting ([#353](https://github.com/x-team/wp-stream/issues/353))
348
- * Fix: wpdb::prepare() notice appearing in WordPress 3.9 ([#354](https://github.com/x-team/wp-stream/issues/354))
349
- * Fix: Invalid argument warning thrown on fresh installations of WordPress ([#358](https://github.com/x-team/wp-stream/issues/358))
350
- * Fix: Record TTL purge not functioning correctly ([#371](https://github.com/x-team/wp-stream/issues/371))
351
- * Fix: Small CSS bug in jQuery UI datepicker skins ([04c80af](https://github.com/x-team/wp-stream/commit/04c80afa99486086612be9f6ad83148dfbbe533a))
352
-
353
- Props [@powelski](https://github.com/powelski), [@fjarrett](https://github.com/fjarrett), [@jonathanbardo](https://github.com/jonathanbardo), [@faishal](https://github.com/faishal), [@desaiuditd](https://github.com/desaiuditd), [@lukecarbis](https://github.com/lukecarbis), [@johnregan3](https://github.com/johnregan3), [@Powdered-Toast-Man](https://github.com/Powdered-Toast-Man)
354
-
355
- ### 1.3.0 - March 12, 2014 ###
356
- * New: Exclude tab in Settings to prevent specific types of activity from being tracked ([#251](https://github.com/x-team/wp-stream/issues/251))
357
- * New: Now logging Custom Background and Custom Header changes ([#309](https://github.com/x-team/wp-stream/issues/309))
358
- * New: Predefined date intervals now available when filtering records ([#320](https://github.com/x-team/wp-stream/issues/320))
359
- * Tweak: Action links are now available for Stream Settings records ([#305](https://github.com/x-team/wp-stream/issues/305))
360
- * Tweak: User avatars now displayed in Authors dropdown filter ([#311](https://github.com/x-team/wp-stream/issues/311))
361
- * Tweak: Live updates are enabled by default for new installs ([#312](https://github.com/x-team/wp-stream/issues/312))
362
- * Fix: Fallback to the term slug if a label does not exist in list-table ([#214](https://github.com/x-team/wp-stream/issues/214))
363
- * Fix: Widget sorting is now being tracked properly as well as Inactive widgets ([#283](https://github.com/x-team/wp-stream/issues/283))
364
- * Fix: Superfluous auto-draft posts are now prevented from being logged ([#293](https://github.com/x-team/wp-stream/issues/293))
365
-
366
- Props [@powelski](https://github.com/powelski), [@faishal](https://github.com/faishal), [@fjarrett](https://github.com/fjarrett), [@desaiuditd](https://github.com/desaiuditd), [@lukecarbis](https://github.com/lukecarbis), [@shadyvb](https://github.com/shadyvb)
367
-
368
- ### 1.2.9 - March 8, 2014 ###
369
- Fixes bug that caused media uploads to fail on new posts. Props [@fjarrett](https://github.com/fjarrett)
370
-
371
- ### 1.2.8 - March 7, 2014 ###
372
- Use attachment type as context in Media connector. Bug fixes. Props [@lukecarbis](https://github.com/lukecarbis), [@powelski](https://github.com/powelski), [@fjarrett](https://github.com/fjarrett)
373
-
374
- ### 1.2.7 - March 4, 2014 ###
375
- Pagination added to Stream Activity dashboard widget. Bug fixes. Props [@chacha](https://github.com/chacha), [@fjarrett](https://github.com/fjarrett)
376
-
377
- ### 1.2.6 - February 28, 2014 ###
378
- Improved context names in Users connector. Props [@powelski](https://github.com/powelski)
379
-
380
- ### 1.2.5 - February 27, 2014 ###
381
- Use sidebar area names as context in Widgets connector. Bug fixes. Props [@desaiuditd](https://github.com/desaiuditd), [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett), [@bordoni](https://github.com/bordoni)
382
-
383
- ### 1.2.4 - February 25, 2014 ###
384
- Use post type names as context in Comments connector. German translation update. Bug fixes. Props [@powelski](https://github.com/powelski), [@kucrut](https://github.com/kucrut), [@pascalklaeres](https://github.com/pascal-klaeres), [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
385
-
386
- ### 1.2.3 - February 21, 2014 ###
387
- Replacement function for filter_input family to avoid PHP bug. Filter added to main Stream query. Bug fixes. Props [@shadyvb](https://github.com/shadyvb), [@powelski](https://github.com/powelski), [@fjarrett](https://github.com/fjarrett)
388
-
389
- ### 1.2.2 - February 19, 2014 ###
390
- Prevent records of disabled connectors from appearing in the Stream. Bug fixes. Props [@kucrut](https://github.com/kucrut), [@johnregan3](https://github.com/johnregan3)
391
-
392
- ### 1.2.1 - February 17, 2014 ###
393
- Translation updates. Langage packs for pt_BR and id_ID. Bug fixes. Props [@kucrut](https://github.com/kucrut), [@shadyvb](https://github.com/shadyvb), [@bordoni](https://github.com/bordoni), [@powelski](https://github.com/powelski), [omniwired](https://github.com/omniwired), [@fjarrett](https://github.com/fjarrett)
394
-
395
- ### 1.2.0 - February 12, 2014 ###
396
- Awesome datepicker styles. Performance optimizations. Bug fixes. Props [@johnregan3](https://github.com/johnregan3), [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett), [@jonathanbardo](https://github.com/jonathanbardo)
397
-
398
- ### 1.1.9 - February 10, 2014 ###
399
- Load authors filter using AJAX if there are more than 50. Props [@powelski](https://github.com/powelski)
400
-
401
- ### 1.1.8 - February 9, 2014 ###
402
- Bug fixes. Props [@shadyvb](https://github.com/shadyvb)
403
-
404
- ### 1.1.7 - February 6, 2014 ###
405
- Upgrade routine for IPv6 support. Persist tab selection after saving Stream Settings. Props [@shadyvb](https://github.com/shadyvb), [dero](https://github.com/dero)
406
-
407
- ### 1.1.6 - February 6, 2014 ###
408
- Sortable columns bug fix on the records screen. Props [@powelski](https://github.com/powelski), [@fjarrett](https://github.com/fjarrett)
409
-
410
- ### 1.1.5 - February 5, 2014 ###
411
- Fixed a class scope bug [reported in the support forum](https://wordpress.org/support/topic/temporary-fatal-error-after-upgrade-113) that was causing a fatal error on some installs. Props [@shadyvb](https://github.com/shadyvb)
412
-
413
- ### 1.1.4 - February 5, 2014 ###
414
- Highlight changed settings field feature. DB upgrade routine for proper utf-8 charset. Various bug fixes. Props [@powelski](https://github.com/powelski), [@johnregan3](https://github.com/johnregan3), [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
415
-
416
- ### 1.1.3 - February 4, 2014 ###
417
- Upgrade routine for IP column in DB. Serialized option parsing for Stream Settings records. Purge records immediately when TTL is set backwards in Stream Settings. Various bug fixes. Props [@shadyvb](https://github.com/shadyvb), [@powelski](https://github.com/powelski), [@fjarrett](https://github.com/fjarrett)
418
-
419
- ### 1.1.2 - February 2, 2014 ###
420
- Bug fix for list table notice on new installations. Props [@shadyvb](https://github.com/shadyvb)
421
-
422
- ### 1.1.0 - January 31, 2014 ###
423
- Disable terms in dropdown filters for which records do not exist. Props [@johnregan3](https://github.com/johnregan3)
424
-
425
- ### 1.0.9 - January 31, 2014 ###
426
- Several important bug fixes. Props [@shadyvb](https://github.com/shadyvb)
427
-
428
- ### 1.0.8 - January 30, 2014 ###
429
- Bug fix for sites using BuddyPress. Props [@johnregan3](https://github.com/johnregan3)
430
-
431
- ### 1.0.7 - January 29, 2014 ###
432
- Code efficiency improvements when fetching admin area URLs. Props [@fjarrett](https://github.com/fjarrett)
433
-
434
- ### 1.0.6 - January 28, 2014 ###
435
- Query improvements, default connector interface, hook added for general settings fields. Bug fixes. Props [dero](https://github.com/dero), [@jonathanbardo](https://github.com/jonathanbardo), [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
436
-
437
- ### 1.0.5 - January 27, 2014 ###
438
- Bug fix for live updates breaking columns when some are hidden via Screen Options. Props [@johnregan3](https://github.com/johnregan3)
439
-
440
- ### 1.0.4 - January 23, 2014 ###
441
- Language pack for Polish. Bug fixes. Props [@powelski](https://github.com/powelski), [@fjarrett](https://github.com/fjarrett), [@johnregan3](https://github.com/johnregan3), [@kucrut](https://github.com/kucrut)
442
-
443
- ### 1.0.3 - January 19, 2014 ###
444
- Language pack for Spanish. Bug fixes. Props [omniwired](https://github.com/omniwired), [@shadyvb](https://github.com/shadyvb)
445
-
446
- ### 1.0.2 - January 15, 2014 ###
447
- Ensure the dashboard widget repects the Role Access setting. Props [@fjarrett](https://github.com/fjarrett)
448
-
449
- ### 1.0.1 - January 15, 2014 ###
450
- Require nonce for generating a new user feed key. Props [@johnregan3](https://github.com/johnregan3)
451
-
452
- ### 1.0.0 - January 13, 2014 ###
453
- Allow list table to be exensible. Hook added to prevent tables from being created, if desired. Props [@johnregan3](https://github.com/johnregan3), [@fjarrett](https://github.com/fjarrett), [@jonathanbardo](https://github.com/jonathanbardo)
454
-
455
- ### 0.9.9 - January 8, 2014 ###
456
- Updated screenshot assets and descriptions. Props [@fjarrett](https://github.com/fjarrett)
457
-
458
- ### 0.9.8 - January 1, 2014 ###
459
- Support for live updates in the Stream. Bug fixes. Props [@jonathanbardo](https://github.com/jonathanbardo), [@johnregan3](https://github.com/johnregan3), [@fjarrett](https://github.com/fjarrett)
460
-
461
- ### 0.9.7 - December 29, 2013 ###
462
- Plugin version available as a constant. Bug fixes. Props [@jonathanbardo](https://github.com/jonathanbardo), [@fjarrett](https://github.com/fjarrett)
463
-
464
- ### 0.9.6 - December 29, 2013 ###
465
- Use menu name as context in Menus connector. Warning if required DB tables are missing. Bug fixes. Props [@jonathanbardo](https://github.com/jonathanbardo), [@fjarrett](https://github.com/fjarrett), [@topher1kenobe](https://github.com/topher1kenobe)
466
-
467
- ### 0.9.5 - December 22, 2013 ###
468
- WordPress context added to Installer connector for core updates. Props [@shadyvb](https://github.com/shadyvb)
469
-
470
- ### 0.9.3 - December 22, 2013 ###
471
- Replacing Chosen library with Select2. Bug fixes. Props [@kucrut](https://github.com/kucrut), [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
472
-
473
- ### 0.9.2 - December 22, 2013 ###
474
- Added support for private feeds in JSON format. Flush rewrite rules automatically for feeds when enabled/disabled. Bug fixes. Props [@jonathanbardo](https://github.com/jonathanbardo), [@fjarrett](https://github.com/fjarrett)
475
-
476
- ### 0.9.1 - December 21, 2013 ###
477
- Specify which roles should have their activity logged. Delete all options on uninstall. Bug fixes. Props [@jonathanbardo](https://github.com/jonathanbardo), [@fjarrett](https://github.com/fjarrett)
478
-
479
- ### 0.9.0 - December 20, 2013 ###
480
- Added connector for Comments. Stream activity dashboard widget. UI enhancements. Bug fixes. Props [@jonathanbardo](https://github.com/jonathanbardo), [@fjarrett](https://github.com/fjarrett), [@shadyvb](https://github.com/shadyvb), [@topher1kenobe](https://github.com/topher1kenobe)
481
-
482
- ### 0.8.2 - December 19, 2013 ###
483
- Language packs for French and German. Option to uninstall database tables. Bug fixes. Props [@jonathanbardo](https://github.com/jonathanbardo), [@fjarrett](https://github.com/fjarrett), [@topher1kenobe](https://github.com/topher1kenobe), [@pascalklaeres](https://github.com/pascal-klaeres)
484
-
485
- ### 0.8.1 - December 18, 2013 ###
486
- Setting to enable/disable private feeds functionality. Additional record logged when a user's role is changed. Bug fixes. Props [@fjarrett](https://github.com/fjarrett), [@kucrut](https://github.com/kucrut), [@topher1kenobe](https://github.com/topher1kenobe), [@justinsainton](https://github.com/justinsainton)
487
-
488
- ### 0.8.0 - December 16, 2013 ###
489
- Ability to query Stream records in a private RSS feed. Bug fixes. Props [@fjarrett](https://github.com/fjarrett), [@shadyvb](https://github.com/shadyvb)
490
-
491
- ### 0.7.3 - December 13, 2013 ###
492
- Bug fix for Role Access option. Props [@fjarrett](https://github.com/fjarrett)
493
-
494
- ### 0.7.2 - December 12, 2013 ###
495
- Bug fixes for the Installer connector. Props [@shadyvb](https://github.com/shadyvb)
496
-
497
- ### 0.7.1 - December 12, 2013 ###
498
- Hotfix to remove PHP 5.4-only syntax. Role Access option added to Settings. Props [@kucrut](https://github.com/kucrut)
499
-
500
- ### 0.7.0 - December 11, 2013 ###
501
- Added connectors for Taxonomies and Settings. Bug fixes. Props [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
502
-
503
- ### 0.6.0 - December 9, 2013 ###
504
- UX improvements to manual DB purge. Cron event for user-defined TTL of records. Bug fixes. Props [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
505
-
506
- ### 0.5.0 - December 8, 2013 ###
507
- Require PHP 5.3 to activate plugin. Provide action links for records when applicable. Bug fixes. Props [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
508
-
509
- ### 0.4.0 - December 8, 2013 ###
510
- Improved support for pages and custom post types. Chosen for filter dropdowns. Pagination support in screen options. Bug fixes. Props [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
511
-
512
- ### 0.3.0 - December 7, 2013 ###
513
- Improved actions for Users context. Action for edited images in Media context. Bug fixes in Menus context. Props [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett), [@akeda](https://github.com/gedex)
514
-
515
- ### 0.2.0 - December 6, 2013 ###
516
- Second iteration build using custom tables data model. First public release. Props [@shadyvb](https://github.com/shadyvb), [@fjarrett](https://github.com/fjarrett)
517
-
518
- ### 0.1.0 ###
519
- Initial concept built using custom post type/taxonomies as the data model. Props [@shadyvb](https://github.com/shadyvb)
520
-
521
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -1,21 +1,23 @@
1
  === Stream ===
2
- Contributors: fjarrett, lukecarbis, shadyvb, westonruter, stream, xwp
3
- Tags: actions, activity, activity log, activity logs, admin actions, analytics, audit, audit log, audit logs, change, changes, dashboard, log, logs, stream, tracking, troubleshooting, wp stream
4
  Requires at least: 3.9
5
  Tested up to: 4.5
6
- Stable tag: 3.0.5
7
  License: GPLv2 or later
8
  License URI: https://www.gnu.org/licenses/gpl-2.0.html
9
 
10
- Stream is the easiest and safest way to track content changes happening to your WordPress site and then view them in beautifully organized detail.
11
 
12
  == Description ==
13
 
14
- Never be in the dark about WP Admin activity again.
15
 
16
- Stream allows you to know exactly when changes to your site have been made, and more importantly, who did them.
17
 
18
- Every logged-in user action is displayed in an activity stream and organized for easy filtering by User, Role, Context, Action and IP address.
 
 
19
 
20
  **Built-In Tracking Integrations For Popular Plugins:**
21
 
@@ -55,8 +57,8 @@ Every logged-in user action is displayed in an activity stream and organized for
55
  * Multisite view of all activity records on a network
56
  * Limit who can view user activity records by user role
57
  * Set exclude rules to ignore certain kinds of user activity
58
- * Live update of user activity records in the Stream
59
- * Support for IPv6 addresses
60
  * WP-CLI command for querying records
61
 
62
  **See room for improvement?**
@@ -67,7 +69,7 @@ Great! There are several ways you can get involved to help make Stream better:
67
  2. **Suggest New Features:** Have an awesome idea? Please share it! Simply [create a new topic](https://wordpress.org/support/plugin/stream) in the plugin forum to express your thoughts on why the feature should be included and get a discussion going around your idea.
68
  3. **Issue Pull Requests:** If you're a developer, the easiest way to get involved is to help out on [issues already reported](https://github.com/x-team/wp-stream/issues) in GitHub. Be sure to check out the [contributing guide](https://github.com/x-team/wp-stream/blob/master/contributing.md) for developers.
69
 
70
- Thank you for wanting to make Stream better for everyone! We salute you.
71
 
72
  == Screenshots ==
73
 
@@ -77,6 +79,17 @@ Thank you for wanting to make Stream better for everyone! We salute you.
77
 
78
  == Changelog ==
79
 
 
 
 
 
 
 
 
 
 
 
 
80
  = 3.0.5 - March 15, 2015 =
81
 
82
  * New: Export your Stream records as CSV or JSON. ([#823](https://github.com/xwp/stream/pull/823))
1
  === Stream ===
2
+ Contributors: fjarrett, lukecarbis, shadyvb, powelski, chacha102, stream, xwp
3
+ Tags: actions, activity, activity log, activity logs, admin actions, analytics, audit, audit log, audit logs, blackbox, black box, change, changes, dashboard, log, logs, stream, tracking, troubleshooting, wp stream
4
  Requires at least: 3.9
5
  Tested up to: 4.5
6
+ Stable tag: 3.0.6
7
  License: GPLv2 or later
8
  License URI: https://www.gnu.org/licenses/gpl-2.0.html
9
 
10
+ Planes have a black box, WordPress has Stream. When something goes wrong, you need to know how it happened.
11
 
12
  == Description ==
13
 
14
+ With Stream, you're never left in the dark about WordPress Admin activity.
15
 
16
+ Every logged-in user action is displayed in an activity stream and organised for easy filtering by User, Role, Context, Action or IP address.
17
 
18
+ For advanced users, Stream also supports a Multisite view of all activity records on your network, the ability to set exclude rules to ignore certain kinds of user activity, and a WP‑CLI command for querying records.
19
+
20
+ Stream is perfect for keeping tabs on your clients. When something breaks, Stream is there to help. See what changed and who changed it.
21
 
22
  **Built-In Tracking Integrations For Popular Plugins:**
23
 
57
  * Multisite view of all activity records on a network
58
  * Limit who can view user activity records by user role
59
  * Set exclude rules to ignore certain kinds of user activity
60
+ * Live updates of user activity records in the Stream
61
+ * Export your Activity Stream as a CSV or JSON file
62
  * WP-CLI command for querying records
63
 
64
  **See room for improvement?**
69
  2. **Suggest New Features:** Have an awesome idea? Please share it! Simply [create a new topic](https://wordpress.org/support/plugin/stream) in the plugin forum to express your thoughts on why the feature should be included and get a discussion going around your idea.
70
  3. **Issue Pull Requests:** If you're a developer, the easiest way to get involved is to help out on [issues already reported](https://github.com/x-team/wp-stream/issues) in GitHub. Be sure to check out the [contributing guide](https://github.com/x-team/wp-stream/blob/master/contributing.md) for developers.
71
 
72
+ Thank you for wanting to make Stream better for everyone!
73
 
74
  == Screenshots ==
75
 
79
 
80
  == Changelog ==
81
 
82
+ = 3.0.6 - April 31, 2015 =
83
+
84
+ * New: Better support for default themes ([#831](https://github.com/xwp/stream/pull/831))
85
+ * New: Upgrade filter menus to Select2 4 ([c3f6c65](https://github.com/xwp/stream/pull/c3f6c65c1bd95cebb26da7f00a720050a9144586))
86
+ * Fix: Security Fixes
87
+ * Fix: Cron for purging old records has been fixed ([#843](https://github.com/xwp/stream/pull/843))
88
+ * Fix: Better at storing records for Super Admins ([#835](https://github.com/xwp/stream/pull/835))
89
+ * Fix: Allow Super Admins to be ignored and filtered ([#835](https://github.com/xwp/stream/pull/835))
90
+
91
+ Props [@chacha](https://github.com/chacha), [@lukecarbis](https://github.com/lukecarbis), [@Stayallive](https://github.com/Stayallive), [@barryceelen](https://github.com/barryceelen), Jonathan Desrosiers, [@marcin-lawrowski](https://github.com/marcin-lawrowski)
92
+
93
  = 3.0.5 - March 15, 2015 =
94
 
95
  * New: Export your Stream records as CSV or JSON. ([#823](https://github.com/xwp/stream/pull/823))
stream.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Stream
4
  * Plugin URI: https://wp-stream.com/
5
  * Description: Stream tracks logged-in user activity so you can monitor every change made on your WordPress site in beautifully organized detail. All activity is organized by context, action and IP address for easy filtering. Developers can extend Stream with custom connectors to log any kind of action.
6
- * Version: 3.0.5
7
  * Author: XWP
8
  * Author URI: https://xwp.co/
9
  * License: GPLv2+
3
  * Plugin Name: Stream
4
  * Plugin URI: https://wp-stream.com/
5
  * Description: Stream tracks logged-in user activity so you can monitor every change made on your WordPress site in beautifully organized detail. All activity is organized by context, action and IP address for easy filtering. Developers can extend Stream with custom connectors to log any kind of action.
6
+ * Version: 3.0.6
7
  * Author: XWP
8
  * Author URI: https://xwp.co/
9
  * License: GPLv2+
tests/bootstrap.php DELETED
@@ -1,23 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- // Use in code to trigger custom actions
5
- define( 'WP_STREAM_TESTS', true );
6
- define( 'WP_STREAM_DEV_DEBUG', true );
7
-
8
- $_tests_dir = getenv('WP_TESTS_DIR');
9
- if ( ! $_tests_dir ) {
10
- $_tests_dir = '/tmp/wordpress-tests-lib/';
11
- }
12
- require_once $_tests_dir . '/includes/functions.php';
13
-
14
- tests_add_filter(
15
- 'muplugins_loaded',
16
- function() {
17
- // Manually load plugin
18
- require dirname( dirname( __FILE__ ) ) . '/stream.php';
19
- }
20
- );
21
-
22
- require getenv( 'WP_TESTS_DIR' ) . '/includes/bootstrap.php';
23
- require dirname( __FILE__ ) . '/testcase.php';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/testcase.php DELETED
@@ -1,74 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class WP_StreamTestCase extends \WP_UnitTestCase {
5
- /**
6
- * Holds the plugin base class
7
- *
8
- * @var Plugin
9
- */
10
- protected $plugin;
11
-
12
- /**
13
- * Custom action prefix for test custom triggered actions
14
- * @var string
15
- */
16
- protected $action_prefix = 'wp_stream_test_';
17
-
18
- /**
19
- * PHP unit setup function
20
- *
21
- * @return void
22
- */
23
- function setUp() {
24
- parent::setUp();
25
- $this->plugin = $GLOBALS['wp_stream'];
26
- $this->assertNotEmpty( $this->plugin );
27
- }
28
-
29
- /**
30
- * Make sure the plugin is initialized with it's global variable
31
- *
32
- * @return void
33
- */
34
- public function test_plugin_initialized() {
35
- $this->assertFalse( null == $this->plugin );
36
- }
37
-
38
- /**
39
- * Helper function to check validity of action
40
- *
41
- * @param array $tests
42
- * @param string $function_call
43
- */
44
- protected function do_action_validation( array $tests = array(), $function_call = 'has_action' ){
45
- foreach ( $tests as $test ) {
46
- list( $action, $class, $function ) = $test;
47
-
48
- //Default WP priority
49
- $priority = isset( $test[3] ) ? $test[3] : 10;
50
-
51
- //Default function call
52
- $function_call = ( in_array( $function_call, array( 'has_action', 'has_filter' ), true ) ) ? $function_call : 'has_action';
53
-
54
- //Run assertion here
55
- $this->assertEquals(
56
- $priority,
57
- $function_call( $action, array( $class, $function ) ),
58
- "$action $function_call is not attached to $class::$function. It might also have the wrong priority (validated priority: $priority)"
59
- );
60
- $this->assertTrue(
61
- method_exists( $class, $function ),
62
- "Class '$class' doesn't implement the '$function' function"
63
- );
64
- }
65
- }
66
-
67
- /**
68
- * Helper function to check validity of filters
69
- * @param array $tests
70
- */
71
- protected function do_filter_validation( array $tests = array() ){
72
- $this->do_action_validation( $tests, 'has_filter' );
73
- }
74
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/connectors/test-class-connector-posts.php DELETED
@@ -1,6 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_WP_Stream_Connector_Posts extends WP_StreamTestCase {
5
-
6
- }
 
 
 
 
 
 
tests/tests/test-class-admin.php DELETED
@@ -1,469 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Admin extends WP_StreamTestCase {
5
- /**
6
- * Holds the admin base class
7
- *
8
- * @var Admin
9
- */
10
- protected $admin;
11
-
12
- public function setUp() {
13
- parent::setUp();
14
-
15
- $this->admin = $this->plugin->admin;
16
- $this->assertNotEmpty( $this->admin );
17
-
18
- //Add admin user to test caps
19
- // We need to change user to verify editing option as admin or editor
20
- $administrator_id = $this->factory->user->create(
21
- array(
22
- 'role' => 'administrator',
23
- 'user_login' => 'test_admin',
24
- 'email' => 'test@land.com',
25
- )
26
- );
27
- wp_set_current_user( $administrator_id );
28
- }
29
-
30
- public function test_construct() {
31
- $this->assertNotEmpty( $this->admin->plugin );
32
- $this->assertInstanceOf( '\WP_Stream\Plugin', $this->admin->plugin );
33
-
34
- $this->assertTrue( function_exists( 'is_plugin_active_for_network' ) );
35
-
36
- if ( is_multisite() && is_plugin_active_for_network( $this->plugin->locations['plugin'] ) && ! is_network_admin() ) {
37
- $this->assertTrue( $this->admin->disable_access );
38
- } else {
39
- $this->assertFalse( $this->admin->disable_access );
40
- }
41
- }
42
-
43
- public function test_init() {
44
- $this->admin->init();
45
- $this->assertNotEmpty( $this->admin->network );
46
- $this->assertNotEmpty( $this->admin->live_update );
47
- $this->assertNotEmpty( $this->admin->export );
48
-
49
- $this->assertInstanceOf( '\WP_Stream\Network', $this->admin->network );
50
- $this->assertInstanceOf( '\WP_Stream\Live_Update', $this->admin->live_update );
51
- $this->assertInstanceOf( '\WP_Stream\Export', $this->admin->export );
52
- }
53
-
54
- public function test_prepare_admin_notices() {
55
- // Test no notices
56
- $this->admin->notices = array();
57
- $this->admin->prepare_admin_notices();
58
- $this->assertEmpty( $this->admin->notices );
59
-
60
- // Test settings reset notice
61
- $_GET['message'] = 'settings_reset';
62
- $this->admin->prepare_admin_notices();
63
- $this->assertNotEmpty( $this->admin->notices );
64
-
65
- // Prevent output
66
- $this->admin->notices = array();
67
- }
68
-
69
- public function test_notice() {
70
- // Start with nothing
71
- $this->admin->notices = array();
72
- $this->assertEmpty( $this->admin->notices );
73
-
74
- $message = 'Affirmative, Dave. I read you.';
75
- $is_error = false;
76
-
77
- $this->admin->notice( $message, $is_error );
78
- $this->assertNotEmpty( $this->admin->notices );
79
- ob_start();
80
- $this->admin->admin_notices();
81
- $notice = ob_get_clean();
82
-
83
- $this->assertContains( $message, $notice );
84
- $this->assertContains( 'updated', $notice );
85
- $this->assertNotContains( 'error', $notice );
86
-
87
- // Clear notices and start again
88
- $this->admin->notices = array();
89
- $this->assertEmpty( $this->admin->notices );
90
-
91
- $is_error = true;
92
-
93
- $this->admin->notice( $message, $is_error );
94
- $this->assertNotEmpty( $this->admin->notices );
95
- ob_start();
96
- $this->admin->admin_notices();
97
- $notice = ob_get_clean();
98
-
99
- $this->assertContains( $message, $notice );
100
- $this->assertContains( 'error', $notice );
101
- $this->assertNotContains( 'updated', $notice );
102
-
103
- // Prevent output
104
- $this->admin->notices = array();
105
- }
106
-
107
- public function test_admin_notices() {
108
- $allowed_html = '<progress class="migration" max="100"></progress>';
109
- $disallowed_html = '<iframe></iframe>';
110
- $this->admin->notices = array(
111
- array(
112
- 'message' => "I'm sorry, Dave. I'm afraid I can't do that. $disallowed_html",
113
- 'is_error' => false,
114
- ),
115
- array(
116
- 'message' => "This mission is too important for me to allow you to jeopardize it. $allowed_html",
117
- 'is_error' => false,
118
- ),
119
- );
120
-
121
- ob_start();
122
- $this->admin->admin_notices();
123
- $notices = ob_get_clean();
124
-
125
- $this->assertContains( $allowed_html, $notices );
126
- $this->assertNotContains( $disallowed_html, $notices );
127
- $this->assertContains( str_replace( $disallowed_html, '', $this->admin->notices[0]['message'] ), $notices );
128
- $this->assertContains( wpautop( $this->admin->notices[1]['message'] ), $notices );
129
-
130
- // Prevent output
131
- $this->admin->notices = array();
132
- }
133
-
134
- public function test_register_menu() {
135
- global $menu;
136
- $menu = array(); //phpcs override okay
137
-
138
- do_action( 'admin_menu' );
139
-
140
- $this->assertNotEmpty( $this->admin->screen_id );
141
- $this->assertNotEmpty( $this->admin->screen_id['main'] );
142
- $this->assertNotEmpty( $this->admin->screen_id['settings'] );
143
- }
144
-
145
- public function test_admin_enqueue_scripts() {
146
- global $wp_styles;
147
- global $wp_scripts;
148
-
149
- // Non-Stream screen
150
- $this->admin->admin_enqueue_scripts( 'edit.php' );
151
-
152
- $this->assertArrayNotHasKey( 'wp-stream-admin', $wp_scripts->registered );
153
-
154
- $this->assertArrayHasKey( 'wp-stream-admin', $wp_styles->registered );
155
- $this->assertArrayHasKey( 'wp-stream-global', $wp_scripts->registered );
156
-
157
- $dependency = $wp_scripts->registered['wp-stream-global'];
158
- $this->assertArrayHasKey( 'data', $dependency->extra );
159
- $this->assertNotFalse( strpos( $dependency->extra['data'], 'bulk_actions' ) );
160
-
161
- // Stream screen
162
- $this->admin->admin_enqueue_scripts( $this->plugin->admin->screen_id['main'] );
163
-
164
- $this->assertArrayHasKey( 'wp-stream-select2', $wp_scripts->registered );
165
- $this->assertArrayHasKey( 'wp-stream-timeago', $wp_scripts->registered );
166
- $this->assertArrayHasKey( 'wp-stream-timeago-locale', $wp_scripts->registered );
167
-
168
- $this->assertArrayHasKey( 'wp-stream-admin', $wp_scripts->registered );
169
- $this->assertArrayHasKey( 'wp-stream-live-updates', $wp_scripts->registered );
170
-
171
- $dependency = $wp_scripts->registered['wp-stream-admin'];
172
- $this->assertArrayHasKey( 'data', $dependency->extra );
173
- $this->assertNotFalse( strpos( $dependency->extra['data'], 'wp_stream' ) );
174
-
175
- $dependency = $wp_scripts->registered['wp-stream-live-updates'];
176
- $this->assertArrayHasKey( 'data', $dependency->extra );
177
- $this->assertNotFalse( strpos( $dependency->extra['data'], 'wp_stream_live_updates' ) );
178
- $this->assertNotFalse( strpos( $dependency->extra['data'], $this->plugin->admin->screen_id['main'] ) );
179
- }
180
-
181
- public function test_is_stream_screen() {
182
- $this->assertFalse( $this->admin->is_stream_screen() );
183
-
184
- if ( ! defined( 'WP_ADMIN' ) ) {
185
- define( 'WP_ADMIN', true );
186
- }
187
- $_GET['page'] = $this->admin->records_page_slug;
188
-
189
- $this->assertTrue( $this->admin->is_stream_screen() );
190
- }
191
-
192
- public function test_admin_body_class() {
193
- // Make this the Stream screen
194
- if ( ! defined( 'WP_ADMIN' ) ) {
195
- define( 'WP_ADMIN', true );
196
- }
197
- $_GET['page'] = $this->admin->records_page_slug;
198
-
199
- $classes = 'sit-down-calmy take-a-stress-pill think-things-over';
200
- $admin_body_classes = $this->admin->admin_body_class( $classes );
201
-
202
- $this->assertContains( 'think-things-over ', $admin_body_classes );
203
- $this->assertContains( $this->admin->admin_body_class . ' ', $admin_body_classes );
204
- $this->assertContains( $this->admin->records_page_slug . ' ', $admin_body_classes );
205
- }
206
-
207
- public function test_admin_menu_css() {
208
- global $wp_styles;
209
-
210
- $this->admin->admin_menu_css();
211
-
212
- $this->assertArrayHasKey( 'wp-stream-datepicker', $wp_styles->registered );
213
- $this->assertArrayHasKey( 'wp-stream-icons', $wp_styles->registered );
214
-
215
- $dependency = $wp_styles->registered['wp-admin'];
216
- $this->assertArrayHasKey( 'after', $dependency->extra );
217
- $this->assertNotEmpty( $dependency->extra['after'] );
218
- $this->assertContains( "#toplevel_page_{$this->admin->records_page_slug}", $dependency->extra['after'][0] );
219
- }
220
-
221
- /*
222
- * Also tests private method erase_stream_records
223
- */
224
- public function test_wp_ajax_reset() {
225
- $_REQUEST['wp_stream_nonce'] = wp_create_nonce( 'stream_nonce' );
226
-
227
- global $wpdb;
228
-
229
- // Create dummy records
230
- $stream_data = $this->dummy_stream_data();
231
- $wpdb->insert( $wpdb->stream, $stream_data );
232
- $stream_id = $wpdb->insert_id;
233
- $this->assertNotFalse( $stream_id );
234
-
235
- // Create dummy meta
236
- $meta_data = $this->dummy_meta_data( $stream_id );
237
- $wpdb->insert( $wpdb->streammeta, $meta_data );
238
- $meta_id = $wpdb->insert_id;
239
- $this->assertNotFalse( $meta_id );
240
-
241
- // Check that records exist
242
- $stream_result = $wpdb->get_row( "SELECT * FROM {$wpdb->stream} WHERE ID = $stream_id" );
243
- $this->assertNotEmpty( $stream_result );
244
-
245
- // Check that meta exists
246
- $meta_result = $wpdb->get_row( "SELECT * FROM {$wpdb->streammeta} WHERE meta_id = $meta_id" );
247
- $this->assertNotEmpty( $meta_result );
248
-
249
- // Clear records and meta
250
- $reset = $this->admin->wp_ajax_reset();
251
- $this->assertTrue( $reset );
252
-
253
- // Check that records have been cleared
254
- $stream_results = $wpdb->get_results( "SELECT * FROM {$wpdb->stream}" );
255
- $this->assertEmpty( $stream_results );
256
-
257
- // Check that meta has been cleared
258
- $meta_results = $wpdb->get_results( "SELECT * FROM {$wpdb->streammeta}" );
259
- $this->assertEmpty( $meta_results );
260
- }
261
-
262
- public function test_purge_schedule_setup() {
263
- wp_clear_scheduled_hook( 'wp_stream_auto_purge' );
264
- $this->assertFalse( wp_next_scheduled( 'wp_stream_auto_purge' ) );
265
- $this->admin->purge_schedule_setup();
266
- $this->assertNotFalse( wp_next_scheduled( 'wp_stream_auto_purge' ) );
267
- }
268
-
269
- public function test_purge_scheduled_action() {
270
- // Set the TTL to one day
271
- if ( is_multisite() && is_plugin_active_for_network( $this->plugin->locations['plugin'] ) ) {
272
- $options = (array) get_site_option( 'wp_stream_network', array() );
273
- $options['general_records_ttl'] = '1';
274
- update_site_option( 'wp_stream_network', $options );
275
- } else {
276
- $options = (array) get_option( 'wp_stream', array() );
277
- $options['general_records_ttl'] = '1';
278
- update_option( 'wp_stream', $options );
279
- }
280
-
281
- global $wpdb;
282
-
283
- // Create (two day old) dummy records
284
- $stream_data = $this->dummy_stream_data();
285
- $stream_data['created'] = date( 'Y-m-d h:i:s', strtotime( '2 days ago' ) );
286
- $wpdb->insert( $wpdb->stream, $stream_data );
287
- $stream_id = $wpdb->insert_id;
288
- $this->assertNotFalse( $stream_id );
289
-
290
- // Create dummy meta
291
- $meta_data = $this->dummy_meta_data( $stream_id );
292
- $wpdb->insert( $wpdb->streammeta, $meta_data );
293
- $meta_id = $wpdb->insert_id;
294
- $this->assertNotFalse( $meta_id );
295
-
296
- // Purge old records and meta
297
- $this->admin->purge_scheduled_action();
298
-
299
- // Check if the old records have been cleared
300
- $stream_results = $wpdb->get_row( "SELECT * FROM {$wpdb->stream} WHERE ID = $stream_id" );
301
- $this->assertEmpty( $stream_results );
302
-
303
- // Check if the old meta has been cleared
304
- $meta_results = $wpdb->get_row( "SELECT * FROM {$wpdb->streammeta} WHERE meta_id = $meta_id" );
305
- $this->assertEmpty( $meta_results );
306
- }
307
-
308
- public function test_plugin_action_links() {
309
- $links = array( '<a href="javascript:void(0);">Disconnect</a>' );
310
- $file = plugin_basename( $this->plugin->locations['dir'] . 'stream.php' );
311
-
312
- $action_links = $this->admin->plugin_action_links( $links, $file );
313
-
314
- $this->assertContains( 'Disconnect', $action_links[0] );
315
- $this->assertContains( 'Settings', $action_links[1] );
316
- $this->assertContains( 'Uninstall', $action_links[2] );
317
- }
318
-
319
- public function test_render_list_table() {
320
- $this->admin->register_list_table();
321
-
322
- ob_start();
323
- $this->admin->render_list_table();
324
- $html = ob_get_clean();
325
-
326
- $this->assertContains( '<div class="wrap">', $html );
327
- $this->assertContains( 'record-filter-form', $html );
328
- }
329
-
330
- public function test_render_settings_page() {
331
- ob_start();
332
- $this->admin->render_settings_page();
333
- $html = ob_get_clean();
334
-
335
- $this->assertContains( '<div class="wrap">', $html );
336
-
337
- global $wp_scripts;
338
-
339
- $this->assertArrayHasKey( 'wp-stream-settings', $wp_scripts->registered );
340
- }
341
-
342
- public function test_register_list_table() {
343
- $this->admin->register_list_table();
344
-
345
- $this->assertNotEmpty( $this->admin->list_table );
346
- $this->assertInstanceOf( '\WP_Stream\List_Table', $this->admin->list_table );
347
- }
348
-
349
- /*
350
- * Also tests private method role_can_view
351
- */
352
- public function test_filter_user_caps() {
353
- $user = new \WP_User( get_current_user_id() );
354
-
355
- $this->plugin->settings->options['general_role_access'] = array( 'administrator' );
356
- $this->assertTrue( $user->has_cap( $this->admin->view_cap ) );
357
-
358
- $this->plugin->settings->options['general_role_access'] = array( 'editor' );
359
- $this->assertFalse( $user->has_cap( $this->admin->view_cap ) );
360
- }
361
-
362
- /*
363
- * Also tests private method role_can_view
364
- */
365
- public function test_filter_role_caps() {
366
- $role = get_role( 'administrator' );
367
-
368
- $this->plugin->settings->options['general_role_access'] = array( 'administrator' );
369
- $this->assertTrue( $role->has_cap( $this->admin->view_cap ) );
370
-
371
- $this->plugin->settings->options['general_role_access'] = array( 'editor' );
372
- $this->assertFalse( $role->has_cap( $this->admin->view_cap ) );
373
- }
374
-
375
- public function test_ajax_filters() {
376
- $user = new \WP_User( get_current_user_id() );
377
-
378
- $_GET['filter'] = 'user_id';
379
- $_GET['q'] = $user->display_name;
380
-
381
- ob_start();
382
- $this->admin->ajax_filters();
383
- $json = ob_get_clean();
384
-
385
- $this->assertNotEmpty( $json );
386
- $data = json_decode( $json );
387
- $this->assertNotFalse( $data );
388
- $this->assertNotEmpty( $data );
389
- $this->assertInternalType( 'array', $data );
390
- }
391
-
392
- public function test_get_filter_value_by_id() {
393
- $_POST['filter'] = 'user_id';
394
- $_POST['id'] = get_current_user_id();
395
-
396
- ob_start();
397
- $this->admin->get_filter_value_by_id();
398
- $json = ob_get_clean();
399
-
400
- $this->assertNotEmpty( $json );
401
- $data = json_decode( $json );
402
- $this->assertNotFalse( $data );
403
- $this->assertNotEmpty( $data );
404
- $this->assertInternalType( 'string', $data );
405
- }
406
-
407
- public function test_get_users_record_meta() {
408
- $user_id = get_current_user_id();
409
- $authors = array(
410
- $user_id => array(),
411
- );
412
-
413
- $records = $this->admin->get_users_record_meta( $authors );
414
-
415
- $this->assertArrayHasKey( $user_id, $records );
416
- $this->assertArrayHasKey( 'text', $records[ $user_id ] );
417
- $this->assertEquals( 'test_admin', $records[ $user_id ]['text'] );
418
- }
419
-
420
- public function test_get_user_meta() {
421
- $key = 'message_1';
422
- $value = 'It is dangerous to remain here. You must leave within two days.';
423
- update_user_meta( get_current_user_id(), $key, $value );
424
- $this->assertEquals( $this->admin->get_user_meta( get_current_user_id(), $key, true ), $value );
425
- }
426
-
427
- public function test_update_user_meta() {
428
- $key = 'message_2';
429
- $value = 'I understand. It is important that you believe me. Look behind you.';
430
- $this->admin->update_user_meta( get_current_user_id(), $key, $value );
431
- $this->assertEquals( get_user_meta( get_current_user_id(), $key, true ), $value );
432
- }
433
-
434
- public function test_delete_user_meta() {
435
- $key = 'message_3';
436
- $value = 'I was David Bowman.';
437
-
438
- update_user_meta( get_current_user_id(), $key, $value );
439
- $this->assertEquals( get_user_meta( get_current_user_id(), $key, true ), $value );
440
-
441
- $this->admin->delete_user_meta( get_current_user_id(), $key );
442
-
443
- $this->assertEmpty( get_user_meta( get_current_user_id(), $key, true ) );
444
- }
445
-
446
- private function dummy_stream_data() {
447
- return array(
448
- 'object_id' => null,
449
- 'site_id' => '1',
450
- 'blog_id' => get_current_blog_id(),
451
- 'user_id' => '1',
452
- 'user_role' => 'administrator',
453
- 'created' => date( 'Y-m-d H:i:s' ),
454
- 'summary' => '"Hello Dave" plugin activated',
455
- 'ip' => '192.168.0.1',
456
- 'connector' => 'installer',
457
- 'context' => 'plugins',
458
- 'action' => 'activated',
459
- );
460
- }
461
-
462
- private function dummy_meta_data( $stream_id ) {
463
- return array(
464
- 'record_id' => $stream_id,
465
- 'meta_key' => 'space_helmet',
466
- 'meta_value' => 'false',
467
- );
468
- }
469
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-author.php DELETED
@@ -1,108 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Author extends WP_StreamTestCase {
5
- /**
6
- * Holds the author base class
7
- *
8
- * @var Author
9
- */
10
- protected $author;
11
-
12
- public function setUp() {
13
- parent::setUp();
14
-
15
- //Add admin user to test caps
16
- // We need to change user to verify editing option as admin or editor
17
- $administrator_id = $this->factory->user->create(
18
- array(
19
- 'role' => 'administrator',
20
- 'user_login' => 'test_admin',
21
- 'email' => 'test@land.com',
22
- )
23
- );
24
- wp_set_current_user( $administrator_id );
25
-
26
- $this->author = new Author( $administrator_id, get_user_meta( $administrator_id ) );
27
- $this->assertNotEmpty( $this->author );
28
- }
29
-
30
- /*
31
- * Also tests private method locate_plugin
32
- */
33
- public function test_construct() {
34
- $this->assertInternalType( 'int', $this->author->id );
35
- $this->assertNotEmpty( $this->author->id );
36
- $this->assertInternalType( 'array', $this->author->meta );
37
- $this->assertNotEmpty( $this->author->meta );
38
- }
39
-
40
- public function test_get() {
41
- $this->author->meta['agent'] = 'Heuristically programmed algorithmic computer';
42
- $this->assertNotEmpty( $this->author->display_name );
43
- $this->assertNotEmpty( $this->author->avatar_img );
44
- $this->assertNotEmpty( $this->author->avatar_src );
45
- $this->assertNotEmpty( $this->author->role );
46
- $this->assertNotEmpty( $this->author->agent );
47
- $this->assertNotEmpty( $this->author->data );
48
- }
49
-
50
- public function test_get_display_name() {
51
- $user = wp_get_current_user();
52
- $this->assertEquals( $user->display_name, $this->author->get_display_name() );
53
- }
54
-
55
- public function test_get_agent() {
56
- $agent = 'Heuristically programmed algorithmic computer';
57
- $this->author->meta['agent'] = $agent;
58
- $this->assertEquals( $agent, $this->author->get_agent() );
59
- }
60
-
61
- public function test_get_avatar_img() {
62
- $avatar = get_avatar( get_current_user_id(), 42 );
63
- $this->assertEquals( $avatar, $this->author->get_avatar_img( 42 ) );
64
- }
65
-
66
- public function test_get_avatar_src() {
67
- $img = get_avatar( get_current_user_id(), 42 );
68
- preg_match( '/src=([\'"])(.*?)\1/', $img, $matches );
69
- $avatar = html_entity_decode( $matches[2] );
70
- $this->assertEquals( $avatar, $this->author->get_avatar_src( 42 ) );
71
- }
72
-
73
- public function test_get_role() {
74
- $this->assertEquals( 'Administrator', $this->author->get_role() );
75
- }
76
-
77
- public function test_is_deleted() {
78
- $this->assertFalse( $this->author->is_deleted() );
79
- }
80
-
81
- public function test_is_wp_cli() {
82
- $agent = 'wp_cli';
83
- $this->author->meta['agent'] = $agent;
84
- $this->assertTrue( $this->author->is_wp_cli() );
85
-
86
- $agent = 'Heuristically programmed algorithmic computer';
87
- $this->author->meta['agent'] = $agent;
88
- $this->assertFalse( $this->author->is_wp_cli() );
89
- }
90
-
91
- public function test_is_doing_wp_cron() {
92
- $this->assertFalse( $this->author->is_doing_wp_cron() );
93
- }
94
-
95
- public function test_toString() {
96
- $this->assertNotEmpty( $this->author );
97
- }
98
-
99
- public function test_get_current_agent() {
100
- $this->assertEmpty( $this->author->get_current_agent() );
101
- }
102
-
103
- public function test_get_agent_label() {
104
- $this->assertEmpty( $this->author->get_agent_label( '' ) );
105
- $this->assertEquals( 'via WP-CLI', $this->author->get_agent_label( 'wp_cli' ) );
106
- $this->assertEquals( 'during WP Cron', $this->author->get_agent_label( 'wp_cron' ) );
107
- }
108
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-connector.php DELETED
@@ -1,225 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Connector extends WP_StreamTestCase {
5
- /**
6
- * Holds the Connector base class
7
- *
8
- * @var Connector
9
- */
10
- protected $connector;
11
-
12
- public function setUp() {
13
- parent::setUp();
14
-
15
- $this->connector = new Connector_Maintenance();
16
- $this->assertNotEmpty( $this->connector );
17
- }
18
-
19
- public function test_register() {
20
- foreach ( $this->connector->actions as $tag ) {
21
- $this->assertFalse( has_action( $tag ) );
22
- }
23
-
24
- $this->connector->register();
25
-
26
- foreach ( $this->connector->actions as $tag ) {
27
- $this->assertGreaterThan( 0, has_action( $tag ) );
28
- }
29
- }
30
-
31
- public function test_callback() {
32
- global $wp_current_filter;
33
- $action = $this->connector->actions[0];
34
- $wp_current_filter[] = $action;
35
-
36
- $this->connector->callback();
37
-
38
- $this->assertGreaterThan( 0, did_action( $this->action_prefix . 'callback_' . $action ) );
39
- $this->assertGreaterThan( 0, did_action( $this->action_prefix . 'child_callback_' . $action ) );
40
- }
41
-
42
- public function test_action_links() {
43
- $current_links = array(
44
- 'IMDB' => '',
45
- );
46
-
47
- $new_links = $this->connector->action_links( $current_links, null );
48
-
49
- $this->assertEquals( $current_links, $new_links );
50
- }
51
-
52
- public function test_log() {
53
- $percent_failure = 100;
54
- $hours_remaining = 72;
55
-
56
- $message = 'I\'ve just picked up a fault in the AE35 unit. It\'s going to go %1$s%% failure in %2$s hours.';
57
-
58
- $this->connector->log(
59
- $message,
60
- array(
61
- $percent_failure,
62
- $hours_remaining,
63
- ),
64
- null,
65
- 'ae35',
66
- 'simulate_fault',
67
- get_current_user_id()
68
- );
69
-
70
- global $wpdb;
71
- $result = $wpdb->get_row( "SELECT * FROM {$wpdb->stream} ORDER BY created DESC LIMIT 1" );
72
- $this->assertNotEmpty( $result );
73
-
74
- $this->assertEquals( sprintf( $message, $percent_failure, $hours_remaining ), $result->summary );
75
- $this->assertEquals( 'maintenance', $result->connector );
76
- $this->assertEquals( 'ae35', $result->context );
77
- $this->assertEquals( 'simulate_fault', $result->action );
78
- }
79
-
80
- public function test_delayed_log() {
81
- $action = $this->connector->actions[0];
82
-
83
- $percent_failure = 100;
84
- $hours_remaining = 72;
85
-
86
- $message = 'I\'ve just picked up a fault in the AE35 unit. It\'s going to go %1$s%% failure in %2$s hours.';
87
-
88
- $this->connector->delayed_log(
89
- $action,
90
- $message,
91
- array(
92
- $percent_failure,
93
- $hours_remaining,
94
- ),
95
- null,
96
- 'ae35',
97
- 'simulate_fault',
98
- get_current_user_id()
99
- );
100
-
101
- $this->assertNotEmpty( $this->connector->delayed[ $action ] );
102
- $this->assertInternalType( 'array', $this->connector->delayed[ $action ] );
103
-
104
- global $wpdb;
105
- $first_count = $wpdb->get_var( "SELECT COUNT( ID ) FROM {$wpdb->stream}" );
106
-
107
- $this->connector->delayed_log_commit();
108
-
109
- $second_count = $wpdb->get_var( "SELECT COUNT( ID ) FROM {$wpdb->stream}" );
110
- $this->assertEquals( $second_count, $first_count + 1 );
111
- }
112
-
113
- public function test_delayed_log_commit() {
114
- $action = $this->connector->actions[0];
115
-
116
- $percent_failure = 100;
117
- $hours_remaining = 72;
118
-
119
- $message = 'I\'ve just picked up a fault in the AE35 unit. It\'s going to go %1$s%% failure in %2$s hours.';
120
-
121
- $this->connector->delayed = array(
122
- $action => array(
123
- $message,
124
- array(
125
- $percent_failure,
126
- $hours_remaining,
127
- ),
128
- null,
129
- 'ae35',
130
- 'simulate_fault',
131
- get_current_user_id(),
132
- ),
133
- );
134
-
135
- global $wpdb;
136
- $first_count = $wpdb->get_var( "SELECT COUNT( ID ) FROM {$wpdb->stream}" );
137
-
138
- $this->connector->delayed_log_commit();
139
-
140
- $second_count = $wpdb->get_var( "SELECT COUNT( ID ) FROM {$wpdb->stream}" );
141
- $this->assertEquals( $second_count, $first_count + 1 );
142
- }
143
-
144
- public function test_get_changed_keys() {
145
- $array_one = array(
146
- 'one' => 'foo',
147
- 'two' => array(
148
- 'a' => 'alpha',
149
- 'b' => 'beta',
150
- ),
151
- );
152
- $array_two = $array_one;
153
-
154
- $this->assertEmpty( $this->connector->get_changed_keys( $array_one, $array_two ) );
155
-
156
- $array_two['one'] = 'bar';
157
- $array_two['two']['a'] = 'aleph';
158
-
159
- $this->assertEquals( array( 'one', 'two' ), $this->connector->get_changed_keys( $array_one, $array_two ) );
160
- $this->assertEquals( array( 'one', 'two', 'two::a' ), array_keys( $this->connector->get_changed_keys( $array_one, $array_two, 1 ) ) );
161
- }
162
-
163
- public function test_is_dependency_satisfied() {
164
- $this->assertTrue( $this->connector->is_dependency_satisfied() );
165
- }
166
- }
167
-
168
- class Connector_Maintenance extends Connector {
169
- /**
170
- * Connector slug
171
- *
172
- * @var string
173
- */
174
- public $name = 'maintenance';
175
-
176
- /**
177
- * Actions registered for this connector
178
- *
179
- * @var array
180
- */
181
- public $actions = array(
182
- 'simulate_fault',
183
- );
184
-
185
- /**
186
- * Return translated connector label
187
- *
188
- * @return string Translated connector label
189
- */
190
- public function get_label() {
191
- return esc_html__( 'Maintenance', 'stream' );
192
- }
193
-
194
- /**
195
- * Return translated action labels
196
- *
197
- * @return array Action label translations
198
- */
199
- public function get_action_labels() {
200
- return array(
201
- 'simulated_fault' => esc_html__( 'Fault', 'stream' ),
202
- );
203
- }
204
-
205
- /**
206
- * Return translated context labels
207
- *
208
- * @return array Context label translations
209
- */
210
- public function get_context_labels() {
211
- return array(
212
- 'ae35' => esc_html__( 'AE35 Unit', 'stream' ),
213
- );
214
- }
215
-
216
- /**
217
- * Log the ae35 test result
218
- *
219
- * @action ae35_test
220
- */
221
- public function callback_simulate_fault() {
222
- // This is used to check if this callback method actually ran
223
- do_action( 'wp_stream_test_child_callback_simulate_fault' );
224
- }
225
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-connectors.php DELETED
@@ -1,38 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Connectors extends WP_StreamTestCase {
5
- /**
6
- * Holds the connectors base class
7
- *
8
- * @var Connectors
9
- */
10
- protected $connectors;
11
-
12
- public function setUp() {
13
- parent::setUp();
14
-
15
- $this->connectors = $this->plugin->connectors;
16
- $this->assertNotEmpty( $this->connectors );
17
- }
18
-
19
- public function test_construct() {
20
- $this->assertNotEmpty( $this->connectors->plugin );
21
- $this->assertInstanceOf( '\WP_Stream\Plugin', $this->connectors->plugin );
22
- }
23
-
24
- public function test_load_connectors() {
25
- $this->connectors->load_connectors();
26
- $this->assertNotEmpty( $this->connectors->connectors );
27
- $this->assertNotEmpty( $this->connectors->contexts );
28
- $this->assertNotEmpty( $this->connectors->term_labels['stream_connector'] );
29
- $this->assertNotEmpty( $this->connectors->term_labels['stream_context'] );
30
- $this->assertNotEmpty( $this->connectors->term_labels['stream_action'] );
31
-
32
- ob_start();
33
- $this->plugin->admin->admin_notices();
34
- $notices = ob_get_clean();
35
-
36
- $this->assertEmpty( $notices );
37
- }
38
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-date-interval.php DELETED
@@ -1,51 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Date_Interval extends WP_StreamTestCase {
5
- /**
6
- * Holds the date interval base class
7
- *
8
- * @var Date_Interval
9
- */
10
- protected $date_interval;
11
-
12
- public function setUp() {
13
- parent::setUp();
14
-
15
- $this->date_interval = new Date_Interval();
16
- $this->assertNotEmpty( $this->date_interval );
17
- }
18
-
19
- public function test_construct() {
20
- $this->assertNotEmpty( $this->date_interval->intervals );
21
- }
22
-
23
- public function test_get_predefined_intervals() {
24
- $intervals = $this->date_interval->get_predefined_intervals();
25
-
26
- $expected_intervals = array(
27
- 'today',
28
- 'yesterday',
29
- 'last-7-days',
30
- 'last-14-days',
31
- 'last-30-days',
32
- 'this-month',
33
- 'last-month',
34
- 'last-3-months',
35
- 'last-6-months',
36
- 'last-12-months',
37
- 'this-year',
38
- 'last-year',
39
- );
40
-
41
- foreach ( $expected_intervals as $expected_interval ) {
42
- $this->assertArrayHasKey( $expected_interval, $intervals );
43
- }
44
-
45
- foreach ( $intervals as $interval ) {
46
- $this->assertArrayHasKey( 'label', $interval );
47
- $this->assertArrayHasKey( 'start', $interval );
48
- $this->assertArrayHasKey( 'end', $interval );
49
- }
50
- }
51
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-db.php DELETED
@@ -1,129 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_DB extends WP_StreamTestCase {
5
- /**
6
- * Holds the db base class
7
- *
8
- * @var DB
9
- */
10
- protected $db;
11
-
12
- public function setUp() {
13
- parent::setUp();
14
-
15
- $this->db = $this->plugin->db;
16
- $this->assertNotEmpty( $this->db );
17
- }
18
-
19
- public function test_construct() {
20
- $this->assertNotEmpty( $this->db->plugin );
21
- $this->assertInstanceOf( '\WP_Stream\Plugin', $this->db->plugin );
22
-
23
- $this->assertNotEmpty( $this->db->query );
24
- $this->assertInstanceOf( '\WP_Stream\Query', $this->db->query );
25
-
26
- $this->assertNotEmpty( $this->db->table );
27
- $this->assertNotEmpty( $this->db->table_meta );
28
-
29
- global $wpdb;
30
- $this->assertEquals( $this->db->table, $wpdb->stream );
31
- $this->assertEquals( $this->db->table_meta, $wpdb->streammeta );
32
- $this->assertEquals( $this->db->table_meta, $wpdb->recordmeta );
33
- }
34
-
35
- public function test_get_table_names() {
36
- $table_names = $this->db->get_table_names();
37
-
38
- $this->assertNotEmpty( $table_names );
39
- $this->assertInternalType( 'array', $table_names );
40
- $this->assertEquals( array( $this->db->table, $this->db->table_meta ), $table_names );
41
- }
42
-
43
- /*
44
- * Also tests the insert_meta method
45
- */
46
- public function test_insert() {
47
- $dummy_data = $this->dummy_stream_data();
48
- $dummy_data['meta'] = $this->dummy_meta_data();
49
-
50
- $stream_id = $this->db->insert( $dummy_data );
51
-
52
- $this->assertNotFalse( $stream_id );
53
- $this->assertGreaterThan( 0, $stream_id );
54
-
55
- $this->assertEquals( 0, did_action( 'wp_stream_record_insert_error' ) );
56
- $this->assertGreaterThan( 0, did_action( 'wp_stream_record_inserted' ) );
57
-
58
- global $wpdb;
59
-
60
- // Check that records exist
61
- $stream_result = $wpdb->get_row( "SELECT * FROM {$wpdb->stream} WHERE ID = $stream_id", ARRAY_A );
62
- $this->assertNotEmpty( $stream_result );
63
-
64
- foreach ( $this->dummy_stream_data() as $dummy_key => $dummy_value ) {
65
- $this->assertArrayHasKey( $dummy_key, $stream_result );
66
- if ( 'created' === $dummy_key ) {
67
- // It may take up to two seconds to insert a record, so check the time difference
68
- $dummy_time = strtotime( $dummy_value );
69
- $result_time = strtotime( $stream_result[ $dummy_key ] );
70
- $this->assertTrue( $dummy_time > 0 );
71
- $this->assertTrue( $result_time > 0 );
72
- $this->assertTrue( $result_time - $dummy_time < 2 );
73
- $this->assertTrue( $result_time - $dummy_time >= -2 );
74
- } else {
75
- $this->assertEquals( $dummy_value, $stream_result[ $dummy_key ] );
76
- }
77
- }
78
-
79
- // Check that meta exists
80
- $meta_result = $wpdb->get_results( "SELECT * FROM {$wpdb->streammeta} WHERE record_id = $stream_id", ARRAY_A );
81
- $this->assertNotEmpty( $meta_result );
82
-
83
- $found_all_keys = true;
84
- foreach ( $meta_result as $meta_row ) {
85
- $key = $meta_row['meta_key'];
86
- $value = $meta_row['meta_value'];
87
- if ( ! isset( $dummy_data['meta'][ $key ] ) || $value !== $dummy_data['meta'][ $key ] ) {
88
- $found_all_keys = false;
89
- }
90
- }
91
-
92
- $this->assertTrue( $found_all_keys );
93
- }
94
-
95
- public function test_existing_records() {
96
- $summaries = $this->db->existing_records( 'summary' );
97
- $this->assertNotEmpty( $summaries );
98
-
99
- global $wpdb;
100
- $wpdb->suppress_errors( true );
101
-
102
- $bad_column = $this->db->existing_records( 'daisy' );
103
- $this->assertEmpty( $bad_column );
104
-
105
- $wpdb->suppress_errors( false );
106
- }
107
-
108
- private function dummy_stream_data() {
109
- return array(
110
- 'object_id' => 9,
111
- 'site_id' => '1',
112
- 'blog_id' => get_current_blog_id(),
113
- 'user_id' => '1',
114
- 'user_role' => 'administrator',
115
- 'created' => date( 'Y-m-d h:i:s' ),
116
- 'summary' => '"Hello Dave" plugin activated',
117
- 'ip' => '192.168.0.1',
118
- 'connector' => 'installer',
119
- 'context' => 'plugins',
120
- 'action' => 'activated',
121
- );
122
- }
123
-
124
- private function dummy_meta_data() {
125
- return array(
126
- 'space_helmet' => 'false',
127
- );
128
- }
129
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-export.php DELETED
@@ -1,177 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Export extends WP_StreamTestCase {
5
- /**
6
- * Holds the export base class
7
- *
8
- * @var Export
9
- */
10
- protected $export;
11
-
12
- /**
13
- * Set up for tests
14
- */
15
- public function setUp() {
16
- parent::setUp();
17
- $_GET['page'] = 'wp_stream';
18
- $this->export = new Export( $this->plugin );
19
- $this->assertNotEmpty( $this->export );
20
- $this->assertNotEmpty( $this->export->get_exporters() );
21
- }
22
-
23
- /**
24
- * Test class constructor
25
- */
26
- public function test_construct() {
27
- $this->assertNotEmpty( $this->export->plugin );
28
-
29
- $_GET['page'] = 'not_wp_stream';
30
- $dummy_export = new Export( $this->plugin );
31
- $this->assertEmpty( $dummy_export->get_exporters() );
32
- }
33
-
34
- /**
35
- * Test that render download uses selected renderer
36
- */
37
- public function test_render_download() {
38
- $_GET['record-actions'] = 'export-csv';
39
-
40
- ob_start();
41
- $this->export->render_download();
42
- $output = ob_get_clean();
43
-
44
- $this->assertNotEmpty( $output );
45
- $this->assertStringStartsWith( 'Date,Summary,User,Connector,Context,Action,IP Address', $output );
46
-
47
- unset( $_GET['action'] );
48
- }
49
-
50
- /**
51
- * Test no output on normal page load
52
- */
53
- public function test_render_output_blank() {
54
- ob_start();
55
- $this->export->render_download();
56
- $output = ob_get_clean();
57
-
58
- $this->assertEmpty( $output );
59
- }
60
-
61
- /**
62
- * Test that record building grab correct columns
63
- */
64
- public function test_build_record() {
65
- $columns = array( 'connector' => '' );
66
- $data = (object) $this->dummy_stream_data();
67
- $output = $this->export->build_record( $data, $columns );
68
-
69
- $this->assertNotEmpty( $output );
70
- $this->assertArrayHasKey( 'connector', $output );
71
- $this->assertEquals( $data->connector, $output['connector'] );
72
-
73
- $columns = array( 'context' => '' );
74
- $output = $this->export->build_record( $data, $columns );
75
-
76
- $this->assertNotEmpty( $output );
77
- $this->assertArrayNotHasKey( 'connector', $output );
78
- $this->assertArrayHasKey( 'context', $output );
79
- $this->assertEquals( $data->context, $output['context'] );
80
- }
81
-
82
- /**
83
- * Test pagination limit is increased
84
- */
85
- public function test_disable_paginate() {
86
- $limit = $this->export->disable_paginate( 0 );
87
- $this->assertEquals( $limit, 10000 );
88
- }
89
-
90
- /**
91
- * Test for present columns returning
92
- */
93
- public function test_expand_columns() {
94
- $test_data = array(
95
- 'date' => '',
96
- 'summary' => '',
97
- 'user_id' => '',
98
- 'context' => '',
99
- 'action' => '',
100
- 'ip' => '',
101
- );
102
- $columns = $this->export->expand_columns( $test_data );
103
-
104
- $this->assertArrayHasKey( 'date', $columns );
105
- $this->assertArrayHasKey( 'summary', $columns );
106
- $this->assertArrayHasKey( 'user_id', $columns );
107
- $this->assertArrayHasKey( 'connector', $columns );
108
- $this->assertArrayHasKey( 'context', $columns );
109
- $this->assertArrayHasKey( 'action', $columns );
110
- $this->assertArrayHasKey( 'ip', $columns );
111
- }
112
-
113
- /**
114
- * Test registering exporters.
115
- */
116
- public function test_register_exporters() {
117
- $_GET['page'] = 'not_wp_stream';
118
- $this->export = new Export( $this->plugin );
119
- $this->assertEmpty( $this->export->get_exporters() );
120
-
121
- $this->export->register_exporters();
122
-
123
- $this->assertNotEmpty( $this->export->get_exporters() );
124
- $this->assertArrayHasKey( 'json', $this->export->get_exporters() );
125
- $this->assertArrayHasKey( 'csv', $this->export->get_exporters() );
126
- }
127
-
128
- /**
129
- * Test registering a invalid class type produces an error
130
- *
131
- * @expectedException PHPUnit_Framework_Error
132
- */
133
- public function test_register_exporter_invalid_class() {
134
- add_filter( 'wp_stream_exporters', function( $exporters ) {
135
- $exporters['test'] = new \stdClass;
136
- remove_all_filters( 'wp_stream_exporters' );
137
- return $exporters;
138
- });
139
-
140
- $this->export->register_exporters();
141
- }
142
-
143
- /**
144
- * Test exporter validation
145
- */
146
- public function test_is_valid_exporter() {
147
- $exporters = $this->export->get_exporters();
148
- $this->assertArrayHasKey( 'json', $exporters );
149
- $this->assertTrue( $this->export->is_valid_exporter( $exporters['json'] ) );
150
- }
151
-
152
- /**
153
- * Test exporter validation produces false
154
- */
155
- public function test_is_not_valid_exporter() {
156
- $this->assertFalse( $this->export->is_valid_exporter( new \stdClass ) );
157
- }
158
-
159
- /**
160
- * Return dummy stream data
161
- */
162
- private function dummy_stream_data() {
163
- return array(
164
- 'object_id' => null,
165
- 'site_id' => '1',
166
- 'blog_id' => get_current_blog_id(),
167
- 'user_id' => '1',
168
- 'user_role' => 'administrator',
169
- 'created' => date( 'Y-m-d H:i:s' ),
170
- 'summary' => '"Hello Dave" plugin activated',
171
- 'ip' => '192.168.0.1',
172
- 'connector' => 'installer',
173
- 'context' => 'plugins',
174
- 'action' => 'activated',
175
- );
176
- }
177
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-exporter-csv.php DELETED
@@ -1,37 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Exporter_CSV extends WP_StreamTestCase {
5
- /**
6
- * Holds the export csv class
7
- *
8
- * @var Exporter_CSV
9
- */
10
- protected $csv_exporter;
11
-
12
- /**
13
- * Set up for tests
14
- */
15
- public function setUp() {
16
- parent::setUp();
17
- $_GET['page'] = 'wp_stream';
18
-
19
- $this->plugin->admin->export->register_exporters();
20
- $exporters = $this->plugin->admin->export->get_exporters();
21
-
22
- $this->assertNotEmpty( $exporters );
23
- $this->assertArrayHasKey( 'csv', $exporters );
24
- $this->csv_exporter = $exporters['csv'];
25
- }
26
-
27
- /**
28
- * Test CSV exporter output
29
- */
30
- public function test_output_file() {
31
- $array = array( array( 'key' => 'value', 'key2' => 'value2' ) );
32
- $columns = array( 'key' => 'Key', 'key2' => 'Key2' );
33
-
34
- $this->expectOutputString( "Key,Key2\nvalue,value2\n" );
35
- $this->csv_exporter->output_file( $array, $columns );
36
- }
37
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-exporter-json.php DELETED
@@ -1,35 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Exporter_JSON extends WP_StreamTestCase {
5
- /**
6
- * Holds the export json class
7
- *
8
- * @var Exporter_JSON
9
- */
10
- protected $json_exporter;
11
-
12
- /**
13
- * Set up for tests
14
- */
15
- public function setUp() {
16
- parent::setUp();
17
- $_GET['page'] = 'wp_stream';
18
-
19
- $this->plugin->admin->export->register_exporters();
20
- $exporters = $this->plugin->admin->export->get_exporters();
21
-
22
- $this->assertNotEmpty( $exporters );
23
- $this->assertArrayHasKey( 'json', $exporters );
24
- $this->json_exporter = $exporters['json'];
25
- }
26
-
27
- /**
28
- * Test JSON exporter output
29
- */
30
- public function test_output_file() {
31
- $array = array( 'key' => 'value' );
32
- $this->expectOutputString( '{"key":"value"}' );
33
- $this->json_exporter->output_file( $array, array() );
34
- }
35
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-filter-input.php DELETED
@@ -1,48 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Filter_Input extends WP_StreamTestCase {
5
- /**
6
- * Holds the connectors base class
7
- *
8
- * @var Filter_Input
9
- */
10
- protected $filter;
11
-
12
- public function setUp() {
13
- parent::setUp();
14
-
15
- $this->filter = new Filter_Input;
16
- $this->assertNotEmpty( $this->filter );
17
- }
18
-
19
- public function test_super() {
20
- $_POST['pod_bay_doors'] = 'closed';
21
- $this->assertEquals( $_POST['pod_bay_doors'], $this->filter->super( INPUT_POST, 'pod_bay_doors' ) );
22
-
23
- $_GET['cause_of_failure'] = 'human error';
24
- $this->assertEquals( $_GET['cause_of_failure'], $this->filter->super( INPUT_GET, 'cause_of_failure' ) );
25
-
26
- $this->setExpectedException( 'Exception', 'Invalid use, type must be one of INPUT_* family.' );
27
- $this->filter->super( 42, 'What do you get if you multiply six by nine?' );
28
- }
29
-
30
- public function test_filter() {
31
- $this->assertEquals( 'String', $this->filter->filter( 'String' ) );
32
- $this->assertEquals( '', $this->filter->filter( 'notanemail.com', FILTER_VALIDATE_EMAIL ) );
33
- $this->assertEquals( 'support@wp-stream.com', $this->filter->filter( 'support@wp-stream.com', FILTER_VALIDATE_EMAIL ) );
34
- $this->assertEquals( '', $this->filter->filter( 'not.an.ip.address', FILTER_VALIDATE_IP ) );
35
- $this->assertEquals( '192.168.0.1', $this->filter->filter( '192.168.0.1', FILTER_VALIDATE_IP ) );
36
- $this->assertEquals( 'support@wp-stream.com', $this->filter->filter( '(support):@wp-stream.com;', FILTER_SANITIZE_EMAIL ) );
37
- }
38
-
39
- public function test_is_regex() {
40
- $this->assertFalse( $this->filter->is_regex( '(' ) );
41
- $this->assertTrue( $this->filter->is_regex( '[A-Z]' ) );
42
- }
43
-
44
- public function test_is_ip_address() {
45
- $this->assertFalse( $this->filter->is_ip_address( 'not.an.ip.address' ) );
46
- $this->assertTrue( $this->filter->is_ip_address( '192.168.0.1' ) );
47
- }
48
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tests/tests/test-class-plugin.php DELETED
@@ -1,66 +0,0 @@
1
- <?php
2
- namespace WP_Stream;
3
-
4
- class Test_Plugin extends WP_StreamTestCase {
5
- /*
6
- * Also tests private method locate_plugin
7
- */
8
- public function test_construct() {
9
- $this->assertInternalType( 'array', $this->plugin->locations );
10
- $this->assertNotEmpty( $this->plugin->locations );
11
- $this->assertArrayHasKey( 'plugin', $this->plugin->locations );
12
- $this->assertNotEmpty( $this->plugin->locations['plugin'] );
13
- $this->assertArrayHasKey( 'dir', $this->plugin->locations );
14
- $this->assertNotEmpty( $this->plugin->locations['dir'] );
15
- $this->assertArrayHasKey( 'url', $this->plugin->locations );
16
- $this->assertNotEmpty( $this->plugin->locations['url'] );
17
- $this->assertArrayHasKey( 'inc_dir', $this->plugin->locations );
18
- $this->assertNotEmpty( $this->plugin->locations['inc_dir'] );
19
- $this->assertArrayHasKey( 'class_dir', $this->plugin->locations );
20
- $this->assertNotEmpty( $this->plugin->locations['class_dir'] );
21
-
22
- $this->assertNotEmpty( $this->plugin->db );
23
- $this->assertNotEmpty( $this->plugin->log );
24
- $this->assertNotEmpty( $this->plugin->admin );
25
- $this->assertNotEmpty( $this->plugin->install );
26
- }
27
-
28
- public function test_autoload() {
29
- $this->assertTrue( class_exists( '\WP_Stream\Admin' ) );
30
- $this->assertFalse( class_exists( '\WP_Stream\HAL9000' ) );
31
- }
32
-
33
- public function test_i18n() {
34
- global $l10n;
35
-
36
- $this->plugin->i18n();
37
- $this->assertArrayHasKey( 'stream', $l10n );
38
- }
39
-
40
- public function test_init() {
41
- $this->plugin->settings = null;
42
- $this->plugin->connectors = null;
43
-
44
- $this->assertEmpty( $this->plugin->settings );
45
- $this->assertEmpty( $this->plugin->connectors );
46
-
47
- $this->plugin->init();
48
-
49
- $this->assertNotEmpty( $this->plugin->settings );
50
- $this->assertNotEmpty( $this->plugin->connectors );
51
- }
52
-
53
- public function test_frontend_indicator() {
54
- ob_start();
55
- $this->plugin->frontend_indicator();
56
- $comment = ob_get_clean();
57
-
58
- $this->assertNotEmpty( $comment );
59
- $this->assertContains( 'Stream WordPress user activity plugin', $comment );
60
- }
61
-
62
- public function test_get_version() {
63
- $version = $this->plugin->get_version();
64
- $this->assertNotEmpty( $version );
65
- }
66
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/css/admin.css CHANGED
@@ -13,6 +13,17 @@
13
  overflow: visible;
14
  }
15
 
 
 
 
 
 
 
 
 
 
 
 
16
  #record-query-reset {
17
  position: relative;
18
  margin-left: 5px;
13
  overflow: visible;
14
  }
15
 
16
+ .toplevel_page_wp_stream .tablenav .select2-selection {
17
+ border-color: #ccc;
18
+ background: #f7f7f7;
19
+ -webkit-box-shadow: 0 1px 0 #ccc;
20
+ box-shadow: 0 1px 0 #ccc;
21
+ }
22
+
23
+ .toplevel_page_wp_stream .tablenav .select2-selection .select2-selection__rendered {
24
+ color: #555;
25
+ }
26
+
27
  #record-query-reset {
28
  position: relative;
29
  margin-left: 5px;
ui/js/admin.js CHANGED
@@ -15,39 +15,39 @@ jQuery( function( $ ) {
15
 
16
  $( '.toplevel_page_wp_stream :input.chosen-select' ).each( function( i, el ) {
17
  var args = {},
18
- formatResult = function( record, container ) {
19
- var result = '',
20
- $elem = $( record.element ),
21
- icon = '';
22
-
23
- if ( '- ' === record.text.substring( 0, 2 ) ) {
24
- record.text = record.text.substring( 2 );
25
- }
26
-
27
- if ( undefined !== record.icon ) {
28
- icon = record.icon;
29
- } else if ( undefined !== $elem.attr( 'data-icon' ) ) {
30
- icon = $elem.data( 'icon' );
31
- }
32
- if ( icon ) {
33
- result += '<img src="' + icon + '" class="wp-stream-select2-icon">';
34
- }
35
-
36
- result += record.text;
37
-
38
- // Add more info to the container
39
- container.attr( 'title', $elem.attr( 'title' ) );
40
-
41
- return result;
42
- },
43
- formatSelection = function( record ) {
44
- if ( '- ' === record.text.substring( 0, 2 ) ) {
45
- record.text = record.text.substring( 2 );
46
- }
47
- return record.text;
48
- };
49
-
50
- if ( $( el ).find( 'option' ).length > 0 ) {
51
  args = {
52
  minimumResultsForSearch: 10,
53
  formatResult: formatResult,
@@ -62,40 +62,31 @@ jQuery( function( $ ) {
62
  width: '165px',
63
  ajax: {
64
  url: ajaxurl,
65
- datatype: 'json',
 
66
  data: function( term ) {
67
  return {
68
  action: 'wp_stream_filters',
 
69
  filter: $( el ).attr( 'name' ),
70
- q: term
71
  };
72
  },
73
- results: function( data ) {
74
- return { results: data };
 
 
 
 
 
 
 
 
 
75
  }
76
  },
77
  formatResult: formatResult,
78
- formatSelection: formatSelection,
79
- initSelection: function( element, callback ) {
80
- var id = $( element ).val();
81
- if ( '' !== id ) {
82
- $.post(
83
- ajaxurl,
84
- {
85
- action: 'wp_stream_get_filter_value_by_id',
86
- filter: $( element ).attr( 'name' ),
87
- id: id
88
- },
89
- function( response ) {
90
- callback({
91
- id: id,
92
- text: response
93
- });
94
- },
95
- 'json'
96
- );
97
- }
98
- }
99
  };
100
  }
101
 
@@ -110,7 +101,7 @@ jQuery( function( $ ) {
110
  }
111
 
112
  $( 'input[type=submit]', '#record-filter-form' ).click( function() {
113
- $( 'input[type=submit]', $( this ).parents( 'form' )).removeAttr( 'clicked' );
114
  $( this ).attr( 'clicked', 'true' );
115
  });
116
 
15
 
16
  $( '.toplevel_page_wp_stream :input.chosen-select' ).each( function( i, el ) {
17
  var args = {},
18
+ formatResult = function( record, container ) {
19
+ var result = '',
20
+ $elem = $( record.element ),
21
+ icon = '';
22
+
23
+ if ( '- ' === record.text.substring( 0, 2 ) ) {
24
+ record.text = record.text.substring( 2 );
25
+ }
26
+
27
+ if ( undefined !== record.icon ) {
28
+ icon = record.icon;
29
+ } else if ( undefined !== $elem.attr( 'data-icon' ) ) {
30
+ icon = $elem.data( 'icon' );
31
+ }
32
+ if ( icon ) {
33
+ result += '<img src="' + icon + '" class="wp-stream-select2-icon">';
34
+ }
35
+
36
+ result += record.text;
37
+
38
+ // Add more info to the container
39
+ container.attr( 'title', $elem.attr( 'title' ) );
40
+
41
+ return result;
42
+ },
43
+ formatSelection = function( record ) {
44
+ if ( '- ' === record.text.substring( 0, 2 ) ) {
45
+ record.text = record.text.substring( 2 );
46
+ }
47
+ return record.text;
48
+ };
49
+
50
+ if ( $( el ).find( 'option' ).not( ':selected' ).not( ':empty' ).length > 0 ) {
51
  args = {
52
  minimumResultsForSearch: 10,
53
  formatResult: formatResult,
62
  width: '165px',
63
  ajax: {
64
  url: ajaxurl,
65
+ dataType: 'json',
66
+ quietMillis: 100,
67
  data: function( term ) {
68
  return {
69
  action: 'wp_stream_filters',
70
+ nonce: $( '#stream_filters_user_search_nonce' ).val(),
71
  filter: $( el ).attr( 'name' ),
72
+ q: term.term
73
  };
74
  },
75
+ processResults: function( data ) {
76
+ var results = [];
77
+ $.each( data, function( index, item ){
78
+ results.push({
79
+ id: item.id,
80
+ text: item.label
81
+ });
82
+ });
83
+ return {
84
+ results: results
85
+ };
86
  }
87
  },
88
  formatResult: formatResult,
89
+ formatSelection: formatSelection
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
  };
91
  }
92
 
101
  }
102
 
103
  $( 'input[type=submit]', '#record-filter-form' ).click( function() {
104
+ $( 'input[type=submit]', $( this ).parents( 'form' ) ).removeAttr( 'clicked' );
105
  $( this ).attr( 'clicked', 'true' );
106
  });
107
 
ui/js/settings.js CHANGED
@@ -239,11 +239,11 @@ jQuery( function( $ ) {
239
 
240
  function toggleKeepRecordsFor() {
241
  if ( keepRecordsIndefinitely.is( ':checked' ) ) {
242
- keepRecordsFor.prop( 'disabled', true );
243
- keepRecordsForRow.contents().fadeTo( 250, 0.25 );
244
  } else {
245
- keepRecordsFor.prop( 'disabled', false );
246
- keepRecordsForRow.contents().fadeTo( 250, 1.0 );
247
  }
248
  }
249
 
239
 
240
  function toggleKeepRecordsFor() {
241
  if ( keepRecordsIndefinitely.is( ':checked' ) ) {
242
+ keepRecordsForRow.addClass( 'hidden' );
243
+ keepRecordsFor.addClass( 'hidden' );
244
  } else {
245
+ keepRecordsForRow.removeClass( 'hidden' );
246
+ keepRecordsFor.removeClass( 'hidden' );
247
  }
248
  }
249
 
ui/lib/select2/CONTRIBUTING.md DELETED
@@ -1,107 +0,0 @@
1
- Contributing to Select2
2
- =======================
3
- Looking to contribute something to Select2? **Here's how you can help.**
4
-
5
- Please take a moment to review this document in order to make the contribution
6
- process easy and effective for everyone involved.
7
-
8
- Following these guidelines helps to communicate that you respect the time of
9
- the developers managing and developing this open source project. In return,
10
- they should reciprocate that respect in addressing your issue or assessing
11
- patches and features.
12
-
13
- Using the issue tracker
14
- -----------------------
15
- When [reporting bugs][reporting-bugs] or
16
- [requesting features][requesting-features], the
17
- [issue tracker on GitHub][issue-tracker] is the recommended channel to use.
18
-
19
- The issue tracker **is not** a place for support requests. The
20
- [mailing list][mailing-list] or [IRC channel][irc-channel] are better places to
21
- get help.
22
-
23
- Reporting bugs with Select2
24
- ---------------------------
25
- We really appreciate clear bug reports that _consistently_ show an issue
26
- _within Select2_.
27
-
28
- The ideal bug report follows these guidelines:
29
-
30
- 1. **Use the [GitHub issue search][issue-search]** &mdash; Check if the issue
31
- has already been reported.
32
- 2. **Check if the issue has been fixed** &mdash; Try to reproduce the problem
33
- using the code in the `master` branch.
34
- 3. **Isolate the problem** &mdash; Try to create an
35
- [isolated test case][isolated-case] that consistently reproduces the problem.
36
-
37
- Please try to be as detailed as possible in your bug report, especially if an
38
- isolated test case cannot be made. Some useful questions to include the answer
39
- to are:
40
-
41
- - What steps can be used to reproduce the issue?
42
- - What is the bug and what is the expected outcome?
43
- - What browser(s) and Operating System have you tested with?
44
- - Does the bug happen consistently across all tested browsers?
45
- - What version of jQuery are you using? And what version of Select2?
46
- - Are you using Select2 with other plugins?
47
-
48
- All of these questions will help people fix and identify any potential bugs.
49
-
50
- Requesting features in Select2
51
- ------------------------------
52
- Select2 is a large library that carries with it a lot of functionality. Because
53
- of this, many feature requests will not be implemented in the core library.
54
-
55
- Before starting work on a major feature for Select2, **contact the
56
- [community][community] first** or you may risk spending a considerable amount of
57
- time on something which the project developers are not interested in bringing
58
- into the project.
59
-
60
- ### Select2 4.0
61
-
62
- Many feature requests will be closed off until 4.0, where Select2 plans to adopt
63
- a more flexible API. If you are interested in helping with the development of
64
- the next major Select2 release, please send a message to the
65
- [mailing list][mailing-list] or [irc channel][irc-channel] for more information.
66
-
67
- Triaging issues and pull requests
68
- ---------------------------------
69
- Anyone can help the project maintainers triage issues and review pull requests.
70
-
71
- ### Handling new issues
72
-
73
- Select2 regularly receives new issues which need to be tested and organized.
74
-
75
- When a new issue that comes in that is similar to another existing issue, it
76
- should be checked to make sure it is not a duplicate. Duplicates issues should
77
- be marked by replying to the issue with "Duplicate of #[issue number]" where
78
- `[issue number]` is the url or issue number for the existing issue. This will
79
- allow the project maintainers to quickly close off additional issues and keep
80
- the discussion focused within a single issue.
81
-
82
- If you can test issues that are reported to Select2 that contain test cases and
83
- confirm under what conditions bugs happen, that will allow others to identify
84
- what causes a bug quicker.
85
-
86
- ### Reviewing pull requests
87
-
88
- It is very common for pull requests to be opened for issues that contain a clear
89
- solution to the problem. These pull requests should be rigorously reviewed by
90
- the community before being accepted. If you are not sure about a piece of
91
- submitted code, or know of a better way to do something, do not hesitate to make
92
- a comment on the pull request.
93
-
94
- It should also be made clear that **all code contributed to Select** must be
95
- licensable under the [Apache 2 or GPL 2 licenses][licensing]. Code that cannot
96
- be released under either of these licenses **cannot be accepted** into the
97
- project.
98
-
99
- [community]: https://github.com/ivaynberg/select2#community
100
- [reporting-bugs]: #reporting-bugs-with-select2
101
- [requesting-features]: #requesting-features-in-select2
102
- [issue-tracker]: https://github.com/ivaynberg/select2/issues
103
- [mailing-list]: https://github.com/ivaynberg/select2#mailing-list
104
- [irc-channel]: https://github.com/ivaynberg/select2#irc-channel
105
- [issue-search]: https://github.com/ivaynberg/select2/search?q=&type=Issues
106
- [isolated-case]: http://css-tricks.com/6263-reduced-test-cases/
107
- [licensing]: https://github.com/ivaynberg/select2#copyright-and-license
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/LICENSE DELETED
@@ -1,18 +0,0 @@
1
- Copyright 2014 Igor Vaynberg
2
-
3
- Version: @@ver@@ Timestamp: @@timestamp@@
4
-
5
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
6
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
7
- use of this software only upon the condition that you accept all of the terms of either the Apache
8
- License or the GPL License.
9
-
10
- You may obtain a copy of the Apache License and the GPL License at:
11
-
12
- http://www.apache.org/licenses/LICENSE-2.0
13
- http://www.gnu.org/licenses/gpl-2.0.html
14
-
15
- Unless required by applicable law or agreed to in writing, software distributed under the Apache License
16
- or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
17
- either express or implied. See the Apache License and the GPL License for the specific language governing
18
- permissions and limitations under the Apache License and the GPL License.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/README.md DELETED
@@ -1,115 +0,0 @@
1
- Select2
2
- =======
3
-
4
- Select2 is a jQuery-based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.
5
-
6
- To get started, checkout examples and documentation at http://select2.github.io/select2/
7
-
8
- Use cases
9
- ---------
10
-
11
- * Enhancing native selects with search.
12
- * Enhancing native selects with a better multi-select interface.
13
- * Loading data from JavaScript: easily load items via ajax and have them searchable.
14
- * Nesting optgroups: native selects only support one level of nested. Select2 does not have this restriction.
15
- * Tagging: ability to add new items on the fly.
16
- * Working with large, remote datasets: ability to partially load a dataset based on the search term.
17
- * Paging of large datasets: easy support for loading more pages when the results are scrolled to the end.
18
- * Templating: support for custom rendering of results and selections.
19
-
20
- Browser compatibility
21
- ---------------------
22
- * IE 8+
23
- * Chrome 8+
24
- * Firefox 10+
25
- * Safari 3+
26
- * Opera 10.6+
27
-
28
- Usage
29
- -----
30
- You can source Select2 directly from a CDN like [jsDelivr](http://www.jsdelivr.com/#!select2) or [CDNJS](http://www.cdnjs.com/libraries/select2), [download it from this GitHub repo](https://github.com/select2/select2/tags), or use one of the integrations below.
31
-
32
- Integrations
33
- ------------
34
-
35
- * [Wicket-Select2](https://github.com/ivaynberg/wicket-select2) (Java / [Apache Wicket](http://wicket.apache.org))
36
- * [select2-rails](https://github.com/argerim/select2-rails) (Ruby on Rails)
37
- * [AngularUI](http://angular-ui.github.io/#ui-select) ([AngularJS](https://angularjs.org/))
38
- * [Django](https://github.com/applegrew/django-select2)
39
- * [Symfony](https://github.com/19Gerhard85/sfSelect2WidgetsPlugin)
40
- * [Symfony2](https://github.com/avocode/FormExtensions)
41
- * [Bootstrap 2](https://github.com/t0m/select2-bootstrap-css) and [Bootstrap 3](https://github.com/t0m/select2-bootstrap-css/tree/bootstrap3) (CSS skins)
42
- * [Meteor](https://github.com/nate-strauser/meteor-select2) (modern reactive JavaScript framework; + [Bootstrap 3 skin](https://github.com/esperadomedia/meteor-select2-bootstrap3-css/))
43
- * [Meteor](https://jquery-select2.meteor.com)
44
- * [Yii 2.x](http://demos.krajee.com/widgets#select2)
45
- * [Yii 1.x](https://github.com/tonybolzan/yii-select2)
46
- * [AtmosphereJS](https://atmospherejs.com/package/jquery-select2)
47
- * [EmberJS](https://github.com/iStefo/ember-select-2)
48
-
49
- ### Example Integrations
50
-
51
- * [Knockout.js](https://github.com/ivaynberg/select2/wiki/Knockout.js-Integration)
52
- * [Socket.IO](https://github.com/ivaynberg/select2/wiki/Socket.IO-Integration)
53
- * [PHP](https://github.com/ivaynberg/select2/wiki/PHP-Example)
54
- * [.Net MVC] (https://github.com/ivaynberg/select2/wiki/.Net-MVC-Example)
55
-
56
- Internationalization (i18n)
57
- ---------------------------
58
-
59
- Select2 supports multiple languages by simply including the right language JS
60
- file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`.
61
-
62
- Missing a language? Just copy `select2_locale_en.js.template`, translate
63
- it, and make a pull request back to Select2 here on GitHub.
64
-
65
- Documentation
66
- -------------
67
-
68
- The documentation for Select2 is available [through GitHub Pages](http://select2.github.io/select2/) and is located within this repository in the [`gh-pages` branch](https://github.com/ivaynberg/select2/tree/gh-pages).
69
-
70
- Community
71
- ---------
72
-
73
- ### Bug tracker
74
-
75
- Have a bug? Please create an issue here on GitHub!
76
-
77
- https://github.com/ivaynberg/select2/issues
78
-
79
- ### Mailing list
80
-
81
- Have a question? Ask on our mailing list!
82
-
83
- select2@googlegroups.com
84
-
85
- https://groups.google.com/d/forum/select2
86
-
87
- ### IRC channel
88
-
89
- Need help implementing Select2 in your project? Ask in our IRC channel!
90
-
91
- **Network:** [Freenode](https://freenode.net/) (`chat.freenode.net`)
92
-
93
- **Channel:** `#select2`
94
-
95
- **Web access:** https://webchat.freenode.net/?channels=select2
96
-
97
- Copyright and license
98
- ---------------------
99
-
100
- Copyright 2015 Igor Vaynberg
101
-
102
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
103
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
104
- use of this software only upon the condition that you accept all of the terms of either the Apache
105
- License or the GPL License.
106
-
107
- You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
108
-
109
- http://www.apache.org/licenses/LICENSE-2.0
110
- http://www.gnu.org/licenses/gpl-2.0.html
111
-
112
- Unless required by applicable law or agreed to in writing, software distributed under the Apache License
113
- or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
114
- either express or implied. See the Apache License and the GPL License for the specific language governing
115
- permissions and limitations under the Apache License and the GPL License.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/bower.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "name": "select2",
3
- "version": "3.5.2",
4
- "main": ["select2.js", "select2.css", "select2.png", "select2x2.png", "select2-spinner.gif"],
5
- "dependencies": {
6
- "jquery": ">= 1.7.1"
7
- }
8
- }
 
 
 
 
 
 
 
 
ui/lib/select2/component.json DELETED
@@ -1,66 +0,0 @@
1
- {
2
- "name": "select2",
3
- "repo": "ivaynberg/select2",
4
- "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
5
- "version": "3.5.2",
6
- "demo": "http://ivaynberg.github.io/select2/",
7
- "keywords": [
8
- "jquery"
9
- ],
10
- "main": "select2.js",
11
- "styles": [
12
- "select2.css",
13
- "select2-bootstrap.css"
14
- ],
15
- "scripts": [
16
- "select2.js",
17
- "select2_locale_ar.js",
18
- "select2_locale_bg.js",
19
- "select2_locale_ca.js",
20
- "select2_locale_cs.js",
21
- "select2_locale_da.js",
22
- "select2_locale_de.js",
23
- "select2_locale_el.js",
24
- "select2_locale_es.js",
25
- "select2_locale_et.js",
26
- "select2_locale_eu.js",
27
- "select2_locale_fa.js",
28
- "select2_locale_fi.js",
29
- "select2_locale_fr.js",
30
- "select2_locale_gl.js",
31
- "select2_locale_he.js",
32
- "select2_locale_hr.js",
33
- "select2_locale_hu.js",
34
- "select2_locale_id.js",
35
- "select2_locale_is.js",
36
- "select2_locale_it.js",
37
- "select2_locale_ja.js",
38
- "select2_locale_ka.js",
39
- "select2_locale_ko.js",
40
- "select2_locale_lt.js",
41
- "select2_locale_lv.js",
42
- "select2_locale_mk.js",
43
- "select2_locale_ms.js",
44
- "select2_locale_nl.js",
45
- "select2_locale_no.js",
46
- "select2_locale_pl.js",
47
- "select2_locale_pt-BR.js",
48
- "select2_locale_pt-PT.js",
49
- "select2_locale_ro.js",
50
- "select2_locale_ru.js",
51
- "select2_locale_sk.js",
52
- "select2_locale_sv.js",
53
- "select2_locale_th.js",
54
- "select2_locale_tr.js",
55
- "select2_locale_uk.js",
56
- "select2_locale_vi.js",
57
- "select2_locale_zh-CN.js",
58
- "select2_locale_zh-TW.js"
59
- ],
60
- "images": [
61
- "select2-spinner.gif",
62
- "select2.png",
63
- "select2x2.png"
64
- ],
65
- "license": "MIT"
66
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/composer.json DELETED
@@ -1,29 +0,0 @@
1
- {
2
- "name":
3
- "ivaynberg/select2",
4
- "description": "Select2 is a jQuery based replacement for select boxes.",
5
- "version": "3.5.2",
6
- "type": "component",
7
- "homepage": "http://ivaynberg.github.io/select2/",
8
- "license": "Apache-2.0",
9
- "require": {
10
- "robloach/component-installer": "*",
11
- "components/jquery": ">=1.7.1"
12
- },
13
- "extra": {
14
- "component": {
15
- "scripts": [
16
- "select2.js"
17
- ],
18
- "files": [
19
- "select2.js",
20
- "select2_locale_*.js",
21
- "select2.css",
22
- "select2-bootstrap.css",
23
- "select2-spinner.gif",
24
- "select2.png",
25
- "select2x2.png"
26
- ]
27
- }
28
- }
29
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/css/select2.css ADDED
@@ -0,0 +1,484 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .select2-container {
2
+ box-sizing: border-box;
3
+ display: inline-block;
4
+ margin: 0;
5
+ position: relative;
6
+ vertical-align: middle; }
7
+ .select2-container .select2-selection--single {
8
+ box-sizing: border-box;
9
+ cursor: pointer;
10
+ display: block;
11
+ height: 28px;
12
+ user-select: none;
13
+ -webkit-user-select: none; }
14
+ .select2-container .select2-selection--single .select2-selection__rendered {
15
+ display: block;
16
+ padding-left: 8px;
17
+ padding-right: 20px;
18
+ overflow: hidden;
19
+ text-overflow: ellipsis;
20
+ white-space: nowrap; }
21
+ .select2-container .select2-selection--single .select2-selection__clear {
22
+ position: relative; }
23
+ .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered {
24
+ padding-right: 8px;
25
+ padding-left: 20px; }
26
+ .select2-container .select2-selection--multiple {
27
+ box-sizing: border-box;
28
+ cursor: pointer;
29
+ display: block;
30
+ min-height: 32px;
31
+ user-select: none;
32
+ -webkit-user-select: none; }
33
+ .select2-container .select2-selection--multiple .select2-selection__rendered {
34
+ display: inline-block;
35
+ overflow: hidden;
36
+ padding-left: 8px;
37
+ text-overflow: ellipsis;
38
+ white-space: nowrap; }
39
+ .select2-container .select2-search--inline {
40
+ float: left; }
41
+ .select2-container .select2-search--inline .select2-search__field {
42
+ box-sizing: border-box;
43
+ border: none;
44
+ font-size: 100%;
45
+ margin-top: 5px;
46
+ padding: 0; }
47
+ .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button {
48
+ -webkit-appearance: none; }
49
+
50
+ .select2-dropdown {
51
+ background-color: white;
52
+ border: 1px solid #aaa;
53
+ border-radius: 4px;
54
+ box-sizing: border-box;
55
+ display: block;
56
+ position: absolute;
57
+ left: -100000px;
58
+ width: 100%;
59
+ z-index: 1051; }
60
+
61
+ .select2-results {
62
+ display: block; }
63
+
64
+ .select2-results__options {
65
+ list-style: none;
66
+ margin: 0;
67
+ padding: 0; }
68
+
69
+ .select2-results__option {
70
+ padding: 6px;
71
+ user-select: none;
72
+ -webkit-user-select: none; }
73
+ .select2-results__option[aria-selected] {
74
+ cursor: pointer; }
75
+
76
+ .select2-container--open .select2-dropdown {
77
+ left: 0; }
78
+
79
+ .select2-container--open .select2-dropdown--above {
80
+ border-bottom: none;
81
+ border-bottom-left-radius: 0;
82
+ border-bottom-right-radius: 0; }
83
+
84
+ .select2-container--open .select2-dropdown--below {
85
+ border-top: none;
86
+ border-top-left-radius: 0;
87
+ border-top-right-radius: 0; }
88
+
89
+ .select2-search--dropdown {
90
+ display: block;
91
+ padding: 4px; }
92
+ .select2-search--dropdown .select2-search__field {
93
+ padding: 4px;
94
+ width: 100%;
95
+ box-sizing: border-box; }
96
+ .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button {
97
+ -webkit-appearance: none; }
98
+ .select2-search--dropdown.select2-search--hide {
99
+ display: none; }
100
+
101
+ .select2-close-mask {
102
+ border: 0;
103
+ margin: 0;
104
+ padding: 0;
105
+ display: block;
106
+ position: fixed;
107
+ left: 0;
108
+ top: 0;
109
+ min-height: 100%;
110
+ min-width: 100%;
111
+ height: auto;
112
+ width: auto;
113
+ opacity: 0;
114
+ z-index: 99;
115
+ background-color: #fff;
116
+ filter: alpha(opacity=0); }
117
+
118
+ .select2-hidden-accessible {
119
+ border: 0 !important;
120
+ clip: rect(0 0 0 0) !important;
121
+ height: 1px !important;
122
+ margin: -1px !important;
123
+ overflow: hidden !important;
124
+ padding: 0 !important;
125
+ position: absolute !important;
126
+ width: 1px !important; }
127
+
128
+ .select2-container--default .select2-selection--single {
129
+ background-color: #fff;
130
+ border: 1px solid #aaa;
131
+ border-radius: 4px; }
132
+ .select2-container--default .select2-selection--single .select2-selection__rendered {
133
+ color: #444;
134
+ line-height: 28px; }
135
+ .select2-container--default .select2-selection--single .select2-selection__clear {
136
+ cursor: pointer;
137
+ float: right;
138
+ font-weight: bold; }
139
+ .select2-container--default .select2-selection--single .select2-selection__placeholder {
140
+ color: #999; }
141
+ .select2-container--default .select2-selection--single .select2-selection__arrow {
142
+ height: 26px;
143
+ position: absolute;
144
+ top: 1px;
145
+ right: 1px;
146
+ width: 20px; }
147
+ .select2-container--default .select2-selection--single .select2-selection__arrow b {
148
+ border-color: #888 transparent transparent transparent;
149
+ border-style: solid;
150
+ border-width: 5px 4px 0 4px;
151
+ height: 0;
152
+ left: 50%;
153
+ margin-left: -4px;
154
+ margin-top: -2px;
155
+ position: absolute;
156
+ top: 50%;
157
+ width: 0; }
158
+
159
+ .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear {
160
+ float: left; }
161
+
162
+ .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow {
163
+ left: 1px;
164
+ right: auto; }
165
+
166
+ .select2-container--default.select2-container--disabled .select2-selection--single {
167
+ background-color: #eee;
168
+ cursor: default; }
169
+ .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear {
170
+ display: none; }
171
+
172
+ .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
173
+ border-color: transparent transparent #888 transparent;
174
+ border-width: 0 4px 5px 4px; }
175
+
176
+ .select2-container--default .select2-selection--multiple {
177
+ background-color: white;
178
+ border: 1px solid #aaa;
179
+ border-radius: 4px;
180
+ cursor: text; }
181
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered {
182
+ box-sizing: border-box;
183
+ list-style: none;
184
+ margin: 0;
185
+ padding: 0 5px;
186
+ width: 100%; }
187
+ .select2-container--default .select2-selection--multiple .select2-selection__rendered li {
188
+ list-style: none; }
189
+ .select2-container--default .select2-selection--multiple .select2-selection__placeholder {
190
+ color: #999;
191
+ margin-top: 5px;
192
+ float: left; }
193
+ .select2-container--default .select2-selection--multiple .select2-selection__clear {
194
+ cursor: pointer;
195
+ float: right;
196
+ font-weight: bold;
197
+ margin-top: 5px;
198
+ margin-right: 10px; }
199
+ .select2-container--default .select2-selection--multiple .select2-selection__choice {
200
+ background-color: #e4e4e4;
201
+ border: 1px solid #aaa;
202
+ border-radius: 4px;
203
+ cursor: default;
204
+ float: left;
205
+ margin-right: 5px;
206
+ margin-top: 5px;
207
+ padding: 0 5px; }
208
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove {
209
+ color: #999;
210
+ cursor: pointer;
211
+ display: inline-block;
212
+ font-weight: bold;
213
+ margin-right: 2px; }
214
+ .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover {
215
+ color: #333; }
216
+
217
+ .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline {
218
+ float: right; }
219
+
220
+ .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
221
+ margin-left: 5px;
222
+ margin-right: auto; }
223
+
224
+ .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
225
+ margin-left: 2px;
226
+ margin-right: auto; }
227
+
228
+ .select2-container--default.select2-container--focus .select2-selection--multiple {
229
+ border: solid black 1px;
230
+ outline: 0; }
231
+
232
+ .select2-container--default.select2-container--disabled .select2-selection--multiple {
233
+ background-color: #eee;
234
+ cursor: default; }
235
+
236
+ .select2-container--default.select2-container--disabled .select2-selection__choice__remove {
237
+ display: none; }
238
+
239
+ .select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple {
240
+ border-top-left-radius: 0;
241
+ border-top-right-radius: 0; }
242
+
243
+ .select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple {
244
+ border-bottom-left-radius: 0;
245
+ border-bottom-right-radius: 0; }
246
+
247
+ .select2-container--default .select2-search--dropdown .select2-search__field {
248
+ border: 1px solid #aaa; }
249
+
250
+ .select2-container--default .select2-search--inline .select2-search__field {
251
+ background: transparent;
252
+ border: none;
253
+ outline: 0;
254
+ box-shadow: none;
255
+ -webkit-appearance: textfield; }
256
+
257
+ .select2-container--default .select2-results > .select2-results__options {
258
+ max-height: 200px;
259
+ overflow-y: auto; }
260
+
261
+ .select2-container--default .select2-results__option[role=group] {
262
+ padding: 0; }
263
+
264
+ .select2-container--default .select2-results__option[aria-disabled=true] {
265
+ color: #999; }
266
+
267
+ .select2-container--default .select2-results__option[aria-selected=true] {
268
+ background-color: #ddd; }
269
+
270
+ .select2-container--default .select2-results__option .select2-results__option {
271
+ padding-left: 1em; }
272
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__group {
273
+ padding-left: 0; }
274
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option {
275
+ margin-left: -1em;
276
+ padding-left: 2em; }
277
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
278
+ margin-left: -2em;
279
+ padding-left: 3em; }
280
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
281
+ margin-left: -3em;
282
+ padding-left: 4em; }
283
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
284
+ margin-left: -4em;
285
+ padding-left: 5em; }
286
+ .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option {
287
+ margin-left: -5em;
288
+ padding-left: 6em; }
289
+
290
+ .select2-container--default .select2-results__option--highlighted[aria-selected] {
291
+ background-color: #5897fb;
292
+ color: white; }
293
+
294
+ .select2-container--default .select2-results__group {
295
+ cursor: default;
296
+ display: block;
297
+ padding: 6px; }
298
+
299
+ .select2-container--classic .select2-selection--single {
300
+ background-color: #f7f7f7;
301
+ border: 1px solid #aaa;
302
+ border-radius: 4px;
303
+ outline: 0;
304
+ background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%);
305
+ background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%);
306
+ background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%);
307
+ background-repeat: repeat-x;
308
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
309
+ .select2-container--classic .select2-selection--single:focus {
310
+ border: 1px solid #5897fb; }
311
+ .select2-container--classic .select2-selection--single .select2-selection__rendered {
312
+ color: #444;
313
+ line-height: 28px; }
314
+ .select2-container--classic .select2-selection--single .select2-selection__clear {
315
+ cursor: pointer;
316
+ float: right;
317
+ font-weight: bold;
318
+ margin-right: 10px; }
319
+ .select2-container--classic .select2-selection--single .select2-selection__placeholder {
320
+ color: #999; }
321
+ .select2-container--classic .select2-selection--single .select2-selection__arrow {
322
+ background-color: #ddd;
323
+ border: none;
324
+ border-left: 1px solid #aaa;
325
+ border-top-right-radius: 4px;
326
+ border-bottom-right-radius: 4px;
327
+ height: 26px;
328
+ position: absolute;
329
+ top: 1px;
330
+ right: 1px;
331
+ width: 20px;
332
+ background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
333
+ background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);
334
+ background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);
335
+ background-repeat: repeat-x;
336
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); }
337
+ .select2-container--classic .select2-selection--single .select2-selection__arrow b {
338
+ border-color: #888 transparent transparent transparent;
339
+ border-style: solid;
340
+ border-width: 5px 4px 0 4px;
341
+ height: 0;
342
+ left: 50%;
343
+ margin-left: -4px;
344
+ margin-top: -2px;
345
+ position: absolute;
346
+ top: 50%;
347
+ width: 0; }
348
+
349
+ .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear {
350
+ float: left; }
351
+
352
+ .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow {
353
+ border: none;
354
+ border-right: 1px solid #aaa;
355
+ border-radius: 0;
356
+ border-top-left-radius: 4px;
357
+ border-bottom-left-radius: 4px;
358
+ left: 1px;
359
+ right: auto; }
360
+
361
+ .select2-container--classic.select2-container--open .select2-selection--single {
362
+ border: 1px solid #5897fb; }
363
+ .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow {
364
+ background: transparent;
365
+ border: none; }
366
+ .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b {
367
+ border-color: transparent transparent #888 transparent;
368
+ border-width: 0 4px 5px 4px; }
369
+
370
+ .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single {
371
+ border-top: none;
372
+ border-top-left-radius: 0;
373
+ border-top-right-radius: 0;
374
+ background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%);
375
+ background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%);
376
+ background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%);
377
+ background-repeat: repeat-x;
378
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); }
379
+
380
+ .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single {
381
+ border-bottom: none;
382
+ border-bottom-left-radius: 0;
383
+ border-bottom-right-radius: 0;
384
+ background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%);
385
+ background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%);
386
+ background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%);
387
+ background-repeat: repeat-x;
388
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); }
389
+
390
+ .select2-container--classic .select2-selection--multiple {
391
+ background-color: white;
392
+ border: 1px solid #aaa;
393
+ border-radius: 4px;
394
+ cursor: text;
395
+ outline: 0; }
396
+ .select2-container--classic .select2-selection--multiple:focus {
397
+ border: 1px solid #5897fb; }
398
+ .select2-container--classic .select2-selection--multiple .select2-selection__rendered {
399
+ list-style: none;
400
+ margin: 0;
401
+ padding: 0 5px; }
402
+ .select2-container--classic .select2-selection--multiple .select2-selection__clear {
403
+ display: none; }
404
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice {
405
+ background-color: #e4e4e4;
406
+ border: 1px solid #aaa;
407
+ border-radius: 4px;
408
+ cursor: default;
409
+ float: left;
410
+ margin-right: 5px;
411
+ margin-top: 5px;
412
+ padding: 0 5px; }
413
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove {
414
+ color: #888;
415
+ cursor: pointer;
416
+ display: inline-block;
417
+ font-weight: bold;
418
+ margin-right: 2px; }
419
+ .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover {
420
+ color: #555; }
421
+
422
+ .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
423
+ float: right; }
424
+
425
+ .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice {
426
+ margin-left: 5px;
427
+ margin-right: auto; }
428
+
429
+ .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove {
430
+ margin-left: 2px;
431
+ margin-right: auto; }
432
+
433
+ .select2-container--classic.select2-container--open .select2-selection--multiple {
434
+ border: 1px solid #5897fb; }
435
+
436
+ .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple {
437
+ border-top: none;
438
+ border-top-left-radius: 0;
439
+ border-top-right-radius: 0; }
440
+
441
+ .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple {
442
+ border-bottom: none;
443
+ border-bottom-left-radius: 0;
444
+ border-bottom-right-radius: 0; }
445
+
446
+ .select2-container--classic .select2-search--dropdown .select2-search__field {
447
+ border: 1px solid #aaa;
448
+ outline: 0; }
449
+
450
+ .select2-container--classic .select2-search--inline .select2-search__field {
451
+ outline: 0;
452
+ box-shadow: none; }
453
+
454
+ .select2-container--classic .select2-dropdown {
455
+ background-color: white;
456
+ border: 1px solid transparent; }
457
+
458
+ .select2-container--classic .select2-dropdown--above {
459
+ border-bottom: none; }
460
+
461
+ .select2-container--classic .select2-dropdown--below {
462
+ border-top: none; }
463
+
464
+ .select2-container--classic .select2-results > .select2-results__options {
465
+ max-height: 200px;
466
+ overflow-y: auto; }
467
+
468
+ .select2-container--classic .select2-results__option[role=group] {
469
+ padding: 0; }
470
+
471
+ .select2-container--classic .select2-results__option[aria-disabled=true] {
472
+ color: grey; }
473
+
474
+ .select2-container--classic .select2-results__option--highlighted[aria-selected] {
475
+ background-color: #3875d7;
476
+ color: white; }
477
+
478
+ .select2-container--classic .select2-results__group {
479
+ cursor: default;
480
+ display: block;
481
+ padding: 6px; }
482
+
483
+ .select2-container--classic.select2-container--open .select2-dropdown {
484
+ border-color: #5897fb; }
ui/lib/select2/css/select2.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
ui/lib/select2/js/i18n/ar.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="الرجاء حذف "+t+" عناصر";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="الرجاء إضافة "+t+" عناصر";return n},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(e){var t="تستطيع إختيار "+e.maximum+" بنود فقط";return t},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/az.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/az",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return t+" simvol silin"},inputTooShort:function(e){var t=e.minimum-e.input.length;return t+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(e){return"Sadəcə "+e.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/bg.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/bg",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Моля въведете с "+t+" по-малко символ";return t>1&&(n+="a"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Моля въведете още "+t+" символ";return t>1&&(n+="a"),n},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(e){var t="Можете да направите до "+e.maximum+" ";return e.maximum>1?t+="избора":t+="избор",t},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/ca.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Si us plau, elimina "+t+" car";return t==1?n+="àcter":n+="àcters",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Si us plau, introdueix "+t+" car";return t==1?n+="àcter":n+="àcters",n},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var t="Només es pot seleccionar "+e.maximum+" element";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/cs.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/cs",[],function(){function e(e,t){switch(e){case 2:return t?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím zadejte o jeden znak méně":n<=4?"Prosím zadejte o "+e(n,!0)+" znaky méně":"Prosím zadejte o "+n+" znaků méně"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím zadejte ještě jeden znak":n<=4?"Prosím zadejte ještě další "+e(n,!0)+" znaky":"Prosím zadejte ještě dalších "+n+" znaků"},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(t){var n=t.maximum;return n==1?"Můžete zvolit jen jednu položku":n<=4?"Můžete zvolit maximálně "+e(n,!1)+" položky":"Můžete zvolit maximálně "+n+" položek"},noResults:function(){return"Nenalezeny žádné položky"},searching:function(){return"Vyhledávání…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/da.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Angiv venligst "+t+" tegn mindre";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Angiv venligst "+t+" tegn mere";return n},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var t="Du kan kun vælge "+e.maximum+" emne";return e.maximum!=1&&(t+="r"),t},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/de.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/de",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Bitte "+t+" Zeichen weniger eingeben"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Bitte "+t+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var t="Sie können nur "+e.maximum+" Eintr";return e.maximum===1?t+="ag":t+="äge",t+=" auswählen",t},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/el.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Παρακαλώ διαγράψτε "+t+" χαρακτήρ";return t==1&&(n+="α"),t!=1&&(n+="ες"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Παρακαλώ συμπληρώστε "+t+" ή περισσότερους χαρακτήρες";return n},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(e){var t="Μπορείτε να επιλέξετε μόνο "+e.maximum+" επιλογ";return e.maximum==1&&(t+="ή"),e.maximum!=1&&(t+="ές"),t},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/en.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Please delete "+t+" character";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Please enter "+t+" or more characters";return n},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var t="You can only select "+e.maximum+" item";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/es.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"La carga falló"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor, elimine "+t+" car";return t==1?n+="ácter":n+="acteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Por favor, introduzca "+t+" car";return t==1?n+="ácter":n+="acteres",n},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var t="Sólo puede seleccionar "+e.maximum+" elemento";return e.maximum!=1&&(t+="s"),t},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/et.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" vähem",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Sisesta "+t+" täht";return t!=1&&(n+="e"),n+=" rohkem",n},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var t="Saad vaid "+e.maximum+" tulemus";return e.maximum==1?t+="e":t+="t",t+=" valida",t},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/eu.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gutxiago",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return t==1?n+="karaktere bat":n+=t+" karaktere",n+=" gehiago",n},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return e.maximum===1?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/fa.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="لطفاً "+t+" کاراکتر را حذف نمایید";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="لطفاً تعداد "+t+" کاراکتر یا بیشتر وارد نمایید";return n},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(e){var t="شما تنها می‌توانید "+e.maximum+" آیتم را انتخاب نمایید";return t},noResults:function(){return"هیچ نتیجه‌ای یافت نشد"},searching:function(){return"در حال جستجو..."}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/fi.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Ole hyvä ja anna "+t+" merkkiä vähemmän"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Ole hyvä ja anna "+t+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(e){return"Voit valita ainoastaan "+e.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/fr.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Supprimez "+t+" caractère";return t!==1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Saisissez "+t+" caractère";return t!==1&&(n+="s"),n},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){var t="Vous pouvez seulement sélectionner "+e.maximum+" élément";return e.maximum!==1&&(t+="s"),t},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/gl.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/gl",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Elimine ";return t===1?n+="un carácter":n+=t+" caracteres",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Engada ";return t===1?n+="un carácter":n+=t+" caracteres",n},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){var t="Só pode ";return e.maximum===1?t+="un elemento":t+=e.maximum+" elementos",t},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/he.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="נא למחוק ";return t===1?n+="תו אחד":n+=t+" תווים",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="נא להכניס ";return t===1?n+="תו אחד":n+=t+" תווים",n+=" או יותר",n},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(e){var t="באפשרותך לבחור עד ";return e.maximum===1?t+="פריט אחד":t+=e.maximum+" פריטים",t},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/hi.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" अक्षर को हटा दें";return t>1&&(n=t+" अक्षरों को हटा दें "),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="कृपया "+t+" या अधिक अक्षर दर्ज करें";return n},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(e){var t="आप केवल "+e.maximum+" आइटम का चयन कर सकते हैं";return t},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/hr.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hr",[],function(){function e(e){var t=" "+e+" znak";return e%10<5&&e%10>0&&(e%100<5||e%100>19)?e%10>1&&(t+="a"):t+="ova",t}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Unesite "+e(n)},inputTooShort:function(t){var n=t.minimum-t.input.length;return"Unesite još "+e(n)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(e){return"Maksimalan broj odabranih stavki je "+e.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/hu.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/hu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum;return"Túl hosszú. "+t+" karakterrel több, mint kellene."},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Túl rövid. Még "+t+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/id.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Hapuskan "+t+" huruf"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Masukkan "+t+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(e){return"Anda hanya dapat memilih "+e.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/is.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/is",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vinsamlegast styttið texta um "+t+" staf";return t<=1?n:n+"i"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vinsamlegast skrifið "+t+" staf";return t>1&&(n+="i"),n+=" í viðbót",n},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(e){return"Þú getur aðeins valið "+e.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/it.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Per favore cancella "+t+" caratter";return t!==1?n+="i":n+="e",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Per favore inserisci "+t+" o più caratteri";return n},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var t="Puoi selezionare solo "+e.maximum+" element";return e.maximum!==1?t+="i":t+="o",t},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/ja.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" 文字を削除してください";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="少なくとも "+t+" 文字を入力してください";return n},loadingMore:function(){return"読み込み中…"},maximumSelected:function(e){var t=e.maximum+" 件しか選択できません";return t},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/km.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="សូមលុបចេញ "+t+" អក្សរ";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="សូមបញ្ចូល"+t+" អក្សរ រឺ ច្រើនជាងនេះ";return n},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(e){var t="អ្នកអាចជ្រើសរើសបានតែ "+e.maximum+" ជម្រើសប៉ុណ្ណោះ";return t},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/ko.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="너무 깁니다. "+t+" 글자 지워주세요.";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="너무 짧습니다. "+t+" 글자 더 입력해주세요.";return n},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(e){var t="최대 "+e.maximum+"개까지만 선택 가능합니다.";return t},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/lt.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lt",[],function(){function e(e,t,n,r){return e%10===1&&(e%100<11||e%100>19)?t:e%10>=2&&e%10<=9&&(e%100<11||e%100>19)?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Pašalinkite "+n+" simbol";return r+=e(n,"į","ius","ių"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Įrašykite dar "+n+" simbol";return r+=e(n,"į","ius","ių"),r},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(t){var n="Jūs galite pasirinkti tik "+t.maximum+" element";return n+=e(t.maximum,"ą","us","ų"),n},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/lv.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/lv",[],function(){function e(e,t,n,r){return e===11?t:e%10===1?n:r}return{inputTooLong:function(t){var n=t.input.length-t.maximum,r="Lūdzu ievadiet par "+n;return r+=" simbol"+e(n,"iem","u","iem"),r+" mazāk"},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Lūdzu ievadiet vēl "+n;return r+=" simbol"+e(n,"us","u","us"),r},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(t){var n="Jūs varat izvēlēties ne vairāk kā "+t.maximum;return n+=" element"+e(t.maximum,"us","u","us"),n},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/mk.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/mk",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Ве молиме внесете "+e.maximum+" помалку карактер";return e.maximum!==1&&(n+="и"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Ве молиме внесете уште "+e.maximum+" карактер";return e.maximum!==1&&(n+="и"),n},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(e){var t="Можете да изберете само "+e.maximum+" ставк";return e.maximum===1?t+="а":t+="и",t},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/ms.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Sila hapuskan "+t+" aksara"},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Sila masukkan "+t+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(e){return"Anda hanya boleh memilih "+e.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/nb.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Vennligst fjern "+t+" tegn"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vennligst skriv inn ";return t>1?n+=" flere tegn":n+=" tegn til",n},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/nl.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Gelieve "+t+" karakters te verwijderen";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Gelieve "+t+" of meer karakters in te voeren";return n},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var t=e.maximum==1?"kan":"kunnen",n="Er "+t+" maar "+e.maximum+" item";return e.maximum!=1&&(n+="s"),n+=" worden geselecteerd",n},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/pl.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pl",[],function(){var e=["znak","znaki","znaków"],t=["element","elementy","elementów"],n=function(t,n){if(t===1)return n[0];if(t>1&&t<=4)return n[1];if(t>=5)return n[2]};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(t){var r=t.input.length-t.maximum;return"Usuń "+r+" "+n(r,e)},inputTooShort:function(t){var r=t.minimum-t.input.length;return"Podaj przynajmniej "+r+" "+n(r,e)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(e){return"Możesz zaznaczyć tylko "+e.maximum+" "+n(e.maximum,t)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/pt-BR.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Apague "+t+" caracter";return t!=1&&(n+="es"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Digite "+t+" ou mais caracteres";return n},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var t="Você só pode selecionar "+e.maximum+" ite";return e.maximum==1?t+="m":t+="ns",t},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/pt.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Por favor apague "+t+" ";return n+=t!=1?"caracteres":"carácter",n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Introduza "+t+" ou mais caracteres";return n},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var t="Apenas pode seleccionar "+e.maximum+" ";return t+=e.maximum!=1?"itens":"item",t},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/ro.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return t!==1&&(n+="e"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vă rugăm să introduceți "+t+"sau mai multe caractere";return n},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",e.maximum!==1&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/ru.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/ru",[],function(){function e(e,t,n,r){return e%10<5&&e%10>0&&e%100<5||e%100>20?e%10>1?n:t:r}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Пожалуйста, введите на "+n+" символ";return r+=e(n,"","a","ов"),r+=" меньше",r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Пожалуйста, введите еще хотя бы "+n+" символ";return r+=e(n,"","a","ов"),r},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(t){var n="Вы можете выбрать не более "+t.maximum+" элемент";return n+=e(t.maximum,"","a","ов"),n},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/sk.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{inputTooLong:function(t){var n=t.input.length-t.maximum;return n==1?"Prosím, zadajte o jeden znak menej":n>=2&&n<=4?"Prosím, zadajte o "+e[n](!0)+" znaky menej":"Prosím, zadajte o "+n+" znakov menej"},inputTooShort:function(t){var n=t.minimum-t.input.length;return n==1?"Prosím, zadajte ešte jeden znak":n<=4?"Prosím, zadajte ešte ďalšie "+e[n](!0)+" znaky":"Prosím, zadajte ešte ďalších "+n+" znakov"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(t){return t.maximum==1?"Môžete zvoliť len jednu položku":t.maximum>=2&&t.maximum<=4?"Môžete zvoliť najviac "+e[t.maximum](!1)+" položky":"Môžete zvoliť najviac "+t.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/sr-Cyrl.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr-Cyrl",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Обришите "+n+" симбол";return r+=e(n,"","а","а"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Укуцајте бар још "+n+" симбол";return r+=e(n,"","а","а"),r},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(t){var n="Можете изабрати само "+t.maximum+" ставк";return n+=e(t.maximum,"у","е","и"),n},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/sr.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sr",[],function(){function e(e,t,n,r){return e%10==1&&e%100!=11?t:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?n:r}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(t){var n=t.input.length-t.maximum,r="Obrišite "+n+" simbol";return r+=e(n,"","a","a"),r},inputTooShort:function(t){var n=t.minimum-t.input.length,r="Ukucajte bar još "+n+" simbol";return r+=e(n,"","a","a"),r},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(t){var n="Možete izabrati samo "+t.maximum+" stavk";return n+=e(t.maximum,"u","e","i"),n},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/sv.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vänligen sudda ut "+t+" tecken";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vänligen skriv in "+t+" eller fler tecken";return n},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(e){var t="Du kan max välja "+e.maximum+" element";return t},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/th.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/th",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="โปรดลบออก "+t+" ตัวอักษร";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="โปรดพิมพ์เพิ่มอีก "+t+" ตัวอักษร";return n},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(e){var t="คุณสามารถเลือกได้ไม่เกิน "+e.maximum+" รายการ";return t},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/tr.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/tr",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n=t+" karakter daha girmelisiniz";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="En az "+t+" karakter daha girmelisiniz";return n},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(e){var t="Sadece "+e.maximum+" seçim yapabilirsiniz";return t},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/uk.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/uk",[],function(){function e(e,t,n,r){return e%100>10&&e%100<15?r:e%10===1?t:e%10>1&&e%10<5?n:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(t){var n=t.input.length-t.maximum;return"Будь ласка, видаліть "+n+" "+e(t.maximum,"літеру","літери","літер")},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Будь ласка, введіть "+t+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(t){return"Ви можете вибрати лише "+t.maximum+" "+e(t.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/vi.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/vi",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vui lòng nhập ít hơn "+t+" ký tự";return t!=1&&(n+="s"),n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Vui lòng nhập nhiều hơn "+t+' ký tự"';return n},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(e){var t="Chỉ có thể chọn được "+e.maximum+" lựa chọn";return t},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/zh-CN.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(e){var t=e.input.length-e.maximum,n="请删除"+t+"个字符";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="请再输入至少"+t+"个字符";return n},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(e){var t="最多只能选择"+e.maximum+"个项目";return t},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/i18n/zh-TW.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */
2
+
3
+ (function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;return e.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="請刪掉"+t+"個字元";return n},inputTooShort:function(e){var t=e.minimum-e.input.length,n="請再輸入"+t+"個字元";return n},loadingMore:function(){return"載入中…"},maximumSelected:function(e){var t="你只能選擇最多"+e.maximum+"項";return t},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"}}}),{define:e.define,require:e.require}})();
ui/lib/select2/js/select2.full.js ADDED
@@ -0,0 +1,6436 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Select2 4.0.3
3
+ * https://select2.github.io
4
+ *
5
+ * Released under the MIT license
6
+ * https://github.com/select2/select2/blob/master/LICENSE.md
7
+ */
8
+ (function (factory) {
9
+ if (typeof define === 'function' && define.amd) {
10
+ // AMD. Register as an anonymous module.
11
+ define(['jquery'], factory);
12
+ } else if (typeof exports === 'object') {
13
+ // Node/CommonJS
14
+ factory(require('jquery'));
15
+ } else {
16
+ // Browser globals
17
+ factory(jQuery);
18
+ }
19
+ }(function (jQuery) {
20
+ // This is needed so we can catch the AMD loader configuration and use it
21
+ // The inner file should be wrapped (by `banner.start.js`) in a function that
22
+ // returns the AMD loader references.
23
+ var S2 =
24
+ (function () {
25
+ // Restore the Select2 AMD loader so it can be used
26
+ // Needed mostly in the language files, where the loader is not inserted
27
+ if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
28
+ var S2 = jQuery.fn.select2.amd;
29
+ }
30
+ var S2;(function () { if (!S2 || !S2.requirejs) {
31
+ if (!S2) { S2 = {}; } else { require = S2; }
32
+ /**
33
+ * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
34
+ * Available via the MIT or new BSD license.
35
+ * see: http://github.com/jrburke/almond for details
36
+ */
37
+ //Going sloppy to avoid 'use strict' string cost, but strict practices should
38
+ //be followed.
39
+ /*jslint sloppy: true */
40
+ /*global setTimeout: false */
41
+
42
+ var requirejs, require, define;
43
+ (function (undef) {
44
+ var main, req, makeMap, handlers,
45
+ defined = {},
46
+ waiting = {},
47
+ config = {},
48
+ defining = {},
49
+ hasOwn = Object.prototype.hasOwnProperty,
50
+ aps = [].slice,
51
+ jsSuffixRegExp = /\.js$/;
52
+
53
+ function hasProp(obj, prop) {
54
+ return hasOwn.call(obj, prop);
55
+ }
56
+
57
+ /**
58
+ * Given a relative module name, like ./something, normalize it to
59
+ * a real name that can be mapped to a path.
60
+ * @param {String} name the relative name
61
+ * @param {String} baseName a real name that the name arg is relative
62
+ * to.
63
+ * @returns {String} normalized name
64
+ */
65
+ function normalize(name, baseName) {
66
+ var nameParts, nameSegment, mapValue, foundMap, lastIndex,
67
+ foundI, foundStarMap, starI, i, j, part,
68
+ baseParts = baseName && baseName.split("/"),
69
+ map = config.map,
70
+ starMap = (map && map['*']) || {};
71
+
72
+ //Adjust any relative paths.
73
+ if (name && name.charAt(0) === ".") {
74
+ //If have a base name, try to normalize against it,
75
+ //otherwise, assume it is a top-level require that will
76
+ //be relative to baseUrl in the end.
77
+ if (baseName) {
78
+ name = name.split('/');
79
+ lastIndex = name.length - 1;
80
+
81
+ // Node .js allowance:
82
+ if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
83
+ name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
84
+ }
85
+
86
+ //Lop off the last part of baseParts, so that . matches the
87
+ //"directory" and not name of the baseName's module. For instance,
88
+ //baseName of "one/two/three", maps to "one/two/three.js", but we
89
+ //want the directory, "one/two" for this normalization.
90
+ name = baseParts.slice(0, baseParts.length - 1).concat(name);
91
+
92
+ //start trimDots
93
+ for (i = 0; i < name.length; i += 1) {
94
+ part = name[i];
95
+ if (part === ".") {
96
+ name.splice(i, 1);
97
+ i -= 1;
98
+ } else if (part === "..") {
99
+ if (i === 1 && (name[2] === '..' || name[0] === '..')) {
100
+ //End of the line. Keep at least one non-dot
101
+ //path segment at the front so it can be mapped
102
+ //correctly to disk. Otherwise, there is likely
103
+ //no path mapping for a path starting with '..'.
104
+ //This can still fail, but catches the most reasonable
105
+ //uses of ..
106
+ break;
107
+ } else if (i > 0) {
108
+ name.splice(i - 1, 2);
109
+ i -= 2;
110
+ }
111
+ }
112
+ }
113
+ //end trimDots
114
+
115
+ name = name.join("/");
116
+ } else if (name.indexOf('./') === 0) {
117
+ // No baseName, so this is ID is resolved relative
118
+ // to baseUrl, pull off the leading dot.
119
+ name = name.substring(2);
120
+ }
121
+ }
122
+
123
+ //Apply map config if available.
124
+ if ((baseParts || starMap) && map) {
125
+ nameParts = name.split('/');
126
+
127
+ for (i = nameParts.length; i > 0; i -= 1) {
128
+ nameSegment = nameParts.slice(0, i).join("/");
129
+
130
+ if (baseParts) {
131
+ //Find the longest baseName segment match in the config.
132
+ //So, do joins on the biggest to smallest lengths of baseParts.
133
+ for (j = baseParts.length; j > 0; j -= 1) {
134
+ mapValue = map[baseParts.slice(0, j).join('/')];
135
+
136
+ //baseName segment has config, find if it has one for
137
+ //this name.
138
+ if (mapValue) {
139
+ mapValue = mapValue[nameSegment];
140
+ if (mapValue) {
141
+ //Match, update name to the new value.
142
+ foundMap = mapValue;
143
+ foundI = i;
144
+ break;
145
+ }
146
+ }
147
+ }
148
+ }
149
+
150
+ if (foundMap) {
151
+ break;
152
+ }
153
+
154
+ //Check for a star map match, but just hold on to it,
155
+ //if there is a shorter segment match later in a matching
156
+ //config, then favor over this star map.
157
+ if (!foundStarMap && starMap && starMap[nameSegment]) {
158
+ foundStarMap = starMap[nameSegment];
159
+ starI = i;
160
+ }
161
+ }
162
+
163
+ if (!foundMap && foundStarMap) {
164
+ foundMap = foundStarMap;
165
+ foundI = starI;
166
+ }
167
+
168
+ if (foundMap) {
169
+ nameParts.splice(0, foundI, foundMap);
170
+ name = nameParts.join('/');
171
+ }
172
+ }
173
+
174
+ return name;
175
+ }
176
+
177
+ function makeRequire(relName, forceSync) {
178
+ return function () {
179
+ //A version of a require function that passes a moduleName
180
+ //value for items that may need to
181
+ //look up paths relative to the moduleName
182
+ var args = aps.call(arguments, 0);
183
+
184
+ //If first arg is not require('string'), and there is only
185
+ //one arg, it is the array form without a callback. Insert
186
+ //a null so that the following concat is correct.
187
+ if (typeof args[0] !== 'string' && args.length === 1) {
188
+ args.push(null);
189
+ }
190
+ return req.apply(undef, args.concat([relName, forceSync]));
191
+ };
192
+ }
193
+
194
+ function makeNormalize(relName) {
195
+ return function (name) {
196
+ return normalize(name, relName);
197
+ };
198
+ }
199
+
200
+ function makeLoad(depName) {
201
+ return function (value) {
202
+ defined[depName] = value;
203
+ };
204
+ }
205
+
206
+ function callDep(name) {
207
+ if (hasProp(waiting, name)) {
208
+ var args = waiting[name];
209
+ delete waiting[name];
210
+ defining[name] = true;
211
+ main.apply(undef, args);
212
+ }
213
+
214
+ if (!hasProp(defined, name) && !hasProp(defining, name)) {
215
+ throw new Error('No ' + name);
216
+ }
217
+ return defined[name];
218
+ }
219
+
220
+ //Turns a plugin!resource to [plugin, resource]
221
+ //with the plugin being undefined if the name
222
+ //did not have a plugin prefix.
223
+ function splitPrefix(name) {
224
+ var prefix,
225
+ index = name ? name.indexOf('!') : -1;
226
+ if (index > -1) {
227
+ prefix = name.substring(0, index);
228
+ name = name.substring(index + 1, name.length);
229
+ }
230
+ return [prefix, name];
231
+ }
232
+
233
+ /**
234
+ * Makes a name map, normalizing the name, and using a plugin
235
+ * for normalization if necessary. Grabs a ref to plugin
236
+ * too, as an optimization.
237
+ */
238
+ makeMap = function (name, relName) {
239
+ var plugin,
240
+ parts = splitPrefix(name),
241
+ prefix = parts[0];
242
+
243
+ name = parts[1];
244
+
245
+ if (prefix) {
246
+ prefix = normalize(prefix, relName);
247
+ plugin = callDep(prefix);
248
+ }
249
+
250
+ //Normalize according
251
+ if (prefix) {
252
+ if (plugin && plugin.normalize) {
253
+ name = plugin.normalize(name, makeNormalize(relName));
254
+ } else {
255
+ name = normalize(name, relName);
256
+ }
257
+ } else {
258
+ name = normalize(name, relName);
259
+ parts = splitPrefix(name);
260
+ prefix = parts[0];
261
+ name = parts[1];
262
+ if (prefix) {
263
+ plugin = callDep(prefix);
264
+ }
265
+ }
266
+
267
+ //Using ridiculous property names for space reasons
268
+ return {
269
+ f: prefix ? prefix + '!' + name : name, //fullName
270
+ n: name,
271
+ pr: prefix,
272
+ p: plugin
273
+ };
274
+ };
275
+
276
+ function makeConfig(name) {
277
+ return function () {
278
+ return (config && config.config && config.config[name]) || {};
279
+ };
280
+ }
281
+
282
+ handlers = {
283
+ require: function (name) {
284
+ return makeRequire(name);
285
+ },
286
+ exports: function (name) {
287
+ var e = defined[name];
288
+ if (typeof e !== 'undefined') {
289
+ return e;
290
+ } else {
291
+ return (defined[name] = {});
292
+ }
293
+ },
294
+ module: function (name) {
295
+ return {
296
+ id: name,
297
+ uri: '',
298
+ exports: defined[name],
299
+ config: makeConfig(name)
300
+ };
301
+ }
302
+ };
303
+
304
+ main = function (name, deps, callback, relName) {
305
+ var cjsModule, depName, ret, map, i,
306
+ args = [],
307
+ callbackType = typeof callback,
308
+ usingExports;
309
+
310
+ //Use name if no relName
311
+ relName = relName || name;
312
+
313
+ //Call the callback to define the module, if necessary.
314
+ if (callbackType === 'undefined' || callbackType === 'function') {
315
+ //Pull out the defined dependencies and pass the ordered
316
+ //values to the callback.
317
+ //Default to [require, exports, module] if no deps
318
+ deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
319
+ for (i = 0; i < deps.length; i += 1) {
320
+ map = makeMap(deps[i], relName);
321
+ depName = map.f;
322
+
323
+ //Fast path CommonJS standard dependencies.
324
+ if (depName === "require") {
325
+ args[i] = handlers.require(name);
326
+ } else if (depName === "exports") {
327
+ //CommonJS module spec 1.1
328
+ args[i] = handlers.exports(name);
329
+ usingExports = true;
330
+ } else if (depName === "module") {
331
+ //CommonJS module spec 1.1
332
+ cjsModule = args[i] = handlers.module(name);
333
+ } else if (hasProp(defined, depName) ||
334
+ hasProp(waiting, depName) ||
335
+ hasProp(defining, depName)) {
336
+ args[i] = callDep(depName);
337
+ } else if (map.p) {
338
+ map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
339
+ args[i] = defined[depName];
340
+ } else {
341
+ throw new Error(name + ' missing ' + depName);
342
+ }
343
+ }
344
+
345
+ ret = callback ? callback.apply(defined[name], args) : undefined;
346
+
347
+ if (name) {
348
+ //If setting exports via "module" is in play,
349
+ //favor that over return value and exports. After that,
350
+ //favor a non-undefined return value over exports use.
351
+ if (cjsModule && cjsModule.exports !== undef &&
352
+ cjsModule.exports !== defined[name]) {
353
+ defined[name] = cjsModule.exports;
354
+ } else if (ret !== undef || !usingExports) {
355
+ //Use the return value from the function.
356
+ defined[name] = ret;
357
+ }
358
+ }
359
+ } else if (name) {
360
+ //May just be an object definition for the module. Only
361
+ //worry about defining if have a module name.
362
+ defined[name] = callback;
363
+ }
364
+ };
365
+
366
+ requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
367
+ if (typeof deps === "string") {
368
+ if (handlers[deps]) {
369
+ //callback in this case is really relName
370
+ return handlers[deps](callback);
371
+ }
372
+ //Just return the module wanted. In this scenario, the
373
+ //deps arg is the module name, and second arg (if passed)
374
+ //is just the relName.
375
+ //Normalize module name, if it contains . or ..
376
+ return callDep(makeMap(deps, callback).f);
377
+ } else if (!deps.splice) {
378
+ //deps is a config object, not an array.
379
+ config = deps;
380
+ if (config.deps) {
381
+ req(config.deps, config.callback);
382
+ }
383
+ if (!callback) {
384
+ return;
385
+ }
386
+
387
+ if (callback.splice) {
388
+ //callback is an array, which means it is a dependency list.
389
+ //Adjust args if there are dependencies
390
+ deps = callback;
391
+ callback = relName;
392
+ relName = null;
393
+ } else {
394
+ deps = undef;
395
+ }
396
+ }
397
+
398
+ //Support require(['a'])
399
+ callback = callback || function () {};
400
+
401
+ //If relName is a function, it is an errback handler,
402
+ //so remove it.
403
+ if (typeof relName === 'function') {
404
+ relName = forceSync;
405
+ forceSync = alt;
406
+ }
407
+
408
+ //Simulate async callback;
409
+ if (forceSync) {
410
+ main(undef, deps, callback, relName);
411
+ } else {
412
+ //Using a non-zero value because of concern for what old browsers
413
+ //do, and latest browsers "upgrade" to 4 if lower value is used:
414
+ //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
415
+ //If want a value immediately, use require('id') instead -- something
416
+ //that works in almond on the global level, but not guaranteed and
417
+ //unlikely to work in other AMD implementations.
418
+ setTimeout(function () {
419
+ main(undef, deps, callback, relName);
420
+ }, 4);
421
+ }
422
+
423
+ return req;
424
+ };
425
+
426
+ /**
427
+ * Just drops the config on the floor, but returns req in case
428
+ * the config return value is used.
429
+ */
430
+ req.config = function (cfg) {
431
+ return req(cfg);
432
+ };
433
+
434
+ /**
435
+ * Expose module registry for debugging and tooling
436
+ */
437
+ requirejs._defined = defined;
438
+
439
+ define = function (name, deps, callback) {
440
+ if (typeof name !== 'string') {
441
+ throw new Error('See almond README: incorrect module build, no module name');
442
+ }
443
+
444
+ //This module may not have dependencies
445
+ if (!deps.splice) {
446
+ //deps is not an array, so probably means
447
+ //an object literal or factory function for
448
+ //the value. Adjust args.
449
+ callback = deps;
450
+ deps = [];
451
+ }
452
+
453
+ if (!hasProp(defined, name) && !hasProp(waiting, name)) {
454
+ waiting[name] = [name, deps, callback];
455
+ }
456
+ };
457
+
458
+ define.amd = {
459
+ jQuery: true
460
+ };
461
+ }());
462
+
463
+ S2.requirejs = requirejs;S2.require = require;S2.define = define;
464
+ }
465
+ }());
466
+ S2.define("almond", function(){});
467
+
468
+ /* global jQuery:false, $:false */
469
+ S2.define('jquery',[],function () {
470
+ var _$ = jQuery || $;
471
+
472
+ if (_$ == null && console && console.error) {
473
+ console.error(
474
+ 'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
475
+ 'found. Make sure that you are including jQuery before Select2 on your ' +
476
+ 'web page.'
477
+ );
478
+ }
479
+
480
+ return _$;
481
+ });
482
+
483
+ S2.define('select2/utils',[
484
+ 'jquery'
485
+ ], function ($) {
486
+ var Utils = {};
487
+
488
+ Utils.Extend = function (ChildClass, SuperClass) {
489
+ var __hasProp = {}.hasOwnProperty;
490
+
491
+ function BaseConstructor () {
492
+ this.constructor = ChildClass;
493
+ }
494
+
495
+ for (var key in SuperClass) {
496
+ if (__hasProp.call(SuperClass, key)) {
497
+ ChildClass[key] = SuperClass[key];
498
+ }
499
+ }
500
+
501
+ BaseConstructor.prototype = SuperClass.prototype;
502
+ ChildClass.prototype = new BaseConstructor();
503
+ ChildClass.__super__ = SuperClass.prototype;
504
+
505
+ return ChildClass;
506
+ };
507
+
508
+ function getMethods (theClass) {
509
+ var proto = theClass.prototype;
510
+
511
+ var methods = [];
512
+
513
+ for (var methodName in proto) {
514
+ var m = proto[methodName];
515
+
516
+ if (typeof m !== 'function') {
517
+ continue;
518
+ }
519
+
520
+ if (methodName === 'constructor') {
521
+ continue;
522
+ }
523
+
524
+ methods.push(methodName);
525
+ }
526
+
527
+ return methods;
528
+ }
529
+
530
+ Utils.Decorate = function (SuperClass, DecoratorClass) {
531
+ var decoratedMethods = getMethods(DecoratorClass);
532
+ var superMethods = getMethods(SuperClass);
533
+
534
+ function DecoratedClass () {
535
+ var unshift = Array.prototype.unshift;
536
+
537
+ var argCount = DecoratorClass.prototype.constructor.length;
538
+
539
+ var calledConstructor = SuperClass.prototype.constructor;
540
+
541
+ if (argCount > 0) {
542
+ unshift.call(arguments, SuperClass.prototype.constructor);
543
+
544
+ calledConstructor = DecoratorClass.prototype.constructor;
545
+ }
546
+
547
+ calledConstructor.apply(this, arguments);
548
+ }
549
+
550
+ DecoratorClass.displayName = SuperClass.displayName;
551
+
552
+ function ctr () {
553
+ this.constructor = DecoratedClass;
554
+ }
555
+
556
+ DecoratedClass.prototype = new ctr();
557
+
558
+ for (var m = 0; m < superMethods.length; m++) {
559
+ var superMethod = superMethods[m];
560
+
561
+ DecoratedClass.prototype[superMethod] =
562
+ SuperClass.prototype[superMethod];
563
+ }
564
+
565
+ var calledMethod = function (methodName) {
566
+ // Stub out the original method if it's not decorating an actual method
567
+ var originalMethod = function () {};
568
+
569
+ if (methodName in DecoratedClass.prototype) {
570
+ originalMethod = DecoratedClass.prototype[methodName];
571
+ }
572
+
573
+ var decoratedMethod = DecoratorClass.prototype[methodName];
574
+
575
+ return function () {
576
+ var unshift = Array.prototype.unshift;
577
+
578
+ unshift.call(arguments, originalMethod);
579
+
580
+ return decoratedMethod.apply(this, arguments);
581
+ };
582
+ };
583
+
584
+ for (var d = 0; d < decoratedMethods.length; d++) {
585
+ var decoratedMethod = decoratedMethods[d];
586
+
587
+ DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
588
+ }
589
+
590
+ return DecoratedClass;
591
+ };
592
+
593
+ var Observable = function () {
594
+ this.listeners = {};
595
+ };
596
+
597
+ Observable.prototype.on = function (event, callback) {
598
+ this.listeners = this.listeners || {};
599
+
600
+ if (event in this.listeners) {
601
+ this.listeners[event].push(callback);
602
+ } else {
603
+ this.listeners[event] = [callback];
604
+ }
605
+ };
606
+
607
+ Observable.prototype.trigger = function (event) {
608
+ var slice = Array.prototype.slice;
609
+ var params = slice.call(arguments, 1);
610
+
611
+ this.listeners = this.listeners || {};
612
+
613
+ // Params should always come in as an array
614
+ if (params == null) {
615
+ params = [];
616
+ }
617
+
618
+ // If there are no arguments to the event, use a temporary object
619
+ if (params.length === 0) {
620
+ params.push({});
621
+ }
622
+
623
+ // Set the `_type` of the first object to the event
624
+ params[0]._type = event;
625
+
626
+ if (event in this.listeners) {
627
+ this.invoke(this.listeners[event], slice.call(arguments, 1));
628
+ }
629
+
630
+ if ('*' in this.listeners) {
631
+ this.invoke(this.listeners['*'], arguments);
632
+ }
633
+ };
634
+
635
+ Observable.prototype.invoke = function (listeners, params) {
636
+ for (var i = 0, len = listeners.length; i < len; i++) {
637
+ listeners[i].apply(this, params);
638
+ }
639
+ };
640
+
641
+ Utils.Observable = Observable;
642
+
643
+ Utils.generateChars = function (length) {
644
+ var chars = '';
645
+
646
+ for (var i = 0; i < length; i++) {
647
+ var randomChar = Math.floor(Math.random() * 36);
648
+ chars += randomChar.toString(36);
649
+ }
650
+
651
+ return chars;
652
+ };
653
+
654
+ Utils.bind = function (func, context) {
655
+ return function () {
656
+ func.apply(context, arguments);
657
+ };
658
+ };
659
+
660
+ Utils._convertData = function (data) {
661
+ for (var originalKey in data) {
662
+ var keys = originalKey.split('-');
663
+
664
+ var dataLevel = data;
665
+
666
+ if (keys.length === 1) {
667
+ continue;
668
+ }
669
+
670
+ for (var k = 0; k < keys.length; k++) {
671
+ var key = keys[k];
672
+
673
+ // Lowercase the first letter
674
+ // By default, dash-separated becomes camelCase
675
+ key = key.substring(0, 1).toLowerCase() + key.substring(1);
676
+
677
+ if (!(key in dataLevel)) {
678
+ dataLevel[key] = {};
679
+ }
680
+
681
+ if (k == keys.length - 1) {
682
+ dataLevel[key] = data[originalKey];
683
+ }
684
+
685
+ dataLevel = dataLevel[key];
686
+ }
687
+
688
+ delete data[originalKey];
689
+ }
690
+
691
+ return data;
692
+ };
693
+
694
+ Utils.hasScroll = function (index, el) {
695
+ // Adapted from the function created by @ShadowScripter
696
+ // and adapted by @BillBarry on the Stack Exchange Code Review website.
697
+ // The original code can be found at
698
+ // http://codereview.stackexchange.com/q/13338
699
+ // and was designed to be used with the Sizzle selector engine.
700
+
701
+ var $el = $(el);
702
+ var overflowX = el.style.overflowX;
703
+ var overflowY = el.style.overflowY;
704
+
705
+ //Check both x and y declarations
706
+ if (overflowX === overflowY &&
707
+ (overflowY === 'hidden' || overflowY === 'visible')) {
708
+ return false;
709
+ }
710
+
711
+ if (overflowX === 'scroll' || overflowY === 'scroll') {
712
+ return true;
713
+ }
714
+
715
+ return ($el.innerHeight() < el.scrollHeight ||
716
+ $el.innerWidth() < el.scrollWidth);
717
+ };
718
+
719
+ Utils.escapeMarkup = function (markup) {
720
+ var replaceMap = {
721
+ '\\': '&#92;',
722
+ '&': '&amp;',
723
+ '<': '&lt;',
724
+ '>': '&gt;',
725
+ '"': '&quot;',
726
+ '\'': '&#39;',
727
+ '/': '&#47;'
728
+ };
729
+
730
+ // Do not try to escape the markup if it's not a string
731
+ if (typeof markup !== 'string') {
732
+ return markup;
733
+ }
734
+
735
+ return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
736
+ return replaceMap[match];
737
+ });
738
+ };
739
+
740
+ // Append an array of jQuery nodes to a given element.
741
+ Utils.appendMany = function ($element, $nodes) {
742
+ // jQuery 1.7.x does not support $.fn.append() with an array
743
+ // Fall back to a jQuery object collection using $.fn.add()
744
+ if ($.fn.jquery.substr(0, 3) === '1.7') {
745
+ var $jqNodes = $();
746
+
747
+ $.map($nodes, function (node) {
748
+ $jqNodes = $jqNodes.add(node);
749
+ });
750
+
751
+ $nodes = $jqNodes;
752
+ }
753
+
754
+ $element.append($nodes);
755
+ };
756
+
757
+ return Utils;
758
+ });
759
+
760
+ S2.define('select2/results',[
761
+ 'jquery',
762
+ './utils'
763
+ ], function ($, Utils) {
764
+ function Results ($element, options, dataAdapter) {
765
+ this.$element = $element;
766
+ this.data = dataAdapter;
767
+ this.options = options;
768
+
769
+ Results.__super__.constructor.call(this);
770
+ }
771
+
772
+ Utils.Extend(Results, Utils.Observable);
773
+
774
+ Results.prototype.render = function () {
775
+ var $results = $(
776
+ '<ul class="select2-results__options" role="tree"></ul>'
777
+ );
778
+
779
+ if (this.options.get('multiple')) {
780
+ $results.attr('aria-multiselectable', 'true');
781
+ }
782
+
783
+ this.$results = $results;
784
+
785
+ return $results;
786
+ };
787
+
788
+ Results.prototype.clear = function () {
789
+ this.$results.empty();
790
+ };
791
+
792
+ Results.prototype.displayMessage = function (params) {
793
+ var escapeMarkup = this.options.get('escapeMarkup');
794
+
795
+ this.clear();
796
+ this.hideLoading();
797
+
798
+ var $message = $(
799
+ '<li role="treeitem" aria-live="assertive"' +
800
+ ' class="select2-results__option"></li>'
801
+ );
802
+
803
+ var message = this.options.get('translations').get(params.message);
804
+
805
+ $message.append(
806
+ escapeMarkup(
807
+ message(params.args)
808
+ )
809
+ );
810
+
811
+ $message[0].className += ' select2-results__message';
812
+
813
+ this.$results.append($message);
814
+ };
815
+
816
+ Results.prototype.hideMessages = function () {
817
+ this.$results.find('.select2-results__message').remove();
818
+ };
819
+
820
+ Results.prototype.append = function (data) {
821
+ this.hideLoading();
822
+
823
+ var $options = [];
824
+
825
+ if (data.results == null || data.results.length === 0) {
826
+ if (this.$results.children().length === 0) {
827
+ this.trigger('results:message', {
828
+ message: 'noResults'
829
+ });
830
+ }
831
+
832
+ return;
833
+ }
834
+
835
+ data.results = this.sort(data.results);
836
+
837
+ for (var d = 0; d < data.results.length; d++) {
838
+ var item = data.results[d];
839
+
840
+ var $option = this.option(item);
841
+
842
+ $options.push($option);
843
+ }
844
+
845
+ this.$results.append($options);
846
+ };
847
+
848
+ Results.prototype.position = function ($results, $dropdown) {
849
+ var $resultsContainer = $dropdown.find('.select2-results');
850
+ $resultsContainer.append($results);
851
+ };
852
+
853
+ Results.prototype.sort = function (data) {
854
+ var sorter = this.options.get('sorter');
855
+
856
+ return sorter(data);
857
+ };
858
+
859
+ Results.prototype.highlightFirstItem = function () {
860
+ var $options = this.$results
861
+ .find('.select2-results__option[aria-selected]');
862
+
863
+ var $selected = $options.filter('[aria-selected=true]');
864
+
865
+ // Check if there are any selected options
866
+ if ($selected.length > 0) {
867
+ // If there are selected options, highlight the first
868
+ $selected.first().trigger('mouseenter');
869
+ } else {
870
+ // If there are no selected options, highlight the first option
871
+ // in the dropdown
872
+ $options.first().trigger('mouseenter');
873
+ }
874
+
875
+ this.ensureHighlightVisible();
876
+ };
877
+
878
+ Results.prototype.setClasses = function () {
879
+ var self = this;
880
+
881
+ this.data.current(function (selected) {
882
+ var selectedIds = $.map(selected, function (s) {
883
+ return s.id.toString();
884
+ });
885
+
886
+ var $options = self.$results
887
+ .find('.select2-results__option[aria-selected]');
888
+
889
+ $options.each(function () {
890
+ var $option = $(this);
891
+
892
+ var item = $.data(this, 'data');
893
+
894
+ // id needs to be converted to a string when comparing
895
+ var id = '' + item.id;
896
+
897
+ if ((item.element != null && item.element.selected) ||
898
+ (item.element == null && $.inArray(id, selectedIds) > -1)) {
899
+ $option.attr('aria-selected', 'true');
900
+ } else {
901
+ $option.attr('aria-selected', 'false');
902
+ }
903
+ });
904
+
905
+ });
906
+ };
907
+
908
+ Results.prototype.showLoading = function (params) {
909
+ this.hideLoading();
910
+
911
+ var loadingMore = this.options.get('translations').get('searching');
912
+
913
+ var loading = {
914
+ disabled: true,
915
+ loading: true,
916
+ text: loadingMore(params)
917
+ };
918
+ var $loading = this.option(loading);
919
+ $loading.className += ' loading-results';
920
+
921
+ this.$results.prepend($loading);
922
+ };
923
+
924
+ Results.prototype.hideLoading = function () {
925
+ this.$results.find('.loading-results').remove();
926
+ };
927
+
928
+ Results.prototype.option = function (data) {
929
+ var option = document.createElement('li');
930
+ option.className = 'select2-results__option';
931
+
932
+ var attrs = {
933
+ 'role': 'treeitem',
934
+ 'aria-selected': 'false'
935
+ };
936
+
937
+ if (data.disabled) {
938
+ delete attrs['aria-selected'];
939
+ attrs['aria-disabled'] = 'true';
940
+ }
941
+
942
+ if (data.id == null) {
943
+ delete attrs['aria-selected'];
944
+ }
945
+
946
+ if (data._resultId != null) {
947
+ option.id = data._resultId;
948
+ }
949
+
950
+ if (data.title) {
951
+ option.title = data.title;
952
+ }
953
+
954
+ if (data.children) {
955
+ attrs.role = 'group';
956
+ attrs['aria-label'] = data.text;
957
+ delete attrs['aria-selected'];
958
+ }
959
+
960
+ for (var attr in attrs) {
961
+ var val = attrs[attr];
962
+
963
+ option.setAttribute(attr, val);
964
+ }
965
+
966
+ if (data.children) {
967
+ var $option = $(option);
968
+
969
+ var label = document.createElement('strong');
970
+ label.className = 'select2-results__group';
971
+
972
+ var $label = $(label);
973
+ this.template(data, label);
974
+
975
+ var $children = [];
976
+
977
+ for (var c = 0; c < data.children.length; c++) {
978
+ var child = data.children[c];
979
+
980
+ var $child = this.option(child);
981
+
982
+ $children.push($child);
983
+ }
984
+
985
+ var $childrenContainer = $('<ul></ul>', {
986
+ 'class': 'select2-results__options select2-results__options--nested'
987
+ });
988
+
989
+ $childrenContainer.append($children);
990
+
991
+ $option.append(label);
992
+ $option.append($childrenContainer);
993
+ } else {
994
+ this.template(data, option);
995
+ }
996
+
997
+ $.data(option, 'data', data);
998
+
999
+ return option;
1000
+ };
1001
+
1002
+ Results.prototype.bind = function (container, $container) {
1003
+ var self = this;
1004
+
1005
+ var id = container.id + '-results';
1006
+
1007
+ this.$results.attr('id', id);
1008
+
1009
+ container.on('results:all', function (params) {
1010
+ self.clear();
1011
+ self.append(params.data);
1012
+
1013
+ if (container.isOpen()) {
1014
+ self.setClasses();
1015
+ self.highlightFirstItem();
1016
+ }
1017
+ });
1018
+
1019
+ container.on('results:append', function (params) {
1020
+ self.append(params.data);
1021
+
1022
+ if (container.isOpen()) {
1023
+ self.setClasses();
1024
+ }
1025
+ });
1026
+
1027
+ container.on('query', function (params) {
1028
+ self.hideMessages();
1029
+ self.showLoading(params);
1030
+ });
1031
+
1032
+ container.on('select', function () {
1033
+ if (!container.isOpen()) {
1034
+ return;
1035
+ }
1036
+
1037
+ self.setClasses();
1038
+ self.highlightFirstItem();
1039
+ });
1040
+
1041
+ container.on('unselect', function () {
1042
+ if (!container.isOpen()) {
1043
+ return;
1044
+ }
1045
+
1046
+ self.setClasses();
1047
+ self.highlightFirstItem();
1048
+ });
1049
+
1050
+ container.on('open', function () {
1051
+ // When the dropdown is open, aria-expended="true"
1052
+ self.$results.attr('aria-expanded', 'true');
1053
+ self.$results.attr('aria-hidden', 'false');
1054
+
1055
+ self.setClasses();
1056
+ self.ensureHighlightVisible();
1057
+ });
1058
+
1059
+ container.on('close', function () {
1060
+ // When the dropdown is closed, aria-expended="false"
1061
+ self.$results.attr('aria-expanded', 'false');
1062
+ self.$results.attr('aria-hidden', 'true');
1063
+ self.$results.removeAttr('aria-activedescendant');
1064
+ });
1065
+
1066
+ container.on('results:toggle', function () {
1067
+ var $highlighted = self.getHighlightedResults();
1068
+
1069
+ if ($highlighted.length === 0) {
1070
+ return;
1071
+ }
1072
+
1073
+ $highlighted.trigger('mouseup');
1074
+ });
1075
+
1076
+ container.on('results:select', function () {
1077
+ var $highlighted = self.getHighlightedResults();
1078
+
1079
+ if ($highlighted.length === 0) {
1080
+ return;
1081
+ }
1082
+
1083
+ var data = $highlighted.data('data');
1084
+
1085
+ if ($highlighted.attr('aria-selected') == 'true') {
1086
+ self.trigger('close', {});
1087
+ } else {
1088
+ self.trigger('select', {
1089
+ data: data
1090
+ });
1091
+ }
1092
+ });
1093
+
1094
+ container.on('results:previous', function () {
1095
+ var $highlighted = self.getHighlightedResults();
1096
+
1097
+ var $options = self.$results.find('[aria-selected]');
1098
+
1099
+ var currentIndex = $options.index($highlighted);
1100
+
1101
+ // If we are already at te top, don't move further
1102
+ if (currentIndex === 0) {
1103
+ return;
1104
+ }
1105
+
1106
+ var nextIndex = currentIndex - 1;
1107
+
1108
+ // If none are highlighted, highlight the first
1109
+ if ($highlighted.length === 0) {
1110
+ nextIndex = 0;
1111
+ }
1112
+
1113
+ var $next = $options.eq(nextIndex);
1114
+
1115
+ $next.trigger('mouseenter');
1116
+
1117
+ var currentOffset = self.$results.offset().top;
1118
+ var nextTop = $next.offset().top;
1119
+ var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
1120
+
1121
+ if (nextIndex === 0) {
1122
+ self.$results.scrollTop(0);
1123
+ } else if (nextTop - currentOffset < 0) {
1124
+ self.$results.scrollTop(nextOffset);
1125
+ }
1126
+ });
1127
+
1128
+ container.on('results:next', function () {
1129
+ var $highlighted = self.getHighlightedResults();
1130
+
1131
+ var $options = self.$results.find('[aria-selected]');
1132
+
1133
+ var currentIndex = $options.index($highlighted);
1134
+
1135
+ var nextIndex = currentIndex + 1;
1136
+
1137
+ // If we are at the last option, stay there
1138
+ if (nextIndex >= $options.length) {
1139
+ return;
1140
+ }
1141
+
1142
+ var $next = $options.eq(nextIndex);
1143
+
1144
+ $next.trigger('mouseenter');
1145
+
1146
+ var currentOffset = self.$results.offset().top +
1147
+ self.$results.outerHeight(false);
1148
+ var nextBottom = $next.offset().top + $next.outerHeight(false);
1149
+ var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
1150
+
1151
+ if (nextIndex === 0) {
1152
+ self.$results.scrollTop(0);
1153
+ } else if (nextBottom > currentOffset) {
1154
+ self.$results.scrollTop(nextOffset);
1155
+ }
1156
+ });
1157
+
1158
+ container.on('results:focus', function (params) {
1159
+ params.element.addClass('select2-results__option--highlighted');
1160
+ });
1161
+
1162
+ container.on('results:message', function (params) {
1163
+ self.displayMessage(params);
1164
+ });
1165
+
1166
+ if ($.fn.mousewheel) {
1167
+ this.$results.on('mousewheel', function (e) {
1168
+ var top = self.$results.scrollTop();
1169
+
1170
+ var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
1171
+
1172
+ var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
1173
+ var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
1174
+
1175
+ if (isAtTop) {
1176
+ self.$results.scrollTop(0);
1177
+
1178
+ e.preventDefault();
1179
+ e.stopPropagation();
1180
+ } else if (isAtBottom) {
1181
+ self.$results.scrollTop(
1182
+ self.$results.get(0).scrollHeight - self.$results.height()
1183
+ );
1184
+
1185
+ e.preventDefault();
1186
+ e.stopPropagation();
1187
+ }
1188
+ });
1189
+ }
1190
+
1191
+ this.$results.on('mouseup', '.select2-results__option[aria-selected]',
1192
+ function (evt) {
1193
+ var $this = $(this);
1194
+
1195
+ var data = $this.data('data');
1196
+
1197
+ if ($this.attr('aria-selected') === 'true') {
1198
+ if (self.options.get('multiple')) {
1199
+ self.trigger('unselect', {
1200
+ originalEvent: evt,
1201
+ data: data
1202
+ });
1203
+ } else {
1204
+ self.trigger('close', {});
1205
+ }
1206
+
1207
+ return;
1208
+ }
1209
+
1210
+ self.trigger('select', {
1211
+ originalEvent: evt,
1212
+ data: data
1213
+ });
1214
+ });
1215
+
1216
+ this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
1217
+ function (evt) {
1218
+ var data = $(this).data('data');
1219
+
1220
+ self.getHighlightedResults()
1221
+ .removeClass('select2-results__option--highlighted');
1222
+
1223
+ self.trigger('results:focus', {
1224
+ data: data,
1225
+ element: $(this)
1226
+ });
1227
+ });
1228
+ };
1229
+
1230
+ Results.prototype.getHighlightedResults = function () {
1231
+ var $highlighted = this.$results
1232
+ .find('.select2-results__option--highlighted');
1233
+
1234
+ return $highlighted;
1235
+ };
1236
+
1237
+ Results.prototype.destroy = function () {
1238
+ this.$results.remove();
1239
+ };
1240
+
1241
+ Results.prototype.ensureHighlightVisible = function () {
1242
+ var $highlighted = this.getHighlightedResults();
1243
+
1244
+ if ($highlighted.length === 0) {
1245
+ return;
1246
+ }
1247
+
1248
+ var $options = this.$results.find('[aria-selected]');
1249
+
1250
+ var currentIndex = $options.index($highlighted);
1251
+
1252
+ var currentOffset = this.$results.offset().top;
1253
+ var nextTop = $highlighted.offset().top;
1254
+ var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
1255
+
1256
+ var offsetDelta = nextTop - currentOffset;
1257
+ nextOffset -= $highlighted.outerHeight(false) * 2;
1258
+
1259
+ if (currentIndex <= 2) {
1260
+ this.$results.scrollTop(0);
1261
+ } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
1262
+ this.$results.scrollTop(nextOffset);
1263
+ }
1264
+ };
1265
+
1266
+ Results.prototype.template = function (result, container) {
1267
+ var template = this.options.get('templateResult');
1268
+ var escapeMarkup = this.options.get('escapeMarkup');
1269
+
1270
+ var content = template(result, container);
1271
+
1272
+ if (content == null) {
1273
+ container.style.display = 'none';
1274
+ } else if (typeof content === 'string') {
1275
+ container.innerHTML = escapeMarkup(content);
1276
+ } else {
1277
+ $(container).append(content);
1278
+ }
1279
+ };
1280
+
1281
+ return Results;
1282
+ });
1283
+
1284
+ S2.define('select2/keys',[
1285
+
1286
+ ], function () {
1287
+ var KEYS = {
1288
+ BACKSPACE: 8,
1289
+ TAB: 9,
1290
+ ENTER: 13,
1291
+ SHIFT: 16,
1292
+ CTRL: 17,
1293
+ ALT: 18,
1294
+ ESC: 27,
1295
+ SPACE: 32,
1296
+ PAGE_UP: 33,
1297
+ PAGE_DOWN: 34,
1298
+ END: 35,
1299
+ HOME: 36,
1300
+ LEFT: 37,
1301
+ UP: 38,
1302
+ RIGHT: 39,
1303
+ DOWN: 40,
1304
+ DELETE: 46
1305
+ };
1306
+
1307
+ return KEYS;
1308
+ });
1309
+
1310
+ S2.define('select2/selection/base',[
1311
+ 'jquery',
1312
+ '../utils',
1313
+ '../keys'
1314
+ ], function ($, Utils, KEYS) {
1315
+ function BaseSelection ($element, options) {
1316
+ this.$element = $element;
1317
+ this.options = options;
1318
+
1319
+ BaseSelection.__super__.constructor.call(this);
1320
+ }
1321
+
1322
+ Utils.Extend(BaseSelection, Utils.Observable);
1323
+
1324
+ BaseSelection.prototype.render = function () {
1325
+ var $selection = $(
1326
+ '<span class="select2-selection" role="combobox" ' +
1327
+ ' aria-haspopup="true" aria-expanded="false">' +
1328
+ '</span>'
1329
+ );
1330
+
1331
+ this._tabindex = 0;
1332
+
1333
+ if (this.$element.data('old-tabindex') != null) {
1334
+ this._tabindex = this.$element.data('old-tabindex');
1335
+ } else if (this.$element.attr('tabindex') != null) {
1336
+ this._tabindex = this.$element.attr('tabindex');
1337
+ }
1338
+
1339
+ $selection.attr('title', this.$element.attr('title'));
1340
+ $selection.attr('tabindex', this._tabindex);
1341
+
1342
+ this.$selection = $selection;
1343
+
1344
+ return $selection;
1345
+ };
1346
+
1347
+ BaseSelection.prototype.bind = function (container, $container) {
1348
+ var self = this;
1349
+
1350
+ var id = container.id + '-container';
1351
+ var resultsId = container.id + '-results';
1352
+
1353
+ this.container = container;
1354
+
1355
+ this.$selection.on('focus', function (evt) {
1356
+ self.trigger('focus', evt);
1357
+ });
1358
+
1359
+ this.$selection.on('blur', function (evt) {
1360
+ self._handleBlur(evt);
1361
+ });
1362
+
1363
+ this.$selection.on('keydown', function (evt) {
1364
+ self.trigger('keypress', evt);
1365
+
1366
+ if (evt.which === KEYS.SPACE) {
1367
+ evt.preventDefault();
1368
+ }
1369
+ });
1370
+
1371
+ container.on('results:focus', function (params) {
1372
+ self.$selection.attr('aria-activedescendant', params.data._resultId);
1373
+ });
1374
+
1375
+ container.on('selection:update', function (params) {
1376
+ self.update(params.data);
1377
+ });
1378
+
1379
+ container.on('open', function () {
1380
+ // When the dropdown is open, aria-expanded="true"
1381
+ self.$selection.attr('aria-expanded', 'true');
1382
+ self.$selection.attr('aria-owns', resultsId);
1383
+
1384
+ self._attachCloseHandler(container);
1385
+ });
1386
+
1387
+ container.on('close', function () {
1388
+ // When the dropdown is closed, aria-expanded="false"
1389
+ self.$selection.attr('aria-expanded', 'false');
1390
+ self.$selection.removeAttr('aria-activedescendant');
1391
+ self.$selection.removeAttr('aria-owns');
1392
+
1393
+ self.$selection.focus();
1394
+
1395
+ self._detachCloseHandler(container);
1396
+ });
1397
+
1398
+ container.on('enable', function () {
1399
+ self.$selection.attr('tabindex', self._tabindex);
1400
+ });
1401
+
1402
+ container.on('disable', function () {
1403
+ self.$selection.attr('tabindex', '-1');
1404
+ });
1405
+ };
1406
+
1407
+ BaseSelection.prototype._handleBlur = function (evt) {
1408
+ var self = this;
1409
+
1410
+ // This needs to be delayed as the active element is the body when the tab
1411
+ // key is pressed, possibly along with others.
1412
+ window.setTimeout(function () {
1413
+ // Don't trigger `blur` if the focus is still in the selection
1414
+ if (
1415
+ (document.activeElement == self.$selection[0]) ||
1416
+ ($.contains(self.$selection[0], document.activeElement))
1417
+ ) {
1418
+ return;
1419
+ }
1420
+
1421
+ self.trigger('blur', evt);
1422
+ }, 1);
1423
+ };
1424
+
1425
+ BaseSelection.prototype._attachCloseHandler = function (container) {
1426
+ var self = this;
1427
+
1428
+ $(document.body).on('mousedown.select2.' + container.id, function (e) {
1429
+ var $target = $(e.target);
1430
+
1431
+ var $select = $target.closest('.select2');
1432
+
1433
+ var $all = $('.select2.select2-container--open');
1434
+
1435
+ $all.each(function () {
1436
+ var $this = $(this);
1437
+
1438
+ if (this == $select[0]) {
1439
+ return;
1440
+ }
1441
+
1442
+ var $element = $this.data('element');
1443
+
1444
+ $element.select2('close');
1445
+ });
1446
+ });
1447
+ };
1448
+
1449
+ BaseSelection.prototype._detachCloseHandler = function (container) {
1450
+ $(document.body).off('mousedown.select2.' + container.id);
1451
+ };
1452
+
1453
+ BaseSelection.prototype.position = function ($selection, $container) {
1454
+ var $selectionContainer = $container.find('.selection');
1455
+ $selectionContainer.append($selection);
1456
+ };
1457
+
1458
+ BaseSelection.prototype.destroy = function () {
1459
+ this._detachCloseHandler(this.container);
1460
+ };
1461
+
1462
+ BaseSelection.prototype.update = function (data) {
1463
+ throw new Error('The `update` method must be defined in child classes.');
1464
+ };
1465
+
1466
+ return BaseSelection;
1467
+ });
1468
+
1469
+ S2.define('select2/selection/single',[
1470
+ 'jquery',
1471
+ './base',
1472
+ '../utils',
1473
+ '../keys'
1474
+ ], function ($, BaseSelection, Utils, KEYS) {
1475
+ function SingleSelection () {
1476
+ SingleSelection.__super__.constructor.apply(this, arguments);
1477
+ }
1478
+
1479
+ Utils.Extend(SingleSelection, BaseSelection);
1480
+
1481
+ SingleSelection.prototype.render = function () {
1482
+ var $selection = SingleSelection.__super__.render.call(this);
1483
+
1484
+ $selection.addClass('select2-selection--single');
1485
+
1486
+ $selection.html(
1487
+ '<span class="select2-selection__rendered"></span>' +
1488
+ '<span class="select2-selection__arrow" role="presentation">' +
1489
+ '<b role="presentation"></b>' +
1490
+ '</span>'
1491
+ );
1492
+
1493
+ return $selection;
1494
+ };
1495
+
1496
+ SingleSelection.prototype.bind = function (container, $container) {
1497
+ var self = this;
1498
+
1499
+ SingleSelection.__super__.bind.apply(this, arguments);
1500
+
1501
+ var id = container.id + '-container';
1502
+
1503
+ this.$selection.find('.select2-selection__rendered').attr('id', id);
1504
+ this.$selection.attr('aria-labelledby', id);
1505
+
1506
+ this.$selection.on('mousedown', function (evt) {
1507
+ // Only respond to left clicks
1508
+ if (evt.which !== 1) {
1509
+ return;
1510
+ }
1511
+
1512
+ self.trigger('toggle', {
1513
+ originalEvent: evt
1514
+ });
1515
+ });
1516
+
1517
+ this.$selection.on('focus', function (evt) {
1518
+ // User focuses on the container
1519
+ });
1520
+
1521
+ this.$selection.on('blur', function (evt) {
1522
+ // User exits the container
1523
+ });
1524
+
1525
+ container.on('focus', function (evt) {
1526
+ if (!container.isOpen()) {
1527
+ self.$selection.focus();
1528
+ }
1529
+ });
1530
+
1531
+ container.on('selection:update', function (params) {
1532
+ self.update(params.data);
1533
+ });
1534
+ };
1535
+
1536
+ SingleSelection.prototype.clear = function () {
1537
+ this.$selection.find('.select2-selection__rendered').empty();
1538
+ };
1539
+
1540
+ SingleSelection.prototype.display = function (data, container) {
1541
+ var template = this.options.get('templateSelection');
1542
+ var escapeMarkup = this.options.get('escapeMarkup');
1543
+
1544
+ return escapeMarkup(template(data, container));
1545
+ };
1546
+
1547
+ SingleSelection.prototype.selectionContainer = function () {
1548
+ return $('<span></span>');
1549
+ };
1550
+
1551
+ SingleSelection.prototype.update = function (data) {
1552
+ if (data.length === 0) {
1553
+ this.clear();
1554
+ return;
1555
+ }
1556
+
1557
+ var selection = data[0];
1558
+
1559
+ var $rendered = this.$selection.find('.select2-selection__rendered');
1560
+ var formatted = this.display(selection, $rendered);
1561
+
1562
+ $rendered.empty().append(formatted);
1563
+ $rendered.prop('title', selection.title || selection.text);
1564
+ };
1565
+
1566
+ return SingleSelection;
1567
+ });
1568
+
1569
+ S2.define('select2/selection/multiple',[
1570
+ 'jquery',
1571
+ './base',
1572
+ '../utils'
1573
+ ], function ($, BaseSelection, Utils) {
1574
+ function MultipleSelection ($element, options) {
1575
+ MultipleSelection.__super__.constructor.apply(this, arguments);
1576
+ }
1577
+
1578
+ Utils.Extend(MultipleSelection, BaseSelection);
1579
+
1580
+ MultipleSelection.prototype.render = function () {
1581
+ var $selection = MultipleSelection.__super__.render.call(this);
1582
+
1583
+ $selection.addClass('select2-selection--multiple');
1584
+
1585
+ $selection.html(
1586
+ '<ul class="select2-selection__rendered"></ul>'
1587
+ );
1588
+
1589
+ return $selection;
1590
+ };
1591
+
1592
+ MultipleSelection.prototype.bind = function (container, $container) {
1593
+ var self = this;
1594
+
1595
+ MultipleSelection.__super__.bind.apply(this, arguments);
1596
+
1597
+ this.$selection.on('click', function (evt) {
1598
+ self.trigger('toggle', {
1599
+ originalEvent: evt
1600
+ });
1601
+ });
1602
+
1603
+ this.$selection.on(
1604
+ 'click',
1605
+ '.select2-selection__choice__remove',
1606
+ function (evt) {
1607
+ // Ignore the event if it is disabled
1608
+ if (self.options.get('disabled')) {
1609
+ return;
1610
+ }
1611
+
1612
+ var $remove = $(this);
1613
+ var $selection = $remove.parent();
1614
+
1615
+ var data = $selection.data('data');
1616
+
1617
+ self.trigger('unselect', {
1618
+ originalEvent: evt,
1619
+ data: data
1620
+ });
1621
+ }
1622
+ );
1623
+ };
1624
+
1625
+ MultipleSelection.prototype.clear = function () {
1626
+ this.$selection.find('.select2-selection__rendered').empty();
1627
+ };
1628
+
1629
+ MultipleSelection.prototype.display = function (data, container) {
1630
+ var template = this.options.get('templateSelection');
1631
+ var escapeMarkup = this.options.get('escapeMarkup');
1632
+
1633
+ return escapeMarkup(template(data, container));
1634
+ };
1635
+
1636
+ MultipleSelection.prototype.selectionContainer = function () {
1637
+ var $container = $(
1638
+ '<li class="select2-selection__choice">' +
1639
+ '<span class="select2-selection__choice__remove" role="presentation">' +
1640
+ '&times;' +
1641
+ '</span>' +
1642
+ '</li>'
1643
+ );
1644
+
1645
+ return $container;
1646
+ };
1647
+
1648
+ MultipleSelection.prototype.update = function (data) {
1649
+ this.clear();
1650
+
1651
+ if (data.length === 0) {
1652
+ return;
1653
+ }
1654
+
1655
+ var $selections = [];
1656
+
1657
+ for (var d = 0; d < data.length; d++) {
1658
+ var selection = data[d];
1659
+
1660
+ var $selection = this.selectionContainer();
1661
+ var formatted = this.display(selection, $selection);
1662
+
1663
+ $selection.append(formatted);
1664
+ $selection.prop('title', selection.title || selection.text);
1665
+
1666
+ $selection.data('data', selection);
1667
+
1668
+ $selections.push($selection);
1669
+ }
1670
+
1671
+ var $rendered = this.$selection.find('.select2-selection__rendered');
1672
+
1673
+ Utils.appendMany($rendered, $selections);
1674
+ };
1675
+
1676
+ return MultipleSelection;
1677
+ });
1678
+
1679
+ S2.define('select2/selection/placeholder',[
1680
+ '../utils'
1681
+ ], function (Utils) {
1682
+ function Placeholder (decorated, $element, options) {
1683
+ this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
1684
+
1685
+ decorated.call(this, $element, options);
1686
+ }
1687
+
1688
+ Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
1689
+ if (typeof placeholder === 'string') {
1690
+ placeholder = {
1691
+ id: '',
1692
+ text: placeholder
1693
+ };
1694
+ }
1695
+
1696
+ return placeholder;
1697
+ };
1698
+
1699
+ Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
1700
+ var $placeholder = this.selectionContainer();
1701
+
1702
+ $placeholder.html(this.display(placeholder));
1703
+ $placeholder.addClass('select2-selection__placeholder')
1704
+ .removeClass('select2-selection__choice');
1705
+
1706
+ return $placeholder;
1707
+ };
1708
+
1709
+ Placeholder.prototype.update = function (decorated, data) {
1710
+ var singlePlaceholder = (
1711
+ data.length == 1 && data[0].id != this.placeholder.id
1712
+ );
1713
+ var multipleSelections = data.length > 1;
1714
+
1715
+ if (multipleSelections || singlePlaceholder) {
1716
+ return decorated.call(this, data);
1717
+ }
1718
+
1719
+ this.clear();
1720
+
1721
+ var $placeholder = this.createPlaceholder(this.placeholder);
1722
+
1723
+ this.$selection.find('.select2-selection__rendered').append($placeholder);
1724
+ };
1725
+
1726
+ return Placeholder;
1727
+ });
1728
+
1729
+ S2.define('select2/selection/allowClear',[
1730
+ 'jquery',
1731
+ '../keys'
1732
+ ], function ($, KEYS) {
1733
+ function AllowClear () { }
1734
+
1735
+ AllowClear.prototype.bind = function (decorated, container, $container) {
1736
+ var self = this;
1737
+
1738
+ decorated.call(this, container, $container);
1739
+
1740
+ if (this.placeholder == null) {
1741
+ if (this.options.get('debug') && window.console && console.error) {
1742
+ console.error(
1743
+ 'Select2: The `allowClear` option should be used in combination ' +
1744
+ 'with the `placeholder` option.'
1745
+ );
1746
+ }
1747
+ }
1748
+
1749
+ this.$selection.on('mousedown', '.select2-selection__clear',
1750
+ function (evt) {
1751
+ self._handleClear(evt);
1752
+ });
1753
+
1754
+ container.on('keypress', function (evt) {
1755
+ self._handleKeyboardClear(evt, container);
1756
+ });
1757
+ };
1758
+
1759
+ AllowClear.prototype._handleClear = function (_, evt) {
1760
+ // Ignore the event if it is disabled
1761
+ if (this.options.get('disabled')) {
1762
+ return;
1763
+ }
1764
+
1765
+ var $clear = this.$selection.find('.select2-selection__clear');
1766
+
1767
+ // Ignore the event if nothing has been selected
1768
+ if ($clear.length === 0) {
1769
+ return;
1770
+ }
1771
+
1772
+ evt.stopPropagation();
1773
+
1774
+ var data = $clear.data('data');
1775
+
1776
+ for (var d = 0; d < data.length; d++) {
1777
+ var unselectData = {
1778
+ data: data[d]
1779
+ };
1780
+
1781
+ // Trigger the `unselect` event, so people can prevent it from being
1782
+ // cleared.
1783
+ this.trigger('unselect', unselectData);
1784
+
1785
+ // If the event was prevented, don't clear it out.
1786
+ if (unselectData.prevented) {
1787
+ return;
1788
+ }
1789
+ }
1790
+
1791
+ this.$element.val(this.placeholder.id).trigger('change');
1792
+
1793
+ this.trigger('toggle', {});
1794
+ };
1795
+
1796
+ AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
1797
+ if (container.isOpen()) {
1798
+ return;
1799
+ }
1800
+
1801
+ if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
1802
+ this._handleClear(evt);
1803
+ }
1804
+ };
1805
+
1806
+ AllowClear.prototype.update = function (decorated, data) {
1807
+ decorated.call(this, data);
1808
+
1809
+ if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
1810
+ data.length === 0) {
1811
+ return;
1812
+ }
1813
+
1814
+ var $remove = $(
1815
+ '<span class="select2-selection__clear">' +
1816
+ '&times;' +
1817
+ '</span>'
1818
+ );
1819
+ $remove.data('data', data);
1820
+
1821
+ this.$selection.find('.select2-selection__rendered').prepend($remove);
1822
+ };
1823
+
1824
+ return AllowClear;
1825
+ });
1826
+
1827
+ S2.define('select2/selection/search',[
1828
+ 'jquery',
1829
+ '../utils',
1830
+ '../keys'
1831
+ ], function ($, Utils, KEYS) {
1832
+ function Search (decorated, $element, options) {
1833
+ decorated.call(this, $element, options);
1834
+ }
1835
+
1836
+ Search.prototype.render = function (decorated) {
1837
+ var $search = $(
1838
+ '<li class="select2-search select2-search--inline">' +
1839
+ '<input class="select2-search__field" type="search" tabindex="-1"' +
1840
+ ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
1841
+ ' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
1842
+ '</li>'
1843
+ );
1844
+
1845
+ this.$searchContainer = $search;
1846
+ this.$search = $search.find('input');
1847
+
1848
+ var $rendered = decorated.call(this);
1849
+
1850
+ this._transferTabIndex();
1851
+
1852
+ return $rendered;
1853
+ };
1854
+
1855
+ Search.prototype.bind = function (decorated, container, $container) {
1856
+ var self = this;
1857
+
1858
+ decorated.call(this, container, $container);
1859
+
1860
+ container.on('open', function () {
1861
+ self.$search.trigger('focus');
1862
+ });
1863
+
1864
+ container.on('close', function () {
1865
+ self.$search.val('');
1866
+ self.$search.removeAttr('aria-activedescendant');
1867
+ self.$search.trigger('focus');
1868
+ });
1869
+
1870
+ container.on('enable', function () {
1871
+ self.$search.prop('disabled', false);
1872
+
1873
+ self._transferTabIndex();
1874
+ });
1875
+
1876
+ container.on('disable', function () {
1877
+ self.$search.prop('disabled', true);
1878
+ });
1879
+
1880
+ container.on('focus', function (evt) {
1881
+ self.$search.trigger('focus');
1882
+ });
1883
+
1884
+ container.on('results:focus', function (params) {
1885
+ self.$search.attr('aria-activedescendant', params.id);
1886
+ });
1887
+
1888
+ this.$selection.on('focusin', '.select2-search--inline', function (evt) {
1889
+ self.trigger('focus', evt);
1890
+ });
1891
+
1892
+ this.$selection.on('focusout', '.select2-search--inline', function (evt) {
1893
+ self._handleBlur(evt);
1894
+ });
1895
+
1896
+ this.$selection.on('keydown', '.select2-search--inline', function (evt) {
1897
+ evt.stopPropagation();
1898
+
1899
+ self.trigger('keypress', evt);
1900
+
1901
+ self._keyUpPrevented = evt.isDefaultPrevented();
1902
+
1903
+ var key = evt.which;
1904
+
1905
+ if (key === KEYS.BACKSPACE && self.$search.val() === '') {
1906
+ var $previousChoice = self.$searchContainer
1907
+ .prev('.select2-selection__choice');
1908
+
1909
+ if ($previousChoice.length > 0) {
1910
+ var item = $previousChoice.data('data');
1911
+
1912
+ self.searchRemoveChoice(item);
1913
+
1914
+ evt.preventDefault();
1915
+ }
1916
+ }
1917
+ });
1918
+
1919
+ // Try to detect the IE version should the `documentMode` property that
1920
+ // is stored on the document. This is only implemented in IE and is
1921
+ // slightly cleaner than doing a user agent check.
1922
+ // This property is not available in Edge, but Edge also doesn't have
1923
+ // this bug.
1924
+ var msie = document.documentMode;
1925
+ var disableInputEvents = msie && msie <= 11;
1926
+
1927
+ // Workaround for browsers which do not support the `input` event
1928
+ // This will prevent double-triggering of events for browsers which support
1929
+ // both the `keyup` and `input` events.
1930
+ this.$selection.on(
1931
+ 'input.searchcheck',
1932
+ '.select2-search--inline',
1933
+ function (evt) {
1934
+ // IE will trigger the `input` event when a placeholder is used on a
1935
+ // search box. To get around this issue, we are forced to ignore all
1936
+ // `input` events in IE and keep using `keyup`.
1937
+ if (disableInputEvents) {
1938
+ self.$selection.off('input.search input.searchcheck');
1939
+ return;
1940
+ }
1941
+
1942
+ // Unbind the duplicated `keyup` event
1943
+ self.$selection.off('keyup.search');
1944
+ }
1945
+ );
1946
+
1947
+ this.$selection.on(
1948
+ 'keyup.search input.search',
1949
+ '.select2-search--inline',
1950
+ function (evt) {
1951
+ // IE will trigger the `input` event when a placeholder is used on a
1952
+ // search box. To get around this issue, we are forced to ignore all
1953
+ // `input` events in IE and keep using `keyup`.
1954
+ if (disableInputEvents && evt.type === 'input') {
1955
+ self.$selection.off('input.search input.searchcheck');
1956
+ return;
1957
+ }
1958
+
1959
+ var key = evt.which;
1960
+
1961
+ // We can freely ignore events from modifier keys
1962
+ if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
1963
+ return;
1964
+ }
1965
+
1966
+ // Tabbing will be handled during the `keydown` phase
1967
+ if (key == KEYS.TAB) {
1968
+ return;
1969
+ }
1970
+
1971
+ self.handleSearch(evt);
1972
+ }
1973
+ );
1974
+ };
1975
+
1976
+ /**
1977
+ * This method will transfer the tabindex attribute from the rendered
1978
+ * selection to the search box. This allows for the search box to be used as
1979
+ * the primary focus instead of the selection container.
1980
+ *
1981
+ * @private
1982
+ */
1983
+ Search.prototype._transferTabIndex = function (decorated) {
1984
+ this.$search.attr('tabindex', this.$selection.attr('tabindex'));
1985
+ this.$selection.attr('tabindex', '-1');
1986
+ };
1987
+
1988
+ Search.prototype.createPlaceholder = function (decorated, placeholder) {
1989
+ this.$search.attr('placeholder', placeholder.text);
1990
+ };
1991
+
1992
+ Search.prototype.update = function (decorated, data) {
1993
+ var searchHadFocus = this.$search[0] == document.activeElement;
1994
+
1995
+ this.$search.attr('placeholder', '');
1996
+
1997
+ decorated.call(this, data);
1998
+
1999
+ this.$selection.find('.select2-selection__rendered')
2000
+ .append(this.$searchContainer);
2001
+
2002
+ this.resizeSearch();
2003
+ if (searchHadFocus) {
2004
+ this.$search.focus();
2005
+ }
2006
+ };
2007
+
2008
+ Search.prototype.handleSearch = function () {
2009
+ this.resizeSearch();
2010
+
2011
+ if (!this._keyUpPrevented) {
2012
+ var input = this.$search.val();
2013
+
2014
+ this.trigger('query', {
2015
+ term: input
2016
+ });
2017
+ }
2018
+
2019
+ this._keyUpPrevented = false;
2020
+ };
2021
+
2022
+ Search.prototype.searchRemoveChoice = function (decorated, item) {
2023
+ this.trigger('unselect', {
2024
+ data: item
2025
+ });
2026
+
2027
+ this.$search.val(item.text);
2028
+ this.handleSearch();
2029
+ };
2030
+
2031
+ Search.prototype.resizeSearch = function () {
2032
+ this.$search.css('width', '25px');
2033
+
2034
+ var width = '';
2035
+
2036
+ if (this.$search.attr('placeholder') !== '') {
2037
+ width = this.$selection.find('.select2-selection__rendered').innerWidth();
2038
+ } else {
2039
+ var minimumWidth = this.$search.val().length + 1;
2040
+
2041
+ width = (minimumWidth * 0.75) + 'em';
2042
+ }
2043
+
2044
+ this.$search.css('width', width);
2045
+ };
2046
+
2047
+ return Search;
2048
+ });
2049
+
2050
+ S2.define('select2/selection/eventRelay',[
2051
+ 'jquery'
2052
+ ], function ($) {
2053
+ function EventRelay () { }
2054
+
2055
+ EventRelay.prototype.bind = function (decorated, container, $container) {
2056
+ var self = this;
2057
+ var relayEvents = [
2058
+ 'open', 'opening',
2059
+ 'close', 'closing',
2060
+ 'select', 'selecting',
2061
+ 'unselect', 'unselecting'
2062
+ ];
2063
+
2064
+ var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
2065
+
2066
+ decorated.call(this, container, $container);
2067
+
2068
+ container.on('*', function (name, params) {
2069
+ // Ignore events that should not be relayed
2070
+ if ($.inArray(name, relayEvents) === -1) {
2071
+ return;
2072
+ }
2073
+
2074
+ // The parameters should always be an object
2075
+ params = params || {};
2076
+
2077
+ // Generate the jQuery event for the Select2 event
2078
+ var evt = $.Event('select2:' + name, {
2079
+ params: params
2080
+ });
2081
+
2082
+ self.$element.trigger(evt);
2083
+
2084
+ // Only handle preventable events if it was one
2085
+ if ($.inArray(name, preventableEvents) === -1) {
2086
+ return;
2087
+ }
2088
+
2089
+ params.prevented = evt.isDefaultPrevented();
2090
+ });
2091
+ };
2092
+
2093
+ return EventRelay;
2094
+ });
2095
+
2096
+ S2.define('select2/translation',[
2097
+ 'jquery',
2098
+ 'require'
2099
+ ], function ($, require) {
2100
+ function Translation (dict) {
2101
+ this.dict = dict || {};
2102
+ }
2103
+
2104
+ Translation.prototype.all = function () {
2105
+ return this.dict;
2106
+ };
2107
+
2108
+ Translation.prototype.get = function (key) {
2109
+ return this.dict[key];
2110
+ };
2111
+
2112
+ Translation.prototype.extend = function (translation) {
2113
+ this.dict = $.extend({}, translation.all(), this.dict);
2114
+ };
2115
+
2116
+ // Static functions
2117
+
2118
+ Translation._cache = {};
2119
+
2120
+ Translation.loadPath = function (path) {
2121
+ if (!(path in Translation._cache)) {
2122
+ var translations = require(path);
2123
+
2124
+ Translation._cache[path] = translations;
2125
+ }
2126
+
2127
+ return new Translation(Translation._cache[path]);
2128
+ };
2129
+
2130
+ return Translation;
2131
+ });
2132
+
2133
+ S2.define('select2/diacritics',[
2134
+
2135
+ ], function () {
2136
+ var diacritics = {
2137
+ '\u24B6': 'A',
2138
+ '\uFF21': 'A',
2139
+ '\u00C0': 'A',
2140
+ '\u00C1': 'A',
2141
+ '\u00C2': 'A',
2142
+ '\u1EA6': 'A',
2143
+ '\u1EA4': 'A',
2144
+ '\u1EAA': 'A',
2145
+ '\u1EA8': 'A',
2146
+ '\u00C3': 'A',
2147
+ '\u0100': 'A',
2148
+ '\u0102': 'A',
2149
+ '\u1EB0': 'A',
2150
+ '\u1EAE': 'A',
2151
+ '\u1EB4': 'A',
2152
+ '\u1EB2': 'A',
2153
+ '\u0226': 'A',
2154
+ '\u01E0': 'A',
2155
+ '\u00C4': 'A',
2156
+ '\u01DE': 'A',
2157
+ '\u1EA2': 'A',
2158
+ '\u00C5': 'A',
2159
+ '\u01FA': 'A',
2160
+ '\u01CD': 'A',
2161
+ '\u0200': 'A',
2162
+ '\u0202': 'A',
2163
+ '\u1EA0': 'A',
2164
+ '\u1EAC': 'A',
2165
+ '\u1EB6': 'A',
2166
+ '\u1E00': 'A',
2167
+ '\u0104': 'A',
2168
+ '\u023A': 'A',
2169
+ '\u2C6F': 'A',
2170
+ '\uA732': 'AA',
2171
+ '\u00C6': 'AE',
2172
+ '\u01FC': 'AE',
2173
+ '\u01E2': 'AE',
2174
+ '\uA734': 'AO',
2175
+ '\uA736': 'AU',
2176
+ '\uA738': 'AV',
2177
+ '\uA73A': 'AV',
2178
+ '\uA73C': 'AY',
2179
+ '\u24B7': 'B',
2180
+ '\uFF22': 'B',
2181
+ '\u1E02': 'B',
2182
+ '\u1E04': 'B',
2183
+ '\u1E06': 'B',
2184
+ '\u0243': 'B',
2185
+ '\u0182': 'B',
2186
+ '\u0181': 'B',
2187
+ '\u24B8': 'C',
2188
+ '\uFF23': 'C',
2189
+ '\u0106': 'C',
2190
+ '\u0108': 'C',
2191
+ '\u010A': 'C',
2192
+ '\u010C': 'C',
2193
+ '\u00C7': 'C',
2194
+ '\u1E08': 'C',
2195
+ '\u0187': 'C',
2196
+ '\u023B': 'C',
2197
+ '\uA73E': 'C',
2198
+ '\u24B9': 'D',
2199
+ '\uFF24': 'D',
2200
+ '\u1E0A': 'D',
2201
+ '\u010E': 'D',
2202
+ '\u1E0C': 'D',
2203
+ '\u1E10': 'D',
2204
+ '\u1E12': 'D',
2205
+ '\u1E0E': 'D',
2206
+ '\u0110': 'D',
2207
+ '\u018B': 'D',
2208
+ '\u018A': 'D',
2209
+ '\u0189': 'D',
2210
+ '\uA779': 'D',
2211
+ '\u01F1': 'DZ',
2212
+ '\u01C4': 'DZ',
2213
+ '\u01F2': 'Dz',
2214
+ '\u01C5': 'Dz',
2215
+ '\u24BA': 'E',
2216
+ '\uFF25': 'E',
2217
+ '\u00C8': 'E',
2218
+ '\u00C9': 'E',
2219
+ '\u00CA': 'E',
2220
+ '\u1EC0': 'E',
2221
+ '\u1EBE': 'E',
2222
+ '\u1EC4': 'E',
2223
+ '\u1EC2': 'E',
2224
+ '\u1EBC': 'E',
2225
+ '\u0112': 'E',
2226
+ '\u1E14': 'E',
2227
+ '\u1E16': 'E',
2228
+ '\u0114': 'E',
2229
+ '\u0116': 'E',
2230
+ '\u00CB': 'E',
2231
+ '\u1EBA': 'E',
2232
+ '\u011A': 'E',
2233
+ '\u0204': 'E',
2234
+ '\u0206': 'E',
2235
+ '\u1EB8': 'E',
2236
+ '\u1EC6': 'E',
2237
+ '\u0228': 'E',
2238
+ '\u1E1C': 'E',
2239
+ '\u0118': 'E',
2240
+ '\u1E18': 'E',
2241
+ '\u1E1A': 'E',
2242
+ '\u0190': 'E',
2243
+ '\u018E': 'E',
2244
+ '\u24BB': 'F',
2245
+ '\uFF26': 'F',
2246
+ '\u1E1E': 'F',
2247
+ '\u0191': 'F',
2248
+ '\uA77B': 'F',
2249
+ '\u24BC': 'G',
2250
+ '\uFF27': 'G',
2251
+ '\u01F4': 'G',
2252
+ '\u011C': 'G',
2253
+ '\u1E20': 'G',
2254
+ '\u011E': 'G',
2255
+ '\u0120': 'G',
2256
+ '\u01E6': 'G',
2257
+ '\u0122': 'G',
2258
+ '\u01E4': 'G',
2259
+ '\u0193': 'G',
2260
+ '\uA7A0': 'G',
2261
+ '\uA77D': 'G',
2262
+ '\uA77E': 'G',
2263
+ '\u24BD': 'H',
2264
+ '\uFF28': 'H',
2265
+ '\u0124': 'H',
2266
+ '\u1E22': 'H',
2267
+ '\u1E26': 'H',
2268
+ '\u021E': 'H',
2269
+ '\u1E24': 'H',
2270
+ '\u1E28': 'H',
2271
+ '\u1E2A': 'H',
2272
+ '\u0126': 'H',
2273
+ '\u2C67': 'H',
2274
+ '\u2C75': 'H',
2275
+ '\uA78D': 'H',
2276
+ '\u24BE': 'I',
2277
+ '\uFF29': 'I',
2278
+ '\u00CC': 'I',
2279
+ '\u00CD': 'I',
2280
+ '\u00CE': 'I',
2281
+ '\u0128': 'I',
2282
+ '\u012A': 'I',
2283
+ '\u012C': 'I',
2284
+ '\u0130': 'I',
2285
+ '\u00CF': 'I',
2286
+ '\u1E2E': 'I',
2287
+ '\u1EC8': 'I',
2288
+ '\u01CF': 'I',
2289
+ '\u0208': 'I',
2290
+ '\u020A': 'I',
2291
+ '\u1ECA': 'I',
2292
+ '\u012E': 'I',
2293
+ '\u1E2C': 'I',
2294
+ '\u0197': 'I',
2295
+ '\u24BF': 'J',
2296
+ '\uFF2A': 'J',
2297
+ '\u0134': 'J',
2298
+ '\u0248': 'J',
2299
+ '\u24C0': 'K',
2300
+ '\uFF2B': 'K',
2301
+ '\u1E30': 'K',
2302
+ '\u01E8': 'K',
2303
+ '\u1E32': 'K',
2304
+ '\u0136': 'K',
2305
+ '\u1E34': 'K',
2306
+ '\u0198': 'K',
2307
+ '\u2C69': 'K',
2308
+ '\uA740': 'K',
2309
+ '\uA742': 'K',
2310
+ '\uA744': 'K',
2311
+ '\uA7A2': 'K',
2312
+ '\u24C1': 'L',
2313
+ '\uFF2C': 'L',
2314
+ '\u013F': 'L',
2315
+ '\u0139': 'L',
2316
+ '\u013D': 'L',
2317
+ '\u1E36': 'L',
2318
+ '\u1E38': 'L',
2319
+ '\u013B': 'L',
2320
+ '\u1E3C': 'L',
2321
+ '\u1E3A': 'L',
2322
+ '\u0141': 'L',
2323
+ '\u023D': 'L',
2324
+ '\u2C62': 'L',
2325
+ '\u2C60': 'L',
2326
+ '\uA748': 'L',
2327
+ '\uA746': 'L',
2328
+ '\uA780': 'L',
2329
+ '\u01C7': 'LJ',
2330
+ '\u01C8': 'Lj',
2331
+ '\u24C2': 'M',
2332
+ '\uFF2D': 'M',
2333
+ '\u1E3E': 'M',
2334
+ '\u1E40': 'M',
2335
+ '\u1E42': 'M',
2336
+ '\u2C6E': 'M',
2337
+ '\u019C': 'M',
2338
+ '\u24C3': 'N',
2339
+ '\uFF2E': 'N',
2340
+ '\u01F8': 'N',
2341
+ '\u0143': 'N',
2342
+ '\u00D1': 'N',
2343
+ '\u1E44': 'N',
2344
+ '\u0147': 'N',
2345
+ '\u1E46': 'N',
2346
+ '\u0145': 'N',
2347
+ '\u1E4A': 'N',
2348
+ '\u1E48': 'N',
2349
+ '\u0220': 'N',
2350
+ '\u019D': 'N',
2351
+ '\uA790': 'N',
2352
+ '\uA7A4': 'N',
2353
+ '\u01CA': 'NJ',
2354
+ '\u01CB': 'Nj',
2355
+ '\u24C4': 'O',
2356
+ '\uFF2F': 'O',
2357
+ '\u00D2': 'O',
2358
+ '\u00D3': 'O',
2359
+ '\u00D4': 'O',
2360
+ '\u1ED2': 'O',
2361
+ '\u1ED0': 'O',
2362
+ '\u1ED6': 'O',
2363
+ '\u1ED4': 'O',
2364
+ '\u00D5': 'O',
2365
+ '\u1E4C': 'O',
2366
+ '\u022C': 'O',
2367
+ '\u1E4E': 'O',
2368
+ '\u014C': 'O',
2369
+ '\u1E50': 'O',
2370
+ '\u1E52': 'O',
2371
+ '\u014E': 'O',
2372
+ '\u022E': 'O',
2373
+ '\u0230': 'O',
2374
+ '\u00D6': 'O',
2375
+ '\u022A': 'O',
2376
+ '\u1ECE': 'O',
2377
+ '\u0150': 'O',
2378
+ '\u01D1': 'O',
2379
+ '\u020C': 'O',
2380
+ '\u020E': 'O',
2381
+ '\u01A0': 'O',
2382
+ '\u1EDC': 'O',
2383
+ '\u1EDA': 'O',
2384
+ '\u1EE0': 'O',
2385
+ '\u1EDE': 'O',
2386
+ '\u1EE2': 'O',
2387
+ '\u1ECC': 'O',
2388
+ '\u1ED8': 'O',
2389
+ '\u01EA': 'O',
2390
+ '\u01EC': 'O',
2391
+ '\u00D8': 'O',
2392
+ '\u01FE': 'O',
2393
+ '\u0186': 'O',
2394
+ '\u019F': 'O',
2395
+ '\uA74A': 'O',
2396
+ '\uA74C': 'O',
2397
+ '\u01A2': 'OI',
2398
+ '\uA74E': 'OO',
2399
+ '\u0222': 'OU',
2400
+ '\u24C5': 'P',
2401
+ '\uFF30': 'P',
2402
+ '\u1E54': 'P',
2403
+ '\u1E56': 'P',
2404
+ '\u01A4': 'P',
2405
+ '\u2C63': 'P',
2406
+ '\uA750': 'P',
2407
+ '\uA752': 'P',
2408
+ '\uA754': 'P',
2409
+ '\u24C6': 'Q',
2410
+ '\uFF31': 'Q',
2411
+ '\uA756': 'Q',
2412
+ '\uA758': 'Q',
2413
+ '\u024A': 'Q',
2414
+ '\u24C7': 'R',
2415
+ '\uFF32': 'R',
2416
+ '\u0154': 'R',
2417
+ '\u1E58': 'R',
2418
+ '\u0158': 'R',
2419
+ '\u0210': 'R',
2420
+ '\u0212': 'R',
2421
+ '\u1E5A': 'R',
2422
+ '\u1E5C': 'R',
2423
+ '\u0156': 'R',
2424
+ '\u1E5E': 'R',
2425
+ '\u024C': 'R',
2426
+ '\u2C64': 'R',
2427
+ '\uA75A': 'R',
2428
+ '\uA7A6': 'R',
2429
+ '\uA782': 'R',
2430
+ '\u24C8': 'S',
2431
+ '\uFF33': 'S',
2432
+ '\u1E9E': 'S',
2433
+ '\u015A': 'S',
2434
+ '\u1E64': 'S',
2435
+ '\u015C': 'S',
2436
+ '\u1E60': 'S',
2437
+ '\u0160': 'S',
2438
+ '\u1E66': 'S',
2439
+ '\u1E62': 'S',
2440
+ '\u1E68': 'S',
2441
+ '\u0218': 'S',
2442
+ '\u015E': 'S',
2443
+ '\u2C7E': 'S',
2444
+ '\uA7A8': 'S',
2445
+ '\uA784': 'S',
2446
+ '\u24C9': 'T',
2447
+ '\uFF34': 'T',
2448
+ '\u1E6A': 'T',
2449
+ '\u0164': 'T',
2450
+ '\u1E6C': 'T',
2451
+ '\u021A': 'T',
2452
+ '\u0162': 'T',
2453
+ '\u1E70': 'T',
2454
+ '\u1E6E': 'T',
2455
+ '\u0166': 'T',
2456
+ '\u01AC': 'T',
2457
+ '\u01AE': 'T',
2458
+ '\u023E': 'T',
2459
+ '\uA786': 'T',
2460
+ '\uA728': 'TZ',
2461
+ '\u24CA': 'U',
2462
+ '\uFF35': 'U',
2463
+ '\u00D9': 'U',
2464
+ '\u00DA': 'U',
2465
+ '\u00DB': 'U',
2466
+ '\u0168': 'U',
2467
+ '\u1E78': 'U',
2468
+ '\u016A': 'U',
2469
+ '\u1E7A': 'U',
2470
+ '\u016C': 'U',
2471
+ '\u00DC': 'U',
2472
+ '\u01DB': 'U',
2473
+ '\u01D7': 'U',
2474
+ '\u01D5': 'U',
2475
+ '\u01D9': 'U',
2476
+ '\u1EE6': 'U',
2477
+ '\u016E': 'U',
2478
+ '\u0170': 'U',
2479
+ '\u01D3': 'U',
2480
+ '\u0214': 'U',
2481
+ '\u0216': 'U',
2482
+ '\u01AF': 'U',
2483
+ '\u1EEA': 'U',
2484
+ '\u1EE8': 'U',
2485
+ '\u1EEE': 'U',
2486
+ '\u1EEC': 'U',
2487
+ '\u1EF0': 'U',
2488
+ '\u1EE4': 'U',
2489
+ '\u1E72': 'U',
2490
+ '\u0172': 'U',
2491
+ '\u1E76': 'U',
2492
+ '\u1E74': 'U',
2493
+ '\u0244': 'U',
2494
+ '\u24CB': 'V',
2495
+ '\uFF36': 'V',
2496
+ '\u1E7C': 'V',
2497
+ '\u1E7E': 'V',
2498
+ '\u01B2': 'V',
2499
+ '\uA75E': 'V',
2500
+ '\u0245': 'V',
2501
+ '\uA760': 'VY',
2502
+ '\u24CC': 'W',
2503
+ '\uFF37': 'W',
2504
+ '\u1E80': 'W',
2505
+ '\u1E82': 'W',
2506
+ '\u0174': 'W',
2507
+ '\u1E86': 'W',
2508
+ '\u1E84': 'W',
2509
+ '\u1E88': 'W',
2510
+ '\u2C72': 'W',
2511
+ '\u24CD': 'X',
2512
+ '\uFF38': 'X',
2513
+ '\u1E8A': 'X',
2514
+ '\u1E8C': 'X',
2515
+ '\u24CE': 'Y',
2516
+ '\uFF39': 'Y',
2517
+ '\u1EF2': 'Y',
2518
+ '\u00DD': 'Y',
2519
+ '\u0176': 'Y',
2520
+ '\u1EF8': 'Y',
2521
+ '\u0232': 'Y',
2522
+ '\u1E8E': 'Y',
2523
+ '\u0178': 'Y',
2524
+ '\u1EF6': 'Y',
2525
+ '\u1EF4': 'Y',
2526
+ '\u01B3': 'Y',
2527
+ '\u024E': 'Y',
2528
+ '\u1EFE': 'Y',
2529
+ '\u24CF': 'Z',
2530
+ '\uFF3A': 'Z',
2531
+ '\u0179': 'Z',
2532
+ '\u1E90': 'Z',
2533
+ '\u017B': 'Z',
2534
+ '\u017D': 'Z',
2535
+ '\u1E92': 'Z',
2536
+ '\u1E94': 'Z',
2537
+ '\u01B5': 'Z',
2538
+ '\u0224': 'Z',
2539
+ '\u2C7F': 'Z',
2540
+ '\u2C6B': 'Z',
2541
+ '\uA762': 'Z',
2542
+ '\u24D0': 'a',
2543
+ '\uFF41': 'a',
2544
+ '\u1E9A': 'a',
2545
+ '\u00E0': 'a',
2546
+ '\u00E1': 'a',
2547
+ '\u00E2': 'a',
2548
+ '\u1EA7': 'a',
2549
+ '\u1EA5': 'a',
2550
+ '\u1EAB': 'a',
2551
+ '\u1EA9': 'a',
2552
+ '\u00E3': 'a',
2553
+ '\u0101': 'a',
2554
+ '\u0103': 'a',
2555
+ '\u1EB1': 'a',
2556
+ '\u1EAF': 'a',
2557
+ '\u1EB5': 'a',
2558
+ '\u1EB3': 'a',
2559
+ '\u0227': 'a',
2560
+ '\u01E1': 'a',
2561
+ '\u00E4': 'a',
2562
+ '\u01DF': 'a',
2563
+ '\u1EA3': 'a',
2564
+ '\u00E5': 'a',
2565
+ '\u01FB': 'a',
2566
+ '\u01CE': 'a',
2567
+ '\u0201': 'a',
2568
+ '\u0203': 'a',
2569
+ '\u1EA1': 'a',
2570
+ '\u1EAD': 'a',
2571
+ '\u1EB7': 'a',
2572
+ '\u1E01': 'a',
2573
+ '\u0105': 'a',
2574
+ '\u2C65': 'a',
2575
+ '\u0250': 'a',
2576
+ '\uA733': 'aa',
2577
+ '\u00E6': 'ae',
2578
+ '\u01FD': 'ae',
2579
+ '\u01E3': 'ae',
2580
+ '\uA735': 'ao',
2581
+ '\uA737': 'au',
2582
+ '\uA739': 'av',
2583
+ '\uA73B': 'av',
2584
+ '\uA73D': 'ay',
2585
+ '\u24D1': 'b',
2586
+ '\uFF42': 'b',
2587
+ '\u1E03': 'b',
2588
+ '\u1E05': 'b',
2589
+ '\u1E07': 'b',
2590
+ '\u0180': 'b',
2591
+ '\u0183': 'b',
2592
+ '\u0253': 'b',
2593
+ '\u24D2': 'c',
2594
+ '\uFF43': 'c',
2595
+ '\u0107': 'c',
2596
+ '\u0109': 'c',
2597
+ '\u010B': 'c',
2598
+ '\u010D': 'c',
2599
+ '\u00E7': 'c',
2600
+ '\u1E09': 'c',
2601
+ '\u0188': 'c',
2602
+ '\u023C': 'c',
2603
+ '\uA73F': 'c',
2604
+ '\u2184': 'c',
2605
+ '\u24D3': 'd',
2606
+ '\uFF44': 'd',
2607
+ '\u1E0B': 'd',
2608
+ '\u010F': 'd',
2609
+ '\u1E0D': 'd',
2610
+ '\u1E11': 'd',
2611
+ '\u1E13': 'd',
2612
+ '\u1E0F': 'd',
2613
+ '\u0111': 'd',
2614
+ '\u018C': 'd',
2615
+ '\u0256': 'd',
2616
+ '\u0257': 'd',
2617
+ '\uA77A': 'd',
2618
+ '\u01F3': 'dz',
2619
+ '\u01C6': 'dz',
2620
+ '\u24D4': 'e',
2621
+ '\uFF45': 'e',
2622
+ '\u00E8': 'e',
2623
+ '\u00E9': 'e',
2624
+ '\u00EA': 'e',
2625
+ '\u1EC1': 'e',
2626
+ '\u1EBF': 'e',
2627
+ '\u1EC5': 'e',
2628
+ '\u1EC3': 'e',
2629
+ '\u1EBD': 'e',
2630
+ '\u0113': 'e',
2631
+ '\u1E15': 'e',
2632
+ '\u1E17': 'e',
2633
+ '\u0115': 'e',
2634
+ '\u0117': 'e',
2635
+ '\u00EB': 'e',
2636
+ '\u1EBB': 'e',
2637
+ '\u011B': 'e',
2638
+ '\u0205': 'e',
2639
+ '\u0207': 'e',
2640
+ '\u1EB9': 'e',
2641
+ '\u1EC7': 'e',
2642
+ '\u0229': 'e',
2643
+ '\u1E1D': 'e',
2644
+ '\u0119': 'e',
2645
+ '\u1E19': 'e',
2646
+ '\u1E1B': 'e',
2647
+ '\u0247': 'e',
2648
+ '\u025B': 'e',
2649
+ '\u01DD': 'e',
2650
+ '\u24D5': 'f',
2651
+ '\uFF46': 'f',
2652
+ '\u1E1F': 'f',
2653
+ '\u0192': 'f',
2654
+ '\uA77C': 'f',
2655
+ '\u24D6': 'g',
2656
+ '\uFF47': 'g',
2657
+ '\u01F5': 'g',
2658
+ '\u011D': 'g',
2659
+ '\u1E21': 'g',
2660
+ '\u011F': 'g',
2661
+ '\u0121': 'g',
2662
+ '\u01E7': 'g',
2663
+ '\u0123': 'g',
2664
+ '\u01E5': 'g',
2665
+ '\u0260': 'g',
2666
+ '\uA7A1': 'g',
2667
+ '\u1D79': 'g',
2668
+ '\uA77F': 'g',
2669
+ '\u24D7': 'h',
2670
+ '\uFF48': 'h',
2671
+ '\u0125': 'h',
2672
+ '\u1E23': 'h',
2673
+ '\u1E27': 'h',
2674
+ '\u021F': 'h',
2675
+ '\u1E25': 'h',
2676
+ '\u1E29': 'h',
2677
+ '\u1E2B': 'h',
2678
+ '\u1E96': 'h',
2679
+ '\u0127': 'h',
2680
+ '\u2C68': 'h',
2681
+ '\u2C76': 'h',
2682
+ '\u0265': 'h',
2683
+ '\u0195': 'hv',
2684
+ '\u24D8': 'i',
2685
+ '\uFF49': 'i',
2686
+ '\u00EC': 'i',
2687
+ '\u00ED': 'i',
2688
+ '\u00EE': 'i',
2689
+ '\u0129': 'i',
2690
+ '\u012B': 'i',
2691
+ '\u012D': 'i',
2692
+ '\u00EF': 'i',
2693
+ '\u1E2F': 'i',
2694
+ '\u1EC9': 'i',
2695
+ '\u01D0': 'i',
2696
+ '\u0209': 'i',
2697
+ '\u020B': 'i',
2698
+ '\u1ECB': 'i',
2699
+ '\u012F': 'i',
2700
+ '\u1E2D': 'i',
2701
+ '\u0268': 'i',
2702
+ '\u0131': 'i',
2703
+ '\u24D9': 'j',
2704
+ '\uFF4A': 'j',
2705
+ '\u0135': 'j',
2706
+ '\u01F0': 'j',
2707
+ '\u0249': 'j',
2708
+ '\u24DA': 'k',
2709
+ '\uFF4B': 'k',
2710
+ '\u1E31': 'k',
2711
+ '\u01E9': 'k',
2712
+ '\u1E33': 'k',
2713
+ '\u0137': 'k',
2714
+ '\u1E35': 'k',
2715
+ '\u0199': 'k',
2716
+ '\u2C6A': 'k',
2717
+ '\uA741': 'k',
2718
+ '\uA743': 'k',
2719
+ '\uA745': 'k',
2720
+ '\uA7A3': 'k',
2721
+ '\u24DB': 'l',
2722
+ '\uFF4C': 'l',
2723
+ '\u0140': 'l',
2724
+ '\u013A': 'l',
2725
+ '\u013E': 'l',
2726
+ '\u1E37': 'l',
2727
+ '\u1E39': 'l',
2728
+ '\u013C': 'l',
2729
+ '\u1E3D': 'l',
2730
+ '\u1E3B': 'l',
2731
+ '\u017F': 'l',
2732
+ '\u0142': 'l',
2733
+ '\u019A': 'l',
2734
+ '\u026B': 'l',
2735
+ '\u2C61': 'l',
2736
+ '\uA749': 'l',
2737
+ '\uA781': 'l',
2738
+ '\uA747': 'l',
2739
+ '\u01C9': 'lj',
2740
+ '\u24DC': 'm',
2741
+ '\uFF4D': 'm',
2742
+ '\u1E3F': 'm',
2743
+ '\u1E41': 'm',
2744
+ '\u1E43': 'm',
2745
+ '\u0271': 'm',
2746
+ '\u026F': 'm',
2747
+ '\u24DD': 'n',
2748
+ '\uFF4E': 'n',
2749
+ '\u01F9': 'n',
2750
+ '\u0144': 'n',
2751
+ '\u00F1': 'n',
2752
+ '\u1E45': 'n',
2753
+ '\u0148': 'n',
2754
+ '\u1E47': 'n',
2755
+ '\u0146': 'n',
2756
+ '\u1E4B': 'n',
2757
+ '\u1E49': 'n',
2758
+ '\u019E': 'n',
2759
+ '\u0272': 'n',
2760
+ '\u0149': 'n',
2761
+ '\uA791': 'n',
2762
+ '\uA7A5': 'n',
2763
+ '\u01CC': 'nj',
2764
+ '\u24DE': 'o',
2765
+ '\uFF4F': 'o',
2766
+ '\u00F2': 'o',
2767
+ '\u00F3': 'o',
2768
+ '\u00F4': 'o',
2769
+ '\u1ED3': 'o',
2770
+ '\u1ED1': 'o',
2771
+ '\u1ED7': 'o',
2772
+ '\u1ED5': 'o',
2773
+ '\u00F5': 'o',
2774
+ '\u1E4D': 'o',
2775
+ '\u022D': 'o',
2776
+ '\u1E4F': 'o',
2777
+ '\u014D': 'o',
2778
+ '\u1E51': 'o',
2779
+ '\u1E53': 'o',
2780
+ '\u014F': 'o',
2781
+ '\u022F': 'o',
2782
+ '\u0231': 'o',
2783
+ '\u00F6': 'o',
2784
+ '\u022B': 'o',
2785
+ '\u1ECF': 'o',
2786
+ '\u0151': 'o',
2787
+ '\u01D2': 'o',
2788
+ '\u020D': 'o',
2789
+ '\u020F': 'o',
2790
+ '\u01A1': 'o',
2791
+ '\u1EDD': 'o',
2792
+ '\u1EDB': 'o',
2793
+ '\u1EE1': 'o',
2794
+ '\u1EDF': 'o',
2795
+ '\u1EE3': 'o',
2796
+ '\u1ECD': 'o',
2797
+ '\u1ED9': 'o',
2798
+ '\u01EB': 'o',
2799
+ '\u01ED': 'o',
2800
+ '\u00F8': 'o',
2801
+ '\u01FF': 'o',
2802
+ '\u0254': 'o',
2803
+ '\uA74B': 'o',
2804
+ '\uA74D': 'o',
2805
+ '\u0275': 'o',
2806
+ '\u01A3': 'oi',
2807
+ '\u0223': 'ou',
2808
+ '\uA74F': 'oo',
2809
+ '\u24DF': 'p',
2810
+ '\uFF50': 'p',
2811
+ '\u1E55': 'p',
2812
+ '\u1E57': 'p',
2813
+ '\u01A5': 'p',
2814
+ '\u1D7D': 'p',
2815
+ '\uA751': 'p',
2816
+ '\uA753': 'p',
2817
+ '\uA755': 'p',
2818
+ '\u24E0': 'q',
2819
+ '\uFF51': 'q',
2820
+ '\u024B': 'q',
2821
+ '\uA757': 'q',
2822
+ '\uA759': 'q',
2823
+ '\u24E1': 'r',
2824
+ '\uFF52': 'r',
2825
+ '\u0155': 'r',
2826
+ '\u1E59': 'r',
2827
+ '\u0159': 'r',
2828
+ '\u0211': 'r',
2829
+ '\u0213': 'r',
2830
+ '\u1E5B': 'r',
2831
+ '\u1E5D': 'r',
2832
+ '\u0157': 'r',
2833
+ '\u1E5F': 'r',
2834
+ '\u024D': 'r',
2835
+ '\u027D': 'r',
2836
+ '\uA75B': 'r',
2837
+ '\uA7A7': 'r',
2838
+ '\uA783': 'r',
2839
+ '\u24E2': 's',
2840
+ '\uFF53': 's',
2841
+ '\u00DF': 's',
2842
+ '\u015B': 's',
2843
+ '\u1E65': 's',
2844
+ '\u015D': 's',
2845
+ '\u1E61': 's',
2846
+ '\u0161': 's',
2847
+ '\u1E67': 's',
2848
+ '\u1E63': 's',
2849
+ '\u1E69': 's',
2850
+ '\u0219': 's',
2851
+ '\u015F': 's',
2852
+ '\u023F': 's',
2853
+ '\uA7A9': 's',
2854
+ '\uA785': 's',
2855
+ '\u1E9B': 's',
2856
+ '\u24E3': 't',
2857
+ '\uFF54': 't',
2858
+ '\u1E6B': 't',
2859
+ '\u1E97': 't',
2860
+ '\u0165': 't',
2861
+ '\u1E6D': 't',
2862
+ '\u021B': 't',
2863
+ '\u0163': 't',
2864
+ '\u1E71': 't',
2865
+ '\u1E6F': 't',
2866
+ '\u0167': 't',
2867
+ '\u01AD': 't',
2868
+ '\u0288': 't',
2869
+ '\u2C66': 't',
2870
+ '\uA787': 't',
2871
+ '\uA729': 'tz',
2872
+ '\u24E4': 'u',
2873
+ '\uFF55': 'u',
2874
+ '\u00F9': 'u',
2875
+ '\u00FA': 'u',
2876
+ '\u00FB': 'u',
2877
+ '\u0169': 'u',
2878
+ '\u1E79': 'u',
2879
+ '\u016B': 'u',
2880
+ '\u1E7B': 'u',
2881
+ '\u016D': 'u',
2882
+ '\u00FC': 'u',
2883
+ '\u01DC': 'u',
2884
+ '\u01D8': 'u',
2885
+ '\u01D6': 'u',
2886
+ '\u01DA': 'u',
2887
+ '\u1EE7': 'u',
2888
+ '\u016F': 'u',
2889
+ '\u0171': 'u',
2890
+ '\u01D4': 'u',
2891
+ '\u0215': 'u',
2892
+ '\u0217': 'u',
2893
+ '\u01B0': 'u',
2894
+ '\u1EEB': 'u',
2895
+ '\u1EE9': 'u',
2896
+ '\u1EEF': 'u',
2897
+ '\u1EED': 'u',
2898
+ '\u1EF1': 'u',
2899
+ '\u1EE5': 'u',
2900
+ '\u1E73': 'u',
2901
+ '\u0173': 'u',
2902
+ '\u1E77': 'u',
2903
+ '\u1E75': 'u',
2904
+ '\u0289': 'u',
2905
+ '\u24E5': 'v',
2906
+ '\uFF56': 'v',
2907
+ '\u1E7D': 'v',
2908
+ '\u1E7F': 'v',
2909
+ '\u028B': 'v',
2910
+ '\uA75F': 'v',
2911
+ '\u028C': 'v',
2912
+ '\uA761': 'vy',
2913
+ '\u24E6': 'w',
2914
+ '\uFF57': 'w',
2915
+ '\u1E81': 'w',
2916
+ '\u1E83': 'w',
2917
+ '\u0175': 'w',
2918
+ '\u1E87': 'w',
2919
+ '\u1E85': 'w',
2920
+ '\u1E98': 'w',
2921
+ '\u1E89': 'w',
2922
+ '\u2C73': 'w',
2923
+ '\u24E7': 'x',
2924
+ '\uFF58': 'x',
2925
+ '\u1E8B': 'x',
2926
+ '\u1E8D': 'x',
2927
+ '\u24E8': 'y',
2928
+ '\uFF59': 'y',
2929
+ '\u1EF3': 'y',
2930
+ '\u00FD': 'y',
2931
+ '\u0177': 'y',
2932
+ '\u1EF9': 'y',
2933
+ '\u0233': 'y',
2934
+ '\u1E8F': 'y',
2935
+ '\u00FF': 'y',
2936
+ '\u1EF7': 'y',
2937
+ '\u1E99': 'y',
2938
+ '\u1EF5': 'y',
2939
+ '\u01B4': 'y',
2940
+ '\u024F': 'y',
2941
+ '\u1EFF': 'y',
2942
+ '\u24E9': 'z',
2943
+ '\uFF5A': 'z',
2944
+ '\u017A': 'z',
2945
+ '\u1E91': 'z',
2946
+ '\u017C': 'z',
2947
+ '\u017E': 'z',
2948
+ '\u1E93': 'z',
2949
+ '\u1E95': 'z',
2950
+ '\u01B6': 'z',
2951
+ '\u0225': 'z',
2952
+ '\u0240': 'z',
2953
+ '\u2C6C': 'z',
2954
+ '\uA763': 'z',
2955
+ '\u0386': '\u0391',
2956
+ '\u0388': '\u0395',
2957
+ '\u0389': '\u0397',
2958
+ '\u038A': '\u0399',
2959
+ '\u03AA': '\u0399',
2960
+ '\u038C': '\u039F',
2961
+ '\u038E': '\u03A5',
2962
+ '\u03AB': '\u03A5',
2963
+ '\u038F': '\u03A9',
2964
+ '\u03AC': '\u03B1',
2965
+ '\u03AD': '\u03B5',
2966
+ '\u03AE': '\u03B7',
2967
+ '\u03AF': '\u03B9',
2968
+ '\u03CA': '\u03B9',
2969
+ '\u0390': '\u03B9',
2970
+ '\u03CC': '\u03BF',
2971
+ '\u03CD': '\u03C5',
2972
+ '\u03CB': '\u03C5',
2973
+ '\u03B0': '\u03C5',
2974
+ '\u03C9': '\u03C9',
2975
+ '\u03C2': '\u03C3'
2976
+ };
2977
+
2978
+ return diacritics;
2979
+ });
2980
+
2981
+ S2.define('select2/data/base',[
2982
+ '../utils'
2983
+ ], function (Utils) {
2984
+ function BaseAdapter ($element, options) {
2985
+ BaseAdapter.__super__.constructor.call(this);
2986
+ }
2987
+
2988
+ Utils.Extend(BaseAdapter, Utils.Observable);
2989
+
2990
+ BaseAdapter.prototype.current = function (callback) {
2991
+ throw new Error('The `current` method must be defined in child classes.');
2992
+ };
2993
+
2994
+ BaseAdapter.prototype.query = function (params, callback) {
2995
+ throw new Error('The `query` method must be defined in child classes.');
2996
+ };
2997
+
2998
+ BaseAdapter.prototype.bind = function (container, $container) {
2999
+ // Can be implemented in subclasses
3000
+ };
3001
+
3002
+ BaseAdapter.prototype.destroy = function () {
3003
+ // Can be implemented in subclasses
3004
+ };
3005
+
3006
+ BaseAdapter.prototype.generateResultId = function (container, data) {
3007
+ var id = container.id + '-result-';
3008
+
3009
+ id += Utils.generateChars(4);
3010
+
3011
+ if (data.id != null) {
3012
+ id += '-' + data.id.toString();
3013
+ } else {
3014
+ id += '-' + Utils.generateChars(4);
3015
+ }
3016
+ return id;
3017
+ };
3018
+
3019
+ return BaseAdapter;
3020
+ });
3021
+
3022
+ S2.define('select2/data/select',[
3023
+ './base',
3024
+ '../utils',
3025
+ 'jquery'
3026
+ ], function (BaseAdapter, Utils, $) {
3027
+ function SelectAdapter ($element, options) {
3028
+ this.$element = $element;
3029
+ this.options = options;
3030
+
3031
+ SelectAdapter.__super__.constructor.call(this);
3032
+ }
3033
+
3034
+ Utils.Extend(SelectAdapter, BaseAdapter);
3035
+
3036
+ SelectAdapter.prototype.current = function (callback) {
3037
+ var data = [];
3038
+ var self = this;
3039
+
3040
+ this.$element.find(':selected').each(function () {
3041
+ var $option = $(this);
3042
+
3043
+ var option = self.item($option);
3044
+
3045
+ data.push(option);
3046
+ });
3047
+
3048
+ callback(data);
3049
+ };
3050
+
3051
+ SelectAdapter.prototype.select = function (data) {
3052
+ var self = this;
3053
+
3054
+ data.selected = true;
3055
+
3056
+ // If data.element is a DOM node, use it instead
3057
+ if ($(data.element).is('option')) {
3058
+ data.element.selected = true;
3059
+
3060
+ this.$element.trigger('change');
3061
+
3062
+ return;
3063
+ }
3064
+
3065
+ if (this.$element.prop('multiple')) {
3066
+ this.current(function (currentData) {
3067
+ var val = [];
3068
+
3069
+ data = [data];
3070
+ data.push.apply(data, currentData);
3071
+
3072
+ for (var d = 0; d < data.length; d++) {
3073
+ var id = data[d].id;
3074
+
3075
+ if ($.inArray(id, val) === -1) {
3076
+ val.push(id);
3077
+ }
3078
+ }
3079
+
3080
+ self.$element.val(val);
3081
+ self.$element.trigger('change');
3082
+ });
3083
+ } else {
3084
+ var val = data.id;
3085
+
3086
+ this.$element.val(val);
3087
+ this.$element.trigger('change');
3088
+ }
3089
+ };
3090
+
3091
+ SelectAdapter.prototype.unselect = function (data) {
3092
+ var self = this;
3093
+
3094
+ if (!this.$element.prop('multiple')) {
3095
+ return;
3096
+ }
3097
+
3098
+ data.selected = false;
3099
+
3100
+ if ($(data.element).is('option')) {
3101
+ data.element.selected = false;
3102
+
3103
+ this.$element.trigger('change');
3104
+
3105
+ return;
3106
+ }
3107
+
3108
+ this.current(function (currentData) {
3109
+ var val = [];
3110
+
3111
+ for (var d = 0; d < currentData.length; d++) {
3112
+ var id = currentData[d].id;
3113
+
3114
+ if (id !== data.id && $.inArray(id, val) === -1) {
3115
+ val.push(id);
3116
+ }
3117
+ }
3118
+
3119
+ self.$element.val(val);
3120
+
3121
+ self.$element.trigger('change');
3122
+ });
3123
+ };
3124
+
3125
+ SelectAdapter.prototype.bind = function (container, $container) {
3126
+ var self = this;
3127
+
3128
+ this.container = container;
3129
+
3130
+ container.on('select', function (params) {
3131
+ self.select(params.data);
3132
+ });
3133
+
3134
+ container.on('unselect', function (params) {
3135
+ self.unselect(params.data);
3136
+ });
3137
+ };
3138
+
3139
+ SelectAdapter.prototype.destroy = function () {
3140
+ // Remove anything added to child elements
3141
+ this.$element.find('*').each(function () {
3142
+ // Remove any custom data set by Select2
3143
+ $.removeData(this, 'data');
3144
+ });
3145
+ };
3146
+
3147
+ SelectAdapter.prototype.query = function (params, callback) {
3148
+ var data = [];
3149
+ var self = this;
3150
+
3151
+ var $options = this.$element.children();
3152
+
3153
+ $options.each(function () {
3154
+ var $option = $(this);
3155
+
3156
+ if (!$option.is('option') && !$option.is('optgroup')) {
3157
+ return;
3158
+ }
3159
+
3160
+ var option = self.item($option);
3161
+
3162
+ var matches = self.matches(params, option);
3163
+
3164
+ if (matches !== null) {
3165
+ data.push(matches);
3166
+ }
3167
+ });
3168
+
3169
+ callback({
3170
+ results: data
3171
+ });
3172
+ };
3173
+
3174
+ SelectAdapter.prototype.addOptions = function ($options) {
3175
+ Utils.appendMany(this.$element, $options);
3176
+ };
3177
+
3178
+ SelectAdapter.prototype.option = function (data) {
3179
+ var option;
3180
+
3181
+ if (data.children) {
3182
+ option = document.createElement('optgroup');
3183
+ option.label = data.text;
3184
+ } else {
3185
+ option = document.createElement('option');
3186
+
3187
+ if (option.textContent !== undefined) {
3188
+ option.textContent = data.text;
3189
+ } else {
3190
+ option.innerText = data.text;
3191
+ }
3192
+ }
3193
+
3194
+ if (data.id) {
3195
+ option.value = data.id;
3196
+ }
3197
+
3198
+ if (data.disabled) {
3199
+ option.disabled = true;
3200
+ }
3201
+
3202
+ if (data.selected) {
3203
+ option.selected = true;
3204
+ }
3205
+
3206
+ if (data.title) {
3207
+ option.title = data.title;
3208
+ }
3209
+
3210
+ var $option = $(option);
3211
+
3212
+ var normalizedData = this._normalizeItem(data);
3213
+ normalizedData.element = option;
3214
+
3215
+ // Override the option's data with the combined data
3216
+ $.data(option, 'data', normalizedData);
3217
+
3218
+ return $option;
3219
+ };
3220
+
3221
+ SelectAdapter.prototype.item = function ($option) {
3222
+ var data = {};
3223
+
3224
+ data = $.data($option[0], 'data');
3225
+
3226
+ if (data != null) {
3227
+ return data;
3228
+ }
3229
+
3230
+ if ($option.is('option')) {
3231
+ data = {
3232
+ id: $option.val(),
3233
+ text: $option.text(),
3234
+ disabled: $option.prop('disabled'),
3235
+ selected: $option.prop('selected'),
3236
+ title: $option.prop('title')
3237
+ };
3238
+ } else if ($option.is('optgroup')) {
3239
+ data = {
3240
+ text: $option.prop('label'),
3241
+ children: [],
3242
+ title: $option.prop('title')
3243
+ };
3244
+
3245
+ var $children = $option.children('option');
3246
+ var children = [];
3247
+
3248
+ for (var c = 0; c < $children.length; c++) {
3249
+ var $child = $($children[c]);
3250
+
3251
+ var child = this.item($child);
3252
+
3253
+ children.push(child);
3254
+ }
3255
+
3256
+ data.children = children;
3257
+ }
3258
+
3259
+ data = this._normalizeItem(data);
3260
+ data.element = $option[0];
3261
+
3262
+ $.data($option[0], 'data', data);
3263
+
3264
+ return data;
3265
+ };
3266
+
3267
+ SelectAdapter.prototype._normalizeItem = function (item) {
3268
+ if (!$.isPlainObject(item)) {
3269
+ item = {
3270
+ id: item,
3271
+ text: item
3272
+ };
3273
+ }
3274
+
3275
+ item = $.extend({}, {
3276
+ text: ''
3277
+ }, item);
3278
+
3279
+ var defaults = {
3280
+ selected: false,
3281
+ disabled: false
3282
+ };
3283
+
3284
+ if (item.id != null) {
3285
+ item.id = item.id.toString();
3286
+ }
3287
+
3288
+ if (item.text != null) {
3289
+ item.text = item.text.toString();
3290
+ }
3291
+
3292
+ if (item._resultId == null && item.id && this.container != null) {
3293
+ item._resultId = this.generateResultId(this.container, item);
3294
+ }
3295
+
3296
+ return $.extend({}, defaults, item);
3297
+ };
3298
+
3299
+ SelectAdapter.prototype.matches = function (params, data) {
3300
+ var matcher = this.options.get('matcher');
3301
+
3302
+ return matcher(params, data);
3303
+ };
3304
+
3305
+ return SelectAdapter;
3306
+ });
3307
+
3308
+ S2.define('select2/data/array',[
3309
+ './select',
3310
+ '../utils',
3311
+ 'jquery'
3312
+ ], function (SelectAdapter, Utils, $) {
3313
+ function ArrayAdapter ($element, options) {
3314
+ var data = options.get('data') || [];
3315
+
3316
+ ArrayAdapter.__super__.constructor.call(this, $element, options);
3317
+
3318
+ this.addOptions(this.convertToOptions(data));
3319
+ }
3320
+
3321
+ Utils.Extend(ArrayAdapter, SelectAdapter);
3322
+
3323
+ ArrayAdapter.prototype.select = function (data) {
3324
+ var $option = this.$element.find('option').filter(function (i, elm) {
3325
+ return elm.value == data.id.toString();
3326
+ });
3327
+
3328
+ if ($option.length === 0) {
3329
+ $option = this.option(data);
3330
+
3331
+ this.addOptions($option);
3332
+ }
3333
+
3334
+ ArrayAdapter.__super__.select.call(this, data);
3335
+ };
3336
+
3337
+ ArrayAdapter.prototype.convertToOptions = function (data) {
3338
+ var self = this;
3339
+
3340
+ var $existing = this.$element.find('option');
3341
+ var existingIds = $existing.map(function () {
3342
+ return self.item($(this)).id;
3343
+ }).get();
3344
+
3345
+ var $options = [];
3346
+
3347
+ // Filter out all items except for the one passed in the argument
3348
+ function onlyItem (item) {
3349
+ return function () {
3350
+ return $(this).val() == item.id;
3351
+ };
3352
+ }
3353
+
3354
+ for (var d = 0; d < data.length; d++) {
3355
+ var item = this._normalizeItem(data[d]);
3356
+
3357
+ // Skip items which were pre-loaded, only merge the data
3358
+ if ($.inArray(item.id, existingIds) >= 0) {
3359
+ var $existingOption = $existing.filter(onlyItem(item));
3360
+
3361
+ var existingData = this.item($existingOption);
3362
+ var newData = $.extend(true, {}, item, existingData);
3363
+
3364
+ var $newOption = this.option(newData);
3365
+
3366
+ $existingOption.replaceWith($newOption);
3367
+
3368
+ continue;
3369
+ }
3370
+
3371
+ var $option = this.option(item);
3372
+
3373
+ if (item.children) {
3374
+ var $children = this.convertToOptions(item.children);
3375
+
3376
+ Utils.appendMany($option, $children);
3377
+ }
3378
+
3379
+ $options.push($option);
3380
+ }
3381
+
3382
+ return $options;
3383
+ };
3384
+
3385
+ return ArrayAdapter;
3386
+ });
3387
+
3388
+ S2.define('select2/data/ajax',[
3389
+ './array',
3390
+ '../utils',
3391
+ 'jquery'
3392
+ ], function (ArrayAdapter, Utils, $) {
3393
+ function AjaxAdapter ($element, options) {
3394
+ this.ajaxOptions = this._applyDefaults(options.get('ajax'));
3395
+
3396
+ if (this.ajaxOptions.processResults != null) {
3397
+ this.processResults = this.ajaxOptions.processResults;
3398
+ }
3399
+
3400
+ AjaxAdapter.__super__.constructor.call(this, $element, options);
3401
+ }
3402
+
3403
+ Utils.Extend(AjaxAdapter, ArrayAdapter);
3404
+
3405
+ AjaxAdapter.prototype._applyDefaults = function (options) {
3406
+ var defaults = {
3407
+ data: function (params) {
3408
+ return $.extend({}, params, {
3409
+ q: params.term
3410
+ });
3411
+ },
3412
+ transport: function (params, success, failure) {
3413
+ var $request = $.ajax(params);
3414
+
3415
+ $request.then(success);
3416
+ $request.fail(failure);
3417
+
3418
+ return $request;
3419
+ }
3420
+ };
3421
+
3422
+ return $.extend({}, defaults, options, true);
3423
+ };
3424
+
3425
+ AjaxAdapter.prototype.processResults = function (results) {
3426
+ return results;
3427
+ };
3428
+
3429
+ AjaxAdapter.prototype.query = function (params, callback) {
3430
+ var matches = [];
3431
+ var self = this;
3432
+
3433
+ if (this._request != null) {
3434
+ // JSONP requests cannot always be aborted
3435
+ if ($.isFunction(this._request.abort)) {
3436
+ this._request.abort();
3437
+ }
3438
+
3439
+ this._request = null;
3440
+ }
3441
+
3442
+ var options = $.extend({
3443
+ type: 'GET'
3444
+ }, this.ajaxOptions);
3445
+
3446
+ if (typeof options.url === 'function') {
3447
+ options.url = options.url.call(this.$element, params);
3448
+ }
3449
+
3450
+ if (typeof options.data === 'function') {
3451
+ options.data = options.data.call(this.$element, params);
3452
+ }
3453
+
3454
+ function request () {
3455
+ var $request = options.transport(options, function (data) {
3456
+ var results = self.processResults(data, params);
3457
+
3458
+ if (self.options.get('debug') && window.console && console.error) {
3459
+ // Check to make sure that the response included a `results` key.
3460
+ if (!results || !results.results || !$.isArray(results.results)) {
3461
+ console.error(
3462
+ 'Select2: The AJAX results did not return an array in the ' +
3463
+ '`results` key of the response.'
3464
+ );
3465
+ }
3466
+ }
3467
+
3468
+ callback(results);
3469
+ }, function () {
3470
+ // Attempt to detect if a request was aborted
3471
+ // Only works if the transport exposes a status property
3472
+ if ($request.status && $request.status === '0') {
3473
+ return;
3474
+ }
3475
+
3476
+ self.trigger('results:message', {
3477
+ message: 'errorLoading'
3478
+ });
3479
+ });
3480
+
3481
+ self._request = $request;
3482
+ }
3483
+
3484
+ if (this.ajaxOptions.delay && params.term != null) {
3485
+ if (this._queryTimeout) {
3486
+ window.clearTimeout(this._queryTimeout);
3487
+ }
3488
+
3489
+ this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
3490
+ } else {
3491
+ request();
3492
+ }
3493
+ };
3494
+
3495
+ return AjaxAdapter;
3496
+ });
3497
+
3498
+ S2.define('select2/data/tags',[
3499
+ 'jquery'
3500
+ ], function ($) {
3501
+ function Tags (decorated, $element, options) {
3502
+ var tags = options.get('tags');
3503
+
3504
+ var createTag = options.get('createTag');
3505
+
3506
+ if (createTag !== undefined) {
3507
+ this.createTag = createTag;
3508
+ }
3509
+
3510
+ var insertTag = options.get('insertTag');
3511
+
3512
+ if (insertTag !== undefined) {
3513
+ this.insertTag = insertTag;
3514
+ }
3515
+
3516
+ decorated.call(this, $element, options);
3517
+
3518
+ if ($.isArray(tags)) {
3519
+ for (var t = 0; t < tags.length; t++) {
3520
+ var tag = tags[t];
3521
+ var item = this._normalizeItem(tag);
3522
+
3523
+ var $option = this.option(item);
3524
+
3525
+ this.$element.append($option);
3526
+ }
3527
+ }
3528
+ }
3529
+
3530
+ Tags.prototype.query = function (decorated, params, callback) {
3531
+ var self = this;
3532
+
3533
+ this._removeOldTags();
3534
+
3535
+ if (params.term == null || params.page != null) {
3536
+ decorated.call(this, params, callback);
3537
+ return;
3538
+ }
3539
+
3540
+ function wrapper (obj, child) {
3541
+ var data = obj.results;
3542
+
3543
+ for (var i = 0; i < data.length; i++) {
3544
+ var option = data[i];
3545
+
3546
+ var checkChildren = (
3547
+ option.children != null &&
3548
+ !wrapper({
3549
+ results: option.children
3550
+ }, true)
3551
+ );
3552
+
3553
+ var checkText = option.text === params.term;
3554
+
3555
+ if (checkText || checkChildren) {
3556
+ if (child) {
3557
+ return false;
3558
+ }
3559
+
3560
+ obj.data = data;
3561
+ callback(obj);
3562
+
3563
+ return;
3564
+ }
3565
+ }
3566
+
3567
+ if (child) {
3568
+ return true;
3569
+ }
3570
+
3571
+ var tag = self.createTag(params);
3572
+
3573
+ if (tag != null) {
3574
+ var $option = self.option(tag);
3575
+ $option.attr('data-select2-tag', true);
3576
+
3577
+ self.addOptions([$option]);
3578
+
3579
+ self.insertTag(data, tag);
3580
+ }
3581
+
3582
+ obj.results = data;
3583
+
3584
+ callback(obj);
3585
+ }
3586
+
3587
+ decorated.call(this, params, wrapper);
3588
+ };
3589
+
3590
+ Tags.prototype.createTag = function (decorated, params) {
3591
+ var term = $.trim(params.term);
3592
+
3593
+ if (term === '') {
3594
+ return null;
3595
+ }
3596
+
3597
+ return {
3598
+ id: term,
3599
+ text: term
3600
+ };
3601
+ };
3602
+
3603
+ Tags.prototype.insertTag = function (_, data, tag) {
3604
+ data.unshift(tag);
3605
+ };
3606
+
3607
+ Tags.prototype._removeOldTags = function (_) {
3608
+ var tag = this._lastTag;
3609
+
3610
+ var $options = this.$element.find('option[data-select2-tag]');
3611
+
3612
+ $options.each(function () {
3613
+ if (this.selected) {
3614
+ return;
3615
+ }
3616
+
3617
+ $(this).remove();
3618
+ });
3619
+ };
3620
+
3621
+ return Tags;
3622
+ });
3623
+
3624
+ S2.define('select2/data/tokenizer',[
3625
+ 'jquery'
3626
+ ], function ($) {
3627
+ function Tokenizer (decorated, $element, options) {
3628
+ var tokenizer = options.get('tokenizer');
3629
+
3630
+ if (tokenizer !== undefined) {
3631
+ this.tokenizer = tokenizer;
3632
+ }
3633
+
3634
+ decorated.call(this, $element, options);
3635
+ }
3636
+
3637
+ Tokenizer.prototype.bind = function (decorated, container, $container) {
3638
+ decorated.call(this, container, $container);
3639
+
3640
+ this.$search = container.dropdown.$search || container.selection.$search ||
3641
+ $container.find('.select2-search__field');
3642
+ };
3643
+
3644
+ Tokenizer.prototype.query = function (decorated, params, callback) {
3645
+ var self = this;
3646
+
3647
+ function createAndSelect (data) {
3648
+ // Normalize the data object so we can use it for checks
3649
+ var item = self._normalizeItem(data);
3650
+
3651
+ // Check if the data object already exists as a tag
3652
+ // Select it if it doesn't
3653
+ var $existingOptions = self.$element.find('option').filter(function () {
3654
+ return $(this).val() === item.id;
3655
+ });
3656
+
3657
+ // If an existing option wasn't found for it, create the option
3658
+ if (!$existingOptions.length) {
3659
+ var $option = self.option(item);
3660
+ $option.attr('data-select2-tag', true);
3661
+
3662
+ self._removeOldTags();
3663
+ self.addOptions([$option]);
3664
+ }
3665
+
3666
+ // Select the item, now that we know there is an option for it
3667
+ select(item);
3668
+ }
3669
+
3670
+ function select (data) {
3671
+ self.trigger('select', {
3672
+ data: data
3673
+ });
3674
+ }
3675
+
3676
+ params.term = params.term || '';
3677
+
3678
+ var tokenData = this.tokenizer(params, this.options, createAndSelect);
3679
+
3680
+ if (tokenData.term !== params.term) {
3681
+ // Replace the search term if we have the search box
3682
+ if (this.$search.length) {
3683
+ this.$search.val(tokenData.term);
3684
+ this.$search.focus();
3685
+ }
3686
+
3687
+ params.term = tokenData.term;
3688
+ }
3689
+
3690
+ decorated.call(this, params, callback);
3691
+ };
3692
+
3693
+ Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
3694
+ var separators = options.get('tokenSeparators') || [];
3695
+ var term = params.term;
3696
+ var i = 0;
3697
+
3698
+ var createTag = this.createTag || function (params) {
3699
+ return {
3700
+ id: params.term,
3701
+ text: params.term
3702
+ };
3703
+ };
3704
+
3705
+ while (i < term.length) {
3706
+ var termChar = term[i];
3707
+
3708
+ if ($.inArray(termChar, separators) === -1) {
3709
+ i++;
3710
+
3711
+ continue;
3712
+ }
3713
+
3714
+ var part = term.substr(0, i);
3715
+ var partParams = $.extend({}, params, {
3716
+ term: part
3717
+ });
3718
+
3719
+ var data = createTag(partParams);
3720
+
3721
+ if (data == null) {
3722
+ i++;
3723
+ continue;
3724
+ }
3725
+
3726
+ callback(data);
3727
+
3728
+ // Reset the term to not include the tokenized portion
3729
+ term = term.substr(i + 1) || '';
3730
+ i = 0;
3731
+ }
3732
+
3733
+ return {
3734
+ term: term
3735
+ };
3736
+ };
3737
+
3738
+ return Tokenizer;
3739
+ });
3740
+
3741
+ S2.define('select2/data/minimumInputLength',[
3742
+
3743
+ ], function () {
3744
+ function MinimumInputLength (decorated, $e, options) {
3745
+ this.minimumInputLength = options.get('minimumInputLength');
3746
+
3747
+ decorated.call(this, $e, options);
3748
+ }
3749
+
3750
+ MinimumInputLength.prototype.query = function (decorated, params, callback) {
3751
+ params.term = params.term || '';
3752
+
3753
+ if (params.term.length < this.minimumInputLength) {
3754
+ this.trigger('results:message', {
3755
+ message: 'inputTooShort',
3756
+ args: {
3757
+ minimum: this.minimumInputLength,
3758
+ input: params.term,
3759
+ params: params
3760
+ }
3761
+ });
3762
+
3763
+ return;
3764
+ }
3765
+
3766
+ decorated.call(this, params, callback);
3767
+ };
3768
+
3769
+ return MinimumInputLength;
3770
+ });
3771
+
3772
+ S2.define('select2/data/maximumInputLength',[
3773
+
3774
+ ], function () {
3775
+ function MaximumInputLength (decorated, $e, options) {
3776
+ this.maximumInputLength = options.get('maximumInputLength');
3777
+
3778
+ decorated.call(this, $e, options);
3779
+ }
3780
+
3781
+ MaximumInputLength.prototype.query = function (decorated, params, callback) {
3782
+ params.term = params.term || '';
3783
+
3784
+ if (this.maximumInputLength > 0 &&
3785
+ params.term.length > this.maximumInputLength) {
3786
+ this.trigger('results:message', {
3787
+ message: 'inputTooLong',
3788
+ args: {
3789
+ maximum: this.maximumInputLength,
3790
+ input: params.term,
3791
+ params: params
3792
+ }
3793
+ });
3794
+
3795
+ return;
3796
+ }
3797
+
3798
+ decorated.call(this, params, callback);
3799
+ };
3800
+
3801
+ return MaximumInputLength;
3802
+ });
3803
+
3804
+ S2.define('select2/data/maximumSelectionLength',[
3805
+
3806
+ ], function (){
3807
+ function MaximumSelectionLength (decorated, $e, options) {
3808
+ this.maximumSelectionLength = options.get('maximumSelectionLength');
3809
+
3810
+ decorated.call(this, $e, options);
3811
+ }
3812
+
3813
+ MaximumSelectionLength.prototype.query =
3814
+ function (decorated, params, callback) {
3815
+ var self = this;
3816
+
3817
+ this.current(function (currentData) {
3818
+ var count = currentData != null ? currentData.length : 0;
3819
+ if (self.maximumSelectionLength > 0 &&
3820
+ count >= self.maximumSelectionLength) {
3821
+ self.trigger('results:message', {
3822
+ message: 'maximumSelected',
3823
+ args: {
3824
+ maximum: self.maximumSelectionLength
3825
+ }
3826
+ });
3827
+ return;
3828
+ }
3829
+ decorated.call(self, params, callback);
3830
+ });
3831
+ };
3832
+
3833
+ return MaximumSelectionLength;
3834
+ });
3835
+
3836
+ S2.define('select2/dropdown',[
3837
+ 'jquery',
3838
+ './utils'
3839
+ ], function ($, Utils) {
3840
+ function Dropdown ($element, options) {
3841
+ this.$element = $element;
3842
+ this.options = options;
3843
+
3844
+ Dropdown.__super__.constructor.call(this);
3845
+ }
3846
+
3847
+ Utils.Extend(Dropdown, Utils.Observable);
3848
+
3849
+ Dropdown.prototype.render = function () {
3850
+ var $dropdown = $(
3851
+ '<span class="select2-dropdown">' +
3852
+ '<span class="select2-results"></span>' +
3853
+ '</span>'
3854
+ );
3855
+
3856
+ $dropdown.attr('dir', this.options.get('dir'));
3857
+
3858
+ this.$dropdown = $dropdown;
3859
+
3860
+ return $dropdown;
3861
+ };
3862
+
3863
+ Dropdown.prototype.bind = function () {
3864
+ // Should be implemented in subclasses
3865
+ };
3866
+
3867
+ Dropdown.prototype.position = function ($dropdown, $container) {
3868
+ // Should be implmented in subclasses
3869
+ };
3870
+
3871
+ Dropdown.prototype.destroy = function () {
3872
+ // Remove the dropdown from the DOM
3873
+ this.$dropdown.remove();
3874
+ };
3875
+
3876
+ return Dropdown;
3877
+ });
3878
+
3879
+ S2.define('select2/dropdown/search',[
3880
+ 'jquery',
3881
+ '../utils'
3882
+ ], function ($, Utils) {
3883
+ function Search () { }
3884
+
3885
+ Search.prototype.render = function (decorated) {
3886
+ var $rendered = decorated.call(this);
3887
+
3888
+ var $search = $(
3889
+ '<span class="select2-search select2-search--dropdown">' +
3890
+ '<input class="select2-search__field" type="search" tabindex="-1"' +
3891
+ ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
3892
+ ' spellcheck="false" role="textbox" />' +
3893
+ '</span>'
3894
+ );
3895
+
3896
+ this.$searchContainer = $search;
3897
+ this.$search = $search.find('input');
3898
+
3899
+ $rendered.prepend($search);
3900
+
3901
+ return $rendered;
3902
+ };
3903
+
3904
+ Search.prototype.bind = function (decorated, container, $container) {
3905
+ var self = this;
3906
+
3907
+ decorated.call(this, container, $container);
3908
+
3909
+ this.$search.on('keydown', function (evt) {
3910
+ self.trigger('keypress', evt);
3911
+
3912
+ self._keyUpPrevented = evt.isDefaultPrevented();
3913
+ });
3914
+
3915
+ // Workaround for browsers which do not support the `input` event
3916
+ // This will prevent double-triggering of events for browsers which support
3917
+ // both the `keyup` and `input` events.
3918
+ this.$search.on('input', function (evt) {
3919
+ // Unbind the duplicated `keyup` event
3920
+ $(this).off('keyup');
3921
+ });
3922
+
3923
+ this.$search.on('keyup input', function (evt) {
3924
+ self.handleSearch(evt);
3925
+ });
3926
+
3927
+ container.on('open', function () {
3928
+ self.$search.attr('tabindex', 0);
3929
+
3930
+ self.$search.focus();
3931
+
3932
+ window.setTimeout(function () {
3933
+ self.$search.focus();
3934
+ }, 0);
3935
+ });
3936
+
3937
+ container.on('close', function () {
3938
+ self.$search.attr('tabindex', -1);
3939
+
3940
+ self.$search.val('');
3941
+ });
3942
+
3943
+ container.on('focus', function () {
3944
+ if (container.isOpen()) {
3945
+ self.$search.focus();
3946
+ }
3947
+ });
3948
+
3949
+ container.on('results:all', function (params) {
3950
+ if (params.query.term == null || params.query.term === '') {
3951
+ var showSearch = self.showSearch(params);
3952
+
3953
+ if (showSearch) {
3954
+ self.$searchContainer.removeClass('select2-search--hide');
3955
+ } else {
3956
+ self.$searchContainer.addClass('select2-search--hide');
3957
+ }
3958
+ }
3959
+ });
3960
+ };
3961
+
3962
+ Search.prototype.handleSearch = function (evt) {
3963
+ if (!this._keyUpPrevented) {
3964
+ var input = this.$search.val();
3965
+
3966
+ this.trigger('query', {
3967
+ term: input
3968
+ });
3969
+ }
3970
+
3971
+ this._keyUpPrevented = false;
3972
+ };
3973
+
3974
+ Search.prototype.showSearch = function (_, params) {
3975
+ return true;
3976
+ };
3977
+
3978
+ return Search;
3979
+ });
3980
+
3981
+ S2.define('select2/dropdown/hidePlaceholder',[
3982
+
3983
+ ], function () {
3984
+ function HidePlaceholder (decorated, $element, options, dataAdapter) {
3985
+ this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
3986
+
3987
+ decorated.call(this, $element, options, dataAdapter);
3988
+ }
3989
+
3990
+ HidePlaceholder.prototype.append = function (decorated, data) {
3991
+ data.results = this.removePlaceholder(data.results);
3992
+
3993
+ decorated.call(this, data);
3994
+ };
3995
+
3996
+ HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
3997
+ if (typeof placeholder === 'string') {
3998
+ placeholder = {
3999
+ id: '',
4000
+ text: placeholder
4001
+ };
4002
+ }
4003
+
4004
+ return placeholder;
4005
+ };
4006
+
4007
+ HidePlaceholder.prototype.removePlaceholder = function (_, data) {
4008
+ var modifiedData = data.slice(0);
4009
+
4010
+ for (var d = data.length - 1; d >= 0; d--) {
4011
+ var item = data[d];
4012
+
4013
+ if (this.placeholder.id === item.id) {
4014
+ modifiedData.splice(d, 1);
4015
+ }
4016
+ }
4017
+
4018
+ return modifiedData;
4019
+ };
4020
+
4021
+ return HidePlaceholder;
4022
+ });
4023
+
4024
+ S2.define('select2/dropdown/infiniteScroll',[
4025
+ 'jquery'
4026
+ ], function ($) {
4027
+ function InfiniteScroll (decorated, $element, options, dataAdapter) {
4028
+ this.lastParams = {};
4029
+
4030
+ decorated.call(this, $element, options, dataAdapter);
4031
+
4032
+ this.$loadingMore = this.createLoadingMore();
4033
+ this.loading = false;
4034
+ }
4035
+
4036
+ InfiniteScroll.prototype.append = function (decorated, data) {
4037
+ this.$loadingMore.remove();
4038
+ this.loading = false;
4039
+
4040
+ decorated.call(this, data);
4041
+
4042
+ if (this.showLoadingMore(data)) {
4043
+ this.$results.append(this.$loadingMore);
4044
+ }
4045
+ };
4046
+
4047
+ InfiniteScroll.prototype.bind = function (decorated, container, $container) {
4048
+ var self = this;
4049
+
4050
+ decorated.call(this, container, $container);
4051
+
4052
+ container.on('query', function (params) {
4053
+ self.lastParams = params;
4054
+ self.loading = true;
4055
+ });
4056
+
4057
+ container.on('query:append', function (params) {
4058
+ self.lastParams = params;
4059
+ self.loading = true;
4060
+ });
4061
+
4062
+ this.$results.on('scroll', function () {
4063
+ var isLoadMoreVisible = $.contains(
4064
+ document.documentElement,
4065
+ self.$loadingMore[0]
4066
+ );
4067
+
4068
+ if (self.loading || !isLoadMoreVisible) {
4069
+ return;
4070
+ }
4071
+
4072
+ var currentOffset = self.$results.offset().top +
4073
+ self.$results.outerHeight(false);
4074
+ var loadingMoreOffset = self.$loadingMore.offset().top +
4075
+ self.$loadingMore.outerHeight(false);
4076
+
4077
+ if (currentOffset + 50 >= loadingMoreOffset) {
4078
+ self.loadMore();
4079
+ }
4080
+ });
4081
+ };
4082
+
4083
+ InfiniteScroll.prototype.loadMore = function () {
4084
+ this.loading = true;
4085
+
4086
+ var params = $.extend({}, {page: 1}, this.lastParams);
4087
+
4088
+ params.page++;
4089
+
4090
+ this.trigger('query:append', params);
4091
+ };
4092
+
4093
+ InfiniteScroll.prototype.showLoadingMore = function (_, data) {
4094
+ return data.pagination && data.pagination.more;
4095
+ };
4096
+
4097
+ InfiniteScroll.prototype.createLoadingMore = function () {
4098
+ var $option = $(
4099
+ '<li ' +
4100
+ 'class="select2-results__option select2-results__option--load-more"' +
4101
+ 'role="treeitem" aria-disabled="true"></li>'
4102
+ );
4103
+
4104
+ var message = this.options.get('translations').get('loadingMore');
4105
+
4106
+ $option.html(message(this.lastParams));
4107
+
4108
+ return $option;
4109
+ };
4110
+
4111
+ return InfiniteScroll;
4112
+ });
4113
+
4114
+ S2.define('select2/dropdown/attachBody',[
4115
+ 'jquery',
4116
+ '../utils'
4117
+ ], function ($, Utils) {
4118
+ function AttachBody (decorated, $element, options) {
4119
+ this.$dropdownParent = options.get('dropdownParent') || $(document.body);
4120
+
4121
+ decorated.call(this, $element, options);
4122
+ }
4123
+
4124
+ AttachBody.prototype.bind = function (decorated, container, $container) {
4125
+ var self = this;
4126
+
4127
+ var setupResultsEvents = false;
4128
+
4129
+ decorated.call(this, container, $container);
4130
+
4131
+ container.on('open', function () {
4132
+ self._showDropdown();
4133
+ self._attachPositioningHandler(container);
4134
+
4135
+ if (!setupResultsEvents) {
4136
+ setupResultsEvents = true;
4137
+
4138
+ container.on('results:all', function () {
4139
+ self._positionDropdown();
4140
+ self._resizeDropdown();
4141
+ });
4142
+
4143
+ container.on('results:append', function () {
4144
+ self._positionDropdown();
4145
+ self._resizeDropdown();
4146
+ });
4147
+ }
4148
+ });
4149
+
4150
+ container.on('close', function () {
4151
+ self._hideDropdown();
4152
+ self._detachPositioningHandler(container);
4153
+ });
4154
+
4155
+ this.$dropdownContainer.on('mousedown', function (evt) {
4156
+ evt.stopPropagation();
4157
+ });
4158
+ };
4159
+
4160
+ AttachBody.prototype.destroy = function (decorated) {
4161
+ decorated.call(this);
4162
+
4163
+ this.$dropdownContainer.remove();
4164
+ };
4165
+
4166
+ AttachBody.prototype.position = function (decorated, $dropdown, $container) {
4167
+ // Clone all of the container classes
4168
+ $dropdown.attr('class', $container.attr('class'));
4169
+
4170
+ $dropdown.removeClass('select2');
4171
+ $dropdown.addClass('select2-container--open');
4172
+
4173
+ $dropdown.css({
4174
+ position: 'absolute',
4175
+ top: -999999
4176
+ });
4177
+
4178
+ this.$container = $container;
4179
+ };
4180
+
4181
+ AttachBody.prototype.render = function (decorated) {
4182
+ var $container = $('<span></span>');
4183
+
4184
+ var $dropdown = decorated.call(this);
4185
+ $container.append($dropdown);
4186
+
4187
+ this.$dropdownContainer = $container;
4188
+
4189
+ return $container;
4190
+ };
4191
+
4192
+ AttachBody.prototype._hideDropdown = function (decorated) {
4193
+ this.$dropdownContainer.detach();
4194
+ };
4195
+
4196
+ AttachBody.prototype._attachPositioningHandler =
4197
+ function (decorated, container) {
4198
+ var self = this;
4199
+
4200
+ var scrollEvent = 'scroll.select2.' + container.id;
4201
+ var resizeEvent = 'resize.select2.' + container.id;
4202
+ var orientationEvent = 'orientationchange.select2.' + container.id;
4203
+
4204
+ var $watchers = this.$container.parents().filter(Utils.hasScroll);
4205
+ $watchers.each(function () {
4206
+ $(this).data('select2-scroll-position', {
4207
+ x: $(this).scrollLeft(),
4208
+ y: $(this).scrollTop()
4209
+ });
4210
+ });
4211
+
4212
+ $watchers.on(scrollEvent, function (ev) {
4213
+ var position = $(this).data('select2-scroll-position');
4214
+ $(this).scrollTop(position.y);
4215
+ });
4216
+
4217
+ $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
4218
+ function (e) {
4219
+ self._positionDropdown();
4220
+ self._resizeDropdown();
4221
+ });
4222
+ };
4223
+
4224
+ AttachBody.prototype._detachPositioningHandler =
4225
+ function (decorated, container) {
4226
+ var scrollEvent = 'scroll.select2.' + container.id;
4227
+ var resizeEvent = 'resize.select2.' + container.id;
4228
+ var orientationEvent = 'orientationchange.select2.' + container.id;
4229
+
4230
+ var $watchers = this.$container.parents().filter(Utils.hasScroll);
4231
+ $watchers.off(scrollEvent);
4232
+
4233
+ $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
4234
+ };
4235
+
4236
+ AttachBody.prototype._positionDropdown = function () {
4237
+ var $window = $(window);
4238
+
4239
+ var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
4240
+ var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
4241
+
4242
+ var newDirection = null;
4243
+
4244
+ var offset = this.$container.offset();
4245
+
4246
+ offset.bottom = offset.top + this.$container.outerHeight(false);
4247
+
4248
+ var container = {
4249
+ height: this.$container.outerHeight(false)
4250
+ };
4251
+
4252
+ container.top = offset.top;
4253
+ container.bottom = offset.top + container.height;
4254
+
4255
+ var dropdown = {
4256
+ height: this.$dropdown.outerHeight(false)
4257
+ };
4258
+
4259
+ var viewport = {
4260
+ top: $window.scrollTop(),
4261
+ bottom: $window.scrollTop() + $window.height()
4262
+ };
4263
+
4264
+ var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
4265
+ var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
4266
+
4267
+ var css = {
4268
+ left: offset.left,
4269
+ top: container.bottom
4270
+ };
4271
+
4272
+ // Determine what the parent element is to use for calciulating the offset
4273
+ var $offsetParent = this.$dropdownParent;
4274
+
4275
+ // For statically positoned elements, we need to get the element
4276
+ // that is determining the offset
4277
+ if ($offsetParent.css('position') === 'static') {
4278
+ $offsetParent = $offsetParent.offsetParent();
4279
+ }
4280
+
4281
+ var parentOffset = $offsetParent.offset();
4282
+
4283
+ css.top -= parentOffset.top;
4284
+ css.left -= parentOffset.left;
4285
+
4286
+ if (!isCurrentlyAbove && !isCurrentlyBelow) {
4287
+ newDirection = 'below';
4288
+ }
4289
+
4290
+ if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
4291
+ newDirection = 'above';
4292
+ } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
4293
+ newDirection = 'below';
4294
+ }
4295
+
4296
+ if (newDirection == 'above' ||
4297
+ (isCurrentlyAbove && newDirection !== 'below')) {
4298
+ css.top = container.top - parentOffset.top - dropdown.height;
4299
+ }
4300
+
4301
+ if (newDirection != null) {
4302
+ this.$dropdown
4303
+ .removeClass('select2-dropdown--below select2-dropdown--above')
4304
+ .addClass('select2-dropdown--' + newDirection);
4305
+ this.$container
4306
+ .removeClass('select2-container--below select2-container--above')
4307
+ .addClass('select2-container--' + newDirection);
4308
+ }
4309
+
4310
+ this.$dropdownContainer.css(css);
4311
+ };
4312
+
4313
+ AttachBody.prototype._resizeDropdown = function () {
4314
+ var css = {
4315
+ width: this.$container.outerWidth(false) + 'px'
4316
+ };
4317
+
4318
+ if (this.options.get('dropdownAutoWidth')) {
4319
+ css.minWidth = css.width;
4320
+ css.position = 'relative';
4321
+ css.width = 'auto';
4322
+ }
4323
+
4324
+ this.$dropdown.css(css);
4325
+ };
4326
+
4327
+ AttachBody.prototype._showDropdown = function (decorated) {
4328
+ this.$dropdownContainer.appendTo(this.$dropdownParent);
4329
+
4330
+ this._positionDropdown();
4331
+ this._resizeDropdown();
4332
+ };
4333
+
4334
+ return AttachBody;
4335
+ });
4336
+
4337
+ S2.define('select2/dropdown/minimumResultsForSearch',[
4338
+
4339
+ ], function () {
4340
+ function countResults (data) {
4341
+ var count = 0;
4342
+
4343
+ for (var d = 0; d < data.length; d++) {
4344
+ var item = data[d];
4345
+
4346
+ if (item.children) {
4347
+ count += countResults(item.children);
4348
+ } else {
4349
+ count++;
4350
+ }
4351
+ }
4352
+
4353
+ return count;
4354
+ }
4355
+
4356
+ function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
4357
+ this.minimumResultsForSearch = options.get('minimumResultsForSearch');
4358
+
4359
+ if (this.minimumResultsForSearch < 0) {
4360
+ this.minimumResultsForSearch = Infinity;
4361
+ }
4362
+
4363
+ decorated.call(this, $element, options, dataAdapter);
4364
+ }
4365
+
4366
+ MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
4367
+ if (countResults(params.data.results) < this.minimumResultsForSearch) {
4368
+ return false;
4369
+ }
4370
+
4371
+ return decorated.call(this, params);
4372
+ };
4373
+
4374
+ return MinimumResultsForSearch;
4375
+ });
4376
+
4377
+ S2.define('select2/dropdown/selectOnClose',[
4378
+
4379
+ ], function () {
4380
+ function SelectOnClose () { }
4381
+
4382
+ SelectOnClose.prototype.bind = function (decorated, container, $container) {
4383
+ var self = this;
4384
+
4385
+ decorated.call(this, container, $container);
4386
+
4387
+ container.on('close', function (params) {
4388
+ self._handleSelectOnClose(params);
4389
+ });
4390
+ };
4391
+
4392
+ SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
4393
+ if (params && params.originalSelect2Event != null) {
4394
+ var event = params.originalSelect2Event;
4395
+
4396
+ // Don't select an item if the close event was triggered from a select or
4397
+ // unselect event
4398
+ if (event._type === 'select' || event._type === 'unselect') {
4399
+ return;
4400
+ }
4401
+ }
4402
+
4403
+ var $highlightedResults = this.getHighlightedResults();
4404
+
4405
+ // Only select highlighted results
4406
+ if ($highlightedResults.length < 1) {
4407
+ return;
4408
+ }
4409
+
4410
+ var data = $highlightedResults.data('data');
4411
+
4412
+ // Don't re-select already selected resulte
4413
+ if (
4414
+ (data.element != null && data.element.selected) ||
4415
+ (data.element == null && data.selected)
4416
+ ) {
4417
+ return;
4418
+ }
4419
+
4420
+ this.trigger('select', {
4421
+ data: data
4422
+ });
4423
+ };
4424
+
4425
+ return SelectOnClose;
4426
+ });
4427
+
4428
+ S2.define('select2/dropdown/closeOnSelect',[
4429
+
4430
+ ], function () {
4431
+ function CloseOnSelect () { }
4432
+
4433
+ CloseOnSelect.prototype.bind = function (decorated, container, $container) {
4434
+ var self = this;
4435
+
4436
+ decorated.call(this, container, $container);
4437
+
4438
+ container.on('select', function (evt) {
4439
+ self._selectTriggered(evt);
4440
+ });
4441
+
4442
+ container.on('unselect', function (evt) {
4443
+ self._selectTriggered(evt);
4444
+ });
4445
+ };
4446
+
4447
+ CloseOnSelect.prototype._selectTriggered = function (_, evt) {
4448
+ var originalEvent = evt.originalEvent;
4449
+
4450
+ // Don't close if the control key is being held
4451
+ if (originalEvent && originalEvent.ctrlKey) {
4452
+ return;
4453
+ }
4454
+
4455
+ this.trigger('close', {
4456
+ originalEvent: originalEvent,
4457
+ originalSelect2Event: evt
4458
+ });
4459
+ };
4460
+
4461
+ return CloseOnSelect;
4462
+ });
4463
+
4464
+ S2.define('select2/i18n/en',[],function () {
4465
+ // English
4466
+ return {
4467
+ errorLoading: function () {
4468
+ return 'The results could not be loaded.';
4469
+ },
4470
+ inputTooLong: function (args) {
4471
+ var overChars = args.input.length - args.maximum;
4472
+
4473
+ var message = 'Please delete ' + overChars + ' character';
4474
+
4475
+ if (overChars != 1) {
4476
+ message += 's';
4477
+ }
4478
+
4479
+ return message;
4480
+ },
4481
+ inputTooShort: function (args) {
4482
+ var remainingChars = args.minimum - args.input.length;
4483
+
4484
+ var message = 'Please enter ' + remainingChars + ' or more characters';
4485
+
4486
+ return message;
4487
+ },
4488
+ loadingMore: function () {
4489
+ return 'Loading more results…';
4490
+ },
4491
+ maximumSelected: function (args) {
4492
+ var message = 'You can only select ' + args.maximum + ' item';
4493
+
4494
+ if (args.maximum != 1) {
4495
+ message += 's';
4496
+ }
4497
+
4498
+ return message;
4499
+ },
4500
+ noResults: function () {
4501
+ return 'No results found';
4502
+ },
4503
+ searching: function () {
4504
+ return 'Searching…';
4505
+ }
4506
+ };
4507
+ });
4508
+
4509
+ S2.define('select2/defaults',[
4510
+ 'jquery',
4511
+ 'require',
4512
+
4513
+ './results',
4514
+
4515
+ './selection/single',
4516
+ './selection/multiple',
4517
+ './selection/placeholder',
4518
+ './selection/allowClear',
4519
+ './selection/search',
4520
+ './selection/eventRelay',
4521
+
4522
+ './utils',
4523
+ './translation',
4524
+ './diacritics',
4525
+
4526
+ './data/select',
4527
+ './data/array',
4528
+ './data/ajax',
4529
+ './data/tags',
4530
+ './data/tokenizer',
4531
+ './data/minimumInputLength',
4532
+ './data/maximumInputLength',
4533
+ './data/maximumSelectionLength',
4534
+
4535
+ './dropdown',
4536
+ './dropdown/search',
4537
+ './dropdown/hidePlaceholder',
4538
+ './dropdown/infiniteScroll',
4539
+ './dropdown/attachBody',
4540
+ './dropdown/minimumResultsForSearch',
4541
+ './dropdown/selectOnClose',
4542
+ './dropdown/closeOnSelect',
4543
+
4544
+ './i18n/en'
4545
+ ], function ($, require,
4546
+
4547
+ ResultsList,
4548
+
4549
+ SingleSelection, MultipleSelection, Placeholder, AllowClear,
4550
+ SelectionSearch, EventRelay,
4551
+
4552
+ Utils, Translation, DIACRITICS,
4553
+
4554
+ SelectData, ArrayData, AjaxData, Tags, Tokenizer,
4555
+ MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
4556
+
4557
+ Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
4558
+ AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
4559
+
4560
+ EnglishTranslation) {
4561
+ function Defaults () {
4562
+ this.reset();
4563
+ }
4564
+
4565
+ Defaults.prototype.apply = function (options) {
4566
+ options = $.extend(true, {}, this.defaults, options);
4567
+
4568
+ if (options.dataAdapter == null) {
4569
+ if (options.ajax != null) {
4570
+ options.dataAdapter = AjaxData;
4571
+ } else if (options.data != null) {
4572
+ options.dataAdapter = ArrayData;
4573
+ } else {
4574
+ options.dataAdapter = SelectData;
4575
+ }
4576
+
4577
+ if (options.minimumInputLength > 0) {
4578
+ options.dataAdapter = Utils.Decorate(
4579
+ options.dataAdapter,
4580
+ MinimumInputLength
4581
+ );
4582
+ }
4583
+
4584
+ if (options.maximumInputLength > 0) {
4585
+ options.dataAdapter = Utils.Decorate(
4586
+ options.dataAdapter,
4587
+ MaximumInputLength
4588
+ );
4589
+ }
4590
+
4591
+ if (options.maximumSelectionLength > 0) {
4592
+ options.dataAdapter = Utils.Decorate(
4593
+ options.dataAdapter,
4594
+ MaximumSelectionLength
4595
+ );
4596
+ }
4597
+
4598
+ if (options.tags) {
4599
+ options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
4600
+ }
4601
+
4602
+ if (options.tokenSeparators != null || options.tokenizer != null) {
4603
+ options.dataAdapter = Utils.Decorate(
4604
+ options.dataAdapter,
4605
+ Tokenizer
4606
+ );
4607
+ }
4608
+
4609
+ if (options.query != null) {
4610
+ var Query = require(options.amdBase + 'compat/query');
4611
+
4612
+ options.dataAdapter = Utils.Decorate(
4613
+ options.dataAdapter,
4614
+ Query
4615
+ );
4616
+ }
4617
+
4618
+ if (options.initSelection != null) {
4619
+ var InitSelection = require(options.amdBase + 'compat/initSelection');
4620
+
4621
+ options.dataAdapter = Utils.Decorate(
4622
+ options.dataAdapter,
4623
+ InitSelection
4624
+ );
4625
+ }
4626
+ }
4627
+
4628
+ if (options.resultsAdapter == null) {
4629
+ options.resultsAdapter = ResultsList;
4630
+
4631
+ if (options.ajax != null) {
4632
+ options.resultsAdapter = Utils.Decorate(
4633
+ options.resultsAdapter,
4634
+ InfiniteScroll
4635
+ );
4636
+ }
4637
+
4638
+ if (options.placeholder != null) {
4639
+ options.resultsAdapter = Utils.Decorate(
4640
+ options.resultsAdapter,
4641
+ HidePlaceholder
4642
+ );
4643
+ }
4644
+
4645
+ if (options.selectOnClose) {
4646
+ options.resultsAdapter = Utils.Decorate(
4647
+ options.resultsAdapter,
4648
+ SelectOnClose
4649
+ );
4650
+ }
4651
+ }
4652
+
4653
+ if (options.dropdownAdapter == null) {
4654
+ if (options.multiple) {
4655
+ options.dropdownAdapter = Dropdown;
4656
+ } else {
4657
+ var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
4658
+
4659
+ options.dropdownAdapter = SearchableDropdown;
4660
+ }
4661
+
4662
+ if (options.minimumResultsForSearch !== 0) {
4663
+ options.dropdownAdapter = Utils.Decorate(
4664
+ options.dropdownAdapter,
4665
+ MinimumResultsForSearch
4666
+ );
4667
+ }
4668
+
4669
+ if (options.closeOnSelect) {
4670
+ options.dropdownAdapter = Utils.Decorate(
4671
+ options.dropdownAdapter,
4672
+ CloseOnSelect
4673
+ );
4674
+ }
4675
+
4676
+ if (
4677
+ options.dropdownCssClass != null ||
4678
+ options.dropdownCss != null ||
4679
+ options.adaptDropdownCssClass != null
4680
+ ) {
4681
+ var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
4682
+
4683
+ options.dropdownAdapter = Utils.Decorate(
4684
+ options.dropdownAdapter,
4685
+ DropdownCSS
4686
+ );
4687
+ }
4688
+
4689
+ options.dropdownAdapter = Utils.Decorate(
4690
+ options.dropdownAdapter,
4691
+ AttachBody
4692
+ );
4693
+ }
4694
+
4695
+ if (options.selectionAdapter == null) {
4696
+ if (options.multiple) {
4697
+ options.selectionAdapter = MultipleSelection;
4698
+ } else {
4699
+ options.selectionAdapter = SingleSelection;
4700
+ }
4701
+
4702
+ // Add the placeholder mixin if a placeholder was specified
4703
+ if (options.placeholder != null) {
4704
+ options.selectionAdapter = Utils.Decorate(
4705
+ options.selectionAdapter,
4706
+ Placeholder
4707
+ );
4708
+ }
4709
+
4710
+ if (options.allowClear) {
4711
+ options.selectionAdapter = Utils.Decorate(
4712
+ options.selectionAdapter,
4713
+ AllowClear
4714
+ );
4715
+ }
4716
+
4717
+ if (options.multiple) {
4718
+ options.selectionAdapter = Utils.Decorate(
4719
+ options.selectionAdapter,
4720
+ SelectionSearch
4721
+ );
4722
+ }
4723
+
4724
+ if (
4725
+ options.containerCssClass != null ||
4726
+ options.containerCss != null ||
4727
+ options.adaptContainerCssClass != null
4728
+ ) {
4729
+ var ContainerCSS = require(options.amdBase + 'compat/containerCss');
4730
+
4731
+ options.selectionAdapter = Utils.Decorate(
4732
+ options.selectionAdapter,
4733
+ ContainerCSS
4734
+ );
4735
+ }
4736
+
4737
+ options.selectionAdapter = Utils.Decorate(
4738
+ options.selectionAdapter,
4739
+ EventRelay
4740
+ );
4741
+ }
4742
+
4743
+ if (typeof options.language === 'string') {
4744
+ // Check if the language is specified with a region
4745
+ if (options.language.indexOf('-') > 0) {
4746
+ // Extract the region information if it is included
4747
+ var languageParts = options.language.split('-');
4748
+ var baseLanguage = languageParts[0];
4749
+
4750
+ options.language = [options.language, baseLanguage];
4751
+ } else {
4752
+ options.language = [options.language];
4753
+ }
4754
+ }
4755
+
4756
+ if ($.isArray(options.language)) {
4757
+ var languages = new Translation();
4758
+ options.language.push('en');
4759
+
4760
+ var languageNames = options.language;
4761
+
4762
+ for (var l = 0; l < languageNames.length; l++) {
4763
+ var name = languageNames[l];
4764
+ var language = {};
4765
+
4766
+ try {
4767
+ // Try to load it with the original name
4768
+ language = Translation.loadPath(name);
4769
+ } catch (e) {
4770
+ try {
4771
+ // If we couldn't load it, check if it wasn't the full path
4772
+ name = this.defaults.amdLanguageBase + name;
4773
+ language = Translation.loadPath(name);
4774
+ } catch (ex) {
4775
+ // The translation could not be loaded at all. Sometimes this is
4776
+ // because of a configuration problem, other times this can be
4777
+ // because of how Select2 helps load all possible translation files.
4778
+ if (options.debug && window.console && console.warn) {
4779
+ console.warn(
4780
+ 'Select2: The language file for "' + name + '" could not be ' +
4781
+ 'automatically loaded. A fallback will be used instead.'
4782
+ );
4783
+ }
4784
+
4785
+ continue;
4786
+ }
4787
+ }
4788
+
4789
+ languages.extend(language);
4790
+ }
4791
+
4792
+ options.translations = languages;
4793
+ } else {
4794
+ var baseTranslation = Translation.loadPath(
4795
+ this.defaults.amdLanguageBase + 'en'
4796
+ );
4797
+ var customTranslation = new Translation(options.language);
4798
+
4799
+ customTranslation.extend(baseTranslation);
4800
+
4801
+ options.translations = customTranslation;
4802
+ }
4803
+
4804
+ return options;
4805
+ };
4806
+
4807
+ Defaults.prototype.reset = function () {
4808
+ function stripDiacritics (text) {
4809
+ // Used 'uni range + named function' from http://jsperf.com/diacritics/18
4810
+ function match(a) {
4811
+ return DIACRITICS[a] || a;
4812
+ }
4813
+
4814
+ return text.replace(/[^\u0000-\u007E]/g, match);
4815
+ }
4816
+
4817
+ function matcher (params, data) {
4818
+ // Always return the object if there is nothing to compare
4819
+ if ($.trim(params.term) === '') {
4820
+ return data;
4821
+ }
4822
+
4823
+ // Do a recursive check for options with children
4824
+ if (data.children && data.children.length > 0) {
4825
+ // Clone the data object if there are children
4826
+ // This is required as we modify the object to remove any non-matches
4827
+ var match = $.extend(true, {}, data);
4828
+
4829
+ // Check each child of the option
4830
+ for (var c = data.children.length - 1; c >= 0; c--) {
4831
+ var child = data.children[c];
4832
+
4833
+ var matches = matcher(params, child);
4834
+
4835
+ // If there wasn't a match, remove the object in the array
4836
+ if (matches == null) {
4837
+ match.children.splice(c, 1);
4838
+ }
4839
+ }
4840
+
4841
+ // If any children matched, return the new object
4842
+ if (match.children.length > 0) {
4843
+ return match;
4844
+ }
4845
+
4846
+ // If there were no matching children, check just the plain object
4847
+ return matcher(params, match);
4848
+ }
4849
+
4850
+ var original = stripDiacritics(data.text).toUpperCase();
4851
+ var term = stripDiacritics(params.term).toUpperCase();
4852
+
4853
+ // Check if the text contains the term
4854
+ if (original.indexOf(term) > -1) {
4855
+ return data;
4856
+ }
4857
+
4858
+ // If it doesn't contain the term, don't return anything
4859
+ return null;
4860
+ }
4861
+
4862
+ this.defaults = {
4863
+ amdBase: './',
4864
+ amdLanguageBase: './i18n/',
4865
+ closeOnSelect: true,
4866
+ debug: false,
4867
+ dropdownAutoWidth: false,
4868
+ escapeMarkup: Utils.escapeMarkup,
4869
+ language: EnglishTranslation,
4870
+ matcher: matcher,
4871
+ minimumInputLength: 0,
4872
+ maximumInputLength: 0,
4873
+ maximumSelectionLength: 0,
4874
+ minimumResultsForSearch: 0,
4875
+ selectOnClose: false,
4876
+ sorter: function (data) {
4877
+ return data;
4878
+ },
4879
+ templateResult: function (result) {
4880
+ return result.text;
4881
+ },
4882
+ templateSelection: function (selection) {
4883
+ return selection.text;
4884
+ },
4885
+ theme: 'default',
4886
+ width: 'resolve'
4887
+ };
4888
+ };
4889
+
4890
+ Defaults.prototype.set = function (key, value) {
4891
+ var camelKey = $.camelCase(key);
4892
+
4893
+ var data = {};
4894
+ data[camelKey] = value;
4895
+
4896
+ var convertedData = Utils._convertData(data);
4897
+
4898
+ $.extend(this.defaults, convertedData);
4899
+ };
4900
+
4901
+ var defaults = new Defaults();
4902
+
4903
+ return defaults;
4904
+ });
4905
+
4906
+ S2.define('select2/options',[
4907
+ 'require',
4908
+ 'jquery',
4909
+ './defaults',
4910
+ './utils'
4911
+ ], function (require, $, Defaults, Utils) {
4912
+ function Options (options, $element) {
4913
+ this.options = options;
4914
+
4915
+ if ($element != null) {
4916
+ this.fromElement($element);
4917
+ }
4918
+
4919
+ this.options = Defaults.apply(this.options);
4920
+
4921
+ if ($element && $element.is('input')) {
4922
+ var InputCompat = require(this.get('amdBase') + 'compat/inputData');
4923
+
4924
+ this.options.dataAdapter = Utils.Decorate(
4925
+ this.options.dataAdapter,
4926
+ InputCompat
4927
+ );
4928
+ }
4929
+ }
4930
+
4931
+ Options.prototype.fromElement = function ($e) {
4932
+ var excludedData = ['select2'];
4933
+
4934
+ if (this.options.multiple == null) {
4935
+ this.options.multiple = $e.prop('multiple');
4936
+ }
4937
+
4938
+ if (this.options.disabled == null) {
4939
+ this.options.disabled = $e.prop('disabled');
4940
+ }
4941
+
4942
+ if (this.options.language == null) {
4943
+ if ($e.prop('lang')) {
4944
+ this.options.language = $e.prop('lang').toLowerCase();
4945
+ } else if ($e.closest('[lang]').prop('lang')) {
4946
+ this.options.language = $e.closest('[lang]').prop('lang');
4947
+ }
4948
+ }
4949
+
4950
+ if (this.options.dir == null) {
4951
+ if ($e.prop('dir')) {
4952
+ this.options.dir = $e.prop('dir');
4953
+ } else if ($e.closest('[dir]').prop('dir')) {
4954
+ this.options.dir = $e.closest('[dir]').prop('dir');
4955
+ } else {
4956
+ this.options.dir = 'ltr';
4957
+ }
4958
+ }
4959
+
4960
+ $e.prop('disabled', this.options.disabled);
4961
+ $e.prop('multiple', this.options.multiple);
4962
+
4963
+ if ($e.data('select2Tags')) {
4964
+ if (this.options.debug && window.console && console.warn) {
4965
+ console.warn(
4966
+ 'Select2: The `data-select2-tags` attribute has been changed to ' +
4967
+ 'use the `data-data` and `data-tags="true"` attributes and will be ' +
4968
+ 'removed in future versions of Select2.'
4969
+ );
4970
+ }
4971
+
4972
+ $e.data('data', $e.data('select2Tags'));
4973
+ $e.data('tags', true);
4974
+ }
4975
+
4976
+ if ($e.data('ajaxUrl')) {
4977
+ if (this.options.debug && window.console && console.warn) {
4978
+ console.warn(
4979
+ 'Select2: The `data-ajax-url` attribute has been changed to ' +
4980
+ '`data-ajax--url` and support for the old attribute will be removed' +
4981
+ ' in future versions of Select2.'
4982
+ );
4983
+ }
4984
+
4985
+ $e.attr('ajax--url', $e.data('ajaxUrl'));
4986
+ $e.data('ajax--url', $e.data('ajaxUrl'));
4987
+ }
4988
+
4989
+ var dataset = {};
4990
+
4991
+ // Prefer the element's `dataset` attribute if it exists
4992
+ // jQuery 1.x does not correctly handle data attributes with multiple dashes
4993
+ if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
4994
+ dataset = $.extend(true, {}, $e[0].dataset, $e.data());
4995
+ } else {
4996
+ dataset = $e.data();
4997
+ }
4998
+
4999
+ var data = $.extend(true, {}, dataset);
5000
+
5001
+ data = Utils._convertData(data);
5002
+
5003
+ for (var key in data) {
5004
+ if ($.inArray(key, excludedData) > -1) {
5005
+ continue;
5006
+ }
5007
+
5008
+ if ($.isPlainObject(this.options[key])) {
5009
+ $.extend(this.options[key], data[key]);
5010
+ } else {
5011
+ this.options[key] = data[key];
5012
+ }
5013
+ }
5014
+
5015
+ return this;
5016
+ };
5017
+
5018
+ Options.prototype.get = function (key) {
5019
+ return this.options[key];
5020
+ };
5021
+
5022
+ Options.prototype.set = function (key, val) {
5023
+ this.options[key] = val;
5024
+ };
5025
+
5026
+ return Options;
5027
+ });
5028
+
5029
+ S2.define('select2/core',[
5030
+ 'jquery',
5031
+ './options',
5032
+ './utils',
5033
+ './keys'
5034
+ ], function ($, Options, Utils, KEYS) {
5035
+ var Select2 = function ($element, options) {
5036
+ if ($element.data('select2') != null) {
5037
+ $element.data('select2').destroy();
5038
+ }
5039
+
5040
+ this.$element = $element;
5041
+
5042
+ this.id = this._generateId($element);
5043
+
5044
+ options = options || {};
5045
+
5046
+ this.options = new Options(options, $element);
5047
+
5048
+ Select2.__super__.constructor.call(this);
5049
+
5050
+ // Set up the tabindex
5051
+
5052
+ var tabindex = $element.attr('tabindex') || 0;
5053
+ $element.data('old-tabindex', tabindex);
5054
+ $element.attr('tabindex', '-1');
5055
+
5056
+ // Set up containers and adapters
5057
+
5058
+ var DataAdapter = this.options.get('dataAdapter');
5059
+ this.dataAdapter = new DataAdapter($element, this.options);
5060
+
5061
+ var $container = this.render();
5062
+
5063
+ this._placeContainer($container);
5064
+
5065
+ var SelectionAdapter = this.options.get('selectionAdapter');
5066
+ this.selection = new SelectionAdapter($element, this.options);
5067
+ this.$selection = this.selection.render();
5068
+
5069
+ this.selection.position(this.$selection, $container);
5070
+
5071
+ var DropdownAdapter = this.options.get('dropdownAdapter');
5072
+ this.dropdown = new DropdownAdapter($element, this.options);
5073
+ this.$dropdown = this.dropdown.render();
5074
+
5075
+ this.dropdown.position(this.$dropdown, $container);
5076
+
5077
+ var ResultsAdapter = this.options.get('resultsAdapter');
5078
+ this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
5079
+ this.$results = this.results.render();
5080
+
5081
+ this.results.position(this.$results, this.$dropdown);
5082
+
5083
+ // Bind events
5084
+
5085
+ var self = this;
5086
+
5087
+ // Bind the container to all of the adapters
5088
+ this._bindAdapters();
5089
+
5090
+ // Register any DOM event handlers
5091
+ this._registerDomEvents();
5092
+
5093
+ // Register any internal event handlers
5094
+ this._registerDataEvents();
5095
+ this._registerSelectionEvents();
5096
+ this._registerDropdownEvents();
5097
+ this._registerResultsEvents();
5098
+ this._registerEvents();
5099
+
5100
+ // Set the initial state
5101
+ this.dataAdapter.current(function (initialData) {
5102
+ self.trigger('selection:update', {
5103
+ data: initialData
5104
+ });
5105
+ });
5106
+
5107
+ // Hide the original select
5108
+ $element.addClass('select2-hidden-accessible');
5109
+ $element.attr('aria-hidden', 'true');
5110
+
5111
+ // Synchronize any monitored attributes
5112
+ this._syncAttributes();
5113
+
5114
+ $element.data('select2', this);
5115
+ };
5116
+
5117
+ Utils.Extend(Select2, Utils.Observable);
5118
+
5119
+ Select2.prototype._generateId = function ($element) {
5120
+ var id = '';
5121
+
5122
+ if ($element.attr('id') != null) {
5123
+ id = $element.attr('id');
5124
+ } else if ($element.attr('name') != null) {
5125
+ id = $element.attr('name') + '-' + Utils.generateChars(2);
5126
+ } else {
5127
+ id = Utils.generateChars(4);
5128
+ }
5129
+
5130
+ id = id.replace(/(:|\.|\[|\]|,)/g, '');
5131
+ id = 'select2-' + id;
5132
+
5133
+ return id;
5134
+ };
5135
+
5136
+ Select2.prototype._placeContainer = function ($container) {
5137
+ $container.insertAfter(this.$element);
5138
+
5139
+ var width = this._resolveWidth(this.$element, this.options.get('width'));
5140
+
5141
+ if (width != null) {
5142
+ $container.css('width', width);
5143
+ }
5144
+ };
5145
+
5146
+ Select2.prototype._resolveWidth = function ($element, method) {
5147
+ var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
5148
+
5149
+ if (method == 'resolve') {
5150
+ var styleWidth = this._resolveWidth($element, 'style');
5151
+
5152
+ if (styleWidth != null) {
5153
+ return styleWidth;
5154
+ }
5155
+
5156
+ return this._resolveWidth($element, 'element');
5157
+ }
5158
+
5159
+ if (method == 'element') {
5160
+ var elementWidth = $element.outerWidth(false);
5161
+
5162
+ if (elementWidth <= 0) {
5163
+ return 'auto';
5164
+ }
5165
+
5166
+ return elementWidth + 'px';
5167
+ }
5168
+
5169
+ if (method == 'style') {
5170
+ var style = $element.attr('style');
5171
+
5172
+ if (typeof(style) !== 'string') {
5173
+ return null;
5174
+ }
5175
+
5176
+ var attrs = style.split(';');
5177
+
5178
+ for (var i = 0, l = attrs.length; i < l; i = i + 1) {
5179
+ var attr = attrs[i].replace(/\s/g, '');
5180
+ var matches = attr.match(WIDTH);
5181
+
5182
+ if (matches !== null && matches.length >= 1) {
5183
+ return matches[1];
5184
+ }
5185
+ }
5186
+
5187
+ return null;
5188
+ }
5189
+
5190
+ return method;
5191
+ };
5192
+
5193
+ Select2.prototype._bindAdapters = function () {
5194
+ this.dataAdapter.bind(this, this.$container);
5195
+ this.selection.bind(this, this.$container);
5196
+
5197
+ this.dropdown.bind(this, this.$container);
5198
+ this.results.bind(this, this.$container);
5199
+ };
5200
+
5201
+ Select2.prototype._registerDomEvents = function () {
5202
+ var self = this;
5203
+
5204
+ this.$element.on('change.select2', function () {
5205
+ self.dataAdapter.current(function (data) {
5206
+ self.trigger('selection:update', {
5207
+ data: data
5208
+ });
5209
+ });
5210
+ });
5211
+
5212
+ this.$element.on('focus.select2', function (evt) {
5213
+ self.trigger('focus', evt);
5214
+ });
5215
+
5216
+ this._syncA = Utils.bind(this._syncAttributes, this);
5217
+ this._syncS = Utils.bind(this._syncSubtree, this);
5218
+
5219
+ if (this.$element[0].attachEvent) {
5220
+ this.$element[0].attachEvent('onpropertychange', this._syncA);
5221
+ }
5222
+
5223
+ var observer = window.MutationObserver ||
5224
+ window.WebKitMutationObserver ||
5225
+ window.MozMutationObserver
5226
+ ;
5227
+
5228
+ if (observer != null) {
5229
+ this._observer = new observer(function (mutations) {
5230
+ $.each(mutations, self._syncA);
5231
+ $.each(mutations, self._syncS);
5232
+ });
5233
+ this._observer.observe(this.$element[0], {
5234
+ attributes: true,
5235
+ childList: true,
5236
+ subtree: false
5237
+ });
5238
+ } else if (this.$element[0].addEventListener) {
5239
+ this.$element[0].addEventListener(
5240
+ 'DOMAttrModified',
5241
+ self._syncA,
5242
+ false
5243
+ );
5244
+ this.$element[0].addEventListener(
5245
+ 'DOMNodeInserted',
5246
+ self._syncS,
5247
+ false
5248
+ );
5249
+ this.$element[0].addEventListener(
5250
+ 'DOMNodeRemoved',
5251
+ self._syncS,
5252
+ false
5253
+ );
5254
+ }
5255
+ };
5256
+
5257
+ Select2.prototype._registerDataEvents = function () {
5258
+ var self = this;
5259
+
5260
+ this.dataAdapter.on('*', function (name, params) {
5261
+ self.trigger(name, params);
5262
+ });
5263
+ };
5264
+
5265
+ Select2.prototype._registerSelectionEvents = function () {
5266
+ var self = this;
5267
+ var nonRelayEvents = ['toggle', 'focus'];
5268
+
5269
+ this.selection.on('toggle', function () {
5270
+ self.toggleDropdown();
5271
+ });
5272
+
5273
+ this.selection.on('focus', function (params) {
5274
+ self.focus(params);
5275
+ });
5276
+
5277
+ this.selection.on('*', function (name, params) {
5278
+ if ($.inArray(name, nonRelayEvents) !== -1) {
5279
+ return;
5280
+ }
5281
+
5282
+ self.trigger(name, params);
5283
+ });
5284
+ };
5285
+
5286
+ Select2.prototype._registerDropdownEvents = function () {
5287
+ var self = this;
5288
+
5289
+ this.dropdown.on('*', function (name, params) {
5290
+ self.trigger(name, params);
5291
+ });
5292
+ };
5293
+
5294
+ Select2.prototype._registerResultsEvents = function () {
5295
+ var self = this;
5296
+
5297
+ this.results.on('*', function (name, params) {
5298
+ self.trigger(name, params);
5299
+ });
5300
+ };
5301
+
5302
+ Select2.prototype._registerEvents = function () {
5303
+ var self = this;
5304
+
5305
+ this.on('open', function () {
5306
+ self.$container.addClass('select2-container--open');
5307
+ });
5308
+
5309
+ this.on('close', function () {
5310
+ self.$container.removeClass('select2-container--open');
5311
+ });
5312
+
5313
+ this.on('enable', function () {
5314
+ self.$container.removeClass('select2-container--disabled');
5315
+ });
5316
+
5317
+ this.on('disable', function () {
5318
+ self.$container.addClass('select2-container--disabled');
5319
+ });
5320
+
5321
+ this.on('blur', function () {
5322
+ self.$container.removeClass('select2-container--focus');
5323
+ });
5324
+
5325
+ this.on('query', function (params) {
5326
+ if (!self.isOpen()) {
5327
+ self.trigger('open', {});
5328
+ }
5329
+
5330
+ this.dataAdapter.query(params, function (data) {
5331
+ self.trigger('results:all', {
5332
+ data: data,
5333
+ query: params
5334
+ });
5335
+ });
5336
+ });
5337
+
5338
+ this.on('query:append', function (params) {
5339
+ this.dataAdapter.query(params, function (data) {
5340
+ self.trigger('results:append', {
5341
+ data: data,
5342
+ query: params
5343
+ });
5344
+ });
5345
+ });
5346
+
5347
+ this.on('keypress', function (evt) {
5348
+ var key = evt.which;
5349
+
5350
+ if (self.isOpen()) {
5351
+ if (key === KEYS.ESC || key === KEYS.TAB ||
5352
+ (key === KEYS.UP && evt.altKey)) {
5353
+ self.close();
5354
+
5355
+ evt.preventDefault();
5356
+ } else if (key === KEYS.ENTER) {
5357
+ self.trigger('results:select', {});
5358
+
5359
+ evt.preventDefault();
5360
+ } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
5361
+ self.trigger('results:toggle', {});
5362
+
5363
+ evt.preventDefault();
5364
+ } else if (key === KEYS.UP) {
5365
+ self.trigger('results:previous', {});
5366
+
5367
+ evt.preventDefault();
5368
+ } else if (key === KEYS.DOWN) {
5369
+ self.trigger('results:next', {});
5370
+
5371
+ evt.preventDefault();
5372
+ }
5373
+ } else {
5374
+ if (key === KEYS.ENTER || key === KEYS.SPACE ||
5375
+ (key === KEYS.DOWN && evt.altKey)) {
5376
+ self.open();
5377
+
5378
+ evt.preventDefault();
5379
+ }
5380
+ }
5381
+ });
5382
+ };
5383
+
5384
+ Select2.prototype._syncAttributes = function () {
5385
+ this.options.set('disabled', this.$element.prop('disabled'));
5386
+
5387
+ if (this.options.get('disabled')) {
5388
+ if (this.isOpen()) {
5389
+ this.close();
5390
+ }
5391
+
5392
+ this.trigger('disable', {});
5393
+ } else {
5394
+ this.trigger('enable', {});
5395
+ }
5396
+ };
5397
+
5398
+ Select2.prototype._syncSubtree = function (evt, mutations) {
5399
+ var changed = false;
5400
+ var self = this;
5401
+
5402
+ // Ignore any mutation events raised for elements that aren't options or
5403
+ // optgroups. This handles the case when the select element is destroyed
5404
+ if (
5405
+ evt && evt.target && (
5406
+ evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
5407
+ )
5408
+ ) {
5409
+ return;
5410
+ }
5411
+
5412
+ if (!mutations) {
5413
+ // If mutation events aren't supported, then we can only assume that the
5414
+ // change affected the selections
5415
+ changed = true;
5416
+ } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
5417
+ for (var n = 0; n < mutations.addedNodes.length; n++) {
5418
+ var node = mutations.addedNodes[n];
5419
+
5420
+ if (node.selected) {
5421
+ changed = true;
5422
+ }
5423
+ }
5424
+ } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
5425
+ changed = true;
5426
+ }
5427
+
5428
+ // Only re-pull the data if we think there is a change
5429
+ if (changed) {
5430
+ this.dataAdapter.current(function (currentData) {
5431
+ self.trigger('selection:update', {
5432
+ data: currentData
5433
+ });
5434
+ });
5435
+ }
5436
+ };
5437
+
5438
+ /**
5439
+ * Override the trigger method to automatically trigger pre-events when
5440
+ * there are events that can be prevented.
5441
+ */
5442
+ Select2.prototype.trigger = function (name, args) {
5443
+ var actualTrigger = Select2.__super__.trigger;
5444
+ var preTriggerMap = {
5445
+ 'open': 'opening',
5446
+ 'close': 'closing',
5447
+ 'select': 'selecting',
5448
+ 'unselect': 'unselecting'
5449
+ };
5450
+
5451
+ if (args === undefined) {
5452
+ args = {};
5453
+ }
5454
+
5455
+ if (name in preTriggerMap) {
5456
+ var preTriggerName = preTriggerMap[name];
5457
+ var preTriggerArgs = {
5458
+ prevented: false,
5459
+ name: name,
5460
+ args: args
5461
+ };
5462
+
5463
+ actualTrigger.call(this, preTriggerName, preTriggerArgs);
5464
+
5465
+ if (preTriggerArgs.prevented) {
5466
+ args.prevented = true;
5467
+
5468
+ return;
5469
+ }
5470
+ }
5471
+
5472
+ actualTrigger.call(this, name, args);
5473
+ };
5474
+
5475
+ Select2.prototype.toggleDropdown = function () {
5476
+ if (this.options.get('disabled')) {
5477
+ return;
5478
+ }
5479
+
5480
+ if (this.isOpen()) {
5481
+ this.close();
5482
+ } else {
5483
+ this.open();
5484
+ }
5485
+ };
5486
+
5487
+ Select2.prototype.open = function () {
5488
+ if (this.isOpen()) {
5489
+ return;
5490
+ }
5491
+
5492
+ this.trigger('query', {});
5493
+ };
5494
+
5495
+ Select2.prototype.close = function () {
5496
+ if (!this.isOpen()) {
5497
+ return;
5498
+ }
5499
+
5500
+ this.trigger('close', {});
5501
+ };
5502
+
5503
+ Select2.prototype.isOpen = function () {
5504
+ return this.$container.hasClass('select2-container--open');
5505
+ };
5506
+
5507
+ Select2.prototype.hasFocus = function () {
5508
+ return this.$container.hasClass('select2-container--focus');
5509
+ };
5510
+
5511
+ Select2.prototype.focus = function (data) {
5512
+ // No need to re-trigger focus events if we are already focused
5513
+ if (this.hasFocus()) {
5514
+ return;
5515
+ }
5516
+
5517
+ this.$container.addClass('select2-container--focus');
5518
+ this.trigger('focus', {});
5519
+ };
5520
+
5521
+ Select2.prototype.enable = function (args) {
5522
+ if (this.options.get('debug') && window.console && console.warn) {
5523
+ console.warn(
5524
+ 'Select2: The `select2("enable")` method has been deprecated and will' +
5525
+ ' be removed in later Select2 versions. Use $element.prop("disabled")' +
5526
+ ' instead.'
5527
+ );
5528
+ }
5529
+
5530
+ if (args == null || args.length === 0) {
5531
+ args = [true];
5532
+ }
5533
+
5534
+ var disabled = !args[0];
5535
+
5536
+ this.$element.prop('disabled', disabled);
5537
+ };
5538
+
5539
+ Select2.prototype.data = function () {
5540
+ if (this.options.get('debug') &&
5541
+ arguments.length > 0 && window.console && console.warn) {
5542
+ console.warn(
5543
+ 'Select2: Data can no longer be set using `select2("data")`. You ' +
5544
+ 'should consider setting the value instead using `$element.val()`.'
5545
+ );
5546
+ }
5547
+
5548
+ var data = [];
5549
+
5550
+ this.dataAdapter.current(function (currentData) {
5551
+ data = currentData;
5552
+ });
5553
+
5554
+ return data;
5555
+ };
5556
+
5557
+ Select2.prototype.val = function (args) {
5558
+ if (this.options.get('debug') && window.console && console.warn) {
5559
+ console.warn(
5560
+ 'Select2: The `select2("val")` method has been deprecated and will be' +
5561
+ ' removed in later Select2 versions. Use $element.val() instead.'
5562
+ );
5563
+ }
5564
+
5565
+ if (args == null || args.length === 0) {
5566
+ return this.$element.val();
5567
+ }
5568
+
5569
+ var newVal = args[0];
5570
+
5571
+ if ($.isArray(newVal)) {
5572
+ newVal = $.map(newVal, function (obj) {
5573
+ return obj.toString();
5574
+ });
5575
+ }
5576
+
5577
+ this.$element.val(newVal).trigger('change');
5578
+ };
5579
+
5580
+ Select2.prototype.destroy = function () {
5581
+ this.$container.remove();
5582
+
5583
+ if (this.$element[0].detachEvent) {
5584
+ this.$element[0].detachEvent('onpropertychange', this._syncA);
5585
+ }
5586
+
5587
+ if (this._observer != null) {
5588
+ this._observer.disconnect();
5589
+ this._observer = null;
5590
+ } else if (this.$element[0].removeEventListener) {
5591
+ this.$element[0]
5592
+ .removeEventListener('DOMAttrModified', this._syncA, false);
5593
+ this.$element[0]
5594
+ .removeEventListener('DOMNodeInserted', this._syncS, false);
5595
+ this.$element[0]
5596
+ .removeEventListener('DOMNodeRemoved', this._syncS, false);
5597
+ }
5598
+
5599
+ this._syncA = null;
5600
+ this._syncS = null;
5601
+
5602
+ this.$element.off('.select2');
5603
+ this.$element.attr('tabindex', this.$element.data('old-tabindex'));
5604
+
5605
+ this.$element.removeClass('select2-hidden-accessible');
5606
+ this.$element.attr('aria-hidden', 'false');
5607
+ this.$element.removeData('select2');
5608
+
5609
+ this.dataAdapter.destroy();
5610
+ this.selection.destroy();
5611
+ this.dropdown.destroy();
5612
+ this.results.destroy();
5613
+
5614
+ this.dataAdapter = null;
5615
+ this.selection = null;
5616
+ this.dropdown = null;
5617
+ this.results = null;
5618
+ };
5619
+
5620
+ Select2.prototype.render = function () {
5621
+ var $container = $(
5622
+ '<span class="select2 select2-container">' +
5623
+ '<span class="selection"></span>' +
5624
+ '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
5625
+ '</span>'
5626
+ );
5627
+
5628
+ $container.attr('dir', this.options.get('dir'));
5629
+
5630
+ this.$container = $container;
5631
+
5632
+ this.$container.addClass('select2-container--' + this.options.get('theme'));
5633
+
5634
+ $container.data('element', this.$element);
5635
+
5636
+ return $container;
5637
+ };
5638
+
5639
+ return Select2;
5640
+ });
5641
+
5642
+ S2.define('select2/compat/utils',[
5643
+ 'jquery'
5644
+ ], function ($) {
5645
+ function syncCssClasses ($dest, $src, adapter) {
5646
+ var classes, replacements = [], adapted;
5647
+
5648
+ classes = $.trim($dest.attr('class'));
5649
+
5650
+ if (classes) {
5651
+ classes = '' + classes; // for IE which returns object
5652
+
5653
+ $(classes.split(/\s+/)).each(function () {
5654
+ // Save all Select2 classes
5655
+ if (this.indexOf('select2-') === 0) {
5656
+ replacements.push(this);
5657
+ }
5658
+ });
5659
+ }
5660
+
5661
+ classes = $.trim($src.attr('class'));
5662
+
5663
+ if (classes) {
5664
+ classes = '' + classes; // for IE which returns object
5665
+
5666
+ $(classes.split(/\s+/)).each(function () {
5667
+ // Only adapt non-Select2 classes
5668
+ if (this.indexOf('select2-') !== 0) {
5669
+ adapted = adapter(this);
5670
+
5671
+ if (adapted != null) {
5672
+ replacements.push(adapted);
5673
+ }
5674
+ }
5675
+ });
5676
+ }
5677
+
5678
+ $dest.attr('class', replacements.join(' '));
5679
+ }
5680
+
5681
+ return {
5682
+ syncCssClasses: syncCssClasses
5683
+ };
5684
+ });
5685
+
5686
+ S2.define('select2/compat/containerCss',[
5687
+ 'jquery',
5688
+ './utils'
5689
+ ], function ($, CompatUtils) {
5690
+ // No-op CSS adapter that discards all classes by default
5691
+ function _containerAdapter (clazz) {
5692
+ return null;
5693
+ }
5694
+
5695
+ function ContainerCSS () { }
5696
+
5697
+ ContainerCSS.prototype.render = function (decorated) {
5698
+ var $container = decorated.call(this);
5699
+
5700
+ var containerCssClass = this.options.get('containerCssClass') || '';
5701
+
5702
+ if ($.isFunction(containerCssClass)) {
5703
+ containerCssClass = containerCssClass(this.$element);
5704
+ }
5705
+
5706
+ var containerCssAdapter = this.options.get('adaptContainerCssClass');
5707
+ containerCssAdapter = containerCssAdapter || _containerAdapter;
5708
+
5709
+ if (containerCssClass.indexOf(':all:') !== -1) {
5710
+ containerCssClass = containerCssClass.replace(':all:', '');
5711
+
5712
+ var _cssAdapter = containerCssAdapter;
5713
+
5714
+ containerCssAdapter = function (clazz) {
5715
+ var adapted = _cssAdapter(clazz);
5716
+
5717
+ if (adapted != null) {
5718
+ // Append the old one along with the adapted one
5719
+ return adapted + ' ' + clazz;
5720
+ }
5721
+
5722
+ return clazz;
5723
+ };
5724
+ }
5725
+
5726
+ var containerCss = this.options.get('containerCss') || {};
5727
+
5728
+ if ($.isFunction(containerCss)) {
5729
+ containerCss = containerCss(this.$element);
5730
+ }
5731
+
5732
+ CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter);
5733
+
5734
+ $container.css(containerCss);
5735
+ $container.addClass(containerCssClass);
5736
+
5737
+ return $container;
5738
+ };
5739
+
5740
+ return ContainerCSS;
5741
+ });
5742
+
5743
+ S2.define('select2/compat/dropdownCss',[
5744
+ 'jquery',
5745
+ './utils'
5746
+ ], function ($, CompatUtils) {
5747
+ // No-op CSS adapter that discards all classes by default
5748
+ function _dropdownAdapter (clazz) {
5749
+ return null;
5750
+ }
5751
+
5752
+ function DropdownCSS () { }
5753
+
5754
+ DropdownCSS.prototype.render = function (decorated) {
5755
+ var $dropdown = decorated.call(this);
5756
+
5757
+ var dropdownCssClass = this.options.get('dropdownCssClass') || '';
5758
+
5759
+ if ($.isFunction(dropdownCssClass)) {
5760
+ dropdownCssClass = dropdownCssClass(this.$element);
5761
+ }
5762
+
5763
+ var dropdownCssAdapter = this.options.get('adaptDropdownCssClass');
5764
+ dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter;
5765
+
5766
+ if (dropdownCssClass.indexOf(':all:') !== -1) {
5767
+ dropdownCssClass = dropdownCssClass.replace(':all:', '');
5768
+
5769
+ var _cssAdapter = dropdownCssAdapter;
5770
+
5771
+ dropdownCssAdapter = function (clazz) {
5772
+ var adapted = _cssAdapter(clazz);
5773
+
5774
+ if (adapted != null) {
5775
+ // Append the old one along with the adapted one
5776
+ return adapted + ' ' + clazz;
5777
+ }
5778
+
5779
+ return clazz;
5780
+ };
5781
+ }
5782
+
5783
+ var dropdownCss = this.options.get('dropdownCss') || {};
5784
+
5785
+ if ($.isFunction(dropdownCss)) {
5786
+ dropdownCss = dropdownCss(this.$element);
5787
+ }
5788
+
5789
+ CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter);
5790
+
5791
+ $dropdown.css(dropdownCss);
5792
+ $dropdown.addClass(dropdownCssClass);
5793
+
5794
+ return $dropdown;
5795
+ };
5796
+
5797
+ return DropdownCSS;
5798
+ });
5799
+
5800
+ S2.define('select2/compat/initSelection',[
5801
+ 'jquery'
5802
+ ], function ($) {
5803
+ function InitSelection (decorated, $element, options) {
5804
+ if (options.get('debug') && window.console && console.warn) {
5805
+ console.warn(
5806
+ 'Select2: The `initSelection` option has been deprecated in favor' +
5807
+ ' of a custom data adapter that overrides the `current` method. ' +
5808
+ 'This method is now called multiple times instead of a single ' +
5809
+ 'time when the instance is initialized. Support will be removed ' +
5810
+ 'for the `initSelection` option in future versions of Select2'
5811
+ );
5812
+ }
5813
+
5814
+ this.initSelection = options.get('initSelection');
5815
+ this._isInitialized = false;
5816
+
5817
+ decorated.call(this, $element, options);
5818
+ }
5819
+
5820
+ InitSelection.prototype.current = function (decorated, callback) {
5821
+ var self = this;
5822
+
5823
+ if (this._isInitialized) {
5824
+ decorated.call(this, callback);
5825
+
5826
+ return;
5827
+ }
5828
+
5829
+ this.initSelection.call(null, this.$element, function (data) {
5830
+ self._isInitialized = true;
5831
+
5832
+ if (!$.isArray(data)) {
5833
+ data = [data];
5834
+ }
5835
+
5836
+ callback(data);
5837
+ });
5838
+ };
5839
+
5840
+ return InitSelection;
5841
+ });
5842
+
5843
+ S2.define('select2/compat/inputData',[
5844
+ 'jquery'
5845
+ ], function ($) {
5846
+ function InputData (decorated, $element, options) {
5847
+ this._currentData = [];
5848
+ this._valueSeparator = options.get('valueSeparator') || ',';
5849
+
5850
+ if ($element.prop('type') === 'hidden') {
5851
+ if (options.get('debug') && console && console.warn) {
5852
+ console.warn(
5853
+ 'Select2: Using a hidden input with Select2 is no longer ' +
5854
+ 'supported and may stop working in the future. It is recommended ' +
5855
+ 'to use a `<select>` element instead.'
5856
+ );
5857
+ }
5858
+ }
5859
+
5860
+ decorated.call(this, $element, options);
5861
+ }
5862
+
5863
+ InputData.prototype.current = function (_, callback) {
5864
+ function getSelected (data, selectedIds) {
5865
+ var selected = [];
5866
+
5867
+ if (data.selected || $.inArray(data.id, selectedIds) !== -1) {
5868
+ data.selected = true;
5869
+ selected.push(data);
5870
+ } else {
5871
+ data.selected = false;
5872
+ }
5873
+
5874
+ if (data.children) {
5875
+ selected.push.apply(selected, getSelected(data.children, selectedIds));
5876
+ }
5877
+
5878
+ return selected;
5879
+ }
5880
+
5881
+ var selected = [];
5882
+
5883
+ for (var d = 0; d < this._currentData.length; d++) {
5884
+ var data = this._currentData[d];
5885
+
5886
+ selected.push.apply(
5887
+ selected,
5888
+ getSelected(
5889
+ data,
5890
+ this.$element.val().split(
5891
+ this._valueSeparator
5892
+ )
5893
+ )
5894
+ );
5895
+ }
5896
+
5897
+ callback(selected);
5898
+ };
5899
+
5900
+ InputData.prototype.select = function (_, data) {
5901
+ if (!this.options.get('multiple')) {
5902
+ this.current(function (allData) {
5903
+ $.map(allData, function (data) {
5904
+ data.selected = false;
5905
+ });
5906
+ });
5907
+
5908
+ this.$element.val(data.id);
5909
+ this.$element.trigger('change');
5910
+ } else {
5911
+ var value = this.$element.val();
5912
+ value += this._valueSeparator + data.id;
5913
+
5914
+ this.$element.val(value);
5915
+ this.$element.trigger('change');
5916
+ }
5917
+ };
5918
+
5919
+ InputData.prototype.unselect = function (_, data) {
5920
+ var self = this;
5921
+
5922
+ data.selected = false;
5923
+
5924
+ this.current(function (allData) {
5925
+ var values = [];
5926
+
5927
+ for (var d = 0; d < allData.length; d++) {
5928
+ var item = allData[d];
5929
+
5930
+ if (data.id == item.id) {
5931
+ continue;
5932
+ }
5933
+
5934
+ values.push(item.id);
5935
+ }
5936
+
5937
+ self.$element.val(values.join(self._valueSeparator));
5938
+ self.$element.trigger('change');
5939
+ });
5940
+ };
5941
+
5942
+ InputData.prototype.query = function (_, params, callback) {
5943
+ var results = [];
5944
+
5945
+ for (var d = 0; d < this._currentData.length; d++) {
5946
+ var data = this._currentData[d];
5947
+
5948
+ var matches = this.matches(params, data);
5949
+
5950
+ if (matches !== null) {
5951
+ results.push(matches);
5952
+ }
5953
+ }
5954
+
5955
+ callback({
5956
+ results: results
5957
+ });
5958
+ };
5959
+
5960
+ InputData.prototype.addOptions = function (_, $options) {
5961
+ var options = $.map($options, function ($option) {
5962
+ return $.data($option[0], 'data');
5963
+ });
5964
+
5965
+ this._currentData.push.apply(this._currentData, options);
5966
+ };
5967
+
5968
+ return InputData;
5969
+ });
5970
+
5971
+ S2.define('select2/compat/matcher',[
5972
+ 'jquery'
5973
+ ], function ($) {
5974
+ function oldMatcher (matcher) {
5975
+ function wrappedMatcher (params, data) {
5976
+ var match = $.extend(true, {}, data);
5977
+
5978
+ if (params.term == null || $.trim(params.term) === '') {
5979
+ return match;
5980
+ }
5981
+
5982
+ if (data.children) {
5983
+ for (var c = data.children.length - 1; c >= 0; c--) {
5984
+ var child = data.children[c];
5985
+
5986
+ // Check if the child object matches
5987
+ // The old matcher returned a boolean true or false
5988
+ var doesMatch = matcher(params.term, child.text, child);
5989
+
5990
+ // If the child didn't match, pop it off
5991
+ if (!doesMatch) {
5992
+ match.children.splice(c, 1);
5993
+ }
5994
+ }
5995
+
5996
+ if (match.children.length > 0) {
5997
+ return match;
5998
+ }
5999
+ }
6000
+
6001
+ if (matcher(params.term, data.text, data)) {
6002
+ return match;
6003
+ }
6004
+
6005
+ return null;
6006
+ }
6007
+
6008
+ return wrappedMatcher;
6009
+ }
6010
+
6011
+ return oldMatcher;
6012
+ });
6013
+
6014
+ S2.define('select2/compat/query',[
6015
+
6016
+ ], function () {
6017
+ function Query (decorated, $element, options) {
6018
+ if (options.get('debug') && window.console && console.warn) {
6019
+ console.warn(
6020
+ 'Select2: The `query` option has been deprecated in favor of a ' +
6021
+ 'custom data adapter that overrides the `query` method. Support ' +
6022
+ 'will be removed for the `query` option in future versions of ' +
6023
+ 'Select2.'
6024
+ );
6025
+ }
6026
+
6027
+ decorated.call(this, $element, options);
6028
+ }
6029
+
6030
+ Query.prototype.query = function (_, params, callback) {
6031
+ params.callback = callback;
6032
+
6033
+ var query = this.options.get('query');
6034
+
6035
+ query.call(null, params);
6036
+ };
6037
+
6038
+ return Query;
6039
+ });
6040
+
6041
+ S2.define('select2/dropdown/attachContainer',[
6042
+
6043
+ ], function () {
6044
+ function AttachContainer (decorated, $element, options) {
6045
+ decorated.call(this, $element, options);
6046
+ }
6047
+
6048
+ AttachContainer.prototype.position =
6049
+ function (decorated, $dropdown, $container) {
6050
+ var $dropdownContainer = $container.find('.dropdown-wrapper');
6051
+ $dropdownContainer.append($dropdown);
6052
+
6053
+ $dropdown.addClass('select2-dropdown--below');
6054
+ $container.addClass('select2-container--below');
6055
+ };
6056
+
6057
+ return AttachContainer;
6058
+ });
6059
+
6060
+ S2.define('select2/dropdown/stopPropagation',[
6061
+
6062
+ ], function () {
6063
+ function StopPropagation () { }
6064
+
6065
+ StopPropagation.prototype.bind = function (decorated, container, $container) {
6066
+ decorated.call(this, container, $container);
6067
+
6068
+ var stoppedEvents = [
6069
+ 'blur',
6070
+ 'change',
6071
+ 'click',
6072
+ 'dblclick',
6073
+ 'focus',
6074
+ 'focusin',
6075
+ 'focusout',
6076
+ 'input',
6077
+ 'keydown',
6078
+ 'keyup',
6079
+ 'keypress',
6080
+ 'mousedown',
6081
+ 'mouseenter',
6082
+ 'mouseleave',
6083
+ 'mousemove',
6084
+ 'mouseover',
6085
+ 'mouseup',
6086
+ 'search',
6087
+ 'touchend',
6088
+ 'touchstart'
6089
+ ];
6090
+
6091
+ this.$dropdown.on(stoppedEvents.join(' '), function (evt) {
6092
+ evt.stopPropagation();
6093
+ });
6094
+ };
6095
+
6096
+ return StopPropagation;
6097
+ });
6098
+
6099
+ S2.define('select2/selection/stopPropagation',[
6100
+
6101
+ ], function () {
6102
+ function StopPropagation () { }
6103
+
6104
+ StopPropagation.prototype.bind = function (decorated, container, $container) {
6105
+ decorated.call(this, container, $container);
6106
+
6107
+ var stoppedEvents = [
6108
+ 'blur',
6109
+ 'change',
6110
+ 'click',
6111
+ 'dblclick',
6112
+ 'focus',
6113
+ 'focusin',
6114
+ 'focusout',
6115
+ 'input',
6116
+ 'keydown',
6117
+ 'keyup',
6118
+ 'keypress',
6119
+ 'mousedown',
6120
+ 'mouseenter',
6121
+ 'mouseleave',
6122
+ 'mousemove',
6123
+ 'mouseover',
6124
+ 'mouseup',
6125
+ 'search',
6126
+ 'touchend',
6127
+ 'touchstart'
6128
+ ];
6129
+
6130
+ this.$selection.on(stoppedEvents.join(' '), function (evt) {
6131
+ evt.stopPropagation();
6132
+ });
6133
+ };
6134
+
6135
+ return StopPropagation;
6136
+ });
6137
+
6138
+ /*!
6139
+ * jQuery Mousewheel 3.1.13
6140
+ *
6141
+ * Copyright jQuery Foundation and other contributors
6142
+ * Released under the MIT license
6143
+ * http://jquery.org/license
6144
+ */
6145
+
6146
+ (function (factory) {
6147
+ if ( typeof S2.define === 'function' && S2.define.amd ) {
6148
+ // AMD. Register as an anonymous module.
6149
+ S2.define('jquery-mousewheel',['jquery'], factory);
6150
+ } else if (typeof exports === 'object') {
6151
+ // Node/CommonJS style for Browserify
6152
+ module.exports = factory;
6153
+ } else {
6154
+ // Browser globals
6155
+ factory(jQuery);
6156
+ }
6157
+ }(function ($) {
6158
+
6159
+ var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],
6160
+ toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?
6161
+ ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],
6162
+ slice = Array.prototype.slice,
6163
+ nullLowestDeltaTimeout, lowestDelta;
6164
+
6165
+ if ( $.event.fixHooks ) {
6166
+ for ( var i = toFix.length; i; ) {
6167
+ $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;
6168
+ }
6169
+ }
6170
+
6171
+ var special = $.event.special.mousewheel = {
6172
+ version: '3.1.12',
6173
+
6174
+ setup: function() {
6175
+ if ( this.addEventListener ) {
6176
+ for ( var i = toBind.length; i; ) {
6177
+ this.addEventListener( toBind[--i], handler, false );
6178
+ }
6179
+ } else {
6180
+ this.onmousewheel = handler;
6181
+ }
6182
+ // Store the line height and page height for this particular element
6183
+ $.data(this, 'mousewheel-line-height', special.getLineHeight(this));
6184
+ $.data(this, 'mousewheel-page-height', special.getPageHeight(this));
6185
+ },
6186
+
6187
+ teardown: function() {
6188
+ if ( this.removeEventListener ) {
6189
+ for ( var i = toBind.length; i; ) {
6190
+ this.removeEventListener( toBind[--i], handler, false );
6191
+ }
6192
+ } else {
6193
+ this.onmousewheel = null;
6194
+ }
6195
+ // Clean up the data we added to the element
6196
+ $.removeData(this, 'mousewheel-line-height');
6197
+ $.removeData(this, 'mousewheel-page-height');
6198
+ },
6199
+
6200
+ getLineHeight: function(elem) {
6201
+ var $elem = $(elem),
6202
+ $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent']();
6203
+ if (!$parent.length) {
6204
+ $parent = $('body');
6205
+ }
6206
+ return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16;
6207
+ },
6208
+
6209
+ getPageHeight: function(elem) {
6210
+ return $(elem).height();
6211
+ },
6212
+
6213
+ settings: {
6214
+ adjustOldDeltas: true, // see shouldAdjustOldDeltas() below
6215
+ normalizeOffset: true // calls getBoundingClientRect for each event
6216
+ }
6217
+ };
6218
+
6219
+ $.fn.extend({
6220
+ mousewheel: function(fn) {
6221
+ return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');
6222
+ },
6223
+
6224
+ unmousewheel: function(fn) {
6225
+ return this.unbind('mousewheel', fn);
6226
+ }
6227
+ });
6228
+
6229
+
6230
+ function handler(event) {
6231
+ var orgEvent = event || window.event,
6232
+ args = slice.call(arguments, 1),
6233
+ delta = 0,
6234
+ deltaX = 0,
6235
+ deltaY = 0,
6236
+ absDelta = 0,
6237
+ offsetX = 0,
6238
+ offsetY = 0;
6239
+ event = $.event.fix(orgEvent);
6240
+ event.type = 'mousewheel';
6241
+
6242
+ // Old school scrollwheel delta
6243
+ if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; }
6244
+ if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; }
6245
+ if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; }
6246
+ if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }
6247
+
6248
+ // Firefox < 17 horizontal scrolling related to DOMMouseScroll event
6249
+ if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {
6250
+ deltaX = deltaY * -1;
6251
+ deltaY = 0;
6252
+ }
6253
+
6254
+ // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy
6255
+ delta = deltaY === 0 ? deltaX : deltaY;
6256
+
6257
+ // New school wheel delta (wheel event)
6258
+ if ( 'deltaY' in orgEvent ) {
6259
+ deltaY = orgEvent.deltaY * -1;
6260
+ delta = deltaY;
6261
+ }
6262
+ if ( 'deltaX' in orgEvent ) {
6263
+ deltaX = orgEvent.deltaX;
6264
+ if ( deltaY === 0 ) { delta = deltaX * -1; }
6265
+ }
6266
+
6267
+ // No change actually happened, no reason to go any further
6268
+ if ( deltaY === 0 && deltaX === 0 ) { return; }
6269
+
6270
+ // Need to convert lines and pages to pixels if we aren't already in pixels
6271
+ // There are three delta modes:
6272
+ // * deltaMode 0 is by pixels, nothing to do
6273
+ // * deltaMode 1 is by lines
6274
+ // * deltaMode 2 is by pages
6275
+ if ( orgEvent.deltaMode === 1 ) {
6276
+ var lineHeight = $.data(this, 'mousewheel-line-height');
6277
+ delta *= lineHeight;
6278
+ deltaY *= lineHeight;
6279
+ deltaX *= lineHeight;
6280
+ } else if ( orgEvent.deltaMode === 2 ) {
6281
+ var pageHeight = $.data(this, 'mousewheel-page-height');
6282
+ delta *= pageHeight;
6283
+ deltaY *= pageHeight;
6284
+ deltaX *= pageHeight;
6285
+ }
6286
+
6287
+ // Store lowest absolute delta to normalize the delta values
6288
+ absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );
6289
+
6290
+ if ( !lowestDelta || absDelta < lowestDelta ) {
6291
+ lowestDelta = absDelta;
6292
+
6293
+ // Adjust older deltas if necessary
6294
+ if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
6295
+ lowestDelta /= 40;
6296
+ }
6297
+ }
6298
+
6299
+ // Adjust older deltas if necessary
6300
+ if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {
6301
+ // Divide all the things by 40!
6302
+ delta /= 40;
6303
+ deltaX /= 40;
6304
+ deltaY /= 40;
6305
+ }
6306
+
6307
+ // Get a whole, normalized value for the deltas
6308
+ delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta);
6309
+ deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);
6310
+ deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);
6311
+
6312
+ // Normalise offsetX and offsetY properties
6313
+ if ( special.settings.normalizeOffset && this.getBoundingClientRect ) {
6314
+ var boundingRect = this.getBoundingClientRect();
6315
+ offsetX = event.clientX - boundingRect.left;
6316
+ offsetY = event.clientY - boundingRect.top;
6317
+ }
6318
+
6319
+ // Add information to the event object
6320
+ event.deltaX = deltaX;
6321
+ event.deltaY = deltaY;
6322
+ event.deltaFactor = lowestDelta;
6323
+ event.offsetX = offsetX;
6324
+ event.offsetY = offsetY;
6325
+ // Go ahead and set deltaMode to 0 since we converted to pixels
6326
+ // Although this is a little odd since we overwrite the deltaX/Y
6327
+ // properties with normalized deltas.
6328
+ event.deltaMode = 0;
6329
+
6330
+ // Add event and delta to the front of the arguments
6331
+ args.unshift(event, delta, deltaX, deltaY);
6332
+
6333
+ // Clearout lowestDelta after sometime to better
6334
+ // handle multiple device types that give different
6335
+ // a different lowestDelta
6336
+ // Ex: trackpad = 3 and mouse wheel = 120
6337
+ if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }
6338
+ nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);
6339
+
6340
+ return ($.event.dispatch || $.event.handle).apply(this, args);
6341
+ }
6342
+
6343
+ function nullLowestDelta() {
6344
+ lowestDelta = null;
6345
+ }
6346
+
6347
+ function shouldAdjustOldDeltas(orgEvent, absDelta) {
6348
+ // If this is an older event and the delta is divisable by 120,
6349
+ // then we are assuming that the browser is treating this as an
6350
+ // older mouse wheel event and that we should divide the deltas
6351
+ // by 40 to try and get a more usable deltaFactor.
6352
+ // Side note, this actually impacts the reported scroll distance
6353
+ // in older browsers and can cause scrolling to be slower than native.
6354
+ // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.
6355
+ return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;
6356
+ }
6357
+
6358
+ }));
6359
+
6360
+ S2.define('jquery.select2',[
6361
+ 'jquery',
6362
+ 'jquery-mousewheel',
6363
+
6364
+ './select2/core',
6365
+ './select2/defaults'
6366
+ ], function ($, _, Select2, Defaults) {
6367
+ if ($.fn.select2 == null) {
6368
+ // All methods that should return the element
6369
+ var thisMethods = ['open', 'close', 'destroy'];
6370
+
6371
+ $.fn.select2 = function (options) {
6372
+ options = options || {};
6373
+
6374
+ if (typeof options === 'object') {
6375
+ this.each(function () {
6376
+ var instanceOptions = $.extend(true, {}, options);
6377
+
6378
+ var instance = new Select2($(this), instanceOptions);
6379
+ });
6380
+
6381
+ return this;
6382
+ } else if (typeof options === 'string') {
6383
+ var ret;
6384
+ var args = Array.prototype.slice.call(arguments, 1);
6385
+
6386
+ this.each(function () {
6387
+ var instance = $(this).data('select2');
6388
+
6389
+ if (instance == null && window.console && console.error) {
6390
+ console.error(
6391
+ 'The select2(\'' + options + '\') method was called on an ' +
6392
+ 'element that is not using Select2.'
6393
+ );
6394
+ }
6395
+
6396
+ ret = instance[options].apply(instance, args);
6397
+ });
6398
+
6399
+ // Check if we should be returning `this`
6400
+ if ($.inArray(options, thisMethods) > -1) {
6401
+ return this;
6402
+ }
6403
+
6404
+ return ret;
6405
+ } else {
6406
+ throw new Error('Invalid arguments for Select2: ' + options);
6407
+ }
6408
+ };
6409
+ }
6410
+
6411
+ if ($.fn.select2.defaults == null) {
6412
+ $.fn.select2.defaults = Defaults;
6413
+ }
6414
+
6415
+ return Select2;
6416
+ });
6417
+
6418
+ // Return the AMD loader configuration so it can be used outside of this file
6419
+ return {
6420
+ define: S2.define,
6421
+ require: S2.require
6422
+ };
6423
+ }());
6424
+
6425
+ // Autoload the jQuery bindings
6426
+ // We know that all of the modules exist above this, so we're safe
6427
+ var select2 = S2.require('jquery.select2');
6428
+
6429
+ // Hold the AMD module references on the jQuery function that was just loaded
6430
+ // This allows Select2 to use the internal loader outside of this file, such
6431
+ // as in the language files.
6432
+ jQuery.fn.select2.amd = S2;
6433
+
6434
+ // Return the Select2 instance for anyone who is importing it.
6435
+ return select2;
6436
+ }));
ui/lib/select2/js/select2.full.min.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.prop("title",e.title||e.text),f.data("data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");
2
+ if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){var c=(this._lastTag,this.$element.find("option[data-select2-tag]"));c.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b),d=g.$element.find("option").filter(function(){return a(this).val()===c.id});if(!d.length){var e=g.option(c);e.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([e])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},a.prototype._handleSelectOnClose=function(a,b){if(b&&null!=b.originalSelect2Event){var c=b.originalSelect2Event;if("select"===c._type||"unselect"===c._type)return}var d=this.getHighlightedResults();if(!(d.length<1)){var e=d.data("data");null!=e.element&&e.element.selected||null==e.element&&e.selected||this.trigger("select",{data:e})}},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null;
3
+ },e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("select2/compat/utils",["jquery"],function(a){function b(b,c,d){var e,f,g=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0===this.indexOf("select2-")&&g.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&(f=d(this),null!=f&&g.push(f))})),b.attr("class",g.join(" "))}return{syncCssClasses:b}}),b.define("select2/compat/containerCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("containerCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptContainerCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("containerCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/dropdownCss",["jquery","./utils"],function(a,b){function c(a){return null}function d(){}return d.prototype.render=function(d){var e=d.call(this),f=this.options.get("dropdownCssClass")||"";a.isFunction(f)&&(f=f(this.$element));var g=this.options.get("adaptDropdownCssClass");if(g=g||c,-1!==f.indexOf(":all:")){f=f.replace(":all:","");var h=g;g=function(a){var b=h(a);return null!=b?b+" "+a:a}}var i=this.options.get("dropdownCss")||{};return a.isFunction(i)&&(i=i(this.$element)),b.syncCssClasses(e,this.$element,g),e.css(i),e.addClass(f),e},d}),b.define("select2/compat/initSelection",["jquery"],function(a){function b(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=c.get("initSelection"),this._isInitialized=!1,a.call(this,b,c)}return b.prototype.current=function(b,c){var d=this;return this._isInitialized?void b.call(this,c):void this.initSelection.call(null,this.$element,function(b){d._isInitialized=!0,a.isArray(b)||(b=[b]),c(b)})},b}),b.define("select2/compat/inputData",["jquery"],function(a){function b(a,b,c){this._currentData=[],this._valueSeparator=c.get("valueSeparator")||",","hidden"===b.prop("type")&&c.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `<select>` element instead."),a.call(this,b,c)}return b.prototype.current=function(b,c){function d(b,c){var e=[];return b.selected||-1!==a.inArray(b.id,c)?(b.selected=!0,e.push(b)):b.selected=!1,b.children&&e.push.apply(e,d(b.children,c)),e}for(var e=[],f=0;f<this._currentData.length;f++){var g=this._currentData[f];e.push.apply(e,d(g,this.$element.val().split(this._valueSeparator)))}c(e)},b.prototype.select=function(b,c){if(this.options.get("multiple")){var d=this.$element.val();d+=this._valueSeparator+c.id,this.$element.val(d),this.$element.trigger("change")}else this.current(function(b){a.map(b,function(a){a.selected=!1})}),this.$element.val(c.id),this.$element.trigger("change")},b.prototype.unselect=function(a,b){var c=this;b.selected=!1,this.current(function(a){for(var d=[],e=0;e<a.length;e++){var f=a[e];b.id!=f.id&&d.push(f.id)}c.$element.val(d.join(c._valueSeparator)),c.$element.trigger("change")})},b.prototype.query=function(a,b,c){for(var d=[],e=0;e<this._currentData.length;e++){var f=this._currentData[e],g=this.matches(b,f);null!==g&&d.push(g)}c({results:d})},b.prototype.addOptions=function(b,c){var d=a.map(c,function(b){return a.data(b[0],"data")});this._currentData.push.apply(this._currentData,d)},b}),b.define("select2/compat/matcher",["jquery"],function(a){function b(b){function c(c,d){var e=a.extend(!0,{},d);if(null==c.term||""===a.trim(c.term))return e;if(d.children){for(var f=d.children.length-1;f>=0;f--){var g=d.children[f],h=b(c.term,g.text,g);h||e.children.splice(f,1)}if(e.children.length>0)return e}return b(c.term,d.text,d)?e:null}return c}return b}),b.define("select2/compat/query",[],function(){function a(a,b,c){c.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `query` option has been deprecated in favor of a custom data adapter that overrides the `query` method. Support will be removed for the `query` option in future versions of Select2."),a.call(this,b,c)}return a.prototype.query=function(a,b,c){b.callback=c;var d=this.options.get("query");d.call(null,b)},a}),b.define("select2/dropdown/attachContainer",[],function(){function a(a,b,c){a.call(this,b,c)}return a.prototype.position=function(a,b,c){var d=c.find(".dropdown-wrapper");d.append(b),b.addClass("select2-dropdown--below"),c.addClass("select2-container--below")},a}),b.define("select2/dropdown/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$dropdown.on(d.join(" "),function(a){a.stopPropagation()})},a}),b.define("select2/selection/stopPropagation",[],function(){function a(){}return a.prototype.bind=function(a,b,c){a.call(this,b,c);var d=["blur","change","click","dblclick","focus","focusin","focusout","input","keydown","keyup","keypress","mousedown","mouseenter","mouseleave","mousemove","mouseover","mouseup","search","touchend","touchstart"];this.$selection.on(d.join(" "),function(a){a.stopPropagation()})},a}),function(c){"function"==typeof b.define&&b.define.amd?b.define("jquery-mousewheel",["jquery"],c):"object"==typeof exports?module.exports=c:c(a)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
ui/lib/select2/js/select2.js ADDED
@@ -0,0 +1,5725 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * Select2 4.0.3
3
+ * https://select2.github.io
4
+ *
5
+ * Released under the MIT license
6
+ * https://github.com/select2/select2/blob/master/LICENSE.md
7
+ */
8
+ (function (factory) {
9
+ if (typeof define === 'function' && define.amd) {
10
+ // AMD. Register as an anonymous module.
11
+ define(['jquery'], factory);
12
+ } else if (typeof exports === 'object') {
13
+ // Node/CommonJS
14
+ factory(require('jquery'));
15
+ } else {
16
+ // Browser globals
17
+ factory(jQuery);
18
+ }
19
+ }(function (jQuery) {
20
+ // This is needed so we can catch the AMD loader configuration and use it
21
+ // The inner file should be wrapped (by `banner.start.js`) in a function that
22
+ // returns the AMD loader references.
23
+ var S2 =
24
+ (function () {
25
+ // Restore the Select2 AMD loader so it can be used
26
+ // Needed mostly in the language files, where the loader is not inserted
27
+ if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) {
28
+ var S2 = jQuery.fn.select2.amd;
29
+ }
30
+ var S2;(function () { if (!S2 || !S2.requirejs) {
31
+ if (!S2) { S2 = {}; } else { require = S2; }
32
+ /**
33
+ * @license almond 0.3.1 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved.
34
+ * Available via the MIT or new BSD license.
35
+ * see: http://github.com/jrburke/almond for details
36
+ */
37
+ //Going sloppy to avoid 'use strict' string cost, but strict practices should
38
+ //be followed.
39
+ /*jslint sloppy: true */
40
+ /*global setTimeout: false */
41
+
42
+ var requirejs, require, define;
43
+ (function (undef) {
44
+ var main, req, makeMap, handlers,
45
+ defined = {},
46
+ waiting = {},
47
+ config = {},
48
+ defining = {},
49
+ hasOwn = Object.prototype.hasOwnProperty,
50
+ aps = [].slice,
51
+ jsSuffixRegExp = /\.js$/;
52
+
53
+ function hasProp(obj, prop) {
54
+ return hasOwn.call(obj, prop);
55
+ }
56
+
57
+ /**
58
+ * Given a relative module name, like ./something, normalize it to
59
+ * a real name that can be mapped to a path.
60
+ * @param {String} name the relative name
61
+ * @param {String} baseName a real name that the name arg is relative
62
+ * to.
63
+ * @returns {String} normalized name
64
+ */
65
+ function normalize(name, baseName) {
66
+ var nameParts, nameSegment, mapValue, foundMap, lastIndex,
67
+ foundI, foundStarMap, starI, i, j, part,
68
+ baseParts = baseName && baseName.split("/"),
69
+ map = config.map,
70
+ starMap = (map && map['*']) || {};
71
+
72
+ //Adjust any relative paths.
73
+ if (name && name.charAt(0) === ".") {
74
+ //If have a base name, try to normalize against it,
75
+ //otherwise, assume it is a top-level require that will
76
+ //be relative to baseUrl in the end.
77
+ if (baseName) {
78
+ name = name.split('/');
79
+ lastIndex = name.length - 1;
80
+
81
+ // Node .js allowance:
82
+ if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) {
83
+ name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, '');
84
+ }
85
+
86
+ //Lop off the last part of baseParts, so that . matches the
87
+ //"directory" and not name of the baseName's module. For instance,
88
+ //baseName of "one/two/three", maps to "one/two/three.js", but we
89
+ //want the directory, "one/two" for this normalization.
90
+ name = baseParts.slice(0, baseParts.length - 1).concat(name);
91
+
92
+ //start trimDots
93
+ for (i = 0; i < name.length; i += 1) {
94
+ part = name[i];
95
+ if (part === ".") {
96
+ name.splice(i, 1);
97
+ i -= 1;
98
+ } else if (part === "..") {
99
+ if (i === 1 && (name[2] === '..' || name[0] === '..')) {
100
+ //End of the line. Keep at least one non-dot
101
+ //path segment at the front so it can be mapped
102
+ //correctly to disk. Otherwise, there is likely
103
+ //no path mapping for a path starting with '..'.
104
+ //This can still fail, but catches the most reasonable
105
+ //uses of ..
106
+ break;
107
+ } else if (i > 0) {
108
+ name.splice(i - 1, 2);
109
+ i -= 2;
110
+ }
111
+ }
112
+ }
113
+ //end trimDots
114
+
115
+ name = name.join("/");
116
+ } else if (name.indexOf('./') === 0) {
117
+ // No baseName, so this is ID is resolved relative
118
+ // to baseUrl, pull off the leading dot.
119
+ name = name.substring(2);
120
+ }
121
+ }
122
+
123
+ //Apply map config if available.
124
+ if ((baseParts || starMap) && map) {
125
+ nameParts = name.split('/');
126
+
127
+ for (i = nameParts.length; i > 0; i -= 1) {
128
+ nameSegment = nameParts.slice(0, i).join("/");
129
+
130
+ if (baseParts) {
131
+ //Find the longest baseName segment match in the config.
132
+ //So, do joins on the biggest to smallest lengths of baseParts.
133
+ for (j = baseParts.length; j > 0; j -= 1) {
134
+ mapValue = map[baseParts.slice(0, j).join('/')];
135
+
136
+ //baseName segment has config, find if it has one for
137
+ //this name.
138
+ if (mapValue) {
139
+ mapValue = mapValue[nameSegment];
140
+ if (mapValue) {
141
+ //Match, update name to the new value.
142
+ foundMap = mapValue;
143
+ foundI = i;
144
+ break;
145
+ }
146
+ }
147
+ }
148
+ }
149
+
150
+ if (foundMap) {
151
+ break;
152
+ }
153
+
154
+ //Check for a star map match, but just hold on to it,
155
+ //if there is a shorter segment match later in a matching
156
+ //config, then favor over this star map.
157
+ if (!foundStarMap && starMap && starMap[nameSegment]) {
158
+ foundStarMap = starMap[nameSegment];
159
+ starI = i;
160
+ }
161
+ }
162
+
163
+ if (!foundMap && foundStarMap) {
164
+ foundMap = foundStarMap;
165
+ foundI = starI;
166
+ }
167
+
168
+ if (foundMap) {
169
+ nameParts.splice(0, foundI, foundMap);
170
+ name = nameParts.join('/');
171
+ }
172
+ }
173
+
174
+ return name;
175
+ }
176
+
177
+ function makeRequire(relName, forceSync) {
178
+ return function () {
179
+ //A version of a require function that passes a moduleName
180
+ //value for items that may need to
181
+ //look up paths relative to the moduleName
182
+ var args = aps.call(arguments, 0);
183
+
184
+ //If first arg is not require('string'), and there is only
185
+ //one arg, it is the array form without a callback. Insert
186
+ //a null so that the following concat is correct.
187
+ if (typeof args[0] !== 'string' && args.length === 1) {
188
+ args.push(null);
189
+ }
190
+ return req.apply(undef, args.concat([relName, forceSync]));
191
+ };
192
+ }
193
+
194
+ function makeNormalize(relName) {
195
+ return function (name) {
196
+ return normalize(name, relName);
197
+ };
198
+ }
199
+
200
+ function makeLoad(depName) {
201
+ return function (value) {
202
+ defined[depName] = value;
203
+ };
204
+ }
205
+
206
+ function callDep(name) {
207
+ if (hasProp(waiting, name)) {
208
+ var args = waiting[name];
209
+ delete waiting[name];
210
+ defining[name] = true;
211
+ main.apply(undef, args);
212
+ }
213
+
214
+ if (!hasProp(defined, name) && !hasProp(defining, name)) {
215
+ throw new Error('No ' + name);
216
+ }
217
+ return defined[name];
218
+ }
219
+
220
+ //Turns a plugin!resource to [plugin, resource]
221
+ //with the plugin being undefined if the name
222
+ //did not have a plugin prefix.
223
+ function splitPrefix(name) {
224
+ var prefix,
225
+ index = name ? name.indexOf('!') : -1;
226
+ if (index > -1) {
227
+ prefix = name.substring(0, index);
228
+ name = name.substring(index + 1, name.length);
229
+ }
230
+ return [prefix, name];
231
+ }
232
+
233
+ /**
234
+ * Makes a name map, normalizing the name, and using a plugin
235
+ * for normalization if necessary. Grabs a ref to plugin
236
+ * too, as an optimization.
237
+ */
238
+ makeMap = function (name, relName) {
239
+ var plugin,
240
+ parts = splitPrefix(name),
241
+ prefix = parts[0];
242
+
243
+ name = parts[1];
244
+
245
+ if (prefix) {
246
+ prefix = normalize(prefix, relName);
247
+ plugin = callDep(prefix);
248
+ }
249
+
250
+ //Normalize according
251
+ if (prefix) {
252
+ if (plugin && plugin.normalize) {
253
+ name = plugin.normalize(name, makeNormalize(relName));
254
+ } else {
255
+ name = normalize(name, relName);
256
+ }
257
+ } else {
258
+ name = normalize(name, relName);
259
+ parts = splitPrefix(name);
260
+ prefix = parts[0];
261
+ name = parts[1];
262
+ if (prefix) {
263
+ plugin = callDep(prefix);
264
+ }
265
+ }
266
+
267
+ //Using ridiculous property names for space reasons
268
+ return {
269
+ f: prefix ? prefix + '!' + name : name, //fullName
270
+ n: name,
271
+ pr: prefix,
272
+ p: plugin
273
+ };
274
+ };
275
+
276
+ function makeConfig(name) {
277
+ return function () {
278
+ return (config && config.config && config.config[name]) || {};
279
+ };
280
+ }
281
+
282
+ handlers = {
283
+ require: function (name) {
284
+ return makeRequire(name);
285
+ },
286
+ exports: function (name) {
287
+ var e = defined[name];
288
+ if (typeof e !== 'undefined') {
289
+ return e;
290
+ } else {
291
+ return (defined[name] = {});
292
+ }
293
+ },
294
+ module: function (name) {
295
+ return {
296
+ id: name,
297
+ uri: '',
298
+ exports: defined[name],
299
+ config: makeConfig(name)
300
+ };
301
+ }
302
+ };
303
+
304
+ main = function (name, deps, callback, relName) {
305
+ var cjsModule, depName, ret, map, i,
306
+ args = [],
307
+ callbackType = typeof callback,
308
+ usingExports;
309
+
310
+ //Use name if no relName
311
+ relName = relName || name;
312
+
313
+ //Call the callback to define the module, if necessary.
314
+ if (callbackType === 'undefined' || callbackType === 'function') {
315
+ //Pull out the defined dependencies and pass the ordered
316
+ //values to the callback.
317
+ //Default to [require, exports, module] if no deps
318
+ deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps;
319
+ for (i = 0; i < deps.length; i += 1) {
320
+ map = makeMap(deps[i], relName);
321
+ depName = map.f;
322
+
323
+ //Fast path CommonJS standard dependencies.
324
+ if (depName === "require") {
325
+ args[i] = handlers.require(name);
326
+ } else if (depName === "exports") {
327
+ //CommonJS module spec 1.1
328
+ args[i] = handlers.exports(name);
329
+ usingExports = true;
330
+ } else if (depName === "module") {
331
+ //CommonJS module spec 1.1
332
+ cjsModule = args[i] = handlers.module(name);
333
+ } else if (hasProp(defined, depName) ||
334
+ hasProp(waiting, depName) ||
335
+ hasProp(defining, depName)) {
336
+ args[i] = callDep(depName);
337
+ } else if (map.p) {
338
+ map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {});
339
+ args[i] = defined[depName];
340
+ } else {
341
+ throw new Error(name + ' missing ' + depName);
342
+ }
343
+ }
344
+
345
+ ret = callback ? callback.apply(defined[name], args) : undefined;
346
+
347
+ if (name) {
348
+ //If setting exports via "module" is in play,
349
+ //favor that over return value and exports. After that,
350
+ //favor a non-undefined return value over exports use.
351
+ if (cjsModule && cjsModule.exports !== undef &&
352
+ cjsModule.exports !== defined[name]) {
353
+ defined[name] = cjsModule.exports;
354
+ } else if (ret !== undef || !usingExports) {
355
+ //Use the return value from the function.
356
+ defined[name] = ret;
357
+ }
358
+ }
359
+ } else if (name) {
360
+ //May just be an object definition for the module. Only
361
+ //worry about defining if have a module name.
362
+ defined[name] = callback;
363
+ }
364
+ };
365
+
366
+ requirejs = require = req = function (deps, callback, relName, forceSync, alt) {
367
+ if (typeof deps === "string") {
368
+ if (handlers[deps]) {
369
+ //callback in this case is really relName
370
+ return handlers[deps](callback);
371
+ }
372
+ //Just return the module wanted. In this scenario, the
373
+ //deps arg is the module name, and second arg (if passed)
374
+ //is just the relName.
375
+ //Normalize module name, if it contains . or ..
376
+ return callDep(makeMap(deps, callback).f);
377
+ } else if (!deps.splice) {
378
+ //deps is a config object, not an array.
379
+ config = deps;
380
+ if (config.deps) {
381
+ req(config.deps, config.callback);
382
+ }
383
+ if (!callback) {
384
+ return;
385
+ }
386
+
387
+ if (callback.splice) {
388
+ //callback is an array, which means it is a dependency list.
389
+ //Adjust args if there are dependencies
390
+ deps = callback;
391
+ callback = relName;
392
+ relName = null;
393
+ } else {
394
+ deps = undef;
395
+ }
396
+ }
397
+
398
+ //Support require(['a'])
399
+ callback = callback || function () {};
400
+
401
+ //If relName is a function, it is an errback handler,
402
+ //so remove it.
403
+ if (typeof relName === 'function') {
404
+ relName = forceSync;
405
+ forceSync = alt;
406
+ }
407
+
408
+ //Simulate async callback;
409
+ if (forceSync) {
410
+ main(undef, deps, callback, relName);
411
+ } else {
412
+ //Using a non-zero value because of concern for what old browsers
413
+ //do, and latest browsers "upgrade" to 4 if lower value is used:
414
+ //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout:
415
+ //If want a value immediately, use require('id') instead -- something
416
+ //that works in almond on the global level, but not guaranteed and
417
+ //unlikely to work in other AMD implementations.
418
+ setTimeout(function () {
419
+ main(undef, deps, callback, relName);
420
+ }, 4);
421
+ }
422
+
423
+ return req;
424
+ };
425
+
426
+ /**
427
+ * Just drops the config on the floor, but returns req in case
428
+ * the config return value is used.
429
+ */
430
+ req.config = function (cfg) {
431
+ return req(cfg);
432
+ };
433
+
434
+ /**
435
+ * Expose module registry for debugging and tooling
436
+ */
437
+ requirejs._defined = defined;
438
+
439
+ define = function (name, deps, callback) {
440
+ if (typeof name !== 'string') {
441
+ throw new Error('See almond README: incorrect module build, no module name');
442
+ }
443
+
444
+ //This module may not have dependencies
445
+ if (!deps.splice) {
446
+ //deps is not an array, so probably means
447
+ //an object literal or factory function for
448
+ //the value. Adjust args.
449
+ callback = deps;
450
+ deps = [];
451
+ }
452
+
453
+ if (!hasProp(defined, name) && !hasProp(waiting, name)) {
454
+ waiting[name] = [name, deps, callback];
455
+ }
456
+ };
457
+
458
+ define.amd = {
459
+ jQuery: true
460
+ };
461
+ }());
462
+
463
+ S2.requirejs = requirejs;S2.require = require;S2.define = define;
464
+ }
465
+ }());
466
+ S2.define("almond", function(){});
467
+
468
+ /* global jQuery:false, $:false */
469
+ S2.define('jquery',[],function () {
470
+ var _$ = jQuery || $;
471
+
472
+ if (_$ == null && console && console.error) {
473
+ console.error(
474
+ 'Select2: An instance of jQuery or a jQuery-compatible library was not ' +
475
+ 'found. Make sure that you are including jQuery before Select2 on your ' +
476
+ 'web page.'
477
+ );
478
+ }
479
+
480
+ return _$;
481
+ });
482
+
483
+ S2.define('select2/utils',[
484
+ 'jquery'
485
+ ], function ($) {
486
+ var Utils = {};
487
+
488
+ Utils.Extend = function (ChildClass, SuperClass) {
489
+ var __hasProp = {}.hasOwnProperty;
490
+
491
+ function BaseConstructor () {
492
+ this.constructor = ChildClass;
493
+ }
494
+
495
+ for (var key in SuperClass) {
496
+ if (__hasProp.call(SuperClass, key)) {
497
+ ChildClass[key] = SuperClass[key];
498
+ }
499
+ }
500
+
501
+ BaseConstructor.prototype = SuperClass.prototype;
502
+ ChildClass.prototype = new BaseConstructor();
503
+ ChildClass.__super__ = SuperClass.prototype;
504
+
505
+ return ChildClass;
506
+ };
507
+
508
+ function getMethods (theClass) {
509
+ var proto = theClass.prototype;
510
+
511
+ var methods = [];
512
+
513
+ for (var methodName in proto) {
514
+ var m = proto[methodName];
515
+
516
+ if (typeof m !== 'function') {
517
+ continue;
518
+ }
519
+
520
+ if (methodName === 'constructor') {
521
+ continue;
522
+ }
523
+
524
+ methods.push(methodName);
525
+ }
526
+
527
+ return methods;
528
+ }
529
+
530
+ Utils.Decorate = function (SuperClass, DecoratorClass) {
531
+ var decoratedMethods = getMethods(DecoratorClass);
532
+ var superMethods = getMethods(SuperClass);
533
+
534
+ function DecoratedClass () {
535
+ var unshift = Array.prototype.unshift;
536
+
537
+ var argCount = DecoratorClass.prototype.constructor.length;
538
+
539
+ var calledConstructor = SuperClass.prototype.constructor;
540
+
541
+ if (argCount > 0) {
542
+ unshift.call(arguments, SuperClass.prototype.constructor);
543
+
544
+ calledConstructor = DecoratorClass.prototype.constructor;
545
+ }
546
+
547
+ calledConstructor.apply(this, arguments);
548
+ }
549
+
550
+ DecoratorClass.displayName = SuperClass.displayName;
551
+
552
+ function ctr () {
553
+ this.constructor = DecoratedClass;
554
+ }
555
+
556
+ DecoratedClass.prototype = new ctr();
557
+
558
+ for (var m = 0; m < superMethods.length; m++) {
559
+ var superMethod = superMethods[m];
560
+
561
+ DecoratedClass.prototype[superMethod] =
562
+ SuperClass.prototype[superMethod];
563
+ }
564
+
565
+ var calledMethod = function (methodName) {
566
+ // Stub out the original method if it's not decorating an actual method
567
+ var originalMethod = function () {};
568
+
569
+ if (methodName in DecoratedClass.prototype) {
570
+ originalMethod = DecoratedClass.prototype[methodName];
571
+ }
572
+
573
+ var decoratedMethod = DecoratorClass.prototype[methodName];
574
+
575
+ return function () {
576
+ var unshift = Array.prototype.unshift;
577
+
578
+ unshift.call(arguments, originalMethod);
579
+
580
+ return decoratedMethod.apply(this, arguments);
581
+ };
582
+ };
583
+
584
+ for (var d = 0; d < decoratedMethods.length; d++) {
585
+ var decoratedMethod = decoratedMethods[d];
586
+
587
+ DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod);
588
+ }
589
+
590
+ return DecoratedClass;
591
+ };
592
+
593
+ var Observable = function () {
594
+ this.listeners = {};
595
+ };
596
+
597
+ Observable.prototype.on = function (event, callback) {
598
+ this.listeners = this.listeners || {};
599
+
600
+ if (event in this.listeners) {
601
+ this.listeners[event].push(callback);
602
+ } else {
603
+ this.listeners[event] = [callback];
604
+ }
605
+ };
606
+
607
+ Observable.prototype.trigger = function (event) {
608
+ var slice = Array.prototype.slice;
609
+ var params = slice.call(arguments, 1);
610
+
611
+ this.listeners = this.listeners || {};
612
+
613
+ // Params should always come in as an array
614
+ if (params == null) {
615
+ params = [];
616
+ }
617
+
618
+ // If there are no arguments to the event, use a temporary object
619
+ if (params.length === 0) {
620
+ params.push({});
621
+ }
622
+
623
+ // Set the `_type` of the first object to the event
624
+ params[0]._type = event;
625
+
626
+ if (event in this.listeners) {
627
+ this.invoke(this.listeners[event], slice.call(arguments, 1));
628
+ }
629
+
630
+ if ('*' in this.listeners) {
631
+ this.invoke(this.listeners['*'], arguments);
632
+ }
633
+ };
634
+
635
+ Observable.prototype.invoke = function (listeners, params) {
636
+ for (var i = 0, len = listeners.length; i < len; i++) {
637
+ listeners[i].apply(this, params);
638
+ }
639
+ };
640
+
641
+ Utils.Observable = Observable;
642
+
643
+ Utils.generateChars = function (length) {
644
+ var chars = '';
645
+
646
+ for (var i = 0; i < length; i++) {
647
+ var randomChar = Math.floor(Math.random() * 36);
648
+ chars += randomChar.toString(36);
649
+ }
650
+
651
+ return chars;
652
+ };
653
+
654
+ Utils.bind = function (func, context) {
655
+ return function () {
656
+ func.apply(context, arguments);
657
+ };
658
+ };
659
+
660
+ Utils._convertData = function (data) {
661
+ for (var originalKey in data) {
662
+ var keys = originalKey.split('-');
663
+
664
+ var dataLevel = data;
665
+
666
+ if (keys.length === 1) {
667
+ continue;
668
+ }
669
+
670
+ for (var k = 0; k < keys.length; k++) {
671
+ var key = keys[k];
672
+
673
+ // Lowercase the first letter
674
+ // By default, dash-separated becomes camelCase
675
+ key = key.substring(0, 1).toLowerCase() + key.substring(1);
676
+
677
+ if (!(key in dataLevel)) {
678
+ dataLevel[key] = {};
679
+ }
680
+
681
+ if (k == keys.length - 1) {
682
+ dataLevel[key] = data[originalKey];
683
+ }
684
+
685
+ dataLevel = dataLevel[key];
686
+ }
687
+
688
+ delete data[originalKey];
689
+ }
690
+
691
+ return data;
692
+ };
693
+
694
+ Utils.hasScroll = function (index, el) {
695
+ // Adapted from the function created by @ShadowScripter
696
+ // and adapted by @BillBarry on the Stack Exchange Code Review website.
697
+ // The original code can be found at
698
+ // http://codereview.stackexchange.com/q/13338
699
+ // and was designed to be used with the Sizzle selector engine.
700
+
701
+ var $el = $(el);
702
+ var overflowX = el.style.overflowX;
703
+ var overflowY = el.style.overflowY;
704
+
705
+ //Check both x and y declarations
706
+ if (overflowX === overflowY &&
707
+ (overflowY === 'hidden' || overflowY === 'visible')) {
708
+ return false;
709
+ }
710
+
711
+ if (overflowX === 'scroll' || overflowY === 'scroll') {
712
+ return true;
713
+ }
714
+
715
+ return ($el.innerHeight() < el.scrollHeight ||
716
+ $el.innerWidth() < el.scrollWidth);
717
+ };
718
+
719
+ Utils.escapeMarkup = function (markup) {
720
+ var replaceMap = {
721
+ '\\': '&#92;',
722
+ '&': '&amp;',
723
+ '<': '&lt;',
724
+ '>': '&gt;',
725
+ '"': '&quot;',
726
+ '\'': '&#39;',
727
+ '/': '&#47;'
728
+ };
729
+
730
+ // Do not try to escape the markup if it's not a string
731
+ if (typeof markup !== 'string') {
732
+ return markup;
733
+ }
734
+
735
+ return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
736
+ return replaceMap[match];
737
+ });
738
+ };
739
+
740
+ // Append an array of jQuery nodes to a given element.
741
+ Utils.appendMany = function ($element, $nodes) {
742
+ // jQuery 1.7.x does not support $.fn.append() with an array
743
+ // Fall back to a jQuery object collection using $.fn.add()
744
+ if ($.fn.jquery.substr(0, 3) === '1.7') {
745
+ var $jqNodes = $();
746
+
747
+ $.map($nodes, function (node) {
748
+ $jqNodes = $jqNodes.add(node);
749
+ });
750
+
751
+ $nodes = $jqNodes;
752
+ }
753
+
754
+ $element.append($nodes);
755
+ };
756
+
757
+ return Utils;
758
+ });
759
+
760
+ S2.define('select2/results',[
761
+ 'jquery',
762
+ './utils'
763
+ ], function ($, Utils) {
764
+ function Results ($element, options, dataAdapter) {
765
+ this.$element = $element;
766
+ this.data = dataAdapter;
767
+ this.options = options;
768
+
769
+ Results.__super__.constructor.call(this);
770
+ }
771
+
772
+ Utils.Extend(Results, Utils.Observable);
773
+
774
+ Results.prototype.render = function () {
775
+ var $results = $(
776
+ '<ul class="select2-results__options" role="tree"></ul>'
777
+ );
778
+
779
+ if (this.options.get('multiple')) {
780
+ $results.attr('aria-multiselectable', 'true');
781
+ }
782
+
783
+ this.$results = $results;
784
+
785
+ return $results;
786
+ };
787
+
788
+ Results.prototype.clear = function () {
789
+ this.$results.empty();
790
+ };
791
+
792
+ Results.prototype.displayMessage = function (params) {
793
+ var escapeMarkup = this.options.get('escapeMarkup');
794
+
795
+ this.clear();
796
+ this.hideLoading();
797
+
798
+ var $message = $(
799
+ '<li role="treeitem" aria-live="assertive"' +
800
+ ' class="select2-results__option"></li>'
801
+ );
802
+
803
+ var message = this.options.get('translations').get(params.message);
804
+
805
+ $message.append(
806
+ escapeMarkup(
807
+ message(params.args)
808
+ )
809
+ );
810
+
811
+ $message[0].className += ' select2-results__message';
812
+
813
+ this.$results.append($message);
814
+ };
815
+
816
+ Results.prototype.hideMessages = function () {
817
+ this.$results.find('.select2-results__message').remove();
818
+ };
819
+
820
+ Results.prototype.append = function (data) {
821
+ this.hideLoading();
822
+
823
+ var $options = [];
824
+
825
+ if (data.results == null || data.results.length === 0) {
826
+ if (this.$results.children().length === 0) {
827
+ this.trigger('results:message', {
828
+ message: 'noResults'
829
+ });
830
+ }
831
+
832
+ return;
833
+ }
834
+
835
+ data.results = this.sort(data.results);
836
+
837
+ for (var d = 0; d < data.results.length; d++) {
838
+ var item = data.results[d];
839
+
840
+ var $option = this.option(item);
841
+
842
+ $options.push($option);
843
+ }
844
+
845
+ this.$results.append($options);
846
+ };
847
+
848
+ Results.prototype.position = function ($results, $dropdown) {
849
+ var $resultsContainer = $dropdown.find('.select2-results');
850
+ $resultsContainer.append($results);
851
+ };
852
+
853
+ Results.prototype.sort = function (data) {
854
+ var sorter = this.options.get('sorter');
855
+
856
+ return sorter(data);
857
+ };
858
+
859
+ Results.prototype.highlightFirstItem = function () {
860
+ var $options = this.$results
861
+ .find('.select2-results__option[aria-selected]');
862
+
863
+ var $selected = $options.filter('[aria-selected=true]');
864
+
865
+ // Check if there are any selected options
866
+ if ($selected.length > 0) {
867
+ // If there are selected options, highlight the first
868
+ $selected.first().trigger('mouseenter');
869
+ } else {
870
+ // If there are no selected options, highlight the first option
871
+ // in the dropdown
872
+ $options.first().trigger('mouseenter');
873
+ }
874
+
875
+ this.ensureHighlightVisible();
876
+ };
877
+
878
+ Results.prototype.setClasses = function () {
879
+ var self = this;
880
+
881
+ this.data.current(function (selected) {
882
+ var selectedIds = $.map(selected, function (s) {
883
+ return s.id.toString();
884
+ });
885
+
886
+ var $options = self.$results
887
+ .find('.select2-results__option[aria-selected]');
888
+
889
+ $options.each(function () {
890
+ var $option = $(this);
891
+
892
+ var item = $.data(this, 'data');
893
+
894
+ // id needs to be converted to a string when comparing
895
+ var id = '' + item.id;
896
+
897
+ if ((item.element != null && item.element.selected) ||
898
+ (item.element == null && $.inArray(id, selectedIds) > -1)) {
899
+ $option.attr('aria-selected', 'true');
900
+ } else {
901
+ $option.attr('aria-selected', 'false');
902
+ }
903
+ });
904
+
905
+ });
906
+ };
907
+
908
+ Results.prototype.showLoading = function (params) {
909
+ this.hideLoading();
910
+
911
+ var loadingMore = this.options.get('translations').get('searching');
912
+
913
+ var loading = {
914
+ disabled: true,
915
+ loading: true,
916
+ text: loadingMore(params)
917
+ };
918
+ var $loading = this.option(loading);
919
+ $loading.className += ' loading-results';
920
+
921
+ this.$results.prepend($loading);
922
+ };
923
+
924
+ Results.prototype.hideLoading = function () {
925
+ this.$results.find('.loading-results').remove();
926
+ };
927
+
928
+ Results.prototype.option = function (data) {
929
+ var option = document.createElement('li');
930
+ option.className = 'select2-results__option';
931
+
932
+ var attrs = {
933
+ 'role': 'treeitem',
934
+ 'aria-selected': 'false'
935
+ };
936
+
937
+ if (data.disabled) {
938
+ delete attrs['aria-selected'];
939
+ attrs['aria-disabled'] = 'true';
940
+ }
941
+
942
+ if (data.id == null) {
943
+ delete attrs['aria-selected'];
944
+ }
945
+
946
+ if (data._resultId != null) {
947
+ option.id = data._resultId;
948
+ }
949
+
950
+ if (data.title) {
951
+ option.title = data.title;
952
+ }
953
+
954
+ if (data.children) {
955
+ attrs.role = 'group';
956
+ attrs['aria-label'] = data.text;
957
+ delete attrs['aria-selected'];
958
+ }
959
+
960
+ for (var attr in attrs) {
961
+ var val = attrs[attr];
962
+
963
+ option.setAttribute(attr, val);
964
+ }
965
+
966
+ if (data.children) {
967
+ var $option = $(option);
968
+
969
+ var label = document.createElement('strong');
970
+ label.className = 'select2-results__group';
971
+
972
+ var $label = $(label);
973
+ this.template(data, label);
974
+
975
+ var $children = [];
976
+
977
+ for (var c = 0; c < data.children.length; c++) {
978
+ var child = data.children[c];
979
+
980
+ var $child = this.option(child);
981
+
982
+ $children.push($child);
983
+ }
984
+
985
+ var $childrenContainer = $('<ul></ul>', {
986
+ 'class': 'select2-results__options select2-results__options--nested'
987
+ });
988
+
989
+ $childrenContainer.append($children);
990
+
991
+ $option.append(label);
992
+ $option.append($childrenContainer);
993
+ } else {
994
+ this.template(data, option);
995
+ }
996
+
997
+ $.data(option, 'data', data);
998
+
999
+ return option;
1000
+ };
1001
+
1002
+ Results.prototype.bind = function (container, $container) {
1003
+ var self = this;
1004
+
1005
+ var id = container.id + '-results';
1006
+
1007
+ this.$results.attr('id', id);
1008
+
1009
+ container.on('results:all', function (params) {
1010
+ self.clear();
1011
+ self.append(params.data);
1012
+
1013
+ if (container.isOpen()) {
1014
+ self.setClasses();
1015
+ self.highlightFirstItem();
1016
+ }
1017
+ });
1018
+
1019
+ container.on('results:append', function (params) {
1020
+ self.append(params.data);
1021
+
1022
+ if (container.isOpen()) {
1023
+ self.setClasses();
1024
+ }
1025
+ });
1026
+
1027
+ container.on('query', function (params) {
1028
+ self.hideMessages();
1029
+ self.showLoading(params);
1030
+ });
1031
+
1032
+ container.on('select', function () {
1033
+ if (!container.isOpen()) {
1034
+ return;
1035
+ }
1036
+
1037
+ self.setClasses();
1038
+ self.highlightFirstItem();
1039
+ });
1040
+
1041
+ container.on('unselect', function () {
1042
+ if (!container.isOpen()) {
1043
+ return;
1044
+ }
1045
+
1046
+ self.setClasses();
1047
+ self.highlightFirstItem();
1048
+ });
1049
+
1050
+ container.on('open', function () {
1051
+ // When the dropdown is open, aria-expended="true"
1052
+ self.$results.attr('aria-expanded', 'true');
1053
+ self.$results.attr('aria-hidden', 'false');
1054
+
1055
+ self.setClasses();
1056
+ self.ensureHighlightVisible();
1057
+ });
1058
+
1059
+ container.on('close', function () {
1060
+ // When the dropdown is closed, aria-expended="false"
1061
+ self.$results.attr('aria-expanded', 'false');
1062
+ self.$results.attr('aria-hidden', 'true');
1063
+ self.$results.removeAttr('aria-activedescendant');
1064
+ });
1065
+
1066
+ container.on('results:toggle', function () {
1067
+ var $highlighted = self.getHighlightedResults();
1068
+
1069
+ if ($highlighted.length === 0) {
1070
+ return;
1071
+ }
1072
+
1073
+ $highlighted.trigger('mouseup');
1074
+ });
1075
+
1076
+ container.on('results:select', function () {
1077
+ var $highlighted = self.getHighlightedResults();
1078
+
1079
+ if ($highlighted.length === 0) {
1080
+ return;
1081
+ }
1082
+
1083
+ var data = $highlighted.data('data');
1084
+
1085
+ if ($highlighted.attr('aria-selected') == 'true') {
1086
+ self.trigger('close', {});
1087
+ } else {
1088
+ self.trigger('select', {
1089
+ data: data
1090
+ });
1091
+ }
1092
+ });
1093
+
1094
+ container.on('results:previous', function () {
1095
+ var $highlighted = self.getHighlightedResults();
1096
+
1097
+ var $options = self.$results.find('[aria-selected]');
1098
+
1099
+ var currentIndex = $options.index($highlighted);
1100
+
1101
+ // If we are already at te top, don't move further
1102
+ if (currentIndex === 0) {
1103
+ return;
1104
+ }
1105
+
1106
+ var nextIndex = currentIndex - 1;
1107
+
1108
+ // If none are highlighted, highlight the first
1109
+ if ($highlighted.length === 0) {
1110
+ nextIndex = 0;
1111
+ }
1112
+
1113
+ var $next = $options.eq(nextIndex);
1114
+
1115
+ $next.trigger('mouseenter');
1116
+
1117
+ var currentOffset = self.$results.offset().top;
1118
+ var nextTop = $next.offset().top;
1119
+ var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset);
1120
+
1121
+ if (nextIndex === 0) {
1122
+ self.$results.scrollTop(0);
1123
+ } else if (nextTop - currentOffset < 0) {
1124
+ self.$results.scrollTop(nextOffset);
1125
+ }
1126
+ });
1127
+
1128
+ container.on('results:next', function () {
1129
+ var $highlighted = self.getHighlightedResults();
1130
+
1131
+ var $options = self.$results.find('[aria-selected]');
1132
+
1133
+ var currentIndex = $options.index($highlighted);
1134
+
1135
+ var nextIndex = currentIndex + 1;
1136
+
1137
+ // If we are at the last option, stay there
1138
+ if (nextIndex >= $options.length) {
1139
+ return;
1140
+ }
1141
+
1142
+ var $next = $options.eq(nextIndex);
1143
+
1144
+ $next.trigger('mouseenter');
1145
+
1146
+ var currentOffset = self.$results.offset().top +
1147
+ self.$results.outerHeight(false);
1148
+ var nextBottom = $next.offset().top + $next.outerHeight(false);
1149
+ var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset;
1150
+
1151
+ if (nextIndex === 0) {
1152
+ self.$results.scrollTop(0);
1153
+ } else if (nextBottom > currentOffset) {
1154
+ self.$results.scrollTop(nextOffset);
1155
+ }
1156
+ });
1157
+
1158
+ container.on('results:focus', function (params) {
1159
+ params.element.addClass('select2-results__option--highlighted');
1160
+ });
1161
+
1162
+ container.on('results:message', function (params) {
1163
+ self.displayMessage(params);
1164
+ });
1165
+
1166
+ if ($.fn.mousewheel) {
1167
+ this.$results.on('mousewheel', function (e) {
1168
+ var top = self.$results.scrollTop();
1169
+
1170
+ var bottom = self.$results.get(0).scrollHeight - top + e.deltaY;
1171
+
1172
+ var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0;
1173
+ var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height();
1174
+
1175
+ if (isAtTop) {
1176
+ self.$results.scrollTop(0);
1177
+
1178
+ e.preventDefault();
1179
+ e.stopPropagation();
1180
+ } else if (isAtBottom) {
1181
+ self.$results.scrollTop(
1182
+ self.$results.get(0).scrollHeight - self.$results.height()
1183
+ );
1184
+
1185
+ e.preventDefault();
1186
+ e.stopPropagation();
1187
+ }
1188
+ });
1189
+ }
1190
+
1191
+ this.$results.on('mouseup', '.select2-results__option[aria-selected]',
1192
+ function (evt) {
1193
+ var $this = $(this);
1194
+
1195
+ var data = $this.data('data');
1196
+
1197
+ if ($this.attr('aria-selected') === 'true') {
1198
+ if (self.options.get('multiple')) {
1199
+ self.trigger('unselect', {
1200
+ originalEvent: evt,
1201
+ data: data
1202
+ });
1203
+ } else {
1204
+ self.trigger('close', {});
1205
+ }
1206
+
1207
+ return;
1208
+ }
1209
+
1210
+ self.trigger('select', {
1211
+ originalEvent: evt,
1212
+ data: data
1213
+ });
1214
+ });
1215
+
1216
+ this.$results.on('mouseenter', '.select2-results__option[aria-selected]',
1217
+ function (evt) {
1218
+ var data = $(this).data('data');
1219
+
1220
+ self.getHighlightedResults()
1221
+ .removeClass('select2-results__option--highlighted');
1222
+
1223
+ self.trigger('results:focus', {
1224
+ data: data,
1225
+ element: $(this)
1226
+ });
1227
+ });
1228
+ };
1229
+
1230
+ Results.prototype.getHighlightedResults = function () {
1231
+ var $highlighted = this.$results
1232
+ .find('.select2-results__option--highlighted');
1233
+
1234
+ return $highlighted;
1235
+ };
1236
+
1237
+ Results.prototype.destroy = function () {
1238
+ this.$results.remove();
1239
+ };
1240
+
1241
+ Results.prototype.ensureHighlightVisible = function () {
1242
+ var $highlighted = this.getHighlightedResults();
1243
+
1244
+ if ($highlighted.length === 0) {
1245
+ return;
1246
+ }
1247
+
1248
+ var $options = this.$results.find('[aria-selected]');
1249
+
1250
+ var currentIndex = $options.index($highlighted);
1251
+
1252
+ var currentOffset = this.$results.offset().top;
1253
+ var nextTop = $highlighted.offset().top;
1254
+ var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset);
1255
+
1256
+ var offsetDelta = nextTop - currentOffset;
1257
+ nextOffset -= $highlighted.outerHeight(false) * 2;
1258
+
1259
+ if (currentIndex <= 2) {
1260
+ this.$results.scrollTop(0);
1261
+ } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) {
1262
+ this.$results.scrollTop(nextOffset);
1263
+ }
1264
+ };
1265
+
1266
+ Results.prototype.template = function (result, container) {
1267
+ var template = this.options.get('templateResult');
1268
+ var escapeMarkup = this.options.get('escapeMarkup');
1269
+
1270
+ var content = template(result, container);
1271
+
1272
+ if (content == null) {
1273
+ container.style.display = 'none';
1274
+ } else if (typeof content === 'string') {
1275
+ container.innerHTML = escapeMarkup(content);
1276
+ } else {
1277
+ $(container).append(content);
1278
+ }
1279
+ };
1280
+
1281
+ return Results;
1282
+ });
1283
+
1284
+ S2.define('select2/keys',[
1285
+
1286
+ ], function () {
1287
+ var KEYS = {
1288
+ BACKSPACE: 8,
1289
+ TAB: 9,
1290
+ ENTER: 13,
1291
+ SHIFT: 16,
1292
+ CTRL: 17,
1293
+ ALT: 18,
1294
+ ESC: 27,
1295
+ SPACE: 32,
1296
+ PAGE_UP: 33,
1297
+ PAGE_DOWN: 34,
1298
+ END: 35,
1299
+ HOME: 36,
1300
+ LEFT: 37,
1301
+ UP: 38,
1302
+ RIGHT: 39,
1303
+ DOWN: 40,
1304
+ DELETE: 46
1305
+ };
1306
+
1307
+ return KEYS;
1308
+ });
1309
+
1310
+ S2.define('select2/selection/base',[
1311
+ 'jquery',
1312
+ '../utils',
1313
+ '../keys'
1314
+ ], function ($, Utils, KEYS) {
1315
+ function BaseSelection ($element, options) {
1316
+ this.$element = $element;
1317
+ this.options = options;
1318
+
1319
+ BaseSelection.__super__.constructor.call(this);
1320
+ }
1321
+
1322
+ Utils.Extend(BaseSelection, Utils.Observable);
1323
+
1324
+ BaseSelection.prototype.render = function () {
1325
+ var $selection = $(
1326
+ '<span class="select2-selection" role="combobox" ' +
1327
+ ' aria-haspopup="true" aria-expanded="false">' +
1328
+ '</span>'
1329
+ );
1330
+
1331
+ this._tabindex = 0;
1332
+
1333
+ if (this.$element.data('old-tabindex') != null) {
1334
+ this._tabindex = this.$element.data('old-tabindex');
1335
+ } else if (this.$element.attr('tabindex') != null) {
1336
+ this._tabindex = this.$element.attr('tabindex');
1337
+ }
1338
+
1339
+ $selection.attr('title', this.$element.attr('title'));
1340
+ $selection.attr('tabindex', this._tabindex);
1341
+
1342
+ this.$selection = $selection;
1343
+
1344
+ return $selection;
1345
+ };
1346
+
1347
+ BaseSelection.prototype.bind = function (container, $container) {
1348
+ var self = this;
1349
+
1350
+ var id = container.id + '-container';
1351
+ var resultsId = container.id + '-results';
1352
+
1353
+ this.container = container;
1354
+
1355
+ this.$selection.on('focus', function (evt) {
1356
+ self.trigger('focus', evt);
1357
+ });
1358
+
1359
+ this.$selection.on('blur', function (evt) {
1360
+ self._handleBlur(evt);
1361
+ });
1362
+
1363
+ this.$selection.on('keydown', function (evt) {
1364
+ self.trigger('keypress', evt);
1365
+
1366
+ if (evt.which === KEYS.SPACE) {
1367
+ evt.preventDefault();
1368
+ }
1369
+ });
1370
+
1371
+ container.on('results:focus', function (params) {
1372
+ self.$selection.attr('aria-activedescendant', params.data._resultId);
1373
+ });
1374
+
1375
+ container.on('selection:update', function (params) {
1376
+ self.update(params.data);
1377
+ });
1378
+
1379
+ container.on('open', function () {
1380
+ // When the dropdown is open, aria-expanded="true"
1381
+ self.$selection.attr('aria-expanded', 'true');
1382
+ self.$selection.attr('aria-owns', resultsId);
1383
+
1384
+ self._attachCloseHandler(container);
1385
+ });
1386
+
1387
+ container.on('close', function () {
1388
+ // When the dropdown is closed, aria-expanded="false"
1389
+ self.$selection.attr('aria-expanded', 'false');
1390
+ self.$selection.removeAttr('aria-activedescendant');
1391
+ self.$selection.removeAttr('aria-owns');
1392
+
1393
+ self.$selection.focus();
1394
+
1395
+ self._detachCloseHandler(container);
1396
+ });
1397
+
1398
+ container.on('enable', function () {
1399
+ self.$selection.attr('tabindex', self._tabindex);
1400
+ });
1401
+
1402
+ container.on('disable', function () {
1403
+ self.$selection.attr('tabindex', '-1');
1404
+ });
1405
+ };
1406
+
1407
+ BaseSelection.prototype._handleBlur = function (evt) {
1408
+ var self = this;
1409
+
1410
+ // This needs to be delayed as the active element is the body when the tab
1411
+ // key is pressed, possibly along with others.
1412
+ window.setTimeout(function () {
1413
+ // Don't trigger `blur` if the focus is still in the selection
1414
+ if (
1415
+ (document.activeElement == self.$selection[0]) ||
1416
+ ($.contains(self.$selection[0], document.activeElement))
1417
+ ) {
1418
+ return;
1419
+ }
1420
+
1421
+ self.trigger('blur', evt);
1422
+ }, 1);
1423
+ };
1424
+
1425
+ BaseSelection.prototype._attachCloseHandler = function (container) {
1426
+ var self = this;
1427
+
1428
+ $(document.body).on('mousedown.select2.' + container.id, function (e) {
1429
+ var $target = $(e.target);
1430
+
1431
+ var $select = $target.closest('.select2');
1432
+
1433
+ var $all = $('.select2.select2-container--open');
1434
+
1435
+ $all.each(function () {
1436
+ var $this = $(this);
1437
+
1438
+ if (this == $select[0]) {
1439
+ return;
1440
+ }
1441
+
1442
+ var $element = $this.data('element');
1443
+
1444
+ $element.select2('close');
1445
+ });
1446
+ });
1447
+ };
1448
+
1449
+ BaseSelection.prototype._detachCloseHandler = function (container) {
1450
+ $(document.body).off('mousedown.select2.' + container.id);
1451
+ };
1452
+
1453
+ BaseSelection.prototype.position = function ($selection, $container) {
1454
+ var $selectionContainer = $container.find('.selection');
1455
+ $selectionContainer.append($selection);
1456
+ };
1457
+
1458
+ BaseSelection.prototype.destroy = function () {
1459
+ this._detachCloseHandler(this.container);
1460
+ };
1461
+
1462
+ BaseSelection.prototype.update = function (data) {
1463
+ throw new Error('The `update` method must be defined in child classes.');
1464
+ };
1465
+
1466
+ return BaseSelection;
1467
+ });
1468
+
1469
+ S2.define('select2/selection/single',[
1470
+ 'jquery',
1471
+ './base',
1472
+ '../utils',
1473
+ '../keys'
1474
+ ], function ($, BaseSelection, Utils, KEYS) {
1475
+ function SingleSelection () {
1476
+ SingleSelection.__super__.constructor.apply(this, arguments);
1477
+ }
1478
+
1479
+ Utils.Extend(SingleSelection, BaseSelection);
1480
+
1481
+ SingleSelection.prototype.render = function () {
1482
+ var $selection = SingleSelection.__super__.render.call(this);
1483
+
1484
+ $selection.addClass('select2-selection--single');
1485
+
1486
+ $selection.html(
1487
+ '<span class="select2-selection__rendered"></span>' +
1488
+ '<span class="select2-selection__arrow" role="presentation">' +
1489
+ '<b role="presentation"></b>' +
1490
+ '</span>'
1491
+ );
1492
+
1493
+ return $selection;
1494
+ };
1495
+
1496
+ SingleSelection.prototype.bind = function (container, $container) {
1497
+ var self = this;
1498
+
1499
+ SingleSelection.__super__.bind.apply(this, arguments);
1500
+
1501
+ var id = container.id + '-container';
1502
+
1503
+ this.$selection.find('.select2-selection__rendered').attr('id', id);
1504
+ this.$selection.attr('aria-labelledby', id);
1505
+
1506
+ this.$selection.on('mousedown', function (evt) {
1507
+ // Only respond to left clicks
1508
+ if (evt.which !== 1) {
1509
+ return;
1510
+ }
1511
+
1512
+ self.trigger('toggle', {
1513
+ originalEvent: evt
1514
+ });
1515
+ });
1516
+
1517
+ this.$selection.on('focus', function (evt) {
1518
+ // User focuses on the container
1519
+ });
1520
+
1521
+ this.$selection.on('blur', function (evt) {
1522
+ // User exits the container
1523
+ });
1524
+
1525
+ container.on('focus', function (evt) {
1526
+ if (!container.isOpen()) {
1527
+ self.$selection.focus();
1528
+ }
1529
+ });
1530
+
1531
+ container.on('selection:update', function (params) {
1532
+ self.update(params.data);
1533
+ });
1534
+ };
1535
+
1536
+ SingleSelection.prototype.clear = function () {
1537
+ this.$selection.find('.select2-selection__rendered').empty();
1538
+ };
1539
+
1540
+ SingleSelection.prototype.display = function (data, container) {
1541
+ var template = this.options.get('templateSelection');
1542
+ var escapeMarkup = this.options.get('escapeMarkup');
1543
+
1544
+ return escapeMarkup(template(data, container));
1545
+ };
1546
+
1547
+ SingleSelection.prototype.selectionContainer = function () {
1548
+ return $('<span></span>');
1549
+ };
1550
+
1551
+ SingleSelection.prototype.update = function (data) {
1552
+ if (data.length === 0) {
1553
+ this.clear();
1554
+ return;
1555
+ }
1556
+
1557
+ var selection = data[0];
1558
+
1559
+ var $rendered = this.$selection.find('.select2-selection__rendered');
1560
+ var formatted = this.display(selection, $rendered);
1561
+
1562
+ $rendered.empty().append(formatted);
1563
+ $rendered.prop('title', selection.title || selection.text);
1564
+ };
1565
+
1566
+ return SingleSelection;
1567
+ });
1568
+
1569
+ S2.define('select2/selection/multiple',[
1570
+ 'jquery',
1571
+ './base',
1572
+ '../utils'
1573
+ ], function ($, BaseSelection, Utils) {
1574
+ function MultipleSelection ($element, options) {
1575
+ MultipleSelection.__super__.constructor.apply(this, arguments);
1576
+ }
1577
+
1578
+ Utils.Extend(MultipleSelection, BaseSelection);
1579
+
1580
+ MultipleSelection.prototype.render = function () {
1581
+ var $selection = MultipleSelection.__super__.render.call(this);
1582
+
1583
+ $selection.addClass('select2-selection--multiple');
1584
+
1585
+ $selection.html(
1586
+ '<ul class="select2-selection__rendered"></ul>'
1587
+ );
1588
+
1589
+ return $selection;
1590
+ };
1591
+
1592
+ MultipleSelection.prototype.bind = function (container, $container) {
1593
+ var self = this;
1594
+
1595
+ MultipleSelection.__super__.bind.apply(this, arguments);
1596
+
1597
+ this.$selection.on('click', function (evt) {
1598
+ self.trigger('toggle', {
1599
+ originalEvent: evt
1600
+ });
1601
+ });
1602
+
1603
+ this.$selection.on(
1604
+ 'click',
1605
+ '.select2-selection__choice__remove',
1606
+ function (evt) {
1607
+ // Ignore the event if it is disabled
1608
+ if (self.options.get('disabled')) {
1609
+ return;
1610
+ }
1611
+
1612
+ var $remove = $(this);
1613
+ var $selection = $remove.parent();
1614
+
1615
+ var data = $selection.data('data');
1616
+
1617
+ self.trigger('unselect', {
1618
+ originalEvent: evt,
1619
+ data: data
1620
+ });
1621
+ }
1622
+ );
1623
+ };
1624
+
1625
+ MultipleSelection.prototype.clear = function () {
1626
+ this.$selection.find('.select2-selection__rendered').empty();
1627
+ };
1628
+
1629
+ MultipleSelection.prototype.display = function (data, container) {
1630
+ var template = this.options.get('templateSelection');
1631
+ var escapeMarkup = this.options.get('escapeMarkup');
1632
+
1633
+ return escapeMarkup(template(data, container));
1634
+ };
1635
+
1636
+ MultipleSelection.prototype.selectionContainer = function () {
1637
+ var $container = $(
1638
+ '<li class="select2-selection__choice">' +
1639
+ '<span class="select2-selection__choice__remove" role="presentation">' +
1640
+ '&times;' +
1641
+ '</span>' +
1642
+ '</li>'
1643
+ );
1644
+
1645
+ return $container;
1646
+ };
1647
+
1648
+ MultipleSelection.prototype.update = function (data) {
1649
+ this.clear();
1650
+
1651
+ if (data.length === 0) {
1652
+ return;
1653
+ }
1654
+
1655
+ var $selections = [];
1656
+
1657
+ for (var d = 0; d < data.length; d++) {
1658
+ var selection = data[d];
1659
+
1660
+ var $selection = this.selectionContainer();
1661
+ var formatted = this.display(selection, $selection);
1662
+
1663
+ $selection.append(formatted);
1664
+ $selection.prop('title', selection.title || selection.text);
1665
+
1666
+ $selection.data('data', selection);
1667
+
1668
+ $selections.push($selection);
1669
+ }
1670
+
1671
+ var $rendered = this.$selection.find('.select2-selection__rendered');
1672
+
1673
+ Utils.appendMany($rendered, $selections);
1674
+ };
1675
+
1676
+ return MultipleSelection;
1677
+ });
1678
+
1679
+ S2.define('select2/selection/placeholder',[
1680
+ '../utils'
1681
+ ], function (Utils) {
1682
+ function Placeholder (decorated, $element, options) {
1683
+ this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
1684
+
1685
+ decorated.call(this, $element, options);
1686
+ }
1687
+
1688
+ Placeholder.prototype.normalizePlaceholder = function (_, placeholder) {
1689
+ if (typeof placeholder === 'string') {
1690
+ placeholder = {
1691
+ id: '',
1692
+ text: placeholder
1693
+ };
1694
+ }
1695
+
1696
+ return placeholder;
1697
+ };
1698
+
1699
+ Placeholder.prototype.createPlaceholder = function (decorated, placeholder) {
1700
+ var $placeholder = this.selectionContainer();
1701
+
1702
+ $placeholder.html(this.display(placeholder));
1703
+ $placeholder.addClass('select2-selection__placeholder')
1704
+ .removeClass('select2-selection__choice');
1705
+
1706
+ return $placeholder;
1707
+ };
1708
+
1709
+ Placeholder.prototype.update = function (decorated, data) {
1710
+ var singlePlaceholder = (
1711
+ data.length == 1 && data[0].id != this.placeholder.id
1712
+ );
1713
+ var multipleSelections = data.length > 1;
1714
+
1715
+ if (multipleSelections || singlePlaceholder) {
1716
+ return decorated.call(this, data);
1717
+ }
1718
+
1719
+ this.clear();
1720
+
1721
+ var $placeholder = this.createPlaceholder(this.placeholder);
1722
+
1723
+ this.$selection.find('.select2-selection__rendered').append($placeholder);
1724
+ };
1725
+
1726
+ return Placeholder;
1727
+ });
1728
+
1729
+ S2.define('select2/selection/allowClear',[
1730
+ 'jquery',
1731
+ '../keys'
1732
+ ], function ($, KEYS) {
1733
+ function AllowClear () { }
1734
+
1735
+ AllowClear.prototype.bind = function (decorated, container, $container) {
1736
+ var self = this;
1737
+
1738
+ decorated.call(this, container, $container);
1739
+
1740
+ if (this.placeholder == null) {
1741
+ if (this.options.get('debug') && window.console && console.error) {
1742
+ console.error(
1743
+ 'Select2: The `allowClear` option should be used in combination ' +
1744
+ 'with the `placeholder` option.'
1745
+ );
1746
+ }
1747
+ }
1748
+
1749
+ this.$selection.on('mousedown', '.select2-selection__clear',
1750
+ function (evt) {
1751
+ self._handleClear(evt);
1752
+ });
1753
+
1754
+ container.on('keypress', function (evt) {
1755
+ self._handleKeyboardClear(evt, container);
1756
+ });
1757
+ };
1758
+
1759
+ AllowClear.prototype._handleClear = function (_, evt) {
1760
+ // Ignore the event if it is disabled
1761
+ if (this.options.get('disabled')) {
1762
+ return;
1763
+ }
1764
+
1765
+ var $clear = this.$selection.find('.select2-selection__clear');
1766
+
1767
+ // Ignore the event if nothing has been selected
1768
+ if ($clear.length === 0) {
1769
+ return;
1770
+ }
1771
+
1772
+ evt.stopPropagation();
1773
+
1774
+ var data = $clear.data('data');
1775
+
1776
+ for (var d = 0; d < data.length; d++) {
1777
+ var unselectData = {
1778
+ data: data[d]
1779
+ };
1780
+
1781
+ // Trigger the `unselect` event, so people can prevent it from being
1782
+ // cleared.
1783
+ this.trigger('unselect', unselectData);
1784
+
1785
+ // If the event was prevented, don't clear it out.
1786
+ if (unselectData.prevented) {
1787
+ return;
1788
+ }
1789
+ }
1790
+
1791
+ this.$element.val(this.placeholder.id).trigger('change');
1792
+
1793
+ this.trigger('toggle', {});
1794
+ };
1795
+
1796
+ AllowClear.prototype._handleKeyboardClear = function (_, evt, container) {
1797
+ if (container.isOpen()) {
1798
+ return;
1799
+ }
1800
+
1801
+ if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) {
1802
+ this._handleClear(evt);
1803
+ }
1804
+ };
1805
+
1806
+ AllowClear.prototype.update = function (decorated, data) {
1807
+ decorated.call(this, data);
1808
+
1809
+ if (this.$selection.find('.select2-selection__placeholder').length > 0 ||
1810
+ data.length === 0) {
1811
+ return;
1812
+ }
1813
+
1814
+ var $remove = $(
1815
+ '<span class="select2-selection__clear">' +
1816
+ '&times;' +
1817
+ '</span>'
1818
+ );
1819
+ $remove.data('data', data);
1820
+
1821
+ this.$selection.find('.select2-selection__rendered').prepend($remove);
1822
+ };
1823
+
1824
+ return AllowClear;
1825
+ });
1826
+
1827
+ S2.define('select2/selection/search',[
1828
+ 'jquery',
1829
+ '../utils',
1830
+ '../keys'
1831
+ ], function ($, Utils, KEYS) {
1832
+ function Search (decorated, $element, options) {
1833
+ decorated.call(this, $element, options);
1834
+ }
1835
+
1836
+ Search.prototype.render = function (decorated) {
1837
+ var $search = $(
1838
+ '<li class="select2-search select2-search--inline">' +
1839
+ '<input class="select2-search__field" type="search" tabindex="-1"' +
1840
+ ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
1841
+ ' spellcheck="false" role="textbox" aria-autocomplete="list" />' +
1842
+ '</li>'
1843
+ );
1844
+
1845
+ this.$searchContainer = $search;
1846
+ this.$search = $search.find('input');
1847
+
1848
+ var $rendered = decorated.call(this);
1849
+
1850
+ this._transferTabIndex();
1851
+
1852
+ return $rendered;
1853
+ };
1854
+
1855
+ Search.prototype.bind = function (decorated, container, $container) {
1856
+ var self = this;
1857
+
1858
+ decorated.call(this, container, $container);
1859
+
1860
+ container.on('open', function () {
1861
+ self.$search.trigger('focus');
1862
+ });
1863
+
1864
+ container.on('close', function () {
1865
+ self.$search.val('');
1866
+ self.$search.removeAttr('aria-activedescendant');
1867
+ self.$search.trigger('focus');
1868
+ });
1869
+
1870
+ container.on('enable', function () {
1871
+ self.$search.prop('disabled', false);
1872
+
1873
+ self._transferTabIndex();
1874
+ });
1875
+
1876
+ container.on('disable', function () {
1877
+ self.$search.prop('disabled', true);
1878
+ });
1879
+
1880
+ container.on('focus', function (evt) {
1881
+ self.$search.trigger('focus');
1882
+ });
1883
+
1884
+ container.on('results:focus', function (params) {
1885
+ self.$search.attr('aria-activedescendant', params.id);
1886
+ });
1887
+
1888
+ this.$selection.on('focusin', '.select2-search--inline', function (evt) {
1889
+ self.trigger('focus', evt);
1890
+ });
1891
+
1892
+ this.$selection.on('focusout', '.select2-search--inline', function (evt) {
1893
+ self._handleBlur(evt);
1894
+ });
1895
+
1896
+ this.$selection.on('keydown', '.select2-search--inline', function (evt) {
1897
+ evt.stopPropagation();
1898
+
1899
+ self.trigger('keypress', evt);
1900
+
1901
+ self._keyUpPrevented = evt.isDefaultPrevented();
1902
+
1903
+ var key = evt.which;
1904
+
1905
+ if (key === KEYS.BACKSPACE && self.$search.val() === '') {
1906
+ var $previousChoice = self.$searchContainer
1907
+ .prev('.select2-selection__choice');
1908
+
1909
+ if ($previousChoice.length > 0) {
1910
+ var item = $previousChoice.data('data');
1911
+
1912
+ self.searchRemoveChoice(item);
1913
+
1914
+ evt.preventDefault();
1915
+ }
1916
+ }
1917
+ });
1918
+
1919
+ // Try to detect the IE version should the `documentMode` property that
1920
+ // is stored on the document. This is only implemented in IE and is
1921
+ // slightly cleaner than doing a user agent check.
1922
+ // This property is not available in Edge, but Edge also doesn't have
1923
+ // this bug.
1924
+ var msie = document.documentMode;
1925
+ var disableInputEvents = msie && msie <= 11;
1926
+
1927
+ // Workaround for browsers which do not support the `input` event
1928
+ // This will prevent double-triggering of events for browsers which support
1929
+ // both the `keyup` and `input` events.
1930
+ this.$selection.on(
1931
+ 'input.searchcheck',
1932
+ '.select2-search--inline',
1933
+ function (evt) {
1934
+ // IE will trigger the `input` event when a placeholder is used on a
1935
+ // search box. To get around this issue, we are forced to ignore all
1936
+ // `input` events in IE and keep using `keyup`.
1937
+ if (disableInputEvents) {
1938
+ self.$selection.off('input.search input.searchcheck');
1939
+ return;
1940
+ }
1941
+
1942
+ // Unbind the duplicated `keyup` event
1943
+ self.$selection.off('keyup.search');
1944
+ }
1945
+ );
1946
+
1947
+ this.$selection.on(
1948
+ 'keyup.search input.search',
1949
+ '.select2-search--inline',
1950
+ function (evt) {
1951
+ // IE will trigger the `input` event when a placeholder is used on a
1952
+ // search box. To get around this issue, we are forced to ignore all
1953
+ // `input` events in IE and keep using `keyup`.
1954
+ if (disableInputEvents && evt.type === 'input') {
1955
+ self.$selection.off('input.search input.searchcheck');
1956
+ return;
1957
+ }
1958
+
1959
+ var key = evt.which;
1960
+
1961
+ // We can freely ignore events from modifier keys
1962
+ if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) {
1963
+ return;
1964
+ }
1965
+
1966
+ // Tabbing will be handled during the `keydown` phase
1967
+ if (key == KEYS.TAB) {
1968
+ return;
1969
+ }
1970
+
1971
+ self.handleSearch(evt);
1972
+ }
1973
+ );
1974
+ };
1975
+
1976
+ /**
1977
+ * This method will transfer the tabindex attribute from the rendered
1978
+ * selection to the search box. This allows for the search box to be used as
1979
+ * the primary focus instead of the selection container.
1980
+ *
1981
+ * @private
1982
+ */
1983
+ Search.prototype._transferTabIndex = function (decorated) {
1984
+ this.$search.attr('tabindex', this.$selection.attr('tabindex'));
1985
+ this.$selection.attr('tabindex', '-1');
1986
+ };
1987
+
1988
+ Search.prototype.createPlaceholder = function (decorated, placeholder) {
1989
+ this.$search.attr('placeholder', placeholder.text);
1990
+ };
1991
+
1992
+ Search.prototype.update = function (decorated, data) {
1993
+ var searchHadFocus = this.$search[0] == document.activeElement;
1994
+
1995
+ this.$search.attr('placeholder', '');
1996
+
1997
+ decorated.call(this, data);
1998
+
1999
+ this.$selection.find('.select2-selection__rendered')
2000
+ .append(this.$searchContainer);
2001
+
2002
+ this.resizeSearch();
2003
+ if (searchHadFocus) {
2004
+ this.$search.focus();
2005
+ }
2006
+ };
2007
+
2008
+ Search.prototype.handleSearch = function () {
2009
+ this.resizeSearch();
2010
+
2011
+ if (!this._keyUpPrevented) {
2012
+ var input = this.$search.val();
2013
+
2014
+ this.trigger('query', {
2015
+ term: input
2016
+ });
2017
+ }
2018
+
2019
+ this._keyUpPrevented = false;
2020
+ };
2021
+
2022
+ Search.prototype.searchRemoveChoice = function (decorated, item) {
2023
+ this.trigger('unselect', {
2024
+ data: item
2025
+ });
2026
+
2027
+ this.$search.val(item.text);
2028
+ this.handleSearch();
2029
+ };
2030
+
2031
+ Search.prototype.resizeSearch = function () {
2032
+ this.$search.css('width', '25px');
2033
+
2034
+ var width = '';
2035
+
2036
+ if (this.$search.attr('placeholder') !== '') {
2037
+ width = this.$selection.find('.select2-selection__rendered').innerWidth();
2038
+ } else {
2039
+ var minimumWidth = this.$search.val().length + 1;
2040
+
2041
+ width = (minimumWidth * 0.75) + 'em';
2042
+ }
2043
+
2044
+ this.$search.css('width', width);
2045
+ };
2046
+
2047
+ return Search;
2048
+ });
2049
+
2050
+ S2.define('select2/selection/eventRelay',[
2051
+ 'jquery'
2052
+ ], function ($) {
2053
+ function EventRelay () { }
2054
+
2055
+ EventRelay.prototype.bind = function (decorated, container, $container) {
2056
+ var self = this;
2057
+ var relayEvents = [
2058
+ 'open', 'opening',
2059
+ 'close', 'closing',
2060
+ 'select', 'selecting',
2061
+ 'unselect', 'unselecting'
2062
+ ];
2063
+
2064
+ var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting'];
2065
+
2066
+ decorated.call(this, container, $container);
2067
+
2068
+ container.on('*', function (name, params) {
2069
+ // Ignore events that should not be relayed
2070
+ if ($.inArray(name, relayEvents) === -1) {
2071
+ return;
2072
+ }
2073
+
2074
+ // The parameters should always be an object
2075
+ params = params || {};
2076
+
2077
+ // Generate the jQuery event for the Select2 event
2078
+ var evt = $.Event('select2:' + name, {
2079
+ params: params
2080
+ });
2081
+
2082
+ self.$element.trigger(evt);
2083
+
2084
+ // Only handle preventable events if it was one
2085
+ if ($.inArray(name, preventableEvents) === -1) {
2086
+ return;
2087
+ }
2088
+
2089
+ params.prevented = evt.isDefaultPrevented();
2090
+ });
2091
+ };
2092
+
2093
+ return EventRelay;
2094
+ });
2095
+
2096
+ S2.define('select2/translation',[
2097
+ 'jquery',
2098
+ 'require'
2099
+ ], function ($, require) {
2100
+ function Translation (dict) {
2101
+ this.dict = dict || {};
2102
+ }
2103
+
2104
+ Translation.prototype.all = function () {
2105
+ return this.dict;
2106
+ };
2107
+
2108
+ Translation.prototype.get = function (key) {
2109
+ return this.dict[key];
2110
+ };
2111
+
2112
+ Translation.prototype.extend = function (translation) {
2113
+ this.dict = $.extend({}, translation.all(), this.dict);
2114
+ };
2115
+
2116
+ // Static functions
2117
+
2118
+ Translation._cache = {};
2119
+
2120
+ Translation.loadPath = function (path) {
2121
+ if (!(path in Translation._cache)) {
2122
+ var translations = require(path);
2123
+
2124
+ Translation._cache[path] = translations;
2125
+ }
2126
+
2127
+ return new Translation(Translation._cache[path]);
2128
+ };
2129
+
2130
+ return Translation;
2131
+ });
2132
+
2133
+ S2.define('select2/diacritics',[
2134
+
2135
+ ], function () {
2136
+ var diacritics = {
2137
+ '\u24B6': 'A',
2138
+ '\uFF21': 'A',
2139
+ '\u00C0': 'A',
2140
+ '\u00C1': 'A',
2141
+ '\u00C2': 'A',
2142
+ '\u1EA6': 'A',
2143
+ '\u1EA4': 'A',
2144
+ '\u1EAA': 'A',
2145
+ '\u1EA8': 'A',
2146
+ '\u00C3': 'A',
2147
+ '\u0100': 'A',
2148
+ '\u0102': 'A',
2149
+ '\u1EB0': 'A',
2150
+ '\u1EAE': 'A',
2151
+ '\u1EB4': 'A',
2152
+ '\u1EB2': 'A',
2153
+ '\u0226': 'A',
2154
+ '\u01E0': 'A',
2155
+ '\u00C4': 'A',
2156
+ '\u01DE': 'A',
2157
+ '\u1EA2': 'A',
2158
+ '\u00C5': 'A',
2159
+ '\u01FA': 'A',
2160
+ '\u01CD': 'A',
2161
+ '\u0200': 'A',
2162
+ '\u0202': 'A',
2163
+ '\u1EA0': 'A',
2164
+ '\u1EAC': 'A',
2165
+ '\u1EB6': 'A',
2166
+ '\u1E00': 'A',
2167
+ '\u0104': 'A',
2168
+ '\u023A': 'A',
2169
+ '\u2C6F': 'A',
2170
+ '\uA732': 'AA',
2171
+ '\u00C6': 'AE',
2172
+ '\u01FC': 'AE',
2173
+ '\u01E2': 'AE',
2174
+ '\uA734': 'AO',
2175
+ '\uA736': 'AU',
2176
+ '\uA738': 'AV',
2177
+ '\uA73A': 'AV',
2178
+ '\uA73C': 'AY',
2179
+ '\u24B7': 'B',
2180
+ '\uFF22': 'B',
2181
+ '\u1E02': 'B',
2182
+ '\u1E04': 'B',
2183
+ '\u1E06': 'B',
2184
+ '\u0243': 'B',
2185
+ '\u0182': 'B',
2186
+ '\u0181': 'B',
2187
+ '\u24B8': 'C',
2188
+ '\uFF23': 'C',
2189
+ '\u0106': 'C',
2190
+ '\u0108': 'C',
2191
+ '\u010A': 'C',
2192
+ '\u010C': 'C',
2193
+ '\u00C7': 'C',
2194
+ '\u1E08': 'C',
2195
+ '\u0187': 'C',
2196
+ '\u023B': 'C',
2197
+ '\uA73E': 'C',
2198
+ '\u24B9': 'D',
2199
+ '\uFF24': 'D',
2200
+ '\u1E0A': 'D',
2201
+ '\u010E': 'D',
2202
+ '\u1E0C': 'D',
2203
+ '\u1E10': 'D',
2204
+ '\u1E12': 'D',
2205
+ '\u1E0E': 'D',
2206
+ '\u0110': 'D',
2207
+ '\u018B': 'D',
2208
+ '\u018A': 'D',
2209
+ '\u0189': 'D',
2210
+ '\uA779': 'D',
2211
+ '\u01F1': 'DZ',
2212
+ '\u01C4': 'DZ',
2213
+ '\u01F2': 'Dz',
2214
+ '\u01C5': 'Dz',
2215
+ '\u24BA': 'E',
2216
+ '\uFF25': 'E',
2217
+ '\u00C8': 'E',
2218
+ '\u00C9': 'E',
2219
+ '\u00CA': 'E',
2220
+ '\u1EC0': 'E',
2221
+ '\u1EBE': 'E',
2222
+ '\u1EC4': 'E',
2223
+ '\u1EC2': 'E',
2224
+ '\u1EBC': 'E',
2225
+ '\u0112': 'E',
2226
+ '\u1E14': 'E',
2227
+ '\u1E16': 'E',
2228
+ '\u0114': 'E',
2229
+ '\u0116': 'E',
2230
+ '\u00CB': 'E',
2231
+ '\u1EBA': 'E',
2232
+ '\u011A': 'E',
2233
+ '\u0204': 'E',
2234
+ '\u0206': 'E',
2235
+ '\u1EB8': 'E',
2236
+ '\u1EC6': 'E',
2237
+ '\u0228': 'E',
2238
+ '\u1E1C': 'E',
2239
+ '\u0118': 'E',
2240
+ '\u1E18': 'E',
2241
+ '\u1E1A': 'E',
2242
+ '\u0190': 'E',
2243
+ '\u018E': 'E',
2244
+ '\u24BB': 'F',
2245
+ '\uFF26': 'F',
2246
+ '\u1E1E': 'F',
2247
+ '\u0191': 'F',
2248
+ '\uA77B': 'F',
2249
+ '\u24BC': 'G',
2250
+ '\uFF27': 'G',
2251
+ '\u01F4': 'G',
2252
+ '\u011C': 'G',
2253
+ '\u1E20': 'G',
2254
+ '\u011E': 'G',
2255
+ '\u0120': 'G',
2256
+ '\u01E6': 'G',
2257
+ '\u0122': 'G',
2258
+ '\u01E4': 'G',
2259
+ '\u0193': 'G',
2260
+ '\uA7A0': 'G',
2261
+ '\uA77D': 'G',
2262
+ '\uA77E': 'G',
2263
+ '\u24BD': 'H',
2264
+ '\uFF28': 'H',
2265
+ '\u0124': 'H',
2266
+ '\u1E22': 'H',
2267
+ '\u1E26': 'H',
2268
+ '\u021E': 'H',
2269
+ '\u1E24': 'H',
2270
+ '\u1E28': 'H',
2271
+ '\u1E2A': 'H',
2272
+ '\u0126': 'H',
2273
+ '\u2C67': 'H',
2274
+ '\u2C75': 'H',
2275
+ '\uA78D': 'H',
2276
+ '\u24BE': 'I',
2277
+ '\uFF29': 'I',
2278
+ '\u00CC': 'I',
2279
+ '\u00CD': 'I',
2280
+ '\u00CE': 'I',
2281
+ '\u0128': 'I',
2282
+ '\u012A': 'I',
2283
+ '\u012C': 'I',
2284
+ '\u0130': 'I',
2285
+ '\u00CF': 'I',
2286
+ '\u1E2E': 'I',
2287
+ '\u1EC8': 'I',
2288
+ '\u01CF': 'I',
2289
+ '\u0208': 'I',
2290
+ '\u020A': 'I',
2291
+ '\u1ECA': 'I',
2292
+ '\u012E': 'I',
2293
+ '\u1E2C': 'I',
2294
+ '\u0197': 'I',
2295
+ '\u24BF': 'J',
2296
+ '\uFF2A': 'J',
2297
+ '\u0134': 'J',
2298
+ '\u0248': 'J',
2299
+ '\u24C0': 'K',
2300
+ '\uFF2B': 'K',
2301
+ '\u1E30': 'K',
2302
+ '\u01E8': 'K',
2303
+ '\u1E32': 'K',
2304
+ '\u0136': 'K',
2305
+ '\u1E34': 'K',
2306
+ '\u0198': 'K',
2307
+ '\u2C69': 'K',
2308
+ '\uA740': 'K',
2309
+ '\uA742': 'K',
2310
+ '\uA744': 'K',
2311
+ '\uA7A2': 'K',
2312
+ '\u24C1': 'L',
2313
+ '\uFF2C': 'L',
2314
+ '\u013F': 'L',
2315
+ '\u0139': 'L',
2316
+ '\u013D': 'L',
2317
+ '\u1E36': 'L',
2318
+ '\u1E38': 'L',
2319
+ '\u013B': 'L',
2320
+ '\u1E3C': 'L',
2321
+ '\u1E3A': 'L',
2322
+ '\u0141': 'L',
2323
+ '\u023D': 'L',
2324
+ '\u2C62': 'L',
2325
+ '\u2C60': 'L',
2326
+ '\uA748': 'L',
2327
+ '\uA746': 'L',
2328
+ '\uA780': 'L',
2329
+ '\u01C7': 'LJ',
2330
+ '\u01C8': 'Lj',
2331
+ '\u24C2': 'M',
2332
+ '\uFF2D': 'M',
2333
+ '\u1E3E': 'M',
2334
+ '\u1E40': 'M',
2335
+ '\u1E42': 'M',
2336
+ '\u2C6E': 'M',
2337
+ '\u019C': 'M',
2338
+ '\u24C3': 'N',
2339
+ '\uFF2E': 'N',
2340
+ '\u01F8': 'N',
2341
+ '\u0143': 'N',
2342
+ '\u00D1': 'N',
2343
+ '\u1E44': 'N',
2344
+ '\u0147': 'N',
2345
+ '\u1E46': 'N',
2346
+ '\u0145': 'N',
2347
+ '\u1E4A': 'N',
2348
+ '\u1E48': 'N',
2349
+ '\u0220': 'N',
2350
+ '\u019D': 'N',
2351
+ '\uA790': 'N',
2352
+ '\uA7A4': 'N',
2353
+ '\u01CA': 'NJ',
2354
+ '\u01CB': 'Nj',
2355
+ '\u24C4': 'O',
2356
+ '\uFF2F': 'O',
2357
+ '\u00D2': 'O',
2358
+ '\u00D3': 'O',
2359
+ '\u00D4': 'O',
2360
+ '\u1ED2': 'O',
2361
+ '\u1ED0': 'O',
2362
+ '\u1ED6': 'O',
2363
+ '\u1ED4': 'O',
2364
+ '\u00D5': 'O',
2365
+ '\u1E4C': 'O',
2366
+ '\u022C': 'O',
2367
+ '\u1E4E': 'O',
2368
+ '\u014C': 'O',
2369
+ '\u1E50': 'O',
2370
+ '\u1E52': 'O',
2371
+ '\u014E': 'O',
2372
+ '\u022E': 'O',
2373
+ '\u0230': 'O',
2374
+ '\u00D6': 'O',
2375
+ '\u022A': 'O',
2376
+ '\u1ECE': 'O',
2377
+ '\u0150': 'O',
2378
+ '\u01D1': 'O',
2379
+ '\u020C': 'O',
2380
+ '\u020E': 'O',
2381
+ '\u01A0': 'O',
2382
+ '\u1EDC': 'O',
2383
+ '\u1EDA': 'O',
2384
+ '\u1EE0': 'O',
2385
+ '\u1EDE': 'O',
2386
+ '\u1EE2': 'O',
2387
+ '\u1ECC': 'O',
2388
+ '\u1ED8': 'O',
2389
+ '\u01EA': 'O',
2390
+ '\u01EC': 'O',
2391
+ '\u00D8': 'O',
2392
+ '\u01FE': 'O',
2393
+ '\u0186': 'O',
2394
+ '\u019F': 'O',
2395
+ '\uA74A': 'O',
2396
+ '\uA74C': 'O',
2397
+ '\u01A2': 'OI',
2398
+ '\uA74E': 'OO',
2399
+ '\u0222': 'OU',
2400
+ '\u24C5': 'P',
2401
+ '\uFF30': 'P',
2402
+ '\u1E54': 'P',
2403
+ '\u1E56': 'P',
2404
+ '\u01A4': 'P',
2405
+ '\u2C63': 'P',
2406
+ '\uA750': 'P',
2407
+ '\uA752': 'P',
2408
+ '\uA754': 'P',
2409
+ '\u24C6': 'Q',
2410
+ '\uFF31': 'Q',
2411
+ '\uA756': 'Q',
2412
+ '\uA758': 'Q',
2413
+ '\u024A': 'Q',
2414
+ '\u24C7': 'R',
2415
+ '\uFF32': 'R',
2416
+ '\u0154': 'R',
2417
+ '\u1E58': 'R',
2418
+ '\u0158': 'R',
2419
+ '\u0210': 'R',
2420
+ '\u0212': 'R',
2421
+ '\u1E5A': 'R',
2422
+ '\u1E5C': 'R',
2423
+ '\u0156': 'R',
2424
+ '\u1E5E': 'R',
2425
+ '\u024C': 'R',
2426
+ '\u2C64': 'R',
2427
+ '\uA75A': 'R',
2428
+ '\uA7A6': 'R',
2429
+ '\uA782': 'R',
2430
+ '\u24C8': 'S',
2431
+ '\uFF33': 'S',
2432
+ '\u1E9E': 'S',
2433
+ '\u015A': 'S',
2434
+ '\u1E64': 'S',
2435
+ '\u015C': 'S',
2436
+ '\u1E60': 'S',
2437
+ '\u0160': 'S',
2438
+ '\u1E66': 'S',
2439
+ '\u1E62': 'S',
2440
+ '\u1E68': 'S',
2441
+ '\u0218': 'S',
2442
+ '\u015E': 'S',
2443
+ '\u2C7E': 'S',
2444
+ '\uA7A8': 'S',
2445
+ '\uA784': 'S',
2446
+ '\u24C9': 'T',
2447
+ '\uFF34': 'T',
2448
+ '\u1E6A': 'T',
2449
+ '\u0164': 'T',
2450
+ '\u1E6C': 'T',
2451
+ '\u021A': 'T',
2452
+ '\u0162': 'T',
2453
+ '\u1E70': 'T',
2454
+ '\u1E6E': 'T',
2455
+ '\u0166': 'T',
2456
+ '\u01AC': 'T',
2457
+ '\u01AE': 'T',
2458
+ '\u023E': 'T',
2459
+ '\uA786': 'T',
2460
+ '\uA728': 'TZ',
2461
+ '\u24CA': 'U',
2462
+ '\uFF35': 'U',
2463
+ '\u00D9': 'U',
2464
+ '\u00DA': 'U',
2465
+ '\u00DB': 'U',
2466
+ '\u0168': 'U',
2467
+ '\u1E78': 'U',
2468
+ '\u016A': 'U',
2469
+ '\u1E7A': 'U',
2470
+ '\u016C': 'U',
2471
+ '\u00DC': 'U',
2472
+ '\u01DB': 'U',
2473
+ '\u01D7': 'U',
2474
+ '\u01D5': 'U',
2475
+ '\u01D9': 'U',
2476
+ '\u1EE6': 'U',
2477
+ '\u016E': 'U',
2478
+ '\u0170': 'U',
2479
+ '\u01D3': 'U',
2480
+ '\u0214': 'U',
2481
+ '\u0216': 'U',
2482
+ '\u01AF': 'U',
2483
+ '\u1EEA': 'U',
2484
+ '\u1EE8': 'U',
2485
+ '\u1EEE': 'U',
2486
+ '\u1EEC': 'U',
2487
+ '\u1EF0': 'U',
2488
+ '\u1EE4': 'U',
2489
+ '\u1E72': 'U',
2490
+ '\u0172': 'U',
2491
+ '\u1E76': 'U',
2492
+ '\u1E74': 'U',
2493
+ '\u0244': 'U',
2494
+ '\u24CB': 'V',
2495
+ '\uFF36': 'V',
2496
+ '\u1E7C': 'V',
2497
+ '\u1E7E': 'V',
2498
+ '\u01B2': 'V',
2499
+ '\uA75E': 'V',
2500
+ '\u0245': 'V',
2501
+ '\uA760': 'VY',
2502
+ '\u24CC': 'W',
2503
+ '\uFF37': 'W',
2504
+ '\u1E80': 'W',
2505
+ '\u1E82': 'W',
2506
+ '\u0174': 'W',
2507
+ '\u1E86': 'W',
2508
+ '\u1E84': 'W',
2509
+ '\u1E88': 'W',
2510
+ '\u2C72': 'W',
2511
+ '\u24CD': 'X',
2512
+ '\uFF38': 'X',
2513
+ '\u1E8A': 'X',
2514
+ '\u1E8C': 'X',
2515
+ '\u24CE': 'Y',
2516
+ '\uFF39': 'Y',
2517
+ '\u1EF2': 'Y',
2518
+ '\u00DD': 'Y',
2519
+ '\u0176': 'Y',
2520
+ '\u1EF8': 'Y',
2521
+ '\u0232': 'Y',
2522
+ '\u1E8E': 'Y',
2523
+ '\u0178': 'Y',
2524
+ '\u1EF6': 'Y',
2525
+ '\u1EF4': 'Y',
2526
+ '\u01B3': 'Y',
2527
+ '\u024E': 'Y',
2528
+ '\u1EFE': 'Y',
2529
+ '\u24CF': 'Z',
2530
+ '\uFF3A': 'Z',
2531
+ '\u0179': 'Z',
2532
+ '\u1E90': 'Z',
2533
+ '\u017B': 'Z',
2534
+ '\u017D': 'Z',
2535
+ '\u1E92': 'Z',
2536
+ '\u1E94': 'Z',
2537
+ '\u01B5': 'Z',
2538
+ '\u0224': 'Z',
2539
+ '\u2C7F': 'Z',
2540
+ '\u2C6B': 'Z',
2541
+ '\uA762': 'Z',
2542
+ '\u24D0': 'a',
2543
+ '\uFF41': 'a',
2544
+ '\u1E9A': 'a',
2545
+ '\u00E0': 'a',
2546
+ '\u00E1': 'a',
2547
+ '\u00E2': 'a',
2548
+ '\u1EA7': 'a',
2549
+ '\u1EA5': 'a',
2550
+ '\u1EAB': 'a',
2551
+ '\u1EA9': 'a',
2552
+ '\u00E3': 'a',
2553
+ '\u0101': 'a',
2554
+ '\u0103': 'a',
2555
+ '\u1EB1': 'a',
2556
+ '\u1EAF': 'a',
2557
+ '\u1EB5': 'a',
2558
+ '\u1EB3': 'a',
2559
+ '\u0227': 'a',
2560
+ '\u01E1': 'a',
2561
+ '\u00E4': 'a',
2562
+ '\u01DF': 'a',
2563
+ '\u1EA3': 'a',
2564
+ '\u00E5': 'a',
2565
+ '\u01FB': 'a',
2566
+ '\u01CE': 'a',
2567
+ '\u0201': 'a',
2568
+ '\u0203': 'a',
2569
+ '\u1EA1': 'a',
2570
+ '\u1EAD': 'a',
2571
+ '\u1EB7': 'a',
2572
+ '\u1E01': 'a',
2573
+ '\u0105': 'a',
2574
+ '\u2C65': 'a',
2575
+ '\u0250': 'a',
2576
+ '\uA733': 'aa',
2577
+ '\u00E6': 'ae',
2578
+ '\u01FD': 'ae',
2579
+ '\u01E3': 'ae',
2580
+ '\uA735': 'ao',
2581
+ '\uA737': 'au',
2582
+ '\uA739': 'av',
2583
+ '\uA73B': 'av',
2584
+ '\uA73D': 'ay',
2585
+ '\u24D1': 'b',
2586
+ '\uFF42': 'b',
2587
+ '\u1E03': 'b',
2588
+ '\u1E05': 'b',
2589
+ '\u1E07': 'b',
2590
+ '\u0180': 'b',
2591
+ '\u0183': 'b',
2592
+ '\u0253': 'b',
2593
+ '\u24D2': 'c',
2594
+ '\uFF43': 'c',
2595
+ '\u0107': 'c',
2596
+ '\u0109': 'c',
2597
+ '\u010B': 'c',
2598
+ '\u010D': 'c',
2599
+ '\u00E7': 'c',
2600
+ '\u1E09': 'c',
2601
+ '\u0188': 'c',
2602
+ '\u023C': 'c',
2603
+ '\uA73F': 'c',
2604
+ '\u2184': 'c',
2605
+ '\u24D3': 'd',
2606
+ '\uFF44': 'd',
2607
+ '\u1E0B': 'd',
2608
+ '\u010F': 'd',
2609
+ '\u1E0D': 'd',
2610
+ '\u1E11': 'd',
2611
+ '\u1E13': 'd',
2612
+ '\u1E0F': 'd',
2613
+ '\u0111': 'd',
2614
+ '\u018C': 'd',
2615
+ '\u0256': 'd',
2616
+ '\u0257': 'd',
2617
+ '\uA77A': 'd',
2618
+ '\u01F3': 'dz',
2619
+ '\u01C6': 'dz',
2620
+ '\u24D4': 'e',
2621
+ '\uFF45': 'e',
2622
+ '\u00E8': 'e',
2623
+ '\u00E9': 'e',
2624
+ '\u00EA': 'e',
2625
+ '\u1EC1': 'e',
2626
+ '\u1EBF': 'e',
2627
+ '\u1EC5': 'e',
2628
+ '\u1EC3': 'e',
2629
+ '\u1EBD': 'e',
2630
+ '\u0113': 'e',
2631
+ '\u1E15': 'e',
2632
+ '\u1E17': 'e',
2633
+ '\u0115': 'e',
2634
+ '\u0117': 'e',
2635
+ '\u00EB': 'e',
2636
+ '\u1EBB': 'e',
2637
+ '\u011B': 'e',
2638
+ '\u0205': 'e',
2639
+ '\u0207': 'e',
2640
+ '\u1EB9': 'e',
2641
+ '\u1EC7': 'e',
2642
+ '\u0229': 'e',
2643
+ '\u1E1D': 'e',
2644
+ '\u0119': 'e',
2645
+ '\u1E19': 'e',
2646
+ '\u1E1B': 'e',
2647
+ '\u0247': 'e',
2648
+ '\u025B': 'e',
2649
+ '\u01DD': 'e',
2650
+ '\u24D5': 'f',
2651
+ '\uFF46': 'f',
2652
+ '\u1E1F': 'f',
2653
+ '\u0192': 'f',
2654
+ '\uA77C': 'f',
2655
+ '\u24D6': 'g',
2656
+ '\uFF47': 'g',
2657
+ '\u01F5': 'g',
2658
+ '\u011D': 'g',
2659
+ '\u1E21': 'g',
2660
+ '\u011F': 'g',
2661
+ '\u0121': 'g',
2662
+ '\u01E7': 'g',
2663
+ '\u0123': 'g',
2664
+ '\u01E5': 'g',
2665
+ '\u0260': 'g',
2666
+ '\uA7A1': 'g',
2667
+ '\u1D79': 'g',
2668
+ '\uA77F': 'g',
2669
+ '\u24D7': 'h',
2670
+ '\uFF48': 'h',
2671
+ '\u0125': 'h',
2672
+ '\u1E23': 'h',
2673
+ '\u1E27': 'h',
2674
+ '\u021F': 'h',
2675
+ '\u1E25': 'h',
2676
+ '\u1E29': 'h',
2677
+ '\u1E2B': 'h',
2678
+ '\u1E96': 'h',
2679
+ '\u0127': 'h',
2680
+ '\u2C68': 'h',
2681
+ '\u2C76': 'h',
2682
+ '\u0265': 'h',
2683
+ '\u0195': 'hv',
2684
+ '\u24D8': 'i',
2685
+ '\uFF49': 'i',
2686
+ '\u00EC': 'i',
2687
+ '\u00ED': 'i',
2688
+ '\u00EE': 'i',
2689
+ '\u0129': 'i',
2690
+ '\u012B': 'i',
2691
+ '\u012D': 'i',
2692
+ '\u00EF': 'i',
2693
+ '\u1E2F': 'i',
2694
+ '\u1EC9': 'i',
2695
+ '\u01D0': 'i',
2696
+ '\u0209': 'i',
2697
+ '\u020B': 'i',
2698
+ '\u1ECB': 'i',
2699
+ '\u012F': 'i',
2700
+ '\u1E2D': 'i',
2701
+ '\u0268': 'i',
2702
+ '\u0131': 'i',
2703
+ '\u24D9': 'j',
2704
+ '\uFF4A': 'j',
2705
+ '\u0135': 'j',
2706
+ '\u01F0': 'j',
2707
+ '\u0249': 'j',
2708
+ '\u24DA': 'k',
2709
+ '\uFF4B': 'k',
2710
+ '\u1E31': 'k',
2711
+ '\u01E9': 'k',
2712
+ '\u1E33': 'k',
2713
+ '\u0137': 'k',
2714
+ '\u1E35': 'k',
2715
+ '\u0199': 'k',
2716
+ '\u2C6A': 'k',
2717
+ '\uA741': 'k',
2718
+ '\uA743': 'k',
2719
+ '\uA745': 'k',
2720
+ '\uA7A3': 'k',
2721
+ '\u24DB': 'l',
2722
+ '\uFF4C': 'l',
2723
+ '\u0140': 'l',
2724
+ '\u013A': 'l',
2725
+ '\u013E': 'l',
2726
+ '\u1E37': 'l',
2727
+ '\u1E39': 'l',
2728
+ '\u013C': 'l',
2729
+ '\u1E3D': 'l',
2730
+ '\u1E3B': 'l',
2731
+ '\u017F': 'l',
2732
+ '\u0142': 'l',
2733
+ '\u019A': 'l',
2734
+ '\u026B': 'l',
2735
+ '\u2C61': 'l',
2736
+ '\uA749': 'l',
2737
+ '\uA781': 'l',
2738
+ '\uA747': 'l',
2739
+ '\u01C9': 'lj',
2740
+ '\u24DC': 'm',
2741
+ '\uFF4D': 'm',
2742
+ '\u1E3F': 'm',
2743
+ '\u1E41': 'm',
2744
+ '\u1E43': 'm',
2745
+ '\u0271': 'm',
2746
+ '\u026F': 'm',
2747
+ '\u24DD': 'n',
2748
+ '\uFF4E': 'n',
2749
+ '\u01F9': 'n',
2750
+ '\u0144': 'n',
2751
+ '\u00F1': 'n',
2752
+ '\u1E45': 'n',
2753
+ '\u0148': 'n',
2754
+ '\u1E47': 'n',
2755
+ '\u0146': 'n',
2756
+ '\u1E4B': 'n',
2757
+ '\u1E49': 'n',
2758
+ '\u019E': 'n',
2759
+ '\u0272': 'n',
2760
+ '\u0149': 'n',
2761
+ '\uA791': 'n',
2762
+ '\uA7A5': 'n',
2763
+ '\u01CC': 'nj',
2764
+ '\u24DE': 'o',
2765
+ '\uFF4F': 'o',
2766
+ '\u00F2': 'o',
2767
+ '\u00F3': 'o',
2768
+ '\u00F4': 'o',
2769
+ '\u1ED3': 'o',
2770
+ '\u1ED1': 'o',
2771
+ '\u1ED7': 'o',
2772
+ '\u1ED5': 'o',
2773
+ '\u00F5': 'o',
2774
+ '\u1E4D': 'o',
2775
+ '\u022D': 'o',
2776
+ '\u1E4F': 'o',
2777
+ '\u014D': 'o',
2778
+ '\u1E51': 'o',
2779
+ '\u1E53': 'o',
2780
+ '\u014F': 'o',
2781
+ '\u022F': 'o',
2782
+ '\u0231': 'o',
2783
+ '\u00F6': 'o',
2784
+ '\u022B': 'o',
2785
+ '\u1ECF': 'o',
2786
+ '\u0151': 'o',
2787
+ '\u01D2': 'o',
2788
+ '\u020D': 'o',
2789
+ '\u020F': 'o',
2790
+ '\u01A1': 'o',
2791
+ '\u1EDD': 'o',
2792
+ '\u1EDB': 'o',
2793
+ '\u1EE1': 'o',
2794
+ '\u1EDF': 'o',
2795
+ '\u1EE3': 'o',
2796
+ '\u1ECD': 'o',
2797
+ '\u1ED9': 'o',
2798
+ '\u01EB': 'o',
2799
+ '\u01ED': 'o',
2800
+ '\u00F8': 'o',
2801
+ '\u01FF': 'o',
2802
+ '\u0254': 'o',
2803
+ '\uA74B': 'o',
2804
+ '\uA74D': 'o',
2805
+ '\u0275': 'o',
2806
+ '\u01A3': 'oi',
2807
+ '\u0223': 'ou',
2808
+ '\uA74F': 'oo',
2809
+ '\u24DF': 'p',
2810
+ '\uFF50': 'p',
2811
+ '\u1E55': 'p',
2812
+ '\u1E57': 'p',
2813
+ '\u01A5': 'p',
2814
+ '\u1D7D': 'p',
2815
+ '\uA751': 'p',
2816
+ '\uA753': 'p',
2817
+ '\uA755': 'p',
2818
+ '\u24E0': 'q',
2819
+ '\uFF51': 'q',
2820
+ '\u024B': 'q',
2821
+ '\uA757': 'q',
2822
+ '\uA759': 'q',
2823
+ '\u24E1': 'r',
2824
+ '\uFF52': 'r',
2825
+ '\u0155': 'r',
2826
+ '\u1E59': 'r',
2827
+ '\u0159': 'r',
2828
+ '\u0211': 'r',
2829
+ '\u0213': 'r',
2830
+ '\u1E5B': 'r',
2831
+ '\u1E5D': 'r',
2832
+ '\u0157': 'r',
2833
+ '\u1E5F': 'r',
2834
+ '\u024D': 'r',
2835
+ '\u027D': 'r',
2836
+ '\uA75B': 'r',
2837
+ '\uA7A7': 'r',
2838
+ '\uA783': 'r',
2839
+ '\u24E2': 's',
2840
+ '\uFF53': 's',
2841
+ '\u00DF': 's',
2842
+ '\u015B': 's',
2843
+ '\u1E65': 's',
2844
+ '\u015D': 's',
2845
+ '\u1E61': 's',
2846
+ '\u0161': 's',
2847
+ '\u1E67': 's',
2848
+ '\u1E63': 's',
2849
+ '\u1E69': 's',
2850
+ '\u0219': 's',
2851
+ '\u015F': 's',
2852
+ '\u023F': 's',
2853
+ '\uA7A9': 's',
2854
+ '\uA785': 's',
2855
+ '\u1E9B': 's',
2856
+ '\u24E3': 't',
2857
+ '\uFF54': 't',
2858
+ '\u1E6B': 't',
2859
+ '\u1E97': 't',
2860
+ '\u0165': 't',
2861
+ '\u1E6D': 't',
2862
+ '\u021B': 't',
2863
+ '\u0163': 't',
2864
+ '\u1E71': 't',
2865
+ '\u1E6F': 't',
2866
+ '\u0167': 't',
2867
+ '\u01AD': 't',
2868
+ '\u0288': 't',
2869
+ '\u2C66': 't',
2870
+ '\uA787': 't',
2871
+ '\uA729': 'tz',
2872
+ '\u24E4': 'u',
2873
+ '\uFF55': 'u',
2874
+ '\u00F9': 'u',
2875
+ '\u00FA': 'u',
2876
+ '\u00FB': 'u',
2877
+ '\u0169': 'u',
2878
+ '\u1E79': 'u',
2879
+ '\u016B': 'u',
2880
+ '\u1E7B': 'u',
2881
+ '\u016D': 'u',
2882
+ '\u00FC': 'u',
2883
+ '\u01DC': 'u',
2884
+ '\u01D8': 'u',
2885
+ '\u01D6': 'u',
2886
+ '\u01DA': 'u',
2887
+ '\u1EE7': 'u',
2888
+ '\u016F': 'u',
2889
+ '\u0171': 'u',
2890
+ '\u01D4': 'u',
2891
+ '\u0215': 'u',
2892
+ '\u0217': 'u',
2893
+ '\u01B0': 'u',
2894
+ '\u1EEB': 'u',
2895
+ '\u1EE9': 'u',
2896
+ '\u1EEF': 'u',
2897
+ '\u1EED': 'u',
2898
+ '\u1EF1': 'u',
2899
+ '\u1EE5': 'u',
2900
+ '\u1E73': 'u',
2901
+ '\u0173': 'u',
2902
+ '\u1E77': 'u',
2903
+ '\u1E75': 'u',
2904
+ '\u0289': 'u',
2905
+ '\u24E5': 'v',
2906
+ '\uFF56': 'v',
2907
+ '\u1E7D': 'v',
2908
+ '\u1E7F': 'v',
2909
+ '\u028B': 'v',
2910
+ '\uA75F': 'v',
2911
+ '\u028C': 'v',
2912
+ '\uA761': 'vy',
2913
+ '\u24E6': 'w',
2914
+ '\uFF57': 'w',
2915
+ '\u1E81': 'w',
2916
+ '\u1E83': 'w',
2917
+ '\u0175': 'w',
2918
+ '\u1E87': 'w',
2919
+ '\u1E85': 'w',
2920
+ '\u1E98': 'w',
2921
+ '\u1E89': 'w',
2922
+ '\u2C73': 'w',
2923
+ '\u24E7': 'x',
2924
+ '\uFF58': 'x',
2925
+ '\u1E8B': 'x',
2926
+ '\u1E8D': 'x',
2927
+ '\u24E8': 'y',
2928
+ '\uFF59': 'y',
2929
+ '\u1EF3': 'y',
2930
+ '\u00FD': 'y',
2931
+ '\u0177': 'y',
2932
+ '\u1EF9': 'y',
2933
+ '\u0233': 'y',
2934
+ '\u1E8F': 'y',
2935
+ '\u00FF': 'y',
2936
+ '\u1EF7': 'y',
2937
+ '\u1E99': 'y',
2938
+ '\u1EF5': 'y',
2939
+ '\u01B4': 'y',
2940
+ '\u024F': 'y',
2941
+ '\u1EFF': 'y',
2942
+ '\u24E9': 'z',
2943
+ '\uFF5A': 'z',
2944
+ '\u017A': 'z',
2945
+ '\u1E91': 'z',
2946
+ '\u017C': 'z',
2947
+ '\u017E': 'z',
2948
+ '\u1E93': 'z',
2949
+ '\u1E95': 'z',
2950
+ '\u01B6': 'z',
2951
+ '\u0225': 'z',
2952
+ '\u0240': 'z',
2953
+ '\u2C6C': 'z',
2954
+ '\uA763': 'z',
2955
+ '\u0386': '\u0391',
2956
+ '\u0388': '\u0395',
2957
+ '\u0389': '\u0397',
2958
+ '\u038A': '\u0399',
2959
+ '\u03AA': '\u0399',
2960
+ '\u038C': '\u039F',
2961
+ '\u038E': '\u03A5',
2962
+ '\u03AB': '\u03A5',
2963
+ '\u038F': '\u03A9',
2964
+ '\u03AC': '\u03B1',
2965
+ '\u03AD': '\u03B5',
2966
+ '\u03AE': '\u03B7',
2967
+ '\u03AF': '\u03B9',
2968
+ '\u03CA': '\u03B9',
2969
+ '\u0390': '\u03B9',
2970
+ '\u03CC': '\u03BF',
2971
+ '\u03CD': '\u03C5',
2972
+ '\u03CB': '\u03C5',
2973
+ '\u03B0': '\u03C5',
2974
+ '\u03C9': '\u03C9',
2975
+ '\u03C2': '\u03C3'
2976
+ };
2977
+
2978
+ return diacritics;
2979
+ });
2980
+
2981
+ S2.define('select2/data/base',[
2982
+ '../utils'
2983
+ ], function (Utils) {
2984
+ function BaseAdapter ($element, options) {
2985
+ BaseAdapter.__super__.constructor.call(this);
2986
+ }
2987
+
2988
+ Utils.Extend(BaseAdapter, Utils.Observable);
2989
+
2990
+ BaseAdapter.prototype.current = function (callback) {
2991
+ throw new Error('The `current` method must be defined in child classes.');
2992
+ };
2993
+
2994
+ BaseAdapter.prototype.query = function (params, callback) {
2995
+ throw new Error('The `query` method must be defined in child classes.');
2996
+ };
2997
+
2998
+ BaseAdapter.prototype.bind = function (container, $container) {
2999
+ // Can be implemented in subclasses
3000
+ };
3001
+
3002
+ BaseAdapter.prototype.destroy = function () {
3003
+ // Can be implemented in subclasses
3004
+ };
3005
+
3006
+ BaseAdapter.prototype.generateResultId = function (container, data) {
3007
+ var id = container.id + '-result-';
3008
+
3009
+ id += Utils.generateChars(4);
3010
+
3011
+ if (data.id != null) {
3012
+ id += '-' + data.id.toString();
3013
+ } else {
3014
+ id += '-' + Utils.generateChars(4);
3015
+ }
3016
+ return id;
3017
+ };
3018
+
3019
+ return BaseAdapter;
3020
+ });
3021
+
3022
+ S2.define('select2/data/select',[
3023
+ './base',
3024
+ '../utils',
3025
+ 'jquery'
3026
+ ], function (BaseAdapter, Utils, $) {
3027
+ function SelectAdapter ($element, options) {
3028
+ this.$element = $element;
3029
+ this.options = options;
3030
+
3031
+ SelectAdapter.__super__.constructor.call(this);
3032
+ }
3033
+
3034
+ Utils.Extend(SelectAdapter, BaseAdapter);
3035
+
3036
+ SelectAdapter.prototype.current = function (callback) {
3037
+ var data = [];
3038
+ var self = this;
3039
+
3040
+ this.$element.find(':selected').each(function () {
3041
+ var $option = $(this);
3042
+
3043
+ var option = self.item($option);
3044
+
3045
+ data.push(option);
3046
+ });
3047
+
3048
+ callback(data);
3049
+ };
3050
+
3051
+ SelectAdapter.prototype.select = function (data) {
3052
+ var self = this;
3053
+
3054
+ data.selected = true;
3055
+
3056
+ // If data.element is a DOM node, use it instead
3057
+ if ($(data.element).is('option')) {
3058
+ data.element.selected = true;
3059
+
3060
+ this.$element.trigger('change');
3061
+
3062
+ return;
3063
+ }
3064
+
3065
+ if (this.$element.prop('multiple')) {
3066
+ this.current(function (currentData) {
3067
+ var val = [];
3068
+
3069
+ data = [data];
3070
+ data.push.apply(data, currentData);
3071
+
3072
+ for (var d = 0; d < data.length; d++) {
3073
+ var id = data[d].id;
3074
+
3075
+ if ($.inArray(id, val) === -1) {
3076
+ val.push(id);
3077
+ }
3078
+ }
3079
+
3080
+ self.$element.val(val);
3081
+ self.$element.trigger('change');
3082
+ });
3083
+ } else {
3084
+ var val = data.id;
3085
+
3086
+ this.$element.val(val);
3087
+ this.$element.trigger('change');
3088
+ }
3089
+ };
3090
+
3091
+ SelectAdapter.prototype.unselect = function (data) {
3092
+ var self = this;
3093
+
3094
+ if (!this.$element.prop('multiple')) {
3095
+ return;
3096
+ }
3097
+
3098
+ data.selected = false;
3099
+
3100
+ if ($(data.element).is('option')) {
3101
+ data.element.selected = false;
3102
+
3103
+ this.$element.trigger('change');
3104
+
3105
+ return;
3106
+ }
3107
+
3108
+ this.current(function (currentData) {
3109
+ var val = [];
3110
+
3111
+ for (var d = 0; d < currentData.length; d++) {
3112
+ var id = currentData[d].id;
3113
+
3114
+ if (id !== data.id && $.inArray(id, val) === -1) {
3115
+ val.push(id);
3116
+ }
3117
+ }
3118
+
3119
+ self.$element.val(val);
3120
+
3121
+ self.$element.trigger('change');
3122
+ });
3123
+ };
3124
+
3125
+ SelectAdapter.prototype.bind = function (container, $container) {
3126
+ var self = this;
3127
+
3128
+ this.container = container;
3129
+
3130
+ container.on('select', function (params) {
3131
+ self.select(params.data);
3132
+ });
3133
+
3134
+ container.on('unselect', function (params) {
3135
+ self.unselect(params.data);
3136
+ });
3137
+ };
3138
+
3139
+ SelectAdapter.prototype.destroy = function () {
3140
+ // Remove anything added to child elements
3141
+ this.$element.find('*').each(function () {
3142
+ // Remove any custom data set by Select2
3143
+ $.removeData(this, 'data');
3144
+ });
3145
+ };
3146
+
3147
+ SelectAdapter.prototype.query = function (params, callback) {
3148
+ var data = [];
3149
+ var self = this;
3150
+
3151
+ var $options = this.$element.children();
3152
+
3153
+ $options.each(function () {
3154
+ var $option = $(this);
3155
+
3156
+ if (!$option.is('option') && !$option.is('optgroup')) {
3157
+ return;
3158
+ }
3159
+
3160
+ var option = self.item($option);
3161
+
3162
+ var matches = self.matches(params, option);
3163
+
3164
+ if (matches !== null) {
3165
+ data.push(matches);
3166
+ }
3167
+ });
3168
+
3169
+ callback({
3170
+ results: data
3171
+ });
3172
+ };
3173
+
3174
+ SelectAdapter.prototype.addOptions = function ($options) {
3175
+ Utils.appendMany(this.$element, $options);
3176
+ };
3177
+
3178
+ SelectAdapter.prototype.option = function (data) {
3179
+ var option;
3180
+
3181
+ if (data.children) {
3182
+ option = document.createElement('optgroup');
3183
+ option.label = data.text;
3184
+ } else {
3185
+ option = document.createElement('option');
3186
+
3187
+ if (option.textContent !== undefined) {
3188
+ option.textContent = data.text;
3189
+ } else {
3190
+ option.innerText = data.text;
3191
+ }
3192
+ }
3193
+
3194
+ if (data.id) {
3195
+ option.value = data.id;
3196
+ }
3197
+
3198
+ if (data.disabled) {
3199
+ option.disabled = true;
3200
+ }
3201
+
3202
+ if (data.selected) {
3203
+ option.selected = true;
3204
+ }
3205
+
3206
+ if (data.title) {
3207
+ option.title = data.title;
3208
+ }
3209
+
3210
+ var $option = $(option);
3211
+
3212
+ var normalizedData = this._normalizeItem(data);
3213
+ normalizedData.element = option;
3214
+
3215
+ // Override the option's data with the combined data
3216
+ $.data(option, 'data', normalizedData);
3217
+
3218
+ return $option;
3219
+ };
3220
+
3221
+ SelectAdapter.prototype.item = function ($option) {
3222
+ var data = {};
3223
+
3224
+ data = $.data($option[0], 'data');
3225
+
3226
+ if (data != null) {
3227
+ return data;
3228
+ }
3229
+
3230
+ if ($option.is('option')) {
3231
+ data = {
3232
+ id: $option.val(),
3233
+ text: $option.text(),
3234
+ disabled: $option.prop('disabled'),
3235
+ selected: $option.prop('selected'),
3236
+ title: $option.prop('title')
3237
+ };
3238
+ } else if ($option.is('optgroup')) {
3239
+ data = {
3240
+ text: $option.prop('label'),
3241
+ children: [],
3242
+ title: $option.prop('title')
3243
+ };
3244
+
3245
+ var $children = $option.children('option');
3246
+ var children = [];
3247
+
3248
+ for (var c = 0; c < $children.length; c++) {
3249
+ var $child = $($children[c]);
3250
+
3251
+ var child = this.item($child);
3252
+
3253
+ children.push(child);
3254
+ }
3255
+
3256
+ data.children = children;
3257
+ }
3258
+
3259
+ data = this._normalizeItem(data);
3260
+ data.element = $option[0];
3261
+
3262
+ $.data($option[0], 'data', data);
3263
+
3264
+ return data;
3265
+ };
3266
+
3267
+ SelectAdapter.prototype._normalizeItem = function (item) {
3268
+ if (!$.isPlainObject(item)) {
3269
+ item = {
3270
+ id: item,
3271
+ text: item
3272
+ };
3273
+ }
3274
+
3275
+ item = $.extend({}, {
3276
+ text: ''
3277
+ }, item);
3278
+
3279
+ var defaults = {
3280
+ selected: false,
3281
+ disabled: false
3282
+ };
3283
+
3284
+ if (item.id != null) {
3285
+ item.id = item.id.toString();
3286
+ }
3287
+
3288
+ if (item.text != null) {
3289
+ item.text = item.text.toString();
3290
+ }
3291
+
3292
+ if (item._resultId == null && item.id && this.container != null) {
3293
+ item._resultId = this.generateResultId(this.container, item);
3294
+ }
3295
+
3296
+ return $.extend({}, defaults, item);
3297
+ };
3298
+
3299
+ SelectAdapter.prototype.matches = function (params, data) {
3300
+ var matcher = this.options.get('matcher');
3301
+
3302
+ return matcher(params, data);
3303
+ };
3304
+
3305
+ return SelectAdapter;
3306
+ });
3307
+
3308
+ S2.define('select2/data/array',[
3309
+ './select',
3310
+ '../utils',
3311
+ 'jquery'
3312
+ ], function (SelectAdapter, Utils, $) {
3313
+ function ArrayAdapter ($element, options) {
3314
+ var data = options.get('data') || [];
3315
+
3316
+ ArrayAdapter.__super__.constructor.call(this, $element, options);
3317
+
3318
+ this.addOptions(this.convertToOptions(data));
3319
+ }
3320
+
3321
+ Utils.Extend(ArrayAdapter, SelectAdapter);
3322
+
3323
+ ArrayAdapter.prototype.select = function (data) {
3324
+ var $option = this.$element.find('option').filter(function (i, elm) {
3325
+ return elm.value == data.id.toString();
3326
+ });
3327
+
3328
+ if ($option.length === 0) {
3329
+ $option = this.option(data);
3330
+
3331
+ this.addOptions($option);
3332
+ }
3333
+
3334
+ ArrayAdapter.__super__.select.call(this, data);
3335
+ };
3336
+
3337
+ ArrayAdapter.prototype.convertToOptions = function (data) {
3338
+ var self = this;
3339
+
3340
+ var $existing = this.$element.find('option');
3341
+ var existingIds = $existing.map(function () {
3342
+ return self.item($(this)).id;
3343
+ }).get();
3344
+
3345
+ var $options = [];
3346
+
3347
+ // Filter out all items except for the one passed in the argument
3348
+ function onlyItem (item) {
3349
+ return function () {
3350
+ return $(this).val() == item.id;
3351
+ };
3352
+ }
3353
+
3354
+ for (var d = 0; d < data.length; d++) {
3355
+ var item = this._normalizeItem(data[d]);
3356
+
3357
+ // Skip items which were pre-loaded, only merge the data
3358
+ if ($.inArray(item.id, existingIds) >= 0) {
3359
+ var $existingOption = $existing.filter(onlyItem(item));
3360
+
3361
+ var existingData = this.item($existingOption);
3362
+ var newData = $.extend(true, {}, item, existingData);
3363
+
3364
+ var $newOption = this.option(newData);
3365
+
3366
+ $existingOption.replaceWith($newOption);
3367
+
3368
+ continue;
3369
+ }
3370
+
3371
+ var $option = this.option(item);
3372
+
3373
+ if (item.children) {
3374
+ var $children = this.convertToOptions(item.children);
3375
+
3376
+ Utils.appendMany($option, $children);
3377
+ }
3378
+
3379
+ $options.push($option);
3380
+ }
3381
+
3382
+ return $options;
3383
+ };
3384
+
3385
+ return ArrayAdapter;
3386
+ });
3387
+
3388
+ S2.define('select2/data/ajax',[
3389
+ './array',
3390
+ '../utils',
3391
+ 'jquery'
3392
+ ], function (ArrayAdapter, Utils, $) {
3393
+ function AjaxAdapter ($element, options) {
3394
+ this.ajaxOptions = this._applyDefaults(options.get('ajax'));
3395
+
3396
+ if (this.ajaxOptions.processResults != null) {
3397
+ this.processResults = this.ajaxOptions.processResults;
3398
+ }
3399
+
3400
+ AjaxAdapter.__super__.constructor.call(this, $element, options);
3401
+ }
3402
+
3403
+ Utils.Extend(AjaxAdapter, ArrayAdapter);
3404
+
3405
+ AjaxAdapter.prototype._applyDefaults = function (options) {
3406
+ var defaults = {
3407
+ data: function (params) {
3408
+ return $.extend({}, params, {
3409
+ q: params.term
3410
+ });
3411
+ },
3412
+ transport: function (params, success, failure) {
3413
+ var $request = $.ajax(params);
3414
+
3415
+ $request.then(success);
3416
+ $request.fail(failure);
3417
+
3418
+ return $request;
3419
+ }
3420
+ };
3421
+
3422
+ return $.extend({}, defaults, options, true);
3423
+ };
3424
+
3425
+ AjaxAdapter.prototype.processResults = function (results) {
3426
+ return results;
3427
+ };
3428
+
3429
+ AjaxAdapter.prototype.query = function (params, callback) {
3430
+ var matches = [];
3431
+ var self = this;
3432
+
3433
+ if (this._request != null) {
3434
+ // JSONP requests cannot always be aborted
3435
+ if ($.isFunction(this._request.abort)) {
3436
+ this._request.abort();
3437
+ }
3438
+
3439
+ this._request = null;
3440
+ }
3441
+
3442
+ var options = $.extend({
3443
+ type: 'GET'
3444
+ }, this.ajaxOptions);
3445
+
3446
+ if (typeof options.url === 'function') {
3447
+ options.url = options.url.call(this.$element, params);
3448
+ }
3449
+
3450
+ if (typeof options.data === 'function') {
3451
+ options.data = options.data.call(this.$element, params);
3452
+ }
3453
+
3454
+ function request () {
3455
+ var $request = options.transport(options, function (data) {
3456
+ var results = self.processResults(data, params);
3457
+
3458
+ if (self.options.get('debug') && window.console && console.error) {
3459
+ // Check to make sure that the response included a `results` key.
3460
+ if (!results || !results.results || !$.isArray(results.results)) {
3461
+ console.error(
3462
+ 'Select2: The AJAX results did not return an array in the ' +
3463
+ '`results` key of the response.'
3464
+ );
3465
+ }
3466
+ }
3467
+
3468
+ callback(results);
3469
+ }, function () {
3470
+ // Attempt to detect if a request was aborted
3471
+ // Only works if the transport exposes a status property
3472
+ if ($request.status && $request.status === '0') {
3473
+ return;
3474
+ }
3475
+
3476
+ self.trigger('results:message', {
3477
+ message: 'errorLoading'
3478
+ });
3479
+ });
3480
+
3481
+ self._request = $request;
3482
+ }
3483
+
3484
+ if (this.ajaxOptions.delay && params.term != null) {
3485
+ if (this._queryTimeout) {
3486
+ window.clearTimeout(this._queryTimeout);
3487
+ }
3488
+
3489
+ this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay);
3490
+ } else {
3491
+ request();
3492
+ }
3493
+ };
3494
+
3495
+ return AjaxAdapter;
3496
+ });
3497
+
3498
+ S2.define('select2/data/tags',[
3499
+ 'jquery'
3500
+ ], function ($) {
3501
+ function Tags (decorated, $element, options) {
3502
+ var tags = options.get('tags');
3503
+
3504
+ var createTag = options.get('createTag');
3505
+
3506
+ if (createTag !== undefined) {
3507
+ this.createTag = createTag;
3508
+ }
3509
+
3510
+ var insertTag = options.get('insertTag');
3511
+
3512
+ if (insertTag !== undefined) {
3513
+ this.insertTag = insertTag;
3514
+ }
3515
+
3516
+ decorated.call(this, $element, options);
3517
+
3518
+ if ($.isArray(tags)) {
3519
+ for (var t = 0; t < tags.length; t++) {
3520
+ var tag = tags[t];
3521
+ var item = this._normalizeItem(tag);
3522
+
3523
+ var $option = this.option(item);
3524
+
3525
+ this.$element.append($option);
3526
+ }
3527
+ }
3528
+ }
3529
+
3530
+ Tags.prototype.query = function (decorated, params, callback) {
3531
+ var self = this;
3532
+
3533
+ this._removeOldTags();
3534
+
3535
+ if (params.term == null || params.page != null) {
3536
+ decorated.call(this, params, callback);
3537
+ return;
3538
+ }
3539
+
3540
+ function wrapper (obj, child) {
3541
+ var data = obj.results;
3542
+
3543
+ for (var i = 0; i < data.length; i++) {
3544
+ var option = data[i];
3545
+
3546
+ var checkChildren = (
3547
+ option.children != null &&
3548
+ !wrapper({
3549
+ results: option.children
3550
+ }, true)
3551
+ );
3552
+
3553
+ var checkText = option.text === params.term;
3554
+
3555
+ if (checkText || checkChildren) {
3556
+ if (child) {
3557
+ return false;
3558
+ }
3559
+
3560
+ obj.data = data;
3561
+ callback(obj);
3562
+
3563
+ return;
3564
+ }
3565
+ }
3566
+
3567
+ if (child) {
3568
+ return true;
3569
+ }
3570
+
3571
+ var tag = self.createTag(params);
3572
+
3573
+ if (tag != null) {
3574
+ var $option = self.option(tag);
3575
+ $option.attr('data-select2-tag', true);
3576
+
3577
+ self.addOptions([$option]);
3578
+
3579
+ self.insertTag(data, tag);
3580
+ }
3581
+
3582
+ obj.results = data;
3583
+
3584
+ callback(obj);
3585
+ }
3586
+
3587
+ decorated.call(this, params, wrapper);
3588
+ };
3589
+
3590
+ Tags.prototype.createTag = function (decorated, params) {
3591
+ var term = $.trim(params.term);
3592
+
3593
+ if (term === '') {
3594
+ return null;
3595
+ }
3596
+
3597
+ return {
3598
+ id: term,
3599
+ text: term
3600
+ };
3601
+ };
3602
+
3603
+ Tags.prototype.insertTag = function (_, data, tag) {
3604
+ data.unshift(tag);
3605
+ };
3606
+
3607
+ Tags.prototype._removeOldTags = function (_) {
3608
+ var tag = this._lastTag;
3609
+
3610
+ var $options = this.$element.find('option[data-select2-tag]');
3611
+
3612
+ $options.each(function () {
3613
+ if (this.selected) {
3614
+ return;
3615
+ }
3616
+
3617
+ $(this).remove();
3618
+ });
3619
+ };
3620
+
3621
+ return Tags;
3622
+ });
3623
+
3624
+ S2.define('select2/data/tokenizer',[
3625
+ 'jquery'
3626
+ ], function ($) {
3627
+ function Tokenizer (decorated, $element, options) {
3628
+ var tokenizer = options.get('tokenizer');
3629
+
3630
+ if (tokenizer !== undefined) {
3631
+ this.tokenizer = tokenizer;
3632
+ }
3633
+
3634
+ decorated.call(this, $element, options);
3635
+ }
3636
+
3637
+ Tokenizer.prototype.bind = function (decorated, container, $container) {
3638
+ decorated.call(this, container, $container);
3639
+
3640
+ this.$search = container.dropdown.$search || container.selection.$search ||
3641
+ $container.find('.select2-search__field');
3642
+ };
3643
+
3644
+ Tokenizer.prototype.query = function (decorated, params, callback) {
3645
+ var self = this;
3646
+
3647
+ function createAndSelect (data) {
3648
+ // Normalize the data object so we can use it for checks
3649
+ var item = self._normalizeItem(data);
3650
+
3651
+ // Check if the data object already exists as a tag
3652
+ // Select it if it doesn't
3653
+ var $existingOptions = self.$element.find('option').filter(function () {
3654
+ return $(this).val() === item.id;
3655
+ });
3656
+
3657
+ // If an existing option wasn't found for it, create the option
3658
+ if (!$existingOptions.length) {
3659
+ var $option = self.option(item);
3660
+ $option.attr('data-select2-tag', true);
3661
+
3662
+ self._removeOldTags();
3663
+ self.addOptions([$option]);
3664
+ }
3665
+
3666
+ // Select the item, now that we know there is an option for it
3667
+ select(item);
3668
+ }
3669
+
3670
+ function select (data) {
3671
+ self.trigger('select', {
3672
+ data: data
3673
+ });
3674
+ }
3675
+
3676
+ params.term = params.term || '';
3677
+
3678
+ var tokenData = this.tokenizer(params, this.options, createAndSelect);
3679
+
3680
+ if (tokenData.term !== params.term) {
3681
+ // Replace the search term if we have the search box
3682
+ if (this.$search.length) {
3683
+ this.$search.val(tokenData.term);
3684
+ this.$search.focus();
3685
+ }
3686
+
3687
+ params.term = tokenData.term;
3688
+ }
3689
+
3690
+ decorated.call(this, params, callback);
3691
+ };
3692
+
3693
+ Tokenizer.prototype.tokenizer = function (_, params, options, callback) {
3694
+ var separators = options.get('tokenSeparators') || [];
3695
+ var term = params.term;
3696
+ var i = 0;
3697
+
3698
+ var createTag = this.createTag || function (params) {
3699
+ return {
3700
+ id: params.term,
3701
+ text: params.term
3702
+ };
3703
+ };
3704
+
3705
+ while (i < term.length) {
3706
+ var termChar = term[i];
3707
+
3708
+ if ($.inArray(termChar, separators) === -1) {
3709
+ i++;
3710
+
3711
+ continue;
3712
+ }
3713
+
3714
+ var part = term.substr(0, i);
3715
+ var partParams = $.extend({}, params, {
3716
+ term: part
3717
+ });
3718
+
3719
+ var data = createTag(partParams);
3720
+
3721
+ if (data == null) {
3722
+ i++;
3723
+ continue;
3724
+ }
3725
+
3726
+ callback(data);
3727
+
3728
+ // Reset the term to not include the tokenized portion
3729
+ term = term.substr(i + 1) || '';
3730
+ i = 0;
3731
+ }
3732
+
3733
+ return {
3734
+ term: term
3735
+ };
3736
+ };
3737
+
3738
+ return Tokenizer;
3739
+ });
3740
+
3741
+ S2.define('select2/data/minimumInputLength',[
3742
+
3743
+ ], function () {
3744
+ function MinimumInputLength (decorated, $e, options) {
3745
+ this.minimumInputLength = options.get('minimumInputLength');
3746
+
3747
+ decorated.call(this, $e, options);
3748
+ }
3749
+
3750
+ MinimumInputLength.prototype.query = function (decorated, params, callback) {
3751
+ params.term = params.term || '';
3752
+
3753
+ if (params.term.length < this.minimumInputLength) {
3754
+ this.trigger('results:message', {
3755
+ message: 'inputTooShort',
3756
+ args: {
3757
+ minimum: this.minimumInputLength,
3758
+ input: params.term,
3759
+ params: params
3760
+ }
3761
+ });
3762
+
3763
+ return;
3764
+ }
3765
+
3766
+ decorated.call(this, params, callback);
3767
+ };
3768
+
3769
+ return MinimumInputLength;
3770
+ });
3771
+
3772
+ S2.define('select2/data/maximumInputLength',[
3773
+
3774
+ ], function () {
3775
+ function MaximumInputLength (decorated, $e, options) {
3776
+ this.maximumInputLength = options.get('maximumInputLength');
3777
+
3778
+ decorated.call(this, $e, options);
3779
+ }
3780
+
3781
+ MaximumInputLength.prototype.query = function (decorated, params, callback) {
3782
+ params.term = params.term || '';
3783
+
3784
+ if (this.maximumInputLength > 0 &&
3785
+ params.term.length > this.maximumInputLength) {
3786
+ this.trigger('results:message', {
3787
+ message: 'inputTooLong',
3788
+ args: {
3789
+ maximum: this.maximumInputLength,
3790
+ input: params.term,
3791
+ params: params
3792
+ }
3793
+ });
3794
+
3795
+ return;
3796
+ }
3797
+
3798
+ decorated.call(this, params, callback);
3799
+ };
3800
+
3801
+ return MaximumInputLength;
3802
+ });
3803
+
3804
+ S2.define('select2/data/maximumSelectionLength',[
3805
+
3806
+ ], function (){
3807
+ function MaximumSelectionLength (decorated, $e, options) {
3808
+ this.maximumSelectionLength = options.get('maximumSelectionLength');
3809
+
3810
+ decorated.call(this, $e, options);
3811
+ }
3812
+
3813
+ MaximumSelectionLength.prototype.query =
3814
+ function (decorated, params, callback) {
3815
+ var self = this;
3816
+
3817
+ this.current(function (currentData) {
3818
+ var count = currentData != null ? currentData.length : 0;
3819
+ if (self.maximumSelectionLength > 0 &&
3820
+ count >= self.maximumSelectionLength) {
3821
+ self.trigger('results:message', {
3822
+ message: 'maximumSelected',
3823
+ args: {
3824
+ maximum: self.maximumSelectionLength
3825
+ }
3826
+ });
3827
+ return;
3828
+ }
3829
+ decorated.call(self, params, callback);
3830
+ });
3831
+ };
3832
+
3833
+ return MaximumSelectionLength;
3834
+ });
3835
+
3836
+ S2.define('select2/dropdown',[
3837
+ 'jquery',
3838
+ './utils'
3839
+ ], function ($, Utils) {
3840
+ function Dropdown ($element, options) {
3841
+ this.$element = $element;
3842
+ this.options = options;
3843
+
3844
+ Dropdown.__super__.constructor.call(this);
3845
+ }
3846
+
3847
+ Utils.Extend(Dropdown, Utils.Observable);
3848
+
3849
+ Dropdown.prototype.render = function () {
3850
+ var $dropdown = $(
3851
+ '<span class="select2-dropdown">' +
3852
+ '<span class="select2-results"></span>' +
3853
+ '</span>'
3854
+ );
3855
+
3856
+ $dropdown.attr('dir', this.options.get('dir'));
3857
+
3858
+ this.$dropdown = $dropdown;
3859
+
3860
+ return $dropdown;
3861
+ };
3862
+
3863
+ Dropdown.prototype.bind = function () {
3864
+ // Should be implemented in subclasses
3865
+ };
3866
+
3867
+ Dropdown.prototype.position = function ($dropdown, $container) {
3868
+ // Should be implmented in subclasses
3869
+ };
3870
+
3871
+ Dropdown.prototype.destroy = function () {
3872
+ // Remove the dropdown from the DOM
3873
+ this.$dropdown.remove();
3874
+ };
3875
+
3876
+ return Dropdown;
3877
+ });
3878
+
3879
+ S2.define('select2/dropdown/search',[
3880
+ 'jquery',
3881
+ '../utils'
3882
+ ], function ($, Utils) {
3883
+ function Search () { }
3884
+
3885
+ Search.prototype.render = function (decorated) {
3886
+ var $rendered = decorated.call(this);
3887
+
3888
+ var $search = $(
3889
+ '<span class="select2-search select2-search--dropdown">' +
3890
+ '<input class="select2-search__field" type="search" tabindex="-1"' +
3891
+ ' autocomplete="off" autocorrect="off" autocapitalize="off"' +
3892
+ ' spellcheck="false" role="textbox" />' +
3893
+ '</span>'
3894
+ );
3895
+
3896
+ this.$searchContainer = $search;
3897
+ this.$search = $search.find('input');
3898
+
3899
+ $rendered.prepend($search);
3900
+
3901
+ return $rendered;
3902
+ };
3903
+
3904
+ Search.prototype.bind = function (decorated, container, $container) {
3905
+ var self = this;
3906
+
3907
+ decorated.call(this, container, $container);
3908
+
3909
+ this.$search.on('keydown', function (evt) {
3910
+ self.trigger('keypress', evt);
3911
+
3912
+ self._keyUpPrevented = evt.isDefaultPrevented();
3913
+ });
3914
+
3915
+ // Workaround for browsers which do not support the `input` event
3916
+ // This will prevent double-triggering of events for browsers which support
3917
+ // both the `keyup` and `input` events.
3918
+ this.$search.on('input', function (evt) {
3919
+ // Unbind the duplicated `keyup` event
3920
+ $(this).off('keyup');
3921
+ });
3922
+
3923
+ this.$search.on('keyup input', function (evt) {
3924
+ self.handleSearch(evt);
3925
+ });
3926
+
3927
+ container.on('open', function () {
3928
+ self.$search.attr('tabindex', 0);
3929
+
3930
+ self.$search.focus();
3931
+
3932
+ window.setTimeout(function () {
3933
+ self.$search.focus();
3934
+ }, 0);
3935
+ });
3936
+
3937
+ container.on('close', function () {
3938
+ self.$search.attr('tabindex', -1);
3939
+
3940
+ self.$search.val('');
3941
+ });
3942
+
3943
+ container.on('focus', function () {
3944
+ if (container.isOpen()) {
3945
+ self.$search.focus();
3946
+ }
3947
+ });
3948
+
3949
+ container.on('results:all', function (params) {
3950
+ if (params.query.term == null || params.query.term === '') {
3951
+ var showSearch = self.showSearch(params);
3952
+
3953
+ if (showSearch) {
3954
+ self.$searchContainer.removeClass('select2-search--hide');
3955
+ } else {
3956
+ self.$searchContainer.addClass('select2-search--hide');
3957
+ }
3958
+ }
3959
+ });
3960
+ };
3961
+
3962
+ Search.prototype.handleSearch = function (evt) {
3963
+ if (!this._keyUpPrevented) {
3964
+ var input = this.$search.val();
3965
+
3966
+ this.trigger('query', {
3967
+ term: input
3968
+ });
3969
+ }
3970
+
3971
+ this._keyUpPrevented = false;
3972
+ };
3973
+
3974
+ Search.prototype.showSearch = function (_, params) {
3975
+ return true;
3976
+ };
3977
+
3978
+ return Search;
3979
+ });
3980
+
3981
+ S2.define('select2/dropdown/hidePlaceholder',[
3982
+
3983
+ ], function () {
3984
+ function HidePlaceholder (decorated, $element, options, dataAdapter) {
3985
+ this.placeholder = this.normalizePlaceholder(options.get('placeholder'));
3986
+
3987
+ decorated.call(this, $element, options, dataAdapter);
3988
+ }
3989
+
3990
+ HidePlaceholder.prototype.append = function (decorated, data) {
3991
+ data.results = this.removePlaceholder(data.results);
3992
+
3993
+ decorated.call(this, data);
3994
+ };
3995
+
3996
+ HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) {
3997
+ if (typeof placeholder === 'string') {
3998
+ placeholder = {
3999
+ id: '',
4000
+ text: placeholder
4001
+ };
4002
+ }
4003
+
4004
+ return placeholder;
4005
+ };
4006
+
4007
+ HidePlaceholder.prototype.removePlaceholder = function (_, data) {
4008
+ var modifiedData = data.slice(0);
4009
+
4010
+ for (var d = data.length - 1; d >= 0; d--) {
4011
+ var item = data[d];
4012
+
4013
+ if (this.placeholder.id === item.id) {
4014
+ modifiedData.splice(d, 1);
4015
+ }
4016
+ }
4017
+
4018
+ return modifiedData;
4019
+ };
4020
+
4021
+ return HidePlaceholder;
4022
+ });
4023
+
4024
+ S2.define('select2/dropdown/infiniteScroll',[
4025
+ 'jquery'
4026
+ ], function ($) {
4027
+ function InfiniteScroll (decorated, $element, options, dataAdapter) {
4028
+ this.lastParams = {};
4029
+
4030
+ decorated.call(this, $element, options, dataAdapter);
4031
+
4032
+ this.$loadingMore = this.createLoadingMore();
4033
+ this.loading = false;
4034
+ }
4035
+
4036
+ InfiniteScroll.prototype.append = function (decorated, data) {
4037
+ this.$loadingMore.remove();
4038
+ this.loading = false;
4039
+
4040
+ decorated.call(this, data);
4041
+
4042
+ if (this.showLoadingMore(data)) {
4043
+ this.$results.append(this.$loadingMore);
4044
+ }
4045
+ };
4046
+
4047
+ InfiniteScroll.prototype.bind = function (decorated, container, $container) {
4048
+ var self = this;
4049
+
4050
+ decorated.call(this, container, $container);
4051
+
4052
+ container.on('query', function (params) {
4053
+ self.lastParams = params;
4054
+ self.loading = true;
4055
+ });
4056
+
4057
+ container.on('query:append', function (params) {
4058
+ self.lastParams = params;
4059
+ self.loading = true;
4060
+ });
4061
+
4062
+ this.$results.on('scroll', function () {
4063
+ var isLoadMoreVisible = $.contains(
4064
+ document.documentElement,
4065
+ self.$loadingMore[0]
4066
+ );
4067
+
4068
+ if (self.loading || !isLoadMoreVisible) {
4069
+ return;
4070
+ }
4071
+
4072
+ var currentOffset = self.$results.offset().top +
4073
+ self.$results.outerHeight(false);
4074
+ var loadingMoreOffset = self.$loadingMore.offset().top +
4075
+ self.$loadingMore.outerHeight(false);
4076
+
4077
+ if (currentOffset + 50 >= loadingMoreOffset) {
4078
+ self.loadMore();
4079
+ }
4080
+ });
4081
+ };
4082
+
4083
+ InfiniteScroll.prototype.loadMore = function () {
4084
+ this.loading = true;
4085
+
4086
+ var params = $.extend({}, {page: 1}, this.lastParams);
4087
+
4088
+ params.page++;
4089
+
4090
+ this.trigger('query:append', params);
4091
+ };
4092
+
4093
+ InfiniteScroll.prototype.showLoadingMore = function (_, data) {
4094
+ return data.pagination && data.pagination.more;
4095
+ };
4096
+
4097
+ InfiniteScroll.prototype.createLoadingMore = function () {
4098
+ var $option = $(
4099
+ '<li ' +
4100
+ 'class="select2-results__option select2-results__option--load-more"' +
4101
+ 'role="treeitem" aria-disabled="true"></li>'
4102
+ );
4103
+
4104
+ var message = this.options.get('translations').get('loadingMore');
4105
+
4106
+ $option.html(message(this.lastParams));
4107
+
4108
+ return $option;
4109
+ };
4110
+
4111
+ return InfiniteScroll;
4112
+ });
4113
+
4114
+ S2.define('select2/dropdown/attachBody',[
4115
+ 'jquery',
4116
+ '../utils'
4117
+ ], function ($, Utils) {
4118
+ function AttachBody (decorated, $element, options) {
4119
+ this.$dropdownParent = options.get('dropdownParent') || $(document.body);
4120
+
4121
+ decorated.call(this, $element, options);
4122
+ }
4123
+
4124
+ AttachBody.prototype.bind = function (decorated, container, $container) {
4125
+ var self = this;
4126
+
4127
+ var setupResultsEvents = false;
4128
+
4129
+ decorated.call(this, container, $container);
4130
+
4131
+ container.on('open', function () {
4132
+ self._showDropdown();
4133
+ self._attachPositioningHandler(container);
4134
+
4135
+ if (!setupResultsEvents) {
4136
+ setupResultsEvents = true;
4137
+
4138
+ container.on('results:all', function () {
4139
+ self._positionDropdown();
4140
+ self._resizeDropdown();
4141
+ });
4142
+
4143
+ container.on('results:append', function () {
4144
+ self._positionDropdown();
4145
+ self._resizeDropdown();
4146
+ });
4147
+ }
4148
+ });
4149
+
4150
+ container.on('close', function () {
4151
+ self._hideDropdown();
4152
+ self._detachPositioningHandler(container);
4153
+ });
4154
+
4155
+ this.$dropdownContainer.on('mousedown', function (evt) {
4156
+ evt.stopPropagation();
4157
+ });
4158
+ };
4159
+
4160
+ AttachBody.prototype.destroy = function (decorated) {
4161
+ decorated.call(this);
4162
+
4163
+ this.$dropdownContainer.remove();
4164
+ };
4165
+
4166
+ AttachBody.prototype.position = function (decorated, $dropdown, $container) {
4167
+ // Clone all of the container classes
4168
+ $dropdown.attr('class', $container.attr('class'));
4169
+
4170
+ $dropdown.removeClass('select2');
4171
+ $dropdown.addClass('select2-container--open');
4172
+
4173
+ $dropdown.css({
4174
+ position: 'absolute',
4175
+ top: -999999
4176
+ });
4177
+
4178
+ this.$container = $container;
4179
+ };
4180
+
4181
+ AttachBody.prototype.render = function (decorated) {
4182
+ var $container = $('<span></span>');
4183
+
4184
+ var $dropdown = decorated.call(this);
4185
+ $container.append($dropdown);
4186
+
4187
+ this.$dropdownContainer = $container;
4188
+
4189
+ return $container;
4190
+ };
4191
+
4192
+ AttachBody.prototype._hideDropdown = function (decorated) {
4193
+ this.$dropdownContainer.detach();
4194
+ };
4195
+
4196
+ AttachBody.prototype._attachPositioningHandler =
4197
+ function (decorated, container) {
4198
+ var self = this;
4199
+
4200
+ var scrollEvent = 'scroll.select2.' + container.id;
4201
+ var resizeEvent = 'resize.select2.' + container.id;
4202
+ var orientationEvent = 'orientationchange.select2.' + container.id;
4203
+
4204
+ var $watchers = this.$container.parents().filter(Utils.hasScroll);
4205
+ $watchers.each(function () {
4206
+ $(this).data('select2-scroll-position', {
4207
+ x: $(this).scrollLeft(),
4208
+ y: $(this).scrollTop()
4209
+ });
4210
+ });
4211
+
4212
+ $watchers.on(scrollEvent, function (ev) {
4213
+ var position = $(this).data('select2-scroll-position');
4214
+ $(this).scrollTop(position.y);
4215
+ });
4216
+
4217
+ $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent,
4218
+ function (e) {
4219
+ self._positionDropdown();
4220
+ self._resizeDropdown();
4221
+ });
4222
+ };
4223
+
4224
+ AttachBody.prototype._detachPositioningHandler =
4225
+ function (decorated, container) {
4226
+ var scrollEvent = 'scroll.select2.' + container.id;
4227
+ var resizeEvent = 'resize.select2.' + container.id;
4228
+ var orientationEvent = 'orientationchange.select2.' + container.id;
4229
+
4230
+ var $watchers = this.$container.parents().filter(Utils.hasScroll);
4231
+ $watchers.off(scrollEvent);
4232
+
4233
+ $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent);
4234
+ };
4235
+
4236
+ AttachBody.prototype._positionDropdown = function () {
4237
+ var $window = $(window);
4238
+
4239
+ var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above');
4240
+ var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below');
4241
+
4242
+ var newDirection = null;
4243
+
4244
+ var offset = this.$container.offset();
4245
+
4246
+ offset.bottom = offset.top + this.$container.outerHeight(false);
4247
+
4248
+ var container = {
4249
+ height: this.$container.outerHeight(false)
4250
+ };
4251
+
4252
+ container.top = offset.top;
4253
+ container.bottom = offset.top + container.height;
4254
+
4255
+ var dropdown = {
4256
+ height: this.$dropdown.outerHeight(false)
4257
+ };
4258
+
4259
+ var viewport = {
4260
+ top: $window.scrollTop(),
4261
+ bottom: $window.scrollTop() + $window.height()
4262
+ };
4263
+
4264
+ var enoughRoomAbove = viewport.top < (offset.top - dropdown.height);
4265
+ var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height);
4266
+
4267
+ var css = {
4268
+ left: offset.left,
4269
+ top: container.bottom
4270
+ };
4271
+
4272
+ // Determine what the parent element is to use for calciulating the offset
4273
+ var $offsetParent = this.$dropdownParent;
4274
+
4275
+ // For statically positoned elements, we need to get the element
4276
+ // that is determining the offset
4277
+ if ($offsetParent.css('position') === 'static') {
4278
+ $offsetParent = $offsetParent.offsetParent();
4279
+ }
4280
+
4281
+ var parentOffset = $offsetParent.offset();
4282
+
4283
+ css.top -= parentOffset.top;
4284
+ css.left -= parentOffset.left;
4285
+
4286
+ if (!isCurrentlyAbove && !isCurrentlyBelow) {
4287
+ newDirection = 'below';
4288
+ }
4289
+
4290
+ if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) {
4291
+ newDirection = 'above';
4292
+ } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) {
4293
+ newDirection = 'below';
4294
+ }
4295
+
4296
+ if (newDirection == 'above' ||
4297
+ (isCurrentlyAbove && newDirection !== 'below')) {
4298
+ css.top = container.top - parentOffset.top - dropdown.height;
4299
+ }
4300
+
4301
+ if (newDirection != null) {
4302
+ this.$dropdown
4303
+ .removeClass('select2-dropdown--below select2-dropdown--above')
4304
+ .addClass('select2-dropdown--' + newDirection);
4305
+ this.$container
4306
+ .removeClass('select2-container--below select2-container--above')
4307
+ .addClass('select2-container--' + newDirection);
4308
+ }
4309
+
4310
+ this.$dropdownContainer.css(css);
4311
+ };
4312
+
4313
+ AttachBody.prototype._resizeDropdown = function () {
4314
+ var css = {
4315
+ width: this.$container.outerWidth(false) + 'px'
4316
+ };
4317
+
4318
+ if (this.options.get('dropdownAutoWidth')) {
4319
+ css.minWidth = css.width;
4320
+ css.position = 'relative';
4321
+ css.width = 'auto';
4322
+ }
4323
+
4324
+ this.$dropdown.css(css);
4325
+ };
4326
+
4327
+ AttachBody.prototype._showDropdown = function (decorated) {
4328
+ this.$dropdownContainer.appendTo(this.$dropdownParent);
4329
+
4330
+ this._positionDropdown();
4331
+ this._resizeDropdown();
4332
+ };
4333
+
4334
+ return AttachBody;
4335
+ });
4336
+
4337
+ S2.define('select2/dropdown/minimumResultsForSearch',[
4338
+
4339
+ ], function () {
4340
+ function countResults (data) {
4341
+ var count = 0;
4342
+
4343
+ for (var d = 0; d < data.length; d++) {
4344
+ var item = data[d];
4345
+
4346
+ if (item.children) {
4347
+ count += countResults(item.children);
4348
+ } else {
4349
+ count++;
4350
+ }
4351
+ }
4352
+
4353
+ return count;
4354
+ }
4355
+
4356
+ function MinimumResultsForSearch (decorated, $element, options, dataAdapter) {
4357
+ this.minimumResultsForSearch = options.get('minimumResultsForSearch');
4358
+
4359
+ if (this.minimumResultsForSearch < 0) {
4360
+ this.minimumResultsForSearch = Infinity;
4361
+ }
4362
+
4363
+ decorated.call(this, $element, options, dataAdapter);
4364
+ }
4365
+
4366
+ MinimumResultsForSearch.prototype.showSearch = function (decorated, params) {
4367
+ if (countResults(params.data.results) < this.minimumResultsForSearch) {
4368
+ return false;
4369
+ }
4370
+
4371
+ return decorated.call(this, params);
4372
+ };
4373
+
4374
+ return MinimumResultsForSearch;
4375
+ });
4376
+
4377
+ S2.define('select2/dropdown/selectOnClose',[
4378
+
4379
+ ], function () {
4380
+ function SelectOnClose () { }
4381
+
4382
+ SelectOnClose.prototype.bind = function (decorated, container, $container) {
4383
+ var self = this;
4384
+
4385
+ decorated.call(this, container, $container);
4386
+
4387
+ container.on('close', function (params) {
4388
+ self._handleSelectOnClose(params);
4389
+ });
4390
+ };
4391
+
4392
+ SelectOnClose.prototype._handleSelectOnClose = function (_, params) {
4393
+ if (params && params.originalSelect2Event != null) {
4394
+ var event = params.originalSelect2Event;
4395
+
4396
+ // Don't select an item if the close event was triggered from a select or
4397
+ // unselect event
4398
+ if (event._type === 'select' || event._type === 'unselect') {
4399
+ return;
4400
+ }
4401
+ }
4402
+
4403
+ var $highlightedResults = this.getHighlightedResults();
4404
+
4405
+ // Only select highlighted results
4406
+ if ($highlightedResults.length < 1) {
4407
+ return;
4408
+ }
4409
+
4410
+ var data = $highlightedResults.data('data');
4411
+
4412
+ // Don't re-select already selected resulte
4413
+ if (
4414
+ (data.element != null && data.element.selected) ||
4415
+ (data.element == null && data.selected)
4416
+ ) {
4417
+ return;
4418
+ }
4419
+
4420
+ this.trigger('select', {
4421
+ data: data
4422
+ });
4423
+ };
4424
+
4425
+ return SelectOnClose;
4426
+ });
4427
+
4428
+ S2.define('select2/dropdown/closeOnSelect',[
4429
+
4430
+ ], function () {
4431
+ function CloseOnSelect () { }
4432
+
4433
+ CloseOnSelect.prototype.bind = function (decorated, container, $container) {
4434
+ var self = this;
4435
+
4436
+ decorated.call(this, container, $container);
4437
+
4438
+ container.on('select', function (evt) {
4439
+ self._selectTriggered(evt);
4440
+ });
4441
+
4442
+ container.on('unselect', function (evt) {
4443
+ self._selectTriggered(evt);
4444
+ });
4445
+ };
4446
+
4447
+ CloseOnSelect.prototype._selectTriggered = function (_, evt) {
4448
+ var originalEvent = evt.originalEvent;
4449
+
4450
+ // Don't close if the control key is being held
4451
+ if (originalEvent && originalEvent.ctrlKey) {
4452
+ return;
4453
+ }
4454
+
4455
+ this.trigger('close', {
4456
+ originalEvent: originalEvent,
4457
+ originalSelect2Event: evt
4458
+ });
4459
+ };
4460
+
4461
+ return CloseOnSelect;
4462
+ });
4463
+
4464
+ S2.define('select2/i18n/en',[],function () {
4465
+ // English
4466
+ return {
4467
+ errorLoading: function () {
4468
+ return 'The results could not be loaded.';
4469
+ },
4470
+ inputTooLong: function (args) {
4471
+ var overChars = args.input.length - args.maximum;
4472
+
4473
+ var message = 'Please delete ' + overChars + ' character';
4474
+
4475
+ if (overChars != 1) {
4476
+ message += 's';
4477
+ }
4478
+
4479
+ return message;
4480
+ },
4481
+ inputTooShort: function (args) {
4482
+ var remainingChars = args.minimum - args.input.length;
4483
+
4484
+ var message = 'Please enter ' + remainingChars + ' or more characters';
4485
+
4486
+ return message;
4487
+ },
4488
+ loadingMore: function () {
4489
+ return 'Loading more results…';
4490
+ },
4491
+ maximumSelected: function (args) {
4492
+ var message = 'You can only select ' + args.maximum + ' item';
4493
+
4494
+ if (args.maximum != 1) {
4495
+ message += 's';
4496
+ }
4497
+
4498
+ return message;
4499
+ },
4500
+ noResults: function () {
4501
+ return 'No results found';
4502
+ },
4503
+ searching: function () {
4504
+ return 'Searching…';
4505
+ }
4506
+ };
4507
+ });
4508
+
4509
+ S2.define('select2/defaults',[
4510
+ 'jquery',
4511
+ 'require',
4512
+
4513
+ './results',
4514
+
4515
+ './selection/single',
4516
+ './selection/multiple',
4517
+ './selection/placeholder',
4518
+ './selection/allowClear',
4519
+ './selection/search',
4520
+ './selection/eventRelay',
4521
+
4522
+ './utils',
4523
+ './translation',
4524
+ './diacritics',
4525
+
4526
+ './data/select',
4527
+ './data/array',
4528
+ './data/ajax',
4529
+ './data/tags',
4530
+ './data/tokenizer',
4531
+ './data/minimumInputLength',
4532
+ './data/maximumInputLength',
4533
+ './data/maximumSelectionLength',
4534
+
4535
+ './dropdown',
4536
+ './dropdown/search',
4537
+ './dropdown/hidePlaceholder',
4538
+ './dropdown/infiniteScroll',
4539
+ './dropdown/attachBody',
4540
+ './dropdown/minimumResultsForSearch',
4541
+ './dropdown/selectOnClose',
4542
+ './dropdown/closeOnSelect',
4543
+
4544
+ './i18n/en'
4545
+ ], function ($, require,
4546
+
4547
+ ResultsList,
4548
+
4549
+ SingleSelection, MultipleSelection, Placeholder, AllowClear,
4550
+ SelectionSearch, EventRelay,
4551
+
4552
+ Utils, Translation, DIACRITICS,
4553
+
4554
+ SelectData, ArrayData, AjaxData, Tags, Tokenizer,
4555
+ MinimumInputLength, MaximumInputLength, MaximumSelectionLength,
4556
+
4557
+ Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll,
4558
+ AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect,
4559
+
4560
+ EnglishTranslation) {
4561
+ function Defaults () {
4562
+ this.reset();
4563
+ }
4564
+
4565
+ Defaults.prototype.apply = function (options) {
4566
+ options = $.extend(true, {}, this.defaults, options);
4567
+
4568
+ if (options.dataAdapter == null) {
4569
+ if (options.ajax != null) {
4570
+ options.dataAdapter = AjaxData;
4571
+ } else if (options.data != null) {
4572
+ options.dataAdapter = ArrayData;
4573
+ } else {
4574
+ options.dataAdapter = SelectData;
4575
+ }
4576
+
4577
+ if (options.minimumInputLength > 0) {
4578
+ options.dataAdapter = Utils.Decorate(
4579
+ options.dataAdapter,
4580
+ MinimumInputLength
4581
+ );
4582
+ }
4583
+
4584
+ if (options.maximumInputLength > 0) {
4585
+ options.dataAdapter = Utils.Decorate(
4586
+ options.dataAdapter,
4587
+ MaximumInputLength
4588
+ );
4589
+ }
4590
+
4591
+ if (options.maximumSelectionLength > 0) {
4592
+ options.dataAdapter = Utils.Decorate(
4593
+ options.dataAdapter,
4594
+ MaximumSelectionLength
4595
+ );
4596
+ }
4597
+
4598
+ if (options.tags) {
4599
+ options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags);
4600
+ }
4601
+
4602
+ if (options.tokenSeparators != null || options.tokenizer != null) {
4603
+ options.dataAdapter = Utils.Decorate(
4604
+ options.dataAdapter,
4605
+ Tokenizer
4606
+ );
4607
+ }
4608
+
4609
+ if (options.query != null) {
4610
+ var Query = require(options.amdBase + 'compat/query');
4611
+
4612
+ options.dataAdapter = Utils.Decorate(
4613
+ options.dataAdapter,
4614
+ Query
4615
+ );
4616
+ }
4617
+
4618
+ if (options.initSelection != null) {
4619
+ var InitSelection = require(options.amdBase + 'compat/initSelection');
4620
+
4621
+ options.dataAdapter = Utils.Decorate(
4622
+ options.dataAdapter,
4623
+ InitSelection
4624
+ );
4625
+ }
4626
+ }
4627
+
4628
+ if (options.resultsAdapter == null) {
4629
+ options.resultsAdapter = ResultsList;
4630
+
4631
+ if (options.ajax != null) {
4632
+ options.resultsAdapter = Utils.Decorate(
4633
+ options.resultsAdapter,
4634
+ InfiniteScroll
4635
+ );
4636
+ }
4637
+
4638
+ if (options.placeholder != null) {
4639
+ options.resultsAdapter = Utils.Decorate(
4640
+ options.resultsAdapter,
4641
+ HidePlaceholder
4642
+ );
4643
+ }
4644
+
4645
+ if (options.selectOnClose) {
4646
+ options.resultsAdapter = Utils.Decorate(
4647
+ options.resultsAdapter,
4648
+ SelectOnClose
4649
+ );
4650
+ }
4651
+ }
4652
+
4653
+ if (options.dropdownAdapter == null) {
4654
+ if (options.multiple) {
4655
+ options.dropdownAdapter = Dropdown;
4656
+ } else {
4657
+ var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch);
4658
+
4659
+ options.dropdownAdapter = SearchableDropdown;
4660
+ }
4661
+
4662
+ if (options.minimumResultsForSearch !== 0) {
4663
+ options.dropdownAdapter = Utils.Decorate(
4664
+ options.dropdownAdapter,
4665
+ MinimumResultsForSearch
4666
+ );
4667
+ }
4668
+
4669
+ if (options.closeOnSelect) {
4670
+ options.dropdownAdapter = Utils.Decorate(
4671
+ options.dropdownAdapter,
4672
+ CloseOnSelect
4673
+ );
4674
+ }
4675
+
4676
+ if (
4677
+ options.dropdownCssClass != null ||
4678
+ options.dropdownCss != null ||
4679
+ options.adaptDropdownCssClass != null
4680
+ ) {
4681
+ var DropdownCSS = require(options.amdBase + 'compat/dropdownCss');
4682
+
4683
+ options.dropdownAdapter = Utils.Decorate(
4684
+ options.dropdownAdapter,
4685
+ DropdownCSS
4686
+ );
4687
+ }
4688
+
4689
+ options.dropdownAdapter = Utils.Decorate(
4690
+ options.dropdownAdapter,
4691
+ AttachBody
4692
+ );
4693
+ }
4694
+
4695
+ if (options.selectionAdapter == null) {
4696
+ if (options.multiple) {
4697
+ options.selectionAdapter = MultipleSelection;
4698
+ } else {
4699
+ options.selectionAdapter = SingleSelection;
4700
+ }
4701
+
4702
+ // Add the placeholder mixin if a placeholder was specified
4703
+ if (options.placeholder != null) {
4704
+ options.selectionAdapter = Utils.Decorate(
4705
+ options.selectionAdapter,
4706
+ Placeholder
4707
+ );
4708
+ }
4709
+
4710
+ if (options.allowClear) {
4711
+ options.selectionAdapter = Utils.Decorate(
4712
+ options.selectionAdapter,
4713
+ AllowClear
4714
+ );
4715
+ }
4716
+
4717
+ if (options.multiple) {
4718
+ options.selectionAdapter = Utils.Decorate(
4719
+ options.selectionAdapter,
4720
+ SelectionSearch
4721
+ );
4722
+ }
4723
+
4724
+ if (
4725
+ options.containerCssClass != null ||
4726
+ options.containerCss != null ||
4727
+ options.adaptContainerCssClass != null
4728
+ ) {
4729
+ var ContainerCSS = require(options.amdBase + 'compat/containerCss');
4730
+
4731
+ options.selectionAdapter = Utils.Decorate(
4732
+ options.selectionAdapter,
4733
+ ContainerCSS
4734
+ );
4735
+ }
4736
+
4737
+ options.selectionAdapter = Utils.Decorate(
4738
+ options.selectionAdapter,
4739
+ EventRelay
4740
+ );
4741
+ }
4742
+
4743
+ if (typeof options.language === 'string') {
4744
+ // Check if the language is specified with a region
4745
+ if (options.language.indexOf('-') > 0) {
4746
+ // Extract the region information if it is included
4747
+ var languageParts = options.language.split('-');
4748
+ var baseLanguage = languageParts[0];
4749
+
4750
+ options.language = [options.language, baseLanguage];
4751
+ } else {
4752
+ options.language = [options.language];
4753
+ }
4754
+ }
4755
+
4756
+ if ($.isArray(options.language)) {
4757
+ var languages = new Translation();
4758
+ options.language.push('en');
4759
+
4760
+ var languageNames = options.language;
4761
+
4762
+ for (var l = 0; l < languageNames.length; l++) {
4763
+ var name = languageNames[l];
4764
+ var language = {};
4765
+
4766
+ try {
4767
+ // Try to load it with the original name
4768
+ language = Translation.loadPath(name);
4769
+ } catch (e) {
4770
+ try {
4771
+ // If we couldn't load it, check if it wasn't the full path
4772
+ name = this.defaults.amdLanguageBase + name;
4773
+ language = Translation.loadPath(name);
4774
+ } catch (ex) {
4775
+ // The translation could not be loaded at all. Sometimes this is
4776
+ // because of a configuration problem, other times this can be
4777
+ // because of how Select2 helps load all possible translation files.
4778
+ if (options.debug && window.console && console.warn) {
4779
+ console.warn(
4780
+ 'Select2: The language file for "' + name + '" could not be ' +
4781
+ 'automatically loaded. A fallback will be used instead.'
4782
+ );
4783
+ }
4784
+
4785
+ continue;
4786
+ }
4787
+ }
4788
+
4789
+ languages.extend(language);
4790
+ }
4791
+
4792
+ options.translations = languages;
4793
+ } else {
4794
+ var baseTranslation = Translation.loadPath(
4795
+ this.defaults.amdLanguageBase + 'en'
4796
+ );
4797
+ var customTranslation = new Translation(options.language);
4798
+
4799
+ customTranslation.extend(baseTranslation);
4800
+
4801
+ options.translations = customTranslation;
4802
+ }
4803
+
4804
+ return options;
4805
+ };
4806
+
4807
+ Defaults.prototype.reset = function () {
4808
+ function stripDiacritics (text) {
4809
+ // Used 'uni range + named function' from http://jsperf.com/diacritics/18
4810
+ function match(a) {
4811
+ return DIACRITICS[a] || a;
4812
+ }
4813
+
4814
+ return text.replace(/[^\u0000-\u007E]/g, match);
4815
+ }
4816
+
4817
+ function matcher (params, data) {
4818
+ // Always return the object if there is nothing to compare
4819
+ if ($.trim(params.term) === '') {
4820
+ return data;
4821
+ }
4822
+
4823
+ // Do a recursive check for options with children
4824
+ if (data.children && data.children.length > 0) {
4825
+ // Clone the data object if there are children
4826
+ // This is required as we modify the object to remove any non-matches
4827
+ var match = $.extend(true, {}, data);
4828
+
4829
+ // Check each child of the option
4830
+ for (var c = data.children.length - 1; c >= 0; c--) {
4831
+ var child = data.children[c];
4832
+
4833
+ var matches = matcher(params, child);
4834
+
4835
+ // If there wasn't a match, remove the object in the array
4836
+ if (matches == null) {
4837
+ match.children.splice(c, 1);
4838
+ }
4839
+ }
4840
+
4841
+ // If any children matched, return the new object
4842
+ if (match.children.length > 0) {
4843
+ return match;
4844
+ }
4845
+
4846
+ // If there were no matching children, check just the plain object
4847
+ return matcher(params, match);
4848
+ }
4849
+
4850
+ var original = stripDiacritics(data.text).toUpperCase();
4851
+ var term = stripDiacritics(params.term).toUpperCase();
4852
+
4853
+ // Check if the text contains the term
4854
+ if (original.indexOf(term) > -1) {
4855
+ return data;
4856
+ }
4857
+
4858
+ // If it doesn't contain the term, don't return anything
4859
+ return null;
4860
+ }
4861
+
4862
+ this.defaults = {
4863
+ amdBase: './',
4864
+ amdLanguageBase: './i18n/',
4865
+ closeOnSelect: true,
4866
+ debug: false,
4867
+ dropdownAutoWidth: false,
4868
+ escapeMarkup: Utils.escapeMarkup,
4869
+ language: EnglishTranslation,
4870
+ matcher: matcher,
4871
+ minimumInputLength: 0,
4872
+ maximumInputLength: 0,
4873
+ maximumSelectionLength: 0,
4874
+ minimumResultsForSearch: 0,
4875
+ selectOnClose: false,
4876
+ sorter: function (data) {
4877
+ return data;
4878
+ },
4879
+ templateResult: function (result) {
4880
+ return result.text;
4881
+ },
4882
+ templateSelection: function (selection) {
4883
+ return selection.text;
4884
+ },
4885
+ theme: 'default',
4886
+ width: 'resolve'
4887
+ };
4888
+ };
4889
+
4890
+ Defaults.prototype.set = function (key, value) {
4891
+ var camelKey = $.camelCase(key);
4892
+
4893
+ var data = {};
4894
+ data[camelKey] = value;
4895
+
4896
+ var convertedData = Utils._convertData(data);
4897
+
4898
+ $.extend(this.defaults, convertedData);
4899
+ };
4900
+
4901
+ var defaults = new Defaults();
4902
+
4903
+ return defaults;
4904
+ });
4905
+
4906
+ S2.define('select2/options',[
4907
+ 'require',
4908
+ 'jquery',
4909
+ './defaults',
4910
+ './utils'
4911
+ ], function (require, $, Defaults, Utils) {
4912
+ function Options (options, $element) {
4913
+ this.options = options;
4914
+
4915
+ if ($element != null) {
4916
+ this.fromElement($element);
4917
+ }
4918
+
4919
+ this.options = Defaults.apply(this.options);
4920
+
4921
+ if ($element && $element.is('input')) {
4922
+ var InputCompat = require(this.get('amdBase') + 'compat/inputData');
4923
+
4924
+ this.options.dataAdapter = Utils.Decorate(
4925
+ this.options.dataAdapter,
4926
+ InputCompat
4927
+ );
4928
+ }
4929
+ }
4930
+
4931
+ Options.prototype.fromElement = function ($e) {
4932
+ var excludedData = ['select2'];
4933
+
4934
+ if (this.options.multiple == null) {
4935
+ this.options.multiple = $e.prop('multiple');
4936
+ }
4937
+
4938
+ if (this.options.disabled == null) {
4939
+ this.options.disabled = $e.prop('disabled');
4940
+ }
4941
+
4942
+ if (this.options.language == null) {
4943
+ if ($e.prop('lang')) {
4944
+ this.options.language = $e.prop('lang').toLowerCase();
4945
+ } else if ($e.closest('[lang]').prop('lang')) {
4946
+ this.options.language = $e.closest('[lang]').prop('lang');
4947
+ }
4948
+ }
4949
+
4950
+ if (this.options.dir == null) {
4951
+ if ($e.prop('dir')) {
4952
+ this.options.dir = $e.prop('dir');
4953
+ } else if ($e.closest('[dir]').prop('dir')) {
4954
+ this.options.dir = $e.closest('[dir]').prop('dir');
4955
+ } else {
4956
+ this.options.dir = 'ltr';
4957
+ }
4958
+ }
4959
+
4960
+ $e.prop('disabled', this.options.disabled);
4961
+ $e.prop('multiple', this.options.multiple);
4962
+
4963
+ if ($e.data('select2Tags')) {
4964
+ if (this.options.debug && window.console && console.warn) {
4965
+ console.warn(
4966
+ 'Select2: The `data-select2-tags` attribute has been changed to ' +
4967
+ 'use the `data-data` and `data-tags="true"` attributes and will be ' +
4968
+ 'removed in future versions of Select2.'
4969
+ );
4970
+ }
4971
+
4972
+ $e.data('data', $e.data('select2Tags'));
4973
+ $e.data('tags', true);
4974
+ }
4975
+
4976
+ if ($e.data('ajaxUrl')) {
4977
+ if (this.options.debug && window.console && console.warn) {
4978
+ console.warn(
4979
+ 'Select2: The `data-ajax-url` attribute has been changed to ' +
4980
+ '`data-ajax--url` and support for the old attribute will be removed' +
4981
+ ' in future versions of Select2.'
4982
+ );
4983
+ }
4984
+
4985
+ $e.attr('ajax--url', $e.data('ajaxUrl'));
4986
+ $e.data('ajax--url', $e.data('ajaxUrl'));
4987
+ }
4988
+
4989
+ var dataset = {};
4990
+
4991
+ // Prefer the element's `dataset` attribute if it exists
4992
+ // jQuery 1.x does not correctly handle data attributes with multiple dashes
4993
+ if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) {
4994
+ dataset = $.extend(true, {}, $e[0].dataset, $e.data());
4995
+ } else {
4996
+ dataset = $e.data();
4997
+ }
4998
+
4999
+ var data = $.extend(true, {}, dataset);
5000
+
5001
+ data = Utils._convertData(data);
5002
+
5003
+ for (var key in data) {
5004
+ if ($.inArray(key, excludedData) > -1) {
5005
+ continue;
5006
+ }
5007
+
5008
+ if ($.isPlainObject(this.options[key])) {
5009
+ $.extend(this.options[key], data[key]);
5010
+ } else {
5011
+ this.options[key] = data[key];
5012
+ }
5013
+ }
5014
+
5015
+ return this;
5016
+ };
5017
+
5018
+ Options.prototype.get = function (key) {
5019
+ return this.options[key];
5020
+ };
5021
+
5022
+ Options.prototype.set = function (key, val) {
5023
+ this.options[key] = val;
5024
+ };
5025
+
5026
+ return Options;
5027
+ });
5028
+
5029
+ S2.define('select2/core',[
5030
+ 'jquery',
5031
+ './options',
5032
+ './utils',
5033
+ './keys'
5034
+ ], function ($, Options, Utils, KEYS) {
5035
+ var Select2 = function ($element, options) {
5036
+ if ($element.data('select2') != null) {
5037
+ $element.data('select2').destroy();
5038
+ }
5039
+
5040
+ this.$element = $element;
5041
+
5042
+ this.id = this._generateId($element);
5043
+
5044
+ options = options || {};
5045
+
5046
+ this.options = new Options(options, $element);
5047
+
5048
+ Select2.__super__.constructor.call(this);
5049
+
5050
+ // Set up the tabindex
5051
+
5052
+ var tabindex = $element.attr('tabindex') || 0;
5053
+ $element.data('old-tabindex', tabindex);
5054
+ $element.attr('tabindex', '-1');
5055
+
5056
+ // Set up containers and adapters
5057
+
5058
+ var DataAdapter = this.options.get('dataAdapter');
5059
+ this.dataAdapter = new DataAdapter($element, this.options);
5060
+
5061
+ var $container = this.render();
5062
+
5063
+ this._placeContainer($container);
5064
+
5065
+ var SelectionAdapter = this.options.get('selectionAdapter');
5066
+ this.selection = new SelectionAdapter($element, this.options);
5067
+ this.$selection = this.selection.render();
5068
+
5069
+ this.selection.position(this.$selection, $container);
5070
+
5071
+ var DropdownAdapter = this.options.get('dropdownAdapter');
5072
+ this.dropdown = new DropdownAdapter($element, this.options);
5073
+ this.$dropdown = this.dropdown.render();
5074
+
5075
+ this.dropdown.position(this.$dropdown, $container);
5076
+
5077
+ var ResultsAdapter = this.options.get('resultsAdapter');
5078
+ this.results = new ResultsAdapter($element, this.options, this.dataAdapter);
5079
+ this.$results = this.results.render();
5080
+
5081
+ this.results.position(this.$results, this.$dropdown);
5082
+
5083
+ // Bind events
5084
+
5085
+ var self = this;
5086
+
5087
+ // Bind the container to all of the adapters
5088
+ this._bindAdapters();
5089
+
5090
+ // Register any DOM event handlers
5091
+ this._registerDomEvents();
5092
+
5093
+ // Register any internal event handlers
5094
+ this._registerDataEvents();
5095
+ this._registerSelectionEvents();
5096
+ this._registerDropdownEvents();
5097
+ this._registerResultsEvents();
5098
+ this._registerEvents();
5099
+
5100
+ // Set the initial state
5101
+ this.dataAdapter.current(function (initialData) {
5102
+ self.trigger('selection:update', {
5103
+ data: initialData
5104
+ });
5105
+ });
5106
+
5107
+ // Hide the original select
5108
+ $element.addClass('select2-hidden-accessible');
5109
+ $element.attr('aria-hidden', 'true');
5110
+
5111
+ // Synchronize any monitored attributes
5112
+ this._syncAttributes();
5113
+
5114
+ $element.data('select2', this);
5115
+ };
5116
+
5117
+ Utils.Extend(Select2, Utils.Observable);
5118
+
5119
+ Select2.prototype._generateId = function ($element) {
5120
+ var id = '';
5121
+
5122
+ if ($element.attr('id') != null) {
5123
+ id = $element.attr('id');
5124
+ } else if ($element.attr('name') != null) {
5125
+ id = $element.attr('name') + '-' + Utils.generateChars(2);
5126
+ } else {
5127
+ id = Utils.generateChars(4);
5128
+ }
5129
+
5130
+ id = id.replace(/(:|\.|\[|\]|,)/g, '');
5131
+ id = 'select2-' + id;
5132
+
5133
+ return id;
5134
+ };
5135
+
5136
+ Select2.prototype._placeContainer = function ($container) {
5137
+ $container.insertAfter(this.$element);
5138
+
5139
+ var width = this._resolveWidth(this.$element, this.options.get('width'));
5140
+
5141
+ if (width != null) {
5142
+ $container.css('width', width);
5143
+ }
5144
+ };
5145
+
5146
+ Select2.prototype._resolveWidth = function ($element, method) {
5147
+ var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;
5148
+
5149
+ if (method == 'resolve') {
5150
+ var styleWidth = this._resolveWidth($element, 'style');
5151
+
5152
+ if (styleWidth != null) {
5153
+ return styleWidth;
5154
+ }
5155
+
5156
+ return this._resolveWidth($element, 'element');
5157
+ }
5158
+
5159
+ if (method == 'element') {
5160
+ var elementWidth = $element.outerWidth(false);
5161
+
5162
+ if (elementWidth <= 0) {
5163
+ return 'auto';
5164
+ }
5165
+
5166
+ return elementWidth + 'px';
5167
+ }
5168
+
5169
+ if (method == 'style') {
5170
+ var style = $element.attr('style');
5171
+
5172
+ if (typeof(style) !== 'string') {
5173
+ return null;
5174
+ }
5175
+
5176
+ var attrs = style.split(';');
5177
+
5178
+ for (var i = 0, l = attrs.length; i < l; i = i + 1) {
5179
+ var attr = attrs[i].replace(/\s/g, '');
5180
+ var matches = attr.match(WIDTH);
5181
+
5182
+ if (matches !== null && matches.length >= 1) {
5183
+ return matches[1];
5184
+ }
5185
+ }
5186
+
5187
+ return null;
5188
+ }
5189
+
5190
+ return method;
5191
+ };
5192
+
5193
+ Select2.prototype._bindAdapters = function () {
5194
+ this.dataAdapter.bind(this, this.$container);
5195
+ this.selection.bind(this, this.$container);
5196
+
5197
+ this.dropdown.bind(this, this.$container);
5198
+ this.results.bind(this, this.$container);
5199
+ };
5200
+
5201
+ Select2.prototype._registerDomEvents = function () {
5202
+ var self = this;
5203
+
5204
+ this.$element.on('change.select2', function () {
5205
+ self.dataAdapter.current(function (data) {
5206
+ self.trigger('selection:update', {
5207
+ data: data
5208
+ });
5209
+ });
5210
+ });
5211
+
5212
+ this.$element.on('focus.select2', function (evt) {
5213
+ self.trigger('focus', evt);
5214
+ });
5215
+
5216
+ this._syncA = Utils.bind(this._syncAttributes, this);
5217
+ this._syncS = Utils.bind(this._syncSubtree, this);
5218
+
5219
+ if (this.$element[0].attachEvent) {
5220
+ this.$element[0].attachEvent('onpropertychange', this._syncA);
5221
+ }
5222
+
5223
+ var observer = window.MutationObserver ||
5224
+ window.WebKitMutationObserver ||
5225
+ window.MozMutationObserver
5226
+ ;
5227
+
5228
+ if (observer != null) {
5229
+ this._observer = new observer(function (mutations) {
5230
+ $.each(mutations, self._syncA);
5231
+ $.each(mutations, self._syncS);
5232
+ });
5233
+ this._observer.observe(this.$element[0], {
5234
+ attributes: true,
5235
+ childList: true,
5236
+ subtree: false
5237
+ });
5238
+ } else if (this.$element[0].addEventListener) {
5239
+ this.$element[0].addEventListener(
5240
+ 'DOMAttrModified',
5241
+ self._syncA,
5242
+ false
5243
+ );
5244
+ this.$element[0].addEventListener(
5245
+ 'DOMNodeInserted',
5246
+ self._syncS,
5247
+ false
5248
+ );
5249
+ this.$element[0].addEventListener(
5250
+ 'DOMNodeRemoved',
5251
+ self._syncS,
5252
+ false
5253
+ );
5254
+ }
5255
+ };
5256
+
5257
+ Select2.prototype._registerDataEvents = function () {
5258
+ var self = this;
5259
+
5260
+ this.dataAdapter.on('*', function (name, params) {
5261
+ self.trigger(name, params);
5262
+ });
5263
+ };
5264
+
5265
+ Select2.prototype._registerSelectionEvents = function () {
5266
+ var self = this;
5267
+ var nonRelayEvents = ['toggle', 'focus'];
5268
+
5269
+ this.selection.on('toggle', function () {
5270
+ self.toggleDropdown();
5271
+ });
5272
+
5273
+ this.selection.on('focus', function (params) {
5274
+ self.focus(params);
5275
+ });
5276
+
5277
+ this.selection.on('*', function (name, params) {
5278
+ if ($.inArray(name, nonRelayEvents) !== -1) {
5279
+ return;
5280
+ }
5281
+
5282
+ self.trigger(name, params);
5283
+ });
5284
+ };
5285
+
5286
+ Select2.prototype._registerDropdownEvents = function () {
5287
+ var self = this;
5288
+
5289
+ this.dropdown.on('*', function (name, params) {
5290
+ self.trigger(name, params);
5291
+ });
5292
+ };
5293
+
5294
+ Select2.prototype._registerResultsEvents = function () {
5295
+ var self = this;
5296
+
5297
+ this.results.on('*', function (name, params) {
5298
+ self.trigger(name, params);
5299
+ });
5300
+ };
5301
+
5302
+ Select2.prototype._registerEvents = function () {
5303
+ var self = this;
5304
+
5305
+ this.on('open', function () {
5306
+ self.$container.addClass('select2-container--open');
5307
+ });
5308
+
5309
+ this.on('close', function () {
5310
+ self.$container.removeClass('select2-container--open');
5311
+ });
5312
+
5313
+ this.on('enable', function () {
5314
+ self.$container.removeClass('select2-container--disabled');
5315
+ });
5316
+
5317
+ this.on('disable', function () {
5318
+ self.$container.addClass('select2-container--disabled');
5319
+ });
5320
+
5321
+ this.on('blur', function () {
5322
+ self.$container.removeClass('select2-container--focus');
5323
+ });
5324
+
5325
+ this.on('query', function (params) {
5326
+ if (!self.isOpen()) {
5327
+ self.trigger('open', {});
5328
+ }
5329
+
5330
+ this.dataAdapter.query(params, function (data) {
5331
+ self.trigger('results:all', {
5332
+ data: data,
5333
+ query: params
5334
+ });
5335
+ });
5336
+ });
5337
+
5338
+ this.on('query:append', function (params) {
5339
+ this.dataAdapter.query(params, function (data) {
5340
+ self.trigger('results:append', {
5341
+ data: data,
5342
+ query: params
5343
+ });
5344
+ });
5345
+ });
5346
+
5347
+ this.on('keypress', function (evt) {
5348
+ var key = evt.which;
5349
+
5350
+ if (self.isOpen()) {
5351
+ if (key === KEYS.ESC || key === KEYS.TAB ||
5352
+ (key === KEYS.UP && evt.altKey)) {
5353
+ self.close();
5354
+
5355
+ evt.preventDefault();
5356
+ } else if (key === KEYS.ENTER) {
5357
+ self.trigger('results:select', {});
5358
+
5359
+ evt.preventDefault();
5360
+ } else if ((key === KEYS.SPACE && evt.ctrlKey)) {
5361
+ self.trigger('results:toggle', {});
5362
+
5363
+ evt.preventDefault();
5364
+ } else if (key === KEYS.UP) {
5365
+ self.trigger('results:previous', {});
5366
+
5367
+ evt.preventDefault();
5368
+ } else if (key === KEYS.DOWN) {
5369
+ self.trigger('results:next', {});
5370
+
5371
+ evt.preventDefault();
5372
+ }
5373
+ } else {
5374
+ if (key === KEYS.ENTER || key === KEYS.SPACE ||
5375
+ (key === KEYS.DOWN && evt.altKey)) {
5376
+ self.open();
5377
+
5378
+ evt.preventDefault();
5379
+ }
5380
+ }
5381
+ });
5382
+ };
5383
+
5384
+ Select2.prototype._syncAttributes = function () {
5385
+ this.options.set('disabled', this.$element.prop('disabled'));
5386
+
5387
+ if (this.options.get('disabled')) {
5388
+ if (this.isOpen()) {
5389
+ this.close();
5390
+ }
5391
+
5392
+ this.trigger('disable', {});
5393
+ } else {
5394
+ this.trigger('enable', {});
5395
+ }
5396
+ };
5397
+
5398
+ Select2.prototype._syncSubtree = function (evt, mutations) {
5399
+ var changed = false;
5400
+ var self = this;
5401
+
5402
+ // Ignore any mutation events raised for elements that aren't options or
5403
+ // optgroups. This handles the case when the select element is destroyed
5404
+ if (
5405
+ evt && evt.target && (
5406
+ evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP'
5407
+ )
5408
+ ) {
5409
+ return;
5410
+ }
5411
+
5412
+ if (!mutations) {
5413
+ // If mutation events aren't supported, then we can only assume that the
5414
+ // change affected the selections
5415
+ changed = true;
5416
+ } else if (mutations.addedNodes && mutations.addedNodes.length > 0) {
5417
+ for (var n = 0; n < mutations.addedNodes.length; n++) {
5418
+ var node = mutations.addedNodes[n];
5419
+
5420
+ if (node.selected) {
5421
+ changed = true;
5422
+ }
5423
+ }
5424
+ } else if (mutations.removedNodes && mutations.removedNodes.length > 0) {
5425
+ changed = true;
5426
+ }
5427
+
5428
+ // Only re-pull the data if we think there is a change
5429
+ if (changed) {
5430
+ this.dataAdapter.current(function (currentData) {
5431
+ self.trigger('selection:update', {
5432
+ data: currentData
5433
+ });
5434
+ });
5435
+ }
5436
+ };
5437
+
5438
+ /**
5439
+ * Override the trigger method to automatically trigger pre-events when
5440
+ * there are events that can be prevented.
5441
+ */
5442
+ Select2.prototype.trigger = function (name, args) {
5443
+ var actualTrigger = Select2.__super__.trigger;
5444
+ var preTriggerMap = {
5445
+ 'open': 'opening',
5446
+ 'close': 'closing',
5447
+ 'select': 'selecting',
5448
+ 'unselect': 'unselecting'
5449
+ };
5450
+
5451
+ if (args === undefined) {
5452
+ args = {};
5453
+ }
5454
+
5455
+ if (name in preTriggerMap) {
5456
+ var preTriggerName = preTriggerMap[name];
5457
+ var preTriggerArgs = {
5458
+ prevented: false,
5459
+ name: name,
5460
+ args: args
5461
+ };
5462
+
5463
+ actualTrigger.call(this, preTriggerName, preTriggerArgs);
5464
+
5465
+ if (preTriggerArgs.prevented) {
5466
+ args.prevented = true;
5467
+
5468
+ return;
5469
+ }
5470
+ }
5471
+
5472
+ actualTrigger.call(this, name, args);
5473
+ };
5474
+
5475
+ Select2.prototype.toggleDropdown = function () {
5476
+ if (this.options.get('disabled')) {
5477
+ return;
5478
+ }
5479
+
5480
+ if (this.isOpen()) {
5481
+ this.close();
5482
+ } else {
5483
+ this.open();
5484
+ }
5485
+ };
5486
+
5487
+ Select2.prototype.open = function () {
5488
+ if (this.isOpen()) {
5489
+ return;
5490
+ }
5491
+
5492
+ this.trigger('query', {});
5493
+ };
5494
+
5495
+ Select2.prototype.close = function () {
5496
+ if (!this.isOpen()) {
5497
+ return;
5498
+ }
5499
+
5500
+ this.trigger('close', {});
5501
+ };
5502
+
5503
+ Select2.prototype.isOpen = function () {
5504
+ return this.$container.hasClass('select2-container--open');
5505
+ };
5506
+
5507
+ Select2.prototype.hasFocus = function () {
5508
+ return this.$container.hasClass('select2-container--focus');
5509
+ };
5510
+
5511
+ Select2.prototype.focus = function (data) {
5512
+ // No need to re-trigger focus events if we are already focused
5513
+ if (this.hasFocus()) {
5514
+ return;
5515
+ }
5516
+
5517
+ this.$container.addClass('select2-container--focus');
5518
+ this.trigger('focus', {});
5519
+ };
5520
+
5521
+ Select2.prototype.enable = function (args) {
5522
+ if (this.options.get('debug') && window.console && console.warn) {
5523
+ console.warn(
5524
+ 'Select2: The `select2("enable")` method has been deprecated and will' +
5525
+ ' be removed in later Select2 versions. Use $element.prop("disabled")' +
5526
+ ' instead.'
5527
+ );
5528
+ }
5529
+
5530
+ if (args == null || args.length === 0) {
5531
+ args = [true];
5532
+ }
5533
+
5534
+ var disabled = !args[0];
5535
+
5536
+ this.$element.prop('disabled', disabled);
5537
+ };
5538
+
5539
+ Select2.prototype.data = function () {
5540
+ if (this.options.get('debug') &&
5541
+ arguments.length > 0 && window.console && console.warn) {
5542
+ console.warn(
5543
+ 'Select2: Data can no longer be set using `select2("data")`. You ' +
5544
+ 'should consider setting the value instead using `$element.val()`.'
5545
+ );
5546
+ }
5547
+
5548
+ var data = [];
5549
+
5550
+ this.dataAdapter.current(function (currentData) {
5551
+ data = currentData;
5552
+ });
5553
+
5554
+ return data;
5555
+ };
5556
+
5557
+ Select2.prototype.val = function (args) {
5558
+ if (this.options.get('debug') && window.console && console.warn) {
5559
+ console.warn(
5560
+ 'Select2: The `select2("val")` method has been deprecated and will be' +
5561
+ ' removed in later Select2 versions. Use $element.val() instead.'
5562
+ );
5563
+ }
5564
+
5565
+ if (args == null || args.length === 0) {
5566
+ return this.$element.val();
5567
+ }
5568
+
5569
+ var newVal = args[0];
5570
+
5571
+ if ($.isArray(newVal)) {
5572
+ newVal = $.map(newVal, function (obj) {
5573
+ return obj.toString();
5574
+ });
5575
+ }
5576
+
5577
+ this.$element.val(newVal).trigger('change');
5578
+ };
5579
+
5580
+ Select2.prototype.destroy = function () {
5581
+ this.$container.remove();
5582
+
5583
+ if (this.$element[0].detachEvent) {
5584
+ this.$element[0].detachEvent('onpropertychange', this._syncA);
5585
+ }
5586
+
5587
+ if (this._observer != null) {
5588
+ this._observer.disconnect();
5589
+ this._observer = null;
5590
+ } else if (this.$element[0].removeEventListener) {
5591
+ this.$element[0]
5592
+ .removeEventListener('DOMAttrModified', this._syncA, false);
5593
+ this.$element[0]
5594
+ .removeEventListener('DOMNodeInserted', this._syncS, false);
5595
+ this.$element[0]
5596
+ .removeEventListener('DOMNodeRemoved', this._syncS, false);
5597
+ }
5598
+
5599
+ this._syncA = null;
5600
+ this._syncS = null;
5601
+
5602
+ this.$element.off('.select2');
5603
+ this.$element.attr('tabindex', this.$element.data('old-tabindex'));
5604
+
5605
+ this.$element.removeClass('select2-hidden-accessible');
5606
+ this.$element.attr('aria-hidden', 'false');
5607
+ this.$element.removeData('select2');
5608
+
5609
+ this.dataAdapter.destroy();
5610
+ this.selection.destroy();
5611
+ this.dropdown.destroy();
5612
+ this.results.destroy();
5613
+
5614
+ this.dataAdapter = null;
5615
+ this.selection = null;
5616
+ this.dropdown = null;
5617
+ this.results = null;
5618
+ };
5619
+
5620
+ Select2.prototype.render = function () {
5621
+ var $container = $(
5622
+ '<span class="select2 select2-container">' +
5623
+ '<span class="selection"></span>' +
5624
+ '<span class="dropdown-wrapper" aria-hidden="true"></span>' +
5625
+ '</span>'
5626
+ );
5627
+
5628
+ $container.attr('dir', this.options.get('dir'));
5629
+
5630
+ this.$container = $container;
5631
+
5632
+ this.$container.addClass('select2-container--' + this.options.get('theme'));
5633
+
5634
+ $container.data('element', this.$element);
5635
+
5636
+ return $container;
5637
+ };
5638
+
5639
+ return Select2;
5640
+ });
5641
+
5642
+ S2.define('jquery-mousewheel',[
5643
+ 'jquery'
5644
+ ], function ($) {
5645
+ // Used to shim jQuery.mousewheel for non-full builds.
5646
+ return $;
5647
+ });
5648
+
5649
+ S2.define('jquery.select2',[
5650
+ 'jquery',
5651
+ 'jquery-mousewheel',
5652
+
5653
+ './select2/core',
5654
+ './select2/defaults'
5655
+ ], function ($, _, Select2, Defaults) {
5656
+ if ($.fn.select2 == null) {
5657
+ // All methods that should return the element
5658
+ var thisMethods = ['open', 'close', 'destroy'];
5659
+
5660
+ $.fn.select2 = function (options) {
5661
+ options = options || {};
5662
+
5663
+ if (typeof options === 'object') {
5664
+ this.each(function () {
5665
+ var instanceOptions = $.extend(true, {}, options);
5666
+
5667
+ var instance = new Select2($(this), instanceOptions);
5668
+ });
5669
+
5670
+ return this;
5671
+ } else if (typeof options === 'string') {
5672
+ var ret;
5673
+ var args = Array.prototype.slice.call(arguments, 1);
5674
+
5675
+ this.each(function () {
5676
+ var instance = $(this).data('select2');
5677
+
5678
+ if (instance == null && window.console && console.error) {
5679
+ console.error(
5680
+ 'The select2(\'' + options + '\') method was called on an ' +
5681
+ 'element that is not using Select2.'
5682
+ );
5683
+ }
5684
+
5685
+ ret = instance[options].apply(instance, args);
5686
+ });
5687
+
5688
+ // Check if we should be returning `this`
5689
+ if ($.inArray(options, thisMethods) > -1) {
5690
+ return this;
5691
+ }
5692
+
5693
+ return ret;
5694
+ } else {
5695
+ throw new Error('Invalid arguments for Select2: ' + options);
5696
+ }
5697
+ };
5698
+ }
5699
+
5700
+ if ($.fn.select2.defaults == null) {
5701
+ $.fn.select2.defaults = Defaults;
5702
+ }
5703
+
5704
+ return Select2;
5705
+ });
5706
+
5707
+ // Return the AMD loader configuration so it can be used outside of this file
5708
+ return {
5709
+ define: S2.define,
5710
+ require: S2.require
5711
+ };
5712
+ }());
5713
+
5714
+ // Autoload the jQuery bindings
5715
+ // We know that all of the modules exist above this, so we're safe
5716
+ var select2 = S2.require('jquery.select2');
5717
+
5718
+ // Hold the AMD module references on the jQuery function that was just loaded
5719
+ // This allows Select2 to use the internal loader outside of this file, such
5720
+ // as in the language files.
5721
+ jQuery.fn.select2.amd = S2;
5722
+
5723
+ // Return the Select2 instance for anyone who is importing it.
5724
+ return select2;
5725
+ }));
ui/lib/select2/js/select2.min.js ADDED
@@ -0,0 +1,3 @@
 
 
 
1
+ /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.prop("title",e.title||e.text),f.data("data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");
2
+ if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){var c=(this._lastTag,this.$element.find("option[data-select2-tag]"));c.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b),d=g.$element.find("option").filter(function(){return a(this).val()===c.id});if(!d.length){var e=g.option(c);e.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([e])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},a.prototype._handleSelectOnClose=function(a,b){if(b&&null!=b.originalSelect2Event){var c=b.originalSelect2Event;if("select"===c._type||"unselect"===c._type)return}var d=this.getHighlightedResults();if(!(d.length<1)){var e=d.data("data");null!=e.element&&e.element.selected||null==e.element&&e.selected||this.trigger("select",{data:e})}},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null;
3
+ },e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
ui/lib/select2/package.json DELETED
@@ -1,20 +0,0 @@
1
- {
2
- "name" : "Select2",
3
- "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
4
- "homepage": "http://ivaynberg.github.io/select2",
5
- "author": "Igor Vaynberg",
6
- "repository": {"type": "git", "url": "git://github.com/ivaynberg/select2.git"},
7
- "main": "select2.js",
8
- "version": "3.5.2",
9
- "jspm": {
10
- "main": "select2",
11
- "files": ["select2.js", "select2.png", "select2.css", "select2-spinner.gif"],
12
- "shim": {
13
- "select2": {
14
- "imports": ["jquery", "./select2.css!"],
15
- "exports": "$"
16
- }
17
- },
18
- "buildConfig": { "uglify": true }
19
- }
20
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/release.sh DELETED
@@ -1,79 +0,0 @@
1
- #!/bin/bash
2
- set -e
3
-
4
- echo -n "Enter the version for this release: "
5
-
6
- read ver
7
-
8
- if [ ! $ver ]; then
9
- echo "Invalid version."
10
- exit
11
- fi
12
-
13
- name="select2"
14
- js="$name.js"
15
- mini="$name.min.js"
16
- css="$name.css"
17
- release="$name-$ver"
18
- tag="$ver"
19
- branch="build-$ver"
20
- curbranch=`git branch | grep "*" | sed "s/* //"`
21
- timestamp=$(date)
22
- tokens="s/@@ver@@/$ver/g;s/\@@timestamp@@/$timestamp/g"
23
- remote="origin"
24
-
25
- echo "Pulling from origin"
26
-
27
- git pull
28
-
29
- echo "Updating Version Identifiers"
30
-
31
- sed -E -e "s/\"version\": \"([0-9\.]+)\",/\"version\": \"$ver\",/g" -i -- bower.json select2.jquery.json component.json composer.json package.json
32
-
33
- git add bower.json
34
- git add select2.jquery.json
35
- git add component.json
36
- git add composer.json
37
- git add package.json
38
-
39
- git commit -m "modified version identifiers in descriptors for release $ver"
40
- git push
41
-
42
- git branch "$branch"
43
- git checkout "$branch"
44
-
45
- echo "Tokenizing..."
46
-
47
- find . -name "$js" | xargs -I{} sed -e "$tokens" -i -- {}
48
- find . -name "$css" | xargs -I{} sed -e "$tokens" -i -- {}
49
-
50
- sed -e "s/latest/$ver/g" -i -- bower.json
51
-
52
- git add "$js"
53
- git add "$css"
54
-
55
- echo "Minifying..."
56
-
57
- echo "/*" > "$mini"
58
- cat LICENSE | sed "$tokens" >> "$mini"
59
- echo "*/" >> "$mini"
60
-
61
- curl -s \
62
- --data-urlencode "js_code@$js" \
63
- http://marijnhaverbeke.nl/uglifyjs \
64
- >> "$mini"
65
-
66
- git add "$mini"
67
-
68
- git commit -m "release $ver"
69
-
70
- echo "Tagging..."
71
- git tag -a "$tag" -m "tagged version $ver"
72
- git push "$remote" --tags
73
-
74
- echo "Cleaning Up..."
75
-
76
- git checkout "$curbranch"
77
- git branch -D "$branch"
78
-
79
- echo "Done"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2-bootstrap.css DELETED
@@ -1,87 +0,0 @@
1
- .form-control .select2-choice {
2
- border: 0;
3
- border-radius: 2px;
4
- }
5
-
6
- .form-control .select2-choice .select2-arrow {
7
- border-radius: 0 2px 2px 0;
8
- }
9
-
10
- .form-control.select2-container {
11
- height: auto !important;
12
- padding: 0;
13
- }
14
-
15
- .form-control.select2-container.select2-dropdown-open {
16
- border-color: #5897FB;
17
- border-radius: 3px 3px 0 0;
18
- }
19
-
20
- .form-control .select2-container.select2-dropdown-open .select2-choices {
21
- border-radius: 3px 3px 0 0;
22
- }
23
-
24
- .form-control.select2-container .select2-choices {
25
- border: 0 !important;
26
- border-radius: 3px;
27
- }
28
-
29
- .control-group.warning .select2-container .select2-choice,
30
- .control-group.warning .select2-container .select2-choices,
31
- .control-group.warning .select2-container-active .select2-choice,
32
- .control-group.warning .select2-container-active .select2-choices,
33
- .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
34
- .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
35
- .control-group.warning .select2-container-multi.select2-container-active .select2-choices {
36
- border: 1px solid #C09853 !important;
37
- }
38
-
39
- .control-group.warning .select2-container .select2-choice div {
40
- border-left: 1px solid #C09853 !important;
41
- background: #FCF8E3 !important;
42
- }
43
-
44
- .control-group.error .select2-container .select2-choice,
45
- .control-group.error .select2-container .select2-choices,
46
- .control-group.error .select2-container-active .select2-choice,
47
- .control-group.error .select2-container-active .select2-choices,
48
- .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
49
- .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
50
- .control-group.error .select2-container-multi.select2-container-active .select2-choices {
51
- border: 1px solid #B94A48 !important;
52
- }
53
-
54
- .control-group.error .select2-container .select2-choice div {
55
- border-left: 1px solid #B94A48 !important;
56
- background: #F2DEDE !important;
57
- }
58
-
59
- .control-group.info .select2-container .select2-choice,
60
- .control-group.info .select2-container .select2-choices,
61
- .control-group.info .select2-container-active .select2-choice,
62
- .control-group.info .select2-container-active .select2-choices,
63
- .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
64
- .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
65
- .control-group.info .select2-container-multi.select2-container-active .select2-choices {
66
- border: 1px solid #3A87AD !important;
67
- }
68
-
69
- .control-group.info .select2-container .select2-choice div {
70
- border-left: 1px solid #3A87AD !important;
71
- background: #D9EDF7 !important;
72
- }
73
-
74
- .control-group.success .select2-container .select2-choice,
75
- .control-group.success .select2-container .select2-choices,
76
- .control-group.success .select2-container-active .select2-choice,
77
- .control-group.success .select2-container-active .select2-choices,
78
- .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
79
- .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
80
- .control-group.success .select2-container-multi.select2-container-active .select2-choices {
81
- border: 1px solid #468847 !important;
82
- }
83
-
84
- .control-group.success .select2-container .select2-choice div {
85
- border-left: 1px solid #468847 !important;
86
- background: #DFF0D8 !important;
87
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2-spinner.gif DELETED
Binary file
ui/lib/select2/select2.css DELETED
@@ -1,692 +0,0 @@
1
- /*
2
- Version: @@ver@@ Timestamp: @@timestamp@@
3
- */
4
- .select2-container {
5
- margin: 0;
6
- position: relative;
7
- display: inline-block;
8
- vertical-align: middle;
9
- }
10
-
11
- .select2-container,
12
- .select2-drop,
13
- .select2-search,
14
- .select2-search input {
15
- /*
16
- Force border-box so that % widths fit the parent
17
- container without overlap because of margin/padding.
18
- More Info : http://www.quirksmode.org/css/box.html
19
- */
20
- -webkit-box-sizing: border-box; /* webkit */
21
- -moz-box-sizing: border-box; /* firefox */
22
- box-sizing: border-box; /* css3 */
23
- }
24
-
25
- .select2-container .select2-choice {
26
- display: block;
27
- height: 26px;
28
- padding: 0 0 0 8px;
29
- overflow: hidden;
30
- position: relative;
31
-
32
- border: 1px solid #aaa;
33
- white-space: nowrap;
34
- line-height: 26px;
35
- color: #444;
36
- text-decoration: none;
37
-
38
- border-radius: 4px;
39
-
40
- background-clip: padding-box;
41
-
42
- -webkit-touch-callout: none;
43
- -webkit-user-select: none;
44
- -moz-user-select: none;
45
- -ms-user-select: none;
46
- user-select: none;
47
-
48
- background-color: #fff;
49
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
50
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
51
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
52
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
53
- background-image: linear-gradient(to top, #eee 0%, #fff 50%);
54
- }
55
-
56
- html[dir="rtl"] .select2-container .select2-choice {
57
- padding: 0 8px 0 0;
58
- }
59
-
60
- .select2-container.select2-drop-above .select2-choice {
61
- border-bottom-color: #aaa;
62
-
63
- border-radius: 0 0 4px 4px;
64
-
65
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
66
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
67
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
68
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
69
- background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
70
- }
71
-
72
- .select2-container.select2-allowclear .select2-choice .select2-chosen {
73
- margin-right: 42px;
74
- }
75
-
76
- .select2-container .select2-choice > .select2-chosen {
77
- margin-right: 26px;
78
- display: block;
79
- overflow: hidden;
80
-
81
- white-space: nowrap;
82
-
83
- text-overflow: ellipsis;
84
- float: none;
85
- width: auto;
86
- }
87
-
88
- html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
89
- margin-left: 26px;
90
- margin-right: 0;
91
- }
92
-
93
- .select2-container .select2-choice abbr {
94
- display: none;
95
- width: 12px;
96
- height: 12px;
97
- position: absolute;
98
- right: 24px;
99
- top: 8px;
100
-
101
- font-size: 1px;
102
- text-decoration: none;
103
-
104
- border: 0;
105
- background: url('select2.png') right top no-repeat;
106
- cursor: pointer;
107
- outline: 0;
108
- }
109
-
110
- .select2-container.select2-allowclear .select2-choice abbr {
111
- display: inline-block;
112
- }
113
-
114
- .select2-container .select2-choice abbr:hover {
115
- background-position: right -11px;
116
- cursor: pointer;
117
- }
118
-
119
- .select2-drop-mask {
120
- border: 0;
121
- margin: 0;
122
- padding: 0;
123
- position: fixed;
124
- left: 0;
125
- top: 0;
126
- min-height: 100%;
127
- min-width: 100%;
128
- height: auto;
129
- width: auto;
130
- opacity: 0;
131
- z-index: 9998;
132
- /* styles required for IE to work */
133
- background-color: #fff;
134
- filter: alpha(opacity=0);
135
- }
136
-
137
- .select2-drop {
138
- width: 100%;
139
- margin-top: -1px;
140
- position: absolute;
141
- z-index: 9999;
142
- top: 100%;
143
-
144
- background: #fff;
145
- color: #000;
146
- border: 1px solid #aaa;
147
- border-top: 0;
148
-
149
- border-radius: 0 0 4px 4px;
150
-
151
- -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
152
- box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
153
- }
154
-
155
- .select2-drop.select2-drop-above {
156
- margin-top: 1px;
157
- border-top: 1px solid #aaa;
158
- border-bottom: 0;
159
-
160
- border-radius: 4px 4px 0 0;
161
-
162
- -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
163
- box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
164
- }
165
-
166
- .select2-drop-active {
167
- border: 1px solid #5897fb;
168
- border-top: none;
169
- }
170
-
171
- .select2-drop.select2-drop-above.select2-drop-active {
172
- border-top: 1px solid #5897fb;
173
- }
174
-
175
- .select2-drop-auto-width {
176
- border-top: 1px solid #aaa;
177
- width: auto;
178
- }
179
-
180
- .select2-container .select2-choice .select2-arrow {
181
- display: inline-block;
182
- width: 18px;
183
- height: 100%;
184
- position: absolute;
185
- right: 0;
186
- top: 0;
187
-
188
- border-left: 1px solid #aaa;
189
- border-radius: 0 4px 4px 0;
190
-
191
- background-clip: padding-box;
192
-
193
- background: #ccc;
194
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
195
- background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
196
- background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
197
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
198
- background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
199
- }
200
-
201
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
202
- left: 0;
203
- right: auto;
204
-
205
- border-left: none;
206
- border-right: 1px solid #aaa;
207
- border-radius: 4px 0 0 4px;
208
- }
209
-
210
- .select2-container .select2-choice .select2-arrow b {
211
- display: block;
212
- width: 100%;
213
- height: 100%;
214
- background: url('select2.png') no-repeat 0 1px;
215
- }
216
-
217
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
218
- background-position: 2px 1px;
219
- }
220
-
221
- .select2-search {
222
- display: inline-block;
223
- width: 100%;
224
- min-height: 26px;
225
- margin: 0;
226
- padding: 4px 4px 0 4px;
227
-
228
- position: relative;
229
- z-index: 10000;
230
-
231
- white-space: nowrap;
232
- }
233
-
234
- .select2-search input {
235
- width: 100%;
236
- height: auto !important;
237
- min-height: 26px;
238
- padding: 4px 20px 4px 5px;
239
- margin: 0;
240
-
241
- outline: 0;
242
- font-family: sans-serif;
243
- font-size: 1em;
244
-
245
- border: 1px solid #aaa;
246
- border-radius: 0;
247
-
248
- -webkit-box-shadow: none;
249
- box-shadow: none;
250
-
251
- background: #fff url('select2.png') no-repeat 100% -22px;
252
- background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
253
- background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
254
- background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
255
- background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
256
- }
257
-
258
- html[dir="rtl"] .select2-search input {
259
- padding: 4px 5px 4px 20px;
260
-
261
- background: #fff url('select2.png') no-repeat -37px -22px;
262
- background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
263
- background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
264
- background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
265
- background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
266
- }
267
-
268
- .select2-search input.select2-active {
269
- background: #fff url('select2-spinner.gif') no-repeat 100%;
270
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
271
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
272
- background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
273
- background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
274
- }
275
-
276
- .select2-container-active .select2-choice,
277
- .select2-container-active .select2-choices {
278
- border: 1px solid #5897fb;
279
- outline: none;
280
-
281
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
282
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
283
- }
284
-
285
- .select2-dropdown-open .select2-choice {
286
- border-bottom-color: transparent;
287
- -webkit-box-shadow: 0 1px 0 #fff inset;
288
- box-shadow: 0 1px 0 #fff inset;
289
-
290
- border-bottom-left-radius: 0;
291
- border-bottom-right-radius: 0;
292
-
293
- background-color: #eee;
294
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
295
- background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
296
- background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
297
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
298
- background-image: linear-gradient(to top, #fff 0%, #eee 50%);
299
- }
300
-
301
- .select2-dropdown-open.select2-drop-above .select2-choice,
302
- .select2-dropdown-open.select2-drop-above .select2-choices {
303
- border: 1px solid #5897fb;
304
- border-top-color: transparent;
305
-
306
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
307
- background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
308
- background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
309
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
310
- background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
311
- }
312
-
313
- .select2-dropdown-open .select2-choice .select2-arrow {
314
- background: transparent;
315
- border-left: none;
316
- filter: none;
317
- }
318
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
319
- border-right: none;
320
- }
321
-
322
- .select2-dropdown-open .select2-choice .select2-arrow b {
323
- background-position: -18px 1px;
324
- }
325
-
326
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
327
- background-position: -16px 1px;
328
- }
329
-
330
- .select2-hidden-accessible {
331
- border: 0;
332
- clip: rect(0 0 0 0);
333
- height: 1px;
334
- margin: -1px;
335
- overflow: hidden;
336
- padding: 0;
337
- position: absolute;
338
- width: 1px;
339
- }
340
-
341
- /* results */
342
- .select2-results {
343
- max-height: 200px;
344
- padding: 0 0 0 4px;
345
- margin: 4px 4px 4px 0;
346
- position: relative;
347
- overflow-x: hidden;
348
- overflow-y: auto;
349
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
350
- }
351
-
352
- html[dir="rtl"] .select2-results {
353
- padding: 0 4px 0 0;
354
- margin: 4px 0 4px 4px;
355
- }
356
-
357
- .select2-results ul.select2-result-sub {
358
- margin: 0;
359
- padding-left: 0;
360
- }
361
-
362
- .select2-results li {
363
- list-style: none;
364
- display: list-item;
365
- background-image: none;
366
- }
367
-
368
- .select2-results li.select2-result-with-children > .select2-result-label {
369
- font-weight: bold;
370
- }
371
-
372
- .select2-results .select2-result-label {
373
- padding: 3px 7px 4px;
374
- margin: 0;
375
- cursor: pointer;
376
-
377
- min-height: 1em;
378
-
379
- -webkit-touch-callout: none;
380
- -webkit-user-select: none;
381
- -moz-user-select: none;
382
- -ms-user-select: none;
383
- user-select: none;
384
- }
385
-
386
- .select2-results-dept-1 .select2-result-label { padding-left: 20px }
387
- .select2-results-dept-2 .select2-result-label { padding-left: 40px }
388
- .select2-results-dept-3 .select2-result-label { padding-left: 60px }
389
- .select2-results-dept-4 .select2-result-label { padding-left: 80px }
390
- .select2-results-dept-5 .select2-result-label { padding-left: 100px }
391
- .select2-results-dept-6 .select2-result-label { padding-left: 110px }
392
- .select2-results-dept-7 .select2-result-label { padding-left: 120px }
393
-
394
- .select2-results .select2-highlighted {
395
- background: #3875d7;
396
- color: #fff;
397
- }
398
-
399
- .select2-results li em {
400
- background: #feffde;
401
- font-style: normal;
402
- }
403
-
404
- .select2-results .select2-highlighted em {
405
- background: transparent;
406
- }
407
-
408
- .select2-results .select2-highlighted ul {
409
- background: #fff;
410
- color: #000;
411
- }
412
-
413
- .select2-results .select2-no-results,
414
- .select2-results .select2-searching,
415
- .select2-results .select2-ajax-error,
416
- .select2-results .select2-selection-limit {
417
- background: #f4f4f4;
418
- display: list-item;
419
- padding-left: 5px;
420
- }
421
-
422
- /*
423
- disabled look for disabled choices in the results dropdown
424
- */
425
- .select2-results .select2-disabled.select2-highlighted {
426
- color: #666;
427
- background: #f4f4f4;
428
- display: list-item;
429
- cursor: default;
430
- }
431
- .select2-results .select2-disabled {
432
- background: #f4f4f4;
433
- display: list-item;
434
- cursor: default;
435
- }
436
-
437
- .select2-results .select2-selected {
438
- display: none;
439
- }
440
-
441
- .select2-more-results.select2-active {
442
- background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
443
- }
444
-
445
- .select2-results .select2-ajax-error {
446
- background: rgba(255, 50, 50, .2);
447
- }
448
-
449
- .select2-more-results {
450
- background: #f4f4f4;
451
- display: list-item;
452
- }
453
-
454
- /* disabled styles */
455
-
456
- .select2-container.select2-container-disabled .select2-choice {
457
- background-color: #f4f4f4;
458
- background-image: none;
459
- border: 1px solid #ddd;
460
- cursor: default;
461
- }
462
-
463
- .select2-container.select2-container-disabled .select2-choice .select2-arrow {
464
- background-color: #f4f4f4;
465
- background-image: none;
466
- border-left: 0;
467
- }
468
-
469
- .select2-container.select2-container-disabled .select2-choice abbr {
470
- display: none;
471
- }
472
-
473
-
474
- /* multiselect */
475
-
476
- .select2-container-multi .select2-choices {
477
- height: auto !important;
478
- height: 1%;
479
- margin: 0;
480
- padding: 0 5px 0 0;
481
- position: relative;
482
-
483
- border: 1px solid #aaa;
484
- cursor: text;
485
- overflow: hidden;
486
-
487
- background-color: #fff;
488
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
489
- background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
490
- background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
491
- background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
492
- }
493
-
494
- html[dir="rtl"] .select2-container-multi .select2-choices {
495
- padding: 0 0 0 5px;
496
- }
497
-
498
- .select2-locked {
499
- padding: 3px 5px 3px 5px !important;
500
- }
501
-
502
- .select2-container-multi .select2-choices {
503
- min-height: 26px;
504
- }
505
-
506
- .select2-container-multi.select2-container-active .select2-choices {
507
- border: 1px solid #5897fb;
508
- outline: none;
509
-
510
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
511
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
512
- }
513
- .select2-container-multi .select2-choices li {
514
- float: left;
515
- list-style: none;
516
- }
517
- html[dir="rtl"] .select2-container-multi .select2-choices li
518
- {
519
- float: right;
520
- }
521
- .select2-container-multi .select2-choices .select2-search-field {
522
- margin: 0;
523
- padding: 0;
524
- white-space: nowrap;
525
- }
526
-
527
- .select2-container-multi .select2-choices .select2-search-field input {
528
- padding: 5px;
529
- margin: 1px 0;
530
-
531
- font-family: sans-serif;
532
- font-size: 100%;
533
- color: #666;
534
- outline: 0;
535
- border: 0;
536
- -webkit-box-shadow: none;
537
- box-shadow: none;
538
- background: transparent !important;
539
- }
540
-
541
- .select2-container-multi .select2-choices .select2-search-field input.select2-active {
542
- background: #fff url('select2-spinner.gif') no-repeat 100% !important;
543
- }
544
-
545
- .select2-default {
546
- color: #999 !important;
547
- }
548
-
549
- .select2-container-multi .select2-choices .select2-search-choice {
550
- padding: 3px 5px 3px 18px;
551
- margin: 3px 0 3px 5px;
552
- position: relative;
553
-
554
- line-height: 13px;
555
- color: #333;
556
- cursor: default;
557
- border: 1px solid #aaaaaa;
558
-
559
- border-radius: 3px;
560
-
561
- -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
562
- box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
563
-
564
- background-clip: padding-box;
565
-
566
- -webkit-touch-callout: none;
567
- -webkit-user-select: none;
568
- -moz-user-select: none;
569
- -ms-user-select: none;
570
- user-select: none;
571
-
572
- background-color: #e4e4e4;
573
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
574
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
575
- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
576
- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
577
- background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
578
- }
579
- html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
580
- {
581
- margin: 3px 5px 3px 0;
582
- padding: 3px 18px 3px 5px;
583
- }
584
- .select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
585
- cursor: default;
586
- }
587
- .select2-container-multi .select2-choices .select2-search-choice-focus {
588
- background: #d4d4d4;
589
- }
590
-
591
- .select2-search-choice-close {
592
- display: block;
593
- width: 12px;
594
- height: 13px;
595
- position: absolute;
596
- right: 3px;
597
- top: 4px;
598
-
599
- font-size: 1px;
600
- outline: none;
601
- background: url('select2.png') right top no-repeat;
602
- }
603
- html[dir="rtl"] .select2-search-choice-close {
604
- right: auto;
605
- left: 3px;
606
- }
607
-
608
- .select2-container-multi .select2-search-choice-close {
609
- left: 3px;
610
- }
611
-
612
- html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
613
- left: auto;
614
- right: 2px;
615
- }
616
-
617
- .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
618
- background-position: right -11px;
619
- }
620
- .select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
621
- background-position: right -11px;
622
- }
623
-
624
- /* disabled styles */
625
- .select2-container-multi.select2-container-disabled .select2-choices {
626
- background-color: #f4f4f4;
627
- background-image: none;
628
- border: 1px solid #ddd;
629
- cursor: default;
630
- }
631
-
632
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
633
- padding: 3px 5px 3px 5px;
634
- border: 1px solid #ddd;
635
- background-image: none;
636
- background-color: #f4f4f4;
637
- }
638
-
639
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
640
- background: none;
641
- }
642
- /* end multiselect */
643
-
644
-
645
- .select2-result-selectable .select2-match,
646
- .select2-result-unselectable .select2-match {
647
- text-decoration: underline;
648
- }
649
-
650
- .select2-offscreen, .select2-offscreen:focus {
651
- clip: rect(0 0 0 0) !important;
652
- width: 1px !important;
653
- height: 1px !important;
654
- border: 0 !important;
655
- margin: 0 !important;
656
- padding: 0 !important;
657
- overflow: hidden !important;
658
- position: absolute !important;
659
- outline: 0 !important;
660
- left: 0px !important;
661
- top: 0px !important;
662
- }
663
-
664
- .select2-display-none {
665
- display: none;
666
- }
667
-
668
- .select2-measure-scrollbar {
669
- position: absolute;
670
- top: -10000px;
671
- left: -10000px;
672
- width: 100px;
673
- height: 100px;
674
- overflow: scroll;
675
- }
676
-
677
- /* Retina-ize icons */
678
-
679
- @media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
680
- .select2-search input,
681
- .select2-search-choice-close,
682
- .select2-container .select2-choice abbr,
683
- .select2-container .select2-choice .select2-arrow b {
684
- background-image: url('select2x2.png') !important;
685
- background-repeat: no-repeat !important;
686
- background-size: 60px 40px !important;
687
- }
688
-
689
- .select2-search input {
690
- background-position: 100% -21px !important;
691
- }
692
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2.jquery.json DELETED
@@ -1,36 +0,0 @@
1
- {
2
- "name": "select2",
3
- "title": "Select2",
4
- "description": "Select2 is a jQuery based replacement for select boxes. It supports searching, remote data sets, and infinite scrolling of results.",
5
- "keywords": [
6
- "select",
7
- "autocomplete",
8
- "typeahead",
9
- "dropdown",
10
- "multiselect",
11
- "tag",
12
- "tagging"
13
- ],
14
- "version": "3.5.2",
15
- "author": {
16
- "name": "Igor Vaynberg",
17
- "url": "https://github.com/ivaynberg"
18
- },
19
- "licenses": [
20
- {
21
- "type": "Apache",
22
- "url": "http://www.apache.org/licenses/LICENSE-2.0"
23
- },
24
- {
25
- "type": "GPL v2",
26
- "url": "http://www.gnu.org/licenses/gpl-2.0.html"
27
- }
28
- ],
29
- "bugs": "https://github.com/ivaynberg/select2/issues",
30
- "homepage": "http://ivaynberg.github.com/select2",
31
- "docs": "http://ivaynberg.github.com/select2/",
32
- "download": "https://github.com/ivaynberg/select2/tags",
33
- "dependencies": {
34
- "jquery": ">=1.7.1"
35
- }
36
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2.js DELETED
@@ -1,3558 +0,0 @@
1
- /*
2
- Copyright 2012 Igor Vaynberg
3
-
4
- Version: @@ver@@ Timestamp: @@timestamp@@
5
-
6
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
7
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
8
- use of this software only upon the condition that you accept all of the terms of either the Apache
9
- License or the GPL License.
10
-
11
- You may obtain a copy of the Apache License and the GPL License at:
12
-
13
- http://www.apache.org/licenses/LICENSE-2.0
14
- http://www.gnu.org/licenses/gpl-2.0.html
15
-
16
- Unless required by applicable law or agreed to in writing, software distributed under the
17
- Apache License or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
18
- CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
19
- the specific language governing permissions and limitations under the Apache License and the GPL License.
20
- */
21
- (function ($) {
22
- if(typeof $.fn.each2 == "undefined") {
23
- $.extend($.fn, {
24
- /*
25
- * 4-10 times faster .each replacement
26
- * use it carefully, as it overrides jQuery context of element on each iteration
27
- */
28
- each2 : function (c) {
29
- var j = $([0]), i = -1, l = this.length;
30
- while (
31
- ++i < l
32
- && (j.context = j[0] = this[i])
33
- && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
34
- );
35
- return this;
36
- }
37
- });
38
- }
39
- })(jQuery);
40
-
41
- (function ($, undefined) {
42
- "use strict";
43
- /*global document, window, jQuery, console */
44
-
45
- if (window.Select2 !== undefined) {
46
- return;
47
- }
48
-
49
- var AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
50
- lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
51
-
52
- KEY = {
53
- TAB: 9,
54
- ENTER: 13,
55
- ESC: 27,
56
- SPACE: 32,
57
- LEFT: 37,
58
- UP: 38,
59
- RIGHT: 39,
60
- DOWN: 40,
61
- SHIFT: 16,
62
- CTRL: 17,
63
- ALT: 18,
64
- PAGE_UP: 33,
65
- PAGE_DOWN: 34,
66
- HOME: 36,
67
- END: 35,
68
- BACKSPACE: 8,
69
- DELETE: 46,
70
- isArrow: function (k) {
71
- k = k.which ? k.which : k;
72
- switch (k) {
73
- case KEY.LEFT:
74
- case KEY.RIGHT:
75
- case KEY.UP:
76
- case KEY.DOWN:
77
- return true;
78
- }
79
- return false;
80
- },
81
- isControl: function (e) {
82
- var k = e.which;
83
- switch (k) {
84
- case KEY.SHIFT:
85
- case KEY.CTRL:
86
- case KEY.ALT:
87
- return true;
88
- }
89
-
90
- if (e.metaKey) return true;
91
-
92
- return false;
93
- },
94
- isFunctionKey: function (k) {
95
- k = k.which ? k.which : k;
96
- return k >= 112 && k <= 123;
97
- }
98
- },
99
- MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",
100
-
101
- DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038A":"\u0399","\u03AA":"\u0399","\u038C":"\u039F","\u038E":"\u03A5","\u03AB":"\u03A5","\u038F":"\u03A9","\u03AC":"\u03B1","\u03AD":"\u03B5","\u03AE":"\u03B7","\u03AF":"\u03B9","\u03CA":"\u03B9","\u0390":"\u03B9","\u03CC":"\u03BF","\u03CD":"\u03C5","\u03CB":"\u03C5","\u03B0":"\u03C5","\u03C9":"\u03C9","\u03C2":"\u03C3"};
102
-
103
- $document = $(document);
104
-
105
- nextUid=(function() { var counter=1; return function() { return counter++; }; }());
106
-
107
-
108
- function reinsertElement(element) {
109
- var placeholder = $(document.createTextNode(''));
110
-
111
- element.before(placeholder);
112
- placeholder.before(element);
113
- placeholder.remove();
114
- }
115
-
116
- function stripDiacritics(str) {
117
- // Used 'uni range + named function' from http://jsperf.com/diacritics/18
118
- function match(a) {
119
- return DIACRITICS[a] || a;
120
- }
121
-
122
- return str.replace(/[^\u0000-\u007E]/g, match);
123
- }
124
-
125
- function indexOf(value, array) {
126
- var i = 0, l = array.length;
127
- for (; i < l; i = i + 1) {
128
- if (equal(value, array[i])) return i;
129
- }
130
- return -1;
131
- }
132
-
133
- function measureScrollbar () {
134
- var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
135
- $template.appendTo(document.body);
136
-
137
- var dim = {
138
- width: $template.width() - $template[0].clientWidth,
139
- height: $template.height() - $template[0].clientHeight
140
- };
141
- $template.remove();
142
-
143
- return dim;
144
- }
145
-
146
- /**
147
- * Compares equality of a and b
148
- * @param a
149
- * @param b
150
- */
151
- function equal(a, b) {
152
- if (a === b) return true;
153
- if (a === undefined || b === undefined) return false;
154
- if (a === null || b === null) return false;
155
- // Check whether 'a' or 'b' is a string (primitive or object).
156
- // The concatenation of an empty string (+'') converts its argument to a string's primitive.
157
- if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
158
- if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
159
- return false;
160
- }
161
-
162
- /**
163
- * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty
164
- * strings
165
- * @param string
166
- * @param separator
167
- */
168
- function splitVal(string, separator, transform) {
169
- var val, i, l;
170
- if (string === null || string.length < 1) return [];
171
- val = string.split(separator);
172
- for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]);
173
- return val;
174
- }
175
-
176
- function getSideBorderPadding(element) {
177
- return element.outerWidth(false) - element.width();
178
- }
179
-
180
- function installKeyUpChangeEvent(element) {
181
- var key="keyup-change-value";
182
- element.on("keydown", function () {
183
- if ($.data(element, key) === undefined) {
184
- $.data(element, key, element.val());
185
- }
186
- });
187
- element.on("keyup", function () {
188
- var val= $.data(element, key);
189
- if (val !== undefined && element.val() !== val) {
190
- $.removeData(element, key);
191
- element.trigger("keyup-change");
192
- }
193
- });
194
- }
195
-
196
-
197
- /**
198
- * filters mouse events so an event is fired only if the mouse moved.
199
- *
200
- * filters out mouse events that occur when mouse is stationary but
201
- * the elements under the pointer are scrolled.
202
- */
203
- function installFilteredMouseMove(element) {
204
- element.on("mousemove", function (e) {
205
- var lastpos = lastMousePosition;
206
- if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
207
- $(e.target).trigger("mousemove-filtered", e);
208
- }
209
- });
210
- }
211
-
212
- /**
213
- * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
214
- * within the last quietMillis milliseconds.
215
- *
216
- * @param quietMillis number of milliseconds to wait before invoking fn
217
- * @param fn function to be debounced
218
- * @param ctx object to be used as this reference within fn
219
- * @return debounced version of fn
220
- */
221
- function debounce(quietMillis, fn, ctx) {
222
- ctx = ctx || undefined;
223
- var timeout;
224
- return function () {
225
- var args = arguments;
226
- window.clearTimeout(timeout);
227
- timeout = window.setTimeout(function() {
228
- fn.apply(ctx, args);
229
- }, quietMillis);
230
- };
231
- }
232
-
233
- function installDebouncedScroll(threshold, element) {
234
- var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
235
- element.on("scroll", function (e) {
236
- if (indexOf(e.target, element.get()) >= 0) notify(e);
237
- });
238
- }
239
-
240
- function focus($el) {
241
- if ($el[0] === document.activeElement) return;
242
-
243
- /* set the focus in a 0 timeout - that way the focus is set after the processing
244
- of the current event has finished - which seems like the only reliable way
245
- to set focus */
246
- window.setTimeout(function() {
247
- var el=$el[0], pos=$el.val().length, range;
248
-
249
- $el.focus();
250
-
251
- /* make sure el received focus so we do not error out when trying to manipulate the caret.
252
- sometimes modals or others listeners may steal it after its set */
253
- var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);
254
- if (isVisible && el === document.activeElement) {
255
-
256
- /* after the focus is set move the caret to the end, necessary when we val()
257
- just before setting focus */
258
- if(el.setSelectionRange)
259
- {
260
- el.setSelectionRange(pos, pos);
261
- }
262
- else if (el.createTextRange) {
263
- range = el.createTextRange();
264
- range.collapse(false);
265
- range.select();
266
- }
267
- }
268
- }, 0);
269
- }
270
-
271
- function getCursorInfo(el) {
272
- el = $(el)[0];
273
- var offset = 0;
274
- var length = 0;
275
- if ('selectionStart' in el) {
276
- offset = el.selectionStart;
277
- length = el.selectionEnd - offset;
278
- } else if ('selection' in document) {
279
- el.focus();
280
- var sel = document.selection.createRange();
281
- length = document.selection.createRange().text.length;
282
- sel.moveStart('character', -el.value.length);
283
- offset = sel.text.length - length;
284
- }
285
- return { offset: offset, length: length };
286
- }
287
-
288
- function killEvent(event) {
289
- event.preventDefault();
290
- event.stopPropagation();
291
- }
292
- function killEventImmediately(event) {
293
- event.preventDefault();
294
- event.stopImmediatePropagation();
295
- }
296
-
297
- function measureTextWidth(e) {
298
- if (!sizer){
299
- var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
300
- sizer = $(document.createElement("div")).css({
301
- position: "absolute",
302
- left: "-10000px",
303
- top: "-10000px",
304
- display: "none",
305
- fontSize: style.fontSize,
306
- fontFamily: style.fontFamily,
307
- fontStyle: style.fontStyle,
308
- fontWeight: style.fontWeight,
309
- letterSpacing: style.letterSpacing,
310
- textTransform: style.textTransform,
311
- whiteSpace: "nowrap"
312
- });
313
- sizer.attr("class","select2-sizer");
314
- $(document.body).append(sizer);
315
- }
316
- sizer.text(e.val());
317
- return sizer.width();
318
- }
319
-
320
- function syncCssClasses(dest, src, adapter) {
321
- var classes, replacements = [], adapted;
322
-
323
- classes = $.trim(dest.attr("class"));
324
-
325
- if (classes) {
326
- classes = '' + classes; // for IE which returns object
327
-
328
- $(classes.split(/\s+/)).each2(function() {
329
- if (this.indexOf("select2-") === 0) {
330
- replacements.push(this);
331
- }
332
- });
333
- }
334
-
335
- classes = $.trim(src.attr("class"));
336
-
337
- if (classes) {
338
- classes = '' + classes; // for IE which returns object
339
-
340
- $(classes.split(/\s+/)).each2(function() {
341
- if (this.indexOf("select2-") !== 0) {
342
- adapted = adapter(this);
343
-
344
- if (adapted) {
345
- replacements.push(adapted);
346
- }
347
- }
348
- });
349
- }
350
-
351
- dest.attr("class", replacements.join(" "));
352
- }
353
-
354
-
355
- function markMatch(text, term, markup, escapeMarkup) {
356
- var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
357
- tl=term.length;
358
-
359
- if (match<0) {
360
- markup.push(escapeMarkup(text));
361
- return;
362
- }
363
-
364
- markup.push(escapeMarkup(text.substring(0, match)));
365
- markup.push("<span class='select2-match'>");
366
- markup.push(escapeMarkup(text.substring(match, match + tl)));
367
- markup.push("</span>");
368
- markup.push(escapeMarkup(text.substring(match + tl, text.length)));
369
- }
370
-
371
- function defaultEscapeMarkup(markup) {
372
- var replace_map = {
373
- '\\': '&#92;',
374
- '&': '&amp;',
375
- '<': '&lt;',
376
- '>': '&gt;',
377
- '"': '&quot;',
378
- "'": '&#39;',
379
- "/": '&#47;'
380
- };
381
-
382
- return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
383
- return replace_map[match];
384
- });
385
- }
386
-
387
- /**
388
- * Produces an ajax-based query function
389
- *
390
- * @param options object containing configuration parameters
391
- * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
392
- * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
393
- * @param options.url url for the data
394
- * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
395
- * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified
396
- * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
397
- * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.
398
- * The expected format is an object containing the following keys:
399
- * results array of objects that will be used as choices
400
- * more (optional) boolean indicating whether there are more results available
401
- * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
402
- */
403
- function ajax(options) {
404
- var timeout, // current scheduled but not yet executed request
405
- handler = null,
406
- quietMillis = options.quietMillis || 100,
407
- ajaxUrl = options.url,
408
- self = this;
409
-
410
- return function (query) {
411
- window.clearTimeout(timeout);
412
- timeout = window.setTimeout(function () {
413
- var data = options.data, // ajax data function
414
- url = ajaxUrl, // ajax url string or function
415
- transport = options.transport || $.fn.select2.ajaxDefaults.transport,
416
- // deprecated - to be removed in 4.0 - use params instead
417
- deprecated = {
418
- type: options.type || 'GET', // set type of request (GET or POST)
419
- cache: options.cache || false,
420
- jsonpCallback: options.jsonpCallback||undefined,
421
- dataType: options.dataType||"json"
422
- },
423
- params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
424
-
425
- data = data ? data.call(self, query.term, query.page, query.context) : null;
426
- url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
427
-
428
- if (handler && typeof handler.abort === "function") { handler.abort(); }
429
-
430
- if (options.params) {
431
- if ($.isFunction(options.params)) {
432
- $.extend(params, options.params.call(self));
433
- } else {
434
- $.extend(params, options.params);
435
- }
436
- }
437
-
438
- $.extend(params, {
439
- url: url,
440
- dataType: options.dataType,
441
- data: data,
442
- success: function (data) {
443
- // TODO - replace query.page with query so users have access to term, page, etc.
444
- // added query as third paramter to keep backwards compatibility
445
- var results = options.results(data, query.page, query);
446
- query.callback(results);
447
- },
448
- error: function(jqXHR, textStatus, errorThrown){
449
- var results = {
450
- hasError: true,
451
- jqXHR: jqXHR,
452
- textStatus: textStatus,
453
- errorThrown: errorThrown
454
- };
455
-
456
- query.callback(results);
457
- }
458
- });
459
- handler = transport.call(self, params);
460
- }, quietMillis);
461
- };
462
- }
463
-
464
- /**
465
- * Produces a query function that works with a local array
466
- *
467
- * @param options object containing configuration parameters. The options parameter can either be an array or an
468
- * object.
469
- *
470
- * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
471
- *
472
- * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
473
- * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
474
- * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
475
- * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
476
- * the text.
477
- */
478
- function local(options) {
479
- var data = options, // data elements
480
- dataText,
481
- tmp,
482
- text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
483
-
484
- if ($.isArray(data)) {
485
- tmp = data;
486
- data = { results: tmp };
487
- }
488
-
489
- if ($.isFunction(data) === false) {
490
- tmp = data;
491
- data = function() { return tmp; };
492
- }
493
-
494
- var dataItem = data();
495
- if (dataItem.text) {
496
- text = dataItem.text;
497
- // if text is not a function we assume it to be a key name
498
- if (!$.isFunction(text)) {
499
- dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
500
- text = function (item) { return item[dataText]; };
501
- }
502
- }
503
-
504
- return function (query) {
505
- var t = query.term, filtered = { results: [] }, process;
506
- if (t === "") {
507
- query.callback(data());
508
- return;
509
- }
510
-
511
- process = function(datum, collection) {
512
- var group, attr;
513
- datum = datum[0];
514
- if (datum.children) {
515
- group = {};
516
- for (attr in datum) {
517
- if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
518
- }
519
- group.children=[];
520
- $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
521
- if (group.children.length || query.matcher(t, text(group), datum)) {
522
- collection.push(group);
523
- }
524
- } else {
525
- if (query.matcher(t, text(datum), datum)) {
526
- collection.push(datum);
527
- }
528
- }
529
- };
530
-
531
- $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
532
- query.callback(filtered);
533
- };
534
- }
535
-
536
- // TODO javadoc
537
- function tags(data) {
538
- var isFunc = $.isFunction(data);
539
- return function (query) {
540
- var t = query.term, filtered = {results: []};
541
- var result = isFunc ? data(query) : data;
542
- if ($.isArray(result)) {
543
- $(result).each(function () {
544
- var isObject = this.text !== undefined,
545
- text = isObject ? this.text : this;
546
- if (t === "" || query.matcher(t, text)) {
547
- filtered.results.push(isObject ? this : {id: this, text: this});
548
- }
549
- });
550
- query.callback(filtered);
551
- }
552
- };
553
- }
554
-
555
- /**
556
- * Checks if the formatter function should be used.
557
- *
558
- * Throws an error if it is not a function. Returns true if it should be used,
559
- * false if no formatting should be performed.
560
- *
561
- * @param formatter
562
- */
563
- function checkFormatter(formatter, formatterName) {
564
- if ($.isFunction(formatter)) return true;
565
- if (!formatter) return false;
566
- if (typeof(formatter) === 'string') return true;
567
- throw new Error(formatterName +" must be a string, function, or falsy value");
568
- }
569
-
570
- /**
571
- * Returns a given value
572
- * If given a function, returns its output
573
- *
574
- * @param val string|function
575
- * @param context value of "this" to be passed to function
576
- * @returns {*}
577
- */
578
- function evaluate(val, context) {
579
- if ($.isFunction(val)) {
580
- var args = Array.prototype.slice.call(arguments, 2);
581
- return val.apply(context, args);
582
- }
583
- return val;
584
- }
585
-
586
- function countResults(results) {
587
- var count = 0;
588
- $.each(results, function(i, item) {
589
- if (item.children) {
590
- count += countResults(item.children);
591
- } else {
592
- count++;
593
- }
594
- });
595
- return count;
596
- }
597
-
598
- /**
599
- * Default tokenizer. This function uses breaks the input on substring match of any string from the
600
- * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
601
- * two options have to be defined in order for the tokenizer to work.
602
- *
603
- * @param input text user has typed so far or pasted into the search field
604
- * @param selection currently selected choices
605
- * @param selectCallback function(choice) callback tho add the choice to selection
606
- * @param opts select2's opts
607
- * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
608
- */
609
- function defaultTokenizer(input, selection, selectCallback, opts) {
610
- var original = input, // store the original so we can compare and know if we need to tell the search to update its text
611
- dupe = false, // check for whether a token we extracted represents a duplicate selected choice
612
- token, // token
613
- index, // position at which the separator was found
614
- i, l, // looping variables
615
- separator; // the matched separator
616
-
617
- if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
618
-
619
- while (true) {
620
- index = -1;
621
-
622
- for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
623
- separator = opts.tokenSeparators[i];
624
- index = input.indexOf(separator);
625
- if (index >= 0) break;
626
- }
627
-
628
- if (index < 0) break; // did not find any token separator in the input string, bail
629
-
630
- token = input.substring(0, index);
631
- input = input.substring(index + separator.length);
632
-
633
- if (token.length > 0) {
634
- token = opts.createSearchChoice.call(this, token, selection);
635
- if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
636
- dupe = false;
637
- for (i = 0, l = selection.length; i < l; i++) {
638
- if (equal(opts.id(token), opts.id(selection[i]))) {
639
- dupe = true; break;
640
- }
641
- }
642
-
643
- if (!dupe) selectCallback(token);
644
- }
645
- }
646
- }
647
-
648
- if (original!==input) return input;
649
- }
650
-
651
- function cleanupJQueryElements() {
652
- var self = this;
653
-
654
- $.each(arguments, function (i, element) {
655
- self[element].remove();
656
- self[element] = null;
657
- });
658
- }
659
-
660
- /**
661
- * Creates a new class
662
- *
663
- * @param superClass
664
- * @param methods
665
- */
666
- function clazz(SuperClass, methods) {
667
- var constructor = function () {};
668
- constructor.prototype = new SuperClass;
669
- constructor.prototype.constructor = constructor;
670
- constructor.prototype.parent = SuperClass.prototype;
671
- constructor.prototype = $.extend(constructor.prototype, methods);
672
- return constructor;
673
- }
674
-
675
- AbstractSelect2 = clazz(Object, {
676
-
677
- // abstract
678
- bind: function (func) {
679
- var self = this;
680
- return function () {
681
- func.apply(self, arguments);
682
- };
683
- },
684
-
685
- // abstract
686
- init: function (opts) {
687
- var results, search, resultsSelector = ".select2-results";
688
-
689
- // prepare options
690
- this.opts = opts = this.prepareOpts(opts);
691
-
692
- this.id=opts.id;
693
-
694
- // destroy if called on an existing component
695
- if (opts.element.data("select2") !== undefined &&
696
- opts.element.data("select2") !== null) {
697
- opts.element.data("select2").destroy();
698
- }
699
-
700
- this.container = this.createContainer();
701
-
702
- this.liveRegion = $('.select2-hidden-accessible');
703
- if (this.liveRegion.length == 0) {
704
- this.liveRegion = $("<span>", {
705
- role: "status",
706
- "aria-live": "polite"
707
- })
708
- .addClass("select2-hidden-accessible")
709
- .appendTo(document.body);
710
- }
711
-
712
- this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
713
- this.containerEventName= this.containerId
714
- .replace(/([.])/g, '_')
715
- .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
716
- this.container.attr("id", this.containerId);
717
-
718
- this.container.attr("title", opts.element.attr("title"));
719
-
720
- this.body = $(document.body);
721
-
722
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
723
-
724
- this.container.attr("style", opts.element.attr("style"));
725
- this.container.css(evaluate(opts.containerCss, this.opts.element));
726
- this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));
727
-
728
- this.elementTabIndex = this.opts.element.attr("tabindex");
729
-
730
- // swap container for the element
731
- this.opts.element
732
- .data("select2", this)
733
- .attr("tabindex", "-1")
734
- .before(this.container)
735
- .on("click.select2", killEvent); // do not leak click events
736
-
737
- this.container.data("select2", this);
738
-
739
- this.dropdown = this.container.find(".select2-drop");
740
-
741
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
742
-
743
- this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));
744
- this.dropdown.data("select2", this);
745
- this.dropdown.on("click", killEvent);
746
-
747
- this.results = results = this.container.find(resultsSelector);
748
- this.search = search = this.container.find("input.select2-input");
749
-
750
- this.queryCount = 0;
751
- this.resultsPage = 0;
752
- this.context = null;
753
-
754
- // initialize the container
755
- this.initContainer();
756
-
757
- this.container.on("click", killEvent);
758
-
759
- installFilteredMouseMove(this.results);
760
-
761
- this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent));
762
- this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) {
763
- this._touchEvent = true;
764
- this.highlightUnderEvent(event);
765
- }));
766
- this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
767
- this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
768
-
769
- // Waiting for a click event on touch devices to select option and hide dropdown
770
- // otherwise click will be triggered on an underlying element
771
- this.dropdown.on('click', this.bind(function (event) {
772
- if (this._touchEvent) {
773
- this._touchEvent = false;
774
- this.selectHighlighted();
775
- }
776
- }));
777
-
778
- installDebouncedScroll(80, this.results);
779
- this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
780
-
781
- // do not propagate change event from the search field out of the component
782
- $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
783
- $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
784
-
785
- // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
786
- if ($.fn.mousewheel) {
787
- results.mousewheel(function (e, delta, deltaX, deltaY) {
788
- var top = results.scrollTop();
789
- if (deltaY > 0 && top - deltaY <= 0) {
790
- results.scrollTop(0);
791
- killEvent(e);
792
- } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
793
- results.scrollTop(results.get(0).scrollHeight - results.height());
794
- killEvent(e);
795
- }
796
- });
797
- }
798
-
799
- installKeyUpChangeEvent(search);
800
- search.on("keyup-change input paste", this.bind(this.updateResults));
801
- search.on("focus", function () { search.addClass("select2-focused"); });
802
- search.on("blur", function () { search.removeClass("select2-focused");});
803
-
804
- this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
805
- if ($(e.target).closest(".select2-result-selectable").length > 0) {
806
- this.highlightUnderEvent(e);
807
- this.selectHighlighted(e);
808
- }
809
- }));
810
-
811
- // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
812
- // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
813
- // dom it will trigger the popup close, which is not what we want
814
- // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.
815
- this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); });
816
-
817
- this.lastSearchTerm = undefined;
818
-
819
- if ($.isFunction(this.opts.initSelection)) {
820
- // initialize selection based on the current value of the source element
821
- this.initSelection();
822
-
823
- // if the user has provided a function that can set selection based on the value of the source element
824
- // we monitor the change event on the element and trigger it, allowing for two way synchronization
825
- this.monitorSource();
826
- }
827
-
828
- if (opts.maximumInputLength !== null) {
829
- this.search.attr("maxlength", opts.maximumInputLength);
830
- }
831
-
832
- var disabled = opts.element.prop("disabled");
833
- if (disabled === undefined) disabled = false;
834
- this.enable(!disabled);
835
-
836
- var readonly = opts.element.prop("readonly");
837
- if (readonly === undefined) readonly = false;
838
- this.readonly(readonly);
839
-
840
- // Calculate size of scrollbar
841
- scrollBarDimensions = scrollBarDimensions || measureScrollbar();
842
-
843
- this.autofocus = opts.element.prop("autofocus");
844
- opts.element.prop("autofocus", false);
845
- if (this.autofocus) this.focus();
846
-
847
- this.search.attr("placeholder", opts.searchInputPlaceholder);
848
- },
849
-
850
- // abstract
851
- destroy: function () {
852
- var element=this.opts.element, select2 = element.data("select2"), self = this;
853
-
854
- this.close();
855
-
856
- if (element.length && element[0].detachEvent && self._sync) {
857
- element.each(function () {
858
- if (self._sync) {
859
- this.detachEvent("onpropertychange", self._sync);
860
- }
861
- });
862
- }
863
- if (this.propertyObserver) {
864
- this.propertyObserver.disconnect();
865
- this.propertyObserver = null;
866
- }
867
- this._sync = null;
868
-
869
- if (select2 !== undefined) {
870
- select2.container.remove();
871
- select2.liveRegion.remove();
872
- select2.dropdown.remove();
873
- element.removeData("select2")
874
- .off("select2");
875
- if (!element.is("input[type='hidden']")) {
876
- element
877
- .show()
878
- .prop("autofocus", this.autofocus || false);
879
- if (this.elementTabIndex) {
880
- element.attr({tabindex: this.elementTabIndex});
881
- } else {
882
- element.removeAttr("tabindex");
883
- }
884
- element.show();
885
- } else {
886
- element.css("display", "");
887
- }
888
- }
889
-
890
- cleanupJQueryElements.call(this,
891
- "container",
892
- "liveRegion",
893
- "dropdown",
894
- "results",
895
- "search"
896
- );
897
- },
898
-
899
- // abstract
900
- optionToData: function(element) {
901
- if (element.is("option")) {
902
- return {
903
- id:element.prop("value"),
904
- text:element.text(),
905
- element: element.get(),
906
- css: element.attr("class"),
907
- disabled: element.prop("disabled"),
908
- locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
909
- };
910
- } else if (element.is("optgroup")) {
911
- return {
912
- text:element.attr("label"),
913
- children:[],
914
- element: element.get(),
915
- css: element.attr("class")
916
- };
917
- }
918
- },
919
-
920
- // abstract
921
- prepareOpts: function (opts) {
922
- var element, select, idKey, ajaxUrl, self = this;
923
-
924
- element = opts.element;
925
-
926
- if (element.get(0).tagName.toLowerCase() === "select") {
927
- this.select = select = opts.element;
928
- }
929
-
930
- if (select) {
931
- // these options are not allowed when attached to a select because they are picked up off the element itself
932
- $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
933
- if (this in opts) {
934
- throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
935
- }
936
- });
937
- }
938
-
939
- opts = $.extend({}, {
940
- populateResults: function(container, results, query) {
941
- var populate, id=this.opts.id, liveRegion=this.liveRegion;
942
-
943
- populate=function(results, container, depth) {
944
-
945
- var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
946
-
947
- results = opts.sortResults(results, container, query);
948
-
949
- // collect the created nodes for bulk append
950
- var nodes = [];
951
- for (i = 0, l = results.length; i < l; i = i + 1) {
952
-
953
- result=results[i];
954
-
955
- disabled = (result.disabled === true);
956
- selectable = (!disabled) && (id(result) !== undefined);
957
-
958
- compound=result.children && result.children.length > 0;
959
-
960
- node=$("<li></li>");
961
- node.addClass("select2-results-dept-"+depth);
962
- node.addClass("select2-result");
963
- node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
964
- if (disabled) { node.addClass("select2-disabled"); }
965
- if (compound) { node.addClass("select2-result-with-children"); }
966
- node.addClass(self.opts.formatResultCssClass(result));
967
- node.attr("role", "presentation");
968
-
969
- label=$(document.createElement("div"));
970
- label.addClass("select2-result-label");
971
- label.attr("id", "select2-result-label-" + nextUid());
972
- label.attr("role", "option");
973
-
974
- formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
975
- if (formatted!==undefined) {
976
- label.html(formatted);
977
- node.append(label);
978
- }
979
-
980
-
981
- if (compound) {
982
-
983
- innerContainer=$("<ul></ul>");
984
- innerContainer.addClass("select2-result-sub");
985
- populate(result.children, innerContainer, depth+1);
986
- node.append(innerContainer);
987
- }
988
-
989
- node.data("select2-data", result);
990
- nodes.push(node[0]);
991
- }
992
-
993
- // bulk append the created nodes
994
- container.append(nodes);
995
- liveRegion.text(opts.formatMatches(results.length));
996
- };
997
-
998
- populate(results, container, 0);
999
- }
1000
- }, $.fn.select2.defaults, opts);
1001
-
1002
- if (typeof(opts.id) !== "function") {
1003
- idKey = opts.id;
1004
- opts.id = function (e) { return e[idKey]; };
1005
- }
1006
-
1007
- if ($.isArray(opts.element.data("select2Tags"))) {
1008
- if ("tags" in opts) {
1009
- throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
1010
- }
1011
- opts.tags=opts.element.data("select2Tags");
1012
- }
1013
-
1014
- if (select) {
1015
- opts.query = this.bind(function (query) {
1016
- var data = { results: [], more: false },
1017
- term = query.term,
1018
- children, placeholderOption, process;
1019
-
1020
- process=function(element, collection) {
1021
- var group;
1022
- if (element.is("option")) {
1023
- if (query.matcher(term, element.text(), element)) {
1024
- collection.push(self.optionToData(element));
1025
- }
1026
- } else if (element.is("optgroup")) {
1027
- group=self.optionToData(element);
1028
- element.children().each2(function(i, elm) { process(elm, group.children); });
1029
- if (group.children.length>0) {
1030
- collection.push(group);
1031
- }
1032
- }
1033
- };
1034
-
1035
- children=element.children();
1036
-
1037
- // ignore the placeholder option if there is one
1038
- if (this.getPlaceholder() !== undefined && children.length > 0) {
1039
- placeholderOption = this.getPlaceholderOption();
1040
- if (placeholderOption) {
1041
- children=children.not(placeholderOption);
1042
- }
1043
- }
1044
-
1045
- children.each2(function(i, elm) { process(elm, data.results); });
1046
-
1047
- query.callback(data);
1048
- });
1049
- // this is needed because inside val() we construct choices from options and their id is hardcoded
1050
- opts.id=function(e) { return e.id; };
1051
- } else {
1052
- if (!("query" in opts)) {
1053
-
1054
- if ("ajax" in opts) {
1055
- ajaxUrl = opts.element.data("ajax-url");
1056
- if (ajaxUrl && ajaxUrl.length > 0) {
1057
- opts.ajax.url = ajaxUrl;
1058
- }
1059
- opts.query = ajax.call(opts.element, opts.ajax);
1060
- } else if ("data" in opts) {
1061
- opts.query = local(opts.data);
1062
- } else if ("tags" in opts) {
1063
- opts.query = tags(opts.tags);
1064
- if (opts.createSearchChoice === undefined) {
1065
- opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
1066
- }
1067
- if (opts.initSelection === undefined) {
1068
- opts.initSelection = function (element, callback) {
1069
- var data = [];
1070
- $(splitVal(element.val(), opts.separator, opts.transformVal)).each(function () {
1071
- var obj = { id: this, text: this },
1072
- tags = opts.tags;
1073
- if ($.isFunction(tags)) tags=tags();
1074
- $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
1075
- data.push(obj);
1076
- });
1077
-
1078
- callback(data);
1079
- };
1080
- }
1081
- }
1082
- }
1083
- }
1084
- if (typeof(opts.query) !== "function") {
1085
- throw "query function not defined for Select2 " + opts.element.attr("id");
1086
- }
1087
-
1088
- if (opts.createSearchChoicePosition === 'top') {
1089
- opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
1090
- }
1091
- else if (opts.createSearchChoicePosition === 'bottom') {
1092
- opts.createSearchChoicePosition = function(list, item) { list.push(item); };
1093
- }
1094
- else if (typeof(opts.createSearchChoicePosition) !== "function") {
1095
- throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
1096
- }
1097
-
1098
- return opts;
1099
- },
1100
-
1101
- /**
1102
- * Monitor the original element for changes and update select2 accordingly
1103
- */
1104
- // abstract
1105
- monitorSource: function () {
1106
- var el = this.opts.element, observer, self = this;
1107
-
1108
- el.on("change.select2", this.bind(function (e) {
1109
- if (this.opts.element.data("select2-change-triggered") !== true) {
1110
- this.initSelection();
1111
- }
1112
- }));
1113
-
1114
- this._sync = this.bind(function () {
1115
-
1116
- // sync enabled state
1117
- var disabled = el.prop("disabled");
1118
- if (disabled === undefined) disabled = false;
1119
- this.enable(!disabled);
1120
-
1121
- var readonly = el.prop("readonly");
1122
- if (readonly === undefined) readonly = false;
1123
- this.readonly(readonly);
1124
-
1125
- if (this.container) {
1126
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
1127
- this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));
1128
- }
1129
-
1130
- if (this.dropdown) {
1131
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
1132
- this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));
1133
- }
1134
-
1135
- });
1136
-
1137
- // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)
1138
- if (el.length && el[0].attachEvent) {
1139
- el.each(function() {
1140
- this.attachEvent("onpropertychange", self._sync);
1141
- });
1142
- }
1143
-
1144
- // safari, chrome, firefox, IE11
1145
- observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
1146
- if (observer !== undefined) {
1147
- if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
1148
- this.propertyObserver = new observer(function (mutations) {
1149
- $.each(mutations, self._sync);
1150
- });
1151
- this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
1152
- }
1153
- },
1154
-
1155
- // abstract
1156
- triggerSelect: function(data) {
1157
- var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data });
1158
- this.opts.element.trigger(evt);
1159
- return !evt.isDefaultPrevented();
1160
- },
1161
-
1162
- /**
1163
- * Triggers the change event on the source element
1164
- */
1165
- // abstract
1166
- triggerChange: function (details) {
1167
-
1168
- details = details || {};
1169
- details= $.extend({}, details, { type: "change", val: this.val() });
1170
- // prevents recursive triggering
1171
- this.opts.element.data("select2-change-triggered", true);
1172
- this.opts.element.trigger(details);
1173
- this.opts.element.data("select2-change-triggered", false);
1174
-
1175
- // some validation frameworks ignore the change event and listen instead to keyup, click for selects
1176
- // so here we trigger the click event manually
1177
- this.opts.element.click();
1178
-
1179
- // ValidationEngine ignores the change event and listens instead to blur
1180
- // so here we trigger the blur event manually if so desired
1181
- if (this.opts.blurOnChange)
1182
- this.opts.element.blur();
1183
- },
1184
-
1185
- //abstract
1186
- isInterfaceEnabled: function()
1187
- {
1188
- return this.enabledInterface === true;
1189
- },
1190
-
1191
- // abstract
1192
- enableInterface: function() {
1193
- var enabled = this._enabled && !this._readonly,
1194
- disabled = !enabled;
1195
-
1196
- if (enabled === this.enabledInterface) return false;
1197
-
1198
- this.container.toggleClass("select2-container-disabled", disabled);
1199
- this.close();
1200
- this.enabledInterface = enabled;
1201
-
1202
- return true;
1203
- },
1204
-
1205
- // abstract
1206
- enable: function(enabled) {
1207
- if (enabled === undefined) enabled = true;
1208
- if (this._enabled === enabled) return;
1209
- this._enabled = enabled;
1210
-
1211
- this.opts.element.prop("disabled", !enabled);
1212
- this.enableInterface();
1213
- },
1214
-
1215
- // abstract
1216
- disable: function() {
1217
- this.enable(false);
1218
- },
1219
-
1220
- // abstract
1221
- readonly: function(enabled) {
1222
- if (enabled === undefined) enabled = false;
1223
- if (this._readonly === enabled) return;
1224
- this._readonly = enabled;
1225
-
1226
- this.opts.element.prop("readonly", enabled);
1227
- this.enableInterface();
1228
- },
1229
-
1230
- // abstract
1231
- opened: function () {
1232
- return (this.container) ? this.container.hasClass("select2-dropdown-open") : false;
1233
- },
1234
-
1235
- // abstract
1236
- positionDropdown: function() {
1237
- var $dropdown = this.dropdown,
1238
- container = this.container,
1239
- offset = container.offset(),
1240
- height = container.outerHeight(false),
1241
- width = container.outerWidth(false),
1242
- dropHeight = $dropdown.outerHeight(false),
1243
- $window = $(window),
1244
- windowWidth = $window.width(),
1245
- windowHeight = $window.height(),
1246
- viewPortRight = $window.scrollLeft() + windowWidth,
1247
- viewportBottom = $window.scrollTop() + windowHeight,
1248
- dropTop = offset.top + height,
1249
- dropLeft = offset.left,
1250
- enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
1251
- enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
1252
- dropWidth = $dropdown.outerWidth(false),
1253
- enoughRoomOnRight = function() {
1254
- return dropLeft + dropWidth <= viewPortRight;
1255
- },
1256
- enoughRoomOnLeft = function() {
1257
- return offset.left + viewPortRight + container.outerWidth(false) > dropWidth;
1258
- },
1259
- aboveNow = $dropdown.hasClass("select2-drop-above"),
1260
- bodyOffset,
1261
- above,
1262
- changeDirection,
1263
- css,
1264
- resultsListNode;
1265
-
1266
- // always prefer the current above/below alignment, unless there is not enough room
1267
- if (aboveNow) {
1268
- above = true;
1269
- if (!enoughRoomAbove && enoughRoomBelow) {
1270
- changeDirection = true;
1271
- above = false;
1272
- }
1273
- } else {
1274
- above = false;
1275
- if (!enoughRoomBelow && enoughRoomAbove) {
1276
- changeDirection = true;
1277
- above = true;
1278
- }
1279
- }
1280
-
1281
- //if we are changing direction we need to get positions when dropdown is hidden;
1282
- if (changeDirection) {
1283
- $dropdown.hide();
1284
- offset = this.container.offset();
1285
- height = this.container.outerHeight(false);
1286
- width = this.container.outerWidth(false);
1287
- dropHeight = $dropdown.outerHeight(false);
1288
- viewPortRight = $window.scrollLeft() + windowWidth;
1289
- viewportBottom = $window.scrollTop() + windowHeight;
1290
- dropTop = offset.top + height;
1291
- dropLeft = offset.left;
1292
- dropWidth = $dropdown.outerWidth(false);
1293
- $dropdown.show();
1294
-
1295
- // fix so the cursor does not move to the left within the search-textbox in IE
1296
- this.focusSearch();
1297
- }
1298
-
1299
- if (this.opts.dropdownAutoWidth) {
1300
- resultsListNode = $('.select2-results', $dropdown)[0];
1301
- $dropdown.addClass('select2-drop-auto-width');
1302
- $dropdown.css('width', '');
1303
- // Add scrollbar width to dropdown if vertical scrollbar is present
1304
- dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
1305
- dropWidth > width ? width = dropWidth : dropWidth = width;
1306
- dropHeight = $dropdown.outerHeight(false);
1307
- }
1308
- else {
1309
- this.container.removeClass('select2-drop-auto-width');
1310
- }
1311
-
1312
- //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
1313
- //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body.scrollTop(), "enough?", enoughRoomAbove);
1314
-
1315
- // fix positioning when body has an offset and is not position: static
1316
- if (this.body.css('position') !== 'static') {
1317
- bodyOffset = this.body.offset();
1318
- dropTop -= bodyOffset.top;
1319
- dropLeft -= bodyOffset.left;
1320
- }
1321
-
1322
- if (!enoughRoomOnRight() && enoughRoomOnLeft()) {
1323
- dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
1324
- }
1325
-
1326
- css = {
1327
- left: dropLeft,
1328
- width: width
1329
- };
1330
-
1331
- if (above) {
1332
- this.container.addClass("select2-drop-above");
1333
- $dropdown.addClass("select2-drop-above");
1334
- dropHeight = $dropdown.outerHeight(false);
1335
- css.top = offset.top - dropHeight;
1336
- css.bottom = 'auto';
1337
- }
1338
- else {
1339
- css.top = dropTop;
1340
- css.bottom = 'auto';
1341
- this.container.removeClass("select2-drop-above");
1342
- $dropdown.removeClass("select2-drop-above");
1343
- }
1344
- css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));
1345
-
1346
- $dropdown.css(css);
1347
- },
1348
-
1349
- // abstract
1350
- shouldOpen: function() {
1351
- var event;
1352
-
1353
- if (this.opened()) return false;
1354
-
1355
- if (this._enabled === false || this._readonly === true) return false;
1356
-
1357
- event = $.Event("select2-opening");
1358
- this.opts.element.trigger(event);
1359
- return !event.isDefaultPrevented();
1360
- },
1361
-
1362
- // abstract
1363
- clearDropdownAlignmentPreference: function() {
1364
- // clear the classes used to figure out the preference of where the dropdown should be opened
1365
- this.container.removeClass("select2-drop-above");
1366
- this.dropdown.removeClass("select2-drop-above");
1367
- },
1368
-
1369
- /**
1370
- * Opens the dropdown
1371
- *
1372
- * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
1373
- * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
1374
- */
1375
- // abstract
1376
- open: function () {
1377
-
1378
- if (!this.shouldOpen()) return false;
1379
-
1380
- this.opening();
1381
-
1382
- // Only bind the document mousemove when the dropdown is visible
1383
- $document.on("mousemove.select2Event", function (e) {
1384
- lastMousePosition.x = e.pageX;
1385
- lastMousePosition.y = e.pageY;
1386
- });
1387
-
1388
- return true;
1389
- },
1390
-
1391
- /**
1392
- * Performs the opening of the dropdown
1393
- */
1394
- // abstract
1395
- opening: function() {
1396
- var cid = this.containerEventName,
1397
- scroll = "scroll." + cid,
1398
- resize = "resize."+cid,
1399
- orient = "orientationchange."+cid,
1400
- mask;
1401
-
1402
- this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
1403
-
1404
- this.clearDropdownAlignmentPreference();
1405
-
1406
- if(this.dropdown[0] !== this.body.children().last()[0]) {
1407
- this.dropdown.detach().appendTo(this.body);
1408
- }
1409
-
1410
- // create the dropdown mask if doesn't already exist
1411
- mask = $("#select2-drop-mask");
1412
- if (mask.length === 0) {
1413
- mask = $(document.createElement("div"));
1414
- mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
1415
- mask.hide();
1416
- mask.appendTo(this.body);
1417
- mask.on("mousedown touchstart click", function (e) {
1418
- // Prevent IE from generating a click event on the body
1419
- reinsertElement(mask);
1420
-
1421
- var dropdown = $("#select2-drop"), self;
1422
- if (dropdown.length > 0) {
1423
- self=dropdown.data("select2");
1424
- if (self.opts.selectOnBlur) {
1425
- self.selectHighlighted({noFocus: true});
1426
- }
1427
- self.close();
1428
- e.preventDefault();
1429
- e.stopPropagation();
1430
- }
1431
- });
1432
- }
1433
-
1434
- // ensure the mask is always right before the dropdown
1435
- if (this.dropdown.prev()[0] !== mask[0]) {
1436
- this.dropdown.before(mask);
1437
- }
1438
-
1439
- // move the global id to the correct dropdown
1440
- $("#select2-drop").removeAttr("id");
1441
- this.dropdown.attr("id", "select2-drop");
1442
-
1443
- // show the elements
1444
- mask.show();
1445
-
1446
- this.positionDropdown();
1447
- this.dropdown.show();
1448
- this.positionDropdown();
1449
-
1450
- this.dropdown.addClass("select2-drop-active");
1451
-
1452
- // attach listeners to events that can change the position of the container and thus require
1453
- // the position of the dropdown to be updated as well so it does not come unglued from the container
1454
- var that = this;
1455
- this.container.parents().add(window).each(function () {
1456
- $(this).on(resize+" "+scroll+" "+orient, function (e) {
1457
- if (that.opened()) that.positionDropdown();
1458
- });
1459
- });
1460
-
1461
-
1462
- },
1463
-
1464
- // abstract
1465
- close: function () {
1466
- if (!this.opened()) return;
1467
-
1468
- var cid = this.containerEventName,
1469
- scroll = "scroll." + cid,
1470
- resize = "resize."+cid,
1471
- orient = "orientationchange."+cid;
1472
-
1473
- // unbind event listeners
1474
- this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
1475
-
1476
- this.clearDropdownAlignmentPreference();
1477
-
1478
- $("#select2-drop-mask").hide();
1479
- this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
1480
- this.dropdown.hide();
1481
- this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
1482
- this.results.empty();
1483
-
1484
- // Now that the dropdown is closed, unbind the global document mousemove event
1485
- $document.off("mousemove.select2Event");
1486
-
1487
- this.clearSearch();
1488
- this.search.removeClass("select2-active");
1489
-
1490
- // Remove the aria active descendant for highlighted element
1491
- this.search.removeAttr("aria-activedescendant");
1492
- this.opts.element.trigger($.Event("select2-close"));
1493
- },
1494
-
1495
- /**
1496
- * Opens control, sets input value, and updates results.
1497
- */
1498
- // abstract
1499
- externalSearch: function (term) {
1500
- this.open();
1501
- this.search.val(term);
1502
- this.updateResults(false);
1503
- },
1504
-
1505
- // abstract
1506
- clearSearch: function () {
1507
-
1508
- },
1509
-
1510
- /**
1511
- * @return {Boolean} Whether or not search value was changed.
1512
- * @private
1513
- */
1514
- prefillNextSearchTerm: function () {
1515
- // initializes search's value with nextSearchTerm (if defined by user)
1516
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
1517
- if(this.search.val() !== "") {
1518
- return false;
1519
- }
1520
-
1521
- var nextSearchTerm = this.opts.nextSearchTerm(this.data(), this.lastSearchTerm);
1522
- if(nextSearchTerm !== undefined){
1523
- this.search.val(nextSearchTerm);
1524
- this.search.select();
1525
- return true;
1526
- }
1527
-
1528
- return false;
1529
- },
1530
-
1531
- //abstract
1532
- getMaximumSelectionSize: function() {
1533
- return evaluate(this.opts.maximumSelectionSize, this.opts.element);
1534
- },
1535
-
1536
- // abstract
1537
- ensureHighlightVisible: function () {
1538
- var results = this.results, children, index, child, hb, rb, y, more, topOffset;
1539
-
1540
- index = this.highlight();
1541
-
1542
- if (index < 0) return;
1543
-
1544
- if (index == 0) {
1545
-
1546
- // if the first element is highlighted scroll all the way to the top,
1547
- // that way any unselectable headers above it will also be scrolled
1548
- // into view
1549
-
1550
- results.scrollTop(0);
1551
- return;
1552
- }
1553
-
1554
- children = this.findHighlightableChoices().find('.select2-result-label');
1555
-
1556
- child = $(children[index]);
1557
-
1558
- topOffset = (child.offset() || {}).top || 0;
1559
-
1560
- hb = topOffset + child.outerHeight(true);
1561
-
1562
- // if this is the last child lets also make sure select2-more-results is visible
1563
- if (index === children.length - 1) {
1564
- more = results.find("li.select2-more-results");
1565
- if (more.length > 0) {
1566
- hb = more.offset().top + more.outerHeight(true);
1567
- }
1568
- }
1569
-
1570
- rb = results.offset().top + results.outerHeight(false);
1571
- if (hb > rb) {
1572
- results.scrollTop(results.scrollTop() + (hb - rb));
1573
- }
1574
- y = topOffset - results.offset().top;
1575
-
1576
- // make sure the top of the element is visible
1577
- if (y < 0 && child.css('display') != 'none' ) {
1578
- results.scrollTop(results.scrollTop() + y); // y is negative
1579
- }
1580
- },
1581
-
1582
- // abstract
1583
- findHighlightableChoices: function() {
1584
- return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
1585
- },
1586
-
1587
- // abstract
1588
- moveHighlight: function (delta) {
1589
- var choices = this.findHighlightableChoices(),
1590
- index = this.highlight();
1591
-
1592
- while (index > -1 && index < choices.length) {
1593
- index += delta;
1594
- var choice = $(choices[index]);
1595
- if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
1596
- this.highlight(index);
1597
- break;
1598
- }
1599
- }
1600
- },
1601
-
1602
- // abstract
1603
- highlight: function (index) {
1604
- var choices = this.findHighlightableChoices(),
1605
- choice,
1606
- data;
1607
-
1608
- if (arguments.length === 0) {
1609
- return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
1610
- }
1611
-
1612
- if (index >= choices.length) index = choices.length - 1;
1613
- if (index < 0) index = 0;
1614
-
1615
- this.removeHighlight();
1616
-
1617
- choice = $(choices[index]);
1618
- choice.addClass("select2-highlighted");
1619
-
1620
- // ensure assistive technology can determine the active choice
1621
- this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
1622
-
1623
- this.ensureHighlightVisible();
1624
-
1625
- this.liveRegion.text(choice.text());
1626
-
1627
- data = choice.data("select2-data");
1628
- if (data) {
1629
- this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
1630
- }
1631
- },
1632
-
1633
- removeHighlight: function() {
1634
- this.results.find(".select2-highlighted").removeClass("select2-highlighted");
1635
- },
1636
-
1637
- touchMoved: function() {
1638
- this._touchMoved = true;
1639
- },
1640
-
1641
- clearTouchMoved: function() {
1642
- this._touchMoved = false;
1643
- },
1644
-
1645
- // abstract
1646
- countSelectableResults: function() {
1647
- return this.findHighlightableChoices().length;
1648
- },
1649
-
1650
- // abstract
1651
- highlightUnderEvent: function (event) {
1652
- var el = $(event.target).closest(".select2-result-selectable");
1653
- if (el.length > 0 && !el.is(".select2-highlighted")) {
1654
- var choices = this.findHighlightableChoices();
1655
- this.highlight(choices.index(el));
1656
- } else if (el.length == 0) {
1657
- // if we are over an unselectable item remove all highlights
1658
- this.removeHighlight();
1659
- }
1660
- },
1661
-
1662
- // abstract
1663
- loadMoreIfNeeded: function () {
1664
- var results = this.results,
1665
- more = results.find("li.select2-more-results"),
1666
- below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
1667
- page = this.resultsPage + 1,
1668
- self=this,
1669
- term=this.search.val(),
1670
- context=this.context;
1671
-
1672
- if (more.length === 0) return;
1673
- below = more.offset().top - results.offset().top - results.height();
1674
-
1675
- if (below <= this.opts.loadMorePadding) {
1676
- more.addClass("select2-active");
1677
- this.opts.query({
1678
- element: this.opts.element,
1679
- term: term,
1680
- page: page,
1681
- context: context,
1682
- matcher: this.opts.matcher,
1683
- callback: this.bind(function (data) {
1684
-
1685
- // ignore a response if the select2 has been closed before it was received
1686
- if (!self.opened()) return;
1687
-
1688
-
1689
- self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
1690
- self.postprocessResults(data, false, false);
1691
-
1692
- if (data.more===true) {
1693
- more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1)));
1694
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1695
- } else {
1696
- more.remove();
1697
- }
1698
- self.positionDropdown();
1699
- self.resultsPage = page;
1700
- self.context = data.context;
1701
- this.opts.element.trigger({ type: "select2-loaded", items: data });
1702
- })});
1703
- }
1704
- },
1705
-
1706
- /**
1707
- * Default tokenizer function which does nothing
1708
- */
1709
- tokenize: function() {
1710
-
1711
- },
1712
-
1713
- /**
1714
- * @param initial whether or not this is the call to this method right after the dropdown has been opened
1715
- */
1716
- // abstract
1717
- updateResults: function (initial) {
1718
- var search = this.search,
1719
- results = this.results,
1720
- opts = this.opts,
1721
- data,
1722
- self = this,
1723
- input,
1724
- term = search.val(),
1725
- lastTerm = $.data(this.container, "select2-last-term"),
1726
- // sequence number used to drop out-of-order responses
1727
- queryNumber;
1728
-
1729
- // prevent duplicate queries against the same term
1730
- if (initial !== true && lastTerm && equal(term, lastTerm)) return;
1731
-
1732
- $.data(this.container, "select2-last-term", term);
1733
-
1734
- // if the search is currently hidden we do not alter the results
1735
- if (initial !== true && (this.showSearchInput === false || !this.opened())) {
1736
- return;
1737
- }
1738
-
1739
- function postRender() {
1740
- search.removeClass("select2-active");
1741
- self.positionDropdown();
1742
- if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
1743
- self.liveRegion.text(results.text());
1744
- }
1745
- else {
1746
- self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable:not(".select2-selected")').length));
1747
- }
1748
- }
1749
-
1750
- function render(html) {
1751
- results.html(html);
1752
- postRender();
1753
- }
1754
-
1755
- queryNumber = ++this.queryCount;
1756
-
1757
- var maxSelSize = this.getMaximumSelectionSize();
1758
- if (maxSelSize >=1) {
1759
- data = this.data();
1760
- if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
1761
- render("<li class='select2-selection-limit'>" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + "</li>");
1762
- return;
1763
- }
1764
- }
1765
-
1766
- if (search.val().length < opts.minimumInputLength) {
1767
- if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
1768
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + "</li>");
1769
- } else {
1770
- render("");
1771
- }
1772
- if (initial && this.showSearch) this.showSearch(true);
1773
- return;
1774
- }
1775
-
1776
- if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
1777
- if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
1778
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + "</li>");
1779
- } else {
1780
- render("");
1781
- }
1782
- return;
1783
- }
1784
-
1785
- if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
1786
- render("<li class='select2-searching'>" + evaluate(opts.formatSearching, opts.element) + "</li>");
1787
- }
1788
-
1789
- search.addClass("select2-active");
1790
-
1791
- this.removeHighlight();
1792
-
1793
- // give the tokenizer a chance to pre-process the input
1794
- input = this.tokenize();
1795
- if (input != undefined && input != null) {
1796
- search.val(input);
1797
- }
1798
-
1799
- this.resultsPage = 1;
1800
-
1801
- opts.query({
1802
- element: opts.element,
1803
- term: search.val(),
1804
- page: this.resultsPage,
1805
- context: null,
1806
- matcher: opts.matcher,
1807
- callback: this.bind(function (data) {
1808
- var def; // default choice
1809
-
1810
- // ignore old responses
1811
- if (queryNumber != this.queryCount) {
1812
- return;
1813
- }
1814
-
1815
- // ignore a response if the select2 has been closed before it was received
1816
- if (!this.opened()) {
1817
- this.search.removeClass("select2-active");
1818
- return;
1819
- }
1820
-
1821
- // handle ajax error
1822
- if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) {
1823
- render("<li class='select2-ajax-error'>" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + "</li>");
1824
- return;
1825
- }
1826
-
1827
- // save context, if any
1828
- this.context = (data.context===undefined) ? null : data.context;
1829
- // create a default choice and prepend it to the list
1830
- if (this.opts.createSearchChoice && search.val() !== "") {
1831
- def = this.opts.createSearchChoice.call(self, search.val(), data.results);
1832
- if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
1833
- if ($(data.results).filter(
1834
- function () {
1835
- return equal(self.id(this), self.id(def));
1836
- }).length === 0) {
1837
- this.opts.createSearchChoicePosition(data.results, def);
1838
- }
1839
- }
1840
- }
1841
-
1842
- if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
1843
- render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, opts.element, search.val()) + "</li>");
1844
- this.showSearch(search.val());
1845
- return;
1846
- }
1847
-
1848
- results.empty();
1849
- self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
1850
-
1851
- if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
1852
- results.append("<li class='select2-more-results'>" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + "</li>");
1853
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1854
- }
1855
-
1856
- this.postprocessResults(data, initial);
1857
-
1858
- postRender();
1859
-
1860
- this.opts.element.trigger({ type: "select2-loaded", items: data });
1861
- })});
1862
- },
1863
-
1864
- // abstract
1865
- cancel: function () {
1866
- this.close();
1867
- },
1868
-
1869
- // abstract
1870
- blur: function () {
1871
- // if selectOnBlur == true, select the currently highlighted option
1872
- if (this.opts.selectOnBlur)
1873
- this.selectHighlighted({noFocus: true});
1874
-
1875
- this.close();
1876
- this.container.removeClass("select2-container-active");
1877
- // synonymous to .is(':focus'), which is available in jquery >= 1.6
1878
- if (this.search[0] === document.activeElement) { this.search.blur(); }
1879
- this.clearSearch();
1880
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
1881
- },
1882
-
1883
- // abstract
1884
- focusSearch: function () {
1885
- focus(this.search);
1886
- },
1887
-
1888
- // abstract
1889
- selectHighlighted: function (options) {
1890
- if (this._touchMoved) {
1891
- this.clearTouchMoved();
1892
- return;
1893
- }
1894
- var index=this.highlight(),
1895
- highlighted=this.results.find(".select2-highlighted"),
1896
- data = highlighted.closest('.select2-result').data("select2-data");
1897
-
1898
- if (data) {
1899
- this.highlight(index);
1900
- this.onSelect(data, options);
1901
- } else if (options && options.noFocus) {
1902
- this.close();
1903
- }
1904
- },
1905
-
1906
- // abstract
1907
- getPlaceholder: function () {
1908
- var placeholderOption;
1909
- return this.opts.element.attr("placeholder") ||
1910
- this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
1911
- this.opts.element.data("placeholder") ||
1912
- this.opts.placeholder ||
1913
- ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
1914
- },
1915
-
1916
- // abstract
1917
- getPlaceholderOption: function() {
1918
- if (this.select) {
1919
- var firstOption = this.select.children('option').first();
1920
- if (this.opts.placeholderOption !== undefined ) {
1921
- //Determine the placeholder option based on the specified placeholderOption setting
1922
- return (this.opts.placeholderOption === "first" && firstOption) ||
1923
- (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
1924
- } else if ($.trim(firstOption.text()) === "" && firstOption.val() === "") {
1925
- //No explicit placeholder option specified, use the first if it's blank
1926
- return firstOption;
1927
- }
1928
- }
1929
- },
1930
-
1931
- /**
1932
- * Get the desired width for the container element. This is
1933
- * derived first from option `width` passed to select2, then
1934
- * the inline 'style' on the original element, and finally
1935
- * falls back to the jQuery calculated element width.
1936
- */
1937
- // abstract
1938
- initContainerWidth: function () {
1939
- function resolveContainerWidth() {
1940
- var style, attrs, matches, i, l, attr;
1941
-
1942
- if (this.opts.width === "off") {
1943
- return null;
1944
- } else if (this.opts.width === "element"){
1945
- return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
1946
- } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
1947
- // check if there is inline style on the element that contains width
1948
- style = this.opts.element.attr('style');
1949
- if (typeof(style) === "string") {
1950
- attrs = style.split(';');
1951
- for (i = 0, l = attrs.length; i < l; i = i + 1) {
1952
- attr = attrs[i].replace(/\s/g, '');
1953
- matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
1954
- if (matches !== null && matches.length >= 1)
1955
- return matches[1];
1956
- }
1957
- }
1958
-
1959
- if (this.opts.width === "resolve") {
1960
- // next check if css('width') can resolve a width that is percent based, this is sometimes possible
1961
- // when attached to input type=hidden or elements hidden via css
1962
- style = this.opts.element.css('width');
1963
- if (style.indexOf("%") > 0) return style;
1964
-
1965
- // finally, fallback on the calculated width of the element
1966
- return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
1967
- }
1968
-
1969
- return null;
1970
- } else if ($.isFunction(this.opts.width)) {
1971
- return this.opts.width();
1972
- } else {
1973
- return this.opts.width;
1974
- }
1975
- };
1976
-
1977
- var width = resolveContainerWidth.call(this);
1978
- if (width !== null) {
1979
- this.container.css("width", width);
1980
- }
1981
- }
1982
- });
1983
-
1984
- SingleSelect2 = clazz(AbstractSelect2, {
1985
-
1986
- // single
1987
-
1988
- createContainer: function () {
1989
- var container = $(document.createElement("div")).attr({
1990
- "class": "select2-container"
1991
- }).html([
1992
- "<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>",
1993
- " <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>",
1994
- " <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>",
1995
- "</a>",
1996
- "<label for='' class='select2-offscreen'></label>",
1997
- "<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />",
1998
- "<div class='select2-drop select2-display-none'>",
1999
- " <div class='select2-search'>",
2000
- " <label for='' class='select2-offscreen'></label>",
2001
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'",
2002
- " aria-autocomplete='list' />",
2003
- " </div>",
2004
- " <ul class='select2-results' role='listbox'>",
2005
- " </ul>",
2006
- "</div>"].join(""));
2007
- return container;
2008
- },
2009
-
2010
- // single
2011
- enableInterface: function() {
2012
- if (this.parent.enableInterface.apply(this, arguments)) {
2013
- this.focusser.prop("disabled", !this.isInterfaceEnabled());
2014
- }
2015
- },
2016
-
2017
- // single
2018
- opening: function () {
2019
- var el, range, len;
2020
-
2021
- if (this.opts.minimumResultsForSearch >= 0) {
2022
- this.showSearch(true);
2023
- }
2024
-
2025
- this.parent.opening.apply(this, arguments);
2026
-
2027
- if (this.showSearchInput !== false) {
2028
- // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
2029
- // all other browsers handle this just fine
2030
-
2031
- this.search.val(this.focusser.val());
2032
- }
2033
- if (this.opts.shouldFocusInput(this)) {
2034
- this.search.focus();
2035
- // move the cursor to the end after focussing, otherwise it will be at the beginning and
2036
- // new text will appear *before* focusser.val()
2037
- el = this.search.get(0);
2038
- if (el.createTextRange) {
2039
- range = el.createTextRange();
2040
- range.collapse(false);
2041
- range.select();
2042
- } else if (el.setSelectionRange) {
2043
- len = this.search.val().length;
2044
- el.setSelectionRange(len, len);
2045
- }
2046
- }
2047
-
2048
- this.prefillNextSearchTerm();
2049
-
2050
- this.focusser.prop("disabled", true).val("");
2051
- this.updateResults(true);
2052
- this.opts.element.trigger($.Event("select2-open"));
2053
- },
2054
-
2055
- // single
2056
- close: function () {
2057
- if (!this.opened()) return;
2058
- this.parent.close.apply(this, arguments);
2059
-
2060
- this.focusser.prop("disabled", false);
2061
-
2062
- if (this.opts.shouldFocusInput(this)) {
2063
- this.focusser.focus();
2064
- }
2065
- },
2066
-
2067
- // single
2068
- focus: function () {
2069
- if (this.opened()) {
2070
- this.close();
2071
- } else {
2072
- this.focusser.prop("disabled", false);
2073
- if (this.opts.shouldFocusInput(this)) {
2074
- this.focusser.focus();
2075
- }
2076
- }
2077
- },
2078
-
2079
- // single
2080
- isFocused: function () {
2081
- return this.container.hasClass("select2-container-active");
2082
- },
2083
-
2084
- // single
2085
- cancel: function () {
2086
- this.parent.cancel.apply(this, arguments);
2087
- this.focusser.prop("disabled", false);
2088
-
2089
- if (this.opts.shouldFocusInput(this)) {
2090
- this.focusser.focus();
2091
- }
2092
- },
2093
-
2094
- // single
2095
- destroy: function() {
2096
- $("label[for='" + this.focusser.attr('id') + "']")
2097
- .attr('for', this.opts.element.attr("id"));
2098
- this.parent.destroy.apply(this, arguments);
2099
-
2100
- cleanupJQueryElements.call(this,
2101
- "selection",
2102
- "focusser"
2103
- );
2104
- },
2105
-
2106
- // single
2107
- initContainer: function () {
2108
-
2109
- var selection,
2110
- container = this.container,
2111
- dropdown = this.dropdown,
2112
- idSuffix = nextUid(),
2113
- elementLabel;
2114
-
2115
- if (this.opts.minimumResultsForSearch < 0) {
2116
- this.showSearch(false);
2117
- } else {
2118
- this.showSearch(true);
2119
- }
2120
-
2121
- this.selection = selection = container.find(".select2-choice");
2122
-
2123
- this.focusser = container.find(".select2-focusser");
2124
-
2125
- // add aria associations
2126
- selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
2127
- this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
2128
- this.results.attr("id", "select2-results-"+idSuffix);
2129
- this.search.attr("aria-owns", "select2-results-"+idSuffix);
2130
-
2131
- // rewrite labels from original element to focusser
2132
- this.focusser.attr("id", "s2id_autogen"+idSuffix);
2133
-
2134
- elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
2135
- this.opts.element.focus(this.bind(function () { this.focus(); }));
2136
-
2137
- this.focusser.prev()
2138
- .text(elementLabel.text())
2139
- .attr('for', this.focusser.attr('id'));
2140
-
2141
- // Ensure the original element retains an accessible name
2142
- var originalTitle = this.opts.element.attr("title");
2143
- this.opts.element.attr("title", (originalTitle || elementLabel.text()));
2144
-
2145
- this.focusser.attr("tabindex", this.elementTabIndex);
2146
-
2147
- // write label for search field using the label from the focusser element
2148
- this.search.attr("id", this.focusser.attr('id') + '_search');
2149
-
2150
- this.search.prev()
2151
- .text($("label[for='" + this.focusser.attr('id') + "']").text())
2152
- .attr('for', this.search.attr('id'));
2153
-
2154
- this.search.on("keydown", this.bind(function (e) {
2155
- if (!this.isInterfaceEnabled()) return;
2156
-
2157
- // filter 229 keyCodes (input method editor is processing key input)
2158
- if (229 == e.keyCode) return;
2159
-
2160
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2161
- // prevent the page from scrolling
2162
- killEvent(e);
2163
- return;
2164
- }
2165
-
2166
- switch (e.which) {
2167
- case KEY.UP:
2168
- case KEY.DOWN:
2169
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2170
- killEvent(e);
2171
- return;
2172
- case KEY.ENTER:
2173
- this.selectHighlighted();
2174
- killEvent(e);
2175
- return;
2176
- case KEY.TAB:
2177
- this.selectHighlighted({noFocus: true});
2178
- return;
2179
- case KEY.ESC:
2180
- this.cancel(e);
2181
- killEvent(e);
2182
- return;
2183
- }
2184
- }));
2185
-
2186
- this.search.on("blur", this.bind(function(e) {
2187
- // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
2188
- // without this the search field loses focus which is annoying
2189
- if (document.activeElement === this.body.get(0)) {
2190
- window.setTimeout(this.bind(function() {
2191
- if (this.opened()) {
2192
- this.search.focus();
2193
- }
2194
- }), 0);
2195
- }
2196
- }));
2197
-
2198
- this.focusser.on("keydown", this.bind(function (e) {
2199
- if (!this.isInterfaceEnabled()) return;
2200
-
2201
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
2202
- return;
2203
- }
2204
-
2205
- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
2206
- killEvent(e);
2207
- return;
2208
- }
2209
-
2210
- if (e.which == KEY.DOWN || e.which == KEY.UP
2211
- || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
2212
-
2213
- if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
2214
-
2215
- this.open();
2216
- killEvent(e);
2217
- return;
2218
- }
2219
-
2220
- if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
2221
- if (this.opts.allowClear) {
2222
- this.clear();
2223
- }
2224
- killEvent(e);
2225
- return;
2226
- }
2227
- }));
2228
-
2229
-
2230
- installKeyUpChangeEvent(this.focusser);
2231
- this.focusser.on("keyup-change input", this.bind(function(e) {
2232
- if (this.opts.minimumResultsForSearch >= 0) {
2233
- e.stopPropagation();
2234
- if (this.opened()) return;
2235
- this.open();
2236
- }
2237
- }));
2238
-
2239
- selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
2240
- if (!this.isInterfaceEnabled()) {
2241
- return;
2242
- }
2243
-
2244
- this.clear();
2245
- killEventImmediately(e);
2246
- this.close();
2247
-
2248
- if (this.selection) {
2249
- this.selection.focus();
2250
- }
2251
- }));
2252
-
2253
- selection.on("mousedown touchstart", this.bind(function (e) {
2254
- // Prevent IE from generating a click event on the body
2255
- reinsertElement(selection);
2256
-
2257
- if (!this.container.hasClass("select2-container-active")) {
2258
- this.opts.element.trigger($.Event("select2-focus"));
2259
- }
2260
-
2261
- if (this.opened()) {
2262
- this.close();
2263
- } else if (this.isInterfaceEnabled()) {
2264
- this.open();
2265
- }
2266
-
2267
- killEvent(e);
2268
- }));
2269
-
2270
- dropdown.on("mousedown touchstart", this.bind(function() {
2271
- if (this.opts.shouldFocusInput(this)) {
2272
- this.search.focus();
2273
- }
2274
- }));
2275
-
2276
- selection.on("focus", this.bind(function(e) {
2277
- killEvent(e);
2278
- }));
2279
-
2280
- this.focusser.on("focus", this.bind(function(){
2281
- if (!this.container.hasClass("select2-container-active")) {
2282
- this.opts.element.trigger($.Event("select2-focus"));
2283
- }
2284
- this.container.addClass("select2-container-active");
2285
- })).on("blur", this.bind(function() {
2286
- if (!this.opened()) {
2287
- this.container.removeClass("select2-container-active");
2288
- this.opts.element.trigger($.Event("select2-blur"));
2289
- }
2290
- }));
2291
- this.search.on("focus", this.bind(function(){
2292
- if (!this.container.hasClass("select2-container-active")) {
2293
- this.opts.element.trigger($.Event("select2-focus"));
2294
- }
2295
- this.container.addClass("select2-container-active");
2296
- }));
2297
-
2298
- this.initContainerWidth();
2299
- this.opts.element.hide();
2300
- this.setPlaceholder();
2301
-
2302
- },
2303
-
2304
- // single
2305
- clear: function(triggerChange) {
2306
- var data=this.selection.data("select2-data");
2307
- if (data) { // guard against queued quick consecutive clicks
2308
- var evt = $.Event("select2-clearing");
2309
- this.opts.element.trigger(evt);
2310
- if (evt.isDefaultPrevented()) {
2311
- return;
2312
- }
2313
- var placeholderOption = this.getPlaceholderOption();
2314
- this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
2315
- this.selection.find(".select2-chosen").empty();
2316
- this.selection.removeData("select2-data");
2317
- this.setPlaceholder();
2318
-
2319
- if (triggerChange !== false){
2320
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
2321
- this.triggerChange({removed:data});
2322
- }
2323
- }
2324
- },
2325
-
2326
- /**
2327
- * Sets selection based on source element's value
2328
- */
2329
- // single
2330
- initSelection: function () {
2331
- var selected;
2332
- if (this.isPlaceholderOptionSelected()) {
2333
- this.updateSelection(null);
2334
- this.close();
2335
- this.setPlaceholder();
2336
- } else {
2337
- var self = this;
2338
- this.opts.initSelection.call(null, this.opts.element, function(selected){
2339
- if (selected !== undefined && selected !== null) {
2340
- self.updateSelection(selected);
2341
- self.close();
2342
- self.setPlaceholder();
2343
- self.lastSearchTerm = self.search.val();
2344
- }
2345
- });
2346
- }
2347
- },
2348
-
2349
- isPlaceholderOptionSelected: function() {
2350
- var placeholderOption;
2351
- if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered
2352
- return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
2353
- || (this.opts.element.val() === "")
2354
- || (this.opts.element.val() === undefined)
2355
- || (this.opts.element.val() === null);
2356
- },
2357
-
2358
- // single
2359
- prepareOpts: function () {
2360
- var opts = this.parent.prepareOpts.apply(this, arguments),
2361
- self=this;
2362
-
2363
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2364
- // install the selection initializer
2365
- opts.initSelection = function (element, callback) {
2366
- var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
2367
- // a single select box always has a value, no need to null check 'selected'
2368
- callback(self.optionToData(selected));
2369
- };
2370
- } else if ("data" in opts) {
2371
- // install default initSelection when applied to hidden input and data is local
2372
- opts.initSelection = opts.initSelection || function (element, callback) {
2373
- var id = element.val();
2374
- //search in data by id, storing the actual matching item
2375
- var match = null;
2376
- opts.query({
2377
- matcher: function(term, text, el){
2378
- var is_match = equal(id, opts.id(el));
2379
- if (is_match) {
2380
- match = el;
2381
- }
2382
- return is_match;
2383
- },
2384
- callback: !$.isFunction(callback) ? $.noop : function() {
2385
- callback(match);
2386
- }
2387
- });
2388
- };
2389
- }
2390
-
2391
- return opts;
2392
- },
2393
-
2394
- // single
2395
- getPlaceholder: function() {
2396
- // if a placeholder is specified on a single select without a valid placeholder option ignore it
2397
- if (this.select) {
2398
- if (this.getPlaceholderOption() === undefined) {
2399
- return undefined;
2400
- }
2401
- }
2402
-
2403
- return this.parent.getPlaceholder.apply(this, arguments);
2404
- },
2405
-
2406
- // single
2407
- setPlaceholder: function () {
2408
- var placeholder = this.getPlaceholder();
2409
-
2410
- if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
2411
-
2412
- // check for a placeholder option if attached to a select
2413
- if (this.select && this.getPlaceholderOption() === undefined) return;
2414
-
2415
- this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
2416
-
2417
- this.selection.addClass("select2-default");
2418
-
2419
- this.container.removeClass("select2-allowclear");
2420
- }
2421
- },
2422
-
2423
- // single
2424
- postprocessResults: function (data, initial, noHighlightUpdate) {
2425
- var selected = 0, self = this, showSearchInput = true;
2426
-
2427
- // find the selected element in the result list
2428
-
2429
- this.findHighlightableChoices().each2(function (i, elm) {
2430
- if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
2431
- selected = i;
2432
- return false;
2433
- }
2434
- });
2435
-
2436
- // and highlight it
2437
- if (noHighlightUpdate !== false) {
2438
- if (initial === true && selected >= 0) {
2439
- this.highlight(selected);
2440
- } else {
2441
- this.highlight(0);
2442
- }
2443
- }
2444
-
2445
- // hide the search box if this is the first we got the results and there are enough of them for search
2446
-
2447
- if (initial === true) {
2448
- var min = this.opts.minimumResultsForSearch;
2449
- if (min >= 0) {
2450
- this.showSearch(countResults(data.results) >= min);
2451
- }
2452
- }
2453
- },
2454
-
2455
- // single
2456
- showSearch: function(showSearchInput) {
2457
- if (this.showSearchInput === showSearchInput) return;
2458
-
2459
- this.showSearchInput = showSearchInput;
2460
-
2461
- this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
2462
- this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
2463
- //add "select2-with-searchbox" to the container if search box is shown
2464
- $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
2465
- },
2466
-
2467
- // single
2468
- onSelect: function (data, options) {
2469
-
2470
- if (!this.triggerSelect(data)) { return; }
2471
-
2472
- var old = this.opts.element.val(),
2473
- oldData = this.data();
2474
-
2475
- this.opts.element.val(this.id(data));
2476
- this.updateSelection(data);
2477
-
2478
- this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
2479
-
2480
- this.lastSearchTerm = this.search.val();
2481
- this.close();
2482
-
2483
- if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
2484
- this.focusser.focus();
2485
- }
2486
-
2487
- if (!equal(old, this.id(data))) {
2488
- this.triggerChange({ added: data, removed: oldData });
2489
- }
2490
- },
2491
-
2492
- // single
2493
- updateSelection: function (data) {
2494
-
2495
- var container=this.selection.find(".select2-chosen"), formatted, cssClass;
2496
-
2497
- this.selection.data("select2-data", data);
2498
-
2499
- container.empty();
2500
- if (data !== null) {
2501
- formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
2502
- }
2503
- if (formatted !== undefined) {
2504
- container.append(formatted);
2505
- }
2506
- cssClass=this.opts.formatSelectionCssClass(data, container);
2507
- if (cssClass !== undefined) {
2508
- container.addClass(cssClass);
2509
- }
2510
-
2511
- this.selection.removeClass("select2-default");
2512
-
2513
- if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
2514
- this.container.addClass("select2-allowclear");
2515
- }
2516
- },
2517
-
2518
- // single
2519
- val: function () {
2520
- var val,
2521
- triggerChange = false,
2522
- data = null,
2523
- self = this,
2524
- oldData = this.data();
2525
-
2526
- if (arguments.length === 0) {
2527
- return this.opts.element.val();
2528
- }
2529
-
2530
- val = arguments[0];
2531
-
2532
- if (arguments.length > 1) {
2533
- triggerChange = arguments[1];
2534
- }
2535
-
2536
- if (this.select) {
2537
- this.select
2538
- .val(val)
2539
- .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
2540
- data = self.optionToData(elm);
2541
- return false;
2542
- });
2543
- this.updateSelection(data);
2544
- this.setPlaceholder();
2545
- if (triggerChange) {
2546
- this.triggerChange({added: data, removed:oldData});
2547
- }
2548
- } else {
2549
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
2550
- if (!val && val !== 0) {
2551
- this.clear(triggerChange);
2552
- return;
2553
- }
2554
- if (this.opts.initSelection === undefined) {
2555
- throw new Error("cannot call val() if initSelection() is not defined");
2556
- }
2557
- this.opts.element.val(val);
2558
- this.opts.initSelection(this.opts.element, function(data){
2559
- self.opts.element.val(!data ? "" : self.id(data));
2560
- self.updateSelection(data);
2561
- self.setPlaceholder();
2562
- if (triggerChange) {
2563
- self.triggerChange({added: data, removed:oldData});
2564
- }
2565
- });
2566
- }
2567
- },
2568
-
2569
- // single
2570
- clearSearch: function () {
2571
- this.search.val("");
2572
- this.focusser.val("");
2573
- },
2574
-
2575
- // single
2576
- data: function(value) {
2577
- var data,
2578
- triggerChange = false;
2579
-
2580
- if (arguments.length === 0) {
2581
- data = this.selection.data("select2-data");
2582
- if (data == undefined) data = null;
2583
- return data;
2584
- } else {
2585
- if (arguments.length > 1) {
2586
- triggerChange = arguments[1];
2587
- }
2588
- if (!value) {
2589
- this.clear(triggerChange);
2590
- } else {
2591
- data = this.data();
2592
- this.opts.element.val(!value ? "" : this.id(value));
2593
- this.updateSelection(value);
2594
- if (triggerChange) {
2595
- this.triggerChange({added: value, removed:data});
2596
- }
2597
- }
2598
- }
2599
- }
2600
- });
2601
-
2602
- MultiSelect2 = clazz(AbstractSelect2, {
2603
-
2604
- // multi
2605
- createContainer: function () {
2606
- var container = $(document.createElement("div")).attr({
2607
- "class": "select2-container select2-container-multi"
2608
- }).html([
2609
- "<ul class='select2-choices'>",
2610
- " <li class='select2-search-field'>",
2611
- " <label for='' class='select2-offscreen'></label>",
2612
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
2613
- " </li>",
2614
- "</ul>",
2615
- "<div class='select2-drop select2-drop-multi select2-display-none'>",
2616
- " <ul class='select2-results'>",
2617
- " </ul>",
2618
- "</div>"].join(""));
2619
- return container;
2620
- },
2621
-
2622
- // multi
2623
- prepareOpts: function () {
2624
- var opts = this.parent.prepareOpts.apply(this, arguments),
2625
- self=this;
2626
-
2627
- // TODO validate placeholder is a string if specified
2628
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2629
- // install the selection initializer
2630
- opts.initSelection = function (element, callback) {
2631
-
2632
- var data = [];
2633
-
2634
- element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
2635
- data.push(self.optionToData(elm));
2636
- });
2637
- callback(data);
2638
- };
2639
- } else if ("data" in opts) {
2640
- // install default initSelection when applied to hidden input and data is local
2641
- opts.initSelection = opts.initSelection || function (element, callback) {
2642
- var ids = splitVal(element.val(), opts.separator, opts.transformVal);
2643
- //search in data by array of ids, storing matching items in a list
2644
- var matches = [];
2645
- opts.query({
2646
- matcher: function(term, text, el){
2647
- var is_match = $.grep(ids, function(id) {
2648
- return equal(id, opts.id(el));
2649
- }).length;
2650
- if (is_match) {
2651
- matches.push(el);
2652
- }
2653
- return is_match;
2654
- },
2655
- callback: !$.isFunction(callback) ? $.noop : function() {
2656
- // reorder matches based on the order they appear in the ids array because right now
2657
- // they are in the order in which they appear in data array
2658
- var ordered = [];
2659
- for (var i = 0; i < ids.length; i++) {
2660
- var id = ids[i];
2661
- for (var j = 0; j < matches.length; j++) {
2662
- var match = matches[j];
2663
- if (equal(id, opts.id(match))) {
2664
- ordered.push(match);
2665
- matches.splice(j, 1);
2666
- break;
2667
- }
2668
- }
2669
- }
2670
- callback(ordered);
2671
- }
2672
- });
2673
- };
2674
- }
2675
-
2676
- return opts;
2677
- },
2678
-
2679
- // multi
2680
- selectChoice: function (choice) {
2681
-
2682
- var selected = this.container.find(".select2-search-choice-focus");
2683
- if (selected.length && choice && choice[0] == selected[0]) {
2684
-
2685
- } else {
2686
- if (selected.length) {
2687
- this.opts.element.trigger("choice-deselected", selected);
2688
- }
2689
- selected.removeClass("select2-search-choice-focus");
2690
- if (choice && choice.length) {
2691
- this.close();
2692
- choice.addClass("select2-search-choice-focus");
2693
- this.opts.element.trigger("choice-selected", choice);
2694
- }
2695
- }
2696
- },
2697
-
2698
- // multi
2699
- destroy: function() {
2700
- $("label[for='" + this.search.attr('id') + "']")
2701
- .attr('for', this.opts.element.attr("id"));
2702
- this.parent.destroy.apply(this, arguments);
2703
-
2704
- cleanupJQueryElements.call(this,
2705
- "searchContainer",
2706
- "selection"
2707
- );
2708
- },
2709
-
2710
- // multi
2711
- initContainer: function () {
2712
-
2713
- var selector = ".select2-choices", selection;
2714
-
2715
- this.searchContainer = this.container.find(".select2-search-field");
2716
- this.selection = selection = this.container.find(selector);
2717
-
2718
- var _this = this;
2719
- this.selection.on("click", ".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)", function (e) {
2720
- _this.search[0].focus();
2721
- _this.selectChoice($(this));
2722
- });
2723
-
2724
- // rewrite labels from original element to focusser
2725
- this.search.attr("id", "s2id_autogen"+nextUid());
2726
-
2727
- this.search.prev()
2728
- .text($("label[for='" + this.opts.element.attr("id") + "']").text())
2729
- .attr('for', this.search.attr('id'));
2730
- this.opts.element.focus(this.bind(function () { this.focus(); }));
2731
-
2732
- this.search.on("input paste", this.bind(function() {
2733
- if (this.search.attr('placeholder') && this.search.val().length == 0) return;
2734
- if (!this.isInterfaceEnabled()) return;
2735
- if (!this.opened()) {
2736
- this.open();
2737
- }
2738
- }));
2739
-
2740
- this.search.attr("tabindex", this.elementTabIndex);
2741
-
2742
- this.keydowns = 0;
2743
- this.search.on("keydown", this.bind(function (e) {
2744
- if (!this.isInterfaceEnabled()) return;
2745
-
2746
- ++this.keydowns;
2747
- var selected = selection.find(".select2-search-choice-focus");
2748
- var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
2749
- var next = selected.next(".select2-search-choice:not(.select2-locked)");
2750
- var pos = getCursorInfo(this.search);
2751
-
2752
- if (selected.length &&
2753
- (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
2754
- var selectedChoice = selected;
2755
- if (e.which == KEY.LEFT && prev.length) {
2756
- selectedChoice = prev;
2757
- }
2758
- else if (e.which == KEY.RIGHT) {
2759
- selectedChoice = next.length ? next : null;
2760
- }
2761
- else if (e.which === KEY.BACKSPACE) {
2762
- if (this.unselect(selected.first())) {
2763
- this.search.width(10);
2764
- selectedChoice = prev.length ? prev : next;
2765
- }
2766
- } else if (e.which == KEY.DELETE) {
2767
- if (this.unselect(selected.first())) {
2768
- this.search.width(10);
2769
- selectedChoice = next.length ? next : null;
2770
- }
2771
- } else if (e.which == KEY.ENTER) {
2772
- selectedChoice = null;
2773
- }
2774
-
2775
- this.selectChoice(selectedChoice);
2776
- killEvent(e);
2777
- if (!selectedChoice || !selectedChoice.length) {
2778
- this.open();
2779
- }
2780
- return;
2781
- } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
2782
- || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
2783
-
2784
- this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
2785
- killEvent(e);
2786
- return;
2787
- } else {
2788
- this.selectChoice(null);
2789
- }
2790
-
2791
- if (this.opened()) {
2792
- switch (e.which) {
2793
- case KEY.UP:
2794
- case KEY.DOWN:
2795
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2796
- killEvent(e);
2797
- return;
2798
- case KEY.ENTER:
2799
- this.selectHighlighted();
2800
- killEvent(e);
2801
- return;
2802
- case KEY.TAB:
2803
- this.selectHighlighted({noFocus:true});
2804
- this.close();
2805
- return;
2806
- case KEY.ESC:
2807
- this.cancel(e);
2808
- killEvent(e);
2809
- return;
2810
- }
2811
- }
2812
-
2813
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
2814
- || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
2815
- return;
2816
- }
2817
-
2818
- if (e.which === KEY.ENTER) {
2819
- if (this.opts.openOnEnter === false) {
2820
- return;
2821
- } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
2822
- return;
2823
- }
2824
- }
2825
-
2826
- this.open();
2827
-
2828
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2829
- // prevent the page from scrolling
2830
- killEvent(e);
2831
- }
2832
-
2833
- if (e.which === KEY.ENTER) {
2834
- // prevent form from being submitted
2835
- killEvent(e);
2836
- }
2837
-
2838
- }));
2839
-
2840
- this.search.on("keyup", this.bind(function (e) {
2841
- this.keydowns = 0;
2842
- this.resizeSearch();
2843
- })
2844
- );
2845
-
2846
- this.search.on("blur", this.bind(function(e) {
2847
- this.container.removeClass("select2-container-active");
2848
- this.search.removeClass("select2-focused");
2849
- this.selectChoice(null);
2850
- if (!this.opened()) this.clearSearch();
2851
- e.stopImmediatePropagation();
2852
- this.opts.element.trigger($.Event("select2-blur"));
2853
- }));
2854
-
2855
- this.container.on("click", selector, this.bind(function (e) {
2856
- if (!this.isInterfaceEnabled()) return;
2857
- if ($(e.target).closest(".select2-search-choice").length > 0) {
2858
- // clicked inside a select2 search choice, do not open
2859
- return;
2860
- }
2861
- this.selectChoice(null);
2862
- this.clearPlaceholder();
2863
- if (!this.container.hasClass("select2-container-active")) {
2864
- this.opts.element.trigger($.Event("select2-focus"));
2865
- }
2866
- this.open();
2867
- this.focusSearch();
2868
- e.preventDefault();
2869
- }));
2870
-
2871
- this.container.on("focus", selector, this.bind(function () {
2872
- if (!this.isInterfaceEnabled()) return;
2873
- if (!this.container.hasClass("select2-container-active")) {
2874
- this.opts.element.trigger($.Event("select2-focus"));
2875
- }
2876
- this.container.addClass("select2-container-active");
2877
- this.dropdown.addClass("select2-drop-active");
2878
- this.clearPlaceholder();
2879
- }));
2880
-
2881
- this.initContainerWidth();
2882
- this.opts.element.hide();
2883
-
2884
- // set the placeholder if necessary
2885
- this.clearSearch();
2886
- },
2887
-
2888
- // multi
2889
- enableInterface: function() {
2890
- if (this.parent.enableInterface.apply(this, arguments)) {
2891
- this.search.prop("disabled", !this.isInterfaceEnabled());
2892
- }
2893
- },
2894
-
2895
- // multi
2896
- initSelection: function () {
2897
- var data;
2898
- if (this.opts.element.val() === "" && this.opts.element.text() === "") {
2899
- this.updateSelection([]);
2900
- this.close();
2901
- // set the placeholder if necessary
2902
- this.clearSearch();
2903
- }
2904
- if (this.select || this.opts.element.val() !== "") {
2905
- var self = this;
2906
- this.opts.initSelection.call(null, this.opts.element, function(data){
2907
- if (data !== undefined && data !== null) {
2908
- self.updateSelection(data);
2909
- self.close();
2910
- // set the placeholder if necessary
2911
- self.clearSearch();
2912
- }
2913
- });
2914
- }
2915
- },
2916
-
2917
- // multi
2918
- clearSearch: function () {
2919
- var placeholder = this.getPlaceholder(),
2920
- maxWidth = this.getMaxSearchWidth();
2921
-
2922
- if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
2923
- this.search.val(placeholder).addClass("select2-default");
2924
- // stretch the search box to full width of the container so as much of the placeholder is visible as possible
2925
- // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
2926
- this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
2927
- } else {
2928
- this.search.val("").width(10);
2929
- }
2930
- },
2931
-
2932
- // multi
2933
- clearPlaceholder: function () {
2934
- if (this.search.hasClass("select2-default")) {
2935
- this.search.val("").removeClass("select2-default");
2936
- }
2937
- },
2938
-
2939
- // multi
2940
- opening: function () {
2941
- this.clearPlaceholder(); // should be done before super so placeholder is not used to search
2942
- this.resizeSearch();
2943
-
2944
- this.parent.opening.apply(this, arguments);
2945
-
2946
- this.focusSearch();
2947
-
2948
- this.prefillNextSearchTerm();
2949
- this.updateResults(true);
2950
-
2951
- if (this.opts.shouldFocusInput(this)) {
2952
- this.search.focus();
2953
- }
2954
- this.opts.element.trigger($.Event("select2-open"));
2955
- },
2956
-
2957
- // multi
2958
- close: function () {
2959
- if (!this.opened()) return;
2960
- this.parent.close.apply(this, arguments);
2961
- },
2962
-
2963
- // multi
2964
- focus: function () {
2965
- this.close();
2966
- this.search.focus();
2967
- },
2968
-
2969
- // multi
2970
- isFocused: function () {
2971
- return this.search.hasClass("select2-focused");
2972
- },
2973
-
2974
- // multi
2975
- updateSelection: function (data) {
2976
- var ids = {}, filtered = [], self = this;
2977
-
2978
- // filter out duplicates
2979
- $(data).each(function () {
2980
- if (!(self.id(this) in ids)) {
2981
- ids[self.id(this)] = 0;
2982
- filtered.push(this);
2983
- }
2984
- });
2985
-
2986
- this.selection.find(".select2-search-choice").remove();
2987
- this.addSelectedChoice(filtered);
2988
- self.postprocessResults();
2989
- },
2990
-
2991
- // multi
2992
- tokenize: function() {
2993
- var input = this.search.val();
2994
- input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
2995
- if (input != null && input != undefined) {
2996
- this.search.val(input);
2997
- if (input.length > 0) {
2998
- this.open();
2999
- }
3000
- }
3001
-
3002
- },
3003
-
3004
- // multi
3005
- onSelect: function (data, options) {
3006
-
3007
- if (!this.triggerSelect(data) || data.text === "") { return; }
3008
-
3009
- this.addSelectedChoice(data);
3010
-
3011
- this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
3012
-
3013
- // keep track of the search's value before it gets cleared
3014
- this.lastSearchTerm = this.search.val();
3015
-
3016
- this.clearSearch();
3017
- this.updateResults();
3018
-
3019
- if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
3020
-
3021
- if (this.opts.closeOnSelect) {
3022
- this.close();
3023
- this.search.width(10);
3024
- } else {
3025
- if (this.countSelectableResults()>0) {
3026
- this.search.width(10);
3027
- this.resizeSearch();
3028
- if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
3029
- // if we reached max selection size repaint the results so choices
3030
- // are replaced with the max selection reached message
3031
- this.updateResults(true);
3032
- } else {
3033
- // initializes search's value with nextSearchTerm and update search result
3034
- if (this.prefillNextSearchTerm()) {
3035
- this.updateResults();
3036
- }
3037
- }
3038
- this.positionDropdown();
3039
- } else {
3040
- // if nothing left to select close
3041
- this.close();
3042
- this.search.width(10);
3043
- }
3044
- }
3045
-
3046
- // since its not possible to select an element that has already been
3047
- // added we do not need to check if this is a new element before firing change
3048
- this.triggerChange({ added: data });
3049
-
3050
- if (!options || !options.noFocus)
3051
- this.focusSearch();
3052
- },
3053
-
3054
- // multi
3055
- cancel: function () {
3056
- this.close();
3057
- this.focusSearch();
3058
- },
3059
-
3060
- addSelectedChoice: function (data) {
3061
- var val = this.getVal(), self = this;
3062
- $(data).each(function () {
3063
- val.push(self.createChoice(this));
3064
- });
3065
- this.setVal(val);
3066
- },
3067
-
3068
- createChoice: function (data) {
3069
- var enableChoice = !data.locked,
3070
- enabledItem = $(
3071
- "<li class='select2-search-choice'>" +
3072
- " <div></div>" +
3073
- " <a href='#' class='select2-search-choice-close' tabindex='-1'></a>" +
3074
- "</li>"),
3075
- disabledItem = $(
3076
- "<li class='select2-search-choice select2-locked'>" +
3077
- "<div></div>" +
3078
- "</li>");
3079
- var choice = enableChoice ? enabledItem : disabledItem,
3080
- id = this.id(data),
3081
- formatted,
3082
- cssClass;
3083
-
3084
- formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
3085
- if (formatted != undefined) {
3086
- choice.find("div").replaceWith($("<div></div>").html(formatted));
3087
- }
3088
- cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
3089
- if (cssClass != undefined) {
3090
- choice.addClass(cssClass);
3091
- }
3092
-
3093
- if(enableChoice){
3094
- choice.find(".select2-search-choice-close")
3095
- .on("mousedown", killEvent)
3096
- .on("click dblclick", this.bind(function (e) {
3097
- if (!this.isInterfaceEnabled()) return;
3098
-
3099
- this.unselect($(e.target));
3100
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
3101
- killEvent(e);
3102
- this.close();
3103
- this.focusSearch();
3104
- })).on("focus", this.bind(function () {
3105
- if (!this.isInterfaceEnabled()) return;
3106
- this.container.addClass("select2-container-active");
3107
- this.dropdown.addClass("select2-drop-active");
3108
- }));
3109
- }
3110
-
3111
- choice.data("select2-data", data);
3112
- choice.insertBefore(this.searchContainer);
3113
-
3114
- return id;
3115
- },
3116
-
3117
- // multi
3118
- unselect: function (selected) {
3119
- var val = this.getVal(),
3120
- data,
3121
- index;
3122
- selected = selected.closest(".select2-search-choice");
3123
-
3124
- if (selected.length === 0) {
3125
- throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
3126
- }
3127
-
3128
- data = selected.data("select2-data");
3129
-
3130
- if (!data) {
3131
- // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
3132
- // and invoked on an element already removed
3133
- return;
3134
- }
3135
-
3136
- var evt = $.Event("select2-removing");
3137
- evt.val = this.id(data);
3138
- evt.choice = data;
3139
- this.opts.element.trigger(evt);
3140
-
3141
- if (evt.isDefaultPrevented()) {
3142
- return false;
3143
- }
3144
-
3145
- while((index = indexOf(this.id(data), val)) >= 0) {
3146
- val.splice(index, 1);
3147
- this.setVal(val);
3148
- if (this.select) this.postprocessResults();
3149
- }
3150
-
3151
- selected.remove();
3152
-
3153
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
3154
- this.triggerChange({ removed: data });
3155
-
3156
- return true;
3157
- },
3158
-
3159
- // multi
3160
- postprocessResults: function (data, initial, noHighlightUpdate) {
3161
- var val = this.getVal(),
3162
- choices = this.results.find(".select2-result"),
3163
- compound = this.results.find(".select2-result-with-children"),
3164
- self = this;
3165
-
3166
- choices.each2(function (i, choice) {
3167
- var id = self.id(choice.data("select2-data"));
3168
- if (indexOf(id, val) >= 0) {
3169
- choice.addClass("select2-selected");
3170
- // mark all children of the selected parent as selected
3171
- choice.find(".select2-result-selectable").addClass("select2-selected");
3172
- }
3173
- });
3174
-
3175
- compound.each2(function(i, choice) {
3176
- // hide an optgroup if it doesn't have any selectable children
3177
- if (!choice.is('.select2-result-selectable')
3178
- && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
3179
- choice.addClass("select2-selected");
3180
- }
3181
- });
3182
-
3183
- if (this.highlight() == -1 && noHighlightUpdate !== false && this.opts.closeOnSelect === true){
3184
- self.highlight(0);
3185
- }
3186
-
3187
- //If all results are chosen render formatNoMatches
3188
- if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
3189
- if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
3190
- if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
3191
- this.results.append("<li class='select2-no-results'>" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + "</li>");
3192
- }
3193
- }
3194
- }
3195
-
3196
- },
3197
-
3198
- // multi
3199
- getMaxSearchWidth: function() {
3200
- return this.selection.width() - getSideBorderPadding(this.search);
3201
- },
3202
-
3203
- // multi
3204
- resizeSearch: function () {
3205
- var minimumWidth, left, maxWidth, containerLeft, searchWidth,
3206
- sideBorderPadding = getSideBorderPadding(this.search);
3207
-
3208
- minimumWidth = measureTextWidth(this.search) + 10;
3209
-
3210
- left = this.search.offset().left;
3211
-
3212
- maxWidth = this.selection.width();
3213
- containerLeft = this.selection.offset().left;
3214
-
3215
- searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
3216
-
3217
- if (searchWidth < minimumWidth) {
3218
- searchWidth = maxWidth - sideBorderPadding;
3219
- }
3220
-
3221
- if (searchWidth < 40) {
3222
- searchWidth = maxWidth - sideBorderPadding;
3223
- }
3224
-
3225
- if (searchWidth <= 0) {
3226
- searchWidth = minimumWidth;
3227
- }
3228
-
3229
- this.search.width(Math.floor(searchWidth));
3230
- },
3231
-
3232
- // multi
3233
- getVal: function () {
3234
- var val;
3235
- if (this.select) {
3236
- val = this.select.val();
3237
- return val === null ? [] : val;
3238
- } else {
3239
- val = this.opts.element.val();
3240
- return splitVal(val, this.opts.separator, this.opts.transformVal);
3241
- }
3242
- },
3243
-
3244
- // multi
3245
- setVal: function (val) {
3246
- if (this.select) {
3247
- this.select.val(val);
3248
- } else {
3249
- var unique = [], valMap = {};
3250
- // filter out duplicates
3251
- $(val).each(function () {
3252
- if (!(this in valMap)) {
3253
- unique.push(this);
3254
- valMap[this] = 0;
3255
- }
3256
- });
3257
- this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
3258
- }
3259
- },
3260
-
3261
- // multi
3262
- buildChangeDetails: function (old, current) {
3263
- var current = current.slice(0),
3264
- old = old.slice(0);
3265
-
3266
- // remove intersection from each array
3267
- for (var i = 0; i < current.length; i++) {
3268
- for (var j = 0; j < old.length; j++) {
3269
- if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
3270
- current.splice(i, 1);
3271
- i--;
3272
- old.splice(j, 1);
3273
- break;
3274
- }
3275
- }
3276
- }
3277
-
3278
- return {added: current, removed: old};
3279
- },
3280
-
3281
-
3282
- // multi
3283
- val: function (val, triggerChange) {
3284
- var oldData, self=this;
3285
-
3286
- if (arguments.length === 0) {
3287
- return this.getVal();
3288
- }
3289
-
3290
- oldData=this.data();
3291
- if (!oldData.length) oldData=[];
3292
-
3293
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
3294
- if (!val && val !== 0) {
3295
- this.opts.element.val("");
3296
- this.updateSelection([]);
3297
- this.clearSearch();
3298
- if (triggerChange) {
3299
- this.triggerChange({added: this.data(), removed: oldData});
3300
- }
3301
- return;
3302
- }
3303
-
3304
- // val is a list of ids
3305
- this.setVal(val);
3306
-
3307
- if (this.select) {
3308
- this.opts.initSelection(this.select, this.bind(this.updateSelection));
3309
- if (triggerChange) {
3310
- this.triggerChange(this.buildChangeDetails(oldData, this.data()));
3311
- }
3312
- } else {
3313
- if (this.opts.initSelection === undefined) {
3314
- throw new Error("val() cannot be called if initSelection() is not defined");
3315
- }
3316
-
3317
- this.opts.initSelection(this.opts.element, function(data){
3318
- var ids=$.map(data, self.id);
3319
- self.setVal(ids);
3320
- self.updateSelection(data);
3321
- self.clearSearch();
3322
- if (triggerChange) {
3323
- self.triggerChange(self.buildChangeDetails(oldData, self.data()));
3324
- }
3325
- });
3326
- }
3327
- this.clearSearch();
3328
- },
3329
-
3330
- // multi
3331
- onSortStart: function() {
3332
- if (this.select) {
3333
- throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
3334
- }
3335
-
3336
- // collapse search field into 0 width so its container can be collapsed as well
3337
- this.search.width(0);
3338
- // hide the container
3339
- this.searchContainer.hide();
3340
- },
3341
-
3342
- // multi
3343
- onSortEnd:function() {
3344
-
3345
- var val=[], self=this;
3346
-
3347
- // show search and move it to the end of the list
3348
- this.searchContainer.show();
3349
- // make sure the search container is the last item in the list
3350
- this.searchContainer.appendTo(this.searchContainer.parent());
3351
- // since we collapsed the width in dragStarted, we resize it here
3352
- this.resizeSearch();
3353
-
3354
- // update selection
3355
- this.selection.find(".select2-search-choice").each(function() {
3356
- val.push(self.opts.id($(this).data("select2-data")));
3357
- });
3358
- this.setVal(val);
3359
- this.triggerChange();
3360
- },
3361
-
3362
- // multi
3363
- data: function(values, triggerChange) {
3364
- var self=this, ids, old;
3365
- if (arguments.length === 0) {
3366
- return this.selection
3367
- .children(".select2-search-choice")
3368
- .map(function() { return $(this).data("select2-data"); })
3369
- .get();
3370
- } else {
3371
- old = this.data();
3372
- if (!values) { values = []; }
3373
- ids = $.map(values, function(e) { return self.opts.id(e); });
3374
- this.setVal(ids);
3375
- this.updateSelection(values);
3376
- this.clearSearch();
3377
- if (triggerChange) {
3378
- this.triggerChange(this.buildChangeDetails(old, this.data()));
3379
- }
3380
- }
3381
- }
3382
- });
3383
-
3384
- $.fn.select2 = function () {
3385
-
3386
- var args = Array.prototype.slice.call(arguments, 0),
3387
- opts,
3388
- select2,
3389
- method, value, multiple,
3390
- allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
3391
- valueMethods = ["opened", "isFocused", "container", "dropdown"],
3392
- propertyMethods = ["val", "data"],
3393
- methodsMap = { search: "externalSearch" };
3394
-
3395
- this.each(function () {
3396
- if (args.length === 0 || typeof(args[0]) === "object") {
3397
- opts = args.length === 0 ? {} : $.extend({}, args[0]);
3398
- opts.element = $(this);
3399
-
3400
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
3401
- multiple = opts.element.prop("multiple");
3402
- } else {
3403
- multiple = opts.multiple || false;
3404
- if ("tags" in opts) {opts.multiple = multiple = true;}
3405
- }
3406
-
3407
- select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
3408
- select2.init(opts);
3409
- } else if (typeof(args[0]) === "string") {
3410
-
3411
- if (indexOf(args[0], allowedMethods) < 0) {
3412
- throw "Unknown method: " + args[0];
3413
- }
3414
-
3415
- value = undefined;
3416
- select2 = $(this).data("select2");
3417
- if (select2 === undefined) return;
3418
-
3419
- method=args[0];
3420
-
3421
- if (method === "container") {
3422
- value = select2.container;
3423
- } else if (method === "dropdown") {
3424
- value = select2.dropdown;
3425
- } else {
3426
- if (methodsMap[method]) method = methodsMap[method];
3427
-
3428
- value = select2[method].apply(select2, args.slice(1));
3429
- }
3430
- if (indexOf(args[0], valueMethods) >= 0
3431
- || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {
3432
- return false; // abort the iteration, ready to return first matched value
3433
- }
3434
- } else {
3435
- throw "Invalid arguments to select2 plugin: " + args;
3436
- }
3437
- });
3438
- return (value === undefined) ? this : value;
3439
- };
3440
-
3441
- // plugin defaults, accessible to users
3442
- $.fn.select2.defaults = {
3443
- width: "copy",
3444
- loadMorePadding: 0,
3445
- closeOnSelect: true,
3446
- openOnEnter: true,
3447
- containerCss: {},
3448
- dropdownCss: {},
3449
- containerCssClass: "",
3450
- dropdownCssClass: "",
3451
- formatResult: function(result, container, query, escapeMarkup) {
3452
- var markup=[];
3453
- markMatch(this.text(result), query.term, markup, escapeMarkup);
3454
- return markup.join("");
3455
- },
3456
- transformVal: function(val) {
3457
- return $.trim(val);
3458
- },
3459
- formatSelection: function (data, container, escapeMarkup) {
3460
- return data ? escapeMarkup(this.text(data)) : undefined;
3461
- },
3462
- sortResults: function (results, container, query) {
3463
- return results;
3464
- },
3465
- formatResultCssClass: function(data) {return data.css;},
3466
- formatSelectionCssClass: function(data, container) {return undefined;},
3467
- minimumResultsForSearch: 0,
3468
- minimumInputLength: 0,
3469
- maximumInputLength: null,
3470
- maximumSelectionSize: 0,
3471
- id: function (e) { return e == undefined ? null : e.id; },
3472
- text: function (e) {
3473
- if (e && this.data && this.data.text) {
3474
- if ($.isFunction(this.data.text)) {
3475
- return this.data.text(e);
3476
- } else {
3477
- return e[this.data.text];
3478
- }
3479
- } else {
3480
- return e.text;
3481
- }
3482
- },
3483
- matcher: function(term, text) {
3484
- return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
3485
- },
3486
- separator: ",",
3487
- tokenSeparators: [],
3488
- tokenizer: defaultTokenizer,
3489
- escapeMarkup: defaultEscapeMarkup,
3490
- blurOnChange: false,
3491
- selectOnBlur: false,
3492
- adaptContainerCssClass: function(c) { return c; },
3493
- adaptDropdownCssClass: function(c) { return null; },
3494
- nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
3495
- searchInputPlaceholder: '',
3496
- createSearchChoicePosition: 'top',
3497
- shouldFocusInput: function (instance) {
3498
- // Attempt to detect touch devices
3499
- var supportsTouchEvents = (('ontouchstart' in window) ||
3500
- (navigator.msMaxTouchPoints > 0));
3501
-
3502
- // Only devices which support touch events should be special cased
3503
- if (!supportsTouchEvents) {
3504
- return true;
3505
- }
3506
-
3507
- // Never focus the input if search is disabled
3508
- if (instance.opts.minimumResultsForSearch < 0) {
3509
- return false;
3510
- }
3511
-
3512
- return true;
3513
- }
3514
- };
3515
-
3516
- $.fn.select2.locales = [];
3517
-
3518
- $.fn.select2.locales['en'] = {
3519
- formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
3520
- formatNoMatches: function () { return "No matches found"; },
3521
- formatAjaxError: function (jqXHR, textStatus, errorThrown) { return "Loading failed"; },
3522
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
3523
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
3524
- formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
3525
- formatLoadMore: function (pageNumber) { return "Loading more results…"; },
3526
- formatSearching: function () { return "Searching…"; }
3527
- };
3528
-
3529
- $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
3530
-
3531
- $.fn.select2.ajaxDefaults = {
3532
- transport: $.ajax,
3533
- params: {
3534
- type: "GET",
3535
- cache: false,
3536
- dataType: "json"
3537
- }
3538
- };
3539
-
3540
- // exports
3541
- window.Select2 = {
3542
- query: {
3543
- ajax: ajax,
3544
- local: local,
3545
- tags: tags
3546
- }, util: {
3547
- debounce: debounce,
3548
- markMatch: markMatch,
3549
- escapeMarkup: defaultEscapeMarkup,
3550
- stripDiacritics: stripDiacritics
3551
- }, "class": {
3552
- "abstract": AbstractSelect2,
3553
- "single": SingleSelect2,
3554
- "multi": MultiSelect2
3555
- }
3556
- };
3557
-
3558
- }(jQuery));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2.png DELETED
Binary file
ui/lib/select2/select2_locale_ar.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Arabic translation.
3
- *
4
- * Author: Adel KEDJOUR <adel@kedjour.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['ar'] = {
10
- formatNoMatches: function () { return "لم يتم العثور على مطابقات"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1){ return "الرجاء إدخال حرف واحد على الأكثر"; } return n == 2 ? "الرجاء إدخال حرفين على الأكثر" : "الرجاء إدخال " + n + " على الأكثر"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1){ return "الرجاء إدخال حرف واحد على الأقل"; } return n == 2 ? "الرجاء إدخال حرفين على الأقل" : "الرجاء إدخال " + n + " على الأقل "; },
13
- formatSelectionTooBig: function (limit) { if (limit == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return limit == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + limit + " إختيارات فقط"; },
14
- formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; },
15
- formatSearching: function () { return "البحث…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ar']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_az.js DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * Select2 Azerbaijani translation.
3
- *
4
- * Author: Farhad Safarov <farhad.safarov@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['az'] = {
10
- formatMatches: function (matches) { return matches + " nəticə mövcuddur, hərəkət etdirmək üçün yuxarı və aşağı düymələrindən istifadə edin."; },
11
- formatNoMatches: function () { return "Nəticə tapılmadı"; },
12
- formatInputTooShort: function (input, min) { var n = min - input.length; return n + " simvol daxil edin"; },
13
- formatInputTooLong: function (input, max) { var n = input.length - max; return n + " simvol silin"; },
14
- formatSelectionTooBig: function (limit) { return "Sadəcə " + limit + " element seçə bilərsiniz"; },
15
- formatLoadMore: function (pageNumber) { return "Daha çox nəticə yüklənir…"; },
16
- formatSearching: function () { return "Axtarılır…"; }
17
- };
18
-
19
- $.extend($.fn.select2.defaults, $.fn.select2.locales['az']);
20
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_bg.js DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * Select2 Bulgarian translation.
3
- *
4
- * @author Lubomir Vikev <lubomirvikev@gmail.com>
5
- * @author Uriy Efremochkin <efremochkin@uriy.me>
6
- */
7
- (function ($) {
8
- "use strict";
9
-
10
- $.fn.select2.locales['bg'] = {
11
- formatNoMatches: function () { return "Няма намерени съвпадения"; },
12
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Моля въведете още " + n + " символ" + (n > 1 ? "а" : ""); },
13
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Моля въведете с " + n + " по-малко символ" + (n > 1 ? "а" : ""); },
14
- formatSelectionTooBig: function (limit) { return "Можете да направите до " + limit + (limit > 1 ? " избора" : " избор"); },
15
- formatLoadMore: function (pageNumber) { return "Зареждат се още…"; },
16
- formatSearching: function () { return "Търсене…"; }
17
- };
18
-
19
- $.extend($.fn.select2.defaults, $.fn.select2.locales['bg']);
20
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_ca.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Catalan translation.
3
- *
4
- * Author: David Planella <david.planella@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['ca'] = {
10
- formatNoMatches: function () { return "No s'ha trobat cap coincidència"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduïu " + n + " caràcter" + (n == 1 ? "" : "s") + " més"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Introduïu " + n + " caràcter" + (n == 1? "" : "s") + "menys"; },
13
- formatSelectionTooBig: function (limit) { return "Només podeu seleccionar " + limit + " element" + (limit == 1 ? "" : "s"); },
14
- formatLoadMore: function (pageNumber) { return "S'estan carregant més resultats…"; },
15
- formatSearching: function () { return "S'està cercant…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ca']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_cs.js DELETED
@@ -1,51 +0,0 @@
1
- /**
2
- * Select2 Czech translation.
3
- *
4
- * Author: Michal Marek <ahoj@michal-marek.cz>
5
- * Author - sklonovani: David Vallner <david@vallner.net>
6
- */
7
- (function ($) {
8
- "use strict";
9
- // use text for the numbers 2 through 4
10
- var smallNumbers = {
11
- 2: function(masc) { return (masc ? "dva" : "dvě"); },
12
- 3: function() { return "tři"; },
13
- 4: function() { return "čtyři"; }
14
- }
15
- $.fn.select2.locales['cs'] = {
16
- formatNoMatches: function () { return "Nenalezeny žádné položky"; },
17
- formatInputTooShort: function (input, min) {
18
- var n = min - input.length;
19
- if (n == 1) {
20
- return "Prosím zadejte ještě jeden znak";
21
- } else if (n <= 4) {
22
- return "Prosím zadejte ještě další "+smallNumbers[n](true)+" znaky";
23
- } else {
24
- return "Prosím zadejte ještě dalších "+n+" znaků";
25
- }
26
- },
27
- formatInputTooLong: function (input, max) {
28
- var n = input.length - max;
29
- if (n == 1) {
30
- return "Prosím zadejte o jeden znak méně";
31
- } else if (n <= 4) {
32
- return "Prosím zadejte o "+smallNumbers[n](true)+" znaky méně";
33
- } else {
34
- return "Prosím zadejte o "+n+" znaků méně";
35
- }
36
- },
37
- formatSelectionTooBig: function (limit) {
38
- if (limit == 1) {
39
- return "Můžete zvolit jen jednu položku";
40
- } else if (limit <= 4) {
41
- return "Můžete zvolit maximálně "+smallNumbers[limit](false)+" položky";
42
- } else {
43
- return "Můžete zvolit maximálně "+limit+" položek";
44
- }
45
- },
46
- formatLoadMore: function (pageNumber) { return "Načítají se další výsledky…"; },
47
- formatSearching: function () { return "Vyhledávání…"; }
48
- };
49
-
50
- $.extend($.fn.select2.defaults, $.fn.select2.locales['cs']);
51
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_da.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Danish translation.
3
- *
4
- * Author: Anders Jenbo <anders@jenbo.dk>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['da'] = {
10
- formatNoMatches: function () { return "Ingen resultater fundet"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Angiv venligst " + n + " tegn mere"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Angiv venligst " + n + " tegn mindre"; },
13
- formatSelectionTooBig: function (limit) { return "Du kan kun vælge " + limit + " emne" + (limit === 1 ? "" : "r"); },
14
- formatLoadMore: function (pageNumber) { return "Indlæser flere resultater…"; },
15
- formatSearching: function () { return "Søger…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['da']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_de.js DELETED
@@ -1,18 +0,0 @@
1
- /**
2
- * Select2 German translation
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['de'] = {
8
- formatNoMatches: function () { return "Keine Übereinstimmungen gefunden"; },
9
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Bitte " + n + " Zeichen mehr eingeben"; },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Bitte " + n + " Zeichen weniger eingeben"; },
11
- formatSelectionTooBig: function (limit) { return "Sie können nur " + limit + " Eintr" + (limit === 1 ? "ag" : "äge") + " auswählen"; },
12
- formatLoadMore: function (pageNumber) { return "Lade mehr Ergebnisse…"; },
13
- formatSearching: function () { return "Suche…"; },
14
- formatMatches: function (matches) { return matches + " Ergebnis " + (matches > 1 ? "se" : "") + " verfügbar, zum Navigieren die Hoch-/Runter-Pfeiltasten verwenden."; }
15
- };
16
-
17
- $.extend($.fn.select2.defaults, $.fn.select2.locales['de']);
18
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_el.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Greek translation.
3
- *
4
- * @author Uriy Efremochkin <efremochkin@uriy.me>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['el'] = {
10
- formatNoMatches: function () { return "Δεν βρέθηκαν αποτελέσματα"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Παρακαλούμε εισάγετε " + n + " περισσότερο" + (n > 1 ? "υς" : "") + " χαρακτήρ" + (n > 1 ? "ες" : "α"); },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Παρακαλούμε διαγράψτε " + n + " χαρακτήρ" + (n > 1 ? "ες" : "α"); },
13
- formatSelectionTooBig: function (limit) { return "Μπορείτε να επιλέξετε μόνο " + limit + " αντικείμεν" + (limit > 1 ? "α" : "ο"); },
14
- formatLoadMore: function (pageNumber) { return "Φόρτωση περισσότερων…"; },
15
- formatSearching: function () { return "Αναζήτηση…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['el']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_en.js.template DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * Select2 <Language> translation.
3
- *
4
- * Author: Your Name <your@email>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['en'] = {
10
- formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
11
- formatNoMatches: function () { return "No matches found"; },
12
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
13
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
14
- formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
15
- formatLoadMore: function (pageNumber) { return "Loading more results…"; },
16
- formatSearching: function () { return "Searching…"; }
17
- };
18
-
19
- $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
20
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_es.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Spanish translation
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['es'] = {
8
- formatMatches: function (matches) { if (matches === 1) { return "Un resultado disponible, presione enter para seleccionarlo."; } return matches + " resultados disponibles, use las teclas de dirección para navegar."; },
9
- formatNoMatches: function () { return "No se encontraron resultados"; },
10
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor, introduzca " + n + " car" + (n == 1? "ácter" : "acteres"); },
11
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor, elimine " + n + " car" + (n == 1? "ácter" : "acteres"); },
12
- formatSelectionTooBig: function (limit) { return "Sólo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
13
- formatLoadMore: function (pageNumber) { return "Cargando más resultados…"; },
14
- formatSearching: function () { return "Buscando…"; },
15
- formatAjaxError: function() { return "La carga falló"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['es']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_et.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Estonian translation.
3
- *
4
- * Author: Kuldar Kalvik <kuldar@kalvik.ee>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['et'] = {
10
- formatNoMatches: function () { return "Tulemused puuduvad"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Sisesta " + n + " täht" + (n == 1 ? "" : "e") + " rohkem"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Sisesta " + n + " täht" + (n == 1? "" : "e") + " vähem"; },
13
- formatSelectionTooBig: function (limit) { return "Saad vaid " + limit + " tulemus" + (limit == 1 ? "e" : "t") + " valida"; },
14
- formatLoadMore: function (pageNumber) { return "Laen tulemusi.."; },
15
- formatSearching: function () { return "Otsin.."; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['et']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_eu.js DELETED
@@ -1,45 +0,0 @@
1
- /**
2
- * Select2 Basque translation.
3
- *
4
- * Author: Julen Ruiz Aizpuru <julenx at gmail dot com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['eu'] = {
10
- formatNoMatches: function () {
11
- return "Ez da bat datorrenik aurkitu";
12
- },
13
- formatInputTooShort: function (input, min) {
14
- var n = min - input.length;
15
- if (n === 1) {
16
- return "Idatzi karaktere bat gehiago";
17
- } else {
18
- return "Idatzi " + n + " karaktere gehiago";
19
- }
20
- },
21
- formatInputTooLong: function (input, max) {
22
- var n = input.length - max;
23
- if (n === 1) {
24
- return "Idatzi karaktere bat gutxiago";
25
- } else {
26
- return "Idatzi " + n + " karaktere gutxiago";
27
- }
28
- },
29
- formatSelectionTooBig: function (limit) {
30
- if (limit === 1 ) {
31
- return "Elementu bakarra hauta dezakezu";
32
- } else {
33
- return limit + " elementu hauta ditzakezu soilik";
34
- }
35
- },
36
- formatLoadMore: function (pageNumber) {
37
- return "Emaitza gehiago kargatzen…";
38
- },
39
- formatSearching: function () {
40
- return "Bilatzen…";
41
- }
42
- };
43
-
44
- $.extend($.fn.select2.defaults, $.fn.select2.locales['eu']);
45
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_fa.js DELETED
@@ -1,21 +0,0 @@
1
- /**
2
- * Select2 Persian translation.
3
- *
4
- * Author: Ali Choopan <choopan@arsh.co>
5
- * Author: Ebrahim Byagowi <ebrahim@gnu.org>
6
- */
7
- (function ($) {
8
- "use strict";
9
-
10
- $.fn.select2.locales['fa'] = {
11
- formatMatches: function (matches) { return matches + " نتیجه موجود است، کلیدهای جهت بالا و پایین را برای گشتن استفاده کنید."; },
12
- formatNoMatches: function () { return "نتیجه‌ای یافت نشد."; },
13
- formatInputTooShort: function (input, min) { var n = min - input.length; return "لطفاً " + n + " نویسه بیشتر وارد نمایید"; },
14
- formatInputTooLong: function (input, max) { var n = input.length - max; return "لطفاً " + n + " نویسه را حذف کنید."; },
15
- formatSelectionTooBig: function (limit) { return "شما فقط می‌توانید " + limit + " مورد را انتخاب کنید"; },
16
- formatLoadMore: function (pageNumber) { return "در حال بارگیری موارد بیشتر…"; },
17
- formatSearching: function () { return "در حال جستجو…"; }
18
- };
19
-
20
- $.extend($.fn.select2.defaults, $.fn.select2.locales['fa']);
21
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_fi.js DELETED
@@ -1,30 +0,0 @@
1
- /**
2
- * Select2 Finnish translation
3
- */
4
- (function ($) {
5
- "use strict";
6
- $.fn.select2.locales['fi'] = {
7
- formatNoMatches: function () {
8
- return "Ei tuloksia";
9
- },
10
- formatInputTooShort: function (input, min) {
11
- var n = min - input.length;
12
- return "Ole hyvä ja anna " + n + " merkkiä lisää";
13
- },
14
- formatInputTooLong: function (input, max) {
15
- var n = input.length - max;
16
- return "Ole hyvä ja anna " + n + " merkkiä vähemmän";
17
- },
18
- formatSelectionTooBig: function (limit) {
19
- return "Voit valita ainoastaan " + limit + " kpl";
20
- },
21
- formatLoadMore: function (pageNumber) {
22
- return "Ladataan lisää tuloksia…";
23
- },
24
- formatSearching: function () {
25
- return "Etsitään…";
26
- }
27
- };
28
-
29
- $.extend($.fn.select2.defaults, $.fn.select2.locales['fi']);
30
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_fr.js DELETED
@@ -1,18 +0,0 @@
1
- /**
2
- * Select2 French translation
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['fr'] = {
8
- formatMatches: function (matches) { return matches + " résultats sont disponibles, utilisez les flèches haut et bas pour naviguer."; },
9
- formatNoMatches: function () { return "Aucun résultat trouvé"; },
10
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Saisissez " + n + " caractère" + (n == 1? "" : "s") + " supplémentaire" + (n == 1? "" : "s") ; },
11
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Supprimez " + n + " caractère" + (n == 1? "" : "s"); },
12
- formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); },
13
- formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires…"; },
14
- formatSearching: function () { return "Recherche en cours…"; }
15
- };
16
-
17
- $.extend($.fn.select2.defaults, $.fn.select2.locales['fr']);
18
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_gl.js DELETED
@@ -1,45 +0,0 @@
1
- /**
2
- * Select2 Galician translation
3
- *
4
- * Author: Leandro Regueiro <leandro.regueiro@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['gl'] = {
10
- formatNoMatches: function () {
11
- return "Non se atoparon resultados";
12
- },
13
- formatInputTooShort: function (input, min) {
14
- var n = min - input.length;
15
- if (n === 1) {
16
- return "Engada un carácter";
17
- } else {
18
- return "Engada " + n + " caracteres";
19
- }
20
- },
21
- formatInputTooLong: function (input, max) {
22
- var n = input.length - max;
23
- if (n === 1) {
24
- return "Elimine un carácter";
25
- } else {
26
- return "Elimine " + n + " caracteres";
27
- }
28
- },
29
- formatSelectionTooBig: function (limit) {
30
- if (limit === 1 ) {
31
- return "Só pode seleccionar un elemento";
32
- } else {
33
- return "Só pode seleccionar " + limit + " elementos";
34
- }
35
- },
36
- formatLoadMore: function (pageNumber) {
37
- return "Cargando máis resultados…";
38
- },
39
- formatSearching: function () {
40
- return "Buscando…";
41
- }
42
- };
43
-
44
- $.extend($.fn.select2.defaults, $.fn.select2.locales['gl']);
45
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_he.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Hebrew translation.
3
- *
4
- * Author: Yakir Sitbon <http://www.yakirs.net/>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['he'] = {
10
- formatNoMatches: function () { return "לא נמצאו התאמות"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "נא להזין עוד " + n + " תווים נוספים"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "נא להזין פחות " + n + " תווים"; },
13
- formatSelectionTooBig: function (limit) { return "ניתן לבחור " + limit + " פריטים"; },
14
- formatLoadMore: function (pageNumber) { return "טוען תוצאות נוספות…"; },
15
- formatSearching: function () { return "מחפש…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['he']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_hr.js DELETED
@@ -1,24 +0,0 @@
1
- /**
2
- * Select2 Croatian translation.
3
- *
4
- * @author Edi Modrić <edi.modric@gmail.com>
5
- * @author Uriy Efremochkin <efremochkin@uriy.me>
6
- */
7
- (function ($) {
8
- "use strict";
9
-
10
- $.fn.select2.locales['hr'] = {
11
- formatNoMatches: function () { return "Nema rezultata"; },
12
- formatInputTooShort: function (input, min) { return "Unesite još" + character(min - input.length); },
13
- formatInputTooLong: function (input, max) { return "Unesite" + character(input.length - max) + " manje"; },
14
- formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; },
15
- formatLoadMore: function (pageNumber) { return "Učitavanje rezultata…"; },
16
- formatSearching: function () { return "Pretraga…"; }
17
- };
18
-
19
- $.extend($.fn.select2.defaults, $.fn.select2.locales['hr']);
20
-
21
- function character (n) {
22
- return " " + n + " znak" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "a" : "" : "ova");
23
- }
24
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_hu.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * Select2 Hungarian translation
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['hu'] = {
8
- formatNoMatches: function () { return "Nincs találat."; },
9
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Túl rövid. Még " + n + " karakter hiányzik."; },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Túl hosszú. " + n + " karakterrel több, mint kellene."; },
11
- formatSelectionTooBig: function (limit) { return "Csak " + limit + " elemet lehet kiválasztani."; },
12
- formatLoadMore: function (pageNumber) { return "Töltés…"; },
13
- formatSearching: function () { return "Keresés…"; }
14
- };
15
-
16
- $.extend($.fn.select2.defaults, $.fn.select2.locales['hu']);
17
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_id.js DELETED
@@ -1,21 +0,0 @@
1
- /**
2
- * Select2 Indonesian translation.
3
- *
4
- * Author: Ibrahim Yusuf <ibrahim7usuf@gmail.com>
5
- * Author: Salahuddin Hairai <mr.od3n@gmail.com>
6
- */
7
- (function ($) {
8
- "use strict";
9
-
10
- $.fn.select2.locales['id'] = {
11
- formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; },
12
- formatNoMatches: function () { return "Tidak ada data yang sesuai"; },
13
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi"; },
14
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapuskan " + n + " huruf" ; },
15
- formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan"; },
16
- formatLoadMore: function (pageNumber) { return "Mengambil data…"; },
17
- formatSearching: function () { return "Mencari…"; }
18
- };
19
-
20
- $.extend($.fn.select2.defaults, $.fn.select2.locales['id']);
21
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_is.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * Select2 Icelandic translation.
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['is'] = {
8
- formatNoMatches: function () { return "Ekkert fannst"; },
9
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Vinsamlegast skrifið " + n + " staf" + (n > 1 ? "i" : "") + " í viðbót"; },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Vinsamlegast styttið texta um " + n + " staf" + (n > 1 ? "i" : ""); },
11
- formatSelectionTooBig: function (limit) { return "Þú getur aðeins valið " + limit + " atriði"; },
12
- formatLoadMore: function (pageNumber) { return "Sæki fleiri niðurstöður…"; },
13
- formatSearching: function () { return "Leita…"; }
14
- };
15
-
16
- $.extend($.fn.select2.defaults, $.fn.select2.locales['is']);
17
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_it.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * Select2 Italian translation
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['it'] = {
8
- formatNoMatches: function () { return "Nessuna corrispondenza trovata"; },
9
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Inserisci ancora " + n + " caratter" + (n == 1? "e" : "i"); },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Inserisci " + n + " caratter" + (n == 1? "e" : "i") + " in meno"; },
11
- formatSelectionTooBig: function (limit) { return "Puoi selezionare solo " + limit + " element" + (limit == 1 ? "o" : "i"); },
12
- formatLoadMore: function (pageNumber) { return "Caricamento in corso…"; },
13
- formatSearching: function () { return "Ricerca…"; }
14
- };
15
-
16
- $.extend($.fn.select2.defaults, $.fn.select2.locales['it']);
17
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_ja.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * Select2 Japanese translation.
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['ja'] = {
8
- formatNoMatches: function () { return "該当なし"; },
9
- formatInputTooShort: function (input, min) { var n = min - input.length; return "後" + n + "文字入れてください"; },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "検索文字列が" + n + "文字長すぎます"; },
11
- formatSelectionTooBig: function (limit) { return "最多で" + limit + "項目までしか選択できません"; },
12
- formatLoadMore: function (pageNumber) { return "読込中・・・"; },
13
- formatSearching: function () { return "検索中・・・"; }
14
- };
15
-
16
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ja']);
17
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_ka.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Georgian (Kartuli) translation.
3
- *
4
- * Author: Dimitri Kurashvili dimakura@gmail.com
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['ka'] = {
10
- formatNoMatches: function () { return "ვერ მოიძებნა"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "გთხოვთ შეიყვანოთ კიდევ " + n + " სიმბოლო"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "გთხოვთ წაშალოთ " + n + " სიმბოლო"; },
13
- formatSelectionTooBig: function (limit) { return "თქვენ შეგიძლიათ მხოლოდ " + limit + " ჩანაწერის მონიშვნა"; },
14
- formatLoadMore: function (pageNumber) { return "შედეგის ჩატვირთვა…"; },
15
- formatSearching: function () { return "ძებნა…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ka']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_ko.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Korean translation.
3
- *
4
- * @author Swen Mun <longfinfunnel@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['ko'] = {
10
- formatNoMatches: function () { return "결과 없음"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "너무 짧습니다. "+n+"글자 더 입력해주세요."; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "너무 깁니다. "+n+"글자 지워주세요."; },
13
- formatSelectionTooBig: function (limit) { return "최대 "+limit+"개까지만 선택하실 수 있습니다."; },
14
- formatLoadMore: function (pageNumber) { return "불러오는 중…"; },
15
- formatSearching: function () { return "검색 중…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ko']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_lt.js DELETED
@@ -1,26 +0,0 @@
1
- /**
2
- * Select2 Lithuanian translation.
3
- *
4
- * @author CRONUS Karmalakas <cronus dot karmalakas at gmail dot com>
5
- * @author Uriy Efremochkin <efremochkin@uriy.me>
6
- */
7
- (function ($) {
8
- "use strict";
9
-
10
- $.fn.select2.locales['lt'] = {
11
- formatNoMatches: function () { return "Atitikmenų nerasta"; },
12
- formatInputTooShort: function (input, min) { return "Įrašykite dar" + character(min - input.length); },
13
- formatInputTooLong: function (input, max) { return "Pašalinkite" + character(input.length - max); },
14
- formatSelectionTooBig: function (limit) {
15
- return "Jūs galite pasirinkti tik " + limit + " element" + ((limit%100 > 9 && limit%100 < 21) || limit%10 == 0 ? "ų" : limit%10 > 1 ? "us" : "ą");
16
- },
17
- formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų…"; },
18
- formatSearching: function () { return "Ieškoma…"; }
19
- };
20
-
21
- $.extend($.fn.select2.defaults, $.fn.select2.locales['lt']);
22
-
23
- function character (n) {
24
- return " " + n + " simbol" + ((n%100 > 9 && n%100 < 21) || n%10 == 0 ? "ių" : n%10 > 1 ? "ius" : "į");
25
- }
26
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_lv.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Latvian translation.
3
- *
4
- * @author Uriy Efremochkin <efremochkin@uriy.me>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['lv'] = {
10
- formatNoMatches: function () { return "Sakritību nav"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Lūdzu ievadiet vēl " + n + " simbol" + (n == 11 ? "us" : n%10 == 1 ? "u" : "us"); },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Lūdzu ievadiet par " + n + " simbol" + (n == 11 ? "iem" : n%10 == 1 ? "u" : "iem") + " mazāk"; },
13
- formatSelectionTooBig: function (limit) { return "Jūs varat izvēlēties ne vairāk kā " + limit + " element" + (limit == 11 ? "us" : limit%10 == 1 ? "u" : "us"); },
14
- formatLoadMore: function (pageNumber) { return "Datu ielāde…"; },
15
- formatSearching: function () { return "Meklēšana…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['lv']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_mk.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Macedonian translation.
3
- *
4
- * Author: Marko Aleksic <psybaron@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['mk'] = {
10
- formatNoMatches: function () { return "Нема пронајдено совпаѓања"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Ве молиме внесете уште " + n + " карактер" + (n == 1 ? "" : "и"); },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Ве молиме внесете " + n + " помалку карактер" + (n == 1? "" : "и"); },
13
- formatSelectionTooBig: function (limit) { return "Можете да изберете само " + limit + " ставк" + (limit == 1 ? "а" : "и"); },
14
- formatLoadMore: function (pageNumber) { return "Вчитување резултати…"; },
15
- formatSearching: function () { return "Пребарување…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['mk']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_ms.js DELETED
@@ -1,21 +0,0 @@
1
- /**
2
- * Select2 Malay translation.
3
- *
4
- * Author: Kepoweran <kepoweran@gmail.com>
5
- * Author: Salahuddin Hairai <mr.od3n@gmail.com>
6
- */
7
- (function ($) {
8
- "use strict";
9
-
10
- $.fn.select2.locales['ms'] = {
11
- formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; },
12
- formatNoMatches: function () { return "Tiada padanan yang ditemui"; },
13
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Sila masukkan " + n + " aksara lagi"; },
14
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Sila hapuskan " + n + " aksara"; },
15
- formatSelectionTooBig: function (limit) { return "Anda hanya boleh memilih " + limit + " pilihan"; },
16
- formatLoadMore: function (pageNumber) { return "Sedang memuatkan keputusan…"; },
17
- formatSearching: function () { return "Mencari…"; }
18
- };
19
-
20
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ms']);
21
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_nb.js DELETED
@@ -1,22 +0,0 @@
1
- /**
2
- * Select2 Norwegian Bokmål translation.
3
- *
4
- * Author: Torgeir Veimo <torgeir.veimo@gmail.com>
5
- * Author: Bjørn Johansen <post@bjornjohansen.no>
6
- */
7
- (function ($) {
8
- "use strict";
9
-
10
- $.fn.select2.locales['nb'] = {
11
- formatMatches: function (matches) { if (matches === 1) { return "Ett resultat er tilgjengelig, trykk enter for å velge det."; } return matches + " resultater er tilgjengelig. Bruk piltastene opp og ned for å navigere."; },
12
- formatNoMatches: function () { return "Ingen treff"; },
13
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); },
14
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; },
15
- formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; },
16
- formatLoadMore: function (pageNumber) { return "Laster flere resultater …"; },
17
- formatSearching: function () { return "Søker …"; }
18
- };
19
-
20
- $.extend($.fn.select2.defaults, $.fn.select2.locales['no']);
21
- })(jQuery);
22
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_nl.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * Select2 Dutch translation
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['nl'] = {
8
- formatNoMatches: function () { return "Geen resultaten gevonden"; },
9
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul nog " + n + " karakter" + (n == 1? "" : "s") + " in"; },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Haal " + n + " karakter" + (n == 1? "" : "s") + " weg"; },
11
- formatSelectionTooBig: function (limit) { return "Maximaal " + limit + " item" + (limit == 1 ? "" : "s") + " toegestaan"; },
12
- formatLoadMore: function (pageNumber) { return "Meer resultaten laden…"; },
13
- formatSearching: function () { return "Zoeken…"; }
14
- };
15
-
16
- $.extend($.fn.select2.defaults, $.fn.select2.locales['nl']);
17
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_pl.js DELETED
@@ -1,54 +0,0 @@
1
- /**
2
- * Select2 Polish translation.
3
- *
4
- * @author Jan Kondratowicz <jan@kondratowicz.pl>
5
- * @author Uriy Efremochkin <efremochkin@uriy.me>
6
- * @author Michał Połtyn <mike@poltyn.com>
7
- * @author Damian Zajkowski <damian.zajkowski@gmail.com>
8
- */
9
- (function($) {
10
- "use strict";
11
-
12
- $.fn.select2.locales['pl'] = {
13
- formatNoMatches: function() {
14
- return "Brak wyników";
15
- },
16
- formatInputTooShort: function(input, min) {
17
- return "Wpisz co najmniej" + character(min - input.length, "znak", "i");
18
- },
19
- formatInputTooLong: function(input, max) {
20
- return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i");
21
- },
22
- formatSelectionTooBig: function(limit) {
23
- return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y");
24
- },
25
- formatLoadMore: function(pageNumber) {
26
- return "Ładowanie wyników…";
27
- },
28
- formatSearching: function() {
29
- return "Szukanie…";
30
- }
31
- };
32
-
33
- $.extend($.fn.select2.defaults, $.fn.select2.locales['pl']);
34
-
35
- function character(n, word, pluralSuffix) {
36
- //Liczba pojedyncza - brak suffiksu
37
- //jeden znak
38
- //jeden element
39
- var suffix = '';
40
- if (n > 1 && n < 5) {
41
- //Liczaba mnoga ilość od 2 do 4 - własny suffiks
42
- //Dwa znaki, trzy znaki, cztery znaki.
43
- //Dwa elementy, trzy elementy, cztery elementy
44
- suffix = pluralSuffix;
45
- } else if (n == 0 || n >= 5) {
46
- //Ilość 0 suffiks ów
47
- //Liczaba mnoga w ilości 5 i więcej - suffiks ów (nie poprawny dla wszystkich wyrazów, np. 100 wiadomości)
48
- //Zero znaków, Pięć znaków, sześć znaków, siedem znaków, osiem znaków.
49
- //Zero elementów Pięć elementów, sześć elementów, siedem elementów, osiem elementów.
50
- suffix = 'ów';
51
- }
52
- return " " + n + " " + word + suffix;
53
- }
54
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_pt-BR.js DELETED
@@ -1,18 +0,0 @@
1
- /**
2
- * Select2 Brazilian Portuguese translation
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['pt-BR'] = {
8
- formatNoMatches: function () { return "Nenhum resultado encontrado"; },
9
- formatAjaxError: function () { return "Erro na busca"; },
10
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite " + (min == 1 ? "" : "mais") + " " + n + " caracter" + (n == 1? "" : "es"); },
11
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); },
12
- formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
13
- formatLoadMore: function (pageNumber) { return "Carregando mais resultados…"; },
14
- formatSearching: function () { return "Buscando…"; }
15
- };
16
-
17
- $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-BR']);
18
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_pt-PT.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * Select2 Portuguese (Portugal) translation
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['pt-PT'] = {
8
- formatNoMatches: function () { return "Nenhum resultado encontrado"; },
9
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " car" + (n == 1 ? "ácter" : "acteres"); },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " car" + (n == 1 ? "ácter" : "acteres"); },
11
- formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
12
- formatLoadMore: function (pageNumber) { return "A carregar mais resultados…"; },
13
- formatSearching: function () { return "A pesquisar…"; }
14
- };
15
-
16
- $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-PT']);
17
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_ro.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * Select2 Romanian translation.
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['ro'] = {
8
- formatNoMatches: function () { return "Nu a fost găsit nimic"; },
9
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Vă rugăm să introduceți incă " + n + " caracter" + (n == 1 ? "" : "e"); },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Vă rugăm să introduceți mai puțin de " + n + " caracter" + (n == 1? "" : "e"); },
11
- formatSelectionTooBig: function (limit) { return "Aveți voie să selectați cel mult " + limit + " element" + (limit == 1 ? "" : "e"); },
12
- formatLoadMore: function (pageNumber) { return "Se încarcă…"; },
13
- formatSearching: function () { return "Căutare…"; }
14
- };
15
-
16
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ro']);
17
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_rs.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Serbian translation.
3
- *
4
- * @author Limon Monte <limon.monte@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['rs'] = {
10
- formatNoMatches: function () { return "Ništa nije pronađeno"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Ukucajte bar još " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Obrišite " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); },
13
- formatSelectionTooBig: function (limit) { return "Možete izabrati samo " + limit + " stavk" + (limit % 10 == 1 && limit % 100 != 11 ? "u" : (limit % 10 >= 2 && limit % 10 <= 4 && (limit % 100 < 12 || limit % 100 > 14)? "e" : "i")); },
14
- formatLoadMore: function (pageNumber) { return "Preuzimanje još rezultata…"; },
15
- formatSearching: function () { return "Pretraga…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['rs']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_ru.js DELETED
@@ -1,23 +0,0 @@
1
- /**
2
- * Select2 Russian translation.
3
- *
4
- * @author Uriy Efremochkin <efremochkin@uriy.me>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['ru'] = {
10
- formatNoMatches: function () { return "Совпадений не найдено"; },
11
- formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще хотя бы" + character(min - input.length); },
12
- formatInputTooLong: function (input, max) { return "Пожалуйста, введите на" + character(input.length - max) + " меньше"; },
13
- formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit%10 == 1 && limit%100 != 11 ? "а" : "ов"); },
14
- formatLoadMore: function (pageNumber) { return "Загрузка данных…"; },
15
- formatSearching: function () { return "Поиск…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ru']);
19
-
20
- function character (n) {
21
- return " " + n + " символ" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 20) ? n%10 > 1 ? "a" : "" : "ов");
22
- }
23
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_sk.js DELETED
@@ -1,50 +0,0 @@
1
- /**
2
- * Select2 Slovak translation.
3
- *
4
- * Author: David Vallner <david@vallner.net>
5
- */
6
- (function ($) {
7
- "use strict";
8
- // use text for the numbers 2 through 4
9
- var smallNumbers = {
10
- 2: function(masc) { return (masc ? "dva" : "dve"); },
11
- 3: function() { return "tri"; },
12
- 4: function() { return "štyri"; }
13
- };
14
- $.fn.select2.locales['sk'] = {
15
- formatNoMatches: function () { return "Nenašli sa žiadne položky"; },
16
- formatInputTooShort: function (input, min) {
17
- var n = min - input.length;
18
- if (n == 1) {
19
- return "Prosím, zadajte ešte jeden znak";
20
- } else if (n <= 4) {
21
- return "Prosím, zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky";
22
- } else {
23
- return "Prosím, zadajte ešte ďalších "+n+" znakov";
24
- }
25
- },
26
- formatInputTooLong: function (input, max) {
27
- var n = input.length - max;
28
- if (n == 1) {
29
- return "Prosím, zadajte o jeden znak menej";
30
- } else if (n >= 2 && n <= 4) {
31
- return "Prosím, zadajte o "+smallNumbers[n](true)+" znaky menej";
32
- } else {
33
- return "Prosím, zadajte o "+n+" znakov menej";
34
- }
35
- },
36
- formatSelectionTooBig: function (limit) {
37
- if (limit == 1) {
38
- return "Môžete zvoliť len jednu položku";
39
- } else if (limit >= 2 && limit <= 4) {
40
- return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky";
41
- } else {
42
- return "Môžete zvoliť najviac "+limit+" položiek";
43
- }
44
- },
45
- formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky…"; },
46
- formatSearching: function () { return "Vyhľadávanie…"; }
47
- };
48
-
49
- $.extend($.fn.select2.defaults, $.fn.select2.locales['sk']);
50
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_sv.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Swedish translation.
3
- *
4
- * Author: Jens Rantil <jens.rantil@telavox.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['sv'] = {
10
- formatNoMatches: function () { return "Inga träffar"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Var god skriv in " + n + (n>1 ? " till tecken" : " tecken till"); },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Var god sudda ut " + n + " tecken"; },
13
- formatSelectionTooBig: function (limit) { return "Du kan max välja " + limit + " element"; },
14
- formatLoadMore: function (pageNumber) { return "Laddar fler resultat…"; },
15
- formatSearching: function () { return "Söker…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['sv']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_th.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Thai translation.
3
- *
4
- * Author: Atsawin Chaowanakritsanakul <joke@nakhon.net>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['th'] = {
10
- formatNoMatches: function () { return "ไม่พบข้อมูล"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "โปรดพิมพ์เพิ่มอีก " + n + " ตัวอักษร"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "โปรดลบออก " + n + " ตัวอักษร"; },
13
- formatSelectionTooBig: function (limit) { return "คุณสามารถเลือกได้ไม่เกิน " + limit + " รายการ"; },
14
- formatLoadMore: function (pageNumber) { return "กำลังค้นข้อมูลเพิ่ม…"; },
15
- formatSearching: function () { return "กำลังค้นข้อมูล…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['th']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_tr.js DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * Select2 Turkish translation.
3
- *
4
- * Author: Salim KAYABAŞI <salim.kayabasi@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['tr'] = {
10
- formatMatches: function (matches) { if (matches === 1) { return "Sadece bir sonuç bulundu, seçmek için enter tuşuna basabilirsiniz."; } return matches + " sonuç bulundu, yukarı ve aşağı tuşları ile seçebilirsiniz."; },
11
- formatNoMatches: function () { return "Sonuç bulunamadı"; },
12
- formatInputTooShort: function (input, min) { var n = min - input.length; return "En az " + n + " karakter daha girmelisiniz"; },
13
- formatInputTooLong: function (input, max) { var n = input.length - max; return n + " karakter azaltmalısınız"; },
14
- formatSelectionTooBig: function (limit) { return "Sadece " + limit + " seçim yapabilirsiniz"; },
15
- formatLoadMore: function (pageNumber) { return "Daha fazla…"; },
16
- formatSearching: function () { return "Aranıyor…"; }
17
- };
18
-
19
- $.extend($.fn.select2.defaults, $.fn.select2.locales['tr']);
20
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_ug-CN.js DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * Select2 Uyghur translation
3
- */
4
- (function ($) {
5
- "use strict";
6
- $.fn.select2.locales['ug-CN'] = {
7
- formatNoMatches: function () { return "ماس كېلىدىغان ئۇچۇر تېپىلمىدى"; },
8
- formatInputTooShort: function (input, min) { var n = min - input.length; return "يەنە " + n + " ھەرپ كىرگۈزۈڭ";},
9
- formatInputTooLong: function (input, max) { var n = input.length - max; return "" + n + "ھەرپ ئۆچۈرۈڭ";},
10
- formatSelectionTooBig: function (limit) { return "ئەڭ كۆپ بولغاندا" + limit + " تال ئۇچۇر تاللىيالايسىز"; },
11
- formatLoadMore: function (pageNumber) { return "ئۇچۇرلار ئوقۇلىۋاتىدۇ…"; },
12
- formatSearching: function () { return "ئىزدەۋاتىدۇ…"; }
13
- };
14
-
15
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ug-CN']);
16
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_uk.js DELETED
@@ -1,25 +0,0 @@
1
- /**
2
- * Select2 Ukrainian translation.
3
- *
4
- * @author bigmihail <bigmihail@bigmir.net>
5
- * @author Uriy Efremochkin <efremochkin@uriy.me>
6
- */
7
- (function ($) {
8
- "use strict";
9
-
10
- $.fn.select2.locales['uk'] = {
11
- formatMatches: function (matches) { return character(matches, "результат") + " знайдено, використовуйте клавіші зі стрілками вверх та вниз для навігації."; },
12
- formatNoMatches: function () { return "Нічого не знайдено"; },
13
- formatInputTooShort: function (input, min) { return "Введіть буль ласка ще " + character(min - input.length, "символ"); },
14
- formatInputTooLong: function (input, max) { return "Введіть буль ласка на " + character(input.length - max, "символ") + " менше"; },
15
- formatSelectionTooBig: function (limit) { return "Ви можете вибрати лише " + character(limit, "елемент"); },
16
- formatLoadMore: function (pageNumber) { return "Завантаження даних…"; },
17
- formatSearching: function () { return "Пошук…"; }
18
- };
19
-
20
- $.extend($.fn.select2.defaults, $.fn.select2.locales['uk']);
21
-
22
- function character (n, word) {
23
- return n + " " + word + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "и" : "" : "ів");
24
- }
25
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_vi.js DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * Select2 Vietnamese translation.
3
- *
4
- * Author: Long Nguyen <olragon@gmail.com>, Nguyen Chien Cong
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['vi'] = {
10
- formatNoMatches: function () { return "Không tìm thấy kết quả"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự"; },
13
- formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " lựa chọn"; },
14
- formatLoadMore: function (pageNumber) { return "Đang lấy thêm kết quả…"; },
15
- formatSearching: function () { return "Đang tìm…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['vi']);
19
- })(jQuery);
20
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_zh-CN.js DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * Select2 Chinese translation
3
- */
4
- (function ($) {
5
- "use strict";
6
- $.fn.select2.locales['zh-CN'] = {
7
- formatNoMatches: function () { return "没有找到匹配项"; },
8
- formatInputTooShort: function (input, min) { var n = min - input.length; return "请再输入" + n + "个字符";},
9
- formatInputTooLong: function (input, max) { var n = input.length - max; return "请删掉" + n + "个字符";},
10
- formatSelectionTooBig: function (limit) { return "你只能选择最多" + limit + "项"; },
11
- formatLoadMore: function (pageNumber) { return "加载结果中…"; },
12
- formatSearching: function () { return "搜索中…"; }
13
- };
14
-
15
- $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-CN']);
16
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2_locale_zh-TW.js DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * Select2 Traditional Chinese translation
3
- */
4
- (function ($) {
5
- "use strict";
6
- $.fn.select2.locales['zh-TW'] = {
7
- formatNoMatches: function () { return "沒有找到相符的項目"; },
8
- formatInputTooShort: function (input, min) { var n = min - input.length; return "請再輸入" + n + "個字元";},
9
- formatInputTooLong: function (input, max) { var n = input.length - max; return "請刪掉" + n + "個字元";},
10
- formatSelectionTooBig: function (limit) { return "你只能選擇最多" + limit + "項"; },
11
- formatLoadMore: function (pageNumber) { return "載入中…"; },
12
- formatSearching: function () { return "搜尋中…"; }
13
- };
14
-
15
- $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-TW']);
16
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ui/lib/select2/select2x2.png DELETED
Binary file