Simple History - Version 2.28

Version Description

(September 2018) =

  • Always show time and sometimes date before each event, in addition to the relative date. Fixes https://wordpress.org/support/topic/feature-request-granular-settings-changes-detailed-timestamp/.
  • Use WordPress own function (wp_privacy_anonymize_ip, available since WordPress version 4.9.6) to anonymize IP addresses, instead of our own class.
  • Update timeago.js
Download this release

Release Info

Developer eskapism
Plugin Icon 128x128 Simple History
Version 2.28
Comparing to
See all releases

Code changes from version 2.27 to 2.28

Files changed (71) hide show
  1. composer.json +1 -1
  2. freemius/assets/img/simple-history.svg +6 -0
  3. inc/SimpleHistory.php +0 -1
  4. inc/SimpleHistoryIpAnonymizer.php +0 -71
  5. index.php +23 -26
  6. js/scripts.js +694 -763
  7. js/select2-3.5.1-old/LICENSE +0 -18
  8. js/select2-3.5.1-old/README.md +0 -99
  9. js/select2-3.5.1-old/bower.json +0 -8
  10. js/select2-3.5.1-old/component.json +0 -66
  11. js/select2-3.5.1-old/composer.json +0 -29
  12. js/select2-3.5.1-old/package.json +0 -20
  13. js/select2-3.5.1-old/release.sh +0 -79
  14. js/select2-3.5.1-old/select2-bootstrap.css +0 -87
  15. js/select2-3.5.1-old/select2-spinner.gif +0 -0
  16. js/select2-3.5.1-old/select2.css +0 -704
  17. js/select2-3.5.1-old/select2.jquery.json +0 -36
  18. js/select2-3.5.1-old/select2.js +0 -3508
  19. js/select2-3.5.1-old/select2.min.js +0 -23
  20. js/select2-3.5.1-old/select2.png +0 -0
  21. js/select2-3.5.1-old/select2_locale_ar.js +0 -19
  22. js/select2-3.5.1-old/select2_locale_az.js +0 -20
  23. js/select2-3.5.1-old/select2_locale_bg.js +0 -20
  24. js/select2-3.5.1-old/select2_locale_ca.js +0 -19
  25. js/select2-3.5.1-old/select2_locale_cs.js +0 -51
  26. js/select2-3.5.1-old/select2_locale_da.js +0 -19
  27. js/select2-3.5.1-old/select2_locale_de.js +0 -18
  28. js/select2-3.5.1-old/select2_locale_el.js +0 -19
  29. js/select2-3.5.1-old/select2_locale_en.js.template +0 -20
  30. js/select2-3.5.1-old/select2_locale_es.js +0 -17
  31. js/select2-3.5.1-old/select2_locale_et.js +0 -19
  32. js/select2-3.5.1-old/select2_locale_eu.js +0 -45
  33. js/select2-3.5.1-old/select2_locale_fa.js +0 -21
  34. js/select2-3.5.1-old/select2_locale_fi.js +0 -30
  35. js/select2-3.5.1-old/select2_locale_fr.js +0 -18
  36. js/select2-3.5.1-old/select2_locale_gl.js +0 -45
  37. js/select2-3.5.1-old/select2_locale_he.js +0 -19
  38. js/select2-3.5.1-old/select2_locale_hr.js +0 -24
  39. js/select2-3.5.1-old/select2_locale_hu.js +0 -17
  40. js/select2-3.5.1-old/select2_locale_id.js +0 -19
  41. js/select2-3.5.1-old/select2_locale_is.js +0 -17
  42. js/select2-3.5.1-old/select2_locale_it.js +0 -17
  43. js/select2-3.5.1-old/select2_locale_ja.js +0 -17
  44. js/select2-3.5.1-old/select2_locale_ka.js +0 -19
  45. js/select2-3.5.1-old/select2_locale_ko.js +0 -19
  46. js/select2-3.5.1-old/select2_locale_lt.js +0 -26
  47. js/select2-3.5.1-old/select2_locale_lv.js +0 -19
  48. js/select2-3.5.1-old/select2_locale_mk.js +0 -19
  49. js/select2-3.5.1-old/select2_locale_ms.js +0 -19
  50. js/select2-3.5.1-old/select2_locale_nl.js +0 -17
  51. js/select2-3.5.1-old/select2_locale_no.js +0 -20
  52. js/select2-3.5.1-old/select2_locale_pl.js +0 -25
  53. js/select2-3.5.1-old/select2_locale_pt-BR.js +0 -17
  54. js/select2-3.5.1-old/select2_locale_pt-PT.js +0 -17
  55. js/select2-3.5.1-old/select2_locale_ro.js +0 -17
  56. js/select2-3.5.1-old/select2_locale_rs.js +0 -19
  57. js/select2-3.5.1-old/select2_locale_ru.js +0 -23
  58. js/select2-3.5.1-old/select2_locale_sk.js +0 -50
  59. js/select2-3.5.1-old/select2_locale_sv.js +0 -19
  60. js/select2-3.5.1-old/select2_locale_th.js +0 -19
  61. js/select2-3.5.1-old/select2_locale_tr.js +0 -19
  62. js/select2-3.5.1-old/select2_locale_ug-CN.js +0 -16
  63. js/select2-3.5.1-old/select2_locale_uk.js +0 -25
  64. js/select2-3.5.1-old/select2_locale_vi.js +0 -20
  65. js/select2-3.5.1-old/select2_locale_zh-CN.js +0 -16
  66. js/select2-3.5.1-old/select2_locale_zh-TW.js +0 -16
  67. js/select2-3.5.1-old/select2x2.png +0 -0
  68. js/timeago/jquery.timeago.js +124 -117
  69. loggers/SimpleLogger.php +43 -29
  70. loggers/SimpleUserLogger.php +3 -3
  71. readme.txt +23 -4
composer.json CHANGED
@@ -13,7 +13,7 @@
13
  "require": {
14
  "php": ">=5.3.0"
15
  },
