jquery-tablesorter 1.10.2 → 1.10.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/README.markdown +6 -3
  3. data/Rakefile +30 -16
  4. data/lib/jquery-tablesorter/version.rb +1 -1
  5. data/vendor/assets/javascripts/jquery-tablesorter/extras/jquery.quicksearch.js +191 -0
  6. data/vendor/assets/javascripts/jquery-tablesorter/extras/semver-mod.js +1026 -0
  7. data/vendor/assets/javascripts/jquery-tablesorter/extras/semver.js +1011 -0
  8. data/vendor/assets/javascripts/jquery-tablesorter/jquery.tablesorter.js +2 -2
  9. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-iso8601.js +34 -0
  10. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-month.js +33 -0
  11. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-two-digit-year.js +74 -0
  12. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date-weekday.js +33 -0
  13. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-date.js +36 -0
  14. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-feet-inch-fraction.js +63 -0
  15. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-file-type.js +73 -0
  16. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-ignore-articles.js +47 -0
  17. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-input-select.js +86 -0
  18. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-ipv6.js +76 -0
  19. data/vendor/assets/javascripts/jquery-tablesorter/parsers/parser-metric.js +77 -0
  20. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-build-table.js +441 -0
  21. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-columnSelector.js +291 -0
  22. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-cssStickyHeaders.js +67 -0
  23. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-editable.js +89 -0
  24. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-grouping.js +183 -0
  25. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-pager.js +834 -0
  26. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-repeatheaders.js +50 -0
  27. data/vendor/assets/javascripts/jquery-tablesorter/widgets/widget-scroller.js +241 -0
  28. metadata +24 -2
