diff --git a/.gitignore b/.gitignore
index c489503..2efcfbf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,12 @@
-node_modules
-bower_components
+node_modules/
+.idea/
package-lock.json
+**/.DS_Store
+.yo-rc.json
+public/dist/
+**/*.css
+**/*.map
+logs/
+settings.json
+.vscode
+webpack-stats.json
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/legacy/.gitignore b/legacy/.gitignore
new file mode 100644
index 0000000..c489503
--- /dev/null
+++ b/legacy/.gitignore
@@ -0,0 +1,3 @@
+node_modules
+bower_components
+package-lock.json
diff --git a/.hound.yml b/legacy/.hound.yml
similarity index 100%
rename from .hound.yml
rename to legacy/.hound.yml
diff --git a/.jshintrc b/legacy/.jshintrc
similarity index 100%
rename from .jshintrc
rename to legacy/.jshintrc
diff --git a/.travis.yml b/legacy/.travis.yml
similarity index 100%
rename from .travis.yml
rename to legacy/.travis.yml
diff --git a/README.md b/legacy/README.md
similarity index 100%
rename from README.md
rename to legacy/README.md
diff --git a/app.js b/legacy/app.js
similarity index 100%
rename from app.js
rename to legacy/app.js
diff --git a/demo/css/style.css b/legacy/demo/css/style.css
similarity index 100%
rename from demo/css/style.css
rename to legacy/demo/css/style.css
diff --git a/demo/index.html b/legacy/demo/index.html
similarity index 100%
rename from demo/index.html
rename to legacy/demo/index.html
diff --git a/demo/js/jquery.ui.mouse.js b/legacy/demo/js/jquery.ui.mouse.js
similarity index 100%
rename from demo/js/jquery.ui.mouse.js
rename to legacy/demo/js/jquery.ui.mouse.js
diff --git a/demo/js/jquery.ui.slider.js b/legacy/demo/js/jquery.ui.slider.js
similarity index 100%
rename from demo/js/jquery.ui.slider.js
rename to legacy/demo/js/jquery.ui.slider.js
diff --git a/demo/js/jquery.ui.widget.js b/legacy/demo/js/jquery.ui.widget.js
similarity index 100%
rename from demo/js/jquery.ui.widget.js
rename to legacy/demo/js/jquery.ui.widget.js
diff --git a/demo/search_auto.html b/legacy/demo/search_auto.html
similarity index 100%
rename from demo/search_auto.html
rename to legacy/demo/search_auto.html
diff --git a/images/facet_block.png b/legacy/images/facet_block.png
similarity index 100%
rename from images/facet_block.png
rename to legacy/images/facet_block.png
diff --git a/images/loader.gif b/legacy/images/loader.gif
similarity index 100%
rename from images/loader.gif
rename to legacy/images/loader.gif
diff --git a/images/result_block.png b/legacy/images/result_block.png
similarity index 100%
rename from images/result_block.png
rename to legacy/images/result_block.png
diff --git a/images/search-icon-demo.png b/legacy/images/search-icon-demo.png
similarity index 100%
rename from images/search-icon-demo.png
rename to legacy/images/search-icon-demo.png
diff --git a/images/search_layout.png b/legacy/images/search_layout.png
similarity index 100%
rename from images/search_layout.png
rename to legacy/images/search_layout.png
diff --git a/images/search_template_basic.png b/legacy/images/search_template_basic.png
similarity index 100%
rename from images/search_template_basic.png
rename to legacy/images/search_template_basic.png
diff --git a/images/selected_facet_layout.png b/legacy/images/selected_facet_layout.png
similarity index 100%
rename from images/selected_facet_layout.png
rename to legacy/images/selected_facet_layout.png
diff --git a/images/tick-demo.png b/legacy/images/tick-demo.png
similarity index 100%
rename from images/tick-demo.png
rename to legacy/images/tick-demo.png
diff --git a/index.html b/legacy/index.html
similarity index 100%
rename from index.html
rename to legacy/index.html
diff --git a/karma.conf.js b/legacy/karma.conf.js
similarity index 100%
rename from karma.conf.js
rename to legacy/karma.conf.js
diff --git a/mock/bannerResponse.json b/legacy/mock/bannerResponse.json
similarity index 100%
rename from mock/bannerResponse.json
rename to legacy/mock/bannerResponse.json
diff --git a/mock/redirect.json b/legacy/mock/redirect.json
similarity index 100%
rename from mock/redirect.json
rename to legacy/mock/redirect.json
diff --git a/mock/searchTestResponse.json b/legacy/mock/searchTestResponse.json
similarity index 100%
rename from mock/searchTestResponse.json
rename to legacy/mock/searchTestResponse.json
diff --git a/mock/spellCheckWithResults.json b/legacy/mock/spellCheckWithResults.json
similarity index 100%
rename from mock/spellCheckWithResults.json
rename to legacy/mock/spellCheckWithResults.json
diff --git a/mock/spellCheckWithZeroResults.json b/legacy/mock/spellCheckWithZeroResults.json
similarity index 100%
rename from mock/spellCheckWithZeroResults.json
rename to legacy/mock/spellCheckWithZeroResults.json
diff --git a/mock/userInfo.json b/legacy/mock/userInfo.json
similarity index 100%
rename from mock/userInfo.json
rename to legacy/mock/userInfo.json
diff --git a/mock/zeroResult.json b/legacy/mock/zeroResult.json
similarity index 100%
rename from mock/zeroResult.json
rename to legacy/mock/zeroResult.json
diff --git a/legacy/package-lock.json b/legacy/package-lock.json
new file mode 100644
index 0000000..4e6a721
--- /dev/null
+++ b/legacy/package-lock.json
@@ -0,0 +1,3301 @@
+{
+ "name": "js-sdk",
+ "version": "1.0.0",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "accepts": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz",
+ "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=",
+ "dev": true,
+ "requires": {
+ "mime-types": "2.1.18",
+ "negotiator": "0.6.1"
+ }
+ },
+ "addressparser": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/addressparser/-/addressparser-0.3.2.tgz",
+ "integrity": "sha1-WYc/Nej89sc2HBAjkmHXbhU0i7I="
+ },
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "dev": true
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.1.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "align-text": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
+ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2",
+ "longest": "1.0.1",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
+ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
+ "dev": true,
+ "requires": {
+ "micromatch": "2.3.11",
+ "normalize-path": "2.1.1"
+ }
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "array-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "arraybuffer.slice": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz",
+ "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "async-each": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
+ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
+ "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
+ "dev": true
+ },
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "dev": true
+ },
+ "base64id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
+ "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "dev": true,
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
+ "binary-extensions": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
+ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
+ "dev": true
+ },
+ "blob": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+ "dev": true
+ },
+ "bluebird": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.18.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+ "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "1.0.4",
+ "debug": "2.6.9",
+ "depd": "1.1.2",
+ "http-errors": "1.6.3",
+ "iconv-lite": "0.4.23",
+ "on-finished": "2.3.0",
+ "qs": "6.5.2",
+ "raw-body": "2.3.3",
+ "type-is": "1.6.16"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz",
+ "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==",
+ "dev": true
+ },
+ "buildmail": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/buildmail/-/buildmail-2.0.0.tgz",
+ "integrity": "sha1-8LewpZ6aShtQZrv6BR0kjzgy7s4=",
+ "requires": {
+ "addressparser": "0.3.2",
+ "libbase64": "0.1.0",
+ "libmime": "1.2.0",
+ "libqp": "1.1.0",
+ "needle": "0.10.0"
+ },
+ "dependencies": {
+ "needle": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-0.10.0.tgz",
+ "integrity": "sha1-FqJNY/KmEVLrdMzh0Sr4XFB1d9Q=",
+ "requires": {
+ "debug": "2.6.9",
+ "iconv-lite": "0.4.23"
+ }
+ }
+ }
+ },
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true,
+ "optional": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4",
+ "lazy-cache": "1.0.4"
+ }
+ },
+ "chai": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
+ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "1.1.0",
+ "deep-eql": "0.1.3",
+ "type-detect": "1.0.0"
+ }
+ },
+ "chokidar": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
+ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
+ "dev": true,
+ "requires": {
+ "anymatch": "1.3.2",
+ "async-each": "1.0.1",
+ "fsevents": "1.2.4",
+ "glob-parent": "2.0.0",
+ "inherits": "2.0.3",
+ "is-binary-path": "1.0.1",
+ "is-glob": "2.0.1",
+ "path-is-absolute": "1.0.1",
+ "readdirp": "2.1.0"
+ }
+ },
+ "cliui": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "center-align": "0.1.3",
+ "right-align": "0.1.3",
+ "wordwrap": "0.0.2"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4="
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.0.tgz",
+ "integrity": "sha512-EDpX3a7wHMWFA7PUHWPHNWqOxIIRSJetuwl0AS5Oi/5FMV8kWm69RTlgm00GKjBO1xFHMtBbL49yRtMMdticBw=="
+ },
+ "combine-lists": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz",
+ "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.10"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "dev": true
+ }
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": "1.0.1"
+ }
+ },
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz",
+ "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=",
+ "dev": true
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "1.1.0",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "typedarray": "0.0.6"
+ }
+ },
+ "connect": {
+ "version": "3.6.6",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz",
+ "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.0",
+ "parseurl": "1.3.2",
+ "utils-merge": "1.0.1"
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "cookie": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
+ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.5.7",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
+ "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "custom-event": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=",
+ "dev": true
+ },
+ "cycle": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
+ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
+ "dev": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true,
+ "optional": true
+ },
+ "deep-eql": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+ "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
+ "dev": true,
+ "requires": {
+ "type-detect": "0.1.1"
+ },
+ "dependencies": {
+ "type-detect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
+ "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
+ "dev": true
+ }
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "di": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+ "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "dom-serialize": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+ "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=",
+ "dev": true,
+ "requires": {
+ "custom-event": "1.0.1",
+ "ent": "2.2.0",
+ "extend": "3.0.1",
+ "void-elements": "2.0.1"
+ }
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "0.1.1"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+ "dev": true
+ },
+ "engine.io": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz",
+ "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=",
+ "dev": true,
+ "requires": {
+ "accepts": "1.3.3",
+ "base64id": "1.0.0",
+ "cookie": "0.3.1",
+ "debug": "2.3.3",
+ "engine.io-parser": "1.3.2",
+ "ws": "1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
+ "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.2"
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ }
+ }
+ },
+ "engine.io-client": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz",
+ "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "2.3.3",
+ "engine.io-parser": "1.3.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parsejson": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "1.1.2",
+ "xmlhttprequest-ssl": "1.5.3",
+ "yeast": "0.1.2"
+ },
+ "dependencies": {
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
+ "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.2"
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ }
+ }
+ },
+ "engine.io-parser": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz",
+ "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=",
+ "dev": true,
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "0.0.6",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.4",
+ "has-binary": "0.1.7",
+ "wtf-8": "1.0.0"
+ }
+ },
+ "ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+ "dev": true
+ },
+ "es6-promise": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz",
+ "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "eventemitter3": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz",
+ "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==",
+ "dev": true
+ },
+ "expand-braces": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz",
+ "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=",
+ "dev": true,
+ "requires": {
+ "array-slice": "0.2.3",
+ "array-unique": "0.2.1",
+ "braces": "0.1.5"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz",
+ "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=",
+ "dev": true,
+ "requires": {
+ "expand-range": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz",
+ "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=",
+ "dev": true,
+ "requires": {
+ "is-number": "0.1.1",
+ "repeat-string": "0.2.2"
+ }
+ },
+ "is-number": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz",
+ "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz",
+ "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=",
+ "dev": true
+ }
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "2.2.4"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "dev": true
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "extract-zip": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
+ "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
+ "dev": true,
+ "requires": {
+ "concat-stream": "1.6.2",
+ "debug": "2.6.9",
+ "mkdirp": "0.5.1",
+ "yauzl": "2.4.1"
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "eyes": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
+ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
+ "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
+ "dev": true,
+ "requires": {
+ "pend": "1.2.0"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
+ "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
+ "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
+ "dev": true,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "3.0.0",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz",
+ "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "1.0.2",
+ "escape-html": "1.0.3",
+ "on-finished": "2.3.0",
+ "parseurl": "1.3.2",
+ "statuses": "1.3.1",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "statuses": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
+ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
+ "dev": true
+ }
+ }
+ },
+ "follow-redirects": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.0.tgz",
+ "integrity": "sha512-fdrt472/9qQ6Kgjvb935ig6vJCuofpBUD14f9Vb+SLlm7xIe4Qva5gey8EKtv8lp7ahE1wilg3xL1znpVGtZIA==",
+ "dev": true,
+ "requires": {
+ "debug": "3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
+ "dev": true,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "formatio": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz",
+ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.1.2"
+ }
+ },
+ "fs-extra": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
+ "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "jsonfile": "2.4.0",
+ "klaw": "1.3.1"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz",
+ "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "2.10.0",
+ "node-pre-gyp": "0.10.0"
+ },
+ "dependencies": {
+ "abbrev": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "aproba": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "are-we-there-yet": {
+ "version": "1.1.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "delegates": "1.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "chownr": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "code-point-at": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "detect-libc": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "fs-minipass": {
+ "version": "1.2.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "gauge": {
+ "version": "2.7.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "aproba": "1.2.0",
+ "console-control-strings": "1.1.0",
+ "has-unicode": "2.0.1",
+ "object-assign": "4.1.1",
+ "signal-exit": "3.0.2",
+ "string-width": "1.0.2",
+ "strip-ansi": "3.0.1",
+ "wide-align": "1.1.2"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "has-unicode": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "iconv-lite": {
+ "version": "0.4.21",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "ignore-walk": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minimatch": "3.0.4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "bundled": true,
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "number-is-nan": "1.0.1"
+ }
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "bundled": true,
+ "dev": true
+ },
+ "minipass": {
+ "version": "2.2.4",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "minizlib": {
+ "version": "1.1.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "minipass": "2.2.4"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "2.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "2.6.9",
+ "iconv-lite": "0.4.21",
+ "sax": "1.2.4"
+ }
+ },
+ "node-pre-gyp": {
+ "version": "0.10.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "detect-libc": "1.0.3",
+ "mkdirp": "0.5.1",
+ "needle": "2.2.0",
+ "nopt": "4.0.1",
+ "npm-packlist": "1.1.10",
+ "npmlog": "4.1.2",
+ "rc": "1.2.7",
+ "rimraf": "2.6.2",
+ "semver": "5.5.0",
+ "tar": "4.4.1"
+ }
+ },
+ "nopt": {
+ "version": "4.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "abbrev": "1.1.1",
+ "osenv": "0.1.5"
+ }
+ },
+ "npm-bundled": {
+ "version": "1.0.3",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "npm-packlist": {
+ "version": "1.1.10",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ignore-walk": "3.0.1",
+ "npm-bundled": "1.0.3"
+ }
+ },
+ "npmlog": {
+ "version": "4.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "are-we-there-yet": "1.1.4",
+ "console-control-strings": "1.1.0",
+ "gauge": "2.7.4",
+ "set-blocking": "2.0.0"
+ }
+ },
+ "number-is-nan": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "osenv": {
+ "version": "0.1.5",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "os-homedir": "1.0.2",
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "rc": {
+ "version": "1.2.7",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "deep-extend": "0.5.1",
+ "ini": "1.3.5",
+ "minimist": "1.2.0",
+ "strip-json-comments": "2.0.1"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "1.2.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.1",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.1",
+ "bundled": true,
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "semver": {
+ "version": "5.5.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "string-width": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "code-point-at": "1.1.0",
+ "is-fullwidth-code-point": "1.0.0",
+ "strip-ansi": "3.0.1"
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "5.1.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "bundled": true,
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "strip-json-comments": {
+ "version": "2.0.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "tar": {
+ "version": "4.4.1",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chownr": "1.0.1",
+ "fs-minipass": "1.2.5",
+ "minipass": "2.2.4",
+ "minizlib": "1.1.0",
+ "mkdirp": "0.5.1",
+ "safe-buffer": "5.1.1",
+ "yallist": "3.0.2"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true
+ },
+ "wide-align": {
+ "version": "1.1.2",
+ "bundled": true,
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "string-width": "1.0.2"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "bundled": true,
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.0.2",
+ "bundled": true,
+ "dev": true
+ }
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+ "dev": true
+ },
+ "handlebars": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz",
+ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=",
+ "dev": true,
+ "requires": {
+ "async": "1.5.2",
+ "optimist": "0.6.1",
+ "source-map": "0.4.4",
+ "uglify-js": "2.8.29"
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "har-schema": "2.0.0"
+ }
+ },
+ "has-binary": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz",
+ "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ }
+ }
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "hasha": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz",
+ "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=",
+ "dev": true,
+ "requires": {
+ "is-stream": "1.1.0",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "dev": true,
+ "requires": {
+ "depd": "1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": "1.5.0"
+ }
+ },
+ "http-proxy": {
+ "version": "1.17.0",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz",
+ "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "3.1.0",
+ "follow-redirects": "1.5.0",
+ "requires-port": "1.0.0"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.14.2"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "requires": {
+ "safer-buffer": "2.1.2"
+ }
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0",
+ "wrappy": "1.0.2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "1.11.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-dotfile": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
+ "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isbinaryfile": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz",
+ "integrity": "sha1-Sj6XTsDLqQBNP8bN5yCeppNopiE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "jquery": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-1.9.1.tgz",
+ "integrity": "sha1-5M1INfqu+63lNYV2E8D8P/KtrzQ=",
+ "dev": true
+ },
+ "jquery-ui": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.0.tgz",
+ "integrity": "sha1-WcYDei2cV+miUhqbeklxFtQbQkY=",
+ "dev": true
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true,
+ "optional": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
+ "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "karma": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz",
+ "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==",
+ "dev": true,
+ "requires": {
+ "bluebird": "3.5.1",
+ "body-parser": "1.18.3",
+ "chokidar": "1.7.0",
+ "colors": "1.3.0",
+ "combine-lists": "1.0.1",
+ "connect": "3.6.6",
+ "core-js": "2.5.7",
+ "di": "0.0.1",
+ "dom-serialize": "2.2.1",
+ "expand-braces": "0.1.2",
+ "glob": "7.1.2",
+ "graceful-fs": "4.1.11",
+ "http-proxy": "1.17.0",
+ "isbinaryfile": "3.0.2",
+ "lodash": "3.10.1",
+ "log4js": "0.6.38",
+ "mime": "1.6.0",
+ "minimatch": "3.0.4",
+ "optimist": "0.6.1",
+ "qjobs": "1.2.0",
+ "range-parser": "1.2.0",
+ "rimraf": "2.6.2",
+ "safe-buffer": "5.1.2",
+ "socket.io": "1.7.3",
+ "source-map": "0.5.7",
+ "tmp": "0.0.31",
+ "useragent": "2.3.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ }
+ }
+ },
+ "karma-chai": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz",
+ "integrity": "sha1-vuWtQEAFF4Ea40u5RfdikJEIt5o=",
+ "dev": true
+ },
+ "karma-fixture": {
+ "version": "0.2.6",
+ "resolved": "https://registry.npmjs.org/karma-fixture/-/karma-fixture-0.2.6.tgz",
+ "integrity": "sha1-lxzqjCFtc/BwQ5ZMtz8Q4IMAGO8=",
+ "dev": true
+ },
+ "karma-handlebars-preprocessor": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/karma-handlebars-preprocessor/-/karma-handlebars-preprocessor-0.3.0.tgz",
+ "integrity": "sha1-wTXmwhVKBVj5es/AKo29jF7yiUs=",
+ "dev": true,
+ "requires": {
+ "handlebars": "4.0.11"
+ }
+ },
+ "karma-html2js-preprocessor": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/karma-html2js-preprocessor/-/karma-html2js-preprocessor-1.1.0.tgz",
+ "integrity": "sha1-/Ant8Eu+K7bu6boZaPgmtziAIL0=",
+ "dev": true
+ },
+ "karma-jquery": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/karma-jquery/-/karma-jquery-0.1.0.tgz",
+ "integrity": "sha1-fcRzfY2kKNfTxkVcQgER3MAhf7Y=",
+ "dev": true
+ },
+ "karma-json-fixtures-preprocessor": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/karma-json-fixtures-preprocessor/-/karma-json-fixtures-preprocessor-0.0.6.tgz",
+ "integrity": "sha1-T3ii6800OH+OVaur/2NGVRZMTHY=",
+ "dev": true
+ },
+ "karma-mocha": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-0.1.10.tgz",
+ "integrity": "sha1-Ke1R1LEhrxNzRE7FVbIKkFv0K5I=",
+ "dev": true
+ },
+ "karma-phantomjs-launcher": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz",
+ "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=",
+ "dev": true,
+ "requires": {
+ "lodash": "4.17.10",
+ "phantomjs-prebuilt": "2.1.16"
+ },
+ "dependencies": {
+ "lodash": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
+ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
+ "dev": true
+ }
+ }
+ },
+ "karma-sinon": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/karma-sinon/-/karma-sinon-1.0.5.tgz",
+ "integrity": "sha1-TjRD8oMP3s/2JNN0cWPxIX2qKpo=",
+ "dev": true
+ },
+ "karma-spec-reporter": {
+ "version": "0.0.26",
+ "resolved": "https://registry.npmjs.org/karma-spec-reporter/-/karma-spec-reporter-0.0.26.tgz",
+ "integrity": "sha1-v1VhN33OG2PPLJdcGvPjXxmeImU=",
+ "dev": true,
+ "requires": {
+ "colors": "0.6.2"
+ },
+ "dependencies": {
+ "colors": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz",
+ "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=",
+ "dev": true
+ }
+ }
+ },
+ "karma-verbose-reporter": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/karma-verbose-reporter/-/karma-verbose-reporter-0.0.3.tgz",
+ "integrity": "sha1-iSUel/bW5HDcVcdZ5oFTBDwHAxw=",
+ "dev": true,
+ "requires": {
+ "colors": "1.3.0"
+ }
+ },
+ "kew": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
+ "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ },
+ "klaw": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
+ "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11"
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "dev": true,
+ "optional": true
+ },
+ "libbase64": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/libbase64/-/libbase64-0.1.0.tgz",
+ "integrity": "sha1-YjUag5VjrF/1vSbxL2Dpgwu3UeY="
+ },
+ "libmime": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/libmime/-/libmime-1.2.0.tgz",
+ "integrity": "sha1-jYS087Ils3BEECNu9JSQZDa6dCs=",
+ "requires": {
+ "iconv-lite": "0.4.23",
+ "libbase64": "0.1.0",
+ "libqp": "1.1.0"
+ }
+ },
+ "libqp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/libqp/-/libqp-1.1.0.tgz",
+ "integrity": "sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g="
+ },
+ "linerstream": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/linerstream/-/linerstream-0.1.4.tgz",
+ "integrity": "sha1-Xee/afqisPnYXoMyCZtw5BmoRdU=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
+ "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
+ "dev": true
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash.keys": "3.1.2"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "dev": true,
+ "requires": {
+ "lodash._baseassign": "3.2.0",
+ "lodash._basecreate": "3.0.3",
+ "lodash._isiterateecall": "3.0.9"
+ }
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "log4js": {
+ "version": "0.6.38",
+ "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz",
+ "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "semver": "4.3.6"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ }
+ }
+ },
+ "lolex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz",
+ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=",
+ "dev": true
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz",
+ "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "1.0.2",
+ "yallist": "2.1.2"
+ }
+ },
+ "mailcomposer": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mailcomposer/-/mailcomposer-2.1.0.tgz",
+ "integrity": "sha1-plMYIomWFP7omckiJtgeK5y7GD0=",
+ "requires": {
+ "buildmail": "2.0.0",
+ "libmime": "1.2.0"
+ }
+ },
+ "math-random": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
+ "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
+ "dev": true
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ }
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "1.1.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "mocha": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz",
+ "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.6.8",
+ "diff": "3.2.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.1",
+ "growl": "1.9.2",
+ "he": "1.1.1",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.8",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+ "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "1.0.0",
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ }
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "nan": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
+ "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
+ "dev": true,
+ "optional": true
+ },
+ "needle": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-0.11.0.tgz",
+ "integrity": "sha1-AqcbAI6vfVWuifuf12hbe4jXvCk=",
+ "requires": {
+ "debug": "2.6.9",
+ "iconv-lite": "0.4.23"
+ }
+ },
+ "negotiator": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
+ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
+ "dev": true
+ },
+ "nodemailer": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-1.11.0.tgz",
+ "integrity": "sha1-TmnLObAwFbHR7wx4qBVBK56Xb3k=",
+ "requires": {
+ "libmime": "1.2.0",
+ "mailcomposer": "2.1.0",
+ "needle": "0.11.0",
+ "nodemailer-direct-transport": "1.1.0",
+ "nodemailer-smtp-transport": "1.1.0"
+ }
+ },
+ "nodemailer-direct-transport": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/nodemailer-direct-transport/-/nodemailer-direct-transport-1.1.0.tgz",
+ "integrity": "sha1-oveHCO5vFuoFc/yClJ0Tj/Fy9iQ=",
+ "requires": {
+ "smtp-connection": "1.3.8"
+ }
+ },
+ "nodemailer-smtp-transport": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/nodemailer-smtp-transport/-/nodemailer-smtp-transport-1.1.0.tgz",
+ "integrity": "sha1-5sN/MYhaswgOfe089SjErX5pE5g=",
+ "requires": {
+ "clone": "1.0.4",
+ "nodemailer-wellknown": "0.1.10",
+ "smtp-connection": "1.3.8"
+ }
+ },
+ "nodemailer-wellknown": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/nodemailer-wellknown/-/nodemailer-wellknown-0.1.10.tgz",
+ "integrity": "sha1-WG24EB2zDLRDjrVGc3pBqtDPE9U="
+ },
+ "normalize-path": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "dev": true,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "oauth-sign": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
+ "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
+ "dev": true
+ },
+ "object-assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz",
+ "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=",
+ "dev": true
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+ "dev": true
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1.0.2"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.10",
+ "wordwrap": "0.0.3"
+ }
+ },
+ "options": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz",
+ "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=",
+ "dev": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ }
+ },
+ "parsejson": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz",
+ "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "dev": true,
+ "requires": {
+ "better-assert": "1.0.2"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
+ "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "phantom": {
+ "version": "2.1.21",
+ "resolved": "https://registry.npmjs.org/phantom/-/phantom-2.1.21.tgz",
+ "integrity": "sha1-drd5D/Ys8J++kiroRLn7dFzouyg=",
+ "dev": true,
+ "requires": {
+ "linerstream": "0.1.4",
+ "phantomjs-prebuilt": "2.1.16",
+ "winston": "2.4.3"
+ }
+ },
+ "phantomjs-prebuilt": {
+ "version": "2.1.16",
+ "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz",
+ "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=",
+ "dev": true,
+ "requires": {
+ "es6-promise": "4.2.4",
+ "extract-zip": "1.6.7",
+ "fs-extra": "1.0.0",
+ "hasha": "2.2.0",
+ "kew": "0.7.0",
+ "progress": "1.1.8",
+ "request": "2.87.0",
+ "request-progress": "2.0.1",
+ "which": "1.3.1"
+ }
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+ "dev": true
+ },
+ "progress": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
+ "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "qjobs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+ "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz",
+ "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==",
+ "dev": true,
+ "requires": {
+ "is-number": "4.0.0",
+ "kind-of": "6.0.2",
+ "math-random": "1.0.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
+ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
+ "dev": true
+ }
+ }
+ },
+ "range-parser": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
+ "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+ "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.3",
+ "iconv-lite": "0.4.23",
+ "unpipe": "1.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "readdirp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
+ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "4.1.11",
+ "minimatch": "3.0.4",
+ "readable-stream": "2.3.6",
+ "set-immediate-shim": "1.0.1"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.87.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
+ "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "aws4": "1.7.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.2",
+ "har-validator": "5.0.3",
+ "http-signature": "1.2.0",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "performance-now": "2.1.0",
+ "qs": "6.5.2",
+ "safe-buffer": "5.1.2",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.3.2"
+ }
+ },
+ "request-progress": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz",
+ "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=",
+ "dev": true,
+ "requires": {
+ "throttleit": "1.0.0"
+ }
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "0.1.4"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "samsam": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz",
+ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=",
+ "dev": true
+ },
+ "semver": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
+ "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
+ "dev": true
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "sinon": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz",
+ "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=",
+ "dev": true,
+ "requires": {
+ "formatio": "1.1.1",
+ "lolex": "1.3.2",
+ "samsam": "1.1.2",
+ "util": "0.11.0"
+ }
+ },
+ "smtp-connection": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/smtp-connection/-/smtp-connection-1.3.8.tgz",
+ "integrity": "sha1-VYMsIWDPswhuHc2H/RwZ+mG39TY="
+ },
+ "socket.io": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz",
+ "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=",
+ "dev": true,
+ "requires": {
+ "debug": "2.3.3",
+ "engine.io": "1.8.3",
+ "has-binary": "0.1.7",
+ "object-assign": "4.1.0",
+ "socket.io-adapter": "0.5.0",
+ "socket.io-client": "1.7.3",
+ "socket.io-parser": "2.3.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
+ "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.2"
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ }
+ }
+ },
+ "socket.io-adapter": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz",
+ "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=",
+ "dev": true,
+ "requires": {
+ "debug": "2.3.3",
+ "socket.io-parser": "2.3.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
+ "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.2"
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ }
+ }
+ },
+ "socket.io-client": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz",
+ "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=",
+ "dev": true,
+ "requires": {
+ "backo2": "1.0.2",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "2.3.3",
+ "engine.io-client": "1.8.3",
+ "has-binary": "0.1.7",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "2.3.1",
+ "to-array": "0.1.4"
+ },
+ "dependencies": {
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz",
+ "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.2"
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ }
+ }
+ },
+ "socket.io-parser": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz",
+ "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.1.2",
+ "debug": "2.2.0",
+ "isarray": "0.0.1",
+ "json3": "3.3.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "ms": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+ "dev": true
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "requires": {
+ "amdefine": "1.0.1"
+ }
+ },
+ "sshpk": {
+ "version": "1.14.2",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
+ "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
+ "dev": true,
+ "requires": {
+ "asn1": "0.2.3",
+ "assert-plus": "1.0.0",
+ "bcrypt-pbkdf": "1.0.2",
+ "dashdash": "1.14.1",
+ "ecc-jsbn": "0.1.1",
+ "getpass": "0.1.7",
+ "jsbn": "0.1.1",
+ "safer-buffer": "2.1.2",
+ "tweetnacl": "0.14.5"
+ }
+ },
+ "stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "dev": true,
+ "requires": {
+ "has-flag": "1.0.0"
+ }
+ },
+ "throttleit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
+ "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.0.31",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz",
+ "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=",
+ "dev": true,
+ "requires": {
+ "os-tmpdir": "1.0.2"
+ }
+ },
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+ "dev": true
+ },
+ "tough-cookie": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-detect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
+ "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.16",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "2.1.18"
+ }
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.29",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "source-map": "0.5.7",
+ "uglify-to-browserify": "1.0.2",
+ "yargs": "3.10.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "dev": true,
+ "optional": true
+ },
+ "ultron": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
+ "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ },
+ "useragent": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
+ "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "4.1.3",
+ "tmp": "0.0.31"
+ }
+ },
+ "util": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.11.0.tgz",
+ "integrity": "sha512-5n12uMzKCjvB2HPFHnbQSjaqAa98L5iIXmHrZCLavuZVe0qe/SJGbDGWlpaHk5lnBkWRDO+dRu1/PgmUYKPPTw==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+ "dev": true
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.0"
+ }
+ },
+ "void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
+ "dev": true
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "2.0.0"
+ }
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "dev": true,
+ "optional": true
+ },
+ "winston": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.3.tgz",
+ "integrity": "sha512-GYKuysPz2pxYAVJD2NPsDLP5Z79SDEzPm9/j4tCjkF/n89iBNGBMJcR+dMUqxgPNgoSs6fVygPi+Vl2oxIpBuw==",
+ "dev": true,
+ "requires": {
+ "async": "1.0.0",
+ "colors": "1.0.3",
+ "cycle": "1.0.3",
+ "eyes": "0.1.8",
+ "isstream": "0.1.2",
+ "stack-trace": "0.0.10"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz",
+ "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
+ "dev": true
+ }
+ }
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "ws": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz",
+ "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=",
+ "dev": true,
+ "requires": {
+ "options": "0.0.6",
+ "ultron": "1.0.2"
+ }
+ },
+ "wtf-8": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz",
+ "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=",
+ "dev": true
+ },
+ "xmlhttprequest-ssl": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz",
+ "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "camelcase": "1.2.1",
+ "cliui": "2.1.0",
+ "decamelize": "1.2.0",
+ "window-size": "0.1.0"
+ }
+ },
+ "yauzl": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
+ "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
+ "dev": true,
+ "requires": {
+ "fd-slicer": "1.0.1"
+ }
+ },
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "dev": true
+ }
+ }
+}
diff --git a/legacy/package.json b/legacy/package.json
new file mode 100644
index 0000000..3c398de
--- /dev/null
+++ b/legacy/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "js-sdk",
+ "version": "1.0.0",
+ "description": "Unbxd JavaScript Search library =============================== [](http://travis-ci.org/emberjs/ember-rails) unbxdSearch.js library can be used to integrated UNBXD search or browse on client side. It supports History API, so users can share the URI.",
+ "main": "unbxd-sdk.js",
+ "directories": {
+ "test": "tests"
+ },
+ "dependencies": {
+ "colors": "^1.0.3",
+ "cryptiles": "^4.1.2",
+ "hoek": "^4.2.1",
+ "nodemailer": "^5.1.1",
+ "sshpk": "^1.13.2"
+ },
+ "scripts": {
+ "test": "karma start"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/unbxd/js-sdk.git"
+ },
+ "author": "",
+ "license": "ISC",
+ "bugs": {
+ "url": "https://github.com/unbxd/js-sdk/issues"
+ },
+ "homepage": "https://github.com/unbxd/js-sdk",
+ "devDependencies": {
+ "chai": "^4.2.0",
+ "handlebars": "^4.0.5",
+ "jquery": "^3.3.1",
+ "jquery-ui": "^1.12.1",
+ "karma": "^4.0.0",
+ "karma-chai": "^0.1.0",
+ "karma-fixture": "^0.2.6",
+ "karma-handlebars-preprocessor": "^0.3.0",
+ "karma-html2js-preprocessor": "^1.0.0",
+ "karma-jquery": "^0.2.3",
+ "karma-json-fixtures-preprocessor": "0.0.6",
+ "karma-mocha": "^1.3.0",
+ "karma-phantomjs-launcher": "^1.0.2",
+ "karma-sinon": "^1.0.5",
+ "karma-spec-reporter": "0.0.32",
+ "karma-verbose-reporter": "0.0.6",
+ "mocha": "^6.0.1",
+ "phantom": "^6.0.3",
+ "sinon": "^7.2.4"
+ }
+}
diff --git a/test/navigation/init.spec.js b/legacy/test/navigation/init.spec.js
similarity index 100%
rename from test/navigation/init.spec.js
rename to legacy/test/navigation/init.spec.js
diff --git a/test/search/autoscroll.spec.js b/legacy/test/search/autoscroll.spec.js
similarity index 100%
rename from test/search/autoscroll.spec.js
rename to legacy/test/search/autoscroll.spec.js
diff --git a/test/search/banner.spec.js b/legacy/test/search/banner.spec.js
similarity index 100%
rename from test/search/banner.spec.js
rename to legacy/test/search/banner.spec.js
diff --git a/test/search/clickNscroll.spec.js b/legacy/test/search/clickNscroll.spec.js
similarity index 100%
rename from test/search/clickNscroll.spec.js
rename to legacy/test/search/clickNscroll.spec.js
diff --git a/test/search/facets.spec.js b/legacy/test/search/facets.spec.js
similarity index 100%
rename from test/search/facets.spec.js
rename to legacy/test/search/facets.spec.js
diff --git a/test/search/init.spec.js b/legacy/test/search/init.spec.js
similarity index 100%
rename from test/search/init.spec.js
rename to legacy/test/search/init.spec.js
diff --git a/test/search/jqueryVersion.spec.js b/legacy/test/search/jqueryVersion.spec.js
similarity index 100%
rename from test/search/jqueryVersion.spec.js
rename to legacy/test/search/jqueryVersion.spec.js
diff --git a/test/search/noResult.spec.js b/legacy/test/search/noResult.spec.js
similarity index 100%
rename from test/search/noResult.spec.js
rename to legacy/test/search/noResult.spec.js
diff --git a/test/search/pageSize.spec.js b/legacy/test/search/pageSize.spec.js
similarity index 100%
rename from test/search/pageSize.spec.js
rename to legacy/test/search/pageSize.spec.js
diff --git a/test/search/pagination.spec.js b/legacy/test/search/pagination.spec.js
similarity index 100%
rename from test/search/pagination.spec.js
rename to legacy/test/search/pagination.spec.js
diff --git a/test/search/redirect.spec.js b/legacy/test/search/redirect.spec.js
similarity index 100%
rename from test/search/redirect.spec.js
rename to legacy/test/search/redirect.spec.js
diff --git a/test/search/sort.spec.js b/legacy/test/search/sort.spec.js
similarity index 100%
rename from test/search/sort.spec.js
rename to legacy/test/search/sort.spec.js
diff --git a/test/search/spellCheckWithResult.spec.js b/legacy/test/search/spellCheckWithResult.spec.js
similarity index 100%
rename from test/search/spellCheckWithResult.spec.js
rename to legacy/test/search/spellCheckWithResult.spec.js
diff --git a/test/search/spellCheckZeroResult.spec.js b/legacy/test/search/spellCheckZeroResult.spec.js
similarity index 100%
rename from test/search/spellCheckZeroResult.spec.js
rename to legacy/test/search/spellCheckZeroResult.spec.js
diff --git a/test/search/userinfo.spec.js b/legacy/test/search/userinfo.spec.js
similarity index 100%
rename from test/search/userinfo.spec.js
rename to legacy/test/search/userinfo.spec.js
diff --git a/test/search/viewType.spec.js b/legacy/test/search/viewType.spec.js
similarity index 100%
rename from test/search/viewType.spec.js
rename to legacy/test/search/viewType.spec.js
diff --git a/tests/tester.js b/legacy/tests/tester.js
similarity index 100%
rename from tests/tester.js
rename to legacy/tests/tester.js
diff --git a/unbxd-sdk.js b/legacy/unbxd-sdk.js
similarity index 100%
rename from unbxd-sdk.js
rename to legacy/unbxd-sdk.js
diff --git a/unbxdAutosuggest.css b/legacy/unbxdAutosuggest.css
similarity index 100%
rename from unbxdAutosuggest.css
rename to legacy/unbxdAutosuggest.css
diff --git a/legacy/unbxdSearch.js b/legacy/unbxdSearch.js
new file mode 100644
index 0000000..f057c9c
--- /dev/null
+++ b/legacy/unbxdSearch.js
@@ -0,0 +1,2106 @@
+//uglifyjs unbxdSearch.js -o unbxdSearch.min.js && gzip -c unbxdSearch.min.js > unbxdSearch.min.js.gz && aws s3 cp unbxdSearch.min.js.gz s3://unbxd/unbxdSearch.js --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-encoding gzip --cache-control max-age=3600
+var unbxdSearchInit = function(jQuery, Handlebars) {
+ window.Unbxd = window.Unbxd || {};
+ Unbxd.jsSdkVersion = "2.0.2";
+
+ // Production steps of ECMA-262, Edition 5, 15.4.4.14
+ // Reference: http://es5.github.io/#x15.4.4.14
+ if (!Array.prototype.indexOf) {
+ Array.prototype.indexOf = function(searchElement, fromIndex) {
+
+ var k;
+
+ // 1. Let O be the result of calling ToObject passing
+ // the this value as the argument.
+ if (this == null) {
+ throw new TypeError('"this" is null or not defined');
+ }
+
+ var O = Object(this);
+
+ // 2. Let lenValue be the result of calling the Get
+ // internal method of O with the argument "length".
+ // 3. Let len be ToUint32(lenValue).
+ var len = O.length >>> 0;
+
+ // 4. If len is 0, return -1.
+ if (len === 0) {
+ return -1;
+ }
+
+ // 5. If argument fromIndex was passed let n be
+ // ToInteger(fromIndex); else let n be 0.
+ var n = +fromIndex || 0;
+
+ if (Math.abs(n) === Infinity) {
+ n = 0;
+ }
+
+ // 6. If n >= len, return -1.
+ if (n >= len) {
+ return -1;
+ }
+
+ // 7. If n >= 0, then Let k be n.
+ // 8. Else, n<0, Let k be len - abs(n).
+ // If k is less than 0, then let k be 0.
+ k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
+
+ // 9. Repeat, while k < len
+ while (k < len) {
+ // a. Let Pk be ToString(k).
+ // This is implicit for LHS operands of the in operator
+ // b. Let kPresent be the result of calling the
+ // HasProperty internal method of O with argument Pk.
+ // This step can be combined with c
+ // c. If kPresent is true, then
+ // i. Let elementK be the result of calling the Get
+ // internal method of O with the argument ToString(k).
+ // ii. Let same be the result of applying the
+ // Strict Equality Comparison Algorithm to
+ // searchElement and elementK.
+ // iii. If same is true, return k.
+ if (k in O && O[k] === searchElement) {
+ return k;
+ }
+ k++;
+ }
+ return -1;
+ };
+ }
+
+ /**
+ * Shim for "fixing" IE's lack of support (IE < 9) for applying slice
+ * on host objects like NamedNodeMap, NodeList, and HTMLCollection
+ * (technically, since host objects have been implementation-dependent,
+ * at least before ES6, IE hasn't needed to work this way).
+ * Also works on strings, fixes IE < 9 to allow an explicit undefined
+ * for the 2nd argument (as in Firefox), and prevents errors when
+ * called on other DOM objects.
+ */
+ (function() {
+ 'use strict';
+ var _slice = Array.prototype.slice;
+
+ try {
+ // Can't be used with DOM elements in IE < 9
+ _slice.call(document.documentElement);
+ } catch (e) { // Fails in IE < 9
+ // This will work for genuine arrays, array-like objects,
+ // NamedNodeMap (attributes, entities, notations),
+ // NodeList (e.g., getElementsByTagName), HTMLCollection (e.g., childNodes),
+ // and will not fail on other DOM objects (as do DOM elements in IE < 9)
+ Array.prototype.slice = function(begin, end) {
+ // IE < 9 gets unhappy with an undefined end argument
+ end = (typeof end !== 'undefined') ? end : this.length;
+
+ // For native Array objects, we use the native slice function
+ if (Object.prototype.toString.call(this) === '[object Array]') {
+ return _slice.call(this, begin, end);
+ }
+
+ // For array like object we handle it ourselves.
+ var i, cloned = [],
+ size, len = this.length;
+
+ // Handle negative value for "begin"
+ var start = begin || 0;
+ start = (start >= 0) ? start : Math.max(0, len + start);
+
+ // Handle negative value for "end"
+ var upTo = (typeof end == 'number') ? Math.min(end, len) : len;
+ if (end < 0) {
+ upTo = len + end;
+ }
+
+ // Actual expected size of the slice
+ size = upTo - start;
+
+ if (size > 0) {
+ cloned = new Array(size);
+ if (this.charAt) {
+ for (i = 0; i < size; i++) {
+ cloned[i] = this.charAt(start + i);
+ }
+ } else {
+ for (i = 0; i < size; i++) {
+ cloned[i] = this[start + i];
+ }
+ }
+ }
+
+ return cloned;
+ };
+ }
+ }());
+
+ if (!Function.prototype.bind) {
+ Function.prototype.bind = function(oThis) {
+ if (typeof this !== "function") {
+ throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
+ }
+
+ var aArgs = Array.prototype.slice.call(arguments, 1),
+ fToBind = this,
+ fNOP = function() {},
+ fBound = function() {
+ return fToBind.apply(this instanceof fNOP && oThis ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
+ };
+
+ fNOP.prototype = this.prototype;
+ fBound.prototype = new fNOP();
+
+ return fBound;
+ };
+ }
+
+ // Production steps of ECMA-262, Edition 5, 15.4.4.19
+ // Reference: http://es5.github.io/#x15.4.4.19
+ if (!Array.prototype.map) {
+
+ Array.prototype.map = function(callback, thisArg) {
+
+ var T, A, k;
+
+ if (this == null) {
+ throw new TypeError(' this is null or not defined');
+ }
+
+ // 1. Let O be the result of calling ToObject passing the |this|
+ // value as the argument.
+ var O = Object(this);
+
+ // 2. Let lenValue be the result of calling the Get internal
+ // method of O with the argument "length".
+ // 3. Let len be ToUint32(lenValue).
+ var len = O.length >>> 0;
+
+ // 4. If IsCallable(callback) is false, throw a TypeError exception.
+ // See: http://es5.github.com/#x9.11
+ if (typeof callback !== 'function') {
+ throw new TypeError(callback + ' is not a function');
+ }
+
+ // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
+ if (arguments.length > 1) {
+ T = thisArg;
+ }
+
+ // 6. Let A be a new array created as if by the expression new Array(len)
+ // where Array is the standard built-in constructor with that name and
+ // len is the value of len.
+ A = new Array(len);
+
+ // 7. Let k be 0
+ k = 0;
+
+ // 8. Repeat, while k < len
+ while (k < len) {
+
+ var kValue, mappedValue;
+
+ // a. Let Pk be ToString(k).
+ // This is implicit for LHS operands of the in operator
+ // b. Let kPresent be the result of calling the HasProperty internal
+ // method of O with argument Pk.
+ // This step can be combined with c
+ // c. If kPresent is true, then
+ if (k in O) {
+
+ // i. Let kValue be the result of calling the Get internal
+ // method of O with argument Pk.
+ kValue = O[k];
+
+ // ii. Let mappedValue be the result of calling the Call internal
+ // method of callback with T as the this value and argument
+ // list containing kValue, k, and O.
+ mappedValue = callback.call(T, kValue, k, O);
+
+ // iii. Call the DefineOwnProperty internal method of A with arguments
+ // Pk, Property Descriptor
+ // { Value: mappedValue,
+ // Writable: true,
+ // Enumerable: true,
+ // Configurable: true },
+ // and false.
+
+ // In browsers that support Object.defineProperty, use the following:
+ // Object.defineProperty(A, k, {
+ // value: mappedValue,
+ // writable: true,
+ // enumerable: true,
+ // configurable: true
+ // });
+
+ // For best browser support, use the following:
+ A[k] = mappedValue;
+ }
+ // d. Increase k by 1.
+ k++;
+ }
+
+ // 9. return A
+ return A;
+ };
+ }
+
+ if (!Array.prototype.filter) {
+ Array.prototype.filter = function(fun /*, thisArg*/ ) {
+ 'use strict';
+
+ if (this === void 0 || this === null) {
+ throw new TypeError();
+ }
+
+ var t = Object(this);
+ var len = t.length >>> 0;
+ if (typeof fun !== 'function') {
+ throw new TypeError();
+ }
+
+ var res = [];
+ var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
+ for (var i = 0; i < len; i++) {
+ if (i in t) {
+ var val = t[i];
+
+ // NOTE: Technically this should Object.defineProperty at
+ // the next index, as push can be affected by
+ // properties on Object.prototype and Array.prototype.
+ // But that method's new, and collisions should be
+ // rare, so use the more-compatible alternative.
+ if (fun.call(thisArg, val, i, t)) {
+ res.push(val);
+ }
+ }
+ }
+
+ return res;
+ };
+ }
+
+ // Production steps of ECMA-262, Edition 5, 15.4.4.21
+ // Reference: http://es5.github.io/#x15.4.4.21
+ if (!Array.prototype.reduce) {
+ Array.prototype.reduce = function(callback /*, initialValue*/ ) {
+ 'use strict';
+ if (this == null) {
+ throw new TypeError('Array.prototype.reduce called on null or undefined');
+ }
+ if (typeof callback !== 'function') {
+ throw new TypeError(callback + ' is not a function');
+ }
+ var t = Object(this),
+ len = t.length >>> 0,
+ k = 0,
+ value;
+ if (arguments.length == 2) {
+ value = arguments[1];
+ } else {
+ while (k < len && !(k in t)) {
+ k++;
+ }
+ if (k >= len) {
+ throw new TypeError('Reduce of empty array with no initial value');
+ }
+ value = t[k++];
+ }
+ for (; k < len; k++) {
+ if (k in t) {
+ value = callback(value, t[k], k, t);
+ }
+ }
+ return value;
+ };
+ }
+
+ if (!Object.keys) Object.keys = function(o) {
+ if (o !== Object(o))
+ throw new TypeError('Object.keys called on a non-object');
+ var k = [],
+ p;
+ for (p in o)
+ if (Object.prototype.hasOwnProperty.call(o, p)) k.push(p);
+ return k;
+ };
+
+ Array.prototype.getUnique = function() {
+ var u = {},
+ a = [];
+ for (var i = 0, l = this.length; i < l; ++i) {
+ if (u.hasOwnProperty(this[i])) {
+ continue;
+ }
+ a.push(this[i]);
+ u[this[i]] = 1;
+ }
+ return a;
+ }
+
+ if (typeof String.prototype.trim !== 'function') {
+ String.prototype.trim = function() {
+ return this.replace(/^\s+|\s+$/g, '');
+ };
+ };
+
+ Unbxd.setSearch = function(options) {
+ this.options = jQuery.extend({}, this.defaultOptions, options);
+
+ this.init();
+ }
+
+ var isTypeSearch = function isTypeSearch(type) {
+ return type === "search";
+ };
+
+ var isTypeBrowse = function isTypeBrowse(type) {
+ return type === "browse";
+ };
+
+ var isTypeCategory = function isTypeCategory(type) {
+ return type === "category";
+ };
+
+ var isTypeBrowseOrCategory = function isTypeBrowseOrCategory(type) {
+ return isTypeBrowse(type) || isTypeCategory(type);
+ };
+
+ var isCategoryIdPresent = function isCategoryIdPresent(params) {
+ return ("categoryId" in params && params.categoryId.trim().length > 0);
+ };
+
+ var isQueryPresent = function isQueryPresent(params) {
+ return ("query" in params && params.query.trim().length > 0);
+ };
+
+ Handlebars.registerHelper('prepareFacetName', function(txt) {
+ txt = txt.replace("_fq", "");
+ return txt.replace("_", " ");
+ });
+
+ Handlebars.registerHelper('prepareFacetValue', function(txt) {
+ return txt.trim().length > 0 ? txt : " ";
+ });
+
+ Unbxd.setSearch.prototype.defaultOptions = {
+ inputSelector: '#search_query',
+ searchButtonSelector: '#search_button',
+ type: "search",
+ getCategoryId: "",
+ deferInitRender: [],
+ spellCheck: '' //
+ ,
+ spellCheckTemp: '
Did you mean : {{suggestion}}
',
+ searchQueryDisplay: '',
+ searchQueryDisplayTemp: 'Search results for {{query}} - {{numberOfProducts}}
',
+ searchResultContainer: '',
+ searchResultSetTemp: '' //function or handlebars template, register any helpers if needed
+ ,
+ isAutoScroll: false,
+ isClickNScroll: false,
+ isPagination: false,
+ setPagination: function(totalNumberOfProducts, pageSize, currentPage) {},
+ paginationContainerSelector: '',
+ paginationTemp: [
+ '{{#if hasFirst}}',
+ ' « ',
+ '{{/if}}',
+ '{{#if hasPrev}}',
+ ' < ',
+ '{{/if}}',
+ '{{#pages}}',
+ '{{#if current}}',
+ ' {{page}} ',
+ '{{else}}',
+ ' {{page}} ',
+ '{{/if}}',
+ '{{/pages}}',
+ ' of ',
+ '{{totalPages}}',
+ '{{#if hasNext}}',
+ ' > ',
+ '{{/if}}',
+ '{{#if hasLast}}',
+ '»',
+ '{{/if}}'
+ ].join(''),
+ clickNScrollElementSelector: '#load-more',
+ facetMultiSelect: true,
+ facetContainerSelector: '',
+ facetCheckBoxSelector: '',
+ selectedFacetTemp: ['{{#each filters}}', '', '- ', '{{prepareFacetName @key}}:', '{{#each this}}', '', '{{/each}}', '
', '
', '{{/each}}'].join(''),
+ selectedFacetContainerSelector: "",
+ clearSelectedFacetsSelector: "",
+ removeSelectedFacetSelector: "",
+ loaderSelector: "",
+ onFacetLoad: "",
+ onIntialResultLoad: "",
+ onPageLoad: "",
+ sanitizeQueryString: function(q) {
+ return q;
+ },
+ getFacetStats: "",
+ processFacetStats: function(obj) {},
+ setDefaultFilters: function() {},
+ fields: [],
+ onNoResult: function(obj) {},
+ noEncoding: false,
+ heightDiffToTriggerNextPage: 100,
+ customReset: function() {},
+ bannerSelector: "",
+ bannerTemp: '
',
+ bannerCount: 1,
+ sortContainerSelector: '',
+ sortOptions: [{
+ name: 'Relevancy'
+ }, {
+ name: 'Price: H-L',
+ field: 'price',
+ order: 'desc'
+ }, {
+ name: 'Price: L-H',
+ field: 'price',
+ order: 'asc'
+ }],
+ sortContainerType: 'select' /* value can be select or click */ ,
+ sortContainerTemp: [
+ ''
+ ].join(''),
+ pageSize: 12,
+ pageSizeContainerSelector: '',
+ pageSizeOptions: [{
+ name: '12',
+ value: '12'
+ }, {
+ name: '24',
+ value: '24'
+ }],
+ pageSizeContainerType: 'select' /* value can be select or click */ ,
+ pageSizeContainerTemp: [
+ ''
+ ].join(''),
+ viewTypeContainerTemp: [
+ '{{#options}}',
+ '',
+ '',
+ '',
+ '{{value}}',
+ '',
+ '',
+ '',
+ '{{/options}}'
+ ].join(''),
+ searchQueryParam: "q",
+ retainbaseParam: false,
+ baseParams: [],
+ requestHeaders: {}
+ };
+
+ jQuery.extend(Unbxd.setSearch.prototype, {
+ compiledResultTemp: false,
+ compiledSpellCheckTemp: false,
+ compiledSearchQueryTemp: false,
+ compiledFacetTemp: false,
+ compiledSelectedFacetTemp: false,
+ compiledBannerTemp: false,
+ compiledSortContainerTemp: false,
+ compiledPageSizeContainerTemp: false,
+ compiledPaginationTemp: false,
+ currentNumberOfProducts: 0,
+ totalNumberOfProducts: 0,
+ productStartIdx: 0,
+ productEndIdx: 0,
+ totalPages: 0,
+ isLoading: false,
+ params: {
+ query: '*',
+ filters: {},
+ ranges: {},
+ sort: {},
+ categoryId: "",
+ extra: {
+ format: "json",
+ page: 1,
+ rows: 0
+ }
+ },
+ defaultParams: {},
+ isHistory: !!(window.history && history.pushState),
+ popped: false //there is an edge case in Mozilla that fires popstate initially
+ ,
+ initialURL: '',
+ isHashChange: false,
+ currentHash: "",
+ hashChangeInterval: null,
+ ajaxCall: null,
+ init: function() {
+ this.isHashChange = !!("onhashchange" in window.document.body);
+
+ this.$input = jQuery(this.options.inputSelector);
+ this.$input.val('');
+ this.input = this.$input[0];
+
+ this.setEvents();
+
+ this.reset();
+
+ var cur_url = this.getUrlSubstring(),
+ urlqueryparams = this.getQueryParams(cur_url)
+ // add test to check if the url is encoded,
+ // decode the query parameters only if url is encoded
+ // fixes SKU searches like writ0035/WRIT0035 & HSWD0015
+ ,
+ decodedParams = !(this.options.noEncoding && /[^A-Za-z0-9\+\/\=]/g.test(cur_url)) ? this.getQueryParams(this.decode(cur_url)) : {},
+ queryparamcount = Object.keys(urlqueryparams).length,
+ decodedParamscount = Object.keys(decodedParams).length,
+ finalParams = null;
+
+ if (!this.options.noEncoding && decodedParamscount > 0) {
+ finalParams = this._processURL(decodedParams);
+ } else {
+ finalParams = this._processURL(urlqueryparams);
+ }
+
+ if (this.options.deferInitRender.indexOf('search') > -1 &&
+ !this.isUsingPagination() &&
+ finalParams.extra.hasOwnProperty('page') &&
+ finalParams.extra.page >= 1)
+ finalParams.extra.page = finalParams.extra.page + 1;
+
+ this.params = finalParams;
+
+ this.params.categoryId = isTypeBrowseOrCategory(this.options.type) &&
+ typeof this.options.getCategoryId == 'function' ?
+ this.options.getCategoryId() :
+ this.params.categoryId ? this.params.categoryId : '';
+
+ this.setPage("page" in finalParams.extra ? finalParams.extra.page : 1)
+ .setPageSize("rows" in finalParams.extra ? finalParams.extra.rows : this.options.pageSize);
+
+ if (this.options.type == "search") {
+ if (this.input.value.trim().length)
+ this.params.query = this.$input.val().trim();
+ else if (!("query" in this.params) || (this.params.query + "").trim().length == 0)
+ this.params.query = "*";
+
+ this.params.query = this.options.sanitizeQueryString.call(this, this.params.query);
+
+ this.$input.val(this.params.query != "*" ? this.params.query : "");
+
+ if (this.options.deferInitRender.indexOf('search') === -1)
+ jQuery(this.options.searchResultContainer).html('');
+
+ }
+
+ if (typeof this.options.setDefaultFilters == "function")
+ this.setDefaultParams(this.params);
+
+ if (
+ (isTypeSearch(this.options.type) && isQueryPresent(this.params)) ||
+ (isTypeBrowseOrCategory(this.options.type) && isCategoryIdPresent(this.params))
+ )
+ this.callResults(this.paintResultSet);
+ },
+ getClass: function(object) {
+ return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
+ },
+ setEvents: function() {
+ var self = this;
+
+ var changeViewType = function(e) {
+ e.preventDefault();
+ var $t = jQuery(this);
+ var selected = $t.attr("unbxdviewtype");
+ self.setViewType(selected);
+ if (selected && self.options.viewTypes.indexOf(selected) > -1) {
+ if (!self.isUsingPagination()) self.setPage(1);
+ if (self.options.deferInitRender.indexOf('search') > 0 &&
+ !self.isUsingPagination()) self.setPage(2);
+ self.callResults(self.paintOnlyResultSet, true);
+ }
+ };
+
+ var changeSort = function(e) {
+ e.preventDefault();
+ var $t = jQuery(this),
+ $selected = (e.type === 'change') ? $t.find(':selected') :
+ (e.currentTarget === e.target) ? $t : undefined,
+ field = $selected && $selected.attr('unbxdsortfield'),
+ value = $selected && $selected.attr('unbxdsortvalue');
+
+ if ($selected) {
+ self
+ .resetSort()
+ .setPage(1);
+
+ if (field && value)
+ self.addSort(field, value);
+
+ self.callResults(self.paintOnlyResultSet, true);
+ }
+ };
+
+ var changePageSize = function(e) {
+ e.preventDefault();
+ var $t = jQuery(this),
+ $selected = (e.type === 'change') ? $t.find(':selected') :
+ (e.currentTarget === e.target) ? $t : undefined,
+ pageSize = $selected && $selected.attr('unbxdpagesize');
+
+ if ($selected && pageSize) {
+ self
+ .setPage(1)
+ .setPageSize(pageSize)
+ .callResults(self.paintOnlyResultSet, true);
+ }
+ };
+
+ if (this.options.type == "search") {
+ if ("form" in this.input && this.input.form) {
+ jQuery(this.input.form).bind("submit", function(e) {
+ e.preventDefault();
+
+ self.reset();
+
+ self.params.query = self.options.sanitizeQueryString.call(self, self.input.value);
+
+ if (self.options.deferInitRender.indexOf('search') === -1)
+ jQuery(self.options.searchResultContainer).html('');
+
+ self.setPage(1)
+ .setPageSize(self.options.pageSize)
+
+ if (self.params.query)
+ self.callResults(self.paintResultSet, true);
+ });
+ } else {
+ this.$input.bind('keydown', function(e) {
+ if (e.which == 13) {
+ e.preventDefault();
+
+ self.reset();
+
+ self.params.query = self.options.sanitizeQueryString.call(self, this.value);
+
+ if (self.options.deferInitRender.indexOf('search') === -1)
+ jQuery(self.options.searchResultContainer).html('');
+
+ self.clearFilters(true).setPage(1)
+ .setPageSize(self.options.pageSize)
+
+ if (self.params.query)
+ self.callResults(self.paintResultSet, true);
+ }
+ });
+
+ if (this.options.searchButtonSelector.length) {
+ jQuery(this.options.searchButtonSelector).bind("click", function(e) {
+ e.preventDefault();
+
+ self.reset();
+
+ self.params.query = self.options.sanitizeQueryString.call(self, self.input.value);
+
+ if (self.options.deferInitRender.indexOf('search') === -1)
+ jQuery(self.options.searchResultContainer).html('');
+
+ self.clearFilters(true).setPage(1)
+ .setPageSize(self.options.pageSize)
+
+ if (self.params.query)
+ self.callResults(self.paintResultSet, true);
+ });
+ }
+ }
+ }
+
+ //click on somthing like "Load more results" to fetch next page
+ if (this.options.isClickNScroll) {
+ jQuery(this.options.clickNScrollElementSelector).bind('click', function(e) {
+ e.preventDefault();
+
+ self.setPage(self.getPage() + 1);
+
+ if (self.params.query)
+ self.callResults(self.paintProductPage);
+ });
+ }
+
+ //to load results on scrolling down
+ if (this.options.isAutoScroll) {
+ jQuery(window).scroll(function() {
+ var wind = jQuery(window),
+ docu = jQuery(document);
+ if ((wind.scrollTop()) > (docu.height() - wind.height() - self.options.heightDiffToTriggerNextPage) && self.currentNumberOfProducts < self.totalNumberOfProducts && !self.isLoading) {
+ self.setPage(self.getPage() + 1)
+ .callResults(self.paintProductPage);
+ }
+ });
+ }
+
+ //click on facet checkboxes
+ if (this.options.facetContainerSelector.length > 0) {
+ jQuery(this.options.facetContainerSelector).delegate(self.options.facetCheckBoxSelector, 'change', function(e) {
+ var box = jQuery(this),
+ el = box.parents(self.options.facetElementSelector),
+ facetName = box.attr('unbxdParam_facetName'),
+ facetValue = box.attr('unbxdParam_facetValue'),
+ vals = facetValue.split(' TO ');
+
+ if (box.is(':checked') && typeof self.options.facetOnSelect == "function") {
+ self.options.facetOnSelect(el);
+ }
+
+ if (!box.is(':checked') && typeof self.options.facetOnDeselect == "function") {
+ self.options.facetOnDeselect(el);
+ }
+
+ if (vals.length > 1)
+ self[box.is(':checked') ? 'addRangeFilter' : 'removeRangeFilter'](facetName, vals[0], vals[1]);
+ else
+ self[box.is(':checked') ? 'addFilter' : 'removeFilter'](facetName, facetValue);
+
+ self.setPage(1)
+ .callResults(self.paintResultSet, true);
+ });
+ }
+
+ if (this.options.clearSelectedFacetsSelector.length > 0) {
+ jQuery('body').delegate(this.options.clearSelectedFacetsSelector, 'click', function(e) {
+ e.preventDefault();
+
+ self.clearFilters(true).setPage(1)
+ .callResults(self.paintResultSet, true);
+ });
+ }
+
+ if (this.options.removeSelectedFacetSelector.length > 0) {
+ jQuery(this.options.selectedFacetContainerSelector).delegate(this.options.removeSelectedFacetSelector, 'click', function(e) {
+ e.preventDefault();
+ var $t = jQuery(this),
+ name = $t.attr("unbxdParam_facetName"),
+ val = $t.attr("unbxdParam_facetValue"),
+ vals = val.split(' TO '),
+ checkbox_sel = self.options.facetCheckBoxSelector + "[unbxdParam_facetName=\"" + name + "\"][unbxdParam_facetValue=\"" + val + "\"]";
+
+ jQuery(checkbox_sel).removeAttr("checked");
+
+ if (typeof self.options.facetOnDeselect == "function") {
+ self.options.facetOnDeselect(jQuery(checkbox_sel).parents(self.options.facetElementSelector));
+ }
+
+ if (vals.length > 1)
+ self.removeRangeFilter(name, vals[0], vals[1]);
+ else
+ self.removeFilter(name, val);
+
+ self.setPage(1)
+ .callResults(self.paintResultSet, true);
+ });
+ }
+
+ if (this.options.sortContainerSelector.length > 0) {
+ if (this.options.sortContainerType === 'select') {
+ jQuery(this.options.sortContainerSelector).on({
+ change: changeSort
+ }, '*');
+ } else if (this.options.sortContainerType === 'click') {
+ jQuery(this.options.sortContainerSelector).on({
+ click: changeSort
+ }, '[unbxdsortfield]');
+ }
+ }
+
+ if (this.options.pageSizeContainerSelector.length > 0) {
+ if (this.options.pageSizeContainerType === 'select') {
+ jQuery(this.options.pageSizeContainerSelector).on({
+ change: changePageSize
+ }, '*');
+ } else if (this.options.pageSizeContainerType === 'click') {
+ jQuery(this.options.pageSizeContainerSelector).on({
+ click: changePageSize
+ }, '[unbxdpagesize]');
+ }
+ jQuery(this.options.pageSizeContainerSelector).delegate('*', 'change', function(e) {
+
+ });
+ }
+
+ if (this.options.paginationContainerSelector.length > 0) {
+ jQuery(this.options.paginationContainerSelector).delegate('*', 'click', function(e) {
+ e.preventDefault();
+ var $t = jQuery(this),
+ keys = {
+ first: 1,
+ prev: self.getPage() - 1,
+ next: self.getPage() + 1,
+ last: self.totalPages
+ },
+ action = $t.attr('unbxdaction') || '';
+
+ if (action) {
+ if (keys[action]) {
+ self.setPage(keys[action]);
+ } else if (!isNaN(parseInt(action, 10))) {
+ self.setPage(parseInt(action, 10));
+ }
+ self.callResults(self.paintOnlyResultSet, true);
+ }
+
+ });
+ }
+
+ if (this.isHistory) {
+ self.popped = ('state' in window.history);
+ self.initialURL = location.href;
+
+ jQuery(window).bind('popstate', function(e) {
+ var initialPop = self.popped && location.href == self.initialURL;
+ self.popped = false;
+
+ if (initialPop || !e.originalEvent.state) {
+ self.init();
+ return;
+ }
+
+ var old_params = e.originalEvent.state;
+
+ old_params.query = self.options.type == "search" ? self.options.sanitizeQueryString.call(self, old_params.query) : "";
+
+ self.reset();
+
+ self.setPage(1);
+
+ if ((old_params.query) || (old_params.categoryId)) {
+ self.params = old_params;
+ self.callResults(self.paintResultSet);
+ }
+ });
+ } else if (this.isHashChange) {
+ jQuery(window).bind("hashchange", function(e) {
+ var newhash = window.location.hash.substring(1);
+ if (newhash && newhash != self.currentHash) {
+ self.reset();
+ var old_params = self._processURL(self.options.noEncoding ? newhash : self.decode(newhash));
+
+ old_params.query = self.options.type == "search" ? self.options.sanitizeQueryString.call(self, old_params.query) : "";
+
+ self.currentHash = newhash;
+
+ if ((old_params.query) || (old_params.categoryId)) {
+ self.params = old_params;
+ self.callResults(self.paintResultSet);
+ }
+ } else {
+ self.init();
+ }
+ });
+ } else {
+ self.hashChangeInterval = setInterval(function() {
+ var newhash = location.hash.substring(1);
+
+ if (newhash && newhash != self.currentHash) {
+ self.reset();
+ var old_params = self._processURL(self.options.noEncoding ? newhash : self.decode(newhash));
+
+ old_params.query = self.options.type == "search" ? self.options.sanitizeQueryString.call(self, old_params.query) : "";
+
+ self.currentHash = newhash;
+
+ if ((old_params.query) || (old_params.categoryId)) {
+ self.params = old_params;
+ self.callResults(self.paintResultSet);
+ }
+ }
+ }, 3000);
+ }
+
+ if (this.options.searchResultSetTemp !== null && typeof this.options.searchResultSetTemp === 'object') {
+ jQuery(this.options.viewTypeContainerSelector).on("click", '[unbxdviewtype]', changeViewType);
+ }
+ },
+ addSort: function(field, dir) {
+ this.params.sort[field] = dir || "desc";
+ return this;
+ },
+ removeSort: function(field) {
+ if (field in this.params.sort)
+ delete this.params.sort[field];
+
+ return this;
+ },
+ resetSort: function() {
+ this.params.sort = {};
+ return this;
+ },
+ addFilter: function(field, value) {
+ if (!(field in this.params.filters))
+ this.params.filters[field] = {};
+
+ this.params.filters[field][value] = field;
+
+ return this;
+ },
+ removeFilter: function(field, value) {
+ if (value in this.params.filters[field])
+ delete this.params.filters[field][value];
+
+ if (Object.keys(this.params.filters[field]).length == 0)
+ delete this.params.filters[field];
+
+ return this;
+ },
+ clearFilters: function(clearRanges) {
+ this.params.filters = {}
+
+ if (clearRanges) {
+ this.clearRangeFiltes();
+ }
+ return this;
+ },
+ addRangeFilter: function(field, lb, ub) {
+ if (!(field in this.params.ranges))
+ this.params.ranges[field] = {};
+
+ this.params.ranges[field][lb + ' TO ' + ub] = {
+ lb: lb || '*',
+ ub: ub || '*'
+ };
+
+ return this;
+ },
+ removeRangeFilter: function(field, lb, ub) {
+ if (!lb && !ub && field in this.params.ranges)
+ delete this.params.ranges[field];
+
+ if (lb && ub && field in this.params.ranges && (lb + ' TO ' + ub in this.params.ranges[field]))
+ delete this.params.ranges[field][lb + ' TO ' + ub];
+
+ if (Object.keys(this.params.ranges[field]).length == 0)
+ delete this.params.ranges[field];
+
+ return this;
+ },
+ clearRangeFiltes: function() {
+ this.params.ranges = {};
+
+ return this;
+ },
+ setPage: function(pageNo) {
+ this.params.extra.page = pageNo;
+ return this;
+ },
+ getPage: function() {
+ return this.params.extra.page;
+ },
+ setPageSize: function(pageSize) {
+ this.params.extra.rows = pageSize;
+ return this;
+ },
+ getPageSize: function() {
+ return this.params.extra.rows;
+ }
+
+ ,
+ setViewType: function(viewType) {
+ this.params.extra.view = viewType;
+ return this;
+ },
+ getViewType: function() {
+ return this.params.extra.view;
+ }
+
+ ,
+ addQueryParam: function(key, value, dontOverried) {
+ if (!(key in this.params.extra) || !dontOverried) {
+ this.params.extra[key] = value;
+ } else {
+ if (this.getClass(this.params.extra[key]) != "Array")
+ this.params.extra[key] = [this.params.extra[key]];
+
+ this.params.extra[key].push(value);
+ }
+
+ return this;
+ },
+ isUsingPagination: function() {
+ return !this.options.isAutoScroll && this.options.isPagination;
+ },
+ getHostNPath: function() {
+ var handler = "search";
+ if (isTypeBrowseOrCategory(this.options.type)) {
+ handler = this.options.type;
+ }
+ return "//search.unbxdapi.com/" + this.options.APIKey + "/" + this.options.siteName + "/" + handler;
+ },
+ getUrlSubstring: function() {
+ return window.location.search.substring(1) || window.location.hash.substring(1);
+ },
+ url: function() {
+ var host_path = this.getHostNPath();
+
+ var url = "";
+ var nonhistoryPath = "";
+ // To Retain the fields which are are required from the params of the base URL
+ var cur_url = this.getUrlSubstring();
+ var urlParams = this.getQueryParams(cur_url);
+ var baseParams = {};
+ if (typeof(this.options.baseParams) == "object" && this.options.baseParams.length > 0) {
+ for (i in urlParams) {
+ if ((urlParams.hasOwnProperty(i)) && !(i in this.params)) {
+ for (param in this.options.baseParams) {
+ if (i == this.options.baseParams[param]) {
+ baseParams[i] = urlParams[i]
+ }
+ }
+ }
+ }
+ }
+
+ if (this.options.type == "search" && this.params['query'] != undefined) {
+ url += '&' + this.options.searchQueryParam + '=' + encodeURIComponent(this.params.query);
+ } else if (this.options.type == "browse" && this.params['categoryId'] != undefined) {
+ url += '&category-id=' + encodeURIComponent(this.params.categoryId);
+ } else if (isTypeCategory(this.options.type) && this.params.categoryId !== undefined) {
+ url += "&p=" + encodeURIComponent(this.params.categoryId);
+ }
+
+ for (var x in this.params.filters) {
+ if (this.params.filters.hasOwnProperty(x)) {
+ var a = [];
+ var b = [];
+ for (var y in this.params.filters[x]) {
+ if (this.defaultParams.hasOwnProperty('filters') &&
+ this.defaultParams.filters.hasOwnProperty(x) &&
+ this.defaultParams.filters[x].hasOwnProperty(y) &&
+ this.params.filters[x].hasOwnProperty(y)) {
+ b.push((x + ':\"' + encodeURIComponent(y.replace(/\"/g, "\\\"")) + '\"').replace(/\"{2,}/g, '"'));
+ } else if (this.params.filters[x].hasOwnProperty(y)) {
+ a.push((x + ':\"' + encodeURIComponent(y.replace(/\"/g, "\\\"")) + '\"').replace(/\"{2,}/g, '"'));
+ }
+ }
+
+ if (a.length > 0)
+ url += '&filter=' + a.join(' OR ') + b.join(' OR ');
+ else if (b.length > 0)
+ nonhistoryPath += '&filter=' + b.join(' OR ');
+ }
+ }
+
+ for (var x in this.params.ranges) {
+ var a = [];
+ var b = [];
+ for (var y in this.params.ranges[x]) {
+ if (this.defaultParams.hasOwnProperty('ranges') &&
+ this.defaultParams.ranges.hasOwnProperty(x) &&
+ this.defaultParams.ranges[x].hasOwnProperty(y) &&
+ this.params.ranges[x].hasOwnProperty(y)) {
+ b.push(x + ':[' + this.params.ranges[x][y].lb + " TO " + this.params.ranges[x][y].ub + ']');
+ } else if (this.params.ranges[x].hasOwnProperty(y)) {
+ a.push(x + ':[' + this.params.ranges[x][y].lb + " TO " + this.params.ranges[x][y].ub + ']');
+ }
+ }
+
+ if (a.length > 0)
+ url += '&filter=' + a.join(' OR ') + b.join(' OR ');
+ else if (b.length > 0)
+ nonhistoryPath += '&filter=' + b.join(' OR ');
+ }
+
+ var a = [];
+ var b = [];
+ for (var field in this.params.sort) {
+ if (this.defaultParams.hasOwnProperty('sort') &&
+ this.defaultParams.sort.hasOwnProperty(field) &&
+ this.params.sort.hasOwnProperty(field)) {
+ var dir = this.params.sort[field] || 'desc';
+ b.push(field + " " + dir);
+ } else if (this.params.sort.hasOwnProperty(field)) {
+ var dir = this.params.sort[field] || 'desc';
+ a.push(field + " " + dir);
+ }
+ }
+
+ if (a.length)
+ url += '&sort=' + a.join(',');
+
+ if (b.length)
+ nonhistoryPath += '&sort=' + b.join(',');
+
+
+ for (var key in this.params.extra) {
+ if (this.params.extra.hasOwnProperty(key) && key != 'page') {
+ var value = this.params.extra[key];
+ if (this.getClass(value) == "Array") {
+ value = value.getUnique();
+ for (var i = 0; i < value.length; i++) {
+ url += '&' + key + '=' + encodeURIComponent(value[i]);
+ }
+ } else if (key === 'wt' || key === 'format') {
+ nonhistoryPath += '&' + key + '=' + encodeURIComponent(value);
+ } else if ((this.isUsingPagination() && key === 'rows') || key === "view") {
+ url += '&' + key + '=' + encodeURIComponent(value);
+ } else if (this.defaultParams.hasOwnProperty('extra') && this.defaultParams.extra.hasOwnProperty(key)) {
+ nonhistoryPath += '&' + key + '=' + encodeURIComponent(value);
+ } else
+ url += '&' + key + '=' + encodeURIComponent(value);
+ }
+ }
+
+ if (this.isUsingPagination())
+ url += '&start=' + (this.params.extra.page <= 1 ? 0 : (this.params.extra.page - 1) * this.params.extra.rows);
+ else
+ nonhistoryPath += '&start=' + (this.params.extra.page <= 1 ? 0 : (this.params.extra.page - 1) * this.params.extra.rows);
+
+ nonhistoryPath += this.options.getFacetStats.length > 0 ? "&stats=" + this.options.getFacetStats : "";
+
+ if (this.options.fields.length) {
+ nonhistoryPath += '&fields=' + this.options.fields.join(',');
+ }
+
+ if (this.options.facetMultiSelect)
+ nonhistoryPath += '&facet.multiselect=true';
+
+ nonhistoryPath += '&indent=off';
+
+ return {
+ url: host_path + "?" + url + nonhistoryPath,
+ query: url,
+ host: host_path,
+ baseParams: baseParams
+ };
+ },
+ callResults: function(callback, doPush) {
+ if (this.isLoading) {
+ this.ajaxCall.abort();
+ }
+
+ this.isLoading = true;
+
+ if (this.options.loaderSelector.length > 0)
+ jQuery(this.options.loaderSelector).show();
+
+ var self = this,
+ modifiedCB = callback.bind(self),
+ cb = function(data) {
+ this.isLoading = false;
+ if (this.options.loaderSelector.length > 0)
+ jQuery(this.options.loaderSelector).hide();
+
+ if ("error" in data)
+ return false;
+
+ modifiedCB(data);
+ },
+ urlobj = self.url(),
+ requestHeaders = this.serializeRequestHeaders(jQuery.extend({}, this.getDefaultRequestHeaders(), this.options.requestHeaders));
+
+ if (doPush) {
+ var finalquery = this.options.noEncoding ? urlobj.query : this.encode(urlobj.query);
+ if (this.isHistory) {
+ if (self.options.retainbaseParam == true) {
+ var finalBaseParams = '';
+ for (i in urlobj.baseParams) {
+ if (urlobj.baseParams.hasOwnProperty(i)) {
+ finalBaseParams += "&" + i + "=" + urlobj.baseParams[i];
+ }
+ }
+ finalquery += finalquery + this.options.noEncoding ? finalBaseParams : this.encode(finalBaseParams);
+ }
+ history.pushState(this.params, null, location.protocol + "//" + location.host + location.pathname + "?" + finalquery);
+ } else {
+ window.location.hash = finalquery;
+ this.currentHash = finalquery;
+ }
+ }
+ if (requestHeaders) {
+ urlobj.url += '&' + requestHeaders
+ }
+ this.ajaxCall = jQuery.ajax({
+ url: urlobj.url.replace(this.options.searchQueryParam + "=", "q="),
+ dataType: "jsonp",
+ jsonp: 'json.wrf',
+ success: cb.bind(self)
+ });
+ },
+ reset: function() {
+ this.totalNumberOfProducts = 0;
+ this.currentNumberOfProducts = 0;
+ jQuery(this.options.spellCheck).hide();
+ jQuery(this.options.searchQueryDisplay).empty();
+ if (this.options.deferInitRender.indexOf('search') === -1)
+ jQuery(this.options.searchResultContainer).empty();
+
+ jQuery(this.options.facetContainerSelector).empty();
+
+ this.options.selectedFacetHolderSelector && jQuery(this.options.selectedFacetHolderSelector).hide();
+
+ this.options.loaderSelector.length > 0 && jQuery(this.options.loaderSelector).hide();
+
+ this.params = {
+ query: '*',
+ filters: {},
+ sort: {},
+ ranges: {},
+ categoryId: "",
+ extra: {
+ format: "json",
+ page: 1,
+ rows: 12
+ }
+ };
+
+ if (this.options.viewTypes && this.options.viewTypes.length > 0)
+ this.params.extra.view = this.options.viewTypes[0];
+
+ if (typeof this.options.customReset == "function")
+ this.options.customReset.call(this);
+
+ if (typeof this.options.setDefaultFilters == "function")
+ this.setDefaultParams(this.params);
+
+ return this;
+ },
+ setDefaultParams: function(params) {
+ var newparams, diff;
+ var oldparams = JSON.stringify(params);
+ this.options.setDefaultFilters.call(this);
+ newparams = JSON.stringify(this.params);
+
+ if (Object.keys(this.defaultParams).length === 0)
+ this.defaultParams = JSON.parse(newparams);
+ },
+ _processURL: function(url) {
+ var obj = typeof url == "string" ? this.getQueryParams(url) : url,
+ params = {
+ query: '',
+ filters: {},
+ sort: {},
+ ranges: {},
+ extra: {
+ format: "json",
+ page: 1,
+ rows: 12
+ }
+ };
+
+ //lets get filters
+ if ("filter" in obj) {
+ if (this.getClass(obj.filter) == "String")
+ obj.filter = Array(obj.filter);
+
+ for (var i = 0; i < obj.filter.length; i++) {
+
+ var filterStrArr = obj.filter[i].split(" OR ");
+
+ for (var x = 0; x < filterStrArr.length; x++) {
+ var arr = filterStrArr[x].split(":");
+ if (arr.length == 2) {
+ arr[1] = arr[1].replace(/(^")|("$)/g, '').replace(/\"{2,}/g, '"').replace(/\\\"/g, '"').replace(/(^\[)|(\]$)/g, '');
+
+ var vals = arr[1].split(" TO ");
+ if (vals.length > 1) {
+ if (!(arr[0] in params.ranges))
+ params.ranges[arr[0]] = {};
+
+ params.ranges[arr[0]][arr[1]] = {
+ lb: isNaN(parseFloat(vals[0])) ? '*' : parseFloat(vals[0]),
+ ub: isNaN(parseFloat(vals[1])) ? '*' : parseFloat(vals[1])
+ };
+ } else {
+ if (!(arr[0] in params.filters))
+ params.filters[arr[0]] = {};
+
+ params.filters[arr[0]][arr[1]] = arr[0];
+ }
+ }
+ }
+ }
+ }
+
+ //lets get sort now
+ if ("sort" in obj) {
+ var sortarr = obj.sort.split(",");
+
+ for (var i = 0; i < sortarr.length; i++) {
+ var arr = sortarr[i].split(/\s+(?=\S+$)/);
+ if (arr.length == 2) {
+ params.sort[arr[0]] = arr[1] || "desc";
+ }
+ }
+ }
+
+ //lets get page size
+ if ("rows" in obj)
+ params.extra.rows = parseInt(obj.rows);
+ else
+ params.extra.rows = this.options.pageSize;
+
+ //lets get query
+ if (this.options.searchQueryParam in obj)
+ params.query = obj[this.options.searchQueryParam];
+
+ //lets get category-id
+ if ("category-id" in obj)
+ params.categoryId = obj["category-id"];
+
+ //lets get categoryId(navigation)
+ if ("p" in obj)
+ params.categoryId = obj["p"];
+
+ //lets get boost
+ if ("boost" in obj)
+ params.extra.boost = obj.boost;
+
+ //lets get pageNo
+ if ("start" in obj)
+ params.extra.page = (parseInt(obj.start) / parseInt(params.extra.rows)) + 1;
+
+ if ("view" in obj)
+ params.extra.view = obj['view'];
+ else if (this.options.viewTypes && this.options.viewTypes.length > 0)
+ params.extra.view = this.options.viewTypes[0];
+
+ return params;
+ },
+ paintResultSet: function(obj) {
+ this._internalPaintResultSet(obj, true);
+ },
+ _internalPaintResultSet: function(obj, facetsAlso) {
+ if ("error" in obj)
+ return false;
+
+ this.totalNumberOfProducts = 0;
+
+ this.currentNumberOfProducts = 0;
+
+ if (obj.hasOwnProperty('redirect')) {
+ window.location = obj['redirect']['value'];
+ return false;
+ }
+
+ if (!obj.hasOwnProperty('banner')) {
+ this.options.bannerSelector.length &&
+ jQuery(this.options.bannerSelector).empty();
+ } else {
+ this.paintBanners(obj);
+ }
+
+ if (obj.hasOwnProperty('didYouMean')) {
+ if (obj.response.numberOfProducts == 0) { //> this.options.pageSize){
+ if (this.params.extra.page > 1)
+ this.params.extra.page = this.params.extra.page - 1;
+
+ this.params.query = obj.didYouMean[0].suggestion;
+
+ if (!this.compiledSpellCheckTemp)
+ this.compiledSpellCheckTemp = Handlebars.compile(this.options.spellCheckTemp);
+
+ jQuery(this.options.spellCheck).html(this.compiledSpellCheckTemp({
+ suggestion: obj.didYouMean[0].suggestion,
+ numberOfProducts: obj.response.numberOfProducts
+ })).show();
+
+ facetsAlso ? this.callResults(this.paintAfterSpellCheck) : this.callResults(this.paintOnlyResultSet);
+
+ } else {
+
+ this.params.query = obj.searchMetaData.queryParams.q; //obj.didYouMean[0].suggestion;
+
+ if (!this.compiledSpellCheckTemp)
+ this.compiledSpellCheckTemp = Handlebars.compile(this.options.spellCheckTemp);
+
+ jQuery(this.options.spellCheck).html(this.compiledSpellCheckTemp({
+ suggestion: obj.didYouMean[0].suggestion,
+ numberOfProducts: obj.response.numberOfProducts
+ })).show();
+
+ facetsAlso ? this.callResults(this.paintAfterSpellCheck) : this.callResults(this.paintOnlyResultSet);
+ }
+ } else {
+ jQuery(this.options.spellCheck).hide();
+ if (this.options.deferInitRender.indexOf('search') === -1)
+ jQuery(this.options.searchResultContainer).empty();
+ this.paintProductPage(obj);
+ facetsAlso && this.paintFacets(obj);
+ }
+ },
+ paintOnlyResultSet: function(obj) {
+ if (this.options.deferInitRender.indexOf('search') === -1)
+ jQuery(this.options.searchResultContainer).empty();
+ this.paintProductPage(obj);
+ },
+ paintAfterSpellCheck: function(obj) {
+ if (this.options.deferInitRender.indexOf('search') === -1)
+ jQuery(this.options.searchResultContainer).empty();
+ this.paintProductPage(obj);
+ this.paintFacets(obj);
+ },
+ paintAfterFacetChange: function(obj) {
+ if (this.options.deferInitRender.indexOf('search') === -1)
+ jQuery(this.options.searchResultContainer).empty();
+ this.paintProductPage(obj);
+ this.paintSelectedFacets();
+ },
+ paintProductPage: function(obj) {
+ var start = 1;
+ if ("error" in obj)
+ return;
+
+ if (!obj.response.numberOfProducts) {
+ this.reset();
+
+ this.options.onNoResult.call(this, obj);
+
+ return this;
+ }
+
+ if (!this.compiledSearchQueryTemp)
+ this.compiledSearchQueryTemp = Handlebars.compile(this.options.searchQueryDisplayTemp);
+
+ this.productStartIdx = (this.isUsingPagination()) ? obj.response.start + 1 : 1;
+ this.productEndIdx = (this.getPage() * this.getPageSize() <= obj.response.numberOfProducts) ?
+ this.getPage() * this.getPageSize() : obj.response.numberOfProducts;
+ this.totalPages = Math.ceil(obj.response.numberOfProducts / this.getPageSize());
+ var queryParams = {
+ numberOfProducts: obj.response.numberOfProducts,
+ start: this.productStartIdx,
+ end: this.productEndIdx
+ }
+ if (isTypeCategory(this.options.type)) {
+ queryParams.categoryId = obj.searchMetaData.queryParams.p
+ } else {
+ queryParams.query = obj.searchMetaData.queryParams.q
+ }
+
+ jQuery(this.options.searchQueryDisplay).html(this.compiledSearchQueryTemp(queryParams)).show();
+
+ this.paintSort(obj);
+ this.paintPageSize(obj);
+ this.paintPagination(obj);
+ obj.response.products = obj.response.products.map(function(product) {
+ product['unbxdprank'] = obj.response.start + start;
+ start += 1;
+ return product;
+ });
+
+ if (this.getClass(this.options.searchResultSetTemp) == 'Function') {
+ this.options.searchResultSetTemp.call(this, obj);
+ } else if (this.options.searchResultSetTemp !== null && typeof this.options.searchResultSetTemp === 'object') {
+ this.paintViewTypes(obj);
+ var currentViewType = this.getViewType();
+ if (!this.compiledResultTemp) {
+ this.compiledResultTemp = {};
+ this.options.viewTypes.forEach(function(val) {
+ this.compiledResultTemp[val] = Handlebars.compile(this.options.searchResultSetTemp[val]);
+ }.bind(this));
+ }
+ if (this.options.deferInitRender.indexOf('search') === -1 || !this.isUsingPagination()) {
+ jQuery(this.options.searchResultContainer).append(this.compiledResultTemp[currentViewType](obj.response));
+ }
+ } else {
+ if (!this.compiledResultTemp)
+ this.compiledResultTemp = Handlebars.compile(this.options.searchResultSetTemp);
+
+ if (this.options.deferInitRender.indexOf('search') === -1 || !this.isUsingPagination()) {
+ jQuery(this.options.searchResultContainer).append(this.compiledResultTemp(obj.response));
+ }
+ }
+
+ if (!this.currentNumberOfProducts && typeof this.options.onIntialResultLoad == "function") {
+ this.options.onIntialResultLoad.call(this, obj);
+ }
+
+ if (this.currentNumberOfProducts && typeof this.options.onPageLoad == "function") {
+ this.options.onPageLoad.call(this, obj);
+ }
+
+ this.totalNumberOfProducts = obj.response.numberOfProducts;
+
+ this.currentNumberOfProducts = obj.response.start + obj.response.products.length;
+
+ if (typeof this.options.setPagination == "function") {
+ this.options.setPagination.call(this, this.totalNumberOfProducts, this.getPageSize(), this.getPage());
+ }
+
+ if (this.options.isClickNScroll)
+ jQuery(this.options.clickNScrollElementSelector)[(this.currentNumberOfProducts < this.totalNumberOfProducts) ? 'show' : 'hide']();
+
+ },
+ paintSort: function(obj) {
+ if ("error" in obj)
+ return;
+ if (this.options.sortContainerSelector.length <= 0)
+ return;
+
+ if (!this.compiledSortContainerTemp)
+ this.compiledSortContainerTemp = Handlebars.compile(this.options.sortContainerTemp);
+
+ var sortOptions = this.options.sortOptions.map(function(opt) {
+ opt['selected'] = (opt.hasOwnProperty('field') && opt.field in this.params.sort && this.params.sort[opt.field] === opt.order) ?
+ true : (!opt.hasOwnProperty('field') && Object.keys(this.params.sort).length === 0) ? true : false;
+ return opt;
+ }.bind(this));
+
+ jQuery(this.options.sortContainerSelector).html(this.compiledSortContainerTemp({
+ options: sortOptions
+ }));
+ },
+ paintPageSize: function(obj) {
+ if ("error" in obj)
+ return;
+ if (this.options.pageSizeContainerSelector.length <= 0)
+ return;
+ if (!this.isUsingPagination())
+ return;
+
+ if (!this.compiledPageSizeContainerTemp)
+ this.compiledPageSizeContainerTemp = Handlebars.compile(this.options.pageSizeContainerTemp);
+
+ var pageSizeOptions = this.options.pageSizeOptions.map(function(opt) {
+ opt['selected'] = (this.getPageSize() == opt.value) ? true : false;
+ return opt;
+ }.bind(this));
+
+ jQuery(this.options.pageSizeContainerSelector).html(this.compiledPageSizeContainerTemp({
+ options: pageSizeOptions
+ }));
+ }
+
+ ,
+ paintViewTypes: function(obj) {
+ if ("error" in obj || this.options.viewTypeContainerSelector.length <= 0) {
+ return;
+ }
+ if (!this.compiledViewTypesContainerTemp) {
+ this.compiledViewTypesContainerTemp = Handlebars.compile(this.options.viewTypeContainerTemp);
+ }
+ var viewTypeOptions = this.options.viewTypes.map(function(opt) {
+
+ var values = {};
+ values["value"] = opt;
+ values["selected"] = this.getViewType() == opt ? true : false;
+ return values;
+
+ }.bind(this));
+ jQuery(this.options.viewTypeContainerSelector).html(this.compiledViewTypesContainerTemp({
+ options: viewTypeOptions
+ }));
+ return this.getViewType();
+ }
+
+ ,
+ paintPagination: function(obj) {
+ if ("error" in obj)
+ return;
+ if (this.options.paginationContainerSelector.length <= 0)
+ return;
+ if (!this.isUsingPagination())
+ return;
+
+ if (!this.compiledPaginationTemp)
+ this.compiledPaginationTemp = Handlebars.compile(this.options.paginationTemp);
+
+ var seq = [{
+ page: this.getPage() - 2,
+ current: false
+ }, {
+ page: this.getPage() - 1,
+ current: false
+ }, {
+ page: this.getPage(),
+ current: true
+ }, {
+ page: this.getPage() + 1,
+ current: false
+ }, {
+ page: this.getPage() + 2,
+ current: false
+ }];
+
+ var pagesToShow = seq.filter(function(obj) {
+ return obj.page > 0 && obj.page <= this.totalPages;
+ }.bind(this))
+
+
+
+ jQuery(this.options.paginationContainerSelector).html(this.compiledPaginationTemp({
+ hasFirst: this.getPage() > 1 ? true : false,
+ hasPrev: this.getPage() > 1 ? true : false,
+ pages: pagesToShow,
+ totalPages: this.totalPages,
+ hasNext: this.getPage() < this.totalPages ? true : false,
+ hasLast: this.getPage() < this.totalPages ? true : false
+ }));
+ },
+ paintBanners: function(obj) {
+ if ("error" in obj)
+ return;
+ if (this.options.bannerCount <= 0)
+ return;
+ if (this.options.bannerSelector.length === 0)
+ return;
+ var banner = obj.banner;
+ var bannersToDraw = [];
+
+ if (!this.compiledBannerTemp)
+ this.compiledBannerTemp = Handlebars.compile(this.options.bannerTemp);
+
+ bannersToDraw = banner.banners.slice(0, this.options.bannerCount)
+ .reduce(function(prev, curr) {
+ if (curr.hasOwnProperty('bannerHtml') && curr['bannerHtml']) {
+ return prev.concat(curr.bannerHtml);
+ } else {
+ return prev.concat(this.compiledBannerTemp({
+ landingUrl: curr.landingUrl,
+ imageUrl: curr.imageUrl
+ }));
+ }
+ }.bind(this), []);
+
+ jQuery(this.options.bannerSelector).html(bannersToDraw.join(''));
+
+ },
+ paintFacets: function(obj) {
+ if ("error" in obj)
+ return;
+
+ if (!obj.response.numberOfProducts)
+ return this;
+
+ var facets = obj.facets,
+ facetKeys = Object.keys(facets),
+ textfacets = [],
+ rangefacets = [],
+ singlefacet = {},
+ self = this,
+ facetVal = "",
+ facetValStart = "",
+ facetValEnd = "",
+ isSelected = false,
+ selectedOnly = [];
+
+ var positionExists = false;
+ for (var x in facets) {
+ if ("position" in facets[x]) {
+ positionExists = true;
+ }
+ break;
+ }
+ var sortable = [];
+ for (var facet in facets) {
+ sortable.push(positionExists ? ([facet, facets[facet]["position"]]) : [facet]);
+ }
+
+ if (positionExists) {
+ sortable.sort(function(a, b) {
+ return a[1] - b[1]
+ });
+ }
+ for (var newI = 0; newI < sortable.length; newI++) {
+
+ var x = sortable[newI][0];
+ // for(var x in facets) {
+ singlefacet = {
+ name: self.prepareFacetName(x),
+ facet_name: x,
+ type: facets[x]['type'],
+ selected: [],
+ unselected: [],
+ unordered: []
+ };
+
+ if (singlefacet.type !== 'facet_ranges') {
+ for (var i = 0, len = facets[x]['values'].length / 2; i < len; i++) {
+ facetVal = facets[x]['values'][2 * i];
+
+ if (facetVal.trim().length == 0)
+ continue;
+
+ isSelected = x in self.params.filters && facetVal in self.params.filters[x] && self.params.filters[x][facetVal] == x ? true : false;
+
+ singlefacet[isSelected ? "selected" : "unselected"].push({
+ value: facetVal,
+ count: facets[x]['values'][2 * i + 1]
+ });
+ singlefacet.unordered.push({
+ value: facetVal,
+ count: facets[x]['values'][2 * i + 1],
+ isSelected: isSelected
+ });
+ }
+
+ if ((singlefacet.unordered.length) > 0) textfacets.push(singlefacet);
+
+ } else {
+ for (var i = 0, len = facets[x]['values']['counts'].length / 2; i < len; i++) {
+ facetValStart = parseFloat(facets[x]['values']['counts'][2 * i]).toString();
+ facetValEnd = (parseFloat(facetValStart) + facets[x]['values'].gap).toString();
+ var y = facetValStart + ' TO ' + facetValEnd;
+
+ isSelected = x in self.params.ranges && y in self.params.ranges[x] && self.params.ranges[x][y]['lb'] == facetValStart && self.params.ranges[x][y]['ub'] == facetValEnd ? true : false;
+
+ singlefacet[isSelected ? "selected" : "unselected"].push({
+ begin: facetValStart,
+ end: facetValEnd,
+ count: facets[x]['values']['counts'][2 * i + 1],
+ value: y
+ });
+ singlefacet.unordered.push({
+ begin: facetValStart,
+ end: facetValEnd,
+ count: facets[x]['values']['counts'][2 * i + 1],
+ value: y,
+ isSelected: isSelected
+ });
+ }
+
+ if ((singlefacet.unordered.length) > 0) rangefacets.push(singlefacet);
+
+ }
+ }
+
+ if (this.getClass(this.options.facetTemp) == 'Function') {
+ this.options.facetTemp.call(this, {
+ facets: textfacets,
+ rangefacets: rangefacets
+ });
+ } else {
+ if (!this.compiledFacetTemp && this.options.facetTemp.length)
+ this.compiledFacetTemp = Handlebars.compile(this.options.facetTemp);
+
+ this.options.facetContainerSelector.length && jQuery(this.options.facetContainerSelector).html(this.compiledFacetTemp({
+ facets: textfacets,
+ rangefacets: rangefacets
+ }));
+ }
+
+ this.paintSelectedFacets();
+
+ if (this.options.deferInitRender.indexOf('search') > -1) {
+ this.options.deferInitRender = [];
+ }
+
+ if (typeof this.options.onFacetLoad == "function") {
+ this.options.onFacetLoad.call(this, obj);
+ }
+
+ if (this.options.getFacetStats.length &&
+ typeof this.options.processFacetStats == "function" &&
+ "stats" in obj && obj.stats[this.options.getFacetStats] != null) {
+
+ obj.stats[this.options.getFacetStats].values = {
+ min: obj.stats[this.options.getFacetStats].min,
+ max: obj.stats[this.options.getFacetStats].max
+ };
+ if (this.options.getFacetStats in this.params.ranges) {
+ for (var x in this.params.ranges[this.options.getFacetStats]) {
+ obj.stats[this.options.getFacetStats].values = {
+ min: this.params.ranges[this.options.getFacetStats][x].lb != "*" ?
+ this.params.ranges[this.options.getFacetStats][x].lb : obj.stats[this.options.getFacetStats].min,
+ max: this.params.ranges[this.options.getFacetStats][x].ub != "*" ?
+ this.params.ranges[this.options.getFacetStats][x].ub : obj.stats[this.options.getFacetStats].max
+ };
+ }
+
+ }
+
+ this.options.processFacetStats.call(this, obj.stats);
+ }
+ },
+ paintSelectedFacets: function() {
+ var selFacetKeysLength = Math.max(Object.keys(this.params.filters).length,
+ Object.keys(this.params.ranges).length);
+ var selectedFacets = {};
+
+ if (selFacetKeysLength) {
+ selectedFacets.filters = this.params.filters;
+ selectedFacets.ranges = {};
+
+ for (var x in this.params.ranges) {
+ if (!selectedFacets.ranges.hasOwnProperty(x))
+ selectedFacets.ranges[x] = {};
+
+ for (var y in this.params.ranges[x]) {
+ selectedFacets.ranges[x][y] = x;
+ }
+ }
+
+ if (this.options.selectedFacetTemp && this.options.selectedFacetContainerSelector) {
+ if (!this.compiledSelectedFacetTemp)
+ this.compiledSelectedFacetTemp = Handlebars.compile(this.options.selectedFacetTemp);
+
+ jQuery(this.options.selectedFacetContainerSelector).html(this.compiledSelectedFacetTemp(selectedFacets));
+ }
+ jQuery(this.options.selectedFacetHolderSelector).show();
+ } else {
+ jQuery(this.options.selectedFacetContainerSelector).empty();
+ jQuery(this.options.selectedFacetHolderSelector).hide();
+ }
+ },
+ prepareFacetName: function(txt) {
+ txt = txt.replace("_fq", "");
+ return txt.replace("_", " ");
+ },
+ getQueryParams: function(q) {
+ var e, //replace + character before decoding the URL
+ d = function(s) {
+ return decodeURIComponent(s.replace(/\+/g, " ")).trim();
+ },
+ //splits on equals
+ r = /([^&=]+)=?([^&]*)/g,
+ urlParams = {};
+
+ q = q || this.getUrlSubstring();
+
+ while (e = r.exec(q)) {
+ var e1 = e[1].indexOf("[")
+ //first group of regex match
+ ,
+ k = e1 == "-1" ? e[1] : e[1].slice(0, e1),
+ i = e1 != "-1" ? d(e[1].slice(e1 + 1, e[1].indexOf("]", e1))) : "",
+ v = d(e[2]);
+
+ if (v.length == 0)
+ continue;
+
+ if (!(k in urlParams)) {
+ urlParams[k] = v
+ } else {
+ if (typeof urlParams[k] != "object") {
+ var old = urlParams[k];
+
+ urlParams[k] = Array(urlParams[k]);
+
+ Array.prototype.push.call(urlParams[k], old);
+ }
+
+ Array.prototype.push.call(urlParams[k], v);
+ }
+ }
+ return urlParams;
+ },
+ _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
+ encode: function(e) {
+ var t = "",
+ n, r, i, s, o, u, a, f = 0;
+ e = this._utf8_encode(e);
+ while (f < e.length) {
+ n = e.charCodeAt(f++);
+ r = e.charCodeAt(f++);
+ i = e.charCodeAt(f++);
+ s = n >> 2;
+ o = (n & 3) << 4 | r >> 4;
+ u = (r & 15) << 2 | i >> 6;
+ a = i & 63;
+ if (isNaN(r)) {
+ u = a = 64;
+ } else if (isNaN(i)) {
+ a = 64;
+ }
+ t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a);
+ }
+ return t;
+ },
+ decode: function(e) {
+ var t = "",
+ n, r, i, s, o, u, a, f = 0;
+ e = e.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+ while (f < e.length) {
+ s = this._keyStr.indexOf(e.charAt(f++));
+ o = this._keyStr.indexOf(e.charAt(f++));
+ u = this._keyStr.indexOf(e.charAt(f++));
+ a = this._keyStr.indexOf(e.charAt(f++));
+ n = s << 2 | o >> 4;
+ r = (o & 15) << 4 | u >> 2;
+ i = (u & 3) << 6 | a;
+ t = t + String.fromCharCode(n);
+ if (u != 64) {
+ t = t + String.fromCharCode(r);
+ }
+ if (a != 64) {
+ t = t + String.fromCharCode(i);
+ }
+ }
+ t = this._utf8_decode(t);
+
+ return t;
+ },
+ _utf8_encode: function(e) {
+ e = e.replace(/\r\n/g, "\n");
+ var t = "";
+ for (var n = 0; n < e.length; n++) {
+ var r = e.charCodeAt(n);
+ if (r < 128) {
+ t += String.fromCharCode(r)
+ } else if (r > 127 && r < 2048) {
+ t += String.fromCharCode(r >> 6 | 192);
+ t += String.fromCharCode(r & 63 | 128);
+ } else {
+ t += String.fromCharCode(r >> 12 | 224);
+ t += String.fromCharCode(r >> 6 & 63 | 128);
+ t += String.fromCharCode(r & 63 | 128);
+ }
+ }
+ return t;
+ },
+ _utf8_decode: function(e) {
+ var t = "",
+ n = 0;
+ var r = c1 = c2 = 0;
+ while (n < e.length) {
+ r = e.charCodeAt(n);
+ if (r < 128) {
+ t += String.fromCharCode(r);
+ n++;
+ } else if (r > 191 && r < 224) {
+ c2 = e.charCodeAt(n + 1);
+ t += String.fromCharCode((r & 31) << 6 | c2 & 63);
+ n += 2;
+ } else {
+ c2 = e.charCodeAt(n + 1);
+ c3 = e.charCodeAt(n + 2);
+ t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
+ n += 3;
+ }
+ }
+ return t;
+ },
+ log: function(str) {
+ if (this.readCookie("debug") === '1') {
+ console.log("Unbxd : " + str);
+ }
+ },
+ decodeAndParse: function(s) {
+ if (s.indexOf('"') === 0) {
+ // This is a quoted cookie as according to RFC2068, unescape...
+ s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
+ }
+
+ return this.decodeCookie(s);
+ },
+ decodeCookie: function(s) {
+ var pluses = /\+/g;
+ return decodeURIComponent(s.replace(pluses, ' '));
+ },
+ cookie: function(key) {
+ // Read
+ var cookies = document.cookie.split('; ');
+ var result;
+ for (var i = 0, l = cookies.length; i < l; i++) {
+ var parts = cookies[i].split('=');
+ var name = this.decodeCookie(parts.shift());
+ var cookie = parts.join('=');
+
+ if (key && key === name) {
+ try {
+ result = this.decodeAndParse(cookie);
+ break;
+ } catch (e) {
+ this.log(e);
+ }
+ }
+ }
+
+ return result;
+ },
+ readCookie: function(name) {
+ try {
+ return this.cookie('unbxd.' + name);
+ } catch (e) {
+ this.log(e);
+ }
+
+ return undefined;
+ },
+ getDeviceInfo: function() {
+ var smallDeviceMaxWidth = 768,
+ mediumDeviceMaxWidth = 992;
+ if (window.outerWidth < smallDeviceMaxWidth) {
+ return "Mobile";
+ } else if (window.outerWidth < mediumDeviceMaxWidth) {
+ return "Tablet";
+ } else {
+ return "Desktop";
+ }
+ },
+ getUserType: function() {
+ return this.readCookie('visit') === "repeat" ? "repeat" : "new";
+ },
+ getUserId: function() {
+ return this.readCookie('userId');
+ },
+ getDefaultRequestHeaders: function() {
+ var self = this,
+ userId = this.getUserId(),
+ defaultRequestHeaders = {
+ "device-type": self.getDeviceInfo(),
+ "unbxd-url": document.URL,
+ "unbxd-referrer": document.referrer,
+ "user-type": self.getUserType(),
+ "api-key": self.options.APIKey
+ };
+ if (userId) {
+ defaultRequestHeaders["uid"] = userId;
+ }
+ return defaultRequestHeaders;
+ },
+ serializeRequestHeaders: function(headers) {
+ if (jQuery.param) {
+ return jQuery.param(headers)
+ } else {
+ var str = [];
+ for (var header in headers)
+ if (headers.hasOwnProperty(header)) {
+ str.push(encodeURIComponent(header) + "=" + encodeURIComponent(headers[header]));
+ }
+ return str.join("&");
+ }
+ }
+ });
+};
+
+
+Unbxd = window.Unbxd || {};
+
+Unbxd.isJqueryRequiredVersion = Unbxd.isJqueryRequiredVersion ||
+ function isJqueryRequiredVersion(current) {
+ var jQueryVersion = current.split('.');
+ jQueryVersion = jQueryVersion.map(function convertToNumber(version) {
+ return Number(version);
+ });
+ if (
+ jQueryVersion[0] > 1 || (jQueryVersion[0] === 1 && jQueryVersion[1] >= 7)
+ ) {
+ return true;
+ }
+ return false;
+ };
+
+if (!window.jQuery || !window.Handlebars) {
+ console.error(
+ 'Please include jQuery & Handlebars libraries before loading unbxdSearch.js or You can pass custom jQuery & Handlebars by calling unbxdSeachInit(jQuery, Handlebars) '
+ );
+} else if (!Unbxd.isJqueryRequiredVersion(jQuery.fn.jquery)) {
+ console.error(
+ 'jQuery version needs to be greater than 1.7 to use unbxdSearch.js. You can pass custom jQuery & Handlebars by calling unbxdSeachInit(jQuery, Handlebars)'
+ );
+} else {
+ unbxdSearchInit(jQuery, Handlebars);
+}
\ No newline at end of file
diff --git a/unbxdSearchAuto.js b/legacy/unbxdSearchAuto.js
similarity index 100%
rename from unbxdSearchAuto.js
rename to legacy/unbxdSearchAuto.js
diff --git a/unbxdSearchNAuto.js b/legacy/unbxdSearchNAuto.js
similarity index 100%
rename from unbxdSearchNAuto.js
rename to legacy/unbxdSearchNAuto.js
diff --git a/yarn.lock b/legacy/yarn.lock
similarity index 100%
rename from yarn.lock
rename to legacy/yarn.lock
diff --git a/package.json b/package.json
index 3c398de..9e62e53 100644
--- a/package.json
+++ b/package.json
@@ -1,50 +1,16 @@
{
- "name": "js-sdk",
+ "name": "version2",
"version": "1.0.0",
- "description": "Unbxd JavaScript Search library =============================== [](http://travis-ci.org/emberjs/ember-rails) unbxdSearch.js library can be used to integrated UNBXD search or browse on client side. It supports History API, so users can share the URI.",
- "main": "unbxd-sdk.js",
- "directories": {
- "test": "tests"
- },
- "dependencies": {
- "colors": "^1.0.3",
- "cryptiles": "^4.1.2",
- "hoek": "^4.2.1",
- "nodemailer": "^5.1.1",
- "sshpk": "^1.13.2"
- },
+ "description": "Asgard for ajax implementation",
+ "main": "src/main.js",
"scripts": {
- "test": "karma start"
+ "build": "webpack",
+ "test": "mocha"
},
"repository": {
"type": "git",
"url": "https://github.com/unbxd/js-sdk.git"
},
"author": "",
- "license": "ISC",
- "bugs": {
- "url": "https://github.com/unbxd/js-sdk/issues"
- },
- "homepage": "https://github.com/unbxd/js-sdk",
- "devDependencies": {
- "chai": "^4.2.0",
- "handlebars": "^4.0.5",
- "jquery": "^3.3.1",
- "jquery-ui": "^1.12.1",
- "karma": "^4.0.0",
- "karma-chai": "^0.1.0",
- "karma-fixture": "^0.2.6",
- "karma-handlebars-preprocessor": "^0.3.0",
- "karma-html2js-preprocessor": "^1.0.0",
- "karma-jquery": "^0.2.3",
- "karma-json-fixtures-preprocessor": "0.0.6",
- "karma-mocha": "^1.3.0",
- "karma-phantomjs-launcher": "^1.0.2",
- "karma-sinon": "^1.0.5",
- "karma-spec-reporter": "0.0.32",
- "karma-verbose-reporter": "0.0.6",
- "mocha": "^6.0.1",
- "phantom": "^6.0.3",
- "sinon": "^7.2.4"
- }
+ "license": "ISC"
}
diff --git a/src/common/constants.js b/src/common/constants.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/common/index.js b/src/common/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/common/utils.js b/src/common/utils.js
new file mode 100644
index 0000000..34ba83b
--- /dev/null
+++ b/src/common/utils.js
@@ -0,0 +1,86 @@
+/* eslint wrap-iife: ["error", "inside"] */
+/* eslint arrow-parens: ["error", "as-needed"] */
+const MAX_LISTENERS = 1;
+const uiBuilder = document => {
+ debugger;
+ const listeners = [];
+ const getAllListeners = listeners =>
+ listeners.map(listener => listener.eventName);
+ let matches;
+
+ (function(doc) {
+ matches =
+ doc.matchesSelector ||
+ doc.webkitMatchesSelector ||
+ doc.mozMatchesSelector ||
+ doc.oMatchesSelector ||
+ doc.msMatchesSelector;
+ })(document.documentElement);
+
+ const findParent = (el, elementString) => {
+ const matchFound = matches.call(el, elementString);
+ return matchFound ? el : findParent(el.parentNode, elementString);
+ };
+
+ const addEventListener = (eventName, handler) => {
+ if (
+ listeners.filter(listener => listener.eventName === eventName).length <=
+ MAX_LISTENERS
+ ) {
+ const eventHandler = e => {
+ const els = listeners.filter(
+ listener =>
+ matches.call(e.target, [
+ listener.elementString,
+ `${listener.elementString} *`
+ ]) && listener.eventName === eventName
+ );
+ if (els.length > 0) {
+ els.forEach(el => {
+ const target = findParent(e.target, el.elementString);
+ el.handler.call(target, e);
+ });
+ }
+ };
+
+ if (document.addEventListener) {
+ document.addEventListener(eventName, eventHandler);
+ } else {
+ document.attachEvent('on' + eventName, eventHandler);
+ }
+ }
+ };
+
+ return {
+ find(elementString) {
+ return document.querySelector(elementString);
+ },
+ findAll(elementString) {
+ return Array.prototype.slice.call(
+ document.querySelectorAll(elementString)
+ );
+ },
+ append(elementString, content) {
+ const els = this.findAll(elementString);
+ if (els.length > 0) {
+ els.forEach(el => {
+ if (typeof content === 'string') {
+ el.insertAdjacentHTML('afterend', content);
+ } else {
+ el.appendChild(content);
+ }
+ });
+ }
+ },
+ manageEvent(elementString, eventName, handler) {
+ listeners.push({
+ eventName,
+ elementString,
+ handler
+ });
+ addEventListener(eventName, handler);
+ }
+ };
+};
+
+export default uiBuilder;
diff --git a/src/components/Facets/Hierarchical/index.js b/src/components/Facets/Hierarchical/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Facets/RangeFacets/index.js b/src/components/Facets/RangeFacets/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Facets/TextFacets/index.js b/src/components/Facets/TextFacets/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Facets/index.js b/src/components/Facets/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/NoResults/index.js b/src/components/NoResults/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Pagination/AutoScroll/index.js b/src/components/Pagination/AutoScroll/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Pagination/ClickNScroll/index.js b/src/components/Pagination/ClickNScroll/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Pagination/Paginate/index.js b/src/components/Pagination/Paginate/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Products/ProductCard/ProductCard.js b/src/components/Products/ProductCard/ProductCard.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Products/ProductCard/Variants.js b/src/components/Products/ProductCard/Variants.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Products/ProductList/GridContainer.js b/src/components/Products/ProductList/GridContainer.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Products/ProductList/ListContainer.js b/src/components/Products/ProductList/ListContainer.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Products/ProductList/ProductList.js b/src/components/Products/ProductList/ProductList.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/Products/Sort.js b/src/components/Products/Sort.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/SpellCheck/index.js b/src/components/SpellCheck/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/home.js b/src/components/home.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/components/search.js b/src/components/search.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/controller/index.js b/src/controller/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/index.js b/src/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/lib/templateBuilder.js b/src/lib/templateBuilder.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/lib/uiBuilder.js b/src/lib/uiBuilder.js
new file mode 100644
index 0000000..48f4fb9
--- /dev/null
+++ b/src/lib/uiBuilder.js
@@ -0,0 +1,80 @@
+/* eslint wrap-iife: ["error", "inside"] */
+/* eslint arrow-parens: ["error", "as-needed"] */
+const MAX_LISTENERS = 1;
+const uiBuilder = document => {
+ debugger;
+ const listeners = [];
+ const getAllListeners = listeners =>
+ listeners.map(listener => listener.eventName);
+ let matches;
+
+ (function(doc) {
+ matches =
+ doc.matchesSelector ||
+ doc.webkitMatchesSelector ||
+ doc.mozMatchesSelector ||
+ doc.oMatchesSelector ||
+ doc.msMatchesSelector;
+ })(document.documentElement);
+
+ const findParent = (el, elementString) => {
+ const matchFound = matches.call(el, elementString);
+ return matchFound ? el : findParent(el.parentNode, elementString);
+ };
+
+ const addEventListener = (eventName, handler) => {
+ if (
+ listeners.filter(listener => listener.eventName === eventName).length <=
+ MAX_LISTENERS
+ ) {
+ const eventHandler = e => {
+ const els = listeners.filter(
+ listener =>
+ matches.call(e.target, [
+ listener.elementString,
+ `${listener.elementString} *`
+ ]) && listener.eventName === eventName
+ );
+ if (els.length > 0) {
+ els.forEach(el => {
+ const target = findParent(e.target, el.elementString);
+ el.handler.call(target, e);
+ });
+ }
+ };
+
+ if (document.addEventListener) {
+ document.addEventListener(eventName, eventHandler);
+ } else {
+ document.attachEvent('on' + eventName, eventHandler);
+ }
+ }
+ };
+
+ return {
+ find(elementString) {
+ return document.querySelector(elementString);
+ },
+ findAll(elementString) {
+ return Array.prototype.slice.call(
+ document.querySelectorAll(elementString)
+ );
+ },
+ append(elementString, content) {
+ const els = this.findAll(elementString);
+ if (els.length > 0) {
+ els.forEach(el => {
+ if (typeof content === 'string') {
+ el.insertAdjacentHTML('afterend', content);
+ } else {
+ el.appendChild(content);
+ }
+ });
+ }
+ },
+ manageEvent(elementString, eventName, handler) {
+ listeners.push({ eventName, elementString, handler });
+ addEventListener(eventName, handler);
+ }
+ };
+};
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/request.js b/src/request.js
new file mode 100644
index 0000000..e69de29
diff --git a/tests/index.js b/tests/index.js
new file mode 100644
index 0000000..e69de29
diff --git a/unbxdSearch.js b/unbxdSearch.js
deleted file mode 100644
index 0f24aa0..0000000
--- a/unbxdSearch.js
+++ /dev/null
@@ -1,2054 +0,0 @@
-//uglifyjs unbxdSearch.js -o unbxdSearch.min.js && gzip -c unbxdSearch.min.js > unbxdSearch.min.js.gz && aws s3 cp unbxdSearch.min.js.gz s3://unbxd/unbxdSearch.js --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsers --content-encoding gzip --cache-control max-age=3600
-var unbxdSearchInit = function(jQuery, Handlebars){
- window.Unbxd = window.Unbxd || {};
- Unbxd.jsSdkVersion = "2.0.2";
-
- // Production steps of ECMA-262, Edition 5, 15.4.4.14
- // Reference: http://es5.github.io/#x15.4.4.14
- if (!Array.prototype.indexOf) {
- Array.prototype.indexOf = function(searchElement, fromIndex) {
-
- var k;
-
- // 1. Let O be the result of calling ToObject passing
- // the this value as the argument.
- if (this == null) {
- throw new TypeError('"this" is null or not defined');
- }
-
- var O = Object(this);
-
- // 2. Let lenValue be the result of calling the Get
- // internal method of O with the argument "length".
- // 3. Let len be ToUint32(lenValue).
- var len = O.length >>> 0;
-
- // 4. If len is 0, return -1.
- if (len === 0) {
- return -1;
- }
-
- // 5. If argument fromIndex was passed let n be
- // ToInteger(fromIndex); else let n be 0.
- var n = +fromIndex || 0;
-
- if (Math.abs(n) === Infinity) {
- n = 0;
- }
-
- // 6. If n >= len, return -1.
- if (n >= len) {
- return -1;
- }
-
- // 7. If n >= 0, then Let k be n.
- // 8. Else, n<0, Let k be len - abs(n).
- // If k is less than 0, then let k be 0.
- k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
-
- // 9. Repeat, while k < len
- while (k < len) {
- // a. Let Pk be ToString(k).
- // This is implicit for LHS operands of the in operator
- // b. Let kPresent be the result of calling the
- // HasProperty internal method of O with argument Pk.
- // This step can be combined with c
- // c. If kPresent is true, then
- // i. Let elementK be the result of calling the Get
- // internal method of O with the argument ToString(k).
- // ii. Let same be the result of applying the
- // Strict Equality Comparison Algorithm to
- // searchElement and elementK.
- // iii. If same is true, return k.
- if (k in O && O[k] === searchElement) {
- return k;
- }
- k++;
- }
- return -1;
- };
- }
-
- /**
- * Shim for "fixing" IE's lack of support (IE < 9) for applying slice
- * on host objects like NamedNodeMap, NodeList, and HTMLCollection
- * (technically, since host objects have been implementation-dependent,
- * at least before ES6, IE hasn't needed to work this way).
- * Also works on strings, fixes IE < 9 to allow an explicit undefined
- * for the 2nd argument (as in Firefox), and prevents errors when
- * called on other DOM objects.
- */
- (function () {
- 'use strict';
- var _slice = Array.prototype.slice;
-
- try {
- // Can't be used with DOM elements in IE < 9
- _slice.call(document.documentElement);
- } catch (e) { // Fails in IE < 9
- // This will work for genuine arrays, array-like objects,
- // NamedNodeMap (attributes, entities, notations),
- // NodeList (e.g., getElementsByTagName), HTMLCollection (e.g., childNodes),
- // and will not fail on other DOM objects (as do DOM elements in IE < 9)
- Array.prototype.slice = function(begin, end) {
- // IE < 9 gets unhappy with an undefined end argument
- end = (typeof end !== 'undefined') ? end : this.length;
-
- // For native Array objects, we use the native slice function
- if (Object.prototype.toString.call(this) === '[object Array]'){
- return _slice.call(this, begin, end);
- }
-
- // For array like object we handle it ourselves.
- var i, cloned = [],
- size, len = this.length;
-
- // Handle negative value for "begin"
- var start = begin || 0;
- start = (start >= 0) ? start : Math.max(0, len + start);
-
- // Handle negative value for "end"
- var upTo = (typeof end == 'number') ? Math.min(end, len) : len;
- if (end < 0) {
- upTo = len + end;
- }
-
- // Actual expected size of the slice
- size = upTo - start;
-
- if (size > 0) {
- cloned = new Array(size);
- if (this.charAt) {
- for (i = 0; i < size; i++) {
- cloned[i] = this.charAt(start + i);
- }
- } else {
- for (i = 0; i < size; i++) {
- cloned[i] = this[start + i];
- }
- }
- }
-
- return cloned;
- };
- }
- }());
-
- if (!Function.prototype.bind) {
- Function.prototype.bind = function (oThis) {
- if (typeof this !== "function") {
- throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
- }
-
- var aArgs = Array.prototype.slice.call(arguments, 1),
- fToBind = this,
- fNOP = function () {},
- fBound = function () {
- return fToBind.apply(this instanceof fNOP && oThis ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments)));
- };
-
- fNOP.prototype = this.prototype;
- fBound.prototype = new fNOP();
-
- return fBound;
- };
- }
-
- // Production steps of ECMA-262, Edition 5, 15.4.4.19
- // Reference: http://es5.github.io/#x15.4.4.19
- if (!Array.prototype.map) {
-
- Array.prototype.map = function(callback, thisArg) {
-
- var T, A, k;
-
- if (this == null) {
- throw new TypeError(' this is null or not defined');
- }
-
- // 1. Let O be the result of calling ToObject passing the |this|
- // value as the argument.
- var O = Object(this);
-
- // 2. Let lenValue be the result of calling the Get internal
- // method of O with the argument "length".
- // 3. Let len be ToUint32(lenValue).
- var len = O.length >>> 0;
-
- // 4. If IsCallable(callback) is false, throw a TypeError exception.
- // See: http://es5.github.com/#x9.11
- if (typeof callback !== 'function') {
- throw new TypeError(callback + ' is not a function');
- }
-
- // 5. If thisArg was supplied, let T be thisArg; else let T be undefined.
- if (arguments.length > 1) {
- T = thisArg;
- }
-
- // 6. Let A be a new array created as if by the expression new Array(len)
- // where Array is the standard built-in constructor with that name and
- // len is the value of len.
- A = new Array(len);
-
- // 7. Let k be 0
- k = 0;
-
- // 8. Repeat, while k < len
- while (k < len) {
-
- var kValue, mappedValue;
-
- // a. Let Pk be ToString(k).
- // This is implicit for LHS operands of the in operator
- // b. Let kPresent be the result of calling the HasProperty internal
- // method of O with argument Pk.
- // This step can be combined with c
- // c. If kPresent is true, then
- if (k in O) {
-
- // i. Let kValue be the result of calling the Get internal
- // method of O with argument Pk.
- kValue = O[k];
-
- // ii. Let mappedValue be the result of calling the Call internal
- // method of callback with T as the this value and argument
- // list containing kValue, k, and O.
- mappedValue = callback.call(T, kValue, k, O);
-
- // iii. Call the DefineOwnProperty internal method of A with arguments
- // Pk, Property Descriptor
- // { Value: mappedValue,
- // Writable: true,
- // Enumerable: true,
- // Configurable: true },
- // and false.
-
- // In browsers that support Object.defineProperty, use the following:
- // Object.defineProperty(A, k, {
- // value: mappedValue,
- // writable: true,
- // enumerable: true,
- // configurable: true
- // });
-
- // For best browser support, use the following:
- A[k] = mappedValue;
- }
- // d. Increase k by 1.
- k++;
- }
-
- // 9. return A
- return A;
- };
- }
-
- if (!Array.prototype.filter) {
- Array.prototype.filter = function(fun/*, thisArg*/) {
- 'use strict';
-
- if (this === void 0 || this === null) {
- throw new TypeError();
- }
-
- var t = Object(this);
- var len = t.length >>> 0;
- if (typeof fun !== 'function') {
- throw new TypeError();
- }
-
- var res = [];
- var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
- for (var i = 0; i < len; i++) {
- if (i in t) {
- var val = t[i];
-
- // NOTE: Technically this should Object.defineProperty at
- // the next index, as push can be affected by
- // properties on Object.prototype and Array.prototype.
- // But that method's new, and collisions should be
- // rare, so use the more-compatible alternative.
- if (fun.call(thisArg, val, i, t)) {
- res.push(val);
- }
- }
- }
-
- return res;
- };
- }
-
- // Production steps of ECMA-262, Edition 5, 15.4.4.21
- // Reference: http://es5.github.io/#x15.4.4.21
- if (!Array.prototype.reduce) {
- Array.prototype.reduce = function(callback /*, initialValue*/) {
- 'use strict';
- if (this == null) {
- throw new TypeError('Array.prototype.reduce called on null or undefined');
- }
- if (typeof callback !== 'function') {
- throw new TypeError(callback + ' is not a function');
- }
- var t = Object(this), len = t.length >>> 0, k = 0, value;
- if (arguments.length == 2) {
- value = arguments[1];
- } else {
- while (k < len && !(k in t)) {
- k++;
- }
- if (k >= len) {
- throw new TypeError('Reduce of empty array with no initial value');
- }
- value = t[k++];
- }
- for (; k < len; k++) {
- if (k in t) {
- value = callback(value, t[k], k, t);
- }
- }
- return value;
- };
- }
-
- if (!Object.keys) Object.keys = function(o) {
- if (o !== Object(o))
- throw new TypeError('Object.keys called on a non-object');
- var k=[],p;
- for (p in o) if (Object.prototype.hasOwnProperty.call(o,p)) k.push(p);
- return k;
- };
-
- Array.prototype.getUnique = function(){
- var u = {}, a = [];
- for(var i = 0, l = this.length; i < l; ++i){
- if(u.hasOwnProperty(this[i])) {
- continue;
- }
- a.push(this[i]);
- u[this[i]] = 1;
- }
- return a;
- }
-
- if(typeof String.prototype.trim !== 'function'){String.prototype.trim = function() {return this.replace(/^\s+|\s+$/g, '');};};
-
- Unbxd.setSearch = function(options){
- this.options = jQuery.extend( {}, this.defaultOptions, options);
-
- this.init();
- }
-
- var isTypeSearch = function isTypeSearch(type) {
- return type === "search";
- };
-
- var isTypeBrowse = function isTypeBrowse(type) {
- return type === "browse";
- };
-
- var isTypeCategory = function isTypeCategory(type) {
- return type === "category";
- };
-
- var isTypeBrowseOrCategory = function isTypeBrowseOrCategory(type) {
- return isTypeBrowse(type) || isTypeCategory(type);
- };
-
- var isCategoryIdPresent = function isCategoryIdPresent(params) {
- return ("categoryId" in params && params.categoryId.trim().length > 0);
- };
-
- var isQueryPresent = function isQueryPresent(params) {
- return ("query" in params && params.query.trim().length > 0);
- };
-
- Handlebars.registerHelper('prepareFacetName', function(txt){
- txt = txt.replace("_fq","");
- return txt.replace("_"," ");
- });
-
- Handlebars.registerHelper('prepareFacetValue', function(txt){
- return txt.trim().length > 0 ? txt : " ";
- });
-
- Unbxd.setSearch.prototype.defaultOptions = {
- inputSelector : '#search_query'
- ,searchButtonSelector : '#search_button'
- ,type : "search"
- ,getCategoryId: ""
- ,deferInitRender: []
- ,spellCheck : '' //
- ,spellCheckTemp : 'Did you mean : {{suggestion}}
'
- ,searchQueryDisplay : ''
- ,searchQueryDisplayTemp : 'Search results for {{query}} - {{numberOfProducts}}
'
- ,searchResultContainer : ''
- ,searchResultSetTemp : '' //function or handlebars template, register any helpers if needed
- ,isAutoScroll : false
- ,isClickNScroll : false
- ,isPagination : false
- ,setPagination : function(totalNumberOfProducts,pageSize,currentPage){}
- ,paginationContainerSelector: ''
- ,paginationTemp:[
- '{{#if hasFirst}}',
- ' « ',
- '{{/if}}',
- '{{#if hasPrev}}',
- ' < ',
- '{{/if}}',
- '{{#pages}}',
- '{{#if current}}',
- ' {{page}} ',
- '{{else}}',
- ' {{page}} ',
- '{{/if}}',
- '{{/pages}}',
- ' of ',
- '{{totalPages}}',
- '{{#if hasNext}}',
- ' > ',
- '{{/if}}',
- '{{#if hasLast}}',
- '»',
- '{{/if}}'
- ].join('')
- ,clickNScrollElementSelector : '#load-more'
- ,facetMultiSelect : true
- ,facetContainerSelector : ''
- ,facetCheckBoxSelector : ''
- ,selectedFacetTemp : ['{{#each filters}}'
- ,''
- ,'- '
- ,'{{prepareFacetName @key}}:'
- ,'{{#each this}}'
- ,''
- ,'{{/each}}'
- ,'
'
- ,'
'
- ,'{{/each}}'].join('')
- ,selectedFacetContainerSelector : ""
- ,clearSelectedFacetsSelector : ""
- ,removeSelectedFacetSelector : ""
- ,loaderSelector : ""
- ,onFacetLoad : ""
- ,onIntialResultLoad : ""
- ,onPageLoad : ""
- ,sanitizeQueryString : function(q){ return q;}
- ,getFacetStats : ""
- ,processFacetStats : function(obj){}
- ,setDefaultFilters : function(){}
- ,fields : []
- ,onNoResult : function(obj){}
- ,noEncoding : false
- ,heightDiffToTriggerNextPage : 100
- ,customReset : function(){}
- ,bannerSelector: ""
- ,bannerTemp: '
'
- ,bannerCount: 1
- ,sortContainerSelector: ''
- ,sortOptions: [{
- name: 'Relevancy'
- },{
- name: 'Price: H-L',
- field: 'price',
- order: 'desc'
- },{
- name: 'Price: L-H',
- field: 'price',
- order: 'asc'
- }]
- ,sortContainerType: 'select' /* value can be select or click */
- ,sortContainerTemp: [
- ''
- ].join('')
- ,pageSize : 12
- ,pageSizeContainerSelector: ''
- ,pageSizeOptions: [{
- name: '12',
- value: '12'
- },{
- name: '24',
- value: '24'
- }]
- ,pageSizeContainerType: 'select' /* value can be select or click */
- ,pageSizeContainerTemp: [
- ''
- ].join(''),
- viewTypeContainerTemp: [
- '{{#options}}',
- '',
- '',
- '',
- '{{value}}',
- '',
- '',
- '',
- '{{/options}}'
- ].join('')
- ,searchQueryParam:"q"
- ,retainbaseParam: false
- ,baseParams:[]
- ,requestHeaders: {}
- };
-
- jQuery.extend(Unbxd.setSearch.prototype,{
- compiledResultTemp : false
- ,compiledSpellCheckTemp : false
- ,compiledSearchQueryTemp: false
- ,compiledFacetTemp : false
- ,compiledSelectedFacetTemp : false
- ,compiledBannerTemp: false
- ,compiledSortContainerTemp: false
- ,compiledPageSizeContainerTemp: false
- ,compiledPaginationTemp: false
- ,currentNumberOfProducts : 0
- ,totalNumberOfProducts : 0
- ,productStartIdx: 0
- ,productEndIdx: 0
- ,totalPages: 0
- ,isLoading : false
- ,params : {
- query : '*'
- ,filters : {}
- ,ranges : {}
- ,sort : {}
- ,categoryId : ""
- ,extra : {
- format : "json"
- ,page : 1
- ,rows : 0
- }
- }
- ,defaultParams: {
- }
- ,isHistory : !!(window.history && history.pushState)
- ,popped : false //there is an edge case in Mozilla that fires popstate initially
- ,initialURL : ''
- ,isHashChange : false
- ,currentHash : ""
- ,hashChangeInterval : null
- ,ajaxCall : null
- ,init : function(){
- this.isHashChange = !!("onhashchange" in window.document.body);
-
- this.$input = jQuery(this.options.inputSelector);
- this.$input.val('');
- this.input = this.$input[0];
-
- this.setEvents();
-
- this.reset();
-
- var cur_url = this.getUrlSubstring()
- , urlqueryparams = this.getQueryParams(cur_url)
- // add test to check if the url is encoded,
- // decode the query parameters only if url is encoded
- // fixes SKU searches like writ0035/WRIT0035 & HSWD0015
- , decodedParams = !(this.options.noEncoding && /[^A-Za-z0-9\+\/\=]/g.test(cur_url)) ? this.getQueryParams(this.decode(cur_url)) : {}
- , queryparamcount = Object.keys(urlqueryparams).length
- , decodedParamscount = Object.keys(decodedParams).length
- , finalParams = null;
-
- if (!this.options.noEncoding && decodedParamscount > 0) {
- finalParams = this._processURL(decodedParams);
- }else{
- finalParams = this._processURL(urlqueryparams);
- }
-
- if(this.options.deferInitRender.indexOf('search') > -1
- && !this.isUsingPagination()
- && finalParams.extra.hasOwnProperty('page')
- && finalParams.extra.page >= 1)
- finalParams.extra.page = finalParams.extra.page + 1;
-
- this.params = finalParams;
-
- this.params.categoryId = isTypeBrowseOrCategory(this.options.type) &&
- typeof this.options.getCategoryId == 'function'
- ? this.options.getCategoryId()
- : this.params.categoryId ? this.params.categoryId : '';
-
- this.setPage("page" in finalParams.extra ? finalParams.extra.page : 1)
- .setPageSize("rows" in finalParams.extra ? finalParams.extra.rows : this.options.pageSize);
-
- if(this.options.type == "search"){
- if(this.input.value.trim().length)
- this.params.query = this.$input.val().trim();
- else if(!("query" in this.params) || (this.params.query + "").trim().length == 0)
- this.params.query = "*";
-
- this.params.query = this.options.sanitizeQueryString.call(this,this.params.query);
-
- this.$input.val(this.params.query != "*" ? this.params.query : "");
-
- if(this.options.deferInitRender.indexOf('search') === -1)
- jQuery(this.options.searchResultContainer).html('');
-
- }
-
- if(typeof this.options.setDefaultFilters == "function")
- this.setDefaultParams(this.params);
-
- if (
- (isTypeSearch(this.options.type) && isQueryPresent(this.params)) ||
- (isTypeBrowseOrCategory(this.options.type) && isCategoryIdPresent(this.params))
- )
- this.callResults(this.paintResultSet);
- }
- ,getClass : function(object){
- return Object.prototype.toString.call(object).match(/^\[object\s(.*)\]$/)[1];
- }
- ,setEvents : function(){
- var self = this;
-
- var changeViewType = function(e) {
- e.preventDefault();
- var $t = jQuery(this);
- var selected = $t.attr("unbxdviewtype");
- self.setViewType(selected);
- if(selected && self.options.viewTypes.indexOf(selected) > -1) {
- if(!self.isUsingPagination()) self.setPage(1);
- if(self.options.deferInitRender.indexOf('search') > 0
- && !self.isUsingPagination()) self.setPage(2);
- self.callResults(self.paintOnlyResultSet, true);
- }
- };
-
- var changeSort = function(e){
- e.preventDefault();
- var $t = jQuery(this),
- $selected = (e.type === 'change') ? $t.find(':selected') :
- (e.currentTarget === e.target) ? $t : undefined,
- field = $selected && $selected.attr('unbxdsortfield'),
- value = $selected && $selected.attr('unbxdsortvalue');
-
- if($selected){
- self
- .resetSort()
- .setPage(1);
-
- if(field && value)
- self.addSort(field, value);
-
- self.callResults(self.paintOnlyResultSet, true);
- }
- };
-
- var changePageSize = function(e){
- e.preventDefault();
- var $t = jQuery(this),
- $selected = (e.type === 'change') ? $t.find(':selected') :
- (e.currentTarget === e.target) ? $t : undefined,
- pageSize = $selected && $selected.attr('unbxdpagesize');
-
- if($selected && pageSize){
- self
- .setPage(1)
- .setPageSize(pageSize)
- .callResults(self.paintOnlyResultSet, true);
- }
- };
-
- if(this.options.type == "search"){
- if("form" in this.input && this.input.form){
- jQuery(this.input.form).bind("submit",function(e){
- e.preventDefault();
-
- self.reset();
-
- self.params.query = self.options.sanitizeQueryString.call(self, self.input.value);
-
- if(self.options.deferInitRender.indexOf('search') === -1)
- jQuery(self.options.searchResultContainer).html('');
-
- self.setPage(1)
- .setPageSize(self.options.pageSize)
-
- if(self.params.query)
- self.callResults(self.paintResultSet,true);
- });
- }else{
- this.$input.bind('keydown',function(e){
- if(e.which == 13){
- e.preventDefault();
-
- self.reset();
-
- self.params.query = self.options.sanitizeQueryString.call(self, this.value );
-
- if(self.options.deferInitRender.indexOf('search') === -1)
- jQuery(self.options.searchResultContainer).html('');
-
- self.clearFilters(true).setPage(1)
- .setPageSize(self.options.pageSize)
-
- if(self.params.query)
- self.callResults(self.paintResultSet,true);
- }
- });
-
- if(this.options.searchButtonSelector.length){
- jQuery(this.options.searchButtonSelector).bind("click",function(e){
- e.preventDefault();
-
- self.reset();
-
- self.params.query = self.options.sanitizeQueryString.call(self, self.input.value);
-
- if(self.options.deferInitRender.indexOf('search') === -1)
- jQuery(self.options.searchResultContainer).html('');
-
- self.clearFilters(true).setPage(1)
- .setPageSize(self.options.pageSize)
-
- if(self.params.query)
- self.callResults(self.paintResultSet,true);
- });
- }
- }
- }
-
- //click on somthing like "Load more results" to fetch next page
- if(this.options.isClickNScroll){
- jQuery(this.options.clickNScrollElementSelector).bind('click',function(e){
- e.preventDefault();
-
- self.setPage(self.getPage() + 1);
-
- if(self.params.query)
- self.callResults(self.paintProductPage);
- });
- }
-
- //to load results on scrolling down
- if(this.options.isAutoScroll){
- jQuery(window).scroll(function() {
- var wind = jQuery(window),docu = jQuery(document);
- if((wind.scrollTop()) > (docu.height() - wind.height() - self.options.heightDiffToTriggerNextPage) && self.currentNumberOfProducts < self.totalNumberOfProducts && !self.isLoading){
- self.setPage(self.getPage() + 1)
- .callResults(self.paintProductPage);
- }
- });
- }
-
- //click on facet checkboxes
- if(this.options.facetContainerSelector.length > 0){
- jQuery(this.options.facetContainerSelector).delegate(self.options.facetCheckBoxSelector,'change',function(e){
- var box = jQuery(this),
- el = box.parents(self.options.facetElementSelector),
- facetName = box.attr('unbxdParam_facetName'),
- facetValue = box.attr('unbxdParam_facetValue'),
- vals = facetValue.split(' TO ');
-
- if(box.is(':checked') && typeof self.options.facetOnSelect == "function"){
- self.options.facetOnSelect(el);
- }
-
- if(!box.is(':checked') && typeof self.options.facetOnDeselect == "function"){
- self.options.facetOnDeselect(el);
- }
-
- if(vals.length > 1)
- self[box.is(':checked') ? 'addRangeFilter' : 'removeRangeFilter'](facetName, vals[0], vals[1]);
- else
- self[box.is(':checked') ? 'addFilter' : 'removeFilter'](facetName, facetValue);
-
- self.setPage(1)
- .callResults(self.paintResultSet,true);
- });
- }
-
- if(this.options.clearSelectedFacetsSelector.length > 0){
- jQuery('body').delegate(this.options.clearSelectedFacetsSelector,'click',function(e){
- e.preventDefault();
-
- self.clearFilters(true).setPage(1)
- .callResults(self.paintResultSet,true);
- });
- }
-
- if(this.options.removeSelectedFacetSelector.length > 0){
- jQuery(this.options.selectedFacetContainerSelector).delegate(this.options.removeSelectedFacetSelector,'click',function(e){
- e.preventDefault();
- var $t = jQuery(this)
- ,name = $t.attr("unbxdParam_facetName")
- ,val = $t.attr("unbxdParam_facetValue")
- ,vals = val.split(' TO ')
- ,checkbox_sel = self.options.facetCheckBoxSelector + "[unbxdParam_facetName=\""+ name +"\"][unbxdParam_facetValue=\"" + val + "\"]";
-
- jQuery(checkbox_sel).removeAttr("checked");
-
- if(typeof self.options.facetOnDeselect == "function"){
- self.options.facetOnDeselect(jQuery(checkbox_sel).parents(self.options.facetElementSelector));
- }
-
- if(vals.length > 1)
- self.removeRangeFilter(name, vals[0], vals[1]);
- else
- self.removeFilter(name, val);
-
- self.setPage(1)
- .callResults(self.paintResultSet,true);
- });
- }
-
- if(this.options.sortContainerSelector.length > 0){
- if(this.options.sortContainerType === 'select'){
- jQuery(this.options.sortContainerSelector).on({
- change: changeSort
- }, '*');
- } else if(this.options.sortContainerType === 'click'){
- jQuery(this.options.sortContainerSelector).on({
- click: changeSort
- }, '[unbxdsortfield]');
- }
- }
-
- if(this.options.pageSizeContainerSelector.length > 0){
- if(this.options.pageSizeContainerType === 'select'){
- jQuery(this.options.pageSizeContainerSelector).on({
- change: changePageSize
- }, '*');
- } else if(this.options.pageSizeContainerType === 'click'){
- jQuery(this.options.pageSizeContainerSelector).on({
- click: changePageSize
- }, '[unbxdpagesize]');
- }
- jQuery(this.options.pageSizeContainerSelector).delegate('*', 'change', function(e){
-
- });
- }
-
- if(this.options.paginationContainerSelector.length > 0){
- jQuery(this.options.paginationContainerSelector).delegate('*', 'click', function(e) {
- e.preventDefault();
- var $t = jQuery(this),
- keys = {
- first: 1,
- prev: self.getPage() - 1,
- next: self.getPage() + 1,
- last: self.totalPages
- },
- action = $t.attr('unbxdaction') || '';
-
- if(action){
- if(keys[action]){
- self.setPage(keys[action]);
- } else if(!isNaN(parseInt(action, 10))){
- self.setPage(parseInt(action, 10));
- }
- self.callResults(self.paintOnlyResultSet, true);
- }
-
- });
- }
-
- if(this.isHistory){
- self.popped = ('state' in window.history);
- self.initialURL = location.href;
-
- jQuery(window).bind('popstate', function(e) {
- var initialPop = self.popped && location.href == self.initialURL;
- self.popped = false;
-
- if ( initialPop || !e.originalEvent.state ) { self.init(); return; }
-
- var old_params = e.originalEvent.state;
-
- old_params.query = self.options.type == "search" ? self.options.sanitizeQueryString.call(self, old_params.query) : "";
-
- self.reset();
-
- self.setPage(1);
-
- if((old_params.query) || (old_params.categoryId)){
- self.params = old_params;
- self.callResults(self.paintResultSet);
- }
- });
- }else if(this.isHashChange){
- jQuery(window).bind("hashchange",function(e){
- var newhash = window.location.hash.substring(1);
- if(newhash && newhash != self.currentHash){
- self.reset();
- var old_params = self._processURL(self.options.noEncoding ? newhash : self.decode(newhash));
-
- old_params.query = self.options.type == "search" ? self.options.sanitizeQueryString.call(self,old_params.query) : "";
-
- self.currentHash = newhash;
-
- if((old_params.query) || (old_params.categoryId)){
- self.params = old_params;
- self.callResults(self.paintResultSet);
- }
- } else {
- self.init();
- }
- });
- }else{
- self.hashChangeInterval = setInterval(function() {
- var newhash = location.hash.substring(1);
-
- if (newhash && newhash != self.currentHash) {
- self.reset();
- var old_params = self._processURL(self.options.noEncoding ? newhash : self.decode(newhash));
-
- old_params.query = self.options.type == "search" ? self.options.sanitizeQueryString.call(self, old_params.query) : "";
-
- self.currentHash = newhash;
-
- if((old_params.query) || (old_params.categoryId)){
- self.params = old_params;
- self.callResults(self.paintResultSet);
- }
- }
- }, 3000);
- }
-
- if (this.options.searchResultSetTemp !== null && typeof this.options.searchResultSetTemp === 'object') {
- jQuery(this.options.viewTypeContainerSelector).on("click", '[unbxdviewtype]',changeViewType);
- }
- }
- ,addSort : function(field, dir){
- this.params.sort[field] = dir || "desc";
- return this;
- }
- ,removeSort : function(field){
- if(field in this.params.sort)
- delete this.params.sort[field];
-
- return this;
- }
- ,resetSort : function(){
- this.params.sort = {};
- return this;
- }
- ,addFilter : function(field, value){
- if(!(field in this.params.filters))
- this.params.filters[field] = {};
-
- this.params.filters[field][value] = field;
-
- return this;
- }
- ,removeFilter : function(field, value){
- if(value in this.params.filters[field])
- delete this.params.filters[field][value];
-
- if(Object.keys(this.params.filters[field]).length == 0)
- delete this.params.filters[field];
-
- return this;
- }
- ,clearFilters : function(clearRanges){
- this.params.filters = {}
-
- if(clearRanges){
- this.clearRangeFiltes();
- }
- return this;
- }
- ,addRangeFilter : function(field, lb, ub){
- if(!(field in this.params.ranges))
- this.params.ranges[field] = {};
-
- this.params.ranges[field][lb + ' TO ' + ub] = {lb : lb || '*', ub : ub || '*'};
-
- return this;
- }
- ,removeRangeFilter : function(field, lb, ub){
- if(!lb && !ub && field in this.params.ranges)
- delete this.params.ranges[field];
-
- if(lb && ub && field in this.params.ranges && (lb + ' TO ' + ub in this.params.ranges[field]))
- delete this.params.ranges[field][lb + ' TO ' + ub];
-
- if(Object.keys(this.params.ranges[field]).length == 0)
- delete this.params.ranges[field];
-
- return this;
- }
- ,clearRangeFiltes : function(){
- this.params.ranges = {};
-
- return this;
- }
- ,setPage : function(pageNo){
- this.params.extra.page = pageNo;
- return this;
- }
- ,getPage : function(){
- return this.params.extra.page;
- }
- ,setPageSize : function(pageSize){
- this.params.extra.rows = pageSize;
- return this;
- }
- ,getPageSize : function(){
- return this.params.extra.rows;
- }
-
- ,setViewType: function(viewType) {
- this.params.extra.view = viewType;
- return this;
- }
- ,getViewType: function() {
- return this.params.extra.view;
- }
-
- ,addQueryParam : function(key, value, dontOverried){
- if(!(key in this.params.extra) || !dontOverried){
- this.params.extra[key] = value;
- }else{
- if(this.getClass(this.params.extra[key]) != "Array")
- this.params.extra[key] = [this.params.extra[key]];
-
- this.params.extra[key].push(value);
- }
-
- return this;
- }
- ,isUsingPagination: function(){
- return !this.options.isAutoScroll && this.options.isPagination;
- }
- ,getHostNPath: function(){
- var handler = "search";
- if(isTypeBrowseOrCategory(this.options.type)) {
- handler = this.options.type;
- }
- return "//search.unbxdapi.com/"+ this.options.APIKey + "/" + this.options.siteName + "/" + handler;
- }
- ,getUrlSubstring: function(){
- return window.location.search.substring(1) || window.location.hash.substring(1);
- }
- ,url : function(){
- var host_path = this.getHostNPath();
-
- var url ="";
- var nonhistoryPath = "";
- // To Retain the fields which are are required from the params of the base URL
- var cur_url = this.getUrlSubstring();
- var urlParams = this.getQueryParams(cur_url);
- var baseParams = {};
- if( typeof(this.options.baseParams) == "object" && this.options.baseParams.length > 0 ){
- for( i in urlParams ){
- if((urlParams.hasOwnProperty(i)) && !(i in this.params)){
- for( param in this.options.baseParams ){
- if(i == this.options.baseParams[param]){
- baseParams[i] = urlParams[i]
- }
- }
- }
- }
- }
-
- if(this.options.type == "search" && this.params['query'] != undefined){
- url += '&'+ this.options.searchQueryParam +'='+ encodeURIComponent(this.params.query);
- }else if(this.options.type == "browse" && this.params['categoryId'] != undefined){
- url += '&category-id=' + encodeURIComponent(this.params.categoryId);
- } else if(isTypeCategory(this.options.type) && this.params.categoryId !== undefined) {
- url += "&p=" + encodeURIComponent(this.params.categoryId);
- }
-
- for(var x in this.params.filters){
- if(this.params.filters.hasOwnProperty(x)){
- var a = [];
- var b = [];
- for(var y in this.params.filters[x]){
- if(this.defaultParams.hasOwnProperty('filters')
- && this.defaultParams.filters.hasOwnProperty(x)
- && this.defaultParams.filters[x].hasOwnProperty(y)
- && this.params.filters[x].hasOwnProperty(y)){
- b.push((x+':\"'+ encodeURIComponent(y.replace(/\"/g, "\\\"")) +'\"').replace(/\"{2,}/g, '"'));
- } else if(this.params.filters[x].hasOwnProperty(y)){
- a.push((x+':\"'+ encodeURIComponent(y.replace(/\"/g, "\\\"")) +'\"').replace(/\"{2,}/g, '"'));
- }
- }
-
- if(a.length > 0)
- url += '&filter='+a.join(' OR ') + b.join(' OR ');
- else if(b.length > 0)
- nonhistoryPath += '&filter='+b.join(' OR ');
- }
- }
-
- for(var x in this.params.ranges){
- var a = [];
- var b = [];
- for(var y in this.params.ranges[x]){
- if(this.defaultParams.hasOwnProperty('ranges')
- && this.defaultParams.ranges.hasOwnProperty(x)
- && this.defaultParams.ranges[x].hasOwnProperty(y)
- && this.params.ranges[x].hasOwnProperty(y)){
- b.push(x + ':[' + this.params.ranges[x][y].lb + " TO " + this.params.ranges[x][y].ub + ']');
- }else if(this.params.ranges[x].hasOwnProperty(y)){
- a.push(x + ':[' + this.params.ranges[x][y].lb + " TO " + this.params.ranges[x][y].ub + ']');
- }
- }
-
- if(a.length > 0)
- url += '&filter='+a.join(' OR ') + b.join(' OR ');
- else if(b.length > 0)
- nonhistoryPath += '&filter='+b.join(' OR ');
- }
-
- var a = [];
- var b = [];
- for(var field in this.params.sort){
- if(this.defaultParams.hasOwnProperty('sort')
- && this.defaultParams.sort.hasOwnProperty(field)
- && this.params.sort.hasOwnProperty(field)){
- var dir = this.params.sort[field] || 'desc';
- b.push(field + " " + dir);
- } else if (this.params.sort.hasOwnProperty(field)) {
- var dir = this.params.sort[field] || 'desc';
- a.push(field + " " + dir);
- }
- }
-
- if(a.length)
- url += '&sort='+a.join(',');
-
- if(b.length)
- nonhistoryPath += '&sort='+b.join(',');
-
-
- for(var key in this.params.extra){
- if (this.params.extra.hasOwnProperty(key) && key != 'page') {
- var value = this.params.extra[key];
- if(this.getClass(value) == "Array"){
- value = value.getUnique();
- for(var i = 0;i < value.length; i++){
- url += '&' + key + '=' + encodeURIComponent(value[i]);
- }
- } else if(key === 'wt' || key === 'format') {
- nonhistoryPath += '&' + key + '=' + encodeURIComponent(value);
- } else if((this.isUsingPagination() && key === 'rows') || key === "view"){
- url += '&' + key + '=' + encodeURIComponent(value);
- } else if(this.defaultParams.hasOwnProperty('extra') && this.defaultParams.extra.hasOwnProperty(key)){
- nonhistoryPath += '&' + key + '=' + encodeURIComponent(value);
- } else
- url += '&' + key + '=' + encodeURIComponent(value);
- }
- }
-
- if(this.isUsingPagination())
- url += '&start=' + (this.params.extra.page <= 1 ? 0 : (this.params.extra.page - 1) * this.params.extra.rows);
- else
- nonhistoryPath += '&start=' + (this.params.extra.page <= 1 ? 0 : (this.params.extra.page - 1) * this.params.extra.rows);
-
- nonhistoryPath += this.options.getFacetStats.length > 0 ? "&stats=" + this.options.getFacetStats : "";
-
- if(this.options.fields.length){
- nonhistoryPath += '&fields=' + this.options.fields.join(',');
- }
-
- if(this.options.facetMultiSelect)
- nonhistoryPath += '&facet.multiselect=true';
-
- nonhistoryPath += '&indent=off';
-
- return {
- url : host_path + "?" + url + nonhistoryPath
- ,query : url
- ,host : host_path
- ,baseParams : baseParams
- };
- }
- ,callResults : function(callback, doPush){
- if(this.isLoading){
- this.ajaxCall.abort();
- }
-
- this.isLoading = true;
-
- if(this.options.loaderSelector.length > 0)
- jQuery(this.options.loaderSelector).show();
-
- var self = this
- ,modifiedCB = callback.bind(self)
- ,cb = function(data){
- this.isLoading = false;
- if(this.options.loaderSelector.length > 0)
- jQuery(this.options.loaderSelector).hide();
-
- if("error" in data)
- return false;
-
- modifiedCB(data);
- }
- ,urlobj = self.url()
- ,requestHeaders = this.serializeRequestHeaders(jQuery.extend({}
- ,this.getDefaultRequestHeaders(), this.options.requestHeaders));
-
- if(doPush){
- var finalquery = this.options.noEncoding ? urlobj.query : this.encode( urlobj.query );
- if(this.isHistory){
- if( self.options.retainbaseParam == true ){
- var finalBaseParams = '';
- for( i in urlobj.baseParams){
- if(urlobj.baseParams.hasOwnProperty(i)){
- finalBaseParams += "&" + i + "=" + urlobj.baseParams[i];
- }
- }
- finalquery += finalquery + this.options.noEncoding ? finalBaseParams : this.encode(finalBaseParams);
- }
- history.pushState(this.params,null,location.protocol + "//" + location.host + location.pathname + "?" + finalquery);
- }else{
- window.location.hash = finalquery;
- this.currentHash = finalquery;
- }
- }
- if(requestHeaders){
- urlobj.url += '&' + requestHeaders
- }
- this.ajaxCall = jQuery.ajax({
- url: urlobj.url.replace(this.options.searchQueryParam+"=", "q=")
- ,dataType: "jsonp"
- ,jsonp: 'json.wrf'
- ,success: cb.bind(self)
- });
- }
- ,reset: function(){
- this.totalNumberOfProducts = 0;
- this.currentNumberOfProducts = 0;
- jQuery(this.options.spellCheck).hide();
- jQuery(this.options.searchQueryDisplay).empty();
- if(this.options.deferInitRender.indexOf('search') === -1)
- jQuery(this.options.searchResultContainer).empty();
-
- jQuery(this.options.facetContainerSelector).empty();
-
- this.options.selectedFacetHolderSelector && jQuery(this.options.selectedFacetHolderSelector).hide();
-
- this.options.loaderSelector.length > 0 && jQuery(this.options.loaderSelector).hide();
-
- this.params = {
- query : '*'
- ,filters : {}
- ,sort : {}
- ,ranges : {}
- ,categoryId : ""
- ,extra : {
- format: "json"
- ,page: 1
- ,rows: 12
- }
- };
-
- if( this.options.viewTypes && this.options.viewTypes.length > 0)
- this.params.extra.view = this.options.viewTypes[0];
-
- if(typeof this.options.customReset == "function")
- this.options.customReset.call(this);
-
- if(typeof this.options.setDefaultFilters == "function")
- this.setDefaultParams(this.params);
-
- return this;
- }
- ,setDefaultParams: function(params){
- var newparams, diff;
- var oldparams = JSON.stringify(params);
- this.options.setDefaultFilters.call(this);
- newparams = JSON.stringify(this.params);
-
- if(Object.keys(this.defaultParams).length === 0)
- this.defaultParams = JSON.parse(newparams);
- }
- ,_processURL: function(url){
- var obj = typeof url == "string" ? this.getQueryParams(url) : url
- ,params = {
- query : ''
- ,filters : {}
- ,sort : {}
- ,ranges : {}
- ,extra : {
- format : "json"
- ,page : 1
- ,rows : 12
- }
- };
-
- //lets get filters
- if("filter" in obj){
- if (this.getClass(obj.filter) == "String")
- obj.filter = Array(obj.filter);
-
- for (var i = 0; i < obj.filter.length; i++) {
-
- var filterStrArr = obj.filter[i].split(" OR ");
-
- for(var x = 0; x < filterStrArr.length; x++){
- var arr = filterStrArr[x].split(":");
- if(arr.length == 2){
- arr[1] = arr[1].replace(/(^")|("$)/g, '').replace(/\"{2,}/g, '"').replace(/\\\"/g, '"').replace(/(^\[)|(\]$)/g, '');
-
- var vals = arr[1].split(" TO ");
- if(vals.length > 1){
- if(!(arr[0] in params.ranges))
- params.ranges[arr[0]] = {};
-
- params.ranges[arr[0]][arr[1]] = {lb : isNaN(parseFloat(vals[0])) ? '*' : parseFloat(vals[0]), ub : isNaN(parseFloat(vals[1])) ? '*' : parseFloat(vals[1])};
- } else {
- if(!(arr[0] in params.filters))
- params.filters[arr[0]] = {};
-
- params.filters[arr[0]][arr[1]] = arr[0];
- }
- }
- }
- }
- }
-
- //lets get sort now
- if("sort" in obj){
- var sortarr = obj.sort.split(",");
-
- for (var i = 0; i < sortarr.length; i++) {
- var arr = sortarr[i].split(/\s+(?=\S+$)/);
- if(arr.length == 2){
- params.sort[arr[0]] = arr[1] || "desc";
- }
- }
- }
-
- //lets get page size
- if("rows" in obj)
- params.extra.rows = parseInt(obj.rows);
- else
- params.extra.rows = this.options.pageSize;
-
- //lets get query
- if(this.options.searchQueryParam in obj)
- params.query = obj[this.options.searchQueryParam];
-
- //lets get category-id
- if("category-id" in obj)
- params.categoryId = obj["category-id"];
-
- //lets get categoryId(navigation)
- if("p" in obj)
- params.categoryId = obj["p"];
-
- //lets get boost
- if("boost" in obj)
- params.extra.boost = obj.boost;
-
- //lets get pageNo
- if("start" in obj)
- params.extra.page = (parseInt(obj.start) / parseInt(params.extra.rows)) + 1;
-
- if("view" in obj)
- params.extra.view = obj['view'];
- else if(this.options.viewTypes && this.options.viewTypes.length > 0)
- params.extra.view = this.options.viewTypes[0];
-
- return params;
- }
- ,paintResultSet: function(obj){
- this._internalPaintResultSet(obj,true);
- }
- ,_internalPaintResultSet: function(obj, facetsAlso){
- if("error" in obj)
- return false;
-
- this.totalNumberOfProducts = 0;
-
- this.currentNumberOfProducts = 0;
-
- if(obj.hasOwnProperty('redirect')) {
- window.location = obj['redirect']['value'];
- return false;
- }
-
- if (!obj.hasOwnProperty('banner')){
- this.options.bannerSelector.length
- && jQuery(this.options.bannerSelector).empty();
- }else{
- this.paintBanners(obj);
- }
-
- if(obj.hasOwnProperty('didYouMean')){
- if(obj.response.numberOfProducts == 0 ) { //> this.options.pageSize){
- if(this.params.extra.page > 1)
- this.params.extra.page = this.params.extra.page - 1;
-
- this.params.query = obj.didYouMean[0].suggestion;
-
- if(!this.compiledSpellCheckTemp)
- this.compiledSpellCheckTemp = Handlebars.compile(this.options.spellCheckTemp);
-
- jQuery(this.options.spellCheck).html(this.compiledSpellCheckTemp({suggestion : obj.didYouMean[0].suggestion , numberOfProducts : obj.response.numberOfProducts })).show();
-
- facetsAlso ? this.callResults(this.paintAfterSpellCheck) : this.callResults(this.paintOnlyResultSet) ;
-
- }else{
-
- this.params.query = obj.searchMetaData.queryParams.q; //obj.didYouMean[0].suggestion;
-
- if(!this.compiledSpellCheckTemp)
- this.compiledSpellCheckTemp = Handlebars.compile(this.options.spellCheckTemp);
-
- jQuery(this.options.spellCheck).html(this.compiledSpellCheckTemp({suggestion : obj.didYouMean[0].suggestion , numberOfProducts : obj.response.numberOfProducts })).show();
-
- facetsAlso ? this.callResults(this.paintAfterSpellCheck) : this.callResults(this.paintOnlyResultSet) ;
- }
- }else{
- jQuery(this.options.spellCheck).hide();
- if(this.options.deferInitRender.indexOf('search') === -1)
- jQuery(this.options.searchResultContainer).empty();
- this.paintProductPage(obj);
- facetsAlso && this.paintFacets(obj);
- }
- }
- ,paintOnlyResultSet : function(obj){
- if(this.options.deferInitRender.indexOf('search') === -1)
- jQuery(this.options.searchResultContainer).empty();
- this.paintProductPage(obj);
- }
- ,paintAfterSpellCheck : function(obj){
- if(this.options.deferInitRender.indexOf('search') === -1)
- jQuery(this.options.searchResultContainer).empty();
- this.paintProductPage(obj);
- this.paintFacets(obj);
- }
- ,paintAfterFacetChange : function(obj){
- if(this.options.deferInitRender.indexOf('search') === -1)
- jQuery(this.options.searchResultContainer).empty();
- this.paintProductPage(obj);
- this.paintSelectedFacets();
- }
- ,paintProductPage : function(obj){
- var start = 1;
- if("error" in obj)
- return;
-
- if(!obj.response.numberOfProducts){
- this.reset();
-
- this.options.onNoResult.call(this,obj);
-
- return this;
- }
-
- if(!this.compiledSearchQueryTemp)
- this.compiledSearchQueryTemp = Handlebars.compile(this.options.searchQueryDisplayTemp);
-
- this.productStartIdx = (this.isUsingPagination()) ? obj.response.start + 1 : 1;
- this.productEndIdx = (this.getPage() * this.getPageSize() <= obj.response.numberOfProducts) ?
- this.getPage() * this.getPageSize() : obj.response.numberOfProducts;
- this.totalPages = Math.ceil(obj.response.numberOfProducts/this.getPageSize());
- var queryParams = {
- numberOfProducts : obj.response.numberOfProducts
- ,start: this.productStartIdx
- ,end: this.productEndIdx
- }
- if (isTypeCategory(this.options.type)) {
- queryParams.categoryId = obj.searchMetaData.queryParams.p
- } else {
- queryParams.query = obj.searchMetaData.queryParams.q
- }
-
- jQuery(this.options.searchQueryDisplay).html(this.compiledSearchQueryTemp(queryParams)).show();
-
- this.paintSort(obj);
- this.paintPageSize(obj);
- this.paintPagination(obj);
- obj.response.products = obj.response.products.map(function(product){
- product['unbxdprank'] = obj.response.start + start;
- start += 1;
- return product;
- });
-
- if(this.getClass(this.options.searchResultSetTemp) == 'Function'){
- this.options.searchResultSetTemp.call(this,obj);
- } else if (this.options.searchResultSetTemp !== null && typeof this.options.searchResultSetTemp === 'object') {
- this.paintViewTypes(obj);
- var currentViewType = this.getViewType();
- if (!this.compiledResultTemp) {
- this.compiledResultTemp = {};
- this.options.viewTypes.forEach(function(val) {
- this.compiledResultTemp[val] = Handlebars.compile(this.options.searchResultSetTemp[val]);
- }.bind(this));
- }
- if (this.options.deferInitRender.indexOf('search') === -1 || !this.isUsingPagination()) {
- jQuery(this.options.searchResultContainer).append(this.compiledResultTemp[currentViewType](obj.response));
- }
- }else{
- if(!this.compiledResultTemp)
- this.compiledResultTemp = Handlebars.compile(this.options.searchResultSetTemp);
-
- if(this.options.deferInitRender.indexOf('search') === -1 || !this.isUsingPagination()){
- jQuery(this.options.searchResultContainer).append(this.compiledResultTemp(obj.response));
- }
- }
-
- if(!this.currentNumberOfProducts && typeof this.options.onIntialResultLoad == "function") {
- this.options.onIntialResultLoad.call(this, obj);
- }
-
- if(this.currentNumberOfProducts && typeof this.options.onPageLoad == "function") {
- this.options.onPageLoad.call(this, obj);
- }
-
- this.totalNumberOfProducts = obj.response.numberOfProducts;
-
- this.currentNumberOfProducts = obj.response.start + obj.response.products.length;
-
- if(typeof this.options.setPagination == "function"){
- this.options.setPagination.call(this,this.totalNumberOfProducts,this.getPageSize(),this.getPage());
- }
-
- if(this.options.isClickNScroll)
- jQuery(this.options.clickNScrollElementSelector)[(this.currentNumberOfProducts < this.totalNumberOfProducts) ? 'show' : 'hide']();
-
- }
- ,paintSort: function(obj) {
- if("error" in obj)
- return;
- if(this.options.sortContainerSelector.length <= 0)
- return;
-
- if(!this.compiledSortContainerTemp)
- this.compiledSortContainerTemp = Handlebars.compile(this.options.sortContainerTemp);
-
- var sortOptions = this.options.sortOptions.map(function(opt){
- opt['selected'] = (opt.hasOwnProperty('field') && opt.field in this.params.sort && this.params.sort[opt.field] === opt.order) ?
- true : (!opt.hasOwnProperty('field') && Object.keys(this.params.sort).length === 0) ? true: false;
- return opt;
- }.bind(this));
-
- jQuery(this.options.sortContainerSelector).html(this.compiledSortContainerTemp({
- options: sortOptions
- }));
- }
- ,paintPageSize: function(obj) {
- if("error" in obj)
- return;
- if(this.options.pageSizeContainerSelector.length <= 0)
- return;
- if(!this.isUsingPagination())
- return;
-
- if(!this.compiledPageSizeContainerTemp)
- this.compiledPageSizeContainerTemp = Handlebars.compile(this.options.pageSizeContainerTemp);
-
- var pageSizeOptions = this.options.pageSizeOptions.map(function(opt){
- opt['selected'] = (this.getPageSize() == opt.value) ? true : false;
- return opt;
- }.bind(this));
-
- jQuery(this.options.pageSizeContainerSelector).html(this.compiledPageSizeContainerTemp({
- options: pageSizeOptions
- }));
- }
-
- ,paintViewTypes: function(obj) {
- if ("error" in obj || this.options.viewTypeContainerSelector.length <= 0) {
- return;
- }
- if (!this.compiledViewTypesContainerTemp) {
- this.compiledViewTypesContainerTemp = Handlebars.compile(this.options.viewTypeContainerTemp);
- }
- var viewTypeOptions = this.options.viewTypes.map(function(opt) {
-
- var values = {};
- values["value"] = opt;
- values["selected"] = this.getViewType() == opt ? true : false;
- return values;
-
- }.bind(this));
- jQuery(this.options.viewTypeContainerSelector).html(this.compiledViewTypesContainerTemp({
- options: viewTypeOptions
- }));
- return this.getViewType();
- }
-
- ,paintPagination: function(obj) {
- if("error" in obj)
- return;
- if(this.options.paginationContainerSelector.length <= 0)
- return;
- if(!this.isUsingPagination())
- return;
-
- if(!this.compiledPaginationTemp)
- this.compiledPaginationTemp = Handlebars.compile(this.options.paginationTemp);
-
- var seq = [{
- page: this.getPage() - 2,
- current: false
- },{
- page: this.getPage() - 1,
- current: false
- },{
- page: this.getPage(),
- current: true
- },{
- page: this.getPage() + 1,
- current: false
- },{
- page: this.getPage() + 2,
- current: false
- }];
-
- var pagesToShow = seq.filter(function(obj){
- return obj.page > 0 && obj.page <= this.totalPages;
- }.bind(this))
-
-
-
- jQuery(this.options.paginationContainerSelector).html(this.compiledPaginationTemp({
- hasFirst: this.getPage() > 1 ? true : false,
- hasPrev: this.getPage() > 1 ? true : false,
- pages: pagesToShow,
- totalPages: this.totalPages,
- hasNext: this.getPage() < this.totalPages ? true : false,
- hasLast: this.getPage() < this.totalPages ? true : false
- }));
- }
- ,paintBanners : function(obj){
- if("error" in obj)
- return;
- if(this.options.bannerCount <= 0)
- return;
- if(this.options.bannerSelector.length === 0 )
- return;
- var banner = obj.banner;
- var bannersToDraw = [];
-
- if(!this.compiledBannerTemp)
- this.compiledBannerTemp = Handlebars.compile(this.options.bannerTemp);
-
- bannersToDraw = banner.banners.slice(0, this.options.bannerCount)
- .reduce(function(prev, curr){
- if(curr.hasOwnProperty('bannerHtml') && curr['bannerHtml']) {
- return prev.concat(curr.bannerHtml);
- } else {
- return prev.concat(this.compiledBannerTemp(
- {
- landingUrl: curr.landingUrl,
- imageUrl: curr.imageUrl
- }
- ));
- }
- }.bind(this), []);
-
- jQuery(this.options.bannerSelector).html(bannersToDraw.join(''));
-
- }
- ,paintFacets: function(obj){
- if("error" in obj)
- return;
-
- if(!obj.response.numberOfProducts)
- return this;
-
- var facets = obj.facets
- ,facetKeys = Object.keys(facets)
- ,textfacets = []
- ,rangefacets = []
- ,singlefacet = {}
- ,self = this
- ,facetVal = ""
- ,facetValStart = ""
- ,facetValEnd = ""
- ,isSelected = false
- ,selectedOnly = [];
-
- var positionExists = false;
- for(var x in facets) {
- if("position" in facets[x]) {
- positionExists = true;
- }
- break;
- }
- var sortable = [];
- for(var facet in facets) {
- sortable.push(positionExists ? ([facet, facets[facet]["position"]]) : [facet]);
- }
-
- if(positionExists) {
- sortable.sort(function(a, b) {return a[1] - b[1]});
- }
- for(var newI = 0; newI < sortable.length; newI++) {
-
- var x = sortable[newI][0];
- // for(var x in facets) {
- singlefacet = {
- name : self.prepareFacetName(x)
- ,facet_name : x
- ,type : facets[x]['type']
- ,selected : []
- ,unselected : []
- ,unordered : []
- };
-
- if(singlefacet.type !== 'facet_ranges'){
- for(var i = 0, len = facets[x]['values'].length/2; i < len;i++){
- facetVal = facets[x]['values'][2 * i];
-
- if(facetVal.trim().length == 0)
- continue;
-
- isSelected = x in self.params.filters && facetVal in self.params.filters[x] && self.params.filters[x][facetVal] == x ? true : false;
-
- singlefacet[isSelected ? "selected" : "unselected" ].push({value : facetVal , count : facets[x]['values'][2 * i + 1]});
- singlefacet.unordered.push({value : facetVal , count : facets[x]['values'][2 * i + 1], isSelected : isSelected});
- }
-
- if((singlefacet.unordered.length) > 0) textfacets.push(singlefacet);
-
- } else {
- for(var i = 0, len = facets[x]['values']['counts'].length/2; i < len; i++){
- facetValStart = parseFloat(facets[x]['values']['counts'][2 * i]).toString();
- facetValEnd = (parseFloat(facetValStart) + facets[x]['values'].gap).toString();
- var y = facetValStart + ' TO ' + facetValEnd;
-
- isSelected = x in self.params.ranges && y in self.params.ranges[x] && self.params.ranges[x][y]['lb'] == facetValStart && self.params.ranges[x][y]['ub'] == facetValEnd ? true : false;
-
- singlefacet[isSelected ? "selected" : "unselected" ].push({begin: facetValStart, end: facetValEnd, count: facets[x]['values']['counts'][2 * i + 1], value: y});
- singlefacet.unordered.push({begin: facetValStart, end: facetValEnd, count: facets[x]['values']['counts'][2 * i + 1], value: y, isSelected : isSelected});
- }
-
- if((singlefacet.unordered.length) > 0) rangefacets.push(singlefacet);
-
- }
- }
-
- if(this.getClass(this.options.facetTemp) == 'Function'){
- this.options.facetTemp.call(this,{facets: textfacets, rangefacets: rangefacets});
- }else{
- if(!this.compiledFacetTemp && this.options.facetTemp.length)
- this.compiledFacetTemp = Handlebars.compile(this.options.facetTemp);
-
- this.options.facetContainerSelector.length && jQuery(this.options.facetContainerSelector).html(this.compiledFacetTemp({facets: textfacets, rangefacets: rangefacets}));
- }
-
- this.paintSelectedFacets();
-
- if (this.options.deferInitRender.indexOf('search') > -1){
- this.options.deferInitRender = [];
- }
-
- if (typeof this.options.onFacetLoad == "function") {
- this.options.onFacetLoad.call(this, obj);
- }
-
- if(this.options.getFacetStats.length &&
- typeof this.options.processFacetStats == "function" &&
- "stats" in obj && obj.stats[this.options.getFacetStats] != null){
-
- obj.stats[this.options.getFacetStats].values = {
- min: obj.stats[this.options.getFacetStats].min,
- max: obj.stats[this.options.getFacetStats].max
- };
- if(this.options.getFacetStats in this.params.ranges){
- for (var x in this.params.ranges[this.options.getFacetStats]){
- obj.stats[this.options.getFacetStats].values = {
- min: this.params.ranges[this.options.getFacetStats][x].lb != "*" ?
- this.params.ranges[this.options.getFacetStats][x].lb :
- obj.stats[this.options.getFacetStats].min
- ,max: this.params.ranges[this.options.getFacetStats][x].ub != "*" ?
- this.params.ranges[this.options.getFacetStats][x].ub :
- obj.stats[this.options.getFacetStats].max
- };
- }
-
- }
-
- this.options.processFacetStats.call(this,obj.stats);
- }
- }
- ,paintSelectedFacets : function(){
- var selFacetKeysLength = Math.max(Object.keys(this.params.filters).length,
- Object.keys(this.params.ranges).length);
- var selectedFacets = {};
-
- if(selFacetKeysLength){
- selectedFacets.filters = this.params.filters;
- selectedFacets.ranges = {};
-
- for (var x in this.params.ranges){
- if(!selectedFacets.ranges.hasOwnProperty(x))
- selectedFacets.ranges[x] = {};
-
- for (var y in this.params.ranges[x]){
- selectedFacets.ranges[x][y] = x;
- }
- }
-
- if(this.options.selectedFacetTemp && this.options.selectedFacetContainerSelector){
- if(!this.compiledSelectedFacetTemp)
- this.compiledSelectedFacetTemp = Handlebars.compile(this.options.selectedFacetTemp);
-
- jQuery(this.options.selectedFacetContainerSelector).html(this.compiledSelectedFacetTemp(selectedFacets));
- }
- jQuery(this.options.selectedFacetHolderSelector).show();
- }else{
- jQuery(this.options.selectedFacetContainerSelector).empty();
- jQuery(this.options.selectedFacetHolderSelector).hide();
- }
- }
- ,prepareFacetName : function (txt){
- txt = txt.replace("_fq","");
- return txt.replace("_"," ");
- }
- ,getQueryParams : function (q){
- var e, //replace + character before decoding the URL
- d = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")).trim(); },
- //splits on equals
- r = /([^&=]+)=?([^&]*)/g
- ,urlParams = {};
-
- q = q || this.getUrlSubstring();
-
- while (e = r.exec(q)) {
- var e1 = e[1].indexOf("[")
- //first group of regex match
- ,k = e1 == "-1" ? e[1] : e[1].slice(0, e1)
- ,i = e1 != "-1" ? d(e[1].slice(e1+1, e[1].indexOf("]", e1))) : ""
- ,v = d(e[2]);
-
- if( v.length == 0 )
- continue;
-
- if (!(k in urlParams)) {
- urlParams[k] = v
- }else{
- if (typeof urlParams[k] != "object"){
- var old = urlParams[k];
-
- urlParams[k] = Array(urlParams[k]);
-
- Array.prototype.push.call(urlParams[k], old);
- }
-
- Array.prototype.push.call(urlParams[k], v);
- }
- }
- return urlParams;
- }
- ,_keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
- ,encode: function (e) {
- var t = "",n, r, i, s, o, u, a,f = 0;
- e = this._utf8_encode(e);
- while (f < e.length) {
- n = e.charCodeAt(f++);
- r = e.charCodeAt(f++);
- i = e.charCodeAt(f++);
- s = n >> 2;
- o = (n & 3) << 4 | r >> 4;
- u = (r & 15) << 2 | i >> 6;
- a = i & 63;
- if (isNaN(r)) {
- u = a = 64;
- } else if (isNaN(i)) {
- a = 64;
- }
- t = t + this._keyStr.charAt(s) + this._keyStr.charAt(o) + this._keyStr.charAt(u) + this._keyStr.charAt(a);
- }
- return t;
- }
- ,decode: function (e) {
- var t = "",n, r, i,s, o, u, a,f = 0;
- e = e.replace(/[^A-Za-z0-9\+\/\=]/g, "");
- while (f < e.length) {
- s = this._keyStr.indexOf(e.charAt(f++));
- o = this._keyStr.indexOf(e.charAt(f++));
- u = this._keyStr.indexOf(e.charAt(f++));
- a = this._keyStr.indexOf(e.charAt(f++));
- n = s << 2 | o >> 4;
- r = (o & 15) << 4 | u >> 2;
- i = (u & 3) << 6 | a;
- t = t + String.fromCharCode(n);
- if (u != 64) {
- t = t + String.fromCharCode(r);
- }
- if (a != 64) {
- t = t + String.fromCharCode(i);
- }
- }
- t = this._utf8_decode(t);
-
- return t;
- }
- ,_utf8_encode: function (e) {
- e = e.replace(/\r\n/g, "\n");
- var t = "";
- for (var n = 0; n < e.length; n++) {
- var r = e.charCodeAt(n);
- if (r < 128) {
- t += String.fromCharCode(r)
- } else if (r > 127 && r < 2048) {
- t += String.fromCharCode(r >> 6 | 192);
- t += String.fromCharCode(r & 63 | 128);
- } else {
- t += String.fromCharCode(r >> 12 | 224);
- t += String.fromCharCode(r >> 6 & 63 | 128);
- t += String.fromCharCode(r & 63 | 128);
- }
- }
- return t;
- }
- ,_utf8_decode: function (e) {
- var t = "",n = 0;
- var r = c1 = c2 = 0;
- while (n < e.length) {
- r = e.charCodeAt(n);
- if (r < 128) {
- t += String.fromCharCode(r);
- n++;
- } else if (r > 191 && r < 224) {
- c2 = e.charCodeAt(n + 1);
- t += String.fromCharCode((r & 31) << 6 | c2 & 63);
- n += 2;
- } else {
- c2 = e.charCodeAt(n + 1);
- c3 = e.charCodeAt(n + 2);
- t += String.fromCharCode((r & 15) << 12 | (c2 & 63) << 6 | c3 & 63);
- n += 3;
- }
- }
- return t;
- }
- ,log : function(str){
- if(this.readCookie("debug") === '1'){
- console.log("Unbxd : " + str);
- }
- }
- ,decodeAndParse : function(s) {
- if (s.indexOf('"') === 0) {
- // This is a quoted cookie as according to RFC2068, unescape...
- s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
- }
-
- return this.decodeCookie(s);
- }
- ,decodeCookie : function(s) {
- var pluses = /\+/g;
- return decodeURIComponent(s.replace(pluses, ' '));
- }
- ,cookie : function (key) {
- // Read
- var cookies = document.cookie.split('; ');
- var result;
- for (var i = 0, l = cookies.length; i < l; i++) {
- var parts = cookies[i].split('=');
- var name = this.decodeCookie(parts.shift());
- var cookie = parts.join('=');
-
- if (key && key === name) {
- try{
- result = this.decodeAndParse(cookie);
- break;
- }catch(e){
- this.log(e);
- }
- }
- }
-
- return result;
- }
- ,readCookie : function(name){
- try{
- return this.cookie('unbxd.' + name);
- }catch(e){
- this.log(e);
- }
-
- return undefined;
- }
- ,getDeviceInfo : function(){
- var smallDeviceMaxWidth = 768,
- mediumDeviceMaxWidth = 992;
- if(window.outerWidth < smallDeviceMaxWidth){
- return "Mobile";
- } else if(window.outerWidth < mediumDeviceMaxWidth){
- return "Tablet";
- } else {
- return "Desktop";
- }
- }
- ,getUserType : function(){
- return this.readCookie('visit') === "repeat" ? "repeat" : "new";
- }
- ,getUserId : function(){
- return this.readCookie('userId');
- }
- ,getDefaultRequestHeaders : function(){
- var self = this,
- userId = this.getUserId(),
- defaultRequestHeaders = {
- "device-type": self.getDeviceInfo()
- ,"unbxd-url": document.URL
- ,"unbxd-referrer": document.referrer
- ,"user-type": self.getUserType()
- ,"api-key": self.options.APIKey
- };
- if(userId){
- defaultRequestHeaders["uid"] = userId;
- }
- return defaultRequestHeaders;
- }
- ,serializeRequestHeaders : function(headers){
- if(jQuery.param){
- return jQuery.param(headers)
- } else {
- var str = [];
- for(var header in headers)
- if (headers.hasOwnProperty(header)) {
- str.push(encodeURIComponent(header) + "=" + encodeURIComponent(headers[header]));
- }
- return str.join("&");
- }
- }
- });
-};
-
-
-Unbxd = window.Unbxd || {};
-
-Unbxd.isJqueryRequiredVersion = Unbxd.isJqueryRequiredVersion ||
- function isJqueryRequiredVersion(current) {
- var jQueryVersion = current.split('.');
- jQueryVersion = jQueryVersion.map(function convertToNumber(version) {
- return Number(version);
- });
- if (
- jQueryVersion[0] > 1 || (jQueryVersion[0] === 1 && jQueryVersion[1] >= 7)
- ) {
- return true;
- }
- return false;
- };
-
-if (!window.jQuery || !window.Handlebars) {
- console.error(
- 'Please include jQuery & Handlebars libraries before loading unbxdSearch.js or You can pass custom jQuery & Handlebars by calling unbxdSeachInit(jQuery, Handlebars) '
- );
-} else if (!Unbxd.isJqueryRequiredVersion(jQuery.fn.jquery)) {
- console.error(
- 'jQuery version needs to be greater than 1.7 to use unbxdSearch.js. You can pass custom jQuery & Handlebars by calling unbxdSeachInit(jQuery, Handlebars)'
- );
-} else {
- unbxdSearchInit(jQuery, Handlebars);
-}
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000..ac5cd88
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,22 @@
+const path = require('path');
+
+module.exports = {
+ entry: path.resolve(__dirname, 'app'),
+ output: {
+ path: path.resolve(__dirname, 'build'),
+ filename: 'bundle.js'
+ },
+ devServer: {
+ port: 3000,
+ contentBase: path.resolve(__dirname, 'build')
+ },
+ module: {
+ rules: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ use: ['babel-loader']
+ }
+ ]
+ }
+};