├── .gitignore ├── gulpfile.js ├── bower.json ├── package.json ├── LICENSE ├── jquery.tablesort.min.js ├── index.html ├── zepto.html ├── jquery.tablesort.js ├── README.md ├── zepto.js └── jquery.min.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | var gulp = require('gulp'); 2 | var uglify = require("gulp-uglify"); 3 | var rename = require('gulp-rename'); 4 | 5 | 6 | gulp.task('default', function() { 7 | gulp.src('jquery.tablesort.js') 8 | .pipe(uglify({preserveComments: 'license'})) 9 | .pipe(rename('jquery.tablesort.min.js')) 10 | .pipe(gulp.dest('.')); 11 | }); 12 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-tablesort", 3 | "version": "0.0.11", 4 | "homepage": "https://github.com/kylefox/jquery-tablesort", 5 | "authors": [ 6 | "Kyle Fox " 7 | ], 8 | "description": "A simple, lightweight jQuery plugin for creating sortable tables.", 9 | "main": "jquery.tablesort.js", 10 | "moduleType": [], 11 | "license": "MIT", 12 | "ignore": [ 13 | "**/.*", 14 | "node_modules", 15 | "bower_components", 16 | "test", 17 | "tests" 18 | ], 19 | "dependencies": { 20 | "jquery": "1.8.0 - 2.2.x" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-tablesort", 3 | "version": "0.0.11", 4 | "description": "A simple, lightweight jQuery plugin for creating sortable tables.", 5 | "main": "jquery.tablesort.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/kylefox/jquery-tablesort.git" 12 | }, 13 | "author": "Kyle Fox ", 14 | "license": "MIT", 15 | "bugs": { 16 | "url": "https://github.com/kylefox/jquery-tablesort/issues" 17 | }, 18 | "homepage": "https://github.com/kylefox/jquery-tablesort#readme", 19 | "devDependencies": { 20 | "gulp": "^3.9.1", 21 | "gulp-rename": "^1.2.2", 22 | "gulp-uglify": "^1.4.1" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | # License 2 | 3 | jQuery tablesort is distributed under the MIT License. 4 | Learn more at http://opensource.org/licenses/mit-license.php 5 | 6 | Copyright (c) 2012 Kyle Fox 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining 9 | a copy of this software and associated documentation files (the 10 | "Software"), to deal in the Software without restriction, including 11 | without limitation the rights to use, copy, modify, merge, publish, 12 | distribute, sublicense, and/or sell copies of the Software, and to 13 | permit persons to whom the Software is furnished to do so, subject to 14 | the following conditions: 15 | 16 | The above copyright notice and this permission notice shall be 17 | included in all copies or substantial portions of the Software. 18 | 19 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 23 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 24 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 25 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 | -------------------------------------------------------------------------------- /jquery.tablesort.min.js: -------------------------------------------------------------------------------- 1 | /* 2 | A simple, lightweight jQuery plugin for creating sortable tables. 3 | https://github.com/kylefox/jquery-tablesort 4 | Version 0.0.12 5 | */ 6 | !function(t){function e(t){var e=document.createElement("style");e.type="text/css",e.rel="stylesheet";try{e.appendChild(document.createTextNode(t))}catch(s){e.styleSheet.cssText=t}var n=document.getElementsByTagName("head")[0];n.appendChild(e)}e(["th,td{border:1px solid #999;padding:5px 2px;}th{cursor: default;}",'th.sortable:after{content:" \\2193\\2191";}','th.sortable.asc:after{content:" \\2191";}','th.sortable.desc:after{content:" \\2193";}'].join("")),t.tablesort=function(e,s){var n=this;this.$table=e,this.$thead=this.$table.find("thead"),this.settings=t.extend({},t.tablesort.defaults,s),this.$sortCells=this.$thead.length>0?this.$thead.find("th.sortable"):this.$table.find("th.sortable"),this.$sortCells.on("click.tablesort",function(){if(n.$sorting)return!1;n.$sorting=1;var e=new Date,s=t(this);s.css("transform","scale(0.95)"),n.$table.trigger("tablesort:start",[n]),n.index!==s.index()?(n.direction="asc",n.index=s.index()):n.direction="asc"===n.direction?"desc":"asc",n.$sortCells.removeClass("asc desc"),s.addClass(n.direction),n.$table.css("display"),setTimeout(function(){s.css("transform","scale(1)"),n.sort(s),n.log("Sort finished in "+((new Date).getTime()-e.getTime())+"ms"),n.$table.trigger("tablesort:complete",[n]),n.$sorting=0},100)}),this.$th=null,this.index=null,this.direction=null,this.$sorting=0},t.tablesort.prototype={sort:function(e,s){var n=this,o=this.$table,i=o.find("tbody").length>0?o.find("tbody"):o,r=i.find("tr").has("td, th"),a=r.find(":nth-child("+(e.index()+1)+")").filter("td, th"),l=e.data().sortBy,d=[],c=a.map(function(s,o){if(l)return"function"==typeof l?l(t(e),t(o),n):l;var i=null!=t(this).data().sortValue?t(this).data().sortValue:t(this).text();return e.hasClass("number")?parseFloat(i,10):i});if(0===c.length)return!1;n.log("Sorting by "+this.index+" "+this.direction),s="asc"==this.direction?1:-1;for(var h=0,u=c.length;he?1:t 2 | 3 | 4 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 |
NameBandDate of BirthAgePhoto
Thom YorkeRadioheadOctober 7, 196843
Justin VernonBon IverApril 30, 198130 51 |
Paul McCartneyThe BeatlesJune 18, 194269
Sam BeamIron & WineJuly 26, 197437
68 |
69 | 70 |
71 | 72 | 73 | 74 | 75 | 76 | 110 | 111 | -------------------------------------------------------------------------------- /zepto.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 |
NameBandDate of BirthAge
Thom YorkeRadioheadOctober 7, 196843
Justin VernonBon IverApril 30, 198130
Paul McCartneyThe BeatlesJune 18, 194269
Sam BeamIron & WineJuly 26, 197437
63 | 64 |

No thead or tbody; just trs