@@ -1,5 +1,5 @@
1
1
  /**!
2
- * TableSorter 2.15.4 - Client-side table sorting with ease!
2
+ * TableSorter 2.15.5 - Client-side table sorting with ease!
3
3
  * @requires jQuery v1.2.6+
4
4
  *
5
5
  * Copyright (c) 2007 Christian Bach
@@ -24,7 +24,7 @@
24
24
 
25
25
  var ts = this;
26
26
 
27
- ts.version = "2.15.4";
27
+ ts.version = "2.15.5";
28
28
 
29
29
  ts.parsers = [];
30
30
  ts.widgets = [];
@@ -0,0 +1,34 @@
1
+ /*! ISO-8601 date parser
2
+ * This parser will work with dates in ISO8601 format
3
+ * 2013-02-18T18:18:44+00:00
4
+ * Written by Sean Ellingham :https://github.com/seanellingham
5
+ * See https://github.com/Mottie/tablesorter/issues/247
6
+ */
7
+ /*global jQuery: false */
8
+ ;(function($){
9
+ "use strict";
10
+
11
+ var iso8601date = /^([0-9]{4})(-([0-9]{2})(-([0-9]{2})(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?$/;
12
+ $.tablesorter.addParser({
13
+ id : 'iso8601date',
14
+ is : function(s) {
15
+ return s.match(iso8601date);
16
+ },
17
+ format : function(s) {
18
+ var result = s.match(iso8601date);
19
+ if (result) {
20
+ var date = new Date(result[1], 0, 1);
21
+ if (result[3]) { date.setMonth(result[3] - 1); }
22
+ if (result[5]) { date.setDate(result[5]); }
23
+ if (result[7]) { date.setHours(result[7]); }
24
+ if (result[8]) { date.setMinutes(result[8]); }
25
+ if (result[10]) { date.setSeconds(result[10]); }
26
+ if (result[12]) { date.setMilliseconds(Number('0.' + result[12]) * 1000); }
27
+ return date;
28
+ }
29
+ return 0;
30
+ },
31
+ type : 'numeric'
32
+ });
33
+
34
+ })(jQuery);
@@ -0,0 +1,33 @@
1
+ /*! Month parser
2
+ * Demo: http://jsfiddle.net/Mottie/abkNM/477/
3
+ */
4
+ /*jshint jquery:true */
5
+ ;(function($){
6
+ "use strict";
7
+
8
+ var ts = $.tablesorter;
9
+ ts.dates = $.extend({}, ts.dates, {
10
+ // *** modify this array to change match the language ***
11
+ monthCased : [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ]
12
+ });
13
+ ts.dates.monthLower = ts.dates.monthCased.join(',').toLocaleLowerCase().split(',');
14
+
15
+ ts.addParser({
16
+ id: "month",
17
+ is: function(){
18
+ return false;
19
+ },
20
+ format: function(s, table) {
21
+ var j = -1, c = table.config;
22
+ s = c.ignoreCase ? s.toLocaleLowerCase() : s;
23
+ $.each(ts.dates[ 'month' + (c.ignoreCase ? 'Lower' : 'Cased') ], function(i,v){
24
+ if (j < 0 && s.match(v)) { j = i; }
25
+ });
26
+ // return s (original string) if there isn't a match
27
+ // (non-weekdays will sort separately and empty cells will sort as expected)
28
+ return j < 0 ? s : j;
29
+ },
30
+ type: "numeric"
31
+ });
32
+
33
+ })(jQuery);
@@ -0,0 +1,74 @@
1
+ /*! Two digit year parser
2
+ * Demo: http://jsfiddle.net/Mottie/abkNM/427/
3
+ */
4
+ /*jshint jquery:true */
5
+ ;(function($){
6
+ "use strict";
7
+
8
+ var ts = $.tablesorter,
9
+
10
+ // Make the date be within +/- range of the 2 digit year
11
+ // so if the current year is 2020, and the 2 digit year is 80 (2080 - 2020 > 50), it becomes 1980
12
+ // if the 2 digit year is 50 (2050 - 2020 < 50), then it becomes 2050.
13
+ range = 50;
14
+
15
+ ts.dates = $.extend({}, ts.dates, {
16
+ regxxxxyy: /(\d{1,2})[\/\s](\d{1,2})[\/\s](\d{2})/,
17
+ regyyxxxx: /(\d{2})[\/\s](\d{1,2})[\/\s](\d{1,2})/
18
+ });
19
+
20
+ ts.formatDate = function(s, regex, format, table){
21
+ s = s
22
+ // replace separators
23
+ .replace(/\s+/g," ").replace(/[-.,]/g, "/")
24
+ // reformat xx/xx/xx to mm/dd/19yy;
25
+ .replace(regex, format);
26
+ var d = new Date(s),
27
+ y = d.getFullYear(),
28
+ rng = table && table.config.dateRange || range,
29
+ now = new Date().getFullYear();
30
+ // if date > 50 years old (set range), add 100 years
31
+ // this will work when people start using "50" and mean "2050"
32
+ while (now - y > rng) {
33
+ y += 100;
34
+ }
35
+ return d.setFullYear(y);
36
+ };
37
+
38
+ $.tablesorter.addParser({
39
+ id: "ddmmyy",
40
+ is: function() {
41
+ return false;
42
+ },
43
+ format: function(s, table) {
44
+ // reformat dd/mm/yy to mm/dd/19yy;
45
+ return ts.formatDate(s, ts.dates.regxxxxyy, "$2/$1/19$3", table);
46
+ },
47
+ type: "numeric"
48
+ });
49
+
50
+ $.tablesorter.addParser({
51
+ id: "mmddyy",
52
+ is: function() {
53
+ return false;
54
+ },
55
+ format: function(s, table) {
56
+ // reformat mm/dd/yy to mm/dd/19yy
57
+ return ts.formatDate(s, ts.dates.regxxxxyy, "$1/$2/19$3", table);
58
+ },
59
+ type: "numeric"
60
+ });
61
+
62
+ $.tablesorter.addParser({
63
+ id: "yymmdd",
64
+ is: function() {
65
+ return false;
66
+ },
67
+ format: function(s, table) {
68
+ // reformat yy/mm/dd to mm/dd/19yy
69
+ return ts.formatDate(s, ts.dates.regyyxxxx, "$2/$3/19$1", table);
70
+ },
71
+ type: "numeric"
72
+ });
73
+
74
+ })(jQuery);
@@ -0,0 +1,33 @@
1
+ /*! Weekday parser
2
+ * Demo: http://jsfiddle.net/Mottie/abkNM/477/
3
+ */
4
+ /*jshint jquery:true */
5
+ ;(function($){
6
+ "use strict";
7
+
8
+ var ts = $.tablesorter;
9
+ ts.dates = $.extend({}, ts.dates, {
10
+ // *** modify this array to change match the language ***
11
+ weekdayCased : [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ]
12
+ });
13
+ ts.dates.weekdayLower = ts.dates.weekdayCased.join(',').toLocaleLowerCase().split(',');
14
+
15
+ ts.addParser({
16
+ id: "weekday",
17
+ is: function(){
18
+ return false;
19
+ },
20
+ format: function(s, table) {
21
+ var j = -1, c = table.config;
22
+ s = c.ignoreCase ? s.toLocaleLowerCase() : s;
23
+ $.each(ts.dates[ 'weekday' + (c.ignoreCase ? 'Lower' : 'Cased') ], function(i,v){
24
+ if (j < 0 && s.match(v)) { j = i; }
25
+ });
26
+ // return s (original string) if there isn't a match
27
+ // (non-weekdays will sort separately and empty cells will sort as expected)
28
+ return j < 0 ? s : j;
29
+ },
30
+ type: "numeric"
31
+ });
32
+
33
+ })(jQuery);
@@ -0,0 +1,36 @@
1
+ /*!
2
+ * Extract dates using popular natural language date parsers
3
+ */
4
+ /*jshint jquery:true */
5
+ ;(function($){
6
+ "use strict";
7
+
8
+ /*! Sugar (http://sugarjs.com/dates#comparing_dates)
9
+ * demo: http://jsfiddle.net/Mottie/abkNM/551/
10
+ */
11
+ $.tablesorter.addParser({
12
+ id: "sugar",
13
+ is: function() {
14
+ return false;
15
+ },
16
+ format: function(s) {
17
+ return Date.create ? Date.create(s).getTime() || s : new Date(s).getTime() || s;
18
+ },
19
+ type: "numeric"
20
+ });
21
+
22
+ /*! Datejs (http://www.datejs.com/)
23
+ * demo: http://jsfiddle.net/Mottie/abkNM/550/
24
+ */
25
+ $.tablesorter.addParser({
26
+ id: "datejs",
27
+ is: function() {
28
+ return false;
29
+ },
30
+ format: function(s) {
31
+ return Date.parse && Date.parse(s) || s;
32
+ },
33
+ type: "numeric"
34
+ });
35
+
36
+ })(jQuery);
@@ -0,0 +1,63 @@
1
+ /*! Distance parser
2
+ * This parser will parser numbers like 5'10" (5 foot 10 inches)
3
+ * and 31½ into sortable values.
4
+ * Demo: http://jsfiddle.net/Mottie/abkNM/154/
5
+ */
6
+ /*global jQuery: false */
7
+ ;(function($){
8
+ "use strict";
9
+
10
+ var ts = $.tablesorter;
11
+ ts.symbolRegex = /[\u215b\u215c\u215d\u215e\u00bc\u00bd\u00be]/g;
12
+ ts.processFractions = function(n, table) {
13
+ if (n) {
14
+ var t, p = 0;
15
+ n = $.trim(n.replace(/\"/,''));
16
+ // look for a space in the first part of the number: "10 3/4" and save the "10"
17
+ if (/\s/.test(n)) {
18
+ p = ts.formatFloat(n.split(' ')[0], table);
19
+ // remove stuff to the left of the space
20
+ n = $.trim(n.substring(n.indexOf(' '), n.length));
21
+ }
22
+ // look for a "/" to calculate fractions
23
+ if (/\//g.test(n)) {
24
+ t = n.split('/');
25
+ // turn 3/4 into .75; make sure we don't divide by zero
26
+ n = p + parseInt(t[0], 10) / parseInt(t[1] || 1, 10);
27
+ // look for fraction symbols
28
+ } else if (ts.symbolRegex.test(n)) {
29
+ n = p + n.replace(ts.symbolRegex, function(m){
30
+ return {
31
+ '\u215b' : '.125', // 1/8
32
+ '\u215c' : '.375', // 3/8
33
+ '\u215d' : '.625', // 5/8
34
+ '\u215e' : '.875', // 7/8
35
+ '\u00bc' : '.25', // 1/4
36
+ '\u00bd' : '.5', // 1/2
37
+ '\u00be' : '.75' // 3/4
38
+ }[m];
39
+ });
40
+ }
41
+ }
42
+ return n || 0;
43
+ };
44
+
45
+ $.tablesorter.addParser({
46
+ id: 'distance',
47
+ is: function() {
48
+ // return false so this parser is not auto detected
49
+ return false;
50
+ },
51
+ format: function(s, table) {
52
+ if (s === '') { return ''; }
53
+ // look for feet symbol = '
54
+ // very generic test to catch 1.1', 1 1/2' and 1½'
55
+ var d = (/^\s*\S*(\s+\S+)?\s*\'/.test(s)) ? s.split("'") : [0,s],
56
+ f = ts.processFractions(d[0], table), // feet
57
+ i = ts.processFractions(d[1], table); // inches
58
+ return (/[\'\"]/).test(s) ? parseFloat(f) + (parseFloat(i)/12 || 0) : parseFloat(f) + parseFloat(i);
59
+ },
60
+ type: 'numeric'
61
+ });
62
+
63
+ })(jQuery);
@@ -0,0 +1,73 @@
1
+ /*! File Type parser
2
+ * When a file type extension is found, the equivalent name is
3
+ * prefixed into the parsed data, so sorting occurs in groups
4
+ */
5
+ /*global jQuery: false */
6
+ ;(function($){
7
+ "use strict";
8
+
9
+ // basic list from http://en.wikipedia.org/wiki/List_of_file_formats
10
+ // To add a custom equivalent, define:
11
+ // $.tablesorter.fileTypes.equivalents['xx'] = "A|B|C";
12
+ $.tablesorter.fileTypes = {
13
+ // divides filetype extensions in the equivalent list below
14
+ separator : '|',
15
+ equivalents : {
16
+ "3D Image" : "3dm|3ds|dwg|max|obj",
17
+ "Audio" : "aif|aac|ape|flac|la|m4a|mid|midi|mp2|mp3|ogg|ra|raw|rm|wav|wma",
18
+ "Compressed" : "7z|bin|cab|cbr|gz|gzip|iso|lha|lz|rar|tar|tgz|zip|zipx|zoo",
19
+ "Database" : "csv|dat|db|dbf|json|ldb|mdb|myd|pdb|sql|tsv|wdb|wmdb|xlr|xls|xlsx|xml",
20
+ "Development" : "asm|c|class|cls|cpp|cc|cs|cxx|cbp|cs|dba|fla|h|java|lua|pl|py|pyc|pyo|sh|sln|r|rb|vb",
21
+ "Document" : "doc|docx|odt|ott|pages|pdf|rtf|tex|wpd|wps|wrd|wri",
22
+ "Executable" : "apk|app|com|exe|gadget|lnk|msi",
23
+ "Fonts" : "eot|fnt|fon|otf|ttf|woff",
24
+ "Icons" : "ani|cur|icns|ico",
25
+ "Images" : "bmp|gif|jpg|jpeg|jpe|jp2|pic|png|psd|tga|tif|tiff|wmf|webp",
26
+ "Presentation" : "pps|ppt",
27
+ "Published" : "chp|epub|lit|pub|ppp|fm|mobi",
28
+ "Script" : "as|bat|cgi|cmd|jar|js|lua|scpt|scptd|sh|vbs|vb|wsf",
29
+ "Styles" : "css|less|sass",
30
+ "Text" : "info|log|md|markdown|nfo|tex|text|txt",
31
+ "Vectors" : "awg|ai|eps|cdr|ps|svg",
32
+ "Video" : "asf|avi|flv|m4v|mkv|mov|mp4|mpe|mpeg|mpg|ogg|rm|rv|swf|vob|wmv",
33
+ "Web" : "asp|aspx|cer|cfm|htm|html|php|url|xhtml"
34
+ }
35
+ };
36
+
37
+ $.tablesorter.addParser({
38
+ id: 'filetype',
39
+ is: function() {
40
+ return false;
41
+ },
42
+ format: function(s, table) {
43
+ var t,
44
+ c = table.config,
45
+ wo = c.widgetOptions,
46
+ i = s.lastIndexOf('.'),
47
+ sep = $.tablesorter.fileTypes.separator,
48
+ m = $.tablesorter.fileTypes.matching,
49
+ types = $.tablesorter.fileTypes.equivalents;
50
+ if (!m) {
51
+ // make a string to "quick" match the existing equivalents
52
+ var t = [];
53
+ $.each(types, function(i,v){
54
+ t.push(v);
55
+ });
56
+ m = $.tablesorter.fileTypes.matching = sep + t.join(sep) + sep;
57
+ }
58
+ if (i >= 0) {
59
+ t = sep + s.substring(i + 1, s.length) + sep;
60
+ if (m.indexOf(t) >= 0) {
61
+ for (i in types) {
62
+ if ((sep + types[i] + sep).indexOf(t) >= 0) {
63
+ return i + (wo.group_separator ? wo.group_separator : '-') + s;
64
+ }
65
+ }
66
+ }
67
+ }
68
+ return s;
69
+ },
70
+ type: 'text'
71
+ });
72
+
73
+ })(jQuery);
@@ -0,0 +1,47 @@
1
+ /*! Title parser
2
+ * This parser will remove "The", "A" and "An" from the beginning of a book
3
+ * or movie title, so it sorts by the second word or number
4
+ * Demo: http://jsfiddle.net/Mottie/abkNM/5/
5
+ */
6
+ /*global jQuery: false */
7
+ ;(function($){
8
+ "use strict";
9
+
10
+ // basic list from http://en.wikipedia.org/wiki/Article_%28grammar%29
11
+ $.tablesorter.ignoreArticles = {
12
+ "en" : "the, a, an",
13
+ "de" : "der, die, das, des, dem, den, ein, eine, einer, eines, einem, einen",
14
+ "nl" : "de, het, de, een",
15
+ "es" : "el, la, lo, los, las, un, una, unos, unas",
16
+ "pt" : "o, a, os, as, um, uma, uns, umas",
17
+ "fr" : "le, la, l'_, les, un, une, des",
18
+ "it" : "il, lo, la, l'_, i, gli, le, un', uno, una, un",
19
+ "hu" : "a, az, egy"
20
+ };
21
+
22
+ // To add a custom parser, define:
23
+ // $.tablesorter.ignoreArticles['xx'] = "A, B, C";
24
+ // and then set the language id 'xx' in the headers option
25
+ // ignoreArticles : 'xx'
26
+
27
+ $.tablesorter.addParser({
28
+ id: 'ignoreArticles',
29
+ is: function() {
30
+ return false;
31
+ },
32
+ format: function(s, table, cell, cellIndex) {
33
+ var c = table.config, art, lang;
34
+ if ( !(c.headers && c.headers[cellIndex] && c.headers[cellIndex].ignoreArticlesRegex) ) {
35
+ // initialize - save regex in c.headers[cellIndex].ignoreArticles
36
+ if (!c.headers) { c.headers = {}; }
37
+ if (!c.headers[cellIndex]) { c.headers[cellIndex] = {}; }
38
+ lang = $.tablesorter.getData(c.$headers.eq(cellIndex), c.headers[cellIndex], 'ignoreArticles');
39
+ art = ($.tablesorter.ignoreArticles[lang] || "the, a, an" ) + "";
40
+ c.headers[cellIndex].ignoreArticlesRegex = new RegExp('^(' + $.trim( art.split(/\s*\,\s*/).join('\\s|') + "\\s" ).replace("_\\s","") + ')', 'i');
41
+ }
42
+ return (s || '').replace(c.headers[cellIndex].ignoreArticlesRegex, '');
43
+ },
44
+ type: 'text'
45
+ });
46
+
47
+ })(jQuery);
@@ -0,0 +1,86 @@
1
+ /*! input & select parsers for jQuery 1.7+ & tablesorter 2.7.11+
2
+ * Updated 2/19/2014 (v2.15.0)
3
+ * Demo: http://mottie.github.com/tablesorter/docs/example-widget-grouping.html
4
+ */
5
+ /*jshint browser: true, jquery:true, unused:false */
6
+ ;(function($){
7
+ "use strict";
8
+
9
+ var resort = true, // resort table after update
10
+ updateServer = function(event, $table, $input){
11
+ // do something here to update your server, if needed
12
+ // event = change event object
13
+ // $table = jQuery object of the table that was just updated
14
+ // $input = jQuery object of the input or select that was modified
15
+ };
16
+
17
+ // Custom parser for parsing input values
18
+ // updated dynamically using the "change" function below
19
+ $.tablesorter.addParser({
20
+ id: "inputs",
21
+ is: function(){
22
+ return false;
23
+ },
24
+ format: function(s, table, cell) {
25
+ return $(cell).find('input').val() || s;
26
+ },
27
+ parsed : true, // filter widget flag
28
+ type: "text"
29
+ });
30
+
31
+ // Custom parser for including checkbox status if using the grouping widget
32
+ // updated dynamically using the "change" function below
33
+ $.tablesorter.addParser({
34
+ id: "checkbox",
35
+ is: function(){
36
+ return false;
37
+ },
38
+ format: function(s, table, cell, cellIndex) {
39
+ var $c = $(cell).find('input'),
40
+ isChecked = $c[0].checked;
41
+ // adding class to row, indicating that a checkbox is checked; includes
42
+ // a column index in case more than one checkbox happens to be in a row
43
+ $c.closest('tr').toggleClass('checked-' + cellIndex, isChecked);
44
+ // returning plain language here because this is what is shown in the
45
+ // group headers - change it as desired
46
+ return $c.length ? isChecked ? 'checked' : 'unchecked' : s;
47
+ },
48
+ parsed : true, // filter widget flag
49
+ type: "text"
50
+ });
51
+
52
+ // Custom parser which returns the currently selected options
53
+ // updated dynamically using the "change" function below
54
+ $.tablesorter.addParser({
55
+ id: "select",
56
+ is: function(){
57
+ return false;
58
+ },
59
+ format: function(s, table, cell) {
60
+ return $(cell).find('select').val() || s;
61
+ },
62
+ parsed : true, // filter widget flag
63
+ type: "text"
64
+ });
65
+
66
+ // update select and all input types in the tablesorter cache when the change event fires.
67
+ // This method only works with jQuery 1.7+
68
+ // you can change it to use delegate (v1.4.3+) or live (v1.3+) as desired
69
+ // if this code interferes somehow, target the specific table $('#mytable'), instead of $('table')
70
+ $(window).load(function(){
71
+ // this flag prevents the updateCell event from being spammed
72
+ // it happens when you modify input text and hit enter
73
+ var alreadyUpdating = false;
74
+ $('table').find('tbody').on('change', 'select, input', function(e){
75
+ if (!alreadyUpdating) {
76
+ var $tar = $(e.target),
77
+ $table = $tar.closest('table');
78
+ alreadyUpdating = true;
79
+ $table.trigger('updateCell', [ $tar.closest('td'), resort ]);
80
+ updateServer(e, $table, $tar);
81
+ setTimeout(function(){ alreadyUpdating = false; }, 10);
82
+ }
83
+ });
84
+ });
85
+
86
+ })(jQuery);