├── .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 | 
14 |
15 | Autopager in action:
16 |
17 | 
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 |
109 |
124 |
125 |
126 | Page separator and statusbar styles:
127 |
128 |
129 |
130 |
131 | Save
132 |
133 |
134 |
135 |
136 | Reset
137 |
138 |
139 |
140 |
141 |
142 | Custom SITEINFO patterns:
143 |
144 |
145 |
146 |
147 | Save
148 |
149 |
150 |
151 |
152 | Reset
153 |
154 |
155 |
156 |
157 |
158 | Backup preferences:
159 |
160 |
161 |
162 |
163 | Save
164 |
165 |
166 |
167 |
168 | Reset
169 |
170 |
171 |
172 |
173 | Version 1.9.7
174 |
175 |
176 | Autostart option.
177 |
178 |
179 | Links target rewriting option.
180 |
181 |
182 | Site filters by RegExps, prefixes and domains.
183 |
184 |
185 | SITEINFO updater and editor.
186 |
187 |
188 | Instant search, editing and disabling of rules and internal auto-pagerizing in SITEINFO editor.
189 |
190 |
191 | Option to disable extension in IFRAMEs.
192 |
193 |
194 | Custom CSS for extension's page separator and statusbar.
195 |
196 |
197 | Custom SITEINFO patterns in JSON format.
198 |
199 |
200 | Option to update location's URL on scroll.
201 |
202 |
203 | Option to change how many pixels left before adding next page.
204 |
205 |
206 | Debug output support.
207 |
208 |
209 | Status bar: loading animation, toggle auto-pagerizing, show SITEINFO editor or options page.
210 |
211 |
212 | Version 1.9.8
213 |
214 |
215 | Opera 15 support.
216 |
217 |
218 | Following local SITEINFO fields were added:
219 | nextMask - allows number auto-increments in next page address.
220 | pageElementSelector - allows next link search by selector.
221 | nextLinkSelector - allows content search by selector.
222 | forceIframe - pages loaded through temporary IFrame instead of XHR.
223 | disableSeparator - disables page separator between added pages.
224 | forceAddressChange - dynamically updates location URL.
225 | allowScripts - allows scripts inside content block of new pages.
226 |
227 |
228 |
229 | Event properties accessible via detail property of CustomEvent -type events.
230 |
231 |
232 | detail.link property of AutoPatchWork.request event contains element (Node type) with reference to the next page. detail.norequest property (Boolean type) defines whether to download page referenced in previous property (false to return blank page template).
233 |
234 |
235 | Next page can be additionally pre-processed in AutoPatchWork.load event as it is available from detail.htmlDoc (HTMLDocument type) property of this event.
236 |
237 |
238 | CSS selector/XPath auto-recognition for standard SITEINFO fields.
239 |
240 |
241 | Events are targeted to document instead of window .
242 |
243 |
244 | Version 1.9.9
245 |
246 |
247 | Firefox 48 and Chrome 49 support.
248 |
249 |
250 | In AutoPatchWork.load event loaded page's URL available through detail.url property.
251 |
252 |
253 | AutoPatchWork.append event now contains detail.nodes and detail.title where first contains elements defined by pageElement[Selector] field and the latter title of added page.
254 |
255 |
256 | forceAddressChange field enables updating of both location URL and page title.
257 |
258 |
259 | insertBefore field can be set to empty in SITEINFO editor to override value from remote database.
260 |
261 |
262 | Per site forceAddressChange (address checkbox) inverts global setting.
263 |
264 |
265 | Following local SITEINFO fields were added:
266 | removeElement[Selector] - removes elements from current and added pages. jsPatch - allows per site JavaScript patching. cssPatch - allows per site CSS patching.
267 |
268 |
269 | Options in SITEINFO editor to disable separators, allow scripts, load pages via IFrames and update URL/title on scroll.
270 |
271 |
272 | Options to make link href s and image src s absolute in added pages.
273 |
274 |
275 | SITEINFO database URL can now be changed in case remote database becomes inaccessible.
276 |
277 |
278 | SITEINFO database can be reloaded manually.
279 |
280 |
281 | SITEINFO database can be automatically cleaned from all unused (that have no successful hits) entries on update.
282 |
283 |
284 | Version 1.10.0
285 |
286 |
287 | Reworked menu to be compact image list with translatable tooltips.
288 |
289 |
290 | With Shift Toggle button disables the extension on current site until browser restart.
291 |
292 |
293 | Button for refreshing incomplete (with Shift - all) images on a page without reloading it.
294 |
295 |
296 | Button for retrying last failed request attempt before termination.
297 |
298 |
299 | Following local SITEINFO fields were added:
300 |
301 | prevLink, prevLinkSelector - specifies previous link for switching autopaging direction.
302 |
303 |
304 |
305 | AutoPatchWork.request event accepts only URL strings as link property.
306 |
307 |
308 | AutoPatchWork.DOMNodeInserted event is disabled on the source-code level. Significantly improves performance.
309 |
310 |
311 | * All version updates include various minor bug-fixes between them.
312 |
313 |
314 |
315 |
316 |
317 | Name:
318 |
319 |
320 | AutoPatchWork Mod
321 |
322 |
323 | Author:
324 |
325 |
326 | DitherSky
327 |
328 |
329 | Thanks:
330 |
331 |
332 | os0x (original AutoPatchWork)
333 |
334 |
335 | AutoPagerize
336 |
337 |
338 | License:
339 |
340 |
341 | The MIT license
342 |
343 |
344 |
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 | Search:
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | disable noseparator address scripts iframe
27 |
28 | name
29 |
30 |
31 | created
32 |
33 |
34 | updated
35 |
36 |
37 | creator
38 |
39 |
40 | db url
41 |
42 |
43 | hit #
44 |
45 |
46 | miss #
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
Loading...
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------