├── .editorconfig ├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── images ├── button-48.png ├── button-96.png ├── chrome-ext │ ├── chrome-large-promo-image.png │ ├── chrome-large-promo-image.xcf │ ├── chrome-logo.png │ ├── chrome-marquee-promo-image.png │ ├── chrome-marquee-promo-image.xcf │ ├── chrome-screenshot-1.png │ ├── chrome-screenshot-2.png │ ├── chrome-screenshot-3.png │ ├── chrome-small-promo-image.png │ └── chrome-small-promo-image.xcf ├── octicon-report.png └── screenshot.png ├── manifest.json ├── package-lock.json ├── package.json ├── popup ├── app.css ├── app.html ├── app.js ├── config.js.example ├── fonts.css ├── fonts │ ├── noto-sans-v27-latin-700.woff │ ├── noto-sans-v27-latin-700.woff2 │ ├── noto-sans-v27-latin-italic.woff │ ├── noto-sans-v27-latin-italic.woff2 │ ├── noto-sans-v27-latin-regular.woff │ └── noto-sans-v27-latin-regular.woff2 ├── images │ └── github.svg ├── modules │ ├── hidden-checkbox.js │ ├── issue-form.js │ ├── screen.js │ └── settings.js └── vendor │ ├── crypto-js.min.js │ ├── download2.js │ └── zepto.js └── webpack.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 4 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [Makefile] 12 | indent_style = tab 13 | indent_size = 4 14 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: stilliard 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | popup/config.js 2 | web-ext-artifacts/ 3 | node_modules/ 4 | dist/ 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Andrew Stilliard 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | # build latest zip release 3 | # requires: npm install --global web-ext 4 | build: 5 | web-ext build --overwrite-dest 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Browser extension to quickly report issues to GitHub 3 | 4 | ![screenshot](./images/screenshot.png) 5 | 6 | **Make sure you have setup your popup/config.js first!** - copy the popup/config.js.example to popup/config.js and set a secret for it to work. 7 | 8 | Supports Chrome & Firefox. 9 | 10 | - [Chrome Extension](https://chrome.google.com/webstore/detail/quick-add-issue-to-github/mgamfhobfmlghohfjdiecjhddoigenkk) 11 | - [Firefox Addon](https://addons.mozilla.org/en-GB/firefox/addon/quick-add-issue-to-github/) 12 | 13 | Features: 14 | - Sending issues to github 15 | - Select a repo based on your user or set a specific org. 16 | - When using a specific org you can also set an org project. 17 | - Set issue type/labels 18 | - Bugs/enhancements also currently come with a issue template. 19 | - Screenshot support 20 | - Url & debug info (such as browser UA, etc.) 21 | 22 | ------ 23 | 24 | A few ideas: 25 | 26 | - ~~Upgrade to use the new github projects api~~ 27 | - Support projects at a repo level too 28 | - Select labels based on ones for selected repo 29 | - Allow setting issue templates (currently hardcoded) 30 | - Screenshot hosting, (currently it downloads and you drag it back in manually) 31 | - Better oauth flow to avoid personal access key usage 32 | 33 | ------- 34 | 35 | Local dev: 36 | 37 | - Install packages with `npm install` 38 | - Build js with `npm run build` (or `npm run watch` for dev) 39 | - Make the zip extension with `make` 40 | - Locally test the extension in chrome by going to `chrome://extensions/` and loading in this folder as an unpacked extension. 41 | - When ready, update the version in the manifest.json and then run `make` again to update the zip file, then upload latest version via https://chrome.google.com/webstore/devconsole/ 42 | 43 | ------- 44 | 45 | Current icon from: https://octicons.github.com/icon/report/ 46 | 47 | **[Contributions welcome](https://github.com/stilliard/quick-add-github-issue-browser-extension) :)** 48 | -------------------------------------------------------------------------------- /images/button-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/button-48.png -------------------------------------------------------------------------------- /images/button-96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/button-96.png -------------------------------------------------------------------------------- /images/chrome-ext/chrome-large-promo-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-large-promo-image.png -------------------------------------------------------------------------------- /images/chrome-ext/chrome-large-promo-image.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-large-promo-image.xcf -------------------------------------------------------------------------------- /images/chrome-ext/chrome-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-logo.png -------------------------------------------------------------------------------- /images/chrome-ext/chrome-marquee-promo-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-marquee-promo-image.png -------------------------------------------------------------------------------- /images/chrome-ext/chrome-marquee-promo-image.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-marquee-promo-image.xcf -------------------------------------------------------------------------------- /images/chrome-ext/chrome-screenshot-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-screenshot-1.png -------------------------------------------------------------------------------- /images/chrome-ext/chrome-screenshot-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-screenshot-2.png -------------------------------------------------------------------------------- /images/chrome-ext/chrome-screenshot-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-screenshot-3.png -------------------------------------------------------------------------------- /images/chrome-ext/chrome-small-promo-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-small-promo-image.png -------------------------------------------------------------------------------- /images/chrome-ext/chrome-small-promo-image.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/chrome-ext/chrome-small-promo-image.xcf -------------------------------------------------------------------------------- /images/octicon-report.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/octicon-report.png -------------------------------------------------------------------------------- /images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/images/screenshot.png -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Quick add issue to GitHub", 4 | "description": "Open source browser extension/addon for adding issues to Github via a browser button.", 5 | "version": "1.6", 6 | "action": { 7 | "browser_style": true, 8 | "default_icon": { 9 | "48": "images/button-48.png", 10 | "96": "images/button-96.png" 11 | }, 12 | "default_popup": "popup/app.html" 13 | }, 14 | "permissions": ["activeTab", "tabs", "storage"], 15 | "host_permissions": ["*://*/*"] 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "build": "webpack --mode=production", 4 | "watch": "webpack --mode=production --watch --progress" 5 | }, 6 | "devDependencies": { 7 | "@octokit/rest": "^21.1.1", 8 | "webpack": "^5.94.0", 9 | "webpack-cli": "^5.0.1" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /popup/app.css: -------------------------------------------------------------------------------- 1 | 2 | /* ==== Base ==== */ 3 | 4 | * { margin: 0; padding: 0; } 5 | 6 | body { 7 | width: 360px; 8 | padding: 10px; 9 | background-color: #F6F8FA; 10 | } 11 | body, input, select { 12 | font: 14px/1.5 'Noto Sans', sans-serif; 13 | } 14 | 15 | a { 16 | text-decoration: underline; 17 | color: #0969DA; 18 | cursor: pointer; 19 | } 20 | 21 | p { 22 | margin-bottom: 15px; 23 | } 24 | 25 | label { 26 | user-select: none; 27 | } 28 | 29 | input, select { 30 | width: 100%; 31 | padding: 4px; 32 | margin-top: 2px; 33 | box-sizing: border-box; 34 | border-radius: 3px; 35 | border: 1px solid #A6ACB2; 36 | } 37 | 38 | input:focus, select:focus, label.hidden-checkbox-label:focus { 39 | outline: none; 40 | border-color: #0969DA; 41 | } 42 | 43 | input[type="submit"] { 44 | padding: 5px 10px; 45 | border-radius: 3px; 46 | border: 1px solid #2A9147; 47 | background-color: #2DA44E; 48 | color: #FFF; 49 | cursor: pointer; 50 | } 51 | 52 | /* ==== Layout ==== */ 53 | 54 | header { 55 | margin: -10px; 56 | margin-bottom: 15px; 57 | background-color: #24292F; 58 | padding: 20px 15px; 59 | } 60 | header h1 { 61 | font-size: 16px; 62 | color: #FFF; 63 | } 64 | header .logo-img { 65 | float: right; 66 | color: #FFF; 67 | margin-top: -4px; 68 | } 69 | 70 | /* ==== Modules ==== */ 71 | 72 | /* hidden checkboxes */ 73 | label.hidden-checkbox-label { 74 | display: inline-block; 75 | padding: 5px 20px; 76 | margin: 1px 0; 77 | border: 1px solid #A6ACB2; 78 | border-radius: 3px; 79 | cursor: pointer; 80 | } 81 | label.hidden-checkbox-label:hover { 82 | background-color: #EEE; 83 | border-color: #8f959b; 84 | } 85 | 86 | .hidden-checkbox { 87 | display: none; 88 | } 89 | .hidden-checkbox:checked + label.hidden-checkbox-label { 90 | background-color: #FFF; 91 | border-color: #0969DA; 92 | color: #0969DA; 93 | } 94 | 95 | /* text center helper */ 96 | .text-center { 97 | text-align: center; 98 | } 99 | -------------------------------------------------------------------------------- /popup/app.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Report Issue 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 45 | 46 | 47 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | -------------------------------------------------------------------------------- /popup/app.js: -------------------------------------------------------------------------------- 1 | 2 | const { Octokit } = require("@octokit/rest"); 3 | 4 | // When showing the settings screen 5 | Screen.onShow('settings', function ($screen) { 6 | 7 | // hook into save button click 8 | $screen.on('submit', '#settings-form', function (e) { 9 | e.preventDefault(); 10 | 11 | // save settings 12 | var token = $screen.find('#token').val(), 13 | org = $screen.find('#org').val(); 14 | Settings.set({ token: token, org: org }, function () { 15 | // & switch to report-issue screen 16 | Screen.show('report-issue'); 17 | }); 18 | }); 19 | }); 20 | 21 | // When showing the report-issue screen 22 | Screen.onShow('report-issue', function ($screen) { 23 | 24 | // get token 25 | Settings.get(function (store) { 26 | 27 | // lookup GitHub repos list 28 | const octokit = new Octokit({ auth: store.token }); 29 | 30 | const listRepos = store.org ? octokit.rest.repos.listForOrg : octokit.rest.repos.listForAuthenticatedUser; 31 | listRepos({ org: store.org }).then(({ data }) => { 32 | 33 | var orgs = {}; 34 | data.forEach(function (repo) { 35 | var orgName = repo.owner.login; 36 | orgs[orgName] = orgs[orgName] || []; 37 | orgs[orgName].push(repo); 38 | }); 39 | 40 | function buildList(orgs) { 41 | 42 | var list = Object.keys(orgs).map(function (org) { 43 | var options = orgs[org].map(function (repo) { 44 | return ''; 45 | }); 46 | return '' + options.join('') + ''; 47 | }); 48 | $screen.find('#repo').html(list.join('')); 49 | } 50 | 51 | if (! store.org) { 52 | buildList(orgs); 53 | } else { 54 | octokit.rest.repos.listForAuthenticatedUser().then(({ data }) => { 55 | 56 | data.forEach(function (repo) { 57 | var orgName = repo.owner.login; 58 | orgs[orgName] = orgs[orgName] || []; 59 | orgs[orgName].push(repo); 60 | }); 61 | 62 | buildList(orgs); 63 | }); 64 | } 65 | }); 66 | 67 | // projects only supported for org level 68 | if (! store.org) { 69 | $screen.find('#project-container').hide(); 70 | 71 | setTimeout(() => IssueForm.init($screen), 300); 72 | } else { 73 | octokit.graphql( 74 | `query listProjects($org: String!, $count: Int = 100, $query: String = "is:open") { 75 | organization(login: $org) { 76 | projectsV2 (first: $count, query: $query) { 77 | nodes { number, title } 78 | } 79 | } 80 | }`, 81 | { 82 | org: store.org, 83 | } 84 | ).then(data => { 85 | 86 | var projects = { 87 | v2: [], 88 | classic: [], 89 | }; 90 | data?.organization?.projectsV2?.nodes?.forEach(function (project) { 91 | projects.v2.push({ 92 | number: project.number, 93 | name: project.title 94 | }); 95 | }); 96 | data?.organization?.projects?.nodes?.forEach(function (project) { 97 | projects.classic.push(project); 98 | }); 99 | 100 | var list = Object.keys(projects).map(function (projectType) { 101 | var options = projects[projectType].map(function (project) { 102 | return ''; 103 | }); 104 | return options.length ? '' + options.join('') + '' : ''; 105 | }); 106 | $screen.find('#project').html('' + list.join('')); 107 | 108 | setTimeout(() => IssueForm.init($screen), 300); 109 | }); 110 | } 111 | 112 | // hookup config icon to switch to settings screen 113 | $screen.on('click', '#settings-link', function (e) { 114 | e.preventDefault(); 115 | Screen.show('settings', store); 116 | }); 117 | 118 | // hook into submit button click 119 | $screen.on('submit', '#report-issue-form', function (e) { 120 | e.preventDefault(); 121 | 122 | // gather fields 123 | var title = $screen.find('#title').val(), 124 | repo = $screen.find('#repo').val(), 125 | project = $screen.find('#project').val(), 126 | added_url = $screen.find('#added_url').prop('checked'), 127 | added_screenshot = $screen.find('#added_screenshot').prop('checked'), 128 | added_debug = $screen.find('#added_debug').prop('checked'), 129 | type_field = $screen.find('#type_field input[name="type"]:checked').val(), 130 | body = '', 131 | url = 'https://github.com/' + repo + '/issues/new?title=' + encodeURIComponent(title); 132 | 133 | // build up extra params (ref https://help.github.com/articles/about-automation-for-issues-and-pull-requests-with-query-parameters/) 134 | if (project) { 135 | url += '&projects=' + encodeURIComponent(project); 136 | } 137 | 138 | // redirect to new issue page for given repo 139 | chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) { 140 | 141 | // handle sending (delay until added additional data) 142 | var sendToGitHub = function () { 143 | if (body) { 144 | url += '&body=' + encodeURIComponent(body); 145 | } 146 | chrome.tabs.create({ 147 | url: url 148 | }); 149 | }; 150 | 151 | // add type/label + standard template ;D 152 | if (type_field) { 153 | url += '&labels=' + encodeURIComponent(type_field); 154 | 155 | if (type_field=='bug') { 156 | body += "### Issue description:\n"; 157 | body += "\n"; 158 | body += "As a User/Admin/Developer\n"; 159 | body += "When I \n"; 160 | body += "Currently it \n"; 161 | body += "While it should \n"; 162 | body += "Because \n"; 163 | body += "\n\n"; 164 | } 165 | else if (type_field=='enhancement') { 166 | body += "### Story:\n"; 167 | body += "\n"; 168 | body += "As a User/Admin/Developer\n"; 169 | body += "I want \n"; 170 | body += "So that \n"; 171 | body += "\n"; 172 | body += "### Requirements:\n"; 173 | body += "\n"; 174 | body += "- list them here\n"; 175 | body += "\n"; 176 | body += "### Tasks:\n"; 177 | body += "\n"; 178 | body += "- [ ] \n"; 179 | body += "- [ ] \n"; 180 | body += "- [ ] \n"; 181 | body += "\n\n"; 182 | } 183 | } 184 | 185 | // add url 186 | if (added_url) { 187 | body += "Reported from: " + tabs[0].url + "\n\n"; 188 | } 189 | 190 | // add debug data 191 | if (added_debug) { 192 | body += "### Debug details: \n"; 193 | body += "User-agent: " + navigator.userAgent + "\n"; 194 | body += "Cookies: " + navigator.cookieEnabled + " (DNT: " + navigator.doNotTrack + ")\n"; 195 | body += "Date/time: " + Date() + "\n"; 196 | body += "\n"; 197 | } 198 | 199 | // add screenshot link 200 | if (added_screenshot) { 201 | chrome.tabs.captureVisibleTab(function (imageUri) { 202 | body += "### Screenshot:\n\n"; 203 | body += "\n\n"; 204 | download(imageUri, 'screenshot.png'); 205 | setTimeout(sendToGitHub, 300); // small delay to allow download 206 | }); 207 | } else { 208 | sendToGitHub(); 209 | } 210 | }); 211 | 212 | }); 213 | 214 | }); 215 | 216 | }); 217 | 218 | // Check if a token is saved yet & show either settings to set it or the report-issue screen 219 | Settings.get(function (store) { 220 | if (! store || ! store.token) { 221 | Screen.show('settings', { 222 | token: '', 223 | org: '' 224 | }); 225 | } else { 226 | Screen.show('report-issue'); 227 | } 228 | }); 229 | 230 | -------------------------------------------------------------------------------- /popup/config.js.example: -------------------------------------------------------------------------------- 1 | Settings.setSecret('SET A RANDOM SECRET KEY HERE'); 2 | -------------------------------------------------------------------------------- /popup/fonts.css: -------------------------------------------------------------------------------- 1 | /* https://gwfh.mranftl.com/fonts/noto-sans?subsets=latin */ 2 | 3 | /* noto-sans-regular - latin */ 4 | @font-face { 5 | font-family: 'Noto Sans'; 6 | font-style: normal; 7 | font-weight: 400; 8 | src: local(''), 9 | url('./fonts/noto-sans-v27-latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ 10 | url('./fonts/noto-sans-v27-latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ 11 | } 12 | /* noto-sans-italic - latin */ 13 | @font-face { 14 | font-family: 'Noto Sans'; 15 | font-style: italic; 16 | font-weight: 400; 17 | src: local(''), 18 | url('./fonts/noto-sans-v27-latin-italic.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ 19 | url('./fonts/noto-sans-v27-latin-italic.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ 20 | } 21 | /* noto-sans-700 - latin */ 22 | @font-face { 23 | font-family: 'Noto Sans'; 24 | font-style: normal; 25 | font-weight: 700; 26 | src: local(''), 27 | url('./fonts/noto-sans-v27-latin-700.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ 28 | url('./fonts/noto-sans-v27-latin-700.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ 29 | } 30 | -------------------------------------------------------------------------------- /popup/fonts/noto-sans-v27-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/popup/fonts/noto-sans-v27-latin-700.woff -------------------------------------------------------------------------------- /popup/fonts/noto-sans-v27-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/popup/fonts/noto-sans-v27-latin-700.woff2 -------------------------------------------------------------------------------- /popup/fonts/noto-sans-v27-latin-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/popup/fonts/noto-sans-v27-latin-italic.woff -------------------------------------------------------------------------------- /popup/fonts/noto-sans-v27-latin-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/popup/fonts/noto-sans-v27-latin-italic.woff2 -------------------------------------------------------------------------------- /popup/fonts/noto-sans-v27-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/popup/fonts/noto-sans-v27-latin-regular.woff -------------------------------------------------------------------------------- /popup/fonts/noto-sans-v27-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stilliard/quick-add-github-issue-browser-extension/110494e03e090b68287c289391cb2048e62fb517/popup/fonts/noto-sans-v27-latin-regular.woff2 -------------------------------------------------------------------------------- /popup/images/github.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /popup/modules/hidden-checkbox.js: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // Handle accessability for our hidden checkboxs where only the label is shown 4 | // We use tabindex on them so users can tab to them 5 | // but we want users to be able to press enter or space to trigger a click 6 | // 7 | $('body').on('keypress', '.hidden-checkbox-label', function (e) { 8 | var enterKeyCode = 13, 9 | spaceKeyCode = 32; 10 | 11 | console.log('Pressed: ', e.which); 12 | 13 | if (e.which == enterKeyCode || e.which == spaceKeyCode) { 14 | e.preventDefault(); 15 | $(this).click(); 16 | } 17 | }); 18 | -------------------------------------------------------------------------------- /popup/modules/issue-form.js: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // Issue Form 4 | // 5 | // Restores field state & watches for changes to save state 6 | // 7 | 8 | window.IssueForm = (function () { 9 | 10 | var fields = {}; 11 | 12 | return { 13 | 14 | init: function ($screen) { 15 | 16 | chrome.storage.local.get(['fields'], function (result) { 17 | 18 | // restore field state 19 | if (result.fields) { 20 | fields = JSON.parse(result.fields); 21 | $screen.find('select').each(function () { 22 | var $input = $(this), 23 | val = fields[$input.attr('name')]; 24 | if (val != undefined) { 25 | $input.val(val).trigger('change'); 26 | } 27 | }); 28 | $screen.find('input[type="radio"]').each(function () { 29 | var $input = $(this), 30 | val = fields[$input.attr('name')]; 31 | if (val != undefined) { 32 | $input.filter('#' + val).prop('checked', true); 33 | } 34 | }); 35 | } 36 | 37 | // watch for field changes 38 | $screen.find('select').on('change', function () { 39 | var $input = $(this); 40 | fields[$input.attr('name')] = $input.val(); 41 | chrome.storage.local.set({ fields: JSON.stringify(fields) }); 42 | }); 43 | $screen.find('input[type="radio"]').on('change', function () { 44 | var $input = $(this); 45 | fields[$input.attr('name')] = $input.attr('id'); 46 | chrome.storage.local.set({ fields: JSON.stringify(fields) }); 47 | }); 48 | }); 49 | 50 | } 51 | 52 | } 53 | 54 | }()); 55 | -------------------------------------------------------------------------------- /popup/modules/screen.js: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // Screen 4 | // based on templates 5 | // 6 | 7 | window.Screen = (function () { 8 | 9 | var $el = $('#screen'), 10 | templates = null, 11 | showCallbacks = {}; 12 | 13 | // template handler 14 | function compileTemplate(source) { 15 | return function (context) { 16 | var html = source; 17 | $.each(context, function (k, v) { 18 | html = html.replace('{{' + k + '}}', v || ''); 19 | }); 20 | return html; 21 | }; 22 | } 23 | 24 | templates = { 25 | settings: compileTemplate($('#settings-template').html()), 26 | 'report-issue': compileTemplate($('#report-issue-template').html()) 27 | }; 28 | 29 | return { 30 | 31 | // show a specific template screen 32 | // @param {String} name 33 | show: function (name, context) { 34 | $el.html(templates[name](context)); 35 | 36 | // handle callback 37 | if (showCallbacks[name]) { 38 | showCallbacks[name]($el); 39 | } 40 | 41 | // support autofocus inside templates 42 | $el.find('[autofocus]').focus(); 43 | }, 44 | 45 | // callback for showing a specific screen 46 | // @param {String} name 47 | // @param {Function} callback run when it's shown 48 | onShow: function (name, callback) { 49 | showCallbacks[name] = callback; 50 | } 51 | } 52 | 53 | }()); 54 | -------------------------------------------------------------------------------- /popup/modules/settings.js: -------------------------------------------------------------------------------- 1 | 2 | // 3 | // Settings storage 4 | // e.g. for access token (used for auth to github api) & other settings 5 | // 6 | // ref https://developer.chrome.com/extensions/storage 7 | // 8 | 9 | window.Settings = (function () { 10 | 11 | var cachedData = null, 12 | secret = ''; 13 | 14 | function encrypt(data) { 15 | return window.CryptoJS.AES.encrypt(JSON.stringify(data), secret).toString(); 16 | } 17 | function decrypt(str) { 18 | var data = window.CryptoJS.AES.decrypt(str.toString(), secret).toString(window.CryptoJS.enc.Utf8); 19 | if (! data) return {}; 20 | return JSON.parse(data); 21 | } 22 | 23 | return { 24 | 25 | // set encryption secret 26 | setSecret: function (newSecret) { 27 | secret = newSecret; 28 | }, 29 | 30 | // get 31 | // @param {Function} callback gets given the settings Object 32 | get: function (callback) { 33 | if (cachedData) { 34 | callback(cachedData); 35 | return; 36 | } 37 | chrome.storage.local.get(['settings'], function (result) { 38 | if (! result.settings) { 39 | callback(null); 40 | return; 41 | } 42 | cachedData = decrypt(result.settings); 43 | callback(cachedData); 44 | }); 45 | }, 46 | 47 | // fast method to only check for cached version 48 | getCached: function() { 49 | return cachedData; 50 | }, 51 | 52 | // set 53 | // @param {Object} token 54 | // @param {Function} callback when it's finished saving 55 | set: function (settings, callback) { 56 | cachedData = settings; 57 | settings = encrypt(settings); 58 | chrome.storage.local.set({ settings: settings }, function (result) { 59 | callback(); 60 | }); 61 | } 62 | } 63 | 64 | }()); 65 | -------------------------------------------------------------------------------- /popup/vendor/crypto-js.min.js: -------------------------------------------------------------------------------- 1 | // https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js 2 | 3 | !function(t,e){"object"==typeof exports?module.exports=exports=e():"function"==typeof define&&define.amd?define([],e):t.CryptoJS=e()}(this,function(){var n,o,s,a,h,t,e,l,r,i,c,f,d,u,p,S,x,b,A,H,z,_,v,g,y,B,w,k,m,C,D,E,R,M,F,P,W,O,I,U=U||function(h){var i;if("undefined"!=typeof window&&window.crypto&&(i=window.crypto),"undefined"!=typeof self&&self.crypto&&(i=self.crypto),!(i=!(i=!(i="undefined"!=typeof globalThis&&globalThis.crypto?globalThis.crypto:i)&&"undefined"!=typeof window&&window.msCrypto?window.msCrypto:i)&&"undefined"!=typeof global&&global.crypto?global.crypto:i)&&"function"==typeof require)try{i=require("crypto")}catch(t){}var r=Object.create||function(t){return e.prototype=t,t=new e,e.prototype=null,t};function e(){}var t={},n=t.lib={},o=n.Base={extend:function(t){var e=r(this);return t&&e.mixIn(t),e.hasOwnProperty("init")&&this.init!==e.init||(e.init=function(){e.$super.init.apply(this,arguments)}),(e.init.prototype=e).$super=this,e},create:function(){var t=this.extend();return t.init.apply(t,arguments),t},init:function(){},mixIn:function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);t.hasOwnProperty("toString")&&(this.toString=t.toString)},clone:function(){return this.init.prototype.extend(this)}},l=n.WordArray=o.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:4*t.length},toString:function(t){return(t||c).stringify(this)},concat:function(t){var e=this.words,r=t.words,i=this.sigBytes,n=t.sigBytes;if(this.clamp(),i%4)for(var o=0;o>>2]>>>24-o%4*8&255;e[i+o>>>2]|=s<<24-(i+o)%4*8}else for(var c=0;c>>2]=r[c>>>2];return this.sigBytes+=n,this},clamp:function(){var t=this.words,e=this.sigBytes;t[e>>>2]&=4294967295<<32-e%4*8,t.length=h.ceil(e/4)},clone:function(){var t=o.clone.call(this);return t.words=this.words.slice(0),t},random:function(t){for(var e=[],r=0;r>>2]>>>24-n%4*8&255;i.push((o>>>4).toString(16)),i.push((15&o).toString(16))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>3]|=parseInt(t.substr(i,2),16)<<24-i%8*4;return new l.init(r,e/2)}},a=s.Latin1={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>24-n%4*8&255;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>2]|=(255&t.charCodeAt(i))<<24-i%4*8;return new l.init(r,e)}},f=s.Utf8={stringify:function(t){try{return decodeURIComponent(escape(a.stringify(t)))}catch(t){throw new Error("Malformed UTF-8 data")}},parse:function(t){return a.parse(unescape(encodeURIComponent(t)))}},d=n.BufferedBlockAlgorithm=o.extend({reset:function(){this._data=new l.init,this._nDataBytes=0},_append:function(t){"string"==typeof t&&(t=f.parse(t)),this._data.concat(t),this._nDataBytes+=t.sigBytes},_process:function(t){var e,r=this._data,i=r.words,n=r.sigBytes,o=this.blockSize,s=n/(4*o),c=(s=t?h.ceil(s):h.max((0|s)-this._minBufferSize,0))*o,n=h.min(4*c,n);if(c){for(var a=0;a>>32-e}function j(t,e,r,i){var n,o=this._iv;o?(n=o.slice(0),this._iv=void 0):n=this._prevBlock,i.encryptBlock(n,0);for(var s=0;s>24&255)?(r=t>>8&255,i=255&t,255===(e=t>>16&255)?(e=0,255===r?(r=0,255===i?i=0:++i):++r):++e,t=0,t+=e<<16,t+=r<<8,t+=i):t+=1<<24,t}function N(){for(var t=this._X,e=this._C,r=0;r<8;r++)E[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16;R[r]=((n*n>>>17)+n*o>>>15)+o*o^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=R[0]+(R[7]<<16|R[7]>>>16)+(R[6]<<16|R[6]>>>16)|0,t[1]=R[1]+(R[0]<<8|R[0]>>>24)+R[7]|0,t[2]=R[2]+(R[1]<<16|R[1]>>>16)+(R[0]<<16|R[0]>>>16)|0,t[3]=R[3]+(R[2]<<8|R[2]>>>24)+R[1]|0,t[4]=R[4]+(R[3]<<16|R[3]>>>16)+(R[2]<<16|R[2]>>>16)|0,t[5]=R[5]+(R[4]<<8|R[4]>>>24)+R[3]|0,t[6]=R[6]+(R[5]<<16|R[5]>>>16)+(R[4]<<16|R[4]>>>16)|0,t[7]=R[7]+(R[6]<<8|R[6]>>>24)+R[5]|0}function q(){for(var t=this._X,e=this._C,r=0;r<8;r++)O[r]=e[r];e[0]=e[0]+1295307597+this._b|0,e[1]=e[1]+3545052371+(e[0]>>>0>>0?1:0)|0,e[2]=e[2]+886263092+(e[1]>>>0>>0?1:0)|0,e[3]=e[3]+1295307597+(e[2]>>>0>>0?1:0)|0,e[4]=e[4]+3545052371+(e[3]>>>0>>0?1:0)|0,e[5]=e[5]+886263092+(e[4]>>>0>>0?1:0)|0,e[6]=e[6]+1295307597+(e[5]>>>0>>0?1:0)|0,e[7]=e[7]+3545052371+(e[6]>>>0>>0?1:0)|0,this._b=e[7]>>>0>>0?1:0;for(r=0;r<8;r++){var i=t[r]+e[r],n=65535&i,o=i>>>16;I[r]=((n*n>>>17)+n*o>>>15)+o*o^((4294901760&i)*i|0)+((65535&i)*i|0)}t[0]=I[0]+(I[7]<<16|I[7]>>>16)+(I[6]<<16|I[6]>>>16)|0,t[1]=I[1]+(I[0]<<8|I[0]>>>24)+I[7]|0,t[2]=I[2]+(I[1]<<16|I[1]>>>16)+(I[0]<<16|I[0]>>>16)|0,t[3]=I[3]+(I[2]<<8|I[2]>>>24)+I[1]|0,t[4]=I[4]+(I[3]<<16|I[3]>>>16)+(I[2]<<16|I[2]>>>16)|0,t[5]=I[5]+(I[4]<<8|I[4]>>>24)+I[3]|0,t[6]=I[6]+(I[5]<<16|I[5]>>>16)+(I[4]<<16|I[4]>>>16)|0,t[7]=I[7]+(I[6]<<8|I[6]>>>24)+I[5]|0}return F=(M=U).lib,n=F.Base,o=F.WordArray,(M=M.x64={}).Word=n.extend({init:function(t,e){this.high=t,this.low=e}}),M.WordArray=n.extend({init:function(t,e){t=this.words=t||[],this.sigBytes=null!=e?e:8*t.length},toX32:function(){for(var t=this.words,e=t.length,r=[],i=0;i>>2]|=t[i]<<24-i%4*8;s.call(this,r,e)}else s.apply(this,arguments)}).prototype=P),function(){var t=U,n=t.lib.WordArray,t=t.enc;t.Utf16=t.Utf16BE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535;i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=t.charCodeAt(i)<<16-i%2*16;return n.create(r,2*e)}};function s(t){return t<<8&4278255360|t>>>8&16711935}t.Utf16LE={stringify:function(t){for(var e=t.words,r=t.sigBytes,i=[],n=0;n>>2]>>>16-n%4*8&65535);i.push(String.fromCharCode(o))}return i.join("")},parse:function(t){for(var e=t.length,r=[],i=0;i>>1]|=s(t.charCodeAt(i)<<16-i%2*16);return n.create(r,2*e)}}}(),a=(w=U).lib.WordArray,w.enc.Base64={stringify:function(t){var e=t.words,r=t.sigBytes,i=this._map;t.clamp();for(var n=[],o=0;o>>2]>>>24-o%4*8&255)<<16|(e[o+1>>>2]>>>24-(o+1)%4*8&255)<<8|e[o+2>>>2]>>>24-(o+2)%4*8&255,c=0;c<4&&o+.75*c>>6*(3-c)&63));var a=i.charAt(64);if(a)for(;n.length%4;)n.push(a);return n.join("")},parse:function(t){var e=t.length,r=this._map;if(!(i=this._reverseMap))for(var i=this._reverseMap=[],n=0;n>>6-o%4*2,c=s|c,i[n>>>2]|=c<<24-n%4*8,n++)}return a.create(i,n)}(t,e,i)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="},h=(F=U).lib.WordArray,F.enc.Base64url={stringify:function(t,e=!0){var r=t.words,i=t.sigBytes,n=e?this._safe_map:this._map;t.clamp();for(var o=[],s=0;s>>2]>>>24-s%4*8&255)<<16|(r[s+1>>>2]>>>24-(s+1)%4*8&255)<<8|r[s+2>>>2]>>>24-(s+2)%4*8&255,a=0;a<4&&s+.75*a>>6*(3-a)&63));var h=n.charAt(64);if(h)for(;o.length%4;)o.push(h);return o.join("")},parse:function(t,e=!0){var r=t.length,i=e?this._safe_map:this._map;if(!(n=this._reverseMap))for(var n=this._reverseMap=[],o=0;o>>6-o%4*2,c=s|c,i[n>>>2]|=c<<24-n%4*8,n++)}return h.create(i,n)}(t,r,n)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",_safe_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"},function(a){var t=U,e=t.lib,r=e.WordArray,i=e.Hasher,e=t.algo,A=[];!function(){for(var t=0;t<64;t++)A[t]=4294967296*a.abs(a.sin(t+1))|0}();e=e.MD5=i.extend({_doReset:function(){this._hash=new r.init([1732584193,4023233417,2562383102,271733878])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}var o=this._hash.words,s=t[e+0],c=t[e+1],a=t[e+2],h=t[e+3],l=t[e+4],f=t[e+5],d=t[e+6],u=t[e+7],p=t[e+8],_=t[e+9],y=t[e+10],v=t[e+11],g=t[e+12],B=t[e+13],w=t[e+14],k=t[e+15],m=H(m=o[0],b=o[1],x=o[2],S=o[3],s,7,A[0]),S=H(S,m,b,x,c,12,A[1]),x=H(x,S,m,b,a,17,A[2]),b=H(b,x,S,m,h,22,A[3]);m=H(m,b,x,S,l,7,A[4]),S=H(S,m,b,x,f,12,A[5]),x=H(x,S,m,b,d,17,A[6]),b=H(b,x,S,m,u,22,A[7]),m=H(m,b,x,S,p,7,A[8]),S=H(S,m,b,x,_,12,A[9]),x=H(x,S,m,b,y,17,A[10]),b=H(b,x,S,m,v,22,A[11]),m=H(m,b,x,S,g,7,A[12]),S=H(S,m,b,x,B,12,A[13]),x=H(x,S,m,b,w,17,A[14]),m=z(m,b=H(b,x,S,m,k,22,A[15]),x,S,c,5,A[16]),S=z(S,m,b,x,d,9,A[17]),x=z(x,S,m,b,v,14,A[18]),b=z(b,x,S,m,s,20,A[19]),m=z(m,b,x,S,f,5,A[20]),S=z(S,m,b,x,y,9,A[21]),x=z(x,S,m,b,k,14,A[22]),b=z(b,x,S,m,l,20,A[23]),m=z(m,b,x,S,_,5,A[24]),S=z(S,m,b,x,w,9,A[25]),x=z(x,S,m,b,h,14,A[26]),b=z(b,x,S,m,p,20,A[27]),m=z(m,b,x,S,B,5,A[28]),S=z(S,m,b,x,a,9,A[29]),x=z(x,S,m,b,u,14,A[30]),m=C(m,b=z(b,x,S,m,g,20,A[31]),x,S,f,4,A[32]),S=C(S,m,b,x,p,11,A[33]),x=C(x,S,m,b,v,16,A[34]),b=C(b,x,S,m,w,23,A[35]),m=C(m,b,x,S,c,4,A[36]),S=C(S,m,b,x,l,11,A[37]),x=C(x,S,m,b,u,16,A[38]),b=C(b,x,S,m,y,23,A[39]),m=C(m,b,x,S,B,4,A[40]),S=C(S,m,b,x,s,11,A[41]),x=C(x,S,m,b,h,16,A[42]),b=C(b,x,S,m,d,23,A[43]),m=C(m,b,x,S,_,4,A[44]),S=C(S,m,b,x,g,11,A[45]),x=C(x,S,m,b,k,16,A[46]),m=D(m,b=C(b,x,S,m,a,23,A[47]),x,S,s,6,A[48]),S=D(S,m,b,x,u,10,A[49]),x=D(x,S,m,b,w,15,A[50]),b=D(b,x,S,m,f,21,A[51]),m=D(m,b,x,S,g,6,A[52]),S=D(S,m,b,x,h,10,A[53]),x=D(x,S,m,b,y,15,A[54]),b=D(b,x,S,m,c,21,A[55]),m=D(m,b,x,S,p,6,A[56]),S=D(S,m,b,x,k,10,A[57]),x=D(x,S,m,b,d,15,A[58]),b=D(b,x,S,m,B,21,A[59]),m=D(m,b,x,S,l,6,A[60]),S=D(S,m,b,x,v,10,A[61]),x=D(x,S,m,b,a,15,A[62]),b=D(b,x,S,m,_,21,A[63]),o[0]=o[0]+m|0,o[1]=o[1]+b|0,o[2]=o[2]+x|0,o[3]=o[3]+S|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32;var n=a.floor(r/4294967296),r=r;e[15+(64+i>>>9<<4)]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8),e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var e=this._hash,o=e.words,s=0;s<4;s++){var c=o[s];o[s]=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8)}return e},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});function H(t,e,r,i,n,o,s){s=t+(e&r|~e&i)+n+s;return(s<>>32-o)+e}function z(t,e,r,i,n,o,s){s=t+(e&i|r&~i)+n+s;return(s<>>32-o)+e}function C(t,e,r,i,n,o,s){s=t+(e^r^i)+n+s;return(s<>>32-o)+e}function D(t,e,r,i,n,o,s){s=t+(r^(e|~i))+n+s;return(s<>>32-o)+e}t.MD5=i._createHelper(e),t.HmacMD5=i._createHmacHelper(e)}(Math),P=(M=U).lib,t=P.WordArray,e=P.Hasher,P=M.algo,l=[],P=P.SHA1=e.extend({_doReset:function(){this._hash=new t.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=0;a<80;a++){a<16?l[a]=0|t[e+a]:(h=l[a-3]^l[a-8]^l[a-14]^l[a-16],l[a]=h<<1|h>>>31);var h=(i<<5|i>>>27)+c+l[a];h+=a<20?1518500249+(n&o|~n&s):a<40?1859775393+(n^o^s):a<60?(n&o|n&s|o&s)-1894007588:(n^o^s)-899497514,c=s,s=o,o=n<<30|n>>>2,n=i,i=h}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=Math.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t}}),M.SHA1=e._createHelper(P),M.HmacSHA1=e._createHmacHelper(P),function(n){var t=U,e=t.lib,r=e.WordArray,i=e.Hasher,e=t.algo,o=[],p=[];!function(){function t(t){return 4294967296*(t-(0|t))|0}for(var e=2,r=0;r<64;)!function(t){for(var e=n.sqrt(t),r=2;r<=e;r++)if(!(t%r))return;return 1}(e)||(r<8&&(o[r]=t(n.pow(e,.5))),p[r]=t(n.pow(e,1/3)),r++),e++}();var _=[],e=e.SHA256=i.extend({_doReset:function(){this._hash=new r.init(o.slice(0))},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=0;f<64;f++){f<16?_[f]=0|t[e+f]:(d=_[f-15],u=_[f-2],_[f]=((d<<25|d>>>7)^(d<<14|d>>>18)^d>>>3)+_[f-7]+((u<<15|u>>>17)^(u<<13|u>>>19)^u>>>10)+_[f-16]);var d=i&n^i&o^n&o,u=l+((c<<26|c>>>6)^(c<<21|c>>>11)^(c<<7|c>>>25))+(c&a^~c&h)+p[f]+_[f],l=h,h=a,a=c,c=s+u|0,s=o,o=n,n=i,i=u+(((i<<30|i>>>2)^(i<<19|i>>>13)^(i<<10|i>>>22))+d)|0}r[0]=r[0]+i|0,r[1]=r[1]+n|0,r[2]=r[2]+o|0,r[3]=r[3]+s|0,r[4]=r[4]+c|0,r[5]=r[5]+a|0,r[6]=r[6]+h|0,r[7]=r[7]+l|0},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=n.floor(r/4294967296),e[15+(64+i>>>9<<4)]=r,t.sigBytes=4*e.length,this._process(),this._hash},clone:function(){var t=i.clone.call(this);return t._hash=this._hash.clone(),t}});t.SHA256=i._createHelper(e),t.HmacSHA256=i._createHmacHelper(e)}(Math),r=(w=U).lib.WordArray,F=w.algo,i=F.SHA256,F=F.SHA224=i.extend({_doReset:function(){this._hash=new r.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var t=i._doFinalize.call(this);return t.sigBytes-=4,t}}),w.SHA224=i._createHelper(F),w.HmacSHA224=i._createHmacHelper(F),function(){var t=U,e=t.lib.Hasher,r=t.x64,i=r.Word,n=r.WordArray,r=t.algo;function o(){return i.create.apply(i,arguments)}var t1=[o(1116352408,3609767458),o(1899447441,602891725),o(3049323471,3964484399),o(3921009573,2173295548),o(961987163,4081628472),o(1508970993,3053834265),o(2453635748,2937671579),o(2870763221,3664609560),o(3624381080,2734883394),o(310598401,1164996542),o(607225278,1323610764),o(1426881987,3590304994),o(1925078388,4068182383),o(2162078206,991336113),o(2614888103,633803317),o(3248222580,3479774868),o(3835390401,2666613458),o(4022224774,944711139),o(264347078,2341262773),o(604807628,2007800933),o(770255983,1495990901),o(1249150122,1856431235),o(1555081692,3175218132),o(1996064986,2198950837),o(2554220882,3999719339),o(2821834349,766784016),o(2952996808,2566594879),o(3210313671,3203337956),o(3336571891,1034457026),o(3584528711,2466948901),o(113926993,3758326383),o(338241895,168717936),o(666307205,1188179964),o(773529912,1546045734),o(1294757372,1522805485),o(1396182291,2643833823),o(1695183700,2343527390),o(1986661051,1014477480),o(2177026350,1206759142),o(2456956037,344077627),o(2730485921,1290863460),o(2820302411,3158454273),o(3259730800,3505952657),o(3345764771,106217008),o(3516065817,3606008344),o(3600352804,1432725776),o(4094571909,1467031594),o(275423344,851169720),o(430227734,3100823752),o(506948616,1363258195),o(659060556,3750685593),o(883997877,3785050280),o(958139571,3318307427),o(1322822218,3812723403),o(1537002063,2003034995),o(1747873779,3602036899),o(1955562222,1575990012),o(2024104815,1125592928),o(2227730452,2716904306),o(2361852424,442776044),o(2428436474,593698344),o(2756734187,3733110249),o(3204031479,2999351573),o(3329325298,3815920427),o(3391569614,3928383900),o(3515267271,566280711),o(3940187606,3454069534),o(4118630271,4000239992),o(116418474,1914138554),o(174292421,2731055270),o(289380356,3203993006),o(460393269,320620315),o(685471733,587496836),o(852142971,1086792851),o(1017036298,365543100),o(1126000580,2618297676),o(1288033470,3409855158),o(1501505948,4234509866),o(1607167915,987167468),o(1816402316,1246189591)],e1=[];!function(){for(var t=0;t<80;t++)e1[t]=o()}();r=r.SHA512=e.extend({_doReset:function(){this._hash=new n.init([new i.init(1779033703,4089235720),new i.init(3144134277,2227873595),new i.init(1013904242,4271175723),new i.init(2773480762,1595750129),new i.init(1359893119,2917565137),new i.init(2600822924,725511199),new i.init(528734635,4215389547),new i.init(1541459225,327033209)])},_doProcessBlock:function(t,e){for(var r=this._hash.words,i=r[0],n=r[1],o=r[2],s=r[3],c=r[4],a=r[5],h=r[6],l=r[7],f=i.high,d=i.low,u=n.high,p=n.low,_=o.high,y=o.low,v=s.high,g=s.low,B=c.high,w=c.low,k=a.high,m=a.low,S=h.high,x=h.low,b=l.high,r=l.low,A=f,H=d,z=u,C=p,D=_,E=y,R=v,M=g,F=B,P=w,W=k,O=m,I=S,U=x,K=b,X=r,L=0;L<80;L++){var j,T,N=e1[L];L<16?(T=N.high=0|t[e+2*L],j=N.low=0|t[e+2*L+1]):($=(q=e1[L-15]).high,J=q.low,G=(Q=e1[L-2]).high,V=Q.low,Z=(Y=e1[L-7]).high,q=Y.low,Y=(Q=e1[L-16]).high,T=(T=(($>>>1|J<<31)^($>>>8|J<<24)^$>>>7)+Z+((j=(Z=(J>>>1|$<<31)^(J>>>8|$<<24)^(J>>>7|$<<25))+q)>>>0>>0?1:0))+((G>>>19|V<<13)^(G<<3|V>>>29)^G>>>6)+((j+=J=(V>>>19|G<<13)^(V<<3|G>>>29)^(V>>>6|G<<26))>>>0>>0?1:0),j+=$=Q.low,N.high=T=T+Y+(j>>>0<$>>>0?1:0),N.low=j);var q=F&W^~F&I,Z=P&O^~P&U,V=A&z^A&D^z&D,G=(H>>>28|A<<4)^(H<<30|A>>>2)^(H<<25|A>>>7),J=t1[L],Q=J.high,Y=J.low,$=X+((P>>>14|F<<18)^(P>>>18|F<<14)^(P<<23|F>>>9)),N=K+((F>>>14|P<<18)^(F>>>18|P<<14)^(F<<23|P>>>9))+($>>>0>>0?1:0),J=G+(H&C^H&E^C&E),K=I,X=U,I=W,U=O,W=F,O=P,F=R+(N=(N=(N=N+q+(($=$+Z)>>>0>>0?1:0))+Q+(($=$+Y)>>>0>>0?1:0))+T+(($=$+j)>>>0>>0?1:0))+((P=M+$|0)>>>0>>0?1:0)|0,R=D,M=E,D=z,E=C,z=A,C=H,A=N+(((A>>>28|H<<4)^(A<<30|H>>>2)^(A<<25|H>>>7))+V+(J>>>0>>0?1:0))+((H=$+J|0)>>>0<$>>>0?1:0)|0}d=i.low=d+H,i.high=f+A+(d>>>0>>0?1:0),p=n.low=p+C,n.high=u+z+(p>>>0>>0?1:0),y=o.low=y+E,o.high=_+D+(y>>>0>>0?1:0),g=s.low=g+M,s.high=v+R+(g>>>0>>0?1:0),w=c.low=w+P,c.high=B+F+(w>>>0

