{"_id":"refilt","_rev":"37-b07ff556fdde3e3ff69deefb72979a3d","name":"refilt","description":"For filtering and sorting products based on a JSON object.","dist-tags":{"latest":"3.2.5","pre-api":"0.2.16","version-1":"1.11.5"},"versions":{"2.2.0":{"name":"refilt","version":"2.2.0","description":"For filtering and sorting products based on a JSON object.","main":"dev/index.html","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"4d52489e88f54835c090912a0160e677a609bb3b","_id":"refilt@2.2.0","scripts":{},"_shasum":"a94319685294c494e4682edba3e9c8d0a37b9286","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"a94319685294c494e4682edba3e9c8d0a37b9286","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.2.0.tgz","integrity":"sha512-ou4PIw7vcsvLUC05DQwOz4uz38HqWFQwoTAuWfyCLfhj2SbL/eNLohZxqo4IP7M/cUfxyodRX886uYJhjzQQ4g==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGJ1yxikKkBuZL0rewELRZT+yIqz0EFN6pyVgJlHfxk6AiEA8jQUYxALDgDDxFf1Az04NWxQOVmX5CyKd7P2e5C6ivM="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.2.0.tgz_1496152224556_0.08208753145299852"},"directories":{}},"2.2.1":{"name":"refilt","version":"2.2.1","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"96e6e92a1582769088be56babca1e783f83371fd","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.2.1","scripts":{},"_shasum":"6202a55c56d12e71e99304ba51baa4ccab6465f2","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"6202a55c56d12e71e99304ba51baa4ccab6465f2","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.2.1.tgz","integrity":"sha512-yprZQt1zMgbRUXYIioiFQT3z3WkJcrKZBrr9MhkVxCSKPezadh3IK+drjB4BzwsQYHEho8DEyouREF5X36Bzbw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBF00yvO+UVQkodm9yohhru1EdOLoZI6uEq4NWapnhq4AiEAvw0cKZujpNaWa4pFPlbXVsi0CNfrZSC5v94HPF+JVQM="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.2.1.tgz_1496152618939_0.4676009421236813"},"directories":{}},"2.3.0":{"name":"refilt","version":"2.3.0","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"15631ce77594dfc93159cb1305b93309715ab99e","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.0","scripts":{},"_shasum":"27f0215f21247a3278ce82b7088c84fd62395ad3","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"27f0215f21247a3278ce82b7088c84fd62395ad3","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.0.tgz","integrity":"sha512-LjhSpNfCcsD6uoXe1Cm0iSkajkm9F7XQh+WnSOat3QkYUtRggLiw27kJD/H5CGSLKh/d/qD2bStbYe7AjfGhsw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD4AzjSEDKPrGSi0y8HltUVj6L5aCaHqWEfPrP4J6aX8QIgYycTjaJ8QIbRwsZ2RIV24JCNC67nuOiiut8+pnYpCc4="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.0.tgz_1497557867236_0.604419958544895"},"directories":{}},"2.3.1":{"name":"refilt","version":"2.3.1","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"bafd2fb9487dc61b594306dfeed34bc512eff8ac","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.1","scripts":{},"_shasum":"0b5a511283205d7b21ad07e6f9e1e6ad9ab135a4","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"0b5a511283205d7b21ad07e6f9e1e6ad9ab135a4","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.1.tgz","integrity":"sha512-TL7HiHsMx0wOKkm5rLxVSR8Hfb3wvNzDXMYG1QHP0uNPjvlxl9o7ZvNZum0/zDy1v486rDEwQOpPGCqtyFmuYA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHaLKwgoI8Vowr0zFcVZ6dkTRfXmEKmRUUrp09HPyFY8AiAEdbeW88Py07wImfcTzwVx9GSgfQRC8HinIXpZZb/ETQ=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.1.tgz_1497558223815_0.3978984684217721"},"directories":{}},"2.3.2":{"name":"refilt","version":"2.3.2","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"ae5d8a6b0b8074fd6b94ce7ac2e230936c99eab6","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.2","scripts":{},"_shasum":"8190346f70605dfd502489b147023054198902ed","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"8190346f70605dfd502489b147023054198902ed","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.2.tgz","integrity":"sha512-l4qOVGZyVfuME5mRtbOO+Dx54Zhsn00fdvuNoN2xtgYVRrrIe65hauQKN/w89JTi0Rd7nxPOCoJ6+LnsO6eewQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCqqvKjceMFbO1lxWCsgccV9Lw9hWxFgwrgGgH/RoeX+wIhAOXtu+AgLiCiyB2lLQ0lUNQoiTbLD7BwREHBAgJXQMgi"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.2.tgz_1499610890589_0.7978730476461351"},"directories":{}},"2.3.3":{"name":"refilt","version":"2.3.3","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"e028391de23a83d83612f33148f4cde48942e106","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.3","scripts":{},"_shasum":"53cbf61976a0da0b2442e3c7fb1309568cad0f7f","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"53cbf61976a0da0b2442e3c7fb1309568cad0f7f","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.3.tgz","integrity":"sha512-P/2brWfxE1Kl1IjLXjuUrV6ymrIXm3zf6XNBsTUM6a6W8slUmnzL2i1nU8gy5NiCuKa+NEXEJC4bBcD3aQOprg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDkLRCz48NhgK3uHPFBnmCdTvQb5o0Nq3oy0fJaedGIfwIgcCtO/JX6Z8mG0N8eGoKJtT7zbO5QafRaiQmqvKFKC70="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.3.tgz_1499612234856_0.148155182832852"},"directories":{}},"2.3.4":{"name":"refilt","version":"2.3.4","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"f1b66eeff5861555a3e3f8ca581e986f180bb917","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.4","scripts":{},"_shasum":"0ae75cb7cf640157c2501c47e8259c0ede7ab815","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"0ae75cb7cf640157c2501c47e8259c0ede7ab815","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.4.tgz","integrity":"sha512-FycUoxCCbP/JBasDUXnqXbaf5TjKrkVj4DQEYf4AfBvo0QnU9kBk7FS+snt119molpNGhw7vb1k+OnuW39TXog==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCKCTNsE8c33h6o7/3tjfOdIDbINGxdscQC5cnLTSGFVQIgP9/7WpD9Hegf5P6OMyVdmaDDwJvIG0mYtU/kmUfBtD0="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.4.tgz_1499625716452_0.0032902939710766077"},"directories":{}},"2.3.5":{"name":"refilt","version":"2.3.5","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"9daa78ef9a82fe02936aa502a15fcd0da972945d","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.5","scripts":{},"_shasum":"91027902b0d585a1832724c65ea7decd171a9dd1","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"91027902b0d585a1832724c65ea7decd171a9dd1","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.5.tgz","integrity":"sha512-vJcGdDBVLI+QIGQIjtTfG8K9BRFR6KkorI6rG4pODeuvYvAkvphq3ELVHYkqlcj3WsSJR21UsC689kKoftaZvg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAZFujcrALkXZwNnku6RGXXIipR92A1WcjByNsKt5rmsAiB4Mms83nrN76xiOohpfSHyLfIIiVzWvoCtPJtMjMGjZA=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.5.tgz_1499627862881_0.4700723825953901"},"directories":{}},"2.3.6":{"name":"refilt","version":"2.3.6","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"7db68a75c07966ce8a8a7ebe213603b3ae659b69","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.6","scripts":{},"_shasum":"56288dc5a4a44595caee67e5e1993a44b2cc7186","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"56288dc5a4a44595caee67e5e1993a44b2cc7186","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.6.tgz","integrity":"sha512-KGZXMNByemkx4jewf0CKhDOS6nLN8kdTYQjJGxGB2pRetkLerKy7kkUnvPWNJ0JsGmKxexnmvRhRSPVCCenEvQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCIFSYcA0AEtHCLuo3dqUPsiynF5r0TzgZX9NeNxWnduslAh8eljMsqYNRpJEyUVEytYMRvOsJd7/h/bjyGrpGxpBY"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.6.tgz_1499628563441_0.3766687964089215"},"directories":{}},"2.3.7":{"name":"refilt","version":"2.3.7","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"fe6522ea764f3b9096b7e7ff40e398fe5a3e0bfc","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.7","scripts":{},"_shasum":"5ad6aa25c321e6f214b3c7bb3b92c72f2538dc6d","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"5ad6aa25c321e6f214b3c7bb3b92c72f2538dc6d","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.7.tgz","integrity":"sha512-6AG9lj5xFnliNnBb1LsRT7OKL6WDEJbeZJSzIpiuDnEiLhkuHbqk8vSaqVB6w0j+fQ6P1QYq2ePm/ZXSvCDctg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCSihclteZCW0tL8mXSQBo5OffIb29Yt045fQx4Ruu7/gIgGDgOtMIKh6yceLZzW7xF6QLqhbYApD6QXcLA1OdVUdQ="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.7.tgz_1499891141793_0.24237199896015227"},"directories":{}},"2.3.8":{"name":"refilt","version":"2.3.8","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"1f95399cd53d0ff0c761d9713c5fd2d6ec924dc0","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.8","scripts":{},"_shasum":"1a31d922e6597dd3181192536d6ef81afcb8bc32","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"1a31d922e6597dd3181192536d6ef81afcb8bc32","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.8.tgz","integrity":"sha512-XMW1vCoOert8YB/kx08pTrq09CZc5jvVsH06+0c+XLm0lEvKcUrUCBP4BMnS1TxDnjxUyK8NMI7MXwAAz81igA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeT0PqW2Hu21xW8Xvi11OSjGcafjylN8O+XSNdlt8vWAIhAKuEISag7Kv0nuQDU2zM7sGTjoPgPjQ8S7su5EWN3QwO"}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.8.tgz_1500293621181_0.6131608600262552"},"directories":{}},"2.3.9":{"name":"refilt","version":"2.3.9","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"6da9799389b644ded061ab75390b10c21b563f24","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@2.3.9","scripts":{},"_shasum":"891848b9d692426afa07707f9c4d670cd517b1fd","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"891848b9d692426afa07707f9c4d670cd517b1fd","tarball":"https://registry.npmjs.org/refilt/-/refilt-2.3.9.tgz","integrity":"sha512-8xJuxHSSxWYCx4jcNfzFOYkQdsDEqqFD1vac5cVbzZFycRiHILoxFNjwApROGLm5yEXJfaYdSrhmIyQJEgJBGg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDaJsqedBAceGCuneBoNOGSnqUyzrI15P+30f2MwoInJAiBYh5CiWbx8szrHdOZfiWz3RbeADjQvGdDVi/Bu9U1/FA=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-2.3.9.tgz_1500471325608_0.4431726897601038"},"directories":{}},"3.0.0":{"name":"refilt","version":"3.0.0","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"49aebd7384bfb6d6e43173ddc343749b2bc3e579","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.0.0","scripts":{},"_shasum":"f75cfb215331f49d6c7c20c61aaef54b39abc254","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"f75cfb215331f49d6c7c20c61aaef54b39abc254","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.0.0.tgz","integrity":"sha512-QkCCGcPUxXEvogLdc4Q52OeGwop51SvZiKPLtG2rlehkNTBp2qsG2Sp1GcT8msBatgfgGXSoxdhal8SNpcN+4w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC90hVJKY+a5JjB6NRgSKr47gRUB60l70idPT53ZyiZ+QIgdMH0C7R6T+aczYFuYwRpGYmtX3Few8GKGvlHEFY7VE4="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-3.0.0.tgz_1508136727696_0.26738621573895216"},"directories":{}},"3.0.1":{"name":"refilt","version":"3.0.1","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"38408d66568a558943f3600a07bf108575bb3f0d","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.0.1","scripts":{},"_shasum":"dc0bdbe6aa49a0393b36ffc854b6e5f404aa50b6","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"dc0bdbe6aa49a0393b36ffc854b6e5f404aa50b6","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.0.1.tgz","integrity":"sha512-ae7wjoFqvOKs4rC0ZIDG/rxrMfZfM/ZQyR3Wa45HfAEj3b+DQIUHk6ryLTGgXXZIabAiooenSe4FlgaWAskEWA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBMzGWhFIyVwHmLO7kHhB6BCFNeIKTIKbPgzS3SCAIPzAiBYsLNhqq+rnPfU9a7apTyJDjJD3htalKyCuNwcQN64Cw=="}]},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt-3.0.1.tgz_1509095656890_0.4517425103113055"},"directories":{}},"3.0.2":{"name":"refilt","version":"3.0.2","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"8a6ac2f40b3a6ca68437abd9c611f24628292f35","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.0.2","scripts":{},"_shasum":"29ac57da443bdc7e6e3569f03d2b4252f5404f9a","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"29ac57da443bdc7e6e3569f03d2b4252f5404f9a","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.0.2.tgz","fileCount":19,"unpackedSize":507558,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa5y5TCRA9TVsSAnZWagAAJ48P/09YiQvv/P8t6JOIf3T3\n5ZJUNouT6zc5DZ9//dY3F4c0wteScxXf08Ud/BMjdVWp4saPxRn9UPRxOYH/\nwLpDBoEGLzH7ooQf9ycH3J3+hTtW8iOgC7jwxboIjB8l+7w7R3K3ulcQaq1t\nTiBVmXPwK1DN2qmELUENx9OOi97A6mOtpatunAGPCL8sghGndbqNm4gsZ9A8\n7ODWyxAmKU/S4nxsyUMYQDwSENwXY8BHg6hezMuoLykjnvgg3PQUOWBaY230\ntat9uwzEVJMkmsSAgvAirzWLQEfHf49wuZ/yxb2a5pSDxBprKR0/ysni+IBr\nnHrg7ABeM6pCiOs3Qmhr1eFw4nFMOlB5xX+CvT3y5UAZPLmGlmrP9bg/dt37\nplakXV82+kK2nRdyIP3v2l1SDskveaQAkXDqD0QCDXlIRuV1nNQxRTercCqK\nEAL7QMdZWeSKRRp5MYQ85ldKRMaKfz9NJJUzSLRGKxpqhLgdKnnIcu6kdjn9\nWvUk5CqK1YVOMGzg0JYVjYXXbnLlReEHIs8Yewdkap7bXvg0r4y9ryZ65/+c\nJ4u3RTXBw/ay9Vy45wbwAIM/A9DS5TIJi3EvwjZxRi7q/bwUZ2BTKryJ2Igo\nZ7vovPHSllGbzHQiQB4NlehmT7r7UVx/kwsFuqs2LHTYrGAk2xIHZz58LFjz\nssgA\r\n=SHyh\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-e/+4i282rGww4uePdt8kEkiYTeVcy0RfE834xBxHeK1iB3K5q8ggdg4zkPQ/py1tX7qYGUGzhYCW0XmPxHKWBw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGJcQD8gF2rLCrEQbUxvUHTa5p+MsZxvOj+8XowEsrS0AiAWD7exs2RzWGkENBIHDW2nmNu89SGwCh9jTe9K2BQ3gQ=="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.0.2_1525100115265_0.2486826661514483"},"_hasShrinkwrap":false},"0.2.15":{"name":"refilt","version":"0.2.15","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git+ssh://git@github.com/coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^0.9.1","gulp":"^3.8.1","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^0.7.2","gulp-uglify":"^0.3.0"},"readme":"# ysFilter - For filtering and sorting products returned from Silk API. #\n\nA jQuery plugin that asynchronously loads in a JSON of all the product data in the current category. The plugin is able to be manipulated with a range of callbacks and properties that allow you to change the default properties.\n\n### Usage ###\n\n\nInitiate with `$(selector).ysFilter({'some':'property'});`   \nInvoke methods with `$(selector).ysFilter('method', {'some':'property'});`   \nExample\n\n\t$('.prod-pics-sect').ysFilter({\n\t\tdebug: true,\n\t\tzIndex: 2000\n\t})\n \n\n### HTML ###\n\nThis is the basic page structure required for the filter to work.\n\t\n\t<div id=\"filter-container\" data-url=\"\">\n\t     <!-- All things related to filter are collected here. -->\n\t     <div class=\"filter-group\" data-type=\"\">\n\t         <div id=\"color\" class=\"filter-group\" data-type=\"<!-- See \"Data Types\" below -->\" data-create=\"<!-- See \"Data Create\" below -->\"></div>\n\t         <!-- id === desc->param_types repeat above if needed -->\n\t     </div>\n\t     <div class=\"paging\">\n\t         <a class=\"next\"></a>\n\t         <a class=\"prev\"></a>\n\t     </div>\n\t     <div class=\"item-container\">\n\t         <!-- items must come directly after parent -->\n\t     <div>\n\t</div>\n\nThe following structure you can use in combination with Emmet for tab completion.\n\n\tdiv#filter-container[data-url=\"\"]>div.filter-group[data-type=\"\"]+div.paging>a.next+a.prev^div.item-container\n\n### Properties ###\n\n\n#### limit ####\n\n*Default* `20`  \n*Expects* `integer`\n\nHow many items to be rendered per page.\n\n\t$(selector).ysFilter({limit: 20})\n\n#### splitSizes ####\n\n*Default* `false`  \n*Expects* `false, wrapper`\n\nSplits sizes into groups based on size chart otherwise they are presented as one group.\n\n\t$(selector).ysFilter({splitSizes: false})\n\n#### appendItems ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nWhether to replace items or to append new items with regards to paging.\n\n\t$(selector).ysFilter({appendItems: false})\n\n#### updateWHash ####\n\n*Default* `false`  \n*Expects* `false, class`\n\nUpdate other elements on the page by appending hash to those URL's like e.g. product URL's.\n\n\t$(selector).ysFilter({updateWHash: false})\n\n#### filterOptions ####\n\n*Default* `{}`  \n*Expects* `object with nested objects`\n\nExtend filter HTML with predefined variables. See Filter Variables below.\n\n\t$(selector).ysFilter({filterOptions: {\n\t\tcolor: {\n\t\t\tbackground: true\n\t\t}\n\t}})\n\n#### multipleImgs ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({multipleImgs: false})\n\n#### eachItemAttrs ####\n\n*Expects* `function($this, items[i], i)`\n\nAdd / manipulate obj that renders the template.\nExtend object with new properties and add new curly braces in the template that match these.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachItemAttrs: function($this, currentItem, i) {\n\t\t//Manipulate Item\n\t\treturn currentItem;\n\t}})\n\n#### eachFilterAttrs ####\n\n*Expects* `function(valObj)`\n\nAdd extra items to each item rendered.\nReplace strings, only *desc* is supported at the moment.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachFilterAttrs: function(currentItem) {\n\t\t//Manipulate Filter Item\n\t\treturn currentItem;\n\t}})\n\n#### afterFilterRendered ####\n\n*Expects* `function()`\n\nCreate a callback to allow extra functionality after filters are built.\n\n\t$(selector).ysFilter({afterFilterRendered: function() {\n\t\t//Do something now. (uniform, chosen)\n\t}})\n\n#### afterItemsRendered ####\n\n*Expects* `function()`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({afterItemsRendered: function() {\n\t\t//Do something after products are loaded.\n\t}})\n\n#### onFilterChanged ####\n\n*Expects* `function()`\n\nCallback to update filter styles manually after changes.\n\n\t$(selector).ysFilter({onFilterChanged: function() {\n\t\t//Do something after filtering is finished.\n\t}})\n\n### Template Options ###\n\nThe template options allows you to customize the filter methods with extra classes wrap the filters with different containers etc. All following properties should be placed within `filter-id: {}`. The filter-id should pertain to the filter name i.e. `color`, `size`.\n\n**Property** `classNames: []`  \nExtra classes in addition of the default `filter-value`\n\n**Property** `background: true`  \nIf background-image/color should be used or text, useful when create a filter list for colors.\n\n**Property** `attrs: []`  \nAdd attributes in string format with {} for replacing, {desc}\n\n**Property** `wrapperGroup: '<div class=\"wrap\">'`  \nWrap all objects for the filter.\n\n**Property** `wrapper: '<div class=\"wrap\">'`  \nWrap repeating objects. Wraps each individual item.\n\n**Property** `inner: '<div class=\"group\">'`  \nWrapper per group, groups appear in sizes and categories. This does not wrap the whole filter only a group within that filter.\n\n\n### Data Types ###\n\nThe following functions are used with the attribute `data-type=\"\"`. Data type are methods of the filter defining how this filter interacts with the data. Not all data-types have been created. If none have been chosen the **default** is `s1` which means select only one.\nExample:\n\n\t<div id=\"color\" data-type=\"s1\" data-create=\"a\"></div>\n\n#### s1 - select-one ####\n\n**As seen in URL** `#cat~s1=value`\n\nThis limits the filter to only allow one item to be chosen at a time other items are deselected when another is clicked. If the selected item is clicked again that item is deselected.\n\n\n#### sand - select-and ####\n\n**As seen in URL** `#cat~sand=value+value1+value2`\n\nmulti selectable within group.\nrefines selection, all values must be met to show article.\n\n\n#### sor - select-or ####\n\n**As seen in URL** `#cat~sor=value,value1,value2`\n\nmulti selectable within group.\ngrows selection, selected article needs to only meet one value\n\n\n#### r - range ####\n\n**As seen in URL** `#cat~r=value_min,valuemax`\n\nshow items bounds two values need to be presented\ncan be used in conjuction with min and max to get lower and upper bounds respectively\n\n\n#### s - sort ####\n\n**As seen in URL** `#sort~s=value,dir`\n\ndirection and what is to be sorted.\n\n\n#### f - fuzzy ####\n\n**As seen in URL** `#cat~f=value,spread`\n\nchoose a value\nspread of values\n\n### Data Create ###\n\n\n#### a ####\n\nCreate anchor tags\nHTML using Emmet:\n\n\ta\n\n\n#### fakeSelect ####\n\nDrop down with anchor tags, use in conjunction with rekaf.\nHTML using Emmet:\n\t\n\tdiv>span+ul>li>a\n\n\n#### select ####\n\nNormal select use afterFilterRendered callback to turn them into uniform selects\nHTML using Emmet:\n\n\tselect>option\n\n\n#### radio ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=radio]+label\n\n\n#### checkbox ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=checkbox]+label\n\n\n#### Classes ####\n\nNumerous classes can be reassigned. Check the `defaultOpts {}` as to which classes are able to be manipulated.\n\n\n### Changelog ###\n\n**Version 0.2.14**\nAdded events and pagination for specific page links.\n\n**Version 0.2.13**\nMinor fix to the top_category_uri variable. Now checks if it is present.\n\n**Version 0.2.12**\nNow possible to add {chart} to size wrapper to get the names of the size charts when using JSParamSizeChart.\n\n**Version 0.2.11**\nUse {top_category_uri} to get deeper links for products. Filter was limited to 2 levels of category rendering previously now a third is added. Categories are connected back to front.\n\n**Version 0.2.10**\nAdded a new check for sale products to ensure correct price sorting.\n\n**Version 0.2.9**\nUpdated pagination to work in the same way that the master branch works for simplicity sake. Fixed a few linting issues.\n\n**Version 0.2.8**\nAdded non-minified version of plugin to the dist folder and edited the dependency version of jQuery.\n\n**Version 0.2.7** \nAdded click event when using type=checkboxes in .filter-group.\n\n**Version 0.2.6** \nTidied up several issues. All product URL's hashes are updated on filter change. Price is now sorted with sale prices also. Fixed issues on first load of products.\n\n**Version 0.2.5** \nFixed an issue regarding reloading of category products. Not all products were reloaded.\n\n**Version 0.2.4** \nFixed problems with urls not assigning root correctly. Fixed sort of currencies that are prefixed with something other than a number. Fixed fallback for filters when sort was first selected. Also added `ysFilter-init` as a class on the filter.\n\n**Version 0.2.3** \nPaging problems. Hash didn't have parseInt. Special use case for images where the image was connected to a variant despite there being no variants.\n\n**Version 0.2.2** \nMoved replace items on first load to do it only on `debug: true` added possibility for remove button to be a sibling.\n\n**Version 0.2.1** \nFixed on remove of last item in filter category, filter options are refreshed right, previously only worked on .remove before.\n\n**Version 0.2** \nAdded multi select as an option in filter, added a new listener for on change of filter.\n\n**Version 0.1.3** \nPages now show up in URL. Possible to load in to that page.\n\n**Version 0.1.2** \nFixed a bug with color being read as an array and outputted as a string\n\n**Version 0.1.1** \nFixed category parsing, was removing a letter if there was only one category.\n\n\n### Development ###\n\n**Requirements**\n* This plugin requires [node](http://nodejs.org/), [gulpjs](http://gulpjs.com/) and [bower](http://bower.io/).\n* Follow JSCS guidelines a styling-example.js is also included.\n* Run `bower install` and `npm install` to get dev dependencies. Bower and Gulp is assumed to be running globally.\n\n### Contact ###\n\nThis is a small plugin by Young Skilled.\nContact [richard](mailto:richard@youngskilled) for more details about this plugin.\n","readmeFilename":"README.md","gitHead":"a60571d8a811179687cf8d7696c3f238d4bdb120","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@0.2.15","scripts":{},"_shasum":"3c927bd6b0401fc20be8d678113a87644a7803af","_from":".","_npmVersion":"3.10.3","_nodeVersion":"6.7.0","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"3c927bd6b0401fc20be8d678113a87644a7803af","tarball":"https://registry.npmjs.org/refilt/-/refilt-0.2.15.tgz","fileCount":20,"unpackedSize":402491,"integrity":"sha512-JTHGthG8gbPeC0WvNkcwqJtbf014uvkITJRO0RSQ9uzLELcGM7cdgRgoUkMIQ7iqkZ3YPJSYAQiH8m4C14RcNg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjUZKF625Jre2krk/scl2C49wWWveCn/R3/5Bqn2eo6QIhANAG4ZLaIc56ot39saTA8WHPmPDajoVuxICwDHnNzCPS"}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_0.2.15_1530533453528_0.12573965247698826"},"_hasShrinkwrap":false},"0.2.16":{"name":"refilt","version":"0.2.16","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^0.9.1","gulp":"^3.8.1","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^0.7.2","gulp-uglify":"^0.3.0"},"readme":"# ysFilter - For filtering and sorting products returned from Silk API. #\n\nA jQuery plugin that asynchronously loads in a JSON of all the product data in the current category. The plugin is able to be manipulated with a range of callbacks and properties that allow you to change the default properties.\n\n### Usage ###\n\n\nInitiate with `$(selector).ysFilter({'some':'property'});`   \nInvoke methods with `$(selector).ysFilter('method', {'some':'property'});`   \nExample\n\n\t$('.prod-pics-sect').ysFilter({\n\t\tdebug: true,\n\t\tzIndex: 2000\n\t})\n \n\n### HTML ###\n\nThis is the basic page structure required for the filter to work.\n\t\n\t<div id=\"filter-container\" data-url=\"\">\n\t     <!-- All things related to filter are collected here. -->\n\t     <div class=\"filter-group\" data-type=\"\">\n\t         <div id=\"color\" class=\"filter-group\" data-type=\"<!-- See \"Data Types\" below -->\" data-create=\"<!-- See \"Data Create\" below -->\"></div>\n\t         <!-- id === desc->param_types repeat above if needed -->\n\t     </div>\n\t     <div class=\"paging\">\n\t         <a class=\"next\"></a>\n\t         <a class=\"prev\"></a>\n\t     </div>\n\t     <div class=\"item-container\">\n\t         <!-- items must come directly after parent -->\n\t     <div>\n\t</div>\n\nThe following structure you can use in combination with Emmet for tab completion.\n\n\tdiv#filter-container[data-url=\"\"]>div.filter-group[data-type=\"\"]+div.paging>a.next+a.prev^div.item-container\n\n### Properties ###\n\n\n#### limit ####\n\n*Default* `20`  \n*Expects* `integer`\n\nHow many items to be rendered per page.\n\n\t$(selector).ysFilter({limit: 20})\n\n#### splitSizes ####\n\n*Default* `false`  \n*Expects* `false, wrapper`\n\nSplits sizes into groups based on size chart otherwise they are presented as one group.\n\n\t$(selector).ysFilter({splitSizes: false})\n\n#### appendItems ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nWhether to replace items or to append new items with regards to paging.\n\n\t$(selector).ysFilter({appendItems: false})\n\n#### updateWHash ####\n\n*Default* `false`  \n*Expects* `false, class`\n\nUpdate other elements on the page by appending hash to those URL's like e.g. product URL's.\n\n\t$(selector).ysFilter({updateWHash: false})\n\n#### filterOptions ####\n\n*Default* `{}`  \n*Expects* `object with nested objects`\n\nExtend filter HTML with predefined variables. See Filter Variables below.\n\n\t$(selector).ysFilter({filterOptions: {\n\t\tcolor: {\n\t\t\tbackground: true\n\t\t}\n\t}})\n\n#### multipleImgs ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({multipleImgs: false})\n\n#### eachItemAttrs ####\n\n*Expects* `function($this, items[i], i)`\n\nAdd / manipulate obj that renders the template.\nExtend object with new properties and add new curly braces in the template that match these.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachItemAttrs: function($this, currentItem, i) {\n\t\t//Manipulate Item\n\t\treturn currentItem;\n\t}})\n\n#### eachFilterAttrs ####\n\n*Expects* `function(valObj)`\n\nAdd extra items to each item rendered.\nReplace strings, only *desc* is supported at the moment.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachFilterAttrs: function(currentItem) {\n\t\t//Manipulate Filter Item\n\t\treturn currentItem;\n\t}})\n\n#### afterFilterRendered ####\n\n*Expects* `function()`\n\nCreate a callback to allow extra functionality after filters are built.\n\n\t$(selector).ysFilter({afterFilterRendered: function() {\n\t\t//Do something now. (uniform, chosen)\n\t}})\n\n#### afterItemsRendered ####\n\n*Expects* `function()`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({afterItemsRendered: function() {\n\t\t//Do something after products are loaded.\n\t}})\n\n#### onFilterChanged ####\n\n*Expects* `function()`\n\nCallback to update filter styles manually after changes.\n\n\t$(selector).ysFilter({onFilterChanged: function() {\n\t\t//Do something after filtering is finished.\n\t}})\n\n### Template Options ###\n\nThe template options allows you to customize the filter methods with extra classes wrap the filters with different containers etc. All following properties should be placed within `filter-id: {}`. The filter-id should pertain to the filter name i.e. `color`, `size`.\n\n**Property** `classNames: []`  \nExtra classes in addition of the default `filter-value`\n\n**Property** `background: true`  \nIf background-image/color should be used or text, useful when create a filter list for colors.\n\n**Property** `attrs: []`  \nAdd attributes in string format with {} for replacing, {desc}\n\n**Property** `wrapperGroup: '<div class=\"wrap\">'`  \nWrap all objects for the filter.\n\n**Property** `wrapper: '<div class=\"wrap\">'`  \nWrap repeating objects. Wraps each individual item.\n\n**Property** `inner: '<div class=\"group\">'`  \nWrapper per group, groups appear in sizes and categories. This does not wrap the whole filter only a group within that filter.\n\n\n### Data Types ###\n\nThe following functions are used with the attribute `data-type=\"\"`. Data type are methods of the filter defining how this filter interacts with the data. Not all data-types have been created. If none have been chosen the **default** is `s1` which means select only one.\nExample:\n\n\t<div id=\"color\" data-type=\"s1\" data-create=\"a\"></div>\n\n#### s1 - select-one ####\n\n**As seen in URL** `#cat~s1=value`\n\nThis limits the filter to only allow one item to be chosen at a time other items are deselected when another is clicked. If the selected item is clicked again that item is deselected.\n\n\n#### sand - select-and ####\n\n**As seen in URL** `#cat~sand=value+value1+value2`\n\nmulti selectable within group.\nrefines selection, all values must be met to show article.\n\n\n#### sor - select-or ####\n\n**As seen in URL** `#cat~sor=value,value1,value2`\n\nmulti selectable within group.\ngrows selection, selected article needs to only meet one value\n\n\n#### r - range ####\n\n**As seen in URL** `#cat~r=value_min,valuemax`\n\nshow items bounds two values need to be presented\ncan be used in conjuction with min and max to get lower and upper bounds respectively\n\n\n#### s - sort ####\n\n**As seen in URL** `#sort~s=value,dir`\n\ndirection and what is to be sorted.\n\n\n#### f - fuzzy ####\n\n**As seen in URL** `#cat~f=value,spread`\n\nchoose a value\nspread of values\n\n### Data Create ###\n\n\n#### a ####\n\nCreate anchor tags\nHTML using Emmet:\n\n\ta\n\n\n#### fakeSelect ####\n\nDrop down with anchor tags, use in conjunction with rekaf.\nHTML using Emmet:\n\t\n\tdiv>span+ul>li>a\n\n\n#### select ####\n\nNormal select use afterFilterRendered callback to turn them into uniform selects\nHTML using Emmet:\n\n\tselect>option\n\n\n#### radio ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=radio]+label\n\n\n#### checkbox ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=checkbox]+label\n\n\n#### Classes ####\n\nNumerous classes can be reassigned. Check the `defaultOpts {}` as to which classes are able to be manipulated.\n\n\n### Changelog ###\n\n**Version 0.2.16**\nFixed selected class on fake select filters.\n\n**Version 0.2.15**\nAdded pre-api branch to NPM.\n\n**Version 0.2.14**\nAdded events and pagination for specific page links.\n\n**Version 0.2.13**\nMinor fix to the top_category_uri variable. Now checks if it is present.\n\n**Version 0.2.12**\nNow possible to add {chart} to size wrapper to get the names of the size charts when using JSParamSizeChart.\n\n**Version 0.2.11**\nUse {top_category_uri} to get deeper links for products. Filter was limited to 2 levels of category rendering previously now a third is added. Categories are connected back to front.\n\n**Version 0.2.10**\nAdded a new check for sale products to ensure correct price sorting.\n\n**Version 0.2.9**\nUpdated pagination to work in the same way that the master branch works for simplicity sake. Fixed a few linting issues.\n\n**Version 0.2.8**\nAdded non-minified version of plugin to the dist folder and edited the dependency version of jQuery.\n\n**Version 0.2.7** \nAdded click event when using type=checkboxes in .filter-group.\n\n**Version 0.2.6** \nTidied up several issues. All product URL's hashes are updated on filter change. Price is now sorted with sale prices also. Fixed issues on first load of products.\n\n**Version 0.2.5** \nFixed an issue regarding reloading of category products. Not all products were reloaded.\n\n**Version 0.2.4** \nFixed problems with urls not assigning root correctly. Fixed sort of currencies that are prefixed with something other than a number. Fixed fallback for filters when sort was first selected. Also added `ysFilter-init` as a class on the filter.\n\n**Version 0.2.3** \nPaging problems. Hash didn't have parseInt. Special use case for images where the image was connected to a variant despite there being no variants.\n\n**Version 0.2.2** \nMoved replace items on first load to do it only on `debug: true` added possibility for remove button to be a sibling.\n\n**Version 0.2.1** \nFixed on remove of last item in filter category, filter options are refreshed right, previously only worked on .remove before.\n\n**Version 0.2** \nAdded multi select as an option in filter, added a new listener for on change of filter.\n\n**Version 0.1.3** \nPages now show up in URL. Possible to load in to that page.\n\n**Version 0.1.2** \nFixed a bug with color being read as an array and outputted as a string\n\n**Version 0.1.1** \nFixed category parsing, was removing a letter if there was only one category.\n\n\n### Development ###\n\n**Requirements**\n* This plugin requires [node](http://nodejs.org/), [gulpjs](http://gulpjs.com/) and [bower](http://bower.io/).\n* Follow JSCS guidelines a styling-example.js is also included.\n* Run `bower install` and `npm install` to get dev dependencies. Bower and Gulp is assumed to be running globally.\n\n### Contact ###\n\nThis is a small plugin by Young Skilled.\nContact [richard](mailto:richard@youngskilled) for more details about this plugin.\n","readmeFilename":"README.md","gitHead":"649a4aeb1600156da1c5be3b5d370b4b96f2c2b1","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@0.2.16","scripts":{},"_shasum":"e1b01d664d197873938006545ef4c0dc31f29ee1","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"e1b01d664d197873938006545ef4c0dc31f29ee1","tarball":"https://registry.npmjs.org/refilt/-/refilt-0.2.16.tgz","fileCount":20,"unpackedSize":403946,"integrity":"sha512-H+NPf3yz4y2nBGmebHUcaEv/BjvmMwK5VNCiiamXxH+Qwh6p1TW5qmwOTVbUj0cg2hWmndToR7Baw1od4Q2giw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDeyd5lC9gdW00+sDD8AHCD9lcDPBBIOp6LzqhXxgjdBwIhAO6CSyNz8+BMp8gvoaRaOyiWBZRlqGsLaTyxeTEm+Gsl"}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_0.2.16_1530793991778_0.2597290181247187"},"_hasShrinkwrap":false},"1.11.2":{"name":"refilt","version":"1.11.2","description":"For filtering and sorting products returned from Silk API.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"readme":"# ysFilter - For filtering and sorting products returned from Silk API. #\n\nA jQuery plugin that asynchronously loads in a JSON of all the product data in the current category. The plugin is able to be manipulated with a range of callbacks and properties that allow you to change the default properties.\n\n## Background ##\n\nBeneath the whole filter is a very basic html product list with the only functionality being paging. Products are ideally only shown once and URL's are kept to a minimum. This follows our philosophy at Young/Skilled that a website should be perfectly accessible with javascript even turned off. \nThis means when the page is indexed the default HTML page is the only page that is indexed because the javascript adds all the functionality in a separate layer. \nTo enable sharing the page's hash is updated every time a filter selection is made which is not seen by a search engine as being a new page. This is also semantically correct in that we are effectively just showing the same content, similar to how an anchor shows the same content but a different section of that content.\nThis plugin uses a JSON string that has all the information for all the products that are displayed. On every filtering the results are shown nearly instantly as there are no requests being sent or received making the filter more responsive.\n\n\n### Dependencies ###\nECMAScript > 5.1\njQuery > 1.7\n\n\n### Usage ###\n\nInitiate with `$(selector).ysFilter({'some':'property'});`   \nInvoke methods with `$(selector).ysFilter('method', {'some':'property'});`   \nAll classes and ids used in properties should omit `.` and `#`\nExample\n\n\t$('#ysFilter').ysFilter({\n\t\tdebug: true,\n\t\tappendItems: true\n\t});\n \n\n### HTML ###\n\nThis is the basic page structure required for the filter to work.\n\t\n\t<div id=\"ysFilter\" data-url=\"\" data-category=\"\">\n    <div class=\"filterControls\" data-type=\"\">\n      <div id=\"color\" class=\"filterControls-group\" data-type=\"<!-- See \"Data Types\" below -->\" data-create=\"<!-- See \"Data Create\" below -->\">\n        <!-- HTML is appended here so it's ok to have elements here. -->\n        <!-- Each value receives class filterControls-value -->\n      </div>\n      <!-- id === filterDescriptions[key] repeat above if needed -->\n    </div>\n    <div id=\"filterItems\">\n      <!-- items must come directly after parent there shouldn't be any container surrounding these -->\n    <div>\n    <nav class=\"filterPaging\">\n      <a class=\"filterPaging-prev\"></a>\n      <a class=\"filterPaging-all\"></a>\n      <a class=\"filterPaging-next\"></a>\n    </nav>\n\t</div>\n\nFollowing classes are added to the filter during different phases.  \n`ysFilter--loading`,`ysFilter--init`,`ysFilter--filtered`,`ysFilter--loaded`\n\n\nThe following structure you can use in combination with Emmet for tab completion.\n\n\tdiv#ysFilter[data-url=\"\" data-category=\"\"]>div.filterControls[data-type=\"\"]+div#filterItems+div.filterPaging>a.filterPaging-prev+a.filterPaging-all+a.filterPaging-next\n\n### Properties ###\n\n\n#### limit ####\n\n*Default* `20`  \n*Expects* `integer`\n\nHow many items to be rendered per page.\n\n\t$(selector).ysFilter({limit: 20})\n\n#### splitSizes ####\n\n*Default* `false`  \n*Expects* `false, wrapper`\n\nSplits sizes into groups based on size chart otherwise they are presented as one group.\n\n\t$(selector).ysFilter({splitSizes: false})\n\n#### appendItems ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nWhether to replace items or to append new items with regards to paging.\n\n\t$(selector).ysFilter({appendItems: false})\n\n#### updateWHash ####\n\n*Default* `false`  \n*Expects* `false, class`\n\nUpdate other elements on the page by appending hash to those URL's like e.g. product URL's.\n\n\t$(selector).ysFilter({updateWHash: false})\n\n#### filterOptions ####\n\n*Default* `{}`  \n*Expects* `object with nested objects`\n\nExtend filter HTML with predefined variables. See Filter Variables below.\n\n\t$(selector).ysFilter({filterOptions: {\n\t\tcolor: {\n\t\t\tbackground: true\n\t\t}\n\t}})\n\n#### multipleImgs ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({multipleImgs: false})\n\n#### onItemIndex ####\n\n*Default* `undefined`  \n*Expects* `integer`\n\nUsed in conjunction with onItem. After a certain amount of products built do this.\n\n#### outputChosenFiltersId ####\n\n*Default* `false`  \n*Expects* `false, id`\n\nSpecify a container where you would like the current filters which are selected to be outputted. If in the filter controls you have an anchor it will copy that with all the classes removing any ID's into this field. Otherwise it will create an anchor per filter.\n\n\t$(selector).ysFilter({outputChosenFiltersId: 'js-filtersChosen-list'})\n\n#### forceHex ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nMake the renderer use hex when rendering products and filter. Used in conjunction with background color/images for related products and color filter controls.\n\n\t$(selector).ysFilter({forceHex: false})\n\n#### sortFiltersAlphabetically ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nSort filters/dropdowns menu to be shown in alphabetical order.\n\n\t$(selector).ysFilter({sortFiltersAlphabetically: false})\n\t\n#### alsoMatchChildrenCategories ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nSeeting this to true allows to also add children category products to filter.\n\n\t$(selector).ysFilter({alsoMatchChildrenCategories: false})\n\n\n#### onItem ####\n\n*Expects* `function(length)`\n\nCan add an extra string on a specific item index to be used in conjunction with onItemIndex. Length of items to be rendered also displayed. This is often used in handling banners in category views.\n\n\t$(selector).ysFilter({eachItemAttrs: function(length) {\n\t\t//number of items in array\n\t\t//Add string here\n\t\treturn returnExtraString;\n\t}})\n\n#### eachItemAttrs ####\n\n*Expects* `function($this, items[i], i)`\n\nAdd / manipulate obj that renders the template.\nExtend object with new properties and add new curly braces in the template that match these.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachItemAttrs: function($this, currentItem, i) {\n\t\t//Manipulate Item\n\t\treturn currentItem;\n\t}})\n\n#### eachFilterAttrs ####\n\n*Expects* `function(valObj)`\n\nAdd extra items to each item rendered.\nReplace strings, only *desc* is supported at the moment.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachFilterAttrs: function(currentItem) {\n\t\t//Manipulate Filter Item\n\t\treturn currentItem;\n\t}})\n\n#### afterFilterRendered ####\n\n*Expects* `function()`\n\nCreate a callback to allow extra functionality after filters are built.\n\n\t$(selector).ysFilter({afterFilterRendered: function() {\n\t\t//Do something now. (uniform, chosen)\n\t}})\n\n#### beforeItemsRendered ####\n\n*Expects* `function(type)`  \n*Since* `1.3.1`\n\nGood for removing elements before filtering.\nOne variable is passed of type string defining a complete replace or an append.\n\n\t$(selector).ysFilter({beforeItemsRendered: function(type) {\n\t\t//Do something before products are loaded.\n\t\tif(type === 'replace') ...\n\t}})\n\n#### customRender ####\n\n*Expects* `function(insertType, filterObj, renderArray)`  \n*Since* `1.6.0`\n\nGood for rendering complex layouts.  \nThree variables are passed through.  \n`insertType` Either `replace` or `append`.  \n`renderArray` The original filter object. Be mindful of changes to this so that you don't mutate the object.  \n`renderArray` An array of objects containing items html and their original variables.  \n\n\t$(selector).ysFilter({beforeItemsRendered: function(insertType, filterObj, renderArray) {\n\t\tfor(i = 0; i < renderArray.length; i++) {\n\t\t\thtml += renderArray[i].html;\n\t\t}\n\n\t\tif(insertType === 'replace') {\n\t\t\t$('#filterItems').html(html);\n\t\t} else {\n\t\t\t$('#filterItems').append(html);\n\t\t}\n\t}})\n\n#### afterItemsRendered ####\n\n*Expects* `function()`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({afterItemsRendered: function() {\n\t\t//Do something after products are loaded.\n\t}})\n\n#### onFilterChanged ####\n\n*Expects* `function(filterObj)`\n*Updated* `1.3.2`\n\nCallback to update filter styles manually after changes. Filter object sent as a variable.\n\n\t$(selector).ysFilter({onFilterChanged: function(filterObj) {\n\t\t//Do something after filtering is finished.\n\t\tfor(var filter in filterObj) { ... }\n\t}})\n\n#### classProductNew, classProductSale ####\n\n*Default* `product-new`, `product-sale`  \n*Expects* `string`\n\nA string to be placed in render template for using Sale or News. A space is always added in the code before the class name.\n\n\t$(selector).ysFilter({\n\t\tclassProductNew: 'product-new',\n\t\tclassProductSale: 'product-sale'\n\t})\n\n#### newsURI, saleURI ####\n\n*Default* `new-arrivals`, `sale`  \n*Expects* `string`\n\nEnables filter to work on campaign pages where filterable products are selected based on if the product has the `newProduct` or `showAsOnSale` attribute set to `true`. This is because other pages use categories to filter these values.   \n**Important** `canonicalUri` needs to be included as product data for product links to work correctly.\n\n\t$(selector).ysFilter({\n\t\tnewsURI: 'new-arrivals',\n\t\tsaleURI: 'sale'\n\t})\n\n### Template Options ###\n\nThe template options allows you to customize the filter methods with extra classes wrap the filters with different containers etc. All following properties should be placed within `filter-id: {}`. The filter-id should pertain to the filter name i.e. `color`, `size`.\n\n**Property** `classNames: []`  \nExtra classes in addition of the default `filter-value`\n\n**Property** `background: true`  \nIf background-image/color should be used or text, useful when create a filter list for colors.\n\n**Property** `attrs: []`  \nAdd attributes in string format with {} for replacing, {desc}\n\n**Property** `wrapperGroup: '<div class=\"wrap\">'`  \nWrap all objects for the filter.\n\n**Property** `wrapper: '<div class=\"wrap\">'`  \nWrap repeating objects. Wraps each individual item.\n\n**Property** `inner: '<div class=\"group\">'`  \nWrapper per group, groups appear in sizes and categories. This does not wrap the whole filter only a group within that filter.\n\n### Data Types ###\n\nThe following functions are used with the attribute `data-type=\"\"`. Data type are methods of the filter defining how this filter interacts with the data. Not all data-types have been created. If none have been chosen the **default** is `s1` which means select only one.\nExample:\n\n\t<div id=\"color\" data-type=\"s1\" data-create=\"a\"></div>\n\n#### s1 - select-one ####\n\n**As seen in URL** `#cat~s1=value`\n\nThis limits the filter to only allow one item to be chosen at a time other items are deselected when another is clicked. If the selected item is clicked again that item is deselected.\n\n\n#### sand - select-and ####\n\n**As seen in URL** `#cat~sand=value+value1+value2`\n\nmulti selectable within group.\nrefines selection, all values must be met to show article.\n\n\n#### sor - select-or ####\n\n**As seen in URL** `#cat~sor=value,value1,value2`\n\nmulti selectable within group.\ngrows selection, selected article needs to only meet one value\n\n\n#### r - range ####\n\n**As seen in URL** `#cat~r=value_min,valuemax`\n\nshow items bounds two values need to be presented\ncan be used in conjuction with min and max to get lower and upper bounds respectively\n\n\n#### s - sort ####\n\n**As seen in URL** `#sort~s=value,dir`\n\ndirection and what is to be sorted.\n\n\n#### f - fuzzy ####\n\n**As seen in URL** `#cat~f=value,spread`\n\nchoose a value\nspread of values\n\n### Data Create ###\n\n\n#### a ####\n\nCreate anchor tags\nHTML using Emmet:\n\n\ta\n\n\n#### fakeSelect ####\n\nDrop down with anchor tags, use in conjunction with rekaf.\nHTML using Emmet:\n\t\n\tdiv>span+ul>li>a\n\n\n#### select ####\n\nNormal select use afterFilterRendered callback to turn them into uniform selects\nHTML using Emmet:\n\n\tselect>option\n\n\n#### radio ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=radio]+label\n\n\n#### checkbox ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=checkbox]+label\n\n\n### Classes ###\n\nNumerous classes can be reassigned. Check the `defaultOpts {}` as to which classes are able to be manipulated.\n\n\n### Initial Data ###\n\n\n#### url ####\n\nWhere to get the JSON object from.\n\n\t/loadfilter\n\n\n#### category ####\n\nCategory URI. Everything after the root and no slash is needed in the beginning.\n\n\tshop/all\n\n\n## Changelog ##\n\n**Version 1.11.2** \nAdded `decodeURIComponent` to hash parser to read spaces correctly.\n\n**Version 1.11.1** \nCategories weren't showing up when filtering on campaign pages. Now working. `canonicalUri` for product links to work correctly.\n\n**Version 1.11.0** \nNow possible to filter even on campaign pages such as news and sale.\n\n**Version 1.10.0** \nAdded a new possiblity for category to also include products of its children categories. Setting `alsoMatchChildrenCategories` to `true` enables that.\n\n**Version 1.9.0** \nAdded a new possiblity for a custom price template. Needs to be used in conjunction with `eachItemAttrs` to set a property on the price object `special` which will then invoke the `special` template within the price templates. Used in Artilleriet for grouped products.\n\n**Version 1.8.4** \nFixed and cleaned up safeguards, remove duplication of functions.\n\n**Version 1.8.3** \nFurther safeguarding against items not properly formed by cache.\n\n**Version 1.8.2** \nSafed items not properly formed by cache.\n\n**Version 1.8.1** \nSafed the alphabetical sorting if the object is empty.\n\n**Version 1.8.0** \nAdded an option to remove price if price is zero.\n\n**Version 1.7.1** \nAlphabetically sort filters - excluded categories from this as that can be controlled via category sort order.\n\n**Version 1.7.0** \nAdded option to alphabetically sort filters.\n\n**Version 1.6.0** \nAdded a new callback for custom rendering of html for difficult layouts. Added a new class to filter rendering function.\n\n**Version 1.5.6** \nAdded a new class to control swatches.\n\n**Version 1.5.5** \nFixed bug clearing disabled's on first filter choice.\n\n**Version 1.5.4** \nRemoved possibility for limit to be set to 0. Limit must always be explicitly set to a number higher than 0 to ensure the choice is understood.\n\n**Version 1.5.3** \n1.5.2 was tagged incorrectly now is 1.5.3. Made the matching of categories exact from ^category to ^category$ reducing the number of duplicate items as all items are in containing categories.\n\n**Version 1.5.1** \nTweak to resetting filters properly when changing between options.\n\n**Version 1.5.0** \nChanged how the filter options display disabled or not. If a filter has options that are multiple choice then the filter will be based on the other options and not the option currently being chosen it will give a list of other filterable values to filter with.\ni.e. Category -> Backpacks and Accessories are chosen. The user then chooses brown. Previously it was not possible to then add more categories but now all other categories that have something brown in them will be available.\nBe aware of the value that can be disabled and selected at the same time I suggest using strikethrough for communication purposes that the option you previously chose is now longer valid but still chosen.\n\n**Version 1.4.0** \nAdded touchevents to more quickly read variables from filters. Updated mainly due to changes in rekaf.\n\n**Version 1.3.4** \nAdded a new class for retrieving and updating total products.\n\n**Version 1.3.3** \nBug fix. Latest filter now correctly selects the latest filter in object based on hash.\n\n**Version 1.3.2** \nAdded a an argument to `onFilterChanged`. Object of all the various filters running.\n\n**Version 1.3.1** \nAdded a new method `beforeItemsRendered` for listening to before the page is to be re-rendered.\n\n**Version 1.3.0** \nPossible minor breaking change. Filter descriptions were using keys instead of displaying values not sure why this was the case may just have been a bug.\n\n**Version 1.2.0** \n0 is removed as a value to reset filter. 'remove' or the same value is the only values available to reset filter with.\n\n**Version 1.1.5** \nChanges to how pagination works. Traditional paged views now working correctly. Support before for only appended items. Individual page navigation is now independently set instead of paging parent class.\n\n**Version 1.1.0** \nFinal fixes to the related products. New features also added inc. `outputChosenFiltersId` to paste in filters which are selected. `forceHex` force use hex instead of using image which is default.\n\n**Version 1.0.0** \nFilter now has a complete feature set. A few features are still available to be added, these are regarding more semantic filtering versions i.e. range scale etc.\n\n* Variants are now handled by the filter. Showing even which of the variants that is available.\n* Classes have changed in this version to a more OOCSS way of doing things. This means if other clients update to this then it will require class changes on menu etc or if you simply state as options in the filter.\n\n\n**Version 0.5.8** \nChanged the order in which items are added in additive filtering. If several products are chosen in the same filter then the products chosen last are furthest up.\n\n**Version 0.5.7** \nFixed paging errors. Referring to non-existing variables\n\n**Version 0.5.6** \nFixed a bug that showed categories in specific depth. When those categories had products directly related to them.\n\n**Version 0.5.5** \nFixed some bugs that were also in to \"beforeAPI\" branch. All anchors are updated with hash on filter change. Fixed a bug with reload with pages and clicking on next. Added selectors for pages/items remaining.\n\n**Version 0.5.4** \nAdded in fall backs for possibly undefined price template attributes.\n\n**Version 0.5.3** \nAdded in a news filter template for price.\n\n**Version 0.5.2** \nRemoved some debugging data.\n\n**Version 0.5.1** \nPretty much reverted changes in previous commit in 0.5.0 no longer is dependent on changes in SilkAdapterBundle due to refactoring of category arrays. Default sorting is still following the correct order in Silk from here on out.\n\n**Version 0.5.0** \nDefault sort order now follows correct sort order in Silk. Needs to have SilkAdapterBundle > 0.4.3 requires filterDescriptions > categorySorting.\n\n**Version 0.4.0** \nAdded placeholders for sales and news classes so that sales or news can be used in other parts of the item.\n\n**Version 0.3.4** \nAdded locale for sharing.\n\n**Version 0.3.3** \nFixed titlecase which split on foreign characters for uppercasing. \n\n**Version 0.3.2** \nFixed sort by news.\n\n**Version 0.3.1** \nAdded a new rendering attribute. {attr|'object key'} i.e. {attr|badges} added titleCase function for doing titles using the |title. Tidied up the code a bit also, formatting and jsHint.\n\n**Version 0.3.0** \n*WARNING BREAKING CHANGES* Filter is now working against a new JSON object returned from Symfony instead of directly against Silk. Some added features are the filter works against all products category agnostic this means also that the category needs to be sent in as a parameter. Pre-sort has also been added as a feature along with some more classes to easily hide/show products while filter loads.\n\n**Version 0.2.6 - Branch beforeAPI** \nTidied up several issues. All product URL's hashes are updated on filter change. Price is now sorted with sale prices also. Fixed issues on first load of products.\n\n**Version 0.2.5 - Branch beforeAPI**\nFixed an issue regarding reloading of category products. Not all products were reloaded.\n\n**Version 0.2.4 - Branch beforeAPI** \nFixed problems with urls not assigning root correctly. Fixed sort of currencies that are prefixed with something other than a number. Fixed fallback for filters when sort was first selected. Also added ysFilter-init as a class on the filter.\n\n**Version 0.2.3** \nPaging problems. Hash didn't have parseInt. Special use case for images where the image was connected to a variant despite there being no variants.\n\n**Version 0.2.2** \nMoved replace items on first load to do it only on `debug: true` added possibility for remove button to be a sibling.\n\n**Version 0.2.1** \nFixed on remove of last item in filter category, filter options are refreshed right, previously only worked on .remove before.\n\n**Version 0.2** \nAdded multi select as an option in filter, added a new listener for on change of filter.\n\n**Version 0.1.3** \nPages now show up in URL. Possible to load in to that page.\n\n**Version 0.1.2** \nFixed a bug with color being read as an array and outputted as a string\n\n**Version 0.1.1** \nFixed category parsing, was removing a letter if there was only one category.\n\n## Understanding the core code ##\n\nAjax request gets three major elements: `filter`, `productIds` and `products`.\n`filter` has arrays of which productID's are relevant for each filtering mechanism.\n`productIds` are the ID's used to match products and filters together. It's an object mapping array position of products to their ID's\n`products` this contains the information of each individual product.\n\n┃  \n┣━ init  \n┃     Runs first this gets the AJAX and is the starting point for all further interactions.  \n┃     We also read the hash here to determine the current state for the filter.  \n┃  \n┣━ preFilter  \n┃     Filters out all categories that are irrelevant and reduces the data set.\n┃     We get our currentItems from this function and relevantFilters.\n┃  \n┣━┳━━ buildFilter  \n┃ ┃      Using the html filterControls-group creates the filtering html for the user to control the page with.  \n┃ ┃      This only occurs once on page load.  \n┃ ┃  \n┃ ┗━━ buildFilterTemplate  \n┃        This is called per filterControls-group to render each of the filters.  \n┃        This is the where the HTML is produced for the html filters.  \n┃  \n┣━┳━━ enableEvents  \n┃ ╻       Called after the filter is built and is only called once to instantiate it.  \n┃ ╻       This listens to pages and filtering events.  \n┃ ╻       \n┃ ┗━━ updateFilterObj  \n┃        Creates a filter object which determines the state of the filter.  \n┃        Triggered only from events, when the customer updates the filter.  \n┃        Sends the obj to the hashify function which updates the URL.  \n┃  \n┣ ┳ ━ dehashify (Extra functions run if hash in URL)  \n┃ ╻      Extract information from hash to creates the filter object.  \n┃ ╻  \n┃ ┗ ━ reSelect  \n┃        Using the filter object disable certain filter elements.  \n┃  \n┣━ gatherItems  \n┃     Based upon the filter object intersect the arrays and deploy the major logic behind the filter.  \n┃     This listens to pages and filtering events.  \n┃  \n┣━ updateFilterHTML  \n┃     Updates the HTML so that the customer can see which filters are still relevant.  \n┃  \n┣ ━ sortItems  \n┃     Sort items based on the products properties.  \n┃  \n┗━┳━━ renderItems  \n  ┃      Define paging and send through for looping through the product templates.  \n  ┃      Several callbacks here to hook into for editing what is rendered on the page.  \n  ┃      Final step before rendering out the products on the page.  \n  ┃  \n  ┣━━ renderItemTemplate  \n  ┃      Connect variants product objects here to show all related variant information.  \n  ┃      Runs through templates received in AJAX call.  \n  ┃  \n  ┣━━ renderItemPrice  \n  ┃      Uses relevant template to display based on price object.  \n  ┃  \n  ┗━━ renderItemReplace  \n         Major replacement of product attributes.  \n\nSome helper functions not mentioned above.\n`relatedToITems` maps even variants to objects in `products` to be later rendered by `renderItemTemplate` It's used in `preFilter` and `updateFilterHTML`\n`hexOrImage` pertains to attributes whether they should use the hex code available or use the image. Image always takes precedent.\n`dehasify` reads the `window.location.hash` and turns it into an object for using with the filter.\n`hashify` updates the `window.location.hash`\n`titleCase` is a filtering function for changing the output of the productObjects. Use in template with a `|`\n`getLocale` if this needs to be done.\n`keysToItems` Maps productID's to products\n`unique` Takes a simple array and removes duplicates. Don't use with an object is it doesn't test depth.\n`intersect` Takes a two simple arrays and removes duplicates. Don't use with an object is it doesn't test depth.\n\n\n## Development ##\n\n**Requirements**\n* This plugin requires [node](http://nodejs.org/), [gulpjs](http://gulpjs.com/) and [bower](http://bower.io/).\n* Follow JSCS guidelines a styling-example.js is also included.\n* Run `bower install` and `npm install` to get dev dependencies. Bower and Gulp is assumed to be running globally.\n\n## Contact ##\n\nThis is a small plugin by Young Skilled.\nContact [support](mailto:support@youngskilled.com) for more details about this plugin.\n","readmeFilename":"README.md","gitHead":"b8d1ca251bb2d39d66a72a15ca37110d855124c7","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@1.11.2","scripts":{},"_shasum":"c9015f545480c5777e84226ef5402d0faefab02c","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"c9015f545480c5777e84226ef5402d0faefab02c","tarball":"https://registry.npmjs.org/refilt/-/refilt-1.11.2.tgz","fileCount":21,"unpackedSize":487526,"integrity":"sha512-KV8pjD2S4YVjL1KAnmC31WufDPPUXWGjK7aztFWMk82zk9RLZm6kiY8U7kBQ2wuFiq6I+nH4XPw1udOSxONZFw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDhV5fagFUpGgMf6XXDVjKVd/IC26jk5AqvTBq5cWuKsAiEAiU6VlWiy6YUeXEYSW+aCMv/Hy0VcJUekQA0PEEh9JXQ="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_1.11.2_1532609467424_0.7442791437323371"},"_hasShrinkwrap":false},"1.11.3":{"name":"refilt","version":"1.11.3","description":"For filtering and sorting products returned from Silk API.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"readme":"# ysFilter - For filtering and sorting products returned from Silk API. #\n\nA jQuery plugin that asynchronously loads in a JSON of all the product data in the current category. The plugin is able to be manipulated with a range of callbacks and properties that allow you to change the default properties.\n\n## Background ##\n\nBeneath the whole filter is a very basic html product list with the only functionality being paging. Products are ideally only shown once and URL's are kept to a minimum. This follows our philosophy at Young/Skilled that a website should be perfectly accessible with javascript even turned off. \nThis means when the page is indexed the default HTML page is the only page that is indexed because the javascript adds all the functionality in a separate layer. \nTo enable sharing the page's hash is updated every time a filter selection is made which is not seen by a search engine as being a new page. This is also semantically correct in that we are effectively just showing the same content, similar to how an anchor shows the same content but a different section of that content.\nThis plugin uses a JSON string that has all the information for all the products that are displayed. On every filtering the results are shown nearly instantly as there are no requests being sent or received making the filter more responsive.\n\n\n### Dependencies ###\nECMAScript > 5.1\njQuery > 1.7\n\n\n### Usage ###\n\nInitiate with `$(selector).ysFilter({'some':'property'});`   \nInvoke methods with `$(selector).ysFilter('method', {'some':'property'});`   \nAll classes and ids used in properties should omit `.` and `#`\nExample\n\n\t$('#ysFilter').ysFilter({\n\t\tdebug: true,\n\t\tappendItems: true\n\t});\n \n\n### HTML ###\n\nThis is the basic page structure required for the filter to work.\n\t\n\t<div id=\"ysFilter\" data-url=\"\" data-category=\"\">\n    <div class=\"filterControls\" data-type=\"\">\n      <div id=\"color\" class=\"filterControls-group\" data-type=\"<!-- See \"Data Types\" below -->\" data-create=\"<!-- See \"Data Create\" below -->\">\n        <!-- HTML is appended here so it's ok to have elements here. -->\n        <!-- Each value receives class filterControls-value -->\n      </div>\n      <!-- id === filterDescriptions[key] repeat above if needed -->\n    </div>\n    <div id=\"filterItems\">\n      <!-- items must come directly after parent there shouldn't be any container surrounding these -->\n    <div>\n    <nav class=\"filterPaging\">\n      <a class=\"filterPaging-prev\"></a>\n      <a class=\"filterPaging-all\"></a>\n      <a class=\"filterPaging-next\"></a>\n    </nav>\n\t</div>\n\nFollowing classes are added to the filter during different phases.  \n`ysFilter--loading`,`ysFilter--init`,`ysFilter--filtered`,`ysFilter--loaded`\n\n\nThe following structure you can use in combination with Emmet for tab completion.\n\n\tdiv#ysFilter[data-url=\"\" data-category=\"\"]>div.filterControls[data-type=\"\"]+div#filterItems+div.filterPaging>a.filterPaging-prev+a.filterPaging-all+a.filterPaging-next\n\n### Properties ###\n\n\n#### limit ####\n\n*Default* `20`  \n*Expects* `integer`\n\nHow many items to be rendered per page.\n\n\t$(selector).ysFilter({limit: 20})\n\n#### splitSizes ####\n\n*Default* `false`  \n*Expects* `false, wrapper`\n\nSplits sizes into groups based on size chart otherwise they are presented as one group.\n\n\t$(selector).ysFilter({splitSizes: false})\n\n#### appendItems ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nWhether to replace items or to append new items with regards to paging.\n\n\t$(selector).ysFilter({appendItems: false})\n\n#### updateWHash ####\n\n*Default* `false`  \n*Expects* `false, class`\n\nUpdate other elements on the page by appending hash to those URL's like e.g. product URL's.\n\n\t$(selector).ysFilter({updateWHash: false})\n\n#### filterOptions ####\n\n*Default* `{}`  \n*Expects* `object with nested objects`\n\nExtend filter HTML with predefined variables. See Filter Variables below.\n\n\t$(selector).ysFilter({filterOptions: {\n\t\tcolor: {\n\t\t\tbackground: true\n\t\t}\n\t}})\n\n#### multipleImgs ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({multipleImgs: false})\n\n#### onItemIndex ####\n\n*Default* `undefined`  \n*Expects* `integer`\n\nUsed in conjunction with onItem. After a certain amount of products built do this.\n\n#### outputChosenFiltersId ####\n\n*Default* `false`  \n*Expects* `false, id`\n\nSpecify a container where you would like the current filters which are selected to be outputted. If in the filter controls you have an anchor it will copy that with all the classes removing any ID's into this field. Otherwise it will create an anchor per filter.\n\n\t$(selector).ysFilter({outputChosenFiltersId: 'js-filtersChosen-list'})\n\n#### forceHex ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nMake the renderer use hex when rendering products and filter. Used in conjunction with background color/images for related products and color filter controls.\n\n\t$(selector).ysFilter({forceHex: false})\n\n#### sortFiltersAlphabetically ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nSort filters/dropdowns menu to be shown in alphabetical order.\n\n\t$(selector).ysFilter({sortFiltersAlphabetically: false})\n\t\n#### alsoMatchChildrenCategories ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nSeeting this to true allows to also add children category products to filter.\n\n\t$(selector).ysFilter({alsoMatchChildrenCategories: false})\n\n\n#### onItem ####\n\n*Expects* `function(length)`\n\nCan add an extra string on a specific item index to be used in conjunction with onItemIndex. Length of items to be rendered also displayed. This is often used in handling banners in category views.\n\n\t$(selector).ysFilter({eachItemAttrs: function(length) {\n\t\t//number of items in array\n\t\t//Add string here\n\t\treturn returnExtraString;\n\t}})\n\n#### eachItemAttrs ####\n\n*Expects* `function($this, items[i], i)`\n\nAdd / manipulate obj that renders the template.\nExtend object with new properties and add new curly braces in the template that match these.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachItemAttrs: function($this, currentItem, i) {\n\t\t//Manipulate Item\n\t\treturn currentItem;\n\t}})\n\n#### eachFilterAttrs ####\n\n*Expects* `function(valObj)`\n\nAdd extra items to each item rendered.\nReplace strings, only *desc* is supported at the moment.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachFilterAttrs: function(currentItem) {\n\t\t//Manipulate Filter Item\n\t\treturn currentItem;\n\t}})\n\n#### afterFilterRendered ####\n\n*Expects* `function()`\n\nCreate a callback to allow extra functionality after filters are built.\n\n\t$(selector).ysFilter({afterFilterRendered: function() {\n\t\t//Do something now. (uniform, chosen)\n\t}})\n\n#### beforeItemsRendered ####\n\n*Expects* `function(type)`  \n*Since* `1.3.1`\n\nGood for removing elements before filtering.\nOne variable is passed of type string defining a complete replace or an append.\n\n\t$(selector).ysFilter({beforeItemsRendered: function(type) {\n\t\t//Do something before products are loaded.\n\t\tif(type === 'replace') ...\n\t}})\n\n#### customRender ####\n\n*Expects* `function(insertType, filterObj, renderArray)`  \n*Since* `1.6.0`\n\nGood for rendering complex layouts.  \nThree variables are passed through.  \n`insertType` Either `replace` or `append`.  \n`renderArray` The original filter object. Be mindful of changes to this so that you don't mutate the object.  \n`renderArray` An array of objects containing items html and their original variables.  \n\n\t$(selector).ysFilter({beforeItemsRendered: function(insertType, filterObj, renderArray) {\n\t\tfor(i = 0; i < renderArray.length; i++) {\n\t\t\thtml += renderArray[i].html;\n\t\t}\n\n\t\tif(insertType === 'replace') {\n\t\t\t$('#filterItems').html(html);\n\t\t} else {\n\t\t\t$('#filterItems').append(html);\n\t\t}\n\t}})\n\n#### afterItemsRendered ####\n\n*Expects* `function()`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({afterItemsRendered: function() {\n\t\t//Do something after products are loaded.\n\t}})\n\n#### onFilterChanged ####\n\n*Expects* `function(filterObj)`\n*Updated* `1.3.2`\n\nCallback to update filter styles manually after changes. Filter object sent as a variable.\n\n\t$(selector).ysFilter({onFilterChanged: function(filterObj) {\n\t\t//Do something after filtering is finished.\n\t\tfor(var filter in filterObj) { ... }\n\t}})\n\n#### classProductNew, classProductSale ####\n\n*Default* `product-new`, `product-sale`  \n*Expects* `string`\n\nA string to be placed in render template for using Sale or News. A space is always added in the code before the class name.\n\n\t$(selector).ysFilter({\n\t\tclassProductNew: 'product-new',\n\t\tclassProductSale: 'product-sale'\n\t})\n\n#### newsURI, saleURI ####\n\n*Default* `new-arrivals`, `sale`  \n*Expects* `string`\n\nEnables filter to work on campaign pages where filterable products are selected based on if the product has the `newProduct` or `showAsOnSale` attribute set to `true`. This is because other pages use categories to filter these values.   \n**Important** `canonicalUri` needs to be included as product data for product links to work correctly.\n\n\t$(selector).ysFilter({\n\t\tnewsURI: 'new-arrivals',\n\t\tsaleURI: 'sale'\n\t})\n\n### Template Options ###\n\nThe template options allows you to customize the filter methods with extra classes wrap the filters with different containers etc. All following properties should be placed within `filter-id: {}`. The filter-id should pertain to the filter name i.e. `color`, `size`.\n\n**Property** `classNames: []`  \nExtra classes in addition of the default `filter-value`\n\n**Property** `background: true`  \nIf background-image/color should be used or text, useful when create a filter list for colors.\n\n**Property** `attrs: []`  \nAdd attributes in string format with {} for replacing, {desc}\n\n**Property** `wrapperGroup: '<div class=\"wrap\">'`  \nWrap all objects for the filter.\n\n**Property** `wrapper: '<div class=\"wrap\">'`  \nWrap repeating objects. Wraps each individual item.\n\n**Property** `inner: '<div class=\"group\">'`  \nWrapper per group, groups appear in sizes and categories. This does not wrap the whole filter only a group within that filter.\n\n### Data Types ###\n\nThe following functions are used with the attribute `data-type=\"\"`. Data type are methods of the filter defining how this filter interacts with the data. Not all data-types have been created. If none have been chosen the **default** is `s1` which means select only one.\nExample:\n\n\t<div id=\"color\" data-type=\"s1\" data-create=\"a\"></div>\n\n#### s1 - select-one ####\n\n**As seen in URL** `#cat~s1=value`\n\nThis limits the filter to only allow one item to be chosen at a time other items are deselected when another is clicked. If the selected item is clicked again that item is deselected.\n\n\n#### sand - select-and ####\n\n**As seen in URL** `#cat~sand=value+value1+value2`\n\nmulti selectable within group.\nrefines selection, all values must be met to show article.\n\n\n#### sor - select-or ####\n\n**As seen in URL** `#cat~sor=value,value1,value2`\n\nmulti selectable within group.\ngrows selection, selected article needs to only meet one value\n\n\n#### r - range ####\n\n**As seen in URL** `#cat~r=value_min,valuemax`\n\nshow items bounds two values need to be presented\ncan be used in conjuction with min and max to get lower and upper bounds respectively\n\n\n#### s - sort ####\n\n**As seen in URL** `#sort~s=value,dir`\n\ndirection and what is to be sorted.\n\n\n#### f - fuzzy ####\n\n**As seen in URL** `#cat~f=value,spread`\n\nchoose a value\nspread of values\n\n### Data Create ###\n\n\n#### a ####\n\nCreate anchor tags\nHTML using Emmet:\n\n\ta\n\n\n#### fakeSelect ####\n\nDrop down with anchor tags, use in conjunction with rekaf.\nHTML using Emmet:\n\t\n\tdiv>span+ul>li>a\n\n\n#### select ####\n\nNormal select use afterFilterRendered callback to turn them into uniform selects\nHTML using Emmet:\n\n\tselect>option\n\n\n#### radio ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=radio]+label\n\n\n#### checkbox ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=checkbox]+label\n\n\n### Classes ###\n\nNumerous classes can be reassigned. Check the `defaultOpts {}` as to which classes are able to be manipulated.\n\n\n### Initial Data ###\n\n\n#### url ####\n\nWhere to get the JSON object from.\n\n\t/loadfilter\n\n\n#### category ####\n\nCategory URI. Everything after the root and no slash is needed in the beginning.\n\n\tshop/all\n\n\n## Changelog ##\n\n**Version 1.11.3** \nUpdated distribution\n\n**Version 1.11.2** \nAdded `decodeURIComponent` to hash parser to read spaces correctly.\n\n**Version 1.11.1** \nCategories weren't showing up when filtering on campaign pages. Now working. `canonicalUri` for product links to work correctly.\n\n**Version 1.11.0** \nNow possible to filter even on campaign pages such as news and sale.\n\n**Version 1.10.0** \nAdded a new possiblity for category to also include products of its children categories. Setting `alsoMatchChildrenCategories` to `true` enables that.\n\n**Version 1.9.0** \nAdded a new possiblity for a custom price template. Needs to be used in conjunction with `eachItemAttrs` to set a property on the price object `special` which will then invoke the `special` template within the price templates. Used in Artilleriet for grouped products.\n\n**Version 1.8.4** \nFixed and cleaned up safeguards, remove duplication of functions.\n\n**Version 1.8.3** \nFurther safeguarding against items not properly formed by cache.\n\n**Version 1.8.2** \nSafed items not properly formed by cache.\n\n**Version 1.8.1** \nSafed the alphabetical sorting if the object is empty.\n\n**Version 1.8.0** \nAdded an option to remove price if price is zero.\n\n**Version 1.7.1** \nAlphabetically sort filters - excluded categories from this as that can be controlled via category sort order.\n\n**Version 1.7.0** \nAdded option to alphabetically sort filters.\n\n**Version 1.6.0** \nAdded a new callback for custom rendering of html for difficult layouts. Added a new class to filter rendering function.\n\n**Version 1.5.6** \nAdded a new class to control swatches.\n\n**Version 1.5.5** \nFixed bug clearing disabled's on first filter choice.\n\n**Version 1.5.4** \nRemoved possibility for limit to be set to 0. Limit must always be explicitly set to a number higher than 0 to ensure the choice is understood.\n\n**Version 1.5.3** \n1.5.2 was tagged incorrectly now is 1.5.3. Made the matching of categories exact from ^category to ^category$ reducing the number of duplicate items as all items are in containing categories.\n\n**Version 1.5.1** \nTweak to resetting filters properly when changing between options.\n\n**Version 1.5.0** \nChanged how the filter options display disabled or not. If a filter has options that are multiple choice then the filter will be based on the other options and not the option currently being chosen it will give a list of other filterable values to filter with.\ni.e. Category -> Backpacks and Accessories are chosen. The user then chooses brown. Previously it was not possible to then add more categories but now all other categories that have something brown in them will be available.\nBe aware of the value that can be disabled and selected at the same time I suggest using strikethrough for communication purposes that the option you previously chose is now longer valid but still chosen.\n\n**Version 1.4.0** \nAdded touchevents to more quickly read variables from filters. Updated mainly due to changes in rekaf.\n\n**Version 1.3.4** \nAdded a new class for retrieving and updating total products.\n\n**Version 1.3.3** \nBug fix. Latest filter now correctly selects the latest filter in object based on hash.\n\n**Version 1.3.2** \nAdded a an argument to `onFilterChanged`. Object of all the various filters running.\n\n**Version 1.3.1** \nAdded a new method `beforeItemsRendered` for listening to before the page is to be re-rendered.\n\n**Version 1.3.0** \nPossible minor breaking change. Filter descriptions were using keys instead of displaying values not sure why this was the case may just have been a bug.\n\n**Version 1.2.0** \n0 is removed as a value to reset filter. 'remove' or the same value is the only values available to reset filter with.\n\n**Version 1.1.5** \nChanges to how pagination works. Traditional paged views now working correctly. Support before for only appended items. Individual page navigation is now independently set instead of paging parent class.\n\n**Version 1.1.0** \nFinal fixes to the related products. New features also added inc. `outputChosenFiltersId` to paste in filters which are selected. `forceHex` force use hex instead of using image which is default.\n\n**Version 1.0.0** \nFilter now has a complete feature set. A few features are still available to be added, these are regarding more semantic filtering versions i.e. range scale etc.\n\n* Variants are now handled by the filter. Showing even which of the variants that is available.\n* Classes have changed in this version to a more OOCSS way of doing things. This means if other clients update to this then it will require class changes on menu etc or if you simply state as options in the filter.\n\n\n**Version 0.5.8** \nChanged the order in which items are added in additive filtering. If several products are chosen in the same filter then the products chosen last are furthest up.\n\n**Version 0.5.7** \nFixed paging errors. Referring to non-existing variables\n\n**Version 0.5.6** \nFixed a bug that showed categories in specific depth. When those categories had products directly related to them.\n\n**Version 0.5.5** \nFixed some bugs that were also in to \"beforeAPI\" branch. All anchors are updated with hash on filter change. Fixed a bug with reload with pages and clicking on next. Added selectors for pages/items remaining.\n\n**Version 0.5.4** \nAdded in fall backs for possibly undefined price template attributes.\n\n**Version 0.5.3** \nAdded in a news filter template for price.\n\n**Version 0.5.2** \nRemoved some debugging data.\n\n**Version 0.5.1** \nPretty much reverted changes in previous commit in 0.5.0 no longer is dependent on changes in SilkAdapterBundle due to refactoring of category arrays. Default sorting is still following the correct order in Silk from here on out.\n\n**Version 0.5.0** \nDefault sort order now follows correct sort order in Silk. Needs to have SilkAdapterBundle > 0.4.3 requires filterDescriptions > categorySorting.\n\n**Version 0.4.0** \nAdded placeholders for sales and news classes so that sales or news can be used in other parts of the item.\n\n**Version 0.3.4** \nAdded locale for sharing.\n\n**Version 0.3.3** \nFixed titlecase which split on foreign characters for uppercasing. \n\n**Version 0.3.2** \nFixed sort by news.\n\n**Version 0.3.1** \nAdded a new rendering attribute. {attr|'object key'} i.e. {attr|badges} added titleCase function for doing titles using the |title. Tidied up the code a bit also, formatting and jsHint.\n\n**Version 0.3.0** \n*WARNING BREAKING CHANGES* Filter is now working against a new JSON object returned from Symfony instead of directly against Silk. Some added features are the filter works against all products category agnostic this means also that the category needs to be sent in as a parameter. Pre-sort has also been added as a feature along with some more classes to easily hide/show products while filter loads.\n\n**Version 0.2.6 - Branch beforeAPI** \nTidied up several issues. All product URL's hashes are updated on filter change. Price is now sorted with sale prices also. Fixed issues on first load of products.\n\n**Version 0.2.5 - Branch beforeAPI**\nFixed an issue regarding reloading of category products. Not all products were reloaded.\n\n**Version 0.2.4 - Branch beforeAPI** \nFixed problems with urls not assigning root correctly. Fixed sort of currencies that are prefixed with something other than a number. Fixed fallback for filters when sort was first selected. Also added ysFilter-init as a class on the filter.\n\n**Version 0.2.3** \nPaging problems. Hash didn't have parseInt. Special use case for images where the image was connected to a variant despite there being no variants.\n\n**Version 0.2.2** \nMoved replace items on first load to do it only on `debug: true` added possibility for remove button to be a sibling.\n\n**Version 0.2.1** \nFixed on remove of last item in filter category, filter options are refreshed right, previously only worked on .remove before.\n\n**Version 0.2** \nAdded multi select as an option in filter, added a new listener for on change of filter.\n\n**Version 0.1.3** \nPages now show up in URL. Possible to load in to that page.\n\n**Version 0.1.2** \nFixed a bug with color being read as an array and outputted as a string\n\n**Version 0.1.1** \nFixed category parsing, was removing a letter if there was only one category.\n\n## Understanding the core code ##\n\nAjax request gets three major elements: `filter`, `productIds` and `products`.\n`filter` has arrays of which productID's are relevant for each filtering mechanism.\n`productIds` are the ID's used to match products and filters together. It's an object mapping array position of products to their ID's\n`products` this contains the information of each individual product.\n\n┃  \n┣━ init  \n┃     Runs first this gets the AJAX and is the starting point for all further interactions.  \n┃     We also read the hash here to determine the current state for the filter.  \n┃  \n┣━ preFilter  \n┃     Filters out all categories that are irrelevant and reduces the data set.\n┃     We get our currentItems from this function and relevantFilters.\n┃  \n┣━┳━━ buildFilter  \n┃ ┃      Using the html filterControls-group creates the filtering html for the user to control the page with.  \n┃ ┃      This only occurs once on page load.  \n┃ ┃  \n┃ ┗━━ buildFilterTemplate  \n┃        This is called per filterControls-group to render each of the filters.  \n┃        This is the where the HTML is produced for the html filters.  \n┃  \n┣━┳━━ enableEvents  \n┃ ╻       Called after the filter is built and is only called once to instantiate it.  \n┃ ╻       This listens to pages and filtering events.  \n┃ ╻       \n┃ ┗━━ updateFilterObj  \n┃        Creates a filter object which determines the state of the filter.  \n┃        Triggered only from events, when the customer updates the filter.  \n┃        Sends the obj to the hashify function which updates the URL.  \n┃  \n┣ ┳ ━ dehashify (Extra functions run if hash in URL)  \n┃ ╻      Extract information from hash to creates the filter object.  \n┃ ╻  \n┃ ┗ ━ reSelect  \n┃        Using the filter object disable certain filter elements.  \n┃  \n┣━ gatherItems  \n┃     Based upon the filter object intersect the arrays and deploy the major logic behind the filter.  \n┃     This listens to pages and filtering events.  \n┃  \n┣━ updateFilterHTML  \n┃     Updates the HTML so that the customer can see which filters are still relevant.  \n┃  \n┣ ━ sortItems  \n┃     Sort items based on the products properties.  \n┃  \n┗━┳━━ renderItems  \n  ┃      Define paging and send through for looping through the product templates.  \n  ┃      Several callbacks here to hook into for editing what is rendered on the page.  \n  ┃      Final step before rendering out the products on the page.  \n  ┃  \n  ┣━━ renderItemTemplate  \n  ┃      Connect variants product objects here to show all related variant information.  \n  ┃      Runs through templates received in AJAX call.  \n  ┃  \n  ┣━━ renderItemPrice  \n  ┃      Uses relevant template to display based on price object.  \n  ┃  \n  ┗━━ renderItemReplace  \n         Major replacement of product attributes.  \n\nSome helper functions not mentioned above.\n`relatedToITems` maps even variants to objects in `products` to be later rendered by `renderItemTemplate` It's used in `preFilter` and `updateFilterHTML`\n`hexOrImage` pertains to attributes whether they should use the hex code available or use the image. Image always takes precedent.\n`dehasify` reads the `window.location.hash` and turns it into an object for using with the filter.\n`hashify` updates the `window.location.hash`\n`titleCase` is a filtering function for changing the output of the productObjects. Use in template with a `|`\n`getLocale` if this needs to be done.\n`keysToItems` Maps productID's to products\n`unique` Takes a simple array and removes duplicates. Don't use with an object is it doesn't test depth.\n`intersect` Takes a two simple arrays and removes duplicates. Don't use with an object is it doesn't test depth.\n\n\n## Development ##\n\n**Requirements**\n* This plugin requires [node](http://nodejs.org/), [gulpjs](http://gulpjs.com/) and [bower](http://bower.io/).\n* Follow JSCS guidelines a styling-example.js is also included.\n* Run `bower install` and `npm install` to get dev dependencies. Bower and Gulp is assumed to be running globally.\n\n## Contact ##\n\nThis is a small plugin by Young Skilled.\nContact [support](mailto:support@youngskilled.com) for more details about this plugin.\n","readmeFilename":"README.md","gitHead":"666a68f1b74be031bae3e5dcd9f94596e8718e81","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@1.11.3","scripts":{},"_shasum":"17cf4f1bf3a250e4283624d52571485256c0ea4a","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"17cf4f1bf3a250e4283624d52571485256c0ea4a","tarball":"https://registry.npmjs.org/refilt/-/refilt-1.11.3.tgz","fileCount":21,"unpackedSize":487663,"integrity":"sha512-lY23VqKH0sYFUnSkQV9TaC6U22rJnFAUHH/gUtARyr6QbbeQcLVvOzSlSyiLmbRoEXQ/GUaKnaxWxSPDaz2RDg==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEu2GtUhHcgcrySDaceWmr+70ycchVZKI5UPfDbFopUEAiAOdFEJoi1lGmKP0huyPZQ5hvBVmdRYbqOfmin6+PlXpQ=="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_1.11.3_1532610099910_0.6545536510306988"},"_hasShrinkwrap":false},"3.0.3":{"name":"refilt","version":"3.0.3","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"549002afe56bc37cd82191b419d0e786857bebd4","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.0.3","scripts":{},"_shasum":"f429dafd04e03cce43ccd7fc4dd9718347132215","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"f429dafd04e03cce43ccd7fc4dd9718347132215","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.0.3.tgz","integrity":"sha512-WpSx4snkGEU8qVPuh3eAXkIdd0pOSAwpakwnCYrvnGo0ckdso468Odu7VUvo0bXR4VE9Nb3vQmPfhY93sml9bQ==","fileCount":19,"unpackedSize":508146,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbcIs+CRA9TVsSAnZWagAATRwQAIzb/zbaltEu6GinzIC5\nJIxWLpUFpFS6oUtICkRHyVm/4ny+hd3KPblPDKYygayZQSYazjtWAOX9/MwB\naxQWT6sje6ybre30+HNr99YxpM93KT8q5AVs43eKUddwKGXW7DavIK2keSxV\n/RIwsqEnyxh2RBatnJm3I+OmtBnyLxdJTKMgBQTVB3xX1HCL5nKM/E3Jc7ed\n1ue1FNOPwllRvoD2owNmK+rqzIOEz+K68yY7vFAo+fKW9Tz/wMxAifIV1sf4\n880Q1hgqpo8D8X5ilVvo6hV36fWk7B3L7X6uP12WMZUdLAvQR+us/1Os/rEk\nRN0vxS1tex/erWduRE9LgEA8lLy4B8CvX1Q65jybkhXorNIg8InMIT8D6Ucb\noWJoKIpSY7A+CbjcoBo3ILM0SzB/kXFrqVE37YjFjFDCR+p1sLwuNjZ+QsYU\ngXcL7NCp6bQ5iLxobNZI8nY50oHf+FXo4CGnfTG8GZw4GbRRQQ226MpWubtB\nDY78F1589P+Hia3x+pvS/LdD3HsEsyuSr8Uh6KCuR/BqPb87ehP1+KdLhXz5\n3bEXjlMZWdgpW7NtfMpw4jMRIj8AyPjmBDNZqiCx/CwZXzWcK062T2nNxCIL\nMirjrbnwHLMrzlpDeiFue0YtMOW5hCQqmicbhiCoFSMlyvvhu3TGRLu68xRx\nf1ok\r\n=b8ax\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDqaWCotJeN696KJfeeA2DncRM5zDPbhcd8n1pVLaGfjAiEAx2Eq6w43EhbnUCgJIHg1TjhL1+6o6atrVwuaPBDyvNU="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.0.3_1534102333788_0.3385457605556095"},"_hasShrinkwrap":false},"1.11.4":{"name":"refilt","version":"1.11.4","description":"For filtering and sorting products returned from Silk API.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"f145118cfa70e4ad47f4095cf0d88afa097e2eb2","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@1.11.4","scripts":{},"_shasum":"b40c45eb056cabaeba8313af771c4b414009cd3f","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"b40c45eb056cabaeba8313af771c4b414009cd3f","tarball":"https://registry.npmjs.org/refilt/-/refilt-1.11.4.tgz","integrity":"sha512-rTMmpCXo5l86Jrazx1huw36W7QA0Fl2qPVVYLe0mFCv965mwQ9DxRcvIASY9QLKwQ7f6WRq1mR4e1BmmibPLkA==","fileCount":21,"unpackedSize":487747,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvGToCRA9TVsSAnZWagAA5Y4P/iOgiMIfS+xpoX9Pro7w\nJMQ/r9dfIPoqCp6BOIL8Os6LQgKsSSoXQn8hrTlnVRkk08gRlhneGw2PZLVk\nvBOEaZoQO2jNh9LIVjSZDBDZuaB3oYncipDudbM7ZzX1qTlA6oHQtwvUciHj\nvrwcGiXewpVeDq5k14aPOTxx1d41XWD0pWjjEY4dhXgtaKZEaL3u3BcHUCMd\nJSWPKZ0orCnjEqqLZQYJKl8wnDMyew2tZTXxn30QCWAFuUZ25pHVktVnVFR6\nYyfG2tLxrEkh9u6tB6sJY9q5O6WVI4y0WXSXm5TwWsd8lNqDMkyrMjEE4GQn\nFVxe9pYf5VJe00khFMR2Tgj+HCOvTZx9LiZOj8eT4ipQvpnWJSKhbP6S0rWs\n8CWdByrF2gvGpC69GL+9DT6QLJE5g4NNX4EH+VZID75fZ3UFew3idoHICjYr\nvxpcvQAM8tph4i4mhNpnvc/NNVF2KtFqoNlgNlibA/Pg2W/D2gLwuSncAsUQ\nQWn7dYvDDxz49dJba4RjBsetdWCNVR0UtLN10Fh1CKL+GUfSVtorgJP+40wu\nKysHW6r9c9MRVR2aHPrysppQ0WpLMnHqETOIVDe0btd4wcXyUJ3+r5GY3zk4\nTLMRuvuWY/En+DUmpFdAyNLwsH+F34/pup8v8YMzBylkLDyq5JQ3HZkfQgqU\ny8Nj\r\n=rmpi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICHskkYjJpZL3BubR/PGe190hupKe6EnGxQTcLafBTiCAiEAi0tRthRtG4UgyXvPZiCuRhIoU33XMhWIT0LnH7g3aiM="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_1.11.4_1539073256097_0.08331786407613406"},"_hasShrinkwrap":false},"1.11.5":{"name":"refilt","version":"1.11.5","description":"For filtering and sorting products returned from Silk API.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"readme":"# ysFilter - For filtering and sorting products returned from Silk API. #\n\nA jQuery plugin that asynchronously loads in a JSON of all the product data in the current category. The plugin is able to be manipulated with a range of callbacks and properties that allow you to change the default properties.\n\n## Background ##\n\nBeneath the whole filter is a very basic html product list with the only functionality being paging. Products are ideally only shown once and URL's are kept to a minimum. This follows our philosophy at Young/Skilled that a website should be perfectly accessible with javascript even turned off. \nThis means when the page is indexed the default HTML page is the only page that is indexed because the javascript adds all the functionality in a separate layer. \nTo enable sharing the page's hash is updated every time a filter selection is made which is not seen by a search engine as being a new page. This is also semantically correct in that we are effectively just showing the same content, similar to how an anchor shows the same content but a different section of that content.\nThis plugin uses a JSON string that has all the information for all the products that are displayed. On every filtering the results are shown nearly instantly as there are no requests being sent or received making the filter more responsive.\n\n\n### Dependencies ###\nECMAScript > 5.1\njQuery > 1.7\n\n\n### Usage ###\n\nInitiate with `$(selector).ysFilter({'some':'property'});`   \nInvoke methods with `$(selector).ysFilter('method', {'some':'property'});`   \nAll classes and ids used in properties should omit `.` and `#`\nExample\n\n\t$('#ysFilter').ysFilter({\n\t\tdebug: true,\n\t\tappendItems: true\n\t});\n \n\n### HTML ###\n\nThis is the basic page structure required for the filter to work.\n\t\n\t<div id=\"ysFilter\" data-url=\"\" data-category=\"\">\n    <div class=\"filterControls\" data-type=\"\">\n      <div id=\"color\" class=\"filterControls-group\" data-type=\"<!-- See \"Data Types\" below -->\" data-create=\"<!-- See \"Data Create\" below -->\">\n        <!-- HTML is appended here so it's ok to have elements here. -->\n        <!-- Each value receives class filterControls-value -->\n      </div>\n      <!-- id === filterDescriptions[key] repeat above if needed -->\n    </div>\n    <div id=\"filterItems\">\n      <!-- items must come directly after parent there shouldn't be any container surrounding these -->\n    <div>\n    <nav class=\"filterPaging\">\n      <a class=\"filterPaging-prev\"></a>\n      <a class=\"filterPaging-all\"></a>\n      <a class=\"filterPaging-next\"></a>\n    </nav>\n\t</div>\n\nFollowing classes are added to the filter during different phases.  \n`ysFilter--loading`,`ysFilter--init`,`ysFilter--filtered`,`ysFilter--loaded`\n\n\nThe following structure you can use in combination with Emmet for tab completion.\n\n\tdiv#ysFilter[data-url=\"\" data-category=\"\"]>div.filterControls[data-type=\"\"]+div#filterItems+div.filterPaging>a.filterPaging-prev+a.filterPaging-all+a.filterPaging-next\n\n### Properties ###\n\n\n#### limit ####\n\n*Default* `20`  \n*Expects* `integer`\n\nHow many items to be rendered per page.\n\n\t$(selector).ysFilter({limit: 20})\n\n#### splitSizes ####\n\n*Default* `false`  \n*Expects* `false, wrapper`\n\nSplits sizes into groups based on size chart otherwise they are presented as one group.\n\n\t$(selector).ysFilter({splitSizes: false})\n\n#### appendItems ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nWhether to replace items or to append new items with regards to paging.\n\n\t$(selector).ysFilter({appendItems: false})\n\n#### updateWHash ####\n\n*Default* `false`  \n*Expects* `false, class`\n\nUpdate other elements on the page by appending hash to those URL's like e.g. product URL's.\n\n\t$(selector).ysFilter({updateWHash: false})\n\n#### filterOptions ####\n\n*Default* `{}`  \n*Expects* `object with nested objects`\n\nExtend filter HTML with predefined variables. See Filter Variables below.\n\n\t$(selector).ysFilter({filterOptions: {\n\t\tcolor: {\n\t\t\tbackground: true\n\t\t}\n\t}})\n\n#### multipleImgs ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({multipleImgs: false})\n\n#### onItemIndex ####\n\n*Default* `undefined`  \n*Expects* `integer`\n\nUsed in conjunction with onItem. After a certain amount of products built do this.\n\n#### outputChosenFiltersId ####\n\n*Default* `false`  \n*Expects* `false, id`\n\nSpecify a container where you would like the current filters which are selected to be outputted. If in the filter controls you have an anchor it will copy that with all the classes removing any ID's into this field. Otherwise it will create an anchor per filter.\n\n\t$(selector).ysFilter({outputChosenFiltersId: 'js-filtersChosen-list'})\n\n#### forceHex ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nMake the renderer use hex when rendering products and filter. Used in conjunction with background color/images for related products and color filter controls.\n\n\t$(selector).ysFilter({forceHex: false})\n\n#### sortFiltersAlphabetically ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nSort filters/dropdowns menu to be shown in alphabetical order.\n\n\t$(selector).ysFilter({sortFiltersAlphabetically: false})\n\t\n#### alsoMatchChildrenCategories ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nSeeting this to true allows to also add children category products to filter.\n\n\t$(selector).ysFilter({alsoMatchChildrenCategories: false})\n\n\n#### onItem ####\n\n*Expects* `function(length)`\n\nCan add an extra string on a specific item index to be used in conjunction with onItemIndex. Length of items to be rendered also displayed. This is often used in handling banners in category views.\n\n\t$(selector).ysFilter({eachItemAttrs: function(length) {\n\t\t//number of items in array\n\t\t//Add string here\n\t\treturn returnExtraString;\n\t}})\n\n#### eachItemAttrs ####\n\n*Expects* `function($this, items[i], i)`\n\nAdd / manipulate obj that renders the template.\nExtend object with new properties and add new curly braces in the template that match these.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachItemAttrs: function($this, currentItem, i) {\n\t\t//Manipulate Item\n\t\treturn currentItem;\n\t}})\n\n#### eachFilterAttrs ####\n\n*Expects* `function(valObj)`\n\nAdd extra items to each item rendered.\nReplace strings, only *desc* is supported at the moment.\nExpects an object to be returned.\n\n\t$(selector).ysFilter({eachFilterAttrs: function(currentItem) {\n\t\t//Manipulate Filter Item\n\t\treturn currentItem;\n\t}})\n\n#### afterFilterRendered ####\n\n*Expects* `function()`\n\nCreate a callback to allow extra functionality after filters are built.\n\n\t$(selector).ysFilter({afterFilterRendered: function() {\n\t\t//Do something now. (uniform, chosen)\n\t}})\n\n#### beforeItemsRendered ####\n\n*Expects* `function(type)`  \n*Since* `1.3.1`\n\nGood for removing elements before filtering.\nOne variable is passed of type string defining a complete replace or an append.\n\n\t$(selector).ysFilter({beforeItemsRendered: function(type) {\n\t\t//Do something before products are loaded.\n\t\tif(type === 'replace') ...\n\t}})\n\n#### customRender ####\n\n*Expects* `function(insertType, filterObj, renderArray)`  \n*Since* `1.6.0`\n\nGood for rendering complex layouts.  \nThree variables are passed through.  \n`insertType` Either `replace` or `append`.  \n`renderArray` The original filter object. Be mindful of changes to this so that you don't mutate the object.  \n`renderArray` An array of objects containing items html and their original variables.  \n\n\t$(selector).ysFilter({beforeItemsRendered: function(insertType, filterObj, renderArray) {\n\t\tfor(i = 0; i < renderArray.length; i++) {\n\t\t\thtml += renderArray[i].html;\n\t\t}\n\n\t\tif(insertType === 'replace') {\n\t\t\t$('#filterItems').html(html);\n\t\t} else {\n\t\t\t$('#filterItems').append(html);\n\t\t}\n\t}})\n\n#### afterItemsRendered ####\n\n*Expects* `function()`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).ysFilter({afterItemsRendered: function() {\n\t\t//Do something after products are loaded.\n\t}})\n\n#### onFilterChanged ####\n\n*Expects* `function(filterObj)`\n*Updated* `1.3.2`\n\nCallback to update filter styles manually after changes. Filter object sent as a variable.\n\n\t$(selector).ysFilter({onFilterChanged: function(filterObj) {\n\t\t//Do something after filtering is finished.\n\t\tfor(var filter in filterObj) { ... }\n\t}})\n\n#### classProductNew, classProductSale ####\n\n*Default* `product-new`, `product-sale`  \n*Expects* `string`\n\nA string to be placed in render template for using Sale or News. A space is always added in the code before the class name.\n\n\t$(selector).ysFilter({\n\t\tclassProductNew: 'product-new',\n\t\tclassProductSale: 'product-sale'\n\t})\n\n#### newsURI, saleURI ####\n\n*Default* `new-arrivals`, `sale`  \n*Expects* `string`\n\nEnables filter to work on campaign pages where filterable products are selected based on if the product has the `newProduct` or `showAsOnSale` attribute set to `true`. This is because other pages use categories to filter these values.   \n**Important** `canonicalUri` needs to be included as product data for product links to work correctly.\n\n\t$(selector).ysFilter({\n\t\tnewsURI: 'new-arrivals',\n\t\tsaleURI: 'sale'\n\t})\n\n### Template Options ###\n\nThe template options allows you to customize the filter methods with extra classes wrap the filters with different containers etc. All following properties should be placed within `filter-id: {}`. The filter-id should pertain to the filter name i.e. `color`, `size`.\n\n**Property** `classNames: []`  \nExtra classes in addition of the default `filter-value`\n\n**Property** `background: true`  \nIf background-image/color should be used or text, useful when create a filter list for colors.\n\n**Property** `attrs: []`  \nAdd attributes in string format with {} for replacing, {desc}\n\n**Property** `wrapperGroup: '<div class=\"wrap\">'`  \nWrap all objects for the filter.\n\n**Property** `wrapper: '<div class=\"wrap\">'`  \nWrap repeating objects. Wraps each individual item.\n\n**Property** `inner: '<div class=\"group\">'`  \nWrapper per group, groups appear in sizes and categories. This does not wrap the whole filter only a group within that filter.\n\n### Data Types ###\n\nThe following functions are used with the attribute `data-type=\"\"`. Data type are methods of the filter defining how this filter interacts with the data. Not all data-types have been created. If none have been chosen the **default** is `s1` which means select only one.\nExample:\n\n\t<div id=\"color\" data-type=\"s1\" data-create=\"a\"></div>\n\n#### s1 - select-one ####\n\n**As seen in URL** `#cat~s1=value`\n\nThis limits the filter to only allow one item to be chosen at a time other items are deselected when another is clicked. If the selected item is clicked again that item is deselected.\n\n\n#### sand - select-and ####\n\n**As seen in URL** `#cat~sand=value+value1+value2`\n\nmulti selectable within group.\nrefines selection, all values must be met to show article.\n\n\n#### sor - select-or ####\n\n**As seen in URL** `#cat~sor=value,value1,value2`\n\nmulti selectable within group.\ngrows selection, selected article needs to only meet one value\n\n\n#### r - range ####\n\n**As seen in URL** `#cat~r=value_min,valuemax`\n\nshow items bounds two values need to be presented\ncan be used in conjuction with min and max to get lower and upper bounds respectively\n\n\n#### s - sort ####\n\n**As seen in URL** `#sort~s=value,dir`\n\ndirection and what is to be sorted.\n\n\n#### f - fuzzy ####\n\n**As seen in URL** `#cat~f=value,spread`\n\nchoose a value\nspread of values\n\n### Data Create ###\n\n\n#### a ####\n\nCreate anchor tags\nHTML using Emmet:\n\n\ta\n\n\n#### fakeSelect ####\n\nDrop down with anchor tags, use in conjunction with rekaf.\nHTML using Emmet:\n\t\n\tdiv>span+ul>li>a\n\n\n#### select ####\n\nNormal select use afterFilterRendered callback to turn them into uniform selects\nHTML using Emmet:\n\n\tselect>option\n\n\n#### radio ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=radio]+label\n\n\n#### checkbox ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=checkbox]+label\n\n\n### Classes ###\n\nNumerous classes can be reassigned. Check the `defaultOpts {}` as to which classes are able to be manipulated.\n\n\n### Initial Data ###\n\n\n#### url ####\n\nWhere to get the JSON object from.\n\n\t/loadfilter\n\n\n#### category ####\n\nCategory URI. Everything after the root and no slash is needed in the beginning.\n\n\tshop/all\n\n\n## Changelog ##\n\n**Version 1.11.3** \nUpdated distribution\n\n**Version 1.11.2** \nAdded `decodeURIComponent` to hash parser to read spaces correctly.\n\n**Version 1.11.1** \nCategories weren't showing up when filtering on campaign pages. Now working. `canonicalUri` for product links to work correctly.\n\n**Version 1.11.0** \nNow possible to filter even on campaign pages such as news and sale.\n\n**Version 1.10.0** \nAdded a new possiblity for category to also include products of its children categories. Setting `alsoMatchChildrenCategories` to `true` enables that.\n\n**Version 1.9.0** \nAdded a new possiblity for a custom price template. Needs to be used in conjunction with `eachItemAttrs` to set a property on the price object `special` which will then invoke the `special` template within the price templates. Used in Artilleriet for grouped products.\n\n**Version 1.8.4** \nFixed and cleaned up safeguards, remove duplication of functions.\n\n**Version 1.8.3** \nFurther safeguarding against items not properly formed by cache.\n\n**Version 1.8.2** \nSafed items not properly formed by cache.\n\n**Version 1.8.1** \nSafed the alphabetical sorting if the object is empty.\n\n**Version 1.8.0** \nAdded an option to remove price if price is zero.\n\n**Version 1.7.1** \nAlphabetically sort filters - excluded categories from this as that can be controlled via category sort order.\n\n**Version 1.7.0** \nAdded option to alphabetically sort filters.\n\n**Version 1.6.0** \nAdded a new callback for custom rendering of html for difficult layouts. Added a new class to filter rendering function.\n\n**Version 1.5.6** \nAdded a new class to control swatches.\n\n**Version 1.5.5** \nFixed bug clearing disabled's on first filter choice.\n\n**Version 1.5.4** \nRemoved possibility for limit to be set to 0. Limit must always be explicitly set to a number higher than 0 to ensure the choice is understood.\n\n**Version 1.5.3** \n1.5.2 was tagged incorrectly now is 1.5.3. Made the matching of categories exact from ^category to ^category$ reducing the number of duplicate items as all items are in containing categories.\n\n**Version 1.5.1** \nTweak to resetting filters properly when changing between options.\n\n**Version 1.5.0** \nChanged how the filter options display disabled or not. If a filter has options that are multiple choice then the filter will be based on the other options and not the option currently being chosen it will give a list of other filterable values to filter with.\ni.e. Category -> Backpacks and Accessories are chosen. The user then chooses brown. Previously it was not possible to then add more categories but now all other categories that have something brown in them will be available.\nBe aware of the value that can be disabled and selected at the same time I suggest using strikethrough for communication purposes that the option you previously chose is now longer valid but still chosen.\n\n**Version 1.4.0** \nAdded touchevents to more quickly read variables from filters. Updated mainly due to changes in rekaf.\n\n**Version 1.3.4** \nAdded a new class for retrieving and updating total products.\n\n**Version 1.3.3** \nBug fix. Latest filter now correctly selects the latest filter in object based on hash.\n\n**Version 1.3.2** \nAdded a an argument to `onFilterChanged`. Object of all the various filters running.\n\n**Version 1.3.1** \nAdded a new method `beforeItemsRendered` for listening to before the page is to be re-rendered.\n\n**Version 1.3.0** \nPossible minor breaking change. Filter descriptions were using keys instead of displaying values not sure why this was the case may just have been a bug.\n\n**Version 1.2.0** \n0 is removed as a value to reset filter. 'remove' or the same value is the only values available to reset filter with.\n\n**Version 1.1.5** \nChanges to how pagination works. Traditional paged views now working correctly. Support before for only appended items. Individual page navigation is now independently set instead of paging parent class.\n\n**Version 1.1.0** \nFinal fixes to the related products. New features also added inc. `outputChosenFiltersId` to paste in filters which are selected. `forceHex` force use hex instead of using image which is default.\n\n**Version 1.0.0** \nFilter now has a complete feature set. A few features are still available to be added, these are regarding more semantic filtering versions i.e. range scale etc.\n\n* Variants are now handled by the filter. Showing even which of the variants that is available.\n* Classes have changed in this version to a more OOCSS way of doing things. This means if other clients update to this then it will require class changes on menu etc or if you simply state as options in the filter.\n\n\n**Version 0.5.8** \nChanged the order in which items are added in additive filtering. If several products are chosen in the same filter then the products chosen last are furthest up.\n\n**Version 0.5.7** \nFixed paging errors. Referring to non-existing variables\n\n**Version 0.5.6** \nFixed a bug that showed categories in specific depth. When those categories had products directly related to them.\n\n**Version 0.5.5** \nFixed some bugs that were also in to \"beforeAPI\" branch. All anchors are updated with hash on filter change. Fixed a bug with reload with pages and clicking on next. Added selectors for pages/items remaining.\n\n**Version 0.5.4** \nAdded in fall backs for possibly undefined price template attributes.\n\n**Version 0.5.3** \nAdded in a news filter template for price.\n\n**Version 0.5.2** \nRemoved some debugging data.\n\n**Version 0.5.1** \nPretty much reverted changes in previous commit in 0.5.0 no longer is dependent on changes in SilkAdapterBundle due to refactoring of category arrays. Default sorting is still following the correct order in Silk from here on out.\n\n**Version 0.5.0** \nDefault sort order now follows correct sort order in Silk. Needs to have SilkAdapterBundle > 0.4.3 requires filterDescriptions > categorySorting.\n\n**Version 0.4.0** \nAdded placeholders for sales and news classes so that sales or news can be used in other parts of the item.\n\n**Version 0.3.4** \nAdded locale for sharing.\n\n**Version 0.3.3** \nFixed titlecase which split on foreign characters for uppercasing. \n\n**Version 0.3.2** \nFixed sort by news.\n\n**Version 0.3.1** \nAdded a new rendering attribute. {attr|'object key'} i.e. {attr|badges} added titleCase function for doing titles using the |title. Tidied up the code a bit also, formatting and jsHint.\n\n**Version 0.3.0** \n*WARNING BREAKING CHANGES* Filter is now working against a new JSON object returned from Symfony instead of directly against Silk. Some added features are the filter works against all products category agnostic this means also that the category needs to be sent in as a parameter. Pre-sort has also been added as a feature along with some more classes to easily hide/show products while filter loads.\n\n**Version 0.2.6 - Branch beforeAPI** \nTidied up several issues. All product URL's hashes are updated on filter change. Price is now sorted with sale prices also. Fixed issues on first load of products.\n\n**Version 0.2.5 - Branch beforeAPI**\nFixed an issue regarding reloading of category products. Not all products were reloaded.\n\n**Version 0.2.4 - Branch beforeAPI** \nFixed problems with urls not assigning root correctly. Fixed sort of currencies that are prefixed with something other than a number. Fixed fallback for filters when sort was first selected. Also added ysFilter-init as a class on the filter.\n\n**Version 0.2.3** \nPaging problems. Hash didn't have parseInt. Special use case for images where the image was connected to a variant despite there being no variants.\n\n**Version 0.2.2** \nMoved replace items on first load to do it only on `debug: true` added possibility for remove button to be a sibling.\n\n**Version 0.2.1** \nFixed on remove of last item in filter category, filter options are refreshed right, previously only worked on .remove before.\n\n**Version 0.2** \nAdded multi select as an option in filter, added a new listener for on change of filter.\n\n**Version 0.1.3** \nPages now show up in URL. Possible to load in to that page.\n\n**Version 0.1.2** \nFixed a bug with color being read as an array and outputted as a string\n\n**Version 0.1.1** \nFixed category parsing, was removing a letter if there was only one category.\n\n## Understanding the core code ##\n\nAjax request gets three major elements: `filter`, `productIds` and `products`.\n`filter` has arrays of which productID's are relevant for each filtering mechanism.\n`productIds` are the ID's used to match products and filters together. It's an object mapping array position of products to their ID's\n`products` this contains the information of each individual product.\n\n┃  \n┣━ init  \n┃     Runs first this gets the AJAX and is the starting point for all further interactions.  \n┃     We also read the hash here to determine the current state for the filter.  \n┃  \n┣━ preFilter  \n┃     Filters out all categories that are irrelevant and reduces the data set.\n┃     We get our currentItems from this function and relevantFilters.\n┃  \n┣━┳━━ buildFilter  \n┃ ┃      Using the html filterControls-group creates the filtering html for the user to control the page with.  \n┃ ┃      This only occurs once on page load.  \n┃ ┃  \n┃ ┗━━ buildFilterTemplate  \n┃        This is called per filterControls-group to render each of the filters.  \n┃        This is the where the HTML is produced for the html filters.  \n┃  \n┣━┳━━ enableEvents  \n┃ ╻       Called after the filter is built and is only called once to instantiate it.  \n┃ ╻       This listens to pages and filtering events.  \n┃ ╻       \n┃ ┗━━ updateFilterObj  \n┃        Creates a filter object which determines the state of the filter.  \n┃        Triggered only from events, when the customer updates the filter.  \n┃        Sends the obj to the hashify function which updates the URL.  \n┃  \n┣ ┳ ━ dehashify (Extra functions run if hash in URL)  \n┃ ╻      Extract information from hash to creates the filter object.  \n┃ ╻  \n┃ ┗ ━ reSelect  \n┃        Using the filter object disable certain filter elements.  \n┃  \n┣━ gatherItems  \n┃     Based upon the filter object intersect the arrays and deploy the major logic behind the filter.  \n┃     This listens to pages and filtering events.  \n┃  \n┣━ updateFilterHTML  \n┃     Updates the HTML so that the customer can see which filters are still relevant.  \n┃  \n┣ ━ sortItems  \n┃     Sort items based on the products properties.  \n┃  \n┗━┳━━ renderItems  \n  ┃      Define paging and send through for looping through the product templates.  \n  ┃      Several callbacks here to hook into for editing what is rendered on the page.  \n  ┃      Final step before rendering out the products on the page.  \n  ┃  \n  ┣━━ renderItemTemplate  \n  ┃      Connect variants product objects here to show all related variant information.  \n  ┃      Runs through templates received in AJAX call.  \n  ┃  \n  ┣━━ renderItemPrice  \n  ┃      Uses relevant template to display based on price object.  \n  ┃  \n  ┗━━ renderItemReplace  \n         Major replacement of product attributes.  \n\nSome helper functions not mentioned above.\n`relatedToITems` maps even variants to objects in `products` to be later rendered by `renderItemTemplate` It's used in `preFilter` and `updateFilterHTML`\n`hexOrImage` pertains to attributes whether they should use the hex code available or use the image. Image always takes precedent.\n`dehasify` reads the `window.location.hash` and turns it into an object for using with the filter.\n`hashify` updates the `window.location.hash`\n`titleCase` is a filtering function for changing the output of the productObjects. Use in template with a `|`\n`getLocale` if this needs to be done.\n`keysToItems` Maps productID's to products\n`unique` Takes a simple array and removes duplicates. Don't use with an object is it doesn't test depth.\n`intersect` Takes a two simple arrays and removes duplicates. Don't use with an object is it doesn't test depth.\n\n\n## Development ##\n\n**Requirements**\n* This plugin requires [node](http://nodejs.org/), [gulpjs](http://gulpjs.com/) and [bower](http://bower.io/).\n* Follow JSCS guidelines a styling-example.js is also included.\n* Run `bower install` and `npm install` to get dev dependencies. Bower and Gulp is assumed to be running globally.\n\n## Contact ##\n\nThis is a small plugin by Young Skilled.\nContact [support](mailto:support@youngskilled.com) for more details about this plugin.\n","readmeFilename":"README.md","gitHead":"c187f0a868095a514c174e8f8db427a0a39b907e","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@1.11.5","scripts":{},"_shasum":"34dd1b5af353db9c833871305aaca2ed24888dbf","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"34dd1b5af353db9c833871305aaca2ed24888dbf","tarball":"https://registry.npmjs.org/refilt/-/refilt-1.11.5.tgz","integrity":"sha512-+hbZCmWTjhqzsqD4FUpKBdMM7/cMG2zDg43teXEF6+GLapS/rUDIltSTVkbATUjgRHH53ChsspjX4MPBOuY2gw==","fileCount":21,"unpackedSize":487747,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbvGV1CRA9TVsSAnZWagAAPmUP+gIMAF9HodjWb56+rpel\nEZFfVfLDRJjRWDAWF6oQmb2DBy4wObZx6VQyPo1yGURb3oCHvby0HEyfpMaV\n6/5e1Hh09gtcQuU8CGHjRi4ZuQAP4wMvpeKiWkjkH/XnhxNTJxk5eO6zUvfJ\nfpugZhzkrphKhxuecRY3urpFwJiQvpllBLg2A9+iPYZ1O6HCCtSBpOwTEZZ9\nV5ZFiglb5EUJ97/eLd0xZoxe1TGCGIfHF5VqTOHWGofsC1yeTFDxOU5FzJ/L\nTEntSYUrgds5JwOIaajW+SFZHDTVZnRYvDiapnRef7jl5vhQnB6LEa0hezuo\n1MANRUSEg6X4ek+0t08msRAks7nLxyqmXzjaakyfnKNHcYUWAIRdlZ86bzzA\nSxM6KObu839KvDy8TC57cvxTvoix0rePNTQBKEJBGFtfCvVkw9wlFPRUQ/yS\n9O6G9AuRIGlgKtV5g/yZmuqUc8VP8YLrDV563Do/a/tYqbn5VVX7vT/Nqu41\nHfmn/ePMkh5gvm4IBKNUOW3cW0gIuOXr6XpnZ2Bl7pN+Wb/EkjeNrtLd08Zd\nbX1L7bTQHgECIlaPY7qpdr5GogemVw5LTitAx2lZFnpyTwpNc7OBF5FRHs6i\n/+vGUqEUFELBu4OEI5y96LDzgyz41GYYulhxhJDZxrL4v7cMi6tqRd7n7uHH\nSJzk\r\n=QjmI\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICObPPJt8O5zXXOtm1qTg1Tyu2UYG7r59O7aiRcw/HonAiEAtjmDvRvQKf9i0bZDpDvhy2795beiI0j0FCxlYhpm3i4="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_1.11.5_1539073396620_0.7655796225873384"},"_hasShrinkwrap":false},"3.1.0":{"name":"refilt","version":"3.1.0","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"3a426412cae80e9abdf1ef036c11daa72eecd468","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.1.0","scripts":{},"_shasum":"7ddf669b3df5a36326f7e80f285d629683fb326c","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"7ddf669b3df5a36326f7e80f285d629683fb326c","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.1.0.tgz","integrity":"sha512-Fba1f4p5fPBTZXzYTDFUXPPttniMxiWL92afjcsBL+p4yQ+altUgwgVsZR+mmzCYChh1AlIyhbSd+wNpAQ4i8A==","fileCount":19,"unpackedSize":510481,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpJ2DCRA9TVsSAnZWagAAsDsP/2BvZZCDUzJTlMB/oHyR\nHts03FisL4M73Pp9tz5Msr11xL0Ye91cphmoiX3XD2MQ1LX2VIQ5atxzshIq\nKoFDPEVwuZwQDHPKWFD2Q3f+4/GPkAhBWyE+j+sE4wKW6Coxoc8tDo3iTIuK\nNW3n8okIyctJaf474Kbv/xn7iWVhq+3RVnSDU8+fi13OM+pZgh5Wv4J1yZtQ\ntwXWtdos4R83+lNGdteEB0iUsmQSbzOo2eMT/0bGvjPwNUp5Jv6iZsmkOtnG\ny49phb2QBTzjsYADeh3IttqUm2cDC2/M/HIChopoQi01eoqD7WHNbpj12Pr5\n+3B2CZHtJ8Jp77LbyWb/qFGTXoELPk1bdgNndkas2MiVt9Cbb17TtakDG1Ev\n4YDe31LUf4bwyEXdEca4x7OE2xWkf6GUfOpvsdwRywm+JVV7MugEVp25WLdl\ntjm9NGdZHM7dIkSZkBXADuovbbzD7/Ef5mk00G8orSlyP4OfoAv+bhRNA7NH\nehPo5jS67KWhrcNoM1myYUx17vtsApeRXtJe84r9ff9ITyYNFPwel2vEV6bZ\nx3VFYYP9NM0jjKAIkNqMRn6eBlqhihJB3TfZTkHpbkUwLplr0CiOpK3kzuQs\nZdXWKoXtsCE3dksQg+uhh3PdtvXqCmqj3VdHkKJxh8pUKPTtAmkDagF56/5l\nab8w\r\n=WYzo\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC+vOAkkt2OK6vlgv8UJ4xZ03IVziRs5yWVqyrz18hCuQIgECfcylZ4aqz7mO/TAzKMFPR7UFebKDJJQttoa4nfymo="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.1.0_1554292099129_0.26415217523211143"},"_hasShrinkwrap":false},"3.1.1":{"name":"refilt","version":"3.1.1","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"f9a330e51e56bdb85ad95c65e273314ae25ea230","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.1.1","scripts":{},"_shasum":"8e7db8571c1dd2984e7339e0454a1d4d70ec7fed","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"8e7db8571c1dd2984e7339e0454a1d4d70ec7fed","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.1.1.tgz","integrity":"sha512-jxulFQz5y/WTNP9ER2VHpPOoUYzRI3ux6bap9tkS/AQDFt2dIb5tmUgOB+bgqYDZgVojJd7N1YOwiQOM5GRBOA==","fileCount":19,"unpackedSize":511341,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcpJ9cCRA9TVsSAnZWagAA5EoP/0OxhOybTjv55PodQ43T\nWNI08TuHshtP+6FQFOQKK5Asr2c/UQqw7qmGtzi7x/i+nPN+kn5bf6LSvTML\n2a9oE/WohxuXmLfyboHAsyqpXBVRDAN2qVGx57xTld4iURaxoeWOA9B+miLC\nob03RGMx9BciaVixAnWpvYYMEl8P1w2rwlDKTWSlubWvLtaJ6lOVeaDpmlOR\nWOK03WC5nE+p38ZRTSHE2fKhh3GhXpvpiG4cHz150uZg6N4Zz5XbmR/qenDW\nsDiqagQta/Avxu0BqjvxDe7HxUyaW5vh7RHZFyX5Rje/j9abKk9uUfTpu30X\naFx6XgqqCRMYICGArejnw2TcVIEYJXlWqC/scaZQbbbJkhg9NEb2B8+DKGvr\nCksngAoFMCVVhguMuRke0d84yj9F7Y4vyrM8m39XtWLO1aCcHUKOOPBEyOwn\ncPf5ofm5kSgHNd/4OXKz7wCZDsH7RxhWbml7yIrExtnmsqxWx1duXNDZHP6F\nMQdTPPpi8ZEye9VvIOHGpa8UwBPb6UypEh+MRBK6IGjwz5MSzjJQ+luWoP9u\n6YwAWOuj+Tb17dLa3IGf0V5kGxi6f9jKC90opQ2g+Vz1yXPbv4r8xYUpAI6k\n1P7rR3UqRy5AObmcV6X/G3gtSVg6/lbiU2ZLrfb5cqHZPFALDVhDdiG+snsR\nyqY2\r\n=ayH2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD+AHaVMdgBRQQdgZ58vbtAc9fT3CscsT0eQM8tvuoUvQIgcjOII600yO4nIk+O22jOCEaQAfkfqkxp7X33NoVepcg="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.1.1_1554292571906_0.06716311653412999"},"_hasShrinkwrap":false},"3.1.2":{"name":"refilt","version":"3.1.2","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"c8c607ba21bfe148b9a690d975f898e523e92288","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.1.2","scripts":{},"_shasum":"ba3bb30bfc3285cc5f323cab8de965f83b7309b9","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"ba3bb30bfc3285cc5f323cab8de965f83b7309b9","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.1.2.tgz","integrity":"sha512-8T3jMq9tJ8VxiI0NVFcUoSh9Eh1hyzTjTM0SAlN0y8IqbY1qP4onKEaSzaNOZ1l1Myxrq8T8Sxlb+WKEcR3usQ==","fileCount":19,"unpackedSize":512396,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdB5BsCRA9TVsSAnZWagAANCIP/id2Ocd+MgWOOOyYAaSC\nLocVoD/Nu37Jw+NcH8Pw+XlfOOJKOOguLz6LRyog2IAZKW40nT/PwpiZAZb+\nDlKtY7q14lxswQCIswG+LZifnX/l0K28s7BHRduZU7f9UBN3Dh6EbKIfIeC4\nYlBPYuxty8llyBq2e9gZwrrq1Uh2EAvSd/5pVlVrfpzNxZQPkhs1q8j1P0mq\nLXESN4k7Z9VSLEodVMbAT/jJRepN/hL3d5ueh1FMPMuVPpYBNu0fdnDKMFvm\nASrbo+1lmRKmHQ7h+UoGH7ibJL4G5u7Psrln451oZMUtVte+j1w2wyg/yCH4\npr7oOBvRPMXGWxDuM3smtr6XpUQf1oekESDyX9HMbhvoPuG024IuSv4G6g03\nb3XlMx19z9bvhwTCShxIY22vrHTjJPf7s/JnKujC+7ygCTTtDeu5Kh+ItEgJ\nNYg+BhVSfvme55EnRDz5C6ogGs37JxSROQbuMik9gxE347gYuSvUhp9I4Ovh\nYHUreBB9qYfyD1McrFxBtpLMcrJaib3MBoWCOox+10ftjYmXSmwORB6Gt4tS\nJi1l5cHO4l0dtJMCWKpTjMNUIXIgeaqJuc4SGNLAF/j8iiuaNaIaCmb7qkTr\nauHsf+9C2I/2zt2qNLgvNMP1hHxUmZgYqp1BphUpHqW9jxDNsqfu+1WVC0k3\nWbc1\r\n=DqIv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHHaCuplbO0QUl4kZWea9I7awvgw7JbIjmPx6TxgGEV3AiEAmEAC+0LDwu5Ph8VCB7zn8m93MmXeUs0+urP3ypfw+CI="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.1.2_1560776811070_0.5340550600598204"},"_hasShrinkwrap":false},"3.1.3":{"name":"refilt","version":"3.1.3","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"e74c38f480e368f518a9c530d76b8159daa19987","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.1.3","scripts":{},"_shasum":"c2f4c4001a010234fd5cc6cfee4c1638ca2f36fd","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"c2f4c4001a010234fd5cc6cfee4c1638ca2f36fd","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.1.3.tgz","integrity":"sha512-uoZl6kgL5tTolSrFTAKPLqWptZPzX+dCdr1c0ERwb7l+1Q8TwQSAE90eoof+rtTBhZHbv2QFHfD4dj1a1X8qKA==","fileCount":19,"unpackedSize":512325,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdEhE6CRA9TVsSAnZWagAAaKwP/2tyKIrqN5uOKX3S5ASE\nJMqcI/3sgLBLGUN7mOdrp14OpGpmU3eI4/z2F+00wb7KfDDV6XGbLMNpNGAB\nCgZSGQGB8GCeqLeC4BokIxYVU/60gU81WhOqzHAtc/DXvdSF0Cjrc2LrykOg\n8NyjxkeSrBTgIl6Z3PAm7SpbEu3s/P5DI1CX3wwh3bMCiKchUt2ghJ4iJq2O\nV6asAlp8G5C3v4GYRISK3A1U5SIBVf73DTtjqYvn5mRJ7DhATVMo84wMy1gp\n04eSpis8361DCeZBeg4tWx7fPxmvV6ZqTwXI5o6lqhXuYg/4fmwP1SEm+2uu\n7haxVdNPEYj33scbPL59MkmkAPYifZ0KSZPX10+wp29i/8CIroqSWlarTUSv\nOh8Ri5aFkzzZJ/CKAEGncZSsglreSO2HHJmLDsiSJKoEO4tqadThUdSfa4mv\nQHIKvaVSZYpgJyTBE2KOHpfWRKQ34neR7xlZ6IUe4hntrBaUJ2TNY0WAnbz9\nwhwMYbNVKTPBAIFc3AkYQtfiecXeI6QMEio8pvz45XnbMnwKLBRG3r0Y0n3k\nQERnMPWBcISj5Ay0Ut2BuR9adu0QIIMLj8gCthFDrqRtPlJRa0pStc4YT/eL\nJvZAlMne+0jUDl6hAXqMZ9FynaBmlGsKPcluFM5/pp1Fj1njmK73Ck8xJHiC\n5XgT\r\n=Vv8f\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICzs6vnwycHopQu4EDqsXp22eCLYaCJMlExunjJFNxtJAiADFINcbRWzgwvlLXRGDYNXTqkQ0r4bjUQWgtp9LYreAg=="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.1.3_1561465145796_0.4191779882218327"},"_hasShrinkwrap":false},"3.1.4":{"name":"refilt","version":"3.1.4","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"4cfb67bdb3c07a403c3f2bbb3ceff10228bedcc8","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.1.4","scripts":{},"_shasum":"929cfb287ab1eda71f210a971c677ddfd3c425bb","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"929cfb287ab1eda71f210a971c677ddfd3c425bb","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.1.4.tgz","integrity":"sha512-qtDTVAXYZ4dA5wNjF+RBGOgXKv8sawi0LqA9z3iNVekQVD7El6OsPkv0qO4M943fwBsAIwvYev+9/+ui2ZvzFw==","fileCount":19,"unpackedSize":512816,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdbnG+CRA9TVsSAnZWagAAZDsP/jq3fwZf+1LL78cMe2It\n6oUfVi4jqSdk1Vr0LMTPBP+T0PdmYyNBC3nN0j0E+AG6FtZnvG86nBIVZwbQ\ni33DVQzrw3ABwyNd4rK3urds/Hghu8bektG5xvK2gFzqKZMcoxDR1Fm+Ccev\ncJbLpVame4SRWj9vVBmLxB7InIol62kUBzbnFUxn6MkB/u5tYnUQl74uw55V\nC123ZvTGHRPRJ8noJvBAXjKynP2FCqdmwZ+fEW3xmkd+sed03q635uvwGuIG\nLYuUvFW5e82xJKFUQSngAbJV5xaCjOMxDIxrs9X8BvJLPtIJxGygzk3BpVhJ\nIVXvGaxSIWnf5NZBNKHOy5BoLbF/DxwflAjMDQik8UtqUwFchJ8S+xhCp3A9\nJX1rCVszaUtjMOOtObkGsq5zOqdiHrH1vV5DKK8XpxYcqgQdwKFuvjCZ4oQ5\n1kw0+ekW7Bu1OtI8klt1xAtPvEAGVlEISfRzmOVn90kDcLePAMcC8kTsOgjE\nvzkNPuvx0PpQNF32bF3XqMguXgasKwfJnHEYS0/tx/0QfwYVJYN1n5DQ8GDB\nR4mmcXUWs27r1Sz3zFhalCuz5GWTnh6LzLijXB4bawN0nvfginZzKl74QJjZ\nCx5B1Ow7PxRDvL+fZFGV1/Zv9RXKL8WnbQJh1RxpAj+vyeSqZ+QKo9J2lgct\nCWc1\r\n=XcBr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcE4pQMNjyTGO7MXzilEGgMQUtjkdW0Hq/9oPVG3iFYAIgJTR5FkNY5vKN9tr4tXPA0U8LEvqPoSFCBZO/Ut7B9YQ="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.1.4_1567519166126_0.7156864208527138"},"_hasShrinkwrap":false},"3.1.5":{"name":"refilt","version":"3.1.5","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"dec2538e0e789d51542a040b5383162947b6f317","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.1.5","scripts":{},"_shasum":"298ad6690910314a67ef258ef2382361655bd901","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"298ad6690910314a67ef258ef2382361655bd901","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.1.5.tgz","integrity":"sha512-JxeDwoSprPoUovUs51dOxPcpATU24FoOAXp8PdH5m/Q4vZdIJmdtOQcKINL1iV/FLhHnREJt6iMmJn4gEKFxOQ==","fileCount":19,"unpackedSize":513008,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdd7pTCRA9TVsSAnZWagAAN/UP/R/Hcf9ws2mNGcbMZHcn\neQUQL7QU8tL4LjE73N+nqvXZ8aPPm7L4eCb/LFcgfHwJmBnHX3equ5uMNLO5\nEGFlusr3RIJTBjEqaclERbbRlZzbTGVw77OePuZTB/RvbYj6nbBTbu80G5Sn\nnbTAOArqLM1sYz9lEINrJc/mcPHB8kpSDnQKsyTaNKF5mWamGKW22IseoWRO\nWskcd1ZPsIolMnP9GOC4cXG9gJHkn+126LYNvzsouqtePj+hDe8OzTEtmzq3\nyteuDGqa6h4ntUGCnDUvogtChCmqBp96m7Fo9GQdXGYVZdcEOf+UdVtHx7yd\nEnsQNLMTL5RJpdB0SziJx9f8tkQvcoFwmII8fy7FkuwZXDYpbR2zslYz67aQ\n60+40QECsDyZYtnKpWtZGAUdECWSz8NeJ/s7+J6cAAgmnWM6slh6Mlwls5te\ntWlv3lJOwVWQ9XEmni0Bryp7yjAxCHynB0HbnMUEgoUp4ODZSo8MuE/ct/L4\ngaULo59P+PDU2EJKICFt8+AVPRBelqgb8Pn0DfLLYuR/28IZXuwjaN9yKHG/\neQVb5u2tihlwOyHNznM9/+N3LXFDL9lie5BPCpdF2RKZHOnbGXRgGqKebigt\nw2XSXWBfxao9eVfQT6bfh3n7dmL0E9N7IM4jFJq1mhAE5jHX7MMWf5IpcjNL\n6fVF\r\n=M7Yz\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD8QuA3wyevSjgdY5ajGAfuh2mMqN0/l77me1Leh2SENgIgf0cRWFe4KgvVfOITTL/zIzpx3fm2JVr0dw5I80vR+NA="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.1.5_1568127570289_0.6494652021522176"},"_hasShrinkwrap":false},"3.2.0":{"name":"refilt","version":"3.2.0","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"c145805a376d4b2e53b46ec9e2bddaeb2effc3fd","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.2.0","scripts":{},"_shasum":"d10723bb787d2eaf6a5d1e8cf4807d97645b8313","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"d10723bb787d2eaf6a5d1e8cf4807d97645b8313","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.2.0.tgz","integrity":"sha512-UYtWkwKsP2Ni0ZvSKxsVmGPEOcN4WClFz7msc8aFyqhulmVGLfbfLF2fiMaJmWgUH0RV7rCLxxwyC1NWeGUU3w==","fileCount":19,"unpackedSize":513429,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdlz03CRA9TVsSAnZWagAAlJMP/16TuOK48EP07DaVAspO\n2GaVgEVta2YjuQ4CjSSsN3/oKTirMC/VgiyOkCCqBBPb8s3JENg8snQriRiO\n7jQ6Oo9Z4uR01JlleBzpYWXF7R4iG1RTZqFw7u0dQxCdBxVzlwSk6n0+gy+R\n8wAzbSgtheX8BRETLwMfgFVLc5uwObskQtPz0eX8HPwKb+j28anrdblhBm9I\nQGn5iN/Mqk6yopPzfEAyOnGmcThcKeMgK1UptwTYBWVmCDX4Y8N7UXiRCbe+\nAibgRbyNhGBhdsWXTxfWhdhlmU0lNdVjdFsNyhmdBhWlgMuvYg/Ho3KTHxro\nYCqycUlHkltKwE9PaNMbPl6i8eRd76DXB9Th3d/y/beEfNQd6HnNINaXvjh1\nrdbNd3WMhBfeBkDOk+4ZTgrq0IhaKA2iCt8tDlgAmqtWzGwtJ9qJ+DRWIc7J\n7R1axWiEQckpvOyj8aUeO7a8SgP+FvK+U532lLdhSIDEVu2b7oC18GyUSI59\n4J+IjWkgy4enGk4VBslXugv2i6P3ZBD6cBfX4JAyFFOl0/sFGLCe2UmIBaxd\n8osmCIm6hcHSAyxT7nzmeR11PRPN3FzfpI7XJwCbO6PLcdVnfyhh645Lh3zL\n2IsZZiLH3+MfqZgqHZ3EgmylT9G/iaR8PByw+28elRoxIUA0wcfncQOf3pdj\nryqi\r\n=/7vm\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD8B20Esm5fLuyBCk0cZS8Qe9uihSOZ/EJubLWpVKNHLAIhAKRZQTPrK3IKqD7t4t93hkUL0MdDtOxWv99ifHEgXlaQ"}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.2.0_1570192694316_0.8271714379124948"},"_hasShrinkwrap":false},"3.2.1":{"name":"refilt","version":"3.2.1","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"683f13c22671a7d5b9849bb781b482a8e8aba380","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.2.1","scripts":{},"_shasum":"ae4fe406193c13f4bc3d7d16d013dfd9db9e2546","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"ae4fe406193c13f4bc3d7d16d013dfd9db9e2546","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.2.1.tgz","integrity":"sha512-DUR2QkS2mwGpoZOKNDGl3uTyTyPaOfl1QmXm3ymbMWxTIUemlPMO/J5wAW0tG0PPot+0bOF96F88AovL+Uum8w==","fileCount":19,"unpackedSize":514071,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJduYYACRA9TVsSAnZWagAAPHsQAILtJ5JEL0ygcXCmPJpZ\n7ZsU3CazdaMa3vrTSYiQyw24sstErYKm9J386BQsHunNQT0lJQ7VyZVfOpU7\nQUD+SrI822mkokp0foH0BcUlTsRLYfSDzOhas7/YU4FAidFqnrXzWC9esdHE\nwxnhcimbp+LZK9+e8ykoKnBni0qnigMqtotOSpAvY7zXHJ4WV/luBwuXEBid\nSoYsf+vQqc2/w0eVHQoW2CuC4JLmURllcO2b6PF/FyhpKNOcqDPW+NsLj3Vm\n+HLpr75gYq6LXf58y116KZwfCDVhliESOe13tHCqUGOsQqDTwjej0KOj2n2M\n5gaNeFYZ265z5DVEPQfJGcmjoO5CfMF/iccbIMTEc4nG2XySIo4fh3LEZ8OM\nWOTNQXK8q3ux3iond15Ri3SCdzwgTyKgnXnPsJ3uHO8Agvnco1wuk+4PGSOp\noBQMLsNCQV5dL23t8Uotv8i6dMvcuNjkJ5RmjRnqaB8T2YyI2m5faYEZjeyi\nMAkrhA6AHYh+WKpZxxhT5fjAk53qg8uJyccklJ3IPicN5F8UHYq427mvMd+V\nQGjp7r4UCAUw6kUhe59IIpiA8aPhhe0YGZqoZmpUByzGtXZYP8jwFelLnDUn\nodggEeG1J56czvsMN7CDljyO7BJ6wH3r/RX8N7P91vs+XUViQ6ImK9A6iths\nO11C\r\n=rLms\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBuhwOEa6iXnJII2nZ7vLMo/GXQzCJcMw/Ii1KMLrFL3AiEAn+7wFTdCuomCgVl10IvM8tu5ncX9IvtQYHXNXnSVMMk="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.2.1_1572439551688_0.6714445930652433"},"_hasShrinkwrap":false},"3.2.2":{"name":"refilt","version":"3.2.2","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"1d6eb611c5c2b420bae6670ad700eeb2305e8e57","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.2.2","scripts":{},"_shasum":"c693cd69963847a52c72a6d8c014bc3bb4b1db9b","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"c693cd69963847a52c72a6d8c014bc3bb4b1db9b","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.2.2.tgz","integrity":"sha512-9+dU+2c6nEzzdC2YiP491TYhBp766pS3vk9U1HsO/RgjwVkwiEWs9YCLzoWxMRgXzPttEkuvmc2kpLS0ez6rWA==","fileCount":19,"unpackedSize":514411,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeMt0kCRA9TVsSAnZWagAA9SEQAJudodL+zXR//Ev5/wnj\ny5ug4ZranW5cXZo5jUwEmWtBIGuxFOL8r4i0dJcMQ1yYKmb11HLUTOjlCDwn\nfElGtZbi6Satx3ngmlb55NyLp9HJZCJLB58iwBjUKAYNCaB1xJwIBCAg8T3J\nhWLH4Yozeh16JKVCt7mBLiV7lRBONG0Lq5wq1PzqurVXyZtvL/sMYholincE\n/TtYiv5bnMKLGkLtglTzQHJdBlwUjjfEwVvfSljCXsilKTOO+U/omUs/+ukm\ntxjgDpGwAbRyfysMrMkjF1bh22M5f/Qqaqa8IHl6QLfsFKq7PbVz6metFsme\ncss5hfdxiohTLkDA0JHhkWl4NA70lm27Ybrk+UTEZCdzvyonVb3Oca2j2l63\nc18Bp4sjCasKmde/EZkBkIbwvomC4+Eefj9bMnQ9i8G2I4+ipAAD7vi/EAHE\nfy6ivhQGAeahizIeHMDxPqESCwArnWklnqhIzKCIbHsi58l65C5owwZrWjaY\n5B5d3A5zVEb37Dsi9A5JJFIB1nJ6De3ny53cPtxg3iD/UGhyPv03yKJhUSHu\ntZPJFhOmTxNuTSe64zOHStfbPBGBhelxBEAnfU2iPHLgLtUT/pkKojtD9fkq\nUk7gtkPrRsB6ar6cdtr8qFiVrIEI+r0Y25EkiOgnUzxtY1xKIh+s3FXh8Swh\nh3Eh\r\n=EBut\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFCAkHfBxjrPTIuxZtWNF3GcTgDm9VAeQ8As9ApY1KJ/AiEA5Haw5SDibvX2+TMEgg2OUwULT/AteBwgtmtUmCpid5E="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.2.2_1580391716163_0.6035192007769017"},"_hasShrinkwrap":false},"3.2.3":{"name":"refilt","version":"3.2.3","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"b72b1b6cc770520d4e479c44179b693451abfaa1","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.2.3","scripts":{},"_shasum":"c11fb9e927c406687fe78d69bd0688a379458d28","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"c11fb9e927c406687fe78d69bd0688a379458d28","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.2.3.tgz","integrity":"sha512-i0MIn8oVJlXW3lC61xplKIAY0s9rPAmT3E9uTHSk+BIktEJ9zZNOo9KD7pPiBOJMjvsg2e/PmZm0EQHFyI6DJA==","fileCount":19,"unpackedSize":514463,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJexghGCRA9TVsSAnZWagAA9n0P/0CrHwF4kqn3DDMeGgtx\ndmGEuafvq9B837dtCvQsYvH7ncHEUsWn1e/9fdXyZrL1lD9Sqeh80AAVHJp2\n766eZLlSMjvNarrYJ+c7TzVGDNs3EG91SDT4ZVJiz5YJ76G8o84zOJem6mOv\nB8a9BSqNnh2+fLWVc7u8oOaK4+dhZipX2d1t8K6oM6cCEuVTt4f+9u/eTVC5\ntX4BOJmgDDlLiz01GA3qX++Onh10O+5xfIoj2AytNidkIAvTe9gQ0YfqPbtZ\n6jdF6aqtW9bJ5wkgsFj5ro7n09WNqZ68sHXLOEy/7wMytHJ72F+xmM0U7KjO\nEi0XW8kaE3FAJJm8v+S/5yM0s9XzjKz/dwoouCehawP+WUHQCslvAjYs8IaO\nqobJHpyvcuEFLnmFMaTSp41lT/LKUOdLBEtVQ/03OAn9275XgcaeXfUJCJhk\nQyfw/YUSqYixsN29mmhADb4XEefIfbrjVcVgjhseMEFBRSCmqjyFTZ8fxdk8\nDMvyQ8Nr3mlR3C1REzQu4n6ycbiEkgF/LQ7WEUsHdfEhjX/k1+yKlyWciZFg\nyiY2z/gHeBNLzDgwPBdSSC/dgggQMd0CleDWFvRfSw25/PQiizB0gYiRPlAv\nRYhvrzby8IGN+wpjHkJQba8rdsL5K+BO1jr1lv8HJXGker2/qEzYUXumnI1t\ncOKx\r\n=FtRy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCp1vcsO0X9dAiIGaQgAjMWiQ4NOK4GpO0RGtkzh+DvegIhAOr5LqEJ2IBKgWzJ1WMurVFSe4LYYOZpESlBnvKMrqpb"}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.2.3_1590036550009_0.13876843685183626"},"_hasShrinkwrap":false},"3.1.6":{"name":"refilt","version":"3.1.6","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"6bcd776a75805cbf334a8b65fbb7fa838faeef4d","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.1.6","scripts":{},"_shasum":"1458fa21b45fe2e20460d174e3e5834b950fc8b9","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"1458fa21b45fe2e20460d174e3e5834b950fc8b9","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.1.6.tgz","integrity":"sha512-Wqo32Da7J3mkhqg5FB/L8q082gyHOSSOBJALLg6e4BUDck8k9bsN8F7J8g/6bh2VXpHtOV1S8f3kajW8cUXBgg==","fileCount":19,"unpackedSize":513190,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJexgv1CRA9TVsSAnZWagAAODQP/i8tLzq8X8a3qaRKg/h4\nD1h2X6HJjU5bh6tsuY+Hl76nZgbl2dSa71LryyLrkWWQmlEkMzl2QAhH2aGg\nO+dzrADnlAi5ifPXRuugyTylPWP1lAbk3bPEST1xlxWYSLaNFrnjrRqdurKQ\nZ3cTdpGa6b8kgq0/fCRi3+g+qBxuApOfWoFSSPz+/NTIPqXlhfmG1Xi11vz1\nN1i/d+KM4drqZoUXRIzp3x5VSh4CnvUUExqxmhdJIcT6ebQ2B3ztzqxi+nIm\nVJN+seQpytfHc0DkrFS28pJmeDtEZqK3w/Pj11iPO8xgq/xE8eU6iqxLhgMv\n0I62Ux+pN54ctwbtBpAXf9LzxO8Vwk6UECQaGqBTqEMHvFuCgnwr6/FcuoBw\n5oEdCqEy7CO8KDo0MDC1IMQL7ZS4D78Xjiz3GmquSH0ZOx87Mgi8xNe+d0ql\nSLbxAcQWrV3dYjY2YTbQUOthxUmM383oLlbyL73FUeAsItvEpyh24RwT91av\nA/SbX3kaLINFQAMUCqq5O2xWJ2hKhXyegAdNGgZ31vXq1uUL8+Ywbg+t8s7g\naaat+kCURul30ObPQgu2YPHTQtmNcvbXhdq+PEgTBGmZe1cjHB1irXcizDYt\nNeLKq9h1tAdMn1VWJmYWLyPTQGOHIFlyZVdXfuwX2BwHwNv6Art2jH/OlMzV\nFWmw\r\n=ko8s\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQD3vqpYWYkORVlyBKKMp0t5qQp6DcPs4GfYc8hr+lWtNwIhAPvSRgK9BjS2JMoVLFeycnokrNSg7PW9B7BEychVfH8Z"}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.1.6_1590037493186_0.27519522537740926"},"_hasShrinkwrap":false},"3.2.4":{"name":"refilt","version":"3.2.4","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"6f5dda56d9a6b61d877e071cd8e8f60f2524a408","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.2.4","scripts":{},"_shasum":"00db1b3f25613fcab1d5ba4f4d86cb6c47022410","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"00db1b3f25613fcab1d5ba4f4d86cb6c47022410","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.2.4.tgz","integrity":"sha512-wjzfZQN6bcYS0rBU+MRRd0E+V0SP2xWJn+WgiclkrdSy/cRzzvh0gjxbLo78F8DWYO7MZHpmGW0YDNiuebWsPA==","fileCount":19,"unpackedSize":514755,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgWHVkCRA9TVsSAnZWagAA7KYQAJGvHQix/XNh8sc5BaZo\n4RQF02lbK5uHW+l/AaI7R9gWTV+PN3yTGN/TN6u6PLnnESIKxElSJBizJHxZ\nqsTn8oS/nzcdeSU6/M6zYwa4Ic5It8+/xEsGkhvVJ1R6xDsN2HI64Ain4AwM\n1kJoRYJLWnQ3yRk7ShB8oQo+/njpGCo50ey9bVV/t4tT4Yig5/Pbbmqf9m5w\n1ouWfP4lq31zkG4u5C2NI96OB7RE/Mg5W0xJXmi3MGMRmrfS10JRqV9HlJ09\ncBzBMSskqKarWHsNienRfOdPSWqflRCtE3RjfDAJPaIJJyXrkqa33yieYb+A\nIjcN0VaA2VsCJgn4ihM3/Qb7963RiwBswDEtXMm5Hvm8WND9irhUJ4Gg2EJB\nldNXliBV9sZCP9VXIcokftrPcBK4hGDgmiPvBQneXOcztG+w8rEWVMfGjAQE\noOGan9mRW8/B9xVOeBzJ3NlV3BiX1EZMgEUV+Y8oZ6OtXzD8mVyNDPVW+RK8\nrB193SucITCeNegqB42CQavmiDrSEvjFHrOBJu7UDv0CTXeqv5FsAMr5vHkc\nERA+/CZ5CSXH702odPnO8OFMVgBpxI6RoIj+XoHxbuWh4DqL4FR2rU7EwFwy\nuJQW0ckMdV/4R+WFOhXkaKPBzxf32G0FtlT95s/1odpFfA0OJK3ack0Qlzkf\ngQjy\r\n=3S/w\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCID9UfOxiYzXGHeR395zVjHmaftVWfHMGjLHw89drSje2AiAPIMWE5QQyzMyQik6kRJw7KYppiGHsKbHobeqYtHrjUA=="}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.2.4_1616409955247_0.06676227104507171"},"_hasShrinkwrap":false},"3.2.5":{"name":"refilt","version":"3.2.5","description":"For filtering and sorting products based on a JSON object.","main":"dist/js/refilt.min.js","homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"dependencies":{"jquery":">=1.8"},"devDependencies":{"browser-sync":"^2.8.0","gulp":"^3.8.10","gulp-autoprefixer":"^0.0.7","gulp-changed":"^0.4.0","gulp-clean":"^0.3.0","gulp-concat":"^2.2.0","gulp-git":"^0.4.3","gulp-header":"^1.0.2","gulp-jscs":"^0.5.0","gulp-jshint":"^1.6.2","gulp-minify-css":"^0.3.4","gulp-notify":"^1.3.1","gulp-rename":"^1.2.0","gulp-sass":"^2.3.2","gulp-uglify":"^0.3.0"},"gitHead":"2aa0eca67ca827b06b774fe8288cc7636fd7c51d","bugs":{"url":"https://github.com/coalescecreate/refilt/issues"},"_id":"refilt@3.2.5","scripts":{},"_shasum":"68c4f0dc082ddac8eac652dbf8991cd35fc6bb0c","_from":".","_npmVersion":"1.4.14","_npmUser":{"name":"coalescecreate","email":"richard@coalescecreate.com"},"maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"dist":{"shasum":"68c4f0dc082ddac8eac652dbf8991cd35fc6bb0c","tarball":"https://registry.npmjs.org/refilt/-/refilt-3.2.5.tgz","integrity":"sha512-bhakldMn9HwinxMrBEglx9fEr7eT3+davD/G5CAGEc0FLPC8ombRuANOHiEqibOtAgy/Fryk6OqbKh1DQC51kA==","fileCount":19,"unpackedSize":515125,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsJdpCRA9TVsSAnZWagAAmkMP/RcqbETSQJym2Octl9Hg\n/NahJ72rZfbO35PbhG+VHswpKP3InXaQ5CW675oKW3/jnu050IHNbSYbpJQL\nS3ayELkWTxJwm8WMSKWLlbUd4TMad5liP9opHfGVLFQsMra38u+a7ysFOcQ8\nCbNIIRMQfvmK494NG/BtnCCsjTwcKi37+QIU5aehs7CoWUcQ7XET7NhIoCuR\n7WTZEytWSU08FyVJpXjV7C17JJ3z/7mvCGCWZanEL5LoAsIrmerFXmQkbv4H\n5jsbgq6bLNxSAH4yWDOPNOtL1w7pcELCXCBi1NNtpL+jMyE8PaKO7XKtKcJP\nY+KJ1OgxALEXrAGLGiKG3e3aug2MomnmMTthdT+4GcHNk3ATJxPsdAlfjrfQ\nI200SovQv0CdCKOeLEQ4rgkLFihUAcq6QXXRkrYZe+SpnO1LI6D+CKu6E55P\nGjYOsnAywXOhvCXTEiRyE7KMOITAs2s3M6+rInI2KcCVD4kcvROacJe+Ktbb\nbcn0P5j85f8m4jiz2SFJMieHh436CjOqpBQv/kestDvzWd+H3bLXk2W7L9L3\nP0wV+/ymKFG+C6s0RFeWmi/WYKtBnYJ/MBzhM0wEDVUd17HpFG3F3EYLmFc4\nh4fMzHNe7P/2YBB3NsFTPBNF9BNmxiNzuAKRrlOk/GtgHjn2ePpxIwDpjlcC\np4fI\r\n=Muzv\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDP/0JJJEmG0S9atYS+x3Yl7DwSbPzUokUIa1vM5KwrHgIhAInpBkCj02g7Btj54aHE/q2L5Ny6x5BrK1Ps+AGakhtP"}]},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/refilt_3.2.5_1622185832802_0.7475331059011847"},"_hasShrinkwrap":false}},"readme":"# refilt - For filtering and sorting products based on a JSON object. #\n\nThis repo is a clone of [ysFilter](https://github.com/youngskilled/js-filter) and has been created for further development in other directions.  \nRefilt is a jQuery plugin that asynchronously loads in a JSON of all the product data in the current category. The plugin is able to be manipulated with a range of callbacks and properties that allow you to change the default properties.\n\n## Background ##\n\nBeneath the whole filter is a very basic html product list with the only functionality being paging. Products are ideally only shown once and URL's are kept to a minimum.\nThis means when the page is indexed the default HTML page is the only page that is indexed because the javascript adds all the functionality in a separate layer. \nTo enable sharing the page's hash is updated every time a filter selection is made which is not seen by a search engine as being a new page. This is also semantically correct in that we are effectively just showing the same content, similar to how an anchor shows the same content but a different section of that content.\nThis plugin uses a JSON string that has all the information for all the products that are displayed. On every filtering the results are shown nearly instantly as there are no requests being sent or received making the filter more responsive.\n\n\n### Dependencies ###\nECMAScript > 5.1\njQuery > 1.7\n\n\n### Usage ###\n\nInitiate with `$(selector).refilt({'some':'property'});`   \nInvoke methods with `$(selector).refilt('method', {'some':'property'});`   \nAll classes and ids used in properties should omit `.` and `#`\nExample\n\n\t$('#refilt').refilt({\n\t\tdebug: true,\n\t\tappendItems: true\n\t});\n \n\n### HTML ###\n\nThis is the basic page structure required for the filter to work.\n\t\n\t<div id=\"refilt\" data-url=\"\" data-category=\"\">\n    <div class=\"filterControls\" data-type=\"\">\n      <div id=\"color\" class=\"filterControls-group\" data-type=\"<!-- See \"Data Types\" below -->\" data-create=\"<!-- See \"Data Create\" below -->\">\n        <!-- HTML is appended here so it's ok to have elements here. -->\n        <!-- Each value receives class filterControls-value -->\n      </div>\n      <!-- id === filterDescriptions[key] repeat above if needed -->\n    </div>\n    <div id=\"filterItems\">\n      <!-- items must come directly after parent there shouldn't be any container surrounding these -->\n    <div>\n    <nav class=\"filterPaging\">\n      <a class=\"filterPaging-prev\"></a>\n      <a class=\"filterPaging-all\"></a>\n      <a class=\"filterPaging-next\"></a>\n    </nav>\n\t</div>\n\nFollowing classes are added to the filter during different phases.  \n`refilt--loading`,`refilt--init`,`refilt--filtered`,`refilt--loaded`\n\n\nThe following structure you can use in combination with Emmet for tab completion.\n\n\tdiv#refilt[data-url=\"\" data-category=\"\"]>div.filterControls[data-type=\"\"]+div#filterItems+div.filterPaging>a.filterPaging-prev+a.filterPaging-all+a.filterPaging-next\n\n### Methods ###\n\n#### renderProducts ####\n\nPass filtered product IDs for client side rendering of products. This method will even ensure unique values.  \n`productIDs` are an array of ID's to be displayed.  \n`filterObj` is the obj which the plugin normally requires itself.\n\n\t$(selector).redils('renderProducts', options, productIDs, filterObj);\n\n\n### Properties ###\n\n\n#### limit ####\n\n*Default* `20`  \n*Expects* `integer`\n\nHow many items to be rendered per page.\n\n\t$(selector).refilt({limit: 20})\n\n#### splitSizes ####\n\n*Default* `false`  \n*Expects* `false, wrapper`\n\nSplits sizes into groups based on size chart otherwise they are presented as one group.\n\n\t$(selector).refilt({splitSizes: false})\n\n#### appendItems ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nWhether to replace items or to append new items with regards to paging.\n\n\t$(selector).refilt({appendItems: false})\n\n#### updateWHash ####\n\n*Default* `false`  \n*Expects* `false, class`\n\nUpdate other elements on the page by appending hash to those URL's like e.g. product URL's.\n\n\t$(selector).refilt({updateWHash: false})\n\n#### filterOptions ####\n\n*Default* `{}`  \n*Expects* `object with nested objects`\n\nExtend filter HTML with predefined variables. See Filter Variables below.\n\n\t$(selector).refilt({filterOptions: {\n\t\tssr: false,\n\t\tcolor: {\n\t\t\tbackground: true\n\t\t}\n\t}})\n\n#### multipleImgs ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).refilt({multipleImgs: false})\n\n#### onItemIndex ####\n\n*Default* `undefined`  \n*Expects* `integer`\n\nUsed in conjunction with onItem. After a certain amount of products built do this.\n\n#### outputChosenFiltersId ####\n\n*Default* `false`  \n*Expects* `false, id`\n\nSpecify a container where you would like the current filters which are selected to be outputted. If in the filter controls you have an anchor it will copy that with all the classes removing any ID's into this field. Otherwise it will create an anchor per filter.\n\n\t$(selector).refilt({outputChosenFiltersId: 'js-filtersChosen-list'})\n\n#### forceHex ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nMake the renderer use hex when rendering products and filter. Used in conjunction with background color/images for related products and color filter controls.\n\n\t$(selector).refilt({forceHex: false})\n\n#### sortFiltersAlphabetically ####\n\n*Default* `false`  \n*Expects* `boolean, array`\n\nSort filters/dropdowns menu to be shown in alphabetical order. When using array include those filters that should be set alphabetically.\n\n\t$(selector).refilt({sortFiltersAlphabetically: false})\n\n#### alsoMatchChildrenCategories ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nSetting this to true allows to also add children category products to filter.\n\n\t$(selector).refilt({alsoMatchChildrenCategories: false})\n\n#### historyCategories ####\n\n*Default* `false`  \n*Expects* `boolean`\n\nUsing push history to change URLs as well as update hash when needed. Allowing the user to navigate from child categories to parent and even grandparent categories without having to reload the page, making a more SEO friendly website.   \nTo use create filter elements with ids starting with `categories_` create the rest of the filters by adding the rest of the category url replacing `/` with `_` i.e. `categories_shop_watches`  \nYou can create more than one filter and still use the `categories` filter.  \nNot recommended for a large product base as this doesn't refine the JSON object in any way and that might cause speed issues.\n\n\t$(selector).refilt({historyCategories: true})\n\n\n#### filterProducts ####\n\n*Default* `false, array`  \n*Expects* `boolean`\n\nFilter products based on an array of values. The products are filtered out at the last step before pagination is worked out.  \nThe value is an array of arrays i.e. `[[productKey, valueToMatch], ...]` `valueToMatch` in this case is the value if true when looping through products keeps the product in the array. False removes the product from the listing.\n\n\t$(selector).refilt({historyCategories: true})\n\n\n#### preFilter ####\n\n*Default* `false`  \n*Expects* `false or object`   \n*Since* `3.1.0`\n\nObject is to be the same as `filteredBy` object. Set debug to see shape. Prefilter enables the filter to be set to specific values when it's not possible/inconvinient to get the values from the hash. Often used in combintaion with `updateLocation`.\n\n\t$(selector).refilt({\n\t\tpreFilter: {\n\t\t\tvalue: 'black',\n\t\t\ttype: 's1'\n\t\t}\n\t});\n\n\n#### updateLocation ####\n\n*Default* `true`  \n*Expects* `boolean`   \n*Since* `3.1.0`\n\nStop filter from writing to the URL bar either with pushState or via hashChange.\n\n\t$(selector).refilt({ updateLocation: true });\n\n\n#### allowNullS1 ####\n\n*Default* `true`  \n*Expects* `boolean`   \n*Since* `3.1.0`\n\nNormally if a filter is clicked after already being selected it would unselect the value. This prevents a null value for a given filter if that filter is pre-selected.\n\n\t$(selector).refilt({ allowNullS1: true });\n\n\n### Callbacks ###\n\n#### onItem ####\n\n*Expects* `function(length)`\n\nCan add an extra string on a specific item index to be used in conjunction with onItemIndex. Length of items to be rendered also displayed. This is often used in handling banners in category views.\n\n\t$(selector).refilt({eachItemAttrs: function(length) {\n\t\t//number of items in array\n\t\t//Add string here\n\t\treturn returnExtraString;\n\t}})\n\n#### eachItemAttrs ####\n\n*Expects* `function($this, items[i], i)`\n\nAdd / manipulate obj that renders the template.\nExtend object with new properties and add new curly braces in the template that match these.\nExpects an object to be returned.\n\n\t$(selector).refilt({eachItemAttrs: function($this, currentItem, i) {\n\t\t//Manipulate Item\n\t\treturn currentItem;\n\t}})\n\n#### eachFilterAttrs ####\n\n*Expects* `function(valObj)`\n\nAdd extra items to each item rendered.\nReplace strings, only *desc* is supported at the moment.\nExpects an object to be returned.\n\n\t$(selector).refilt({eachFilterAttrs: function(currentItem) {\n\t\t//Manipulate Filter Item\n\t\treturn currentItem;\n\t}})\n\n#### afterFilterRendered ####\n\n*Expects* `function()`\n\nCreate a callback to allow extra functionality after filters are built.\n\n\t$(selector).refilt({afterFilterRendered: function() {\n\t\t//Do something now. (uniform, chosen)\n\t}})\n\n#### beforeItemsRendered ####\n\n*Expects* `function(type)`  \n*Since* `1.3.1`\n\nGood for removing elements before filtering.\nOne variable is passed of type string defining a complete replace or an append.\n\n\t$(selector).refilt({beforeItemsRendered: function(type) {\n\t\t//Do something before products are loaded.\n\t\tif(type === 'replace') ...\n\t}})\n\n#### customRender ####\n\n*Expects* `function(insertType, filterObj, renderArray)`  \n*Since* `1.6.0`\n\nGood for rendering complex layouts.  \nThree variables are passed through.  \n`insertType` Either `replace` or `append`.  \n`renderArray` The original filter object. Be mindful of changes to this so that you don't mutate the object.  \n`renderArray` An array of objects containing items html and their original variables.  \n\n\t$(selector).refilt({beforeItemsRendered: function(insertType, filterObj, renderArray) {\n\t\tfor(i = 0; i < renderArray.length; i++) {\n\t\t\thtml += renderArray[i].html;\n\t\t}\n\n\t\tif(insertType === 'replace') {\n\t\t\t$('#filterItems').html(html);\n\t\t} else {\n\t\t\t$('#filterItems').append(html);\n\t\t}\n\t}})\n\n#### afterItemsRendered ####\n\n*Expects* `function()`\n\nUsing several images on product listing for roll overs etc.\n\n\t$(selector).refilt({afterItemsRendered: function() {\n\t\t//Do something after products are loaded.\n\t}})\n\n#### onFilterChanged ####\n\n*Expects* `function(filterObj, $this)`\n*Updated* `1.3.2`\n\nCallback to update filter styles manually after changes. Filter object sent as a variable and $this with all settings.\n\n\t$(selector).refilt({onFilterChanged: function(filterObj, $this) {\n\t\t//Do something after filtering is finished.\n\t\tfor(var filter in filterObj) { ... }\n\t}})\n\n### String Mapping ###\n\n#### classProductNew, classProductSale ####\n\n*Default* `product-new`, `product-sale`  \n*Expects* `string`\n\nA string to be placed in render template for using Sale or News. A space is always added in the code before the class name.\n\n\t$(selector).refilt({\n\t\tclassProductNew: 'product-new',\n\t\tclassProductSale: 'product-sale'\n\t})\n\n#### newsURI, saleURI ####\n\n*Default* `new-arrivals`, `sale`  \n*Expects* `string`\n\nEnables filter to work on campaign pages where filterable products are selected based on if the product has the `newProduct` or `showAsOnSale` attribute set to `true`. This is because other pages use categories to filter these values.   \n**Important** `canonicalUri` needs to be included as product data for product links to work correctly.\n\n\t$(selector).refilt({\n\t\tnewsURI: 'new-arrivals',\n\t\tsaleURI: 'sale'\n\t})\n\n### Template Options ###\n\nThe template options allows you to customize the filter methods with extra classes wrap the filters with different containers etc. All following properties should be placed within `filter-id: {}`. The filter-id should pertain to the filter name i.e. `color`, `size`.\n\n**Property** `classNames: []`  \nExtra classes in addition of the default `filter-value`\n\n**Property** `background: true`  \nIf background-image/color should be used or text, useful when create a filter list for colors.\n\n**Property** `attrs: []`  \nAdd attributes in string format with {} for replacing, {desc}\n\n**Property** `wrapperGroup: '<div class=\"wrap\">'`  \nWrap all objects for the filter.\n\n**Property** `wrapper: '<div class=\"wrap\">'`  \nWrap repeating objects. Wraps each individual item.\n\n**Property** `inner: '<div class=\"group\">'`  \nWrapper per group, groups appear in sizes and categories. This does not wrap the whole filter only a group within that filter.\n\n### Data Types ###\n\nThe following functions are used with the attribute `data-type=\"\"`. Data type are methods of the filter defining how this filter interacts with the data. Not all data-types have been created. If none have been chosen the **default** is `s1` which means select only one.\nExample:\n\n\t<div id=\"color\" data-type=\"s1\" data-create=\"a\"></div>\n\n#### s1 - select-one ####\n\n**As seen in URL** `#cat~s1=value`\n\nThis limits the filter to only allow one item to be chosen at a time other items are deselected when another is clicked. If the selected item is clicked again that item is deselected.\n\n\n#### sand - select-and ####\n\n**As seen in URL** `#cat~sand=value+value1+value2`\n\nmulti selectable within group.\nrefines selection, all values must be met to show article.\n\n\n#### sor - select-or ####\n\n**As seen in URL** `#cat~sor=value,value1,value2`\n\nmulti selectable within group.\ngrows selection, selected article needs to only meet one value\n\n\n#### r - range ####\n\n**As seen in URL** `#cat~r=value_min,valuemax`\n\nshow items bounds two values need to be presented\ncan be used in conjuction with min and max to get lower and upper bounds respectively\n\n\n#### s - sort ####\n\n**As seen in URL** `#sort~s=value,dir`\n\ndirection and what is to be sorted.\n\n\n#### f - fuzzy ####\n\n**As seen in URL** `#cat~f=value,spread`\n\nchoose a value\nspread of values\n\n### Data Create ###\n\n\n#### a ####\n\nCreate anchor tags\nHTML using Emmet:\n\n\ta\n\n\n#### fakeSelect ####\n\nDrop down with anchor tags, use in conjunction with rekaf.\nHTML using Emmet:\n\t\n\tdiv>span+ul>li>a\n\n\n#### select ####\n\nNormal select use afterFilterRendered callback to turn them into uniform selects\nHTML using Emmet:\n\n\tselect>option\n\n\n#### radio ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=radio]+label\n\n\n#### checkbox ####\n\nRadio buttons with labels.\nHTML using Emmet:\n\n\tinput[type=checkbox]+label\n\n\n### Classes ###\n\nNumerous classes can be reassigned. Check the `defaultOpts {}` as to which classes are able to be manipulated.\n\n\n### Initial Data ###\n\n\n#### url ####\n\nWhere to get the JSON object from.\n\n\t/loadfilter\n\n\n#### category ####\n\nCategory URI. Everything after the root and no slash is needed in the beginning.\n\n\tshop/all\n\n\n## Changelog ##\n\n**Version 3.2.5** \nFixed bug on sort by price if price is missing (sold out products missing from object).\n\n**Version 3.2.4** \nFilter out items that don't have any data due to being filtered out in product cache.\n\n**Version 3.2.3** \nAdded new variable to `onFilterChanged` for further customizations.\n\n**Version 3.2.2** \nFixed next button not showing when going from one page to multiple pages.\n\n**Version 3.2.1** \nMade `sortFiltersAlphabetically` take an array of filters to be sorted. Enables one to specify which filters to tidy up.\n\n**Version 3.2.0** \nAdded trigger for skipping building filter values if built on server. Changed history categories to stop going higher up in the heirarchy than entered category. Added possiblity to add in dynamic categories for `historyCategories`\n\n**Version 3.1.5** \nMinor change to `filterProducts` converted both values to integers to ensure exact match.\n\n**Version 3.1.4** \nWhen splitting using customRender send through first render to intiate render functions.\n\n**Version 3.1.3** \nSimplified sorting of filters.\n\n**Version 3.1.2** \nMade render products compatibile with external paging.\n\n**Version 3.1.1** \nFixed accidental regression. Reimplemented `3.0.3` & `3.0.2` into `3.1.0`.\n\n**Version 3.1.0** \nAdded new methods to facilitate a product customizer `preFilter` `updateLocation` and `allowNullS1`. Added `data-value` to spans in swatch HTML for easier presentation of fakeSelects. Swatch class is even added to filter swatch html.\n\n**Version 3.0.3** \nAdded exclusion to `filterProducts`. Now possible to exclude products based on attributes.\n\n**Version 3.0.2** \nFixed too many products are included in history categories that aren't in the defined category.\n\n**Version 3.0.1** \nFilter was filtering with s1 rather than being as a configurator. Configurator with s1 makes more sense with less clicks for the user.\n\n**Version 3.0.0** \nOverhaul of the way that the filter works with history categories. Category filters should now be setup as categories_depth1_depth2 etc.\n\n**Version 2.3.9** \nFixed render only urls to use canonical version.\n\n**Version 2.3.8** \nUpdated to use the latest version of Rekaf 1+\n\n**Version 2.3.7** \nFixed minor bug regarding not clearing disabled value on filter group.\n\n**Version 2.3.6** \nWhen removing all location should be re-written with writeLocation function.\n\n**Version 2.3.5** \nhistoryCategories should even be set on root category.\n\n**Version 2.3.4** \nCategories that don't have any history filters should display filter as per default with prefiltered choices. Fixed some minor bugs regarding selecting of s1 attributes in standard non-history mode. Fixed issue of combining filterProducts and other preFilter items.\n\n**Version 2.3.3** \nFixed pagination again. Fixed on page load to specific page.\n\n**Version 2.3.2** \nMoved filterProducts to preFilter function to correctly set all values. Fixed double triggering of hash changes with historyCategories on. Added a check for sort field on filters with sortFiltersAlphabetically.\n\n**Version 2.3.1** \nMissed publishing changes to dist.\n\n**Version 2.3.0** \nAdded two new properties to extend the functionality `historyCategories` `filterProducts`. Fixed clicking off s1 properties.\n\n**Version 2.2.1** \nUpdated package.json to enable better NPM compatability.\n\n**Version 2.2.0** \nNew method `renderProducts` to pass productIDs directly to renderer bypassing filtering.\n\n**Version 2.1.0** \nAdded support for module imports.\n\n**Version 2.0.0** \nRebranded to refilt. All classes changed not compatible with earlier versions without modification.\n\n**Version 1.11.1** \nCategories weren't showing up when filtering on campaign pages. Now working. `canonicalUri` for product links to work correctly.\n\n**Version 1.11.0** \nNow possible to filter even on campaign pages such as news and sale.\n\n**Version 1.10.0** \nAdded a new possiblity for category to also include products of its children categories. Setting `alsoMatchChildrenCategories` to `true` enables that.\n\n**Version 1.9.0** \nAdded a new possiblity for a custom price template. Needs to be used in conjunction with `eachItemAttrs` to set a property on the price object `special` which will then invoke the `special` template within the price templates. Used in Artilleriet for grouped products.\n\n**Version 1.8.4** \nFixed and cleaned up safeguards, remove duplication of functions.\n\n**Version 1.8.3** \nFurther safeguarding against items not properly formed by cache.\n\n**Version 1.8.2** \nSafed items not properly formed by cache.\n\n**Version 1.8.1** \nSafed the alphabetical sorting if the object is empty.\n\n**Version 1.8.0** \nAdded an option to remove price if price is zero.\n\n**Version 1.7.1** \nAlphabetically sort filters - excluded categories from this as that can be controlled via category sort order.\n\n**Version 1.7.0** \nAdded option to alphabetically sort filters.\n\n**Version 1.6.0** \nAdded a new callback for custom rendering of html for difficult layouts. Added a new class to filter rendering function.\n\n**Version 1.5.6** \nAdded a new class to control swatches.\n\n**Version 1.5.5** \nFixed bug clearing disabled's on first filter choice.\n\n**Version 1.5.4** \nRemoved possibility for limit to be set to 0. Limit must always be explicitly set to a number higher than 0 to ensure the choice is understood.\n\n**Version 1.5.3** \n1.5.2 was tagged incorrectly now is 1.5.3. Made the matching of categories exact from ^category to ^category$ reducing the number of duplicate items as all items are in containing categories.\n\n**Version 1.5.1** \nTweak to resetting filters properly when changing between options.\n\n**Version 1.5.0** \nChanged how the filter options display disabled or not. If a filter has options that are multiple choice then the filter will be based on the other options and not the option currently being chosen it will give a list of other filterable values to filter with.\ni.e. Category -> Backpacks and Accessories are chosen. The user then chooses brown. Previously it was not possible to then add more categories but now all other categories that have something brown in them will be available.\nBe aware of the value that can be disabled and selected at the same time I suggest using strikethrough for communication purposes that the option you previously chose is now longer valid but still chosen.\n\n**Version 1.4.0** \nAdded touchevents to more quickly read variables from filters. Updated mainly due to changes in rekaf.\n\n**Version 1.3.4** \nAdded a new class for retrieving and updating total products.\n\n**Version 1.3.3** \nBug fix. Latest filter now correctly selects the latest filter in object based on hash.\n\n**Version 1.3.2** \nAdded a an argument to `onFilterChanged`. Object of all the various filters running.\n\n**Version 1.3.1** \nAdded a new method `beforeItemsRendered` for listening to before the page is to be re-rendered.\n\n**Version 1.3.0** \nPossible minor breaking change. Filter descriptions were using keys instead of displaying values not sure why this was the case may just have been a bug.\n\n**Version 1.2.0** \n0 is removed as a value to reset filter. 'remove' or the same value is the only values available to reset filter with.\n\n**Version 1.1.5** \nChanges to how pagination works. Traditional paged views now working correctly. Support before for only appended items. Individual page navigation is now independently set instead of paging parent class.\n\n**Version 1.1.0** \nFinal fixes to the related products. New features also added inc. `outputChosenFiltersId` to paste in filters which are selected. `forceHex` force use hex instead of using image which is default.\n\n**Version 1.0.0** \nFilter now has a complete feature set. A few features are still available to be added, these are regarding more semantic filtering versions i.e. range scale etc.\n\n* Variants are now handled by the filter. Showing even which of the variants that is available.\n* Classes have changed in this version to a more OOCSS way of doing things. This means if other clients update to this then it will require class changes on menu etc or if you simply state as options in the filter.\n\n\n**Version 0.5.8** \nChanged the order in which items are added in additive filtering. If several products are chosen in the same filter then the products chosen last are furthest up.\n\n**Version 0.5.7** \nFixed paging errors. Referring to non-existing variables\n\n**Version 0.5.6** \nFixed a bug that showed categories in specific depth. When those categories had products directly related to them.\n\n**Version 0.5.5** \nFixed some bugs that were also in to \"beforeAPI\" branch. All anchors are updated with hash on filter change. Fixed a bug with reload with pages and clicking on next. Added selectors for pages/items remaining.\n\n**Version 0.5.4** \nAdded in fall backs for possibly undefined price template attributes.\n\n**Version 0.5.3** \nAdded in a news filter template for price.\n\n**Version 0.5.2** \nRemoved some debugging data.\n\n**Version 0.5.1** \nPretty much reverted changes in previous commit in 0.5.0 no longer is dependent on changes in SilkAdapterBundle due to refactoring of category arrays. Default sorting is still following the correct order in Silk from here on out.\n\n**Version 0.5.0** \nDefault sort order now follows correct sort order in Silk. Needs to have SilkAdapterBundle > 0.4.3 requires filterDescriptions > categorySorting.\n\n**Version 0.4.0** \nAdded placeholders for sales and news classes so that sales or news can be used in other parts of the item.\n\n**Version 0.3.4** \nAdded locale for sharing.\n\n**Version 0.3.3** \nFixed titlecase which split on foreign characters for uppercasing. \n\n**Version 0.3.2** \nFixed sort by news.\n\n**Version 0.3.1** \nAdded a new rendering attribute. {attr|'object key'} i.e. {attr|badges} added titleCase function for doing titles using the |title. Tidied up the code a bit also, formatting and jsHint.\n\n**Version 0.3.0** \n*WARNING BREAKING CHANGES* Filter is now working against a new JSON object returned from Symfony instead of directly against Silk. Some added features are the filter works against all products category agnostic this means also that the category needs to be sent in as a parameter. Pre-sort has also been added as a feature along with some more classes to easily hide/show products while filter loads.\n\n**Version 0.2.6 - Branch beforeAPI** \nTidied up several issues. All product URL's hashes are updated on filter change. Price is now sorted with sale prices also. Fixed issues on first load of products.\n\n**Version 0.2.5 - Branch beforeAPI**\nFixed an issue regarding reloading of category products. Not all products were reloaded.\n\n**Version 0.2.4 - Branch beforeAPI** \nFixed problems with urls not assigning root correctly. Fixed sort of currencies that are prefixed with something other than a number. Fixed fallback for filters when sort was first selected. Also added refilt-init as a class on the filter.\n\n**Version 0.2.3** \nPaging problems. Hash didn't have parseInt. Special use case for images where the image was connected to a variant despite there being no variants.\n\n**Version 0.2.2** \nMoved replace items on first load to do it only on `debug: true` added possibility for remove button to be a sibling.\n\n**Version 0.2.1** \nFixed on remove of last item in filter category, filter options are refreshed right, previously only worked on .remove before.\n\n**Version 0.2** \nAdded multi select as an option in filter, added a new listener for on change of filter.\n\n**Version 0.1.3** \nPages now show up in URL. Possible to load in to that page.\n\n**Version 0.1.2** \nFixed a bug with color being read as an array and outputted as a string\n\n**Version 0.1.1** \nFixed category parsing, was removing a letter if there was only one category.\n\n## Understanding the core code ##\n\nAjax request gets three major elements: `filter`, `productIds` and `products`.\n`filter` has arrays of which productID's are relevant for each filtering mechanism.\n`productIds` are the ID's used to match products and filters together. It's an object mapping array position of products to their ID's\n`products` this contains the information of each individual product.\n\n┃  \n┣━ init  \n┃     Runs first this gets the AJAX and is the starting point for all further interactions.  \n┃     We also read the hash here to determine the current state for the filter.  \n┃  \n┣━ preFilter  \n┃     Filters out all categories that are irrelevant and reduces the data set.\n┃     We get our currentItems from this function and relevantFilters.\n┃  \n┣━┳━━ buildFilter  \n┃ ┃      Using the html filterControls-group creates the filtering html for the user to control the page with.  \n┃ ┃      This only occurs once on page load.  \n┃ ┃  \n┃ ┗━━ buildFilterTemplate  \n┃        This is called per filterControls-group to render each of the filters.  \n┃        This is the where the HTML is produced for the html filters.  \n┃  \n┣━┳━━ enableEvents  \n┃ ╻       Called after the filter is built and is only called once to instantiate it.  \n┃ ╻       This listens to pages and filtering events.  \n┃ ╻       \n┃ ┗━━ updateFilterObj  \n┃        Creates a filter object which determines the state of the filter.  \n┃        Triggered only from events, when the customer updates the filter.  \n┃        Sends the obj to the hashify function which updates the URL.  \n┃  \n┣ ┳ ━ dehashify (Extra functions run if hash in URL)  \n┃ ╻      Extract information from hash to creates the filter object.  \n┃ ╻  \n┃ ┗ ━ reSelect  \n┃        Using the filter object disable certain filter elements.  \n┃  \n┣━ gatherItems  \n┃     Based upon the filter object intersect the arrays and deploy the major logic behind the filter.  \n┃     This listens to pages and filtering events.  \n┃  \n┣━ updateFilterHTML  \n┃     Updates the HTML so that the customer can see which filters are still relevant.  \n┃  \n┣ ━ sortItems  \n┃     Sort items based on the products properties.  \n┃  \n┗━┳━━ renderItems  \n  ┃      Define paging and send through for looping through the product templates.  \n  ┃      Several callbacks here to hook into for editing what is rendered on the page.  \n  ┃      Final step before rendering out the products on the page.  \n  ┃  \n  ┣━━ renderItemTemplate  \n  ┃      Connect variants product objects here to show all related variant information.  \n  ┃      Runs through templates received in AJAX call.  \n  ┃  \n  ┣━━ renderItemPrice  \n  ┃      Uses relevant template to display based on price object.  \n  ┃  \n  ┗━━ renderItemReplace  \n         Major replacement of product attributes.  \n\nSome helper functions not mentioned above.\n`relatedToITems` maps even variants to objects in `products` to be later rendered by `renderItemTemplate` It's used in `preFilter` and `updateFilterHTML`\n`hexOrImage` pertains to attributes whether they should use the hex code available or use the image. Image always takes precedent.\n`dehasify` reads the `window.location.hash` and turns it into an object for using with the filter.\n`hashify` updates the `window.location.hash`\n`titleCase` is a filtering function for changing the output of the productObjects. Use in template with a `|`\n`getLocale` if this needs to be done.\n`keysToItems` Maps productID's to products\n`unique` Takes a simple array and removes duplicates. Don't use with an object is it doesn't test depth.\n`intersect` Takes a two simple arrays and removes duplicates. Don't use with an object is it doesn't test depth.\n\n\n## Development ##\n\n**Requirements**\n* This plugin requires [node](http://nodejs.org/), [gulpjs](http://gulpjs.com/) and [bower](http://bower.io/).\n* Follow JSCS guidelines a styling-example.js is also included.\n* Run `bower install` and `npm install` to get dev dependencies. Bower and Gulp is assumed to be running globally.\n\n## Contact ##\n\nThis is repo is maintained by Coalesce Create if you would like the original please see [ysFilter](https://github.com/youngskilled/js-filter).  \nContact [richard](mailto:richard@coalescecreate.com) for more details about this plugin.\n","maintainers":[{"name":"coalescecreate","email":"richard@coalescecreate.com"}],"time":{"modified":"2022-06-26T10:37:18.624Z","created":"2017-05-30T13:50:25.990Z","2.2.0":"2017-05-30T13:50:25.990Z","2.2.1":"2017-05-30T13:57:00.396Z","2.3.0":"2017-06-15T20:17:48.664Z","2.3.1":"2017-06-15T20:23:45.250Z","2.3.2":"2017-07-09T14:34:52.047Z","2.3.3":"2017-07-09T14:57:16.301Z","2.3.4":"2017-07-09T18:41:57.897Z","2.3.5":"2017-07-09T19:17:44.241Z","2.3.6":"2017-07-09T19:29:24.873Z","2.3.7":"2017-07-12T20:25:43.379Z","2.3.8":"2017-07-17T12:13:42.728Z","2.3.9":"2017-07-19T13:35:27.070Z","3.0.0":"2017-10-16T06:52:09.080Z","3.0.1":"2017-10-27T09:14:18.133Z","3.0.2":"2018-04-30T14:55:15.384Z","0.2.15":"2018-07-02T12:10:53.591Z","0.2.16":"2018-07-05T12:33:11.900Z","1.11.2":"2018-07-26T12:51:07.495Z","1.11.3":"2018-07-26T13:01:40.058Z","3.0.3":"2018-08-12T19:32:13.918Z","1.11.4":"2018-10-09T08:20:56.236Z","1.11.5":"2018-10-09T08:23:16.749Z","3.1.0":"2019-04-03T11:48:19.278Z","3.1.1":"2019-04-03T11:56:12.191Z","3.1.2":"2019-06-17T13:06:51.278Z","3.1.3":"2019-06-25T12:19:05.965Z","3.1.4":"2019-09-03T13:59:26.313Z","3.1.5":"2019-09-10T14:59:30.459Z","3.2.0":"2019-10-04T12:38:14.504Z","3.2.1":"2019-10-30T12:45:51.793Z","3.2.2":"2020-01-30T13:41:56.343Z","3.2.3":"2020-05-21T04:49:10.152Z","3.1.6":"2020-05-21T05:04:53.345Z","3.2.4":"2021-03-22T10:45:55.689Z","3.2.5":"2021-05-28T07:10:33.075Z"},"homepage":"http://coalescecreate.com","author":{"name":"richard@coalescecreate.com Coalesce Create"},"license":"MIT","readmeFilename":"README.md","repository":{"type":"git","url":"git@github.com:coalescecreate/refilt.git"},"bugs":{"url":"https://github.com/coalescecreate/refilt/issues"}}