16
- "version": "2.27",
17
  "authors": [
18
  {
19
  "name": "Pär Thernström",
13
  "require": {
14
  "php": ">=5.3.0"
15
  },
16
+ "version": "2.28",
17
  "authors": [
18
  {
19
  "name": "Pär Thernström",
freemius/assets/img/simple-history.svg ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <svg width="48" height="48" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48">
2
+ <g>
3
+ <path stroke="null" id="svg_1" fill="none" d="m0,0l48,0l0,48l-48,0l0,-48z"/>
4
+ <path fill="#3f9349" id="svg_2" d="m25.99,6c-9.949999,0 -17.99,8.06 -17.99,18l-6,0l7.79,7.790001l0.14,0.290001l8.07,-8.080002l-6,0c0,-7.73 6.27,-14 14,-14s14,6.27 14,14s-6.27,14 -14,14c-3.870001,0 -7.360001,-1.580002 -9.889999,-4.110001l-2.830001,2.830002c3.250001,3.259998 7.740001,5.279999 12.71,5.279999c9.949999,0 18.01,-8.060001 18.01,-18s-8.060001,-18 -18.01,-18zm-1.99,10l0,10l8.560001,5.08l1.439999,-2.43l-7,-4.15l0,-8.5l-3,0z" opacity="0.9"/>
5
+ </g>
6
+ </svg>
inc/SimpleHistory.php CHANGED
@@ -2424,7 +2424,6 @@ Because Simple History was just recently installed, this feed does not contain m
2424
  $logger = $this->instantiatedLoggers[ $row_logger ]['instance'];
2425
 
2426
  return $logger->getLogRowPlainTextOutput( $row );
2427
-
2428
  }
2429
 
2430
  /**
2424
  $logger = $this->instantiatedLoggers[ $row_logger ]['instance'];
2425
 
2426
  return $logger->getLogRowPlainTextOutput( $row );
 
2427
  }
2428
 
2429
  /**
inc/SimpleHistoryIpAnonymizer.php DELETED
@@ -1,71 +0,0 @@
1
- <?php
2
- /**
3
- * IpAnonymizer class from https://github.com/geertw/php-ip-anonymizer
4
- *
5
- * Modified by removing namespace to make it work on PHP < 5.3 and renaming it
6
- * to minimize multiple classes with same name.
7
- */
8
-
9
- class SimpleHistoryIpAnonymizer {
10
- /**
11
- * @var string IPv4 netmask used to anonymize IPv4 address.
12
- */
13
- public $ipv4NetMask = "255.255.255.0";
14
-
15
- /**
16
- * @var string IPv6 netmask used to anonymize IPv6 address.
17
- */
18
- public $ipv6NetMask = "ffff:ffff:ffff:ffff:0000:0000:0000:0000";
19
-
20
- /**
21
- * Anonymize an IPv4 or IPv6 address.
22
- *
23
- * @param $address string IP address that must be anonymized
24
- * @return string The anonymized IP address. Returns an empty string when the IP address is invalid.
25
- */
26
- public static function anonymizeIp($address) {
27
- $anonymizer = new SimpleHistoryIpAnonymizer();
28
- return $anonymizer->anonymize($address);
29
- }
30
-
31
- /**
32
- * Anonymize an IPv4 or IPv6 address.
33
- *
34
- * @param $address string IP address that must be anonymized
35
- * @return string The anonymized IP address. Returns an empty string when the IP address is invalid.
36
- */
37
- public function anonymize($address) {
38
-
39
- if (empty($address)) {
40
- return "";
41
- }
42
-
43
- $packedAddress = inet_pton($address);
44
-
45
- if (strlen($packedAddress) == 4) {
46
- return $this->anonymizeIPv4($address);
47
- } elseif (strlen($packedAddress) == 16) {
48
- return $this->anonymizeIPv6($address);
49
- } else {
50
- return "";
51
- }
52
- }
53
-
54
- /**
55
- * Anonymize an IPv4 address
56
- * @param $address string IPv4 address
57
- * @return string Anonymized address
58
- */
59
- public function anonymizeIPv4($address) {
60
- return inet_ntop(inet_pton($address) & inet_pton($this->ipv4NetMask));
61
- }
62
-
63
- /**
64
- * Anonymize an IPv6 address
65
- * @param $address string IPv6 address
66
- * @return string Anonymized address
67
- */
68
- public function anonymizeIPv6($address) {
69
- return inet_ntop(inet_pton($address) & inet_pton($this->ipv6NetMask));
70
- }
71
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
index.php CHANGED
@@ -5,7 +5,7 @@
5
  * Text Domain: simple-history
6
  * Domain Path: /languages
7
  * Description: Plugin that logs various things that occur in WordPress and then presents those events in a very nice GUI.
8
- * Version: 2.27
9
  * Author: Pär Thernström
10
  * Author URI: http://simple-history.com/
11
  * License: GPL2
@@ -34,7 +34,7 @@ if ( ! defined( 'WPINC' ) ) {
34
 
35
  // Plugin requires at least WordPress version "4.5.1", because usage of functions like wp_get_raw_referer.
36
  // true if version ok, false if too old version.
37
- $ok_wp_version = version_compare( $GLOBALS['wp_version'], "4.5.1", '>=' );
38
  $ok_php_version = version_compare( phpversion(), '5.3', '>=' );
39
 
40
  if ( $ok_php_version && $ok_wp_version ) {
@@ -47,7 +47,7 @@ if ( $ok_php_version && $ok_wp_version ) {
47
  */
48
 
49
  if ( ! defined( 'SIMPLE_HISTORY_VERSION' ) ) {
50
- define( 'SIMPLE_HISTORY_VERSION', '2.27' );
51
  }
52
 
53
  if ( ! defined( 'SIMPLE_HISTORY_PATH' ) ) {
@@ -69,7 +69,6 @@ if ( $ok_php_version && $ok_wp_version ) {
69
  /** Load required files */
70
  require_once( __DIR__ . '/inc/SimpleHistory.php' );
71
  require_once( __DIR__ . '/inc/SimpleHistoryLogQuery.php' );
72
- require_once( __DIR__ . '/inc/SimpleHistoryIpAnonymizer.php' );
73
 
74
  /**
75
  Constants will be like:
@@ -93,33 +92,31 @@ if ( $ok_php_version && $ok_wp_version ) {
93
  * Show an admin message if old PHP version.
94
  */
95
  function simple_history_old_version_admin_notice() {
96
- $ok_wp_version = version_compare( $GLOBALS['wp_version'], "4.5.1", '>=' );
97
  $ok_php_version = version_compare( phpversion(), '5.3', '>=' );
98
 
99
  ?>
100
  <div class="updated error">
101
  <?php
102
-
103
- if (!$ok_php_version) {
104
- echo '<p>';
105
- printf(
106
- /* translators: 1: PHP version */
107
- esc_html( __( 'Simple History is a great plugin, but to use it your server must have at least PHP 5.3 installed (you have version %s).', 'simple-history' ) ),
108
- phpversion() // 1
109
- );
110
- echo '</p>';
111
- }
112
-
113
- if (!$ok_wp_version) {
114
- echo '<p>';
115
- printf(
116
- /* translators: 1: WordPress version */
117
- esc_html( __( 'Simple History requires WordPress version 4.5.1 or higher (you have version %s).', 'simple-history' ) ),
118
- $GLOBALS['wp_version'] // 1
119
- );
120
- echo '</p>';
121
- }
122
-
123
  ?>
124
  </div>
125
  <?php
5
  * Text Domain: simple-history
6
  * Domain Path: /languages
7
  * Description: Plugin that logs various things that occur in WordPress and then presents those events in a very nice GUI.
8
+ * Version: 2.28
9
  * Author: Pär Thernström
10
  * Author URI: http://simple-history.com/
11
  * License: GPL2
34
 
35
  // Plugin requires at least WordPress version "4.5.1", because usage of functions like wp_get_raw_referer.
36
  // true if version ok, false if too old version.
37
+ $ok_wp_version = version_compare( $GLOBALS['wp_version'], '4.5.1', '>=' );
38
  $ok_php_version = version_compare( phpversion(), '5.3', '>=' );
39
 
40
  if ( $ok_php_version && $ok_wp_version ) {
47
  */
48
 
49
  if ( ! defined( 'SIMPLE_HISTORY_VERSION' ) ) {
50
+ define( 'SIMPLE_HISTORY_VERSION', '2.28' );
51
  }
52
 
53
  if ( ! defined( 'SIMPLE_HISTORY_PATH' ) ) {
69
  /** Load required files */
70
  require_once( __DIR__ . '/inc/SimpleHistory.php' );
71
  require_once( __DIR__ . '/inc/SimpleHistoryLogQuery.php' );
 
72
 
73
  /**
74
  Constants will be like:
92
  * Show an admin message if old PHP version.
93
  */
94
  function simple_history_old_version_admin_notice() {
95
+ $ok_wp_version = version_compare( $GLOBALS['wp_version'], '4.5.1', '>=' );
96
  $ok_php_version = version_compare( phpversion(), '5.3', '>=' );
97
 
98
  ?>
99
  <div class="updated error">
100
  <?php
101
+ if ( ! $ok_php_version ) {
102
+ echo '<p>';
103
+ printf(
104
+ /* translators: 1: PHP version */
105
+ esc_html( __( 'Simple History is a great plugin, but to use it your server must have at least PHP 5.3 installed (you have version %s).', 'simple-history' ) ),
106
+ phpversion() // 1
107
+ );
108
+ echo '</p>';
109
+ }
110
+
111
+ if ( ! $ok_wp_version ) {
112
+ echo '<p>';
113
+ printf(
114
+ /* translators: 1: WordPress version */
115
+ esc_html( __( 'Simple History requires WordPress version 4.5.1 or higher (you have version %s).', 'simple-history' ) ),
116
+ $GLOBALS['wp_version'] // 1
117
+ );
118
+ echo '</p>';
119
+ }
 
 
120
  ?>
121
  </div>
122
  <?php
js/scripts.js CHANGED
@@ -1,774 +1,705 @@
1
- /*jshint multistr: true */
2
-
3
- var simple_history = (function($) {
4
-
5
- var api_base_url = window.ajaxurl;
6
-
7
- // Plugins may have modified the Ajax URL so it already contains query params
8
- if (api_base_url.indexOf("?") >= 0) {
9
- api_base_url += "&";
10
- } else {
11
- api_base_url += "?";
12
- }
13
-
14
- api_base_url += "action=simple_history_api";
15
-
16
- var debug = function(what) {
17
-
18
- if (typeof what == "object") {
19
-
20
- var newWhat = "";
21
-
22
- _.each(what, function(val, key) {
23
- newWhat += key + ": " + val + "\n";
24
- });
25
-
26
- what = newWhat;
27
-
28
- }
29
-
30
- $(".SimpleHistoryLogitems__debug").append("<br>" + what);
31
-
32
- };
33
-
34
- var LogRowsCollection = Backbone.Collection.extend({
35
-
36
- initialize: function(models, options) {
37
-
38
- this.mainView = options.mainView;
39
-
40
- $(document).trigger("SimpleHistory:logRowsCollectionInitialize");
41
-
42
- },
43
-
44
- reload: function() {
45
-
46
- this.trigger("reload");
47
- $(document).trigger("SimpleHistory:logRowsCollectionReload");
48
-
49
- var pager_size = this.mainView.$el.data("pagerSize");
50
- this.url = api_base_url + "&type=overview&format=html";
51
- this.url += "&posts_per_page=" + pager_size;
52
-
53
- // Reset some vars
54
- this.api_args = null;
55
- this.max_id = null;
56
- this.min_id = null;
57
- this.pages_count = null;
58
- this.total_row_count = null;
59
- this.page_rows_from = null;
60
- this.page_rows_to = null;
61
- this.max_id_first_page = null;
62
-
63
- // Get first page
64
- // We don't have max_id yet
65
- var that = this;
66
- var url_data = {
67
- paged: 1,
68
- // here we want to append custom args/data for filters
69
- };
70
-
71
- // trigger so plugins can modify url parameters
72
- this.trigger("before_fetch", this, url_data);
73
-
74
- this.fetch({
75
- reset: true,
76
- data: url_data,
77
- // called on 404 and similar
78
- error: function(collection, response, options) {
79
-
80
- collection.trigger("reloadError", [ response, options ]);
81
- $(document).trigger("SimpleHistory:logRowsCollectionReloadError", [ response, options ]);
82
-
83
- },
84
- success: function(collection, response, options) {
85
-
86
- collection.trigger("reloadDone", [ response, options ]);
87
- $(document).trigger("SimpleHistory:logRowsCollectionReloadDone", [ response, options ]);
88
-
89
- }
90
- });
91
-
92
- },
93
-
94
- /*
95
- * Parse ajax response to make it fit to format used by backbone
96
- */
97
- parse: function(resp, xhr) {
98
-
99
- if (!resp || !resp.data) {
100
- alert("Error in response, could not parse");
101
- return;
102
- }
103
-
104
- this.api_args = resp.data.api_args;
105
- this.max_id = resp.data.max_id;
106
- this.min_id = resp.data.min_id;
107
- this.pages_count = resp.data.pages_count;
108
- this.total_row_count = resp.data.total_row_count;
109
- this.page_rows_from = resp.data.page_rows_from;
110
- this.page_rows_to = resp.data.page_rows_to;
111
-
112
- // Store first max_id found, since that's the max id we use for
113
- // all subsequent paginations
114
- if ( ! this.max_id_first_page ) {
115
-
116
- this.max_id_first_page = this.max_id;
117
- $(document).trigger("SimpleHistory:logRowsCollectionFirstLoad");
118
-
119
- $(".SimpleHistory__waitingForFirstLoad").addClass("SimpleHistory__waitingForFirstLoad--isLoaded");
120
-
121
- // Add class to body to so we can catch loaded log everywhere in CSS
122
- $("body").addClass("SimpleHistory--isLoaded");
123
-
124
- }
125
-
126
- var arrRows = [];
127
- _.each(resp.data.log_rows, function(row) {
128
- arrRows.push({
129
- html: row
130
- });
131
- });
132
-
133
- return arrRows;
134
- }
135
-
136
- });
137
-
138
- var OccasionsLogRowsCollection = Backbone.Collection.extend({
139
-
140
- initialize: function(models, options) {
141
-
142
- this.url = api_base_url + "&type=occasions&format=html";
143
-
144
- this.fetch({
145
- reset: true,
146
- data: {
147
- logRowID: options.logRowID,
148
- occasionsID: options.occasionsID,
149
- occasionsCount: options.occasionsCount,
150
- occasionsCountMaxReturn: options.occasionsCountMaxReturn
151
- }
152
- });
153
-
154
- },
155
-
156
- parse: function(resp, xhr) {
157
-
158
- this.api_args = resp.data.api_args;
159
- this.max_id = resp.data.max_id;
160
- this.min_id = resp.data.min_id;
161
- this.pages_count = resp.data.pages_count;
162
- this.total_row_count = resp.data.total_row_count;
163
- this.page_rows_from = resp.data.page_rows_from;
164
- this.page_rows_to = resp.data.page_rows_to;
165
-
166
- var arrRows = [];
167
- _.each(resp.data.log_rows, function(row) {
168
- arrRows.push({
169
- html: row
170
- });
171
- });
172
-
173
- return arrRows;
174
- }
175
-
176
- });
177
-
178
- var OccasionsView = Backbone.View.extend({
179
-
180
- initialize: function() {
181
-
182
- var logRowID = this.attributes.logRow.data("rowId");
183
- var occasionsCount = this.attributes.logRow.data("occasionsCount");
184
- var occasionsCountMaxReturn = 15;
185
- this.occasionsCountMaxReturn = occasionsCountMaxReturn;
186
- var occasionsID = this.attributes.logRow.data("occasionsId");
187
-
188
- this.attributes.logRow.addClass("SimpleHistoryLogitem--occasionsOpening");
189
-
190
- this.logRows = new OccasionsLogRowsCollection([], {
191
- logRow: this.attributes.logRow,
192
- logRowID: logRowID,
193
- occasionsID: occasionsID,
194
- occasionsCount: occasionsCount,
195
- occasionsCountMaxReturn: occasionsCountMaxReturn
196
- });
197
-
198
- this.logRows.on("reset", this.render, this);
199
-
200
- // Trigger event for plugins
201
- this.logRows.on("reset", function() {
202
- $(document).trigger("SimpleHistory:logRowsCollectionOccasionsLoaded");
203
- }, this);
204
-
205
- },
206
-
207
- render: function() {
208
-
209
- var $html = $([]);
210
-
211
- this.logRows.each(function(model) {
212
- var $li = $(model.get("html"));
213
- $li.addClass("SimpleHistoryLogitem--occasion");
214
- $html = $html.add($li);
215
- });
216
-
217
- // If occasionsCount is more than occasionsCountMaxReturn then show a message
218
- var occasionsCount = this.attributes.logRow.data("occasionsCount");
219
- if (occasionsCount > this.occasionsCountMaxReturn) {
220
-
221
- var templateTooMany = wp.template("simple-history-occasions-too-many");
222
- $html = $html.add(templateTooMany({ occasionsCount: occasionsCount, occasionsCountMaxReturn: this.occasionsCountMaxReturn }));
223
-
224
- }
225
-
226
- this.$el.html($html);
227
-
228
- this.attributes.logRow.removeClass("SimpleHistoryLogitem--occasionsOpening").addClass("SimpleHistoryLogitem--occasionsOpened");
229
-
230
- this.$el.addClass("haveOccasionsAdded");
231
-
232
- }
233
-
234
- });
235
-
236
- var DetailsModel = Backbone.Model.extend({
237
- url: api_base_url + "&type=single&format=html"
238
- });
239
-
240
- /**
241
- * DetailsView is a modal popup thingie with all info about a LogRow
242
- */
243
- var DetailsView = Backbone.View.extend({
244
-
245
- initialize: function(attributes) {
246
-
247
- this.model.fetch({
248
- data: {
249
- id: this.model.get("id")
250
- }
251
- });
252
-
253
- this.template = $("#tmpl-simple-history-logitems-modal").html();
254
- this.show();
255
-
256
- this.listenTo(this.model, "change", this.render);
257
-
258
- // also close on esc
259
- var view = this;
260
- $(document).on("keydown.simplehistory.modal", function(e) {
261
- if (e.keyCode == 27) {
262
- view.close();
263
- }
264
- });
265
-
266
- },
267
-
268
- events: {
269
- "click .SimpleHistory-modal__background": "close",
270
- "click .SimpleHistory-modal__contentClose": "close"
271
- },
272
-
273
- show: function() {
274
-
275
- var $modalEl = $(".SimpleHistory-modal");
276
-
277
- if (!$modalEl.length) {
278
- $modalEl = $(this.template);
279
- $modalEl.appendTo("body");
280
- }
281
-
282
- this.setElement($modalEl);
283
-
284
- var $modalContentEl = $modalEl.find(".SimpleHistory-modal__content");
285
- $modalContentEl.addClass("SimpleHistory-modal__content--enter");
286
-
287
- // Force repaint before adding active class
288
- var offsetHeight = $modalContentEl.get(0).offsetHeight;
289
- $modalContentEl.addClass("SimpleHistory-modal__content--enter-active");
290
-
291
- },
292
-
293
- close: function() {
294
-
295
- var $modalContentEl = this.$el.find(".SimpleHistory-modal__content");
296
- $modalContentEl.addClass("SimpleHistory-modal__content--leave");
297
-
298
- // Force repaint before adding active class
299
- var offsetHeight = $modalContentEl.get(0).offsetHeight;
300
-
301
- $modalContentEl.addClass("SimpleHistory-modal__content--leave-active");
302
- this.$el.addClass("SimpleHistory-modal__leave-active");
303
-
304
- // Cleanup
305
- var view = this;
306
- setTimeout(function() {
307
- view.$el.remove();
308
- $(document).off("keyup.simplehistory.modal");
309
- view.remove();
310
- Backbone.history.navigate("overview");
311
- }, 400);
312
-
313
- },
314
-
315
- render: function() {
316
-
317
- var $modalContentInnerEl = this.$el.find(".SimpleHistory-modal__contentInner");
318
- var logRowLI = this.model.get("data").log_rows[0];
319
- $modalContentInnerEl.html(logRowLI);
320
-
321
- }
322
-
323
- });
324
-
325
- var RowsView = Backbone.View.extend({
326
-
327
- initialize: function() {
328
-
329
- this.collection.on("reset", this.render, this);
330
- this.collection.on("reload", this.onReload, this);
331
- this.collection.on("reloadDone", this.onReloadDone, this);
332
- this.collection.on("reloadError", this.onReloadError, this);
333
-
334
- // Trigger event for plugins
335
- this.collection.on("reset", function() {
336
- $(document).trigger("SimpleHistory:logLoaded");
337
- }, this);
338
-
339
- },
340
-
341
- onReloadError: function(args) {
342
-
343
- // If we get an error while loading the log it can be because the AJAX response
344
- // is returning parts of HTML because of plugins giving errors
345
- // not our fault, but instead of just ajax spinning forever we can
346
- // tell the user about this perhaps and they can do something about it
347
- // or else they will uninstall the plugin (worst) or post in support forum (better)
348
- // or we can help them solve it here (best)
349
- var response = args[0];
350
-
351
- if ( response && response.responseText ) {
352
-
353
- // console.log( response.responseText );
354
- $("html").removeClass("SimpleHistory-isLoadingPage");
355
- $(".SimpleHistory__waitingForFirstLoad").addClass("SimpleHistory__waitingForFirstLoad--isLoaded");
356
-
357
- var $mainViewElm = this.collection.mainView.$el;
358
- $mainViewElm.addClass("SimpleHistory--ajaxHasErrors");
359
-
360
- var noHitsClass = "SimpleHistoryLogitems__ajaxError";
361
-
362
- // Remove maybe previous div with message
363
- $mainViewElm.find("." + noHitsClass).remove();
364
-
365
- // Add div with message
366
- var $noHitsElm = $("<div />")
367
- .html( "<div class='SimpleHistoryLogitems__ajaxError__infoMessage'>" + simple_history_script_vars.ajaxLoadError + "</div>" + response.responseText )
368
- .addClass(noHitsClass)
369
- .appendTo( $mainViewElm.find(".SimpleHistoryLogitems__above") )
370
- ;
371
-
372
-
373
- }
374
-
375
- },
376
-
377
- onReload: function() {
378
-
379
- $(document).trigger("SimpleHistory:logReloadStart");
380
-
381
- $("html").addClass("SimpleHistory-isLoadingPage");
382
-
383
- },
384
-
385
- onReloadDone: function() {
386
-
387
- $("html").removeClass("SimpleHistory-isLoadingPage");
388
-
389
- var $mainViewElm = this.collection.mainView.$el;
390
-
391
- // Remove maybe previous div with ajax error message
392
- $mainViewElm.find(".SimpleHistoryLogitems__ajaxError").remove();
393
-
394
- // Add message if no hits
395
- $mainViewElm.removeClass("SimpleHistory--hasNoHits");
396
- if (! this.collection.length ) {
397
-
398
- $mainViewElm.addClass("SimpleHistory--hasNoHits");
399
-
400
- var noHitsClass = "SimpleHistoryLogitems__noHits";
401
-
402
- // Remove maybe previous div with message
403
- $mainViewElm.find("." + noHitsClass).remove();
404
-
405
- // Add div with message
406
- var $noHitsElm = $("<div />")
407
- .html( simple_history_script_vars.logNoHits )
408
- .addClass(noHitsClass)
409
- .appendTo( $mainViewElm.find(".SimpleHistoryLogitems__above") )
410
- ;
411
-
412
- } // add msg
413
-
414
- },
415
-
416
- events: {
417
- "click .SimpleHistoryLogitem__occasions a": "showOccasions",
418
- "click .SimpleHistoryLogitem__permalink": "permalink"
419
- },
420
-
421
- permalink: function(e) {
422
-
423
- // If cmd is pressed then don't show modal because then user wants
424
- // to open modal in new window/tab
425
- if (e.metaKey) {
426
- return true;
427
- }
428
-
429
- e.preventDefault();
430
-
431
- var $target = $(e.target);
432
- var $logRow = $target.closest(".SimpleHistoryLogitem");
433
- var logRowID = $logRow.data("rowId");
434
-
435
- Backbone.history.navigate("item/" + logRowID, { trigger: true });
436
-
437
- },
438
-
439
- showOccasions: function(e) {
440
-
441
- e.preventDefault();
442
-
443
- var $target = $(e.target);
444
- var $logRow = $target.closest(".SimpleHistoryLogitem");
445
- var $occasionsElm = $("<li class='SimpleHistoryLogitem__occasionsItemsWrap'><ul class='SimpleHistoryLogitem__occasionsItems'/></li>");
446
-
447
- $logRow.after($occasionsElm);
448
-
449
- this.occasionsView = new OccasionsView({
450
- el: $occasionsElm.find(".SimpleHistoryLogitem__occasionsItems"),
451
- attributes: {
452
- logRow: $logRow
453
- }
454
- });
455
-
456
- },
457
-
458
- render: function() {
459
-
460
- var html = "";
461
- this.collection.each(function(model) {
462
- html += model.get("html");
463
- });
464
-
465
- this.$el.html( html );
466
-
467
- // Rendering of log rows items is done
468
- this.trigger("renderDone");
469
-
470
- }
471
-
472
- });
473
-
474
- var PaginationView = Backbone.View.extend({
475
-
476
- initialize: function() {
477
-
478
- $(document).keydown({ view: this }, this.keyboardNav);
479
-
480
- this.collection.on("reset", this.render, this);
481
-
482
- },
483
-
484
- events: {
485
- "click .SimpleHistoryPaginationLink": "navigateArrow",
486
- "keyup .SimpleHistoryPaginationCurrentPage": "navigateToPage",
487
- "keydown": "keydown"
488
- },
489
-
490
- keyboardNav: function(e) {
491
-
492
- // if modal with details is open then don't nav away
493
- if ($(".SimpleHistory-modal").length) {
494
- return;
495
- }
496
-
497
- // Only go on if on own page
498
- if (!$(".dashboard_page_simple_history_page").length) {
499
- return;
500
- }
501
-
502
- // Don't nav away if a text input (like the search box) is selected
503
- var $target = $(e.target);
504
- if ($target.is("input")) {
505
- return;
506
- }
507
-
508
- var paged;
509
-
510
- if (e.keyCode == 37) {
511
- // prev page
512
- paged = +e.data.view.collection.api_args.paged - 1;
513
- } else if (e.keyCode == 39) {
514
- // next page
515
- paged = +e.data.view.collection.api_args.paged + 1;
516
- }
517
-
518
- if (paged) {
519
- e.data.view.fetchPage(paged);
520
- }
521
-
522
- },
523
-
524
- navigateToPage: function(e) {
525
-
526
- // keycode 13 = enter
527
- if (e.keyCode == 13) {
528
-
529
- var $target = $(e.target);
530
- var paged = parseInt( $target.val() );
531
-
532
- // We must go to a page more than zero and max total_row_count
533
- if (paged < 1) {
534
- paged = 1;
535
- }
536
-
537
- if ( paged > this.collection.pages_count ) {
538
- paged = this.collection.pages_count;
539
- }
540
-
541
- this.fetchPage(paged);
542
-
543
- }
544
-
545
- },
546
-
547
- navigateArrow: function(e) {
548
-
549
- e.preventDefault();
550
- var $target = $(e.target);
551
-
552
- // if link has class disabled then don't nav away
553
- if ($target.is(".disabled")) {
554
- return;
555
- }
556
-
557
- // direction = first|prev|next|last
558
- var direction = $target.data("direction");
559
-
560
- var paged;
561
- switch (direction) {
562
-
563
- case "first":
564
- paged = 1;
565
- break;
566
-
567
- case "last":
568
- paged = this.collection.pages_count;
569
- break;
570
-
571
- case "prev":
572
- paged = +this.collection.api_args.paged - 1;
573
- break;
574
-
575
- case "next":
576
- paged = +this.collection.api_args.paged + 1;
577
- break;
578
-
579
- }
580
-
581
- this.fetchPage(paged);
582
-
583
- },
584
-
585
- /**
586
- * Fetch a page from the server
587
- * Calls collection.fetch with the page we want to view as argument
588
- */
589
- fetchPage: function(paged) {
590
-
591
- $(document).trigger("SimpleHistory:logReloadStart");
592
-
593
- $("html").addClass("SimpleHistory-isLoadingPage");
594
-
595
- var url_data = {
596
- paged: paged,
597
- max_id_first_page: this.collection.max_id_first_page
598
- };
599
-
600
- this.collection.trigger("before_fetch", this.collection, url_data);
601
-
602
- // nav = fetch collection items again
603
- this.collection.fetch({
604
- reset: true,
605
- data: url_data,
606
- success: function() {
607
- $("html").removeClass("SimpleHistory-isLoadingPage");
608
- }
609
- });
610
-
611
- // Scroll to top of el
612
- $("html, body").animate({
613
- scrollTop: this.attributes.mainView.$el.offset().top - 85
614
- }, 350);
615
-
616
- },
617
-
618
- render: function() {
619
-
620
- var compiled = wp.template("simple-history-logitems-pagination");
621
-
622
- this.$el.html( compiled({
623
- min_id: this.collection.min_id,
624
- max_id: this.collection.max_id,
625
- pages_count: this.collection.pages_count,
626
- total_row_count: this.collection.total_row_count,
627
- page_rows_from: this.collection.page_rows_from,
628
- page_rows_to: this.collection.page_rows_to,
629
- api_args: this.collection.api_args,
630
- strings: simple_history_script_vars.pagination
631
- }) );
632
-
633
- }
634
-
635
- });
636
-
637
- var MainView = Backbone.View.extend({
638
-
639
- el: ".SimpleHistoryGui",
640
-
641
- initialize: function() {
642
-
643
- this.addNeededElements();
644
-
645
- },
646
-
647
- manualInitialize: function() {
648
-
649
- // Don't try to init if our element does not exist
650
- if (!this.$el.length) {
651
- return;
652
- }
653
-
654
- this.logRouter = new LogRouter();
655
- Backbone.history.start();
656
-
657
- this.logRowsCollection = new LogRowsCollection([], {
658
- mainView: this,
659
- });
660
-
661
- this.rowsView = new RowsView({
662
- el: this.$el.find(".SimpleHistoryLogitems"),
663
- collection: this.logRowsCollection
664
- });
665
-
666
- $(document).trigger("SimpleHistory:mainViewInitBeforeLoadRows");
667
-
668
- // Load log first time
669
- this.logRowsCollection.reload();
670
-
671
- $(document).trigger("SimpleHistory:mainViewInitAfterLoadRows");
672
-
673
- this.paginationView = new PaginationView({
674
- el: this.$el.find(".SimpleHistoryLogitems__pagination"),
675
- collection: this.logRowsCollection,
676
- attributes: {
677
- mainView: this
678
- }
679
- });
680
-
681
- $(document).trigger("SimpleHistory:init");
682
-
683
- },
684
-
685
- /**
686
- * Add the elements needed for the GUI
687
- */
688
- addNeededElements: function() {
689
-
690
- var template = $("#tmpl-simple-history-base").html();
691
- this.$el.html( template );
692
-
693
- },
694
-
695
-
696
- });
697
-
698
- var LogRouter = Backbone.Router.extend({
699
-
700
- routes: {
701
- "item/:number": "item",
702
- '*default': 'default'
703
- },
704
-
705
- item: function(logRowID) {
706
-
707
- var detailsModel = new DetailsModel({
708
- id: logRowID
709
- });
710
-
711
- var detailsView = new DetailsView({
712
- model: detailsModel
713
- });
714
-
715
- },
716
-
717
- default: function() {
718
-
719
- return false;
720
-
721
- }
722
-
723
- });
724
-
725
- var mainView = new MainView();
726
-
727
- // Init MainView on domReady
728
- // This is to make sure dropins and plugins have been loaded
729
- $(document).ready(function() {
730
-
731
- mainView.manualInitialize();
732
-
733
- });
734
-
735
- return mainView;
736
-
737
- })(jQuery);
738
 
739
  /**
740
  * When the clear-log-button in admin is clicked then check that users really wants to clear the log
741
  */
742
- jQuery(".js-SimpleHistory-Settings-ClearLog").on("click", function(e) {
743
-
744
- if (confirm(simple_history_script_vars.settingsConfirmClearLog)) {
745
- return;
746
- } else {
747
- e.preventDefault();
748
- }
749
-
750
  });
751
 
752
  /**
753
- * Add support for TimeAgo
754
  */
755
- (function($) {
756
-
757
- var $document = $(document);
758
-
759
- // called on first load + on pagination
760
- $document.on("SimpleHistory:logLoaded", addTimeAgo);
761
-
762
- // when log is loaded and when occassions are loaded
763
- $document.on("SimpleHistory:logRowsCollectionOccasionsLoaded", addTimeAgo);
764
-
765
-
766
- function addTimeAgo() {
767
-
768
- $(".SimpleHistoryLogitem__when time").timeago();
769
-
770
- }
771
 
 
 
772
 
773
- })(jQuery);
 
774
 
 
 
 
 
 
 
1
+ /* jshint multistr: true */
2
+
3
+ var simple_history = (function ($) {
4
+ var api_base_url = window.ajaxurl
5
+
6
+ // Plugins may have modified the Ajax URL so it already contains query params
7
+ if (api_base_url.indexOf('?') >= 0) {
8
+ api_base_url += '&'
9
+ } else {
10
+ api_base_url += '?'
11
+ }
12
+
13
+ api_base_url += 'action=simple_history_api'
14
+
15
+ var debug = function (what) {
16
+ if (typeof what === 'object') {
17
+ var newWhat = ''
18
+
19
+ _.each(what, function (val, key) {
20
+ newWhat += key + ': ' + val + '\n'
21
+ })
22
+
23
+ what = newWhat
24
+ }
25
+
26
+ $('.SimpleHistoryLogitems__debug').append('<br>' + what)
27
+ }
28
+
29
+ var LogRowsCollection = Backbone.Collection.extend({
30
+ initialize: function (models, options) {
31
+ this.mainView = options.mainView
32
+
33
+ $(document).trigger('SimpleHistory:logRowsCollectionInitialize')
34
+ },
35
+
36
+ reload: function () {
37
+ this.trigger('reload')
38
+ $(document).trigger('SimpleHistory:logRowsCollectionReload')
39
+
40
+ var pager_size = this.mainView.$el.data('pagerSize')
41
+ this.url = api_base_url + '&type=overview&format=html'
42
+ this.url += '&posts_per_page=' + pager_size
43
+
44
+ // Reset some vars
45
+ this.api_args = null
46
+ this.max_id = null
47
+ this.min_id = null
48
+ this.pages_count = null
49
+ this.total_row_count = null
50
+ this.page_rows_from = null
51
+ this.page_rows_to = null
52
+ this.max_id_first_page = null
53
+
54
+ // Get first page
55
+ // We don't have max_id yet
56
+ var that = this
57
+ var url_data = {
58
+ paged: 1
59
+ // here we want to append custom args/data for filters
60
+ }
61
+
62
+ // trigger so plugins can modify url parameters
63
+ this.trigger('before_fetch', this, url_data)
64
+
65
+ this.fetch({
66
+ reset: true,
67
+ data: url_data,
68
+ // called on 404 and similar
69
+ error: function (collection, response, options) {
70
+ collection.trigger('reloadError', [response, options])
71
+ $(document).trigger('SimpleHistory:logRowsCollectionReloadError', [
72
+ response,
73
+ options
74
+ ])
75
+ },
76
+ success: function (collection, response, options) {
77
+ collection.trigger('reloadDone', [response, options])
78
+ $(document).trigger('SimpleHistory:logRowsCollectionReloadDone', [
79
+ response,
80
+ options
81
+ ])
82
+ }
83
+ })
84
+ },
85
+
86
+ /*
87
+ * Parse ajax response to make it fit to format used by backbone
88
+ */
89
+ parse: function (resp, xhr) {
90
+ if (!resp || !resp.data) {
91
+ alert('Error in response, could not parse')
92
+ return
93
+ }
94
+
95
+ this.api_args = resp.data.api_args
96
+ this.max_id = resp.data.max_id
97
+ this.min_id = resp.data.min_id
98
+ this.pages_count = resp.data.pages_count
99
+ this.total_row_count = resp.data.total_row_count
100
+ this.page_rows_from = resp.data.page_rows_from
101
+ this.page_rows_to = resp.data.page_rows_to
102
+
103
+ // Store first max_id found, since that's the max id we use for
104
+ // all subsequent paginations
105
+ if (!this.max_id_first_page) {
106
+ this.max_id_first_page = this.max_id
107
+ $(document).trigger('SimpleHistory:logRowsCollectionFirstLoad')
108
+
109
+ $('.SimpleHistory__waitingForFirstLoad').addClass(
110
+ 'SimpleHistory__waitingForFirstLoad--isLoaded'
111
+ )
112
+
113
+ // Add class to body to so we can catch loaded log everywhere in CSS
114
+ $('body').addClass('SimpleHistory--isLoaded')
115
+ }
116
+
117
+ var arrRows = []
118
+ _.each(resp.data.log_rows, function (row) {
119
+ arrRows.push({
120
+ html: row
121
+ })
122
+ })
123
+
124
+ return arrRows
125
+ }
126
+ })
127
+
128
+ var OccasionsLogRowsCollection = Backbone.Collection.extend({
129
+ initialize: function (models, options) {
130
+ this.url = api_base_url + '&type=occasions&format=html'
131
+
132
+ this.fetch({
133
+ reset: true,
134
+ data: {
135
+ logRowID: options.logRowID,
136
+ occasionsID: options.occasionsID,
137
+ occasionsCount: options.occasionsCount,
138
+ occasionsCountMaxReturn: options.occasionsCountMaxReturn
139
+ }
140
+ })
141
+ },
142
+
143
+ parse: function (resp, xhr) {
144
+ this.api_args = resp.data.api_args
145
+ this.max_id = resp.data.max_id
146
+ this.min_id = resp.data.min_id
147
+ this.pages_count = resp.data.pages_count
148
+ this.total_row_count = resp.data.total_row_count
149
+ this.page_rows_from = resp.data.page_rows_from
150
+ this.page_rows_to = resp.data.page_rows_to
151
+
152
+ var arrRows = []
153
+ _.each(resp.data.log_rows, function (row) {
154
+ arrRows.push({
155
+ html: row
156
+ })
157
+ })
158
+
159
+ return arrRows
160
+ }
161
+ })
162
+
163
+ var OccasionsView = Backbone.View.extend({
164
+ initialize: function () {
165
+ var logRowID = this.attributes.logRow.data('rowId')
166
+ var occasionsCount = this.attributes.logRow.data('occasionsCount')
167
+ var occasionsCountMaxReturn = 15
168
+ this.occasionsCountMaxReturn = occasionsCountMaxReturn
169
+ var occasionsID = this.attributes.logRow.data('occasionsId')
170
+
171
+ this.attributes.logRow.addClass('SimpleHistoryLogitem--occasionsOpening')
172
+
173
+ this.logRows = new OccasionsLogRowsCollection([], {
174
+ logRow: this.attributes.logRow,
175
+ logRowID: logRowID,
176
+ occasionsID: occasionsID,
177
+ occasionsCount: occasionsCount,
178
+ occasionsCountMaxReturn: occasionsCountMaxReturn
179
+ })
180
+
181
+ this.logRows.on('reset', this.render, this)
182
+
183
+ // Trigger event for plugins
184
+ this.logRows.on(
185
+ 'reset',
186
+ function () {
187
+ $(document).trigger('SimpleHistory:logRowsCollectionOccasionsLoaded')
188
+ },
189
+ this
190
+ )
191
+ },
192
+
193
+ render: function () {
194
+ var $html = $([])
195
+
196
+ this.logRows.each(function (model) {
197
+ var $li = $(model.get('html'))
198
+ $li.addClass('SimpleHistoryLogitem--occasion')
199
+ $html = $html.add($li)
200
+ })
201
+
202
+ // If occasionsCount is more than occasionsCountMaxReturn then show a message
203
+ var occasionsCount = this.attributes.logRow.data('occasionsCount')
204
+ if (occasionsCount > this.occasionsCountMaxReturn) {
205
+ var templateTooMany = wp.template('simple-history-occasions-too-many')
206
+ $html = $html.add(
207
+ templateTooMany({
208
+ occasionsCount: occasionsCount,
209
+ occasionsCountMaxReturn: this.occasionsCountMaxReturn
210
+ })
211
+ )
212
+ }
213
+
214
+ this.$el.html($html)
215
+
216
+ this.attributes.logRow
217
+ .removeClass('SimpleHistoryLogitem--occasionsOpening')
218
+ .addClass('SimpleHistoryLogitem--occasionsOpened')
219
+
220
+ this.$el.addClass('haveOccasionsAdded')
221
+ }
222
+ })
223
+
224
+ var DetailsModel = Backbone.Model.extend({
225
+ url: api_base_url + '&type=single&format=html'
226
+ })
227
+
228
+ /**
229
+ * DetailsView is a modal popup thingie with all info about a LogRow
230
+ */
231
+ var DetailsView = Backbone.View.extend({
232
+ initialize: function (attributes) {
233
+ this.model.fetch({
234
+ data: {
235
+ id: this.model.get('id')
236
+ }
237
+ })
238
+
239
+ this.template = $('#tmpl-simple-history-logitems-modal').html()
240
+ this.show()
241
+
242
+ this.listenTo(this.model, 'change', this.render)
243
+
244
+ // also close on esc
245
+ var view = this
246
+ $(document).on('keydown.simplehistory.modal', function (e) {
247
+ if (e.keyCode == 27) {
248
+ view.close()
249
+ }
250
+ })
251
+ },
252
+
253
+ events: {
254
+ 'click .SimpleHistory-modal__background': 'close',
255
+ 'click .SimpleHistory-modal__contentClose': 'close'
256
+ },
257
+
258
+ show: function () {
259
+ var $modalEl = $('.SimpleHistory-modal')
260
+
261
+ if (!$modalEl.length) {
262
+ $modalEl = $(this.template)
263
+ $modalEl.appendTo('body')
264
+ }
265
+
266
+ this.setElement($modalEl)
267
+
268
+ var $modalContentEl = $modalEl.find('.SimpleHistory-modal__content')
269
+ $modalContentEl.addClass('SimpleHistory-modal__content--enter')
270
+
271
+ // Force repaint before adding active class
272
+ var offsetHeight = $modalContentEl.get(0).offsetHeight
273
+ $modalContentEl.addClass('SimpleHistory-modal__content--enter-active')
274
+ },
275
+
276
+ close: function () {
277
+ var $modalContentEl = this.$el.find('.SimpleHistory-modal__content')
278
+ $modalContentEl.addClass('SimpleHistory-modal__content--leave')
279
+
280
+ // Force repaint before adding active class
281
+ var offsetHeight = $modalContentEl.get(0).offsetHeight
282
+
283
+ $modalContentEl.addClass('SimpleHistory-modal__content--leave-active')
284
+ this.$el.addClass('SimpleHistory-modal__leave-active')
285
+
286
+ // Cleanup
287
+ var view = this
288
+ setTimeout(function () {
289
+ view.$el.remove()
290
+ $(document).off('keyup.simplehistory.modal')
291
+ view.remove()
292
+ Backbone.history.navigate('overview')
293
+ }, 400)
294
+ },
295
+
296
+ render: function () {
297
+ var $modalContentInnerEl = this.$el.find(
298
+ '.SimpleHistory-modal__contentInner'
299
+ )
300
+ var logRowLI = this.model.get('data').log_rows[0]
301
+ $modalContentInnerEl.html(logRowLI)
302
+ }
303
+ })
304
+
305
+ var RowsView = Backbone.View.extend({
306
+ initialize: function () {
307
+ this.collection.on('reset', this.render, this)
308
+ this.collection.on('reload', this.onReload, this)
309
+ this.collection.on('reloadDone', this.onReloadDone, this)
310
+ this.collection.on('reloadError', this.onReloadError, this)
311
+
312
+ // Trigger event for plugins
313
+ this.collection.on(
314
+ 'reset',
315
+ function () {
316
+ $(document).trigger('SimpleHistory:logLoaded')
317
+ },
318
+ this
319
+ )
320
+ },
321
+
322
+ onReloadError: function (args) {
323
+ // If we get an error while loading the log it can be because the AJAX response
324
+ // is returning parts of HTML because of plugins giving errors
325
+ // not our fault, but instead of just ajax spinning forever we can
326
+ // tell the user about this perhaps and they can do something about it
327
+ // or else they will uninstall the plugin (worst) or post in support forum (better)
328
+ // or we can help them solve it here (best)
329
+ var response = args[0]
330
+
331
+ if (response && response.responseText) {
332
+ // console.log( response.responseText );
333
+ $('html').removeClass('SimpleHistory-isLoadingPage')
334
+ $('.SimpleHistory__waitingForFirstLoad').addClass(
335
+ 'SimpleHistory__waitingForFirstLoad--isLoaded'
336
+ )
337
+
338
+ var $mainViewElm = this.collection.mainView.$el
339
+ $mainViewElm.addClass('SimpleHistory--ajaxHasErrors')
340
+
341
+ var noHitsClass = 'SimpleHistoryLogitems__ajaxError'
342
+
343
+ // Remove maybe previous div with message
344
+ $mainViewElm.find('.' + noHitsClass).remove()
345
+
346
+ // Add div with message
347
+ var $noHitsElm = $('<div />')
348
+ .html(
349
+ "<div class='SimpleHistoryLogitems__ajaxError__infoMessage'>" +
350
+ simple_history_script_vars.ajaxLoadError +
351
+ '</div>' +
352
+ response.responseText
353
+ )
354
+ .addClass(noHitsClass)
355
+ .appendTo($mainViewElm.find('.SimpleHistoryLogitems__above'))
356
+ }
357
+ },
358
+
359
+ onReload: function () {
360
+ $(document).trigger('SimpleHistory:logReloadStart')
361
+
362
+ $('html').addClass('SimpleHistory-isLoadingPage')
363
+ },
364
+
365
+ onReloadDone: function () {
366
+ $('html').removeClass('SimpleHistory-isLoadingPage')
367
+
368
+ var $mainViewElm = this.collection.mainView.$el
369
+
370
+ // Remove maybe previous div with ajax error message
371
+ $mainViewElm.find('.SimpleHistoryLogitems__ajaxError').remove()
372
+
373
+ // Add message if no hits
374
+ $mainViewElm.removeClass('SimpleHistory--hasNoHits')
375
+ if (!this.collection.length) {
376
+ $mainViewElm.addClass('SimpleHistory--hasNoHits')
377
+
378
+ var noHitsClass = 'SimpleHistoryLogitems__noHits'
379
+
380
+ // Remove maybe previous div with message
381
+ $mainViewElm.find('.' + noHitsClass).remove()
382
+
383
+ // Add div with message
384
+ var $noHitsElm = $('<div />')
385
+ .html(simple_history_script_vars.logNoHits)
386
+ .addClass(noHitsClass)
387
+ .appendTo($mainViewElm.find('.SimpleHistoryLogitems__above'))
388
+ } // add msg
389
+ },
390
+
391
+ events: {
392
+ 'click .SimpleHistoryLogitem__occasions a': 'showOccasions',
393
+ 'click .SimpleHistoryLogitem__permalink': 'permalink'
394
+ },
395
+
396
+ permalink: function (e) {
397
+ // If cmd is pressed then don't show modal because then user wants
398
+ // to open modal in new window/tab
399
+ if (e.metaKey) {
400
+ return true
401
+ }
402
+
403
+ e.preventDefault()
404
+
405
+ var $target = $(e.target)
406
+ var $logRow = $target.closest('.SimpleHistoryLogitem')
407
+ var logRowID = $logRow.data('rowId')
408
+
409
+ Backbone.history.navigate('item/' + logRowID, { trigger: true })
410
+ },
411
+
412
+ showOccasions: function (e) {
413
+ e.preventDefault()
414
+
415
+ var $target = $(e.target)
416
+ var $logRow = $target.closest('.SimpleHistoryLogitem')
417
+ var $occasionsElm = $(
418
+ "<li class='SimpleHistoryLogitem__occasionsItemsWrap'><ul class='SimpleHistoryLogitem__occasionsItems'/></li>"
419
+ )
420
+
421
+ $logRow.after($occasionsElm)
422
+
423
+ this.occasionsView = new OccasionsView({
424
+ el: $occasionsElm.find('.SimpleHistoryLogitem__occasionsItems'),
425
+ attributes: {
426
+ logRow: $logRow
427
+ }
428
+ })
429
+ },
430
+
431
+ render: function () {
432
+ var html = ''
433
+ this.collection.each(function (model) {
434
+ html += model.get('html')
435
+ })
436
+
437
+ this.$el.html(html)
438
+
439
+ // Rendering of log rows items is done
440
+ this.trigger('renderDone')
441
+ }
442
+ })
443
+
444
+ var PaginationView = Backbone.View.extend({
445
+ initialize: function () {
446
+ $(document).keydown({ view: this }, this.keyboardNav)
447
+
448
+ this.collection.on('reset', this.render, this)
449
+ },
450
+
451
+ events: {
452
+ 'click .SimpleHistoryPaginationLink': 'navigateArrow',
453
+ 'keyup .SimpleHistoryPaginationCurrentPage': 'navigateToPage',
454
+ keydown: 'keydown'
455
+ },
456
+
457
+ keyboardNav: function (e) {
458
+ // if modal with details is open then don't nav away
459
+ if ($('.SimpleHistory-modal').length) {
460
+ return
461
+ }
462
+
463
+ // Only go on if on own page
464
+ if (!$('.dashboard_page_simple_history_page').length) {
465
+ return
466
+ }
467
+
468
+ // Don't nav away if a text input (like the search box) is selected
469
+ var $target = $(e.target)
470
+ if ($target.is('input')) {
471
+ return
472
+ }
473
+
474
+ var paged
475
+
476
+ if (e.keyCode == 37) {
477
+ // prev page
478
+ paged = +e.data.view.collection.api_args.paged - 1
479
+ } else if (e.keyCode == 39) {
480
+ // next page
481
+ paged = +e.data.view.collection.api_args.paged + 1
482
+ }
483
+
484
+ if (paged) {
485
+ e.data.view.fetchPage(paged)
486
+ }
487
+ },
488
+
489
+ navigateToPage: function (e) {
490
+ // keycode 13 = enter
491
+ if (e.keyCode == 13) {
492
+ var $target = $(e.target)
493
+ var paged = parseInt($target.val())
494
+
495
+ // We must go to a page more than zero and max total_row_count
496
+ if (paged < 1) {
497
+ paged = 1
498
+ }
499
+
500
+ if (paged > this.collection.pages_count) {
501
+ paged = this.collection.pages_count
502
+ }
503
+
504
+ this.fetchPage(paged)
505
+ }
506
+ },
507
+
508
+ navigateArrow: function (e) {
509
+ e.preventDefault()
510
+ var $target = $(e.target)
511
+
512
+ // if link has class disabled then don't nav away
513
+ if ($target.is('.disabled')) {
514
+ return
515
+ }
516
+
517
+ // direction = first|prev|next|last
518
+ var direction = $target.data('direction')
519
+
520
+ var paged
521
+ switch (direction) {
522
+ case 'first':
523
+ paged = 1
524
+ break
525
+
526
+ case 'last':
527
+ paged = this.collection.pages_count
528
+ break
529
+
530
+ case 'prev':
531
+ paged = +this.collection.api_args.paged - 1
532
+ break
533
+
534
+ case 'next':
535
+ paged = +this.collection.api_args.paged + 1
536
+ break
537
+ }
538
+
539
+ this.fetchPage(paged)
540
+ },
541
+
542
+ /**
543
+ * Fetch a page from the server
544
+ * Calls collection.fetch with the page we want to view as argument
545
+ */
546
+ fetchPage: function (paged) {
547
+ $(document).trigger('SimpleHistory:logReloadStart')
548
+
549
+ $('html').addClass('SimpleHistory-isLoadingPage')
550
+
551
+ var url_data = {
552
+ paged: paged,
553
+ max_id_first_page: this.collection.max_id_first_page
554
+ }
555
+
556
+ this.collection.trigger('before_fetch', this.collection, url_data)
557
+
558
+ // nav = fetch collection items again
559
+ this.collection.fetch({
560
+ reset: true,
561
+ data: url_data,
562
+ success: function () {
563
+ $('html').removeClass('SimpleHistory-isLoadingPage')
564
+ }
565
+ })
566
+
567
+ // Scroll to top of el
568
+ $('html, body').animate(
569
+ {
570
+ scrollTop: this.attributes.mainView.$el.offset().top - 85
571
+ },
572
+ 350
573
+ )
574
+ },
575
+
576
+ render: function () {
577
+ var compiled = wp.template('simple-history-logitems-pagination')
578
+
579
+ this.$el.html(
580
+ compiled({
581
+ min_id: this.collection.min_id,
582
+ max_id: this.collection.max_id,
583
+ pages_count: this.collection.pages_count,
584
+ total_row_count: this.collection.total_row_count,
585
+ page_rows_from: this.collection.page_rows_from,
586
+ page_rows_to: this.collection.page_rows_to,
587
+ api_args: this.collection.api_args,
588
+ strings: simple_history_script_vars.pagination
589
+ })
590
+ )
591
+ }
592
+ })
593
+
594
+ var MainView = Backbone.View.extend({
595
+ el: '.SimpleHistoryGui',
596
+
597
+ initialize: function () {
598
+ this.addNeededElements()
599
+ },
600
+
601
+ manualInitialize: function () {
602
+ // Don't try to init if our element does not exist
603
+ if (!this.$el.length) {
604
+ return
605
+ }
606
+
607
+ this.logRouter = new LogRouter()
608
+ Backbone.history.start()
609
+
610
+ this.logRowsCollection = new LogRowsCollection([], {
611
+ mainView: this
612
+ })
613
+
614
+ this.rowsView = new RowsView({
615
+ el: this.$el.find('.SimpleHistoryLogitems'),
616
+ collection: this.logRowsCollection
617
+ })
618
+
619
+ $(document).trigger('SimpleHistory:mainViewInitBeforeLoadRows')
620
+
621
+ // Load log first time
622
+ this.logRowsCollection.reload()
623
+
624
+ $(document).trigger('SimpleHistory:mainViewInitAfterLoadRows')
625
+
626
+ this.paginationView = new PaginationView({
627
+ el: this.$el.find('.SimpleHistoryLogitems__pagination'),
628
+ collection: this.logRowsCollection,
629
+ attributes: {
630
+ mainView: this
631
+ }
632
+ })
633
+
634
+ $(document).trigger('SimpleHistory:init')
635
+ },
636
+
637
+ /**
638
+ * Add the elements needed for the GUI
639
+ */
640
+ addNeededElements: function () {
641
+ var template = $('#tmpl-simple-history-base').html()
642
+ this.$el.html(template)
643
+ }
644
+ })
645
+
646
+ var LogRouter = Backbone.Router.extend({
647
+ routes: {
648
+ 'item/:number': 'item',
649
+ '*default': 'default'
650
+ },
651
+
652
+ item: function (logRowID) {
653
+ var detailsModel = new DetailsModel({
654
+ id: logRowID
655
+ })
656
+
657
+ var detailsView = new DetailsView({
658
+ model: detailsModel
659
+ })
660
+ },
661
+
662
+ default: function () {
663
+ return false
664
+ }
665
+ })
666
+
667
+ var mainView = new MainView()
668
+
669
+ // Init MainView on domReady
670
+ // This is to make sure dropins and plugins have been loaded
671
+ $(document).ready(function () {
672
+ mainView.manualInitialize()
673
+ })
674
+
675
+ return mainView
676
+ })(jQuery)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
677
 
678
  /**
679
  * When the clear-log-button in admin is clicked then check that users really wants to clear the log
680
  */
681
+ jQuery('.js-SimpleHistory-Settings-ClearLog').on('click', function (e) {
682
+ if (confirm(simple_history_script_vars.settingsConfirmClearLog)) {
683
+ } else {
684
+ e.preventDefault()
685
+ }
 
 
 
686
  });
687
 
688
  /**
689
+ * Add support for TimeAgo.
690
  */
691
+ (function ($) {
692
+ var $document = $(document)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
693
 
694
+ // Called on first load + on pagination.
695
+ $document.on('SimpleHistory:logLoaded', addTimeAgo)
696
 
697
+ // Called log is loaded and when occassions are loaded.
698
+ $document.on('SimpleHistory:logRowsCollectionOccasionsLoaded', addTimeAgo)
699
 
700
+ function addTimeAgo () {
701
+ $(
702
+ '.SimpleHistoryLogitem__when time.SimpleHistoryLogitem__when__liveRelative'
703
+ ).timeago()
704
+ }
705
+ })(jQuery)
js/select2-3.5.1-old/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 Licesnse 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.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/README.md DELETED
@@ -1,99 +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://ivaynberg.github.com/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 JSDliver](http://www.jsdelivr.com/#!select2), [download it from this GitHub repo](https://github.com/ivaynberg/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.com/#directives-select2) ([AngularJS](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
-
48
- ### Example Integrations
49
-
50
- * [Knockout.js](https://github.com/ivaynberg/select2/wiki/Knockout.js-Integration)
51
- * [Socket.IO](https://github.com/ivaynberg/select2/wiki/Socket.IO-Integration)
52
- * [PHP](https://github.com/ivaynberg/select2/wiki/PHP-Example)
53
- * [.Net MVC] (https://github.com/ivaynberg/select2/wiki/.Net-MVC-Example)
54
-
55
- Internationalization (i18n)
56
- ---------------------------
57
-
58
- Select2 supports multiple languages by simply including the right language JS
59
- file (`select2_locale_it.js`, `select2_locale_nl.js`, etc.) after `select2.js`.
60
-
61
- Missing a language? Just copy `select2_locale_en.js.template`, translate
62
- it, and make a pull request back to Select2 here on GitHub.
63
-
64
- Bug tracker
65
- -----------
66
-
67
- Have a bug? Please create an issue here on GitHub!
68
-
69
- https://github.com/ivaynberg/select2/issues
70
-
71
- Mailing list
72
- ------------
73
-
74
- Have a question? Ask on our mailing list!
75
-
76
- select2@googlegroups.com
77
-
78
- https://groups.google.com/d/forum/select2
79
-
80
-
81
- Copyright and license
82
- ---------------------
83
-
84
- Copyright 2012 Igor Vaynberg
85
-
86
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
87
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
88
- use of this software only upon the condition that you accept all of the terms of either the Apache
89
- License or the GPL License.
90
-
91
- You may obtain a copy of the Apache License and the GPL License in the LICENSE file, or at:
92
-
93
- http://www.apache.org/licenses/LICENSE-2.0
94
- http://www.gnu.org/licenses/gpl-2.0.html
95
-
96
- Unless required by applicable law or agreed to in writing, software distributed under the Apache License
97
- or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
98
- either express or implied. See the Apache License and the GPL License for the specific language governing
99
- permissions and limitations under the Apache License and the GPL License.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/bower.json DELETED
@@ -1,8 +0,0 @@
1
- {
2
- "name": "select2",
3
- "version": "3.5.1",
4
- "main": ["select2.js", "select2.css", "select2.png", "select2x2.png", "select2-spinner.gif"],
5
- "dependencies": {
6
- "jquery": ">= 1.7.1"
7
- }
8
- }
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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.1",
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
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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.1",
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
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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.1",
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
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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="github"
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"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2-spinner.gif DELETED
Binary file
js/select2-3.5.1-old/select2.css DELETED
@@ -1,704 +0,0 @@
1
- /*
2
- Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
3
- */
4
- .select2-container {
5
- margin: 0;
6
- position: relative;
7
- display: inline-block;
8
- /* inline-block for ie7 */
9
- zoom: 1;
10
- *display: inline;
11
- vertical-align: middle;
12
- }
13
-
14
- .select2-container,
15
- .select2-drop,
16
- .select2-search,
17
- .select2-search input {
18
- /*
19
- Force border-box so that % widths fit the parent
20
- container without overlap because of margin/padding.
21
- More Info : http://www.quirksmode.org/css/box.html
22
- */
23
- -webkit-box-sizing: border-box; /* webkit */
24
- -moz-box-sizing: border-box; /* firefox */
25
- box-sizing: border-box; /* css3 */
26
- }
27
-
28
- .select2-container .select2-choice {
29
- display: block;
30
- height: 26px;
31
- padding: 0 0 0 8px;
32
- overflow: hidden;
33
- position: relative;
34
-
35
- border: 1px solid #aaa;
36
- white-space: nowrap;
37
- line-height: 26px;
38
- color: #444;
39
- text-decoration: none;
40
-
41
- border-radius: 4px;
42
-
43
- background-clip: padding-box;
44
-
45
- -webkit-touch-callout: none;
46
- -webkit-user-select: none;
47
- -moz-user-select: none;
48
- -ms-user-select: none;
49
- user-select: none;
50
-
51
- background-color: #fff;
52
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
53
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
54
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
55
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
56
- background-image: linear-gradient(to top, #eee 0%, #fff 50%);
57
- }
58
-
59
- html[dir="rtl"] .select2-container .select2-choice {
60
- padding: 0 8px 0 0;
61
- }
62
-
63
- .select2-container.select2-drop-above .select2-choice {
64
- border-bottom-color: #aaa;
65
-
66
- border-radius: 0 0 4px 4px;
67
-
68
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
69
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
70
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
71
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
72
- background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
73
- }
74
-
75
- .select2-container.select2-allowclear .select2-choice .select2-chosen {
76
- margin-right: 42px;
77
- }
78
-
79
- .select2-container .select2-choice > .select2-chosen {
80
- margin-right: 26px;
81
- display: block;
82
- overflow: hidden;
83
-
84
- white-space: nowrap;
85
-
86
- text-overflow: ellipsis;
87
- float: none;
88
- width: auto;
89
- }
90
-
91
- html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
92
- margin-left: 26px;
93
- margin-right: 0;
94
- }
95
-
96
- .select2-container .select2-choice abbr {
97
- display: none;
98
- width: 12px;
99
- height: 12px;
100
- position: absolute;
101
- right: 24px;
102
- top: 8px;
103
-
104
- font-size: 1px;
105
- text-decoration: none;
106
-
107
- border: 0;
108
- background: url('select2.png') right top no-repeat;
109
- cursor: pointer;
110
- outline: 0;
111
- }
112
-
113
- .select2-container.select2-allowclear .select2-choice abbr {
114
- display: inline-block;
115
- }
116
-
117
- .select2-container .select2-choice abbr:hover {
118
- background-position: right -11px;
119
- cursor: pointer;
120
- }
121
-
122
- .select2-drop-mask {
123
- border: 0;
124
- margin: 0;
125
- padding: 0;
126
- position: fixed;
127
- left: 0;
128
- top: 0;
129
- min-height: 100%;
130
- min-width: 100%;
131
- height: auto;
132
- width: auto;
133
- opacity: 0;
134
- z-index: 9998;
135
- /* styles required for IE to work */
136
- background-color: #fff;
137
- filter: alpha(opacity=0);
138
- }
139
-
140
- .select2-drop {
141
- width: 100%;
142
- margin-top: -1px;
143
- position: absolute;
144
- z-index: 9999;
145
- top: 100%;
146
-
147
- background: #fff;
148
- color: #000;
149
- border: 1px solid #aaa;
150
- border-top: 0;
151
-
152
- border-radius: 0 0 4px 4px;
153
-
154
- -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
155
- box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
156
- }
157
-
158
- .select2-drop.select2-drop-above {
159
- margin-top: 1px;
160
- border-top: 1px solid #aaa;
161
- border-bottom: 0;
162
-
163
- border-radius: 4px 4px 0 0;
164
-
165
- -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
166
- box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
167
- }
168
-
169
- .select2-drop-active {
170
- border: 1px solid #5897fb;
171
- border-top: none;
172
- }
173
-
174
- .select2-drop.select2-drop-above.select2-drop-active {
175
- border-top: 1px solid #5897fb;
176
- }
177
-
178
- .select2-drop-auto-width {
179
- border-top: 1px solid #aaa;
180
- width: auto;
181
- }
182
-
183
- .select2-drop-auto-width .select2-search {
184
- padding-top: 4px;
185
- }
186
-
187
- .select2-container .select2-choice .select2-arrow {
188
- display: inline-block;
189
- width: 18px;
190
- height: 100%;
191
- position: absolute;
192
- right: 0;
193
- top: 0;
194
-
195
- border-left: 1px solid #aaa;
196
- border-radius: 0 4px 4px 0;
197
-
198
- background-clip: padding-box;
199
-
200
- background: #ccc;
201
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
202
- background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
203
- background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
204
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
205
- background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
206
- }
207
-
208
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
209
- left: 0;
210
- right: auto;
211
-
212
- border-left: none;
213
- border-right: 1px solid #aaa;
214
- border-radius: 4px 0 0 4px;
215
- }
216
-
217
- .select2-container .select2-choice .select2-arrow b {
218
- display: block;
219
- width: 100%;
220
- height: 100%;
221
- background: url('select2.png') no-repeat 0 1px;
222
- }
223
-
224
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
225
- background-position: 2px 1px;
226
- }
227
-
228
- .select2-search {
229
- display: inline-block;
230
- width: 100%;
231
- min-height: 26px;
232
- margin: 0;
233
- padding-left: 4px;
234
- padding-right: 4px;
235
-
236
- position: relative;
237
- z-index: 10000;
238
-
239
- white-space: nowrap;
240
- }
241
-
242
- .select2-search input {
243
- width: 100%;
244
- height: auto !important;
245
- min-height: 26px;
246
- padding: 4px 20px 4px 5px;
247
- margin: 0;
248
-
249
- outline: 0;
250
- font-family: sans-serif;
251
- font-size: 1em;
252
-
253
- border: 1px solid #aaa;
254
- border-radius: 0;
255
-
256
- -webkit-box-shadow: none;
257
- box-shadow: none;
258
-
259
- background: #fff url('select2.png') no-repeat 100% -22px;
260
- 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));
261
- background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
262
- background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
263
- background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
264
- }
265
-
266
- html[dir="rtl"] .select2-search input {
267
- padding: 4px 5px 4px 20px;
268
-
269
- background: #fff url('select2.png') no-repeat -37px -22px;
270
- 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));
271
- background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
272
- background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
273
- background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
274
- }
275
-
276
- .select2-drop.select2-drop-above .select2-search input {
277
- margin-top: 4px;
278
- }
279
-
280
- .select2-search input.select2-active {
281
- background: #fff url('select2-spinner.gif') no-repeat 100%;
282
- 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));
283
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
284
- background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
285
- background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
286
- }
287
-
288
- .select2-container-active .select2-choice,
289
- .select2-container-active .select2-choices {
290
- border: 1px solid #5897fb;
291
- outline: none;
292
-
293
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
294
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
295
- }
296
-
297
- .select2-dropdown-open .select2-choice {
298
- border-bottom-color: transparent;
299
- -webkit-box-shadow: 0 1px 0 #fff inset;
300
- box-shadow: 0 1px 0 #fff inset;
301
-
302
- border-bottom-left-radius: 0;
303
- border-bottom-right-radius: 0;
304
-
305
- background-color: #eee;
306
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
307
- background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
308
- background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
309
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
310
- background-image: linear-gradient(to top, #fff 0%, #eee 50%);
311
- }
312
-
313
- .select2-dropdown-open.select2-drop-above .select2-choice,
314
- .select2-dropdown-open.select2-drop-above .select2-choices {
315
- border: 1px solid #5897fb;
316
- border-top-color: transparent;
317
-
318
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
319
- background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
320
- background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
321
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
322
- background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
323
- }
324
-
325
- .select2-dropdown-open .select2-choice .select2-arrow {
326
- background: transparent;
327
- border-left: none;
328
- filter: none;
329
- }
330
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
331
- border-right: none;
332
- }
333
-
334
- .select2-dropdown-open .select2-choice .select2-arrow b {
335
- background-position: -18px 1px;
336
- }
337
-
338
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
339
- background-position: -16px 1px;
340
- }
341
-
342
- .select2-hidden-accessible {
343
- border: 0;
344
- clip: rect(0 0 0 0);
345
- height: 1px;
346
- margin: -1px;
347
- overflow: hidden;
348
- padding: 0;
349
- position: absolute;
350
- width: 1px;
351
- }
352
-
353
- /* results */
354
- .select2-results {
355
- max-height: 200px;
356
- padding: 0 0 0 4px;
357
- margin: 4px 4px 4px 0;
358
- position: relative;
359
- overflow-x: hidden;
360
- overflow-y: auto;
361
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
362
- }
363
-
364
- html[dir="rtl"] .select2-results {
365
- padding: 0 4px 0 0;
366
- margin: 4px 0 4px 4px;
367
- }
368
-
369
- .select2-results ul.select2-result-sub {
370
- margin: 0;
371
- padding-left: 0;
372
- }
373
-
374
- .select2-results li {
375
- list-style: none;
376
- display: list-item;
377
- background-image: none;
378
- }
379
-
380
- .select2-results li.select2-result-with-children > .select2-result-label {
381
- font-weight: bold;
382
- }
383
-
384
- .select2-results .select2-result-label {
385
- padding: 3px 7px 4px;
386
- margin: 0;
387
- cursor: pointer;
388
-
389
- min-height: 1em;
390
-
391
- -webkit-touch-callout: none;
392
- -webkit-user-select: none;
393
- -moz-user-select: none;
394
- -ms-user-select: none;
395
- user-select: none;
396
- }
397
-
398
- .select2-results-dept-1 .select2-result-label { padding-left: 20px }
399
- .select2-results-dept-2 .select2-result-label { padding-left: 40px }
400
- .select2-results-dept-3 .select2-result-label { padding-left: 60px }
401
- .select2-results-dept-4 .select2-result-label { padding-left: 80px }
402
- .select2-results-dept-5 .select2-result-label { padding-left: 100px }
403
- .select2-results-dept-6 .select2-result-label { padding-left: 110px }
404
- .select2-results-dept-7 .select2-result-label { padding-left: 120px }
405
-
406
- .select2-results .select2-highlighted {
407
- background: #3875d7;
408
- color: #fff;
409
- }
410
-
411
- .select2-results li em {
412
- background: #feffde;
413
- font-style: normal;
414
- }
415
-
416
- .select2-results .select2-highlighted em {
417
- background: transparent;
418
- }
419
-
420
- .select2-results .select2-highlighted ul {
421
- background: #fff;
422
- color: #000;
423
- }
424
-
425
- .select2-results .select2-no-results,
426
- .select2-results .select2-searching,
427
- .select2-results .select2-ajax-error,
428
- .select2-results .select2-selection-limit {
429
- background: #f4f4f4;
430
- display: list-item;
431
- padding-left: 5px;
432
- }
433
-
434
- /*
435
- disabled look for disabled choices in the results dropdown
436
- */
437
- .select2-results .select2-disabled.select2-highlighted {
438
- color: #666;
439
- background: #f4f4f4;
440
- display: list-item;
441
- cursor: default;
442
- }
443
- .select2-results .select2-disabled {
444
- background: #f4f4f4;
445
- display: list-item;
446
- cursor: default;
447
- }
448
-
449
- .select2-results .select2-selected {
450
- display: none;
451
- }
452
-
453
- .select2-more-results.select2-active {
454
- background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
455
- }
456
-
457
- .select2-results .select2-ajax-error {
458
- background: rgba(255, 50, 50, .2);
459
- }
460
-
461
- .select2-more-results {
462
- background: #f4f4f4;
463
- display: list-item;
464
- }
465
-
466
- /* disabled styles */
467
-
468
- .select2-container.select2-container-disabled .select2-choice {
469
- background-color: #f4f4f4;
470
- background-image: none;
471
- border: 1px solid #ddd;
472
- cursor: default;
473
- }
474
-
475
- .select2-container.select2-container-disabled .select2-choice .select2-arrow {
476
- background-color: #f4f4f4;
477
- background-image: none;
478
- border-left: 0;
479
- }
480
-
481
- .select2-container.select2-container-disabled .select2-choice abbr {
482
- display: none;
483
- }
484
-
485
-
486
- /* multiselect */
487
-
488
- .select2-container-multi .select2-choices {
489
- height: auto !important;
490
- height: 1%;
491
- margin: 0;
492
- padding: 0 5px 0 0;
493
- position: relative;
494
-
495
- border: 1px solid #aaa;
496
- cursor: text;
497
- overflow: hidden;
498
-
499
- background-color: #fff;
500
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
501
- background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
502
- background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
503
- background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
504
- }
505
-
506
- html[dir="rtl"] .select2-container-multi .select2-choices {
507
- padding: 0 0 0 5px;
508
- }
509
-
510
- .select2-locked {
511
- padding: 3px 5px 3px 5px !important;
512
- }
513
-
514
- .select2-container-multi .select2-choices {
515
- min-height: 26px;
516
- }
517
-
518
- .select2-container-multi.select2-container-active .select2-choices {
519
- border: 1px solid #5897fb;
520
- outline: none;
521
-
522
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
523
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
524
- }
525
- .select2-container-multi .select2-choices li {
526
- float: left;
527
- list-style: none;
528
- }
529
- html[dir="rtl"] .select2-container-multi .select2-choices li
530
- {
531
- float: right;
532
- }
533
- .select2-container-multi .select2-choices .select2-search-field {
534
- margin: 0;
535
- padding: 0;
536
- white-space: nowrap;
537
- }
538
-
539
- .select2-container-multi .select2-choices .select2-search-field input {
540
- padding: 5px;
541
- margin: 1px 0;
542
-
543
- font-family: sans-serif;
544
- font-size: 100%;
545
- color: #666;
546
- outline: 0;
547
- border: 0;
548
- -webkit-box-shadow: none;
549
- box-shadow: none;
550
- background: transparent !important;
551
- }
552
-
553
- .select2-container-multi .select2-choices .select2-search-field input.select2-active {
554
- background: #fff url('select2-spinner.gif') no-repeat 100% !important;
555
- }
556
-
557
- .select2-default {
558
- color: #999 !important;
559
- }
560
-
561
- .select2-container-multi .select2-choices .select2-search-choice {
562
- padding: 3px 5px 3px 18px;
563
- margin: 3px 0 3px 5px;
564
- position: relative;
565
-
566
- line-height: 13px;
567
- color: #333;
568
- cursor: default;
569
- border: 1px solid #aaaaaa;
570
-
571
- border-radius: 3px;
572
-
573
- -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
574
- box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
575
-
576
- background-clip: padding-box;
577
-
578
- -webkit-touch-callout: none;
579
- -webkit-user-select: none;
580
- -moz-user-select: none;
581
- -ms-user-select: none;
582
- user-select: none;
583
-
584
- background-color: #e4e4e4;
585
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
586
- 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));
587
- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
588
- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
589
- background-image: linear-gradient(to top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
590
- }
591
- html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
592
- {
593
- margin: 3px 5px 3px 0;
594
- padding: 3px 18px 3px 5px;
595
- }
596
- .select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
597
- cursor: default;
598
- }
599
- .select2-container-multi .select2-choices .select2-search-choice-focus {
600
- background: #d4d4d4;
601
- }
602
-
603
- .select2-search-choice-close {
604
- display: block;
605
- width: 12px;
606
- height: 13px;
607
- position: absolute;
608
- right: 3px;
609
- top: 4px;
610
-
611
- font-size: 1px;
612
- outline: none;
613
- background: url('select2.png') right top no-repeat;
614
- }
615
- html[dir="rtl"] .select2-search-choice-close {
616
- right: auto;
617
- left: 3px;
618
- }
619
-
620
- .select2-container-multi .select2-search-choice-close {
621
- left: 3px;
622
- }
623
-
624
- html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
625
- left: auto;
626
- right: 2px;
627
- }
628
-
629
- .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
630
- background-position: right -11px;
631
- }
632
- .select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
633
- background-position: right -11px;
634
- }
635
-
636
- /* disabled styles */
637
- .select2-container-multi.select2-container-disabled .select2-choices {
638
- background-color: #f4f4f4;
639
- background-image: none;
640
- border: 1px solid #ddd;
641
- cursor: default;
642
- }
643
-
644
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
645
- padding: 3px 5px 3px 5px;
646
- border: 1px solid #ddd;
647
- background-image: none;
648
- background-color: #f4f4f4;
649
- }
650
-
651
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
652
- background: none;
653
- }
654
- /* end multiselect */
655
-
656
-
657
- .select2-result-selectable .select2-match,
658
- .select2-result-unselectable .select2-match {
659
- text-decoration: underline;
660
- }
661
-
662
- .select2-offscreen, .select2-offscreen:focus {
663
- clip: rect(0 0 0 0) !important;
664
- width: 1px !important;
665
- height: 1px !important;
666
- border: 0 !important;
667
- margin: 0 !important;
668
- padding: 0 !important;
669
- overflow: hidden !important;
670
- position: absolute !important;
671
- outline: 0 !important;
672
- left: 0px !important;
673
- top: 0px !important;
674
- }
675
-
676
- .select2-display-none {
677
- display: none;
678
- }
679
-
680
- .select2-measure-scrollbar {
681
- position: absolute;
682
- top: -10000px;
683
- left: -10000px;
684
- width: 100px;
685
- height: 100px;
686
- overflow: scroll;
687
- }
688
-
689
- /* Retina-ize icons */
690
-
691
- @media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
692
- .select2-search input,
693
- .select2-search-choice-close,
694
- .select2-container .select2-choice abbr,
695
- .select2-container .select2-choice .select2-arrow b {
696
- background-image: url('select2x2.png') !important;
697
- background-repeat: no-repeat !important;
698
- background-size: 60px 40px !important;
699
- }
700
-
701
- .select2-search input {
702
- background-position: 100% -21px !important;
703
- }
704
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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.1",
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
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2.js DELETED
@@ -1,3508 +0,0 @@
1
- /*
2
- Copyright 2012 Igor Vaynberg
3
-
4
- Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
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 KEY, 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('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, trimming 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) {
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] = $.trim(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
- $("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 = $("<span>", {
703
- role: "status",
704
- "aria-live": "polite"
705
- })
706
- .addClass("select2-hidden-accessible")
707
- .appendTo(document.body);
708
-
709
- this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
710
- this.containerEventName= this.containerId
711
- .replace(/([.])/g, '_')
712
- .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
713
- this.container.attr("id", this.containerId);
714
-
715
- this.container.attr("title", opts.element.attr("title"));
716
-
717
- this.body = $("body");
718
-
719
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
720
-
721
- this.container.attr("style", opts.element.attr("style"));
722
- this.container.css(evaluate(opts.containerCss, this.opts.element));
723
- this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));
724
-
725
- this.elementTabIndex = this.opts.element.attr("tabindex");
726
-
727
- // swap container for the element
728
- this.opts.element
729
- .data("select2", this)
730
- .attr("tabindex", "-1")
731
- .before(this.container)
732
- .on("click.select2", killEvent); // do not leak click events
733
-
734
- this.container.data("select2", this);
735
-
736
- this.dropdown = this.container.find(".select2-drop");
737
-
738
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
739
-
740
- this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));
741
- this.dropdown.data("select2", this);
742
- this.dropdown.on("click", killEvent);
743
-
744
- this.results = results = this.container.find(resultsSelector);
745
- this.search = search = this.container.find("input.select2-input");
746
-
747
- this.queryCount = 0;
748
- this.resultsPage = 0;
749
- this.context = null;
750
-
751
- // initialize the container
752
- this.initContainer();
753
-
754
- this.container.on("click", killEvent);
755
-
756
- installFilteredMouseMove(this.results);
757
-
758
- this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent));
759
- this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) {
760
- this._touchEvent = true;
761
- this.highlightUnderEvent(event);
762
- }));
763
- this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
764
- this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
765
-
766
- // Waiting for a click event on touch devices to select option and hide dropdown
767
- // otherwise click will be triggered on an underlying element
768
- this.dropdown.on('click', this.bind(function (event) {
769
- if (this._touchEvent) {
770
- this._touchEvent = false;
771
- this.selectHighlighted();
772
- }
773
- }));
774
-
775
- installDebouncedScroll(80, this.results);
776
- this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
777
-
778
- // do not propagate change event from the search field out of the component
779
- $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
780
- $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
781
-
782
- // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
783
- if ($.fn.mousewheel) {
784
- results.mousewheel(function (e, delta, deltaX, deltaY) {
785
- var top = results.scrollTop();
786
- if (deltaY > 0 && top - deltaY <= 0) {
787
- results.scrollTop(0);
788
- killEvent(e);
789
- } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
790
- results.scrollTop(results.get(0).scrollHeight - results.height());
791
- killEvent(e);
792
- }
793
- });
794
- }
795
-
796
- installKeyUpChangeEvent(search);
797
- search.on("keyup-change input paste", this.bind(this.updateResults));
798
- search.on("focus", function () { search.addClass("select2-focused"); });
799
- search.on("blur", function () { search.removeClass("select2-focused");});
800
-
801
- this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
802
- if ($(e.target).closest(".select2-result-selectable").length > 0) {
803
- this.highlightUnderEvent(e);
804
- this.selectHighlighted(e);
805
- }
806
- }));
807
-
808
- // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
809
- // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
810
- // dom it will trigger the popup close, which is not what we want
811
- // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.
812
- this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); });
813
-
814
- this.nextSearchTerm = undefined;
815
-
816
- if ($.isFunction(this.opts.initSelection)) {
817
- // initialize selection based on the current value of the source element
818
- this.initSelection();
819
-
820
- // if the user has provided a function that can set selection based on the value of the source element
821
- // we monitor the change event on the element and trigger it, allowing for two way synchronization
822
- this.monitorSource();
823
- }
824
-
825
- if (opts.maximumInputLength !== null) {
826
- this.search.attr("maxlength", opts.maximumInputLength);
827
- }
828
-
829
- var disabled = opts.element.prop("disabled");
830
- if (disabled === undefined) disabled = false;
831
- this.enable(!disabled);
832
-
833
- var readonly = opts.element.prop("readonly");
834
- if (readonly === undefined) readonly = false;
835
- this.readonly(readonly);
836
-
837
- // Calculate size of scrollbar
838
- scrollBarDimensions = scrollBarDimensions || measureScrollbar();
839
-
840
- this.autofocus = opts.element.prop("autofocus");
841
- opts.element.prop("autofocus", false);
842
- if (this.autofocus) this.focus();
843
-
844
- this.search.attr("placeholder", opts.searchInputPlaceholder);
845
- },
846
-
847
- // abstract
848
- destroy: function () {
849
- var element=this.opts.element, select2 = element.data("select2"), self = this;
850
-
851
- this.close();
852
-
853
- if (element.length && element[0].detachEvent) {
854
- element.each(function () {
855
- this.detachEvent("onpropertychange", self._sync);
856
- });
857
- }
858
- if (this.propertyObserver) {
859
- this.propertyObserver.disconnect();
860
- this.propertyObserver = null;
861
- }
862
- this._sync = null;
863
-
864
- if (select2 !== undefined) {
865
- select2.container.remove();
866
- select2.liveRegion.remove();
867
- select2.dropdown.remove();
868
- element
869
- .removeClass("select2-offscreen")
870
- .removeData("select2")
871
- .off(".select2")
872
- .prop("autofocus", this.autofocus || false);
873
- if (this.elementTabIndex) {
874
- element.attr({tabindex: this.elementTabIndex});
875
- } else {
876
- element.removeAttr("tabindex");
877
- }
878
- element.show();
879
- }
880
-
881
- cleanupJQueryElements.call(this,
882
- "container",
883
- "liveRegion",
884
- "dropdown",
885
- "results",
886
- "search"
887
- );
888
- },
889
-
890
- // abstract
891
- optionToData: function(element) {
892
- if (element.is("option")) {
893
- return {
894
- id:element.prop("value"),
895
- text:element.text(),
896
- element: element.get(),
897
- css: element.attr("class"),
898
- disabled: element.prop("disabled"),
899
- locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
900
- };
901
- } else if (element.is("optgroup")) {
902
- return {
903
- text:element.attr("label"),
904
- children:[],
905
- element: element.get(),
906
- css: element.attr("class")
907
- };
908
- }
909
- },
910
-
911
- // abstract
912
- prepareOpts: function (opts) {
913
- var element, select, idKey, ajaxUrl, self = this;
914
-
915
- element = opts.element;
916
-
917
- if (element.get(0).tagName.toLowerCase() === "select") {
918
- this.select = select = opts.element;
919
- }
920
-
921
- if (select) {
922
- // these options are not allowed when attached to a select because they are picked up off the element itself
923
- $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
924
- if (this in opts) {
925
- throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
926
- }
927
- });
928
- }
929
-
930
- opts = $.extend({}, {
931
- populateResults: function(container, results, query) {
932
- var populate, id=this.opts.id, liveRegion=this.liveRegion;
933
-
934
- populate=function(results, container, depth) {
935
-
936
- var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
937
-
938
- results = opts.sortResults(results, container, query);
939
-
940
- // collect the created nodes for bulk append
941
- var nodes = [];
942
- for (i = 0, l = results.length; i < l; i = i + 1) {
943
-
944
- result=results[i];
945
-
946
- disabled = (result.disabled === true);
947
- selectable = (!disabled) && (id(result) !== undefined);
948
-
949
- compound=result.children && result.children.length > 0;
950
-
951
- node=$("<li></li>");
952
- node.addClass("select2-results-dept-"+depth);
953
- node.addClass("select2-result");
954
- node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
955
- if (disabled) { node.addClass("select2-disabled"); }
956
- if (compound) { node.addClass("select2-result-with-children"); }
957
- node.addClass(self.opts.formatResultCssClass(result));
958
- node.attr("role", "presentation");
959
-
960
- label=$(document.createElement("div"));
961
- label.addClass("select2-result-label");
962
- label.attr("id", "select2-result-label-" + nextUid());
963
- label.attr("role", "option");
964
-
965
- formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
966
- if (formatted!==undefined) {
967
- label.html(formatted);
968
- node.append(label);
969
- }
970
-
971
-
972
- if (compound) {
973
-
974
- innerContainer=$("<ul></ul>");
975
- innerContainer.addClass("select2-result-sub");
976
- populate(result.children, innerContainer, depth+1);
977
- node.append(innerContainer);
978
- }
979
-
980
- node.data("select2-data", result);
981
- nodes.push(node[0]);
982
- }
983
-
984
- // bulk append the created nodes
985
- container.append(nodes);
986
- liveRegion.text(opts.formatMatches(results.length));
987
- };
988
-
989
- populate(results, container, 0);
990
- }
991
- }, $.fn.select2.defaults, opts);
992
-
993
- if (typeof(opts.id) !== "function") {
994
- idKey = opts.id;
995
- opts.id = function (e) { return e[idKey]; };
996
- }
997
-
998
- if ($.isArray(opts.element.data("select2Tags"))) {
999
- if ("tags" in opts) {
1000
- throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
1001
- }
1002
- opts.tags=opts.element.data("select2Tags");
1003
- }
1004
-
1005
- if (select) {
1006
- opts.query = this.bind(function (query) {
1007
- var data = { results: [], more: false },
1008
- term = query.term,
1009
- children, placeholderOption, process;
1010
-
1011
- process=function(element, collection) {
1012
- var group;
1013
- if (element.is("option")) {
1014
- if (query.matcher(term, element.text(), element)) {
1015
- collection.push(self.optionToData(element));
1016
- }
1017
- } else if (element.is("optgroup")) {
1018
- group=self.optionToData(element);
1019
- element.children().each2(function(i, elm) { process(elm, group.children); });
1020
- if (group.children.length>0) {
1021
- collection.push(group);
1022
- }
1023
- }
1024
- };
1025
-
1026
- children=element.children();
1027
-
1028
- // ignore the placeholder option if there is one
1029
- if (this.getPlaceholder() !== undefined && children.length > 0) {
1030
- placeholderOption = this.getPlaceholderOption();
1031
- if (placeholderOption) {
1032
- children=children.not(placeholderOption);
1033
- }
1034
- }
1035
-
1036
- children.each2(function(i, elm) { process(elm, data.results); });
1037
-
1038
- query.callback(data);
1039
- });
1040
- // this is needed because inside val() we construct choices from options and their id is hardcoded
1041
- opts.id=function(e) { return e.id; };
1042
- } else {
1043
- if (!("query" in opts)) {
1044
-
1045
- if ("ajax" in opts) {
1046
- ajaxUrl = opts.element.data("ajax-url");
1047
- if (ajaxUrl && ajaxUrl.length > 0) {
1048
- opts.ajax.url = ajaxUrl;
1049
- }
1050
- opts.query = ajax.call(opts.element, opts.ajax);
1051
- } else if ("data" in opts) {
1052
- opts.query = local(opts.data);
1053
- } else if ("tags" in opts) {
1054
- opts.query = tags(opts.tags);
1055
- if (opts.createSearchChoice === undefined) {
1056
- opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
1057
- }
1058
- if (opts.initSelection === undefined) {
1059
- opts.initSelection = function (element, callback) {
1060
- var data = [];
1061
- $(splitVal(element.val(), opts.separator)).each(function () {
1062
- var obj = { id: this, text: this },
1063
- tags = opts.tags;
1064
- if ($.isFunction(tags)) tags=tags();
1065
- $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
1066
- data.push(obj);
1067
- });
1068
-
1069
- callback(data);
1070
- };
1071
- }
1072
- }
1073
- }
1074
- }
1075
- if (typeof(opts.query) !== "function") {
1076
- throw "query function not defined for Select2 " + opts.element.attr("id");
1077
- }
1078
-
1079
- if (opts.createSearchChoicePosition === 'top') {
1080
- opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
1081
- }
1082
- else if (opts.createSearchChoicePosition === 'bottom') {
1083
- opts.createSearchChoicePosition = function(list, item) { list.push(item); };
1084
- }
1085
- else if (typeof(opts.createSearchChoicePosition) !== "function") {
1086
- throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
1087
- }
1088
-
1089
- return opts;
1090
- },
1091
-
1092
- /**
1093
- * Monitor the original element for changes and update select2 accordingly
1094
- */
1095
- // abstract
1096
- monitorSource: function () {
1097
- var el = this.opts.element, observer, self = this;
1098
-
1099
- el.on("change.select2", this.bind(function (e) {
1100
- if (this.opts.element.data("select2-change-triggered") !== true) {
1101
- this.initSelection();
1102
- }
1103
- }));
1104
-
1105
- this._sync = this.bind(function () {
1106
-
1107
- // sync enabled state
1108
- var disabled = el.prop("disabled");
1109
- if (disabled === undefined) disabled = false;
1110
- this.enable(!disabled);
1111
-
1112
- var readonly = el.prop("readonly");
1113
- if (readonly === undefined) readonly = false;
1114
- this.readonly(readonly);
1115
-
1116
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
1117
- this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));
1118
-
1119
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
1120
- this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));
1121
-
1122
- });
1123
-
1124
- // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)
1125
- if (el.length && el[0].attachEvent) {
1126
- el.each(function() {
1127
- this.attachEvent("onpropertychange", self._sync);
1128
- });
1129
- }
1130
-
1131
- // safari, chrome, firefox, IE11
1132
- observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
1133
- if (observer !== undefined) {
1134
- if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
1135
- this.propertyObserver = new observer(function (mutations) {
1136
- $.each(mutations, self._sync);
1137
- });
1138
- this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
1139
- }
1140
- },
1141
-
1142
- // abstract
1143
- triggerSelect: function(data) {
1144
- var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data });
1145
- this.opts.element.trigger(evt);
1146
- return !evt.isDefaultPrevented();
1147
- },
1148
-
1149
- /**
1150
- * Triggers the change event on the source element
1151
- */
1152
- // abstract
1153
- triggerChange: function (details) {
1154
-
1155
- details = details || {};
1156
- details= $.extend({}, details, { type: "change", val: this.val() });
1157
- // prevents recursive triggering
1158
- this.opts.element.data("select2-change-triggered", true);
1159
- this.opts.element.trigger(details);
1160
- this.opts.element.data("select2-change-triggered", false);
1161
-
1162
- // some validation frameworks ignore the change event and listen instead to keyup, click for selects
1163
- // so here we trigger the click event manually
1164
- this.opts.element.click();
1165
-
1166
- // ValidationEngine ignores the change event and listens instead to blur
1167
- // so here we trigger the blur event manually if so desired
1168
- if (this.opts.blurOnChange)
1169
- this.opts.element.blur();
1170
- },
1171
-
1172
- //abstract
1173
- isInterfaceEnabled: function()
1174
- {
1175
- return this.enabledInterface === true;
1176
- },
1177
-
1178
- // abstract
1179
- enableInterface: function() {
1180
- var enabled = this._enabled && !this._readonly,
1181
- disabled = !enabled;
1182
-
1183
- if (enabled === this.enabledInterface) return false;
1184
-
1185
- this.container.toggleClass("select2-container-disabled", disabled);
1186
- this.close();
1187
- this.enabledInterface = enabled;
1188
-
1189
- return true;
1190
- },
1191
-
1192
- // abstract
1193
- enable: function(enabled) {
1194
- if (enabled === undefined) enabled = true;
1195
- if (this._enabled === enabled) return;
1196
- this._enabled = enabled;
1197
-
1198
- this.opts.element.prop("disabled", !enabled);
1199
- this.enableInterface();
1200
- },
1201
-
1202
- // abstract
1203
- disable: function() {
1204
- this.enable(false);
1205
- },
1206
-
1207
- // abstract
1208
- readonly: function(enabled) {
1209
- if (enabled === undefined) enabled = false;
1210
- if (this._readonly === enabled) return;
1211
- this._readonly = enabled;
1212
-
1213
- this.opts.element.prop("readonly", enabled);
1214
- this.enableInterface();
1215
- },
1216
-
1217
- // abstract
1218
- opened: function () {
1219
- return (this.container) ? this.container.hasClass("select2-dropdown-open") : false;
1220
- },
1221
-
1222
- // abstract
1223
- positionDropdown: function() {
1224
- var $dropdown = this.dropdown,
1225
- offset = this.container.offset(),
1226
- height = this.container.outerHeight(false),
1227
- width = this.container.outerWidth(false),
1228
- dropHeight = $dropdown.outerHeight(false),
1229
- $window = $(window),
1230
- windowWidth = $window.width(),
1231
- windowHeight = $window.height(),
1232
- viewPortRight = $window.scrollLeft() + windowWidth,
1233
- viewportBottom = $window.scrollTop() + windowHeight,
1234
- dropTop = offset.top + height,
1235
- dropLeft = offset.left,
1236
- enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
1237
- enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
1238
- dropWidth = $dropdown.outerWidth(false),
1239
- enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight,
1240
- aboveNow = $dropdown.hasClass("select2-drop-above"),
1241
- bodyOffset,
1242
- above,
1243
- changeDirection,
1244
- css,
1245
- resultsListNode;
1246
-
1247
- // always prefer the current above/below alignment, unless there is not enough room
1248
- if (aboveNow) {
1249
- above = true;
1250
- if (!enoughRoomAbove && enoughRoomBelow) {
1251
- changeDirection = true;
1252
- above = false;
1253
- }
1254
- } else {
1255
- above = false;
1256
- if (!enoughRoomBelow && enoughRoomAbove) {
1257
- changeDirection = true;
1258
- above = true;
1259
- }
1260
- }
1261
-
1262
- //if we are changing direction we need to get positions when dropdown is hidden;
1263
- if (changeDirection) {
1264
- $dropdown.hide();
1265
- offset = this.container.offset();
1266
- height = this.container.outerHeight(false);
1267
- width = this.container.outerWidth(false);
1268
- dropHeight = $dropdown.outerHeight(false);
1269
- viewPortRight = $window.scrollLeft() + windowWidth;
1270
- viewportBottom = $window.scrollTop() + windowHeight;
1271
- dropTop = offset.top + height;
1272
- dropLeft = offset.left;
1273
- dropWidth = $dropdown.outerWidth(false);
1274
- enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
1275
- $dropdown.show();
1276
-
1277
- // fix so the cursor does not move to the left within the search-textbox in IE
1278
- this.focusSearch();
1279
- }
1280
-
1281
- if (this.opts.dropdownAutoWidth) {
1282
- resultsListNode = $('.select2-results', $dropdown)[0];
1283
- $dropdown.addClass('select2-drop-auto-width');
1284
- $dropdown.css('width', '');
1285
- // Add scrollbar width to dropdown if vertical scrollbar is present
1286
- dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
1287
- dropWidth > width ? width = dropWidth : dropWidth = width;
1288
- dropHeight = $dropdown.outerHeight(false);
1289
- enoughRoomOnRight = dropLeft + dropWidth <= viewPortRight;
1290
- }
1291
- else {
1292
- this.container.removeClass('select2-drop-auto-width');
1293
- }
1294
-
1295
- //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
1296
- //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body.scrollTop(), "enough?", enoughRoomAbove);
1297
-
1298
- // fix positioning when body has an offset and is not position: static
1299
- if (this.body.css('position') !== 'static') {
1300
- bodyOffset = this.body.offset();
1301
- dropTop -= bodyOffset.top;
1302
- dropLeft -= bodyOffset.left;
1303
- }
1304
-
1305
- if (!enoughRoomOnRight) {
1306
- dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
1307
- }
1308
-
1309
- css = {
1310
- left: dropLeft,
1311
- width: width
1312
- };
1313
-
1314
- if (above) {
1315
- css.top = offset.top - dropHeight;
1316
- css.bottom = 'auto';
1317
- this.container.addClass("select2-drop-above");
1318
- $dropdown.addClass("select2-drop-above");
1319
- }
1320
- else {
1321
- css.top = dropTop;
1322
- css.bottom = 'auto';
1323
- this.container.removeClass("select2-drop-above");
1324
- $dropdown.removeClass("select2-drop-above");
1325
- }
1326
- css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));
1327
-
1328
- $dropdown.css(css);
1329
- },
1330
-
1331
- // abstract
1332
- shouldOpen: function() {
1333
- var event;
1334
-
1335
- if (this.opened()) return false;
1336
-
1337
- if (this._enabled === false || this._readonly === true) return false;
1338
-
1339
- event = $.Event("select2-opening");
1340
- this.opts.element.trigger(event);
1341
- return !event.isDefaultPrevented();
1342
- },
1343
-
1344
- // abstract
1345
- clearDropdownAlignmentPreference: function() {
1346
- // clear the classes used to figure out the preference of where the dropdown should be opened
1347
- this.container.removeClass("select2-drop-above");
1348
- this.dropdown.removeClass("select2-drop-above");
1349
- },
1350
-
1351
- /**
1352
- * Opens the dropdown
1353
- *
1354
- * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
1355
- * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
1356
- */
1357
- // abstract
1358
- open: function () {
1359
-
1360
- if (!this.shouldOpen()) return false;
1361
-
1362
- this.opening();
1363
-
1364
- // Only bind the document mousemove when the dropdown is visible
1365
- $document.on("mousemove.select2Event", function (e) {
1366
- lastMousePosition.x = e.pageX;
1367
- lastMousePosition.y = e.pageY;
1368
- });
1369
-
1370
- return true;
1371
- },
1372
-
1373
- /**
1374
- * Performs the opening of the dropdown
1375
- */
1376
- // abstract
1377
- opening: function() {
1378
- var cid = this.containerEventName,
1379
- scroll = "scroll." + cid,
1380
- resize = "resize."+cid,
1381
- orient = "orientationchange."+cid,
1382
- mask;
1383
-
1384
- this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
1385
-
1386
- this.clearDropdownAlignmentPreference();
1387
-
1388
- if(this.dropdown[0] !== this.body.children().last()[0]) {
1389
- this.dropdown.detach().appendTo(this.body);
1390
- }
1391
-
1392
- // create the dropdown mask if doesn't already exist
1393
- mask = $("#select2-drop-mask");
1394
- if (mask.length == 0) {
1395
- mask = $(document.createElement("div"));
1396
- mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
1397
- mask.hide();
1398
- mask.appendTo(this.body);
1399
- mask.on("mousedown touchstart click", function (e) {
1400
- // Prevent IE from generating a click event on the body
1401
- reinsertElement(mask);
1402
-
1403
- var dropdown = $("#select2-drop"), self;
1404
- if (dropdown.length > 0) {
1405
- self=dropdown.data("select2");
1406
- if (self.opts.selectOnBlur) {
1407
- self.selectHighlighted({noFocus: true});
1408
- }
1409
- self.close();
1410
- e.preventDefault();
1411
- e.stopPropagation();
1412
- }
1413
- });
1414
- }
1415
-
1416
- // ensure the mask is always right before the dropdown
1417
- if (this.dropdown.prev()[0] !== mask[0]) {
1418
- this.dropdown.before(mask);
1419
- }
1420
-
1421
- // move the global id to the correct dropdown
1422
- $("#select2-drop").removeAttr("id");
1423
- this.dropdown.attr("id", "select2-drop");
1424
-
1425
- // show the elements
1426
- mask.show();
1427
-
1428
- this.positionDropdown();
1429
- this.dropdown.show();
1430
- this.positionDropdown();
1431
-
1432
- this.dropdown.addClass("select2-drop-active");
1433
-
1434
- // attach listeners to events that can change the position of the container and thus require
1435
- // the position of the dropdown to be updated as well so it does not come unglued from the container
1436
- var that = this;
1437
- this.container.parents().add(window).each(function () {
1438
- $(this).on(resize+" "+scroll+" "+orient, function (e) {
1439
- if (that.opened()) that.positionDropdown();
1440
- });
1441
- });
1442
-
1443
-
1444
- },
1445
-
1446
- // abstract
1447
- close: function () {
1448
- if (!this.opened()) return;
1449
-
1450
- var cid = this.containerEventName,
1451
- scroll = "scroll." + cid,
1452
- resize = "resize."+cid,
1453
- orient = "orientationchange."+cid;
1454
-
1455
- // unbind event listeners
1456
- this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
1457
-
1458
- this.clearDropdownAlignmentPreference();
1459
-
1460
- $("#select2-drop-mask").hide();
1461
- this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
1462
- this.dropdown.hide();
1463
- this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
1464
- this.results.empty();
1465
-
1466
- // Now that the dropdown is closed, unbind the global document mousemove event
1467
- $document.off("mousemove.select2Event");
1468
-
1469
- this.clearSearch();
1470
- this.search.removeClass("select2-active");
1471
- this.opts.element.trigger($.Event("select2-close"));
1472
- },
1473
-
1474
- /**
1475
- * Opens control, sets input value, and updates results.
1476
- */
1477
- // abstract
1478
- externalSearch: function (term) {
1479
- this.open();
1480
- this.search.val(term);
1481
- this.updateResults(false);
1482
- },
1483
-
1484
- // abstract
1485
- clearSearch: function () {
1486
-
1487
- },
1488
-
1489
- //abstract
1490
- getMaximumSelectionSize: function() {
1491
- return evaluate(this.opts.maximumSelectionSize, this.opts.element);
1492
- },
1493
-
1494
- // abstract
1495
- ensureHighlightVisible: function () {
1496
- var results = this.results, children, index, child, hb, rb, y, more, topOffset;
1497
-
1498
- index = this.highlight();
1499
-
1500
- if (index < 0) return;
1501
-
1502
- if (index == 0) {
1503
-
1504
- // if the first element is highlighted scroll all the way to the top,
1505
- // that way any unselectable headers above it will also be scrolled
1506
- // into view
1507
-
1508
- results.scrollTop(0);
1509
- return;
1510
- }
1511
-
1512
- children = this.findHighlightableChoices().find('.select2-result-label');
1513
-
1514
- child = $(children[index]);
1515
-
1516
- topOffset = (child.offset() || {}).top || 0;
1517
-
1518
- hb = topOffset + child.outerHeight(true);
1519
-
1520
- // if this is the last child lets also make sure select2-more-results is visible
1521
- if (index === children.length - 1) {
1522
- more = results.find("li.select2-more-results");
1523
- if (more.length > 0) {
1524
- hb = more.offset().top + more.outerHeight(true);
1525
- }
1526
- }
1527
-
1528
- rb = results.offset().top + results.outerHeight(true);
1529
- if (hb > rb) {
1530
- results.scrollTop(results.scrollTop() + (hb - rb));
1531
- }
1532
- y = topOffset - results.offset().top;
1533
-
1534
- // make sure the top of the element is visible
1535
- if (y < 0 && child.css('display') != 'none' ) {
1536
- results.scrollTop(results.scrollTop() + y); // y is negative
1537
- }
1538
- },
1539
-
1540
- // abstract
1541
- findHighlightableChoices: function() {
1542
- return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
1543
- },
1544
-
1545
- // abstract
1546
- moveHighlight: function (delta) {
1547
- var choices = this.findHighlightableChoices(),
1548
- index = this.highlight();
1549
-
1550
- while (index > -1 && index < choices.length) {
1551
- index += delta;
1552
- var choice = $(choices[index]);
1553
- if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
1554
- this.highlight(index);
1555
- break;
1556
- }
1557
- }
1558
- },
1559
-
1560
- // abstract
1561
- highlight: function (index) {
1562
- var choices = this.findHighlightableChoices(),
1563
- choice,
1564
- data;
1565
-
1566
- if (arguments.length === 0) {
1567
- return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
1568
- }
1569
-
1570
- if (index >= choices.length) index = choices.length - 1;
1571
- if (index < 0) index = 0;
1572
-
1573
- this.removeHighlight();
1574
-
1575
- choice = $(choices[index]);
1576
- choice.addClass("select2-highlighted");
1577
-
1578
- // ensure assistive technology can determine the active choice
1579
- this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
1580
-
1581
- this.ensureHighlightVisible();
1582
-
1583
- this.liveRegion.text(choice.text());
1584
-
1585
- data = choice.data("select2-data");
1586
- if (data) {
1587
- this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
1588
- }
1589
- },
1590
-
1591
- removeHighlight: function() {
1592
- this.results.find(".select2-highlighted").removeClass("select2-highlighted");
1593
- },
1594
-
1595
- touchMoved: function() {
1596
- this._touchMoved = true;
1597
- },
1598
-
1599
- clearTouchMoved: function() {
1600
- this._touchMoved = false;
1601
- },
1602
-
1603
- // abstract
1604
- countSelectableResults: function() {
1605
- return this.findHighlightableChoices().length;
1606
- },
1607
-
1608
- // abstract
1609
- highlightUnderEvent: function (event) {
1610
- var el = $(event.target).closest(".select2-result-selectable");
1611
- if (el.length > 0 && !el.is(".select2-highlighted")) {
1612
- var choices = this.findHighlightableChoices();
1613
- this.highlight(choices.index(el));
1614
- } else if (el.length == 0) {
1615
- // if we are over an unselectable item remove all highlights
1616
- this.removeHighlight();
1617
- }
1618
- },
1619
-
1620
- // abstract
1621
- loadMoreIfNeeded: function () {
1622
- var results = this.results,
1623
- more = results.find("li.select2-more-results"),
1624
- below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
1625
- page = this.resultsPage + 1,
1626
- self=this,
1627
- term=this.search.val(),
1628
- context=this.context;
1629
-
1630
- if (more.length === 0) return;
1631
- below = more.offset().top - results.offset().top - results.height();
1632
-
1633
- if (below <= this.opts.loadMorePadding) {
1634
- more.addClass("select2-active");
1635
- this.opts.query({
1636
- element: this.opts.element,
1637
- term: term,
1638
- page: page,
1639
- context: context,
1640
- matcher: this.opts.matcher,
1641
- callback: this.bind(function (data) {
1642
-
1643
- // ignore a response if the select2 has been closed before it was received
1644
- if (!self.opened()) return;
1645
-
1646
-
1647
- self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
1648
- self.postprocessResults(data, false, false);
1649
-
1650
- if (data.more===true) {
1651
- more.detach().appendTo(results).text(evaluate(self.opts.formatLoadMore, self.opts.element, page+1));
1652
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1653
- } else {
1654
- more.remove();
1655
- }
1656
- self.positionDropdown();
1657
- self.resultsPage = page;
1658
- self.context = data.context;
1659
- this.opts.element.trigger({ type: "select2-loaded", items: data });
1660
- })});
1661
- }
1662
- },
1663
-
1664
- /**
1665
- * Default tokenizer function which does nothing
1666
- */
1667
- tokenize: function() {
1668
-
1669
- },
1670
-
1671
- /**
1672
- * @param initial whether or not this is the call to this method right after the dropdown has been opened
1673
- */
1674
- // abstract
1675
- updateResults: function (initial) {
1676
- var search = this.search,
1677
- results = this.results,
1678
- opts = this.opts,
1679
- data,
1680
- self = this,
1681
- input,
1682
- term = search.val(),
1683
- lastTerm = $.data(this.container, "select2-last-term"),
1684
- // sequence number used to drop out-of-order responses
1685
- queryNumber;
1686
-
1687
- // prevent duplicate queries against the same term
1688
- if (initial !== true && lastTerm && equal(term, lastTerm)) return;
1689
-
1690
- $.data(this.container, "select2-last-term", term);
1691
-
1692
- // if the search is currently hidden we do not alter the results
1693
- if (initial !== true && (this.showSearchInput === false || !this.opened())) {
1694
- return;
1695
- }
1696
-
1697
- function postRender() {
1698
- search.removeClass("select2-active");
1699
- self.positionDropdown();
1700
- if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
1701
- self.liveRegion.text(results.text());
1702
- }
1703
- else {
1704
- self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable').length));
1705
- }
1706
- }
1707
-
1708
- function render(html) {
1709
- results.html(html);
1710
- postRender();
1711
- }
1712
-
1713
- queryNumber = ++this.queryCount;
1714
-
1715
- var maxSelSize = this.getMaximumSelectionSize();
1716
- if (maxSelSize >=1) {
1717
- data = this.data();
1718
- if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
1719
- render("<li class='select2-selection-limit'>" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + "</li>");
1720
- return;
1721
- }
1722
- }
1723
-
1724
- if (search.val().length < opts.minimumInputLength) {
1725
- if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
1726
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + "</li>");
1727
- } else {
1728
- render("");
1729
- }
1730
- if (initial && this.showSearch) this.showSearch(true);
1731
- return;
1732
- }
1733
-
1734
- if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
1735
- if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
1736
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + "</li>");
1737
- } else {
1738
- render("");
1739
- }
1740
- return;
1741
- }
1742
-
1743
- if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
1744
- render("<li class='select2-searching'>" + evaluate(opts.formatSearching, opts.element) + "</li>");
1745
- }
1746
-
1747
- search.addClass("select2-active");
1748
-
1749
- this.removeHighlight();
1750
-
1751
- // give the tokenizer a chance to pre-process the input
1752
- input = this.tokenize();
1753
- if (input != undefined && input != null) {
1754
- search.val(input);
1755
- }
1756
-
1757
- this.resultsPage = 1;
1758
-
1759
- opts.query({
1760
- element: opts.element,
1761
- term: search.val(),
1762
- page: this.resultsPage,
1763
- context: null,
1764
- matcher: opts.matcher,
1765
- callback: this.bind(function (data) {
1766
- var def; // default choice
1767
-
1768
- // ignore old responses
1769
- if (queryNumber != this.queryCount) {
1770
- return;
1771
- }
1772
-
1773
- // ignore a response if the select2 has been closed before it was received
1774
- if (!this.opened()) {
1775
- this.search.removeClass("select2-active");
1776
- return;
1777
- }
1778
-
1779
- // handle ajax error
1780
- if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) {
1781
- render("<li class='select2-ajax-error'>" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + "</li>");
1782
- return;
1783
- }
1784
-
1785
- // save context, if any
1786
- this.context = (data.context===undefined) ? null : data.context;
1787
- // create a default choice and prepend it to the list
1788
- if (this.opts.createSearchChoice && search.val() !== "") {
1789
- def = this.opts.createSearchChoice.call(self, search.val(), data.results);
1790
- if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
1791
- if ($(data.results).filter(
1792
- function () {
1793
- return equal(self.id(this), self.id(def));
1794
- }).length === 0) {
1795
- this.opts.createSearchChoicePosition(data.results, def);
1796
- }
1797
- }
1798
- }
1799
-
1800
- if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
1801
- render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, opts.element, search.val()) + "</li>");
1802
- return;
1803
- }
1804
-
1805
- results.empty();
1806
- self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
1807
-
1808
- if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
1809
- results.append("<li class='select2-more-results'>" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + "</li>");
1810
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1811
- }
1812
-
1813
- this.postprocessResults(data, initial);
1814
-
1815
- postRender();
1816
-
1817
- this.opts.element.trigger({ type: "select2-loaded", items: data });
1818
- })});
1819
- },
1820
-
1821
- // abstract
1822
- cancel: function () {
1823
- this.close();
1824
- },
1825
-
1826
- // abstract
1827
- blur: function () {
1828
- // if selectOnBlur == true, select the currently highlighted option
1829
- if (this.opts.selectOnBlur)
1830
- this.selectHighlighted({noFocus: true});
1831
-
1832
- this.close();
1833
- this.container.removeClass("select2-container-active");
1834
- // synonymous to .is(':focus'), which is available in jquery >= 1.6
1835
- if (this.search[0] === document.activeElement) { this.search.blur(); }
1836
- this.clearSearch();
1837
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
1838
- },
1839
-
1840
- // abstract
1841
- focusSearch: function () {
1842
- focus(this.search);
1843
- },
1844
-
1845
- // abstract
1846
- selectHighlighted: function (options) {
1847
- if (this._touchMoved) {
1848
- this.clearTouchMoved();
1849
- return;
1850
- }
1851
- var index=this.highlight(),
1852
- highlighted=this.results.find(".select2-highlighted"),
1853
- data = highlighted.closest('.select2-result').data("select2-data");
1854
-
1855
- if (data) {
1856
- this.highlight(index);
1857
- this.onSelect(data, options);
1858
- } else if (options && options.noFocus) {
1859
- this.close();
1860
- }
1861
- },
1862
-
1863
- // abstract
1864
- getPlaceholder: function () {
1865
- var placeholderOption;
1866
- return this.opts.element.attr("placeholder") ||
1867
- this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
1868
- this.opts.element.data("placeholder") ||
1869
- this.opts.placeholder ||
1870
- ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
1871
- },
1872
-
1873
- // abstract
1874
- getPlaceholderOption: function() {
1875
- if (this.select) {
1876
- var firstOption = this.select.children('option').first();
1877
- if (this.opts.placeholderOption !== undefined ) {
1878
- //Determine the placeholder option based on the specified placeholderOption setting
1879
- return (this.opts.placeholderOption === "first" && firstOption) ||
1880
- (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
1881
- } else if ($.trim(firstOption.text()) === "" && firstOption.val() === "") {
1882
- //No explicit placeholder option specified, use the first if it's blank
1883
- return firstOption;
1884
- }
1885
- }
1886
- },
1887
-
1888
- /**
1889
- * Get the desired width for the container element. This is
1890
- * derived first from option `width` passed to select2, then
1891
- * the inline 'style' on the original element, and finally
1892
- * falls back to the jQuery calculated element width.
1893
- */
1894
- // abstract
1895
- initContainerWidth: function () {
1896
- function resolveContainerWidth() {
1897
- var style, attrs, matches, i, l, attr;
1898
-
1899
- if (this.opts.width === "off") {
1900
- return null;
1901
- } else if (this.opts.width === "element"){
1902
- return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
1903
- } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
1904
- // check if there is inline style on the element that contains width
1905
- style = this.opts.element.attr('style');
1906
- if (style !== undefined) {
1907
- attrs = style.split(';');
1908
- for (i = 0, l = attrs.length; i < l; i = i + 1) {
1909
- attr = attrs[i].replace(/\s/g, '');
1910
- matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
1911
- if (matches !== null && matches.length >= 1)
1912
- return matches[1];
1913
- }
1914
- }
1915
-
1916
- if (this.opts.width === "resolve") {
1917
- // next check if css('width') can resolve a width that is percent based, this is sometimes possible
1918
- // when attached to input type=hidden or elements hidden via css
1919
- style = this.opts.element.css('width');
1920
- if (style.indexOf("%") > 0) return style;
1921
-
1922
- // finally, fallback on the calculated width of the element
1923
- return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
1924
- }
1925
-
1926
- return null;
1927
- } else if ($.isFunction(this.opts.width)) {
1928
- return this.opts.width();
1929
- } else {
1930
- return this.opts.width;
1931
- }
1932
- };
1933
-
1934
- var width = resolveContainerWidth.call(this);
1935
- if (width !== null) {
1936
- this.container.css("width", width);
1937
- }
1938
- }
1939
- });
1940
-
1941
- SingleSelect2 = clazz(AbstractSelect2, {
1942
-
1943
- // single
1944
-
1945
- createContainer: function () {
1946
- var container = $(document.createElement("div")).attr({
1947
- "class": "select2-container"
1948
- }).html([
1949
- "<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>",
1950
- " <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>",
1951
- " <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>",
1952
- "</a>",
1953
- "<label for='' class='select2-offscreen'></label>",
1954
- "<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />",
1955
- "<div class='select2-drop select2-display-none'>",
1956
- " <div class='select2-search'>",
1957
- " <label for='' class='select2-offscreen'></label>",
1958
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'",
1959
- " aria-autocomplete='list' />",
1960
- " </div>",
1961
- " <ul class='select2-results' role='listbox'>",
1962
- " </ul>",
1963
- "</div>"].join(""));
1964
- return container;
1965
- },
1966
-
1967
- // single
1968
- enableInterface: function() {
1969
- if (this.parent.enableInterface.apply(this, arguments)) {
1970
- this.focusser.prop("disabled", !this.isInterfaceEnabled());
1971
- }
1972
- },
1973
-
1974
- // single
1975
- opening: function () {
1976
- var el, range, len;
1977
-
1978
- if (this.opts.minimumResultsForSearch >= 0) {
1979
- this.showSearch(true);
1980
- }
1981
-
1982
- this.parent.opening.apply(this, arguments);
1983
-
1984
- if (this.showSearchInput !== false) {
1985
- // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
1986
- // all other browsers handle this just fine
1987
-
1988
- this.search.val(this.focusser.val());
1989
- }
1990
- if (this.opts.shouldFocusInput(this)) {
1991
- this.search.focus();
1992
- // move the cursor to the end after focussing, otherwise it will be at the beginning and
1993
- // new text will appear *before* focusser.val()
1994
- el = this.search.get(0);
1995
- if (el.createTextRange) {
1996
- range = el.createTextRange();
1997
- range.collapse(false);
1998
- range.select();
1999
- } else if (el.setSelectionRange) {
2000
- len = this.search.val().length;
2001
- el.setSelectionRange(len, len);
2002
- }
2003
- }
2004
-
2005
- // initializes search's value with nextSearchTerm (if defined by user)
2006
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
2007
- if(this.search.val() === "") {
2008
- if(this.nextSearchTerm != undefined){
2009
- this.search.val(this.nextSearchTerm);
2010
- this.search.select();
2011
- }
2012
- }
2013
-
2014
- this.focusser.prop("disabled", true).val("");
2015
- this.updateResults(true);
2016
- this.opts.element.trigger($.Event("select2-open"));
2017
- },
2018
-
2019
- // single
2020
- close: function () {
2021
- if (!this.opened()) return;
2022
- this.parent.close.apply(this, arguments);
2023
-
2024
- this.focusser.prop("disabled", false);
2025
-
2026
- if (this.opts.shouldFocusInput(this)) {
2027
- this.focusser.focus();
2028
- }
2029
- },
2030
-
2031
- // single
2032
- focus: function () {
2033
- if (this.opened()) {
2034
- this.close();
2035
- } else {
2036
- this.focusser.prop("disabled", false);
2037
- if (this.opts.shouldFocusInput(this)) {
2038
- this.focusser.focus();
2039
- }
2040
- }
2041
- },
2042
-
2043
- // single
2044
- isFocused: function () {
2045
- return this.container.hasClass("select2-container-active");
2046
- },
2047
-
2048
- // single
2049
- cancel: function () {
2050
- this.parent.cancel.apply(this, arguments);
2051
- this.focusser.prop("disabled", false);
2052
-
2053
- if (this.opts.shouldFocusInput(this)) {
2054
- this.focusser.focus();
2055
- }
2056
- },
2057
-
2058
- // single
2059
- destroy: function() {
2060
- $("label[for='" + this.focusser.attr('id') + "']")
2061
- .attr('for', this.opts.element.attr("id"));
2062
- this.parent.destroy.apply(this, arguments);
2063
-
2064
- cleanupJQueryElements.call(this,
2065
- "selection",
2066
- "focusser"
2067
- );
2068
- },
2069
-
2070
- // single
2071
- initContainer: function () {
2072
-
2073
- var selection,
2074
- container = this.container,
2075
- dropdown = this.dropdown,
2076
- idSuffix = nextUid(),
2077
- elementLabel;
2078
-
2079
- if (this.opts.minimumResultsForSearch < 0) {
2080
- this.showSearch(false);
2081
- } else {
2082
- this.showSearch(true);
2083
- }
2084
-
2085
- this.selection = selection = container.find(".select2-choice");
2086
-
2087
- this.focusser = container.find(".select2-focusser");
2088
-
2089
- // add aria associations
2090
- selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
2091
- this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
2092
- this.results.attr("id", "select2-results-"+idSuffix);
2093
- this.search.attr("aria-owns", "select2-results-"+idSuffix);
2094
-
2095
- // rewrite labels from original element to focusser
2096
- this.focusser.attr("id", "s2id_autogen"+idSuffix);
2097
-
2098
- elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
2099
-
2100
- this.focusser.prev()
2101
- .text(elementLabel.text())
2102
- .attr('for', this.focusser.attr('id'));
2103
-
2104
- // Ensure the original element retains an accessible name
2105
- var originalTitle = this.opts.element.attr("title");
2106
- this.opts.element.attr("title", (originalTitle || elementLabel.text()));
2107
-
2108
- this.focusser.attr("tabindex", this.elementTabIndex);
2109
-
2110
- // write label for search field using the label from the focusser element
2111
- this.search.attr("id", this.focusser.attr('id') + '_search');
2112
-
2113
- this.search.prev()
2114
- .text($("label[for='" + this.focusser.attr('id') + "']").text())
2115
- .attr('for', this.search.attr('id'));
2116
-
2117
- this.search.on("keydown", this.bind(function (e) {
2118
- if (!this.isInterfaceEnabled()) return;
2119
-
2120
- // filter 229 keyCodes (input method editor is processing key input)
2121
- if (229 == e.keyCode) return;
2122
-
2123
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2124
- // prevent the page from scrolling
2125
- killEvent(e);
2126
- return;
2127
- }
2128
-
2129
- switch (e.which) {
2130
- case KEY.UP:
2131
- case KEY.DOWN:
2132
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2133
- killEvent(e);
2134
- return;
2135
- case KEY.ENTER:
2136
- this.selectHighlighted();
2137
- killEvent(e);
2138
- return;
2139
- case KEY.TAB:
2140
- this.selectHighlighted({noFocus: true});
2141
- return;
2142
- case KEY.ESC:
2143
- this.cancel(e);
2144
- killEvent(e);
2145
- return;
2146
- }
2147
- }));
2148
-
2149
- this.search.on("blur", this.bind(function(e) {
2150
- // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
2151
- // without this the search field loses focus which is annoying
2152
- if (document.activeElement === this.body.get(0)) {
2153
- window.setTimeout(this.bind(function() {
2154
- if (this.opened()) {
2155
- this.search.focus();
2156
- }
2157
- }), 0);
2158
- }
2159
- }));
2160
-
2161
- this.focusser.on("keydown", this.bind(function (e) {
2162
- if (!this.isInterfaceEnabled()) return;
2163
-
2164
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
2165
- return;
2166
- }
2167
-
2168
- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
2169
- killEvent(e);
2170
- return;
2171
- }
2172
-
2173
- if (e.which == KEY.DOWN || e.which == KEY.UP
2174
- || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
2175
-
2176
- if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
2177
-
2178
- this.open();
2179
- killEvent(e);
2180
- return;
2181
- }
2182
-
2183
- if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
2184
- if (this.opts.allowClear) {
2185
- this.clear();
2186
- }
2187
- killEvent(e);
2188
- return;
2189
- }
2190
- }));
2191
-
2192
-
2193
- installKeyUpChangeEvent(this.focusser);
2194
- this.focusser.on("keyup-change input", this.bind(function(e) {
2195
- if (this.opts.minimumResultsForSearch >= 0) {
2196
- e.stopPropagation();
2197
- if (this.opened()) return;
2198
- this.open();
2199
- }
2200
- }));
2201
-
2202
- selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
2203
- if (!this.isInterfaceEnabled()) return;
2204
- this.clear();
2205
- killEventImmediately(e);
2206
- this.close();
2207
- this.selection.focus();
2208
- }));
2209
-
2210
- selection.on("mousedown touchstart", this.bind(function (e) {
2211
- // Prevent IE from generating a click event on the body
2212
- reinsertElement(selection);
2213
-
2214
- if (!this.container.hasClass("select2-container-active")) {
2215
- this.opts.element.trigger($.Event("select2-focus"));
2216
- }
2217
-
2218
- if (this.opened()) {
2219
- this.close();
2220
- } else if (this.isInterfaceEnabled()) {
2221
- this.open();
2222
- }
2223
-
2224
- killEvent(e);
2225
- }));
2226
-
2227
- dropdown.on("mousedown touchstart", this.bind(function() {
2228
- if (this.opts.shouldFocusInput(this)) {
2229
- this.search.focus();
2230
- }
2231
- }));
2232
-
2233
- selection.on("focus", this.bind(function(e) {
2234
- killEvent(e);
2235
- }));
2236
-
2237
- this.focusser.on("focus", this.bind(function(){
2238
- if (!this.container.hasClass("select2-container-active")) {
2239
- this.opts.element.trigger($.Event("select2-focus"));
2240
- }
2241
- this.container.addClass("select2-container-active");
2242
- })).on("blur", this.bind(function() {
2243
- if (!this.opened()) {
2244
- this.container.removeClass("select2-container-active");
2245
- this.opts.element.trigger($.Event("select2-blur"));
2246
- }
2247
- }));
2248
- this.search.on("focus", this.bind(function(){
2249
- if (!this.container.hasClass("select2-container-active")) {
2250
- this.opts.element.trigger($.Event("select2-focus"));
2251
- }
2252
- this.container.addClass("select2-container-active");
2253
- }));
2254
-
2255
- this.initContainerWidth();
2256
- this.opts.element.addClass("select2-offscreen");
2257
- this.setPlaceholder();
2258
-
2259
- },
2260
-
2261
- // single
2262
- clear: function(triggerChange) {
2263
- var data=this.selection.data("select2-data");
2264
- if (data) { // guard against queued quick consecutive clicks
2265
- var evt = $.Event("select2-clearing");
2266
- this.opts.element.trigger(evt);
2267
- if (evt.isDefaultPrevented()) {
2268
- return;
2269
- }
2270
- var placeholderOption = this.getPlaceholderOption();
2271
- this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
2272
- this.selection.find(".select2-chosen").empty();
2273
- this.selection.removeData("select2-data");
2274
- this.setPlaceholder();
2275
-
2276
- if (triggerChange !== false){
2277
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
2278
- this.triggerChange({removed:data});
2279
- }
2280
- }
2281
- },
2282
-
2283
- /**
2284
- * Sets selection based on source element's value
2285
- */
2286
- // single
2287
- initSelection: function () {
2288
- var selected;
2289
- if (this.isPlaceholderOptionSelected()) {
2290
- this.updateSelection(null);
2291
- this.close();
2292
- this.setPlaceholder();
2293
- } else {
2294
- var self = this;
2295
- this.opts.initSelection.call(null, this.opts.element, function(selected){
2296
- if (selected !== undefined && selected !== null) {
2297
- self.updateSelection(selected);
2298
- self.close();
2299
- self.setPlaceholder();
2300
- self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());
2301
- }
2302
- });
2303
- }
2304
- },
2305
-
2306
- isPlaceholderOptionSelected: function() {
2307
- var placeholderOption;
2308
- if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered
2309
- return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
2310
- || (this.opts.element.val() === "")
2311
- || (this.opts.element.val() === undefined)
2312
- || (this.opts.element.val() === null);
2313
- },
2314
-
2315
- // single
2316
- prepareOpts: function () {
2317
- var opts = this.parent.prepareOpts.apply(this, arguments),
2318
- self=this;
2319
-
2320
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2321
- // install the selection initializer
2322
- opts.initSelection = function (element, callback) {
2323
- var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
2324
- // a single select box always has a value, no need to null check 'selected'
2325
- callback(self.optionToData(selected));
2326
- };
2327
- } else if ("data" in opts) {
2328
- // install default initSelection when applied to hidden input and data is local
2329
- opts.initSelection = opts.initSelection || function (element, callback) {
2330
- var id = element.val();
2331
- //search in data by id, storing the actual matching item
2332
- var match = null;
2333
- opts.query({
2334
- matcher: function(term, text, el){
2335
- var is_match = equal(id, opts.id(el));
2336
- if (is_match) {
2337
- match = el;
2338
- }
2339
- return is_match;
2340
- },
2341
- callback: !$.isFunction(callback) ? $.noop : function() {
2342
- callback(match);
2343
- }
2344
- });
2345
- };
2346
- }
2347
-
2348
- return opts;
2349
- },
2350
-
2351
- // single
2352
- getPlaceholder: function() {
2353
- // if a placeholder is specified on a single select without a valid placeholder option ignore it
2354
- if (this.select) {
2355
- if (this.getPlaceholderOption() === undefined) {
2356
- return undefined;
2357
- }
2358
- }
2359
-
2360
- return this.parent.getPlaceholder.apply(this, arguments);
2361
- },
2362
-
2363
- // single
2364
- setPlaceholder: function () {
2365
- var placeholder = this.getPlaceholder();
2366
-
2367
- if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
2368
-
2369
- // check for a placeholder option if attached to a select
2370
- if (this.select && this.getPlaceholderOption() === undefined) return;
2371
-
2372
- this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
2373
-
2374
- this.selection.addClass("select2-default");
2375
-
2376
- this.container.removeClass("select2-allowclear");
2377
- }
2378
- },
2379
-
2380
- // single
2381
- postprocessResults: function (data, initial, noHighlightUpdate) {
2382
- var selected = 0, self = this, showSearchInput = true;
2383
-
2384
- // find the selected element in the result list
2385
-
2386
- this.findHighlightableChoices().each2(function (i, elm) {
2387
- if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
2388
- selected = i;
2389
- return false;
2390
- }
2391
- });
2392
-
2393
- // and highlight it
2394
- if (noHighlightUpdate !== false) {
2395
- if (initial === true && selected >= 0) {
2396
- this.highlight(selected);
2397
- } else {
2398
- this.highlight(0);
2399
- }
2400
- }
2401
-
2402
- // hide the search box if this is the first we got the results and there are enough of them for search
2403
-
2404
- if (initial === true) {
2405
- var min = this.opts.minimumResultsForSearch;
2406
- if (min >= 0) {
2407
- this.showSearch(countResults(data.results) >= min);
2408
- }
2409
- }
2410
- },
2411
-
2412
- // single
2413
- showSearch: function(showSearchInput) {
2414
- if (this.showSearchInput === showSearchInput) return;
2415
-
2416
- this.showSearchInput = showSearchInput;
2417
-
2418
- this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
2419
- this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
2420
- //add "select2-with-searchbox" to the container if search box is shown
2421
- $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
2422
- },
2423
-
2424
- // single
2425
- onSelect: function (data, options) {
2426
-
2427
- if (!this.triggerSelect(data)) { return; }
2428
-
2429
- var old = this.opts.element.val(),
2430
- oldData = this.data();
2431
-
2432
- this.opts.element.val(this.id(data));
2433
- this.updateSelection(data);
2434
-
2435
- this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
2436
-
2437
- this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
2438
- this.close();
2439
-
2440
- if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
2441
- this.focusser.focus();
2442
- }
2443
-
2444
- if (!equal(old, this.id(data))) {
2445
- this.triggerChange({ added: data, removed: oldData });
2446
- }
2447
- },
2448
-
2449
- // single
2450
- updateSelection: function (data) {
2451
-
2452
- var container=this.selection.find(".select2-chosen"), formatted, cssClass;
2453
-
2454
- this.selection.data("select2-data", data);
2455
-
2456
- container.empty();
2457
- if (data !== null) {
2458
- formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
2459
- }
2460
- if (formatted !== undefined) {
2461
- container.append(formatted);
2462
- }
2463
- cssClass=this.opts.formatSelectionCssClass(data, container);
2464
- if (cssClass !== undefined) {
2465
- container.addClass(cssClass);
2466
- }
2467
-
2468
- this.selection.removeClass("select2-default");
2469
-
2470
- if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
2471
- this.container.addClass("select2-allowclear");
2472
- }
2473
- },
2474
-
2475
- // single
2476
- val: function () {
2477
- var val,
2478
- triggerChange = false,
2479
- data = null,
2480
- self = this,
2481
- oldData = this.data();
2482
-
2483
- if (arguments.length === 0) {
2484
- return this.opts.element.val();
2485
- }
2486
-
2487
- val = arguments[0];
2488
-
2489
- if (arguments.length > 1) {
2490
- triggerChange = arguments[1];
2491
- }
2492
-
2493
- if (this.select) {
2494
- this.select
2495
- .val(val)
2496
- .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
2497
- data = self.optionToData(elm);
2498
- return false;
2499
- });
2500
- this.updateSelection(data);
2501
- this.setPlaceholder();
2502
- if (triggerChange) {
2503
- this.triggerChange({added: data, removed:oldData});
2504
- }
2505
- } else {
2506
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
2507
- if (!val && val !== 0) {
2508
- this.clear(triggerChange);
2509
- return;
2510
- }
2511
- if (this.opts.initSelection === undefined) {
2512
- throw new Error("cannot call val() if initSelection() is not defined");
2513
- }
2514
- this.opts.element.val(val);
2515
- this.opts.initSelection(this.opts.element, function(data){
2516
- self.opts.element.val(!data ? "" : self.id(data));
2517
- self.updateSelection(data);
2518
- self.setPlaceholder();
2519
- if (triggerChange) {
2520
- self.triggerChange({added: data, removed:oldData});
2521
- }
2522
- });
2523
- }
2524
- },
2525
-
2526
- // single
2527
- clearSearch: function () {
2528
- this.search.val("");
2529
- this.focusser.val("");
2530
- },
2531
-
2532
- // single
2533
- data: function(value) {
2534
- var data,
2535
- triggerChange = false;
2536
-
2537
- if (arguments.length === 0) {
2538
- data = this.selection.data("select2-data");
2539
- if (data == undefined) data = null;
2540
- return data;
2541
- } else {
2542
- if (arguments.length > 1) {
2543
- triggerChange = arguments[1];
2544
- }
2545
- if (!value) {
2546
- this.clear(triggerChange);
2547
- } else {
2548
- data = this.data();
2549
- this.opts.element.val(!value ? "" : this.id(value));
2550
- this.updateSelection(value);
2551
- if (triggerChange) {
2552
- this.triggerChange({added: value, removed:data});
2553
- }
2554
- }
2555
- }
2556
- }
2557
- });
2558
-
2559
- MultiSelect2 = clazz(AbstractSelect2, {
2560
-
2561
- // multi
2562
- createContainer: function () {
2563
- var container = $(document.createElement("div")).attr({
2564
- "class": "select2-container select2-container-multi"
2565
- }).html([
2566
- "<ul class='select2-choices'>",
2567
- " <li class='select2-search-field'>",
2568
- " <label for='' class='select2-offscreen'></label>",
2569
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
2570
- " </li>",
2571
- "</ul>",
2572
- "<div class='select2-drop select2-drop-multi select2-display-none'>",
2573
- " <ul class='select2-results'>",
2574
- " </ul>",
2575
- "</div>"].join(""));
2576
- return container;
2577
- },
2578
-
2579
- // multi
2580
- prepareOpts: function () {
2581
- var opts = this.parent.prepareOpts.apply(this, arguments),
2582
- self=this;
2583
-
2584
- // TODO validate placeholder is a string if specified
2585
-
2586
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2587
- // install the selection initializer
2588
- opts.initSelection = function (element, callback) {
2589
-
2590
- var data = [];
2591
-
2592
- element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
2593
- data.push(self.optionToData(elm));
2594
- });
2595
- callback(data);
2596
- };
2597
- } else if ("data" in opts) {
2598
- // install default initSelection when applied to hidden input and data is local
2599
- opts.initSelection = opts.initSelection || function (element, callback) {
2600
- var ids = splitVal(element.val(), opts.separator);
2601
- //search in data by array of ids, storing matching items in a list
2602
- var matches = [];
2603
- opts.query({
2604
- matcher: function(term, text, el){
2605
- var is_match = $.grep(ids, function(id) {
2606
- return equal(id, opts.id(el));
2607
- }).length;
2608
- if (is_match) {
2609
- matches.push(el);
2610
- }
2611
- return is_match;
2612
- },
2613
- callback: !$.isFunction(callback) ? $.noop : function() {
2614
- // reorder matches based on the order they appear in the ids array because right now
2615
- // they are in the order in which they appear in data array
2616
- var ordered = [];
2617
- for (var i = 0; i < ids.length; i++) {
2618
- var id = ids[i];
2619
- for (var j = 0; j < matches.length; j++) {
2620
- var match = matches[j];
2621
- if (equal(id, opts.id(match))) {
2622
- ordered.push(match);
2623
- matches.splice(j, 1);
2624
- break;
2625
- }
2626
- }
2627
- }
2628
- callback(ordered);
2629
- }
2630
- });
2631
- };
2632
- }
2633
-
2634
- return opts;
2635
- },
2636
-
2637
- // multi
2638
- selectChoice: function (choice) {
2639
-
2640
- var selected = this.container.find(".select2-search-choice-focus");
2641
- if (selected.length && choice && choice[0] == selected[0]) {
2642
-
2643
- } else {
2644
- if (selected.length) {
2645
- this.opts.element.trigger("choice-deselected", selected);
2646
- }
2647
- selected.removeClass("select2-search-choice-focus");
2648
- if (choice && choice.length) {
2649
- this.close();
2650
- choice.addClass("select2-search-choice-focus");
2651
- this.opts.element.trigger("choice-selected", choice);
2652
- }
2653
- }
2654
- },
2655
-
2656
- // multi
2657
- destroy: function() {
2658
- $("label[for='" + this.search.attr('id') + "']")
2659
- .attr('for', this.opts.element.attr("id"));
2660
- this.parent.destroy.apply(this, arguments);
2661
-
2662
- cleanupJQueryElements.call(this,
2663
- "searchContainer",
2664
- "selection"
2665
- );
2666
- },
2667
-
2668
- // multi
2669
- initContainer: function () {
2670
-
2671
- var selector = ".select2-choices", selection;
2672
-
2673
- this.searchContainer = this.container.find(".select2-search-field");
2674
- this.selection = selection = this.container.find(selector);
2675
-
2676
- var _this = this;
2677
- this.selection.on("click", ".select2-search-choice:not(.select2-locked)", function (e) {
2678
- //killEvent(e);
2679
- _this.search[0].focus();
2680
- _this.selectChoice($(this));
2681
- });
2682
-
2683
- // rewrite labels from original element to focusser
2684
- this.search.attr("id", "s2id_autogen"+nextUid());
2685
-
2686
- this.search.prev()
2687
- .text($("label[for='" + this.opts.element.attr("id") + "']").text())
2688
- .attr('for', this.search.attr('id'));
2689
-
2690
- this.search.on("input paste", this.bind(function() {
2691
- if (this.search.attr('placeholder') && this.search.val().length == 0) return;
2692
- if (!this.isInterfaceEnabled()) return;
2693
- if (!this.opened()) {
2694
- this.open();
2695
- }
2696
- }));
2697
-
2698
- this.search.attr("tabindex", this.elementTabIndex);
2699
-
2700
- this.keydowns = 0;
2701
- this.search.on("keydown", this.bind(function (e) {
2702
- if (!this.isInterfaceEnabled()) return;
2703
-
2704
- ++this.keydowns;
2705
- var selected = selection.find(".select2-search-choice-focus");
2706
- var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
2707
- var next = selected.next(".select2-search-choice:not(.select2-locked)");
2708
- var pos = getCursorInfo(this.search);
2709
-
2710
- if (selected.length &&
2711
- (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
2712
- var selectedChoice = selected;
2713
- if (e.which == KEY.LEFT && prev.length) {
2714
- selectedChoice = prev;
2715
- }
2716
- else if (e.which == KEY.RIGHT) {
2717
- selectedChoice = next.length ? next : null;
2718
- }
2719
- else if (e.which === KEY.BACKSPACE) {
2720
- if (this.unselect(selected.first())) {
2721
- this.search.width(10);
2722
- selectedChoice = prev.length ? prev : next;
2723
- }
2724
- } else if (e.which == KEY.DELETE) {
2725
- if (this.unselect(selected.first())) {
2726
- this.search.width(10);
2727
- selectedChoice = next.length ? next : null;
2728
- }
2729
- } else if (e.which == KEY.ENTER) {
2730
- selectedChoice = null;
2731
- }
2732
-
2733
- this.selectChoice(selectedChoice);
2734
- killEvent(e);
2735
- if (!selectedChoice || !selectedChoice.length) {
2736
- this.open();
2737
- }
2738
- return;
2739
- } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
2740
- || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
2741
-
2742
- this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
2743
- killEvent(e);
2744
- return;
2745
- } else {
2746
- this.selectChoice(null);
2747
- }
2748
-
2749
- if (this.opened()) {
2750
- switch (e.which) {
2751
- case KEY.UP:
2752
- case KEY.DOWN:
2753
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2754
- killEvent(e);
2755
- return;
2756
- case KEY.ENTER:
2757
- this.selectHighlighted();
2758
- killEvent(e);
2759
- return;
2760
- case KEY.TAB:
2761
- this.selectHighlighted({noFocus:true});
2762
- this.close();
2763
- return;
2764
- case KEY.ESC:
2765
- this.cancel(e);
2766
- killEvent(e);
2767
- return;
2768
- }
2769
- }
2770
-
2771
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
2772
- || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
2773
- return;
2774
- }
2775
-
2776
- if (e.which === KEY.ENTER) {
2777
- if (this.opts.openOnEnter === false) {
2778
- return;
2779
- } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
2780
- return;
2781
- }
2782
- }
2783
-
2784
- this.open();
2785
-
2786
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2787
- // prevent the page from scrolling
2788
- killEvent(e);
2789
- }
2790
-
2791
- if (e.which === KEY.ENTER) {
2792
- // prevent form from being submitted
2793
- killEvent(e);
2794
- }
2795
-
2796
- }));
2797
-
2798
- this.search.on("keyup", this.bind(function (e) {
2799
- this.keydowns = 0;
2800
- this.resizeSearch();
2801
- })
2802
- );
2803
-
2804
- this.search.on("blur", this.bind(function(e) {
2805
- this.container.removeClass("select2-container-active");
2806
- this.search.removeClass("select2-focused");
2807
- this.selectChoice(null);
2808
- if (!this.opened()) this.clearSearch();
2809
- e.stopImmediatePropagation();
2810
- this.opts.element.trigger($.Event("select2-blur"));
2811
- }));
2812
-
2813
- this.container.on("click", selector, this.bind(function (e) {
2814
- if (!this.isInterfaceEnabled()) return;
2815
- if ($(e.target).closest(".select2-search-choice").length > 0) {
2816
- // clicked inside a select2 search choice, do not open
2817
- return;
2818
- }
2819
- this.selectChoice(null);
2820
- this.clearPlaceholder();
2821
- if (!this.container.hasClass("select2-container-active")) {
2822
- this.opts.element.trigger($.Event("select2-focus"));
2823
- }
2824
- this.open();
2825
- this.focusSearch();
2826
- e.preventDefault();
2827
- }));
2828
-
2829
- this.container.on("focus", selector, this.bind(function () {
2830
- if (!this.isInterfaceEnabled()) return;
2831
- if (!this.container.hasClass("select2-container-active")) {
2832
- this.opts.element.trigger($.Event("select2-focus"));
2833
- }
2834
- this.container.addClass("select2-container-active");
2835
- this.dropdown.addClass("select2-drop-active");
2836
- this.clearPlaceholder();
2837
- }));
2838
-
2839
- this.initContainerWidth();
2840
- this.opts.element.addClass("select2-offscreen");
2841
-
2842
- // set the placeholder if necessary
2843
- this.clearSearch();
2844
- },
2845
-
2846
- // multi
2847
- enableInterface: function() {
2848
- if (this.parent.enableInterface.apply(this, arguments)) {
2849
- this.search.prop("disabled", !this.isInterfaceEnabled());
2850
- }
2851
- },
2852
-
2853
- // multi
2854
- initSelection: function () {
2855
- var data;
2856
- if (this.opts.element.val() === "" && this.opts.element.text() === "") {
2857
- this.updateSelection([]);
2858
- this.close();
2859
- // set the placeholder if necessary
2860
- this.clearSearch();
2861
- }
2862
- if (this.select || this.opts.element.val() !== "") {
2863
- var self = this;
2864
- this.opts.initSelection.call(null, this.opts.element, function(data){
2865
- if (data !== undefined && data !== null) {
2866
- self.updateSelection(data);
2867
- self.close();
2868
- // set the placeholder if necessary
2869
- self.clearSearch();
2870
- }
2871
- });
2872
- }
2873
- },
2874
-
2875
- // multi
2876
- clearSearch: function () {
2877
- var placeholder = this.getPlaceholder(),
2878
- maxWidth = this.getMaxSearchWidth();
2879
-
2880
- if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
2881
- this.search.val(placeholder).addClass("select2-default");
2882
- // stretch the search box to full width of the container so as much of the placeholder is visible as possible
2883
- // 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
2884
- this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
2885
- } else {
2886
- this.search.val("").width(10);
2887
- }
2888
- },
2889
-
2890
- // multi
2891
- clearPlaceholder: function () {
2892
- if (this.search.hasClass("select2-default")) {
2893
- this.search.val("").removeClass("select2-default");
2894
- }
2895
- },
2896
-
2897
- // multi
2898
- opening: function () {
2899
- this.clearPlaceholder(); // should be done before super so placeholder is not used to search
2900
- this.resizeSearch();
2901
-
2902
- this.parent.opening.apply(this, arguments);
2903
-
2904
- this.focusSearch();
2905
-
2906
- // initializes search's value with nextSearchTerm (if defined by user)
2907
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
2908
- if(this.search.val() === "") {
2909
- if(this.nextSearchTerm != undefined){
2910
- this.search.val(this.nextSearchTerm);
2911
- this.search.select();
2912
- }
2913
- }
2914
-
2915
- this.updateResults(true);
2916
- if (this.opts.shouldFocusInput(this)) {
2917
- this.search.focus();
2918
- }
2919
- this.opts.element.trigger($.Event("select2-open"));
2920
- },
2921
-
2922
- // multi
2923
- close: function () {
2924
- if (!this.opened()) return;
2925
- this.parent.close.apply(this, arguments);
2926
- },
2927
-
2928
- // multi
2929
- focus: function () {
2930
- this.close();
2931
- this.search.focus();
2932
- },
2933
-
2934
- // multi
2935
- isFocused: function () {
2936
- return this.search.hasClass("select2-focused");
2937
- },
2938
-
2939
- // multi
2940
- updateSelection: function (data) {
2941
- var ids = [], filtered = [], self = this;
2942
-
2943
- // filter out duplicates
2944
- $(data).each(function () {
2945
- if (indexOf(self.id(this), ids) < 0) {
2946
- ids.push(self.id(this));
2947
- filtered.push(this);
2948
- }
2949
- });
2950
- data = filtered;
2951
-
2952
- this.selection.find(".select2-search-choice").remove();
2953
- $(data).each(function () {
2954
- self.addSelectedChoice(this);
2955
- });
2956
- self.postprocessResults();
2957
- },
2958
-
2959
- // multi
2960
- tokenize: function() {
2961
- var input = this.search.val();
2962
- input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
2963
- if (input != null && input != undefined) {
2964
- this.search.val(input);
2965
- if (input.length > 0) {
2966
- this.open();
2967
- }
2968
- }
2969
-
2970
- },
2971
-
2972
- // multi
2973
- onSelect: function (data, options) {
2974
-
2975
- if (!this.triggerSelect(data) || data.text === "") { return; }
2976
-
2977
- this.addSelectedChoice(data);
2978
-
2979
- this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
2980
-
2981
- // keep track of the search's value before it gets cleared
2982
- this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
2983
-
2984
- this.clearSearch();
2985
- this.updateResults();
2986
-
2987
- if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
2988
-
2989
- if (this.opts.closeOnSelect) {
2990
- this.close();
2991
- this.search.width(10);
2992
- } else {
2993
- if (this.countSelectableResults()>0) {
2994
- this.search.width(10);
2995
- this.resizeSearch();
2996
- if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
2997
- // if we reached max selection size repaint the results so choices
2998
- // are replaced with the max selection reached message
2999
- this.updateResults(true);
3000
- } else {
3001
- // initializes search's value with nextSearchTerm and update search result
3002
- if(this.nextSearchTerm != undefined){
3003
- this.search.val(this.nextSearchTerm);
3004
- this.updateResults();
3005
- this.search.select();
3006
- }
3007
- }
3008
- this.positionDropdown();
3009
- } else {
3010
- // if nothing left to select close
3011
- this.close();
3012
- this.search.width(10);
3013
- }
3014
- }
3015
-
3016
- // since its not possible to select an element that has already been
3017
- // added we do not need to check if this is a new element before firing change
3018
- this.triggerChange({ added: data });
3019
-
3020
- if (!options || !options.noFocus)
3021
- this.focusSearch();
3022
- },
3023
-
3024
- // multi
3025
- cancel: function () {
3026
- this.close();
3027
- this.focusSearch();
3028
- },
3029
-
3030
- addSelectedChoice: function (data) {
3031
- var enableChoice = !data.locked,
3032
- enabledItem = $(
3033
- "<li class='select2-search-choice'>" +
3034
- " <div></div>" +
3035
- " <a href='#' class='select2-search-choice-close' tabindex='-1'></a>" +
3036
- "</li>"),
3037
- disabledItem = $(
3038
- "<li class='select2-search-choice select2-locked'>" +
3039
- "<div></div>" +
3040
- "</li>");
3041
- var choice = enableChoice ? enabledItem : disabledItem,
3042
- id = this.id(data),
3043
- val = this.getVal(),
3044
- formatted,
3045
- cssClass;
3046
-
3047
- formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
3048
- if (formatted != undefined) {
3049
- choice.find("div").replaceWith("<div>"+formatted+"</div>");
3050
- }
3051
- cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
3052
- if (cssClass != undefined) {
3053
- choice.addClass(cssClass);
3054
- }
3055
-
3056
- if(enableChoice){
3057
- choice.find(".select2-search-choice-close")
3058
- .on("mousedown", killEvent)
3059
- .on("click dblclick", this.bind(function (e) {
3060
- if (!this.isInterfaceEnabled()) return;
3061
-
3062
- this.unselect($(e.target));
3063
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
3064
- killEvent(e);
3065
- this.close();
3066
- this.focusSearch();
3067
- })).on("focus", this.bind(function () {
3068
- if (!this.isInterfaceEnabled()) return;
3069
- this.container.addClass("select2-container-active");
3070
- this.dropdown.addClass("select2-drop-active");
3071
- }));
3072
- }
3073
-
3074
- choice.data("select2-data", data);
3075
- choice.insertBefore(this.searchContainer);
3076
-
3077
- val.push(id);
3078
- this.setVal(val);
3079
- },
3080
-
3081
- // multi
3082
- unselect: function (selected) {
3083
- var val = this.getVal(),
3084
- data,
3085
- index;
3086
- selected = selected.closest(".select2-search-choice");
3087
-
3088
- if (selected.length === 0) {
3089
- throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
3090
- }
3091
-
3092
- data = selected.data("select2-data");
3093
-
3094
- if (!data) {
3095
- // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
3096
- // and invoked on an element already removed
3097
- return;
3098
- }
3099
-
3100
- var evt = $.Event("select2-removing");
3101
- evt.val = this.id(data);
3102
- evt.choice = data;
3103
- this.opts.element.trigger(evt);
3104
-
3105
- if (evt.isDefaultPrevented()) {
3106
- return false;
3107
- }
3108
-
3109
- while((index = indexOf(this.id(data), val)) >= 0) {
3110
- val.splice(index, 1);
3111
- this.setVal(val);
3112
- if (this.select) this.postprocessResults();
3113
- }
3114
-
3115
- selected.remove();
3116
-
3117
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
3118
- this.triggerChange({ removed: data });
3119
-
3120
- return true;
3121
- },
3122
-
3123
- // multi
3124
- postprocessResults: function (data, initial, noHighlightUpdate) {
3125
- var val = this.getVal(),
3126
- choices = this.results.find(".select2-result"),
3127
- compound = this.results.find(".select2-result-with-children"),
3128
- self = this;
3129
-
3130
- choices.each2(function (i, choice) {
3131
- var id = self.id(choice.data("select2-data"));
3132
- if (indexOf(id, val) >= 0) {
3133
- choice.addClass("select2-selected");
3134
- // mark all children of the selected parent as selected
3135
- choice.find(".select2-result-selectable").addClass("select2-selected");
3136
- }
3137
- });
3138
-
3139
- compound.each2(function(i, choice) {
3140
- // hide an optgroup if it doesn't have any selectable children
3141
- if (!choice.is('.select2-result-selectable')
3142
- && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
3143
- choice.addClass("select2-selected");
3144
- }
3145
- });
3146
-
3147
- if (this.highlight() == -1 && noHighlightUpdate !== false){
3148
- self.highlight(0);
3149
- }
3150
-
3151
- //If all results are chosen render formatNoMatches
3152
- if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
3153
- if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
3154
- if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
3155
- this.results.append("<li class='select2-no-results'>" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + "</li>");
3156
- }
3157
- }
3158
- }
3159
-
3160
- },
3161
-
3162
- // multi
3163
- getMaxSearchWidth: function() {
3164
- return this.selection.width() - getSideBorderPadding(this.search);
3165
- },
3166
-
3167
- // multi
3168
- resizeSearch: function () {
3169
- var minimumWidth, left, maxWidth, containerLeft, searchWidth,
3170
- sideBorderPadding = getSideBorderPadding(this.search);
3171
-
3172
- minimumWidth = measureTextWidth(this.search) + 10;
3173
-
3174
- left = this.search.offset().left;
3175
-
3176
- maxWidth = this.selection.width();
3177
- containerLeft = this.selection.offset().left;
3178
-
3179
- searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
3180
-
3181
- if (searchWidth < minimumWidth) {
3182
- searchWidth = maxWidth - sideBorderPadding;
3183
- }
3184
-
3185
- if (searchWidth < 40) {
3186
- searchWidth = maxWidth - sideBorderPadding;
3187
- }
3188
-
3189
- if (searchWidth <= 0) {
3190
- searchWidth = minimumWidth;
3191
- }
3192
-
3193
- this.search.width(Math.floor(searchWidth));
3194
- },
3195
-
3196
- // multi
3197
- getVal: function () {
3198
- var val;
3199
- if (this.select) {
3200
- val = this.select.val();
3201
- return val === null ? [] : val;
3202
- } else {
3203
- val = this.opts.element.val();
3204
- return splitVal(val, this.opts.separator);
3205
- }
3206
- },
3207
-
3208
- // multi
3209
- setVal: function (val) {
3210
- var unique;
3211
- if (this.select) {
3212
- this.select.val(val);
3213
- } else {
3214
- unique = [];
3215
- // filter out duplicates
3216
- $(val).each(function () {
3217
- if (indexOf(this, unique) < 0) unique.push(this);
3218
- });
3219
- this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
3220
- }
3221
- },
3222
-
3223
- // multi
3224
- buildChangeDetails: function (old, current) {
3225
- var current = current.slice(0),
3226
- old = old.slice(0);
3227
-
3228
- // remove intersection from each array
3229
- for (var i = 0; i < current.length; i++) {
3230
- for (var j = 0; j < old.length; j++) {
3231
- if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
3232
- current.splice(i, 1);
3233
- if(i>0){
3234
- i--;
3235
- }
3236
- old.splice(j, 1);
3237
- j--;
3238
- }
3239
- }
3240
- }
3241
-
3242
- return {added: current, removed: old};
3243
- },
3244
-
3245
-
3246
- // multi
3247
- val: function (val, triggerChange) {
3248
- var oldData, self=this;
3249
-
3250
- if (arguments.length === 0) {
3251
- return this.getVal();
3252
- }
3253
-
3254
- oldData=this.data();
3255
- if (!oldData.length) oldData=[];
3256
-
3257
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
3258
- if (!val && val !== 0) {
3259
- this.opts.element.val("");
3260
- this.updateSelection([]);
3261
- this.clearSearch();
3262
- if (triggerChange) {
3263
- this.triggerChange({added: this.data(), removed: oldData});
3264
- }
3265
- return;
3266
- }
3267
-
3268
- // val is a list of ids
3269
- this.setVal(val);
3270
-
3271
- if (this.select) {
3272
- this.opts.initSelection(this.select, this.bind(this.updateSelection));
3273
- if (triggerChange) {
3274
- this.triggerChange(this.buildChangeDetails(oldData, this.data()));
3275
- }
3276
- } else {
3277
- if (this.opts.initSelection === undefined) {
3278
- throw new Error("val() cannot be called if initSelection() is not defined");
3279
- }
3280
-
3281
- this.opts.initSelection(this.opts.element, function(data){
3282
- var ids=$.map(data, self.id);
3283
- self.setVal(ids);
3284
- self.updateSelection(data);
3285
- self.clearSearch();
3286
- if (triggerChange) {
3287
- self.triggerChange(self.buildChangeDetails(oldData, self.data()));
3288
- }
3289
- });
3290
- }
3291
- this.clearSearch();
3292
- },
3293
-
3294
- // multi
3295
- onSortStart: function() {
3296
- if (this.select) {
3297
- throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
3298
- }
3299
-
3300
- // collapse search field into 0 width so its container can be collapsed as well
3301
- this.search.width(0);
3302
- // hide the container
3303
- this.searchContainer.hide();
3304
- },
3305
-
3306
- // multi
3307
- onSortEnd:function() {
3308
-
3309
- var val=[], self=this;
3310
-
3311
- // show search and move it to the end of the list
3312
- this.searchContainer.show();
3313
- // make sure the search container is the last item in the list
3314
- this.searchContainer.appendTo(this.searchContainer.parent());
3315
- // since we collapsed the width in dragStarted, we resize it here
3316
- this.resizeSearch();
3317
-
3318
- // update selection
3319
- this.selection.find(".select2-search-choice").each(function() {
3320
- val.push(self.opts.id($(this).data("select2-data")));
3321
- });
3322
- this.setVal(val);
3323
- this.triggerChange();
3324
- },
3325
-
3326
- // multi
3327
- data: function(values, triggerChange) {
3328
- var self=this, ids, old;
3329
- if (arguments.length === 0) {
3330
- return this.selection
3331
- .children(".select2-search-choice")
3332
- .map(function() { return $(this).data("select2-data"); })
3333
- .get();
3334
- } else {
3335
- old = this.data();
3336
- if (!values) { values = []; }
3337
- ids = $.map(values, function(e) { return self.opts.id(e); });
3338
- this.setVal(ids);
3339
- this.updateSelection(values);
3340
- this.clearSearch();
3341
- if (triggerChange) {
3342
- this.triggerChange(this.buildChangeDetails(old, this.data()));
3343
- }
3344
- }
3345
- }
3346
- });
3347
-
3348
- $.fn.select2 = function () {
3349
-
3350
- var args = Array.prototype.slice.call(arguments, 0),
3351
- opts,
3352
- select2,
3353
- method, value, multiple,
3354
- allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
3355
- valueMethods = ["opened", "isFocused", "container", "dropdown"],
3356
- propertyMethods = ["val", "data"],
3357
- methodsMap = { search: "externalSearch" };
3358
-
3359
- this.each(function () {
3360
- if (args.length === 0 || typeof(args[0]) === "object") {
3361
- opts = args.length === 0 ? {} : $.extend({}, args[0]);
3362
- opts.element = $(this);
3363
-
3364
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
3365
- multiple = opts.element.prop("multiple");
3366
- } else {
3367
- multiple = opts.multiple || false;
3368
- if ("tags" in opts) {opts.multiple = multiple = true;}
3369
- }
3370
-
3371
- select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
3372
- select2.init(opts);
3373
- } else if (typeof(args[0]) === "string") {
3374
-
3375
- if (indexOf(args[0], allowedMethods) < 0) {
3376
- throw "Unknown method: " + args[0];
3377
- }
3378
-
3379
- value = undefined;
3380
- select2 = $(this).data("select2");
3381
- if (select2 === undefined) return;
3382
-
3383
- method=args[0];
3384
-
3385
- if (method === "container") {
3386
- value = select2.container;
3387
- } else if (method === "dropdown") {
3388
- value = select2.dropdown;
3389
- } else {
3390
- if (methodsMap[method]) method = methodsMap[method];
3391
-
3392
- value = select2[method].apply(select2, args.slice(1));
3393
- }
3394
- if (indexOf(args[0], valueMethods) >= 0
3395
- || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {
3396
- return false; // abort the iteration, ready to return first matched value
3397
- }
3398
- } else {
3399
- throw "Invalid arguments to select2 plugin: " + args;
3400
- }
3401
- });
3402
- return (value === undefined) ? this : value;
3403
- };
3404
-
3405
- // plugin defaults, accessible to users
3406
- $.fn.select2.defaults = {
3407
- width: "copy",
3408
- loadMorePadding: 0,
3409
- closeOnSelect: true,
3410
- openOnEnter: true,
3411
- containerCss: {},
3412
- dropdownCss: {},
3413
- containerCssClass: "",
3414
- dropdownCssClass: "",
3415
- formatResult: function(result, container, query, escapeMarkup) {
3416
- var markup=[];
3417
- markMatch(result.text, query.term, markup, escapeMarkup);
3418
- return markup.join("");
3419
- },
3420
- formatSelection: function (data, container, escapeMarkup) {
3421
- return data ? escapeMarkup(data.text) : undefined;
3422
- },
3423
- sortResults: function (results, container, query) {
3424
- return results;
3425
- },
3426
- formatResultCssClass: function(data) {return data.css;},
3427
- formatSelectionCssClass: function(data, container) {return undefined;},
3428
- minimumResultsForSearch: 0,
3429
- minimumInputLength: 0,
3430
- maximumInputLength: null,
3431
- maximumSelectionSize: 0,
3432
- id: function (e) { return e == undefined ? null : e.id; },
3433
- matcher: function(term, text) {
3434
- return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
3435
- },
3436
- separator: ",",
3437
- tokenSeparators: [],
3438
- tokenizer: defaultTokenizer,
3439
- escapeMarkup: defaultEscapeMarkup,
3440
- blurOnChange: false,
3441
- selectOnBlur: false,
3442
- adaptContainerCssClass: function(c) { return c; },
3443
- adaptDropdownCssClass: function(c) { return null; },
3444
- nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
3445
- searchInputPlaceholder: '',
3446
- createSearchChoicePosition: 'top',
3447
- shouldFocusInput: function (instance) {
3448
- // Attempt to detect touch devices
3449
- var supportsTouchEvents = (('ontouchstart' in window) ||
3450
- (navigator.msMaxTouchPoints > 0));
3451
-
3452
- // Only devices which support touch events should be special cased
3453
- if (!supportsTouchEvents) {
3454
- return true;
3455
- }
3456
-
3457
- // Never focus the input if search is disabled
3458
- if (instance.opts.minimumResultsForSearch < 0) {
3459
- return false;
3460
- }
3461
-
3462
- return true;
3463
- }
3464
- };
3465
-
3466
- $.fn.select2.locales = [];
3467
-
3468
- $.fn.select2.locales['en'] = {
3469
- 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."; },
3470
- formatNoMatches: function () { return "No matches found"; },
3471
- formatAjaxError: function (jqXHR, textStatus, errorThrown) { return "Loading failed"; },
3472
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
3473
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
3474
- formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
3475
- formatLoadMore: function (pageNumber) { return "Loading more results…"; },
3476
- formatSearching: function () { return "Searching…"; },
3477
- };
3478
-
3479
- $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
3480
-
3481
- $.fn.select2.ajaxDefaults = {
3482
- transport: $.ajax,
3483
- params: {
3484
- type: "GET",
3485
- cache: false,
3486
- dataType: "json"
3487
- }
3488
- };
3489
-
3490
- // exports
3491
- window.Select2 = {
3492
- query: {
3493
- ajax: ajax,
3494
- local: local,
3495
- tags: tags
3496
- }, util: {
3497
- debounce: debounce,
3498
- markMatch: markMatch,
3499
- escapeMarkup: defaultEscapeMarkup,
3500
- stripDiacritics: stripDiacritics
3501
- }, "class": {
3502
- "abstract": AbstractSelect2,
3503
- "single": SingleSelect2,
3504
- "multi": MultiSelect2
3505
- }
3506
- };
3507
-
3508
- }(jQuery));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2.min.js DELETED
@@ -1,23 +0,0 @@
1
- /*
2
- Copyright 2014 Igor Vaynberg
3
-
4
- Version: 3.5.1 Timestamp: Tue Jul 22 18:58:56 EDT 2014
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 Apache License
17
- or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
18
- either express or implied. See the Apache License and the GPL License for the specific language governing
19
- permissions and limitations under the Apache License and the GPL License.
20
- */
21
- !function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++d<e&&(c.context=c[0]=this[d])&&b.call(c[0],d,c)!==!1;);return this}})}(jQuery),function(a,b){"use strict";function n(b){var c=a(document.createTextNode(""));b.before(c),c.before(b),c.remove()}function o(a){function b(a){return m[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function p(a,b){for(var c=0,d=b.length;d>c;c+=1)if(r(a,b[c]))return c;return-1}function q(){var b=a(l);b.appendTo("body");var c={width:b.width()-b[0].clientWidth,height:b.height()-b[0].clientHeight};return b.remove(),c}function r(a,c){return a===c?!0:a===b||c===b?!1:null===a||null===c?!1:a.constructor===String?a+""==c+"":c.constructor===String?c+""==a+"":!1}function s(b,c){var d,e,f;if(null===b||b.length<1)return[];for(d=b.split(c),e=0,f=d.length;f>e;e+=1)d[e]=a.trim(d[e]);return d}function t(a){return a.outerWidth(!1)-a.width()}function u(c){var d="keyup-change-value";c.on("keydown",function(){a.data(c,d)===b&&a.data(c,d,c.val())}),c.on("keyup",function(){var e=a.data(c,d);e!==b&&c.val()!==e&&(a.removeData(c,d),c.trigger("keyup-change"))})}function v(c){c.on("mousemove",function(c){var d=i;(d===b||d.x!==c.pageX||d.y!==c.pageY)&&a(c.target).trigger("mousemove-filtered",c)})}function w(a,c,d){d=d||b;var e;return function(){var b=arguments;window.clearTimeout(e),e=window.setTimeout(function(){c.apply(d,b)},a)}}function x(a,b){var c=w(a,function(a){b.trigger("scroll-debounced",a)});b.on("scroll",function(a){p(a.target,b.get())>=0&&c(a)})}function y(a){a[0]!==document.activeElement&&window.setTimeout(function(){var d,b=a[0],c=a.val().length;a.focus();var e=b.offsetWidth>0||b.offsetHeight>0;e&&b===document.activeElement&&(b.setSelectionRange?b.setSelectionRange(c,c):b.createTextRange&&(d=b.createTextRange(),d.collapse(!1),d.select()))},0)}function z(b){b=a(b)[0];var c=0,d=0;if("selectionStart"in b)c=b.selectionStart,d=b.selectionEnd-c;else if("selection"in document){b.focus();var e=document.selection.createRange();d=document.selection.createRange().text.length,e.moveStart("character",-b.value.length),c=e.text.length-d}return{offset:c,length:d}}function A(a){a.preventDefault(),a.stopPropagation()}function B(a){a.preventDefault(),a.stopImmediatePropagation()}function C(b){if(!h){var c=b[0].currentStyle||window.getComputedStyle(b[0],null);h=a(document.createElement("div")).css({position:"absolute",left:"-10000px",top:"-10000px",display:"none",fontSize:c.fontSize,fontFamily:c.fontFamily,fontStyle:c.fontStyle,fontWeight:c.fontWeight,letterSpacing:c.letterSpacing,textTransform:c.textTransform,whiteSpace:"nowrap"}),h.attr("class","select2-sizer"),a("body").append(h)}return h.text(b.val()),h.width()}function D(b,c,d){var e,g,f=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0===this.indexOf("select2-")&&f.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0!==this.indexOf("select2-")&&(g=d(this),g&&f.push(g))})),b.attr("class",f.join(" "))}function E(a,b,c,d){var e=o(a.toUpperCase()).indexOf(o(b.toUpperCase())),f=b.length;return 0>e?(c.push(d(a)),void 0):(c.push(d(a.substring(0,e))),c.push("<span class='select2-match'>"),c.push(d(a.substring(e,e+f))),c.push("</span>"),c.push(d(a.substring(e+f,a.length))),void 0)}function F(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})}function G(c){var d,e=null,f=c.quietMillis||100,g=c.url,h=this;return function(i){window.clearTimeout(d),d=window.setTimeout(function(){var d=c.data,f=g,j=c.transport||a.fn.select2.ajaxDefaults.transport,k={type:c.type||"GET",cache:c.cache||!1,jsonpCallback:c.jsonpCallback||b,dataType:c.dataType||"json"},l=a.extend({},a.fn.select2.ajaxDefaults.params,k);d=d?d.call(h,i.term,i.page,i.context):null,f="function"==typeof f?f.call(h,i.term,i.page,i.context):f,e&&"function"==typeof e.abort&&e.abort(),c.params&&(a.isFunction(c.params)?a.extend(l,c.params.call(h)):a.extend(l,c.params)),a.extend(l,{url:f,dataType:c.dataType,data:d,success:function(a){var b=c.results(a,i.page,i);i.callback(b)},error:function(a,b,c){var d={hasError:!0,jqXHR:a,textStatus:b,errorThrown:c};i.callback(d)}}),e=j.call(h,l)},f)}}function H(b){var d,e,c=b,f=function(a){return""+a.text};a.isArray(c)&&(e=c,c={results:e}),a.isFunction(c)===!1&&(e=c,c=function(){return e});var g=c();return g.text&&(f=g.text,a.isFunction(f)||(d=g.text,f=function(a){return a[d]})),function(b){var g,d=b.term,e={results:[]};return""===d?(b.callback(c()),void 0):(g=function(c,e){var h,i;if(c=c[0],c.children){h={};for(i in c)c.hasOwnProperty(i)&&(h[i]=c[i]);h.children=[],a(c.children).each2(function(a,b){g(b,h.children)}),(h.children.length||b.matcher(d,f(h),c))&&e.push(h)}else b.matcher(d,f(c),c)&&e.push(c)},a(c().results).each2(function(a,b){g(b,e.results)}),b.callback(e),void 0)}}function I(c){var d=a.isFunction(c);return function(e){var f=e.term,g={results:[]},h=d?c(e):c;a.isArray(h)&&(a(h).each(function(){var a=this.text!==b,c=a?this.text:this;(""===f||e.matcher(f,c))&&g.results.push(a?this:{id:this,text:this})}),e.callback(g))}}function J(b,c){if(a.isFunction(b))return!0;if(!b)return!1;if("string"==typeof b)return!0;throw new Error(c+" must be a string, function, or falsy value")}function K(b,c){if(a.isFunction(b)){var d=Array.prototype.slice.call(arguments,2);return b.apply(c,d)}return b}function L(b){var c=0;return a.each(b,function(a,b){b.children?c+=L(b.children):c++}),c}function M(a,c,d,e){var h,i,j,k,l,f=a,g=!1;if(!e.createSearchChoice||!e.tokenSeparators||e.tokenSeparators.length<1)return b;for(;;){for(i=-1,j=0,k=e.tokenSeparators.length;k>j&&(l=e.tokenSeparators[j],i=a.indexOf(l),!(i>=0));j++);if(0>i)break;if(h=a.substring(0,i),a=a.substring(i+l.length),h.length>0&&(h=e.createSearchChoice.call(this,h,c),h!==b&&null!==h&&e.id(h)!==b&&null!==e.id(h))){for(g=!1,j=0,k=c.length;k>j;j++)if(r(e.id(h),e.id(c[j]))){g=!0;break}g||d(h)}}return f!==a?a:void 0}function N(){var b=this;a.each(arguments,function(a,c){b[c].remove(),b[c]=null})}function O(b,c){var d=function(){};return d.prototype=new b,d.prototype.constructor=d,d.prototype.parent=b.prototype,d.prototype=a.extend(d.prototype,c),d}if(window.Select2===b){var c,d,e,f,g,h,j,k,i={x:0,y:0},c={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,isArrow:function(a){switch(a=a.which?a.which:a){case c.LEFT:case c.RIGHT:case c.UP:case c.DOWN:return!0}return!1},isControl:function(a){var b=a.which;switch(b){case c.SHIFT:case c.CTRL:case c.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.which?a.which:a,a>=112&&123>=a}},l="<div class='select2-measure-scrollbar'></div>",m={"\u24b6":"A","\uff21":"A","\xc0":"A","\xc1":"A","\xc2":"A","\u1ea6":"A","\u1ea4":"A","\u1eaa":"A","\u1ea8":"A","\xc3":"A","\u0100":"A","\u0102":"A","\u1eb0":"A","\u1eae":"A","\u1eb4":"A","\u1eb2":"A","\u0226":"A","\u01e0":"A","\xc4":"A","\u01de":"A","\u1ea2":"A","\xc5":"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","\xc6":"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","\xc7":"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","\xc8":"E","\xc9":"E","\xca":"E","\u1ec0":"E","\u1ebe":"E","\u1ec4":"E","\u1ec2":"E","\u1ebc":"E","\u0112":"E","\u1e14":"E","\u1e16":"E","\u0114":"E","\u0116":"E","\xcb":"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","\xcc":"I","\xcd":"I","\xce":"I","\u0128":"I","\u012a":"I","\u012c":"I","\u0130":"I","\xcf":"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","\xd1":"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","\xd2":"O","\xd3":"O","\xd4":"O","\u1ed2":"O","\u1ed0":"O","\u1ed6":"O","\u1ed4":"O","\xd5":"O","\u1e4c":"O","\u022c":"O","\u1e4e":"O","\u014c":"O","\u1e50":"O","\u1e52":"O","\u014e":"O","\u022e":"O","\u0230":"O","\xd6":"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","\xd8":"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","\xd9":"U","\xda":"U","\xdb":"U","\u0168":"U","\u1e78":"U","\u016a":"U","\u1e7a":"U","\u016c":"U","\xdc":"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","\xdd":"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","\xe0":"a","\xe1":"a","\xe2":"a","\u1ea7":"a","\u1ea5":"a","\u1eab":"a","\u1ea9":"a","\xe3":"a","\u0101":"a","\u0103":"a","\u1eb1":"a","\u1eaf":"a","\u1eb5":"a","\u1eb3":"a","\u0227":"a","\u01e1":"a","\xe4":"a","\u01df":"a","\u1ea3":"a","\xe5":"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","\xe6":"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","\xe7":"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","\xe8":"e","\xe9":"e","\xea":"e","\u1ec1":"e","\u1ebf":"e","\u1ec5":"e","\u1ec3":"e","\u1ebd":"e","\u0113":"e","\u1e15":"e","\u1e17":"e","\u0115":"e","\u0117":"e","\xeb":"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","\xec":"i","\xed":"i","\xee":"i","\u0129":"i","\u012b":"i","\u012d":"i","\xef":"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","\xf1":"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","\xf2":"o","\xf3":"o","\xf4":"o","\u1ed3":"o","\u1ed1":"o","\u1ed7":"o","\u1ed5":"o","\xf5":"o","\u1e4d":"o","\u022d":"o","\u1e4f":"o","\u014d":"o","\u1e51":"o","\u1e53":"o","\u014f":"o","\u022f":"o","\u0231":"o","\xf6":"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","\xf8":"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","\xdf":"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","\xf9":"u","\xfa":"u","\xfb":"u","\u0169":"u","\u1e79":"u","\u016b":"u","\u1e7b":"u","\u016d":"u","\xfc":"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","\xfd":"y","\u0177":"y","\u1ef9":"y","\u0233":"y","\u1e8f":"y","\xff":"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"};j=a(document),g=function(){var a=1;return function(){return a++}}(),d=O(Object,{bind:function(a){var b=this;return function(){a.apply(b,arguments)}},init:function(c){var d,e,f=".select2-results";this.opts=c=this.prepareOpts(c),this.id=c.id,c.element.data("select2")!==b&&null!==c.element.data("select2")&&c.element.data("select2").destroy(),this.container=this.createContainer(),this.liveRegion=a("<span>",{role:"status","aria-live":"polite"}).addClass("select2-hidden-accessible").appendTo(document.body),this.containerId="s2id_"+(c.element.attr("id")||"autogen"+g()),this.containerEventName=this.containerId.replace(/([.])/g,"_").replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1"),this.container.attr("id",this.containerId),this.container.attr("title",c.element.attr("title")),this.body=a("body"),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.attr("style",c.element.attr("style")),this.container.css(K(c.containerCss,this.opts.element)),this.container.addClass(K(c.containerCssClass,this.opts.element)),this.elementTabIndex=this.opts.element.attr("tabindex"),this.opts.element.data("select2",this).attr("tabindex","-1").before(this.container).on("click.select2",A),this.container.data("select2",this),this.dropdown=this.container.find(".select2-drop"),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(c.dropdownCssClass,this.opts.element)),this.dropdown.data("select2",this),this.dropdown.on("click",A),this.results=d=this.container.find(f),this.search=e=this.container.find("input.select2-input"),this.queryCount=0,this.resultsPage=0,this.context=null,this.initContainer(),this.container.on("click",A),v(this.results),this.dropdown.on("mousemove-filtered",f,this.bind(this.highlightUnderEvent)),this.dropdown.on("touchstart touchmove touchend",f,this.bind(function(a){this._touchEvent=!0,this.highlightUnderEvent(a)})),this.dropdown.on("touchmove",f,this.bind(this.touchMoved)),this.dropdown.on("touchstart touchend",f,this.bind(this.clearTouchMoved)),this.dropdown.on("click",this.bind(function(){this._touchEvent&&(this._touchEvent=!1,this.selectHighlighted())})),x(80,this.results),this.dropdown.on("scroll-debounced",f,this.bind(this.loadMoreIfNeeded)),a(this.container).on("change",".select2-input",function(a){a.stopPropagation()}),a(this.dropdown).on("change",".select2-input",function(a){a.stopPropagation()}),a.fn.mousewheel&&d.mousewheel(function(a,b,c,e){var f=d.scrollTop();e>0&&0>=f-e?(d.scrollTop(0),A(a)):0>e&&d.get(0).scrollHeight-d.scrollTop()+e<=d.height()&&(d.scrollTop(d.get(0).scrollHeight-d.height()),A(a))}),u(e),e.on("keyup-change input paste",this.bind(this.updateResults)),e.on("focus",function(){e.addClass("select2-focused")}),e.on("blur",function(){e.removeClass("select2-focused")}),this.dropdown.on("mouseup",f,this.bind(function(b){a(b.target).closest(".select2-result-selectable").length>0&&(this.highlightUnderEvent(b),this.selectHighlighted(b))})),this.dropdown.on("click mouseup mousedown touchstart touchend focusin",function(a){a.stopPropagation()}),this.nextSearchTerm=b,a.isFunction(this.opts.initSelection)&&(this.initSelection(),this.monitorSource()),null!==c.maximumInputLength&&this.search.attr("maxlength",c.maximumInputLength);var h=c.element.prop("disabled");h===b&&(h=!1),this.enable(!h);var i=c.element.prop("readonly");i===b&&(i=!1),this.readonly(i),k=k||q(),this.autofocus=c.element.prop("autofocus"),c.element.prop("autofocus",!1),this.autofocus&&this.focus(),this.search.attr("placeholder",c.searchInputPlaceholder)},destroy:function(){var a=this.opts.element,c=a.data("select2"),d=this;this.close(),a.length&&a[0].detachEvent&&a.each(function(){this.detachEvent("onpropertychange",d._sync)}),this.propertyObserver&&(this.propertyObserver.disconnect(),this.propertyObserver=null),this._sync=null,c!==b&&(c.container.remove(),c.liveRegion.remove(),c.dropdown.remove(),a.removeClass("select2-offscreen").removeData("select2").off(".select2").prop("autofocus",this.autofocus||!1),this.elementTabIndex?a.attr({tabindex:this.elementTabIndex}):a.removeAttr("tabindex"),a.show()),N.call(this,"container","liveRegion","dropdown","results","search")},optionToData:function(a){return a.is("option")?{id:a.prop("value"),text:a.text(),element:a.get(),css:a.attr("class"),disabled:a.prop("disabled"),locked:r(a.attr("locked"),"locked")||r(a.data("locked"),!0)}:a.is("optgroup")?{text:a.attr("label"),children:[],element:a.get(),css:a.attr("class")}:void 0},prepareOpts:function(c){var d,e,f,h,i=this;if(d=c.element,"select"===d.get(0).tagName.toLowerCase()&&(this.select=e=c.element),e&&a.each(["id","multiple","ajax","query","createSearchChoice","initSelection","data","tags"],function(){if(this in c)throw new Error("Option '"+this+"' is not allowed for Select2 when attached to a <select> element.")}),c=a.extend({},{populateResults:function(d,e,f){var h,j=this.opts.id,k=this.liveRegion;h=function(d,e,l){var m,n,o,p,q,r,s,t,u,v;d=c.sortResults(d,e,f);var w=[];for(m=0,n=d.length;n>m;m+=1)o=d[m],q=o.disabled===!0,p=!q&&j(o)!==b,r=o.children&&o.children.length>0,s=a("<li></li>"),s.addClass("select2-results-dept-"+l),s.addClass("select2-result"),s.addClass(p?"select2-result-selectable":"select2-result-unselectable"),q&&s.addClass("select2-disabled"),r&&s.addClass("select2-result-with-children"),s.addClass(i.opts.formatResultCssClass(o)),s.attr("role","presentation"),t=a(document.createElement("div")),t.addClass("select2-result-label"),t.attr("id","select2-result-label-"+g()),t.attr("role","option"),v=c.formatResult(o,t,f,i.opts.escapeMarkup),v!==b&&(t.html(v),s.append(t)),r&&(u=a("<ul></ul>"),u.addClass("select2-result-sub"),h(o.children,u,l+1),s.append(u)),s.data("select2-data",o),w.push(s[0]);e.append(w),k.text(c.formatMatches(d.length))},h(e,d,0)}},a.fn.select2.defaults,c),"function"!=typeof c.id&&(f=c.id,c.id=function(a){return a[f]}),a.isArray(c.element.data("select2Tags"))){if("tags"in c)throw"tags specified as both an attribute 'data-select2-tags' and in options of Select2 "+c.element.attr("id");c.tags=c.element.data("select2Tags")}if(e?(c.query=this.bind(function(a){var f,g,h,c={results:[],more:!1},e=a.term;h=function(b,c){var d;b.is("option")?a.matcher(e,b.text(),b)&&c.push(i.optionToData(b)):b.is("optgroup")&&(d=i.optionToData(b),b.children().each2(function(a,b){h(b,d.children)}),d.children.length>0&&c.push(d))},f=d.children(),this.getPlaceholder()!==b&&f.length>0&&(g=this.getPlaceholderOption(),g&&(f=f.not(g))),f.each2(function(a,b){h(b,c.results)}),a.callback(c)}),c.id=function(a){return a.id}):"query"in c||("ajax"in c?(h=c.element.data("ajax-url"),h&&h.length>0&&(c.ajax.url=h),c.query=G.call(c.element,c.ajax)):"data"in c?c.query=H(c.data):"tags"in c&&(c.query=I(c.tags),c.createSearchChoice===b&&(c.createSearchChoice=function(b){return{id:a.trim(b),text:a.trim(b)}}),c.initSelection===b&&(c.initSelection=function(b,d){var e=[];a(s(b.val(),c.separator)).each(function(){var b={id:this,text:this},d=c.tags;a.isFunction(d)&&(d=d()),a(d).each(function(){return r(this.id,b.id)?(b=this,!1):void 0}),e.push(b)}),d(e)}))),"function"!=typeof c.query)throw"query function not defined for Select2 "+c.element.attr("id");if("top"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.unshift(b)};else if("bottom"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.push(b)};else if("function"!=typeof c.createSearchChoicePosition)throw"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";return c},monitorSource:function(){var d,c=this.opts.element,e=this;c.on("change.select2",this.bind(function(){this.opts.element.data("select2-change-triggered")!==!0&&this.initSelection()})),this._sync=this.bind(function(){var a=c.prop("disabled");a===b&&(a=!1),this.enable(!a);var d=c.prop("readonly");d===b&&(d=!1),this.readonly(d),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.addClass(K(this.opts.containerCssClass,this.opts.element)),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(this.opts.dropdownCssClass,this.opts.element))}),c.length&&c[0].attachEvent&&c.each(function(){this.attachEvent("onpropertychange",e._sync)}),d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,d!==b&&(this.propertyObserver&&(delete this.propertyObserver,this.propertyObserver=null),this.propertyObserver=new d(function(b){a.each(b,e._sync)}),this.propertyObserver.observe(c.get(0),{attributes:!0,subtree:!1}))},triggerSelect:function(b){var c=a.Event("select2-selecting",{val:this.id(b),object:b,choice:b});return this.opts.element.trigger(c),!c.isDefaultPrevented()},triggerChange:function(b){b=b||{},b=a.extend({},b,{type:"change",val:this.val()}),this.opts.element.data("select2-change-triggered",!0),this.opts.element.trigger(b),this.opts.element.data("select2-change-triggered",!1),this.opts.element.click(),this.opts.blurOnChange&&this.opts.element.blur()},isInterfaceEnabled:function(){return this.enabledInterface===!0},enableInterface:function(){var a=this._enabled&&!this._readonly,b=!a;return a===this.enabledInterface?!1:(this.container.toggleClass("select2-container-disabled",b),this.close(),this.enabledInterface=a,!0)},enable:function(a){a===b&&(a=!0),this._enabled!==a&&(this._enabled=a,this.opts.element.prop("disabled",!a),this.enableInterface())},disable:function(){this.enable(!1)},readonly:function(a){a===b&&(a=!1),this._readonly!==a&&(this._readonly=a,this.opts.element.prop("readonly",a),this.enableInterface())},opened:function(){return this.container?this.container.hasClass("select2-dropdown-open"):!1},positionDropdown:function(){var t,u,v,w,x,b=this.dropdown,c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),g=a(window),h=g.width(),i=g.height(),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,o=l>=m+f,p=c.top-f>=g.scrollTop(),q=b.outerWidth(!1),r=j>=n+q,s=b.hasClass("select2-drop-above");s?(u=!0,!p&&o&&(v=!0,u=!1)):(u=!1,!o&&p&&(v=!0,u=!0)),v&&(b.hide(),c=this.container.offset(),d=this.container.outerHeight(!1),e=this.container.outerWidth(!1),f=b.outerHeight(!1),j=g.scrollLeft()+h,l=g.scrollTop()+i,m=c.top+d,n=c.left,q=b.outerWidth(!1),r=j>=n+q,b.show(),this.focusSearch()),this.opts.dropdownAutoWidth?(x=a(".select2-results",b)[0],b.addClass("select2-drop-auto-width"),b.css("width",""),q=b.outerWidth(!1)+(x.scrollHeight===x.clientHeight?0:k.width),q>e?e=q:q=e,f=b.outerHeight(!1),r=j>=n+q):this.container.removeClass("select2-drop-auto-width"),"static"!==this.body.css("position")&&(t=this.body.offset(),m-=t.top,n-=t.left),r||(n=c.left+this.container.outerWidth(!1)-q),w={left:n,width:e},u?(w.top=c.top-f,w.bottom="auto",this.container.addClass("select2-drop-above"),b.addClass("select2-drop-above")):(w.top=m,w.bottom="auto",this.container.removeClass("select2-drop-above"),b.removeClass("select2-drop-above")),w=a.extend(w,K(this.opts.dropdownCss,this.opts.element)),b.css(w)},shouldOpen:function(){var b;return this.opened()?!1:this._enabled===!1||this._readonly===!0?!1:(b=a.Event("select2-opening"),this.opts.element.trigger(b),!b.isDefaultPrevented())},clearDropdownAlignmentPreference:function(){this.container.removeClass("select2-drop-above"),this.dropdown.removeClass("select2-drop-above")},open:function(){return this.shouldOpen()?(this.opening(),j.on("mousemove.select2Event",function(a){i.x=a.pageX,i.y=a.pageY}),!0):!1},opening:function(){var f,b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.addClass("select2-dropdown-open").addClass("select2-container-active"),this.clearDropdownAlignmentPreference(),this.dropdown[0]!==this.body.children().last()[0]&&this.dropdown.detach().appendTo(this.body),f=a("#select2-drop-mask"),0==f.length&&(f=a(document.createElement("div")),f.attr("id","select2-drop-mask").attr("class","select2-drop-mask"),f.hide(),f.appendTo(this.body),f.on("mousedown touchstart click",function(b){n(f);var d,c=a("#select2-drop");c.length>0&&(d=c.data("select2"),d.opts.selectOnBlur&&d.selectHighlighted({noFocus:!0}),d.close(),b.preventDefault(),b.stopPropagation())})),this.dropdown.prev()[0]!==f[0]&&this.dropdown.before(f),a("#select2-drop").removeAttr("id"),this.dropdown.attr("id","select2-drop"),f.show(),this.positionDropdown(),this.dropdown.show(),this.positionDropdown(),this.dropdown.addClass("select2-drop-active");var g=this;this.container.parents().add(window).each(function(){a(this).on(d+" "+c+" "+e,function(){g.opened()&&g.positionDropdown()})})},close:function(){if(this.opened()){var b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.parents().add(window).each(function(){a(this).off(c).off(d).off(e)}),this.clearDropdownAlignmentPreference(),a("#select2-drop-mask").hide(),this.dropdown.removeAttr("id"),this.dropdown.hide(),this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"),this.results.empty(),j.off("mousemove.select2Event"),this.clearSearch(),this.search.removeClass("select2-active"),this.opts.element.trigger(a.Event("select2-close"))}},externalSearch:function(a){this.open(),this.search.val(a),this.updateResults(!1)},clearSearch:function(){},getMaximumSelectionSize:function(){return K(this.opts.maximumSelectionSize,this.opts.element)},ensureHighlightVisible:function(){var c,d,e,f,g,h,i,j,b=this.results;if(d=this.highlight(),!(0>d)){if(0==d)return b.scrollTop(0),void 0;c=this.findHighlightableChoices().find(".select2-result-label"),e=a(c[d]),j=(e.offset()||{}).top||0,f=j+e.outerHeight(!0),d===c.length-1&&(i=b.find("li.select2-more-results"),i.length>0&&(f=i.offset().top+i.outerHeight(!0))),g=b.offset().top+b.outerHeight(!0),f>g&&b.scrollTop(b.scrollTop()+(f-g)),h=j-b.offset().top,0>h&&"none"!=e.css("display")&&b.scrollTop(b.scrollTop()+h)}},findHighlightableChoices:function(){return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)")},moveHighlight:function(b){for(var c=this.findHighlightableChoices(),d=this.highlight();d>-1&&d<c.length;){d+=b;var e=a(c[d]);if(e.hasClass("select2-result-selectable")&&!e.hasClass("select2-disabled")&&!e.hasClass("select2-selected")){this.highlight(d);
22
- break}}},highlight:function(b){var d,e,c=this.findHighlightableChoices();return 0===arguments.length?p(c.filter(".select2-highlighted")[0],c.get()):(b>=c.length&&(b=c.length-1),0>b&&(b=0),this.removeHighlight(),d=a(c[b]),d.addClass("select2-highlighted"),this.search.attr("aria-activedescendant",d.find(".select2-result-label").attr("id")),this.ensureHighlightVisible(),this.liveRegion.text(d.text()),e=d.data("select2-data"),e&&this.opts.element.trigger({type:"select2-highlight",val:this.id(e),choice:e}),void 0)},removeHighlight:function(){this.results.find(".select2-highlighted").removeClass("select2-highlighted")},touchMoved:function(){this._touchMoved=!0},clearTouchMoved:function(){this._touchMoved=!1},countSelectableResults:function(){return this.findHighlightableChoices().length},highlightUnderEvent:function(b){var c=a(b.target).closest(".select2-result-selectable");if(c.length>0&&!c.is(".select2-highlighted")){var d=this.findHighlightableChoices();this.highlight(d.index(c))}else 0==c.length&&this.removeHighlight()},loadMoreIfNeeded:function(){var c,a=this.results,b=a.find("li.select2-more-results"),d=this.resultsPage+1,e=this,f=this.search.val(),g=this.context;0!==b.length&&(c=b.offset().top-a.offset().top-a.height(),c<=this.opts.loadMorePadding&&(b.addClass("select2-active"),this.opts.query({element:this.opts.element,term:f,page:d,context:g,matcher:this.opts.matcher,callback:this.bind(function(c){e.opened()&&(e.opts.populateResults.call(this,a,c.results,{term:f,page:d,context:g}),e.postprocessResults(c,!1,!1),c.more===!0?(b.detach().appendTo(a).text(K(e.opts.formatLoadMore,e.opts.element,d+1)),window.setTimeout(function(){e.loadMoreIfNeeded()},10)):b.remove(),e.positionDropdown(),e.resultsPage=d,e.context=c.context,this.opts.element.trigger({type:"select2-loaded",items:c}))})})))},tokenize:function(){},updateResults:function(c){function m(){d.removeClass("select2-active"),h.positionDropdown(),e.find(".select2-no-results,.select2-selection-limit,.select2-searching").length?h.liveRegion.text(e.text()):h.liveRegion.text(h.opts.formatMatches(e.find(".select2-result-selectable").length))}function n(a){e.html(a),m()}var g,i,l,d=this.search,e=this.results,f=this.opts,h=this,j=d.val(),k=a.data(this.container,"select2-last-term");if((c===!0||!k||!r(j,k))&&(a.data(this.container,"select2-last-term",j),c===!0||this.showSearchInput!==!1&&this.opened())){l=++this.queryCount;var o=this.getMaximumSelectionSize();if(o>=1&&(g=this.data(),a.isArray(g)&&g.length>=o&&J(f.formatSelectionTooBig,"formatSelectionTooBig")))return n("<li class='select2-selection-limit'>"+K(f.formatSelectionTooBig,f.element,o)+"</li>"),void 0;if(d.val().length<f.minimumInputLength)return J(f.formatInputTooShort,"formatInputTooShort")?n("<li class='select2-no-results'>"+K(f.formatInputTooShort,f.element,d.val(),f.minimumInputLength)+"</li>"):n(""),c&&this.showSearch&&this.showSearch(!0),void 0;if(f.maximumInputLength&&d.val().length>f.maximumInputLength)return J(f.formatInputTooLong,"formatInputTooLong")?n("<li class='select2-no-results'>"+K(f.formatInputTooLong,f.element,d.val(),f.maximumInputLength)+"</li>"):n(""),void 0;f.formatSearching&&0===this.findHighlightableChoices().length&&n("<li class='select2-searching'>"+K(f.formatSearching,f.element)+"</li>"),d.addClass("select2-active"),this.removeHighlight(),i=this.tokenize(),i!=b&&null!=i&&d.val(i),this.resultsPage=1,f.query({element:f.element,term:d.val(),page:this.resultsPage,context:null,matcher:f.matcher,callback:this.bind(function(g){var i;if(l==this.queryCount){if(!this.opened())return this.search.removeClass("select2-active"),void 0;if(g.hasError!==b&&J(f.formatAjaxError,"formatAjaxError"))return n("<li class='select2-ajax-error'>"+K(f.formatAjaxError,f.element,g.jqXHR,g.textStatus,g.errorThrown)+"</li>"),void 0;if(this.context=g.context===b?null:g.context,this.opts.createSearchChoice&&""!==d.val()&&(i=this.opts.createSearchChoice.call(h,d.val(),g.results),i!==b&&null!==i&&h.id(i)!==b&&null!==h.id(i)&&0===a(g.results).filter(function(){return r(h.id(this),h.id(i))}).length&&this.opts.createSearchChoicePosition(g.results,i)),0===g.results.length&&J(f.formatNoMatches,"formatNoMatches"))return n("<li class='select2-no-results'>"+K(f.formatNoMatches,f.element,d.val())+"</li>"),void 0;e.empty(),h.opts.populateResults.call(this,e,g.results,{term:d.val(),page:this.resultsPage,context:null}),g.more===!0&&J(f.formatLoadMore,"formatLoadMore")&&(e.append("<li class='select2-more-results'>"+f.escapeMarkup(K(f.formatLoadMore,f.element,this.resultsPage))+"</li>"),window.setTimeout(function(){h.loadMoreIfNeeded()},10)),this.postprocessResults(g,c),m(),this.opts.element.trigger({type:"select2-loaded",items:g})}})})}},cancel:function(){this.close()},blur:function(){this.opts.selectOnBlur&&this.selectHighlighted({noFocus:!0}),this.close(),this.container.removeClass("select2-container-active"),this.search[0]===document.activeElement&&this.search.blur(),this.clearSearch(),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus")},focusSearch:function(){y(this.search)},selectHighlighted:function(a){if(this._touchMoved)return this.clearTouchMoved(),void 0;var b=this.highlight(),c=this.results.find(".select2-highlighted"),d=c.closest(".select2-result").data("select2-data");d?(this.highlight(b),this.onSelect(d,a)):a&&a.noFocus&&this.close()},getPlaceholder:function(){var a;return this.opts.element.attr("placeholder")||this.opts.element.attr("data-placeholder")||this.opts.element.data("placeholder")||this.opts.placeholder||((a=this.getPlaceholderOption())!==b?a.text():b)},getPlaceholderOption:function(){if(this.select){var c=this.select.children("option").first();if(this.opts.placeholderOption!==b)return"first"===this.opts.placeholderOption&&c||"function"==typeof this.opts.placeholderOption&&this.opts.placeholderOption(this.select);if(""===a.trim(c.text())&&""===c.val())return c}},initContainerWidth:function(){function c(){var c,d,e,f,g,h;if("off"===this.opts.width)return null;if("element"===this.opts.width)return 0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px";if("copy"===this.opts.width||"resolve"===this.opts.width){if(c=this.opts.element.attr("style"),c!==b)for(d=c.split(";"),f=0,g=d.length;g>f;f+=1)if(h=d[f].replace(/\s/g,""),e=h.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i),null!==e&&e.length>=1)return e[1];return"resolve"===this.opts.width?(c=this.opts.element.css("width"),c.indexOf("%")>0?c:0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px"):null}return a.isFunction(this.opts.width)?this.opts.width():this.opts.width}var d=c.call(this);null!==d&&this.container.css("width",d)}}),e=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container"}).html(["<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>"," <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>"," <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>","</a>","<label for='' class='select2-offscreen'></label>","<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />","<div class='select2-drop select2-display-none'>"," <div class='select2-search'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'"," aria-autocomplete='list' />"," </div>"," <ul class='select2-results' role='listbox'>"," </ul>","</div>"].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var c,d,e;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),c=this.search.get(0),c.createTextRange?(d=c.createTextRange(),d.collapse(!1),d.select()):c.setSelectionRange&&(e=this.search.val().length,c.setSelectionRange(e,e))),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,h,d=this.container,e=this.dropdown,f=g();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=d.find(".select2-choice"),this.focusser=d.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+f),this.focusser.attr("aria-labelledby","select2-chosen-"+f),this.results.attr("id","select2-results-"+f),this.search.attr("aria-owns","select2-results-"+f),this.focusser.attr("id","s2id_autogen"+f),h=a("label[for='"+this.opts.element.attr("id")+"']"),this.focusser.prev().text(h.text()).attr("for",this.focusser.attr("id"));var i=this.opts.element.attr("title");this.opts.element.attr("title",i||h.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&229!=a.keyCode){if(a.which===c.PAGE_UP||a.which===c.PAGE_DOWN)return A(a),void 0;switch(a.which){case c.UP:case c.DOWN:return this.moveHighlight(a.which===c.UP?-1:1),A(a),void 0;case c.ENTER:return this.selectHighlighted(),A(a),void 0;case c.TAB:return this.selectHighlighted({noFocus:!0}),void 0;case c.ESC:return this.cancel(a),A(a),void 0}}})),this.search.on("blur",this.bind(function(){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==c.TAB&&!c.isControl(a)&&!c.isFunctionKey(a)&&a.which!==c.ESC){if(this.opts.openOnEnter===!1&&a.which===c.ENTER)return A(a),void 0;if(a.which==c.DOWN||a.which==c.UP||a.which==c.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),A(a),void 0}return a.which==c.DELETE||a.which==c.BACKSPACE?(this.opts.allowClear&&this.clear(),A(a),void 0):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),e.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.nextSearchTerm=c.opts.nextSearchTerm(a,c.search.val()))})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1]),this.select)this.select.val(a).find("option").filter(function(){return this.selected}).each2(function(a,b){return d=e.optionToData(b),!1}),this.updateSelection(d),this.setPlaceholder(),c&&this.triggerChange({added:d,removed:f});else{if(!a&&0!==a)return this.clear(c),void 0;if(this.opts.initSelection===b)throw new Error("cannot call val() if initSelection() is not defined");this.opts.element.val(a),this.opts.initSelection(this.opts.element,function(a){e.opts.element.val(a?e.id(a):""),e.updateSelection(a),e.setPlaceholder(),c&&e.triggerChange({added:a,removed:f})})}},clearSearch:function(){this.search.val(""),this.focusser.val("")},data:function(a){var c,d=!1;return 0===arguments.length?(c=this.selection.data("select2-data"),c==b&&(c=null),c):(arguments.length>1&&(d=arguments[1]),a?(c=this.data(),this.opts.element.val(a?this.id(a):""),this.updateSelection(a),d&&this.triggerChange({added:a,removed:c})):this.clear(d),void 0)}}),f=O(d,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container select2-container-multi"}).html(["<ul class='select2-choices'>"," <li class='select2-search-field'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>"," </li>","</ul>","<div class='select2-drop select2-drop-multi select2-display-none'>"," <ul class='select2-results'>"," </ul>","</div>"].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c<e.length;c++)for(var g=e[c],h=0;h<f.length;h++){var i=f[h];if(r(g,b.id(i))){a.push(i),f.splice(h,1);break}}d(a)}:a.noop})}),b},selectChoice:function(a){var b=this.container.find(".select2-search-choice-focus");b.length&&a&&a[0]==b[0]||(b.length&&this.opts.element.trigger("choice-deselected",b),b.removeClass("select2-search-choice-focus"),a&&a.length&&(this.close(),a.addClass("select2-search-choice-focus"),this.opts.element.trigger("choice-selected",a)))},destroy:function(){a("label[for='"+this.search.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"searchContainer","selection")},initContainer:function(){var d,b=".select2-choices";this.searchContainer=this.container.find(".select2-search-field"),this.selection=d=this.container.find(b);var e=this;this.selection.on("click",".select2-search-choice:not(.select2-locked)",function(){e.search[0].focus(),e.selectChoice(a(this))}),this.search.attr("id","s2id_autogen"+g()),this.search.prev().text(a("label[for='"+this.opts.element.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("input paste",this.bind(function(){this.search.attr("placeholder")&&0==this.search.val().length||this.isInterfaceEnabled()&&(this.opened()||this.open())})),this.search.attr("tabindex",this.elementTabIndex),this.keydowns=0,this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()){++this.keydowns;var b=d.find(".select2-search-choice-focus"),e=b.prev(".select2-search-choice:not(.select2-locked)"),f=b.next(".select2-search-choice:not(.select2-locked)"),g=z(this.search);if(b.length&&(a.which==c.LEFT||a.which==c.RIGHT||a.which==c.BACKSPACE||a.which==c.DELETE||a.which==c.ENTER)){var h=b;return a.which==c.LEFT&&e.length?h=e:a.which==c.RIGHT?h=f.length?f:null:a.which===c.BACKSPACE?this.unselect(b.first())&&(this.search.width(10),h=e.length?e:f):a.which==c.DELETE?this.unselect(b.first())&&(this.search.width(10),h=f.length?f:null):a.which==c.ENTER&&(h=null),this.selectChoice(h),A(a),h&&h.length||this.open(),void 0}if((a.which===c.BACKSPACE&&1==this.keydowns||a.which==c.LEFT)&&0==g.offset&&!g.length)return this.selectChoice(d.find(".select2-search-choice:not(.select2-locked)").last()),A(a),void 0;if(this.selectChoice(null),this.opened())switch(a.which){case c.UP:case c.DOWN:return this.moveHighlight(a.which===c.UP?-1:1),A(a),void 0;case c.ENTER:return this.selectHighlighted(),A(a),void 0;case c.TAB:return this.selectHighlighted({noFocus:!0}),this.close(),void 0;case c.ESC:return this.cancel(a),A(a),void 0}if(a.which!==c.TAB&&!c.isControl(a)&&!c.isFunctionKey(a)&&a.which!==c.BACKSPACE&&a.which!==c.ESC){if(a.which===c.ENTER){if(this.opts.openOnEnter===!1)return;if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return}this.open(),(a.which===c.PAGE_UP||a.which===c.PAGE_DOWN)&&A(a),a.which===c.ENTER&&A(a)}}})),this.search.on("keyup",this.bind(function(){this.keydowns=0,this.resizeSearch()})),this.search.on("blur",this.bind(function(b){this.container.removeClass("select2-container-active"),this.search.removeClass("select2-focused"),this.selectChoice(null),this.opened()||this.clearSearch(),b.stopImmediatePropagation(),this.opts.element.trigger(a.Event("select2-blur"))})),this.container.on("click",b,this.bind(function(b){this.isInterfaceEnabled()&&(a(b.target).closest(".select2-search-choice").length>0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.addClass("select2-offscreen"),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c=[],d=[],e=this;a(b).each(function(){p(e.id(this),c)<0&&(c.push(e.id(this)),d.push(this))}),b=d,this.selection.find(".select2-search-choice").remove(),a(b).each(function(){e.addSelectedChoice(this)}),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,c){this.triggerSelect(a)&&""!==a.text&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.updateResults(),this.search.select()),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),c&&c.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(c){var j,k,d=!c.locked,e=a("<li class='select2-search-choice'> <div></div> <a href='#' class='select2-search-choice-close' tabindex='-1'></a></li>"),f=a("<li class='select2-search-choice select2-locked'><div></div></li>"),g=d?e:f,h=this.id(c),i=this.getVal();j=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),j!=b&&g.find("div").replaceWith("<div>"+j+"</div>"),k=this.opts.formatSelectionCssClass(c,g.find("div")),k!=b&&g.addClass(k),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),i.push(h),this.setVal(i)},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("<li class='select2-no-results'>"+K(g.opts.formatNoMatches,g.opts.element,g.search.val())+"</li>")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator))},setVal:function(b){var c;this.select?this.select.val(b):(c=[],a(b).each(function(){p(this,c)<0&&c.push(this)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator)))},buildChangeDetails:function(a,b){for(var b=b.slice(0),a=a.slice(0),c=0;c<b.length;c++)for(var d=0;d<a.length;d++)r(this.opts.id(b[c]),this.opts.id(a[d]))&&(b.splice(c,1),c>0&&c--,a.splice(d,1),d--);return{added:b,removed:a}},val:function(c,d){var e,f=this;if(0===arguments.length)return this.getVal();if(e=this.data(),e.length||(e=[]),!c&&0!==c)return this.opts.element.val(""),this.updateSelection([]),this.clearSearch(),d&&this.triggerChange({added:this.data(),removed:e}),void 0;if(this.setVal(c),this.select)this.opts.initSelection(this.select,this.bind(this.updateSelection)),d&&this.triggerChange(this.buildChangeDetails(e,this.data()));else{if(this.opts.initSelection===b)throw new Error("val() cannot be called if initSelection() is not defined");this.opts.initSelection(this.opts.element,function(b){var c=a.map(b,f.id);f.setVal(c),f.updateSelection(b),f.clearSearch(),d&&f.triggerChange(f.buildChangeDetails(e,f.data()))})}this.clearSearch()},onSortStart:function(){if(this.select)throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(a.text,c.term,e,d),e.join("")},formatSelection:function(a,c,d){return a?d(a.text):b},sortResults:function(a){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(){return b},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(){return null},nextSearchTerm:function(){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b?a.opts.minimumResultsForSearch<0?!1:!0:!0}},a.fn.select2.locales=[],a.fn.select2.locales.en={formatMatches:function(a){return 1===a?"One result is available, press enter to select it.":a+" results are available, use up and down arrow keys to navigate."
23
- },formatNoMatches:function(){return"No matches found"},formatAjaxError:function(){return"Loading failed"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"}},a.extend(a.fn.select2.defaults,a.fn.select2.locales.en),a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":d,single:e,multi:f}}}}(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2.png DELETED
Binary file
js/select2-3.5.1-old/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 (n == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return n == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + n + " إختيارات فقط"; },
14
- formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; },
15
- formatSearching: function () { return "البحث…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ar']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2_locale_es.js DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * Select2 Spanish translation
3
- */
4
- (function ($) {
5
- "use strict";
6
-
7
- $.fn.select2.locales['es'] = {
8
- formatNoMatches: function () { return "No se encontraron resultados"; },
9
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor, introduzca " + n + " car" + (n == 1? "ácter" : "acteres"); },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor, elimine " + n + " car" + (n == 1? "ácter" : "acteres"); },
11
- formatSelectionTooBig: function (limit) { return "Sólo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
12
- formatLoadMore: function (pageNumber) { return "Cargando más resultados…"; },
13
- formatSearching: function () { return "Buscando…"; }
14
- };
15
-
16
- $.extend($.fn.select2.defaults, $.fn.select2.locales['es']);
17
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2_locale_id.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Indonesian translation.
3
- *
4
- * Author: Ibrahim Yusuf <ibrahim7usuf@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['id'] = {
10
- formatNoMatches: function () { return "Tidak ada data yang sesuai"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi" + (n == 1 ? "" : "s"); },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapus " + n + " huruf" + (n == 1 ? "" : "s"); },
13
- formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan" + (limit == 1 ? "" : "s"); },
14
- formatLoadMore: function (pageNumber) { return "Mengambil data…"; },
15
- formatSearching: function () { return "Mencari…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['id']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2_locale_ms.js DELETED
@@ -1,19 +0,0 @@
1
- /**
2
- * Select2 Malay translation.
3
- *
4
- * Author: Kepoweran <kepoweran@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['ms'] = {
10
- formatNoMatches: function () { return "Tiada padanan yang ditemui"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Sila masukkan " + n + " aksara lagi"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Sila hapuskan " + n + " aksara"; },
13
- formatSelectionTooBig: function (limit) { return "Anda hanya boleh memilih " + limit + " pilihan"; },
14
- formatLoadMore: function (pageNumber) { return "Sedang memuatkan keputusan…"; },
15
- formatSearching: function () { return "Mencari…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['ms']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2_locale_no.js DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * Select2 Norwegian translation.
3
- *
4
- * Author: Torgeir Veimo <torgeir.veimo@gmail.com>
5
- */
6
- (function ($) {
7
- "use strict";
8
-
9
- $.fn.select2.locales['no'] = {
10
- formatNoMatches: function () { return "Ingen treff"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; },
13
- formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; },
14
- formatLoadMore: function (pageNumber) { return "Laster flere resultater…"; },
15
- formatSearching: function () { return "Søker…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['no']);
19
- })(jQuery);
20
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2_locale_pl.js DELETED
@@ -1,25 +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
- */
8
- (function ($) {
9
- "use strict";
10
-
11
- $.fn.select2.locales['pl'] = {
12
- formatNoMatches: function () { return "Brak wyników"; },
13
- formatInputTooShort: function (input, min) { return "Wpisz co najmniej" + character(min - input.length, "znak", "i"); },
14
- formatInputTooLong: function (input, max) { return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i"); },
15
- formatSelectionTooBig: function (limit) { return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y"); },
16
- formatLoadMore: function (pageNumber) { return "Ładowanie wyników…"; },
17
- formatSearching: function () { return "Szukanie…"; }
18
- };
19
-
20
- $.extend($.fn.select2.defaults, $.fn.select2.locales['pl']);
21
-
22
- function character (n, word, pluralSuffix) {
23
- return " " + n + " " + word + (n == 1 ? "" : n%10 < 5 && n%10 > 1 && (n%100 < 5 || n%100 > 20) ? pluralSuffix : "ów");
24
- }
25
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2_locale_pt-BR.js DELETED
@@ -1,17 +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
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite mais " + n + " caracter" + (n == 1? "" : "es"); },
10
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); },
11
- formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); },
12
- formatLoadMore: function (pageNumber) { return "Carregando mais resultados…"; },
13
- formatSearching: function () { return "Buscando…"; }
14
- };
15
-
16
- $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-BR']);
17
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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 <= 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 <= 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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2_locale_tr.js DELETED
@@ -1,19 +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
- formatNoMatches: function () { return "Sonuç bulunamadı"; },
11
- formatInputTooShort: function (input, min) { var n = min - input.length; return "En az " + n + " karakter daha girmelisiniz"; },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return n + " karakter azaltmalısınız"; },
13
- formatSelectionTooBig: function (limit) { return "Sadece " + limit + " seçim yapabilirsiniz"; },
14
- formatLoadMore: function (pageNumber) { return "Daha fazla…"; },
15
- formatSearching: function () { return "Aranıyor…"; }
16
- };
17
-
18
- $.extend($.fn.select2.defaults, $.fn.select2.locales['tr']);
19
- })(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2_locale_vi.js DELETED
@@ -1,20 +0,0 @@
1
- /**
2
- * Select2 Vietnamese translation.
3
- *
4
- * Author: Long Nguyen <olragon@gmail.com>
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ự" + (n == 1 ? "" : "s"); },
12
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự" + (n == 1? "" : "s"); },
13
- formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " tùy chọn" + (limit == 1 ? "" : "s"); },
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
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/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);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/select2-3.5.1-old/select2x2.png DELETED
Binary file
js/timeago/jquery.timeago.js CHANGED
@@ -3,7 +3,7 @@
3
  * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
4
  *
5
  * @name timeago
6
- * @version 1.5.2
7
  * @requires jQuery v1.2.3+
8
  * @author Ryan McGeary
9
  * @license MIT License - http://www.opensource.org/licenses/mit-license.php
@@ -11,32 +11,32 @@
11
  * For usage and examples, visit:
12
  * http://timeago.yarp.com/
13
  *
14
- * Copyright (c) 2008-2015, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
15
  */
16
 
17
  (function (factory) {
18
  if (typeof define === 'function' && define.amd) {
19
  // AMD. Register as an anonymous module.
20
- define(['jquery'], factory);
21
  } else if (typeof module === 'object' && typeof module.exports === 'object') {
22
- factory(require('jquery'));
23
  } else {
24
  // Browser globals
25
- factory(jQuery);
26
  }
27
  }(function ($) {
28
- $.timeago = function(timestamp) {
29
  if (timestamp instanceof Date) {
30
- return inWords(timestamp);
31
- } else if (typeof timestamp === "string") {
32
- return inWords($.timeago.parse(timestamp));
33
- } else if (typeof timestamp === "number") {
34
- return inWords(new Date(timestamp));
35
  } else {
36
- return inWords($.timeago.datetime(timestamp));
37
  }
38
- };
39
- var $t = $.timeago;
40
 
41
  $.extend($.timeago, {
42
  settings: {
@@ -49,54 +49,54 @@
49
  strings: {
50
  prefixAgo: null,
51
  prefixFromNow: null,
52
- suffixAgo: "ago",
53
- suffixFromNow: "from now",
54
  inPast: 'any moment now',
55
- seconds: "less than a minute",
56
- minute: "about a minute",
57
- minutes: "%d minutes",
58
- hour: "about an hour",
59
- hours: "about %d hours",
60
- day: "a day",
61
- days: "%d days",
62
- month: "about a month",
63
- months: "%d months",
64
- year: "about a year",
65
- years: "%d years",
66
- wordSeparator: " ",
67
  numbers: []
68
  }
69
  },
70
 
71
- inWords: function(distanceMillis) {
72
- if (!this.settings.allowPast && ! this.settings.allowFuture) {
73
- throw 'timeago allowPast and allowFuture settings can not both be set to false.';
74
  }
75
 
76
- var $l = this.settings.strings;
77
- var prefix = $l.prefixAgo;
78
- var suffix = $l.suffixAgo;
79
  if (this.settings.allowFuture) {
80
  if (distanceMillis < 0) {
81
- prefix = $l.prefixFromNow;
82
- suffix = $l.suffixFromNow;
83
  }
84
  }
85
 
86
  if (!this.settings.allowPast && distanceMillis >= 0) {
87
- return this.settings.strings.inPast;
88
  }
89
 
90
- var seconds = Math.abs(distanceMillis) / 1000;
91
- var minutes = seconds / 60;
92
- var hours = minutes / 60;
93
- var days = hours / 24;
94
- var years = days / 365;
95
 
96
- function substitute(stringOrFunction, number) {
97
- var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
98
- var value = ($l.numbers && $l.numbers[number]) || number;
99
- return string.replace(/%d/i, value);
100
  }
101
 
102
  var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
@@ -109,117 +109,124 @@
109
  days < 45 && substitute($l.month, 1) ||
110
  days < 365 && substitute($l.months, Math.round(days / 30)) ||
111
  years < 1.5 && substitute($l.year, 1) ||
112
- substitute($l.years, Math.round(years));
113
 
114
- var separator = $l.wordSeparator || "";
115
- if ($l.wordSeparator === undefined) { separator = " "; }
116
- return $.trim([prefix, words, suffix].join(separator));
117
  },
118
 
119
- parse: function(iso8601) {
120
- var s = $.trim(iso8601);
121
- s = s.replace(/\.\d+/,""); // remove milliseconds
122
- s = s.replace(/-/,"/").replace(/-/,"/");
123
- s = s.replace(/T/," ").replace(/Z/," UTC");
124
- s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
125
- s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900
126
- return new Date(s);
127
  },
128
- datetime: function(elem) {
129
- var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
130
- return $t.parse(iso8601);
131
  },
132
- isTime: function(elem) {
133
  // jQuery's `is()` doesn't play well with HTML5 in IE
134
- return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
135
  }
136
- });
137
 
138
  // functions that can be called via $(el).timeago('action')
139
  // init is default when no action is given
140
  // functions are called with context of a single element
141
  var functions = {
142
- init: function() {
143
- var refresh_el = $.proxy(refresh, this);
144
- refresh_el();
145
- var $s = $t.settings;
 
146
  if ($s.refreshMillis > 0) {
147
- this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);
148
  }
149
  },
150
- update: function(timestamp) {
151
- var date = (timestamp instanceof Date) ? timestamp : $t.parse(timestamp);
152
- $(this).data('timeago', { datetime: date });
153
- if ($t.settings.localeTitle) $(this).attr("title", date.toLocaleString());
154
- refresh.apply(this);
 
 
155
  },
156
- updateFromDOM: function() {
157
- $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
158
- refresh.apply(this);
159
  },
160
  dispose: function () {
161
  if (this._timeagoInterval) {
162
- window.clearInterval(this._timeagoInterval);
163
- this._timeagoInterval = null;
164
  }
165
  }
166
- };
167
 
168
- $.fn.timeago = function(action, options) {
169
- var fn = action ? functions[action] : functions.init;
170
  if (!fn) {
171
- throw new Error("Unknown function name '"+ action +"' for timeago");
172
  }
173
  // each over objects here and call the requested function
174
- this.each(function() {
175
- fn.call(this, options);
176
- });
177
- return this;
178
- };
179
-
180
- function refresh() {
181
- var $s = $t.settings;
182
-
183
- //check if it's still visible
184
- if ($s.autoDispose && !$.contains(document.documentElement,this)) {
185
- //stop if it has been removed
186
- $(this).timeago("dispose");
187
- return this;
188
  }
189
 
190
- var data = prepareData(this);
191
 
192
  if (!isNaN(data.datetime)) {
193
- if ( $s.cutoff == 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {
194
- $(this).text(inWords(data.datetime));
 
 
 
 
195
  }
196
  }
197
- return this;
198
  }
199
 
200
- function prepareData(element) {
201
- element = $(element);
202
- if (!element.data("timeago")) {
203
- element.data("timeago", { datetime: $t.datetime(element) });
204
- var text = $.trim(element.text());
205
  if ($t.settings.localeTitle) {
206
- element.attr("title", element.data('timeago').datetime.toLocaleString());
207
- } else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
208
- element.attr("title", text);
209
  }
210
  }
211
- return element.data("timeago");
212
  }
213
 
214
- function inWords(date) {
215
- return $t.inWords(distance(date));
216
  }
217
 
218
- function distance(date) {
219
- return (new Date().getTime() - date.getTime());
220
  }
221
 
222
  // fix for IE6 suckage
223
- document.createElement("abbr");
224
- document.createElement("time");
225
- }));
3
  * updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
4
  *
5
  * @name timeago
6
+ * @version 1.6.3
7
  * @requires jQuery v1.2.3+
8
  * @author Ryan McGeary
9
  * @license MIT License - http://www.opensource.org/licenses/mit-license.php
11
  * For usage and examples, visit:
12
  * http://timeago.yarp.com/
13
  *
14
+ * Copyright (c) 2008-2017, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
15
  */
16
 
17
  (function (factory) {
18
  if (typeof define === 'function' && define.amd) {
19
  // AMD. Register as an anonymous module.
20
+ define(['jquery'], factory)
21
  } else if (typeof module === 'object' && typeof module.exports === 'object') {
22
+ factory(require('jquery'))
23
  } else {
24
  // Browser globals
25
+ factory(jQuery)
26
  }
27
  }(function ($) {
28
+ $.timeago = function (timestamp) {
29
  if (timestamp instanceof Date) {
30
+ return inWords(timestamp)
31
+ } else if (typeof timestamp === 'string') {
32
+ return inWords($.timeago.parse(timestamp))
33
+ } else if (typeof timestamp === 'number') {
34
+ return inWords(new Date(timestamp))
35
  } else {
36
+ return inWords($.timeago.datetime(timestamp))
37
  }
38
+ }
39
+ var $t = $.timeago
40
 
41
  $.extend($.timeago, {
42
  settings: {
49
  strings: {
50
  prefixAgo: null,
51
  prefixFromNow: null,
52
+ suffixAgo: 'ago',
53
+ suffixFromNow: 'from now',
54
  inPast: 'any moment now',
55
+ seconds: 'less than a minute',
56
+ minute: 'about a minute',
57
+ minutes: '%d minutes',
58
+ hour: 'about an hour',
59
+ hours: 'about %d hours',
60
+ day: 'a day',
61
+ days: '%d days',
62
+ month: 'about a month',
63
+ months: '%d months',
64
+ year: 'about a year',
65
+ years: '%d years',
66
+ wordSeparator: ' ',
67
  numbers: []
68
  }
69
  },
70
 
71
+ inWords: function (distanceMillis) {
72
+ if (!this.settings.allowPast && !this.settings.allowFuture) {
73
+ throw 'timeago allowPast and allowFuture settings can not both be set to false.'
74
  }
75
 
76
+ var $l = this.settings.strings
77
+ var prefix = $l.prefixAgo
78
+ var suffix = $l.suffixAgo
79
  if (this.settings.allowFuture) {
80
  if (distanceMillis < 0) {
81
+ prefix = $l.prefixFromNow
82
+ suffix = $l.suffixFromNow
83
  }
84
  }
85
 
86
  if (!this.settings.allowPast && distanceMillis >= 0) {
87
+ return this.settings.strings.inPast
88
  }
89
 
90
+ var seconds = Math.abs(distanceMillis) / 1000
91
+ var minutes = seconds / 60
92
+ var hours = minutes / 60
93
+ var days = hours / 24
94
+ var years = days / 365
95
 
96
+ function substitute (stringOrFunction, number) {
97
+ var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction
98
+ var value = ($l.numbers && $l.numbers[number]) || number
99
+ return string.replace(/%d/i, value)
100
  }
101
 
102
  var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
109
  days < 45 && substitute($l.month, 1) ||
110
  days < 365 && substitute($l.months, Math.round(days / 30)) ||
111
  years < 1.5 && substitute($l.year, 1) ||
112
+ substitute($l.years, Math.round(years))
113
 
114
+ var separator = $l.wordSeparator || ''
115
+ if ($l.wordSeparator === undefined) { separator = ' ' }
116
+ return $.trim([prefix, words, suffix].join(separator))
117
  },
118
 
119
+ parse: function (iso8601) {
120
+ var s = $.trim(iso8601)
121
+ s = s.replace(/\.\d+/, '') // remove milliseconds
122
+ s = s.replace(/-/, '/').replace(/-/, '/')
123
+ s = s.replace(/T/, ' ').replace(/Z/, ' UTC')
124
+ s = s.replace(/([\+\-]\d\d)\:?(\d\d)/, ' $1$2') // -04:00 -> -0400
125
+ s = s.replace(/([\+\-]\d\d)$/, ' $100') // +09 -> +0900
126
+ return new Date(s)
127
  },
128
+ datetime: function (elem) {
129
+ var iso8601 = $t.isTime(elem) ? $(elem).attr('datetime') : $(elem).attr('title')
130
+ return $t.parse(iso8601)
131
  },
132
+ isTime: function (elem) {
133
  // jQuery's `is()` doesn't play well with HTML5 in IE
134
+ return $(elem).get(0).tagName.toLowerCase() === 'time' // $(elem).is("time");
135
  }
136
+ })
137
 
138
  // functions that can be called via $(el).timeago('action')
139
  // init is default when no action is given
140
  // functions are called with context of a single element
141
  var functions = {
142
+ init: function () {
143
+ functions.dispose.call(this)
144
+ var refresh_el = $.proxy(refresh, this)
145
+ refresh_el()
146
+ var $s = $t.settings
147
  if ($s.refreshMillis > 0) {
148
+ this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis)
149
  }
150
  },
151
+ update: function (timestamp) {
152
+ var date = (timestamp instanceof Date) ? timestamp : $t.parse(timestamp)
153
+ $(this).data('timeago', { datetime: date })
154
+ if ($t.settings.localeTitle) {
155
+ $(this).attr('title', date.toLocaleString())
156
+ }
157
+ refresh.apply(this)
158
  },
159
+ updateFromDOM: function () {
160
+ $(this).data('timeago', { datetime: $t.parse($t.isTime(this) ? $(this).attr('datetime') : $(this).attr('title')) })
161
+ refresh.apply(this)
162
  },
163
  dispose: function () {
164
  if (this._timeagoInterval) {
165
+ window.clearInterval(this._timeagoInterval)
166
+ this._timeagoInterval = null
167
  }
168
  }
169
+ }
170
 
171
+ $.fn.timeago = function (action, options) {
172
+ var fn = action ? functions[action] : functions.init
173
  if (!fn) {
174
+ throw new Error("Unknown function name '" + action + "' for timeago")
175
  }
176
  // each over objects here and call the requested function
177
+ this.each(function () {
178
+ fn.call(this, options)
179
+ })
180
+ return this
181
+ }
182
+
183
+ function refresh () {
184
+ var $s = $t.settings
185
+
186
+ // check if it's still visible
187
+ if ($s.autoDispose && !$.contains(document.documentElement, this)) {
188
+ // stop if it has been removed
189
+ $(this).timeago('dispose')
190
+ return this
191
  }
192
 
193
+ var data = prepareData(this)
194
 
195
  if (!isNaN(data.datetime)) {
196
+ if ($s.cutoff === 0 || Math.abs(distance(data.datetime)) < $s.cutoff) {
197
+ $(this).text(inWords(data.datetime))
198
+ } else {
199
+ if ($(this).attr('title').length > 0) {
200
+ $(this).text($(this).attr('title'))
201
+ }
202
  }
203
  }
204
+ return this
205
  }
206
 
207
+ function prepareData (element) {
208
+ element = $(element)
209
+ if (!element.data('timeago')) {
210
+ element.data('timeago', { datetime: $t.datetime(element) })
211
+ var text = $.trim(element.text())
212
  if ($t.settings.localeTitle) {
213
+ element.attr('title', element.data('timeago').datetime.toLocaleString())
214
+ } else if (text.length > 0 && !($t.isTime(element) && element.attr('title'))) {
215
+ element.attr('title', text)
216
  }
217
  }
218
+ return element.data('timeago')
219
  }
220
 
221
+ function inWords (date) {
222
+ return $t.inWords(distance(date))
223
  }
224
 
225
+ function distance (date) {
226
+ return (new Date().getTime() - date.getTime())
227
  }
228
 
229
  // fix for IE6 suckage
230
+ document.createElement('abbr')
231
+ document.createElement('time')
232
+ }))
loggers/SimpleLogger.php CHANGED
@@ -230,13 +230,12 @@ class SimpleLogger {
230
 
231
  // wp_user = wordpress uses, but user may have been deleted since log entry was added
232
  case 'wp_user':
233
-
234
  $user_id = isset( $row->context['_user_id'] ) ? $row->context['_user_id'] : null;
235
 
236
  if ( $user_id > 0 && $user = get_user_by( 'id', $user_id ) ) {
237
 
238
  // Sender is user and user still exists
239
- $is_current_user = ($user_id == get_current_user_id()) ? true : false;
240
 
241
  // get user role, as done in user-edit.php
242
  $wp_roles = $GLOBALS['wp_roles'];
@@ -285,11 +284,11 @@ class SimpleLogger {
285
 
286
  $initiator_html .= sprintf(
287
  $tmpl_initiator_html,
288
- esc_html( $user->user_login ), // 1
289
- esc_html( $user->user_email ), // 2
290
- esc_html( $user_display_name ), // 3
291
- $user_role, // 4
292
- _x( 'You', 'header output when initiator is the currently logged in user', 'simple-history' ), // 5
293
  get_edit_user_link( $user_id ) // 6
294
  );
295
 
@@ -315,7 +314,6 @@ class SimpleLogger {
315
  break;
316
 
317
  case 'web_user':
318
-
319
  /*
320
  Note: server_remote_addr may not show visiting/attacking ip, if server is behind...stuff..
321
  Can be behind varnish cashe, or browser can for example use compression in chrome mobile
@@ -348,8 +346,8 @@ class SimpleLogger {
348
  print_r($arr_found_additional_ip_headers);
349
  Array
350
  (
351
- [_server_http_x_forwarded_for_0] => 5.35.187.212
352
- [_server_http_x_forwarded_for_1] => 83.251.97.21
353
  )
354
  */
355
 
@@ -431,24 +429,30 @@ class SimpleLogger {
431
  $time_ago_just_now_max_time = 30;
432
  $time_ago_just_now_max_time = apply_filters( 'simple_history/header_just_now_max_time', $time_ago_just_now_max_time );
433
 
434
- if ( $time_current - $date_datetime->getTimestamp() <= $time_ago_just_now_max_time ) {
 
 
435
 
436
- // show "just now" if event is very recent
437
- $str_when = __( 'Just now', 'simple-history' );
438
 
439
- } elseif ( $time_current - $date_datetime->getTimestamp() > $time_ago_max_time ) {
 
 
 
440
 
441
- /* translators: Date format for log row header, see http://php.net/date */
 
 
 
 
442
  $datef = __( 'M j, Y \a\t G:i', 'simple-history' );
443
  $str_when = date_i18n( $datef, strtotime( get_date_from_gmt( $row->date ) ) );
444
-
445
  } else {
446
-
447
  // Show "nn minutes ago" when event is xx seconds ago or earlier
448
  $date_human_time_diff = human_time_diff( $date_datetime->getTimestamp(), $time_current );
449
- /* translators: 1: last modified date and time in human time diff-format */
450
  $str_when = sprintf( __( '%1$s ago', 'simple-history' ), $date_human_time_diff );
451
-
452
  }
453
 
454
  $item_permalink = admin_url( 'index.php?page=simple_history_page' );
@@ -456,25 +460,35 @@ class SimpleLogger {
456
  $item_permalink .= "#item/{$row->id}";
457
  }
458
 
459
- $date_format = get_option( 'date_format' ) . ' - ' . get_option( 'time_format' );
460
  $str_datetime_title = sprintf(
461
  __( '%1$s local time %3$s (%2$s GMT time)', 'simple-history' ),
462
- get_date_from_gmt( $date_datetime->format( 'Y-m-d H:i:s' ), $date_format ), // 1 local time
463
- $date_datetime->format( $date_format ), // GMT time
464
  PHP_EOL // 3, new line
465
  );
466
 
 
 
 
 
 
 
 
467
  $date_html = "<span class='SimpleHistoryLogitem__permalink SimpleHistoryLogitem__when SimpleHistoryLogitem__inlineDivided'>";
468
  $date_html .= "<a class='' href='{$item_permalink}'>";
469
  $date_html .= sprintf(
470
- '<time datetime="%3$s" title="%1$s" class="">%2$s</time>',
471
  esc_attr( $str_datetime_title ), // 1 datetime attribute
472
- esc_html( $str_when ), // 2 date text, visible in log
473
- $date_datetime->format( DateTime::RFC3339 ) // 3
 
474
  );
475
  $date_html .= '</a>';
476
  $date_html .= '</span>';
477
 
 
 
478
  /**
479
  * Filter the output of the date section of the header.
480
  *
@@ -1224,8 +1238,8 @@ class SimpleLogger {
1224
  */
1225
  $anonymize_ip_address = apply_filters( 'simple_history/privacy/anonymize_ip_address', true );
1226
 
1227
- if ( $anonymize_ip_address ) {
1228
- $remote_addr = SimpleHistoryIpAnonymizer::anonymizeIp( $remote_addr );
1229
  }
1230
 
1231
  $context['_server_remote_addr'] = $remote_addr;
@@ -1258,8 +1272,8 @@ class SimpleLogger {
1258
  // valid, add to context, with loop index appended so we can store many IPs.
1259
  $key_lower = strtolower( $key );
1260
 
1261
- if ( $anonymize_ip_address ) {
1262
- $ip = SimpleHistoryIpAnonymizer::anonymizeIp( $ip );
1263
  }
1264
 
1265
  $context[ "_server_{$key_lower}_{$ip_loop_num}" ] = $ip;
230
 
231
  // wp_user = wordpress uses, but user may have been deleted since log entry was added
232
  case 'wp_user':
 
233
  $user_id = isset( $row->context['_user_id'] ) ? $row->context['_user_id'] : null;
234
 
235
  if ( $user_id > 0 && $user = get_user_by( 'id', $user_id ) ) {
236
 
237
  // Sender is user and user still exists
238
+ $is_current_user = ( get_current_user_id() == $user_id ) ? true : false;
239
 
240
  // get user role, as done in user-edit.php
241
  $wp_roles = $GLOBALS['wp_roles'];
284
 
285
  $initiator_html .= sprintf(
286
  $tmpl_initiator_html,
287
+ esc_html( $user->user_login ), // 1
288
+ esc_html( $user->user_email ), // 2
289
+ esc_html( $user_display_name ), // 3
290
+ $user_role, // 4
291
+ _x( 'You', 'header output when initiator is the currently logged in user', 'simple-history' ), // 5
292
  get_edit_user_link( $user_id ) // 6
293
  );
294
 
314
  break;
315
 
316
  case 'web_user':
 
317
  /*
318
  Note: server_remote_addr may not show visiting/attacking ip, if server is behind...stuff..
319
  Can be behind varnish cashe, or browser can for example use compression in chrome mobile
346
  print_r($arr_found_additional_ip_headers);
347
  Array
348
  (
349
+ [_server_http_x_forwarded_for_0] => 5.35.187.212
350
+ [_server_http_x_forwarded_for_1] => 83.251.97.21
351
  )
352
  */
353
 
429
  $time_ago_just_now_max_time = 30;
430
  $time_ago_just_now_max_time = apply_filters( 'simple_history/header_just_now_max_time', $time_ago_just_now_max_time );
431
 
432
+ $date_format = get_option( 'date_format' );
433
+ $time_format = get_option( 'time_format' );
434
+ $date_and_time_format = $date_format . ' - ' . $time_format;
435
 
436
+ // Show local time as hours an minutes when event is recent.
437
+ $local_date_format = $time_format;
438
 
439
+ // Show local time as date and hours when event is a bit older.
440
+ if ( ( $time_current - HOUR_IN_SECONDS * 6 ) > $date_datetime->getTimestamp() ) {
441
+ $local_date_format = $date_and_time_format;
442
+ }
443
 
444
+ if ( $time_current - $date_datetime->getTimestamp() <= $time_ago_just_now_max_time ) {
445
+ // Show "just now" if event is very recent.
446
+ $str_when = __( 'Just now', 'simple-history' );
447
+ } elseif ( $time_current - $date_datetime->getTimestamp() > $time_ago_max_time ) {
448
+ /* Translators: Date format for log row header, see http://php.net/date */
449
  $datef = __( 'M j, Y \a\t G:i', 'simple-history' );
450
  $str_when = date_i18n( $datef, strtotime( get_date_from_gmt( $row->date ) ) );
 
451
  } else {
 
452
  // Show "nn minutes ago" when event is xx seconds ago or earlier
453
  $date_human_time_diff = human_time_diff( $date_datetime->getTimestamp(), $time_current );
454
+ /* Translators: 1: last modified date and time in human time diff-format */
455
  $str_when = sprintf( __( '%1$s ago', 'simple-history' ), $date_human_time_diff );
 
456
  }
457
 
458
  $item_permalink = admin_url( 'index.php?page=simple_history_page' );
460
  $item_permalink .= "#item/{$row->id}";
461
  }
462
 
463
+ // Datetime attribute on <time> element.
464
  $str_datetime_title = sprintf(
465
  __( '%1$s local time %3$s (%2$s GMT time)', 'simple-history' ),
466
+ get_date_from_gmt( $date_datetime->format( 'Y-m-d H:i:s' ), $date_and_time_format ), // 1 local time
467
+ $date_datetime->format( $date_and_time_format ), // GMT time
468
  PHP_EOL // 3, new line
469
  );
470
 
471
+ // Time and date before live updated relative date.
472
+ $str_datetime_local = sprintf(
473
+ '%1$s',
474
+ get_date_from_gmt( $date_datetime->format( 'Y-m-d H:i:s' ), $local_date_format ) // 1 local time
475
+ );
476
+
477
+ // HTML for whole span with date info.
478
  $date_html = "<span class='SimpleHistoryLogitem__permalink SimpleHistoryLogitem__when SimpleHistoryLogitem__inlineDivided'>";
479
  $date_html .= "<a class='' href='{$item_permalink}'>";
480
  $date_html .= sprintf(
481
+ '<span title="%1$s">%4$s (<time datetime="%3$s" class="SimpleHistoryLogitem__when__liveRelative">%2$s</time>)</span>',
482
  esc_attr( $str_datetime_title ), // 1 datetime attribute
483
+ esc_html( $str_when ), // 2 date text, visible in log, but overridden by JS relative date script.
484
+ $date_datetime->format( DateTime::RFC3339 ), // 3
485
+ esc_html( $str_datetime_local ) // 4
486
  );
487
  $date_html .= '</a>';
488
  $date_html .= '</span>';
489
 
490
+ sh_error_log('$date_html', $date_html);
491
+
492
  /**
493
  * Filter the output of the date section of the header.
494
  *
1238
  */
1239
  $anonymize_ip_address = apply_filters( 'simple_history/privacy/anonymize_ip_address', true );
1240
 
1241
+ if ( $anonymize_ip_address && function_exists('wp_privacy_anonymize_ip') ) {
1242
+ $remote_addr = wp_privacy_anonymize_ip( $remote_addr );
1243
  }
1244
 
1245
  $context['_server_remote_addr'] = $remote_addr;
1272
  // valid, add to context, with loop index appended so we can store many IPs.
1273
  $key_lower = strtolower( $key );
1274
 
1275
+ if ( $anonymize_ip_address && function_exists('wp_privacy_anonymize_ip') ) {
1276
+ $ip = wp_privacy_anonymize_ip( $ip );
1277
  }
1278
 
1279
  $context[ "_server_{$key_lower}_{$ip_loop_num}" ] = $ip;
loggers/SimpleUserLogger.php CHANGED
@@ -814,9 +814,9 @@ class SimpleUserLogger extends SimpleLogger {
814
  'title' => _x( 'Jabber / Google Talk ', 'User logger', 'simple-history' ),
815
  ),
816
  /*
817
- "user_nicename" => array(
818
- "title" => _x("Nicename", "User logger", "simple-history")
819
- ),*/
820
  'user_email' => array(
821
  'title' => _x( 'Email', 'User logger', 'simple-history' ),
822
  ),
814
  'title' => _x( 'Jabber / Google Talk ', 'User logger', 'simple-history' ),
815
  ),
816
  /*
817
+ "user_nicename" => array(
818
+ "title" => _x("Nicename", "User logger", "simple-history")
819
+ ),*/
820
  'user_email' => array(
821
  'title' => _x( 'Email', 'User logger', 'simple-history' ),
822
  ),
readme.txt CHANGED
@@ -1,11 +1,11 @@
1
  === Simple History ===
2
  Contributors: eskapism
3
  Donate link: http://eskapism.se/sida/donate/
4
- Tags: history, log, changes, changelog, audit, trail, pages, attachments, users, dashboard, admin, syslog, feed, activity, stream, audit trail, brute-force
5
  Requires at least: 4.5.1
6
  Tested up to: 4.9
7
  Requires PHP: 5.3
8
- Stable tag: 2.27
9
 
10
  View changes made by users within WordPress. See who created a page, uploaded an attachment or approved an comment, and more.
11
 
@@ -57,8 +57,7 @@ In Simple History you will see what Jetpack modules that are activated and deact
57
 
58
  **Advanced Custom Fields (ACF)**<br>
59
  [ACF](https://www.advancedcustomfields.com/) adds fields to your posts and pages.
60
- Simple History will log changes made to the field groups and the fields inside field groups. Your will be able to
61
- see when both field groups and fields are created and modified.
62
 
63
  **User Switching**<br>
64
  The [User Switching plugin](https://wordpress.org/plugins/user-switching/) allows you to quickly swap between user accounts in WordPress at the click of a button.
@@ -149,6 +148,16 @@ https://github.com/bonny/WordPress-Simple-History
149
 
150
  * If you like this plugin please consider [donating to support the development](https://www.paypal.me/eskapism).
151
 
 
 
 
 
 
 
 
 
 
 
152
  == Screenshots ==
153
 
154
  1. The log view + it also shows the filter function in use - the log only shows event that
@@ -172,7 +181,14 @@ A simple way to see any uncommon activity, for example an increased number of lo
172
 
173
  ## Changelog
174
 
 
 
 
 
 
 
175
  = 2.27 (August 2018) =
 
176
  - Fix notice errors when syncing an ACF field group. Fixes https://github.com/bonny/WordPress-Simple-History/issues/150.
177
  - Fix notice error when trying to read plugin info for a plugin that no longer exists or has changed name. Fixes https://github.com/bonny/WordPress-Simple-History/issues/146.
178
  - Always load the SimpleLogger logger. Fixes https://github.com/bonny/WordPress-Simple-History/issues/129.
@@ -181,15 +197,18 @@ A simple way to see any uncommon activity, for example an increased number of lo
181
  - Group translation updates in the log. Useful because sometimes you update a lot of translations at the same time and the log is full of just those messages.
182
 
183
  = 2.26.1 (July 2018) =
 
184
  - Fix 5.3 compatibility.
185
 
186
  = 2.26 (July 2018) =
 
187
  - Add support for the [Jetpack plugin](https://wordpress.org/plugins/jetpack/). To begin with, activation and deactivation of Jetpack modules is logged.
188
  - Add logging of translation updates, so now you can see when a plugin or a theme has gotten new translations. Fixes https://github.com/bonny/WordPress-Simple-History/issues/147.
189
  - Fix notice in Advanced Custom Fields logger when saving an ACF options page.
190
  Fixes https://wordpress.org/support/topic/problem-with-acf-options-pages/, https://wordpress.org/support/topic/problem-with-recent-version-and-acf/, https://github.com/bonny/WordPress-Simple-History/issues/145.
191
 
192
  = 2.25 (July 2018) =
 
193
  - Add `wp_cron_current_filter` to event context when something is logged during a cron job. This can help debugging thing like posts being added or deleted by some plugin and you're trying to figure out which plugin it is.
194
  - Fix for event details not always being shown.
195
  - Fix for sometimes missing user name and user email in export file.
1
  === Simple History ===
2
  Contributors: eskapism
3
  Donate link: http://eskapism.se/sida/donate/
4
+ Tags: history, log, changes, changelog, audit, audit log, event log, user tracking, trail, pages, attachments, users, dashboard, admin, syslog, feed, activity, stream, audit trail, brute-force
5
  Requires at least: 4.5.1
6
  Tested up to: 4.9
7
  Requires PHP: 5.3
8
+ Stable tag: 2.28
9
 
10
  View changes made by users within WordPress. See who created a page, uploaded an attachment or approved an comment, and more.
11
 
57
 
58
  **Advanced Custom Fields (ACF)**<br>
59
  [ACF](https://www.advancedcustomfields.com/) adds fields to your posts and pages.
60
+ Simple History will log changes made to the field groups and the fields inside field groups. Your will see when both field groups and fields are created and modified.
 
61
 
62
  **User Switching**<br>
63
  The [User Switching plugin](https://wordpress.org/plugins/user-switching/) allows you to quickly swap between user accounts in WordPress at the click of a button.
148
 
149
  * If you like this plugin please consider [donating to support the development](https://www.paypal.me/eskapism).
150
 
151
+ == Frequently Asked Questions ==
152
+
153
+ = Can I add my own events to the log? =
154
+
155
+ Yes. See the [examples file](https://github.com/bonny/WordPress-Simple-History/blob/master/examples/examples.php).
156
+
157
+ = For how long are events stored? =
158
+
159
+ Events in the log are stored for 60 days by default. Events older than this will be removed.
160
+
161
  == Screenshots ==
162
 
163
  1. The log view + it also shows the filter function in use - the log only shows event that
181
 
182
  ## Changelog
183
 
184
+ = 2.28 (September 2018) =
185
+
186
+ - Always show time and sometimes date before each event, in addition to the relative date. Fixes https://wordpress.org/support/topic/feature-request-granular-settings-changes-detailed-timestamp/.
187
+ - Use WordPress own function (`wp_privacy_anonymize_ip`, available since WordPress version 4.9.6) to anonymize IP addresses, instead of our own class.
188
+ - Update timeago.js
189
+
190
  = 2.27 (August 2018) =
191
+
192
  - Fix notice errors when syncing an ACF field group. Fixes https://github.com/bonny/WordPress-Simple-History/issues/150.
193
  - Fix notice error when trying to read plugin info for a plugin that no longer exists or has changed name. Fixes https://github.com/bonny/WordPress-Simple-History/issues/146.
194
  - Always load the SimpleLogger logger. Fixes https://github.com/bonny/WordPress-Simple-History/issues/129.
197
  - Group translation updates in the log. Useful because sometimes you update a lot of translations at the same time and the log is full of just those messages.
198
 
199
  = 2.26.1 (July 2018) =
200
+
201
  - Fix 5.3 compatibility.
202
 
203
  = 2.26 (July 2018) =
204
+
205
  - Add support for the [Jetpack plugin](https://wordpress.org/plugins/jetpack/). To begin with, activation and deactivation of Jetpack modules is logged.
206
  - Add logging of translation updates, so now you can see when a plugin or a theme has gotten new translations. Fixes https://github.com/bonny/WordPress-Simple-History/issues/147.
207
  - Fix notice in Advanced Custom Fields logger when saving an ACF options page.
208
  Fixes https://wordpress.org/support/topic/problem-with-acf-options-pages/, https://wordpress.org/support/topic/problem-with-recent-version-and-acf/, https://github.com/bonny/WordPress-Simple-History/issues/145.
209
 
210
  = 2.25 (July 2018) =
211
+
212
  - Add `wp_cron_current_filter` to event context when something is logged during a cron job. This can help debugging thing like posts being added or deleted by some plugin and you're trying to figure out which plugin it is.
213
  - Fix for event details not always being shown.
214
  - Fix for sometimes missing user name and user email in export file.