>>0?1:0),m=a.low=m+O,a.high=k+W+(m>>>0>>0?1:0),x=h.low=x+U,h.high=S+I+(x>>>0>>0?1:0),r=l.low=r+X,l.high=b+K+(r>>>0>>0?1:0)},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;return e[i>>>5]|=128<<24-i%32,e[30+(128+i>>>10<<5)]=Math.floor(r/4294967296),e[31+(128+i>>>10<<5)]=r,t.sigBytes=4*e.length,this._process(),this._hash.toX32()},clone:function(){var t=e.clone.call(this);return t._hash=this._hash.clone(),t},blockSize:32});t.SHA512=e._createHelper(r),t.HmacSHA512=e._createHmacHelper(r)}(),P=(M=U).x64,c=P.Word,f=P.WordArray,P=M.algo,d=P.SHA512,P=P.SHA384=d.extend({_doReset:function(){this._hash=new f.init([new c.init(3418070365,3238371032),new c.init(1654270250,914150663),new c.init(2438529370,812702999),new c.init(355462360,4144912697),new c.init(1731405415,4290775857),new c.init(2394180231,1750603025),new c.init(3675008525,1694076839),new c.init(1203062813,3204075428)])},_doFinalize:function(){var t=d._doFinalize.call(this);return t.sigBytes-=16,t}}),M.SHA384=d._createHelper(P),M.HmacSHA384=d._createHmacHelper(P),function(l){var t=U,e=t.lib,f=e.WordArray,i=e.Hasher,d=t.x64.Word,e=t.algo,A=[],H=[],z=[];!function(){for(var t=1,e=0,r=0;r<24;r++){A[t+5*e]=(r+1)*(r+2)/2%64;var i=(2*t+3*e)%5;t=e%5,e=i}for(t=0;t<5;t++)for(e=0;e<5;e++)H[t+5*e]=e+(2*t+3*e)%5*5;for(var n=1,o=0;o<24;o++){for(var s,c=0,a=0,h=0;h<7;h++)1&n&&((s=(1<>>24)|4278255360&(o<<24|o>>>8);(m=r[n]).high^=s=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),m.low^=o}for(var c=0;c<24;c++){for(var a=0;a<5;a++){for(var h=0,l=0,f=0;f<5;f++)h^=(m=r[a+5*f]).high,l^=m.low;var d=C[a];d.high=h,d.low=l}for(a=0;a<5;a++)for(var u=C[(a+4)%5],p=C[(a+1)%5],_=p.high,p=p.low,h=u.high^(_<<1|p>>>31),l=u.low^(p<<1|_>>>31),f=0;f<5;f++)(m=r[a+5*f]).high^=h,m.low^=l;for(var y=1;y<25;y++){var v=(m=r[y]).high,g=m.low,B=A[y];l=B<32?(h=v<>>32-B,g<>>32-B):(h=g<>>64-B,v<>>64-B);B=C[H[y]];B.high=h,B.low=l}var w=C[0],k=r[0];w.high=k.high,w.low=k.low;for(a=0;a<5;a++)for(f=0;f<5;f++){var m=r[y=a+5*f],S=C[y],x=C[(a+1)%5+5*f],b=C[(a+2)%5+5*f];m.high=S.high^~x.high&b.high,m.low=S.low^~x.low&b.low}m=r[0],k=z[c];m.high^=k.high,m.low^=k.low}},_doFinalize:function(){var t=this._data,e=t.words,r=(this._nDataBytes,8*t.sigBytes),i=32*this.blockSize;e[r>>>5]|=1<<24-r%32,e[(l.ceil((1+r)/i)*i>>>5)-1]|=128,t.sigBytes=4*e.length,this._process();for(var n=this._state,e=this.cfg.outputLength/8,o=e/8,s=[],c=0;c>>24)|4278255360&(h<<24|h>>>8);s.push(a=16711935&(a<<8|a>>>24)|4278255360&(a<<24|a>>>8)),s.push(h)}return new f.init(s,e)},clone:function(){for(var t=i.clone.call(this),e=t._state=this._state.slice(0),r=0;r<25;r++)e[r]=e[r].clone();return t}});t.SHA3=i._createHelper(e),t.HmacSHA3=i._createHmacHelper(e)}(Math),Math,F=(w=U).lib,u=F.WordArray,p=F.Hasher,F=w.algo,S=u.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),x=u.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),b=u.create([11,14,15,12,5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),A=u.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),H=u.create([0,1518500249,1859775393,2400959708,2840853838]),z=u.create([1352829926,1548603684,1836072691,2053994217,0]),F=F.RIPEMD160=p.extend({_doReset:function(){this._hash=u.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(t,e){for(var r=0;r<16;r++){var i=e+r,n=t[i];t[i]=16711935&(n<<8|n>>>24)|4278255360&(n<<24|n>>>8)}for(var o,s,c,a,h,l,f=this._hash.words,d=H.words,u=z.words,p=S.words,_=x.words,y=b.words,v=A.words,g=o=f[0],B=s=f[1],w=c=f[2],k=a=f[3],m=h=f[4],r=0;r<80;r+=1)l=o+t[e+p[r]]|0,l+=r<16?(s^c^a)+d[0]:r<32?K(s,c,a)+d[1]:r<48?((s|~c)^a)+d[2]:r<64?X(s,c,a)+d[3]:(s^(c|~a))+d[4],l=(l=L(l|=0,y[r]))+h|0,o=h,h=a,a=L(c,10),c=s,s=l,l=g+t[e+_[r]]|0,l+=r<16?(B^(w|~k))+u[0]:r<32?X(B,w,k)+u[1]:r<48?((B|~w)^k)+u[2]:r<64?K(B,w,k)+u[3]:(B^w^k)+u[4],l=(l=L(l|=0,v[r]))+m|0,g=m,m=k,k=L(w,10),w=B,B=l;l=f[1]+c+k|0,f[1]=f[2]+a+m|0,f[2]=f[3]+h+g|0,f[3]=f[4]+o+B|0,f[4]=f[0]+s+w|0,f[0]=l},_doFinalize:function(){var t=this._data,e=t.words,r=8*this._nDataBytes,i=8*t.sigBytes;e[i>>>5]|=128<<24-i%32,e[14+(64+i>>>9<<4)]=16711935&(r<<8|r>>>24)|4278255360&(r<<24|r>>>8),t.sigBytes=4*(e.length+1),this._process();for(var e=this._hash,n=e.words,o=0;o<5;o++){var s=n[o];n[o]=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8)}return e},clone:function(){var t=p.clone.call(this);return t._hash=this._hash.clone(),t}}),w.RIPEMD160=p._createHelper(F),w.HmacRIPEMD160=p._createHmacHelper(F),P=(M=U).lib.Base,_=M.enc.Utf8,M.algo.HMAC=P.extend({init:function(t,e){t=this._hasher=new t.init,"string"==typeof e&&(e=_.parse(e));var r=t.blockSize,i=4*r;(e=e.sigBytes>i?t.finalize(e):e).clamp();for(var t=this._oKey=e.clone(),e=this._iKey=e.clone(),n=t.words,o=e.words,s=0;s>>2];t.sigBytes-=e}},d=(e.BlockCipher=a.extend({cfg:a.cfg.extend({mode:n,padding:l}),reset:function(){var t;a.reset.call(this);var e=this.cfg,r=e.iv,e=e.mode;this._xformMode==this._ENC_XFORM_MODE?t=e.createEncryptor:(t=e.createDecryptor,this._minBufferSize=1),this._mode&&this._mode.__creator==t?this._mode.init(this,r&&r.words):(this._mode=t.call(e,this,r&&r.words),this._mode.__creator=t)},_doProcessBlock:function(t,e){this._mode.processBlock(t,e)},_doFinalize:function(){var t,e=this.cfg.padding;return this._xformMode==this._ENC_XFORM_MODE?(e.pad(this._data,this.blockSize),t=this._process(!0)):(t=this._process(!0),e.unpad(t)),t},blockSize:4}),e.CipherParams=r.extend({init:function(t){this.mixIn(t)},toString:function(t){return(t||this.formatter).stringify(this)}})),l=(t.format={}).OpenSSL={stringify:function(t){var e=t.ciphertext,t=t.salt,e=t?s.create([1398893684,1701076831]).concat(t).concat(e):e;return e.toString(o)},parse:function(t){var e,r=o.parse(t),t=r.words;return 1398893684==t[0]&&1701076831==t[1]&&(e=s.create(t.slice(2,4)),t.splice(0,4),r.sigBytes-=16),d.create({ciphertext:r,salt:e})}},u=e.SerializableCipher=r.extend({cfg:r.extend({format:l}),encrypt:function(t,e,r,i){i=this.cfg.extend(i);var n=t.createEncryptor(r,i),e=n.finalize(e),n=n.cfg;return d.create({ciphertext:e,key:r,iv:n.iv,algorithm:t,mode:n.mode,padding:n.padding,blockSize:t.blockSize,formatter:i.format})},decrypt:function(t,e,r,i){return i=this.cfg.extend(i),e=this._parse(e,i.format),t.createDecryptor(r,i).finalize(e.ciphertext)},_parse:function(t,e){return"string"==typeof t?e.parse(t,this):t}}),t=(t.kdf={}).OpenSSL={execute:function(t,e,r,i){i=i||s.random(8);t=c.create({keySize:e+r}).compute(t,i),r=s.create(t.words.slice(e),4*r);return t.sigBytes=4*e,d.create({key:t,iv:r,salt:i})}},p=e.PasswordBasedCipher=u.extend({cfg:u.cfg.extend({kdf:t}),encrypt:function(t,e,r,i){r=(i=this.cfg.extend(i)).kdf.execute(r,t.keySize,t.ivSize);i.iv=r.iv;i=u.encrypt.call(this,t,e,r.key,i);return i.mixIn(r),i},decrypt:function(t,e,r,i){i=this.cfg.extend(i),e=this._parse(e,i.format);r=i.kdf.execute(r,t.keySize,t.ivSize,e.salt);return i.iv=r.iv,u.decrypt.call(this,t,e,r.key,i)}})}(),U.mode.CFB=((F=U.lib.BlockCipherMode.extend()).Encryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize;j.call(this,t,e,i,r),this._prevBlock=t.slice(e,e+i)}}),F.Decryptor=F.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=t.slice(e,e+i);j.call(this,t,e,i,r),this._prevBlock=n}}),F),U.mode.CTR=(M=U.lib.BlockCipherMode.extend(),P=M.Encryptor=M.extend({processBlock:function(t,e){var r=this._cipher,i=r.blockSize,n=this._iv,o=this._counter;n&&(o=this._counter=n.slice(0),this._iv=void 0);var s=o.slice(0);r.encryptBlock(s,0),o[i-1]=o[i-1]+1|0;for(var c=0;c>>2]|=e<<24-r%4*8,t.sigBytes+=e},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso10126={pad:function(t,e){e*=4,e-=t.sigBytes%e;t.concat(U.lib.WordArray.random(e-1)).concat(U.lib.WordArray.create([e<<24],1))},unpad:function(t){var e=255&t.words[t.sigBytes-1>>>2];t.sigBytes-=e}},U.pad.Iso97971={pad:function(t,e){t.concat(U.lib.WordArray.create([2147483648],1)),U.pad.ZeroPadding.pad(t,e)},unpad:function(t){U.pad.ZeroPadding.unpad(t),t.sigBytes--}},U.pad.ZeroPadding={pad:function(t,e){e*=4;t.clamp(),t.sigBytes+=e-(t.sigBytes%e||e)},unpad:function(t){for(var e=t.words,r=t.sigBytes-1,r=t.sigBytes-1;0<=r;r--)if(e[r>>>2]>>>24-r%4*8&255){t.sigBytes=r+1;break}}},U.pad.NoPadding={pad:function(){},unpad:function(){}},m=(P=U).lib.CipherParams,C=P.enc.Hex,P.format.Hex={stringify:function(t){return t.ciphertext.toString(C)},parse:function(t){t=C.parse(t);return m.create({ciphertext:t})}},function(){var t=U,e=t.lib.BlockCipher,r=t.algo,h=[],l=[],f=[],d=[],u=[],p=[],_=[],y=[],v=[],g=[];!function(){for(var t=[],e=0;e<256;e++)t[e]=e<128?e<<1:e<<1^283;for(var r=0,i=0,e=0;e<256;e++){var n=i^i<<1^i<<2^i<<3^i<<4;h[r]=n=n>>>8^255&n^99;var o=t[l[n]=r],s=t[o],c=t[s],a=257*t[n]^16843008*n;f[r]=a<<24|a>>>8,d[r]=a<<16|a>>>16,u[r]=a<<8|a>>>24,p[r]=a,_[n]=(a=16843009*c^65537*s^257*o^16843008*r)<<24|a>>>8,y[n]=a<<16|a>>>16,v[n]=a<<8|a>>>24,g[n]=a,r?(r=o^t[t[t[c^o]]],i^=t[t[i]]):r=i=1}}();var B=[0,1,2,4,8,16,32,64,128,27,54],r=r.AES=e.extend({_doReset:function(){if(!this._nRounds||this._keyPriorReset!==this._key){for(var t=this._keyPriorReset=this._key,e=t.words,r=t.sigBytes/4,i=4*(1+(this._nRounds=6+r)),n=this._keySchedule=[],o=0;o>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a]):(a=h[(a=a<<8|a>>>24)>>>24]<<24|h[a>>>16&255]<<16|h[a>>>8&255]<<8|h[255&a],a^=B[o/r|0]<<24),n[o]=n[o-r]^a);for(var s=this._invKeySchedule=[],c=0;c>>24]]^y[h[a>>>16&255]]^v[h[a>>>8&255]]^g[h[255&a]]}}},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._keySchedule,f,d,u,p,h)},decryptBlock:function(t,e){var r=t[e+1];t[e+1]=t[e+3],t[e+3]=r,this._doCryptBlock(t,e,this._invKeySchedule,_,y,v,g,l);r=t[e+1];t[e+1]=t[e+3],t[e+3]=r},_doCryptBlock:function(t,e,r,i,n,o,s,c){for(var a=this._nRounds,h=t[e]^r[0],l=t[e+1]^r[1],f=t[e+2]^r[2],d=t[e+3]^r[3],u=4,p=1;p>>24]^n[l>>>16&255]^o[f>>>8&255]^s[255&d]^r[u++],y=i[l>>>24]^n[f>>>16&255]^o[d>>>8&255]^s[255&h]^r[u++],v=i[f>>>24]^n[d>>>16&255]^o[h>>>8&255]^s[255&l]^r[u++],g=i[d>>>24]^n[h>>>16&255]^o[l>>>8&255]^s[255&f]^r[u++],h=_,l=y,f=v,d=g;_=(c[h>>>24]<<24|c[l>>>16&255]<<16|c[f>>>8&255]<<8|c[255&d])^r[u++],y=(c[l>>>24]<<24|c[f>>>16&255]<<16|c[d>>>8&255]<<8|c[255&h])^r[u++],v=(c[f>>>24]<<24|c[d>>>16&255]<<16|c[h>>>8&255]<<8|c[255&l])^r[u++],g=(c[d>>>24]<<24|c[h>>>16&255]<<16|c[l>>>8&255]<<8|c[255&f])^r[u++];t[e]=_,t[e+1]=y,t[e+2]=v,t[e+3]=g},keySize:8});t.AES=e._createHelper(r)}(),function(){var t=U,e=t.lib,i=e.WordArray,r=e.BlockCipher,e=t.algo,h=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],l=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],f=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],d=[{0:8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{0:1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{0:260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{0:2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{0:128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{0:268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{0:1048576,16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{0:134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],u=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],n=e.DES=r.extend({_doReset:function(){for(var t=this._key.words,e=[],r=0;r<56;r++){var i=h[r]-1;e[r]=t[i>>>5]>>>31-i%32&1}for(var n=this._subKeys=[],o=0;o<16;o++){for(var s=n[o]=[],c=f[o],r=0;r<24;r++)s[r/6|0]|=e[(l[r]-1+c)%28]<<31-r%6,s[4+(r/6|0)]|=e[28+(l[r+24]-1+c)%28]<<31-r%6;s[0]=s[0]<<1|s[0]>>>31;for(r=1;r<7;r++)s[r]=s[r]>>>4*(r-1)+3;s[7]=s[7]<<5|s[7]>>>27}for(var a=this._invSubKeys=[],r=0;r<16;r++)a[r]=n[15-r]},encryptBlock:function(t,e){this._doCryptBlock(t,e,this._subKeys)},decryptBlock:function(t,e){this._doCryptBlock(t,e,this._invSubKeys)},_doCryptBlock:function(t,e,r){this._lBlock=t[e],this._rBlock=t[e+1],p.call(this,4,252645135),p.call(this,16,65535),_.call(this,2,858993459),_.call(this,8,16711935),p.call(this,1,1431655765);for(var i=0;i<16;i++){for(var n=r[i],o=this._lBlock,s=this._rBlock,c=0,a=0;a<8;a++)c|=d[a][((s^n[a])&u[a])>>>0];this._lBlock=s,this._rBlock=o^c}var h=this._lBlock;this._lBlock=this._rBlock,this._rBlock=h,p.call(this,1,1431655765),_.call(this,8,16711935),_.call(this,2,858993459),p.call(this,16,65535),p.call(this,4,252645135),t[e]=this._lBlock,t[e+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});function p(t,e){e=(this._lBlock>>>t^this._rBlock)&e;this._rBlock^=e,this._lBlock^=e<>>t^this._lBlock)&e;this._lBlock^=e,this._rBlock^=e<192.");var e=t.slice(0,2),r=t.length<4?t.slice(0,2):t.slice(2,4),t=t.length<6?t.slice(0,2):t.slice(4,6);this._des1=n.createEncryptor(i.create(e)),this._des2=n.createEncryptor(i.create(r)),this._des3=n.createEncryptor(i.create(t))},encryptBlock:function(t,e){this._des1.encryptBlock(t,e),this._des2.decryptBlock(t,e),this._des3.encryptBlock(t,e)},decryptBlock:function(t,e){this._des3.decryptBlock(t,e),this._des2.encryptBlock(t,e),this._des1.decryptBlock(t,e)},keySize:6,ivSize:2,blockSize:2});t.TripleDES=r._createHelper(e)}(),function(){var t=U,e=t.lib.StreamCipher,r=t.algo,i=r.RC4=e.extend({_doReset:function(){for(var t=this._key,e=t.words,r=t.sigBytes,i=this._S=[],n=0;n<256;n++)i[n]=n;for(var n=0,o=0;n<256;n++){var s=n%r,s=e[s>>>2]>>>24-s%4*8&255,o=(o+i[n]+s)%256,s=i[n];i[n]=i[o],i[o]=s}this._i=this._j=0},_doProcessBlock:function(t,e){t[e]^=n.call(this)},keySize:8,ivSize:0});function n(){for(var t=this._S,e=this._i,r=this._j,i=0,n=0;n<4;n++){var r=(r+t[e=(e+1)%256])%256,o=t[e];t[e]=t[r],t[r]=o,i|=t[(t[e]+t[r])%256]<<24-8*n}return this._i=e,this._j=r,i}t.RC4=e._createHelper(i);r=r.RC4Drop=i.extend({cfg:i.cfg.extend({drop:192}),_doReset:function(){i._doReset.call(this);for(var t=this.cfg.drop;0>>24)|4278255360&(t[r]<<24|t[r]>>>8);for(var i=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],n=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],r=this._b=0;r<4;r++)N.call(this);for(r=0;r<8;r++)n[r]^=i[r+4&7];if(e){var o=e.words,s=o[0],c=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(c<<8|c>>>24)|4278255360&(c<<24|c>>>8),s=e>>>16|4294901760&o,c=o<<16|65535&e;n[0]^=e,n[1]^=s,n[2]^=o,n[3]^=c,n[4]^=e,n[5]^=s,n[6]^=o,n[7]^=c;for(r=0;r<4;r++)N.call(this)}},_doProcessBlock:function(t,e){var r=this._X;N.call(this),D[0]=r[0]^r[5]>>>16^r[3]<<16,D[1]=r[2]^r[7]>>>16^r[5]<<16,D[2]=r[4]^r[1]>>>16^r[7]<<16,D[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)D[i]=16711935&(D[i]<<8|D[i]>>>24)|4278255360&(D[i]<<24|D[i]>>>8),t[e+i]^=D[i]},blockSize:4,ivSize:2}),M.Rabbit=F._createHelper(P),F=(M=U).lib.StreamCipher,P=M.algo,W=[],O=[],I=[],P=P.RabbitLegacy=F.extend({_doReset:function(){for(var t=this._key.words,e=this.cfg.iv,r=this._X=[t[0],t[3]<<16|t[2]>>>16,t[1],t[0]<<16|t[3]>>>16,t[2],t[1]<<16|t[0]>>>16,t[3],t[2]<<16|t[1]>>>16],i=this._C=[t[2]<<16|t[2]>>>16,4294901760&t[0]|65535&t[1],t[3]<<16|t[3]>>>16,4294901760&t[1]|65535&t[2],t[0]<<16|t[0]>>>16,4294901760&t[2]|65535&t[3],t[1]<<16|t[1]>>>16,4294901760&t[3]|65535&t[0]],n=this._b=0;n<4;n++)q.call(this);for(n=0;n<8;n++)i[n]^=r[n+4&7];if(e){var o=e.words,s=o[0],t=o[1],e=16711935&(s<<8|s>>>24)|4278255360&(s<<24|s>>>8),o=16711935&(t<<8|t>>>24)|4278255360&(t<<24|t>>>8),s=e>>>16|4294901760&o,t=o<<16|65535&e;i[0]^=e,i[1]^=s,i[2]^=o,i[3]^=t,i[4]^=e,i[5]^=s,i[6]^=o,i[7]^=t;for(n=0;n<4;n++)q.call(this)}},_doProcessBlock:function(t,e){var r=this._X;q.call(this),W[0]=r[0]^r[5]>>>16^r[3]<<16,W[1]=r[2]^r[7]>>>16^r[5]<<16,W[2]=r[4]^r[1]>>>16^r[7]<<16,W[3]=r[6]^r[3]>>>16^r[1]<<16;for(var i=0;i<4;i++)W[i]=16711935&(W[i]<<8|W[i]>>>24)|4278255360&(W[i]<<24|W[i]>>>8),t[e+i]^=W[i]},blockSize:4,ivSize:2}),M.RabbitLegacy=F._createHelper(P),U}); 4 | -------------------------------------------------------------------------------- /popup/vendor/download2.js: -------------------------------------------------------------------------------- 1 | //download.js v3.0, by dandavis; 2008-2014. [CCBY2] see http://danml.com/download.html for tests/usage 2 | // v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime 3 | // v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs 4 | // v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support 5 | 6 | // data can be a string, Blob, File, or dataURL 7 | 8 | 9 | 10 | 11 | function download(data, strFileName, strMimeType) { 12 | 13 | var self = window, // this script is only for browsers anyway... 14 | u = "application/octet-stream", // this default mime also triggers iframe downloads 15 | m = strMimeType || u, 16 | x = data, 17 | D = document, 18 | a = D.createElement("a"), 19 | z = function(a){return String(a);}, 20 | 21 | 22 | B = self.Blob || self.MozBlob || self.WebKitBlob || z, 23 | BB = self.MSBlobBuilder || self.WebKitBlobBuilder || self.BlobBuilder, 24 | fn = strFileName || "download", 25 | blob, 26 | b, 27 | ua, 28 | fr; 29 | 30 | //if(typeof B.bind === 'function' ){ B=B.bind(self); } 31 | 32 | if(String(this)==="true"){ //reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callback 33 | x=[x, m]; 34 | m=x[0]; 35 | x=x[1]; 36 | } 37 | 38 | 39 | 40 | //go ahead and download dataURLs right away 41 | if(String(x).match(/^data\:[\w+\-]+\/[\w+\-]+[,;]/)){ 42 | return navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs: 43 | navigator.msSaveBlob(d2b(x), fn) : 44 | saver(x) ; // everyone else can save dataURLs un-processed 45 | }//end if dataURL passed? 46 | 47 | try{ 48 | 49 | blob = x instanceof B ? 50 | x : 51 | new B([x], {type: m}) ; 52 | }catch(y){ 53 | if(BB){ 54 | b = new BB(); 55 | b.append([x]); 56 | blob = b.getBlob(m); // the blob 57 | } 58 | 59 | } 60 | 61 | 62 | 63 | function d2b(u) { 64 | var p= u.split(/[:;,]/), 65 | t= p[1], 66 | dec= p[2] == "base64" ? atob : decodeURIComponent, 67 | bin= dec(p.pop()), 68 | mx= bin.length, 69 | i= 0, 70 | uia= new Uint8Array(mx); 71 | 72 | for(i;i]*>/, 16 | singleTagRE = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, 17 | tagExpanderRE = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, 18 | rootNodeRE = /^(?:body|html)$/i, 19 | capitalRE = /([A-Z])/g, 20 | 21 | // special attributes that should be get/set via method calls 22 | methodAttributes = ['val', 'css', 'html', 'text', 'data', 'width', 'height', 'offset'], 23 | 24 | adjacencyOperators = [ 'after', 'prepend', 'before', 'append' ], 25 | table = document.createElement('table'), 26 | tableRow = document.createElement('tr'), 27 | containers = { 28 | 'tr': document.createElement('tbody'), 29 | 'tbody': table, 'thead': table, 'tfoot': table, 30 | 'td': tableRow, 'th': tableRow, 31 | '*': document.createElement('div') 32 | }, 33 | readyRE = /complete|loaded|interactive/, 34 | simpleSelectorRE = /^[\w-]*$/, 35 | class2type = {}, 36 | toString = class2type.toString, 37 | zepto = {}, 38 | camelize, uniq, 39 | tempParent = document.createElement('div'), 40 | propMap = { 41 | 'tabindex': 'tabIndex', 42 | 'readonly': 'readOnly', 43 | 'for': 'htmlFor', 44 | 'class': 'className', 45 | 'maxlength': 'maxLength', 46 | 'cellspacing': 'cellSpacing', 47 | 'cellpadding': 'cellPadding', 48 | 'rowspan': 'rowSpan', 49 | 'colspan': 'colSpan', 50 | 'usemap': 'useMap', 51 | 'frameborder': 'frameBorder', 52 | 'contenteditable': 'contentEditable' 53 | }, 54 | isArray = Array.isArray || 55 | function(object){ return object instanceof Array } 56 | 57 | zepto.matches = function(element, selector) { 58 | if (!selector || !element || element.nodeType !== 1) return false 59 | var matchesSelector = element.matches || element.webkitMatchesSelector || 60 | element.mozMatchesSelector || element.oMatchesSelector || 61 | element.matchesSelector 62 | if (matchesSelector) return matchesSelector.call(element, selector) 63 | // fall back to performing a selector: 64 | var match, parent = element.parentNode, temp = !parent 65 | if (temp) (parent = tempParent).appendChild(element) 66 | match = ~zepto.qsa(parent, selector).indexOf(element) 67 | temp && tempParent.removeChild(element) 68 | return match 69 | } 70 | 71 | function type(obj) { 72 | return obj == null ? String(obj) : 73 | class2type[toString.call(obj)] || "object" 74 | } 75 | 76 | function isFunction(value) { return type(value) == "function" } 77 | function isWindow(obj) { return obj != null && obj == obj.window } 78 | function isDocument(obj) { return obj != null && obj.nodeType == obj.DOCUMENT_NODE } 79 | function isObject(obj) { return type(obj) == "object" } 80 | function isPlainObject(obj) { 81 | return isObject(obj) && !isWindow(obj) && Object.getPrototypeOf(obj) == Object.prototype 82 | } 83 | 84 | function likeArray(obj) { 85 | var length = !!obj && 'length' in obj && obj.length, 86 | type = $.type(obj) 87 | 88 | return 'function' != type && !isWindow(obj) && ( 89 | 'array' == type || length === 0 || 90 | (typeof length == 'number' && length > 0 && (length - 1) in obj) 91 | ) 92 | } 93 | 94 | function compact(array) { return filter.call(array, function(item){ return item != null }) } 95 | function flatten(array) { return array.length > 0 ? $.fn.concat.apply([], array) : array } 96 | camelize = function(str){ return str.replace(/-+(.)?/g, function(match, chr){ return chr ? chr.toUpperCase() : '' }) } 97 | function dasherize(str) { 98 | return str.replace(/::/g, '/') 99 | .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2') 100 | .replace(/([a-z\d])([A-Z])/g, '$1_$2') 101 | .replace(/_/g, '-') 102 | .toLowerCase() 103 | } 104 | uniq = function(array){ return filter.call(array, function(item, idx){ return array.indexOf(item) == idx }) } 105 | 106 | function classRE(name) { 107 | return name in classCache ? 108 | classCache[name] : (classCache[name] = new RegExp('(^|\\s)' + name + '(\\s|$)')) 109 | } 110 | 111 | function maybeAddPx(name, value) { 112 | return (typeof value == "number" && !cssNumber[dasherize(name)]) ? value + "px" : value 113 | } 114 | 115 | function defaultDisplay(nodeName) { 116 | var element, display 117 | if (!elementDisplay[nodeName]) { 118 | element = document.createElement(nodeName) 119 | document.body.appendChild(element) 120 | display = getComputedStyle(element, '').getPropertyValue("display") 121 | element.parentNode.removeChild(element) 122 | display == "none" && (display = "block") 123 | elementDisplay[nodeName] = display 124 | } 125 | return elementDisplay[nodeName] 126 | } 127 | 128 | function children(element) { 129 | return 'children' in element ? 130 | slice.call(element.children) : 131 | $.map(element.childNodes, function(node){ if (node.nodeType == 1) return node }) 132 | } 133 | 134 | function Z(dom, selector) { 135 | var i, len = dom ? dom.length : 0 136 | for (i = 0; i < len; i++) this[i] = dom[i] 137 | this.length = len 138 | this.selector = selector || '' 139 | } 140 | 141 | // `$.zepto.fragment` takes a html string and an optional tag name 142 | // to generate DOM nodes from the given html string. 143 | // The generated DOM nodes are returned as an array. 144 | // This function can be overridden in plugins for example to make 145 | // it compatible with browsers that don't support the DOM fully. 146 | zepto.fragment = function(html, name, properties) { 147 | var dom, nodes, container 148 | 149 | // A special case optimization for a single tag 150 | if (singleTagRE.test(html)) dom = $(document.createElement(RegExp.$1)) 151 | 152 | if (!dom) { 153 | if (html.replace) html = html.replace(tagExpanderRE, "<$1>") 154 | if (name === undefined) name = fragmentRE.test(html) && RegExp.$1 155 | if (!(name in containers)) name = '*' 156 | 157 | container = containers[name] 158 | container.innerHTML = '' + html 159 | dom = $.each(slice.call(container.childNodes), function(){ 160 | container.removeChild(this) 161 | }) 162 | } 163 | 164 | if (isPlainObject(properties)) { 165 | nodes = $(dom) 166 | $.each(properties, function(key, value) { 167 | if (methodAttributes.indexOf(key) > -1) nodes[key](value) 168 | else nodes.attr(key, value) 169 | }) 170 | } 171 | 172 | return dom 173 | } 174 | 175 | // `$.zepto.Z` swaps out the prototype of the given `dom` array 176 | // of nodes with `$.fn` and thus supplying all the Zepto functions 177 | // to the array. This method can be overridden in plugins. 178 | zepto.Z = function(dom, selector) { 179 | return new Z(dom, selector) 180 | } 181 | 182 | // `$.zepto.isZ` should return `true` if the given object is a Zepto 183 | // collection. This method can be overridden in plugins. 184 | zepto.isZ = function(object) { 185 | return object instanceof zepto.Z 186 | } 187 | 188 | // `$.zepto.init` is Zepto's counterpart to jQuery's `$.fn.init` and 189 | // takes a CSS selector and an optional context (and handles various 190 | // special cases). 191 | // This method can be overridden in plugins. 192 | zepto.init = function(selector, context) { 193 | var dom 194 | // If nothing given, return an empty Zepto collection 195 | if (!selector) return zepto.Z() 196 | // Optimize for string selectors 197 | else if (typeof selector == 'string') { 198 | selector = selector.trim() 199 | // If it's a html fragment, create nodes from it 200 | // Note: In both Chrome 21 and Firefox 15, DOM error 12 201 | // is thrown if the fragment doesn't begin with < 202 | if (selector[0] == '<' && fragmentRE.test(selector)) 203 | dom = zepto.fragment(selector, RegExp.$1, context), selector = null 204 | // If there's a context, create a collection on that context first, and select 205 | // nodes from there 206 | else if (context !== undefined) return $(context).find(selector) 207 | // If it's a CSS selector, use it to select nodes. 208 | else dom = zepto.qsa(document, selector) 209 | } 210 | // If a function is given, call it when the DOM is ready 211 | else if (isFunction(selector)) return $(document).ready(selector) 212 | // If a Zepto collection is given, just return it 213 | else if (zepto.isZ(selector)) return selector 214 | else { 215 | // normalize array if an array of nodes is given 216 | if (isArray(selector)) dom = compact(selector) 217 | // Wrap DOM nodes. 218 | else if (isObject(selector)) 219 | dom = [selector], selector = null 220 | // If it's a html fragment, create nodes from it 221 | else if (fragmentRE.test(selector)) 222 | dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null 223 | // If there's a context, create a collection on that context first, and select 224 | // nodes from there 225 | else if (context !== undefined) return $(context).find(selector) 226 | // And last but no least, if it's a CSS selector, use it to select nodes. 227 | else dom = zepto.qsa(document, selector) 228 | } 229 | // create a new Zepto collection from the nodes found 230 | return zepto.Z(dom, selector) 231 | } 232 | 233 | // `$` will be the base `Zepto` object. When calling this 234 | // function just call `$.zepto.init, which makes the implementation 235 | // details of selecting nodes and creating Zepto collections 236 | // patchable in plugins. 237 | $ = function(selector, context){ 238 | return zepto.init(selector, context) 239 | } 240 | 241 | function extend(target, source, deep) { 242 | for (key in source) 243 | if (deep && (isPlainObject(source[key]) || isArray(source[key]))) { 244 | if (isPlainObject(source[key]) && !isPlainObject(target[key])) 245 | target[key] = {} 246 | if (isArray(source[key]) && !isArray(target[key])) 247 | target[key] = [] 248 | extend(target[key], source[key], deep) 249 | } 250 | else if (source[key] !== undefined) target[key] = source[key] 251 | } 252 | 253 | // Copy all but undefined properties from one or more 254 | // objects to the `target` object. 255 | $.extend = function(target){ 256 | var deep, args = slice.call(arguments, 1) 257 | if (typeof target == 'boolean') { 258 | deep = target 259 | target = args.shift() 260 | } 261 | args.forEach(function(arg){ extend(target, arg, deep) }) 262 | return target 263 | } 264 | 265 | // `$.zepto.qsa` is Zepto's CSS selector implementation which 266 | // uses `document.querySelectorAll` and optimizes for some special cases, like `#id`. 267 | // This method can be overridden in plugins. 268 | zepto.qsa = function(element, selector){ 269 | var found, 270 | maybeID = selector[0] == '#', 271 | maybeClass = !maybeID && selector[0] == '.', 272 | nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked 273 | isSimple = simpleSelectorRE.test(nameOnly) 274 | return (element.getElementById && isSimple && maybeID) ? // Safari DocumentFragment doesn't have getElementById 275 | ( (found = element.getElementById(nameOnly)) ? [found] : [] ) : 276 | (element.nodeType !== 1 && element.nodeType !== 9 && element.nodeType !== 11) ? [] : 277 | slice.call( 278 | isSimple && !maybeID && element.getElementsByClassName ? // DocumentFragment doesn't have getElementsByClassName/TagName 279 | maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class 280 | element.getElementsByTagName(selector) : // Or a tag 281 | element.querySelectorAll(selector) // Or it's not simple, and we need to query all 282 | ) 283 | } 284 | 285 | function filtered(nodes, selector) { 286 | return selector == null ? $(nodes) : $(nodes).filter(selector) 287 | } 288 | 289 | $.contains = document.documentElement.contains ? 290 | function(parent, node) { 291 | return parent !== node && parent.contains(node) 292 | } : 293 | function(parent, node) { 294 | while (node && (node = node.parentNode)) 295 | if (node === parent) return true 296 | return false 297 | } 298 | 299 | function funcArg(context, arg, idx, payload) { 300 | return isFunction(arg) ? arg.call(context, idx, payload) : arg 301 | } 302 | 303 | function setAttribute(node, name, value) { 304 | value == null ? node.removeAttribute(name) : node.setAttribute(name, value) 305 | } 306 | 307 | // access className property while respecting SVGAnimatedString 308 | function className(node, value){ 309 | var klass = node.className || '', 310 | svg = klass && klass.baseVal !== undefined 311 | 312 | if (value === undefined) return svg ? klass.baseVal : klass 313 | svg ? (klass.baseVal = value) : (node.className = value) 314 | } 315 | 316 | // "true" => true 317 | // "false" => false 318 | // "null" => null 319 | // "42" => 42 320 | // "42.5" => 42.5 321 | // "08" => "08" 322 | // JSON => parse if valid 323 | // String => self 324 | function deserializeValue(value) { 325 | try { 326 | return value ? 327 | value == "true" || 328 | ( value == "false" ? false : 329 | value == "null" ? null : 330 | +value + "" == value ? +value : 331 | /^[\[\{]/.test(value) ? $.parseJSON(value) : 332 | value ) 333 | : value 334 | } catch(e) { 335 | return value 336 | } 337 | } 338 | 339 | $.type = type 340 | $.isFunction = isFunction 341 | $.isWindow = isWindow 342 | $.isArray = isArray 343 | $.isPlainObject = isPlainObject 344 | 345 | $.isEmptyObject = function(obj) { 346 | var name 347 | for (name in obj) return false 348 | return true 349 | } 350 | 351 | $.isNumeric = function(val) { 352 | var num = Number(val), type = typeof val 353 | return val != null && type != 'boolean' && 354 | (type != 'string' || val.length) && 355 | !isNaN(num) && isFinite(num) || false 356 | } 357 | 358 | $.inArray = function(elem, array, i){ 359 | return emptyArray.indexOf.call(array, elem, i) 360 | } 361 | 362 | $.camelCase = camelize 363 | $.trim = function(str) { 364 | return str == null ? "" : String.prototype.trim.call(str) 365 | } 366 | 367 | // plugin compatibility 368 | $.uuid = 0 369 | $.support = { } 370 | $.expr = { } 371 | $.noop = function() {} 372 | 373 | $.map = function(elements, callback){ 374 | var value, values = [], i, key 375 | if (likeArray(elements)) 376 | for (i = 0; i < elements.length; i++) { 377 | value = callback(elements[i], i) 378 | if (value != null) values.push(value) 379 | } 380 | else 381 | for (key in elements) { 382 | value = callback(elements[key], key) 383 | if (value != null) values.push(value) 384 | } 385 | return flatten(values) 386 | } 387 | 388 | $.each = function(elements, callback){ 389 | var i, key 390 | if (likeArray(elements)) { 391 | for (i = 0; i < elements.length; i++) 392 | if (callback.call(elements[i], i, elements[i]) === false) return elements 393 | } else { 394 | for (key in elements) 395 | if (callback.call(elements[key], key, elements[key]) === false) return elements 396 | } 397 | 398 | return elements 399 | } 400 | 401 | $.grep = function(elements, callback){ 402 | return filter.call(elements, callback) 403 | } 404 | 405 | if (window.JSON) $.parseJSON = JSON.parse 406 | 407 | // Populate the class2type map 408 | $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { 409 | class2type[ "[object " + name + "]" ] = name.toLowerCase() 410 | }) 411 | 412 | // Define methods that will be available on all 413 | // Zepto collections 414 | $.fn = { 415 | constructor: zepto.Z, 416 | length: 0, 417 | 418 | // Because a collection acts like an array 419 | // copy over these useful array functions. 420 | forEach: emptyArray.forEach, 421 | reduce: emptyArray.reduce, 422 | push: emptyArray.push, 423 | sort: emptyArray.sort, 424 | splice: emptyArray.splice, 425 | indexOf: emptyArray.indexOf, 426 | concat: function(){ 427 | var i, value, args = [] 428 | for (i = 0; i < arguments.length; i++) { 429 | value = arguments[i] 430 | args[i] = zepto.isZ(value) ? value.toArray() : value 431 | } 432 | return concat.apply(zepto.isZ(this) ? this.toArray() : this, args) 433 | }, 434 | 435 | // `map` and `slice` in the jQuery API work differently 436 | // from their array counterparts 437 | map: function(fn){ 438 | return $($.map(this, function(el, i){ return fn.call(el, i, el) })) 439 | }, 440 | slice: function(){ 441 | return $(slice.apply(this, arguments)) 442 | }, 443 | 444 | ready: function(callback){ 445 | // need to check if document.body exists for IE as that browser reports 446 | // document ready when it hasn't yet created the body element 447 | if (readyRE.test(document.readyState) && document.body) callback($) 448 | else document.addEventListener('DOMContentLoaded', function(){ callback($) }, false) 449 | return this 450 | }, 451 | get: function(idx){ 452 | return idx === undefined ? slice.call(this) : this[idx >= 0 ? idx : idx + this.length] 453 | }, 454 | toArray: function(){ return this.get() }, 455 | size: function(){ 456 | return this.length 457 | }, 458 | remove: function(){ 459 | return this.each(function(){ 460 | if (this.parentNode != null) 461 | this.parentNode.removeChild(this) 462 | }) 463 | }, 464 | each: function(callback){ 465 | emptyArray.every.call(this, function(el, idx){ 466 | return callback.call(el, idx, el) !== false 467 | }) 468 | return this 469 | }, 470 | filter: function(selector){ 471 | if (isFunction(selector)) return this.not(this.not(selector)) 472 | return $(filter.call(this, function(element){ 473 | return zepto.matches(element, selector) 474 | })) 475 | }, 476 | add: function(selector,context){ 477 | return $(uniq(this.concat($(selector,context)))) 478 | }, 479 | is: function(selector){ 480 | return this.length > 0 && zepto.matches(this[0], selector) 481 | }, 482 | not: function(selector){ 483 | var nodes=[] 484 | if (isFunction(selector) && selector.call !== undefined) 485 | this.each(function(idx){ 486 | if (!selector.call(this,idx)) nodes.push(this) 487 | }) 488 | else { 489 | var excludes = typeof selector == 'string' ? this.filter(selector) : 490 | (likeArray(selector) && isFunction(selector.item)) ? slice.call(selector) : $(selector) 491 | this.forEach(function(el){ 492 | if (excludes.indexOf(el) < 0) nodes.push(el) 493 | }) 494 | } 495 | return $(nodes) 496 | }, 497 | has: function(selector){ 498 | return this.filter(function(){ 499 | return isObject(selector) ? 500 | $.contains(this, selector) : 501 | $(this).find(selector).size() 502 | }) 503 | }, 504 | eq: function(idx){ 505 | return idx === -1 ? this.slice(idx) : this.slice(idx, + idx + 1) 506 | }, 507 | first: function(){ 508 | var el = this[0] 509 | return el && !isObject(el) ? el : $(el) 510 | }, 511 | last: function(){ 512 | var el = this[this.length - 1] 513 | return el && !isObject(el) ? el : $(el) 514 | }, 515 | find: function(selector){ 516 | var result, $this = this 517 | if (!selector) result = $() 518 | else if (typeof selector == 'object') 519 | result = $(selector).filter(function(){ 520 | var node = this 521 | return emptyArray.some.call($this, function(parent){ 522 | return $.contains(parent, node) 523 | }) 524 | }) 525 | else if (this.length == 1) result = $(zepto.qsa(this[0], selector)) 526 | else result = this.map(function(){ return zepto.qsa(this, selector) }) 527 | return result 528 | }, 529 | closest: function(selector, context){ 530 | var nodes = [], collection = typeof selector == 'object' && $(selector) 531 | this.each(function(_, node){ 532 | while (node && !(collection ? collection.indexOf(node) >= 0 : zepto.matches(node, selector))) 533 | node = node !== context && !isDocument(node) && node.parentNode 534 | if (node && nodes.indexOf(node) < 0) nodes.push(node) 535 | }) 536 | return $(nodes) 537 | }, 538 | parents: function(selector){ 539 | var ancestors = [], nodes = this 540 | while (nodes.length > 0) 541 | nodes = $.map(nodes, function(node){ 542 | if ((node = node.parentNode) && !isDocument(node) && ancestors.indexOf(node) < 0) { 543 | ancestors.push(node) 544 | return node 545 | } 546 | }) 547 | return filtered(ancestors, selector) 548 | }, 549 | parent: function(selector){ 550 | return filtered(uniq(this.pluck('parentNode')), selector) 551 | }, 552 | children: function(selector){ 553 | return filtered(this.map(function(){ return children(this) }), selector) 554 | }, 555 | contents: function() { 556 | return this.map(function() { return this.contentDocument || slice.call(this.childNodes) }) 557 | }, 558 | siblings: function(selector){ 559 | return filtered(this.map(function(i, el){ 560 | return filter.call(children(el.parentNode), function(child){ return child!==el }) 561 | }), selector) 562 | }, 563 | empty: function(){ 564 | return this.each(function(){ this.innerHTML = '' }) 565 | }, 566 | // `pluck` is borrowed from Prototype.js 567 | pluck: function(property){ 568 | return $.map(this, function(el){ return el[property] }) 569 | }, 570 | show: function(){ 571 | return this.each(function(){ 572 | this.style.display == "none" && (this.style.display = '') 573 | if (getComputedStyle(this, '').getPropertyValue("display") == "none") 574 | this.style.display = defaultDisplay(this.nodeName) 575 | }) 576 | }, 577 | replaceWith: function(newContent){ 578 | return this.before(newContent).remove() 579 | }, 580 | wrap: function(structure){ 581 | var func = isFunction(structure) 582 | if (this[0] && !func) 583 | var dom = $(structure).get(0), 584 | clone = dom.parentNode || this.length > 1 585 | 586 | return this.each(function(index){ 587 | $(this).wrapAll( 588 | func ? structure.call(this, index) : 589 | clone ? dom.cloneNode(true) : dom 590 | ) 591 | }) 592 | }, 593 | wrapAll: function(structure){ 594 | if (this[0]) { 595 | $(this[0]).before(structure = $(structure)) 596 | var children 597 | // drill down to the inmost element 598 | while ((children = structure.children()).length) structure = children.first() 599 | $(structure).append(this) 600 | } 601 | return this 602 | }, 603 | wrapInner: function(structure){ 604 | var func = isFunction(structure) 605 | return this.each(function(index){ 606 | var self = $(this), contents = self.contents(), 607 | dom = func ? structure.call(this, index) : structure 608 | contents.length ? contents.wrapAll(dom) : self.append(dom) 609 | }) 610 | }, 611 | unwrap: function(){ 612 | this.parent().each(function(){ 613 | $(this).replaceWith($(this).children()) 614 | }) 615 | return this 616 | }, 617 | clone: function(){ 618 | return this.map(function(){ return this.cloneNode(true) }) 619 | }, 620 | hide: function(){ 621 | return this.css("display", "none") 622 | }, 623 | toggle: function(setting){ 624 | return this.each(function(){ 625 | var el = $(this) 626 | ;(setting === undefined ? el.css("display") == "none" : setting) ? el.show() : el.hide() 627 | }) 628 | }, 629 | prev: function(selector){ return $(this.pluck('previousElementSibling')).filter(selector || '*') }, 630 | next: function(selector){ return $(this.pluck('nextElementSibling')).filter(selector || '*') }, 631 | html: function(html){ 632 | return 0 in arguments ? 633 | this.each(function(idx){ 634 | var originHtml = this.innerHTML 635 | $(this).empty().append( funcArg(this, html, idx, originHtml) ) 636 | }) : 637 | (0 in this ? this[0].innerHTML : null) 638 | }, 639 | text: function(text){ 640 | return 0 in arguments ? 641 | this.each(function(idx){ 642 | var newText = funcArg(this, text, idx, this.textContent) 643 | this.textContent = newText == null ? '' : ''+newText 644 | }) : 645 | (0 in this ? this.pluck('textContent').join("") : null) 646 | }, 647 | attr: function(name, value){ 648 | var result 649 | return (typeof name == 'string' && !(1 in arguments)) ? 650 | (0 in this && this[0].nodeType == 1 && (result = this[0].getAttribute(name)) != null ? result : undefined) : 651 | this.each(function(idx){ 652 | if (this.nodeType !== 1) return 653 | if (isObject(name)) for (key in name) setAttribute(this, key, name[key]) 654 | else setAttribute(this, name, funcArg(this, value, idx, this.getAttribute(name))) 655 | }) 656 | }, 657 | removeAttr: function(name){ 658 | return this.each(function(){ this.nodeType === 1 && name.split(' ').forEach(function(attribute){ 659 | setAttribute(this, attribute) 660 | }, this)}) 661 | }, 662 | prop: function(name, value){ 663 | name = propMap[name] || name 664 | return (1 in arguments) ? 665 | this.each(function(idx){ 666 | this[name] = funcArg(this, value, idx, this[name]) 667 | }) : 668 | (this[0] && this[0][name]) 669 | }, 670 | removeProp: function(name){ 671 | name = propMap[name] || name 672 | return this.each(function(){ delete this[name] }) 673 | }, 674 | data: function(name, value){ 675 | var attrName = 'data-' + name.replace(capitalRE, '-$1').toLowerCase() 676 | 677 | var data = (1 in arguments) ? 678 | this.attr(attrName, value) : 679 | this.attr(attrName) 680 | 681 | return data !== null ? deserializeValue(data) : undefined 682 | }, 683 | val: function(value){ 684 | if (0 in arguments) { 685 | if (value == null) value = "" 686 | return this.each(function(idx){ 687 | this.value = funcArg(this, value, idx, this.value) 688 | }) 689 | } else { 690 | return this[0] && (this[0].multiple ? 691 | $(this[0]).find('option').filter(function(){ return this.selected }).pluck('value') : 692 | this[0].value) 693 | } 694 | }, 695 | offset: function(coordinates){ 696 | if (coordinates) return this.each(function(index){ 697 | var $this = $(this), 698 | coords = funcArg(this, coordinates, index, $this.offset()), 699 | parentOffset = $this.offsetParent().offset(), 700 | props = { 701 | top: coords.top - parentOffset.top, 702 | left: coords.left - parentOffset.left 703 | } 704 | 705 | if ($this.css('position') == 'static') props['position'] = 'relative' 706 | $this.css(props) 707 | }) 708 | if (!this.length) return null 709 | if (document.documentElement !== this[0] && !$.contains(document.documentElement, this[0])) 710 | return {top: 0, left: 0} 711 | var obj = this[0].getBoundingClientRect() 712 | return { 713 | left: obj.left + window.pageXOffset, 714 | top: obj.top + window.pageYOffset, 715 | width: Math.round(obj.width), 716 | height: Math.round(obj.height) 717 | } 718 | }, 719 | css: function(property, value){ 720 | if (arguments.length < 2) { 721 | var element = this[0] 722 | if (typeof property == 'string') { 723 | if (!element) return 724 | return element.style[camelize(property)] || getComputedStyle(element, '').getPropertyValue(property) 725 | } else if (isArray(property)) { 726 | if (!element) return 727 | var props = {} 728 | var computedStyle = getComputedStyle(element, '') 729 | $.each(property, function(_, prop){ 730 | props[prop] = (element.style[camelize(prop)] || computedStyle.getPropertyValue(prop)) 731 | }) 732 | return props 733 | } 734 | } 735 | 736 | var css = '' 737 | if (type(property) == 'string') { 738 | if (!value && value !== 0) 739 | this.each(function(){ this.style.removeProperty(dasherize(property)) }) 740 | else 741 | css = dasherize(property) + ":" + maybeAddPx(property, value) 742 | } else { 743 | for (key in property) 744 | if (!property[key] && property[key] !== 0) 745 | this.each(function(){ this.style.removeProperty(dasherize(key)) }) 746 | else 747 | css += dasherize(key) + ':' + maybeAddPx(key, property[key]) + ';' 748 | } 749 | 750 | return this.each(function(){ this.style.cssText += ';' + css }) 751 | }, 752 | index: function(element){ 753 | return element ? this.indexOf($(element)[0]) : this.parent().children().indexOf(this[0]) 754 | }, 755 | hasClass: function(name){ 756 | if (!name) return false 757 | return emptyArray.some.call(this, function(el){ 758 | return this.test(className(el)) 759 | }, classRE(name)) 760 | }, 761 | addClass: function(name){ 762 | if (!name) return this 763 | return this.each(function(idx){ 764 | if (!('className' in this)) return 765 | classList = [] 766 | var cls = className(this), newName = funcArg(this, name, idx, cls) 767 | newName.split(/\s+/g).forEach(function(klass){ 768 | if (!$(this).hasClass(klass)) classList.push(klass) 769 | }, this) 770 | classList.length && className(this, cls + (cls ? " " : "") + classList.join(" ")) 771 | }) 772 | }, 773 | removeClass: function(name){ 774 | return this.each(function(idx){ 775 | if (!('className' in this)) return 776 | if (name === undefined) return className(this, '') 777 | classList = className(this) 778 | funcArg(this, name, idx, classList).split(/\s+/g).forEach(function(klass){ 779 | classList = classList.replace(classRE(klass), " ") 780 | }) 781 | className(this, classList.trim()) 782 | }) 783 | }, 784 | toggleClass: function(name, when){ 785 | if (!name) return this 786 | return this.each(function(idx){ 787 | var $this = $(this), names = funcArg(this, name, idx, className(this)) 788 | names.split(/\s+/g).forEach(function(klass){ 789 | (when === undefined ? !$this.hasClass(klass) : when) ? 790 | $this.addClass(klass) : $this.removeClass(klass) 791 | }) 792 | }) 793 | }, 794 | scrollTop: function(value){ 795 | if (!this.length) return 796 | var hasScrollTop = 'scrollTop' in this[0] 797 | if (value === undefined) return hasScrollTop ? this[0].scrollTop : this[0].pageYOffset 798 | return this.each(hasScrollTop ? 799 | function(){ this.scrollTop = value } : 800 | function(){ this.scrollTo(this.scrollX, value) }) 801 | }, 802 | scrollLeft: function(value){ 803 | if (!this.length) return 804 | var hasScrollLeft = 'scrollLeft' in this[0] 805 | if (value === undefined) return hasScrollLeft ? this[0].scrollLeft : this[0].pageXOffset 806 | return this.each(hasScrollLeft ? 807 | function(){ this.scrollLeft = value } : 808 | function(){ this.scrollTo(value, this.scrollY) }) 809 | }, 810 | position: function() { 811 | if (!this.length) return 812 | 813 | var elem = this[0], 814 | // Get *real* offsetParent 815 | offsetParent = this.offsetParent(), 816 | // Get correct offsets 817 | offset = this.offset(), 818 | parentOffset = rootNodeRE.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset() 819 | 820 | // Subtract element margins 821 | // note: when an element has margin: auto the offsetLeft and marginLeft 822 | // are the same in Safari causing offset.left to incorrectly be 0 823 | offset.top -= parseFloat( $(elem).css('margin-top') ) || 0 824 | offset.left -= parseFloat( $(elem).css('margin-left') ) || 0 825 | 826 | // Add offsetParent borders 827 | parentOffset.top += parseFloat( $(offsetParent[0]).css('border-top-width') ) || 0 828 | parentOffset.left += parseFloat( $(offsetParent[0]).css('border-left-width') ) || 0 829 | 830 | // Subtract the two offsets 831 | return { 832 | top: offset.top - parentOffset.top, 833 | left: offset.left - parentOffset.left 834 | } 835 | }, 836 | offsetParent: function() { 837 | return this.map(function(){ 838 | var parent = this.offsetParent || document.body 839 | while (parent && !rootNodeRE.test(parent.nodeName) && $(parent).css("position") == "static") 840 | parent = parent.offsetParent 841 | return parent 842 | }) 843 | } 844 | } 845 | 846 | // for now 847 | $.fn.detach = $.fn.remove 848 | 849 | // Generate the `width` and `height` functions 850 | ;['width', 'height'].forEach(function(dimension){ 851 | var dimensionProperty = 852 | dimension.replace(/./, function(m){ return m[0].toUpperCase() }) 853 | 854 | $.fn[dimension] = function(value){ 855 | var offset, el = this[0] 856 | if (value === undefined) return isWindow(el) ? el['inner' + dimensionProperty] : 857 | isDocument(el) ? el.documentElement['scroll' + dimensionProperty] : 858 | (offset = this.offset()) && offset[dimension] 859 | else return this.each(function(idx){ 860 | el = $(this) 861 | el.css(dimension, funcArg(this, value, idx, el[dimension]())) 862 | }) 863 | } 864 | }) 865 | 866 | function traverseNode(node, fun) { 867 | fun(node) 868 | for (var i = 0, len = node.childNodes.length; i < len; i++) 869 | traverseNode(node.childNodes[i], fun) 870 | } 871 | 872 | // Generate the `after`, `prepend`, `before`, `append`, 873 | // `insertAfter`, `insertBefore`, `appendTo`, and `prependTo` methods. 874 | adjacencyOperators.forEach(function(operator, operatorIndex) { 875 | var inside = operatorIndex % 2 //=> prepend, append 876 | 877 | $.fn[operator] = function(){ 878 | // arguments can be nodes, arrays of nodes, Zepto objects and HTML strings 879 | var argType, nodes = $.map(arguments, function(arg) { 880 | var arr = [] 881 | argType = type(arg) 882 | if (argType == "array") { 883 | arg.forEach(function(el) { 884 | if (el.nodeType !== undefined) return arr.push(el) 885 | else if ($.zepto.isZ(el)) return arr = arr.concat(el.get()) 886 | arr = arr.concat(zepto.fragment(el)) 887 | }) 888 | return arr 889 | } 890 | return argType == "object" || arg == null ? 891 | arg : zepto.fragment(arg) 892 | }), 893 | parent, copyByClone = this.length > 1 894 | if (nodes.length < 1) return this 895 | 896 | return this.each(function(_, target){ 897 | parent = inside ? target : target.parentNode 898 | 899 | // convert all methods to a "before" operation 900 | target = operatorIndex == 0 ? target.nextSibling : 901 | operatorIndex == 1 ? target.firstChild : 902 | operatorIndex == 2 ? target : 903 | null 904 | 905 | var parentInDocument = $.contains(document.documentElement, parent) 906 | 907 | nodes.forEach(function(node){ 908 | if (copyByClone) node = node.cloneNode(true) 909 | else if (!parent) return $(node).remove() 910 | 911 | parent.insertBefore(node, target) 912 | if (parentInDocument) traverseNode(node, function(el){ 913 | if (el.nodeName != null && el.nodeName.toUpperCase() === 'SCRIPT' && 914 | (!el.type || el.type === 'text/javascript') && !el.src){ 915 | var target = el.ownerDocument ? el.ownerDocument.defaultView : window 916 | target['eval'].call(target, el.innerHTML) 917 | } 918 | }) 919 | }) 920 | }) 921 | } 922 | 923 | // after => insertAfter 924 | // prepend => prependTo 925 | // before => insertBefore 926 | // append => appendTo 927 | $.fn[inside ? operator+'To' : 'insert'+(operatorIndex ? 'Before' : 'After')] = function(html){ 928 | $(html)[operator](this) 929 | return this 930 | } 931 | }) 932 | 933 | zepto.Z.prototype = Z.prototype = $.fn 934 | 935 | // Export internal API functions in the `$.zepto` namespace 936 | zepto.uniq = uniq 937 | zepto.deserializeValue = deserializeValue 938 | $.zepto = zepto 939 | 940 | return $ 941 | })() 942 | 943 | window.Zepto = Zepto 944 | window.$ === undefined && (window.$ = Zepto) 945 | 946 | ;(function($){ 947 | var _zid = 1, undefined, 948 | slice = Array.prototype.slice, 949 | isFunction = $.isFunction, 950 | isString = function(obj){ return typeof obj == 'string' }, 951 | handlers = {}, 952 | specialEvents={}, 953 | focusinSupported = 'onfocusin' in window, 954 | focus = { focus: 'focusin', blur: 'focusout' }, 955 | hover = { mouseenter: 'mouseover', mouseleave: 'mouseout' } 956 | 957 | specialEvents.click = specialEvents.mousedown = specialEvents.mouseup = specialEvents.mousemove = 'MouseEvents' 958 | 959 | function zid(element) { 960 | return element._zid || (element._zid = _zid++) 961 | } 962 | function findHandlers(element, event, fn, selector) { 963 | event = parse(event) 964 | if (event.ns) var matcher = matcherFor(event.ns) 965 | return (handlers[zid(element)] || []).filter(function(handler) { 966 | return handler 967 | && (!event.e || handler.e == event.e) 968 | && (!event.ns || matcher.test(handler.ns)) 969 | && (!fn || zid(handler.fn) === zid(fn)) 970 | && (!selector || handler.sel == selector) 971 | }) 972 | } 973 | function parse(event) { 974 | var parts = ('' + event).split('.') 975 | return {e: parts[0], ns: parts.slice(1).sort().join(' ')} 976 | } 977 | function matcherFor(ns) { 978 | return new RegExp('(?:^| )' + ns.replace(' ', ' .* ?') + '(?: |$)') 979 | } 980 | 981 | function eventCapture(handler, captureSetting) { 982 | return handler.del && 983 | (!focusinSupported && (handler.e in focus)) || 984 | !!captureSetting 985 | } 986 | 987 | function realEvent(type) { 988 | return hover[type] || (focusinSupported && focus[type]) || type 989 | } 990 | 991 | function add(element, events, fn, data, selector, delegator, capture){ 992 | var id = zid(element), set = (handlers[id] || (handlers[id] = [])) 993 | events.split(/\s/).forEach(function(event){ 994 | if (event == 'ready') return $(document).ready(fn) 995 | var handler = parse(event) 996 | handler.fn = fn 997 | handler.sel = selector 998 | // emulate mouseenter, mouseleave 999 | if (handler.e in hover) fn = function(e){ 1000 | var related = e.relatedTarget 1001 | if (!related || (related !== this && !$.contains(this, related))) 1002 | return handler.fn.apply(this, arguments) 1003 | } 1004 | handler.del = delegator 1005 | var callback = delegator || fn 1006 | handler.proxy = function(e){ 1007 | e = compatible(e) 1008 | if (e.isImmediatePropagationStopped()) return 1009 | e.data = data 1010 | var result = callback.apply(element, e._args == undefined ? [e] : [e].concat(e._args)) 1011 | if (result === false) e.preventDefault(), e.stopPropagation() 1012 | return result 1013 | } 1014 | handler.i = set.length 1015 | set.push(handler) 1016 | if ('addEventListener' in element) 1017 | element.addEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture)) 1018 | }) 1019 | } 1020 | function remove(element, events, fn, selector, capture){ 1021 | var id = zid(element) 1022 | ;(events || '').split(/\s/).forEach(function(event){ 1023 | findHandlers(element, event, fn, selector).forEach(function(handler){ 1024 | delete handlers[id][handler.i] 1025 | if ('removeEventListener' in element) 1026 | element.removeEventListener(realEvent(handler.e), handler.proxy, eventCapture(handler, capture)) 1027 | }) 1028 | }) 1029 | } 1030 | 1031 | $.event = { add: add, remove: remove } 1032 | 1033 | $.proxy = function(fn, context) { 1034 | var args = (2 in arguments) && slice.call(arguments, 2) 1035 | if (isFunction(fn)) { 1036 | var proxyFn = function(){ return fn.apply(context, args ? args.concat(slice.call(arguments)) : arguments) } 1037 | proxyFn._zid = zid(fn) 1038 | return proxyFn 1039 | } else if (isString(context)) { 1040 | if (args) { 1041 | args.unshift(fn[context], fn) 1042 | return $.proxy.apply(null, args) 1043 | } else { 1044 | return $.proxy(fn[context], fn) 1045 | } 1046 | } else { 1047 | throw new TypeError("expected function") 1048 | } 1049 | } 1050 | 1051 | $.fn.bind = function(event, data, callback){ 1052 | return this.on(event, data, callback) 1053 | } 1054 | $.fn.unbind = function(event, callback){ 1055 | return this.off(event, callback) 1056 | } 1057 | $.fn.one = function(event, selector, data, callback){ 1058 | return this.on(event, selector, data, callback, 1) 1059 | } 1060 | 1061 | var returnTrue = function(){return true}, 1062 | returnFalse = function(){return false}, 1063 | ignoreProperties = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/, 1064 | eventMethods = { 1065 | preventDefault: 'isDefaultPrevented', 1066 | stopImmediatePropagation: 'isImmediatePropagationStopped', 1067 | stopPropagation: 'isPropagationStopped' 1068 | } 1069 | 1070 | function compatible(event, source) { 1071 | if (source || !event.isDefaultPrevented) { 1072 | source || (source = event) 1073 | 1074 | $.each(eventMethods, function(name, predicate) { 1075 | var sourceMethod = source[name] 1076 | event[name] = function(){ 1077 | this[predicate] = returnTrue 1078 | return sourceMethod && sourceMethod.apply(source, arguments) 1079 | } 1080 | event[predicate] = returnFalse 1081 | }) 1082 | 1083 | event.timeStamp || (event.timeStamp = Date.now()) 1084 | 1085 | if (source.defaultPrevented !== undefined ? source.defaultPrevented : 1086 | 'returnValue' in source ? source.returnValue === false : 1087 | source.getPreventDefault && source.getPreventDefault()) 1088 | event.isDefaultPrevented = returnTrue 1089 | } 1090 | return event 1091 | } 1092 | 1093 | function createProxy(event) { 1094 | var key, proxy = { originalEvent: event } 1095 | for (key in event) 1096 | if (!ignoreProperties.test(key) && event[key] !== undefined) proxy[key] = event[key] 1097 | 1098 | return compatible(proxy, event) 1099 | } 1100 | 1101 | $.fn.delegate = function(selector, event, callback){ 1102 | return this.on(event, selector, callback) 1103 | } 1104 | $.fn.undelegate = function(selector, event, callback){ 1105 | return this.off(event, selector, callback) 1106 | } 1107 | 1108 | $.fn.live = function(event, callback){ 1109 | $(document.body).delegate(this.selector, event, callback) 1110 | return this 1111 | } 1112 | $.fn.die = function(event, callback){ 1113 | $(document.body).undelegate(this.selector, event, callback) 1114 | return this 1115 | } 1116 | 1117 | $.fn.on = function(event, selector, data, callback, one){ 1118 | var autoRemove, delegator, $this = this 1119 | if (event && !isString(event)) { 1120 | $.each(event, function(type, fn){ 1121 | $this.on(type, selector, data, fn, one) 1122 | }) 1123 | return $this 1124 | } 1125 | 1126 | if (!isString(selector) && !isFunction(callback) && callback !== false) 1127 | callback = data, data = selector, selector = undefined 1128 | if (callback === undefined || data === false) 1129 | callback = data, data = undefined 1130 | 1131 | if (callback === false) callback = returnFalse 1132 | 1133 | return $this.each(function(_, element){ 1134 | if (one) autoRemove = function(e){ 1135 | remove(element, e.type, callback) 1136 | return callback.apply(this, arguments) 1137 | } 1138 | 1139 | if (selector) delegator = function(e){ 1140 | var evt, match = $(e.target).closest(selector, element).get(0) 1141 | if (match && match !== element) { 1142 | evt = $.extend(createProxy(e), {currentTarget: match, liveFired: element}) 1143 | return (autoRemove || callback).apply(match, [evt].concat(slice.call(arguments, 1))) 1144 | } 1145 | } 1146 | 1147 | add(element, event, callback, data, selector, delegator || autoRemove) 1148 | }) 1149 | } 1150 | $.fn.off = function(event, selector, callback){ 1151 | var $this = this 1152 | if (event && !isString(event)) { 1153 | $.each(event, function(type, fn){ 1154 | $this.off(type, selector, fn) 1155 | }) 1156 | return $this 1157 | } 1158 | 1159 | if (!isString(selector) && !isFunction(callback) && callback !== false) 1160 | callback = selector, selector = undefined 1161 | 1162 | if (callback === false) callback = returnFalse 1163 | 1164 | return $this.each(function(){ 1165 | remove(this, event, callback, selector) 1166 | }) 1167 | } 1168 | 1169 | $.fn.trigger = function(event, args){ 1170 | event = (isString(event) || $.isPlainObject(event)) ? $.Event(event) : compatible(event) 1171 | event._args = args 1172 | return this.each(function(){ 1173 | // handle focus(), blur() by calling them directly 1174 | if (event.type in focus && typeof this[event.type] == "function") this[event.type]() 1175 | // items in the collection might not be DOM elements 1176 | else if ('dispatchEvent' in this) this.dispatchEvent(event) 1177 | else $(this).triggerHandler(event, args) 1178 | }) 1179 | } 1180 | 1181 | // triggers event handlers on current element just as if an event occurred, 1182 | // doesn't trigger an actual event, doesn't bubble 1183 | $.fn.triggerHandler = function(event, args){ 1184 | var e, result 1185 | this.each(function(i, element){ 1186 | e = createProxy(isString(event) ? $.Event(event) : event) 1187 | e._args = args 1188 | e.target = element 1189 | $.each(findHandlers(element, event.type || event), function(i, handler){ 1190 | result = handler.proxy(e) 1191 | if (e.isImmediatePropagationStopped()) return false 1192 | }) 1193 | }) 1194 | return result 1195 | } 1196 | 1197 | // shortcut methods for `.bind(event, fn)` for each event type 1198 | ;('focusin focusout focus blur load resize scroll unload click dblclick '+ 1199 | 'mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave '+ 1200 | 'change select keydown keypress keyup error').split(' ').forEach(function(event) { 1201 | $.fn[event] = function(callback) { 1202 | return (0 in arguments) ? 1203 | this.bind(event, callback) : 1204 | this.trigger(event) 1205 | } 1206 | }) 1207 | 1208 | $.Event = function(type, props) { 1209 | if (!isString(type)) props = type, type = props.type 1210 | var event = document.createEvent(specialEvents[type] || 'Events'), bubbles = true 1211 | if (props) for (var name in props) (name == 'bubbles') ? (bubbles = !!props[name]) : (event[name] = props[name]) 1212 | event.initEvent(type, bubbles, true) 1213 | return compatible(event) 1214 | } 1215 | 1216 | })(Zepto) 1217 | 1218 | ;(function($){ 1219 | var jsonpID = +new Date(), 1220 | document = window.document, 1221 | key, 1222 | name, 1223 | rscript = /)<[^<]*)*<\/script>/gi, 1224 | scriptTypeRE = /^(?:text|application)\/javascript/i, 1225 | xmlTypeRE = /^(?:text|application)\/xml/i, 1226 | jsonType = 'application/json', 1227 | htmlType = 'text/html', 1228 | blankRE = /^\s*$/, 1229 | originAnchor = document.createElement('a') 1230 | 1231 | originAnchor.href = window.location.href 1232 | 1233 | // trigger a custom event and return false if it was cancelled 1234 | function triggerAndReturn(context, eventName, data) { 1235 | var event = $.Event(eventName) 1236 | $(context).trigger(event, data) 1237 | return !event.isDefaultPrevented() 1238 | } 1239 | 1240 | // trigger an Ajax "global" event 1241 | function triggerGlobal(settings, context, eventName, data) { 1242 | if (settings.global) return triggerAndReturn(context || document, eventName, data) 1243 | } 1244 | 1245 | // Number of active Ajax requests 1246 | $.active = 0 1247 | 1248 | function ajaxStart(settings) { 1249 | if (settings.global && $.active++ === 0) triggerGlobal(settings, null, 'ajaxStart') 1250 | } 1251 | function ajaxStop(settings) { 1252 | if (settings.global && !(--$.active)) triggerGlobal(settings, null, 'ajaxStop') 1253 | } 1254 | 1255 | // triggers an extra global event "ajaxBeforeSend" that's like "ajaxSend" but cancelable 1256 | function ajaxBeforeSend(xhr, settings) { 1257 | var context = settings.context 1258 | if (settings.beforeSend.call(context, xhr, settings) === false || 1259 | triggerGlobal(settings, context, 'ajaxBeforeSend', [xhr, settings]) === false) 1260 | return false 1261 | 1262 | triggerGlobal(settings, context, 'ajaxSend', [xhr, settings]) 1263 | } 1264 | function ajaxSuccess(data, xhr, settings, deferred) { 1265 | var context = settings.context, status = 'success' 1266 | settings.success.call(context, data, status, xhr) 1267 | if (deferred) deferred.resolveWith(context, [data, status, xhr]) 1268 | triggerGlobal(settings, context, 'ajaxSuccess', [xhr, settings, data]) 1269 | ajaxComplete(status, xhr, settings) 1270 | } 1271 | // type: "timeout", "error", "abort", "parsererror" 1272 | function ajaxError(error, type, xhr, settings, deferred) { 1273 | var context = settings.context 1274 | settings.error.call(context, xhr, type, error) 1275 | if (deferred) deferred.rejectWith(context, [xhr, type, error]) 1276 | triggerGlobal(settings, context, 'ajaxError', [xhr, settings, error || type]) 1277 | ajaxComplete(type, xhr, settings) 1278 | } 1279 | // status: "success", "notmodified", "error", "timeout", "abort", "parsererror" 1280 | function ajaxComplete(status, xhr, settings) { 1281 | var context = settings.context 1282 | settings.complete.call(context, xhr, status) 1283 | triggerGlobal(settings, context, 'ajaxComplete', [xhr, settings]) 1284 | ajaxStop(settings) 1285 | } 1286 | 1287 | function ajaxDataFilter(data, type, settings) { 1288 | if (settings.dataFilter == empty) return data 1289 | var context = settings.context 1290 | return settings.dataFilter.call(context, data, type) 1291 | } 1292 | 1293 | // Empty function, used as default callback 1294 | function empty() {} 1295 | 1296 | $.ajaxJSONP = function(options, deferred){ 1297 | if (!('type' in options)) return $.ajax(options) 1298 | 1299 | var _callbackName = options.jsonpCallback, 1300 | callbackName = ($.isFunction(_callbackName) ? 1301 | _callbackName() : _callbackName) || ('Zepto' + (jsonpID++)), 1302 | script = document.createElement('script'), 1303 | originalCallback = window[callbackName], 1304 | responseData, 1305 | abort = function(errorType) { 1306 | $(script).triggerHandler('error', errorType || 'abort') 1307 | }, 1308 | xhr = { abort: abort }, abortTimeout 1309 | 1310 | if (deferred) deferred.promise(xhr) 1311 | 1312 | $(script).on('load error', function(e, errorType){ 1313 | clearTimeout(abortTimeout) 1314 | $(script).off().remove() 1315 | 1316 | if (e.type == 'error' || !responseData) { 1317 | ajaxError(null, errorType || 'error', xhr, options, deferred) 1318 | } else { 1319 | ajaxSuccess(responseData[0], xhr, options, deferred) 1320 | } 1321 | 1322 | window[callbackName] = originalCallback 1323 | if (responseData && $.isFunction(originalCallback)) 1324 | originalCallback(responseData[0]) 1325 | 1326 | originalCallback = responseData = undefined 1327 | }) 1328 | 1329 | if (ajaxBeforeSend(xhr, options) === false) { 1330 | abort('abort') 1331 | return xhr 1332 | } 1333 | 1334 | window[callbackName] = function(){ 1335 | responseData = arguments 1336 | } 1337 | 1338 | script.src = options.url.replace(/\?(.+)=\?/, '?$1=' + callbackName) 1339 | document.head.appendChild(script) 1340 | 1341 | if (options.timeout > 0) abortTimeout = setTimeout(function(){ 1342 | abort('timeout') 1343 | }, options.timeout) 1344 | 1345 | return xhr 1346 | } 1347 | 1348 | $.ajaxSettings = { 1349 | // Default type of request 1350 | type: 'GET', 1351 | // Callback that is executed before request 1352 | beforeSend: empty, 1353 | // Callback that is executed if the request succeeds 1354 | success: empty, 1355 | // Callback that is executed the the server drops error 1356 | error: empty, 1357 | // Callback that is executed on request complete (both: error and success) 1358 | complete: empty, 1359 | // The context for the callbacks 1360 | context: null, 1361 | // Whether to trigger "global" Ajax events 1362 | global: true, 1363 | // Transport 1364 | xhr: function () { 1365 | return new window.XMLHttpRequest() 1366 | }, 1367 | // MIME types mapping 1368 | // IIS returns Javascript as "application/x-javascript" 1369 | accepts: { 1370 | script: 'text/javascript, application/javascript, application/x-javascript', 1371 | json: jsonType, 1372 | xml: 'application/xml, text/xml', 1373 | html: htmlType, 1374 | text: 'text/plain' 1375 | }, 1376 | // Whether the request is to another domain 1377 | crossDomain: false, 1378 | // Default timeout 1379 | timeout: 0, 1380 | // Whether data should be serialized to string 1381 | processData: true, 1382 | // Whether the browser should be allowed to cache GET responses 1383 | cache: true, 1384 | //Used to handle the raw response data of XMLHttpRequest. 1385 | //This is a pre-filtering function to sanitize the response. 1386 | //The sanitized response should be returned 1387 | dataFilter: empty 1388 | } 1389 | 1390 | function mimeToDataType(mime) { 1391 | if (mime) mime = mime.split(';', 2)[0] 1392 | return mime && ( mime == htmlType ? 'html' : 1393 | mime == jsonType ? 'json' : 1394 | scriptTypeRE.test(mime) ? 'script' : 1395 | xmlTypeRE.test(mime) && 'xml' ) || 'text' 1396 | } 1397 | 1398 | function appendQuery(url, query) { 1399 | if (query == '') return url 1400 | return (url + '&' + query).replace(/[&?]{1,2}/, '?') 1401 | } 1402 | 1403 | // serialize payload and append it to the URL for GET requests 1404 | function serializeData(options) { 1405 | if (options.processData && options.data && $.type(options.data) != "string") 1406 | options.data = $.param(options.data, options.traditional) 1407 | if (options.data && (!options.type || options.type.toUpperCase() == 'GET' || 'jsonp' == options.dataType)) 1408 | options.url = appendQuery(options.url, options.data), options.data = undefined 1409 | } 1410 | 1411 | $.ajax = function(options){ 1412 | var settings = $.extend({}, options || {}), 1413 | deferred = $.Deferred && $.Deferred(), 1414 | urlAnchor, hashIndex 1415 | for (key in $.ajaxSettings) if (settings[key] === undefined) settings[key] = $.ajaxSettings[key] 1416 | 1417 | ajaxStart(settings) 1418 | 1419 | if (!settings.crossDomain) { 1420 | urlAnchor = document.createElement('a') 1421 | urlAnchor.href = settings.url 1422 | // cleans up URL for .href (IE only), see https://github.com/madrobby/zepto/pull/1049 1423 | urlAnchor.href = urlAnchor.href 1424 | settings.crossDomain = (originAnchor.protocol + '//' + originAnchor.host) !== (urlAnchor.protocol + '//' + urlAnchor.host) 1425 | } 1426 | 1427 | if (!settings.url) settings.url = window.location.toString() 1428 | if ((hashIndex = settings.url.indexOf('#')) > -1) settings.url = settings.url.slice(0, hashIndex) 1429 | serializeData(settings) 1430 | 1431 | var dataType = settings.dataType, hasPlaceholder = /\?.+=\?/.test(settings.url) 1432 | if (hasPlaceholder) dataType = 'jsonp' 1433 | 1434 | if (settings.cache === false || ( 1435 | (!options || options.cache !== true) && 1436 | ('script' == dataType || 'jsonp' == dataType) 1437 | )) 1438 | settings.url = appendQuery(settings.url, '_=' + Date.now()) 1439 | 1440 | if ('jsonp' == dataType) { 1441 | if (!hasPlaceholder) 1442 | settings.url = appendQuery(settings.url, 1443 | settings.jsonp ? (settings.jsonp + '=?') : settings.jsonp === false ? '' : 'callback=?') 1444 | return $.ajaxJSONP(settings, deferred) 1445 | } 1446 | 1447 | var mime = settings.accepts[dataType], 1448 | headers = { }, 1449 | setHeader = function(name, value) { headers[name.toLowerCase()] = [name, value] }, 1450 | protocol = /^([\w-]+:)\/\//.test(settings.url) ? RegExp.$1 : window.location.protocol, 1451 | xhr = settings.xhr(), 1452 | nativeSetHeader = xhr.setRequestHeader, 1453 | abortTimeout 1454 | 1455 | if (deferred) deferred.promise(xhr) 1456 | 1457 | if (!settings.crossDomain) setHeader('X-Requested-With', 'XMLHttpRequest') 1458 | setHeader('Accept', mime || '*/*') 1459 | if (mime = settings.mimeType || mime) { 1460 | if (mime.indexOf(',') > -1) mime = mime.split(',', 2)[0] 1461 | xhr.overrideMimeType && xhr.overrideMimeType(mime) 1462 | } 1463 | if (settings.contentType || (settings.contentType !== false && settings.data && settings.type.toUpperCase() != 'GET')) 1464 | setHeader('Content-Type', settings.contentType || 'application/x-www-form-urlencoded') 1465 | 1466 | if (settings.headers) for (name in settings.headers) setHeader(name, settings.headers[name]) 1467 | xhr.setRequestHeader = setHeader 1468 | 1469 | xhr.onreadystatechange = function(){ 1470 | if (xhr.readyState == 4) { 1471 | xhr.onreadystatechange = empty 1472 | clearTimeout(abortTimeout) 1473 | var result, error = false 1474 | if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 || (xhr.status == 0 && protocol == 'file:')) { 1475 | dataType = dataType || mimeToDataType(settings.mimeType || xhr.getResponseHeader('content-type')) 1476 | 1477 | if (xhr.responseType == 'arraybuffer' || xhr.responseType == 'blob') 1478 | result = xhr.response 1479 | else { 1480 | result = xhr.responseText 1481 | 1482 | try { 1483 | // http://perfectionkills.com/global-eval-what-are-the-options/ 1484 | // sanitize response accordingly if data filter callback provided 1485 | result = ajaxDataFilter(result, dataType, settings) 1486 | if (dataType == 'script') (1,eval)(result) 1487 | else if (dataType == 'xml') result = xhr.responseXML 1488 | else if (dataType == 'json') result = blankRE.test(result) ? null : $.parseJSON(result) 1489 | } catch (e) { error = e } 1490 | 1491 | if (error) return ajaxError(error, 'parsererror', xhr, settings, deferred) 1492 | } 1493 | 1494 | ajaxSuccess(result, xhr, settings, deferred) 1495 | } else { 1496 | ajaxError(xhr.statusText || null, xhr.status ? 'error' : 'abort', xhr, settings, deferred) 1497 | } 1498 | } 1499 | } 1500 | 1501 | if (ajaxBeforeSend(xhr, settings) === false) { 1502 | xhr.abort() 1503 | ajaxError(null, 'abort', xhr, settings, deferred) 1504 | return xhr 1505 | } 1506 | 1507 | var async = 'async' in settings ? settings.async : true 1508 | xhr.open(settings.type, settings.url, async, settings.username, settings.password) 1509 | 1510 | if (settings.xhrFields) for (name in settings.xhrFields) xhr[name] = settings.xhrFields[name] 1511 | 1512 | for (name in headers) nativeSetHeader.apply(xhr, headers[name]) 1513 | 1514 | if (settings.timeout > 0) abortTimeout = setTimeout(function(){ 1515 | xhr.onreadystatechange = empty 1516 | xhr.abort() 1517 | ajaxError(null, 'timeout', xhr, settings, deferred) 1518 | }, settings.timeout) 1519 | 1520 | // avoid sending empty string (#319) 1521 | xhr.send(settings.data ? settings.data : null) 1522 | return xhr 1523 | } 1524 | 1525 | // handle optional data/success arguments 1526 | function parseArguments(url, data, success, dataType) { 1527 | if ($.isFunction(data)) dataType = success, success = data, data = undefined 1528 | if (!$.isFunction(success)) dataType = success, success = undefined 1529 | return { 1530 | url: url 1531 | , data: data 1532 | , success: success 1533 | , dataType: dataType 1534 | } 1535 | } 1536 | 1537 | $.get = function(/* url, data, success, dataType */){ 1538 | return $.ajax(parseArguments.apply(null, arguments)) 1539 | } 1540 | 1541 | $.post = function(/* url, data, success, dataType */){ 1542 | var options = parseArguments.apply(null, arguments) 1543 | options.type = 'POST' 1544 | return $.ajax(options) 1545 | } 1546 | 1547 | $.getJSON = function(/* url, data, success */){ 1548 | var options = parseArguments.apply(null, arguments) 1549 | options.dataType = 'json' 1550 | return $.ajax(options) 1551 | } 1552 | 1553 | $.fn.load = function(url, data, success){ 1554 | if (!this.length) return this 1555 | var self = this, parts = url.split(/\s/), selector, 1556 | options = parseArguments(url, data, success), 1557 | callback = options.success 1558 | if (parts.length > 1) options.url = parts[0], selector = parts[1] 1559 | options.success = function(response){ 1560 | self.html(selector ? 1561 | $('

').html(response.replace(rscript, "")).find(selector) 1562 | : response) 1563 | callback && callback.apply(self, arguments) 1564 | } 1565 | $.ajax(options) 1566 | return this 1567 | } 1568 | 1569 | var escape = encodeURIComponent 1570 | 1571 | function serialize(params, obj, traditional, scope){ 1572 | var type, array = $.isArray(obj), hash = $.isPlainObject(obj) 1573 | $.each(obj, function(key, value) { 1574 | type = $.type(value) 1575 | if (scope) key = traditional ? scope : 1576 | scope + '[' + (hash || type == 'object' || type == 'array' ? key : '') + ']' 1577 | // handle data in serializeArray() format 1578 | if (!scope && array) params.add(value.name, value.value) 1579 | // recurse into nested objects 1580 | else if (type == "array" || (!traditional && type == "object")) 1581 | serialize(params, value, traditional, key) 1582 | else params.add(key, value) 1583 | }) 1584 | } 1585 | 1586 | $.param = function(obj, traditional){ 1587 | var params = [] 1588 | params.add = function(key, value) { 1589 | if ($.isFunction(value)) value = value() 1590 | if (value == null) value = "" 1591 | this.push(escape(key) + '=' + escape(value)) 1592 | } 1593 | serialize(params, obj, traditional) 1594 | return params.join('&').replace(/%20/g, '+') 1595 | } 1596 | })(Zepto) 1597 | 1598 | ;(function($){ 1599 | $.fn.serializeArray = function() { 1600 | var name, type, result = [], 1601 | add = function(value) { 1602 | if (value.forEach) return value.forEach(add) 1603 | result.push({ name: name, value: value }) 1604 | } 1605 | if (this[0]) $.each(this[0].elements, function(_, field){ 1606 | type = field.type, name = field.name 1607 | if (name && field.nodeName.toLowerCase() != 'fieldset' && 1608 | !field.disabled && type != 'submit' && type != 'reset' && type != 'button' && type != 'file' && 1609 | ((type != 'radio' && type != 'checkbox') || field.checked)) 1610 | add($(field).val()) 1611 | }) 1612 | return result 1613 | } 1614 | 1615 | $.fn.serialize = function(){ 1616 | var result = [] 1617 | this.serializeArray().forEach(function(elm){ 1618 | result.push(encodeURIComponent(elm.name) + '=' + encodeURIComponent(elm.value)) 1619 | }) 1620 | return result.join('&') 1621 | } 1622 | 1623 | $.fn.submit = function(callback) { 1624 | if (0 in arguments) this.bind('submit', callback) 1625 | else if (this.length) { 1626 | var event = $.Event('submit') 1627 | this.eq(0).trigger(event) 1628 | if (!event.isDefaultPrevented()) this.get(0).submit() 1629 | } 1630 | return this 1631 | } 1632 | 1633 | })(Zepto) 1634 | 1635 | ;(function(){ 1636 | // getComputedStyle shouldn't freak out when called 1637 | // without a valid element as argument 1638 | try { 1639 | getComputedStyle(undefined) 1640 | } catch(e) { 1641 | var nativeGetComputedStyle = getComputedStyle 1642 | window.getComputedStyle = function(element, pseudoElement){ 1643 | try { 1644 | return nativeGetComputedStyle(element, pseudoElement) 1645 | } catch(e) { 1646 | return null 1647 | } 1648 | } 1649 | } 1650 | })() 1651 | return Zepto 1652 | })) 1653 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | entry: './popup/app.js', 5 | output: { 6 | filename: 'app.js', 7 | path: path.resolve(__dirname, 'popup/dist'), 8 | }, 9 | }; 10 | --------------------------------------------------------------------------------