├── .gitignore ├── Gruntfile.js ├── LICENSE.md ├── README.md ├── config.xml ├── css ├── main.css ├── manager.css └── options.css ├── icons ├── Icon-128.png ├── Icon-16.png ├── Icon-32.png ├── Icon-48.png ├── Icon-64.png ├── Icon-big.svg ├── Icon-small.svg └── icon.png ├── includes └── autopatchwork.js ├── index.html ├── manifest.json ├── options.html ├── package.json ├── scripts ├── background.js ├── common.js ├── manager.js ├── options.js └── storage.js └── siteinfo_manager.html /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | *.cmd 3 | *.min.js* 4 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | // Project configuration. 3 | grunt.initConfig({ 4 | pkg: grunt.file.readJSON('package.json'), 5 | jshint: { 6 | options: { 7 | curly: false, // true: force { } 8 | eqnull: true, // true: enable something == null 9 | eqeqeq: true, // true: force === 10 | immed: true, // true: immidiatly invocated fns has to be in () 11 | newcap: true, // true: construcotr has to have firt letter uppercased 12 | noarg: true, // true: no arguments.caller and arguments.callee 13 | sub: true, // true: no warning about a['something'] if a.something can be used 14 | undef: true, // true: can't use undeclared vars 15 | browser: true, // true: set window object and other stuff as globals 16 | devel: true, // true: set alert,confirm,console,... as globals 17 | boss: true, // true: allow assigments in conditions and return statements 18 | forin: true, // true: hasOwnProperty has to be in all for..in cycles 19 | noempty: true, // true: no empty blocks 20 | unused: true, // true: warn about unused vars 21 | trailing: true, // true: no trailing whitespaces 22 | supernew: true, // true: enable 'new Constructor' instead of 'new Constructor()' 23 | onevar: false, // true: only one var per fn 24 | funcscope: false, // false: no 'var' in blocks 25 | maxdepth: 5, // max nesting depth 26 | quotmark: 'single', // single: force ' 27 | '-W041': true, // don't warn about something == false/true 28 | '-W117': true, // don't warn about not defined vars until I refactorize bg.js 29 | globals: { 30 | app: true, 31 | bg: true, 32 | tabID: true, 33 | chrome: false, 34 | define: false, 35 | require: false, 36 | opera: false, 37 | 38 | /* browser globals not recognized by browser or devel options */ 39 | requestAnimationFrame: true, 40 | URL: true, 41 | HTMLCollection: true 42 | } 43 | }, 44 | all: ['includes/*.js', 'scripts/*.js'] 45 | }, 46 | closurecompiler: { 47 | my_target: { 48 | files: { 49 | 'includes/autopatchwork.min.js': 'includes/autopatchwork.js' 50 | }, 51 | options: { 52 | language_in: 'ECMASCRIPT5', 53 | compilation_level: 'SIMPLE', 54 | banner: '// ==UserScript==\n// @include http*\n// @exclude *//localhost*\n// @exclude *//127.0.0.*\n// @exclude *//192.168.*\n// @exclude *.com/embed*\n// @run-at document-start\n// @grant none\n// ==/UserScript==\n\n%output%\n//# sourceMappingURL=autopatchwork.min.js.map' 55 | } 56 | } 57 | } 58 | }); 59 | 60 | grunt.loadNpmTasks('grunt-contrib-jshint'); 61 | grunt.loadNpmTasks('grunt-google-closure-tools-compiler'); 62 | 63 | // Default task(s). 64 | grunt.registerTask('default', ['jshint']); 65 | 66 | }; 67 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2012-present DitherSky 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | AutoPatchWork Mod 2 | ========== 3 | 4 | Automatically loads next pages in multi-paged articles and appends them to the current when scrolling to the end of it. 5 | 6 | AutoPatchWork Mod is a fork of [AutoPatchWork](https://github.com/os0x/AutoPatchWork) which was inspired by [AutoPagerize](http://autopagerize.net). 7 | 8 | Screenshots 9 | ------- 10 | 11 | Config page: 12 | 13 | ![config tab](https://dithersky.files.wordpress.com/2014/08/preferences.png) 14 | 15 | Autopager in action: 16 | 17 | ![page result](https://dithersky.files.wordpress.com/2014/08/demo_separator.png) 18 | 19 | License 20 | ------- 21 | 22 | The source code is licensed under [MIT License](https://opensource.org/licenses/MIT). 23 | -------------------------------------------------------------------------------- /config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | AutoPatchWork Mod 4 | Auto-appends following paginated pages to the current on scroll. 5 | Автоматически подгружает следующие странички при прокрутке. 6 | ページのしたの方にスクロールした時に、現在表示しているページに次のページを挿入します。 7 | DitherSky 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | Licensed under the Open Source Initiative OSI - The MIT License (MIT); 20 | you may not use this file except in compliance with the License. 21 | You may obtain a copy of the License at 22 | 23 | http://www.opensource.org/licenses/mit-license.php 24 | 25 | Unless required by applicable law or agreed to in writing, software 26 | distributed under the License is distributed on an "AS IS" BASIS, 27 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 28 | See the License for the specific language governing permissions and 29 | limitations under the License. 30 | 31 | -------------------------------------------------------------------------------- /css/main.css: -------------------------------------------------------------------------------- 1 | /* 2 | Name: AutoPatchWork separator style 3 | Version: 02.04.2016 4 | */ 5 | 6 | .autopagerize_page_separator_blocks { 7 | -moz-user-select: none !important; 8 | width: 100%; 9 | clear: both; 10 | height: 30px !important; 11 | margin: 10px 0 10px !important; 12 | padding: 0 !important; 13 | text-align: center !important; 14 | list-style: none outside none !important; 15 | line-height: 14px !important; 16 | text-decoration: none !important; 17 | background: transparent !important; 18 | } 19 | 20 | .autopagerize_page_separator { 21 | height: 9px !important; 22 | line-height: 9px !important; 23 | margin: 0 0 9px !important; 24 | padding: 0 !important; 25 | border-bottom-color: #dae1e8 !important; 26 | border-bottom-style: solid !important; 27 | border-bottom-width: 1px !important; 28 | box-decoration-break: slice !important; 29 | display: block !important; 30 | font-size: 18px !important; 31 | text-align: center !important; 32 | text-overflow: clip !important; 33 | width: 100%; 34 | overflow: visible !important; 35 | } 36 | 37 | .autopagerize_page_info { 38 | margin: 0 !important; 39 | padding: 0 7px 2px !important; 40 | font-size: 14px !important; 41 | line-height: 14px !important; 42 | background: #fff none repeat scroll 0% 0% !important; 43 | background-clip: border-box !important; 44 | background-origin: padding-box !important; 45 | background-size: auto !important; 46 | } 47 | 48 | .autopagerize_link, .autopagerize_link:hover { 49 | background: #fff none repeat scroll 0% 0% !important; 50 | text-decoration: none !important; 51 | } 52 | 53 | .autopagerize_link:before { 54 | content: "page " attr(number); 55 | } 56 | 57 | /* 58 | Name: AutoPatchWork statusbar style 59 | Version: 06.06.2016 60 | */ 61 | 62 | #autopatchwork_bar { 63 | background: rgba(0,255,0,0) !important; 64 | border-bottom: 1px solid rgba(0, 255, 0, 1); 65 | border-top: 12px solid rgba(0, 255, 0, 0.01); 66 | bottom: 0 !important; 67 | color: rgba(0,0,0,0) !important; 68 | position: fixed !important; 69 | right: 0 !important; 70 | text-align: right; 71 | width: 47px !important; 72 | z-index: 10000 !important; 73 | padding: 0 !important; 74 | margin: 0 !important; 75 | } 76 | 77 | #autopatchwork_bar svg { 78 | width: 15px !important; 79 | height: 15px !important; 80 | } 81 | 82 | #autopatchwork_bar:hover { 83 | background-color: rgba(222,222,222,.75) !important; 84 | border-top-width: 0 !important; 85 | color: rgba(0,0,0,1) !important; 86 | height: auto !important; 87 | min-height: 100px !important; 88 | padding: 10px 0 !important; 89 | } 90 | 91 | #autopatchwork_loader { 92 | display: none; 93 | padding: 0 !important; 94 | margin: 0 !important; 95 | position: fixed !important; 96 | height: 20px !important; 97 | width: 47px !important; 98 | bottom: 0 !important; 99 | right: 0 !important; 100 | background-color: transparent !important; 101 | } 102 | 103 | #autopatchwork_bar:before { 104 | content: ''; 105 | display: none; 106 | padding: 0 !important; 107 | margin: 0 !important; 108 | position: fixed !important; 109 | height: 20px !important; 110 | width: 47px !important; 111 | bottom: 0 !important; 112 | right: 0 !important; 113 | border: 0 !important; 114 | background-image: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA2MCAzMicgZmlsbD0nbGlnaHRncmF5Jz48Y2lyY2xlIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDEwIDApJyBjeD0nMCcgY3k9JzE2JyByPScwJz48YW5pbWF0ZSBhdHRyaWJ1dGVOYW1lPSdyJyB2YWx1ZXM9JzA7IDQ7IDA7IDAnIGR1cj0nMS4ycycgcmVwZWF0Q291bnQ9J2luZGVmaW5pdGUnIGJlZ2luPScwJyBrZXl0aW1lcz0nMDswLjI7MC43OzEnIGtleVNwbGluZXM9JzAuMiAwLjIgMC40IDAuODswLjIgMC42IDAuNCAwLjg7MC4yIDAuNiAwLjQgMC44JyBjYWxjTW9kZT0nc3BsaW5lJyAvPjwvY2lyY2xlPjxjaXJjbGUgdHJhbnNmb3JtPSd0cmFuc2xhdGUoMzAgMCknIGN4PScwJyBjeT0nMTYnIHI9JzAnPjxhbmltYXRlIGF0dHJpYnV0ZU5hbWU9J3InIHZhbHVlcz0nMDsgNDsgMDsgMCcgZHVyPScxLjJzJyByZXBlYXRDb3VudD0naW5kZWZpbml0ZScgYmVnaW49JzAuMycga2V5dGltZXM9JzA7MC4yOzAuNzsxJyBrZXlTcGxpbmVzPScwLjIgMC4yIDAuNCAwLjg7MC4yIDAuNiAwLjQgMC44OzAuMiAwLjYgMC40IDAuOCcgY2FsY01vZGU9J3NwbGluZScgLz48L2NpcmNsZT48Y2lyY2xlIHRyYW5zZm9ybT0ndHJhbnNsYXRlKDUwIDApJyBjeD0nMCcgY3k9JzE2JyByPScwJz4gPGFuaW1hdGUgYXR0cmlidXRlTmFtZT0ncicgdmFsdWVzPScwOyA0OyAwOyAwJyBkdXI9JzEuMnMnIHJlcGVhdENvdW50PSdpbmRlZmluaXRlJyBiZWdpbj0nMC42JyBrZXl0aW1lcz0nMDswLjI7MC43OzEnIGtleVNwbGluZXM9JzAuMiAwLjIgMC40IDAuODswLjIgMC42IDAuNCAwLjg7MC4yIDAuNiAwLjQgMC44JyBjYWxjTW9kZT0nc3BsaW5lJyAvPjwvY2lyY2xlPjwvc3ZnPg==) !important; 115 | background-position: center !important; 116 | background-repeat: no-repeat !important; 117 | background-size: 100% 100%; 118 | } 119 | 120 | #autopatchwork_bar.autopager_loading { 121 | border-bottom: 1px solid rgba(0, 128, 255, .5) !important; 122 | border-top : 1px solid rgba(0, 255, 255, .5) !important; 123 | } 124 | 125 | #autopatchwork_bar.autopager_loading img { 126 | display: block; 127 | } 128 | 129 | #autopatchwork_bar.autopager_loading:before { 130 | display: block; 131 | } 132 | 133 | #autopatchwork_bar.autopager_off { 134 | border-bottom: 2px solid rgba(255, 255, 0, 0.4) !important; 135 | border-top: 2px solid rgba(255, 255, 0, 0.4) !important; 136 | } 137 | 138 | #autopatchwork_bar.autopager_terminated { 139 | border-bottom: 2px solid rgba(255, 0, 0, .5) !important; 140 | border-top: 2px solid rgba(255, 0, 0, .5) !important; 141 | } 142 | 143 | #autopatchwork_bar.autopager_error { 144 | border-bottom: 2px solid rgba(255, 99, 71, .5) !important; 145 | border-top: 2px solid rgba(255, 99, 71, .5) !important; 146 | } 147 | 148 | #autopatchwork_bar:hover img, 149 | #autopatchwork_bar.autopager_error img, 150 | #autopatchwork_bar.autopager_terminated img { 151 | display: none; 152 | } 153 | 154 | #autopatchwork_bar.autopager_remove { 155 | display: none !important; 156 | } 157 | 158 | #autopatchwork_bar button { 159 | display: none; 160 | line-height: normal !important; 161 | position: relative !important; 162 | } 163 | 164 | #autopatchwork_bar:hover button { 165 | background: #222 !important; 166 | border: 1px solid #aaa !important; 167 | color: #fff !important; 168 | cursor: pointer !important; 169 | display: block !important; 170 | height: 25px !important; 171 | margin: 0 0 0 10px !important; 172 | padding: 3px !important; 173 | width: 25px !important; 174 | } 175 | 176 | #autopatchwork_bar button:hover:after { 177 | background: #555 !important; 178 | padding: 4px 8px !important; 179 | color: #ddd !important; 180 | position: absolute !important; 181 | line-height: normal !important; 182 | right: 0 !important; 183 | top: -105% !important; 184 | z-index: 10001 !important; 185 | white-space: nowrap !important; 186 | box-shadow: 0 0 2px #555 !important; 187 | } 188 | 189 | #bar_onoff:hover:after { content: 'Toggle'; } 190 | #bar_option:hover:after { content: 'Options'; } 191 | #bar_reverse:hover:after { content: 'Reverse'; } 192 | #bar_retry:hover:after { content: 'Retry'; } 193 | #bar_img_refresh:hover:after { content: 'Reload images'; } 194 | #bar_manager:hover:after { content: 'SI Editor'; } 195 | 196 | #bar_onoff:lang(ru):hover:after { content: 'Переключить'; } 197 | #bar_option:lang(ru):hover:after { content: 'Настройки'; } 198 | #bar_reverse:lang(ru):hover:after { content: 'Направление'; } 199 | #bar_retry:lang(ru):hover:after { content: 'Повтор загрузки'; } 200 | #bar_img_refresh:lang(ru):hover:after { content: 'Освежить картинки'; } 201 | #bar_manager:lang(ru):hover:after { content: 'Редактор SI'; } 202 | -------------------------------------------------------------------------------- /css/manager.css: -------------------------------------------------------------------------------- 1 | html { 2 | background: #e8ecf3 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAF2CAYAAABXpQmzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAPQUlEQVRo3sWb227zXBGGxytJ2%2FsAJI4RCPglbh4hNkIcIwQX8rVJZn7P5h2%2FWbXTnlEpTeLYazvbx%2BPx93%2F9z%2F7yj%2F%2FE689%2F%2B3e8%2B7G%2F%2FvO%2Ffcw%2FD1UT%2FxtjCP5ut7uYbcdVVcbtdosv%2FsPLy6VP9u9%2B3F%2FLssg4n89x0F%2F3u%2FaP%2Fvr4ePfWLC663%2B9xhTfvn6%2FXa3z2v%2FP54hcs5%2FNJhp%2FkV3jL%2FrpcLg%2FjxUXDzz6dhsn0tzbUY%2FUJj4%2BPq39fPj4%2Begj%2B8pmfTqc4Vi2eazxnqWP9o4%2F3vJ7sk%2FKx9rrh3Sflrfp4b%2BvnMdbJRP%2Fr4L0bvLL1JVpED0Nza3ytbP3B1g0wb80vwHr67%2F4%2FfrxHF8PW1uJCb8C%2F%2B%2Be1Rf%2B8XeVd%2BJZ66%2BhpnYhGi96aX4ErvcW123jPlmIIy8AJq0DEOP17vcTXtj7rwBb5wm%2FCEctj6%2FJYTmqdtXfjB71FtO5%2F%2Fu7H%2FbU2ErOO2bo0%2BcG1tZ4tLozJXC5n9abrBMwYUhOfY1L%2BbRXYGIv%2FgHdMyIcWva77ayW0GJ9giUqoY31HfdDqYj3ppCmD0Uss9nrMQhX8iy%2BFL74vU8245PKWs%2Fa%2BsIXepb%2F8R%2B%2B6diiGMiAEAhGq3fG%2F6i0l3PXFJ%2BLb5D9Cz12XfAglWS4Uqa5%2BNWac65et1zZabOHtFvvc25ZSkzvy%2Fv4jW%2FQf3t7eFPIHufTZ%2BxBeXl7TvKxjlB8%2Ffgi0sSQoZl97rvHZd2a9qmfqB6%2FXj5596XquI7pdBSRare5ixusYY9EHVNTH4637wTQ5Wsp2sbBHq7hb7k7O0gXYl6rGCLOXWuhffD1hczAc1iFsoS%2B41jpqLPAYELkU3JJshRDAFJdBbTkYaRHS3EEo%2FEToSo8xtXBbv7IWmkKcRiCWB8qUM34VrOf6gujJ29urtLquNgYLr2lz0rLlwt9zMv73%2BvomJTmLn1QWrOzRyVu0GDgUvwyVYInK3LR9ZDdXZuS9V8KFd7jkYNGxbt7S5fISauqTCiNbPgXb1VIDxfKJuH67IVXosrdQahsd%2BEl%2Bve9S%2BBlYr%2BvV9XnIprVpzWIFyma3m%2FBdwtJgvBAzhY3x7nyZYOpq%2B9yPp9krvxLdlTBoLU2cVE5rQDcs1%2FQK3xjduu0MG572%2ByUEwn%2FM91OborQiGgYgnBDGpvFnmhbNndXiIqcD1rUsbEi4L7YHIt6Sjy8sRVrWGKfANvq2%2BWJD%2BSHhIR1%2Bkh%2FMk%2B89xnTLEXyEWYZAtEeohVZ3zSFmUN8ynt7qUo4JOxYXjQwRYEbswWul4t3TwXvz2E%2FuFlYYttO3cMH44C4gxL6dq0Sh%2B6EUEgjEDi%2F%2F3tEeRMztjwsyPENK%2BE1r3%2FPKWkPBeOGre%2Ba%2BoDCaiAZIVTeT4lPKVtPkYdExqW4o451FXQAggzSMkKJoCBKMnfCWK8rzVhc40vH%2B%2FhHdcnCJyVSLrq6YTOy1uri5AGxDjcmkqT6XwKaUa4cyUIOejNYPHLi54KZiZaAUk6FuOn70ixBClAjmznAMWT6nAzo%2FFCeXueggrrZOymBF%2BFqxZXouF6eU8nNpYii%2BlsfVUfHEw4T886mcKIKQAc%2BEAC4nNVxmZr3p7rrVnIzA5aUZdImBPYzQqn3hzR60EElFhTBC7heCkcJCkee2C9lqTwzxI7xTG6hNmId0jFtd9274AkS86D%2FmrqVhgHctLexuw96UnMY7wkFspZ%2Fs3cOPZ8AkgkBTqjt4f%2BiZtUOlpMIqK%2BoguIL37A3dphKdsI0U9dXOeNcuSu7vEGbDeiCKDsdaoYGuJysiKniKDtZhSN2JU94aQ8D6YijjEmO7YFwlbtqSVCmrjesNhnJpe4joqiKqjKRqDBG8wS%2BWXZSMXl5y1gizat1SDUpgM1C%2Bp77DqCOOhL5gsSuqjhNDVZGnepe33A3t3NoTtPSDuQTeAnao7GN4idCp8hwPjmiHAWReSAwA%2FlDhqHqvIRS5C4p9BgMwZgCdI%2FhnX2AYrWIAqU%2FY07LVYAC2IYCchDOAiB3IVyvitc2er%2BN1JcoI9MMo17IK3owZAKQk7A0sxMQAbI8BKCe56y4pGIBCAOrVYTVEDNasnVAxACSPrTvMAHSHAcDhl85vDEBLeoyC%2BJhIZOzEAARhP49znUhuKTGAmPHEALbIBTbGF35iAK7rsI%2FIPlR2GIAQA8iuJwYgRwzAigEIMQDjoCmWhxhALAPMHsSsvtvMAFo2JwaQgksMIHIXdI%2FWI9CE%2FysGIJX09IyLAWj76x0GAJqUOl6ZhhECaBWAbazYrBlACe8NmtcmJpYOYTSs%2F1cMgNGNHDEAj2M5vNZiABWUbAzAVgbQXRIDEFoNZQYgOwygucoAiclFP1fW%2FmqIz32MYACdeLteIziuaCBgZSSQjrx2GMBDdFrx2SiXdkdcdsgApBhABxzEADYihywY5gR5AjEAYQbQXWGHoOsPGRIxAAhCx4%2FMADpOB3wpBtDp1MoAGtkpMQAjBtB2EwxAVgbQccQOA%2FAWzSg4YgbQqX7TQvhoRPfFANpphktBzrrDABZiAFa2JxUf8lgBkxIDMDAA22EARgzAZgaQgfBnBhDJ2STNuQoTA0gxI4rZxBUteUNgAC1aJRCKYMm%2Fu22vVHVAN4QYgE2pQOp1MYCYbb6fbI8BVHZ0V5g678qPrSugxQCEGcAyMYCIMYoBGBhAxzfeEjEATCpZMzEA33etgEkqZtMKPhLNErgSXmhXsjDNPYYynsgbINB1UeZcJY9GDECIAfSJ8oQBGGwntlCIAQjH4Z4AIZWyHQbQMRqIyMwArBhAE1cwlpkBfKLsmHrDfU5NASxnBmDEAFqAfQjIQsAAyrFvXTOKgCcbkODKKq0YQHc5MwAOLjtAQqQfyA72MVO7ocQAOmgKCEgMIAQVkI3Tge8wAByTQd3A63eUf8QAZGIAgqQnVqOEdiEGIMQAQvpL6TI%2FLQbQC51Rft%2Bn225pkF8JPT6lEzUEx18xANabrbuvGIAQAyBfeDPKaTKVwpHU1E1YSzAUDEA246QPeWspWMePBclPvG2tYB3jEgPoG4oIkCDEzABsRt3EAOyIAXTiCLvkMRMzgJB0N%2FawizAKvTPEAOBKQqoRQ84MQCYGIHsMIHIZlxhsG3aoLQWEwn1yZpdLk00mC7E8lbPYAQOQPQZQ%2BYJi8T8xACEGEE4dk5gZgBUD6LCw3LN8lwHIzACsGIAUAwAv05kBCFmwuMNcIa3sMQAhBtAsjRkA3IMQA2i%2FwwwAKZRSHYDiziS2cmYAdsAAjBmATAzAQ2s7YgB504bG2%2FEaMQDO3mxiAMYMQL5iAH2vo44pbNBcB%2BAxhFYsq%2FON7luo8Mm4DgA2XCusBmZqazbXAfT9GqwpM4BOciuMxa1KmesAwB079j6qA2hrcVAHIHMdwMPCFwOQPQbQkl3Lkw5zqgNoowSVgBU%2BqgNgBiBHDKB5WQ1JmQG4wCojT6JJ%2BK5gAAsxAK4DsKM6gJBmeFkYVdQBwOwp3zvUQsI41mEhalMQ5yIa2KsDmBHAJwYgFD8YWN8RA%2BhI6rt1APIVAzC%2BxfaMAaAOoBNYhLCdiUx1AEIMoNUADIDrAJgBKDEARR1AQ1%2B%2BxUYMoOsAhBgALG%2FDfdyg7XiMGMDDjYi5DqCBEIaC2YeYUR2AUEDktyiVQsasxlnHtxADEIQwVAcgewzAnjGAXr%2Fk980ApBjAQx3Awy1VqgOQuQ5gZgByxADkoA7AuA5Ayc2F1hcDkJkByINPWS9YGYA8YwBCDKAdKBhAJIgIDVGwwqQdDKANOtUByDMGYF%2FVAQgxACUGIHMdABhAl%2B5wUchRHYB4ROKG9ogBCOoqqg5AoZVpRZIBKOon4IK9q2IAiFLTDU91APFeDKBtENcBHDGATcKnOgAwgDghjWkyAC0G8ODeoIVcB4CiSGYAnMtIh64HDECoDsCYAVBJY%2Bq2O8%2BqAxBmAI2MKQ4XrgMQvvE%2BMQBjBqDwor47EwPY7iHh6uIoRnUAMtcBzAwAuM6oMHHZYwBVN3ND4htOkRkAutYaRsflMTxiACjVku8wADtgADYzgLgrwcl5MQDbYwC4raE46SsGIMQAtrAQDOVZHUCPiRhApH2V9HyqA2hHlCpxQnGiMAMwYgBQ%2FC6LisV%2FUgegVAeggyp5u4iqGIBQHYDMdQDyjAG0q0AyDgxGOc0nBmBTHUBnc8wA2utPdQBb%2FIhqz6l8gxmAdte1G1wH0OoRFndiADLVAQgzgOY6VAcwM4DHnSnrajsMwI4YQOey96pqOWIAQtn6Vq14UAcgvBkQCqs6AKE6gLZoMwNogfDFR2tcByBfMIDc6%2BsNsPShDoDvqmQktcMADEtWdQA5ToRZX9QBZK5AdQDMAAQlHavH1bkOgBmAzXUAclAHsMsAHtInYgCw710HoAgLuNAYJWaoA5ifBeictRiAzHUAclAHIGAAiOi1GACjWuE6gPlZAGypEg21vToAo2cB2sz07dR6FsDoWYAY7zluJ2wMoHUbMjg9C%2FCJARgxACMG0OXzfa%2FIHSTfCqwVWJgBaAlu38hBzBstzncBJgagYGpzHcDMAGSuA5CdZwHsqA6gK7m%2F%2ByyAwGF%2B51kAecYA%2BubN9CxA13IpPQvQhJ0YgOBZgCbXsDcolSAGYGAAslMHoFQH0AzAigFwHcCnZwGYAejOswBdB8BhzDI9C%2FCpDqAR2cQAjBmATAxAiAEEv5jrAPyCZedZAOFnAXAnWQ8YgPGzAA8PN1DmFGHNXh2ATAzg4VkA%2BU4dALJKpToAFNnI3rMAMtUBSEWnxgyA6wCMGEDILjMAneoAZK8OQHbqANig6vwsADOA5n24F4JnAQTrd8AAHuop8CxArOfEALTLdnDzHWOaGIDsPQsgQGIzA5CpDqALluZnAXSqA8CzADY%2FCyD8INWzZwFmBmDPGAAGrYjVJgYgYACa9WWHdQAKBrBMdQB2VAfQioVEguoAopSenwUAbX0QhmIAtvcsgFEdgDEDMGIAUgzAiAE81AHAE%2BgOA7A9BiDEAHRmAEIMQIgBLMQAsr6nGIAQA2jEWAwgngUQehaA6wDAAIQZgD1hALbHAOSgDsDwLICQZ5XpWQABAxAqa2MGgARI5zqALvDj%2BAyrMaAvuAPp3%2BEZqA5AmAHMdQBGt1btqA5A9p4F2GMAQgzA%2BFkA1AHoNIytDuBPf%2Fi1%2Ff43v7Cffvcr%2BeNvf%2Bkv82P1Wfyzv4Z88%2B%2F%2FeOLP4lYmZGAO9bMAAAAASUVORK5CYII%3D) repeat-x; 3 | font-size: small; 4 | font-family: "Calibri", "Tahoma", "Verdana", "Arial", "Helvetica", "geneva", sans-serif !important; 5 | } 6 | 7 | body,ul,ol,dl,li,dd,dt,p,div,h1,h2,h3,h4,h5,h6 { 8 | margin: 0; 9 | padding: 0; 10 | } 11 | 12 | .top { 13 | position: fixed; 14 | top: 0px; 15 | background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#fff)); 16 | background: -o-linear-gradient(top left, #eee, #fff); 17 | background: linear-gradient(top left, #eee, #fff); 18 | max-width: 1230px; 19 | width: 1230px; 20 | min-height: 77px; 21 | overflow: auto; 22 | border-collapse: collapse; 23 | font-size: small; 24 | margin-bottom: 0.5em; 25 | margin-left: 1em; 26 | margin-right: 0.5em; 27 | margin-top: 1em; 28 | padding-bottom: 2px; 29 | -webkit-box-shadow: #CCC 0 0 .25em; 30 | -moz-box-shadow: #CCC 0 0 .25em; 31 | box-shadow: 0 0 .25em #98b0c9; 32 | } 33 | 34 | .top h1 { 35 | color: #fff; 36 | background: #222; 37 | background: -webkit-gradient(linear, left top, left bottom, from(#222), to(#666)); 38 | background: -o-linear-gradient(top left, #222, #666); 39 | font-size: medium; 40 | text-shadow: 0px 0px 1px #cccccc; 41 | padding: 2px; 42 | padding-left: 10px; 43 | } 44 | 45 | .top p { 46 | margin: 0.5em; 47 | } 48 | 49 | #siteinfo_table { 50 | box-shadow: 0 0 10px #98b0c9; 51 | background: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#fff)); 52 | background: -o-linear-gradient(top left, #eee, #fff); 53 | background: linear-gradient(top left, #eee, #fff); 54 | width: 1230px; 55 | max-width: 1230px; 56 | overflow: hidden; 57 | border-collapse: collapse; 58 | text-align: center; 59 | margin-bottom: 0.5em; 60 | margin-left: 1em; 61 | margin-right: 0px; 62 | margin-top: 100px !important; 63 | vertical-align: middle; 64 | } 65 | 66 | #siteinfo_table td { 67 | border: 1px solid #bbb; 68 | } 69 | 70 | #siteinfo_view { 71 | position: fixed; 72 | top: -2000px; 73 | bottom: 2000px; 74 | left: 0px; 75 | right: 0px; 76 | background: rgba(200, 200, 200, 0.7); 77 | -moz-transition: all 0.5s ease-in-out; 78 | -webkit-transition: all 0.5s ease-in-out; 79 | -o-transition: all 0.5s ease-in-out; 80 | transition: all 0.5s ease-in-out; 81 | } 82 | 83 | #siteinfo_view > dl { 84 | border: 1px solid #aaa; 85 | border-radius: 5px; 86 | padding: 10px; 87 | margin: 0 auto; 88 | width: 95%; 89 | background: #fff; 90 | position: relative; 91 | } 92 | 93 | #siteinfo_view dt, 94 | #siteinfo_view dd { 95 | padding: 4px; 96 | display: inline-block; 97 | } 98 | 99 | #siteinfo_view dl > dt { 100 | width: 18%; 101 | vertical-align: top; 102 | } 103 | 104 | #siteinfo_view dl > dd { 105 | width: 78%; 106 | } 107 | 108 | #siteinfo_view dl > dd > dl > dt { 109 | width: 16%; 110 | padding: 0; 111 | vertical-align: top; 112 | } 113 | 114 | #siteinfo_view dl > dd > dl > dd { 115 | width: 80%; 116 | background: #fff; 117 | vertical-align: top; 118 | } 119 | 120 | #siteinfo_view textarea { 121 | border: 1px solid #bbb; 122 | width: 100%; 123 | font-family: "Calibri", "Tahoma", "Verdana", "Arial", "Helvetica", "geneva", sans-serif !important; 124 | min-height: 2em; 125 | background: #F7F7F7; 126 | resize: vertical; 127 | } 128 | 129 | #siteinfo_view textarea[readonly] { 130 | background: #ddd; 131 | color: #444444; 132 | outline: medium none currentColor; 133 | } 134 | 135 | #siteinfo_view textarea[data-modified] { 136 | background: #ece; 137 | } 138 | 139 | #siteinfo_table tr { 140 | background-blend-mode: darken; 141 | } 142 | 143 | #siteinfo_table tr[data-iframe] { 144 | background-image: -o-repeating-linear-gradient(90deg, transparent, transparent 5px, rgba(128, 255, 128, 0.506) 5px, rgba(255, 255, 255, 0.506) 10px); 145 | background-image: repeating-linear-gradient(90deg, transparent, transparent 5px, rgba(128, 255, 128, 0.506) 5px, rgba(255, 255, 255, 0.506) 10px); 146 | } 147 | 148 | #siteinfo_table tr[data-scripts] { 149 | background-image: -o-repeating-linear-gradient(-45deg, transparent, transparent 3px, rgba(255, 255, 255, 0.506) 3px, rgba(255, 255, 255, 0.506) 6px); 150 | background-image: repeating-linear-gradient(-45deg, transparent, transparent 3px, rgba(255, 255, 255, 0.506) 3px, rgba(255, 255, 255, 0.506) 6px); 151 | } 152 | 153 | #siteinfo_table tr[data-modified], #siteinfo_table tr[data-modified][data-csspatch], #siteinfo_table tr[data-modified][data-jspatch] { 154 | background: #fcd; 155 | } 156 | 157 | #siteinfo_table tr[data-remove], #siteinfo_table tr[data-csspatch], #siteinfo_table tr[data-jspatch] { 158 | background: #dcf; 159 | } 160 | 161 | #siteinfo_table tr[data-disabled="disabled"] { 162 | color: #808080 !important; 163 | } 164 | 165 | #siteinfo_table tr[data-disabled] button { 166 | color: #808080 !important; 167 | } 168 | 169 | td.name, 170 | td.created_by { 171 | white-space: nowrap; 172 | overflow: hidden; 173 | } 174 | 175 | td.name { 176 | padding: 0; 177 | margin: 0; 178 | max-width: 640px; 179 | width: 640px; 180 | } 181 | 182 | td.created_by { 183 | text-align: left; 184 | max-width: 8em; 185 | width: 8em; 186 | text-overflow:ellipsis; 187 | } 188 | 189 | td.created_by, 190 | td.updated_at, 191 | td.created_at, 192 | td.resource_url, 193 | td.database_resource_url { 194 | padding-left: 0.3em; 195 | padding-right: 0.3em; 196 | } 197 | 198 | td.name button { 199 | background: transparent; 200 | border: 0; 201 | cursor: pointer; 202 | width: 100%; 203 | height: 120%; 204 | margin: 0; 205 | text-overflow: ellipsis; 206 | } 207 | 208 | #siteinfo_nav { 209 | text-align: center; 210 | } 211 | 212 | #siteinfo_nav a:hover { 213 | background: #993333; 214 | color: #ffffff; 215 | } 216 | 217 | #siteinfo_nav a:target { 218 | background: #6c521c; 219 | color: #ffffff; 220 | } 221 | 222 | #siteinfo_nav a { 223 | text-decoration: none; 224 | background: #e8d2a6; 225 | display: inline-block; 226 | color: #404040; 227 | margin: 1px 3px; 228 | padding: 1px; 229 | border-radius: 4px; 230 | -webkit-border-radius: 4px; 231 | min-width: 1.5em; 232 | border: none; 233 | text-align: center; 234 | font-weight: bold; 235 | font-size: small; 236 | } 237 | 238 | #siteinfo_search_input { 239 | width: 93%; 240 | border: 2px solid #ff9933; 241 | border-radius: 3px; 242 | -webkit-border-radius: 3px; 243 | } 244 | 245 | #siteinfo_head th { 246 | margin: 0; 247 | padding: 0; 248 | } 249 | 250 | th[colspan="6"] { 251 | min-width: 170px; 252 | width: 170px; 253 | } 254 | 255 | th[colspan="6"]+th { 256 | width: 640px; 257 | } 258 | 259 | #siteinfo_head th button { 260 | background: #555; 261 | border-left: 1px solid #888; 262 | cursor: pointer; 263 | color: #fff; 264 | width: 100%; 265 | height: 4.2em; 266 | margin: 0; 267 | display: block; 268 | } 269 | 270 | #siteinfo_head th button.c-down:before { 271 | content: '▼'; 272 | } 273 | 274 | #siteinfo_head th button.c-up:before { 275 | content: '▲'; 276 | } 277 | 278 | #siteinfo_head th button.c-down { 279 | background: #777; 280 | color: #fff; 281 | } 282 | 283 | #siteinfo_head th button.c-up { 284 | background: #777; 285 | color: #fff; 286 | } 287 | 288 | #loader { 289 | display: inline-block; 290 | position: relative; 291 | height: 11px; 292 | width: 16px; 293 | z-index: 1000; 294 | } 295 | 296 | /* Progress bar */ 297 | 298 | #progressbar { 299 | background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAICAIAAAEIE9hWAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAGlJREFUGFeFUEEOgDAI4/+vZCC+w7IuBKdGDlBKadjknCHHjCwRwZyNmTHLGAOIWTB1d/Yd5woKDOlXWFAohFfHabVp/6zYxIyO06rkPAmZ41f+tlDstsBLya9feoqKV9XOr9f1BTJf/AUYkVWb6QvqpgAAAABJRU5ErkJggg==); 300 | width: 256px; 301 | height: 38px; 302 | position: absolute; 303 | top: 50%; 304 | left: 50%; 305 | margin-top: -19px; 306 | margin-left: -125px; 307 | border-radius: 8px; 308 | border-top: 2px solid #DDD; 309 | border-left: 2px solid #DDD; 310 | border-bottom: 2px solid #BBB; 311 | border-right: 2px solid #BBB; 312 | padding: 3px; 313 | overflow: hidden; 314 | line-height: 38px; 315 | font-size: 14px; 316 | font-weight: bold; 317 | color: #777; 318 | z-index: 1001; 319 | } 320 | 321 | #progress { 322 | text-align: center; 323 | -webkit-transition: all 0.3s ease; 324 | -moz-transition: all 0.3s ease; 325 | -ms-transition: all 0.3s ease; 326 | -o-transition: all 0.3s ease; 327 | transition: all 0.3s ease; 328 | height: 38px; 329 | width: 0px; 330 | max-width: 256px; 331 | background-color: #0080FF; 332 | border-radius: 6px; 333 | background: #6db3f2; 334 | background: -moz-linear-gradient(top, #6db3f2 0%, #54a3ee 50%, #3690f0 51%, #1e69de 100%); 335 | /* FF3.6+ */ 336 | background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #6db3f2), color-stop(50%, #54a3ee), color-stop(51%, #3690f0), color-stop(100%, #1e69de)); 337 | /* Chrome,Safari4+ */ 338 | background: -webkit-linear-gradient(top, #6db3f2 0%, #54a3ee 50%, #3690f0 51%, #1e69de 100%); 339 | /* Chrome10+,Safari5.1+ */ 340 | background: -o-linear-gradient(top, #6db3f2 0%, #54a3ee 50%, #3690f0 51%, #1e69de 100%); 341 | /* Opera 11.10+ */ 342 | background: -ms-linear-gradient(top, #6db3f2 0%, #54a3ee 50%, #3690f0 51%, #1e69de 100%); 343 | /* IE10+ */ 344 | background: linear-gradient(to bottom, #6db3f2 0%, #54a3ee 50%, #3690f0 51%, #1e69de 100%); 345 | /* W3C */ 346 | overflow: hidden; 347 | z-index: 1002; 348 | position: absolute; 349 | left: 3px; 350 | } 351 | 352 | #progress_percent { 353 | text-align: center; 354 | line-height: 38px; 355 | font-size: 14px; 356 | font-weight: bold; 357 | color: #777; 358 | height: 38px; 359 | width: 256px; 360 | z-index: 1010; 361 | position: absolute; 362 | left: 3px; 363 | } 364 | 365 | td.index { 366 | padding: 0px 3px; 367 | } 368 | 369 | .onoff { 370 | color: #000; 371 | background-color: #B6B6B6; 372 | } 373 | 374 | .disable_separator { 375 | color: #000; 376 | background-color: #A9D0F5; 377 | } 378 | 379 | .scripts_enable { 380 | color: #000; 381 | background-color: #F2F5A9; 382 | } 383 | 384 | .force_iframe { 385 | color: #000; 386 | background-color: #F5D0A9; 387 | } 388 | 389 | .address_change { 390 | color: #000; 391 | background-color: #D0F5A9; 392 | } 393 | 394 | /* Language strings */ 395 | 396 | .MSG_manager:lang(ru) { content: 'Редактор базы SITEINFO'} 397 | .MSG_siteinfo_search_input:lang(ru) { content: 'Поиск:'} 398 | span.onoff:lang(ru) { content: 'откл.'} 399 | span.disable_separator:lang(ru) { content: 'без раздел.'} 400 | span.address_change:lang(ru) { content: 'адрес'} 401 | span.scripts_enable:lang(ru) { content: 'скрипты'} 402 | span.force_iframe:lang(ru) { content: 'iframe'} 403 | #name:lang(ru) { line-height: 3.5em; content: 'Название'} 404 | #created_at:lang(ru) { line-height: 3.5em; content: 'Создано'} 405 | #updated_at:lang(ru) { line-height: 3.5em; content: 'Обновл.'} 406 | #created_by:lang(ru) { line-height: 3.5em; content: 'Автор'} 407 | #resource_url:lang(ru) { line-height: 3.5em; content: 'Ссылка'} 408 | #database_resource_url:lang(ru) { line-height: 3.5em; content: 'База'} 409 | #number_of_successful:lang(ru) { line-height: 3.5em; content: 'Сраб.'} 410 | #number_of_failed:lang(ru) { line-height: 3.5em; content: 'Сбоев'} 411 | dt.resource_url:lang(ru) { content: 'URL записи'} 412 | dt.name:lang(ru) { content: 'Описание'} 413 | dt.created_by:lang(ru) { content: 'Создано'} 414 | dt.database_resource_url:lang(ru) { content: 'URL базы'} 415 | dt.updated_at:lang(ru) { content: 'Обновлено'} 416 | dt.created_at:lang(ru) { content: 'Создано'} 417 | dt.number_of_successful:lang(ru) { content: 'Срабатываний'} 418 | dt.number_of_failed:lang(ru) { content: 'Сбоев'} 419 | -------------------------------------------------------------------------------- /css/options.css: -------------------------------------------------------------------------------- 1 | @supports (-webkit-appearance:none) { 2 | html { 3 | padding: 0 10px; 4 | /*background: #e8ecf3 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAF2CAYAAABXpQmzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAPQUlEQVRo3sWb227zXBGGxytJ2%2FsAJI4RCPglbh4hNkIcIwQX8rVJZn7P5h2%2FWbXTnlEpTeLYazvbx%2BPx93%2F9z%2F7yj%2F%2FE689%2F%2B3e8%2B7G%2F%2FvO%2Ffcw%2FD1UT%2FxtjCP5ut7uYbcdVVcbtdosv%2FsPLy6VP9u9%2B3F%2FLssg4n89x0F%2F3u%2FaP%2Fvr4ePfWLC663%2B9xhTfvn6%2FXa3z2v%2FP54hcs5%2FNJhp%2FkV3jL%2FrpcLg%2FjxUXDzz6dhsn0tzbUY%2FUJj4%2BPq39fPj4%2Begj%2B8pmfTqc4Vi2eazxnqWP9o4%2F3vJ7sk%2FKx9rrh3Sflrfp4b%2BvnMdbJRP%2Fr4L0bvLL1JVpED0Nza3ytbP3B1g0wb80vwHr67%2F4%2FfrxHF8PW1uJCb8C%2F%2B%2Be1Rf%2B8XeVd%2BJZ66%2BhpnYhGi96aX4ErvcW123jPlmIIy8AJq0DEOP17vcTXtj7rwBb5wm%2FCEctj6%2FJYTmqdtXfjB71FtO5%2F%2Fu7H%2FbU2ErOO2bo0%2BcG1tZ4tLozJXC5n9abrBMwYUhOfY1L%2BbRXYGIv%2FgHdMyIcWva77ayW0GJ9giUqoY31HfdDqYj3ppCmD0Uss9nrMQhX8iy%2BFL74vU8245PKWs%2Fa%2BsIXepb%2F8R%2B%2B6diiGMiAEAhGq3fG%2F6i0l3PXFJ%2BLb5D9Cz12XfAglWS4Uqa5%2BNWac65et1zZabOHtFvvc25ZSkzvy%2Fv4jW%2FQf3t7eFPIHufTZ%2BxBeXl7TvKxjlB8%2Ffgi0sSQoZl97rvHZd2a9qmfqB6%2FXj5596XquI7pdBSRare5ixusYY9EHVNTH4637wTQ5Wsp2sbBHq7hb7k7O0gXYl6rGCLOXWuhffD1hczAc1iFsoS%2B41jpqLPAYELkU3JJshRDAFJdBbTkYaRHS3EEo%2FEToSo8xtXBbv7IWmkKcRiCWB8qUM34VrOf6gujJ29urtLquNgYLr2lz0rLlwt9zMv73%2BvomJTmLn1QWrOzRyVu0GDgUvwyVYInK3LR9ZDdXZuS9V8KFd7jkYNGxbt7S5fISauqTCiNbPgXb1VIDxfKJuH67IVXosrdQahsd%2BEl%2Bve9S%2BBlYr%2BvV9XnIprVpzWIFyma3m%2FBdwtJgvBAzhY3x7nyZYOpq%2B9yPp9krvxLdlTBoLU2cVE5rQDcs1%2FQK3xjduu0MG572%2ByUEwn%2FM91OborQiGgYgnBDGpvFnmhbNndXiIqcD1rUsbEi4L7YHIt6Sjy8sRVrWGKfANvq2%2BWJD%2BSHhIR1%2Bkh%2FMk%2B89xnTLEXyEWYZAtEeohVZ3zSFmUN8ynt7qUo4JOxYXjQwRYEbswWul4t3TwXvz2E%2FuFlYYttO3cMH44C4gxL6dq0Sh%2B6EUEgjEDi%2F%2F3tEeRMztjwsyPENK%2BE1r3%2FPKWkPBeOGre%2Ba%2BoDCaiAZIVTeT4lPKVtPkYdExqW4o451FXQAggzSMkKJoCBKMnfCWK8rzVhc40vH%2B%2FhHdcnCJyVSLrq6YTOy1uri5AGxDjcmkqT6XwKaUa4cyUIOejNYPHLi54KZiZaAUk6FuOn70ixBClAjmznAMWT6nAzo%2FFCeXueggrrZOymBF%2BFqxZXouF6eU8nNpYii%2BlsfVUfHEw4T886mcKIKQAc%2BEAC4nNVxmZr3p7rrVnIzA5aUZdImBPYzQqn3hzR60EElFhTBC7heCkcJCkee2C9lqTwzxI7xTG6hNmId0jFtd9274AkS86D%2FmrqVhgHctLexuw96UnMY7wkFspZ%2Fs3cOPZ8AkgkBTqjt4f%2BiZtUOlpMIqK%2BoguIL37A3dphKdsI0U9dXOeNcuSu7vEGbDeiCKDsdaoYGuJysiKniKDtZhSN2JU94aQ8D6YijjEmO7YFwlbtqSVCmrjesNhnJpe4joqiKqjKRqDBG8wS%2BWXZSMXl5y1gizat1SDUpgM1C%2Bp77DqCOOhL5gsSuqjhNDVZGnepe33A3t3NoTtPSDuQTeAnao7GN4idCp8hwPjmiHAWReSAwA%2FlDhqHqvIRS5C4p9BgMwZgCdI%2FhnX2AYrWIAqU%2FY07LVYAC2IYCchDOAiB3IVyvitc2er%2BN1JcoI9MMo17IK3owZAKQk7A0sxMQAbI8BKCe56y4pGIBCAOrVYTVEDNasnVAxACSPrTvMAHSHAcDhl85vDEBLeoyC%2BJhIZOzEAARhP49znUhuKTGAmPHEALbIBTbGF35iAK7rsI%2FIPlR2GIAQA8iuJwYgRwzAigEIMQDjoCmWhxhALAPMHsSsvtvMAFo2JwaQgksMIHIXdI%2FWI9CE%2FysGIJX09IyLAWj76x0GAJqUOl6ZhhECaBWAbazYrBlACe8NmtcmJpYOYTSs%2F1cMgNGNHDEAj2M5vNZiABWUbAzAVgbQXRIDEFoNZQYgOwygucoAiclFP1fW%2FmqIz32MYACdeLteIziuaCBgZSSQjrx2GMBDdFrx2SiXdkdcdsgApBhABxzEADYihywY5gR5AjEAYQbQXWGHoOsPGRIxAAhCx4%2FMADpOB3wpBtDp1MoAGtkpMQAjBtB2EwxAVgbQccQOA%2FAWzSg4YgbQqX7TQvhoRPfFANpphktBzrrDABZiAFa2JxUf8lgBkxIDMDAA22EARgzAZgaQgfBnBhDJ2STNuQoTA0gxI4rZxBUteUNgAC1aJRCKYMm%2Fu22vVHVAN4QYgE2pQOp1MYCYbb6fbI8BVHZ0V5g678qPrSugxQCEGcAyMYCIMYoBGBhAxzfeEjEATCpZMzEA33etgEkqZtMKPhLNErgSXmhXsjDNPYYynsgbINB1UeZcJY9GDECIAfSJ8oQBGGwntlCIAQjH4Z4AIZWyHQbQMRqIyMwArBhAE1cwlpkBfKLsmHrDfU5NASxnBmDEAFqAfQjIQsAAyrFvXTOKgCcbkODKKq0YQHc5MwAOLjtAQqQfyA72MVO7ocQAOmgKCEgMIAQVkI3Tge8wAByTQd3A63eUf8QAZGIAgqQnVqOEdiEGIMQAQvpL6TI%2FLQbQC51Rft%2Bn225pkF8JPT6lEzUEx18xANabrbuvGIAQAyBfeDPKaTKVwpHU1E1YSzAUDEA246QPeWspWMePBclPvG2tYB3jEgPoG4oIkCDEzABsRt3EAOyIAXTiCLvkMRMzgJB0N%2FawizAKvTPEAOBKQqoRQ84MQCYGIHsMIHIZlxhsG3aoLQWEwn1yZpdLk00mC7E8lbPYAQOQPQZQ%2BYJi8T8xACEGEE4dk5gZgBUD6LCw3LN8lwHIzACsGIAUAwAv05kBCFmwuMNcIa3sMQAhBtAsjRkA3IMQA2i%2FwwwAKZRSHYDiziS2cmYAdsAAjBmATAzAQ2s7YgB504bG2%2FEaMQDO3mxiAMYMQL5iAH2vo44pbNBcB%2BAxhFYsq%2FON7luo8Mm4DgA2XCusBmZqazbXAfT9GqwpM4BOciuMxa1KmesAwB079j6qA2hrcVAHIHMdwMPCFwOQPQbQkl3Lkw5zqgNoowSVgBU%2BqgNgBiBHDKB5WQ1JmQG4wCojT6JJ%2BK5gAAsxAK4DsKM6gJBmeFkYVdQBwOwp3zvUQsI41mEhalMQ5yIa2KsDmBHAJwYgFD8YWN8RA%2BhI6rt1APIVAzC%2BxfaMAaAOoBNYhLCdiUx1AEIMoNUADIDrAJgBKDEARR1AQ1%2B%2BxUYMoOsAhBgALG%2FDfdyg7XiMGMDDjYi5DqCBEIaC2YeYUR2AUEDktyiVQsasxlnHtxADEIQwVAcgewzAnjGAXr%2Fk980ApBjAQx3Awy1VqgOQuQ5gZgByxADkoA7AuA5Ayc2F1hcDkJkByINPWS9YGYA8YwBCDKAdKBhAJIgIDVGwwqQdDKANOtUByDMGYF%2FVAQgxACUGIHMdABhAl%2B5wUchRHYB4ROKG9ogBCOoqqg5AoZVpRZIBKOon4IK9q2IAiFLTDU91APFeDKBtENcBHDGATcKnOgAwgDghjWkyAC0G8ODeoIVcB4CiSGYAnMtIh64HDECoDsCYAVBJY%2Bq2O8%2BqAxBmAI2MKQ4XrgMQvvE%2BMQBjBqDwor47EwPY7iHh6uIoRnUAMtcBzAwAuM6oMHHZYwBVN3ND4htOkRkAutYaRsflMTxiACjVku8wADtgADYzgLgrwcl5MQDbYwC4raE46SsGIMQAtrAQDOVZHUCPiRhApH2V9HyqA2hHlCpxQnGiMAMwYgBQ%2FC6LisV%2FUgegVAeggyp5u4iqGIBQHYDMdQDyjAG0q0AyDgxGOc0nBmBTHUBnc8wA2utPdQBb%2FIhqz6l8gxmAdte1G1wH0OoRFndiADLVAQgzgOY6VAcwM4DHnSnrajsMwI4YQOey96pqOWIAQtn6Vq14UAcgvBkQCqs6AKE6gLZoMwNogfDFR2tcByBfMIDc6%2BsNsPShDoDvqmQktcMADEtWdQA5ToRZX9QBZK5AdQDMAAQlHavH1bkOgBmAzXUAclAHsMsAHtInYgCw710HoAgLuNAYJWaoA5ifBeictRiAzHUAclAHIGAAiOi1GACjWuE6gPlZAGypEg21vToAo2cB2sz07dR6FsDoWYAY7zluJ2wMoHUbMjg9C%2FCJARgxACMG0OXzfa%2FIHSTfCqwVWJgBaAlu38hBzBstzncBJgagYGpzHcDMAGSuA5CdZwHsqA6gK7m%2F%2ByyAwGF%2B51kAecYA%2BubN9CxA13IpPQvQhJ0YgOBZgCbXsDcolSAGYGAAslMHoFQH0AzAigFwHcCnZwGYAejOswBdB8BhzDI9C%2FCpDqAR2cQAjBmATAxAiAEEv5jrAPyCZedZAOFnAXAnWQ8YgPGzAA8PN1DmFGHNXh2ATAzg4VkA%2BU4dALJKpToAFNnI3rMAMtUBSEWnxgyA6wCMGEDILjMAneoAZK8OQHbqANig6vwsADOA5n24F4JnAQTrd8AAHuop8CxArOfEALTLdnDzHWOaGIDsPQsgQGIzA5CpDqALluZnAXSqA8CzADY%2FCyD8INWzZwFmBmDPGAAGrYjVJgYgYACa9WWHdQAKBrBMdQB2VAfQioVEguoAopSenwUAbX0QhmIAtvcsgFEdgDEDMGIAUgzAiAE81AHAE%2BgOA7A9BiDEAHRmAEIMQIgBLMQAsr6nGIAQA2jEWAwgngUQehaA6wDAAIQZgD1hALbHAOSgDsDwLICQZ5XpWQABAxAqa2MGgARI5zqALvDj%2BAyrMaAvuAPp3%2BEZqA5AmAHMdQBGt1btqA5A9p4F2GMAQgzA%2BFkA1AHoNIytDuBPf%2Fi1%2Ff43v7Cffvcr%2BeNvf%2Bkv82P1Wfyzv4Z88%2B%2F%2FeOLP4lYmZGAO9bMAAAAASUVORK5CYII%3D) repeat-x;*/ 5 | } 6 | body { 7 | /*background: rgba(255,255,255,0.5) linear-gradient(rgba(255,255,255,0.5),rgba(212,212,212,0.5)) repeat-x;*/ 8 | } 9 | } 10 | 11 | doesnotexist:-o-prefocus, html { 12 | background: #e8ecf3 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAF2CAYAAABXpQmzAAAACXBIWXMAAAsTAAALEwEAmpwYAAAPQUlEQVRo3sWb227zXBGGxytJ2%2FsAJI4RCPglbh4hNkIcIwQX8rVJZn7P5h2%2FWbXTnlEpTeLYazvbx%2BPx93%2F9z%2F7yj%2F%2FE689%2F%2B3e8%2B7G%2F%2FvO%2Ffcw%2FD1UT%2FxtjCP5ut7uYbcdVVcbtdosv%2FsPLy6VP9u9%2B3F%2FLssg4n89x0F%2F3u%2FaP%2Fvr4ePfWLC663%2B9xhTfvn6%2FXa3z2v%2FP54hcs5%2FNJhp%2FkV3jL%2FrpcLg%2FjxUXDzz6dhsn0tzbUY%2FUJj4%2BPq39fPj4%2Begj%2B8pmfTqc4Vi2eazxnqWP9o4%2F3vJ7sk%2FKx9rrh3Sflrfp4b%2BvnMdbJRP%2Fr4L0bvLL1JVpED0Nza3ytbP3B1g0wb80vwHr67%2F4%2FfrxHF8PW1uJCb8C%2F%2B%2Be1Rf%2B8XeVd%2BJZ66%2BhpnYhGi96aX4ErvcW123jPlmIIy8AJq0DEOP17vcTXtj7rwBb5wm%2FCEctj6%2FJYTmqdtXfjB71FtO5%2F%2Fu7H%2FbU2ErOO2bo0%2BcG1tZ4tLozJXC5n9abrBMwYUhOfY1L%2BbRXYGIv%2FgHdMyIcWva77ayW0GJ9giUqoY31HfdDqYj3ppCmD0Uss9nrMQhX8iy%2BFL74vU8245PKWs%2Fa%2BsIXepb%2F8R%2B%2B6diiGMiAEAhGq3fG%2F6i0l3PXFJ%2BLb5D9Cz12XfAglWS4Uqa5%2BNWac65et1zZabOHtFvvc25ZSkzvy%2Fv4jW%2FQf3t7eFPIHufTZ%2BxBeXl7TvKxjlB8%2Ffgi0sSQoZl97rvHZd2a9qmfqB6%2FXj5596XquI7pdBSRare5ixusYY9EHVNTH4637wTQ5Wsp2sbBHq7hb7k7O0gXYl6rGCLOXWuhffD1hczAc1iFsoS%2B41jpqLPAYELkU3JJshRDAFJdBbTkYaRHS3EEo%2FEToSo8xtXBbv7IWmkKcRiCWB8qUM34VrOf6gujJ29urtLquNgYLr2lz0rLlwt9zMv73%2BvomJTmLn1QWrOzRyVu0GDgUvwyVYInK3LR9ZDdXZuS9V8KFd7jkYNGxbt7S5fISauqTCiNbPgXb1VIDxfKJuH67IVXosrdQahsd%2BEl%2Bve9S%2BBlYr%2BvV9XnIprVpzWIFyma3m%2FBdwtJgvBAzhY3x7nyZYOpq%2B9yPp9krvxLdlTBoLU2cVE5rQDcs1%2FQK3xjduu0MG572%2ByUEwn%2FM91OborQiGgYgnBDGpvFnmhbNndXiIqcD1rUsbEi4L7YHIt6Sjy8sRVrWGKfANvq2%2BWJD%2BSHhIR1%2Bkh%2FMk%2B89xnTLEXyEWYZAtEeohVZ3zSFmUN8ynt7qUo4JOxYXjQwRYEbswWul4t3TwXvz2E%2FuFlYYttO3cMH44C4gxL6dq0Sh%2B6EUEgjEDi%2F%2F3tEeRMztjwsyPENK%2BE1r3%2FPKWkPBeOGre%2Ba%2BoDCaiAZIVTeT4lPKVtPkYdExqW4o451FXQAggzSMkKJoCBKMnfCWK8rzVhc40vH%2B%2FhHdcnCJyVSLrq6YTOy1uri5AGxDjcmkqT6XwKaUa4cyUIOejNYPHLi54KZiZaAUk6FuOn70ixBClAjmznAMWT6nAzo%2FFCeXueggrrZOymBF%2BFqxZXouF6eU8nNpYii%2BlsfVUfHEw4T886mcKIKQAc%2BEAC4nNVxmZr3p7rrVnIzA5aUZdImBPYzQqn3hzR60EElFhTBC7heCkcJCkee2C9lqTwzxI7xTG6hNmId0jFtd9274AkS86D%2FmrqVhgHctLexuw96UnMY7wkFspZ%2Fs3cOPZ8AkgkBTqjt4f%2BiZtUOlpMIqK%2BoguIL37A3dphKdsI0U9dXOeNcuSu7vEGbDeiCKDsdaoYGuJysiKniKDtZhSN2JU94aQ8D6YijjEmO7YFwlbtqSVCmrjesNhnJpe4joqiKqjKRqDBG8wS%2BWXZSMXl5y1gizat1SDUpgM1C%2Bp77DqCOOhL5gsSuqjhNDVZGnepe33A3t3NoTtPSDuQTeAnao7GN4idCp8hwPjmiHAWReSAwA%2FlDhqHqvIRS5C4p9BgMwZgCdI%2FhnX2AYrWIAqU%2FY07LVYAC2IYCchDOAiB3IVyvitc2er%2BN1JcoI9MMo17IK3owZAKQk7A0sxMQAbI8BKCe56y4pGIBCAOrVYTVEDNasnVAxACSPrTvMAHSHAcDhl85vDEBLeoyC%2BJhIZOzEAARhP49znUhuKTGAmPHEALbIBTbGF35iAK7rsI%2FIPlR2GIAQA8iuJwYgRwzAigEIMQDjoCmWhxhALAPMHsSsvtvMAFo2JwaQgksMIHIXdI%2FWI9CE%2FysGIJX09IyLAWj76x0GAJqUOl6ZhhECaBWAbazYrBlACe8NmtcmJpYOYTSs%2F1cMgNGNHDEAj2M5vNZiABWUbAzAVgbQXRIDEFoNZQYgOwygucoAiclFP1fW%2FmqIz32MYACdeLteIziuaCBgZSSQjrx2GMBDdFrx2SiXdkdcdsgApBhABxzEADYihywY5gR5AjEAYQbQXWGHoOsPGRIxAAhCx4%2FMADpOB3wpBtDp1MoAGtkpMQAjBtB2EwxAVgbQccQOA%2FAWzSg4YgbQqX7TQvhoRPfFANpphktBzrrDABZiAFa2JxUf8lgBkxIDMDAA22EARgzAZgaQgfBnBhDJ2STNuQoTA0gxI4rZxBUteUNgAC1aJRCKYMm%2Fu22vVHVAN4QYgE2pQOp1MYCYbb6fbI8BVHZ0V5g678qPrSugxQCEGcAyMYCIMYoBGBhAxzfeEjEATCpZMzEA33etgEkqZtMKPhLNErgSXmhXsjDNPYYynsgbINB1UeZcJY9GDECIAfSJ8oQBGGwntlCIAQjH4Z4AIZWyHQbQMRqIyMwArBhAE1cwlpkBfKLsmHrDfU5NASxnBmDEAFqAfQjIQsAAyrFvXTOKgCcbkODKKq0YQHc5MwAOLjtAQqQfyA72MVO7ocQAOmgKCEgMIAQVkI3Tge8wAByTQd3A63eUf8QAZGIAgqQnVqOEdiEGIMQAQvpL6TI%2FLQbQC51Rft%2Bn225pkF8JPT6lEzUEx18xANabrbuvGIAQAyBfeDPKaTKVwpHU1E1YSzAUDEA246QPeWspWMePBclPvG2tYB3jEgPoG4oIkCDEzABsRt3EAOyIAXTiCLvkMRMzgJB0N%2FawizAKvTPEAOBKQqoRQ84MQCYGIHsMIHIZlxhsG3aoLQWEwn1yZpdLk00mC7E8lbPYAQOQPQZQ%2BYJi8T8xACEGEE4dk5gZgBUD6LCw3LN8lwHIzACsGIAUAwAv05kBCFmwuMNcIa3sMQAhBtAsjRkA3IMQA2i%2FwwwAKZRSHYDiziS2cmYAdsAAjBmATAzAQ2s7YgB504bG2%2FEaMQDO3mxiAMYMQL5iAH2vo44pbNBcB%2BAxhFYsq%2FON7luo8Mm4DgA2XCusBmZqazbXAfT9GqwpM4BOciuMxa1KmesAwB079j6qA2hrcVAHIHMdwMPCFwOQPQbQkl3Lkw5zqgNoowSVgBU%2BqgNgBiBHDKB5WQ1JmQG4wCojT6JJ%2BK5gAAsxAK4DsKM6gJBmeFkYVdQBwOwp3zvUQsI41mEhalMQ5yIa2KsDmBHAJwYgFD8YWN8RA%2BhI6rt1APIVAzC%2BxfaMAaAOoBNYhLCdiUx1AEIMoNUADIDrAJgBKDEARR1AQ1%2B%2BxUYMoOsAhBgALG%2FDfdyg7XiMGMDDjYi5DqCBEIaC2YeYUR2AUEDktyiVQsasxlnHtxADEIQwVAcgewzAnjGAXr%2Fk980ApBjAQx3Awy1VqgOQuQ5gZgByxADkoA7AuA5Ayc2F1hcDkJkByINPWS9YGYA8YwBCDKAdKBhAJIgIDVGwwqQdDKANOtUByDMGYF%2FVAQgxACUGIHMdABhAl%2B5wUchRHYB4ROKG9ogBCOoqqg5AoZVpRZIBKOon4IK9q2IAiFLTDU91APFeDKBtENcBHDGATcKnOgAwgDghjWkyAC0G8ODeoIVcB4CiSGYAnMtIh64HDECoDsCYAVBJY%2Bq2O8%2BqAxBmAI2MKQ4XrgMQvvE%2BMQBjBqDwor47EwPY7iHh6uIoRnUAMtcBzAwAuM6oMHHZYwBVN3ND4htOkRkAutYaRsflMTxiACjVku8wADtgADYzgLgrwcl5MQDbYwC4raE46SsGIMQAtrAQDOVZHUCPiRhApH2V9HyqA2hHlCpxQnGiMAMwYgBQ%2FC6LisV%2FUgegVAeggyp5u4iqGIBQHYDMdQDyjAG0q0AyDgxGOc0nBmBTHUBnc8wA2utPdQBb%2FIhqz6l8gxmAdte1G1wH0OoRFndiADLVAQgzgOY6VAcwM4DHnSnrajsMwI4YQOey96pqOWIAQtn6Vq14UAcgvBkQCqs6AKE6gLZoMwNogfDFR2tcByBfMIDc6%2BsNsPShDoDvqmQktcMADEtWdQA5ToRZX9QBZK5AdQDMAAQlHavH1bkOgBmAzXUAclAHsMsAHtInYgCw710HoAgLuNAYJWaoA5ifBeictRiAzHUAclAHIGAAiOi1GACjWuE6gPlZAGypEg21vToAo2cB2sz07dR6FsDoWYAY7zluJ2wMoHUbMjg9C%2FCJARgxACMG0OXzfa%2FIHSTfCqwVWJgBaAlu38hBzBstzncBJgagYGpzHcDMAGSuA5CdZwHsqA6gK7m%2F%2ByyAwGF%2B51kAecYA%2BubN9CxA13IpPQvQhJ0YgOBZgCbXsDcolSAGYGAAslMHoFQH0AzAigFwHcCnZwGYAejOswBdB8BhzDI9C%2FCpDqAR2cQAjBmATAxAiAEEv5jrAPyCZedZAOFnAXAnWQ8YgPGzAA8PN1DmFGHNXh2ATAzg4VkA%2BU4dALJKpToAFNnI3rMAMtUBSEWnxgyA6wCMGEDILjMAneoAZK8OQHbqANig6vwsADOA5n24F4JnAQTrd8AAHuop8CxArOfEALTLdnDzHWOaGIDsPQsgQGIzA5CpDqALluZnAXSqA8CzADY%2FCyD8INWzZwFmBmDPGAAGrYjVJgYgYACa9WWHdQAKBrBMdQB2VAfQioVEguoAopSenwUAbX0QhmIAtvcsgFEdgDEDMGIAUgzAiAE81AHAE%2BgOA7A9BiDEAHRmAEIMQIgBLMQAsr6nGIAQA2jEWAwgngUQehaA6wDAAIQZgD1hALbHAOSgDsDwLICQZ5XpWQABAxAqa2MGgARI5zqALvDj%2BAyrMaAvuAPp3%2BEZqA5AmAHMdQBGt1btqA5A9p4F2GMAQgzA%2BFkA1AHoNIytDuBPf%2Fi1%2Ff43v7Cffvcr%2BeNvf%2Bkv82P1Wfyzv4Z88%2B%2F%2FeOLP4lYmZGAO9bMAAAAASUVORK5CYII%3D) repeat-x; 13 | } 14 | 15 | doesnotexist:-o-prefocus, body { 16 | background: rgba(255,255,255,0.5) linear-gradient(rgba(255,255,255,0.5),rgba(212,212,212,0.5)) repeat-x; 17 | } 18 | 19 | _:-moz-tree-row(hover), html { 20 | overflow: hidden; 21 | } 22 | 23 | _:-moz-tree-row(hover), body { 24 | box-shadow: none !important; 25 | } 26 | 27 | 28 | html * { 29 | font-size: 100%; 30 | line-height: 1.6; 31 | } 32 | 33 | body { 34 | text-align: left; 35 | word-wrap: break-word; 36 | padding: 5px; 37 | border-width: 15px; 38 | /* 39 | -o-border-image: url(data:image/png;base64,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) 20 stretch; 40 | */ 41 | border-radius: 5px; 42 | border: 1px solid rgba(255,255,255,0.33); 43 | box-shadow: 0 0 10px #98b0c9; 44 | color: #1e3853; 45 | font: 13px/22px Verdana, Tahoma, Arial, Helvetica, geneva, sans-serif; 46 | margin: 25px auto 10px auto; 47 | max-width: 720px; 48 | overflow-x: hidden; 49 | } 50 | 51 | ul, li, section, div { 52 | border:none; 53 | margin:0; 54 | } 55 | 56 | .tabbox { 57 | } 58 | 59 | .tabbox .tabs { 60 | display:block; 61 | height: 2.25em; 62 | margin-bottom: -1px; 63 | margin: 0; 64 | overflow: hidden; 65 | padding: 0 10px; 66 | text-align: center; 67 | width: 700px; 68 | } 69 | 70 | .tabbox .tabs li { 71 | border-bottom: 1px solid #FFF; 72 | display:inline-block; 73 | height: 2em; 74 | list-style: none; 75 | margin: 0; 76 | overflow: hidden; 77 | padding: .25em .25em 0; 78 | position: relative; 79 | z-index: 1; 80 | } 81 | 82 | .tabbox .tabs li.selected { 83 | z-index: 3; 84 | } 85 | 86 | .tabbox .tabs a { 87 | background: #EEE; 88 | border-bottom: 0; 89 | border-radius: 8px 8px 0 0; 90 | color: #000; 91 | display: inline-block; 92 | float: left; 93 | height: 2em; 94 | line-height: 2em; 95 | padding: 0 10px; 96 | text-decoration: none; 97 | } 98 | 99 | .tabbox .tabs .selected a { 100 | background: #FFF; 101 | box-shadow: #CCC 0 0 .25em; 102 | } 103 | 104 | .tabbox .tabs a:hover { 105 | background: linear-gradient(#EEF, #FFF 70%); 106 | } 107 | 108 | span.key, kbd.key { 109 | background:#334455; 110 | border:2px solid black; 111 | color:#eeeeee; 112 | display:inline-block; 113 | font-size:x-large; 114 | font-weight:bold; 115 | padding:6px; 116 | } 117 | 118 | dt.disabled .key, li.disabled .key { 119 | background:#cccccc; 120 | border:2px solid #bbbbbb; 121 | } 122 | 123 | #base { 124 | background: #FFF; 125 | border-radius: 4px; 126 | border: 1px solid #CCC; 127 | box-shadow: #CCC 0 0 .25em; 128 | overflow: hidden; 129 | width: 717px; 130 | height: 495px; 131 | z-index: 5; 132 | margin-top: -2px; 133 | } 134 | 135 | h1 { 136 | border-top-left-radius:4px; 137 | border-top-right-radius:4px; 138 | color:white; 139 | font-size:small; 140 | line-height:1.4; 141 | margin:0px; 142 | padding:3px 8px; 143 | text-shadow: 3px 3px 3px black; 144 | } 145 | 146 | #inner-container { 147 | vertical-align:top; 148 | } 149 | 150 | #inner-container section { 151 | display:inline-block; 152 | margin:0; 153 | padding: 10px; 154 | vertical-align:top; 155 | white-space:normal; 156 | width:680px; 157 | } 158 | 159 | #filter_type { 160 | height: 27px; 161 | vertical-align: middle; 162 | } 163 | 164 | section > div > fieldset { 165 | border:none; 166 | display:block; 167 | margin:0; 168 | padding:0; 169 | } 170 | 171 | optgroup { 172 | background:#333333; 173 | color:#ffffff; 174 | } 175 | 176 | optgroup > option { 177 | color:#000000; 178 | } 179 | 180 | .content > .box { 181 | display:inline-block; 182 | vertical-align:top; 183 | } 184 | 185 | .content > .box > h3 { 186 | margin:0px; 187 | padding:0 10px; 188 | } 189 | 190 | #about dl { 191 | margin:30px; 192 | } 193 | 194 | #about dl dd { 195 | margin:10px 0 20px 50px; 196 | } 197 | 198 | #css_text, #custom_patterns, #config_text, #backup_field { 199 | height:400px; 200 | width:98%; 201 | max-width: 98%; 202 | } 203 | 204 | #advanced .margin { 205 | margin:60px 0 0 0; 206 | } 207 | 208 | input:not([type="text"]), button, label { 209 | cursor:pointer; 210 | } 211 | 212 | section.content { 213 | -o-transition-property: height; 214 | -o-transition-timing-function: cubic-bezier(0.2, 0.4, 0.7, 0.9) 215 | -o-transition: 0.25s; 216 | } 217 | 218 | section.content > div.sub { 219 | margin-left:2em; 220 | } 221 | 222 | section label, fieldset legend { 223 | font-size: 16px; 224 | vertical-align:middle; 225 | } 226 | 227 | input[type=radio] { 228 | font-size: 16px; 229 | margin-right: 0px !important; 230 | } 231 | 232 | section *:disabled { 233 | opacity: 0.5; 234 | } 235 | 236 | section .btn-group, section .buttons{ 237 | display: inline-block !important; 238 | } 239 | 240 | /*section .btn-group.main:before { 241 | content: 'SITEINFO:'; 242 | float: left; 243 | display: inline-block !important; 244 | height: 25px; 245 | line-height: 25px; 246 | margin-bottom: 5px; 247 | margin-top: 5px; 248 | padding: 0 5px 0 0; 249 | }*/ 250 | 251 | section .btn-group > button:last-child:not(:first-child) { 252 | border-bottom-left-radius: 0px; 253 | border-top-left-radius: 0px; 254 | } 255 | 256 | section .btn-group > button:not(:first-child):not(:last-child) { 257 | border-radius: 0px; 258 | } 259 | 260 | section .btn-group > button:first-child:not(:last-child) { 261 | border-bottom-right-radius: 0px; 262 | border-top-right-radius: 0px; 263 | } 264 | 265 | section .btn-group button + button { 266 | margin-left: -1px; 267 | } 268 | 269 | section .btn-group > button { 270 | float: left; 271 | position: relative; 272 | min-width: 100px; 273 | } 274 | 275 | section button { 276 | -o-transition: 0.25s; 277 | border-radius: 6px 6px 6px 6px; 278 | background: rgba(173,181,217,0.75) url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAAeCAYAAAAGos%2FEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89%2BbN%2FrXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz%2FSMBAPh%2BPDwrIsAHvgABeNMLCADATZvAMByH%2Fw%2FqQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf%2BbTAICd%2BJl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA%2Fg88wAAKCRFRHgg%2FP9eM4Ors7ONo62Dl8t6r8G%2FyJiYuP%2B5c%2BrcEAAAOF0ftH%2BLC%2BzGoA7BoBt%2FqIl7gRoXgugdfeLZrIPQLUAoOnaV%2FNw%2BH48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl%2FAV%2F1s%2BX48%2FPf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H%2FLcL%2F%2Fwd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s%2BwM%2B3zUAsGo%2BAXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93%2F%2B8%2F%2FUegJQCAZkmScQAAXkQkLlTKsz%2FHCAAARKCBKrBBG%2FTBGCzABhzBBdzBC%2FxgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD%2FphCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8%2BQ8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8%2BxdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR%2BcQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI%2BksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG%2BQh8lsKnWJAcaT4U%2BIoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr%2Bh0uhHdlR5Ol9BX0svpR%2BiX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK%2BYTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI%2BpXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q%2FpH5Z%2FYkGWcNMw09DpFGgsV%2FjvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY%2FR27iz2qqaE5QzNKM1ezUvOUZj8H45hx%2BJx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4%2FOBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up%2B6Ynr5egJ5Mb6feeb3n%2Bhx9L%2F1U%2FW36p%2FVHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm%2Beb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw%2B6TvZN9un2N%2FT0HDYfZDqsdWh1%2Bc7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc%2BLpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26%2FuNu5p7ofcn8w0nymeWTNz0MPIQ%2BBR5dE%2FC5%2BVMGvfrH5PQ0%2BBZ7XnIy9jL5FXrdewt6V3qvdh7xc%2B9j5yn%2BM%2B4zw33jLeWV%2FMN8C3yLfLT8Nvnl%2BF30N%2FI%2F9k%2F3r%2F0QCngCUBZwOJgUGBWwL7%2BHp8Ib%2BOPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo%2Bqi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt%2F87fOH4p3iC%2BN7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi%2FRNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z%2Bpn5mZ2y6xlhbL%2BxW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a%2FzYnKOZarnivN7cyzytuQN5zvn%2F%2FtEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1%2B1dT1gvWd%2B1YfqGnRs%2BFYmKrhTbF5cVf9go3HjlG4dvyr%2BZ3JS0qavEuWTPZtJm6ebeLZ5bDpaql%2BaXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO%2FPLi8ZafJzs07P1SkVPRU%2BlQ27tLdtWHX%2BG7R7ht7vPY07NXbW7z3%2FT7JvttVAVVN1WbVZftJ%2B7P3P66Jqun4lvttXa1ObXHtxwPSA%2F0HIw6217nU1R3SPVRSj9Yr60cOxx%2B%2B%2Fp3vdy0NNg1VjZzG4iNwRHnk6fcJ3%2FceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w%2B0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb%2B%2B6EHTh0kX%2Fi%2Bc7vDvOXPK4dPKy2%2BUTV7hXmq86X23qdOo8%2FpPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb%2F1tWeOT3dvfN6b%2FfF9%2FXfFt1%2Bcif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v%2B3Njv3H9qwHeg89HcR%2FcGhYPP%2FpH1jw9DBY%2BZj8uGDYbrnjg%2BOTniP3L96fynQ89kzyaeF%2F6i%2FsuuFxYvfvjV69fO0ZjRoZfyl5O%2FbXyl%2FerA6xmv28bCxh6%2ByXgzMV70VvvtwXfcdx3vo98PT%2BR8IH8o%2F2j5sfVT0Kf7kxmTk%2F8EA5jz%2FGMzLdsAAAAgY0hSTQAAeiUAAICDAAD5%2FwAAgOkAAHUwAADqYAAAOpgAABdvkl%2FFRgAAADdJREFUeNpi%2Bf%2F%2FvwkDAwMDCwMDw38Y4y9uxj8Y4w8Riv8SbSAjI%2BMvmAgTbgYjEWpIUoyqBjAA3v4Smdk8p4QAAAAASUVORK5CYII%3D) 0 50% repeat-x; 279 | border: 1px solid rgba(80,80,130,0.5); 280 | box-shadow: 0 1px 1px rgba(121,153,166,0.75), inset 0 1px rgba(255,255,255,0.25), inset 0 0 1px rgba(255,255,255,0.75); 281 | color: rgba(0,0,0,0.75); 282 | height: 25px; 283 | line-height: 22px; 284 | margin-bottom: 5px; 285 | margin-top: 5px; 286 | padding: 0px 15px; 287 | text-shadow: 0 1px rgba(255,255,255,0.25); 288 | } 289 | 290 | section button:hover { 291 | background-color: #d3dbf5; 292 | box-shadow: 0 1px 1px rgba(121,153,166,0.75), inset 0 1px rgba(255,255,255,0.25), inset 0 0 1px rgba(255,255,255,0.75); 293 | } 294 | 295 | section button img { 296 | border:none; 297 | display: inline-block; 298 | height:16px; 299 | margin:0 3px -3px 0 !important; 300 | padding:0; 301 | width:16px; 302 | } 303 | 304 | section button:focus { 305 | color: rgba(0,0,0,1); 306 | } 307 | 308 | section button:active { 309 | border-color: rgba(80,80,130,0.8); 310 | box-shadow: 0 1px 2px rgba(121,153,166,1), inset 1px 1px 1px rgba(121,153,166,0.5); 311 | } 312 | 313 | section button:disabled { 314 | background: rgba(173,181,217,0.75); 315 | box-shadow: 0 1px 1px rgba(121,153,166,0.75), inset 0 1px rgba(255,255,255,0.25), inset 0 0 1px rgba(255,255,255,0.75) !important; 316 | } 317 | 318 | section input { 319 | background: #fff; 320 | color: #1e3853; 321 | padding: 0; 322 | margin: 0; 323 | vertical-align:middle; 324 | } 325 | 326 | section input[type=text] { 327 | -o-transition: 0.25s; 328 | border-radius: 3px; 329 | border: 1px solid rgba(80,80,130,0.5); 330 | font: 13px/24px "helvetica neue",arial,sans-serif; 331 | height: 25px; 332 | line-height: 22px; 333 | padding: 0 5px; 334 | } 335 | 336 | section input[type=text]:focus { 337 | border-color: rgba(80,80,130,0.8); 338 | } 339 | 340 | section input[type=radio] { 341 | margin-right: 15px; 342 | } 343 | 344 | section input[type=checkbox], fieldset input[type=radio] { 345 | -o-transition: 0.25s; 346 | -webkit-appearance: none; 347 | -moz-appearance: none; 348 | background: #fff; 349 | border-radius: 3px; 350 | border: 1px solid rgba(80,80,130,0.5); 351 | box-shadow: 0 1px 1px rgba(121,153,166,0.75), inset 0 1px rgba(255,255,255,0.25), inset 0 0 1px rgba(255,255,255,0.75); 352 | height: 20px; 353 | padding-left: 5px; 354 | width: 21px; 355 | } 356 | 357 | section input[type="checkbox"]:checked:before { 358 | font-weight: bold; 359 | content: '\2713'; 360 | -webkit-margin-start: 0px; 361 | } 362 | 363 | section input[type=radio]:active, fieldset input[type=checkbox]:active { 364 | background-color: #d3dbf5; 365 | border-color: rgba(80,80,130,0.8); 366 | } 367 | 368 | section input[type=radio]:disabled, fieldset input[type=checkbox]:disabled { 369 | background: #fff; 370 | border-color: rgba(80,80,130,0.5); 371 | } 372 | 373 | span.lt { 374 | display:inline-block; 375 | min-width:60px; 376 | } 377 | 378 | .box dl dt { 379 | border-left:#cccccc 1px solid; 380 | border-right:#cccccc 1px solid; 381 | border-top:#cccccc 1px solid; 382 | padding:.3em .2em; 383 | } 384 | 385 | .box dl dd { 386 | border-bottom:#cccccc 1px solid; 387 | border-left:#cccccc 1px solid; 388 | border-right:#cccccc 1px solid; 389 | padding:.3em .2em; 390 | } 391 | 392 | div.outputs { 393 | display:block; 394 | margin:0; 395 | text-align:center; 396 | width:440px; 397 | } 398 | 399 | div.outputs span.outputs { 400 | background:#dddddd; 401 | border-radius:5px; 402 | display:inline-block; 403 | min-height: 1em; 404 | min-width:4em; 405 | padding:5px 10px; 406 | } 407 | 408 | input[type="range"] { 409 | width:400px; 410 | } 411 | 412 | #news ul { padding-left: 20px; padding-right: 20px; } 413 | 414 | #db_location, #full_db_location { width:400px; margin-right: 5px; } 415 | #update_wedata_full_location, #update_wedata_location { margin-right: 5px; } 416 | #update_siteinfo img { margin-right: 5px; } 417 | 418 | /* Options translation */ 419 | .MSG_general:lang(ru) {content: 'Основые'} 420 | .MSG_filters:lang(ru) {content: 'Фильтры'} 421 | .MSG_styles:lang(ru) {content: 'Стили'} 422 | .MSG_patterns:lang(ru) {content: 'Шаблоны'} 423 | .MSG_backup:lang(ru) {content: 'Бэкап'} 424 | .MSG_backup_preferences:lang(ru) {content: 'Резервная копия:'} 425 | .MSG_history:lang(ru) {content: 'История'} 426 | .MSG_about:lang(ru) {content: 'Инфо'} 427 | .MSG_update_siteinfo:lang(ru) {content: 'Обновить БД'} 428 | .MSG_reload_db:lang(ru) {content: 'Переоткрыть БД'} 429 | .MSG_update_siteinfo_upd:lang(ru) {content: 'Обновление...'} 430 | .MSG_update_siteinfo_sucс:lang(ru) {content: 'Обновлено'} 431 | .MSG_update_siteinfo_fail:lang(ru) {content: 'Ошибка обн.'} 432 | .MSG_open_siteinfo_manager:lang(ru) {content: 'Редактор'} 433 | .MSG_auto_start:lang(ru) {content: 'Автозапуск расширения'} 434 | .MSG_open_newtab:lang(ru) {content: 'Исправлять аттрибут target у ссылок на _blank'} 435 | .MSG_check_hash:lang(ru) {content: 'Проверять страницы на повторы используя хеш-код'} 436 | .MSG_noiframe:lang(ru) {content: 'Отключать расширение в фреймах'} 437 | .MSG_change_address:lang(ru) {content: 'Обновлять адрес и заголовок при прокрутке'} 438 | .MSG_bottom_bar:lang(ru) {content: 'Включить статусбар'} 439 | .MSG_remaining_height:lang(ru) {content: 'Пикселов прокрутки перед подгрузкой:'} 440 | .MSG_debugmode:lang(ru) {content: 'Отладочные сообщения'} 441 | .MSG_exclude_filter:lang(ru) {content: 'Исключение сайтов по фильтру:'} 442 | .MSG_wedata_location:lang(ru) {content: 'URL мини-БД'} 443 | .MSG_wedata_full_location:lang(ru) {content: 'URL БД'} 444 | .MSG_force_abs_hrefs:lang(ru) {content: 'Преобразовывать URL ссылок в полные'} 445 | .MSG_force_abs_srcs:lang(ru) {content: 'Преобразовывать URL картинок в полные'} 446 | .MSG_cleanup_on_load:lang(ru) {content: 'После обновления очищать базу от неиспользуемых сайтов'} 447 | .MSG_allow_ext_styles:lang(ru) {content: 'Разрешить патчи CSS из внешней базы'} 448 | .MSG_try_correct_lazy:lang(ru) {content: 'Пытаться восстановить кртинки с «ленивой» загрузкой'} 449 | #update_wedata_location:lang(ru), #update_wedata_full_location:lang(ru) {content: 'Сохранить'} 450 | /* 451 | * Так, к сожалению, не работает. 452 | .MSG_filter_prefix:lang(ru) {content: 'префикс'} 453 | .MSG_filter_domain:lang(ru) {content: 'домен'} 454 | .MSG_filter_regexp:lang(ru) {content: 'регулярка'}*/ 455 | .MSG_separator_style:lang(ru) {content: 'Стили разделителя и статусбара:'} 456 | .MSG_add:lang(ru) {content: 'Добавить'} 457 | .MSG_save:lang(ru) {content: 'Сохранить'} 458 | .MSG_reset:lang(ru) {content: 'Сбросить'} 459 | .MSG_siteinfo_patterns:lang(ru) {content: 'Персональные SITEINFO-шаблоны:'} 460 | .MSG_extension_name:lang(ru) {content: 'Название'} 461 | .MSG_author_name:lang(ru) {content: 'Автор'} 462 | .MSG_thank_you:lang(ru) {content: 'Благодарности'} 463 | .MSG_license:lang(ru) {content: 'Лицензия'} 464 | 465 | /* Language: Japanese (ja) */ 466 | .MSG_general:lang(ja) {content: 'メイン'} 467 | .MSG_filters:lang(ja) {content: 'フィルター'} 468 | .MSG_styles:lang(ja) {content: 'スタイル'} 469 | .MSG_patterns:lang(ja) {content: 'テンプレート'} 470 | .MSG_backup:lang(ja) {content: 'バックアップ'} 471 | .MSG_history:lang(ja) {content: '履歴'} 472 | .MSG_about:lang(ja) {content: '情報'} 473 | .MSG_update_siteinfo:lang(ja) {content: '更新'} 474 | .MSG_reload_db:lang(ja) {content: '再ロード'} 475 | .MSG_update_siteinfo_upd:lang(ja) {content: '...'} 476 | .MSG_update_siteinfo_sucс:lang(ja) {content: '!!!'} 477 | .MSG_update_siteinfo_fail:lang(ja) {content: '???'} 478 | .MSG_open_siteinfo_manager:lang(ja) {content: '管理ページを開く'} 479 | .MSG_auto_start:lang(ja) {content: 'ページを開いたときにデフォルトで有効にする'} 480 | .MSG_open_newtab:lang(ja) {content: '継ぎ足ししたコンテンツ内のリンクを新規タブで開(target=_blank指定をする)'} 481 | .MSG_noiframe:lang(ja) {content: 'フレーム内では起動させない'} 482 | .MSG_change_address:lang(ja) {content: '継ぎ足しした時、URL を継ぎ足した URL で置き換える'} 483 | .MSG_bottom_bar:lang(ja) {content: 'ページ下部にステータスを表示'} 484 | .MSG_remaining_height:lang(ja) {content: '読み込みを開始する位置:'} 485 | .MSG_debugmode:lang(ja) {content: 'デバッグモード'} 486 | .MSG_exclude_filter:lang(ja) {content: '特定URLを除外するためのルール:'} 487 | .MSG_wedata_location:lang(ja) {content: 'ミニデータベースを配置'} 488 | .MSG_wedata_full_location:lang(ja) {content: 'データベースを配置'} 489 | .MSG_force_abs_hrefs:lang(ja) {content: '完全にハイパーリンクに変換されたアドレスを変換します'} 490 | .MSG_force_abs_srcs:lang(ja) {content: '完全なアドレスに写真を変換します'} 491 | .MSG_backup_preferences:lang(ja) {content: 'バックアップデータ'} 492 | .MSG_siteinfo_patterns:lang(ja) {content: '個人SITEINFO-テンプレート:'} 493 | .MSG_check_hash:lang(ja) {content: 'ハッシュコードをチェック'} 494 | .MSG_allow_ext_styles:lang(ja) {content: '外部データベースからCSSパッチを許可する'} 495 | .MSG_try_correct_lazy:lang(ja) {content: '遅延読み込みイメージの修正を試みる'} 496 | .MSG_cleanup_on_load:lang(ja) {content: '更新時のデータベースのクリーンアップ'} 497 | /* 498 | * It's not working this way. 499 | .MSG_filter_prefix:lang(ja) {content: '接頭辞'} 500 | .MSG_filter_domain:lang(ja) {content: 'ドメイン'} 501 | .MSG_filter_regexp:lang(ja) {content: '正規表現'}*/ 502 | .MSG_separator_style:lang(ja) {content: '区切りのスタイル:'} 503 | .MSG_add:lang(ja) {content: '追加'} 504 | #update_wedata_location:lang(ja), #update_wedata_full_location:lang(ja), .MSG_save:lang(ja) {content: '保存'} 505 | .MSG_reset:lang(ja) {content: '削除'} 506 | 507 | .MSG_extension_name:lang(ja) {content: '名前'} 508 | .MSG_author_name:lang(ja) {content: '著者'} 509 | .MSG_thank_you:lang(ja) {content: '感謝'} 510 | .MSG_license:lang(ja) {content: 'ライセンス'} 511 | -------------------------------------------------------------------------------- /icons/Icon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dither/autopatchwork-mod/f7b751043b695b63400d3ff632d7c5b8413f8abc/icons/Icon-128.png -------------------------------------------------------------------------------- /icons/Icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dither/autopatchwork-mod/f7b751043b695b63400d3ff632d7c5b8413f8abc/icons/Icon-16.png -------------------------------------------------------------------------------- /icons/Icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dither/autopatchwork-mod/f7b751043b695b63400d3ff632d7c5b8413f8abc/icons/Icon-32.png -------------------------------------------------------------------------------- /icons/Icon-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dither/autopatchwork-mod/f7b751043b695b63400d3ff632d7c5b8413f8abc/icons/Icon-48.png -------------------------------------------------------------------------------- /icons/Icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dither/autopatchwork-mod/f7b751043b695b63400d3ff632d7c5b8413f8abc/icons/Icon-64.png -------------------------------------------------------------------------------- /icons/Icon-big.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /icons/Icon-small.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Dither/autopatchwork-mod/f7b751043b695b63400d3ff632d7c5b8413f8abc/icons/icon.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AutoPatchWorkMod [background] 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 2, 3 | "name": "AutoPatchWork Mod", 4 | "version": "1.10.1", 5 | "description": "Auto-appends following paginated pages to the current on scroll.", 6 | "developer": { 7 | "name": "DitherSky" 8 | }, 9 | "icons": { 10 | "16": "icons/icon-16.png", 11 | "32": "icons/icon-32.png", 12 | "48": "icons/icon-48.png", 13 | "64": "icons/icon-64.png", 14 | "128": "icons/icon-128.png" 15 | }, 16 | "background": { 17 | "page": "index.html" 18 | }, 19 | "options_ui": { 20 | "page": "options.html" 21 | }, 22 | "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", 23 | "permissions": ["unlimited_storage", "tabs", "notifications", "clipboardWrite", "http://os0x.heteml.jp/*","http://wedata.net/*","https://githubusercontent.com/*"], 24 | "optional_permissions": ["storage"], 25 | "content_scripts": [{ 26 | "js": ["includes/autopatchwork.js"], 27 | "matches": ["http://*/*", "https://*/*"], 28 | "run_at": "document_start", 29 | "all_frames": true 30 | }], 31 | "applications": { 32 | "gecko": { 33 | "id": "autopatchwork-mod@mozilla.firefox" 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /options.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AutoPatchWorkMod 6 | 7 | 8 | 9 | 10 | 11 | 12 | 35 |
36 |
37 |
38 |
39 | 40 | 41 | 42 |
43 |
44 | 45 | 46 |
47 |
48 | 49 | 50 |
51 |
52 | 53 | 54 |
55 |
56 | 57 | 58 |
59 |
60 | 61 | 62 |
63 |
64 | 65 | 66 |
67 |
68 | 69 | 70 |
71 |
72 | 73 | 74 |
75 |
76 | 77 | 78 |
79 |
80 | 81 | 82 |
83 |
84 | 85 | 86 |
87 |
88 | 89 | 90 |
91 |
92 | 93 | 94 |
95 |
96 | 400 97 | 98 | 4000 99 |
100 |
101 | 102 | 103 |
104 |
105 | 106 | 107 |
108 |
109 | 124 | 140 | 156 | 172 | 314 | 345 |
346 |
347 | 348 | 349 | 350 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "autopatchwork-mod", 3 | "version": "1.9.9", 4 | "description": "Addon for auto-appending following paginated pages to the current on scroll.", 5 | "readme": "README.md", 6 | "devDependencies": { 7 | "grunt": ">=0.4.5", 8 | "google-closure-compiler": "^20160713.2.0", 9 | "grunt-closure-compiler": "0.0.21", 10 | "grunt-contrib-jshint": "^1.0.0", 11 | "grunt-google-closure-tools-compiler": "^0.1.7", 12 | "ncp": ">=0.4.2" 13 | }, 14 | "dependencies": { 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git://github.com/Dither/autopatchwork-mod.git" 19 | }, 20 | "author": "DitherSky", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/Dither/autopatchwork-mod/issues" 24 | }, 25 | "engine": "node >= 4.0.0" 26 | } 27 | -------------------------------------------------------------------------------- /scripts/background.js: -------------------------------------------------------------------------------- 1 | var siteinfo = [], custom_info = {}, timestamp, site_stats = {}, site_fail_stats = {}, 2 | H = location.href.replace('index.html', ''), 3 | MICROFORMATs = [{ 4 | MICROFORMAT: true, 5 | url: '^https?://.', 6 | nextLink: '//a[@rel="next"] | //link[@rel="next"]', 7 | insertBefore: '//*[contains(concat(" ",@class," "), " autopagerize_insert_before ")]', 8 | pageElement: '//*[contains(concat(" ",@class," "), " autopagerize_page_element ")]' 9 | }, { 10 | MICROFORMAT: true, 11 | url: '^https?://.', 12 | nextLink: '//link[@rel="next"] | //a[contains(concat(" ",@rel," "), " next ")] | //a[contains(concat(" ",@class," "), " next ")]', 13 | pageElement: '//*[contains(concat(" ",@class," "), " hfeed ") or contains(concat(" ",@class," "), " story ") or contains(concat(" ",@class," "), " instapaper_body ") or contains(concat(" ",@class," "), " xfolkentry ")]' 14 | }], 15 | JSON_SITEINFO_DB_MIN = 'http://wedata.net/databases/AutoPagerize/items.json', // 'http://os0x.heteml.jp/json/wedataAutoPagerizeSITEINFO.json', 16 | JSON_SITEINFO_DB = 'http://wedata.net/databases/AutoPagerize/items.json', //'http://os0x.heteml.jp/json/wedataAutoPagerize.json', 17 | DAYS_TO_KEEP_DB = 60, 18 | BLOCK_GENERICS = false, 19 | BLOCK_MICROFORMATS = true; 20 | 21 | if (BLOCK_GENERICS) { 22 | custom_info = { /* Disabling overzealous formats. Re-enable them manually on your own risk. */ 23 | '400':{'disabled':true,'length':1}, 24 | '430':{'disabled':true,'length':1}, 25 | '447':{'disabled':true,'length':1}, 26 | '649':{'disabled':true,'length':1}, 27 | '27331':{'disabled':true,'length':1}, 28 | '27333':{'disabled':true,'length':1}, 29 | '39059':{'disabled':true,'length':1}, 30 | '41434':{'disabled':true,'length':1}, 31 | '55771':{'disabled':true,'length':1}, 32 | '65332':{'disabled':true,'length':1}, 33 | '74668':{'disabled':true,'length':1} 34 | }; 35 | } 36 | 37 | window.AutoPatchWorkBG = { 38 | state: true, 39 | css: '', 40 | custom_patterns: [], 41 | config: { 42 | auto_start: true, 43 | target_blank: true, 44 | remaining_height: 800, 45 | disable_in_frames: true, 46 | change_address: false, 47 | debug_mode: false, 48 | check_hash: false, 49 | bar_status: true, 50 | force_abs_hrefs: false, 51 | force_abs_srcs: false, 52 | enable_notifications: false, 53 | cleanup_on_load: false, 54 | allow_ext_styles: false, 55 | try_correct_lazy: true 56 | }, 57 | save_custom_patterns: function(patterns) { 58 | storagebase.AutoPatchWorkPatterns = patterns; 59 | initDatabase(); 60 | }, 61 | reload_database: function() { 62 | initDatabase(); 63 | }, 64 | reset_custom_patterns: function() { 65 | resetCustomPatterns(); 66 | initDatabase(); 67 | }, 68 | init_css: function(css) { 69 | initCSS(css); 70 | }, 71 | update: function() { 72 | saveConfig(); 73 | }, 74 | disabled_sites: [], 75 | blacklist_check: function(url) { 76 | if (url.indexOf('http') !== 0) 77 | return true; 78 | return AutoPatchWorkBG.disabled_sites.some(function(site) { 79 | if (site.type === 'regexp') 80 | return new RegExp(site.matcher).test(url); 81 | else if (site.type === 'prefix') 82 | return url.indexOf(site.matcher) === 0; 83 | else if (site.type === 'domain') 84 | return new RegExp('^https?://' + site.matcher + '/').test(url); 85 | }); 86 | }, 87 | add_disabled_site: function(site) { 88 | AutoPatchWorkBG.disabled_sites.push(site); 89 | saveDisabledSites(); 90 | }, 91 | save_disabled_site: function() { 92 | saveDisabledSites(); 93 | }, 94 | delete_disabled_site: function(site) { 95 | var site_s = JSON.stringify(site); 96 | for (var i = 0, len = AutoPatchWorkBG.disabled_sites.length; i < len; i++) { 97 | if (JSON.stringify(AutoPatchWorkBG.disabled_sites[i]) === site_s) { 98 | AutoPatchWorkBG.disabled_sites.splice(i, 1); 99 | saveDisabledSites(); 100 | break; 101 | } 102 | } 103 | } 104 | }; 105 | 106 | //// main ////// 107 | 108 | if(browser_type === BROWSER_SAFARI) { 109 | safari.extension.settings.addEventListener('change', function(evt) { 110 | if (evt.key in AutoPatchWorkBG.config) { 111 | AutoPatchWorkBG.config[evt.key] = evt.newValue; 112 | } else if (evt.key === 'excludes') { 113 | var urls = evt.newValue.trim().split(' '); 114 | AutoPatchWorkBG.disabled_sites = urls.map(function(url) { return { type: 'prefix', matcher: url }; }); 115 | saveDisabledSites(); 116 | } 117 | }, false); 118 | } 119 | 120 | function initCSS(css) { 121 | if (css && css.replace(/[\s\n]*/, '') !== '') { 122 | AutoPatchWorkBG.css = storagebase.AutoPatchWorkCSS = css; 123 | } else { 124 | getCSS(function(css) {storagebase.AutoPatchWorkCSS = AutoPatchWorkBG.css = css;}); 125 | } 126 | } 127 | 128 | function getCSS(callback) { 129 | var css = 'css/main.css'; 130 | var xhr = new XMLHttpRequest(); 131 | xhr.open('GET', css, true); 132 | xhr.send(null); 133 | xhr.onload = function () { 134 | callback(xhr.responseText); 135 | }; 136 | } 137 | 138 | function getWedataId(wditem) { 139 | return parseInt(wditem.resource_url ? wditem.resource_url.replace('http://wedata.net/items/', '') : '0', 10) || 0; 140 | } 141 | 142 | function initCustomPatterns() { 143 | if (storagebase.AutoPatchWorkPatterns) 144 | AutoPatchWorkBG.custom_patterns = JSON.parse(storagebase.AutoPatchWorkPatterns); 145 | applyCustomPatterns(); 146 | } 147 | 148 | function resetCustomPatterns() { 149 | AutoPatchWorkBG.custom_patterns = []; 150 | storagebase.AutoPatchWorkPatterns = ''; 151 | } 152 | 153 | function applyCustomPatterns() { 154 | siteinfo.unshift.apply(siteinfo, AutoPatchWorkBG.custom_patterns); 155 | } 156 | 157 | function saveDisabledSites() { 158 | storagebase.disabled_sites = JSON.stringify(AutoPatchWorkBG.disabled_sites); 159 | } 160 | 161 | function saveConfig() { 162 | storagebase.AutoPatchWorkConfig = JSON.stringify(AutoPatchWorkBG.config); 163 | } 164 | 165 | function applyMicroformats() { 166 | if(!BLOCK_MICROFORMATS) 167 | siteinfo.push.apply(siteinfo, MICROFORMATs); 168 | } 169 | 170 | function applyCustomInfo() { 171 | siteinfo.forEach(function(i) { 172 | var id = i['wedata.net.id']; 173 | if (!id) return; 174 | var ci = getCustomInfo(id); 175 | if (!ci) return; 176 | Object.keys(ci).forEach(function(k) { 177 | if(typeof ci[k] === 'string' ? ci[k].trim() !== '' : !!ci[k]) i[k] = ci[k]; else delete i[k]; // deletes `insertBefore` in case we null it 178 | }); 179 | }); 180 | } 181 | 182 | function getCustomInfo(id) { 183 | return custom_info[id]; 184 | } 185 | 186 | function removeCustomInfo(id, name) { 187 | if (typeof custom_info[id] === 'undefined') return; 188 | //log('removed custom info ('+id+') ['+name+']'); 189 | if (--custom_info[id].length < 1) { 190 | delete custom_info[id]; 191 | } else { 192 | if (typeof custom_info[id][name] === 'undefined') return; 193 | delete custom_info[id][name]; 194 | } 195 | } 196 | 197 | function setCustomInfo(id, name, value, default_value) { 198 | if (typeof custom_info[id] === 'undefined') { 199 | if (typeof default_value !== 'undefined' && default_value === value) 200 | return; 201 | //log('created custom info ('+id+')['+name+'] = '+value); 202 | custom_info[id] = {}; 203 | custom_info[id][name] = value; 204 | custom_info[id].length = 1; 205 | } else { 206 | if (typeof default_value !== 'undefined' && default_value === value) { 207 | removeCustomInfo(id, name); 208 | return; 209 | } 210 | if (typeof custom_info[id][name] === 'undefined') { 211 | //log('created custom info ('+id+')['+name+'] = '+value); 212 | custom_info[id][name] = value; 213 | custom_info[id].length++; 214 | } else { 215 | //log('set custom info ('+id+')['+name+'] = '+value); 216 | custom_info[id][name] = value; 217 | } 218 | } 219 | } 220 | 221 | function saveCustomInfo(new_custom_info) { 222 | if (typeof new_custom_info !== 'undefined') custom_info = new_custom_info; 223 | storagebase.custom_info = JSON.stringify(custom_info); 224 | } 225 | 226 | function initCustomInfo() { 227 | if (storagebase.custom_info) 228 | custom_info = JSON.parse(storagebase.custom_info); 229 | applyCustomInfo(); 230 | } 231 | 232 | /* jshint ignore:start */ 233 | function checkExists(url, callback) { 234 | var http = new XMLHttpRequest(); 235 | http.onload = function() { 236 | callback(http.status < 400); 237 | }; 238 | http.onerror = function() { 239 | callback(false); 240 | }; 241 | http.open('HEAD', url, true); 242 | http.send(); 243 | } 244 | /* jshint ignore:end */ 245 | 246 | function initDBLocation() { 247 | if (storagebase.db_location) JSON_SITEINFO_DB_MIN = storagebase.db_location; 248 | if (storagebase.db_full_location) JSON_SITEINFO_DB = storagebase.db_full_location; 249 | } 250 | 251 | function resetDBLocation(full) { 252 | if (typeof full === 'undefined' || (typeof full === 'boolean' && !full)) { 253 | storagebase.removeItem('db_location'); 254 | JSON_SITEINFO_DB_MIN = 'http://wedata.net/databases/AutoPagerize/items.json'; 255 | } 256 | if (typeof full === 'undefined' || (typeof full === 'boolean' && full)) { 257 | storagebase.removeItem('db_full_location'); 258 | JSON_SITEINFO_DB = 'http://wedata.net/databases/AutoPagerize/items.json'; 259 | } 260 | } 261 | 262 | function updateMiniDatabaseURL(url) { 263 | storagebase.db_location = JSON_SITEINFO_DB_MIN = url; 264 | } 265 | 266 | function updateFullDatabaseURL(url) { 267 | storagebase.db_full_location = JSON_SITEINFO_DB = url; 268 | } 269 | 270 | function initDatabase() { 271 | initDBLocation(); 272 | try { 273 | if (!Store.has('siteinfo_wedata')) { 274 | log('SITEINFO DB expired'); 275 | throw new APWException('SITEINFO DB expired'); 276 | } 277 | var data = Store.get('siteinfo_wedata'); 278 | if (!data || !data.siteinfo) log('No SITEINFO DB present'); 279 | siteinfo = data.siteinfo || []; 280 | timestamp = new Date(data.timestamp); 281 | initCustomInfo(); 282 | initCustomPatterns(); 283 | applyMicroformats(); 284 | } catch (bug) { 285 | downloadDatabase(); 286 | } 287 | } 288 | 289 | function createDatabase(info) { 290 | var tmp_log = 'There were errors in SITEINFO DB:\n', 291 | allowed_fields = [ 292 | 'nextLink', 293 | 'nextLinkSelector', 294 | 'prevLink', 295 | 'prevLinkSelector', 296 | 'pageElement', 297 | 'pageElementSelector', 298 | 'url', 299 | 'insertBefore' 300 | ], 301 | allowed_bool_fields = [ 302 | 'forceIframe', 303 | 'allowScripts', //this ony influences iframe loading method now 304 | 'disableSeparator' 305 | ], 306 | is_sso_db = !!~JSON_SITEINFO_DB_MIN.indexOf('os0x.heteml.jp'); 307 | 308 | siteinfo = []; 309 | if (AutoPatchWorkBG.config.allow_ext_styles) allowed_fields.push('cssPatch'); 310 | var clean = AutoPatchWorkBG.config.cleanup_on_load; 311 | 312 | info.forEach(function(i) { 313 | var d = i.data || i, r = {}, id = parseInt(i['wedata.net.id'], 10) || getWedataId(i); 314 | if (AutoPatchWorkBG.config.allow_ext_styles && d) { 315 | var t = null; 316 | if (typeof d['Stylish'] === 'string' && d['Stylish'].replace(/\s/g,'').length > 5) t = d['Stylish']; // Stylish CSS 317 | else if (typeof d['cssPatch'] === 'string' && d['cssPatch'].replace(/\s/g,'').length > 5) t = d['cssPatch']; // Plain CSS 318 | delete d['cssPatch']; 319 | if (t && !t.match(/\burl[^\(\{]*\(/i) && !t.match(/\bjavascript\b/i)) { 320 | d['cssPatch'] = (t.match(/@-moz-document[^{]+{\s*([^@\}]+)\s*}/) || [])[1] || t; // Stylish CSS -> Plain CSS 321 | } 322 | } 323 | allowed_fields.forEach(function(k) { 324 | if(!d[k] || !d.hasOwnProperty(k)) return; 325 | if (is_sso_db) d[k] = d[k].replace(/\s*\b(rn)+$/g,''); //server bug? 326 | r[k] = d[k]; 327 | }); 328 | /*allowed_bool_fields.forEach(function(k) { 329 | if (info.data.hasOwnProperty(k) && typeof custom_info[id][k] === 'undefined') //don't overwrite existing preset 330 | setCustomInfo(id, k, s2b(d[k]), false); 331 | });*/ 332 | r['wedata.net.id'] = id; 333 | try { new RegExp(r.url); } catch (bug) { 334 | tmp_log += '[' + r['wedata.net.id'] + '] Invalid url RegExp ' + r.url + ': ' + (bug.message || bug) + '\n'; 335 | return; 336 | } 337 | try { document.evaluate(r.nextLink, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); } catch (bug) { 338 | tmp_log += '[' + r['wedata.net.id'] + '] Invalid next XPath ' + r.nextLink + ': ' + (bug.message || bug) + '\n'; 339 | return; 340 | } 341 | try { document.evaluate(r.pageElement, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); } catch (bug) { 342 | tmp_log += '[' + r['wedata.net.id'] + '] Invalid content XPath ' + r.pageElement + ': ' + (bug.message || bug) + '\n'; 343 | return; 344 | } 345 | 346 | if (clean && id && (typeof site_stats[id] === 'undefined' || site_stats[id] < 1)) { 347 | delete site_fail_stats[id]; 348 | delete site_stats[id]; 349 | return; 350 | } 351 | 352 | siteinfo.push(r); 353 | }); 354 | 355 | log(tmp_log); 356 | 357 | siteinfo.sort(function(a, b) { return (b.url.length - a.url.length); }); 358 | 359 | timestamp = new Date; 360 | Store.set( 361 | 'siteinfo_wedata', { 362 | siteinfo: siteinfo, 363 | timestamp: timestamp.toLocaleString() 364 | },{ day: DAYS_TO_KEEP_DB } 365 | ); 366 | 367 | initCustomInfo(); 368 | initCustomPatterns(); 369 | applyMicroformats(); 370 | } 371 | 372 | function downloadDatabase(callback, errorback) { 373 | var xhr = new XMLHttpRequest(); 374 | siteinfo = []; 375 | xhr.onload = function() { 376 | try { 377 | var info = JSON.parse(xhr.responseText); 378 | createDatabase(info); 379 | if (typeof callback === 'function') callback(); 380 | } catch (bug) { 381 | if (typeof errorback === 'function') return errorback(bug); 382 | else throw new APWException(bug); 383 | } 384 | }; 385 | xhr.onerror = function(err) { 386 | if (typeof errorback === 'function') errorback(err); 387 | }; 388 | try { 389 | xhr.open('GET', JSON_SITEINFO_DB_MIN, true); 390 | xhr.send(null); 391 | } catch (bug) { 392 | log(bug.message || bug); 393 | } 394 | } 395 | 396 | function saveStats() { 397 | storagebase.site_stats = JSON.stringify(site_stats); 398 | storagebase.site_fail_stats = JSON.stringify(site_fail_stats); 399 | } 400 | 401 | function resetSettings() { 402 | resetDBLocation(); 403 | resetCustomPatterns(); 404 | saveCustomInfo(); 405 | saveConfig(); 406 | saveDisabledSites(); 407 | saveStats(); 408 | initCSS(); 409 | } 410 | 411 | /*window.addEventListener('storage', function(e) { 412 | if (e.key === 'custom_info' && e.oldValue !== e.newValue) applyCustomFields(); 413 | });*/ 414 | 415 | function runExtension() { 416 | if (typeof storagebase === 'undefined') { 417 | return setTimeout(function() { runExtension(); }, 200); // wait for storage to load 418 | } 419 | 420 | if(!storagebase.AutoPatchWorkConfig) resetSettings(); 421 | 422 | if(storagebase.disabled_sites) AutoPatchWorkBG.disabled_sites = JSON.parse(storagebase.disabled_sites); 423 | if(storagebase.AutoPatchWorkConfig) { 424 | AutoPatchWorkBG.config = JSON.parse(storagebase.AutoPatchWorkConfig); 425 | debug = !!AutoPatchWorkBG.config.debug_mode; 426 | if(storagebase.site_stats) site_stats = JSON.parse(storagebase.site_stats); 427 | if(storagebase.site_fail_stats) site_fail_stats = JSON.parse(storagebase.site_fail_stats); 428 | if(storagebase.AutoPatchWorkCSS) AutoPatchWorkBG.css = storagebase.AutoPatchWorkCSS; 429 | } 430 | 431 | var version = '', manifest; 432 | function getManifest(callback) { 433 | var url = 'manifest.json'; 434 | var xhr = new XMLHttpRequest(); 435 | xhr.onload = function() { 436 | callback(JSON.parse(xhr.responseText)); 437 | }; 438 | xhr.open('GET', url += ((/\?/).test(url) ? '&' : '?') + Date.now(), true); 439 | xhr.send(null); 440 | } 441 | getManifest(function(_manifest) { manifest = _manifest; version = _manifest.version; }); 442 | 443 | initDatabase(); 444 | } 445 | 446 | /*window.onload = function() { 447 | if (browser_type !== BROWSER_CHROME) return; 448 | var CHROME_GESTURES = 'jpkfjicglakibpenojifdiepckckakgk'; 449 | var CHROME_KEYCONFIG = 'okneonigbfnolfkmfgjmaeniipdjkgkl'; 450 | var action = { 451 | group: 'AutoPatchWork', 452 | actions: [{ name: 'AutoPatchWork.toggle' }, { name: 'AutoPatchWork.request' }] 453 | }; 454 | browser.runtime.sendMessage(CHROME_GESTURES, action); 455 | browser.runtime.sendMessage(CHROME_KEYCONFIG, action); 456 | };*/ 457 | 458 | /* jshint ignore:start */ 459 | var toggleCode = '(' + (function() { 460 | var ev = new window.CustomEvent('AutoPatchWork.toggle'); 461 | document.dispatchEvent(ev); 462 | }).toString() + ')();'; 463 | /* jshint ignore:end */ 464 | 465 | switch(browser_type) { 466 | case BROWSER_CHROME: 467 | browser.runtime.onMessage.addListener(handleMessage); 468 | break; 469 | case BROWSER_SAFARI: 470 | safari.application.addEventListener('message', function(evt) { 471 | var name = evt.name; 472 | if(name === 'option_init') { 473 | evt.target.page.dispatchMessage(name, AutoPatchWorkBG); 474 | } else if(name === 'invoke_action') { 475 | if(evt.message.action === 'update') { 476 | AutoPatchWorkBG.config = evt.message.config; 477 | AutoPatchWorkBG.update(); 478 | } else if(evt.message.action === 'save_disabled_site') { 479 | AutoPatchWorkBG.disabled_sites = evt.message.disabled_sites; 480 | AutoPatchWorkBG.save_disabled_site(); 481 | } else if(evt.message.action === 'downloadDatabase') { 482 | downloadDatabase(function() { 483 | evt.target.page.dispatchMessage('updated_siteinfo'); 484 | }); 485 | } else { 486 | AutoPatchWorkBG[evt.message.action].apply(AutoPatchWorkBG, evt.message.args); 487 | } 488 | } else if(name === 'siteinfo_init') { 489 | evt.target.page.dispatchMessage(name, { 490 | siteinfo: siteinfo, 491 | custom_info: custom_info, 492 | site_stats: site_stats, 493 | site_fail_stats: site_fail_stats, 494 | AutoPatchWorkBG: AutoPatchWorkBG 495 | }); 496 | } else { 497 | try { 498 | handleMessage(evt.message, {}, function(data) { 499 | evt.target.page.dispatchMessage(name, data); 500 | }); 501 | } catch (bug) {} 502 | } 503 | }, false); 504 | break; 505 | case BROWSER_OPERA: 506 | window.opera.extension.onmessage = function(evt) { 507 | var name = evt.data.name; 508 | var message = evt.data.data; 509 | if (!evt.source && name !== 'invoke_action') return; 510 | switch(name) { 511 | case 'option_init': // WTF?? 512 | evt.source.postMessage({ 513 | name: name, 514 | data: JSON.parse(JSON.stringify(AutoPatchWorkBG)) 515 | }); 516 | break; 517 | case 'siteinfo_init': 518 | evt.source.postMessage({ 519 | name: name, 520 | data: { 521 | siteinfo: siteinfo, 522 | custom_info: custom_info, 523 | site_stats: site_stats, 524 | site_fail_stats: site_fail_stats, 525 | AutoPatchWorkBG: JSON.parse(JSON.stringify(AutoPatchWorkBG)) 526 | } 527 | }); 528 | break; 529 | case 'invoke_action': 530 | switch(message.action) { 531 | case 'update': 532 | AutoPatchWorkBG.config = message.config; 533 | AutoPatchWorkBG.update(); 534 | break; 535 | case 'save_disabled_site': 536 | AutoPatchWorkBG.disabled_sites = message.disabled_sites; 537 | AutoPatchWorkBG.save_disabled_site(); 538 | break; 539 | case 'download_database': 540 | downloadDatabase(function() { evt.source.postMessage({ name: 'updated_siteinfo' }); }); 541 | break; 542 | default: 543 | AutoPatchWorkBG[message.action].apply(AutoPatchWorkBG, message.args); 544 | } 545 | break; 546 | default: 547 | try { 548 | handleMessage(message, {}, function(data) { 549 | evt.source.postMessage({ name: name, data: data }); 550 | }); 551 | } catch (bug) {} 552 | } 553 | }; 554 | } 555 | 556 | function setMode(id, mode, val) { 557 | for (var i = 0, silen = siteinfo.length; i < silen; i++) 558 | if (siteinfo[i]['wedata.net.id'] && siteinfo[i]['wedata.net.id'] === id) { 559 | //TODO: should this persist between sessions? 560 | //setCustomInfo(id, mode, val, false); 561 | siteinfo[i][mode] = val; 562 | break; 563 | } 564 | } 565 | 566 | function handleMessage(request, sender, sendResponse) { 567 | if (request.message === 'AutoPatchWork.initialized') { 568 | var id = request.siteinfo['wedata.net.id'] || 'microformats'; 569 | site_stats[id] = ++site_stats[id] || 1; 570 | storagebase.site_stats = JSON.stringify(site_stats); 571 | return; 572 | } 573 | 574 | if (request.failed_siteinfo) { 575 | request.failed_siteinfo.forEach(function(s) { 576 | var id = s['wedata.net.id']; 577 | if(!id) return; 578 | site_fail_stats[id] = ++site_fail_stats[id] || 1; 579 | }); 580 | storagebase.site_fail_stats = JSON.stringify(site_fail_stats); 581 | return; 582 | } 583 | 584 | if (request.paused) { 585 | if (typeof request.id === 'number' && request.id !== -1) 586 | setMode(request.id, 'paused', s2b(request.paused)); 587 | return; 588 | } 589 | 590 | if (request.reversed) { 591 | if (typeof request.id === 'number' && request.id !== -1) 592 | setMode(request.id, 'reversed', s2b(request.reversed)); 593 | return; 594 | } 595 | 596 | if (request.manage) { 597 | if (request.hash) openOrFocusTab('siteinfo_manager.html#siteinfo_search_input='+request.hash); 598 | else openOrFocusTab('siteinfo_manager.html'); 599 | return; 600 | } 601 | 602 | if (request.options) { 603 | openOrFocusTab('options.html'); 604 | return; 605 | } 606 | 607 | if (!AutoPatchWorkBG.state || (request.isFrame && AutoPatchWorkBG.config.disable_in_frames)) 608 | return; 609 | 610 | var infos = [], url = request.url; 611 | 612 | if (!url || AutoPatchWorkBG.blacklist_check(url) || url.index) 613 | return; 614 | 615 | for (var i = 0, len = siteinfo.length, s; i < len; i++) { 616 | s = siteinfo[i]; 617 | try { 618 | if (!s.disabled && (new RegExp(s.url)).test(url)) { 619 | delete s.length; 620 | infos.push(s); 621 | } 622 | } catch (bug) { log((bug.message || bug) + ' ' + s.url); } 623 | } 624 | 625 | sendResponse({ siteinfo: infos, config: AutoPatchWorkBG.config, css: AutoPatchWorkBG.css }); 626 | } 627 | 628 | function openOrFocusTab(uri) { 629 | switch (browser_type) { 630 | case BROWSER_CHROME: 631 | browser.windows.getAll({ populate: true }, function(windows) { 632 | if (!windows.some(function(w) { 633 | if (w.type === 'normal') { 634 | return w.tabs.some(function(t) { 635 | if (t.url === H + uri) { 636 | browser.tabs.update(t.id, { 'selected': true }); 637 | return true; 638 | } 639 | }); 640 | } 641 | })) { browser.tabs.query({active: true}, function(t) { 642 | browser.tabs.create({ 'url': uri, index: (t[0] ? t[0].index : 0) + 1 }); 643 | }); 644 | } 645 | }); 646 | break; 647 | case BROWSER_SAFARI: 648 | if(!safari.application.browserWindows.some(function(w) { 649 | return w.tabs.some(function(t) { 650 | if(t.url.indexOf(H + uri) === 0) { 651 | t.activate(); 652 | return true; 653 | } 654 | }); 655 | })) { safari.application.activeBrowserWindow.openTab().url = H + uri; } 656 | break; 657 | case BROWSER_OPERA: 658 | opera.extension.tabs.create({ url: uri, focused: true }); 659 | break; 660 | } 661 | } 662 | 663 | runExtension(); 664 | -------------------------------------------------------------------------------- /scripts/common.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Returns Array of first level keys of the passed Object. 3 | * @return {Array} Array of keys in 'this' object. 4 | * */ 5 | if (!Object.prototype.keys) { 6 | Object.prototype.keys = (function() { 7 | 'use strict'; 8 | var hasOwnProperty = Object.prototype.hasOwnProperty, 9 | hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'), 10 | dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor'], 11 | dontEnumsLength = dontEnums.length; 12 | return function() { 13 | var obj = this; 14 | if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) throw new TypeError('Object.keys called on non-object'); 15 | var result = [], prop, i; 16 | for (prop in obj) if (hasOwnProperty.call(obj, prop)) result.push(prop); 17 | if (hasDontEnumBug) for (i = 0; i < dontEnumsLength; i++) if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]); 18 | return result; 19 | }; 20 | }()); 21 | } 22 | 23 | var debug = false, profiler = false, prof_first_run = true; 24 | 25 | var browser_type, 26 | BROWSER_CHROME = 1, 27 | BROWSER_SAFARI = 2, 28 | BROWSER_OPERA = 3; 29 | 30 | if (typeof browser === 'undefined' && typeof chrome !== 'undefined') browser = chrome; 31 | if ((!!window.browser && !!window.browser.runtime) || (typeof InstallTrigger !== 'undefined')) browser_type = BROWSER_CHROME 32 | else if (Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0) browser_type = BROWSER_SAFARI; 33 | else browser_type = BROWSER_OPERA; 34 | 35 | /** 36 | * Logging function. 37 | * @param {Array|String} arguments Data to put to debug output. 38 | * */ 39 | function log() { 40 | if (!debug) return; 41 | if (browser_type === BROWSER_OPERA) { 42 | window.opera.postError('[AutoPatchWork] ' + Array.prototype.slice.call(arguments)); 43 | } else if (window.console) { 44 | window.console.log('[AutoPatchWork] ' + Array.prototype.slice.call(arguments)); 45 | } 46 | } 47 | 48 | /** 49 | * Profiling function. 50 | * @param {String} name Profiled function name. 51 | * @param {Any} end Any variable to mark function end. 52 | * @example profile('function_name'); some code; profile('function_name', 'end'); 53 | * */ 54 | function profile(name, end) { 55 | if (!debug || !profiler) return; 56 | if (prof_first_run) { prof_first_run = false; console.log('============================'); } 57 | if (typeof end === 'undefined') { 58 | console.time(name); 59 | } else { 60 | console.timeEnd(name); 61 | } 62 | } 63 | 64 | /* jshint ignore:start */ 65 | /** 66 | * Checks variable and explictly converts string to the corresponding boolean. 67 | * Possible data values are: undefined, null, unknown text or a number (treated as false here except 1), 68 | * 'on', 'off', '1', '0', 1, 0, 'true', 'false', true, false). 69 | * @param {*} s Data to check. 70 | * @return {boolean} Boolean result. 71 | * */ 72 | function s2b(s) { return ((typeof s !== 'undefined') && s && (s === true || s === 'true' || s === 'on' || s == 1)) ? true : false; } 73 | /* jshint ignore:end */ 74 | 75 | /** 76 | * APW exception object. 77 | * @param {String} message Event string. 78 | * */ 79 | function APWException(message) { 80 | this.message = message; 81 | this.name = '[AutoPatchWork]'; 82 | } 83 | 84 | /** 85 | * Dispatches standard event on the document. 86 | * @param {String} type Event name string. 87 | * @param {Array} opt Array of event's parameters. 88 | * */ 89 | function dispatch_event(type, opt) { 90 | var ev = new window.CustomEvent(type, { 'detail': opt }); 91 | document.dispatchEvent(ev); 92 | } 93 | 94 | /** 95 | * Dispatches HTML event on specific node. 96 | * @param {Node} element Node to fire event on. 97 | * @param {String} event Event name string. 98 | * */ 99 | function dispatch_html_event(element, event) { 100 | var evt = document.createEvent('HTMLEvents'); 101 | evt.initEvent(event, true, true ); // event type,bubbling,cancelable 102 | return !element.dispatchEvent(evt); 103 | } 104 | -------------------------------------------------------------------------------- /scripts/manager.js: -------------------------------------------------------------------------------- 1 | var RECORDS_PER_PAGE = 100, 2 | JSON_SITEINFO_DB = 'http://wedata.net/databases/AutoPagerize/items.json', 3 | pageIndex = 0; 4 | 5 | (function(){ 6 | var html = document.querySelector('html'); 7 | html.setAttribute('lang', window.navigator.language); 8 | html.setAttribute('xml:lang', window.navigator.language); 9 | }()); 10 | 11 | (function siteinfo_manager(bgProcess) { 12 | // Init browser-specific messaging 13 | switch (browser_type) { 14 | case BROWSER_SAFARI: 15 | if (bgProcess) break; 16 | safari.self.tab.dispatchMessage('siteinfo_init'); 17 | safari.self.addEventListener('message', function(evt) { siteinfo_manager(evt.message); }, false); 18 | return; 19 | case BROWSER_OPERA: 20 | bgProcess = bgProcess || opera.extension.bgProcess; 21 | break; 22 | case BROWSER_CHROME: 23 | bgProcess = bgProcess || browser.extension.getBackgroundPage(); 24 | } 25 | 26 | if (!bgProcess) { 27 | var error = 'Can\'t fing background process!'; 28 | alert(error); 29 | throw new APWException(error); 30 | return; 31 | } 32 | 33 | if (typeof storagebase.AutoPatchWorkConfig !== 'undefined') 34 | debug = !!JSON.parse(storagebase.AutoPatchWorkConfig).debug_mode; 35 | 36 | JSON_SITEINFO_DB = bgProcess.JSON_SITEINFO_DB || JSON_SITEINFO_DB; 37 | 38 | var site_stats = bgProcess.site_stats, 39 | site_fail_stats = bgProcess.site_fail_stats, 40 | allow_ext_styles = bgProcess.AutoPatchWorkBG.config.allow_ext_styles, 41 | entry_editor_running = false, 42 | getWedataId = bgProcess.getWedataId || function getWedataId(wditem) { 43 | return parseInt(wditem.resource_url ? wditem.resource_url.replace('http://wedata.net/items/', '0') : '', 10) || 0; 44 | }; 45 | 46 | document.addEventListener('DOMContentLoaded', function () { 47 | var successful = 'number_of_successful', 48 | failed = 'number_of_failed', 49 | siteinfos_array = {}, 50 | wedata_array, filtered_wedata_array = [], 51 | re_http = /^https?:\/\/[^"'`]+$/ig, 52 | except_info = { 53 | 'database_resource_url': true, 54 | 'resource_url': true 55 | }; 56 | 57 | document.getElementById('loader').style.display = 'none'; 58 | 59 | window.addEventListener('AutoPatchWork.request', function(e) { 60 | profile('AutoPatchWork.request'); 61 | if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; 62 | 63 | var infos = filtered_wedata_array.length ? filtered_wedata_array : wedata_array; 64 | if (!!infos && infos.length > RECORDS_PER_PAGE * (pageIndex + 1) && pageIndex < Math.ceil(infos.length/RECORDS_PER_PAGE)) { 65 | pageIndex++; 66 | SiteInfoView(infos.slice(RECORDS_PER_PAGE * pageIndex, RECORDS_PER_PAGE * (pageIndex + 1)), RECORDS_PER_PAGE * pageIndex); 67 | } else { 68 | dispatch_event('AutoPatchWork.state', {state:'off'}); 69 | } 70 | 71 | dispatch_event('AutoPatchWork.pageloaded'); 72 | profile('AutoPatchWork.request', 'end'); 73 | }, true); 74 | 75 | bgProcess.siteinfo.forEach(function (v) { 76 | var id = parseInt(v['wedata.net.id'], 10) || 0; 77 | if (id) siteinfos_array[id] = v; 78 | }); 79 | 80 | var template_element = document.getElementById('tmpl_siteinfo_body').firstChild; 81 | while (template_element && (template_element.nodeType !== 1)) template_element = template_element.nextSibling; 82 | 83 | var siteinfo_search_input = document.getElementById('siteinfo_search_input'); 84 | siteinfo_search_input.value = ~window.location.hash.indexOf('=') ? window.location.hash.substr(1).split('=')[1] || '' : ''; 85 | 86 | /* jshint ignore:start */ 87 | var siteinfo_table = document.getElementById('siteinfo_table'), 88 | siteinfo_nav = document.getElementById('siteinfo_nav'), 89 | siteinfo_view = document.getElementById('siteinfo_view'), 90 | siteinfo_head = document.getElementById('siteinfo_head'), 91 | siteinfo_body = siteinfo_table.querySelector('tbody'); 92 | /* jshint ignore:end */ 93 | 94 | var allowed_fields = { 95 | 'nextLink':1, 96 | 'nextLinkSelector':1, 97 | 'prevLink':1, 98 | 'prevLinkSelector':1, 99 | 'pageElement':1, 100 | 'pageElementSelector':1, 101 | 'url':1, 102 | 'insertBefore':1, 103 | 'comment':1, 104 | 'exampleUrl':1 105 | }; 106 | 107 | var custom_ext_fields = { 108 | 'forceIframe':1, 109 | 'allowScripts':1, 110 | 'prevLink':1, 111 | 'prevLinkSelector':1, 112 | 'disableSeparator':1 113 | }; 114 | 115 | var custom_fields = { 116 | 'disabled': 1, 117 | 'length': 1, 118 | 'jsPatch': 1, 119 | 'cssPatch': 1, 120 | 'removeElement': 1, 121 | 'forceAddressChange': 1 122 | }; 123 | 124 | var essential_fields = {'url':1 , 'pageElement':1,'nextLink':1}; 125 | 126 | var types = { 127 | 'number': { 128 | number: true, 129 | key: 'disabled' 130 | }, 131 | 'name': { 132 | string: true, 133 | title: 'Item name', 134 | key: 'name' 135 | }, 136 | 'data': { 137 | string: false, 138 | title: 'SITEINFO', 139 | key: 'data' 140 | }, 141 | 'created_at': { 142 | string: true, 143 | title: 'Created', 144 | key: 'created_at' 145 | }, 146 | 'updated_at': { 147 | string: true, 148 | title: 'Updated', 149 | key: 'updated_at' 150 | }, 151 | 'created_by': { 152 | string: true, 153 | title: 'Author', 154 | key: 'created_by' 155 | }, 156 | 'resource_url': { 157 | string: true, 158 | title: 'Database entry', 159 | key: 'resource_url', 160 | filter: function (v) { 161 | v = wedata_filter(v); 162 | return ('_0000000000' + v).slice(-10); 163 | } 164 | }, 165 | 'database_resource_url': { 166 | string: true, 167 | title: 'Database', 168 | key: 'database_resource_url', 169 | filter: wedata_filter 170 | }, 171 | 'number_of_successful': { 172 | number: true, 173 | title: 'Hits', 174 | key: 'number_of_successful' 175 | }, 176 | 'number_of_failed': { 177 | number: true, 178 | title: 'Misses', 179 | key: 'number_of_failed' 180 | } 181 | }; 182 | 183 | function wedata_filter(v) { 184 | return v.replace(/http:\/\/wedata\.net\/(items\/|databases\/)?/, ''); 185 | } 186 | 187 | var sorted = null; 188 | siteinfo_head.onclick = function (e) { 189 | var key = e.target.id; 190 | if (types[key]) { 191 | var infos = filtered_wedata_array.length ? filtered_wedata_array : wedata_array; 192 | sort_by(infos, types[key]); 193 | if (e.target.className === 'c-down') { 194 | e.target.className = 'c-up'; 195 | infos.reverse(); 196 | } else { 197 | e.target.className = 'c-down'; 198 | } 199 | if (sorted && e.target !== sorted) { 200 | sorted.className = ''; 201 | } 202 | InitSiteInfoView(infos); 203 | sorted = e.target; 204 | } 205 | }; 206 | 207 | siteinfo_view.onclick = function (e) { 208 | if (e.target && e.target === siteinfo_view) { 209 | entry_editor_running = false; 210 | siteinfo_view.style.top = -window.innerHeight + 'px'; 211 | siteinfo_view.style.bottom = window.innerHeight + 'px'; 212 | while (siteinfo_view.firstChild) siteinfo_view.removeChild(siteinfo_view.firstChild); 213 | } 214 | }; 215 | 216 | function process_search_input() { 217 | if (!wedata_array || !wedata_array.length) return; 218 | profile('process_search_input'); 219 | 220 | var fullword = siteinfo_search_input.value, 221 | fullwords = []; 222 | if (fullword.trim() !== '') { 223 | var ret = [], 224 | word = fullword.replace(/"([^"]+)"/g, function ($0, $1) { 225 | if ($1) ret.push($1); 226 | return ''; 227 | }); 228 | fullwords = word.split(/[\+\s\.:\|#]/).concat(ret).filter(function (w) { 229 | return w; 230 | }); 231 | } else { 232 | filtered_wedata_array = []; 233 | InitSiteInfoView(wedata_array); 234 | return; 235 | } 236 | 237 | filtered_wedata_array = wedata_array.filter(function (sinfo) { 238 | var ret = []; 239 | for (var k in sinfo) { 240 | if (sinfo.hasOwnProperty(k)) { 241 | if (except_info[k]) continue; 242 | var wedata_item = sinfo[k]; 243 | if (typeof wedata_item === 'object') { 244 | for (var k2 in wedata_item) { 245 | if (wedata_item.hasOwnProperty(k2)) { 246 | ret.push(wedata_item[k2]); 247 | } 248 | } 249 | } else { 250 | ret.push(wedata_item); 251 | } 252 | } 253 | } 254 | 255 | var dat = ret.join('\n'); 256 | if (fullwords.map(function (k) {return new RegExp(k.replace(/\W/g, '\\$&'), 'im');}).every(function (r) { 257 | return r.test(dat); 258 | })) return true; 259 | 260 | return false; 261 | }); 262 | 263 | InitSiteInfoView(filtered_wedata_array); 264 | profile('process_search_input', 'end'); 265 | } 266 | 267 | var timer = null; 268 | siteinfo_search_input.addEventListener('input', function() { 269 | clearTimeout(timer); 270 | timer = setTimeout(process_search_input, 400); 271 | }, false); 272 | 273 | function url2anchor(url) { 274 | var a = document.createElement('a'); 275 | if (typeof url !== 'string' || url.trim() === '') return a; 276 | if (!url.match(re_http)) { 277 | a.href = '#'; 278 | return a; 279 | } 280 | a.textContent = url.replace(/https?:\/\/wedata\.net\/(items\/|databases\/)?/, ''); 281 | a.href = url; 282 | a.target = '_blank'; 283 | return a; 284 | } 285 | 286 | function urls2anchors(urls) { 287 | var df = document.createDocumentFragment(); 288 | if (typeof urls !== 'string') return df; 289 | urls = urls.trim(); 290 | if (urls.length > 5) urls.split(/[\s\n\r]+/).map(url2anchor).forEach(function (a, i) { 291 | if (i) df.appendChild(document.createElement('br')); 292 | df.appendChild(a); 293 | }); 294 | return df; 295 | } 296 | 297 | function string2date(date) { 298 | var t = document.createElement('time'); 299 | t.setAttribute('datetime', date); 300 | t.setAttribute('title', date); 301 | t.textContent = date.replace(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\+(\d{2}):(\d{2})/, '$1/$2/$3'); 302 | return t; 303 | } 304 | 305 | var text_to_html = { 306 | 'database_resource_url': url2anchor, 307 | 'resource_url': url2anchor, 308 | 'created_at': string2date, 309 | 'updated_at': string2date, 310 | 'exampleUrl': urls2anchors 311 | }; 312 | 313 | function sort_by(siteinfo, opt) { 314 | if (opt.number) { 315 | siteinfo.sort(function (a, b) { 316 | return b[opt.key] - a[opt.key]; 317 | }); 318 | } else if (opt.string) { 319 | Object.prototype.toString = opt.filter ? filter2string : normal2string; 320 | siteinfo.sort(); 321 | delete Object.prototype.toString; 322 | } 323 | 324 | function filter2string() { 325 | return opt.filter(this[opt.key]); 326 | } 327 | 328 | function normal2string() { 329 | return this[opt.key]; 330 | } 331 | 332 | } 333 | 334 | function apply_fixes(wedata_arr) { 335 | //var logtext = ''; 336 | wedata_arr.forEach(function (wedata_item) { 337 | var id = getWedataId(wedata_item); 338 | wedata_item[successful] = site_stats[id] || 0; 339 | wedata_item[failed] = site_fail_stats[id] || 0; 340 | if (!wedata_item.data) return; 341 | var t = wedata_item.data['cssPatch'] || wedata_item.data['Stylish'] || null; 342 | 343 | //clean-up unknown fields 344 | for (var k in wedata_item.data) { 345 | if (wedata_item.data.hasOwnProperty(k) && !(k in allowed_fields)) { 346 | //logtext += 'removed field from wedata[' + id +']: ' + k + '\n'; 347 | delete wedata_item.data[k]; 348 | } 349 | } 350 | 351 | wedata_item.data['prevLink'] = wedata_item.data['prevLink'] || ''; // show the field if absent 352 | wedata_item.data['insertBefore'] = wedata_item.data['insertBefore'] || ''; // show the field if absent 353 | if (allow_ext_styles) { 354 | if (t && !t.match(/java/i && !t.match(/url[^\(]*\(/i)) && 355 | t.replace(/\s/g,'').length > 5) { 356 | t = t.replace(/url[^\(]*\([^\)]+\)/ig,''); 357 | t = t.match(/@-moz-document[^{]+{\s*([^@]+)\s*}/)[1] || t; 358 | wedata_item.data['cssPatch'] = t; 359 | } 360 | } 361 | }); 362 | //log(logtext); 363 | } 364 | 365 | 366 | function InitSiteInfoView(wedata_arr) { 367 | SiteInfoView(wedata_arr.slice(0, RECORDS_PER_PAGE)); 368 | SiteInfoNavi(wedata_arr); 369 | if (wedata_arr.length > RECORDS_PER_PAGE) { 370 | dispatch_event('AutoPatchWork.state', {state: 'on'}); 371 | } else { 372 | dispatch_event('AutoPatchWork.state', {state: 'off'}); 373 | } 374 | } 375 | 376 | function SiteInfoView(wedata_arr, append) { 377 | profile('SiteInfoView'); 378 | entry_editor_running = false; 379 | toggle_popup('loader', true); 380 | var df = document.createDocumentFragment(); 381 | 382 | wedata_arr.forEach(function (wedata_item, i) { 383 | var id = getWedataId(wedata_item), 384 | current_siteinfo = siteinfos_array[id]; 385 | 386 | var line = template_element.cloneNode(true), 387 | disabled_btn = line.querySelector('input.onoff'), 388 | scripts_enabled_btn = line.querySelector('input.scripts_enable'), 389 | force_iframe_btn = line.querySelector('input.force_iframe'), 390 | disable_separator_btn = line.querySelector('input.disable_separator'), 391 | addr_change_btn = line.querySelector('input.address_change'); 392 | 393 | var ci = bgProcess.getCustomInfo(id); 394 | if (ci) { 395 | if (ci.keys().some(function (k) { 396 | if (k in custom_fields || k in custom_ext_fields) return false; 397 | return ci[k] !== wedata_item.data[k]; 398 | })) { 399 | line.setAttribute('data-modified', 'modified'); 400 | } 401 | 402 | disabled_btn.checked = typeof ci.disabled !== 'undefined' ? ci.disabled : false; 403 | scripts_enabled_btn.checked = typeof ci.allowScripts !== 'undefined' ? ci.allowScripts : false; 404 | force_iframe_btn.checked = typeof ci.forceIframe !== 'undefined' ? ci.forceIframe : false; 405 | disable_separator_btn.checked = typeof ci.disableSeparator !== 'undefined' ? ci.disableSeparator : false; 406 | addr_change_btn.checked = typeof ci.forceAddressChange !== 'undefined' ? ci.forceAddressChange : false; 407 | 408 | if (ci.disabled) line.setAttribute('data-disabled', 'disabled' ); else line.removeAttribute('data-disabled'); 409 | if (ci.allowScripts) line.setAttribute('data-scripts', 'enabled' ); else line.removeAttribute('data-scripts'); 410 | if (ci.forceIframe) line.setAttribute('data-iframe', 'enabled' ); else line.removeAttribute('data-iframe'); 411 | if (ci.disableSeparator) line.setAttribute('data-separator', 'disabled' ); else line.removeAttribute('data-separator'); 412 | if (ci.forceAddressChange) line.setAttribute('data-addrchange', 'enabled' ); else line.removeAttribute('data-addrchange'); 413 | if (ci.removeElement) line.setAttribute('data-remove', 'enabled' ); else line.removeAttribute('data-remove'); 414 | if (ci.cssPatch) line.setAttribute('data-csspatch', 'enabled' ); else line.removeAttribute('data-csspatch'); 415 | if (ci.jsPatch) line.setAttribute('data-jspatch', 'enabled' ); else line.removeAttribute('data-jspatch'); 416 | } 417 | 418 | var cb_handler = function(name, type, state, default_value){ 419 | var def_val = false, type_full = 'data-' + type; 420 | if (typeof default_value !== 'undefined') 421 | def_val = s2b(default_value); 422 | return function() { 423 | var val = this.checked; 424 | if (val) line.setAttribute(type_full, state); else line.removeAttribute(type_full); 425 | current_siteinfo[name] = val; 426 | bgProcess.setCustomInfo(id, name, val, def_val); 427 | bgProcess.saveCustomInfo(); 428 | bgProcess.applyCustomInfo(); 429 | }; 430 | }; 431 | 432 | disabled_btn.onchange = cb_handler('disabled', 'disabled', 'disabled'); 433 | scripts_enabled_btn.onchange = cb_handler('allowScripts', 'scripts', 'enabled'/*, wedata_item.data['allowScripts']*/); 434 | force_iframe_btn.onchange = cb_handler('forceIframe', 'iframe', 'enabled'/*, wedata_item.data['forceIframe']*/); 435 | disable_separator_btn.onchange = cb_handler('disableSeparator', 'separator', 'disabled'/*, wedata_item.data['disableSeparator']*/); 436 | addr_change_btn.onchange = cb_handler('forceAddressChange', 'addrchange', 'enabled'); 437 | 438 | df.appendChild(line); 439 | line.querySelector('td.index').textContent = 1 + i + (append || 0); 440 | wedata_item.keys().forEach(function (wedata_key, i, wedata_item_keys) { 441 | var data = wedata_item[wedata_key]; 442 | var td = line.querySelector('td.' + wedata_key); 443 | if (!td) return; 444 | if (wedata_key === 'name') { 445 | var name_btn = td.firstChild; 446 | name_btn.onclick = function () { 447 | if (entry_editor_running) return; 448 | entry_editor_running = true; 449 | var dl = document.createElement('dl'); 450 | wedata_item_keys.forEach(function (item_key) { 451 | var data = wedata_item[item_key]; 452 | if ((item_key === 'data' && typeof data !== 'object') || 453 | (item_key !== 'data' && typeof data === 'object')) 454 | return; 455 | var dt1 = document.createElement('dt'); 456 | dt1.className = item_key; 457 | dt1.textContent = types[item_key].title; 458 | dl.appendChild(dt1); 459 | var dd1 = document.createElement('dd'); 460 | dd1.className = item_key; 461 | dl.appendChild(dd1); 462 | if (item_key === 'data') { 463 | data['removeElement'] = typeof ci !== 'undefined' ? (ci['removeElement'] || '') : ''; 464 | data['jsPatch'] = typeof ci !== 'undefined' ? (ci['jsPatch'] || '') : ''; 465 | if (!allow_ext_styles) 466 | data['cssPatch'] = typeof ci !== 'undefined' ? (ci['cssPatch'] || '') : ''; 467 | 468 | var dl2 = document.createElement('dl'); 469 | dd1.appendChild(dl2); 470 | 471 | data.keys().forEach(function (si_key) { 472 | var content = '', 473 | def_val = wedata_item.data[si_key], 474 | is_custom = si_key in custom_fields || si_key in custom_ext_fields, 475 | is_essential = si_key in essential_fields; 476 | 477 | ci = bgProcess.getCustomInfo(id); 478 | if (ci) { 479 | content = ci[si_key]; 480 | if (!content && !is_custom) content = data[si_key]; 481 | } else if (!is_custom) { 482 | content = data[si_key]; 483 | } 484 | 485 | if (content || is_custom || si_key === 'insertBefore') { 486 | var dt2 = document.createElement('dt'); 487 | var dd2 = document.createElement('dd'); 488 | dl2.appendChild(dt2); 489 | dl2.appendChild(dd2); 490 | dt2.textContent = si_key; 491 | var node2; 492 | if (text_to_html[si_key]) { 493 | node2 = text_to_html[si_key](content); 494 | } else { 495 | node2 = document.createElement('textarea'); 496 | switch (si_key) { 497 | case 'jsPatch': 498 | node2.rows = 5; 499 | break; 500 | case 'url': 501 | case 'cssPatch': 502 | case 'removeElement': 503 | case 'insertBefore': 504 | node2.rows = 1; 505 | break; 506 | case 'comment': 507 | node2.setAttribute('readonly', ''); 508 | node2.rows = 1; 509 | break; 510 | default: 511 | node2.rows = 2; 512 | } //switch 513 | node2.value = content || ''; 514 | if (!current_siteinfo) node2.setAttribute('readonly', ''); // no corresponding item in local DB 515 | node2.onchange = function() { 516 | //log(current_siteinfo,current_siteinfo[si_key], node2.value); 517 | var val = node2.value.trim(), 518 | is_not_empty = !!val.length; 519 | 520 | if (val === def_val) { // remote SI equals local SI 521 | // only way to remove `insertBefore` from storagebase is to set it equal to remote SI's 522 | bgProcess.removeCustomInfo(id, si_key); 523 | current_siteinfo[si_key] = def_val; 524 | } else { // remote SI differs from local SI 525 | if (is_not_empty || si_key === 'insertBefore') { 526 | // we save empty `insertBefore` value for when we want to override wedata's one 527 | bgProcess.setCustomInfo(id, si_key, val); 528 | current_siteinfo[si_key] = val; // set runtime siteinfo field 529 | } else { 530 | bgProcess.removeCustomInfo(id, si_key); 531 | if (!is_essential) delete current_siteinfo[si_key]; 532 | else { 533 | node2.value = val = def_val; 534 | current_siteinfo[si_key] = def_val; 535 | } 536 | } 537 | } 538 | 539 | bgProcess.saveCustomInfo(); 540 | bgProcess.initCustomInfo(); 541 | 542 | // highlight changed lines 543 | ci = bgProcess.getCustomInfo(id); 544 | if (ci) { 545 | if (ci.keys().some(function (k) { if (k in custom_fields || k in custom_ext_fields) return false; if (ci[k] === '') return false; return (ci[k] !== wedata_item.data[k]); })) 546 | line.setAttribute('data-modified', 'modified'); 547 | else 548 | line.removeAttribute('data-modified'); 549 | 550 | if (ci.removeElement) line.setAttribute('data-remove', 'enabled' ); else line.removeAttribute('data-remove'); 551 | if (ci.cssPatch) line.setAttribute('data-csspatch', 'enabled' ); else line.removeAttribute('data-csspatch'); 552 | if (ci.jsPatch) line.setAttribute('data-jspatch', 'enabled' ); else line.removeAttribute('data-jspatch'); 553 | } else { 554 | line.removeAttribute('data-remove'); 555 | line.removeAttribute('data-csspatch'); 556 | line.removeAttribute('data-jspatch'); 557 | line.removeAttribute('data-modified'); 558 | node2.removeAttribute('data-modified'); 559 | } 560 | 561 | if (val !== def_val) node2.setAttribute('data-modified', 'modified'); 562 | else node2.removeAttribute('data-modified'); 563 | }; //onchange 564 | 565 | if (!is_custom) { 566 | if (content !== data[si_key]) { 567 | node2.setAttribute('data-modified', 'modified'); 568 | line.setAttribute('data-modified', 'modified'); 569 | } 570 | } 571 | } 572 | dd2.appendChild(node2); 573 | } 574 | }); 575 | } else { 576 | var node; 577 | if (text_to_html[item_key]) { 578 | node = text_to_html[item_key](data); 579 | } else { 580 | if (~item_key.indexOf('_url') && data) { 581 | node = document.createElement('a'); 582 | if (data.match(re_http)) 583 | node.href = data; 584 | node.target = '_blank'; 585 | } else { 586 | node = document.createElement('span'); 587 | } 588 | node.textContent = data; 589 | } 590 | dd1.appendChild(node); 591 | } 592 | }); 593 | siteinfo_view.appendChild(dl); 594 | siteinfo_view.style.top = '0px'; 595 | siteinfo_view.style.bottom = '0px'; 596 | siteinfo_view.firstElementChild.style.top = 597 | (window.innerHeight - siteinfo_view.firstElementChild.offsetHeight) / 2 + 'px'; 598 | }; 599 | name_btn.textContent = data; 600 | } else if (text_to_html[wedata_key]) { 601 | td.appendChild(text_to_html[wedata_key](data)); 602 | } else { 603 | td.textContent = data; 604 | } 605 | }); 606 | }); 607 | if (!append) { 608 | var n = siteinfo_body.cloneNode(false); 609 | siteinfo_table.replaceChild(n, siteinfo_body); 610 | siteinfo_body = n; 611 | sorted = null; 612 | } 613 | siteinfo_body.appendChild(df); 614 | toggle_popup('loader', false); 615 | profile('SiteInfoView', 'end'); 616 | } 617 | 618 | /* jshint ignore:start */ 619 | function SiteInfoNavi(wedata_arr) { 620 | profile('SiteInfoNavi'); 621 | var nav = siteinfo_nav; 622 | pageIndex = 0; 623 | while (nav.firstChild) nav.removeChild(nav.firstChild); 624 | 625 | for (var i = 0, len = wedata_arr.length / RECORDS_PER_PAGE; i < len; i++)(function (i) { 626 | var a = document.createElement('a'); 627 | a.textContent = i + 1; 628 | a.href = '#a' + i; 629 | a.id = 'a' + i; 630 | nav.appendChild(a); 631 | a.addEventListener('click', function (e) { 632 | SiteInfoView(wedata_arr.slice(RECORDS_PER_PAGE * i, RECORDS_PER_PAGE * (i + 1))); 633 | pageIndex = i; 634 | window.scrollTo(0, 0); 635 | e.preventDefault(); 636 | }, false); 637 | })(i); 638 | 639 | var r = nav.parentNode.getBoundingClientRect(); 640 | siteinfo_table.style.marginTop = r.height + 10 + 'px'; 641 | profile('SiteInfoNavi', 'end'); 642 | } 643 | /* jshint ignore:end */ 644 | 645 | function UpdateSiteInfo(callback) { 646 | var url = JSON_SITEINFO_DB, 647 | xhr = new XMLHttpRequest(), 648 | progressbar = document.getElementById('progressbar'), 649 | progress = document.getElementById('progress'), 650 | progress_percent = document.getElementById('progress_percent'); 651 | 652 | progressbar.style.display = 'block'; 653 | progress.style.width = '0%'; 654 | 655 | xhr.onreadystatechange = function () { 656 | if (xhr.readyState === 4 /*XMLHttpRequest.DONE*/) { 657 | if (xhr.status === 200) { 658 | var d; 659 | try { 660 | d = JSON.parse(xhr.responseText); 661 | } catch (bug) { 662 | progress.style.width = '100%'; 663 | progress_percent.textContent = 'JSON Error!'; 664 | log('Error parsing JSON DB: ' + bug.message); 665 | return; 666 | } 667 | 668 | progress.style.width = '100%'; 669 | progress_percent.textContent = 'Done!'; 670 | setTimeout(function(){ progressbar.style.display = 'none'; }, 600); 671 | 672 | callback(d); 673 | } else { 674 | progress.style.width = '100%'; 675 | progress_percent.textContent = 'HTTP Error!'; 676 | log('Error requesting JSON DB: ' + xhr.statusText); 677 | } 678 | } 679 | }; 680 | 681 | xhr.onprogress = function(evt) { 682 | if (!evt.lengthComputable) { 683 | xhr.onprogress = null; 684 | return; 685 | } 686 | var percent = Math.min(parseInt(100 * evt.loaded / evt.total, 10), 100); 687 | if (isNaN(percent)) return; 688 | progress_percent.textContent = percent + '%'; 689 | progress.style.width = percent + '%'; 690 | }; 691 | 692 | xhr.open('GET', url, true); // URL can be updated to +?time in preferences in case something happens 693 | xhr.send(null); 694 | } 695 | 696 | function toggle_popup(id , state) { 697 | var popup = document.getElementById(id); 698 | if ((state === true) && popup.style.display !== 'none') return; 699 | setTimeout(function () { 700 | popup.style.display = (state === true) ? 'inline-block' : 'none'; 701 | }, state ? 0 : 1500); 702 | } 703 | 704 | window.onresize = function () { 705 | if (entry_editor_running) { 706 | siteinfo_view.style.top = -window.innerHeight + 'px'; 707 | siteinfo_view.style.bottom = window.innerHeight + 'px'; 708 | entry_editor_running = false; 709 | } 710 | while (siteinfo_view.firstChild) 711 | siteinfo_view.removeChild(siteinfo_view.firstChild); 712 | }; 713 | 714 | profile('UpdateSiteInfo'); 715 | if (sessionStorage.siteinfo_wedata) { 716 | wedata_array = JSON.parse(sessionStorage.siteinfo_wedata); 717 | apply_fixes(wedata_array); 718 | sort_by(wedata_array, { number: true, key: failed }); 719 | if (siteinfo_search_input.value == '') { 720 | InitSiteInfoView(wedata_array); 721 | } else { 722 | dispatch_html_event(siteinfo_search_input, 'input'); 723 | } 724 | window.onresize(); 725 | dispatch_event('AutoPatchWork.siteinfo', { 726 | siteinfo: { 727 | url: '.', 728 | nextLink: '//*', 729 | pageElement: '//*', 730 | SERVICE: true 731 | } 732 | });/**/ 733 | profile('UpdateSiteInfo', 'end'); 734 | } else { 735 | UpdateSiteInfo(function (dl_array) { 736 | wedata_array = dl_array; 737 | sessionStorage.siteinfo_wedata = JSON.stringify(dl_array); 738 | apply_fixes(wedata_array); 739 | sort_by(wedata_array, { number: true, key: failed }); 740 | if (document.getElementById('siteinfo_search_input').value == '') { 741 | InitSiteInfoView(wedata_array); 742 | } else { 743 | dispatch_html_event(document.getElementById('siteinfo_search_input'), 'input'); 744 | } 745 | window.onresize(); 746 | dispatch_event('AutoPatchWork.siteinfo', { 747 | siteinfo: { 748 | url: '.', 749 | nextLink: '//*', 750 | pageElement: '//*', 751 | SERVICE: true 752 | } 753 | });/**/ 754 | profile('UpdateSiteInfo', 'end'); 755 | }); 756 | } 757 | }, false); 758 | })(); 759 | -------------------------------------------------------------------------------- /scripts/options.js: -------------------------------------------------------------------------------- 1 | var bgProcess; 2 | var imageTick = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLvZPZLkNhFIV75zjvYm7VGFNCqoZUJ+roKUUpjRuqp61Wq0NKDMelGGqOxBSUIBKXWtWGZxAvobr8lWjChRgSF//dv9be+9trCwAI/vIE/26gXmviW5bqnb8yUK028qZjPfoPWEj4Ku5HBspgAz941IXZeze8N1bottSo8BTZviVWrEh546EO03EXpuJOdG63otJbjBKHkEp/Ml6yNYYzpuezWL4s5VMtT8acCMQcb5XL3eJE8VgBlR7BeMGW9Z4yT9y1CeyucuhdTGDxfftaBO7G4L+zg91UocxVmCiy51NpiP3n2treUPujL8xhOjYOzZYsQWANyRYlU4Y9Br6oHd5bDh0bCpSOixJiWx71YY09J5pM/WEbzFcDmHvwwBu2wnikg+lEj4mwBe5bC5h1OUqcwpdC60dxegRmR06TyjCF9G9z+qM2uCJmuMJmaNZaUrCSIi6X+jJIBBYtW5Cge7cd7sgoHDfDaAvKQGAlRZYc6ltJlMxX03UzlaRlBdQrzSCwksLRbOpHUSb7pcsnxCCwngvM2Rm/ugUCi84fycr4l2t8Bb6iqTxSCgNIAAAAAElFTkSuQmCC'; 3 | var imageCross = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIhSURBVDjLlZPrThNRFIWJicmJz6BWiYbIkYDEG0JbBiitDQgm0PuFXqSAtKXtpE2hNuoPTXwSnwtExd6w0pl2OtPlrphKLSXhx07OZM769qy19wwAGLhM1ddC184+d18QMzoq3lfsD3LZ7Y3XbE5DL6Atzuyilc5Ciyd7IHVfgNcDYTQ2tvDr5crn6uLSvX+Av2Lk36FFpSVENDe3OxDZu8apO5rROJDLo30+Nlvj5RnTlVNAKs1aCVFr7b4BPn6Cls21AWgEQlz2+Dl1h7IdA+i97A/geP65WhbmrnZZ0GIJpr6OqZqYAd5/gJpKox4Mg7pD2YoC2b0/54rJQuJZdm6Izcgma4TW1WZ0h+y8BfbyJMwBmSxkjw+VObNanp5h/adwGhaTXF4NWbLj9gEONyCmUZmd10pGgf1/vwcgOT3tUQE0DdicwIod2EmSbwsKE1P8QoDkcHPJ5YESjgBJkYQpIEZ2KEB51Y6y3ojvY+P8XEDN7uKS0w0ltA7QGCWHCxSWWpwyaCeLy0BkA7UXyyg8fIzDoWHeBaDN4tQdSvAVdU1Aok+nsNTipIEVnkywo/FHatVkBoIhnFisOBoZxcGtQd4B0GYJNZsDSiAEadUBCkstPtN3Avs2Msa+Dt9XfxoFSNYF/Bh9gP0bOqHLAm2WUF1YQskwrVFYPWkf3h1iXwbvqGfFPSGW9Eah8HSS9fuZDnS32f71m8KFY7xs/QZyu6TH2+2+FAAAAABJRU5ErkJggg=='; 4 | //var imgRefresh = 5 | // 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAI/SURBVDjLjZPbS9NhHMYH+zNidtCSQrqwQtY5y2QtT2QGrTZf13TkoYFlzsWa/tzcoR3cSc2xYUlGJfzAaIRltY0N12H5I+jaOxG8De+evhtdOP1hu3hv3sPzPO/z4SsBIPnfuvG8cbBlWiEVO5OUItA0VS8oxi9EdhXo+6yV3V3UGHRvVXHNfNv6zRfNuBZVoiFcB/3LdnQ8U+Gk+bhPVKB3qUOuf6/muaQR/qwDkZ9BRFdCmMr5EPz6BN7lMYylLGgNNaKqt3K0SKDnQ7us690t3rNsxeyvaUz+8OJpzo/QNzd8WTtcaQ7WlBmPvxhx1V2Pg7oDziIBimwwf3qAGWESkVwQ7owNujk1ztvk+cg4NnAUTT4FrrjqUKHdF9jxBfXr1rgjaSk4OlMcLrnOrJ7latxbL1V2lgvlbG9MtMTrMw1r1PImtfyn1n5q47TlBLf90n5NmalMtUdKZoyQMkLKlIGLjMyYhFpmlz3nGEVmFJlRZNaf7pIaEndM24XIjCOzjX9mm2S2JsqdkMYIqbB1j5C6yWzVk7YRFTsGFu7l+4nveExIA9aMCcOJh6DIoMigyOh+o4UryRWQOtIjaJtoziM1FD0mpE4uZcTc72gBaUyYKEI6khgqINXO3saR7kM8IZUVCRDS0Ucf+xFbCReQhr97MZ51wpWxYnhpCD3zOrT4lTisr+AJqVx0Fiiyr4/vhP4VyyMFIUWNqRrV96vWKXKckBoIqWzXYcoPDrUslDJoopuEVEpIB0sR+AuErIiZ6OqMKAAAAABJRU5ErkJggg=='; 6 | //var imgSave = 7 | // 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAH+SURBVBgZBcE9i11VGAbQtc/sO0OCkqhghEREAwpWAWUg8aMVf4KFaJEqQtAipTZWViKiCGOh2Ap2gmJhlSIWFsFOxUK0EsUM3pl79n4f12qHb3z3Fh7D83gC95GOJsDe0ixLk5Qq/+xv/Lw9Xd+78/HLX3Y8fXTr2nWapy4eCFKxG7Fby97SnDlYtMbxthyfzHO//nl85fNvfvnk8MbX5xa8IHx1518Vkrj54Q+qQms2vVmWZjdiu5ZR2rT01166/NCZg/2PFjwSVMU6yjoC1oq+x6Y3VbHdlXWExPd379nf7Nmejv2Os6OC2O4KLK0RNn3RNCdr2Z5GJSpU4o+/TkhaJ30mEk5HwNuvX7Hpi76wzvjvtIwqVUSkyjqmpHS0mki8+9mPWmuWxqYvGkbFGCUAOH/+QevYI9GFSqmaHr5wkUYTAlGhqiRRiaqiNes6SOkwJwnQEqBRRRJEgkRLJGVdm6R0GLMQENE0EkmkSkQSVVMqopyuIaUTs0J455VLAAAAAODW0U/GiKT0pTWziEj44PZ1AAAAcPPqkTmH3QiJrlEVDXDt0qsAAAAAapa5BqUnyaw0Am7//gUAAAB49tEXzTmtM5KkV/y2G/X4M5fPao03n/sUAAAAwIX7y5yBv9vhjW/fT/IkuSp5gJKElKRISYoUiSRIyD1tufs/IXxui20QsKIAAAAASUVORK5CYII='; 8 | var imgLoad = 'data:image/gif;base64,R0lGODlhEAAQAPIAAP///wAAAMLCwkJCQgAAAGJiYoKCgpKSkiH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCgAAACwAAAAAEAAQAAADMwi63P4wyklrE2MIOggZnAdOmGYJRbExwroUmcG2LmDEwnHQLVsYOd2mBzkYDAdKa+dIAAAh+QQJCgAAACwAAAAAEAAQAAADNAi63P5OjCEgG4QMu7DmikRxQlFUYDEZIGBMRVsaqHwctXXf7WEYB4Ag1xjihkMZsiUkKhIAIfkECQoAAAAsAAAAABAAEAAAAzYIujIjK8pByJDMlFYvBoVjHA70GU7xSUJhmKtwHPAKzLO9HMaoKwJZ7Rf8AYPDDzKpZBqfvwQAIfkECQoAAAAsAAAAABAAEAAAAzMIumIlK8oyhpHsnFZfhYumCYUhDAQxRIdhHBGqRoKw0R8DYlJd8z0fMDgsGo/IpHI5TAAAIfkECQoAAAAsAAAAABAAEAAAAzIIunInK0rnZBTwGPNMgQwmdsNgXGJUlIWEuR5oWUIpz8pAEAMe6TwfwyYsGo/IpFKSAAAh+QQJCgAAACwAAAAAEAAQAAADMwi6IMKQORfjdOe82p4wGccc4CEuQradylesojEMBgsUc2G7sDX3lQGBMLAJibufbSlKAAAh+QQJCgAAACwAAAAAEAAQAAADMgi63P7wCRHZnFVdmgHu2nFwlWCI3WGc3TSWhUFGxTAUkGCbtgENBMJAEJsxgMLWzpEAACH5BAkKAAAALAAAAAAQABAAAAMyCLrc/jDKSatlQtScKdceCAjDII7HcQ4EMTCpyrCuUBjCYRgHVtqlAiB1YhiCnlsRkAAAOwAAAAAAAAAAAA=='; 9 | 10 | // main 11 | document.addEventListener('DOMContentLoaded',function(){ 12 | (function option_init(opt) { 13 | 14 | function find(path) { 15 | if (typeof path !== 'string') return []; 16 | var arr = []; 17 | for (var nl = document.querySelectorAll(path), i = 0, ref = arr.length = nl.length; i < ref; i++) arr[i] = nl[i]; 18 | return arr; 19 | } 20 | 21 | var html = document.querySelector('html'); 22 | html.setAttribute('lang', window.navigator.language); 23 | html.setAttribute('xml:lang', window.navigator.language); 24 | 25 | function APWException(message) { 26 | this.message = message; 27 | this.name = '[AutoPatchWork]'; 28 | } 29 | 30 | switch (browser_type) { 31 | case BROWSER_CHROME: 32 | bgProcess = browser.extension.getBackgroundPage(); 33 | AutoPatchWork = bgProcess.AutoPatchWorkBG; 34 | break; 35 | case BROWSER_SAFARI: 36 | if(!opt) { 37 | safari.self.tab.dispatchMessage('option_init'); 38 | safari.self.addEventListener('message', function(evt) { 39 | if(evt.name === 'option_init') { 40 | option_init(evt.message); 41 | } else if(evt.name === 'updated_siteinfo') { 42 | bgProcess.callback(); 43 | } 44 | }, false); 45 | return; 46 | } else { 47 | AutoPatchWork = opt; 48 | ['init_css', 'save_custom_patterns', 'reset_custom_patterns', 'add_disabled_site', 'delete_disabled_site'].forEach(function(action) { 49 | AutoPatchWork[action] = function() { 50 | safari.self.tab.dispatchMessage('invoke_action', { 51 | action: action, 52 | args: Array.prototype.slice.call(arguments) 53 | }); 54 | }; 55 | }); 56 | AutoPatchWork.update = function() { 57 | safari.self.tab.dispatchMessage('invoke_action', { 58 | action: 'update', 59 | config: AutoPatchWork.config 60 | }); 61 | }; 62 | AutoPatchWork.save_disabled_site = function() { 63 | safari.self.tab.dispatchMessage('invoke_action', { 64 | action: 'save_disabled_site', 65 | disabled_sites: AutoPatchWork.disabled_sites 66 | }); 67 | }; 68 | bgProcess = { 69 | downloadDatabase: function(callback) { 70 | bgProcess.callback = callback; 71 | safari.self.tab.dispatchMessage('invoke_action', { action: 'download_database' }); 72 | } 73 | }; 74 | } 75 | break; 76 | case BROWSER_OPERA: 77 | bgProcess = opera.extension.bgProcess; 78 | if (typeof bgProcess === 'object') AutoPatchWork = bgProcess.AutoPatchWorkBG; 79 | else 80 | throw new APWException('Browser version is too old.'); 81 | break; 82 | default: 83 | } 84 | 85 | var WIDTH = 700; 86 | //var HEIGHT = Math.max(window.innerHeight - 100, 500); 87 | 88 | // General settings tab 89 | var open_siteinfo_manager = document.getElementById('open_siteinfo_manager'); 90 | open_siteinfo_manager.addEventListener('click', function() { 91 | switch (browser_type) { 92 | case BROWSER_CHROME: 93 | browser.tabs.query({active: true}, function(t) { 94 | browser.tabs.create({ 'url': 'siteinfo_manager.html', index: (t[0] ? t[0].index : 0) + 1 }); 95 | }); 96 | break; 97 | case BROWSER_SAFARI: 98 | safari.self.tab.dispatchMessage('options', { manage: true }); 99 | break; 100 | case BROWSER_OPERA: 101 | opera.extension.postMessage({ 102 | name: 'options', 103 | data: { manage: true } 104 | }); 105 | break; 106 | default: 107 | } 108 | }, false); 109 | 110 | var update_siteinfo = document.getElementById('update_siteinfo'); 111 | update_siteinfo.addEventListener('click', function() { 112 | var button_text = update_siteinfo.textContent.trim(); 113 | update_siteinfo.disabled = true; 114 | update_siteinfo.innerHTML = 'Updating...'; 115 | update_siteinfo.className = 'MSG_update_siteinfo_upd'; 116 | 117 | bgProcess.downloadDatabase(function() { 118 | update_siteinfo.innerHTML = 'Updated'; 119 | update_siteinfo.className = 'MSG_update_siteinfo_sucс'; 120 | 121 | setTimeout(function(){ 122 | update_siteinfo.textContent = button_text; 123 | update_siteinfo.className = 'MSG_update_siteinfo'; 124 | update_siteinfo.disabled = false; 125 | }, 4000); 126 | }, function() { 127 | update_siteinfo.innerHTML = 'Unchanged'; 128 | update_siteinfo.className = 'MSG_update_siteinfo_fail'; 129 | setTimeout(function(){ 130 | update_siteinfo.textContent = button_text; 131 | update_siteinfo.className = 'MSG_update_siteinfo'; 132 | update_siteinfo.disabled = false; 133 | }, 4000); 134 | 135 | }); 136 | }, false); 137 | 138 | var reload_db = document.getElementById('reload_db'); 139 | reload_db.addEventListener('click', function() { 140 | reload_db.disabled = true; 141 | bgProcess.initDatabase(); 142 | reload_db.disabled = false; 143 | }, false); 144 | 145 | document.getElementById('db_location').value = bgProcess.JSON_SITEINFO_DB_MIN; 146 | var update_wedata_location = document.getElementById('update_wedata_location'); 147 | update_wedata_location.addEventListener('click', function() { 148 | update_wedata_location.disabled = true; 149 | var loc = document.getElementById('db_location').value; 150 | if (!loc || loc.length < 10) { 151 | bgProcess.resetDBLocation(false); 152 | document.getElementById('db_location').value = bgProcess.JSON_SITEINFO_DB_MIN; 153 | update_wedata_location.disabled = false; 154 | } else if (loc !== bgProcess.JSON_SITEINFO_DB_MIN && /^https?:\/\/.+\.json.*/i.test(loc)) { 155 | bgProcess.checkExists(loc, function (exists) { 156 | if (exists) bgProcess.updateMiniDatabaseURL(loc); 157 | update_wedata_location.disabled = false; 158 | }); 159 | } else update_wedata_location.disabled = false; 160 | }, false); 161 | 162 | document.getElementById('full_db_location').value = bgProcess.JSON_SITEINFO_DB; 163 | var update_wedata_full_location = document.getElementById('update_wedata_full_location'); 164 | update_wedata_full_location.addEventListener('click', function() { 165 | update_wedata_full_location.disabled = true; 166 | var loc = document.getElementById('full_db_location').value; 167 | if (!loc || loc.length < 10) { 168 | bgProcess.resetDBLocation(true); 169 | document.getElementById('full_db_location').value = bgProcess.JSON_SITEINFO_DB; 170 | update_wedata_full_location.disabled = false; 171 | } else if (loc !== bgProcess.JSON_SITEINFO_DB && /^https?:\/\/.+\.json.*/i.test(loc)) { 172 | bgProcess.checkExists(loc, function (exists) { 173 | if (exists) bgProcess.updateFullDatabaseURL(loc); 174 | update_wedata_full_location.disabled = false; 175 | }); 176 | } else update_wedata_full_location.disabled = false; 177 | }, false); 178 | 179 | find('[type="radio"]').forEach(function(box) { 180 | var name = box.name; 181 | var val = AutoPatchWork.config[name] || 'on'; 182 | if(val === box.value) { 183 | box.checked = true; 184 | } 185 | box.addEventListener('click', function() { 186 | AutoPatchWork.config[name] = box.value; 187 | AutoPatchWork.update(); 188 | }, false); 189 | }); 190 | find('[type="checkbox"]').forEach(function(box) { 191 | var id = box.id; 192 | var val = AutoPatchWork.config[id]; 193 | if(val === true || val === false) { 194 | box.checked = val; 195 | } else { 196 | box.checked = false; 197 | } 198 | box.addEventListener('click', function() { 199 | AutoPatchWork.config[id] = box.checked ? true : false; 200 | AutoPatchWork.update(); 201 | }, false); 202 | }); 203 | find('[type="range"]').forEach(function(box) { 204 | var id = box.id; 205 | var output = document.querySelector('#' + id + '_value'); 206 | var val = AutoPatchWork.config[id]; 207 | box.value = val; 208 | output.textContent = box.value; 209 | box.addEventListener('change', function() { 210 | AutoPatchWork.config[id] = +this.value; 211 | output.textContent = box.value; 212 | AutoPatchWork.update(); 213 | }, false); 214 | }); 215 | 216 | // Custom CSS for separator tab 217 | var css_text = document.getElementById('css_text'); 218 | css_text.value = AutoPatchWork.css || ''; 219 | var apply_css = document.getElementById('apply_css'); 220 | apply_css.addEventListener('click', function() { 221 | AutoPatchWork.init_css(css_text.value); 222 | }, false); 223 | var reset_css = document.getElementById('reset_css'); 224 | reset_css.addEventListener('click', function() { 225 | reset_css.disabled = true; 226 | AutoPatchWork.init_css(); 227 | setTimeout(function() { 228 | css_text.value = AutoPatchWork.css; 229 | reset_css.disabled = false; 230 | }, 200); 231 | }, false); 232 | 233 | // Custom SITEINFO patterns tab 234 | var custom_patterns = document.getElementById('custom_patterns'); 235 | custom_patterns.value = storagebase.AutoPatchWorkPatterns || ''; 236 | var apply_custom_patterns = document.getElementById('apply_custom_patterns'); 237 | apply_custom_patterns.addEventListener('click', function() { 238 | try { 239 | JSON.parse(custom_patterns.value); 240 | } catch (bug) { 241 | alert('Invalid JSON format. Check original SITEINFO for the reference.'); 242 | return; 243 | } 244 | AutoPatchWork.save_custom_patterns(custom_patterns.value); 245 | }, false); 246 | var reset_custom_patterns = document.getElementById('reset_custom_patterns'); 247 | reset_custom_patterns.addEventListener('click', function() { 248 | reset_custom_patterns.disabled = true; 249 | AutoPatchWork.reset_custom_patterns(); 250 | setTimeout(function() { 251 | custom_patterns.value = storagebase.AutoPatchWorkPatterns; 252 | reset_custom_patterns.disabled = false; 253 | }, 200); 254 | }, false); 255 | 256 | // Backup tab 257 | var backup_field = document.getElementById('backup_field'); 258 | // It's too big to load from the beginning 259 | document.getElementById('menu-backup').onclick = function() { 260 | backup_field.value = JSON.stringify(storagebase) || ''; 261 | }; 262 | var save_backup = document.getElementById('save_backup'); 263 | save_backup.addEventListener('click', function() { 264 | save_backup.disabled = true; 265 | var backup = JSON.parse(backup_field.value); 266 | storagebase.clear(); 267 | for (var item in backup) 268 | if (backup.hasOwnProperty(item)) 269 | storagebase.setItem(item, backup[item]); 270 | setTimeout(function() { 271 | bgProcess.initDatabase(); 272 | save_backup.disabled = false; 273 | }, 500); 274 | }, false); 275 | var reset_backup = document.getElementById('reset_backup'); 276 | reset_backup.addEventListener('click', function() { 277 | reset_backup.disabled = true; 278 | storagebase.clear(); 279 | //init here; callback on completion 280 | setTimeout(function() { 281 | backup_field.value = JSON.stringify(storagebase); 282 | reset_backup.disabled = false; 283 | }, 1000); 284 | }, false); 285 | 286 | // Blacklists 287 | var filter_list = document.getElementById('filter_list'), 288 | filter_text = document.getElementById('filter_text'), 289 | filter_type = document.getElementById('filter_type'), 290 | add_filter = document.getElementById('add_filter'); 291 | 292 | AutoPatchWork.disabled_sites.forEach(create_filter); 293 | 294 | function create_filter(site) { 295 | var li = document.createElement('li'), 296 | types = filter_type.cloneNode(true); 297 | 298 | types.id = ''; 299 | li.appendChild(types); 300 | types.value = site.type; 301 | types.addEventListener('change', function() { 302 | site.type = types.value; 303 | AutoPatchWork.save_disabled_site(); 304 | }, false); 305 | 306 | var input = document.createElement('input'); 307 | input.type = 'text'; 308 | input.value = site.matcher; 309 | input.addEventListener('input', function() { 310 | site.matcher = input.value; 311 | AutoPatchWork.save_disabled_site(); 312 | }, false); 313 | li.appendChild(input); 314 | 315 | var del = document.createElement('button'); 316 | del.textContent = /*i18n.getMessage('del') ||*/ 'Del'; 317 | del.addEventListener('click', function() { 318 | input.disabled = !input.disabled; 319 | if(input.disabled) { 320 | AutoPatchWork.delete_disabled_site(site); 321 | del.textContent = /*i18n.getMessage('undo') ||*/ 'Undo'; 322 | } else { 323 | AutoPatchWork.add_disabled_site(site); 324 | del.textContent = /*i18n.getMessage('del') ||*/ 'Del'; 325 | } 326 | }, false); 327 | li.appendChild(del); 328 | 329 | filter_list.appendChild(li); 330 | } 331 | 332 | add_filter.addEventListener('click', function() { 333 | var site = filter_text.value; 334 | if(!site) return; 335 | 336 | var type = filter_type.value; 337 | if(type.toLowerCase() === 'regexp') { 338 | try { 339 | new RegExp(site); 340 | } catch (bug) { 341 | alert('[AutoPatchWork] RegExp '+site+' has invalid format!'); 342 | return; 343 | } 344 | } 345 | site = { matcher: site, type: type }; 346 | create_filter(site); 347 | AutoPatchWork.add_disabled_site(site); 348 | filter_text.value = ''; 349 | }, false); 350 | 351 | var sections = find('section.content'), 352 | inner_container = document.getElementById('inner-container'), 353 | container = document.getElementById('base'); 354 | 355 | inner_container.style.width = sections.length * (WIDTH + 20) + 'px'; 356 | container.style.height = 'auto'; //HEIGHT + 'px'; 357 | sections.forEach(function(section) { 358 | section.style.visibility = 'hidden'; 359 | section.style.height = '100px'; 360 | }); 361 | 362 | var btns = find('#menu-tabs>li>a'), 363 | default_title = document.title; 364 | 365 | btns.forEach(function(btn, i, btns) { 366 | btn.addEventListener('click', function(evt) { 367 | evt.preventDefault(); 368 | btns.forEach(function(btn) { 369 | btn.parentNode.className = ''; 370 | }); 371 | btn.parentNode.className = 'selected'; 372 | sections[i].style.visibility = 'visible'; 373 | sections[i].style.height = 'auto'; 374 | new Tween(inner_container.style, { 375 | marginLeft: { 376 | to: i * -WIDTH, 377 | tmpl: '$#px' 378 | }, 379 | time: 0.2, 380 | onComplete: function() { 381 | document.title = default_title + btn.hash; 382 | if (!window.opera) location.hash = btn.hash; 383 | window.scrollBy(0, -1000); 384 | sections.forEach(function(section, _i) { 385 | if(i !== _i) { 386 | section.style.visibility = 'hidden'; 387 | section.style.height = '100px'; 388 | } 389 | }); 390 | } 391 | }); 392 | }, false); 393 | }); 394 | 395 | if(location.hash) { 396 | sections.some(function(section, i) { 397 | if('#' + section.id === location.hash) { 398 | btns.forEach(function(btn) { 399 | btn.parentNode.className = ''; 400 | }); 401 | btns[i].parentNode.className = 'selected'; 402 | inner_container.style.marginLeft = -WIDTH * i + 'px'; 403 | section.style.visibility = 'visible'; 404 | section.style.height = 'auto'; 405 | document.title = default_title + location.hash; 406 | } 407 | }); 408 | } else { 409 | sections[0].style.height = 'auto'; 410 | sections[0].style.visibility = 'visible'; 411 | document.title = default_title + '#' + sections[0].id; 412 | } 413 | 414 | })(); 415 | }, false); 416 | 417 | /* jshint ignore:start */ 418 | // Tweener Like snippet 419 | // var tw = new Tween(div.style,{time:1, onComplete:function(){},left:{to:0,from:100,tmpl:"$#px"}}); 420 | function Tween(item, opt) { 421 | var self = this, TIME = 10, time = (opt.time||1) * 1000, TM_EXP = /(\+)?\$([\#\d])/g, sets = [], isFilter, 422 | easing = opt.transition || function(t, b, c, d){return c*t/d + b;}, _T = {time:1,onComplete:1,transition:1,delay:1}; 423 | for (var k in opt) if (opt.hasOwnProperty(k)) if (!_T[k]) { 424 | var set = opt[k], from = set.from || 0; 425 | if (typeof item === 'function') { 426 | isFilter = true; 427 | sets.push({from:from, to:set.to}); 428 | } else { 429 | from = from || parseFloat(item[k]) || 0; 430 | sets.push({key:k, from:from, to:set.to, tmpl:(set.tmpl || '-$#')}); 431 | } 432 | } 433 | var L = sets.length, delay = opt.delay*1000 || 0, startTime = new Date()*1 + delay, run = function(){ 434 | var now = new Date()*1, tim = self.prev = now - startTime; 435 | for (var k = 0; k < L; ++k) { 436 | var set = sets[k], val = easing(tim, set.from, set.to - set.from, time); 437 | if (isFilter) { 438 | item(val); 439 | } else { 440 | item[set.key] = set.tmpl.replace(TM_EXP, 441 | function(m, p, m1){return p && val < 0 ? 0 : (m1 === '#' ? val : val.toFixed(m1));}); 442 | } 443 | } 444 | if (tim <= time) {self.T=setTimeout(function(){run.call(self);},TIME);} 445 | else { 446 | for (var k = 0; k < L; ++k) { 447 | if (isFilter) { 448 | item(sets[k].to); 449 | } else { 450 | item[sets[k].key] = sets[k].tmpl.replace(TM_EXP, sets[k].to); 451 | } 452 | } 453 | if (typeof opt.onComplete === 'function') opt.onComplete(item); 454 | self.end = true; 455 | } 456 | }; 457 | self.prev = 0; 458 | this.restart = function(){ 459 | startTime = new Date()*1 - self.prev; 460 | run(); 461 | }; 462 | this.pause = function(){ 463 | if(self.T){ 464 | clearTimeout(self.T); 465 | self.T = null; 466 | } 467 | }; 468 | this.stop = function(){ 469 | if(self.T){ 470 | clearTimeout(self.T); 471 | self.T = null; 472 | self.prev = 0; 473 | for (var k = 0; k < L; ++k) { 474 | var set = sets[k], val = set.from; 475 | if (isFilter) { 476 | item(val); 477 | } else { 478 | item[set.key] = set.tmpl.replace(TM_EXP, 479 | function(m, p, m1){return p && val < 0 ? 0 : (m1 === '#' ? val : val.toFixed(m1));}); 480 | } 481 | } 482 | } 483 | }; 484 | if (delay) this.T=setTimeout(function(){run();},delay); else run(0); 485 | } 486 | /* jshint ignore:end */ 487 | -------------------------------------------------------------------------------- /scripts/storage.js: -------------------------------------------------------------------------------- 1 | var storagebase = typeof window.opera !== 'undefined' ? widget.preferences : localStorage; 2 | (function () { 3 | if (this.Store) return; 4 | // Storage module that supports expiring 5 | var Storage = this.Store = { 6 | get_data:function(key){ 7 | var val = storagebase.getItem(key); 8 | if (val) return JSON.parse(val); 9 | return null; 10 | }, 11 | get:function(key){ 12 | var data = Storage.get_data(key); 13 | if (data.expire) { 14 | var expire = new Date(data.expire); 15 | if (expire.getTime() > new Date().getTime()) return data.value; 16 | else storagebase.removeItem(key); 17 | } else if (data.hasOwnProperty('value')) { 18 | return data.value; 19 | } else 20 | return data; 21 | return null; 22 | }, 23 | has:function(key){ 24 | if (storagebase[key] === void 0) return false; 25 | var data = Storage.get_data(key); 26 | if (data.expire) { 27 | var expire = new Date(data.expire); 28 | if (expire.getTime() > new Date().getTime()) return true; 29 | else storagebase.removeItem(key); 30 | } else 31 | return true; 32 | return false; 33 | }, 34 | set:function(key, value, expire){ 35 | var data = {value:value}; 36 | if (expire) { 37 | if (expire instanceof Date) { 38 | data.expire = expire.toString(); 39 | } else { 40 | if (typeof expire === 'object') { 41 | expire = duration(expire); 42 | } 43 | var time = new Date(); 44 | time.setTime(time.getTime() + expire); 45 | data.expire = time.toString(); 46 | } 47 | } 48 | storagebase.setItem(key, JSON.stringify(data)); 49 | } 50 | }; 51 | Storage.duration = duration; 52 | function duration (dat) { 53 | var ret = 0, map = { 54 | sec:1, min:60, hour:3600, day:86400, week:604800, month:2592000, year:31536000 55 | }; 56 | Object.keys(dat).forEach(function(k){ if(map[k] > 0) ret += dat[k] * map[k]; }); 57 | return ret * 1000; 58 | } 59 | })(); -------------------------------------------------------------------------------- /siteinfo_manager.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AutoPatchWork Mod SITEINFO Editor 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |

SITEINFO database editor

16 |

17 | 18 | 19 | loader 20 |

21 | 22 |
23 | 24 | 25 | 26 | 27 | 30 | 33 | 36 | 39 | 42 | 45 | 48 | 49 | 50 | 51 |
28 | 29 | 31 | 32 | 34 | 35 | 37 | 38 | 40 | 41 | 43 | 44 | 46 | 47 |
52 |
53 |
54 | 58 | 59 | 60 | --------------------------------------------------------------------------------