From 448c53f54cbe8d936416e85d4dd4c321734dc913 Mon Sep 17 00:00:00 2001 From: Ian Moffitt Date: Sat, 27 Sep 2014 09:31:11 -0700 Subject: [PATCH] Plugin rewrite --- .bowerrc | 3 + .editorconfig | 13 + .gitignore | 3 + .jshintrc | 21 + .travis.yml | 4 + CONTRIBUTING.md | 32 ++ Gruntfile.js | 103 ++++ README.md | 85 +++- bower.json | 9 + css/paging.css | 23 - js/jquery-1.7.1.min.js | 4 - js/paging.js | 214 --------- js/paging.min.js | 1 - .../connect/node_modules/qs/package.json | 4 +- .../node_modules/underscore/package.json | 2 +- .../node_modules/phantomjs/install.js | 3 - .../node_modules/adm-zip/package.json | 4 +- .../request-progress/package.json | 4 +- .../node_modules/delayed-stream/package.json | 3 +- .../node_modules/assert-plus/package.json | 3 +- .../node_modules/phantomjs/package.json | 8 +- .../node_modules/eventemitter2/package.json | 2 +- .../grunt/node_modules/minimatch/package.json | 2 +- .../globule/node_modules/lodash/package.json | 3 +- package.json | 37 ++ src/.jshintrc | 15 + src/staticpager.js | 444 ++++++++++++++++++ staticResultsPaging.html | 67 --- staticpager.jquery.json | 28 ++ test/.jshintrc | 32 ++ test/staticpager.html | 35 ++ test/staticpager_test.js | 221 +++++++++ 32 files changed, 1096 insertions(+), 336 deletions(-) create mode 100644 .bowerrc create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .jshintrc create mode 100644 .travis.yml create mode 100644 CONTRIBUTING.md create mode 100644 Gruntfile.js create mode 100644 bower.json delete mode 100644 css/paging.css delete mode 100644 js/jquery-1.7.1.min.js delete mode 100644 js/paging.js delete mode 100644 js/paging.min.js create mode 100644 package.json create mode 100644 src/.jshintrc create mode 100644 src/staticpager.js delete mode 100644 staticResultsPaging.html create mode 100644 staticpager.jquery.json create mode 100644 test/.jshintrc create mode 100644 test/staticpager.html create mode 100644 test/staticpager_test.js diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 0000000..44491d3 --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "bower_components" +} diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9aac58c --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = tab +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d85ec29 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/node_modules/ +/bower_components/ +dist diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..1d35ce1 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,21 @@ +{ + "node": true, + "browser": true, + "esnext": true, + "bitwise": true, + "camelcase": true, + "curly": true, + "eqeqeq": true, + "immed": true, + "indent": 2, + "latedef": true, + "newcap": true, + "noarg": true, + "quotmark": "single", + "regexp": true, + "undef": true, + "unused": true, + "strict": true, + "trailing": true, + "smarttabs": true +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..2cdacaf --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +language: node_js +node_js: + - '0.10' + - '0.8' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e9a8b47 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# Contributing + +## Important notes +Please don't edit files in the `dist` subdirectory as they are generated via Grunt. You'll find source code in the `src` subdirectory! + +### Code style +Regarding code style like indentation and whitespace, **follow the conventions you see used in the source already.** + +### PhantomJS +While Grunt can run the included unit tests via [PhantomJS](http://phantomjs.org/), this shouldn't be considered a substitute for the real thing. Please be sure to test the `test/*.html` unit test file(s) in _actual_ browsers. + +## Modifying the code +First, ensure that you have the latest [Node.js](http://nodejs.org/) and [npm](http://npmjs.org/) installed. + +Test that Grunt's CLI and Bower are installed by running `grunt --version` and `bower --version`. If the commands aren't found, run `npm install -g grunt-cli bower`. For more information about installing the tools, see the [getting started with Grunt guide](http://gruntjs.com/getting-started) or [bower.io](http://bower.io/) respectively. + +1. Fork and clone the repo. +1. Run `npm install` to install all build dependencies (including Grunt). +1. Run `bower install` to install the front-end dependencies. +1. Run `grunt` to grunt this project. + +Assuming that you don't see any red, you're ready to go. Just be sure to run `grunt` after making any changes, to ensure that nothing is broken. + +## Submitting pull requests + +1. Create a new branch, please don't work in your `master` branch directly. +1. Add failing tests for the change you want to make. Run `grunt` to see the tests fail. +1. Fix stuff. +1. Run `grunt` to see if the tests pass. Repeat steps 2-4 until done. +1. Open `test/*.html` unit test file(s) in actual browser to ensure tests pass everywhere. +1. Update the documentation to reflect any changes. +1. Push to your fork and submit a pull request. diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..f49c4e7 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,103 @@ +'use strict'; + +module.exports = function (grunt) { + // Load all grunt tasks + require('load-grunt-tasks')(grunt); + // Show elapsed time at the end + require('time-grunt')(grunt); + + // Project configuration. + grunt.initConfig({ + // Metadata. + pkg: grunt.file.readJSON('package.json'), + banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' + + '<%= grunt.template.today("yyyy-mm-dd") %>\n' + + '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' + + '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' + + ' Licensed MIT */\n', + // Task configuration. + clean: { + files: ['dist'] + }, + concat: { + options: { + banner: '<%= banner %>', + stripBanners: true + }, + dist: { + src: ['src/<%= pkg.name %>.js'], + dest: 'dist/jquery.<%= pkg.name %>.js' + } + }, + uglify: { + options: { + banner: '<%= banner %>' + }, + dist: { + src: '<%= concat.dist.dest %>', + dest: 'dist/jquery.<%= pkg.name %>.min.js' + } + }, + qunit: { + all: { + options: { + urls: ['http://localhost:9000/test/<%= pkg.name %>.html'] + } + } + }, + jshint: { + options: { + reporter: require('jshint-stylish') + }, + gruntfile: { + options: { + jshintrc: '.jshintrc' + }, + src: 'Gruntfile.js' + }, + src: { + options: { + jshintrc: 'src/.jshintrc' + }, + src: ['src/**/*.js'] + }, + test: { + options: { + jshintrc: 'test/.jshintrc' + }, + src: ['test/**/*.js'] + } + }, + watch: { + gruntfile: { + files: '<%= jshint.gruntfile.src %>', + tasks: ['jshint:gruntfile'] + }, + src: { + files: '<%= jshint.src.src %>', + tasks: ['jshint:src', 'qunit'] + }, + test: { + files: '<%= jshint.test.src %>', + tasks: ['jshint:test', 'qunit'] + } + }, + connect: { + server: { + options: { + hostname: '*', + port: 9000 + } + } + } + }); + + // Default task. + grunt.registerTask('default', ['jshint', 'connect', 'qunit', 'clean', 'concat', 'uglify']); + grunt.registerTask('server', function () { + grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.'); + grunt.task.run(['serve']); + }); + grunt.registerTask('serve', ['connect', 'watch']); + grunt.registerTask('test', ['jshint', 'connect', 'qunit']); +}; diff --git a/README.md b/README.md index b39ff26..f9d6d21 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,83 @@ -Static Pager -============ +# Static Pager -This certainly needs documented. +Use static paging for unordered lists of content -[![githalytics.com alpha](https://cruel-carlota.pagodabox.com/4bab84c5f9758cf3b297626ddb4372da "githalytics.com")](http://githalytics.com/nessthehero/Pager) +## Getting Started + +Download the [production version][min] or the [development version][max]. + +[min]: https://raw.github.com/nessthehero/jquery-staticpager/master/dist/jquery.staticpager.min.js +[max]: https://raw.github.com/nessthehero/jquery-staticpager/master/dist/jquery.staticpager.js + +In your web page: + +```html + + + + +
+ +
+``` + +## Documentation + +### Options: + +- **pageSize**: Amount of items to display per page. (Default: 25) +- **top**: Show paging above results (Default: true) +- **bottom**: Show paging below results (Default: true) +- **nextText**: Text for next button (Default: 'next') +- **prevText**: Text for previous button (Default: 'prev') +- **status**: Show status of paging, such as 'X of Y results' (Default: true) +- **statusLocation**: Where to display paging status (Default: 'bottom') +- **showAll**: Show a link to expand to all results and disable paging (Default: false) +- **truncate**: Truncate the page numbers to only show approximately 7 pages instead of all pages. Useful for large amounts of items. (Default: false) +- **evenodd**: Add classes to distinguish even and odd items (Default: true) +- **filter**: An array of strings to filter results, based on the `data-filter` attribute on each list item. Can be declared on load but also can be passed via a method for later sorting (Default: []) +- **delimiter**: Separator between each filter item in data attribute. (Default "|") +- **start**: Callback function fired before pager is built. +- **end**: Callback function fired after pager is built. +- **before**: Callback function before page is changed. +- **after**: Callback function after page is changed. + +### Methods: + +#### Destroy + +Unset pager, remove any paging in place, and restore markup to original state. + +```javascript +$("#pager").destroy(); +``` + +#### Update + +Pass an array of strings to the pager to filter it based on the data-filter attribute on each list item. + +```javascript +$("#pager").update(["2", "3"]); +``` + +## Release History + +### 1.0.0 + +Release of pager enhanced by Grunt, backed by Unit Tests, with enhanced functionality. + +### Older + +Original plugin written by Jay Del Greco diff --git a/bower.json b/bower.json new file mode 100644 index 0000000..03fdfac --- /dev/null +++ b/bower.json @@ -0,0 +1,9 @@ +{ + "name": "staticpager", + "version": "1.0.0", + "dependencies": {}, + "devDependencies": { + "qunit": "~1.12.0", + "jquery": "latest" + } +} diff --git a/css/paging.css b/css/paging.css deleted file mode 100644 index 3a4c91c..0000000 --- a/css/paging.css +++ /dev/null @@ -1,23 +0,0 @@ -#dialogLauncher {width:0px;height:0px;line-height:0px;padding:0px;margin:0px;text-indent:-9999px;overflow:hidden;display:none;} -#dialogLauncher span {width:0px;height:0px;line-height:0px;padding:0px;margin:0px;text-indent:-9999px;overflow:hidden;} -#allQa .paging {width:800px;padding:5px;margin:0px;overflow:hidden;} -#allQa .paging .leftSide {width:400px;padding:5px;margin:0px;float:left;} -#allQa .paging .rightSide {width:300px;padding:5px;margin:0px;text-align:right;float:right;} -#allQa .prev {display:none;} -#allQa .pager {padding:0px 5px;} -#allQa .tInd, #allQa .bInd {padding:0px 5px;display:none;} -#allQa ul {width:800px;padding:0px;margin:0px;list-style:none;} -#allQa ul li {width:800px;padding:0px;margin:0px;} -#allQa ul li li {width:800px;padding:5px;margin:0px;} -#allQa .pagingListItem {width:800px;padding:5px;margin:0px;} -#allQa .pagingListItem .result {position:relative;width:800px;background:#FFFFFF;z-index:1;} -#allQa .pagingListItem .odd {background:#CCCCCC;} -#allQa .pagingListItem .even {background:#FFFFFF;} -#allQa .pagingListItem .focus {background:#FFFFFF !important;} -#allQa .pagingListItem .blur {background:#999999;} -#allQa .pagingListItem h3 {padding:0px;margin:0px;} -#allQa .pagingListItem p {padding:0px;margin:0px;} -#allQa .pagingListItem .previewBubble {width:600px;height:200px;padding:5px;margin:0px;background:#FFFFFF;border:#000000 1px solid;position:absolute;top:18px;left:18px;z-index:2;display:none;} -#allQa .pagingListItem .previewBubble #mainContent {width:600px;height:200px;padding:0px;margin:0px;overflow:auto;} -#allQa .pagingListItem .previewBubble .closer {display:block;width:30px;height:30px;padding:0px;margin:0px;background: url(../images/fancy_closebox.png) left top no-repeat;position:absolute;right:-20px;top:-20px;overflow:hidden;text-indent:-9999px;} -#allQa .pagingListItem .previewBubble .closer span {width:0px;height:0px;line-height:0px;padding:0px;margin:0px;overflow:hidden;text-indent:-9999px;} diff --git a/js/jquery-1.7.1.min.js b/js/jquery-1.7.1.min.js deleted file mode 100644 index ee02337..0000000 --- a/js/jquery-1.7.1.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v1.7.1 jquery.com | jquery.org/license */ -(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
a",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="
"+""+"
",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="
t
",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")}; -f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function() -{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/js/paging.js b/js/paging.js deleted file mode 100644 index beef4c4..0000000 --- a/js/paging.js +++ /dev/null @@ -1,214 +0,0 @@ -/* Alpha release of the static pager, developed and released by Jay Michael Del Greco, December 14, 2010. -Feel free to use and re-use it at will. Just give credit where it's due. Thanks. */ -// Made even more amazing by Ian Moffitt - 03/2012 -$.fn.superPager=function(settings){ - settings = $.extend({}, $.fn.superPager.defaults, settings); - pageSize = settings.pageSize; - topPaging = settings.topPaging; - bottomPaging = settings.bottomPaging; - nextText = settings.nextText; - prevText = settings.prevText; - pageStatus = settings.pageStatus; - statusLocation = settings.statusLocation; - showAll = settings.showAll; - truncate = settings.truncate; - - if (pageCount <= 5) { - truncate = false; - } - - var resultCount = $(this).children('ul').children('li').length; - var pageCount = Math.ceil(resultCount / pageSize); - var pageIndex = 1; //We need to set a numeric value for this that will be changed dynamically when paginated, because the prev and next buttons weren't making integers of the values that I was pulling from the SPANs in IE7. - //alert("pageSize is a "+typeof(pageSize)+" with a value of "+pageSize+". resultCount is a "+typeof(resultCount)+" with a value of "+resultCount); - - var pageArray = []; - - $(this).children('ul').addClass('result-holder'); - - //If the resultCount is greater than the pageSize we will need to PAGINATE this motherfucker! - if (resultCount > pageSize){ - //Apply the appropriate grouping classes to the results - for (var i=1; i<=resultCount; i++){ - if (i==1){ - $(this).children('ul').children('li:first').addClass('result').addClass('page1').attr('id','result1'); - } else { - pageChecker = Math.ceil(i/pageSize); - $(this).children('ul').children('li:eq('+(i-1)+')').addClass('result').addClass('page'+pageChecker).attr('id','result'+i); - } - } - //Wrap paging ULs and LIs around the appropriate grouped results. The markup remains valid and semantically correct, as one giant nested un-ordered list. - for (var i=1; i<=pageCount; i++){ - $('.page'+i).wrapAll('
    • '); - var itemCount = $('#page'+i+'List li').length; - for (var z=1; z<=itemCount; z++){ - if (z==1){ - $('#page'+i+'List li:first').addClass('odd'); - } else { - if (z%2==0){ - $('#page'+i+'List li:eq('+(z-1)+')').addClass('even'); - } else { - $('#page'+i+'List li:eq('+(z-1)+')').addClass('odd'); - } - } - } - } - - var templateStatus = '
      Page '+pageIndex+' of '+pageCount+'. Viewing results '+1+' thru '+pageSize+' of '+resultCount+'.
      '; - var templatePaging = ''; - - var buildTopPager = $('
      '); - var buildBottomPager = $('
      '); - - if (topPaging) { - var tmpAppender = templatePaging; - if (pageStatus && statusLocation == 'top') { tmpAppender += templateStatus; } - buildTopPager.append(tmpAppender) - $(this).prepend(buildTopPager); - } - - if (bottomPaging) { - var tmpAppender = templatePaging; - if (pageStatus && statusLocation == 'bottom') { tmpAppender += templateStatus; } - buildBottomPager.append(tmpAppender) - $(this).append(buildBottomPager); - } - - // Show all? - if (showAll) { - $('#topPaging .leftSide, #bottomPaging .leftSide').append('Show All'); - } - - - //Generate and hide the appropriate paging links, assuming of course that their paging containers exist. If their paging containers don't exist, jQuery just fails gracefully. No harm. - for (var i=1; i<=pageCount; i++){ - pageArray[i] = i; - - $('#topPaging .rightSide').append(''+i+''+i+''); - $('#bottomPaging .rightSide').append(''+i+''+i+''); - if (truncate && i == 2) { - $('#topPaging .rightSide').append('...'); - $('#bottomPaging .rightSide').append('...'); - } - console.log('truncate: ' + truncate + '; pageCount: ' + pageCount + '; i: ' + i); - if (truncate && i == (pageCount-2)) { - $('#topPaging .rightSide').append('...'); - $('#bottomPaging .rightSide').append('...'); - } - - //Since we are starting on page 1, we will hide all subsequent pages. - if (i > 1){ - $('#page'+i).css('display','none'); - } - } - $('#tPager1, #bPager1, #top_fEllip, #bot_fEllip').css('display','none');//Since we are starting on page 1, we will hide the first paging links in both the top and bottom nav. - $('#tInd1, #bInd1').css('display','inline');//Since we are starting on page 1, we will reveal the span tag for the first page status in both the top and bottom nav. - - $('#bottomPaging span[id^="bInd"]').each(function(index) { - if (index != 0) { - $(this).hide(); - } - }); - - $('#topPaging span[id^="tInd"]').each(function(index) { - if (index != 0) { - $(this).hide(); - } - }); - - $('.paging .rightSide').append('');//Stick a 'next' link on the end. This 1 line works for both top and bottom. - - $('.pagingListItem').css('display','none');//Hide every pagingListItem. - $('#page'+pageIndex).css('display','block');//Reveal the desired pagingListItem. - - if (truncate) { - for (key in pageArray) { - if (key > 2 && key < (pageCount - 1)) { - $('#tPager'+key+',#tInd'+key+',#bPager'+key+',#bInd').css('display', 'none'); - } - } - } - - } - //Paging Function - $('.prev, .pager, .next').live("click", function() { - if ($(this).attr('class').indexOf('prev') != -1){ - pageIndex = pageIndex-1; - } else if ($(this).attr('class').indexOf('next') != -1){ - pageIndex = pageIndex+1; - } else { - pageIndex = parseInt($(this).text()); - } - - $('.pagingListItem').css('display','none');//Hide every pagingListItem. - $('#page'+pageIndex).css('display','block');//Reveal the desired pagingListItem. - $('#currentPage').text(pageIndex); - $('#resultStart').text((pageIndex*pageSize)-(pageSize-1)); - if (pageIndex == pageCount){ - $('#resultEnd').text(resultCount); - } else { - $('#resultEnd').text(pageIndex*pageSize); - } - - //Just some logic for handling the first and last pages. - if (pageIndex == pageCount){ - $('.next').css('display','none'); - $('.prev').css('display','inline'); - } else if (pageIndex == 1){ - $('.next').css('display','inline'); - $('.prev').css('display','none'); - } else { - $('.next').css('display','inline'); - $('.prev').css('display','inline'); - } - - if (!truncate) { - $('.tInd, .bInd').hide();//.css('display','none');//Hide all spans. - $('.pager').css('display','inline');//Reveal all links. - $('#tPager'+pageIndex+', #bPager'+pageIndex).css('display','none');//Hide the page link for the newly exposed page. - $('#tInd'+pageIndex+', #bInd'+pageIndex).css('display','inline');//Reveal the span for the newly exposed page. - } else { - - $('#top_fEllip, #bot_fEllip, #top_lEllip, #bot_lEllip, .pager, .tInd, .bInd').css('display','none'); - - if (pageIndex > 3) { - $('#top_fEllip, #bot_fEllip').css('display','inline'); - } - - if (pageIndex < (pageCount - 2)) { - $('#top_lEllip, #bot_lEllip').css('display','inline'); - } - - for (var j = 1; j <= pageCount; j += 1) { - if (j == pageIndex || j == (pageIndex-1) || j == (pageIndex+1) || j <= 1 || j >= (pageCount - 1)) { - $('#bPager'+j+', #tPager'+j+'').css('display', 'inline'); - } - } - - $('#tPager'+pageIndex+', #bPager'+pageIndex).css('display','none');//Hide the page link for the newly exposed page. - $('#tInd'+pageIndex+', #bInd'+pageIndex).css('display','inline');//Reveal the span for the newly exposed page. - - } - return false; - }); - - $('.showAllItems').on('click', function() { - $('.result').each(function(index) { - $(this).appendTo($('.result-holder')); - }); - $('#bottomPaging, #topPaging, .pagingListItem').remove(); - }); -}; - -//Default values for the parameters in the extend. -$.fn.superPager.defaults = { - pageSize : 25, - topPaging : true, - bottomPaging : true, - nextText : 'next', - prevText : 'previous', - pageStatus : true, - statusLocation : 'bottom', - showAll : false, - truncate : false -}; \ No newline at end of file diff --git a/js/paging.min.js b/js/paging.min.js deleted file mode 100644 index b018e97..0000000 --- a/js/paging.min.js +++ /dev/null @@ -1 +0,0 @@ -$.fn.superPager=function(a){a=$.extend({},$.fn.superPager.defaults,a);pageSize=a.pageSize;topPaging=a.topPaging;bottomPaging=a.bottomPaging;nextText=a.nextText;prevText=a.prevText;pageStatus=a.pageStatus;statusLocation=a.statusLocation;showAll=a.showAll;var b=$(this).children("ul").children("li").length;var c=Math.ceil(b/pageSize);var d=1;$(this).children("ul").addClass("result-holder");if(b>pageSize){for(var e=1;e<=b;e++){if(e==1){$(this).children("ul").children("li:first").addClass("result").addClass("page1").attr("id","result1")}else{pageChecker=Math.ceil(e/pageSize);$(this).children("ul").children("li:eq("+(e-1)+")").addClass("result").addClass("page"+pageChecker).attr("id","result"+e)}}for(var e=1;e<=c;e++){$(".page"+e).wrapAll('
      • ');var f=$("#page"+e+"List li").length;for(var g=1;g<=f;g++){if(g==1){$("#page"+e+"List li:first").addClass("odd")}else{if(g%2==0){$("#page"+e+"List li:eq("+(g-1)+")").addClass("even")}else{$("#page"+e+"List li:eq("+(g-1)+")").addClass("odd")}}}}var h='
        Page '+d+' of '+c+'. Viewing results '+1+' thru '+pageSize+" of "+b+".
        ";var i='";var j=$('
        ');var k=$('
        ');if(topPaging){var l=i;if(pageStatus&&statusLocation=="top"){l+=h}j.append(l);$(this).prepend(j)}if(bottomPaging){var l=i;if(pageStatus&&statusLocation=="bottom"){l+=h}k.append(l);$(this).append(k)}if(showAll){$("#topPaging .leftSide, #bottomPaging .leftSide").append('Show All')}for(var e=1;e<=c;e++){$("#topPaging .rightSide").append(''+e+''+e+"");$("#bottomPaging .rightSide").append(''+e+''+e+"");if(e>1){$("#page"+e).css("display","none")}}$("#tPager1, #bPager1").css("display","none");$("#tInd1, #bInd1").css("display","inline");$('#bottomPaging span[id^="bInd"]').each(function(a){if(a!=0){$(this).hide()}});$('#topPaging span[id^="tInd"]').each(function(a){if(a!=0){$(this).hide()}});$(".paging .rightSide").append('");$(".pagingListItem").css("display","none");$("#page"+d).css("display","block")}$(".prev, .pager, .next").live("click",function(){if($(this).attr("class").indexOf("prev")!=-1){d=d-1}else if($(this).attr("class").indexOf("next")!=-1){d=d+1}else{d=parseInt($(this).text())}$(".pagingListItem").css("display","none");$("#page"+d).css("display","block");$("#currentPage").text(d);$("#resultStart").text(d*pageSize-(pageSize-1));if(d==c){$("#resultEnd").text(b)}else{$("#resultEnd").text(d*pageSize)}$(".tInd, .bInd").hide();$(".pager").css("display","inline");$("#tPager"+d+", #bPager"+d).css("display","none");$("#tInd"+d+", #bInd"+d).css("display","inline");if(d==c){$(".next").css("display","none");$(".prev").css("display","inline")}else if(d==1){$(".next").css("display","inline");$(".prev").css("display","none")}else{$(".next").css("display","inline");$(".prev").css("display","inline")}return false});$(".showAllItems").on("click",function(){$(".result").each(function(a){$(this).appendTo($(".result-holder"))});$("#bottomPaging, #topPaging, .pagingListItem").remove()})};$.fn.superPager.defaults={pageSize:25,topPaging:true,bottomPaging:true,nextText:"next",prevText:"previous",pageStatus:true,statusLocation:"bottom",showAll:false} \ No newline at end of file diff --git a/node_modules/grunt-contrib-connect/node_modules/connect/node_modules/qs/package.json b/node_modules/grunt-contrib-connect/node_modules/connect/node_modules/qs/package.json index cfc7dba..1f5ea69 100644 --- a/node_modules/grunt-contrib-connect/node_modules/connect/node_modules/qs/package.json +++ b/node_modules/grunt-contrib-connect/node_modules/connect/node_modules/qs/package.json @@ -34,7 +34,5 @@ }, "homepage": "https://github.com/visionmedia/node-querystring", "_id": "qs@0.6.5", - "_shasum": "294b268e4b0d4250f6dde19b3b8b34935dff14ef", - "_from": "qs@0.6.5", - "_resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz" + "_from": "qs@0.6.5" } diff --git a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/package.json b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/package.json index 4c89a67..014ab26 100644 --- a/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/package.json +++ b/node_modules/grunt-contrib-jshint/node_modules/jshint/node_modules/underscore/package.json @@ -31,5 +31,5 @@ "url": "https://github.com/documentcloud/underscore/issues" }, "_id": "underscore@1.4.4", - "_from": "underscore@1.4.x" + "_from": "underscore@~1.4.3" } diff --git a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/install.js b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/install.js index 06200f5..6592193 100644 --- a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/install.js +++ b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/install.js @@ -252,9 +252,6 @@ function requestBinary(requestOptions, filePath) { 'If you continue to have issues, please report this full log at ' + 'https://github.com/Medium/phantomjs') exit(1) - } else if (error && error.stack && error.stack.indexOf('SELF_SIGNED_CERT_IN_CHAIN') != -1) { - console.error('Error making request, SELF_SIGNED_CERT_IN_CHAIN. Please read https://github.com/Medium/phantomjs#i-am-behind-a-corporate-proxy-that-uses-self-signed-ssl-certificates-to-intercept-encrypted-traffic') - exit(1) } else if (error) { console.error('Error making request.\n' + error.stack + '\n\n' + 'Please report this full log at https://github.com/Medium/phantomjs') diff --git a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/adm-zip/package.json b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/adm-zip/package.json index 194b09d..21a0abf 100644 --- a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/adm-zip/package.json +++ b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/adm-zip/package.json @@ -35,7 +35,5 @@ "readme": "# ADM-ZIP for NodeJS\r\n\r\nADM-ZIP is a pure JavaScript implementation for zip data compression for [NodeJS](http://nodejs.org/). \r\n\r\n# Installation\r\n\r\nWith [npm](http://npmjs.org) do:\r\n\r\n $ npm install adm-zip\r\n\t\r\n## What is it good for?\r\nThe library allows you to:\r\n\r\n* decompress zip files directly to disk or in memory buffers\r\n* compress files and store them to disk in .zip format or in compressed buffers\r\n* update content of/add new/delete files from an existing .zip\r\n\r\n# Dependencies\r\nThere are no other nodeJS libraries that ADM-ZIP is dependent of\r\n\r\n# Examples\r\n\r\n## Basic usage\r\n```javascript\r\n\r\n\tvar AdmZip = require('adm-zip');\r\n\r\n\t// reading archives\r\n\tvar zip = new AdmZip(\"./my_file.zip\");\r\n\tvar zipEntries = zip.getEntries(); // an array of ZipEntry records\r\n\r\n\tzipEntries.forEach(function(zipEntry) {\r\n\t console.log(zipEntry.toString()); // outputs zip entries information\r\n\t\tif (zipEntry.entryName == \"my_file.txt\") {\r\n\t\t console.log(zipEntry.data.toString('utf8')); \r\n\t\t}\r\n\t});\r\n\t// outputs the content of some_folder/my_file.txt\r\n\tconsole.log(zip.readAsText(\"some_folder/my_file.txt\")); \r\n\t// extracts the specified file to the specified location\r\n\tzip.extractEntryTo(/*entry name*/\"some_folder/my_file.txt\", /*target path*/\"/home/me/tempfolder\", /*maintainEntryPath*/false, /*overwrite*/true);\r\n\t// extracts everything\r\n\tzip.extractAllTo(/*target path*/\"/home/me/zipcontent/\", /*overwrite*/true);\r\n\t\r\n\t\r\n\t// creating archives\r\n\tvar zip = new AdmZip();\r\n\t\r\n\t// add file directly\r\n\tzip.addFile(\"test.txt\", new Buffer(\"inner content of the file\"), \"entry comment goes here\");\r\n\t// add local file\r\n\tzip.addLocalFile(\"/home/me/some_picture.png\");\r\n\t// get everything as a buffer\r\n\tvar willSendthis = zip.toBuffer();\r\n\t// or write everything to disk\r\n\tzip.writeZip(/*target file name*/\"/home/me/files.zip\");\r\n\t\r\n\t\r\n\t// ... more examples in the wiki\r\n```\r\n\r\nFor more detailed information please check out the [wiki](https://github.com/cthackers/adm-zip/wiki).\r\n\r\n[![build status](https://secure.travis-ci.org/cthackers/adm-zip.png)](http://travis-ci.org/cthackers/adm-zip)\r\n", "readmeFilename": "README.md", "_id": "adm-zip@0.4.4", - "_shasum": "a61ed5ae6905c3aea58b3a657d25033091052736", - "_from": "adm-zip@0.4.4", - "_resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" + "_from": "adm-zip@0.4.4" } diff --git a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request-progress/package.json b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request-progress/package.json index 7b1bfc3..fda7c06 100644 --- a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request-progress/package.json +++ b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request-progress/package.json @@ -39,7 +39,5 @@ "readmeFilename": "README.md", "homepage": "https://github.com/IndigoUnited/node-request-progress", "_id": "request-progress@0.3.1", - "_shasum": "0721c105d8a96ac6b2ce8b2c89ae2d5ecfcf6b3a", - "_from": "request-progress@0.3.1", - "_resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.1.tgz" + "_from": "request-progress@0.3.1" } diff --git a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json index 3328e9b..c226e9a 100644 --- a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json +++ b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/package.json @@ -29,5 +29,6 @@ "_id": "delayed-stream@0.0.5", "_shasum": "d4b1f43a93e8296dfe02694f4680bc37a313c73f", "_from": "delayed-stream@0.0.5", - "_resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + "_resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "scripts": {} } diff --git a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json index 94c40b0..633e3e6 100644 --- a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json +++ b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json @@ -18,5 +18,6 @@ "_id": "assert-plus@0.1.2", "_shasum": "d93ffdbb67ac5507779be316a7d65146417beef8", "_from": "assert-plus@0.1.2", - "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz" + "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz", + "scripts": {} } diff --git a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/package.json b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/package.json index b6a50ef..4143e53 100644 --- a/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/package.json +++ b/node_modules/grunt-contrib-qunit/node_modules/grunt-lib-phantomjs/node_modules/phantomjs/package.json @@ -1,6 +1,6 @@ { "name": "phantomjs", - "version": "1.9.10", + "version": "1.9.9", "keywords": [ "phantomjs", "headless", @@ -58,8 +58,8 @@ "bugs": { "url": "https://github.com/Obvious/phantomjs/issues" }, - "_id": "phantomjs@1.9.10", - "_shasum": "be174e20b03f42c39beaaf84cc153fb65b225a4a", + "_id": "phantomjs@1.9.9", + "_shasum": "fc10dbe8e33c2e0c5bcedfff80a2e9b63d957445", "_from": "phantomjs@~1.9.0-1", - "_resolved": "https://registry.npmjs.org/phantomjs/-/phantomjs-1.9.10.tgz" + "_resolved": "https://registry.npmjs.org/phantomjs/-/phantomjs-1.9.9.tgz" } diff --git a/node_modules/grunt/node_modules/eventemitter2/package.json b/node_modules/grunt/node_modules/eventemitter2/package.json index 745b523..7571f4e 100644 --- a/node_modules/grunt/node_modules/eventemitter2/package.json +++ b/node_modules/grunt/node_modules/eventemitter2/package.json @@ -59,6 +59,6 @@ "homepage": "https://github.com/hij1nx/EventEmitter2", "_id": "eventemitter2@0.4.14", "_shasum": "8f61b75cde012b2e9eb284d4545583b5643b61ab", - "_from": "eventemitter2@~0.4.9", + "_from": "eventemitter2@~0.4.13", "_resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" } diff --git a/node_modules/grunt/node_modules/minimatch/package.json b/node_modules/grunt/node_modules/minimatch/package.json index de0704b..f8f545a 100644 --- a/node_modules/grunt/node_modules/minimatch/package.json +++ b/node_modules/grunt/node_modules/minimatch/package.json @@ -36,5 +36,5 @@ }, "homepage": "https://github.com/isaacs/minimatch", "_id": "minimatch@0.2.14", - "_from": "minimatch@~0.2.12" + "_from": "minimatch@~0.2.11" } diff --git a/node_modules/load-grunt-tasks/node_modules/globule/node_modules/lodash/package.json b/node_modules/load-grunt-tasks/node_modules/globule/node_modules/lodash/package.json index 93620a4..973f157 100644 --- a/node_modules/load-grunt-tasks/node_modules/globule/node_modules/lodash/package.json +++ b/node_modules/load-grunt-tasks/node_modules/globule/node_modules/lodash/package.json @@ -58,6 +58,5 @@ "readme": "# Lo-Dash v1.0.1\n\nA utility library delivering consistency, [customization](http://lodash.com/custom-builds), [performance](http://lodash.com/benchmarks), & [extras](http://lodash.com/#features).\n\n## Download\n\n* Lo-Dash builds (for modern environments):
        \n[Development](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.js) and\n[Production](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.min.js)\n\n* Lo-Dash compatibility builds (for legacy and modern environments):
        \n[Development](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.compat.js) and\n[Production](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.compat.min.js)\n\n* Underscore compatibility builds:
        \n[Development](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.underscore.js) and\n[Production](https://raw.github.com/lodash/lodash/v1.0.1/dist/lodash.underscore.min.js)\n\n* CDN copies of ≤ v1.0.1’s builds are available on [cdnjs](http://cdnjs.com/) thanks to [CloudFlare](http://www.cloudflare.com/):
        \n[Lo-Dash dev](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.js),\n[Lo-Dash prod](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.min.js),
        \n[Lo-Dash compat-dev](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.compat.js),\n[Lo-Dash compat-prod](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.compat.min.js),
        \n[Underscore compat-dev](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.underscore.js), and\n[Underscore compat-prod](http://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.0.1/lodash.underscore.min.js)\n\n* For optimal file size, [create a custom build](http://lodash.com/custom-builds) with only the features you need\n\n## Dive in\n\nWe’ve got [API docs](http://lodash.com/docs), [benchmarks](http://lodash.com/benchmarks), and [unit tests](http://lodash.com/tests).\n\nFor a list of upcoming features, check out our [roadmap](https://github.com/lodash/lodash/wiki/Roadmap).\n\n## Resources\n\nFor more information check out these articles, screencasts, and other videos over Lo-Dash:\n\n * Posts\n - [Say “Hello” to Lo-Dash](http://kitcambridge.be/blog/say-hello-to-lo-dash/)\n\n * Videos\n - [Introducing Lo-Dash](https://vimeo.com/44154599)\n - [Lo-Dash optimizations and custom builds](https://vimeo.com/44154601)\n - [Lo-Dash’s origin and why it’s a better utility belt](https://vimeo.com/44154600)\n - [Unit testing in Lo-Dash](https://vimeo.com/45865290)\n - [Lo-Dash’s approach to native method use](https://vimeo.com/48576012)\n - [CascadiaJS: Lo-Dash for a better utility belt](http://www.youtube.com/watch?v=dpPy4f_SeEk)\n\n## Features\n\n * AMD loader support ([RequireJS](http://requirejs.org/), [curl.js](https://github.com/cujojs/curl), etc.)\n * [_(…)](http://lodash.com/docs#_) supports intuitive chaining\n * [_.at](http://lodash.com/docs#at) for cherry-picking collection values\n * [_.bindKey](http://lodash.com/docs#bindKey) for binding [*“lazy”* defined](http://michaux.ca/articles/lazy-function-definition-pattern) methods\n * [_.cloneDeep](http://lodash.com/docs#cloneDeep) for deep cloning arrays and objects\n * [_.contains](http://lodash.com/docs#contains) accepts a `fromIndex` argument\n * [_.forEach](http://lodash.com/docs#forEach) is chainable and supports exiting iteration early\n * [_.forIn](http://lodash.com/docs#forIn) for iterating over an object’s own and inherited properties\n * [_.forOwn](http://lodash.com/docs#forOwn) for iterating over an object’s own properties\n * [_.isPlainObject](http://lodash.com/docs#isPlainObject) checks if values are created by the `Object` constructor\n * [_.merge](http://lodash.com/docs#merge) for a deep [_.extend](http://lodash.com/docs#extend)\n * [_.partial](http://lodash.com/docs#partial) and [_.partialRight](http://lodash.com/docs#partialRight) for partial application without `this` binding\n * [_.template](http://lodash.com/docs#template) supports [*“imports”* options](http://lodash.com/docs#templateSettings_imports), [ES6 template delimiters](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-7.8.6), and [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n * [_.where](http://lodash.com/docs#where) supports deep object comparisons\n * [_.clone](http://lodash.com/docs#clone), [_.omit](http://lodash.com/docs#omit), [_.pick](http://lodash.com/docs#pick),\n [and more…](http://lodash.com/docs \"_.assign, _.cloneDeep, _.first, _.initial, _.isEqual, _.last, _.merge, _.rest\") accept `callback` and `thisArg` arguments\n * [_.contains](http://lodash.com/docs#contains), [_.size](http://lodash.com/docs#size), [_.toArray](http://lodash.com/docs#toArray),\n [and more…](http://lodash.com/docs \"_.at, _.countBy, _.every, _.filter, _.find, _.forEach, _.groupBy, _.invoke, _.map, _.max, _.min, _.pluck, _.reduce, _.reduceRight, _.reject, _.shuffle, _.some, _.sortBy, _.where\") accept strings\n * [_.filter](http://lodash.com/docs#filter), [_.find](http://lodash.com/docs#find), [_.map](http://lodash.com/docs#map),\n [and more…](http://lodash.com/docs \"_.countBy, _.every, _.first, _.groupBy, _.initial, _.last, _.max, _.min, _.reject, _.rest, _.some, _.sortBy, _.sortedIndex, _.uniq\") support *“_.pluck”* and *“_.where”* `callback` shorthands\n\n## Support\n\nLo-Dash has been tested in at least Chrome 5~24, Firefox 1~18, IE 6-10, Opera 9.25-12, Safari 3-6, Node.js 0.4.8-0.8.20, Narwhal 0.3.2, PhantomJS 1.8.1, RingoJS 0.9, and Rhino 1.7RC5.\n\n## Installation and usage\n\nIn browsers:\n\n```html\n\n```\n\nUsing [`npm`](http://npmjs.org/):\n\n```bash\nnpm install lodash\n\nnpm install -g lodash\nnpm link lodash\n```\n\nTo avoid potential issues, update `npm` before installing Lo-Dash:\n\n```bash\nnpm install npm -g\n```\n\nIn [Node.js](http://nodejs.org/) and [RingoJS v0.8.0+](http://ringojs.org/):\n\n```js\nvar _ = require('lodash');\n\n// or as a drop-in replacement for Underscore\nvar _ = require('lodash/lodash.underscore');\n```\n\n**Note:** If Lo-Dash is installed globally, run [`npm link lodash`](http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/) in your project’s root directory before requiring it.\n\nIn [RingoJS v0.7.0-](http://ringojs.org/):\n\n```js\nvar _ = require('lodash')._;\n```\n\nIn [Rhino](http://www.mozilla.org/rhino/):\n\n```js\nload('lodash.js');\n```\n\nIn an AMD loader like [RequireJS](http://requirejs.org/):\n\n```js\nrequire({\n 'paths': {\n 'underscore': 'path/to/lodash'\n }\n},\n['underscore'], function(_) {\n console.log(_.VERSION);\n});\n```\n\n## Release Notes\n\n### v1.0.1\n\n * Add support for specifying source map URLs in `-p`/`--source-map` build options\n * Ensured the second argument passed to `_.assign` is not treated as a `callback`\n * Ensured `-p`/`--source-map` build options correctly set the `sourceMappingURL`\n * Made `-p`/`--source-map` build options set source map *“sources”* keys based on the builds performed\n * Made `_.defer` use `setImmediate`, in Node.js, when available\n * Made `_.where` search arrays for values regardless of their index position\n * Removed dead code from `_.template`\n\nThe full changelog is available [here](https://github.com/lodash/lodash/wiki/Changelog).\n\n## BestieJS\n\nLo-Dash is part of the [BestieJS](https://github.com/bestiejs) *“Best in Class”* module collection. This means we promote solid browser/environment support, ES5 precedents, unit testing, and plenty of documentation.\n\n## Author\n\n| [![twitter/jdalton](http://gravatar.com/avatar/299a3d891ff1920b69c364d061007043?s=70)](http://twitter.com/jdalton \"Follow @jdalton on Twitter\") |\n|---|\n| [John-David Dalton](http://allyoucanleet.com/) |\n\n## Contributors\n\n| [![twitter/blainebublitz](http://gravatar.com/avatar/ac1c67fd906c9fecd823ce302283b4c1?s=70)](http://twitter.com/blainebublitz \"Follow @BlaineBublitz on Twitter\") | [![twitter/kitcambridge](http://gravatar.com/avatar/6662a1d02f351b5ef2f8b4d815804661?s=70)](https://twitter.com/kitcambridge \"Follow @kitcambridge on Twitter\") | [![twitter/mathias](http://gravatar.com/avatar/24e08a9ea84deb17ae121074d0f17125?s=70)](http://twitter.com/mathias \"Follow @mathias on Twitter\") |\n|---|---|---|\n| [Blaine Bublitz](http://iceddev.com/) | [Kit Cambridge](http://kitcambridge.github.io/) | [Mathias Bynens](http://mathiasbynens.be/) |\n", "readmeFilename": "README.md", "_id": "lodash@1.0.1", - "_from": "lodash@~1.0.1", - "scripts": {} + "_from": "lodash@~1.0.1" } diff --git a/package.json b/package.json new file mode 100644 index 0000000..8b5ea16 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "staticpager", + "version": "1.0.0", + "description": "Static Pager", + "keywords": [ + "jquery-plugin" + ], + "homepage": "https://github.com/nessthehero/staticpager", + "bugs": "https://github.com/nessthehero/Pager/issues", + "author": { + "name": "Ian Moffitt", + "email": "nessthehero@gmail.com", + "url": "https://github.com/nessthehero" + }, + "repository": { + "type": "git", + "url": "https://github.com/nessthehero/staticpager.git" + }, + "licenses": [ + { + "type": "MIT" + } + ], + "devDependencies": { + "grunt-contrib-jshint": "~0.7.2", + "grunt-contrib-qunit": "~0.3.0", + "grunt-contrib-concat": "~0.3.0", + "grunt-contrib-uglify": "~0.2.7", + "grunt-contrib-watch": "~0.5.3", + "grunt-contrib-clean": "~0.5.0", + "grunt-contrib-connect": "~0.5.0", + "time-grunt": "~0.2.3", + "load-grunt-tasks": "~0.2.0", + "jshint-stylish": "~0.1.3", + "grunt": "~0.4.2" + } +} diff --git a/src/.jshintrc b/src/.jshintrc new file mode 100644 index 0000000..7f876e4 --- /dev/null +++ b/src/.jshintrc @@ -0,0 +1,15 @@ +{ + "curly": true, + "eqeqeq": true, + "immed": true, + "latedef": true, + "newcap": true, + "noarg": true, + "sub": true, + "undef": true, + "unused": true, + "boss": true, + "eqnull": true, + "browser": true, + "predef": ["jQuery"] +} diff --git a/src/staticpager.js b/src/staticpager.js new file mode 100644 index 0000000..6341c24 --- /dev/null +++ b/src/staticpager.js @@ -0,0 +1,444 @@ +/* + * Pager + * https://github.com/nessthehero/Pager + * + * Copyright (c) 2012 Ian Moffitt + * Licensed under the MIT license. + * + * Passes JSLint! + */ +(function ($) { + "use strict"; + + // Tweet sized templating (the JSLinted version) + // http://mir.aculo.us/2011/03/09/little-helpers-a-tweet-sized-javascript-templating-engine/ + function t(s, d) { + var p; + for (p in d) { + if (d.hasOwnProperty(p)) { + s = s.replace(new RegExp('{' + p + '}', 'g'), d[p]); + } + } + return s; + } + + /* IndexOf polyfill */ + if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function (searchElement, fromIndex) { + if (this === undefined || this === null ) { + throw new TypeError('"this" is null or not defined'); + } + + var length = this.length >>> 0; // Hack to convert object.length to a UInt32 + + fromIndex = +fromIndex || 0; + + if (Math.abs(fromIndex) === Infinity) { + fromIndex = 0; + } + + if (fromIndex < 0) { + fromIndex += length; + if (fromIndex < 0) { + fromIndex = 0; + } + } + + for (;fromIndex < length; fromIndex += 1) { + if (this[fromIndex] === searchElement) { + return fromIndex; + } + } + + return -1; + }; + } + + $.pager = function (el, options) { + + var base = this, + i = 0, + j = 0, + stamp = (new Date()).getTime(), + savePoint; + + base.$el = $(el); + base.el = el; + + base.$el.data('pager', stamp); + window.pager = []; + savePoint = { "id" : stamp, "p" : base }; + window.pager.push(savePoint); + + base.options = $.extend({}, $.pager.defaultOptions, options); + + base.init = function (cat) { + + base.templates = { + "status": '
        Page {pageIndex} of {pageCount}. Viewing results {resultStart} thru {resultEnd} of {resultCount}.
        ', + "pageList": '
        • ', + "pager": '', + "top": '
          ', + "bottom": '
          ', + "showAll": 'Show All' + }; + + base.cache = base.$el.html(); + + if (cat.length !== 0) { + base.$el.find('li').each(function () { + + var tax = $(this).attr('data-filter').split(base.options.delimiter); + var found = false; + + for (var j in tax) { + for (var k in cat) { + if (cat[k] === tax[j]) { + found = true; + } + } + } + + if (!found) { + $(this).remove(); + } + + }); + } + + base.count = {}; + base.count.results = base.$el.find('li').length; + base.count.pages = Math.ceil(base.count.results / base.options.pageSize); + + base.pIndex = 1; // TODO make this work based on Hash or options. #HASH + base.pages = []; + + // Render caching + base.render = {}; + base.render.pager = t(base.templates.pager, { + prevText: base.options.prevText + }); + base.render.top = t(base.templates.top, {}); + base.render.bottom = t(base.templates.bottom, {}); + base.render.showall = t(base.templates.showAll, {}); + + if (base.count.results > base.options.pageSize) { + + base.build(); + + // Watch for events + $('.prev, .pager, .next', base.$el).on("click", function () { + + base.options.before($(this).selector, base); + + if ($(this).attr('class').indexOf('prev') !== -1) { + base.pIndex -= 1; + } else if ($(this).attr('class').indexOf('next') !== -1) { + base.pIndex += 1; + } else { + base.pIndex = parseInt($(this).text(), 10); + } + + $('.pagingListItem', base.$el).css('display', 'none'); //Hide every pagingListItem. + $('#page' + base.pIndex, base.$el).css('display', 'block'); //Reveal the desired pagingListItem. + $('#currentPage', base.$el).text(base.pIndex); + $('#resultStart', base.$el).text((base.pIndex * base.options.pageSize) - (base.options.pageSize - 1)); + if (base.pIndex === base.count.pages) { + $('#resultEnd', base.$el).text(base.count.results); + } else { + $('#resultEnd', base.$el).text(base.pIndex * base.options.pageSize); + } + + //Just some logic for handling the first and last pages. + if (base.pIndex === base.count.pages) { + $('.next', base.$el).css('visibility', 'hidden'); + $('.prev', base.$el).css('visibility', 'visible'); + } else if (base.pIndex === 1) { + $('.next', base.$el).css('visibility', 'visible'); + $('.prev', base.$el).css('visibility', 'hidden'); + } else { + $('.next', base.$el).css('visibility', 'visible'); + $('.prev', base.$el).css('visibility', 'visible'); + } + + if (!base.options.truncate) { + $('.tInd, .bInd', base.$el).hide(); //.css('display','none');//Hide all spans. + $('.pager', base.$el).css('display', 'inline'); //Reveal all links. + $('#tPager' + base.pIndex + ', #bPager' + base.pIndex, base.$el).css('display', 'none'); //Hide the page link for the newly exposed page. + $('#tInd' + base.pIndex + ', #bInd' + base.pIndex, base.$el).css('display', 'inline'); //Reveal the span for the newly exposed page. + } else { + + $('#top_fEllip, #bot_fEllip, #top_lEllip, #bot_lEllip, .pager, .tInd, .bInd', base.$el).css('display', 'none'); + + if (base.pIndex > 4) { + $('#top_fEllip, #bot_fEllip', base.$el).css('display', 'inline'); + } + + // Show ellipses if NOT on 4th to last page or greater + // This is so we get + // prev 1 2 ... 45 '46' 47 48 49 next + // and not + // prev 1 2 ... 45 '46' 47 ... 48 49 next + if (base.pIndex < (base.count.pages - 3)) { + $('#top_lEllip, #bot_lEllip', base.$el).css('display', 'inline'); + } + + for (j = 1; j <= base.count.pages; j += 1) { + // this page last page next page 2 or less last 2 pages + if (j === base.pIndex || j === (base.pIndex - 1) || j === (base.pIndex + 1) || j <= 2 || j >= (base.count.pages - 1)) { + $('#bPager' + j + ', #tPager' + j, base.$el).css('display', 'inline'); + } + } + + $('#tPager' + base.pIndex + ', #bPager' + base.pIndex, base.$el).css('display', 'none'); //Hide the page link for the newly exposed page. + $('#tInd' + base.pIndex + ', #bInd' + base.pIndex, base.$el).css('display', 'inline'); //Reveal the span for the newly exposed page. + } + + base.options.after($(this).selector, base); + + return false; + + }); + + $('.showAllItems', base.$el).on('click', function () { + /*$('.result', base.$el).each(function(index) { + $(this, base.$el).appendTo($('.result-holder')); + }); + $('#bottomPaging, #topPaging, .pagingListItem', base.$el).remove();*/ + + base.destroy(); + }); + + } else { + + if (base.options.evenodd) { + $('li:even', base.$el).addClass('even'); + $('li:odd', base.$el).addClass('odd'); + } + + } + + }; + + base.build = function () { + + var pageChecker, itemCount, status, z, topPager, bottomPager, key; + + base.options.start(); + + // Store a reference to this entire plugin in the dom object's data. + base.$el.data('pager.ref', base); + + base.$el.find('ul').addClass('result-holder'); + + //Apply the appropriate grouping classes to the results + for (i = 1; i <= base.count.results; i += 1) { + + pageChecker = Math.ceil(i / base.options.pageSize); + $('ul li:eq(' + (i - 1) + ')', base.$el).addClass('result page' + pageChecker).attr('id', 'result' + i); + + } + + //Wrap paging ULs and LIs around the appropriate grouped results. The markup remains valid and semantically correct, as one giant nested un-ordered list. + for (i = 1; i <= base.count.pages; i += 1) { + $('.page' + i, base.$el).wrapAll('
          • '); + itemCount = $('#page' + i + 'List li', base.$el).length; + + if (base.options.evenodd) { + for (z = 1; z <= itemCount; z += 1) { + + if (z % 2 === 0) { + $('#page' + i + 'List li:eq(' + (z - 1) + ')').addClass('even'); + } else { + $('#page' + i + 'List li:eq(' + (z - 1) + ')').addClass('odd'); + } + + } + } + + } + + // Prepare the paging status in case it is needed. We are also turning it into a jQuery object. + status = $(t(base.templates.status, { + pageIndex: base.pIndex, + pageCount: base.count.pages, + resultStart: 1, // #HASH: Will change based on Hash or options. Set to Hash or option's value. + resultEnd: base.options.pageSize, // #HASH: Will change based on Hash or options. Multiplied by Hash/option value and self + resultCount: base.count.results + })); + + // Attach paging to top + if (base.options.top) { + topPager = $(base.render.top); + topPager.append($(base.render.pager)); + + if ((base.options.status) && (base.options.statusLocation === 'top')) { + topPager.append(status); + } + + //Attach showall + if (base.options.showAll) { + $('.leftSide', topPager).append(base.render.showall); + } + + base.$el.prepend(topPager); + } + + // Attach paging to bottom + if (base.options.bottom) { + bottomPager = $(base.render.bottom); + bottomPager.append($(base.render.pager)); + + if (base.options.status && base.options.statusLocation === 'bottom') { + bottomPager.append(status); + } + + //Attach showall + if (base.options.showAll) { + $('.leftSide', bottomPager).append(base.render.showall); + } + + base.$el.append(bottomPager); + } + + //Generate and hide the appropriate paging links, assuming of course that their paging containers exist. If their paging containers don't exist, jQuery just fails gracefully. No harm. + for (i = 1; i <= base.count.pages; i += 1) { + base.pages[i] = i; + + $('#topPaging .rightSide', base.$el).append('' + i + '' + i + ''); + $('#bottomPaging .rightSide', base.$el).append('' + i + '' + i + ''); + if (base.options.truncate && i === 2) { + $('#topPaging .rightSide', base.$el).append('...'); + $('#bottomPaging .rightSide', base.$el).append('...'); + } + + if (base.options.truncate && i === (base.count.pages - 2)) { + $('#topPaging .rightSide', base.$el).append('...'); + $('#bottomPaging .rightSide', base.$el).append('...'); + } + + //Since we are starting on page 1, we will hide all subsequent pages. + if (i > 1) { + $('#page' + i).css('display', 'none'); + } + } + $('#tPager1, #bPager1, #top_fEllip, #bot_fEllip', base.$el).css('display', 'none'); //Since we are starting on page 1, we will hide the first paging links in both the top and bottom nav. + $('#tInd1, #bInd1', base.$el).css('display', 'inline'); //Since we are starting on page 1, we will reveal the span tag for the first page status in both the top and bottom nav. + $('#bottomPaging span[id^="bInd"]', base.$el).each(function (index) { + if (index !== 0) { + $(this).hide(); + } + }); + + $('#topPaging span[id^="tInd"]', base.$el).each(function (index) { + if (index !== 0) { + $(this).hide(); + } + }); + + $('.paging .rightSide', base.$el).append(''); //Stick a 'next' link on the end. This 1 line works for both top and bottom. + $('.pagingListItem', base.$el).css('display', 'none'); //Hide every pagingListItem. + $('#page' + base.pIndex, base.$el).css('display', 'block'); //Reveal the desired pagingListItem. + if (base.options.truncate) { + for (key in base.pages) { + if (base.pages.hasOwnProperty(key)) { + if (key > 3 && key < (base.count.pages - 1)) { + $('#tPager' + key + ',#tInd' + key + ',#bPager' + key + ',#bInd').css('display', 'none'); + } + } + } + } + + base.options.end(); + + }; + + base.destroy = function () { + + base.$el.html(base.cache); + + }; + + base.filter = function (cat) { + + base.destroy(); + + base.init(cat); + + }; + + if (base.options.filter !== '') { + base.init(base.options.filter); + } else { + base.init(); + } + + return base; + + }; + + $.pager.defaultOptions = { + pageSize: 25, + top: true, + bottom: true, + nextText: 'next', + prevText: 'prev', + status: true, + statusLocation: 'bottom', + showAll: false, + truncate: false, + evenodd: true, + filter: [], + delimiter: "|", + start: function () {}, + // Before build + end: function () {}, + // After build + before: function () {}, + // Before page turn + after: function () {} // After page turn + }; + + var methods = { + + init : function(options) { + return this.each(function () { + var t = new $.pager(this, options); + return t; + }); + }, + + destroy : function( ) { + if (window.pager) { + for (var p in window.pager) { + if ($(this).is(window.pager[p].p.$el)) { + window.pager[p].p.$el.destroy(); + } + } + } + }, + + update : function( filter ) { + if (window.pager) { + for (var p in window.pager) { + if ($(this).is(window.pager[p].p.$el)) { + window.pager[p].p.$el.filter(filter); + } + } + } + } + + }; + + $.fn.pager = function(methodOrOptions) { + if ( methods[methodOrOptions] ) { + return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) { + // Default to "init" + return methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + methodOrOptions + ' does not exist on jQuery.pager' ); + } + }; + +}(jQuery)); diff --git a/staticResultsPaging.html b/staticResultsPaging.html deleted file mode 100644 index e1a53e6..0000000 --- a/staticResultsPaging.html +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Static Paging - - - - - - -
            -

            Welcome to our Site

            -

            This page has paginating results

            -

            Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec lobortis dignissim pharetra. Maecenas feugiat, justo sed vehicula cursus, lorem magna ultricies magna, in elementum augue nisl sit amet massa. Curabitur tincidunt facilisis erat et elementum. Suspendisse venenatis augue eget dolor elementum adipiscing. Sed fringilla lobortis felis, convallis congue lorem iaculis id. Praesent tempus sem quis lacus gravida non hendrerit odio consectetur. Maecenas ut libero et lectus pharetra tincidunt et sed neque. Donec sed blandit felis. Sed sollicitudin dictum enim, quis auctor augue viverra sit amet. Ut vel turpis ut leo scelerisque tempor ac et quam. Vivamus pharetra cursus libero in ultrices. Nunc a ipsum ac neque scelerisque commodo euismod id metus. Praesent consectetur justo quis libero placerat nec blandit purus bibendum. Nullam sapien orci, pharetra vel tristique vel, commodo at metus. Donec arcu magna, vulputate in faucibus sit amet, scelerisque lacinia leo.

            -
            -
              -
            • Item 1

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 2

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 3

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 4

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 5

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 6

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 7

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 8

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 9

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 10

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 11

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 12

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 13

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 14

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 15

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 16

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 17

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 18

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 19

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 20

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 21

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 22

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 23

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 24

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 25

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 26

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 27

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 28

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 29

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 30

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 31

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 32

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 33

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 34

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            • Item 35

              Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam laoreet, ipsum tempor cursus dignissim, elit massa sollicitudin ipsum, a pretium nibh lorem id eros. Vestibulum adipiscing, nibh condimentum convallis malesuada, felis justo vestibulum lectus, quis venenatis nibh arcu convallis nisi. Read More

            • -
            -
            -
            - diff --git a/staticpager.jquery.json b/staticpager.jquery.json new file mode 100644 index 0000000..dbdfb98 --- /dev/null +++ b/staticpager.jquery.json @@ -0,0 +1,28 @@ +{ + "name": "staticpager", + "title": "Static Pager", + "description": "Use static paging for unordered lists of content", + "version": "1.0.0", + "homepage": "https://github.com/nessthehero/Pager", + "author": { + "name": "Ian Moffitt", + "url": "https://github.com/nessthehero" + }, + "repository": { + "type": "git", + "url": "https://github.com/nessthehero/Pager" + }, + "bugs": "https://github.com/nessthehero/Pager/issues", + "licenses": [ + { + "type": "MIT", + "url": "http://opensource.org/licenses/MIT" + } + ], + "dependencies": { + "jquery": "latest" + }, + "keywords": [ + "jquery-plugin" + ] +} diff --git a/test/.jshintrc b/test/.jshintrc new file mode 100644 index 0000000..2de0248 --- /dev/null +++ b/test/.jshintrc @@ -0,0 +1,32 @@ +{ + "curly": true, + "eqeqeq": true, + "immed": true, + "latedef": true, + "newcap": true, + "noarg": true, + "sub": true, + "undef": true, + "unused": true, + "boss": true, + "eqnull": true, + "browser": true, + "predef": [ + "jQuery", + "QUnit", + "module", + "test", + "asyncTest", + "expect", + "start", + "stop", + "ok", + "equal", + "notEqual", + "deepEqual", + "notDeepEqual", + "strictEqual", + "notStrictEqual", + "throws" + ] +} \ No newline at end of file diff --git a/test/staticpager.html b/test/staticpager.html new file mode 100644 index 0000000..4829b7f --- /dev/null +++ b/test/staticpager.html @@ -0,0 +1,35 @@ + + + + + Static Pager Test Suite + + + + + + + + + + + + +
            +
            +
            +
              +
            • Item 1
            • +
            • Item 2
            • +
            • Item 3
            • +
            • Item 4
            • +
            • Item 5
            • +
            • Item 6
            • +
            • Item 7
            • +
            +
            +
            + + diff --git a/test/staticpager_test.js b/test/staticpager_test.js new file mode 100644 index 0000000..5eeaee8 --- /dev/null +++ b/test/staticpager_test.js @@ -0,0 +1,221 @@ +(function($) { + /* + ======== A Handy Little QUnit Reference ======== + http://api.qunitjs.com/ + + Test methods: + module(name, {[setup][ ,teardown]}) + test(name, callback) + expect(numberOfAssertions) + stop(increment) + start(decrement) + Test assertions: + ok(value, [message]) + equal(actual, expected, [message]) + notEqual(actual, expected, [message]) + deepEqual(actual, expected, [message]) + notDeepEqual(actual, expected, [message]) + strictEqual(actual, expected, [message]) + notStrictEqual(actual, expected, [message]) + throws(block, [expected], [message]) + */ + + module("Pager", { + setup: function() { + + this.settings = { + pageSize: 2 + }; + + this.pagerReference = $('#pager').pager(this.settings); + + this.pIndex = 1; + } + }); + + test("initial setup detection", function() { + + notEqual($('#pager').length, 0, "Detect paging container"); + equal($('.pageList').length, 4, "Has four pages"); + + ok(window.pager, "Seeing the global pager object"); + + ok(window.pager[0], "Global pager object has stuff"); + + ok(window.pager[0].p, "Found a pager in the global object"); + + ok(window.pager[0].p.$el.is(this.pagerReference), "It's the pager we're using!"); + + }); + + test("prev/next buttons exist", function() { + + if ($('#topPaging').length === 1) { + equal($('#pager #topPaging .prev').length, 1, "Has top previous button"); + equal($('#pager #topPaging .next').length, 1, "Has top next button"); + } + + if ($('#bottomPaging').length === 1) { + equal($('#pager #bottomPaging .prev').length, 1, "Has bottom previous button"); + equal($('#pager #bottomPaging .next').length, 1, "Has bottom next button"); + } + + }); + + test("prev/next paging works", function() { + var r; + + $('#topPaging .next').click(); + equal($('#page2').css('display'), 'block', "Page 2 is showing."); + + r = true; + $('.result-holder > li:not(#page2)').each(function () { + if ($(this).css('display') !== 'none') { + r = false; + } + }); + + ok(r, "No other page is showing"); + + equal($('#pager #topPaging .prev').css('display'), 'inline', 'Prev button has display:inline'); + equal($('#pager #topPaging .prev').css('visibility'), 'visible', 'Prev button is visible'); + + $('#topPaging .prev').click(); + + equal($('#page1').css('display'), 'block', "Page 1 is showing."); + + r = true; + $('.result-holder > li:not(#page1)').each(function () { + if ($(this).css('display') !== 'none') { + r = false; + } + }); + + ok(r, "No other page is showing"); + + }); + + test("specific page works", function() { + var r; + + $('#topPaging #tPager4').click(); + + equal($('#page4').css('display'), 'block', "Page 4 is showing."); + + r = true; + $('.result-holder > li:not(#page4)').each(function () { + if ($(this).css('display') !== 'none') { + r = false; + } + }); + + ok(r, "No other page is showing"); + + }); + + module("Pager w/ Callbacks", { + setup: function() { + + this.settings = { + pageSize: 2, + start: function() { + $('#pager').addClass('prebuild'); + }, + end: function() { + $('#pager').addClass('postbuild'); + }, + before: function() { + $('#pager').addClass('prepage'); + }, + after: function() { + $('#pager').addClass('postpage'); + } + }; + + $('#pager').pager(this.settings); + + $('.next').click(); + + this.pIndex = 1; + } + + }); + + test("start()", function() { + + ok($('#pager').hasClass('prebuild'), "start ran correctly"); + + }); + + test("end()", function() { + + ok($('#pager').hasClass('postbuild'), "end ran correctly"); + + }); + + test("before()", function() { + + ok($('#pager').hasClass('prepage'), "before ran correctly"); + + }); + + test("after()", function() { + + ok($('#pager').hasClass('postpage'), "after ran correctly"); + + }); + + + module("Filtering", { + setup: function () { + + this.settings = { + pageSize: 2 + }; + + $('#pager').pager(this.settings); + + this.pagerReference = $('#pager').pager(this.settings); + + this.pIndex = 1; + } + }); + + test("Applying filter", function () { + + equal($('.pageList').length, 4, "Has four pages"); + + ok(window.pager[0].p.$el.is(this.pagerReference), "It's the pager we're using!"); + + var p = window.pager[0].p; + + p.filter(["2"]); + + equal($('.pageList').length, 2, "Has two pages"); + + p.filter(["2", "3"]); + + equal($('.pageList').length, 0, "Has no pages"); + + }); + + + + // module("Extra Paging stuff", { + // setup: function() { + + // this.settings = { + // pageSize: 2 + // } + + // $('#pager').pager(this.settings); + + // this.pIndex = 1; + // } + // }); + + // test("method calls", function() { + + // }); + +}(jQuery));