65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 |
NameBandDate of BirthAge
Thom YorkeRadioheadOctober 7, 196843
Justin VernonBon IverApril 30, 198130
Paul McCartneyThe BeatlesJune 18, 194269
Sam BeamIron & WineJuly 26, 197437
97 | 98 |
99 | 100 |
101 | 102 | 103 | 104 | 125 | 126 | 127 | 128 | -------------------------------------------------------------------------------- /jquery.tablesort.js: -------------------------------------------------------------------------------- 1 | /* 2 | A simple, lightweight jQuery plugin for creating sortable tables. 3 | https://github.com/kylefox/jquery-tablesort 4 | Version 0.0.12 5 | */ 6 | 7 | (function($) { 8 | 9 | function loadCssCode(code){ 10 | var style = document.createElement('style'); 11 | style.type = 'text/css'; 12 | style.rel = 'stylesheet'; 13 | try{ 14 | //for Chrome Firefox Opera Safari 15 | style .appendChild(document.createTextNode(code)); 16 | } catch(ex) { 17 | //for IE 18 | style.styleSheet.cssText = code; 19 | } 20 | var head = document.getElementsByTagName('head')[0]; 21 | head.appendChild(style); 22 | } 23 | 24 | loadCssCode([ 25 | 'th,td{border:1px solid #999;padding:5px 2px;}th{cursor: default;}', 26 | 'th.sortable:after{content:" \\2193\\2191";}', 27 | 'th.sortable.asc:after{content:" \\2191";}', 28 | 'th.sortable.desc:after{content:" \\2193";}', 29 | ].join('')); 30 | 31 | $.tablesort = function ($table, settings) { 32 | var self = this; 33 | this.$table = $table; 34 | this.$thead = this.$table.find('thead'); 35 | this.settings = $.extend({}, $.tablesort.defaults, settings); 36 | this.$sortCells = this.$thead.length > 0 ? this.$thead.find('th.sortable') : this.$table.find('th.sortable'); 37 | this.$sortCells.on('click.tablesort', function() { 38 | if (self.$sorting) { 39 | return false 40 | } else { 41 | self.$sorting = 1 42 | // must make a dlay,or the tablesort:start event will delay 43 | var start = new Date() 44 | var curTh = $(this) 45 | 46 | curTh.css('transform', 'scale(0.95)'); 47 | 48 | // `tablesort:start` callback. Also avoids locking up the browser too much. 49 | self.$table.trigger('tablesort:start', [self]); 50 | // click on a different column 51 | if (self.index !== curTh.index()) { 52 | self.direction = 'asc'; 53 | self.index = curTh.index(); 54 | } else { 55 | self.direction = self.direction === 'asc' ? 'desc' : 'asc'; 56 | } 57 | 58 | self.$sortCells.removeClass('asc desc'); 59 | 60 | curTh.addClass(self.direction); 61 | 62 | // Try to force a browser redraw 63 | self.$table.css("display"); 64 | 65 | setTimeout(function() { 66 | curTh.css('transform', 'scale(1)'); 67 | self.sort(curTh); 68 | self.log('Sort finished in ' + ((new Date()).getTime() - start.getTime()) + 'ms'); 69 | self.$table.trigger('tablesort:complete', [self]); 70 | self.$sorting = 0 71 | }, 100) 72 | } 73 | }); 74 | this.$th = null; 75 | this.index = null; 76 | this.direction = null; 77 | this.$sorting = 0; 78 | }; 79 | 80 | $.tablesort.prototype = { 81 | 82 | sort: function(th, direction) { 83 | 84 | var self = this, 85 | table = this.$table, 86 | rowsContainer = table.find('tbody').length > 0 ? table.find('tbody') : table, 87 | rows = rowsContainer.find('tr').has('td, th'), 88 | cells = rows.find(':nth-child(' + (th.index() + 1) + ')').filter('td, th'), 89 | sortBy = th.data().sortBy, 90 | sortedMap = []; 91 | 92 | var unsortedValues = cells.map(function(idx, cell) { 93 | if (sortBy) { 94 | return (typeof sortBy === 'function') ? sortBy($(th), $(cell), self) : sortBy; 95 | } else { 96 | var value = ($(this).data().sortValue != null ? $(this).data().sortValue : $(this).text()); 97 | if (th.hasClass('number')) { 98 | return parseFloat(value, 10); 99 | } else { 100 | return value; 101 | } 102 | } 103 | }); 104 | 105 | if (unsortedValues.length === 0) { 106 | return false; 107 | } 108 | 109 | self.log("Sorting by " + this.index + ' ' + this.direction); 110 | direction = this.direction == 'asc' ? 1 : -1; 111 | for (var i = 0, length = unsortedValues.length; i < length; i++) { 112 | sortedMap.push({ 113 | index: i, 114 | cell: cells[i], 115 | row: rows[i], 116 | value: unsortedValues[i] 117 | }); 118 | } 119 | 120 | // Run sorting asynchronously on a timeout to force browser redraw after 121 | sortedMap.sort(function(a, b) { 122 | return self.settings.compare(a.value, b.value) * direction; 123 | }); 124 | 125 | $.each(sortedMap, function(i, entry) { 126 | rowsContainer.append(entry.row); 127 | }); 128 | }, 129 | 130 | log: function(msg) { 131 | if(($.tablesort.DEBUG || this.settings.debug) && console && console.log) { 132 | console.log('[tablesort] ' + msg); 133 | } 134 | }, 135 | 136 | destroy: function() { 137 | this.$sortCells.off('click.tablesort'); 138 | this.$table.data('tablesort', null); 139 | return null; 140 | } 141 | }; 142 | 143 | $.tablesort.DEBUG = false; 144 | 145 | $.tablesort.defaults = { 146 | debug: $.tablesort.DEBUG, 147 | compare: function(a, b) { 148 | if (a > b) { 149 | return 1; 150 | } else if (a < b) { 151 | return -1; 152 | } else { 153 | return 0; 154 | } 155 | } 156 | }; 157 | 158 | $.fn.tablesort = function(settings) { 159 | var table, sortable, previous; 160 | return this.each(function() { 161 | table = $(this); 162 | previous = table.data('tablesort'); 163 | if(previous) { 164 | previous.destroy(); 165 | } 166 | table.data('tablesort', new $.tablesort(table, settings)); 167 | }); 168 | }; 169 | 170 | })(window.Zepto || window.jQuery); 171 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | A tiny & dead-simple jQuery plugin for sortable tables. Here's a basic [demo](http://dl.dropbox.com/u/780754/tablesort/index.html). 2 | 3 | Maintainers Wanted 4 | --- 5 | 6 | ![](https://img.shields.io/badge/maintainers-wanted-red.svg) 7 | 8 | I don't use this library much anymore and don't have time to maintain it solo. 9 | 10 | If you are interested in helping me maintain this library, please let me know! [**Read more here »**](https://github.com/kylefox/jquery-tablesort/issues/32) 11 | 12 | Your help would be greatly appreciated! 13 | 14 | Install 15 | --- 16 | 17 | Just add jQuery & the tablesort plugin to your page: 18 | 19 | ```html 20 | 21 | 22 | ``` 23 | 24 | (The plugin is also compatible with [Zepto.js](https://github.com/madrobby/zepto)). 25 | 26 | It's also available via [npm](https://www.npmjs.com/package/jquery-tablesort) 27 | 28 | `npm install jquery-tablesort` 29 | 30 | and [bower](https://bower.io/) 31 | 32 | `bower install jquery-tablesort` 33 | 34 | Basic use 35 | --- 36 | 37 | Call the appropriate method on the table you want to make sortable: 38 | 39 | ```javascript 40 | $('table').tablesort(); 41 | ``` 42 | 43 | The table will be sorted when the column headers are clicked. 44 | 45 | To prevent a column from being sortable, just add the `no-sort` class: 46 | 47 | ```html 48 | Photo 49 | ``` 50 | 51 | Your table should follow this general format: 52 | 53 | > Note: If you have access to the table markup, it's better to wrap your table rows 54 | in `` and `` elements (see below), resulting in a slightly faster sort. 55 | > 56 | > If you can't use ``, the plugin will fall back by sorting all `` rows 57 | that contain a `` element using jQuery's `.has()` method (ie, the header row, 58 | containing `` elements, will remain at the top where it belongs). 59 | 60 | ```html 61 | 62 | 63 | 64 | 65 | ... 66 | 67 | 68 | 69 | 70 | 71 | ... 72 | 73 | 74 |
75 | ``` 76 | 77 | If you want some imageless arrows to indicate the sort, just add this to your CSS: 78 | 79 | ```css 80 | th.sorted.ascending:after { 81 | content: " \2191"; 82 | } 83 | 84 | th.sorted.descending:after { 85 | content: " \2193"; 86 | } 87 | ``` 88 | 89 | How cells are sorted 90 | --- 91 | 92 | At the moment cells are naively sorted using string comparison. By default, the ``'s text is used, but you can easily override that by adding a `data-sort-value` attribute to the cell. For example to sort by a date while keeping the cell contents human-friendly, just add the timestamp as the `data-sort-value`: 93 | 94 | ```html 95 | March 7, 2012 96 | ``` 97 | 98 | This allows you to sort your cells using your own criteria without having to write a custom sort function. It also keeps the plugin lightweight by not having to guess & parse dates. 99 | 100 | Defining custom sort functions 101 | --- 102 | 103 | If you have special requirements (or don't want to clutter your markup like the above example) you can easily hook in your own function that determines the sort value for a given cell. 104 | 105 | Custom sort functions are attached to `` elements using `data()` and are used to determine the sort value for all cells in that column: 106 | 107 | ```javascript 108 | // Sort by dates in YYYY-MM-DD format 109 | $('thead th.date').data('sortBy', function(th, td, tablesort) { 110 | return new Date(td.text()); 111 | }); 112 | 113 | // Sort hex values, ie: "FF0066": 114 | $('thead th.hex').data('sortBy', function(th, td, tablesort) { 115 | return parseInt(td.text(), 16); 116 | }); 117 | 118 | // Sort by an arbitrary object, ie: a Backbone model: 119 | $('thead th.personID').data('sortBy', function(th, td, tablesort) { 120 | return App.People.get(td.text()); 121 | }); 122 | ``` 123 | 124 | Sort functions are passed three parameters: 125 | 126 | * the `` being sorted on 127 | * the `` for which the current sort value is required 128 | * the `tablesort` instance 129 | 130 | Custom comparison functions 131 | --- 132 | 133 | If you need to implement more advanced sorting logic, you can specify a comparison function with the `compare` setting. The function works the same way as the `compareFunction` accepted by [`Array.prototype.sort()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort): 134 | 135 | ```javascript 136 | function compare(a, b) { 137 | if (a < b) { 138 | return -1; // `a` is less than `b` by some ordering criterion 139 | } 140 | if (a > b) { 141 | return 1; // `a` is greater than `b` by the ordering criterion 142 | } 143 | 144 | return 0; // `a` is equal to `b` 145 | } 146 | ``` 147 | 148 | Events 149 | --- 150 | 151 | The following events are triggered on the `` element being sorted, `'tablesort:start'` and `'tablesort:complete'`. The `event` and `tablesort` instance are passed as parameters: 152 | 153 | ```javascript 154 | $('table').on('tablesort:start', function(event, tablesort) { 155 | console.log("Starting the sort..."); 156 | }); 157 | 158 | $('table').on('tablesort:complete', function(event, tablesort) { 159 | console.log("Sort finished!"); 160 | }); 161 | ``` 162 | 163 | tablesort instances 164 | --- 165 | 166 | A table's tablesort instance can be retrieved by querying the data object: 167 | 168 | ```javascript 169 | $('table').tablesort(); // Make the table sortable. 170 | var tablesort = $('table').data('tablesort'); // Get a reference to it's tablesort instance 171 | ``` 172 | 173 | Properties: 174 | 175 | ```javascript 176 | tablesort.$table // The
being sorted. 177 | tablesort.$th // The
currently sorted by (null if unsorted). 178 | tablesort.index // The column index of tablesort.$th (or null). 179 | tablesort.direction // The direction of the current sort, either 'asc' or 'desc' (or null if unsorted). 180 | tablesort.settings // Settings for this instance (see below). 181 | ``` 182 | 183 | Methods: 184 | 185 | ```javascript 186 | // Sorts by the specified column and, optionally, direction ('asc' or 'desc'). 187 | // If direction is omitted, the reverse of the current direction is used. 188 | tablesort.sort(th, direction); 189 | 190 | tablesort.destroy(); 191 | ``` 192 | 193 | Default Sorting 194 | --- 195 | 196 | It's possible to apply a default sort on page load using the `.sort()` method described above. Simply grab the tablesort instance and call `.sort()`, padding in the `` element you want to sort by. 197 | 198 | Assuming your markup is `` and the column to sort by default is `
` you would write: 199 | 200 | ```javascript 201 | $(function() { 202 | $('table.sortable').tablesort().data('tablesort').sort($("th.default-sort")); 203 | }); 204 | ``` 205 | 206 | Settings 207 | --- 208 | 209 | Here are the supported options and their default values: 210 | 211 | ```javascript 212 | $.tablesort.defaults = { 213 | debug: $.tablesort.DEBUG, // Outputs some basic debug info when true. 214 | asc: 'sorted ascending', // CSS classes added to `` elements on sort. 215 | desc: 'sorted descending', 216 | compare: function(a, b) { // Function used to compare values when sorting. 217 | if (a > b) { 218 | return 1; 219 | } else if (a < b) { 220 | return -1; 221 | } else { 222 | return 0; 223 | } 224 | } 225 | }; 226 | ``` 227 | 228 | You can also change the global debug value which overrides the instance's settings: 229 | 230 | ```javascript 231 | $.tablesort.DEBUG = false; 232 | ``` 233 | 234 | Alternatives 235 | --- 236 | 237 | I don't use this plugin much any more — most of the fixes & improvements are provided by contributors. 238 | 239 | If this plugin isn't meeting your needs and you don't want to submit a pull-request, here are some alternative table-sorting plugins. 240 | 241 | * [Stupid jQuery Table Sort](https://github.com/joequery/Stupid-Table-Plugin) 242 | 243 | _(Feel free to suggest more by [opening a new issue](https://github.com/kylefox/jquery-tablesort/issues/new))_ 244 | 245 | Contributing 246 | --- 247 | 248 | As always, all suggestions, bug reports/fixes, and improvements are welcome. 249 | 250 | Minify JavaScript with [Closure Compiler](http://closure-compiler.appspot.com/home) (default options) 251 | 252 | Help with any of the following is particularly appreciated: 253 | 254 | * Performance improvements 255 | * Making the code as concise/efficient as possible 256 | * Browser compatibility 257 | 258 | Please fork and send pull requests, or [report an issue.](https://github.com/kylefox/jquery-tablesort/issues) 259 | 260 | # License 261 | 262 | jQuery tablesort is distributed under the MIT License. 263 | Learn more at http://opensource.org/licenses/mit-license.php 264 | 265 | Copyright (c) 2012 Kyle Fox 266 | 267 | Permission is hereby granted, free of charge, to any person obtaining 268 | a copy of this software and associated documentation files (the 269 | "Software"), to deal in the Software without restriction, including 270 | without limitation the rights to use, copy, modify, merge, publish, 271 | distribute, sublicense, and/or sell copies of the Software, and to 272 | permit persons to whom the Software is furnished to do so, subject to 273 | the following conditions: 274 | 275 | The above copyright notice and this permission notice shall be 276 | included in all copies or substantial portions of the Software. 277 | 278 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 279 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 280 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 281 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 282 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 283 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 284 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 285 | -------------------------------------------------------------------------------- /zepto.js: -------------------------------------------------------------------------------- 1 | /* Zepto v1.0-132-g047da34 - zepto event detect fx ajax form data - zeptojs.com/license */ 2 | 3 | 4 | var Zepto = (function() { 5 | var undefined, key, $, classList, emptyArray = [], slice = emptyArray.slice, filter = emptyArray.filter, 6 | document = window.document, 7 | elementDisplay = {}, classCache = {}, 8 | cssNumber = { 'column-count': 1, 'columns': 1, 'font-weight': 1, 'line-height': 1,'opacity': 1, 'z-index': 1, 'zoom': 1 }, 9 | fragmentRE = /^\s*<(\w+|!)[^>]*>/, 10 | singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, 11 | tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, 12 | rootNodeRE = /^(?:body|html)$/i, 13 | 14 | // special attributes that should be get/set via method calls 15 | methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'], 16 | 17 | adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ], 18 | table = document.createElement('table'), 19 | tableRow = document.createElement('tr'), 20 | containers = { 21 | 'tr': document.createElement('tbody'), 22 | 'tbody': table, 'thead': table, 'tfoot': table, 23 | 'td': tableRow, 'th': tableRow, 24 | '*': document.createElement('div') 25 | }, 26 | readyRE = /complete|loaded|interactive/, 27 | classSelectorRE = /^\.([\w-]+)$/, 28 | idSelectorRE = /^#([\w-]*)$/, 29 | tagSelectorRE = /^[\w-]+$/, 30 | class2type = {}, 31 | toString = class2type.toString, 32 | zepto = {}, 33 | camelize, uniq, 34 | tempParent = document.createElement('div') 35 | 36 | zepto.matches = function(element, selector) { 37 | if (!element || element.nodeType !== 1) return false 38 | var matchesSelector = element.webkitMatchesSelector || element.mozMatchesSelector || 39 | element.oMatchesSelector || element.matchesSelector 40 | if (matchesSelector) return matchesSelector.call(element, selector) 41 | // fall back to performing a selector: 42 | var match, parent = element.parentNode, temp = !parent 43 | if (temp) (parent = tempParent).appendChild(element) 44 | match = ~zepto.qsa(parent, selector).indexOf(element) 45 | temp && tempParent.removeChild(element) 46 | return match 47 | } 48 | 49 | function type(obj) { 50 | return obj == null ? String(obj) : 51 | class2type[toString.call(obj)] || "object" 52 | } 53 | 54 | function isFunction(value) { return type(value) == "function" } 55 | function isWindow(obj) { return obj != null && obj == obj.window } 56 | function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE } 57 | function isObject(obj) { return type(obj) == "object" } 58 | function isPlainObject(obj) { 59 | return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype 60 | } 61 | function isArray(value) { return value instanceof Array } 62 | function likeArray(obj) { return typeof obj.length == 'number' } 63 | 64 | function compact(array) { return filter.call(array, function(item){ return item != null }) } 65 | function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array } 66 | camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) } 67 | function dasherize(str) { 68 | return str.replace(/::/g, '/') 69 | .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') 70 | .replace(/([a-z\d])([A-Z])/g, '$1_$2') 71 | .replace(/_/g, '-') 72 | .toLowerCase() 73 | } 74 | uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) } 75 | 76 | function classRE(name) { 77 | return name in classCache ? 78 | classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)')) 79 | } 80 | 81 | function maybeAddPx(name, value) { 82 | return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value 83 | } 84 | 85 | function defaultDisplay(nodeName) { 86 | var element, display 87 | if (!elementDisplay[nodeName]) { 88 | element = document.createElement(nodeName) 89 | document.body.appendChild(element) 90 | display = getComputedStyle(element, '').getPropertyValue("display") 91 | element.parentNode.removeChild(element) 92 | display == "none" && (display = "block") 93 | elementDisplay[nodeName] = display 94 | } 95 | return elementDisplay[nodeName] 96 | } 97 | 98 | function children(element) { 99 | return 'children' in element ? 100 | slice.call(element.children) : 101 | $.map(element.childNodes, function(node){ if (node.nodeType == 1) return node }) 102 | } 103 | 104 | // `$.zepto.fragment` takes a html string and an optional tag name 105 | // to generate DOM nodes nodes from the given html string. 106 | // The generated DOM nodes are returned as an array. 107 | // This function can be overriden in plugins for example to make 108 | // it compatible with browsers that don't support the DOM fully. 109 | zepto.fragment = function(html, name, properties) { 110 | var dom, nodes, container 111 | 112 | // A special case optimization for a single tag 113 | if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1)) 114 | 115 | if (!dom) { 116 | if (html.replace) html = html.replace(tagExpanderRE, "<$1>") 117 | if (name === undefined) name = fragmentRE.test(html) && RegExp.$1 118 | if (!(name in containers)) name = '*' 119 | 120 | container = containers[name] 121 | container.innerHTML = '' + html 122 | dom = $.each(slice.call(container.childNodes), function(){ 123 | container.removeChild(this) 124 | }) 125 | } 126 | 127 | if (isPlainObject(properties)) { 128 | nodes = $(dom) 129 | $.each(properties, function(key, value) { 130 | if (methodAttributes.indexOf(key) > -1) nodes[key](value) 131 | else nodes.attr(key, value) 132 | }) 133 | } 134 | 135 | return dom 136 | } 137 | 138 | // `$.zepto.Z` swaps out the prototype of the given `dom` array 139 | // of nodes with `$.fn` and thus supplying all the Zepto functions 140 | // to the array. Note that `__proto__` is not supported on Internet 141 | // Explorer. This method can be overriden in plugins. 142 | zepto.Z = function(dom, selector) { 143 | dom = dom || [] 144 | dom.__proto__ = $.fn 145 | dom.selector = selector || '' 146 | return dom 147 | } 148 | 149 | // `$.zepto.isZ` should return `true` if the given object is a Zepto 150 | // collection. This method can be overriden in plugins. 151 | zepto.isZ = function(object) { 152 | return object instanceof zepto.Z 153 | } 154 | 155 | // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and 156 | // takes a CSS selector and an optional context (and handles various 157 | // special cases). 158 | // This method can be overriden in plugins. 159 | zepto.init = function(selector, context) { 160 | // If nothing given, return an empty Zepto collection 161 | if (!selector) return zepto.Z() 162 | // If a function is given, call it when the DOM is ready 163 | else if (isFunction(selector)) return $(document).ready(selector) 164 | // If a Zepto collection is given, juts return it 165 | else if (zepto.isZ(selector)) return selector 166 | else { 167 | var dom 168 | // normalize array if an array of nodes is given 169 | if (isArray(selector)) dom = compact(selector) 170 | // Wrap DOM nodes. 171 | else if (isObject(selector)) 172 | dom = [selector], selector = null 173 | // If it's a html fragment, create nodes from it 174 | else if (fragmentRE.test(selector)) 175 | dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null 176 | // If there's a context, create a collection on that context first, and select 177 | // nodes from there 178 | else if (context !== undefined) return $(context).find(selector) 179 | // And last but no least, if it's a CSS selector, use it to select nodes. 180 | else dom = zepto.qsa(document, selector) 181 | // create a new Zepto collection from the nodes found 182 | return zepto.Z(dom, selector) 183 | } 184 | } 185 | 186 | // `$` will be the base `Zepto` object. When calling this 187 | // function just call `$.zepto.init, which makes the implementation 188 | // details of selecting nodes and creating Zepto collections 189 | // patchable in plugins. 190 | $ = function(selector, context){ 191 | return zepto.init(selector, context) 192 | } 193 | 194 | function extend(target, source, deep) { 195 | for (key in source) 196 | if (deep && (isPlainObject(source[key]) || isArray(source[key]))) { 197 | if (isPlainObject(source[key]) && !isPlainObject(target[key])) 198 | target[key] = {} 199 | if (isArray(source[key]) && !isArray(target[key])) 200 | target[key] = [] 201 | extend(target[key], source[key], deep) 202 | } 203 | else if (source[key] !== undefined) target[key] = source[key] 204 | } 205 | 206 | // Copy all but undefined properties from one or more 207 | // objects to the `target` object. 208 | $.extend = function(target){ 209 | var deep, args = slice.call(arguments, 1) 210 | if (typeof target == 'boolean') { 211 | deep = target 212 | target = args.shift() 213 | } 214 | args.forEach(function(arg){ extend(target, arg, deep) }) 215 | return target 216 | } 217 | 218 | // `$.zepto.qsa` is Zepto's CSS selector implementation which 219 | // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`. 220 | // This method can be overriden in plugins. 221 | zepto.qsa = function(element, selector){ 222 | var found 223 | return (isDocument(element) && idSelectorRE.test(selector)) ? 224 | ( (found = element.getElementById(RegExp.$1)) ? [found] : [] ) : 225 | (element.nodeType !== 1 && element.nodeType !== 9) ? [] : 226 | slice.call( 227 | classSelectorRE.test(selector) ? element.getElementsByClassName(RegExp.$1) : 228 | tagSelectorRE.test(selector) ? element.getElementsByTagName(selector) : 229 | element.querySelectorAll(selector) 230 | ) 231 | } 232 | 233 | function filtered(nodes, selector) { 234 | return selector == null ? $(nodes) : $(nodes).filter(selector) 235 | } 236 | 237 | $.contains = function(parent, node) { 238 | return parent !== node && parent.contains(node) 239 | } 240 | 241 | function funcArg(context, arg, idx, payload) { 242 | return isFunction(arg) ? arg.call(context, idx, payload) : arg 243 | } 244 | 245 | function setAttribute(node, name, value) { 246 | value == null ? node.removeAttribute(name) : node.setAttribute(name, value) 247 | } 248 | 249 | // access className property while respecting SVGAnimatedString 250 | function className(node, value){ 251 | var klass = node.className, 252 | svg = klass && klass.baseVal !== undefined 253 | 254 | if (value === undefined) return svg ? klass.baseVal : klass 255 | svg ? (klass.baseVal = value) : (node.className = value) 256 | } 257 | 258 | // "true" => true 259 | // "false" => false 260 | // "null" => null 261 | // "42" => 42 262 | // "42.5" => 42.5 263 | // JSON => parse if valid 264 | // String => self 265 | function deserializeValue(value) { 266 | var num 267 | try { 268 | return value ? 269 | value == "true" || 270 | ( value == "false" ? false : 271 | value == "null" ? null : 272 | !isNaN(num = Number(value)) ? num : 273 | /^[\[\{]/.test(value) ? $.parseJSON(value) : 274 | value ) 275 | : value 276 | } catch(e) { 277 | return value 278 | } 279 | } 280 | 281 | $.type = type 282 | $.isFunction = isFunction 283 | $.isWindow = isWindow 284 | $.isArray = isArray 285 | $.isPlainObject = isPlainObject 286 | 287 | $.isEmptyObject = function(obj) { 288 | var name 289 | for (name in obj) return false 290 | return true 291 | } 292 | 293 | $.inArray = function(elem, array, i){ 294 | return emptyArray.indexOf.call(array, elem, i) 295 | } 296 | 297 | $.camelCase = camelize 298 | $.trim = function(str) { 299 | return str == null ? "" : String.prototype.trim.call(str) 300 | } 301 | 302 | // plugin compatibility 303 | $.uuid = 0 304 | $.support = { } 305 | $.expr = { } 306 | 307 | $.map = function(elements, callback){ 308 | var value, values = [], i, key 309 | if (likeArray(elements)) 310 | for (i = 0; i < elements.length; i++) { 311 | value = callback(elements[i], i) 312 | if (value != null) values.push(value) 313 | } 314 | else 315 | for (key in elements) { 316 | value = callback(elements[key], key) 317 | if (value != null) values.push(value) 318 | } 319 | return flatten(values) 320 | } 321 | 322 | $.each = function(elements, callback){ 323 | var i, key 324 | if (likeArray(elements)) { 325 | for (i = 0; i < elements.length; i++) 326 | if (callback.call(elements[i], i, elements[i]) === false) return elements 327 | } else { 328 | for (key in elements) 329 | if (callback.call(elements[key], key, elements[key]) === false) return elements 330 | } 331 | 332 | return elements 333 | } 334 | 335 | $.grep = function(elements, callback){ 336 | return filter.call(elements, callback) 337 | } 338 | 339 | if (window.JSON) $.parseJSON = JSON.parse 340 | 341 | // Populate the class2type map 342 | $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { 343 | class2type[ "[object " + name + "]" ] = name.toLowerCase() 344 | }) 345 | 346 | // Define methods that will be available on all 347 | // Zepto collections 348 | $.fn = { 349 | // Because a collection acts like an array 350 | // copy over these useful array functions. 351 | forEach: emptyArray.forEach, 352 | reduce: emptyArray.reduce, 353 | push: emptyArray.push, 354 | sort: emptyArray.sort, 355 | indexOf: emptyArray.indexOf, 356 | concat: emptyArray.concat, 357 | 358 | // `map` and `slice` in the jQuery API work differently 359 | // from their array counterparts 360 | map: function(fn){ 361 | return $($.map(this, function(el, i){ return fn.call(el, i, el) })) 362 | }, 363 | slice: function(){ 364 | return $(slice.apply(this, arguments)) 365 | }, 366 | 367 | ready: function(callback){ 368 | if (readyRE.test(document.readyState)) callback($) 369 | else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false) 370 | return this 371 | }, 372 | get: function(idx){ 373 | return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length] 374 | }, 375 | toArray: function(){ return this.get() }, 376 | size: function(){ 377 | return this.length 378 | }, 379 | remove: function(){ 380 | return this.each(function(){ 381 | if (this.parentNode != null) 382 | this.parentNode.removeChild(this) 383 | }) 384 | }, 385 | each: function(callback){ 386 | emptyArray.every.call(this, function(el, idx){ 387 | return callback.call(el, idx, el) !== false 388 | }) 389 | return this 390 | }, 391 | filter: function(selector){ 392 | if (isFunction(selector)) return this.not(this.not(selector)) 393 | return $(filter.call(this, function(element){ 394 | return zepto.matches(element, selector) 395 | })) 396 | }, 397 | add: function(selector,context){ 398 | return $(uniq(this.concat($(selector,context)))) 399 | }, 400 | is: function(selector){ 401 | return this.length > 0 && zepto.matches(this[0], selector) 402 | }, 403 | not: function(selector){ 404 | var nodes=[] 405 | if (isFunction(selector) && selector.call !== undefined) 406 | this.each(function(idx){ 407 | if (!selector.call(this,idx)) nodes.push(this) 408 | }) 409 | else { 410 | var excludes = typeof selector == 'string' ? this.filter(selector) : 411 | (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector) 412 | this.forEach(function(el){ 413 | if (excludes.indexOf(el) < 0) nodes.push(el) 414 | }) 415 | } 416 | return $(nodes) 417 | }, 418 | has: function(selector){ 419 | return this.filter(function(){ 420 | return isObject(selector) ? 421 | $.contains(this, selector) : 422 | $(this).find(selector).size() 423 | }) 424 | }, 425 | eq: function(idx){ 426 | return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1) 427 | }, 428 | first: function(){ 429 | var el = this[0] 430 | return el && !isObject(el) ? el : $(el) 431 | }, 432 | last: function(){ 433 | var el = this[this.length - 1] 434 | return el && !isObject(el) ? el : $(el) 435 | }, 436 | find: function(selector){ 437 | var result, $this = this 438 | if (typeof selector == 'object') 439 | result = $(selector).filter(function(){ 440 | var node = this 441 | return emptyArray.some.call($this, function(parent){ 442 | return $.contains(parent, node) 443 | }) 444 | }) 445 | else if (this.length == 1) result = $(zepto.qsa(this[0], selector)) 446 | else result = this.map(function(){ return zepto.qsa(this, selector) }) 447 | return result 448 | }, 449 | closest: function(selector, context){ 450 | var node = this[0], collection = false 451 | if (typeof selector == 'object') collection = $(selector) 452 | while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector))) 453 | node = node !== context && !isDocument(node) && node.parentNode 454 | return $(node) 455 | }, 456 | parents: function(selector){ 457 | var ancestors = [], nodes = this 458 | while (nodes.length > 0) 459 | nodes = $.map(nodes, function(node){ 460 | if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) { 461 | ancestors.push(node) 462 | return node 463 | } 464 | }) 465 | return filtered(ancestors, selector) 466 | }, 467 | parent: function(selector){ 468 | return filtered(uniq(this.pluck('parentNode')), selector) 469 | }, 470 | children: function(selector){ 471 | return filtered(this.map(function(){ return children(this) }), selector) 472 | }, 473 | contents: function() { 474 | return this.map(function() { return slice.call(this.childNodes) }) 475 | }, 476 | siblings: function(selector){ 477 | return filtered(this.map(function(i, el){ 478 | return filter.call(children(el.parentNode), function(child){ return child!==el }) 479 | }), selector) 480 | }, 481 | empty: function(){ 482 | return this.each(function(){ this.innerHTML = '' }) 483 | }, 484 | // `pluck` is borrowed from Prototype.js 485 | pluck: function(property){ 486 | return $.map(this, function(el){ return el[property] }) 487 | }, 488 | show: function(){ 489 | return this.each(function(){ 490 | this.style.display == "none" && (this.style.display = '') 491 | if (getComputedStyle(this, '').getPropertyValue("display") == "none") 492 | this.style.display = defaultDisplay(this.nodeName) 493 | }) 494 | }, 495 | replaceWith: function(newContent){ 496 | return this.before(newContent).remove() 497 | }, 498 | wrap: function(structure){ 499 | var func = isFunction(structure) 500 | if (this[0] && !func) 501 | var dom = $(structure).get(0), 502 | clone = dom.parentNode || this.length > 1 503 | 504 | return this.each(function(index){ 505 | $(this).wrapAll( 506 | func ? structure.call(this, index) : 507 | clone ? dom.cloneNode(true) : dom 508 | ) 509 | }) 510 | }, 511 | wrapAll: function(structure){ 512 | if (this[0]) { 513 | $(this[0]).before(structure = $(structure)) 514 | var children 515 | // drill down to the inmost element 516 | while ((children = structure.children()).length) structure = children.first() 517 | $(structure).append(this) 518 | } 519 | return this 520 | }, 521 | wrapInner: function(structure){ 522 | var func = isFunction(structure) 523 | return this.each(function(index){ 524 | var self = $(this), contents = self.contents(), 525 | dom = func ? structure.call(this, index) : structure 526 | contents.length ? contents.wrapAll(dom) : self.append(dom) 527 | }) 528 | }, 529 | unwrap: function(){ 530 | this.parent().each(function(){ 531 | $(this).replaceWith($(this).children()) 532 | }) 533 | return this 534 | }, 535 | clone: function(){ 536 | return this.map(function(){ return this.cloneNode(true) }) 537 | }, 538 | hide: function(){ 539 | return this.css("display", "none") 540 | }, 541 | toggle: function(setting){ 542 | return this.each(function(){ 543 | var el = $(this) 544 | ;(setting === undefined ? el.css("display") == "none" : setting) ? el.show() : el.hide() 545 | }) 546 | }, 547 | prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') }, 548 | next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') }, 549 | html: function(html){ 550 | return arguments.length === 0 ? 551 | (this.length > 0 ? this[0].innerHTML : null) : 552 | this.each(function(idx){ 553 | var originHtml = this.innerHTML 554 | $(this).empty().append( funcArg(this, html, idx, originHtml) ) 555 | }) 556 | }, 557 | text: function(text){ 558 | return arguments.length === 0 ? 559 | (this.length > 0 ? this[0].textContent : null) : 560 | this.each(function(){ this.textContent = (text === undefined) ? '' : ''+text }) 561 | }, 562 | attr: function(name, value){ 563 | var result 564 | return (typeof name == 'string' && value === undefined) ? 565 | (this.length == 0 || this[0].nodeType !== 1 ? undefined : 566 | (name == 'value' && this[0].nodeName == 'INPUT') ? this.val() : 567 | (!(result = this[0].getAttribute(name)) && name in this[0]) ? this[0][name] : result 568 | ) : 569 | this.each(function(idx){ 570 | if (this.nodeType !== 1) return 571 | if (isObject(name)) for (key in name) setAttribute(this, key, name[key]) 572 | else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name))) 573 | }) 574 | }, 575 | removeAttr: function(name){ 576 | return this.each(function(){ this.nodeType === 1 && setAttribute(this, name) }) 577 | }, 578 | prop: function(name, value){ 579 | return (value === undefined) ? 580 | (this[0] && this[0][name]) : 581 | this.each(function(idx){ 582 | this[name] = funcArg(this, value, idx, this[name]) 583 | }) 584 | }, 585 | data: function(name, value){ 586 | var data = this.attr('data-' + dasherize(name), value) 587 | return data !== null ? deserializeValue(data) : undefined 588 | }, 589 | val: function(value){ 590 | return arguments.length === 0 ? 591 | (this[0] && (this[0].multiple ? 592 | $(this[0]).find('option').filter(function(o){ return this.selected }).pluck('value') : 593 | this[0].value) 594 | ) : 595 | this.each(function(idx){ 596 | this.value = funcArg(this, value, idx, this.value) 597 | }) 598 | }, 599 | offset: function(coordinates){ 600 | if (coordinates) return this.each(function(index){ 601 | var $this = $(this), 602 | coords = funcArg(this, coordinates, index, $this.offset()), 603 | parentOffset = $this.offsetParent().offset(), 604 | props = { 605 | top: coords.top - parentOffset.top, 606 | left: coords.left - parentOffset.left 607 | } 608 | 609 | if ($this.css('position') == 'static') props['position'] = 'relative' 610 | $this.css(props) 611 | }) 612 | if (this.length==0) return null 613 | var obj = this[0].getBoundingClientRect() 614 | return { 615 | left: obj.left + window.pageXOffset, 616 | top: obj.top + window.pageYOffset, 617 | width: Math.round(obj.width), 618 | height: Math.round(obj.height) 619 | } 620 | }, 621 | css: function(property, value){ 622 | if (arguments.length < 2) { 623 | var element = this[0], computedStyle = getComputedStyle(element, '') 624 | if(!element) return 625 | if (typeof property == 'string') 626 | return element.style[camelize(property)] || computedStyle.getPropertyValue(property) 627 | else if (isArray(property)) { 628 | var props = {} 629 | $.each(isArray(property) ? property: [property], function(_, prop){ 630 | props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop)) 631 | }) 632 | return props 633 | } 634 | } 635 | 636 | var css = '' 637 | if (type(property) == 'string') { 638 | if (!value && value !== 0) 639 | this.each(function(){ this.style.removeProperty(dasherize(property)) }) 640 | else 641 | css = dasherize(property) + ":" + maybeAddPx(property, value) 642 | } else { 643 | for (key in property) 644 | if (!property[key] && property[key] !== 0) 645 | this.each(function(){ this.style.removeProperty(dasherize(key)) }) 646 | else 647 | css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';' 648 | } 649 | 650 | return this.each(function(){ this.style.cssText += ';' + css }) 651 | }, 652 | index: function(element){ 653 | return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0]) 654 | }, 655 | hasClass: function(name){ 656 | return emptyArray.some.call(this, function(el){ 657 | return this.test(className(el)) 658 | }, classRE(name)) 659 | }, 660 | addClass: function(name){ 661 | return this.each(function(idx){ 662 | classList = [] 663 | var cls = className(this), newName = funcArg(this, name, idx, cls) 664 | newName.split(/\s+/g).forEach(function(klass){ 665 | if (!$(this).hasClass(klass)) classList.push(klass) 666 | }, this) 667 | classList.length && className(this, cls + (cls ? " " : "") + classList.join(" ")) 668 | }) 669 | }, 670 | removeClass: function(name){ 671 | return this.each(function(idx){ 672 | if (name === undefined) return className(this, '') 673 | classList = className(this) 674 | funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass){ 675 | classList = classList.replace(classRE(klass), " ") 676 | }) 677 | className(this, classList.trim()) 678 | }) 679 | }, 680 | toggleClass: function(name, when){ 681 | return this.each(function(idx){ 682 | var $this = $(this), names = funcArg(this, name, idx, className(this)) 683 | names.split(/\s+/g).forEach(function(klass){ 684 | (when === undefined ? !$this.hasClass(klass) : when) ? 685 | $this.addClass(klass) : $this.removeClass(klass) 686 | }) 687 | }) 688 | }, 689 | scrollTop: function(value){ 690 | if (!this.length) return 691 | var hasScrollTop = 'scrollTop' in this[0] 692 | if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset 693 | return this.each(hasScrollTop ? 694 | function(){ this.scrollTop = value } : 695 | function(){ this.scrollTo(this.scrollX, value) }) 696 | }, 697 | position: function() { 698 | if (!this.length) return 699 | 700 | var elem = this[0], 701 | // Get *real* offsetParent 702 | offsetParent = this.offsetParent(), 703 | // Get correct offsets 704 | offset = this.offset(), 705 | parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset() 706 | 707 | // Subtract element margins 708 | // note: when an element has margin: auto the offsetLeft and marginLeft 709 | // are the same in Safari causing offset.left to incorrectly be 0 710 | offset.top -= parseFloat( $(elem).css('margin-top') ) || 0 711 | offset.left -= parseFloat( $(elem).css('margin-left') ) || 0 712 | 713 | // Add offsetParent borders 714 | parentOffset.top += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0 715 | parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0 716 | 717 | // Subtract the two offsets 718 | return { 719 | top: offset.top - parentOffset.top, 720 | left: offset.left - parentOffset.left 721 | } 722 | }, 723 | offsetParent: function() { 724 | return this.map(function(){ 725 | var parent = this.offsetParent || document.body 726 | while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css("position") == "static") 727 | parent = parent.offsetParent 728 | return parent 729 | }) 730 | } 731 | } 732 | 733 | // for now 734 | $.fn.detach = $.fn.remove 735 | 736 | // Generate the `width` and `height` functions 737 | ;['width', 'height'].forEach(function(dimension){ 738 | var dimensionProperty = 739 | dimension.replace(/./, function(m){ return m[0].toUpperCase() }) 740 | 741 | $.fn[dimension] = function(value){ 742 | var offset, el = this[0] 743 | if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] : 744 | isDocument(el) ? el.documentElement['scroll' + dimensionProperty] : 745 | (offset = this.offset()) && offset[dimension] 746 | else return this.each(function(idx){ 747 | el = $(this) 748 | el.css(dimension, funcArg(this, value, idx, el[dimension]())) 749 | }) 750 | } 751 | }) 752 | 753 | function traverseNode(node, fun) { 754 | fun(node) 755 | for (var key in node.childNodes) traverseNode(node.childNodes[key], fun) 756 | } 757 | 758 | // Generate the `after`, `prepend`, `before`, `append`, 759 | // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods. 760 | adjacencyOperators.forEach(function(operator, operatorIndex) { 761 | var inside = operatorIndex % 2 //=> prepend, append 762 | 763 | $.fn[operator] = function(){ 764 | // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings 765 | var argType, nodes = $.map(arguments, function(arg) { 766 | argType = type(arg) 767 | return argType == "object" || argType == "array" || arg == null ? 768 | arg : zepto.fragment(arg) 769 | }), 770 | parent, copyByClone = this.length > 1 771 | if (nodes.length < 1) return this 772 | 773 | return this.each(function(_, target){ 774 | parent = inside ? target : target.parentNode 775 | 776 | // convert all methods to a "before" operation 777 | target = operatorIndex == 0 ? target.nextSibling : 778 | operatorIndex == 1 ? target.firstChild : 779 | operatorIndex == 2 ? target : 780 | null 781 | 782 | nodes.forEach(function(node){ 783 | if (copyByClone) node = node.cloneNode(true) 784 | else if (!parent) return $(node).remove() 785 | 786 | traverseNode(parent.insertBefore(node, target), function(el){ 787 | if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' && 788 | (!el.type || el.type === 'text/javascript') && !el.src) 789 | window['eval'].call(window, el.innerHTML) 790 | }) 791 | }) 792 | }) 793 | } 794 | 795 | // after => insertAfter 796 | // prepend => prependTo 797 | // before => insertBefore 798 | // append => appendTo 799 | $.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){ 800 | $(html)[operator](this) 801 | return this 802 | } 803 | }) 804 | 805 | zepto.Z.prototype = $.fn 806 | 807 | // Export internal API functions in the `$.zepto` namespace 808 | zepto.uniq = uniq 809 | zepto.deserializeValue = deserializeValue 810 | $.zepto = zepto 811 | 812 | return $ 813 | })() 814 | 815 | window.Zepto = Zepto 816 | window.$ === undefined && (window.$ = Zepto) 817 | 818 | ;(function($){ 819 | var $$ = $.zepto.qsa, handlers = {}, _zid = 1, specialEvents={}, 820 | hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' } 821 | 822 | specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents' 823 | 824 | function zid(element) { 825 | return element._zid || (element._zid = _zid++) 826 | } 827 | function findHandlers(element, event, fn, selector) { 828 | event = parse(event) 829 | if (event.ns) var matcher = matcherFor(event.ns) 830 | return (handlers[zid(element)] || []).filter(function(handler) { 831 | return handler 832 | && (!event.e || handler.e == event.e) 833 | && (!event.ns || matcher.test(handler.ns)) 834 | && (!fn || zid(handler.fn) === zid(fn)) 835 | && (!selector || handler.sel == selector) 836 | }) 837 | } 838 | function parse(event) { 839 | var parts = ('' + event).split('.') 840 | return {e: parts[0], ns: parts.slice(1).sort().join(' ')} 841 | } 842 | function matcherFor(ns) { 843 | return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)') 844 | } 845 | 846 | function eachEvent(events, fn, iterator){ 847 | if ($.type(events) != "string") $.each(events, iterator) 848 | else events.split(/\s/).forEach(function(type){ iterator(type, fn) }) 849 | } 850 | 851 | function eventCapture(handler, captureSetting) { 852 | return handler.del && 853 | (handler.e == 'focus' || handler.e == 'blur') || 854 | !!captureSetting 855 | } 856 | 857 | function realEvent(type) { 858 | return hover[type] || type 859 | } 860 | 861 | function add(element, events, fn, selector, getDelegate, capture){ 862 | var id = zid(element), set = (handlers[id] || (handlers[id] = [])) 863 | eachEvent(events, fn, function(event, fn){ 864 | var handler = parse(event) 865 | handler.fn = fn 866 | handler.sel = selector 867 | // emulate mouseenter, mouseleave 868 | if (handler.e in hover) fn = function(e){ 869 | var related = e.relatedTarget 870 | if (!related || (related !== this && !$.contains(this, related))) 871 | return handler.fn.apply(this, arguments) 872 | } 873 | handler.del = getDelegate && getDelegate(fn, event) 874 | var callback = handler.del || fn 875 | handler.proxy = function(e){ 876 | var result = callback.apply(element, [e].concat(e.data)) 877 | if (result === false) e.preventDefault(), e.stopPropagation() 878 | return result 879 | } 880 | handler.i = set.length 881 | set.push(handler) 882 | if ('addEventListener' in element) 883 | element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture)) 884 | }) 885 | } 886 | function remove(element, events, fn, selector, capture){ 887 | var id = zid(element) 888 | eachEvent(events || '', fn, function(event, fn){ 889 | findHandlers(element, event, fn, selector).forEach(function(handler){ 890 | delete handlers[id][handler.i] 891 | if ('removeEventListener' in element) 892 | element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture)) 893 | }) 894 | }) 895 | } 896 | 897 | $.event = { add: add, remove: remove } 898 | 899 | $.proxy = function(fn, context) { 900 | if ($.isFunction(fn)) { 901 | var proxyFn = function(){ return fn.apply(context, arguments) } 902 | proxyFn._zid = zid(fn) 903 | return proxyFn 904 | } else if (typeof context == 'string') { 905 | return $.proxy(fn[context], fn) 906 | } else { 907 | throw new TypeError("expected function") 908 | } 909 | } 910 | 911 | $.fn.bind = function(event, callback){ 912 | return this.each(function(){ 913 | add(this, event, callback) 914 | }) 915 | } 916 | $.fn.unbind = function(event, callback){ 917 | return this.each(function(){ 918 | remove(this, event, callback) 919 | }) 920 | } 921 | $.fn.one = function(event, callback){ 922 | return this.each(function(i, element){ 923 | add(this, event, callback, null, function(fn, type){ 924 | return function(){ 925 | var result = fn.apply(element, arguments) 926 | remove(element, type, fn) 927 | return result 928 | } 929 | }) 930 | }) 931 | } 932 | 933 | var returnTrue = function(){return true}, 934 | returnFalse = function(){return false}, 935 | ignoreProperties = /^([A-Z]|layer[XY]$)/, 936 | eventMethods = { 937 | preventDefault: 'isDefaultPrevented', 938 | stopImmediatePropagation: 'isImmediatePropagationStopped', 939 | stopPropagation: 'isPropagationStopped' 940 | } 941 | function createProxy(event) { 942 | var key, proxy = { originalEvent: event } 943 | for (key in event) 944 | if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key] 945 | 946 | $.each(eventMethods, function(name, predicate) { 947 | proxy[name] = function(){ 948 | this[predicate] = returnTrue 949 | return event[name].apply(event, arguments) 950 | } 951 | proxy[predicate] = returnFalse 952 | }) 953 | return proxy 954 | } 955 | 956 | // emulates the 'defaultPrevented' property for browsers that have none 957 | function fix(event) { 958 | if (!('defaultPrevented' in event)) { 959 | event.defaultPrevented = false 960 | var prevent = event.preventDefault 961 | event.preventDefault = function(){ 962 | event.defaultPrevented = true 963 | prevent.call(event) 964 | } 965 | } 966 | } 967 | 968 | $.fn.delegate = function(selector, event, callback){ 969 | return this.each(function(i, element){ 970 | add(element, event, callback, selector, function(fn){ 971 | return function(e){ 972 | var evt, match = $(e.target).closest(selector, element).get(0) 973 | if (match) { 974 | evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element}) 975 | return fn.apply(match, [evt].concat([].slice.call(arguments, 1))) 976 | } 977 | } 978 | }) 979 | }) 980 | } 981 | $.fn.undelegate = function(selector, event, callback){ 982 | return this.each(function(){ 983 | remove(this, event, callback, selector) 984 | }) 985 | } 986 | 987 | $.fn.live = function(event, callback){ 988 | $(document.body).delegate(this.selector, event, callback) 989 | return this 990 | } 991 | $.fn.die = function(event, callback){ 992 | $(document.body).undelegate(this.selector, event, callback) 993 | return this 994 | } 995 | 996 | $.fn.on = function(event, selector, callback){ 997 | return !selector || $.isFunction(selector) ? 998 | this.bind(event, selector || callback) : this.delegate(selector, event, callback) 999 | } 1000 | $.fn.off = function(event, selector, callback){ 1001 | return !selector || $.isFunction(selector) ? 1002 | this.unbind(event, selector || callback) : this.undelegate(selector, event, callback) 1003 | } 1004 | 1005 | $.fn.trigger = function(event, data){ 1006 | if (typeof event == 'string' || $.isPlainObject(event)) event = $.Event(event) 1007 | fix(event) 1008 | event.data = data 1009 | return this.each(function(){ 1010 | // items in the collection might not be DOM elements 1011 | if('dispatchEvent' in this) this.dispatchEvent(event) 1012 | else $(this).triggerHandler(event, data) 1013 | }) 1014 | } 1015 | 1016 | // triggers event handlers on current element just as if an event occurred, 1017 | // doesn't trigger an actual event, doesn't bubble 1018 | $.fn.triggerHandler = function(event, data){ 1019 | var e, result 1020 | this.each(function(i, element){ 1021 | e = createProxy(typeof event == 'string' ? $.Event(event) : event) 1022 | e.data = data 1023 | e.target = element 1024 | $.each(findHandlers(element, event.type || event), function(i, handler){ 1025 | result = handler.proxy(e) 1026 | if (e.isImmediatePropagationStopped()) return false 1027 | }) 1028 | }) 1029 | return result 1030 | } 1031 | 1032 | // shortcut methods for `.bind(event, fn)` for each event type 1033 | ;('focusin focusout load resize scroll unload click dblclick '+ 1034 | 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+ 1035 | 'change select keydown keypress keyup error').split(' ').forEach(function(event) { 1036 | $.fn[event] = function(callback) { 1037 | return callback ? 1038 | this.bind(event, callback) : 1039 | this.trigger(event) 1040 | } 1041 | }) 1042 | 1043 | ;['focus', 'blur'].forEach(function(name) { 1044 | $.fn[name] = function(callback) { 1045 | if (callback) this.bind(name, callback) 1046 | else this.each(function(){ 1047 | try { this[name]() } 1048 | catch(e) {} 1049 | }) 1050 | return this 1051 | } 1052 | }) 1053 | 1054 | $.Event = function(type, props) { 1055 | if (typeof type != 'string') props = type, type = props.type 1056 | var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true 1057 | if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name]) 1058 | event.initEvent(type, bubbles, true) 1059 | event.isDefaultPrevented = function(){ return event.defaultPrevented } 1060 | return event 1061 | } 1062 | 1063 | })(Zepto) 1064 | 1065 | ;(function($){ 1066 | function detect(ua){ 1067 | var os = this.os = {}, browser = this.browser = {}, 1068 | webkit = ua.match(/WebKit\/([\d.]+)/), 1069 | android = ua.match(/(Android);?\s+([\d.]+)?/), 1070 | ipad = ua.match(/(iPad).*OS\s([\d_]+)/), 1071 | ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/), 1072 | iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/), 1073 | webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/), 1074 | touchpad = webos && ua.match(/TouchPad/), 1075 | kindle = ua.match(/Kindle\/([\d.]+)/), 1076 | silk = ua.match(/Silk\/([\d._]+)/), 1077 | blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/), 1078 | bb10 = ua.match(/(BB10).*Version\/([\d.]+)/), 1079 | rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/), 1080 | playbook = ua.match(/PlayBook/), 1081 | chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/), 1082 | firefox = ua.match(/Firefox\/([\d.]+)/), 1083 | ie = ua.match(/MSIE ([\d.]+)/), 1084 | safari = webkit && ua.match(/Mobile\//) && !chrome, 1085 | webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome, 1086 | ie = ua.match(/MSIE\s([\d.]+)/) 1087 | 1088 | // Todo: clean this up with a better OS/browser seperation: 1089 | // - discern (more) between multiple browsers on android 1090 | // - decide if kindle fire in silk mode is android or not 1091 | // - Firefox on Android doesn't specify the Android version 1092 | // - possibly devide in os, device and browser hashes 1093 | 1094 | if (browser.webkit = !!webkit) browser.version = webkit[1] 1095 | 1096 | if (android) os.android = true, os.version = android[2] 1097 | if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.') 1098 | if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.') 1099 | if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null 1100 | if (webos) os.webos = true, os.version = webos[2] 1101 | if (touchpad) os.touchpad = true 1102 | if (blackberry) os.blackberry = true, os.version = blackberry[2] 1103 | if (bb10) os.bb10 = true, os.version = bb10[2] 1104 | if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2] 1105 | if (playbook) browser.playbook = true 1106 | if (kindle) os.kindle = true, os.version = kindle[1] 1107 | if (silk) browser.silk = true, browser.version = silk[1] 1108 | if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true 1109 | if (chrome) browser.chrome = true, browser.version = chrome[1] 1110 | if (firefox) browser.firefox = true, browser.version = firefox[1] 1111 | if (ie) browser.ie = true, browser.version = ie[1] 1112 | if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true 1113 | if (webview) browser.webview = true 1114 | if (ie) browser.ie = true, browser.version = ie[1] 1115 | 1116 | os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) || 1117 | (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/))) 1118 | os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos || blackberry || bb10 || 1119 | (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) || 1120 | (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/)))) 1121 | } 1122 | 1123 | detect.call($, navigator.userAgent) 1124 | // make available to unit tests 1125 | $.__detect = detect 1126 | 1127 | })(Zepto) 1128 | 1129 | ;(function($, undefined){ 1130 | var prefix = '', eventPrefix, endEventName, endAnimationName, 1131 | vendors = { Webkit: 'webkit', Moz: '', O: 'o', ms: 'MS' }, 1132 | document = window.document, testEl = document.createElement('div'), 1133 | supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i, 1134 | transform, 1135 | transitionProperty, transitionDuration, transitionTiming, transitionDelay, 1136 | animationName, animationDuration, animationTiming, animationDelay, 1137 | cssReset = {} 1138 | 1139 | function dasherize(str) { return str.replace(/([a-z])([A-Z])/, '$1-$2').toLowerCase() } 1140 | function normalizeEvent(name) { return eventPrefix ? eventPrefix + name : name.toLowerCase() } 1141 | 1142 | $.each(vendors, function(vendor, event){ 1143 | if (testEl.style[vendor + 'TransitionProperty'] !== undefined) { 1144 | prefix = '-' + vendor.toLowerCase() + '-' 1145 | eventPrefix = event 1146 | return false 1147 | } 1148 | }) 1149 | 1150 | transform = prefix + 'transform' 1151 | cssReset[transitionProperty = prefix + 'transition-property'] = 1152 | cssReset[transitionDuration = prefix + 'transition-duration'] = 1153 | cssReset[transitionDelay = prefix + 'transition-delay'] = 1154 | cssReset[transitionTiming = prefix + 'transition-timing-function'] = 1155 | cssReset[animationName = prefix + 'animation-name'] = 1156 | cssReset[animationDuration = prefix + 'animation-duration'] = 1157 | cssReset[animationDelay = prefix + 'animation-delay'] = 1158 | cssReset[animationTiming = prefix + 'animation-timing-function'] = '' 1159 | 1160 | $.fx = { 1161 | off: (eventPrefix === undefined && testEl.style.transitionProperty === undefined), 1162 | speeds: { _default: 400, fast: 200, slow: 600 }, 1163 | cssPrefix: prefix, 1164 | transitionEnd: normalizeEvent('TransitionEnd'), 1165 | animationEnd: normalizeEvent('AnimationEnd') 1166 | } 1167 | 1168 | $.fn.animate = function(properties, duration, ease, callback, delay){ 1169 | if ($.isPlainObject(duration)) 1170 | ease = duration.easing, callback = duration.complete, delay = duration.delay, duration = duration.duration 1171 | if (duration) duration = (typeof duration == 'number' ? duration : 1172 | ($.fx.speeds[duration] || $.fx.speeds._default)) / 1000 1173 | if (delay) delay = parseFloat(delay) / 1000 1174 | return this.anim(properties, duration, ease, callback, delay) 1175 | } 1176 | 1177 | $.fn.anim = function(properties, duration, ease, callback, delay){ 1178 | var key, cssValues = {}, cssProperties, transforms = '', 1179 | that = this, wrappedCallback, endEvent = $.fx.transitionEnd 1180 | 1181 | if (duration === undefined) duration = 0.4 1182 | if (delay === undefined) delay = 0 1183 | if ($.fx.off) duration = 0 1184 | 1185 | if (typeof properties == 'string') { 1186 | // keyframe animation 1187 | cssValues[animationName] = properties 1188 | cssValues[animationDuration] = duration + 's' 1189 | cssValues[animationDelay] = delay + 's' 1190 | cssValues[animationTiming] = (ease || 'linear') 1191 | endEvent = $.fx.animationEnd 1192 | } else { 1193 | cssProperties = [] 1194 | // CSS transitions 1195 | for (key in properties) 1196 | if (supportedTransforms.test(key)) transforms += key + '(' + properties[key] + ') ' 1197 | else cssValues[key] = properties[key], cssProperties.push(dasherize(key)) 1198 | 1199 | if (transforms) cssValues[transform] = transforms, cssProperties.push(transform) 1200 | if (duration > 0 && typeof properties === 'object') { 1201 | cssValues[transitionProperty] = cssProperties.join(', ') 1202 | cssValues[transitionDuration] = duration + 's' 1203 | cssValues[transitionDelay] = delay + 's' 1204 | cssValues[transitionTiming] = (ease || 'linear') 1205 | } 1206 | } 1207 | 1208 | wrappedCallback = function(event){ 1209 | if (typeof event !== 'undefined') { 1210 | if (event.target !== event.currentTarget) return // makes sure the event didn't bubble from "below" 1211 | $(event.target).unbind(endEvent, wrappedCallback) 1212 | } 1213 | $(this).css(cssReset) 1214 | callback && callback.call(this) 1215 | } 1216 | if (duration > 0) this.bind(endEvent, wrappedCallback) 1217 | 1218 | // trigger page reflow so new elements can animate 1219 | this.size() && this.get(0).clientLeft 1220 | 1221 | this.css(cssValues) 1222 | 1223 | if (duration <= 0) setTimeout(function() { 1224 | that.each(function(){ wrappedCallback.call(this) }) 1225 | }, 0) 1226 | 1227 | return this 1228 | } 1229 | 1230 | testEl = null 1231 | })(Zepto) 1232 | 1233 | ;(function($){ 1234 | var jsonpID = 0, 1235 | document = window.document, 1236 | key, 1237 | name, 1238 | rscript = /)<[^<]*)*<\/script>/gi, 1239 | scriptTypeRE = /^(?:text|application)\/javascript/i, 1240 | xmlTypeRE = /^(?:text|application)\/xml/i, 1241 | jsonType = 'application/json', 1242 | htmlType = 'text/html', 1243 | blankRE = /^\s*$/ 1244 | 1245 | // trigger a custom event and return false if it was cancelled 1246 | function triggerAndReturn(context, eventName, data) { 1247 | var event = $.Event(eventName) 1248 | $(context).trigger(event, data) 1249 | return !event.defaultPrevented 1250 | } 1251 | 1252 | // trigger an Ajax "global" event 1253 | function triggerGlobal(settings, context, eventName, data) { 1254 | if (settings.global) return triggerAndReturn(context || document, eventName, data) 1255 | } 1256 | 1257 | // Number of active Ajax requests 1258 | $.active = 0 1259 | 1260 | function ajaxStart(settings) { 1261 | if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart') 1262 | } 1263 | function ajaxStop(settings) { 1264 | if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop') 1265 | } 1266 | 1267 | // triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable 1268 | function ajaxBeforeSend(xhr, settings) { 1269 | var context = settings.context 1270 | if (settings.beforeSend.call(context, xhr, settings) === false || 1271 | triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false) 1272 | return false 1273 | 1274 | triggerGlobal(settings, context, 'ajaxSend', [xhr, settings]) 1275 | } 1276 | function ajaxSuccess(data, xhr, settings) { 1277 | var context = settings.context, status = 'success' 1278 | settings.success.call(context, data, status, xhr) 1279 | triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data]) 1280 | ajaxComplete(status, xhr, settings) 1281 | } 1282 | // type: "timeout", "error", "abort", "parsererror" 1283 | function ajaxError(error, type, xhr, settings) { 1284 | var context = settings.context 1285 | settings.error.call(context, xhr, type, error) 1286 | triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type]) 1287 | ajaxComplete(type, xhr, settings) 1288 | } 1289 | // status: "success", "notmodified", "error", "timeout", "abort", "parsererror" 1290 | function ajaxComplete(status, xhr, settings) { 1291 | var context = settings.context 1292 | settings.complete.call(context, xhr, status) 1293 | triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings]) 1294 | ajaxStop(settings) 1295 | } 1296 | 1297 | // Empty function, used as default callback 1298 | function empty() {} 1299 | 1300 | $.ajaxJSONP = function(options){ 1301 | if (!('type' in options)) return $.ajax(options) 1302 | 1303 | var _callbackName = options.jsonpCallback, 1304 | callbackName = ($.isFunction(_callbackName) ? 1305 | _callbackName() : _callbackName) || ('jsonp' + (++jsonpID)), 1306 | script = document.createElement('script'), 1307 | cleanup = function() { 1308 | clearTimeout(abortTimeout) 1309 | $(script).remove() 1310 | delete window[callbackName] 1311 | }, 1312 | abort = function(type){ 1313 | cleanup() 1314 | // In case of manual abort or timeout, keep an empty function as callback 1315 | // so that the SCRIPT tag that eventually loads won't result in an error. 1316 | if (!type || type == 'timeout') window[callbackName] = empty 1317 | ajaxError(null, type || 'abort', xhr, options) 1318 | }, 1319 | xhr = { abort: abort }, abortTimeout 1320 | 1321 | if (ajaxBeforeSend(xhr, options) === false) { 1322 | abort('abort') 1323 | return false 1324 | } 1325 | 1326 | window[callbackName] = function(data){ 1327 | cleanup() 1328 | ajaxSuccess(data, xhr, options) 1329 | } 1330 | 1331 | script.onerror = function() { abort('error') } 1332 | 1333 | script.src = options.url.replace(/=\?/, '=' + callbackName) 1334 | $('head').append(script) 1335 | 1336 | if (options.timeout > 0) abortTimeout = setTimeout(function(){ 1337 | abort('timeout') 1338 | }, options.timeout) 1339 | 1340 | return xhr 1341 | } 1342 | 1343 | $.ajaxSettings = { 1344 | // Default type of request 1345 | type: 'GET', 1346 | // Callback that is executed before request 1347 | beforeSend: empty, 1348 | // Callback that is executed if the request succeeds 1349 | success: empty, 1350 | // Callback that is executed the the server drops error 1351 | error: empty, 1352 | // Callback that is executed on request complete (both: error and success) 1353 | complete: empty, 1354 | // The context for the callbacks 1355 | context: null, 1356 | // Whether to trigger "global" Ajax events 1357 | global: true, 1358 | // Transport 1359 | xhr: function () { 1360 | return new window.XMLHttpRequest() 1361 | }, 1362 | // MIME types mapping 1363 | accepts: { 1364 | script: 'text/javascript, application/javascript', 1365 | json: jsonType, 1366 | xml: 'application/xml, text/xml', 1367 | html: htmlType, 1368 | text: 'text/plain' 1369 | }, 1370 | // Whether the request is to another domain 1371 | crossDomain: false, 1372 | // Default timeout 1373 | timeout: 0, 1374 | // Whether data should be serialized to string 1375 | processData: true, 1376 | // Whether the browser should be allowed to cache GET responses 1377 | cache: true 1378 | } 1379 | 1380 | function mimeToDataType(mime) { 1381 | if (mime) mime = mime.split(';', 2)[0] 1382 | return mime && ( mime == htmlType ? 'html' : 1383 | mime == jsonType ? 'json' : 1384 | scriptTypeRE.test(mime) ? 'script' : 1385 | xmlTypeRE.test(mime) && 'xml' ) || 'text' 1386 | } 1387 | 1388 | function appendQuery(url, query) { 1389 | if (query == '') return url 1390 | return (url + '&' + query).replace(/[&?]{1,2}/, '?') 1391 | } 1392 | 1393 | // serialize payload and append it to the URL for GET requests 1394 | function serializeData(options) { 1395 | if (options.processData && options.data && $.type(options.data) != "string") 1396 | options.data = $.param(options.data, options.traditional) 1397 | if (options.data && (!options.type || options.type.toUpperCase() == 'GET')) 1398 | options.url = appendQuery(options.url, options.data) 1399 | } 1400 | 1401 | $.ajax = function(options){ 1402 | var settings = $.extend({}, options || {}) 1403 | for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key] 1404 | 1405 | ajaxStart(settings) 1406 | 1407 | if (!settings.crossDomain) settings.crossDomain = /^([\w-]+:)?\/\/([^\/]+)/.test(settings.url) && 1408 | RegExp.$2 != window.location.host 1409 | 1410 | if (!settings.url) settings.url = window.location.toString() 1411 | serializeData(settings) 1412 | if (settings.cache === false) settings.url = appendQuery(settings.url, '_=' + Date.now()) 1413 | 1414 | var dataType = settings.dataType, hasPlaceholder = /=\?/.test(settings.url) 1415 | if (dataType == 'jsonp' || hasPlaceholder) { 1416 | if (!hasPlaceholder) 1417 | settings.url = appendQuery(settings.url, 1418 | settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?') 1419 | return $.ajaxJSONP(settings) 1420 | } 1421 | 1422 | var mime = settings.accepts[dataType], 1423 | baseHeaders = { }, 1424 | protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol, 1425 | xhr = settings.xhr(), abortTimeout 1426 | 1427 | if (!settings.crossDomain) baseHeaders['X-Requested-With'] = 'XMLHttpRequest' 1428 | if (mime) { 1429 | baseHeaders['Accept'] = mime 1430 | if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0] 1431 | xhr.overrideMimeType && xhr.overrideMimeType(mime) 1432 | } 1433 | if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET')) 1434 | baseHeaders['Content-Type'] = (settings.contentType || 'application/x-www-form-urlencoded') 1435 | settings.headers = $.extend(baseHeaders, settings.headers || {}) 1436 | 1437 | xhr.onreadystatechange = function(){ 1438 | if (xhr.readyState == 4) { 1439 | xhr.onreadystatechange = empty; 1440 | clearTimeout(abortTimeout) 1441 | var result, error = false 1442 | if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) { 1443 | dataType = dataType || mimeToDataType(xhr.getResponseHeader('content-type')) 1444 | result = xhr.responseText 1445 | 1446 | try { 1447 | // http://perfectionkills.com/global-eval-what-are-the-options/ 1448 | if (dataType == 'script') (1,eval)(result) 1449 | else if (dataType == 'xml') result = xhr.responseXML 1450 | else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result) 1451 | } catch (e) { error = e } 1452 | 1453 | if (error) ajaxError(error, 'parsererror', xhr, settings) 1454 | else ajaxSuccess(result, xhr, settings) 1455 | } else { 1456 | ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings) 1457 | } 1458 | } 1459 | } 1460 | 1461 | var async = 'async' in settings ? settings.async : true 1462 | xhr.open(settings.type, settings.url, async) 1463 | 1464 | for (name in settings.headers) xhr.setRequestHeader(name, settings.headers[name]) 1465 | 1466 | if (ajaxBeforeSend(xhr, settings) === false) { 1467 | xhr.abort() 1468 | return false 1469 | } 1470 | 1471 | if (settings.timeout > 0) abortTimeout = setTimeout(function(){ 1472 | xhr.onreadystatechange = empty 1473 | xhr.abort() 1474 | ajaxError(null, 'timeout', xhr, settings) 1475 | }, settings.timeout) 1476 | 1477 | // avoid sending empty string (#319) 1478 | xhr.send(settings.data ? settings.data : null) 1479 | return xhr 1480 | } 1481 | 1482 | // handle optional data/success arguments 1483 | function parseArguments(url, data, success, dataType) { 1484 | var hasData = !$.isFunction(data) 1485 | return { 1486 | url: url, 1487 | data: hasData ? data : undefined, 1488 | success: !hasData ? data : $.isFunction(success) ? success : undefined, 1489 | dataType: hasData ? dataType || success : success 1490 | } 1491 | } 1492 | 1493 | $.get = function(url, data, success, dataType){ 1494 | return $.ajax(parseArguments.apply(null, arguments)) 1495 | } 1496 | 1497 | $.post = function(url, data, success, dataType){ 1498 | var options = parseArguments.apply(null, arguments) 1499 | options.type = 'POST' 1500 | return $.ajax(options) 1501 | } 1502 | 1503 | $.getJSON = function(url, data, success){ 1504 | var options = parseArguments.apply(null, arguments) 1505 | options.dataType = 'json' 1506 | return $.ajax(options) 1507 | } 1508 | 1509 | $.fn.load = function(url, data, success){ 1510 | if (!this.length) return this 1511 | var self = this, parts = url.split(/\s/), selector, 1512 | options = parseArguments(url, data, success), 1513 | callback = options.success 1514 | if (parts.length > 1) options.url = parts[0], selector = parts[1] 1515 | options.success = function(response){ 1516 | self.html(selector ? 1517 | $('
').html(response.replace(rscript, "")).find(selector) 1518 | : response) 1519 | callback && callback.apply(self, arguments) 1520 | } 1521 | $.ajax(options) 1522 | return this 1523 | } 1524 | 1525 | var escape = encodeURIComponent 1526 | 1527 | function serialize(params, obj, traditional, scope){ 1528 | var type, array = $.isArray(obj) 1529 | $.each(obj, function(key, value) { 1530 | type = $.type(value) 1531 | if (scope) key = traditional ? scope : scope + '[' + (array ? '' : key) + ']' 1532 | // handle data in serializeArray() format 1533 | if (!scope && array) params.add(value.name, value.value) 1534 | // recurse into nested objects 1535 | else if (type == "array" || (!traditional && type == "object")) 1536 | serialize(params, value, traditional, key) 1537 | else params.add(key, value) 1538 | }) 1539 | } 1540 | 1541 | $.param = function(obj, traditional){ 1542 | var params = [] 1543 | params.add = function(k, v){ this.push(escape(k) + '=' + escape(v)) } 1544 | serialize(params, obj, traditional) 1545 | return params.join('&').replace(/%20/g, '+') 1546 | } 1547 | })(Zepto) 1548 | 1549 | ;(function ($) { 1550 | $.fn.serializeArray = function() { 1551 | var result = [], el 1552 | $([].slice.call(this.get(0).elements)).each(function(){ 1553 | el = $(this) 1554 | var type = el.attr('type') 1555 | if (this.nodeName.toLowerCase() != 'fieldset' && 1556 | !this.disabled && type != 'submit' && type != 'reset' && type != 'button' && 1557 | ((type != 'radio' && type != 'checkbox') || this.checked)) 1558 | result.push({ 1559 | name: el.attr('name'), 1560 | value: el.val() 1561 | }) 1562 | }) 1563 | return result 1564 | } 1565 | 1566 | $.fn.serialize = function(){ 1567 | var result = [] 1568 | this.serializeArray().forEach(function(elm){ 1569 | result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value)) 1570 | }) 1571 | return result.join('&') 1572 | } 1573 | 1574 | $.fn.submit = function(callback) { 1575 | if (callback) this.bind('submit', callback) 1576 | else if (this.length) { 1577 | var event = $.Event('submit') 1578 | this.eq(0).trigger(event) 1579 | if (!event.defaultPrevented) this.get(0).submit() 1580 | } 1581 | return this 1582 | } 1583 | 1584 | })(Zepto) 1585 | 1586 | ;(function($) { 1587 | var data = {}, dataAttr = $.fn.data, camelize = $.camelCase, 1588 | exp = $.expando = 'Zepto' + (+new Date()), emptyArray = [] 1589 | 1590 | // Get value from node: 1591 | // 1. first try key as given, 1592 | // 2. then try camelized key, 1593 | // 3. fall back to reading "data-*" attribute. 1594 | function getData(node, name) { 1595 | var id = node[exp], store = id && data[id] 1596 | if (name === undefined) return store || setData(node) 1597 | else { 1598 | if (store) { 1599 | if (name in store) return store[name] 1600 | var camelName = camelize(name) 1601 | if (camelName in store) return store[camelName] 1602 | } 1603 | return dataAttr.call($(node), name) 1604 | } 1605 | } 1606 | 1607 | // Store value under camelized key on node 1608 | function setData(node, name, value) { 1609 | var id = node[exp] || (node[exp] = ++$.uuid), 1610 | store = data[id] || (data[id] = attributeData(node)) 1611 | if (name !== undefined) store[camelize(name)] = value 1612 | return store 1613 | } 1614 | 1615 | // Read all "data-*" attributes from a node 1616 | function attributeData(node) { 1617 | var store = {} 1618 | $.each(node.attributes || emptyArray, function(i, attr){ 1619 | if (attr.name.indexOf('data-') == 0) 1620 | store[camelize(attr.name.replace('data-', ''))] = 1621 | $.zepto.deserializeValue(attr.value) 1622 | }) 1623 | return store 1624 | } 1625 | 1626 | $.fn.data = function(name, value) { 1627 | return value === undefined ? 1628 | // set multiple values via object 1629 | $.isPlainObject(name) ? 1630 | this.each(function(i, node){ 1631 | $.each(name, function(key, value){ setData(node, key, value) }) 1632 | }) : 1633 | // get value from first element 1634 | this.length == 0 ? undefined : getData(this[0], name) : 1635 | // set value on all elements 1636 | this.each(function(){ setData(this, name, value) }) 1637 | } 1638 | 1639 | $.fn.removeData = function(names) { 1640 | if (typeof names == 'string') names = names.split(/\s+/) 1641 | return this.each(function(){ 1642 | var id = this[exp], store = id && data[id] 1643 | if (store) $.each(names, function(){ delete store[camelize(this)] }) 1644 | }) 1645 | } 1646 | })(Zepto) 1647 | -------------------------------------------------------------------------------- /jquery.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v2.2.4 | (c) jQuery Foundation | jquery.org/license */ 2 | !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; 3 | }catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("