Guest User

StyleChan CSS

a guest
Jun 5th, 2018
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 201.57 KB | None | 0 0
  1. // Generated by Grunt
  2. // ==UserScript==
  3. // @name StyleChan
  4. // @version 1.0.14
  5. // @namespace StyleChan
  6. // @description Customizable themes for 4chan X.
  7. // @minGMVer 1.14
  8. // @minFFVer 26
  9. // @license GPL-3.0; https://github.com/nebukazar/StyleChan/blob/master/LICENSE
  10. // @match *://boards.4chan.org/*
  11. // @grant GM_getValue
  12. // @grant GM_setValue
  13. // @grant GM_deleteValue
  14. // @grant GM_openInTab
  15. // @grant GM_listValues
  16. // @run-at document-start
  17. // @updateURL https://nebukazar.github.io/StyleChan/builds/StyleChan.meta.js
  18. // @downloadURL https://nebukazar.github.io/StyleChan/builds/StyleChan.user.js
  19. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAAOwgAADsIBFShKgAAACSJJREFUaN7tmWuMVdUVx39r73PPvXeYFzPDS3k0+KrYiDE1JrZWRUx1aouOr2gqbRSpj1RBEG2JhBJbNR1UfBQr1NZIaxvrOMQI2KZNW6tFJVqpxLYCFirDw2Fg5s7MfZyz9+qHO0MdAZl7B/CL/087Oees9f+vvffaa68Dn+HThQzl42kvfrVoRKQSpAGoAPJAO0oXggoWJQ5BRgD1fT47QHeqMQWJHa0Xv3T0BVyy6kJUGYbINIHpwIkfEbAV+BXoswonCnIjcAZQ1+dzL7AWdInCmwLa2rjm6Am4ZNVFgNaC3AtcCww7wGtZYD0wHhhzEFMbgdvSZtKqrN9AOSJMWZFHLcgdwPUHIQ+QBs78BPIAxwP3Z/2GE8pdDCULAEGQ44CrgURZXgdiEsjXrVqmrbrwyAq4cuVl/cPT+OTIlsrhXCdxhZQxCyUJSIwK+ofVQFDKt4dANUhZ9koSUDEp1T/cBPQeRgFbEHJHXMCy6qf6hxuA9w4T+Qh4CaVwxAUAKErap3cBjwM9h0HAW8CfAVobVx95ASsb15A1vSj6DPAbwA+B/G7gHgzbyjWw38bZmV6MeBUNpVKcVqmVSGLNxEnJGaeMzswl0piEJHqAhcAE4PwyfOeA+xRdI559h5ht2UFAPhGTahB8WjFOkY6ATMYTEjeNG2BkX97aXtNMshNcgpHimY7yDWAEUBDlAzW0+oDnX14Rtp81M+KmFb8HI6B8AXiSYqkwWETAQ6CLQLpbG1cjLe0ARtDJirkFzFmgw0AcsFmIHzHEqxQbuaaRAwW01TUTdoIPmWjyPCqeCw4wO3k1vK4JFkRV/MXm8DOf/QPiFUS+CCwHJg+S/FJFFwjS2U/eEKU84bcVcxfIePY7mrVD8IsM8U8UG/mmBqBvDwS94ENqTJ7F4rmIA+f4pHjONgVWJDq5TmKSy6cVV06+qn4d8B3g74cgnweWKLoA6HwldxumZTeWqMYTLlTMj0EmcMC6QuoUu8ATnO9JYFt2FgW01S3G5kAcU0SZesj4KceamAdMzByXkvQTV0wlzLQz3k1+DbgBWHeQL3uA+4BFgnS+lruDds7AEI1wJB9W7GyQykN4rwP5bkBPtfTlDmPzSvYYMeL4GsqhDPSLqBLHfJvTeS4l6SeuuoAt9m2M03XADODVj32xF7gb9H7QzCu5eezkNAyuwRE+oJhrgHBQvpHTFTNW+xKoMQVItmsonrGDM7BPRIWJuDPI6DxF08suO5/YCkZ4W4si/tj35i5gtqKPgWTX5B6jnVMRtM4TLFbM1ZRWlgwT/HDQogCfBJdGVXAlCSiKSJuYeTbHXB9KetnlU3EoorxLcU88BdwMPC1IobVxNRGVBOQrFXtvX+RtiV4FEenfJiauFtY+l8prwL9KFtA/EzF3BT06y3hNLZ82FS/gkY2K3qL4VsW71sbV2JZdCD7tSM5XZHqJke9zR6/XRJf26ZYt4xdT+V/Fh5xjCjyPMrwsIdCtAd/LjZbHg4zGozvnDngYtGxHcImYivmKmUfxwlMyBPeipXCNYrpc0yjMhK1z8MVryTr+v27LQaU4fhDu1ktHdDq2HP/AvgfFlOetIzVDkVnlkgftEvyjMVVdib5i2AC4EBJ5etTwOyivKuwPtHh8hCD6MdcEKcU2gtQMwb4HyQkFCn03WQMgIuSrpQ6lhHS2H3rVsADPC92BYfym2wf4dVT2gC4AfbN8/lLrsbPAV/XvAZOhGdujSEHPEOX0Mi1HaljiLU8Ahe7/LEB7IbvHJnN7bNBz3lgsGZSatwzuRkHXD0HEl0FO3JeFsiHUesVEnIdSVbo9Yg1Y6hPcL5Bt2/hDxlf3ki+YkaHxSxLGz1ZI9045hpA2vNa/YYhuAi33QlQj+M8BzPjtxOIS2nyqIH6Qp/BAqBp+GVfIQg2kU9q+z6TavWTjYFQg+pARnWFEFwZG74q9qcpMmUDStBHQ8zfBzwbdWoZLY3ChYsmGlRhbgIb1oJZ/QkmHmWJoUcv8RJfuSS59hvqwgMDElHXLrOiVFA+pikD8nSnrmlHqeqeMBQk1JLNK8LeAbilxyp3HZsEjxmPqmYsPQA1rEXYP0orH8JxabjMFtpkHV1Jz6ToiLycY0WVG9GIGnrBJI3qdNdqcc7ahe8pYxFgNyLwo6M2gm0qIW4cimwXPiovf6UujaXBp2aCGPw3CQqSGX6hwq4nY5h9eSe0NL1Nw5iQrLBOYwoHbbIEVvTZl3SMC43qnjKch7FFDYbUhni6DzE6CrrRE/zZ9i8UARNVColOzalmk5qDlMAhdGvAjTXC7KNvNGw9S962/ko/NSUEx8uccwn9gRK8yoktjL+PazjmFuqBdK3n/VSH+puBaKF54DuLevyL4ZkcqZ/sOsn2RamtYzJj2mA+TdrKJuUc856J9p4XQo8IGNTT7FC9ITD7acjdj0llileMs/GwQ5AesA6fy66yztyaMbz/39WdZ291IwN46T+Jyj50JcjxQAeoFOsC/IPhmT8N7CbYRNY0dKABg0ykPMHFDxK6qoNbk9DRxnCCK9wk2asC7cYX5UGLVMXvnEO0VnMrwhNHlRrSpBPL9cE7l57GXOUboCms9YctWBCcRlSMVMxFkpOBjwb1viDZHVOfq+AcdTV/6yKyUgd49ltibREUQL7Kicyi/yZt3KgtzziwORKPU8NI7NCX3hT7YmSZtHaF1ZxvR64dAHorZaU7S+q8krSfTUXp7tGQB9WGB3timEqI3SbHtMiQINBi4NetsVfDxCvBICAhECY2OFtFy66b9RYieaWCCKUNAyXNmjQeoF6g9XAKAYR6pNaXzL11A7A0KUcL4eEi/OAfCWynPXslLqOANBW92qsqOw8efXVZ0pz0ae8Cr0B0lPlRYw9A60/2IvcqTBW+2ujKWUMkCqusjhicLvuDNQ05lFf0NmgMjq5D5hOcFr/K0U/lpIOrC2qMwAwDbeitIJ932vLM3O5XlWuzz95fiqkXibzqVmZE3VziV1QqdFOucSCHjVdbHKrMiL7MD8R3ZuLxfbmXvw+fePZamcdvIx6YiED1Z4GQPx3iVLgObQN/Ju2DHsLpIuzsStakg/ryqjBJAod2pvJ93doeI+pr6qFwan+FTx/8Agjbnj0iHt+wAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDUtMTlUMTc6MDc6MTErMDA6MDAEoroVAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA1LTE5VDE3OjA3OjExKzAwOjAwdf8CqQAAAEZ0RVh0c29mdHdhcmUASW1hZ2VNYWdpY2sgNi43LjgtOSAyMDE0LTA1LTEyIFExNiBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZ9yG7QAAAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6aGVpZ2h0ADE5Mg8AcoUAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMTky06whCAAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxNDYzNjc3NjMxendcrAAAAA90RVh0VGh1bWI6OlNpemUAMEJClKI+7AAAAFZ0RVh0VGh1bWI6OlVSSQBmaWxlOi8vL21udGxvZy9mYXZpY29ucy8yMDE2LTA1LTE5LzU4MjdkNzExNjY1MjgzOTVlOGQ1NmNhZmVlYjRhNWJlLmljby5wbmfKOfUqAAAAAElFTkSuQmCC
  20. // ==/UserScript==
  21. (function() {
  22. var defaultConfig = {
  23. ":: Main Rice": ["header", ""],
  24. "Left Margin": [
  25. 5, "Change the size of the left margin.", [{
  26. name: "Large",
  27. value: 65
  28. }, {
  29. name: "Medium",
  30. value: 25
  31. }, {
  32. name: "Small",
  33. value: 5
  34. }, {
  35. name: "None",
  36. value: 0
  37. }, {
  38. name: "Custom",
  39. value: 999
  40. }], true
  41. ],
  42. "Custom Left Margin": [
  43. 0, "Left margin custom width (pixels).", "Left Margin", 999, true
  44. ],
  45. "Right Margin": [
  46. 5, "Change the size of the right margin.", [{
  47. name: "Large",
  48. value: 65
  49. }, {
  50. name: "Medium",
  51. value: 25
  52. }, {
  53. name: "Small",
  54. value: 5
  55. }, {
  56. name: "None",
  57. value: 0
  58. }, {
  59. name: "Custom",
  60. value: 999
  61. }], true
  62. ],
  63. "Custom Right Margin": [
  64. 0, "Right margin custom width (pixels).", "Right Margin", 999, true
  65. ],
  66. "Rounded Corners": [false, "Styles replies, menus and Quick Reply to have subtly rounded corners."],
  67. "Underline All Links": [false, "Underlines all links in the page."],
  68. "Show Banner": [false, "Toggle visibility of banner.", null, true],
  69. "Reduce Banner Opacity": [false, "Reduce opacity of the banner for easier viewing.", "Show Banner", true, true],
  70. "Show Board Banners": [false, "Toggle visibility of board banners."],
  71. "Show Board Name": [true, "Toggle visibility of the board name."],
  72. "Show Reply to Thread Button": [false, "Toggle visibility of the Start a Thread / Reply to Thread button."],
  73. "Show Blotter": [true, "Toggle visibility of the 4chan news blotter."],
  74. "Show 4chan Ads": [false, "Opts into 4chan\'s banner ads.", null, true],
  75. "Show Top Ad": [true, "Show the top 4chan banner ad.", "Show 4chan Ads", true, true],
  76. "Show Middle Ad": [true, "Show the middle 4chan banner ad.", "Show 4chan Ads", true, true],
  77. "Show Bottom Ad": [true, "Show the bottom 4chan banner ad.", "Show 4chan Ads", true, true],
  78. "Reduce Ad Opacity": [false, "Reduce the opacity of ads until hover for easier viewing.", "Show 4chan Ads", true, true],
  79. "Show Navigation Links": [true, "Toggle visibility of the navigation links at the top and bottom of the threads.", null, true],
  80. "Show Top Links": [true, "Toggle visibility of the top navigation links.", "Show Navigation Links", true, true],
  81. "Show Bottom Links": [true, "Toggle visibility of the bottom navigation links.", "Show Navigation Links", true, true],
  82. ":: Sidebar": ["header", ""],
  83. "Sidebar Position": [
  84. 1, "Change the position of the sidebar or disable it altogether.", [{
  85. name: "Right",
  86. value: 1
  87. }, {
  88. name: "Left",
  89. value: 2
  90. }, {
  91. name: "Disabled",
  92. value: 3
  93. }], true
  94. ],
  95. "Minimal Sidebar": [true, "Shrinks the sidebar and disables the banner."],
  96. ":: Quick Reply": ["header", ""],
  97. "Autohide Style": [
  98. 2, "Changes how the quick reply is hidden. Enable Autohide QR in 4chan X.", [{
  99. name: "Normal",
  100. value: 1
  101. }, {
  102. name: "Vertical Tabbed",
  103. value: 2
  104. }, {
  105. name: "Fade",
  106. value: 3
  107. }]
  108. ],
  109. "Transparent QR": [false, "Reduces opacity of the QR box."],
  110. "Remove Background": [false, "Removes the QR background."],
  111. "Remove Controls": [false, "Removes the QR controls and checkbox."],
  112. "Expanding Form Inputs": [true, "Makes certain form elements expand on focus."],
  113. "Force QR to Sidebar Size": [false, "QR will no longer extend past the sidebar size."],
  114. ":: Replies": ["header", ""],
  115. "Fit Width": [true, "Replies stretch to the width of the page."],
  116. "Show Reply Header": [true, "Shows reply header background and line border."],
  117. "Show File Info": [true, "Hides filename, dimensions and size info."],
  118. "Underline QuoteLinks": [false, "Underlines quotelinks only."],
  119. "Indent OP": [true, "Indents the OP instead of touching the screen."],
  120. "Allow Wrapping Around OP": [false, "Allow for replies to wrap around OP instead of being forced onto their own line."],
  121. "OP Background": [true, "Give OP a background similar to a reply."],
  122. "Recolor Even Replies": [false, "Makes every other post a darker color. If Quote Threading is enabled darkens every root reply."],
  123. "Reduce Thumbnail Opacity": [false, "Reduces opacity of thumbnails."],
  124. "Backlink Icons": [true, "Use icons for backlinks instead of text."],
  125. "Backlinks on Bottom": [false, "Move backlinks to the bottom right of replies."],
  126. "Borders": [
  127. 2, "Changes which sides of replies have borders.", [{
  128. name: "Normal (4chan default)",
  129. value: 1
  130. }, {
  131. name: "On all sides",
  132. value: 2
  133. }, {
  134. name: "None",
  135. value: 3
  136. }]
  137. ],
  138. "Margin Between Replies": ['', "Change size of spacing in between replies.", [{
  139. name: "Very Large",
  140. value: 15
  141. }, {
  142. name: "Large",
  143. value: 8
  144. }, {
  145. name: "Normal (4chan default)",
  146. value: ''
  147. }, {
  148. name: "Minimal",
  149. value: -2
  150. }, {
  151. name: "None",
  152. value: -4
  153. }, {
  154. name: "Overlapping Borders",
  155. value: -5
  156. }]],
  157. "Post Message Margin": [
  158. 2, "Change size of margin around post message.", [{
  159. name: "Small",
  160. value: 1
  161. }, {
  162. name: "Normal",
  163. value: 2
  164. }, {
  165. name: "Large",
  166. value: 3
  167. }]
  168. ],
  169. ":: Catalog": ["header", ""],
  170. "Justified Text": [true, "Justifies the teaser text of every thread to be more uniform."],
  171. "Show Background": [false, "Threads receive a matching background."],
  172. "Unified Thumbnail Size": [false, "Makes all thumbnails the same size regardless of aspect ratio."],
  173. ":: 4chan X Header": ["header", ""],
  174. "Show Header Background Gradient": [false, "Gives the header bar a gradient background."],
  175. "Show Header Shadow": [true, "Gives the header a drop shadow."],
  176. "Highlight Current Board": [true, "Gives the current board link a bottom highlight border."],
  177. ":: Highlighting": ["header", ""],
  178. "Highlight (OP) quotes": [false, "Highlights all (OP) mentions."],
  179. "Highlight (You) quotes": [false, "Highlights all posts quoting (You)"],
  180. "Post Decoration Style": [
  181. 0, "Changes the highlight decoration of posts.", [{
  182. name: "None",
  183. value: 0
  184. }, {
  185. name: "Border",
  186. value: 1
  187. }, {
  188. name: "Outline",
  189. value: 2
  190. }, {
  191. name: "Separator",
  192. value: 3
  193. }]
  194. ],
  195. "Post Decoration Width": [
  196. 1, "Changes decoration width of highlighted posts.", [{
  197. name: "Large",
  198. value: 6
  199. }, {
  200. name: "Medium",
  201. value: 3
  202. }, {
  203. name: "Small",
  204. value: 1
  205. }, {
  206. name: "Custom",
  207. value: 999
  208. }], true
  209. ],
  210. "Custom Decoration Width": [
  211. 0, "Enter a custom width for the decoration (pixels).", "Post Decoration Width", 999, true
  212. ],
  213. "Post Highlight Style": [
  214. "solid", "Changes style of post highlight.", [{
  215. name: "Dashed",
  216. value: "dashed"
  217. }, {
  218. name: "Dotted",
  219. value: "dotted"
  220. }, {
  221. name: "Double",
  222. value: "double"
  223. }, {
  224. name: "Solid",
  225. value: "solid"
  226. }]
  227. ],
  228. ":: Fonts": ["header", ""],
  229. "Font Family": [
  230. "sans-serif", "Set the default font family.", [{
  231. name: "Default",
  232. value: "sans-serif"
  233. }, {
  234. name: "Monospace",
  235. value: "monospace"
  236. }, {
  237. name: "Ubuntu",
  238. value: "Ubuntu"
  239. }, {
  240. name: "Consolas",
  241. value: "Consolas"
  242. }, {
  243. name: "Droid Sans",
  244. value: "Droid Sans"
  245. }, {
  246. name: "Segoe UI",
  247. value: "Segoe UI"
  248. }, {
  249. name: "Calibri",
  250. value: "Calibri"
  251. }, {
  252. name: "Arial",
  253. value: "Arial"
  254. }, {
  255. name: "Lucida Grande",
  256. value: "Lucida Grande"
  257. }, {
  258. name: "Helvetica",
  259. value: "Helvetica"
  260. }]
  261. ],
  262. "Font Size": [13, "Set the general size of text (Pixels). Min: 10px, Max: 18px"],
  263. "Backlink Font Size": [9, "Set the font size of backlinks."],
  264. "Bitmap Font": [false, "Check this if you are using a bitmap font."],
  265. "Themes": [],
  266. "Hidden Themes": [],
  267. "Selected Theme": 13,
  268. "NSFW Theme": 12
  269. },
  270. MAX_FONT_SIZE = 18,
  271. MIN_FONT_SIZE = 10,
  272. NAME = "StyleChan",
  273. NAMESPACE = "StyleChan.",
  274. VERSION = "1.0.14",
  275. CHANGELOG = "https://github.com/nebukazar/StyleChan/blob/master/CHANGELOG.md",
  276. inputImages = "iVBORw0KGgoAAAANSUhEUgAAAAgAAAAgCAYAAAAv8DnQAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAP9JREFUOMvV0CFLQ2EYxfHfrtdiURgbmCxOmFPBJgZZ0CQD0Q+goFkwabWIyWIWFgwmy7Qp7DPI3GD7ACZlYLNcy31ljG0aDHrSy3N43nOef6ZULBiifczEQ8wV7OAtGmBO4wgfOI2whsXUnMAJ8rhCJ8IxDpHDHpZwixqM5XPZBBtYxioauEgjRLjBI2bRxTneQ6EYCS4xiTu89DbONJrtP88hwnV64hm28YRqyPsFDkmSGKUYFubnsqignM7rqDWa7dcAqoLdnsXwrgZQ5QG/l8MVIxX1ZPar/lUyUOsv+aMzv+0Qw3OrM4VNrKfzB9yXioVu6LDVx+EA4/+Gwycw/Uz36O07WwAAAABJRU5ErkJggg==",
  277. themeInputs = [{
  278. dName: "Reply Background",
  279. name: "mainColor",
  280. property: "background-color"
  281. }, {
  282. dName: "Reply Border",
  283. name: "brderColor",
  284. property: "border-color"
  285. }, {
  286. dName: "Input Background",
  287. name: "inputColor",
  288. property: "background-color"
  289. }, {
  290. dName: "Input Border",
  291. name: "inputbColor",
  292. property: "border-color"
  293. }, {
  294. dName: "Header Background",
  295. name: "headerBGColor",
  296. property: "background-color"
  297. }, {
  298. dName: "Header Text",
  299. name: "headerColor",
  300. property: "color"
  301. }, {
  302. dName: "Board Title",
  303. name: "boardColor",
  304. property: "color"
  305. }, {
  306. dName: "Body Background",
  307. name: "bgColor",
  308. property: "background-color"
  309. }, {
  310. dName: "Text",
  311. name: "textColor",
  312. property: "color"
  313. }, {
  314. dName: "Backlink",
  315. name: "blinkColor",
  316. property: "color"
  317. }, {
  318. dName: "Header Link",
  319. name: "headerLColor",
  320. property: "color"
  321. }, {
  322. dName: "Header Link Hover",
  323. name: "headerLHColor",
  324. property: "color"
  325. }, {
  326. dName: "Link",
  327. name: "linkColor",
  328. property: "color"
  329. }, {
  330. dName: "Link Hover",
  331. name: "linkHColor",
  332. property: "color"
  333. }, {
  334. dName: "Quotelinks",
  335. name: "qlColor",
  336. property: "color"
  337. }, {
  338. dName: "Name",
  339. name: "nameColor",
  340. property: "color"
  341. }, {
  342. dName: "Tripcode",
  343. name: "tripColor",
  344. property: "color"
  345. }, {
  346. dName: "Subject",
  347. name: "titleColor",
  348. property: "color"
  349. }, {
  350. dName: "Greentext",
  351. name: "quoteColor",
  352. property: "color"
  353. }, {
  354. dName: "Unread Line",
  355. name: "unreadColor",
  356. property: "color"
  357. }, {
  358. dName: "Highlighting",
  359. name: "postHLColor",
  360. property: "color"
  361. }, {
  362. dName: "Posts Quoting You",
  363. name: "quotesYouHLColor",
  364. property: "color"
  365. }, {
  366. dName: "Own Posts",
  367. name: "ownPostHLColor",
  368. property: "color"
  369. }, {
  370. dName: "Highlighted Threads",
  371. name: "threadHLColor",
  372. property: "color"
  373. }, {
  374. dName: "Highlighted Reply BG",
  375. name: "replybgHLColor",
  376. property: "background"
  377. }, {
  378. dName: "Reply Selection",
  379. name: "replyslctColor",
  380. property: "outline"
  381. }],
  382. $lib, $SS;
  383. if (!Array.isArray)
  384. Array.isArray = function(arg) {
  385. return Object.prototype.toString.call(arg) === "[object Array]";
  386. };
  387. Number.prototype.toHexStr = function() {
  388. var s = "",
  389. v;
  390. for (var i = 7; i >= 0; i--) {
  391. v = (this >>> (i * 4)) & 0xf;
  392. s += v.toString(16);
  393. }
  394. return s;
  395. };
  396. /* STYLE SCRIPT LIBRARY */
  397. /* More or less based off jQuery */
  398. $lib = window.$ = function(selector, root) {
  399. return this instanceof $lib ?
  400. this.init(selector, root) : new $lib(selector, root);
  401. };
  402. /* From 4chan X, unchainable */
  403. /* https://github.com/seaweedchan/4chan-x/blob/master/LICENSE */
  404. $.asap = function(test, cb) {
  405. if (test()) {
  406. return cb();
  407. } else {
  408. return setTimeout($.asap, 25, test, cb);
  409. }
  410. };
  411.  
  412. $lib.prototype = {
  413. constructor: $lib,
  414. elems: [],
  415. length: function() {
  416. return this.elems.length;
  417. },
  418. /* CONSTRUCTOR */
  419. init: function(selector, root) {
  420. if (selector == null || selector == undefined) return this;
  421.  
  422. if (selector.constructor === $lib) return selector;
  423. else if (typeof selector === "string") {
  424. var root = root || document;
  425. var tagCheck = /^<(\w+)([^>]*)>(.*)$/.exec(selector); // No closing tag for root node.
  426.  
  427. if (root.constructor === $lib)
  428. root = root.get();
  429.  
  430. if (tagCheck) {
  431. var tag = document.createElement(tagCheck[1]);
  432.  
  433. if (tagCheck[2]) {
  434. var attribs, atRegEx = /(\w+)=((?:"(?:[^"]+)"|'(?:[^']+)'|(?:\w+)))/g;
  435. while ((attribs = atRegEx.exec(tagCheck[2])) != null) {
  436. var val = attribs[2];
  437. if ((val[0] == '"' || val[0] === "'") && val[0] == val[val.length - 1])
  438. val = val.substr(1, val.length - 2)
  439.  
  440. tag.setAttribute(attribs[1], val);
  441. }
  442. }
  443.  
  444. tag.innerHTML = tagCheck[3];
  445.  
  446. this.elems = [tag];
  447. } else if (/^#[\w-]+$/.test(selector) && root == document) {
  448. var el;
  449.  
  450. if ((el = document.getElementById(selector.substr(1))) != null)
  451. this.elems = [el];
  452. } else {
  453. var results = root.querySelectorAll(selector);
  454. this.elems = Array.prototype.slice.call(results);
  455. }
  456. } else if (selector.nodeType)
  457. this.elems = [selector];
  458. else if (Array.isArray(selector))
  459. this.elems = Array.prototype.slice.call(selector);
  460.  
  461. return this;
  462. },
  463.  
  464. /* DOM NODE RETRIEVAL */
  465. clone: function() {
  466. var ret = [];
  467.  
  468. this.each(function() {
  469. ret.push(this.cloneNode(true));
  470. });
  471.  
  472. return new $lib(ret);
  473. },
  474. elements: function() {
  475. if (!this.hasSingleEl())
  476. return this;
  477.  
  478. this.elems = Array.prototype.slice.call(this.elems[0].elements);
  479.  
  480. return this;
  481. },
  482. get: function(index) {
  483. if (index == undefined && this.elems.length === 1)
  484. return this.elems[0];
  485. else if (index == undefined && !this.hasSingleEl())
  486. return this.elems;
  487.  
  488. return this.elems[index];
  489. },
  490.  
  491. /* DOM MANIPULATION */
  492. prepend: function(el) {
  493. if (el.constructor === $lib)
  494. el = el.get();
  495.  
  496. return this.each(function() {
  497. this.insertBefore(el, this.firstChild);
  498. });
  499. },
  500. append: function(el) {
  501. if (el.constructor === $lib)
  502. el = el.get();
  503.  
  504. return this.each(function() {
  505. this.appendChild(el);
  506. });
  507. },
  508. before: function(el) {
  509. if (el.constructor === $lib)
  510. el = el.get();
  511.  
  512. return this.each(function() {
  513. this.parentNode.insertBefore(el, this);
  514. });
  515. },
  516. after: function(el) {
  517. if (el.constructor === $lib)
  518. el = el.get();
  519.  
  520. return this.each(function() {
  521. if (this.nextSibling != null)
  522. this.parentNode.insertBefore(el, this.nextSibling);
  523. else if (this.parentNode != null)
  524. this.parentNode.appendChild(el);
  525. });
  526. },
  527. replace: function(el) {
  528. return this.each(function() {
  529. $(this).before(el).remove();
  530. });
  531. },
  532. html: function(html) {
  533. if (html == undefined)
  534. return this.elems[0].innerHTML;
  535.  
  536. return this.each(function() {
  537. this.innerHTML = html;
  538. });
  539. },
  540. text: function(text) {
  541. if (this.length() === 0)
  542. return;
  543.  
  544. if (text == undefined)
  545. return this.elems[0].textContent;
  546.  
  547. return this.each(function() {
  548. this.textContent = text;
  549. });
  550. },
  551. appendText: function(text) {
  552. return this.each(function() {
  553. this.textContent += text;
  554. });
  555. },
  556. attr: function(name, val) {
  557. if (val == undefined)
  558. if (!this.hasSingleEl())
  559. return this;
  560. else
  561. return this.elems[0].getAttribute(name);
  562. else
  563. if (val === "")
  564. return this.each(function() {
  565. this.removeAttribute(name);
  566. });
  567.  
  568. return this.each(function() {
  569. this.setAttribute(name, val);
  570. });
  571. },
  572. disabled: function(bDisabled) {
  573. if (bDisabled == undefined)
  574. return this.elems[0].disabled;
  575.  
  576. return this.each(function() {
  577. this.disabled = bDisabled;
  578. });
  579. },
  580. toggle: function(bHidden) {
  581. return this.each(function() {
  582. var $this = $(this);
  583.  
  584. if (bHidden == undefined)
  585. bHidden = !($this.attr("disabled") === "true");
  586.  
  587. $this.attr("hidden", bHidden || "");
  588. });
  589. },
  590. hide: function() {
  591. return this.toggle(true);
  592. },
  593. show: function() {
  594. return this.toggle(false);
  595. },
  596. val: function(val) {
  597. if (val == undefined) {
  598. var el = this.elems[0];
  599.  
  600. if (el == undefined)
  601. return false;
  602.  
  603. switch (el.type) {
  604. case "checkbox":
  605. case "radio":
  606. return el.checked == true;
  607. default:
  608. if (/^\d+$/.test(el.value))
  609. return parseInt(el.value);
  610. return el.value;
  611. }
  612. }
  613.  
  614. return this.each(function() {
  615. switch (this.type) {
  616. case "checkbox":
  617. case "radio":
  618. this.checked = val;
  619. break;
  620. default:
  621. this.value = val;
  622. break;
  623. }
  624. });
  625. },
  626. checked: function(state) {
  627. return this.each(function() {
  628. this.checked = state;
  629. });
  630. },
  631. addClass: function(classNames) {
  632. return this.each(function() {
  633. classNames = classNames.split(" ");
  634. for (var j = 0, jMAX = classNames.length; j < jMAX; j++)
  635. if (!$(this).hasClass(classNames[j]))
  636. this.className += (this.className ? " " : "") + classNames[j];
  637. });
  638. },
  639. hasClass: function(className) {
  640. if (!this.hasSingleEl() || this.elems[0].className == undefined)
  641. return false;
  642.  
  643. var regx = new RegExp("\\b" + className + "\\b");
  644.  
  645. return regx.test(this.elems[0].className);
  646. },
  647. removeClass: function(classNames) {
  648. return this.each(function() {
  649. classNames = classNames.split(" ");
  650. for (var j = 0, jMAX = classNames.length; j < jMAX; j++)
  651. if ($(this).hasClass(classNames[j])) {
  652. var cclassNames = this.className.split(" ");
  653. this.className = "";
  654.  
  655. for (var k = 0, kMAX = cclassNames.length; k < kMAX; k++)
  656. if (classNames[j] !== cclassNames[k])
  657. this.className += (this.className ? " " : "") + cclassNames[k];
  658. }
  659. });
  660. },
  661. toggleClass: function(classNames) {
  662. return this.each(function() {
  663. classNames = classNames.split(" ");
  664. for (var j = 0, jMAX = classNames.length; j < jMAX; j++)
  665. if (!$(this).hasClass(classNames[j]))
  666. $(this).addClass(classNames[j]);
  667. else
  668. $(this).removeClass(classNames[j]);
  669. });
  670. },
  671. optionClass: function(optionName, optionValue, className) {
  672. return this.each(function() {
  673. if ($SS.conf[optionName] === optionValue && !$(this).hasClass(className))
  674. $(this).addClass(className);
  675. else if ($SS.conf[optionName] !== optionValue && $(this).hasClass(className))
  676. $(this).removeClass(className);
  677. else
  678. return
  679. });
  680. },
  681. remove: function() {
  682. return this.each(function() {
  683. this.parentNode.removeChild(this);
  684. });
  685. },
  686. /* DOM TRAVERSING */
  687. parent: function() {
  688. if (!this.hasSingleEl()) return this;
  689.  
  690. return new $lib(this.elems[0].parentNode);
  691. },
  692. children: function(selector) {
  693. if (!this.hasSingleEl())
  694. return this;
  695. else if (selector == null)
  696. selector = "*";
  697.  
  698. return new $lib(selector, this.elems[0]);
  699. },
  700. nextSibling: function(selector) {
  701. if (!this.hasSingleEl() ? true : this.elems[0].nextSibling == null)
  702. return new $lib(null);
  703.  
  704. if (selector != undefined) {
  705. var t, m = new $lib(selector, this.elems[0].parentNode),
  706. s = this.elems[0].parentNode.childNodes;
  707.  
  708. for (var i = s.length - 1; i >= 0; --i) {
  709. if (s[i] === this.elems[0] && t == undefined) // end and no matching siblings
  710. return new $lib(null);
  711. else if (s[i] === this.elems[0] && t != undefined) // end and matched sibling
  712. return new $lib(t);
  713. else if (m.elems.indexOf(s[i]) !== -1) // this element matches the selector
  714. t = s[i];
  715. }
  716. }
  717.  
  718. return new $lib(this.elems[0].nextSibling);
  719. },
  720. previousSibling: function(selector) {
  721. if (!this.hasSingleEl() ? true : this.elems[0].previousSibling == null)
  722. return new $lib(null);
  723.  
  724. if (selector != undefined) {
  725. var t, m = new $lib(selector, this.elems[0].parentNode),
  726. s = this.elems[0].parentNode.childNodes;
  727.  
  728. for (var i = 0, MAX = s.length; i < MAX; ++i) {
  729. if (s[i] === this.elems[0] && t == undefined)
  730. return new $lib(null);
  731. else if (s[i] === this.elems[0] && t != undefined)
  732. return new $lib(t);
  733. else if (m.elems.indexOf(s[i]) !== -1)
  734. t = s[i];
  735. }
  736. }
  737.  
  738. return new $lib(this.elems[0].previousSibling);
  739. },
  740.  
  741. /* EVENT METHODS */
  742. bind: function(type, listener) {
  743. return this.each(function() {
  744. this.addEventListener(type, listener, false);
  745. });
  746. },
  747. unbind: function(type, listener) {
  748. return this.each(function() {
  749. this.removeEventListener(type, listener, false);
  750. });
  751. },
  752. fire: function(evnt) {
  753. var ev = document.createEvent("HTMLEvents");
  754.  
  755. return this.each(function() {
  756. ev.initEvent(evnt, true, true);
  757. this.dispatchEvent(ev);
  758. });
  759. },
  760. blur: function() {
  761. return this.each(function() {
  762. this.blur();
  763. });
  764. },
  765. click: function() {
  766. return this.each(function() {
  767. this.click();
  768. });
  769. },
  770. scrollIntoView: function(alignWithTop) {
  771. return this.each(function() {
  772. this.scrollIntoView(alignWithTop);
  773. });
  774. },
  775. /* HELPER METHODS */
  776. delay: function(func, time) {
  777. return this.each(function() {
  778. var $this = this;
  779. setTimeout(function() {
  780. func.call($this);
  781. }, time);
  782. });
  783. },
  784. each: function(func, args) {
  785. if (args != null && !Array.isArray(args))
  786. args = [args];
  787.  
  788. for (var i = 0, MAX = this.elems.length; i < MAX; ++i)
  789. func.apply(this.elems[i], args || [i]);
  790.  
  791. return this;
  792. },
  793. exists: function() {
  794. return this.elems.length > 0;
  795. },
  796. hasSingleEl: function() {
  797. return this.elems.length === 1;
  798. },
  799. riceCheck: function() {
  800. return this.each(function() {
  801. var click = function(e) {
  802. e.preventDefault();
  803. this.previousSibling.click();
  804. };
  805. if (this.isRiced) return;
  806. else if (this.nextSibling != undefined && this.nextSibling.className === "riceCheck")
  807. return $(this.nextSibling).bind("click", click);
  808.  
  809. var titleAttr;
  810.  
  811. if (this.hasAttribute("title"))
  812. titleAttr = $(this).attr("title");
  813. else
  814. titleAttr = "";
  815.  
  816. var div = $("<div class=riceCheck title='" + titleAttr + "'>").bind("click", click);
  817. $(this).hide().after(div);
  818.  
  819. return this.isRiced = true;
  820. });
  821. },
  822. jsColor: function() {
  823. return this.each(function() {
  824. this.color = new $SS.jscolor.color(this);
  825. });
  826. }
  827. };
  828. /* END STYLE SCRIPT LIBRARY */
  829.  
  830. /* STYLE SCRIPT CLASSES & METHODS */
  831. $SS = {
  832. browser: {},
  833. DOMLoaded: function(reload) {
  834. $SS.classes.init();
  835.  
  836. var div;
  837. if (reload !== true) {
  838. $SS.options.init();
  839.  
  840. $("#index-rev").riceCheck();
  841.  
  842. $(document).bind("QRDialogCreation", $SS.QRDialogCreationHandler)
  843. .bind("OpenSettings", $SS.NodeInsertionHandler)
  844. .bind("ThreadUpdate", $SS.NodeInsertionHandler);
  845.  
  846. var MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
  847. var observer = new MutationObserver(function(mutations) {
  848. var i, j, MAX, _MAX, nodes;
  849.  
  850. for (i = 0, MAX = mutations.length; i < MAX; ++i) {
  851. nodes = mutations[i].addedNodes;
  852.  
  853. for (j = 0, _MAX = nodes.length; j < _MAX; ++j)
  854. if (nodes[j].nodeType !== 3)
  855. $("input[type=checkbox]", nodes[j]).riceCheck();
  856. }
  857. });
  858.  
  859. observer.observe(document, {
  860. childList: true,
  861. subtree: true
  862. });
  863.  
  864. if ((!(html = $("*[xmlns]")).exists()) && (!(ctxmenu = $("#ctxmenu-main").exists())))
  865. if ((link = $("link[title][rel='stylesheet']")).exists())
  866. link.each(function() {
  867. $(this).attr("href", "");
  868. });
  869.  
  870. if ((div = $("#globalMessage *[style]")).exists())
  871. div.each(function() {
  872. $(this).attr("style", "");
  873. });
  874.  
  875. // 4chan ads being added with JS
  876. if (!$SS.conf["Show Top Ad"]) {
  877. $(".topad.center").remove();
  878. $(".aboveMidAd.center").remove();
  879. } else if (!$SS.conf["Show Middle Ad"]) {
  880. $(".middlead.center").remove();
  881. } else if (!$SS.conf["Show Bottom Ad"]) {
  882. $(".bottomad.center").remove();
  883. }
  884.  
  885. // things that need to change after 4chan X loads.
  886. setTimeout(function() {
  887. if (!$SS.QRhandled && (div = $("#qr")).exists())
  888. $SS.QRDialogCreationHandler({
  889. target: div
  890. });
  891. });
  892.  
  893. }
  894. },
  895. init: function(reload) {
  896. if (!reload) {
  897. if (/^about:neterror/.test(document.documentURI)) return;
  898. localStorage["4chan-settings"] = "{ \"disableAll\" : true, \"dropDownNav\": false }";
  899.  
  900. var m_VERSION;
  901. $SS.browser.webkit = /AppleWebKit/.test(navigator.userAgent);
  902. $SS.browser.gecko = /Gecko\//.test(navigator.userAgent);
  903. $SS.location = $SS.getLocation();
  904.  
  905. if ((m_VERSION = $SS.Config.get("VERSION")) !== VERSION) {
  906. // Signal that StyleChan has updated
  907. var detail = {
  908. type: 'info',
  909. content: NAME + ' has been updated to version ' + VERSION + '.',
  910. lifetime: 15
  911. };
  912. if (typeof cloneInto === 'function') {
  913. detail = cloneInto(detail, document.defaultView);
  914. }
  915. var event = new CustomEvent('CreateNotification', {
  916. bubbles: true,
  917. detail: detail
  918. });
  919. setTimeout(function() {
  920. document.dispatchEvent(event);
  921. }, 25);
  922. // Correct selected theme after updating
  923. // and the number defaults has changed.
  924. var ntThemes = $SS.Themes.defaults.length,
  925. otThemes = $SS.Config.get("Total Themes"),
  926. sTheme = $SS.Config.get("Selected Theme");
  927.  
  928. if (otThemes !== ntThemes && otThemes != undefined && sTheme >= otThemes) {
  929. sTheme += ntThemes - otThemes;
  930. $SS.Config.set("Selected Theme", sTheme);
  931. }
  932.  
  933. $SS.Config.set("VERSION", VERSION);
  934. $SS.Config.set("Total Themes", ntThemes);
  935. }
  936. }
  937.  
  938. $SS.Config.init();
  939. $SS.Themes.init();
  940.  
  941. if (reload) {
  942. $SS.insertCSS();
  943. $SS.DOMLoaded(true);
  944. } else {
  945. $.asap((function() {
  946. return $("link[rel=stylesheet]", document.head).exists();
  947. }), $SS.insertCSS);
  948. if (/complete|interactive/.test(document.readyState))
  949. $SS.DOMLoaded();
  950. else
  951. $(document).bind("DOMContentLoaded", $SS.DOMLoaded);
  952. }
  953.  
  954. },
  955.  
  956. /* STYLING & DOM */
  957. insertCSS: function() {
  958. var css,
  959. reload = $("#ch4SS").exists();
  960.  
  961. if (reload || $("link[rel=stylesheet]", document.head).exists())
  962. $(document).unbind("DOMNodeInserted", $SS.insertCSS);
  963. else return;
  964.  
  965. css = ".mobile,#delform .mobile.center,.tab-select:not(:checked)+div,iframe[src='about:blank'],#absbot,#styleSelector,:root.show-ads.hide-top .topad.center,:root.show-ads.hide-middle .middlead.center,:root.show-ads.hide-bottom .bottomad.center,#delPassword,:root.show-file-info .file-info,:root.hide-blotter #blotter,#delform .post input[type=checkbox],#delform .post .riceCheck,#qp .post input[type=checkbox],#qp .riceCheck,.deleteform,:root.hide-board-name .boardTitle,:root.hide-board-name .boardSubtitle,:root.hide-banner #bannerCnt,:root.hide-button .qr-link-container,:root.reply-fit-width .sideArrows,:root.qr-controls #qr .close,:root.qr-controls #qr select[data-name=thread],:root.qr-controls.fade-qr #qr .move label,:root.qr-controls.vertical-qr #qr .move label input,#postForm,:root.hide-button #togglePostFormLink,.forwarded,hr:not(#unread-line),:root.hide-navlinkbot .navLinks.navLinksBot.desktop,:root.hide-navlinkbot .navLinks.navLinksBottom.mobilebtn,:root.hide-navlinktop #info,:root.hide-navlinktop .navLinks:not(.navLinksBottom):not(.navLinksBot),:root.hide-navlinks body>.desktop:not(.pagelist):not(.navLinksBottom),:root.hide-navlinks .navLinks.navLinksBot.desktop,:root.hide-navlinks .navLinks,.ad-plea,.exif:not([style]),[hidden]{display:none}:root.hide-board-banners .center{display:none!important}.stylechanger{visibility:hidden}.brackets-wrap.pass-link-container{visibility:visible}input:focus,textarea:focus,select,a{outline:0!important}#logo{background:url(https://i.imgur.com/DG9V9sI.png)!important}.party-hat{left:0;margin-top:-80px;position:absolute;pointer-events:none}.pu-img{vertical-align:middle;margin-top:-3px;margin-right:3px;display:inline-block;width:16px;height:16px;background:url(//s.4cdn.org/image/minileaf.gif)}.pu-lbl{color:" + $SS.theme.titleColor.hex + "!important;font-weight:700;font-size:12px}.n-pu{vertical-align:middle;display:inline-block;width:16px;height:16px;margin-top:-2px;background:url(//s.4cdn.org/image/minileaf.gif)}.sjis{font-size:16px;line-height:17px;white-space:pre;font-family:IPAMonaPGothic,Mona,'MS PGothic',monospace;overflow:auto;display:block;clear:left}.mu-s{font-weight:700}.mu-i{font-style:italic}.mu-r{color:#c41e3a}.mu-g{color:#00a550}.mu-b{color:#1d8dc4}div.post div.file .fileThumb{float:left;margin-left:13px;margin-right:20px;margin-bottom:10px}div.op.post div.file .fileThumb{margin-bottom:0}.fileText{margin-left:13px!important;margin-bottom:2px!important}.postContainer{display:block}.fixed.bottom-header.is_thread body{padding-bottom:0;padding-top:.5em}.fixed.bottom-header.is_index body{padding-bottom:4.5em;padding-top:.5em}.fixed.bottom-header.is_catalog body,.fixed.bottom-header.catalog-mode body{padding-bottom:3em;padding-top:.5em}.fixed.bottom-header body{padding-top:.5em}:root.is_index.bottom-header:not(.autohide) body{padding-bottom:5em!important}.fixed.top-header.is_index body{padding-bottom:2.5em;padding-top:" + (($SS.conf["Font Size"] <= 11) ? 3.2 : 3) + "em!important}.fixed.top-header.is_thread body{padding-bottom:0;padding-top:" + (($SS.conf["Font Size"] <= 11) ? 3.2 : 3) + "em!important}.fixed.top-header.is_catalog body,.fixed.top-header.catalog-mode body{padding-bottom:.5em;padding-top:" + (($SS.conf["Font Size"] <= 11) ? 3.2 : 3) + "em!important}.fixed.top-header.autohide body{padding-top:2em!important}.fixed.top-header body{padding-top:3em!important}div.post{margin:4px 0;overflow:hidden}:root:not(.reply-fit-width) #delform div.reply:not([hidden]){display:table!important}:root:not(.reply-fit-width) #delform .stub~div.reply:not([hidden]){display:none!important}table.flashListing{border-spacing:1px;margin-left:auto;margin-right:auto}div.pagelist div.pages{padding:4px}div.pagelist,div.pagelist>div{float:left}div.pagelist>div span{padding:4px;display:inline-block}.page-num{margin-right:auto!important}s{text-decoration:none!important}span.spoiler,s,s:not(:hover)>a,s:not(:hover)>.linkify{color:#000!important;background:none repeat scroll 0 0 #000!important}span.spoiler:hover,s:hover,span.spoiler:focus,s:focus{color:#fff!important}#globalMessage,.boardBanner{text-align:center}div.sideArrows{float:left;margin-right:2px;margin-top:0;margin-left:2px;opacity:.3}hr,#boardNavDesktopFoot{clear:both}table{border-spacing:1px;margin-left:auto;margin-right:auto}.center{text-align:center!important}.middlead,.topad{margin-bottom:20px!important}#qf-box{width:120px}span.hide-announcement{margin-left:3px;vertical-align:sub}.bottomCtrl.desktop{float:right}.fixed.bottom-header.is_index .bottomCtrl.desktop,.fixed.bottom-header.is_thread .bottomCtrl.desktop{float:right;margin-bottom:35px}.fixed.top-header.is_thread .bottomCtrl.desktop,.fixed.top-header.is_index .bottomCtrl.desktop{float:right;margin-bottom:8px}#navlinks{top:135px;right:10px}:root.isLight img[src*='//boards.4chan.org/js/jsMath/fonts/']{filter:invert(100%);-webkit-filter:invert(100%)}.centered-links:root #shortcuts{width:350px!important}#blotter{margin-bottom:15px;font-size:11px;width:auto}body{margin-left:" + $SS.conf["Margin Left"] + "px;margin-right:" + $SS.conf["Margin Right"] + "px;margin-top:0;margin-bottom:0}:root.show-ads .ad-cnt{margin-top:auto!important}.postInfo{padding:5px 13px;display:block!important}.summary{margin-left:2px}.expanded-image{position:relative}div.post{margin:4px 0}:root.force-indent .op{margin-left:-12px}:root.force-wrapping .op::after{clear:both;content:'';display:block}:root.op-background .postContainer.opContainer{margin-top:5px}.thread>.replyContainer,.threadContainer>.replyContainer{margin-bottom:" + $SS.conf["Margin Between Replies"] + "px!important}.inline{margin-left:13px!important}.postMessage>.inline{margin-left:0!important}.inline .op>.postInfo,#qp .op>.postInfo{min-width:600px}.postMessage{margin:" + $SS.conf["Margin Post Message"] + "!important}:root.reply-fit-width .reply.post{display:block!important}:root.reply-fit-width .stub~.reply.post{display:none!important}.hasInline .inline>.replyContainer:not(.expanded-image):not(.hasInline) .reply.post,:root.reply-fit-width .post.reply{overflow:hidden!important}:root.reply-fit-width .expanded-image>.post::after,:root.reply-fit-width .hasInline>.reply.post::after{clear:both!important;content:''!important;display:block!important}.threadContainer .hide-reply-button{margin-left:-12px!important}.stub{padding:2px}.stub>a.show-thread-button{margin-right:4px}:root.reply-hide .thread>.expanded-image>.reply,:root.reply-hide .thread>.hasInline>.reply{margin-left:12px!important}.threadContainer{margin-left:0!important;padding-left:20px!important}:root.reply-hide .thread>.threadContainer{margin-left:13px!important}:root.post-info .reply>.postInfo{box-shadow:inset rgba(0,0,0,.05) 0 -1px 2px;padding-top:2px!important}:root.backlink-bottom .post{position:relative;padding-bottom:2px}:root.backlink-bottom .container{position:absolute;bottom:2px;right:6px}.reply .menu-button i{position:relative;bottom:1px}:root.reply-fit-width .reply .container{padding-right:5px}.menu-button+.container:not(:empty){margin-left:4px!important}:root:not(.catalog-mode).reply-fit-width .post .menu-button{float:right;margin-left:0;position:relative;left:5px}:root.reply-fit-width .post .menu-button{opacity:0}:root.reply-fit-width .post:not(:hover) .menu-button{transition:opacity .3s ease-out 0s!important}:root.reply-fit-width .post:hover .menu-button{opacity:1;transition:opacity .3s ease-in .1s!important}.prettyprint{padding:5px!important;display:inline-block;max-height:400px;overflow-x:auto;max-width:100%;vertical-align:middle}input[type=checkbox],input[type=button],input[type=submit],.riceCheck{cursor:pointer}input[type=checkbox],.riceCheck{display:inline-block;height:10px!important;position:relative;width:10px!important;border-radius:2px!important;-webkit-appearance:none;-moz-appearance:none;margin:1px}input[type=checkbox]{display:none!important}.riceCheck{margin:0 2px -1px 0}input[type=checkbox]:checked::before,input[type=checkbox]:checked+.riceCheck::before{content:'';display:block;height:8px;margin:1px;width:8px}input[type=checkbox]:checked::before,input[type=checkbox]:checked+.riceCheck::before{background:" + $SS.theme.checkMark.get() + "!important}#header-bar{padding:4px 4px 5px!important}:root:not(.fixed) #header-bar{top:0;right:0;left:0;box-shadow:0 1px 2px rgba(0,0,0,.15);border-bottom:1px solid}:root.autohide body{padding-top:0!important;padding-bottom:0!important}:root:not(.fixed).right-sidebar #header-bar{right:300px}:root:not(.fixed).left-sidebar #header-bar{left:300px}:root:not(.fixed) .boardBanner{top:0}.center{margin:5px!important}#full-board-list>a,.navSmall>a{margin-left:2px}:root.fixed:not(.autohide):not(.bottom) #globalMessage{margin-top:10px!important;margin-bottom:20px!important}.globalMessage,h2,h3{margin:auto}#custom-board-list,#full-board-list,.shortcut{vertical-align:baseline!important}:root.fixed-watcher #thread-watcher{position:fixed!important}.qr-link{border-radius:3px;vertical-align:middle;padding:7px 12px 6px}hr{height:2px;width:600px;border:0!important}:root.reply-fit-width #unread-line{margin:auto;width:100%}#unread-line{margin-top:-3px!important;margin-bottom:-3px!important}:root:not(.autohide) #scroll-marker{pointer-events:none!important}.boardBanner .boardTitle{cursor:default;letter-spacing:-2px}#bannerCnt{border:0!important}:root.banner-opacity #bannerCnt{opacity:.5;transition:opacity .3s ease-out 0s}:root.banner-opacity #bannerCnt:hover{opacity:1!important;transition:opacity .3s ease-in 0s}.pages strong>a{border-radius:3px}.pages strong>a:hover{opacity:.7!important;transition:opacity .3s ease-in 0s}.pagelist{margin-left:18px;margin-bottom:15px}:root.reply-fit-width .pagelist{margin-left:0}.pages a{padding:5px 10px;margin-left:-1px}.next,.prev{border:0!important;position:relative}.next a,.prev a{position:relative;right:5px}.prev a::after{content:'<';position:inherit;top:4px;left:1px}.next a::after{content:'>';position:inherit;top:4px;right:2px}.pagelist button,.pagelist button:hover{background:none!important;border:0!important;box-shadow:none!important;height:20px;width:20px}.pagelist span{opacity:.2}table.flashListing{margin-top:20px;margin-bottom:20px}table.flashListing .highlightPost{background:rgb\(" + $SS.theme.mainColor.shiftRGB(-25) + ")!important}.flashListing td{padding-left:4px!important;padding-right:4px!important;text-align:center!important}#delform[action='https://sys.4chan.org/f/up.php'],#delform[action='https://sys.4chan.org/f/up.php'] .postblock{background:none!important;border:0!important;box-shadow:none!important}:root.ad-opacity .center img{opacity:.5;transition:opacity .3s ease-out 0s}:root.ad-opacity .center img:hover{opacity:1!important;transition:opacity .3s ease-in 0s}body.is_index div.navLinks{padding:5px 0}.navLinks.navLinksBot.desktop{margin-bottom:5px}#hoverUI{z-index:12!important}#search-box,#index-search{width:9%;transition:color .25s,border-color .25s,width .25s}#search-box:focus,#index-search:focus{width:12%;transition:color .25s,border-color .25s,width .25s}:root.thumb-opacity .fileThumb{opacity:.5;transition:opacity .3s ease-out 0s}:root.thumb-opacity .fileThumb:hover{opacity:1;transition:opacity .3s ease-in 0s}select{-moz-appearance:none;-webkit-appearance:none}#delform{overflow-wrap:break-word;word-break:break-word;margin-bottom:15px}html,body,div.boardBanner,#menu,input:not(.jsColor),textarea,#qr-filename-container,#post-preview,.post-last,.pln,select,.captcha-root,.tegaki-label,.dd-menu ul,.boxbar{color:" + $SS.theme.textColor.hex + "!important}.nameBlock:not(.capcodeMod)>.name,.com,.post-author{color:" + $SS.theme.nameColor.hex + "!important}.nameBlock.capcodeMod{color:purple!important}.id_admin,.nameBlock.capcodeAdmin span.name{color:red!important}.nameBlock>.postertrip,.post-tripcode,.tag{color:" + $SS.theme.tripColor.hex + "!important}a,.typ,.atn,body.is_catalog .button,:root.catalog-mode .button,.options-button,.tegaki-tb-btn{color:" + $SS.theme.linkColor.hex + "!important}a.summary,.pages strong>a{color:" + $SS.theme.textColor.hex + "!important}#header-bar #notifications a{color:#fff!important}a:hover,body.is_catalog .button:hover,:root.catalog-mode .button:hover,.lit,#header-bar #notifications a:hover,.tegaki-tb-btn:hover{color:" + $SS.theme.linkHColor.hex + "!important}#header-bar,a.current{color:" + $SS.theme.headerColor.hex + "!important}#header-bar a:not(.current){color:" + $SS.theme.headerLColor.hex + "!important}#header-bar a:hover{color:" + $SS.theme.headerLHColor.hex + "!important}#custom-board-list .current{border-bottom:1px solid rgba(" + $SS.theme.linkColor.rgb + ",1)!important}#custom-board-list .current:hover{border-bottom:1px solid rgba(" + $SS.theme.linkHColor.rgb + ",1)!important}.postMessage>.quote,s:hover .quote,.str,.atv,.new,.catalog-thread>.comment>.quote{color:" + $SS.theme.quoteColor.hex + "!important}.subject,.replytitle,.teaser b,.post-subject,.option.header .option-title,.kwd{color:" + $SS.theme.titleColor.hex + "!important}.option.header{font-size:140%}.boardTitle{color:" + $SS.theme.boardColor.hex + "!important;text-shadow:none!important}.backlink{color:" + $SS.theme.blinkColor.hex + "!important}.quotelink{color:" + $SS.theme.qlColor.hex + "!important}.prettyprint,.catalog-code{background:none repeat scroll 0 0 rgba(" + $SS.theme.codeBackground + ")!important;border:1px solid rgba(" + $SS.theme.codeBorder + ")!important}.pun{color:rgba(" + $SS.theme.textColor.rgb + ",.4)!important}::-webkit-input-placeholder{color:rgba(" + $SS.theme.textColor.rgb + ",.4)!important}#qr .field::-moz-placeholder,::-moz-placeholder,#qr-no-file{color:rgba(" + $SS.theme.textColor.rgb + ",.4)!important}body{background:" + $SS.theme.bgImg.get() + $SS.theme.bgColor.hex + "!important}.reply,body.is_catalog .panel,:root.catalog-mode .panel,.dialog,.tab-label,#post-preview,#tegaki,.boxbar,:root.op-background .postContainer.opContainer,.flashListing tr:nth-of-type(2n+1),.dd-menu ul,:root.catalog-hover-expand .catalog-container:hover>.post{background:rgba(" + $SS.theme.mainColor.rgb + "," + $SS.theme.replyOp + ")!important}:root.recolor-even .thread>.replyContainer:nth-of-type(even):not(.hidden) .post{background:rgb\(" + $SS.theme.mainColor.shiftRGB(-10) + ")!important}:root:not(.header-gradient) #header-bar{background:rgba(" + $SS.theme.headerBGColor.rgb + "," + $SS.theme.navOp + ")!important}:root.header-gradient #header-bar{background:linear-gradient(rgb\(" + $SS.theme.headerBGColor.shiftRGB(15) + "),rgba(" + $SS.theme.headerBGColor.rgb + "," + $SS.theme.navOp + "))!important}:root.header-shadow #header-bar{box-shadow:none!important}:root:not(.fixed) #header-bar{background:none!important}.options-button,.qr-link,.pages.cataloglink,.pages strong>a{background:linear-gradient(rgb\(" + $SS.theme.mainColor.shiftRGB(15) + "),rgb(" + $SS.theme.mainColor.rgb + "))!important}.options-button:hover,.import-input:hover+.options-button,.pages strong>a:hover,.dd-menu li:hover{background:rgb\(" + $SS.theme.mainColor.shiftRGB(15) + ")}.focused.entry{background:rgb\(" + $SS.theme.mainColor.shiftRGB(10) + ")!important}.qr-link:hover,:root.vertical-qr #qr .move{background:rgb\(" + $SS.theme.mainColor.rgb + ")}input:not(.jsColor),textarea,.riceCheck,#qr-filename-container,select,.captcha-root{background:" + $SS.theme.inputColor.hex + "!important;transition:background .2s}input[type=checkbox],.riceCheck{background:rgb\(" + $SS.theme.inputColor.shiftRGB(25) + ")!important}input:not(.jsColor):hover,.riceCheck:hover,#qr-filename-container:hover,textarea:hover,select:hover,.captcha-root:hover{background:rgb(" + $SS.theme.inputColor.hover + ")!important;transition:background .2s}hr{background-image:linear-gradient(to left,rgba(" + $SS.theme.brderColor.rgb + ",0),rgb(" + $SS.theme.brderColor.rgb + "),rgba(" + $SS.theme.brderColor.rgb + ",0))}#unread-line{background-image:linear-gradient(to left,rgba(" + $SS.theme.unreadColor.rgb + ",0),rgb(" + $SS.theme.unreadColor.rgb + "),rgba(" + $SS.theme.unreadColor.rgb + ",0))}.inline{background:rgba\(" + $SS.theme.mainColor.shiftRGB(-16) + ",.8)!important}:root.post-info .reply>.postInfo{background:rgba\(" + $SS.theme.mainColor.shiftRGB(-16) + ",.2);border-bottom:1px solid rgb\(" + $SS.theme.mainColor.shiftRGB(4) + ")}.reply,:root.op-background .postContainer.opContainer,.dd-menu ul{border-width:0 1px 1px 0;border-style:solid}:root.borders-all .reply,:root.borders-all.op-background .postContainer.opContainer{border-width:1px!important}:root.borders-none .reply,:root.borders-none.op-background .postContainer.opContainer{border:0}#menu,.catalog-thumb{border-radius:0!important}:root.rounded-corners .reply,:root.rounded-corners.op-background .postContainer.opContainer,:root.rounded-corners .dialog:not(#header-bar),:root.rounded-corners .inline,:root.rounded-corners #thread-stats :root.rounded-corners #updater,:root.rounded-corners #menu,:root.rounded-corners .thumb,:root.rounded-corners .fileThumb img:not(.full-image),:root.rounded-corners .catalog-thumb,:root.rounded-corners .dd-menu ul,:root.rounded-corners.werkTyme .catalog-thread:not(:hover),:root.rounded-corners.werkTyme:not(.catalog-hover-expand) .catalog-thread,:root.rounded-corners.catalog-hover-expand .catalog-container:hover>.post,:root.rounded-corners.catalog-hover-expand .catalog-container:hover .catalog-reply{border-radius:3px!important}:root.post-info.rounded-corners .reply>.postInfo,:root.rounded-corners #qr,:root.rounded-corners:root.vertical-qr #qr>.move{border-radius:3px 3px 0 0!important}:root:not(.rounded-corners) #post-preview{border-radius:0!important}.reply,:root.op-background .postContainer.opContainer,.dialog,.entry,.inline,fieldset,#post-preview,.flashListing td:not(:last-of-type):not(.postblock),:root.vertical-qr #qr .move,#qr select,select{border-color:" + $SS.theme.brderColor.hex + "!important}.dd-menu li{border-bottom:" + $SS.theme.brderColor.hex + "!important}input,textarea,.riceCheck,#qr-filename-container,#search-box,#index-search,.captcha-img,:root.vertical-qr #qr .move,#qr select,select,#post-preview,.captcha-root,.dd-menu ul,:root.werkTyme .catalog-thread:not(:hover),:root.werkTyme:not(.catalog-hover-expand) .catalog-thread,:root.catalog-hover-expand .catalog-container:hover>.post,:root.catalog-hover-expand .catalog-container:hover .catalog-reply{border:1px solid " + $SS.theme.inputbColor.hex + "!important}.options-button,.qr-link,.pages.cataloglink,.pages strong>a{border-style:solid;border-width:1px;border-color:rgb\(" + $SS.theme.mainColor.shiftRGB(-15) + ") rgb\(" + $SS.theme.mainColor.shiftRGB(-15) + ") rgb\(" + $SS.theme.mainColor.shiftRGB(-30) + ")!important}a.quotelink.forwardlink,a.backlink.forwardlink{border-bottom:1px dashed}input:focus,textarea:focus,#qr-filename-container:focus,#qr-filename-container.focus,select:focus,.captcha-root:focus{border:1px solid " + $SS.theme.linkColor.hex + "!important}#search-box:hover,#index-search:hover,.captcha-img:hover{border-color:" + $SS.theme.linkColor.hex + "!important}#header-bar{border:0!important}.flashListing td:not(:last-of-type):not(.postblock){border-width:1px;border-style:solid}:root.header-highlight #custom-board-list .current:hover,:root.header-highlight #custom-board-list .current{border-bottom:0!important}.suboption-list>div:last-of-type{background:rgba(" + $SS.theme.mainColor.rgb + "," + $SS.theme.replyOp + ")!important}.suboption-list>div::before,.suboption-list::before{border-color:" + $SS.theme.brderColor.hex + "!important;left:.5em!important}#navlinks a{text-shadow:" + $SS.theme.mainColor.hex + " -1px -1px," + $SS.theme.mainColor.hex + " 1px -1px," + $SS.theme.mainColor.hex + " -1px 1px," + $SS.theme.mainColor.hex + " 1px 1px," + $SS.theme.mainColor.hex + " -1px 0," + $SS.theme.mainColor.hex + " 1px 0," + $SS.theme.mainColor.hex + " 0 -1px," + $SS.theme.mainColor.hex + " 0 1px,rgba(0,0,0,.6) 0 2px 4px,rgba(0,0,0,.6) 0 0 2px}.thumb{box-shadow:0 0 5px rgba(0,0,0,.25)}#qr,#thread-watcher{box-shadow:1px 1px 3px rgba(0,0,0,.1)!important}.closed{margin-top:10px;color:red}#swf-embed-header.postblock{border:1px solid " + $SS.theme.brderColor.hex + "!important;background-color:rgba(" + $SS.theme.headerBGColor.rgb + "," + $SS.theme.navOp + ")!important;color:" + $SS.theme.linkColor.hex + "!important}#swf-embed-close{right:1px!important}.deleteform,.pages,.pagelist button,#full-board-list{font-size:0!important}.fileText,.summary{font-size:" + (($SS.conf["Font Size"] < 13) ? 10 : ($SS.conf["Font Size"] - 2)) + "px!important}.qr-link{font-size:14px!important}.tab-label,.options-button,.theme-preview,#oneechan-options input,#oneechan-options textarea,.hide-reply-button,.hide-thread-button{font-family:sans-serif!important;font-size:12px!important}.boardBanner .boardTitle{font-weight:400!important;font-size:" + (($SS.conf["Font Size"] < 13) ? 22 : 26) + "px!important}.prettyprint span{font-family:monospace!important;font-size:medium!important}#full-board-list,body>#header-bar,#full-board-list .fourchanx-link{font-size:" + (($SS.conf["Font Size"] < 1) ? 12 : ($SS.conf["Font Size"] - 1)) + "px!important}@media (min-width:1280px) and (max-width:1920px){#board-list{word-spacing:" + (($SS.conf["Font Size"] < 14) ? -1 : -2) + "px}}body,.prev span::after,.prev form::after,.next span::after,.next form::after,.pages a,#qr input.field,#qr:not(.sjis-preview) textarea.field,#qr span.field,#qr-file-button,#qr input[type=submit],#qr select[data-name=thread],#menu .entry,#boardList,#shortcuts,#index-search,#tegaki,select,input,div.next,form.pageSwitcherForm>input[type=submit]{font-family:" + $SS.formatFont($SS.conf["Font Family"]) + ";font-size:" + $SS.conf["Font Size"] + "px!important}#full-board-list a,#custom-board-list,a.qr-link{font-family:" + $SS.formatFont($SS.conf["Font Family"]) + "!important;font-size:" + $SS.conf["Font Size"] + "px!important}#qr .field::-moz-placeholder,::-moz-placeholder{font-family:" + $SS.formatFont($SS.conf["Font Family"]) + "!important;font-size:" + $SS.conf["Font Size"] + "px!important}#qr .field::webkit-input-placeholder,::webkit-input-placeholder{font-family:" + $SS.formatFont($SS.conf["Font Family"]) + "!important;font-size:" + $SS.conf["Font Size"] + "px!important}.backlink{font-size:" + $SS.conf["Backlink Font Size"] + "px!important}:root.info-on-hover .postNum{font-size:0!important}:root.info-on-hover .postContainer:hover .postNum{font-size:" + $SS.conf["Font Size"] + "px!important}#qr-file-button,#qr input[type=submit],#qr label,.captcha-counter{font-size:" + (($SS.conf["Font Size"] < 11) ? 8 : 10) + "px!important}#qr-file-button,#qr input[type=submit],#qr label,.captcha-counter{text-transform:uppercase}#qr label:not(.riceCheck){overflow:hidden;padding-bottom:2px}:root.underline-disabled a{text-decoration:none!important}.navLinks.navLinksBot.desktop a{text-decoration:underline}:root.underline-disabled .filtered{text-decoration:line-through!important}.deadlink.quotelink{text-decoration:none!important}:root.underline-quotes .deadlink.quotelink,:root.underline-quotes .quotelink,:root.underline-quotes .deadlink.backlink,:root.underline-quotes .backlink{text-decoration:underline!important}a.options-button,#oneechan-version a{text-decoration:none!important}.closed{text-align:center}.name,.subject,.option.header .option-title,a.current{font-weight:" + ($SS.conf["Bitmap Font"] ? 4 : 7) + "00!important}.qr-link{font-weight:400}.summary{font-style:" + ($SS.conf["Bitmap Font"] ? 'none' : 'italic') + "}" + ($SS.conf["Sidebar Position"] !== 3 ? " :root:not(.fixed) #header-bar{z-index:10}:root.left-sidebar body{padding-left:303px}:root.right-sidebar body{padding-right:303px}:root.left-sidebar:not(.mini-sidebar) .boardBanner,:root.right-sidebar:not(.mini-sidebar) .boardBanner{position:fixed}:root.left-sidebar:not(.mini-sidebar) .boardBanner{left:1px}:root.right-sidebar:not(.mini-sidebar) .boardBanner{right:1px}:root.fixed:not(.autohide):not(.bottom) .boardBanner{margin-top:-6px}:root.left-sidebar #qr{left:0!important;right:auto!important}:root.right-sidebar #qr{right:0!important;left:auto!important}.captcha-img,.captcha-img img{min-width:100%!important;height:56px!important}:root.vertical-qr:root.left-sidebar #qr{transform:translateX(-100%)}:root.vertical-qr:root.left-sidebar #qr .move{transform:rotate(90deg);transform-origin:bottom right;left:63.5%;bottom:46px}:root.mini-sidebar:root.left-sidebar body{padding-left:32px!important}:root.mini-sidebar:root.right-sidebar body{padding-right:32px!important}:root.mini-sidebar .boardSubtitle{display:none}:root.mini-sidebar:root.ss-sidebar body::before{width:31px!important}:root.mini-sidebar .boardTitle{top:72px!important;width:inherit!important;letter-spacing:-1px;position:fixed}:root.mini-sidebar:root.right-sidebar .boardTitle{right:32px;-webkit-transform-origin:top right;transform-origin:top right;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg)}:root.mini-sidebar:root.left-sidebar .boardTitle{left:32px;-webkit-transform-origin:top left;transform-origin:top left;-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg)}" : "") + " #qr{box-shadow:none!important;border-radius:0!important;min-width:297px!important;box-shadow:none!important}#qr .close{padding:2px 3px 2px 4px!important}#qr .riceCheck,#qr input[type=checkbox]{margin:0 4px 1px!important;vertical-align:baseline;position:relative;top:3px}#qr-filename-container .riceCheck,#qr-filename-container input[type=checkbox]{margin:0 0 1px!important}#qr-file-button,#qr input[type=submit]{height:25px!important;margin:0!important}#qr-file-button,#qr-filename-container{margin-right:1px!important}#qr-spoiler-label+input[type=submit]{margin-top:1px!important}#qr>form>select{margin:1px 0!important}#qr select[data-name=thread]{margin:1px 0;max-width:133px;min-width:80px}#qr>form>div.persona>input:nth-child(4),#qr>form>div.persona>input:nth-child(5),#qr>form>div.persona>input:nth-child(6){margin-left:1px}:root.expand-inputs .persona{display:flex}:root.expand-inputs .persona .field{flex:1;width:0}:root.expand-inputs .persona .field:hover,:root.expand-inputs .persona .field:focus{flex:3}#qr:not(.has-captcha) textarea{min-height:190px!important}:root.ua-webkit #qr:not(.has-captcha) textarea{min-height:185px!important}:root.ua-webkit #qr.has-captcha textarea.field{height:8.6em;min-height:.6em!important}:root.qr-background #qr{background:transparent!important;border:0}:root.qr-opacity #qr{opacity:.9}.textarea{margin-top:1px;-webkit-margin-after:1px}:root.ua-gecko .textarea{margin-bottom:1px}.captcha-img{min-height:58px!important;margin-bottom:1px}:root.force-qr #qr{max-width:297px}:root.vertical-qr #qr>div>label>div{display:none}:root.vertical-qr #qr textarea{resize:vertical!important}:root.vertical-qr #qr{min-width:297px!important;top:auto!important;position:fixed}:root.vertical-qr #qr .move{position:absolute;width:105px;cursor:default;padding:2px 0 2px 2px;text-align:center;bottom:88px}:root.vertical-qr #qr:hover .move{transition:opacity .42s linear}:root.vertical-qr #qr:hover .move,:root.vertical-qr #qr.focus .move{opacity:0!important}:root.vertical-qr.bottom-header #qr{bottom:28px!important}:root.vertical-qr.top-header #qr{bottom:0!important}:root.vertical-qr .captcha-img,:root.vertical-qr .captcha-img img{max-width:247px}:root.vertical-qr #qr form{display:block!important}:root.vertical-qr #qr .move #autohide,:root.vertical-qr #qr>div>select{display:none}:root.vertical-qr #qr:hover,:root.vertical-qr #qr.focus{transform:translateX(0%)!important}:root.vertical-qr #qr{transform:translateX(100%);transition:transform .3s ease-in-out .1s}:root.vertical-qr #qr .move{transform:rotate(-90deg);right:86%}:root.fade-qr #qr form{display:block!important}:root.fade-qr #qr.autohide:not(.focus):not(:hover){opacity:.2!important;transition:opacity .2s ease-in-out 1s}input[type=number]{-moz-appearance:textfield}::-webkit-inner-spin-button{-webkit-appearance:none}::-webkit-outer-spin-button{-webkit-appearance:none}.closeIcon{background-image:none!important}.closeIcon::after{content:'x'}.watch-thread-link{margin-bottom:-7px;margin-right:2px;top:auto!important;bottom:4px!important;background-image:url(\"data:image/svg+xml," + $SS.theme.icons.star + "\")!important}:root.backlink-icon .backlink{background-image:url(\"data:image/svg+xml," + $SS.theme.icons.backlink + "\")!important;font-size:0!important;padding:" + (($SS.conf["Font Size"] < 12) ? 5 : 6) + "px!important;margin-right:0!important;opacity:.6!important;position:relative;bottom:5px;left:2px}:root.backlink-icon .backlink.inlined{background-image:url(\"data:image/svg+xml," + $SS.theme.icons.downArrow + "\")!important;font-size:0!important;padding:6px!important;margin-right:0!important;opacity:.6!important;position:relative;bottom:5px;left:3px}:root.backlink-icon .reply .backlink{bottom:" + (($SS.conf["Font Size"] < 12) ? 4 : 6) + "px!important}:root.backlink-icon .backlink:hover,:root.backlink-icon .backlink.inlined:hover{opacity:1!important}img[title=Closed],img[title=Sticky],img[title=Archived]{color:transparent!important;font-size:0!important;background-color:transparent!important;background-position:center!important;background-repeat:no-repeat;display:inline-block;height:0!important;padding-top:16px!important;text-indent:-9999px!important;vertical-align:bottom;width:16px!important}.closedIcon{background-image:url(\"data:image/svg+xml," + $SS.theme.icons.threadClosed + "\")!important}.stickyIcon{background-image:url(\"data:image/svg+xml," + $SS.theme.icons.threadPinned + "\")!important}.archivedIcon{background-image:url(\"data:image/svg+xml," + $SS.theme.icons.threadArchived + "\")!important}.exlinksOptionsLink.entry{padding:0!important;min-width:0!important}:root.left-sidebar .exlinksOptionsLink.entry{left:2px!important}:root.right-sidebar .exlinksOptionsLink.entry{right:2px!important}:root.hl-border .post.reply,:root.op-background.hl-border .postContainer.opContainer{border-left:" + $SS.conf["Width Decoration"] + "px " + $SS.conf["Post Highlight Style"] + " rgba(" + $SS.theme.postHLColor.rgb + ",1)!important}:root.hl-border-down .post.reply,:root.op-background.hl-border-down .postContainer.opContainer{border-bottom:" + $SS.conf["Width Decoration"] + "px " + $SS.conf["Post Highlight Style"] + " rgba(" + $SS.theme.postHLColor.rgb + ",1)!important}:root.hl-outline .post.reply,:root.op-background.hl-outline .postContainer.opContainer{outline:" + $SS.conf["Width Decoration"] + "px " + $SS.conf["Post Highlight Style"] + " rgba(" + $SS.theme.postHLColor.rgb + ",1)}.filter-highlight .catalog-thumb{box-shadow:0 0 3px 3px rgba(" + $SS.theme.postHLColor.rgb + ",.5)!important}.filter-highlight.opContainer,.filter-highlight>.reply{box-shadow:5px 0 rgba(" + $SS.theme.postHLColor.rgb + ",.5) inset!important}.filter-highlight>div.sideArrows{color:rgba(" + $SS.theme.postHLColor.rgb + ",.5)!important}.qphl{outline:2px solid rgba(" + $SS.theme.linkColor.rgb + ",.5)!important}:root.highlight-you .quotesYou.opContainer,:root.highlight-you .quotesYou>.reply{border-left:" + $SS.conf["Width Decoration"] + "px solid rgba(" + $SS.theme.quotesYouHLColor.rgb + ",1)!important}:root.highlight-you .quotesYou>.sideArrows{color:rgba(" + $SS.theme.quotesYouHLColor.rgb + ",1)!important}:root.highlight-own .yourPost.opContainer,:root.highlight-own .yourPost>.reply{border-left:" + $SS.conf["Width Decoration"] + "px dashed rgba(" + $SS.theme.ownPostHLColor.rgb + ",1)!important}:root.highlight-own .yourPost>.sideArrows{color:rgba(" + $SS.theme.ownPostHLColor.rgb + ",1)!important}.reply:target{background:rgba(" + $SS.theme.replybgHLColor.rgb + ",.8)!important}.highlight{outline:2px solid rgba(" + $SS.theme.replyslctColor.rgb + ",1)!important}.catalog-thread.watched .catalog-thumb,.catalog-thread.watched .werkTyme-filename{border:2px solid rgba(" + $SS.theme.postHLColor.rgb + ",1)!important}.replies-quoting-you>.watcher-link{color:rgba(" + $SS.theme.quotesYouHLColor.rgb + ",1)!important}.replies-quoting-you>.watcher-link:hover{color:" + $SS.theme.linkHColor.hex + "!important}#watched-threads>.replies-quoting-you>a{color:rgba(" + $SS.theme.quotesYouHLColor.rgb + ",1)!important}#shortcuts>.shortcut>#watcher-link.disabled.replies-quoting-you{color:rgba(" + $SS.theme.quotesYouHLColor.rgb + ",.45)!important}#watched-threads>.replies-quoting-you>a:hover,#shortcuts>.shortcut>#watcher-link.disabled.replies-quoting-you:hover{color:" + $SS.theme.linkHColor.hex + "!important}:root.highlight-opQuotes .qmark-op{color:rgba(" + $SS.theme.postHLColor.rgb + ",1);font-weight:700}:root.highlight-youQuotes .qmark-you{color:rgba(" + $SS.theme.quotesYouHLColor.rgb + ",1);font-weight:700}#add-theme,#oneechan-options{border:0!important;border-radius:3px!important;position:fixed;margin:auto}#oneechan-options{width:690px;text-align:left!important;height:532px;top:0;bottom:0;left:0;right:0;box-shadow:rgba(0,0,0,.6) 0 0 10px!important;padding:5px}.options-close,#options-container:not(.yui-skin-sam){padding:3px}#options-container:not(.yui-skin-sam){box-shadow:inset rgba(0,0,0,.3) 0 0 5px}.options-close{text-align:right!important;margin-right:auto;margin-left:auto}#add-theme{padding:20px!important;top:0;left:0;right:0;bottom:0;height:445px}:root.ua-webkit #add-theme{height:403px!important}#add-theme .option-title{float:left;line-height:22px;padding-left:5px}#add-theme>label{line-height:22px}#options-container:not(.yui-skin-sam){border-radius:5px}#options-container:not(.yui-skin-sam),.options-section{height:500px}.options-section{overflow-y:auto;overflow-x:hidden}#main-section .option{display:block;border-top:1px solid rgba(0,0,0,.1);height:22px;padding:0 6px;vertical-align:middle}#main-section>.option:nth-of-type(even){background:rgb\(" + $SS.theme.mainColor.shiftRGB(-5) + ")!important}#main-section .buttons-container+.option{border-top:0!important}.option-title{line-height:20px!important}#main-section .option:first-child{border-top:0!important}#main-section .option:last-child{border-bottom:0!important}#main-section input,#main-section select{float:right!important}#main-section input[type=checkbox],#main-section .riceCheck{float:left!important;margin-right:5px!important}select[name='Font Family']>option{max-width:150px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.suboption::before{border-bottom:1px solid rgba(0,0,0,.1);border-left:1px solid rgba(0,0,0,.1);content:'';display:inline-block;float:left;margin-right:2px;height:50%;width:6px}.suboption{padding-left:16px!important}.option.header{cursor:auto!important}.theme-preview{cursor:default}.theme-preview blockquote{margin:12px 40px!important}#themes-section .reply{padding:2px!important;position:relative;text-align:left;width:99.4%;border-radius:0!important}.theme-buttons-container{bottom:4px;right:2px;margin:0;opacity:0;position:absolute;z-index:3}.theme-preview:hover .theme-buttons-container{opacity:1}.theme-buttons-container>a{display:inline-block;margin:0 2px;padding:2px 5px;text-align:center;width:50px;border-radius:3px}.theme-preview .sfw-label{bottom:-5px;font-size:32px!important;margin:0!important;opacity:0;position:absolute;right:300px}.theme-preview.selected:not(.nsfw) .sfw-label,.theme-preview.nsfw:not(.selected) .sfw-label,.theme-preview.nsfw.selected .both{transition:opacity .3s,right .3s}.theme-preview.nsfw .notsafe{opacity:1;right:3px;z-index:1}.theme-preview.selected .safe{opacity:1;right:3px;z-index:1}.theme-preview.selected.nsfw .sfw-label:not(.both){opacity:0!important;right:300px!important;z-index:0!important}.theme-preview.selected.nsfw .both{opacity:1;right:3px;z-index:1}#add-theme{text-align:left!important;width:800px!important}#add-theme>label{display:inline-block;text-align:right;width:33.3%}#add-theme>label#customCSS{width:100%}#add-theme>label#customCSS>textarea{height:9.5em;resize:vertical;width:99%;max-height:25em}#add-theme>label>input[type=text],#add-theme>label>select{width:100px}#add-theme>div{margin-top:.6em;text-align:right}#options-tabs{list-style:none;margin:0;padding:0;position:absolute;top:-24px;left:-1px}.tab-item{float:left;margin:0;padding:0}.tab-label{display:block;height:16px;margin:0 1px;padding:5px;text-align:center;width:75px;border-radius:3px 3px 0 0;transition:all .1s ease-in-out}.tab-label:not(.selected):not(:hover){opacity:.8}#overlay{z-index:99!important;background-color:rgba(0,0,0,.3)!important}#overlay2{background:rgba(0,0,0,.1)!important;position:fixed;top:0;left:0;height:100%;width:100%;text-align:center;z-index:125!important}#overlay2::before{content:'';display:inline-block;height:100%;vertical-align:middle}#overlay.previewing{display:none}#overlay.previewing~#overlay2{background-color:rgba(0,0,0,.1)!important}.buttons-container{bottom:3px;left:5px;position:absolute}.buttons-container{margin:0}.options-button{display:inline-block;line-height:18px;margin:0 2px;min-width:40px;padding:2px 10px;text-align:center;cursor:pointer;border-radius:3px}.options-button-small{padding:2px 5px;min-width:30px}#import-link{line-height:22px;overflow:hidden;position:relative;float:left;height:24px!important;margin-top:-2px;padding-top:2px}#import-settings{position:relative;overflow:hidden;vertical-align:bottom}#import-settings>.import-input{left:0}.import-input{position:absolute;opacity:0;cursor:pointer}label.option>input[type=checkbox],label.option>.riceCheck{margin:4px 2px 0!important;vertical-align:bottom!important}span.option>select,.option>input[type=text]{width:125px}#oneechan-options input[type=text],#oneechan-options select{max-height:20px;margin-top:1px!important;padding:0 3px!important}#oneechan-options textarea{background:transparent!important;border:0!important;height:100%!important;width:100%!important;resize:none}#oneechan-version{opacity:.5;padding-right:5px;padding-left:40px;font-size:x-small}.link-delim{opacity:.4}.extended-small .teaser,.extended-large .teaser{margin-left:5px;margin-right:5px}div.thread{margin:2px 1px 0 0;clear:both;padding-bottom:10px}.pages.cataloglink{margin-left:12px;border-radius:3px}.pages.cataloglink a{color:" + $SS.theme.textColor.hex + "!important;font-weight:700}.pages.cataloglink a:hover{color:" + $SS.theme.textColor.hex + "!important;opacity:.7!important;transition:opacity .3s ease-in 0s}:root.catalog-justify .teaser,:root.catalog-justify .catalog-thread>.comment{text-align:justify!important}:root.catalog-background #threads div.thread,:root.catalog-background .catalog-thread{background:rgba(" + $SS.theme.mainColor.rgb + "," + $SS.theme.replyOp + ")!important}:root.rounded-corners.catalog-background #threads div.thread,:root.rounded-corners.catalog-background .catalog-thread{border-radius:3px!important}:root.catalog-background .teaser,:root.catalog-background .catalog-thread>.comment{margin:0 5px 5px}:root.catalog-background .thumb,:root.catalog-background img.catalog-thumb{margin-top:8px}:root.catalog-background .extended-large .thread{min-height:410px}:root.catalog-background .extended-small .thread{min-height:320px}:root.catalog-thumbsize .thumb,:root.catalog-thumbsize img.catalog-thumb{width:150px!important;height:150px!important}" + $SS.theme.customCSS + "";
  966.  
  967. if (reload)
  968. $("#ch4SS").text(css);
  969. else
  970. $(document.head).append($("<style type='text/css' id=ch4SS>").text(css));
  971. },
  972. QRDialogCreationHandler: function(e) {
  973. var qr = e.target;
  974.  
  975. $("input[type=checkbox]", qr).riceCheck();
  976.  
  977. $SS.QRhandled = true;
  978. },
  979. NodeInsertionHandler: function(e) {
  980. var settings = e.target;
  981. $("input[type=checkbox]", settings).riceCheck();
  982. },
  983. /* CONFIG */
  984. Config: {
  985. hasGM: typeof GM_deleteValue !== "undefined",
  986. init: function() {
  987. var parseVal = function(key, val) {
  988. if (/^(Selected|Hidden)+\s(Mascots|Themes?)+$/.test(key)) {
  989. if (key === "Selected Theme")
  990. return parseInt(val);
  991. else if (key === "NSFW Theme")
  992. return parseInt(val);
  993. else if (key === "Selected Mascots" && val === 0)
  994. return 0;
  995.  
  996. for (var i = 0, MAX = val.length, ret = []; i < MAX; ++i)
  997. ret[i] = parseInt(val[i]);
  998.  
  999. return ret;
  1000. }
  1001.  
  1002. return (Array.isArray(val) && typeof val[0] !== "object") ? val[0] : val;
  1003. };
  1004.  
  1005. $SS.conf = [];
  1006. $SS.exportOptions = {};
  1007.  
  1008. for (var key in defaultConfig) {
  1009. $SS.conf[key] = parseVal(key, this.get(key));
  1010. if (!(/^(Hidden|Themes|Selected Mascots|::)/.test(key))) {
  1011. $SS.exportOptions[key] = $SS.conf[key];
  1012. };
  1013. };
  1014. $SS.conf["Margin Left"] = $SS.conf["Left Margin"] !== 999 ? $SS.conf["Left Margin"] : $SS.conf["Custom Left Margin"];
  1015. $SS.conf["Margin Right"] = $SS.conf["Right Margin"] !== 999 ? $SS.conf["Right Margin"] : $SS.conf["Custom Right Margin"];
  1016. $SS.conf["Margin Post Message"] = $SS.conf["Post Message Margin"] === 1 ? "4px 16px" : ($SS.conf["Post Message Margin"] === 3 ? "20px 40px" : "");
  1017. $SS.conf["Width Decoration"] = $SS.conf["Post Decoration Width"] !== 999 ? $SS.conf["Post Decoration Width"] : $SS.conf["Custom Decoration Width"];
  1018. },
  1019. get: function(name) {
  1020. var val = this.hasGM ?
  1021. GM_getValue(NAMESPACE + name) :
  1022. localStorage.getItem(NAMESPACE + name);
  1023.  
  1024. if (val != undefined)
  1025. return JSON.parse(val);
  1026.  
  1027. return defaultConfig[name];
  1028. },
  1029. set: function(name, val) {
  1030. name = NAMESPACE + name;
  1031.  
  1032. if (typeof val !== "number")
  1033. val = JSON.stringify(val);
  1034.  
  1035. return this.hasGM ?
  1036. GM_setValue(name, val) :
  1037. localStorage.removeItem(name, val),
  1038. localStorage.setItem(name, val);
  1039. }
  1040. },
  1041.  
  1042. /* OPTIONS */
  1043. options: {
  1044. saveAndClose: false,
  1045. init: function() {
  1046. $(document).bind("keydown", $SS.options.keydown);
  1047. /* seaweedchan */
  1048. var a = $("<span class='shortcut brackets-wrap'><a id='StyleChanLink' title='StyleChan Settings' class='fa fa-gears' href='javascript:;'>StyleChan</a></span>").bind("click", $SS.options.show);
  1049. /* loadletter */
  1050. b = $("<span id='StyleChanLink'> [<a title='StyleChan Settings' href='javascript:;'>StyleChan</a>]&nbsp;</span>").bind("click", $SS.options.show);
  1051.  
  1052. $.asap(function() {
  1053. return $(".fourchan-x #shortcuts, .fourchan_x, .is_catalog").exists();
  1054. }, function() {
  1055. $(".fourchan-x").exists() ? $(".shortcut.brackets-wrap:last-of-type").before(a) : $("#boardNavDesktop").append(b);
  1056. });
  1057.  
  1058. },
  1059. show: function() {
  1060. if ($("#overlay").exists())
  1061. $SS.options.close();
  1062. else {
  1063. var overlay = $("<div id=overlay>").bind("click", $SS.options.close),
  1064. tOptions = $("<div id='oneechan-options' class=dialog>").bind("click", function(e) {
  1065. return e.stopPropagation();
  1066. }),
  1067. optionsHTML = "<ul id=options-tabs>" +
  1068. "<li class='tab-item'><label class='tab-label selected' for=main-select>Main</label></li>" +
  1069. "<li class='tab-item'><label class='tab-label' for=themes-select>Themes</label></li>" +
  1070. "</ul><div id=options-container><input type=radio class=tab-select name=tab-select id=main-select hidden checked><div id='main-section' class='options-section'>" +
  1071. "<p class='buttons-container'>" +
  1072. "<a class='options-button' title='Export your settings as JSON.' name=Export>Export</a><a class='options-button' id='import-settings'><input type=file class='import-input' riced=true accept='application/json'>Import</a><a class='options-button' title='Reset StyleChan settings.' name=resetSettings>Reset</a>" +
  1073. "<span id=oneechan-version><span>StyleChan</span> v" + VERSION + "<span class=link-delim> | </span>" +
  1074. "<a href='https://github.com/nebukazar/OneeChan/wiki' id=changelog-link target='_blank' title='Learn about StyleChan.'>Wiki</a><span class=link-delim> | </span>" +
  1075. "<a href='https://github.com/nebukazar/StyleChan/blob/master/CHANGELOG.md' id=changelog-link target='_blank' title='Read the changelog.'>Changelog</a><span class=link-delim> | </span>" +
  1076. "<a href='https://github.com/nebukazar/StyleChan/blob/master/CONTRIBUTING.md#reporting-bugs-and-suggestions' id=issues-link target='_blank' title='Report an issue.'>Issues</a></p>",
  1077. key, val, des;
  1078.  
  1079. for (key in defaultConfig) {
  1080. if (/^(Selected|Hidden)+\s(Themes?)+$/.test(key))
  1081. continue;
  1082.  
  1083. val = $SS.conf[key];
  1084. des = defaultConfig[key][1];
  1085.  
  1086. if ((defaultConfig[key][4] === true) && (key === "Custom Left Margin")) {
  1087. var pVal = $SS.conf[defaultConfig[key][2]];
  1088. id = defaultConfig[key][2].replace(/\s/g, "_") + defaultConfig[key][3];
  1089. optionsHTML += "<span class='option suboption " + id + "' title=\"" + des + "\"" +
  1090. (pVal != defaultConfig[key][3] ? "hidden" : "") + "><span class='option-title'>" + key +
  1091. "</span><input name='Custom Left Margin' type=text value=" + $SS.conf["Custom Left Margin"] + "px></span>";
  1092. } else if ((defaultConfig[key][4] === true) && (key === "Custom Right Margin")) {
  1093. var pVal = $SS.conf[defaultConfig[key][2]];
  1094. id = defaultConfig[key][2].replace(/\s/g, "_") + defaultConfig[key][3];
  1095. optionsHTML += "<span class='option suboption " + id + "' title=\"" + des + "\"" +
  1096. (pVal != defaultConfig[key][3] ? "hidden" : "") + "><span class='option-title'>" + key +
  1097. "</span><input name='Custom Right Margin' type=text value=" + $SS.conf["Custom Right Margin"] + "px></span>";
  1098. } else if ((defaultConfig[key][4] === true) && (key === "Custom Decoration Width")) {
  1099. var pVal = $SS.conf[defaultConfig[key][2]];
  1100. id = defaultConfig[key][2].replace(/\s/g, "_") + defaultConfig[key][3];
  1101. optionsHTML += "<span class='option suboption " + id + "' title=\"" + des + "\"" +
  1102. (pVal != defaultConfig[key][3] ? "hidden" : "") + "><span class='option-title'>" + key +
  1103. "</span><input name='Custom Decoration Width' type=text value=" + $SS.conf["Custom Decoration Width"] + "px></span>";
  1104. } else if (val === "header") {
  1105. optionsHTML += "<label class='option header'><span class='option-title'>" + key + "</span></label>";
  1106. } else if (defaultConfig[key][4] === true) // sub-option
  1107. {
  1108. var pVal = $SS.conf[defaultConfig[key][2]];
  1109. id = defaultConfig[key][2].replace(/\s/g, "_") + defaultConfig[key][3];
  1110. optionsHTML += "<label class='option suboption " + id + "' title=\"" + des + "\"" +
  1111. (pVal != defaultConfig[key][3] ? "hidden" : "") + "><span class='option-title'>" + key +
  1112. "</span><input" + (val ? " checked" : "") + " name='" + key + "' type=checkbox></label>";
  1113. } else if (Array.isArray(defaultConfig[key][2])) // select
  1114. {
  1115. var opts = key === "Font Family" ? $SS.fontList || defaultConfig[key][2] : defaultConfig[key][2],
  1116. cFonts = [];
  1117. optionsHTML += "<label class=option title=\"" + des + "\"><span class='option-title'>" + key + "</span>" +
  1118. "<select name='" + key + "'" + (defaultConfig[key][3] === true ? " has-suboption" : "") + ">";
  1119.  
  1120. for (var i = 0, MAX = opts.length; i < MAX; ++i) {
  1121. var name, value;
  1122.  
  1123. if (typeof opts[i] === "object") {
  1124. name = opts[i].name;
  1125. value = opts[i].value;
  1126. } else
  1127. name = value = opts[i];
  1128.  
  1129. if (key === "Font Family") cFonts.push(value);
  1130.  
  1131. optionsHTML += "<option" + (key === "Font Family" ? " style=\"font-family:" + $SS.formatFont(value) + "!important\"" : "") +
  1132. " value='" + value + "'" + (value == val ? " selected" : "") + ">" + name + "</option>";
  1133. }
  1134.  
  1135. if (key === "Font Family" && cFonts.indexOf($SS.conf["Font Family"]) == -1)
  1136. optionsHTML += "<option style=\"font-family:" + $SS.formatFont($SS.conf["Font Family"]) + "!important\" value='" + $SS.conf["Font Family"] + "' selected>" + $SS.conf["Font Family"] + "</option>";
  1137.  
  1138. optionsHTML += "</select></label>";
  1139. } else if (key === "Font Size") {
  1140. optionsHTML += "<label class='option visible' title=\"" + des + "\"><span class='option-title'>" + key + "</span>" +
  1141. "<input type=text name='Font Size' value=" + $SS.conf["Font Size"] + "px></label>";
  1142. } else if (key === "Backlink Font Size") {
  1143. optionsHTML += "<label class='option visible' title=\"" + des + "\"><span class='option-title'>" + key + "</span>" +
  1144. "<input type=text name='Backlink Font Size' value=" + $SS.conf["Backlink Font Size"] + "px></label>";
  1145. } else if (key === "Themes") {
  1146. optionsHTML += "</div><input type=radio class=tab-select name=tab-select class=tab-select id=themes-select hidden><div id='themes-section' class='options-section'>";
  1147. } else // checkbox
  1148. optionsHTML += "<label class=option title=\"" + des + "\"><span class='option-title'>" + key + "</span><input" + (val ? " checked" : "") +
  1149. " name='" + key + "' " + (defaultConfig[key][3] === true ? " has-suboption" : "") + " type=checkbox></label>";
  1150. }
  1151.  
  1152. optionsHTML += "</div></div><div class='options-close'><a class='options-button' name=save>Save</a><a class='options-button' name=cancel>Cancel</a></div>";
  1153. tOptions.html(optionsHTML);
  1154. overlay.append(tOptions);
  1155.  
  1156. $(".import-input", tOptions).bind("change", function() {
  1157. var file = this.files[0],
  1158. reader = new FileReader(),
  1159. key, imported, val;
  1160. if (this.files[0].name.match(/\.json$/) == null) {
  1161. alert('Only JSON files are accepted!');
  1162. return;
  1163. } else if (!confirm('Your current settings will be overwritten, are you sure?')) {
  1164. return;
  1165. }
  1166. reader.onload = (function(tFile) {
  1167. return function(e) {
  1168. try {
  1169. imported = JSON.parse(e.target.result);
  1170. } catch (err) {
  1171. alert("Invalid settings file!");
  1172. return;
  1173. }
  1174.  
  1175. for (key in imported) {
  1176. val = imported[key];
  1177. $SS.Config.set(key, val);
  1178. }
  1179.  
  1180. if (confirm('Import successful. Refresh now?')) {
  1181. return window.location.reload();
  1182. }
  1183.  
  1184. }
  1185. })(file);
  1186.  
  1187. reader.readAsText(file);
  1188. });
  1189. $("a[name=Export]", tOptions).bind("click", function() {
  1190. if ($("a[download]", tOptions).exists())
  1191. return;
  1192. var exportalert = $("<a class='options-button' download='StyleChan v" + VERSION + " Settings.json' href='data:application/json," + encodeURIComponent(JSON.stringify($SS.exportOptions, null, 2)) + "'>Save me!").bind("click", $SS.options.close);
  1193. return $(this).replace(exportalert);
  1194. });
  1195. // Reset settings
  1196. $("a[name=resetSettings]", tOptions).bind("click", function() {
  1197. var confirmReset = confirm('Your current StyleChan settings will be wiped, are you sure?');
  1198. if (confirmReset) {
  1199. if (typeof GM_deleteValue !== "undefined") {
  1200. var keys = GM_listValues();
  1201. for (var i = 0, key = null; key = keys[i]; i++) {
  1202. GM_deleteValue(key);
  1203. }
  1204. } else if ($SS.browser.webkit) {
  1205. Object.keys(localStorage).forEach(function(key) {
  1206. if (/^(?:StyleChan)/.test(key)) {
  1207. localStorage.removeItem(key);
  1208. }
  1209. })
  1210. }
  1211. alert('Your StyleChan settings have been reset. Reloading.');
  1212. return window.location.reload();
  1213. } else return;
  1214. });
  1215. // options window
  1216. $(".tab-label", tOptions).bind("click", function(e) {
  1217. if ($(this).hasClass("selected")) return;
  1218.  
  1219. $(".tab-label.selected").removeClass("selected");
  1220. $(this).addClass("selected");
  1221. });
  1222. $("[has-suboption]", tOptions).bind("change", function() {
  1223. var id = this.name.replace(/\s/g, "_") + $(this).val(),
  1224. sub = $("." + id);
  1225.  
  1226. if (sub.exists())
  1227. sub.each(function() {
  1228. $(this).show();
  1229. });
  1230. else
  1231. $("[class*='" + this.name.replace(/\s/g, "_") + "']").each(function() {
  1232. $(this).hide();
  1233. });
  1234. });
  1235. $("a[name=save]", tOptions).bind("click", function() {
  1236. $SS.options.saveAndClose = true;
  1237. $SS.options.save();
  1238. $SS.options.saveAndClose = false;
  1239. });
  1240. $("a[name=cancel]", tOptions).bind("click", $SS.options.close);
  1241.  
  1242. // main tab
  1243. $("input[name='Font Size']", tOptions).bind("keydown", function(e) {
  1244. var val = parseInt($(this).val()),
  1245. bitmap = $(this).parent().nextSibling().children("input[name='Bitmap Font']").val();
  1246.  
  1247. if (e.keyCode === 38 && (val < MAX_FONT_SIZE || bitmap))
  1248. $(this).val(++val + "px");
  1249. else if (e.keyCode === 40 && (val > MIN_FONT_SIZE || bitmap))
  1250. $(this).val(--val + "px");
  1251. });
  1252.  
  1253. // themes tab
  1254. $SS.options.createThemesTab(tOptions);
  1255.  
  1256. return $(document.body).append(overlay);
  1257. }
  1258. },
  1259. createThemesTab: function(tOptions) {
  1260. var themes = $("#themes-section", tOptions).html(""),
  1261. p = $("<p class='buttons-container'>");
  1262.  
  1263. p.append($("<a class='options-button' name=addTheme title='Create a new theme.'>Create", tOptions).bind("click", $SS.options.showTheme));
  1264. p.append($("<a class='options-button' href='https://github.com/nebukazar/StyleChan/wiki/Custom-Themes' title='Learn more about custom themes and download new ones.' target='_blank'>Custom Themes"));
  1265. p.append($("<div id='import-link' title='Import a new theme (.json) file.'>").append($("<input type=file class='import-input' riced=true>")
  1266. .bind("change", function() {
  1267. var file = this.files[0],
  1268. reader = new FileReader(),
  1269. val, first, valid = true,
  1270. theme, div, index, imported;
  1271.  
  1272. reader.onload = (function(tFile) {
  1273. return function(e) {
  1274. try {
  1275. theme = JSON.parse(e.target.result);
  1276. } catch (err) {
  1277. alert("Invalid theme file!");
  1278. return;
  1279. }
  1280.  
  1281. /* Check if this is an StyleChan v5 file, do nothing if so */
  1282. if (theme["headerColor"] !== undefined) {}
  1283.  
  1284. /* Old StyleChan */
  1285. else if (theme["navOp"] !== undefined) {
  1286. theme.unreadColor = theme["jlinkColor"];
  1287. theme.headerColor = theme["textColor"];
  1288. theme.headerBGColor = theme["mainColor"];
  1289. theme.headerLColor = theme["linkColor"];
  1290. theme.headerLHColor = theme["linkHColor"];
  1291. theme.boardColor = theme["textColor"];
  1292. }
  1293.  
  1294. /* 4chan Style Script */
  1295. else if (theme["timeColor"] !== undefined) {
  1296. theme.replyOp = "1.0";
  1297. theme.navOp = "0.9";
  1298. theme.unreadColor = theme["jlinkColor"];
  1299. theme.headerColor = theme["textColor"];
  1300. theme.headerBGColor = theme["mainColor"];
  1301. theme.headerLColor = theme["linkColor"];
  1302. theme.headerLHColor = theme["linkHColor"];
  1303. theme.boardColor = theme["textColor"];
  1304. theme.bgImg = $SS.validImageURL(theme["bgImg"]) ? theme["bgImg"] : false;
  1305. }
  1306.  
  1307. /* Appchan X */
  1308. else if (theme["Theme"] !== undefined) {
  1309. theme.name = theme["Theme"];
  1310. theme.authorName = theme["Author"];
  1311. theme.authorTrip = theme["Author Tripcode"];
  1312. theme.replyOp = "1.0";
  1313. theme.navOp = "0.9";
  1314. theme.bgImg = theme["Background Image"];
  1315. theme.mainColor = $SS.colorToHex(theme["Reply Background"]);
  1316. theme.textColor = $SS.colorToHex(theme["Text"]);
  1317. theme.linkColor = $SS.colorToHex(theme["Links"]);
  1318. theme.linkHColor = $SS.colorToHex(theme["Hovered Links"]);
  1319. theme.headerColor = $SS.colorToHex(theme["Text"]);
  1320. theme.headerBGColor = $SS.colorToHex(theme["Navigation Background"]);
  1321. theme.headerLColor = $SS.colorToHex(theme["Navigation Links"]);
  1322. theme.headerLHColor = $SS.colorToHex(theme["Hovered Navigation Links"]);
  1323. theme.boardColor = $SS.colorToHex(theme["Board Title"]);
  1324. theme.brderColor = $SS.colorToHex(theme["Reply Border"]);
  1325. theme.inputColor = $SS.colorToHex(theme["Input Background"]);
  1326. theme.inputbColor = $SS.colorToHex(theme["Input Border"]);
  1327. theme.bgColor = $SS.colorToHex(theme["Background Color"]);
  1328. theme.blinkColor = $SS.colorToHex(theme["Backlinks"]);
  1329. theme.unreadColor = $SS.colorToHex(theme["Links"]);
  1330. theme.nameColor = $SS.colorToHex(theme["Names"]);
  1331. theme.tripColor = $SS.colorToHex(theme["Tripcodes"]);
  1332. theme.titleColor = $SS.colorToHex(theme["Subjects"]);
  1333. theme.quoteColor = $SS.colorToHex(theme["Greentext"]);
  1334. theme.qlColor = $SS.colorToHex(theme["Quotelinks"]);
  1335. theme.replybgHLColor = $SS.colorToHex(theme["Highlighted Reply Background"]);
  1336. theme.replyslctColor = $SS.colorToHex(theme["Highlighted Reply Background"]);
  1337. theme.customCSS = theme["Custom CSS"];
  1338. }
  1339.  
  1340. /* Can't be exported from the main scripts, so toss an error */
  1341. else {
  1342. alert("Invalid theme file!");
  1343. return;
  1344. }
  1345.  
  1346. index = $SS.conf["Themes"].push(theme);
  1347. theme = new $SS.Theme(--index);
  1348. div = theme.preview();
  1349. $("#overlay #themes-section").append(div);
  1350. div.fire("click").scrollIntoView(true);
  1351. }
  1352. })(file);
  1353.  
  1354. reader.readAsText(file);
  1355. })).append($("<span class='options-button'>Import")));
  1356. p.append($("<a class='options-button' name=restoreThemes title='Restore hidden default themes'>Restore", tOptions)
  1357. .bind("click", function() {
  1358. $SS.conf["Hidden Themes"] = [];
  1359. $("#themes-section>div[hidden]").show();
  1360. })
  1361. );
  1362.  
  1363. if ($SS.conf["Hidden Themes"].length === 0)
  1364. $("a[name=restoreThemes]", p).hide();
  1365.  
  1366. themes.append(p);
  1367.  
  1368. for (var i = 0, MAX = $SS.conf["Themes"].length, tTheme; i < MAX; ++i) {
  1369. tTheme = new $SS.Theme(i);
  1370. themes.append(tTheme.preview());
  1371. }
  1372. },
  1373. close: function() {
  1374. return $("#overlay").remove();
  1375. },
  1376. keydown: function(e) {
  1377. if (e.ctrlKey && e.keyCode === 112) {
  1378. e.preventDefault();
  1379. e.stopPropagation();
  1380. $SS.options.show();
  1381. }
  1382. },
  1383. save: function() {
  1384. var div = $("#oneechan-options"),
  1385. themes = [],
  1386. selectedMascots = [],
  1387. nsfwTheme,
  1388. selectedTheme;
  1389.  
  1390. // Save main
  1391. $("#oneechan-options input[name]:not(.tab-select), #oneechan-options select").each(function() {
  1392. var name = $(this).attr("name"),
  1393. val = $(this).val();
  1394.  
  1395. if (name === "Font Size") {
  1396. val = parseInt(val);
  1397.  
  1398. if (!$("input[name='Bitmap Font']", div).val())
  1399. val = Math.max(Math.min(val, MAX_FONT_SIZE), MIN_FONT_SIZE);
  1400. } else if (name === "Custom Right Margin") {
  1401. val = parseInt(val);
  1402. } else if (name === "Custom Left Margin") {
  1403. val = parseInt(val);
  1404. } else if (name === "Custom Decoration Width") {
  1405. val = parseInt(val);
  1406. } else if (name === "Backlink Font Size") {
  1407. val = parseInt(val);
  1408. }
  1409.  
  1410. $SS.Config.set($(this).attr("name"), val);
  1411. });
  1412.  
  1413. // Save Themes
  1414. $("#oneechan-options #themes-section>div").each(function(index) {
  1415. var oldIndex = parseInt(this.id.substr(5));
  1416. if (!$SS.conf["Themes"][oldIndex].default)
  1417. themes.push($SS.conf["Themes"][oldIndex]);
  1418. });
  1419.  
  1420. selectedTheme = (selectedTheme = $("#oneechan-options #themes-section>div.selected")).exists() ?
  1421. parseInt(selectedTheme.attr("id").substr(5)) : 0;
  1422.  
  1423. nsfwTheme = (nsfwTheme = $("#oneechan-options #themes-section>div.nsfw")).exists() ?
  1424. parseInt(nsfwTheme.attr("id").substr(5)) : 0;
  1425.  
  1426. $SS.Config.set("Themes", themes);
  1427. $SS.Config.set("Selected Theme", selectedTheme);
  1428. $SS.Config.set("NSFW Theme", nsfwTheme);
  1429. $SS.Config.set("Hidden Themes", $SS.conf["Hidden Themes"]);
  1430.  
  1431. if ($SS.options.saveAndClose)
  1432. $SS.options.close();
  1433.  
  1434. return $SS.init(true);
  1435. },
  1436. showTheme: function(tIndex) {
  1437. var div, overlay;
  1438.  
  1439. if (typeof tIndex === "number") {
  1440. var bEdit = true,
  1441. tEdit = $SS.conf["Themes"][tIndex],
  1442. RPA, themeR, themePY, themePX, themeA;
  1443.  
  1444. if (tEdit.bgImg && tEdit.bgRPA) {
  1445. RPA = tEdit.bgRPA.split(" ");
  1446. themeR = RPA[0];
  1447. themePY = RPA[1];
  1448. themePX = RPA[2];
  1449. themeA = RPA[3];
  1450. }
  1451. }
  1452.  
  1453. div = $("<div id='add-theme' class='dialog'>");
  1454.  
  1455. var innerHTML = "<label>" +
  1456. "<span class='option-title'>Theme Name:</span><input type=text name=name value='" + (bEdit ? tEdit.name : "") + "'>" +
  1457. "</label><label>" +
  1458. "<span class='option-title'>Author Name:</span><input type=text name=authorName value='" + (bEdit ? (tEdit.authorName !== undefined ? tEdit.authorName : "") : "") + "'>" +
  1459. "</label><label>" +
  1460. "<span class='option-title'>Author Tripcode:</span><input type=text name=authorTrip value='" + (bEdit ? (tEdit.authorTrip !== undefined ? tEdit.authorTrip : "") : "") + "'>" +
  1461. "</label><label>" +
  1462. "<span class='option-title'>BG Image:</span><input type=text name=bgImg value=" + (bEdit ? ($SS.validImageURL(tEdit.bgImg) ? tEdit.bgImg + "" : ($SS.validBase64(tEdit.bgImg) ? tEdit.bgImg : "")) : "") + "></label><label>" +
  1463. "<span class='option-title'>BG Repeat:</span><select name=bgR>" +
  1464. "<option" + (bEdit && themeR === "no-repeat" ? " selected" : "") + ">no-repeat</option>" +
  1465. "<option" + (bEdit && themeR === "repeat" ? " selected" : "") + ">repeat</option>" +
  1466. "<option" + (bEdit && themeR === "repeat-x" ? " selected" : "") + ">repeat-x</option>" +
  1467. "<option" + (bEdit && themeR === "repeat-y" ? " selected" : "") + ">repeat-y</option>" +
  1468. "</select></label><label>" +
  1469. "<span class='option-title'>BG Attachment:</span><select name=bgA>" +
  1470. "<option" + (bEdit && themeA === "fixed" ? " selected" : "") + ">fixed</option>" +
  1471. "<option" + (bEdit && themeA === "scroll" ? " selected" : "") + ">scroll</option>" +
  1472. "</select></label><label>" +
  1473. "<span class='option-title'>BG Position-X:</span><select name=bgPX>" +
  1474. "<option" + (bEdit && themePX === "left" ? " selected" : "") + ">left</option>" +
  1475. "<option" + (bEdit && themePX === "center" ? " selected" : "") + ">center</option>" +
  1476. "<option" + (bEdit && themePX === "right" ? " selected" : "") + ">right</option>" +
  1477. "</select></label><label>" +
  1478. "<span class='option-title'>BG Position-Y:</span><select name=bgPY>" +
  1479. "<option" + (bEdit && themePY === "top" ? " selected" : "") + ">top</option>" +
  1480. "<option" + (bEdit && themePY === "center" ? " selected" : "") + ">center</option>" +
  1481. "<option" + (bEdit && themePY === "bottom" ? " selected" : "") + ">bottom</option>" +
  1482. "</select></label><label>" +
  1483. "<span class='option-title'>Reply Opacity:</span><input type=text name=replyOp value='" + (bEdit ? tEdit.replyOp : "1.0") + "'></label><label>" +
  1484. "<span class='option-title'>Header Opacity:</span><input type=text name=navOp value='" + (bEdit ? tEdit.navOp : "0.9") + "'>" +
  1485. "</label>";
  1486.  
  1487. for (var i = 0, MAX = themeInputs.length; i < MAX; ++i)
  1488. innerHTML += "<label><span class='option-title'>" + themeInputs[i].dName + ":</span>" +
  1489. "<input type=text class=jsColor name=" + themeInputs[i].name + " value=" + (bEdit ? tEdit[themeInputs[i].name] : "") + "></label>";
  1490.  
  1491. innerHTML += "<label id=customCSS><span class='option-title'>Custom CSS:</span><textarea name=customCSS>" + (bEdit ? tEdit.customCSS || "" : "") + "</textarea>" +
  1492. "</label><div>" +
  1493. "<a class='options-button' name=export>Export</a>" +
  1494. "<a class='options-button' name=" + (bEdit ? "edit" : "add") + ">Save</a><a class='options-button' name=cancel>Cancel</a></div>";
  1495.  
  1496. div.html(innerHTML);
  1497. $(".jsColor", div).jsColor();
  1498.  
  1499. overlay = $("<div id=overlay2>").append(div);
  1500.  
  1501. $("a[name=export]", div).bind("click", function() {
  1502. var theme = $SS.options.addTheme(tIndex, true);
  1503. if ($("a[download]", div).exists())
  1504. return;
  1505. var exportalert = $("<a class='options-button'download='" + theme.name + ".json' href='data:application/json," + encodeURIComponent(JSON.stringify(theme)) + "'>Save me!");
  1506. return $(this).replace(exportalert);
  1507. });
  1508.  
  1509. if (bEdit) {
  1510. $("a[name=edit]", div).bind("click", function() {
  1511. $SS.options.addTheme(tIndex);
  1512. $("#overlay").removeClass("previewing");
  1513. });
  1514. $("#overlay").addClass("previewing");
  1515. } else {
  1516. $("a[name=add]", div).bind("click", $SS.options.addTheme);
  1517. $("#overlay").addClass("previewing");
  1518. }
  1519.  
  1520. $("a[name=cancel]", div).bind("click", function() {
  1521. $("#overlay").removeClass("previewing");
  1522. $("#overlay2").remove();
  1523. });
  1524.  
  1525. if (bEdit)
  1526. $("input,textarea,select", div).bind("change", tEdit.mHandler = function() {
  1527. tEdit.modified = true;
  1528. $("input,textarea,select", $("#addTheme")).unbind("change", tEdit.mHandler);
  1529. });
  1530.  
  1531. return $(document.body).append(overlay);
  1532. },
  1533. addTheme: function(tIndex, exp) {
  1534. var overlay = $("#overlay2"),
  1535. tTheme = {},
  1536. makeRPA = function() {
  1537. var RPA = [];
  1538.  
  1539. RPA.push($("select[name=bgR]", overlay).val());
  1540. RPA.push($("select[name=bgPY]", overlay).val());
  1541. RPA.push($("select[name=bgPX]", overlay).val());
  1542. RPA.push($("select[name=bgA]", overlay).val());
  1543.  
  1544. return RPA.join(" ");
  1545. },
  1546. bEdit = typeof tIndex === "number",
  1547. tEdit = bEdit ? $SS.conf["Themes"][tIndex] : null,
  1548. error = false,
  1549. div;
  1550.  
  1551. if (!exp && bEdit && !tEdit.modified)
  1552. return overlay.remove();
  1553.  
  1554. $("input[type=text],textarea", overlay).each(function() {
  1555. var val;
  1556.  
  1557. if (this.name === "bgImg") {
  1558. var b64 = $("input[name=customIMGB64]", overlay);
  1559. val = b64.exists() ? decodeURIComponent(b64.val()) : this.value;
  1560.  
  1561. if (val !== "" && !$SS.validImageURL(val) && !$SS.validBase64(val)) {
  1562. error = true;
  1563. return alert("Not a valid image URL/base64!");
  1564. }
  1565.  
  1566. val = $SS.cleanBase64(val);
  1567.  
  1568. } else if (this.name === "name") {
  1569. val = this.value;
  1570.  
  1571. if (bEdit && tEdit.default && tEdit.name === val)
  1572. val += " [Modded]"
  1573. } else
  1574. val = this.value;
  1575.  
  1576. if (val !== "")
  1577. tTheme[this.name] = val;
  1578. });
  1579.  
  1580. if (error) return;
  1581.  
  1582. if (tTheme.bgImg)
  1583. tTheme.bgRPA = makeRPA();
  1584.  
  1585. if (exp) return tTheme;
  1586.  
  1587. if (bEdit && !tEdit.default) {
  1588. $SS.conf["Themes"][tIndex] = tTheme;
  1589. tTheme = new $SS.Theme(tIndex);
  1590. div = $("#theme" + tIndex, $("#overlay"));
  1591.  
  1592. div.replace(tTheme.preview());
  1593. } else {
  1594. tTheme.author = "You";
  1595. tIndex = $SS.conf["Themes"].push(tTheme);
  1596. tTheme = new $SS.Theme(--tIndex);
  1597. div = tTheme.preview();
  1598.  
  1599. $("#overlay #themes-section").append(div);
  1600. }
  1601.  
  1602. div.fire("click").scrollIntoView(true);
  1603.  
  1604. $("#overlay").removeClass("previewing");
  1605. return overlay.remove();
  1606. },
  1607. deleteTheme: function(tIndex) {
  1608. if ($SS.conf["Themes"][tIndex].default &&
  1609. $SS.conf["Hidden Themes"].push(tIndex) === 1)
  1610. $("#themes-section a[name=restoreThemes]").show();
  1611.  
  1612. return $SS.conf["Themes"][tIndex].default ?
  1613. $("#theme" + tIndex).removeClass("selected").hide() : $("#theme" + tIndex).remove();
  1614. },
  1615. },
  1616.  
  1617. /* THEMES */
  1618. Themes: {
  1619. defaults: [{
  1620. name: "Vimyanized Dark",
  1621. authorName: "Seaweed",
  1622. authorTrip: "!!lq+3fff+/ev",
  1623. "default": true,
  1624. bgImg: false,
  1625. replyOp: "1.0",
  1626. navOp: "0.9",
  1627. bgColor: "090d0f",
  1628. mainColor: "0d1114",
  1629. brderColor: "0b1316",
  1630. inputColor: "090d0f",
  1631. inputbColor: "0d1114",
  1632. blinkColor: "4797cc",
  1633. unreadColor: "4270b2",
  1634. linkColor: "53bdb1",
  1635. linkHColor: "3090b5",
  1636. qlColor: "53bdb1",
  1637. nameColor: "d63e34",
  1638. quoteColor: "96c83b",
  1639. textColor: "f8f8f8",
  1640. tripColor: "d4b63c",
  1641. titleColor: "b88cd1",
  1642. headerColor: "f8f8f8",
  1643. headerLColor: "53bdb1",
  1644. headerLHColor: "3090b5",
  1645. headerBGColor: "0d1114",
  1646. boardColor: "f8f8f8",
  1647. postHLColor: "d4b63c",
  1648. quotesYouHLColor: "d4b63c",
  1649. ownPostHLColor: "d4b63c",
  1650. threadHLColor: "b88cd1",
  1651. replybgHLColor: "090d10",
  1652. replyslctColor: "d4b63c"
  1653. }, {
  1654. name: "Muted",
  1655. authorName: "Seaweed",
  1656. authorTrip: "!!lq+3fff+/ev",
  1657. "default": true,
  1658. bgImg: false,
  1659. replyOp: "1.0",
  1660. navOp: "0.9",
  1661. bgColor: "ffffff",
  1662. mainColor: "f5f2e9",
  1663. brderColor: "dddddd",
  1664. inputColor: "ffffff",
  1665. inputbColor: "dddddd",
  1666. blinkColor: "bc312a",
  1667. unreadColor: "bc312a",
  1668. linkColor: "bc312a",
  1669. linkHColor: "8e2220",
  1670. qlColor: "bc312a",
  1671. nameColor: "2c64a0",
  1672. quoteColor: "789922",
  1673. textColor: "393735",
  1674. tripColor: "cc6563",
  1675. titleColor: "111111",
  1676. headerColor: "393735",
  1677. headerLColor: "bc312a",
  1678. headerLHColor: "8e2220",
  1679. headerBGColor: "f5f2e9",
  1680. boardColor: "bc312a",
  1681. postHLColor: "cc6563",
  1682. quotesYouHLColor: "2c64a0",
  1683. ownPostHLColor: "cc6563",
  1684. threadHLColor: "111111",
  1685. replybgHLColor: "d9d6cd",
  1686. replyslctColor: "cc6563"
  1687. }, {
  1688. name: "Surf", //Inspired by Blue Tone
  1689. authorName: "nebukazar",
  1690. authorTrip: "!/Am.NeBUqQ",
  1691. "default": true,
  1692. bgImg: false,
  1693. replyOp: "1.0",
  1694. navOp: "1.0",
  1695. mainColor: "242424",
  1696. brderColor: "242424",
  1697. inputColor: "1b1b1b",
  1698. inputbColor: "252525",
  1699. headerBGColor: "242424",
  1700. headerColor: "ffffff",
  1701. boardColor: "ffffff",
  1702. bgColor: "1b1b1b",
  1703. textColor: "ffffff",
  1704. blinkColor: "20548f",
  1705. headerLColor: "20548f",
  1706. headerLHColor: "ffffff",
  1707. linkColor: "808080",
  1708. linkHColor: "ffffff",
  1709. qlColor: "808080",
  1710. nameColor: "20548f",
  1711. tripColor: "808080",
  1712. titleColor: "808080",
  1713. quoteColor: "07992d",
  1714. unreadColor: "ffffff",
  1715. postHLColor: "292929",
  1716. quotesYouHLColor: "ffffff",
  1717. ownPostHLColor: "ffffff",
  1718. threadHLColor: "808080",
  1719. replybgHLColor: "121212",
  1720. replyslctColor: "ffffff"
  1721. }, {
  1722. name: "Stilig",
  1723. authorName: "Myson",
  1724. authorTrip: "!RiDeag.gG.",
  1725. "default": true,
  1726. bgImg: false,
  1727. replyOp: "1.0",
  1728. navOp: "0.9",
  1729. mainColor: "ffffff",
  1730. brderColor: "ebebeb",
  1731. inputColor: "ffffff",
  1732. inputbColor: "dedede",
  1733. headerBGColor: "3d444e",
  1734. headerColor: "ffffff",
  1735. boardColor: "999999",
  1736. bgColor: "f2f2f2",
  1737. textColor: "717171",
  1738. blinkColor: "999999",
  1739. unreadColor: "999999",
  1740. headerLColor: "babcbe",
  1741. headerLHColor: "999999",
  1742. linkColor: "999999",
  1743. linkHColor: "5f5f65",
  1744. qlColor: "999999",
  1745. nameColor: "49637d",
  1746. tripColor: "5f5f65",
  1747. titleColor: "7a7f88",
  1748. quoteColor: "009933",
  1749. postHLColor: "5f5f65",
  1750. quotesYouHLColor: "ff4a3e",
  1751. ownPostHLColor: "5f5f65",
  1752. threadHLColor: "7a7f88",
  1753. replybgHLColor: "e6e6e6",
  1754. replyslctColor: "5f5f65",
  1755. customCSS: ".reply, :root.op-background .postContainer.opContainer {box-shadow: -1px 1px 1px rgba(0,0,0,.08);}"
  1756. }, {
  1757. name: "Minimalistic Mayhem",
  1758. authorName: "Mayhem",
  1759. authorTrip: "!MayhemxaEo",
  1760. "default": true,
  1761. bgImg: false,
  1762. replyOp: "1.0",
  1763. navOp: "0.9",
  1764. bgColor: "191919",
  1765. mainColor: "222222",
  1766. brderColor: "292929",
  1767. inputColor: "222222",
  1768. inputbColor: "151515",
  1769. blinkColor: "897399",
  1770. unreadColor: "897399",
  1771. linkColor: "897399",
  1772. linkHColor: "c617e6",
  1773. qlColor: "897399",
  1774. nameColor: "a34443",
  1775. quoteColor: "8ba446",
  1776. textColor: "bbbbbb",
  1777. tripColor: "96562c",
  1778. titleColor: "987d3e",
  1779. headerColor: "bbbbbb",
  1780. headerLColor: "897399",
  1781. headerLHColor: "c617e6",
  1782. headerBGColor: "222222",
  1783. boardColor: "bbbbbb",
  1784. postHLColor: "96562c",
  1785. quotesYouHLColor: "96562c",
  1786. ownPostHLColor: "96562c",
  1787. threadHLColor: "987d3e",
  1788. replybgHLColor: "141414",
  1789. replyslctColor: "96562c"
  1790. }, {
  1791. name: "Blackboard",
  1792. authorName: "Seaweed",
  1793. authorTrip: "!!lq+3fff+/ev",
  1794. "default": true,
  1795. bgImg: false,
  1796. replyOp: "1.0",
  1797. navOp: "0.9",
  1798. bgColor: "0a0d1c",
  1799. mainColor: "0c1021",
  1800. brderColor: "0e1228",
  1801. inputColor: "0c1021",
  1802. inputbColor: "080b16",
  1803. blinkColor: "54b12e",
  1804. unreadColor: "8da6ce",
  1805. linkColor: "fbde2d",
  1806. linkHColor: "4b65cc",
  1807. qlColor: "fbde2d",
  1808. nameColor: "8da6ce",
  1809. quoteColor: "9acf08",
  1810. textColor: "f8f8f8",
  1811. tripColor: "ff6400",
  1812. titleColor: "ff6400",
  1813. headerColor: "f8f8f8",
  1814. headerLColor: "fbde2d",
  1815. headerLHColor: "4b65cc",
  1816. headerBGColor: "0c1021",
  1817. boardColor: "f8f8f8",
  1818. postHLColor: "ff6400",
  1819. quotesYouHLColor: "ff6400",
  1820. ownPostHLColor: "ff6400",
  1821. threadHLColor: "ff6400",
  1822. replybgHLColor: "080c1d",
  1823. replyslctColor: "ff6400"
  1824. }, {
  1825. name: "Dark Flat",
  1826. authorName: "ahodesuka",
  1827. authorTrip: "!.pC/AHOKAg",
  1828. "default": true,
  1829. bgImg: "R0lGODlhAwADAIAAAB0dHRkZGSH5BADoAwAALAAAAAADAAMAAAIDDG5YADs=",
  1830. bgRPA: "repeat top left fixed",
  1831. replyOp: "1.0",
  1832. navOp: "0.9",
  1833. bgRPA: "repeat top left fixed",
  1834. bgColor: "1C1D1E",
  1835. mainColor: "232425",
  1836. brderColor: "292a2b",
  1837. inputColor: "18191a",
  1838. inputbColor: "121314",
  1839. blinkColor: "6f99b4",
  1840. unreadColor: "ac9bb0",
  1841. linkColor: "ac9bb0",
  1842. linkHColor: "6f99b4",
  1843. qlColor: "ac9bb0",
  1844. nameColor: "a8c6d9",
  1845. quoteColor: "b3c45e",
  1846. textColor: "dddddd",
  1847. tripColor: "d4c095",
  1848. titleColor: "9390c9",
  1849. headerColor: "dddddd",
  1850. headerLColor: "ac9bb0",
  1851. headerLHColor: "6f99b4",
  1852. headerBGColor: "232425",
  1853. boardColor: "dddddd",
  1854. postHLColor: "d4c095",
  1855. quotesYouHLColor: "d4c095",
  1856. ownPostHLColor: "d4c095",
  1857. threadHLColor: "9390c9",
  1858. replybgHLColor: "171919",
  1859. replyslctColor: "d4c095"
  1860. }, {
  1861. name: "Yukimura",
  1862. authorName: "the real",
  1863. authorTrip: "!eKISSUy3/c",
  1864. "default": true,
  1865. bgImg: false,
  1866. replyOp: "1.0",
  1867. navOp: "0.9",
  1868. mainColor: "1b1b1b",
  1869. brderColor: "191919",
  1870. inputColor: "1b1b1b",
  1871. inputbColor: "1b1b1b",
  1872. headerBGColor: "1b1b1b",
  1873. headerColor: "e3c2b3",
  1874. boardColor: "e3c2b3",
  1875. bgColor: "171717",
  1876. textColor: "e3c2b3",
  1877. blinkColor: "5c433c",
  1878. headerLColor: "e96a81",
  1879. headerLHColor: "e96a81",
  1880. linkColor: "e96a81",
  1881. linkHColor: "e96a81",
  1882. qlColor: "e96a81",
  1883. nameColor: "e96a81",
  1884. tripColor: "5c433c",
  1885. titleColor: "5c433c",
  1886. quoteColor: "b3c45e",
  1887. unreadColor: "5c433c",
  1888. postHLColor: "5c433c",
  1889. quotesYouHLColor: "d63e34",
  1890. ownPostHLColor: "5c433c",
  1891. threadHLColor: "5c433c",
  1892. replybgHLColor: "0d0d0d",
  1893. replyslctColor: "5c433c"
  1894. }, {
  1895. name: "Photons + Odin",
  1896. authorName: "John",
  1897. authorTrip: "!Hu6tDS8lls",
  1898. "default": true,
  1899. bgImg: "R0lGODlhAwADAIAAAB0dHRkZGSH5BADoAwAALAAAAAADAAMAAAIDDG5YADs=",
  1900. bgRPA: "repeat top left fixed",
  1901. replyOp: "1.0",
  1902. navOp: "0.9",
  1903. mainColor: "1a1a1a",
  1904. brderColor: "1f1f1f",
  1905. inputColor: "18191a",
  1906. inputbColor: "121314",
  1907. headerBGColor: "1a1a1a",
  1908. headerColor: "dddddd",
  1909. boardColor: "dddddd",
  1910. bgColor: "202020",
  1911. textColor: "dddddd",
  1912. blinkColor: "c72d41",
  1913. headerLColor: "737f88",
  1914. headerLHColor: "4f585d",
  1915. linkColor: "737f88",
  1916. linkHColor: "4f585d",
  1917. qlColor: "737f88",
  1918. nameColor: "0099bc",
  1919. tripColor: "ff0085",
  1920. titleColor: "ffa600",
  1921. quoteColor: "85c600",
  1922. unreadColor: "446a6d",
  1923. postHLColor: "ff0085",
  1924. quotesYouHLColor: "ff0085",
  1925. ownPostHLColor: "ff0085",
  1926. threadHLColor: "ffa600",
  1927. replybgHLColor: "0d0d0d",
  1928. replyslctColor: "ff0085"
  1929. }, {
  1930. name: "Photon",
  1931. authorName: "Seaweed",
  1932. authorTrip: "!!lq+3fff+/ev",
  1933. "default": true,
  1934. bgImg: false,
  1935. replyOp: "1.0",
  1936. navOp: "0.9",
  1937. bgColor: "eeeeee",
  1938. mainColor: "dddddd",
  1939. brderColor: "c4c4c4",
  1940. inputColor: "ffffff",
  1941. inputbColor: "cccccc",
  1942. blinkColor: "111111",
  1943. unreadColor: "ff6600",
  1944. linkColor: "ff6600",
  1945. linkHColor: "ff3300",
  1946. qlColor: "ff6600",
  1947. nameColor: "004a99",
  1948. quoteColor: "789922",
  1949. textColor: "333333",
  1950. tripColor: "ff3300",
  1951. titleColor: "002244",
  1952. headerColor: "333333",
  1953. headerLColor: "ff6600",
  1954. headerLHColor: "ff3300",
  1955. headerBGColor: "dddddd",
  1956. boardColor: "004a99",
  1957. postHLColor: "ff3300",
  1958. quotesYouHLColor: "004a99",
  1959. ownPostHLColor: "ff3300",
  1960. threadHLColor: "002244",
  1961. replybgHLColor: "c4c4c4",
  1962. replyslctColor: "ff3300"
  1963. }, {
  1964. name: "Original Minimalistic Mayhem",
  1965. authorName: "Mayhem",
  1966. authorTrip: "!MayhemxaEo",
  1967. "default": true,
  1968. bgImg: false,
  1969. replyOp: "1.0",
  1970. navOp: "0.9",
  1971. bgColor: "191919",
  1972. mainColor: "333333",
  1973. brderColor: "111111",
  1974. inputColor: "222222",
  1975. inputbColor: "151515",
  1976. blinkColor: "559c7a",
  1977. unreadColor: "559c7a",
  1978. linkColor: "559c7a",
  1979. linkHColor: "c7de1a",
  1980. qlColor: "559c7a",
  1981. nameColor: "2e88a6",
  1982. quoteColor: "8ba446",
  1983. textColor: "dddddd",
  1984. tripColor: "8c5d2a",
  1985. titleColor: "486273",
  1986. headerColor: "dddddd",
  1987. headerLColor: "559c7a",
  1988. headerLHColor: "c7de1a",
  1989. headerBGColor: "333333",
  1990. boardColor: "dddddd",
  1991. postHLColor: "8c5d2a",
  1992. quotesYouHLColor: "8c5d2a",
  1993. ownPostHLColor: "8c5d2a",
  1994. threadHLColor: "486273",
  1995. replybgHLColor: "25262a",
  1996. replyslctColor: "8c5d2a"
  1997. }, {
  1998. name: "Tomorrow",
  1999. authorName: "Seaweed",
  2000. authorTrip: "!!lq+3fff+/ev",
  2001. "default": true,
  2002. bgImg: false,
  2003. replyOp: "1.0",
  2004. navOp: "0.9",
  2005. bgColor: "1d1f21",
  2006. mainColor: "282a2e",
  2007. brderColor: "373b41",
  2008. inputColor: "282a2e",
  2009. inputbColor: "1d1f21",
  2010. blinkColor: "5f89ac",
  2011. unreadColor: "81a2be",
  2012. linkColor: "81a2be",
  2013. linkHColor: "cc6666",
  2014. qlColor: "81a2be",
  2015. nameColor: "81a2be",
  2016. quoteColor: "b5bd68",
  2017. textColor: "c5c8c6",
  2018. tripColor: "8abeb7",
  2019. titleColor: "b294bb",
  2020. headerColor: "c5c8c6",
  2021. headerLColor: "81a2be",
  2022. headerLHColor: "cc6666",
  2023. headerBGColor: "282a2e",
  2024. boardColor: "c5c8c6",
  2025. postHLColor: "8abeb7",
  2026. quotesYouHLColor: "8abeb7",
  2027. ownPostHLColor: "8abeb7",
  2028. threadHLColor: "b294bb",
  2029. replybgHLColor: "24262a",
  2030. replyslctColor: "8abeb7",
  2031. customCSS: "span.postNum.desktop > a {\ncolor: #c5c8c6 !important\n}\nspan.postNum.desktop > a:hover {\ncolor: #81a2be !important\n}"
  2032. }, {
  2033. name: "Yotsuba",
  2034. authorName: "moot",
  2035. authorTrip: "!Εр8рui8Vw2",
  2036. "default": true,
  2037. bgImg: "iVBORw0KGgoAAAANSUhEUgAAAAEAAADICAIAAACmkByiAAAAWElEQVR4AaWSwQ3AIAwDbfbfpdt0nKrPUp3QCfHgkfjsCMh47mskmU5HGvbmuuh9dVce8M4it/SfMZglGeZx/ccyu/Vsv4/N29f331AY5Bi3+hdo4A92+wXvCwR9mXztrAAAAABJRU5ErkJggg==",
  2038. bgRPA: "repeat-x top center scroll",
  2039. replyOp: "1.0",
  2040. navOp: "0.9",
  2041. bgColor: "ffffee",
  2042. mainColor: "f0e0d6",
  2043. brderColor: "d9bFb7",
  2044. inputColor: "ffffff",
  2045. inputbColor: "aaaaaa",
  2046. blinkColor: "800000",
  2047. unreadColor: "000080",
  2048. linkColor: "0000ee",
  2049. linkHColor: "dd0000",
  2050. qlColor: "000080",
  2051. nameColor: "117743",
  2052. quoteColor: "789922",
  2053. textColor: "800000",
  2054. tripColor: "228854",
  2055. titleColor: "cc1105",
  2056. headerColor: "800000",
  2057. headerLColor: "800000",
  2058. headerLHColor: "dd0000",
  2059. headerBGColor: "f0e0d6",
  2060. boardColor: "800000",
  2061. postHLColor: "228854",
  2062. quotesYouHLColor: "dd0000",
  2063. ownPostHLColor: "228854",
  2064. threadHLColor: "dd0000",
  2065. replybgHLColor: "d6bad0",
  2066. replyslctColor: "228854",
  2067. customCSS: "span.postNum.desktop > a {\ncolor: #800000 !important\n}\nspan.postNum.desktop > a:hover {\ncolor: #dd0000 !important\n}\n.menu-button {\ncolor: #800000 !important\n}"
  2068. }, {
  2069. name: "Yotsuba B",
  2070. authorName: "moot",
  2071. authorTrip: "!Εр8рui8Vw2",
  2072. "default": true,
  2073. bgImg: "iVBORw0KGgoAAAANSUhEUgAAAAEAAADICAIAAACmkByiAAAASUlEQVR4AcWRuQ0AIBDDzuy/HAVrMAM9slCorqAJziNgrj2qSg/cGhHnjPqDDPxOfYiebwFj+XobeLGI7p39fW1/Ib58d55Bwh3x9wRv6r75UwAAAABJRU5ErkJggg==",
  2074. bgRPA: "repeat-x top center scroll",
  2075. replyOp: "1.0",
  2076. navOp: "0.9",
  2077. bgColor: "eef2ff",
  2078. mainColor: "d6daf0",
  2079. brderColor: "b7c5d9",
  2080. inputColor: "ffffff",
  2081. inputbColor: "aaaaaa",
  2082. blinkColor: "34345c",
  2083. unreadColor: "34345C",
  2084. linkColor: "34345c",
  2085. linkHColor: "dd0000",
  2086. qlColor: "dd0000",
  2087. nameColor: "117743",
  2088. quoteColor: "789922",
  2089. textColor: "000000",
  2090. tripColor: "228854",
  2091. titleColor: "0f0c5d",
  2092. headerColor: "34345c",
  2093. headerLColor: "34345c",
  2094. headerLHColor: "dd0000",
  2095. headerBGColor: "d6daf0",
  2096. boardColor: "af0a0f",
  2097. postHLColor: "228854",
  2098. quotesYouHLColor: "228854",
  2099. ownPostHLColor: "228854",
  2100. threadHLColor: "dd0000",
  2101. replybgHLColor: "d6bad0",
  2102. replyslctColor: "228854",
  2103. customCSS: "span.postNum.desktop > a {\ncolor: #000000 !important\n}\nspan.postNum.desktop > a:hover {\ncolor: #dd0000 !important\n}"
  2104. }, {
  2105. name: "Yotsuba Purple",
  2106. authorName: "Seaweed",
  2107. authorTrip: "!!lq+3fff+/ev",
  2108. "default": true,
  2109. bgImg: false,
  2110. replyOp: "1.0",
  2111. navOp: "0.9",
  2112. bgColor: "f8f3fe",
  2113. mainColor: "eeddff",
  2114. brderColor: "cab7d9",
  2115. inputColor: "ffffff",
  2116. inputbColor: "cab7d9",
  2117. blinkColor: "000000",
  2118. unreadColor: "962594",
  2119. linkColor: "962594",
  2120. linkHColor: "b22caa",
  2121. qlColor: "b22caa",
  2122. nameColor: "591177",
  2123. quoteColor: "789922",
  2124. textColor: "000000",
  2125. tripColor: "b22caa",
  2126. titleColor: "0f0c5d",
  2127. headerColor: "000000",
  2128. headerLColor: "962594",
  2129. headerLHColor: "b22caa",
  2130. headerBGColor: "eeddff",
  2131. boardColor: "591177",
  2132. postHLColor: "b22caa",
  2133. quotesYouHLColor: "d63e34",
  2134. ownPostHLColor: "b22caa",
  2135. threadHLColor: "0f0c5d",
  2136. replybgHLColor: "b7aac4",
  2137. replyslctColor: "b22caa"
  2138. }, {
  2139. name: "安心院なじみ",
  2140. authorName: "ahodesuka",
  2141. authorTrip: "!.pC/AHOKAg",
  2142. "default": true,
  2143. bgImg: false,
  2144. replyOp: "1.0",
  2145. navOp: "0.9",
  2146. bgColor: "ffffff",
  2147. mainColor: "efefef",
  2148. brderColor: "d6d6d6",
  2149. inputColor: "cccccc",
  2150. inputbColor: "bbbbbb",
  2151. blinkColor: "f5871f",
  2152. unreadColor: "bf8040",
  2153. linkColor: "bf8040",
  2154. linkHColor: "bf8040",
  2155. qlColor: "bf8040",
  2156. nameColor: "2b80c2",
  2157. quoteColor: "718c00",
  2158. textColor: "4d4d4c",
  2159. tripColor: "3e999f",
  2160. titleColor: "4d4d4d",
  2161. headerColor: "4d4d4c",
  2162. headerLColor: "bf8040",
  2163. headerLHColor: "bf8040",
  2164. headerBGColor: "efefef",
  2165. boardColor: "4d4d4c",
  2166. postHLColor: "3e999f",
  2167. quotesYouHLColor: "3e999f",
  2168. ownPostHLColor: "3e999f",
  2169. threadHLColor: "4d4d4d",
  2170. replybgHLColor: "c7c7c7",
  2171. replyslctColor: "3e999f"
  2172. }, {
  2173. name: "Solarized Dark", // http://ethanschoonover.com/solarized
  2174. authorName: "ubuntufriend",
  2175. authorTrip: "!UbuntuBReY!!iizPaxgtRk3",
  2176. "default": true,
  2177. bgImg: false,
  2178. replyOp: "1.0",
  2179. navOp: "0.9",
  2180. bgColor: "073642",
  2181. mainColor: "032b36",
  2182. brderColor: "133942",
  2183. inputColor: "073642",
  2184. inputbColor: "0d272e",
  2185. blinkColor: "4f5f8f",
  2186. unreadColor: "696fc0",
  2187. linkColor: "696bba",
  2188. linkHColor: "d33682",
  2189. qlColor: "696bba",
  2190. nameColor: "586e75",
  2191. quoteColor: "859900",
  2192. textColor: "93a1a1",
  2193. tripColor: "2aa198",
  2194. titleColor: "bec2c4",
  2195. headerColor: "93a1a1",
  2196. headerLColor: "696bba",
  2197. headerLHColor: "d33682",
  2198. headerBGColor: "032b36",
  2199. boardColor: "93a1a1",
  2200. postHLColor: "2aa198",
  2201. quotesYouHLColor: "2aa198",
  2202. ownPostHLColor: "2aa198",
  2203. threadHLColor: "bec2c4",
  2204. replybgHLColor: "073642",
  2205. replyslctColor: "2aa198"
  2206. }, {
  2207. name: "4chan Rewired Modded", // Originally by !K.WeEabo0o, modded by ahoka
  2208. authorName: "ahodesuka",
  2209. authorTrip: "!.pC/AHOKAg",
  2210. "default": true,
  2211. bgImg: false,
  2212. replyOp: "1.0",
  2213. navOp: "0.9",
  2214. bgColor: "f4f4f4",
  2215. mainColor: "efefef",
  2216. brderColor: "d4d4d4",
  2217. inputColor: "e4e4e4",
  2218. inputbColor: "cccccc",
  2219. blinkColor: "bf7f3f",
  2220. unreadColor: "bf7f3f",
  2221. linkColor: "bf7f3f",
  2222. linkHColor: "d33682",
  2223. nameColor: "4c4c4c",
  2224. quoteColor: "6b7a1e",
  2225. textColor: "4c4c4c",
  2226. tripColor: "bf7f3f",
  2227. titleColor: "4c4c4c",
  2228. headerColor: "4c4c4c",
  2229. headerLColor: "bf7f3f",
  2230. headerLHColor: "d33682",
  2231. headerBGColor: "efefef",
  2232. boardColor: "4c4c4c",
  2233. postHLColor: "bf7f3f",
  2234. quotesYouHLColor: "d63e34",
  2235. ownPostHLColor: "bf7f3f",
  2236. threadHLColor: "4c4c4c",
  2237. replybgHLColor: "c7c7c7",
  2238. replyslctColor: "bf7f3f"
  2239. }, {
  2240. name: "Yasashii",
  2241. authorName: "nebukazar",
  2242. authorTrip: "!/Am.NeBUqQ",
  2243. "default": true,
  2244. bgImg: false,
  2245. replyOp: "1.0",
  2246. navOp: "0.9",
  2247. mainColor: "f8f8f8",
  2248. brderColor: "f8f8f8",
  2249. inputColor: "f8f8f8",
  2250. inputbColor: "be7375",
  2251. headerBGColor: "a6586f",
  2252. headerColor: "f8f8f8",
  2253. boardColor: "a6586f",
  2254. bgColor: "ebebeb",
  2255. textColor: "5b5c5c",
  2256. blinkColor: "656599",
  2257. headerLColor: "ebebeb",
  2258. headerLHColor: "656599",
  2259. linkColor: "b78087",
  2260. linkHColor: "c8ab78",
  2261. qlColor: "b78087",
  2262. nameColor: "be7375",
  2263. tripColor: "656599",
  2264. titleColor: "b87d6e",
  2265. quoteColor: "7eba6c",
  2266. unreadColor: "f8f8f8",
  2267. postHLColor: "9875a3",
  2268. quotesYouHLColor: "656599",
  2269. ownPostHLColor: "9875a3",
  2270. threadHLColor: "b87d6e",
  2271. replybgHLColor: "eaeaea",
  2272. replyslctColor: "9875a3"
  2273. }, {
  2274. name: "AppChan", // Originally by Zixaphir @ http://userstyles.org/styles/54149/appchan
  2275. authorName: "Zixaphir",
  2276. authorTrip: "!M.........",
  2277. "default": true,
  2278. bgImg: false,
  2279. replyOp: "1.0",
  2280. navOp: "0.9",
  2281. bgColor: "2c2c2c",
  2282. mainColor: "333333",
  2283. brderColor: "333333",
  2284. inputColor: "333333",
  2285. inputbColor: "2c2c2c",
  2286. blinkColor: "4f5f8f",
  2287. unreadColor: "6688aa",
  2288. linkColor: "6688aa",
  2289. linkHColor: "6688aa",
  2290. qlColor: "6688aa",
  2291. nameColor: "aaaaaa",
  2292. quoteColor: "789922",
  2293. textColor: "aaaaaa",
  2294. tripColor: "aaaaaa",
  2295. titleColor: "aaaaaa",
  2296. headerColor: "aaaaaa",
  2297. headerLColor: "6688aa",
  2298. headerLHColor: "6688aa",
  2299. headerBGColor: "333333",
  2300. boardColor: "aaaaaa",
  2301. postHLColor: "aaaaaa",
  2302. quotesYouHLColor: "aaaaaa",
  2303. ownPostHLColor: "aaaaaa",
  2304. threadHLColor: "aaaaaa",
  2305. replybgHLColor: "282828",
  2306. replyslctColor: "aaaaaa"
  2307. }, {
  2308. name: "Zenburned",
  2309. authorName: "lazy",
  2310. authorTrip: "!HONKYn7h1.",
  2311. "default": true,
  2312. bgImg: false,
  2313. replyOp: "1.0",
  2314. navOp: "0.9",
  2315. bgColor: "3f3f3f",
  2316. mainColor: "575757",
  2317. brderColor: "5e5e5e",
  2318. inputColor: "454545",
  2319. inputbColor: "888888",
  2320. blinkColor: "dca3a3",
  2321. unreadColor: "93b3a3",
  2322. linkColor: "efdcbc",
  2323. linkHColor: "f8f893",
  2324. qlColor: "efdcbc",
  2325. nameColor: "c0bed1",
  2326. quoteColor: "7f9f7f",
  2327. textColor: "dcdccc",
  2328. tripColor: "8cd0d3",
  2329. titleColor: "aaaaaa",
  2330. headerColor: "dcdccc",
  2331. headerLColor: "efdcbc",
  2332. headerLHColor: "f8f893",
  2333. headerBGColor: "575757",
  2334. boardColor: "dcdccc",
  2335. postHLColor: "8cd0d3",
  2336. quotesYouHLColor: "8cd0d3",
  2337. ownPostHLColor: "8cd0d3",
  2338. threadHLColor: "aaaaaa",
  2339. replybgHLColor: "494949",
  2340. replyslctColor: "8cd0d3"
  2341. }, {
  2342. name: "Monokai",
  2343. authorName: "Seaweed",
  2344. authorTrip: "!!lq+3fff+/ev",
  2345. "default": true,
  2346. replyOp: "1.0",
  2347. navOp: "0.9",
  2348. bgColor: "20211c",
  2349. mainColor: "272822",
  2350. brderColor: "2d2e27",
  2351. inputColor: "20211c",
  2352. inputbColor: "171713",
  2353. blinkColor: "f92672",
  2354. unreadColor: "e2db74",
  2355. linkColor: "e2db74",
  2356. linkHColor: "ae81ff",
  2357. qlColor: "e2db74",
  2358. nameColor: "5ac0cc",
  2359. quoteColor: "a2cc28",
  2360. textColor: "f8f8f2",
  2361. tripColor: "fa8220",
  2362. titleColor: "ae81ff",
  2363. headerColor: "f8f8f2",
  2364. headerLColor: "e2db74",
  2365. headerLHColor: "ae81ff",
  2366. headerBGColor: "272822",
  2367. boardColor: "f8f8f2",
  2368. postHLColor: "fa8220",
  2369. quotesYouHLColor: "fa8220",
  2370. ownPostHLColor: "fa8220",
  2371. threadHLColor: "ae81ff",
  2372. replybgHLColor: "23241e",
  2373. replyslctColor: "fa8220"
  2374. }, {
  2375. name: "Ao ni sarasu", // based on jaygeegeegee's http://userstyles.org/styles/75602/last-fm-kind-of-blue
  2376. authorName: "Seaweed",
  2377. authorTrip: "!!lq+3fff+/ev",
  2378. "default": true,
  2379. replyOp: "1.0",
  2380. navOp: "0.9",
  2381. bgColor: "e9eced",
  2382. mainColor: "e3e7e8",
  2383. brderColor: "cccccc",
  2384. inputColor: "e9eced",
  2385. inputbColor: "cccccc",
  2386. blinkColor: "477085",
  2387. unreadColor: "477085",
  2388. linkColor: "477085",
  2389. linkHColor: "5d6678",
  2390. qlColor: "477085",
  2391. nameColor: "4c4c4c",
  2392. quoteColor: "6b7a1e",
  2393. textColor: "4c4c4c",
  2394. tripColor: "5d6678",
  2395. titleColor: "617d6f",
  2396. headerColor: "4c4c4c",
  2397. headerLColor: "477085",
  2398. headerLHColor: "5d6678",
  2399. headerBGColor: "e3e7e8",
  2400. boardColor: "477085",
  2401. postHLColor: "5d6678",
  2402. quotesYouHLColor: "d63e34",
  2403. ownPostHLColor: "5d6678",
  2404. threadHLColor: "617d6f",
  2405. replybgHLColor: "d5dada",
  2406. replyslctColor: "5d6678"
  2407. }, {
  2408. name: "Blue Tone",
  2409. authorName: "Leagle",
  2410. authorTrip: "!YoGiiH6Oi.",
  2411. "default": true,
  2412. replyOp: "1.0",
  2413. navOp: "0.9",
  2414. mainColor: "222222",
  2415. brderColor: "222222",
  2416. inputColor: "18191a",
  2417. inputbColor: "121314",
  2418. headerBGColor: "131313",
  2419. headerColor: "dddddd",
  2420. boardColor: "dddddd",
  2421. bgColor: "1b1b1b",
  2422. textColor: "a0a0a0",
  2423. blinkColor: "3296c8",
  2424. headerLColor: "3296c8",
  2425. headerLHColor: "dddddd",
  2426. linkColor: "a0a0a0",
  2427. linkHColor: "dddddd",
  2428. qlColor: "3296c8",
  2429. nameColor: "dddddd",
  2430. tripColor: "dddddd",
  2431. titleColor: "a0a0a0",
  2432. quoteColor: "009933",
  2433. unreadColor: "3296c8",
  2434. postHLColor: "ffffff",
  2435. quotesYouHLColor: "ffffff",
  2436. ownPostHLColor: "ffffff",
  2437. threadHLColor: "a0a0a0",
  2438. replybgHLColor: "141414",
  2439. replyslctColor: "ffffff",
  2440. customCSS: ".boardBanner .boardTitle {\ntext-shadow: 0 0 3px #a0a0a0 !important;\nletter-spacing: 0px !important;\npadding-top: 30px !important;\n}"
  2441. }, {
  2442. name: "Cold Snap",
  2443. authorName: "Kori",
  2444. authorTrip: "!STRaW/KORI",
  2445. "default": true,
  2446. replyOp: "1.0",
  2447. navOp: "0.9",
  2448. mainColor: "fcfcfc",
  2449. brderColor: "ebebeb",
  2450. inputColor: "ffffff",
  2451. inputbColor: "ffffff",
  2452. headerBGColor: "ffffff",
  2453. headerColor: "aaaaaa",
  2454. boardColor: "6699cc",
  2455. bgColor: "ffffff",
  2456. textColor: "232323",
  2457. blinkColor: "6699cc",
  2458. headerLColor: "aaaaaa",
  2459. headerLHColor: "6699cc",
  2460. linkColor: "6699cc",
  2461. linkHColor: "6699cc",
  2462. qlColor: "6699cc",
  2463. nameColor: "aaaaaa",
  2464. tripColor: "476b8f",
  2465. titleColor: "909090",
  2466. quoteColor: "83bf57",
  2467. unreadColor: "6699cc",
  2468. postHLColor: "476b8f",
  2469. quotesYouHLColor: "476b8f",
  2470. ownPostHLColor: "476b8f",
  2471. threadHLColor: "909090",
  2472. replybgHLColor: "eeeeee",
  2473. replyslctColor: "476b8f"
  2474. }, {
  2475. name: "Midnight Caek",
  2476. authorName: "Zixaphir",
  2477. authorTrip: "!M.........",
  2478. "default": true,
  2479. replyOp: "1.0",
  2480. navOp: "0.9",
  2481. mainColor: "1c1c1c",
  2482. brderColor: "1c1c1c",
  2483. inputColor: "1c1c1c",
  2484. inputbColor: "1c1c1c",
  2485. headerBGColor: "101010",
  2486. headerColor: "909090",
  2487. boardColor: "909090",
  2488. bgColor: "101010",
  2489. textColor: "909090",
  2490. blinkColor: "424247",
  2491. headerLColor: "909090",
  2492. headerLHColor: "47475b",
  2493. linkColor: "57577b",
  2494. linkHColor: "47475b",
  2495. qlColor: "57577b",
  2496. nameColor: "7c2d2d",
  2497. tripColor: "3e7157",
  2498. titleColor: "aaaaaa",
  2499. quoteColor: "71793e",
  2500. unreadColor: "57577b",
  2501. postHLColor: "ffffff",
  2502. quotesYouHLColor: "7c2d2d",
  2503. ownPostHLColor: "ffffff",
  2504. threadHLColor: "aaaaaa",
  2505. replybgHLColor: "0e0e0e",
  2506. replyslctColor: "ffffff"
  2507. }],
  2508.  
  2509. init: function() {
  2510. $SS.conf["Themes"] = Array.isArray($SS.conf["Themes"]) ?
  2511. this.defaults.concat($SS.conf["Themes"]) : this.defaults.slice(0);
  2512.  
  2513. var i = $SS.location.nsfw ?
  2514. $SS.conf["NSFW Theme"] : $SS.conf["Selected Theme"],
  2515. tIndex = $SS.conf["Themes"][i] ? i : 0;
  2516.  
  2517. $SS.theme = new $SS.Theme(tIndex); // Set the active theme.
  2518. }
  2519. },
  2520.  
  2521. classes: {
  2522. init: function() {
  2523. /* Function arguments: ("Option Name", value, "class-name") */
  2524. $("html").addClass("oneechan");
  2525. $SS.theme.textColor.isLight ? $("html").addClass("isLight") : "";
  2526. $SS.theme.bgColor.isLight ? "" : $("html").addClass("dark-captcha");
  2527. $("html").optionClass("Underline QuoteLinks", true, "underline-quotes");
  2528. $("html").optionClass("Underline All Links", false, "underline-disabled");
  2529. $("html").optionClass("Rounded Corners", true, "rounded-corners");
  2530. $("html").optionClass("Show Board Name", false, "hide-board-name");
  2531. $("html").optionClass("Fit Width", true, "reply-fit-width");
  2532. $("html").optionClass("Show Banner", false, "hide-banner");
  2533. $("html").optionClass("Reduce Banner Opacity", true, "banner-opacity");
  2534. $("html").optionClass("Show Board Banners", false, "hide-board-banners");
  2535. $("html").optionClass("Show Reply to Thread Button", false, "hide-button");
  2536. $("html").optionClass("Show Reply Header", true, "post-info");
  2537. $("html").optionClass("Show File Info", false, "show-file-info");
  2538. $("html").optionClass("Borders", 2, "borders-all");
  2539. $("html").optionClass("Borders", 3, "borders-none");
  2540. $("html").optionClass("Highlight (OP) quotes", true, "highlight-opQuotes");
  2541. $("html").optionClass("Highlight (You) quotes", true, "highlight-youQuotes");
  2542. $("html").optionClass("Post Decoration Style", 1, "hl-border");
  2543. $("html").optionClass("Post Decoration Style", 2, "hl-outline");
  2544. $("html").optionClass("Post Decoration Style", 3, "hl-border-down");
  2545. $("html").optionClass("Sidebar Position", 1, "right-sidebar");
  2546. $("html").optionClass("Sidebar Position", 2, "left-sidebar");
  2547. $("html").optionClass("Minimal Sidebar", true, "mini-sidebar");
  2548. $("html").optionClass("Recolor Even Replies", true, "recolor-even");
  2549. $("html").optionClass("Backlink Icons", true, "backlink-icon");
  2550. $("html").optionClass("Backlinks on Bottom", true, "backlink-bottom");
  2551. $("html").optionClass("Autohide Style", 2, "vertical-qr");
  2552. $("html").optionClass("Autohide Style", 3, "fade-qr");
  2553. $("html").optionClass("Transparent QR", true, "qr-opacity");
  2554. $("html").optionClass("Remove Background", true, "qr-background");
  2555. $("html").optionClass("Remove Controls", true, "qr-controls");
  2556. $("html").optionClass("Force QR to Sidebar Size", true, "force-qr");
  2557. $("html").optionClass("Indent OP", false, "force-indent");
  2558. $("html").optionClass("Allow Wrapping Around OP", false, "force-wrapping");
  2559. $("html").optionClass("OP Background", true, "op-background");
  2560. $("html").optionClass("Expanding Form Inputs", true, "expand-inputs");
  2561. $("html").optionClass("Show Header Background Gradient", true, "header-gradient");
  2562. $("html").optionClass("Show Header Shadow", false, "header-shadow");
  2563. $("html").optionClass("Highlight Current Board", false, "header-highlight");
  2564. $("html").optionClass("Show Blotter", false, "hide-blotter");
  2565. $("html").optionClass("Show 4chan Ads", true, "show-ads");
  2566. $("html").optionClass("Show Top Ad", false, "hide-top");
  2567. $("html").optionClass("Show Middle Ad", false, "hide-middle");
  2568. $("html").optionClass("Show Bottom Ad", false, "hide-bottom");
  2569. $("html").optionClass("Show Navigation Links", false, "hide-navlinks");
  2570. $("html").optionClass("Show Top Links", false, "hide-navlinktop");
  2571. $("html").optionClass("Show Bottom Links", false, "hide-navlinkbot");
  2572. $("html").optionClass("Reduce Ad Opacity", true, "ad-opacity");
  2573. $("html").optionClass("Reduce Thumbnail Opacity", true, "thumb-opacity");
  2574. $("html").optionClass("Justified Text", true, "catalog-justify");
  2575. $("html").optionClass("Show Background", true, "catalog-background");
  2576. $("html").optionClass("Unified Thumbnail Size", true, "catalog-thumbsize");
  2577. }
  2578. },
  2579.  
  2580. jscolor: {
  2581. getElementPos: function(e) {
  2582. var e1 = e,
  2583. e2 = e;
  2584. var x = 0,
  2585. y = 0;
  2586.  
  2587. if (e1.offsetParent)
  2588. do {
  2589. x += e1.offsetLeft;
  2590. y += e1.offsetTop;
  2591. }
  2592. while (e1 = e1.offsetParent);
  2593.  
  2594. while ((e2 = e2.parentNode) && e2.nodeName.toUpperCase() !== "BODY") {
  2595. x -= e2.scrollLeft;
  2596. y -= e2.scrollTop;
  2597. }
  2598.  
  2599. return [x, y];
  2600. },
  2601. getElementSize: function(e) {
  2602. return [e.offsetWidth, e.offsetHeight];
  2603. },
  2604. getRelMousePos: function(e) {
  2605. var x = 0,
  2606. y = 0;
  2607.  
  2608. if (!e)
  2609. e = window.event;
  2610.  
  2611. if (typeof e.offsetX === "number") {
  2612. x = e.offsetX;
  2613. y = e.offsetY;
  2614. } else if (typeof e.layerX === "number") {
  2615. x = e.layerX;
  2616. y = e.layerY;
  2617. }
  2618.  
  2619. return {
  2620. x: x,
  2621. y: y
  2622. };
  2623. },
  2624. getViewPos: function() {
  2625. if (typeof window.pageYOffset === "number")
  2626. return [window.pageXOffset, window.pageYOffset];
  2627. else if (document.body && (document.body.scrollLeft || document.body.scrollTop))
  2628. return [document.body.scrollLeft, document.body.scrollTop];
  2629. else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop))
  2630. return [document.documentElement.scrollLeft, document.documentElement.scrollTop];
  2631. else
  2632. return [0, 0];
  2633. },
  2634. getViewSize: function() {
  2635. if (typeof window.innerWidth === "number")
  2636. return [window.innerWidth, window.innerHeight];
  2637. else if (document.body && (document.body.clientWidth || document.body.clientHeight))
  2638. return [document.body.clientWidth, document.body.clientHeight];
  2639. else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
  2640. return [document.documentElement.clientWidth, document.documentElement.clientHeight];
  2641. else
  2642. return [0, 0];
  2643. },
  2644.  
  2645. // TODO: remove this array.
  2646. images: {
  2647. pad: [181, 101],
  2648. sld: [16, 101],
  2649. cross: [15, 15],
  2650. arrow: [7, 11]
  2651. },
  2652.  
  2653. color: function(target) {
  2654.  
  2655. this.required = true; // refuse empty values?
  2656. this.adjust = true; // adjust value to uniform notation?
  2657. this.hash = false; // prefix color with # symbol?
  2658. this.caps = false; // uppercase?
  2659. this.slider = true; // show the value/saturation slider?
  2660. this.valueElement = target; // value holder
  2661. this.styleElement = target; // where to reflect current color
  2662. this.onImmediateChange = null; // onchange callback (can be either string or function)
  2663. this.hsv = [0, 0, 1]; // read-only 0-6, 0-1, 0-1
  2664. this.rgb = [1, 1, 1]; // read-only 0-1, 0-1, 0-1
  2665.  
  2666. this.pickerSmartPosition = true; // automatically adjust picker position when necessary
  2667. this.pickerFace = 10; // px
  2668. this.pickerFaceColor = "ThreeDFace"; // CSS color
  2669. this.pickerBorder = 1; // px
  2670. this.pickerBorderColor = "ThreeDHighlight ThreeDShadow ThreeDShadow ThreeDHighlight"; // CSS color
  2671. this.pickerInset = 1; // px
  2672. this.pickerInsetColor = "ThreeDShadow ThreeDHighlight ThreeDHighlight ThreeDShadow"; // CSS color
  2673. this.pickerZIndex = 10000;
  2674.  
  2675. this.hidePicker = function() {
  2676. if (isPickerOwner())
  2677. removePicker();
  2678. };
  2679. this.showPicker = function() {
  2680. if (!isPickerOwner()) {
  2681. var tp = $SS.jscolor.getElementPos(target); // target pos
  2682. var ts = $SS.jscolor.getElementSize(target); // target size
  2683. var ps = getPickerDims(this); // picker size
  2684. var a = 0,
  2685. b = 1,
  2686. c = 1;
  2687. var l = (ts[1] + ps[1]) / 2;
  2688.  
  2689. var pp = [
  2690. tp[0],
  2691. tp[1] + ts[1]
  2692. ];
  2693.  
  2694. drawPicker(pp[0], pp[1]);
  2695. }
  2696. };
  2697. this.importColor = function() {
  2698. if (!valueElement) {
  2699. this.exportColor();
  2700. } else {
  2701. if (!this.adjust) {
  2702. if (!this.fromString(valueElement.value, leaveValue)) {
  2703. styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
  2704. styleElement.style.color = styleElement.jscStyle.color;
  2705. this.exportColor(leaveValue | leaveStyle);
  2706. }
  2707. } else if (!this.required && /^\s*$/.test(valueElement.value)) {
  2708. valueElement.value = "";
  2709. styleElement.style.backgroundColor = styleElement.jscStyle.backgroundColor;
  2710. styleElement.style.color = styleElement.jscStyle.color;
  2711. this.exportColor(leaveValue | leaveStyle);
  2712.  
  2713. } else if (!this.fromString(valueElement.value))
  2714. this.exportColor();
  2715. }
  2716. };
  2717. this.exportColor = function(flags) {
  2718. if (!(flags & leaveValue) && valueElement) {
  2719. var value = this.toString();
  2720.  
  2721. if (value[0] === "#")
  2722. value = value.substr(1);
  2723.  
  2724. valueElement.value = value;
  2725. }
  2726.  
  2727. if (!(flags & leaveStyle) && styleElement) {
  2728. styleElement.style.backgroundColor = "#" + this.toString();
  2729. styleElement.style.color =
  2730. 0.213 * this.rgb[0] +
  2731. 0.715 * this.rgb[1] +
  2732. 0.072 * this.rgb[2] < 0.5 ? "#FFF" : "#000";
  2733. }
  2734.  
  2735. if (!(flags & leavePad) && isPickerOwner())
  2736. redrawPad();
  2737.  
  2738. if (!(flags & leaveSld) && isPickerOwner())
  2739. redrawSld();
  2740. };
  2741. this.fromHSV = function(h, s, v, flags) {
  2742. h < 0 && (h = 0) || h > 6 && (h = 6);
  2743. s < 0 && (s = 0) || s > 1 && (s = 1);
  2744. v < 0 && (v = 0) || v > 1 && (v = 1);
  2745.  
  2746. this.rgb = HSV_RGB(
  2747. h === null ? this.hsv[0] : (this.hsv[0] = h),
  2748. s === null ? this.hsv[1] : (this.hsv[1] = s),
  2749. v === null ? this.hsv[2] : (this.hsv[2] = v)
  2750. );
  2751.  
  2752. this.exportColor(flags);
  2753. };
  2754. this.fromRGB = function(r, g, b, flags) {
  2755. r < 0 && (r = 0) || r > 1 && (r = 1);
  2756. g < 0 && (g = 0) || g > 1 && (g = 1);
  2757. b < 0 && (b = 0) || b > 1 && (b = 1);
  2758.  
  2759. var hsv = RGB_HSV(
  2760. r === null ? this.rgb[0] : (this.rgb[0] = r),
  2761. g === null ? this.rgb[1] : (this.rgb[1] = g),
  2762. b === null ? this.rgb[2] : (this.rgb[2] = b)
  2763. );
  2764.  
  2765. if (hsv[0] !== null)
  2766. this.hsv[0] = hsv[0];
  2767.  
  2768. if (hsv[2] !== 0)
  2769. this.hsv[1] = hsv[1];
  2770.  
  2771. this.hsv[2] = hsv[2];
  2772. this.exportColor(flags);
  2773. };
  2774. this.fromString = function(hex, flags) {
  2775. var m = hex.match(/^\W*([0-9A-F]{3}([0-9A-F]{3})?)\W*$/i);
  2776.  
  2777. if (!m) return false;
  2778. else {
  2779. if (m[1].length === 6)
  2780. this.fromRGB(
  2781. parseInt(m[1].substr(0, 2), 16) / 255,
  2782. parseInt(m[1].substr(2, 2), 16) / 255,
  2783. parseInt(m[1].substr(4, 2), 16) / 255,
  2784. flags);
  2785. else
  2786. this.fromRGB(
  2787. parseInt(m[1].charAt(0) + m[1].charAt(0), 16) / 255,
  2788. parseInt(m[1].charAt(1) + m[1].charAt(1), 16) / 255,
  2789. parseInt(m[1].charAt(2) + m[1].charAt(2), 16) / 255,
  2790. flags);
  2791.  
  2792. return true;
  2793. }
  2794. };
  2795. this.toString = function() {
  2796. return (
  2797. (0x100 | Math.round(255 * this.rgb[0])).toString(16).substr(1) +
  2798. (0x100 | Math.round(255 * this.rgb[1])).toString(16).substr(1) +
  2799. (0x100 | Math.round(255 * this.rgb[2])).toString(16).substr(1)
  2800. );
  2801. };
  2802.  
  2803. function RGB_HSV(r, g, b) {
  2804. var n = Math.min(Math.min(r, g), b);
  2805. var v = Math.max(Math.max(r, g), b);
  2806. var m = v - n;
  2807. if (m === 0) {
  2808. return [null, 0, v];
  2809. }
  2810. var h = r === n ? 3 + (b - g) / m : (g === n ? 5 + (r - b) / m : 1 + (g - r) / m);
  2811. return [h === 6 ? 0 : h, m / v, v];
  2812. }
  2813.  
  2814. function HSV_RGB(h, s, v) {
  2815. if (h === null) {
  2816. return [v, v, v];
  2817. }
  2818. var i = Math.floor(h);
  2819. var f = i % 2 ? h - i : 1 - (h - i);
  2820. var m = v * (1 - s);
  2821. var n = v * (1 - s * f);
  2822. switch (i) {
  2823. case 6:
  2824. case 0:
  2825. return [v, n, m];
  2826. case 1:
  2827. return [n, v, m];
  2828. case 2:
  2829. return [m, v, n];
  2830. case 3:
  2831. return [m, n, v];
  2832. case 4:
  2833. return [n, m, v];
  2834. case 5:
  2835. return [v, m, n];
  2836. }
  2837. }
  2838.  
  2839. function removePicker() {
  2840. delete $SS.jscolor.picker.owner;
  2841. window.removeEventListener("resize", removePicker, false);
  2842. target.blur();
  2843. document.getElementsByTagName("body")[0].removeChild($SS.jscolor.picker.boxB);
  2844. }
  2845.  
  2846. function drawPicker(x, y) {
  2847. if (!$SS.jscolor.picker) {
  2848. $SS.jscolor.picker = {
  2849. box: document.createElement("div"),
  2850. boxB: document.createElement("div"),
  2851. pad: document.createElement("div"),
  2852. padB: document.createElement("div"),
  2853. padM: document.createElement("div"),
  2854. sld: document.createElement("div"),
  2855. sldB: document.createElement("div"),
  2856. sldM: document.createElement("div")
  2857. };
  2858.  
  2859. for (var i = 0, segSize = 4; i < $SS.jscolor.images.sld[1]; i += segSize) {
  2860. var seg = document.createElement("div");
  2861. seg.style.height = segSize + "px";
  2862. seg.style.fontSize = "1px";
  2863. seg.style.lineHeight = "0";
  2864. $SS.jscolor.picker.sld.appendChild(seg);
  2865. }
  2866.  
  2867. $SS.jscolor.picker.sldB.appendChild($SS.jscolor.picker.sld);
  2868. $SS.jscolor.picker.box.appendChild($SS.jscolor.picker.sldB);
  2869. $SS.jscolor.picker.box.appendChild($SS.jscolor.picker.sldM);
  2870. $SS.jscolor.picker.padB.appendChild($SS.jscolor.picker.pad);
  2871. $SS.jscolor.picker.box.appendChild($SS.jscolor.picker.padB);
  2872. $SS.jscolor.picker.box.appendChild($SS.jscolor.picker.padM);
  2873. $SS.jscolor.picker.boxB.appendChild($SS.jscolor.picker.box);
  2874. }
  2875.  
  2876. var p = $SS.jscolor.picker;
  2877.  
  2878. // controls interaction
  2879. window.addEventListener("resize", removePicker, false);
  2880. p.box.onmouseup = p.box.onmouseout = function() {
  2881. target.focus();
  2882. };
  2883. p.box.onmousedown = function() {
  2884. abortBlur = true;
  2885. };
  2886. p.box.onmousemove = function(e) {
  2887. if (holdPad || holdSld) {
  2888. holdPad && setPad(e);
  2889. holdSld && setSld(e);
  2890.  
  2891. if (document.selection)
  2892. document.selection.empty();
  2893. else if (window.getSelection)
  2894. window.getSelection().removeAllRanges();
  2895.  
  2896. dispatchImmediateChange();
  2897. }
  2898. };
  2899. p.padM.onmouseup =
  2900. p.padM.onmouseout = function() {
  2901. if (holdPad) {
  2902. holdPad = false;
  2903. $(valueElement).fire("change");
  2904. }
  2905. };
  2906. p.padM.onmousedown = function(e) {
  2907. holdPad = true;
  2908. setPad(e);
  2909. dispatchImmediateChange();
  2910. };
  2911. p.sldM.onmouseup =
  2912. p.sldM.onmouseout = function() {
  2913. if (holdSld) {
  2914. holdSld = false;
  2915. $(valueElement).fire("change");
  2916. }
  2917. };
  2918. p.sldM.onmousedown = function(e) {
  2919. holdSld = true;
  2920. setSld(e);
  2921. dispatchImmediateChange();
  2922. };
  2923.  
  2924. // picker
  2925. var dims = getPickerDims(THIS);
  2926. p.box.style.width = dims[0] + "px";
  2927. p.box.style.height = dims[1] + "px";
  2928.  
  2929. /** MOVE TO CSS **/
  2930. // picker border
  2931. p.boxB.style.position = "fixed";
  2932. p.boxB.style.clear = "both";
  2933. p.boxB.style.left = x + "px";
  2934. p.boxB.style.top = y + "px";
  2935. p.boxB.style.zIndex = THIS.pickerZIndex;
  2936. p.boxB.style.border = THIS.pickerBorder + "px solid";
  2937. p.boxB.style.borderColor = THIS.pickerBorderColor;
  2938. p.boxB.style.background = THIS.pickerFaceColor;
  2939.  
  2940. // pad image
  2941. p.pad.style.width = $SS.jscolor.images.pad[0] + "px";
  2942. p.pad.style.height = $SS.jscolor.images.pad[1] + "px";
  2943.  
  2944. // pad border
  2945. p.padB.style.position = "absolute";
  2946. p.padB.style.left = THIS.pickerFace + "px";
  2947. p.padB.style.top = THIS.pickerFace + "px";
  2948. p.padB.style.border = THIS.pickerInset + "px solid";
  2949. p.padB.style.borderColor = THIS.pickerInsetColor;
  2950.  
  2951. // pad mouse area
  2952. p.padM.style.position = "absolute";
  2953. p.padM.style.left = "0";
  2954. p.padM.style.top = "0";
  2955. p.padM.style.width = THIS.pickerFace + 2 * THIS.pickerInset + $SS.jscolor.images.pad[0] + $SS.jscolor.images.arrow[0] + "px";
  2956. p.padM.style.height = p.box.style.height;
  2957. p.padM.style.cursor = "crosshair";
  2958.  
  2959. // slider image
  2960. p.sld.style.overflow = "hidden";
  2961. p.sld.style.width = $SS.jscolor.images.sld[0] + "px";
  2962. p.sld.style.height = $SS.jscolor.images.sld[1] + "px";
  2963.  
  2964. // slider border
  2965. p.sldB.style.display = THIS.slider ? "block" : "none";
  2966. p.sldB.style.position = "absolute";
  2967. p.sldB.style.right = THIS.pickerFace + "px";
  2968. p.sldB.style.top = THIS.pickerFace + "px";
  2969. p.sldB.style.border = THIS.pickerInset + "px solid";
  2970. p.sldB.style.borderColor = THIS.pickerInsetColor;
  2971.  
  2972. // slider mouse area
  2973. p.sldM.style.display = THIS.slider ? "block" : "none";
  2974. p.sldM.style.position = "absolute";
  2975. p.sldM.style.right = "0";
  2976. p.sldM.style.top = "0";
  2977. p.sldM.style.width = $SS.jscolor.images.sld[0] + $SS.jscolor.images.arrow[0] + THIS.pickerFace + 2 * THIS.pickerInset + "px";
  2978. p.sldM.style.height = p.box.style.height;
  2979. try {
  2980. p.sldM.style.cursor = "pointer";
  2981. } catch (eOldIE) {
  2982. p.sldM.style.cursor = "hand";
  2983. }
  2984.  
  2985. // load images in optimal order
  2986. p.padM.style.backgroundImage = "url('data:image/gif;base64,R0lGODlhDwAPAKEBAAAAAP///////////yH5BAEKAAIALAAAAAAPAA8AAAIklB8Qx53b4otSUWcvyiz4/4AeQJbmKY4p1HHapBlwPL/uVRsFADs=')";
  2987. p.padM.style.backgroundRepeat = "no-repeat";
  2988. p.sldM.style.backgroundImage = "url('data:image/gif;base64,R0lGODlhBwALAKECAAAAAP///6g8eKg8eCH5BAEKAAIALAAAAAAHAAsAAAITTIQYcLnsgGxvijrxqdQq6DRJAQA7')";
  2989. p.sldM.style.backgroundRepeat = "no-repeat";
  2990. p.pad.style.backgroundImage = "url('data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAAyAAD/7gAhQWRvYmUAZMAAAAABAwAQAwMGCQAABTgAAAVfAAAHAv/bAIQACAYGBgYGCAYGCAwIBwgMDgoICAoOEA0NDg0NEBEMDg0NDgwRDxITFBMSDxgYGhoYGCMiIiIjJycnJycnJycnJwEJCAgJCgkLCQkLDgsNCw4RDg4ODhETDQ0ODQ0TGBEPDw8PERgWFxQUFBcWGhoYGBoaISEgISEnJycnJycnJycn/8IAEQgAZQC1AwEiAAIRAQMRAf/EAJgAAAIDAQEAAAAAAAAAAAAAAAQFAAEDAgYBAAIDAQEBAAAAAAAAAAAAAAUGAQMEAgAHEAADAAMBAQADAQEAAAAAAAAAAQIhEgMRBBAwIiAxEQEAAAAAAAAAAAAAAAAAAACAEgEBAQEAAAAAAAAAAAAAAAAwgVBgEwACAgICAgIDAAAAAAAAAAAAARExECEgkTBh8MFBgaH/2gAMAwEAAhEDEQAAAEXp0vo0r6m99Mg9EtKGaxutrS0y5wvKJGRE3bRE4K4d6fJ+Z9h5xpY/FhPgz7f0zzZZHfay7CuCwdrglbVcPi3c69Asej1xt6BM8ArGa9oBWpqQWoRFSy261ZRlcFcNtXmvP+qRMR3yQjsU0z0xo/M3dWXYpnW4NMVPWth0A2uHIbbGvsHK1sHA5hMBOVxaGyG2reOvWp3BzwTyyVoEvpFBsv5gdyOUYMzejKGOrLscwLsmWS5oXQ6CLGrTBjQDJZhsBonMU0fkKAOfhpC4aadlsfHJFGuUyt8uKEfP4N8t5ccrYio1nZd4i6/NjwGuXQ6De2ZsK5D9m4k48HGBWUDxMTM7h2HW3W6jKiKI8qwm4u3Wlza56d4uxOvBDCGXn3gcMOR1i+HTJ0x3276FcbzuqnjPfmKB+Cue8+F7XdxjRFXwFiw4utV8sqsvB0M6i8SGSu8KjqokGHSqS7k7x3ckRKk9zKk9EuSfSSdeqpJ9VSe6uSem5JEySR6pJE//2gAIAQIAAQUB7I7SRJEnzI+c40TX83R3ePpPDqjrJMkScEcDlQqxVHV47nh0R0kmSZOKORzoVYqjo8djwtFyKSZOaOZFCrDotnQ8KRUikUkIkmjYdFMs8GhyamokIVGxsNjPP2//2gAIAQMAAQUB70d2fSfRI5FGeEnznzM51hUbnajszudpHIozxk4HBkVhUbnWjqzsdZHJpnlJyOLIrCo3LotnQ6SamhEnM5smjY3KopllSamhMkkMVGxuOhsY5NTQUiEzY2N/2//aAAgBAQABBQHhJwk4I4/8stFoaykJCR1WO8neTvBEEQRJEjkcjk1zxk4ycUcSy0WhrKQkJHVY7SdpO0EQRBEkSORyOTU4ycZOKORZaLQ1lISEjosdpO0naCIIgiSJHI5HJqcpOUnJHIstFoaykJCR0WOsnWTrBEEQRJMjkcjk1OUnKTkjmUUikNZSEhItY6ydZOsEwTBMkyORyOTU5yc5OaOZRSKQ0JCQkWsdJOknSCYJgmSZHI5HJqRJEkIgopFIaPDw8LRclyXBMEwTIpNTU1NSJIkhEjGho8PDw8KRclyXAoFApFJqampqTJMkokY0NHh4eHhSKkqSoFAoFIpNTU1NSZJklCGNDR4eHh4NFSVJUCgUCkUmpqamopFIkL8eHh4eHh4NDkcjg0NDU1NTU1NTU1PPz4eHh4eHh4ampoaGhqampqampgx/rBgx+MGDB/J/JgwYMGDBg//aAAgBAgIGPwE6lS6P/9oACAEDAgY/AeU//9oACAEBAQY/ARX/AP/aAAgBAgMBPxC0tw7kQQNCRRlMrG0lvn8Fpbj2IigaEijP5xvJb5/BbldyIIHhIoy2cbTxF6CKBo4C50byfbiqQDxgWuGVGx9sqihANGBajMpth0dHR1hHZ2dnef/aAAgBAwMBPxCeSaRJkkbx6JFAkNEEGnj+hLJNIsyTPDokECQ0RQa+VLJJIkyTPCtBBAsQQQaWVPJNIsySMZWyIoEiCKDShYpyYSSYZWxELBAaxYpSQSSTNAJBALO7z0dHR1ns7Oz/2gAIAQEDAT8QrKioX+BbLi/j/v5y4vLioqKzXx/qyoqE1+hbLi/lv3cXlxXoqKzTw/uUlBQLr9CeAcrrC0sPTkdPBW5WVFQmhPAOVVxeXHpPRh18FblJQUC6F8FpTWFpYes9XL1blZUVCaEyO3ipri8u8AKrcrKisXQmR2iKKOkuLy49PAdllm+UoF0Lm3uIoo6/AJ3sss34dILm3uIoo6eF3pPVlWWWb8EFEyL3EUUNfAT0noyrLL46SDQwy/BzIggiuP0UEUhoYfH7LDLC9RBFc/2jRo0a4DXlJ/8A/9k=')";
  2991. p.pad.style.backgroundRepeat = "no-repeat";
  2992. p.pad.style.backgroundPosition = "0 0";
  2993. /** UNTIL HERE **/
  2994.  
  2995. // place pointers
  2996. redrawPad();
  2997. redrawSld();
  2998.  
  2999. $SS.jscolor.picker.owner = THIS;
  3000. document.getElementsByTagName("body")[0].appendChild(p.boxB);
  3001. }
  3002.  
  3003. function getPickerDims(o) {
  3004. var dims = [
  3005. 2 * o.pickerInset + 2 * o.pickerFace + $SS.jscolor.images.pad[0] +
  3006. (o.slider ? 2 * o.pickerInset + 2 * $SS.jscolor.images.arrow[0] + $SS.jscolor.images.sld[0] : 0),
  3007. 2 * o.pickerInset + 2 * o.pickerFace + $SS.jscolor.images.pad[1]
  3008. ];
  3009.  
  3010. return dims;
  3011. }
  3012.  
  3013. function redrawPad() {
  3014. // redraw the pad pointer
  3015. var yComponent = 1;
  3016. var x = Math.round((THIS.hsv[0] / 6) * ($SS.jscolor.images.pad[0] - 1));
  3017. var y = Math.round((1 - THIS.hsv[yComponent]) * ($SS.jscolor.images.pad[1] - 1));
  3018. $SS.jscolor.picker.padM.style.backgroundPosition =
  3019. (THIS.pickerFace + THIS.pickerInset + x - Math.floor($SS.jscolor.images.cross[0] / 2)) + "px " +
  3020. (THIS.pickerFace + THIS.pickerInset + y - Math.floor($SS.jscolor.images.cross[1] / 2)) + "px";
  3021.  
  3022. // redraw the slider image
  3023. var seg = $SS.jscolor.picker.sld.childNodes;
  3024.  
  3025. var rgb = HSV_RGB(THIS.hsv[0], THIS.hsv[1], 1);
  3026. for (var i = 0; i < seg.length; i += 1)
  3027. seg[i].style.backgroundColor = "rgb(" +
  3028. (rgb[0] * (1 - i / seg.length) * 100) + "%," +
  3029. (rgb[1] * (1 - i / seg.length) * 100) + "%," +
  3030. (rgb[2] * (1 - i / seg.length) * 100) + "%)";
  3031. }
  3032.  
  3033. function redrawSld() {
  3034. // redraw the slider pointer
  3035. var yComponent = 2;
  3036. var y = Math.round((1 - THIS.hsv[yComponent]) * ($SS.jscolor.images.sld[1] - 1));
  3037. $SS.jscolor.picker.sldM.style.backgroundPosition =
  3038. "0 " + (THIS.pickerFace + THIS.pickerInset + y - Math.floor($SS.jscolor.images.arrow[1] / 2)) + "px";
  3039. }
  3040.  
  3041. function isPickerOwner() {
  3042. return $SS.jscolor.picker && $SS.jscolor.picker.owner === THIS;
  3043. }
  3044.  
  3045. function blurTarget() {
  3046. if (valueElement === target)
  3047. THIS.importColor();
  3048.  
  3049. THIS.hidePicker();
  3050. }
  3051.  
  3052. function blurValue() {
  3053. if (valueElement !== target)
  3054. THIS.importColor();
  3055. }
  3056.  
  3057. function setPad(e) {
  3058. var mpos = $SS.jscolor.getRelMousePos(e);
  3059. var x = mpos.x - THIS.pickerFace - THIS.pickerInset;
  3060. var y = mpos.y - THIS.pickerFace - THIS.pickerInset;
  3061. THIS.fromHSV(x * (6 / ($SS.jscolor.images.pad[0] - 1)), 1 - y / ($SS.jscolor.images.pad[1] - 1), null, leaveSld);
  3062. }
  3063.  
  3064. function setSld(e) {
  3065. var mpos = $SS.jscolor.getRelMousePos(e);
  3066. var y = mpos.y - THIS.pickerFace - THIS.pickerInset;
  3067. THIS.fromHSV(null, null, 1 - y / ($SS.jscolor.images.sld[1] - 1), leavePad);
  3068. }
  3069.  
  3070. function dispatchImmediateChange() {
  3071. if (THIS.onImmediateChange)
  3072. if (typeof THIS.onImmediateChange === "string")
  3073. eval(THIS.onImmediateChange);
  3074. else
  3075. THIS.onImmediateChange(THIS);
  3076. }
  3077.  
  3078. var THIS = this;
  3079. var abortBlur = false;
  3080. var valueElement = this.valueElement,
  3081. styleElement = this.styleElement;
  3082. var holdPad = false,
  3083. holdSld = false;
  3084. var leaveValue = 1 << 0,
  3085. leaveStyle = 1 << 1,
  3086. leavePad = 1 << 2,
  3087. leaveSld = 1 << 3;
  3088.  
  3089. // target
  3090. $(target).bind("focus", THIS.showPicker)
  3091. .bind("blur", function() {
  3092. if (!abortBlur)
  3093. window.setTimeout(function() {
  3094. abortBlur || blurTarget();
  3095. abortBlur = false;
  3096. });
  3097. else
  3098. abortBlur = false;
  3099. });
  3100.  
  3101. // valueElement
  3102. if (valueElement) {
  3103. var updateField = function() {
  3104. THIS.fromString(valueElement.value, leaveValue);
  3105. dispatchImmediateChange();
  3106. };
  3107. $(valueElement).bind("keyup", updateField)
  3108. .bind("input", updateField)
  3109. .bind("blur", blurValue)
  3110. .attr("autocomplete", "off");
  3111. }
  3112.  
  3113. // styleElement
  3114. if (styleElement) {
  3115. styleElement.jscStyle = {
  3116. backgroundColor: styleElement.style.backgroundColor,
  3117. color: styleElement.style.color
  3118. };
  3119. }
  3120.  
  3121. this.importColor();
  3122. }
  3123. },
  3124.  
  3125. /* STRUCTS */
  3126. Color: function(hex, incHover) {
  3127. this.hex = "#" + hex;
  3128. this.private_rgb = $SS.RGBFromHex(hex);
  3129. this.rgb = this.private_rgb.join(",");
  3130. this.isLight = $SS.isLight(this.private_rgb);
  3131. this.shiftRGB = function(shift, smart) {
  3132. var rgb = this.private_rgb.slice(0);
  3133.  
  3134. shift = smart ?
  3135. (this.isLight ? (shift < 0 ? shift : -shift) : Math.abs(shift)) : shift;
  3136.  
  3137. rgb[0] = Math.min(Math.max(rgb[0] + shift, 0), 255);
  3138. rgb[1] = Math.min(Math.max(rgb[1] + shift, 0), 255);
  3139. rgb[2] = Math.min(Math.max(rgb[2] + shift, 0), 255);
  3140.  
  3141. return rgb.join(",");
  3142. };
  3143.  
  3144. if (incHover)
  3145. this.hover = this.shiftRGB(16, true);
  3146. },
  3147. colorToHex: function(color) {
  3148. var digits, hex;
  3149.  
  3150. if (color.substr(0, 1) === '#') {
  3151. return color.slice(1, color.length);
  3152. }
  3153. if (digits = color.match(/(.*?)rgba?\((\d+), ?(\d+), ?(\d+)(.*?)\)/)) {
  3154. hex = ((parseInt(digits[2], 10) << 16) | (parseInt(digits[3], 10) << 8) | (parseInt(digits[4], 10))).toString(16);
  3155. while (hex.length < 6) {
  3156. hex = "0" + hex;
  3157. }
  3158. return hex;
  3159. } else {
  3160. return false;
  3161. }
  3162. },
  3163. Image: function(img, RPA) {
  3164. this.img = img;
  3165. this.RPA = RPA;
  3166. this.get = function() {
  3167. if (!this.img) return "none ";
  3168.  
  3169. var ret = "url('";
  3170. if ($SS.validBase64(this.img))
  3171. ret = "data:image/" + $SS.typeofBase64(this.img) + ";base64," + this.img;
  3172. else
  3173. ret = this.img;
  3174.  
  3175. return (this.RPA !== undefined ? "url('" : "") + ret + (this.RPA !== undefined ? "')" + this.RPA : "");
  3176. };
  3177. },
  3178. Theme: function(index) {
  3179. var theme;
  3180.  
  3181. if ((theme = $SS.conf["Themes"][index]) == undefined) {
  3182. this.hidden = true;
  3183. return;
  3184. }
  3185.  
  3186. this.index = index;
  3187. this.hidden = $SS.conf["Hidden Themes"].indexOf(index) !== -1;
  3188. this.name = theme.name;
  3189. this.authorName = theme.authorName || "Anonymous";
  3190. this.authorTrip = theme.authorTrip || "!..NoTrip..";
  3191. this.default = theme.default;
  3192. this.replyBrder = theme.replyBrder;
  3193. this.bgImg = new $SS.Image(theme.bgImg, theme.bgRPA);
  3194. this.replyOp = theme.replyOp;
  3195. this.navOp = theme.navOp;
  3196. this.bgColor = new $SS.Color(theme.bgColor);
  3197. this.mainColor = new $SS.Color(theme.mainColor);
  3198. this.brderColor = new $SS.Color(theme.brderColor);
  3199. this.inputColor = new $SS.Color(theme.inputColor, true);
  3200. this.inputbColor = new $SS.Color(theme.inputbColor);
  3201. this.blinkColor = new $SS.Color(theme.blinkColor);
  3202. this.unreadColor = new $SS.Color(theme.unreadColor);
  3203. this.linkColor = new $SS.Color(theme.linkColor);
  3204. this.linkHColor = new $SS.Color(theme.linkHColor);
  3205. this.qlColor = new $SS.Color(theme.qlColor);
  3206. this.nameColor = new $SS.Color(theme.nameColor);
  3207. this.quoteColor = new $SS.Color(theme.quoteColor);
  3208. this.textColor = new $SS.Color(theme.textColor);
  3209. this.titleColor = new $SS.Color(theme.titleColor);
  3210. this.tripColor = new $SS.Color(theme.tripColor);
  3211. this.boardColor = new $SS.Color(theme.boardColor);
  3212. this.headerColor = new $SS.Color(theme.headerColor);
  3213. this.headerLColor = new $SS.Color(theme.headerLColor);
  3214. this.headerLHColor = new $SS.Color(theme.headerLHColor);
  3215. this.headerBGColor = new $SS.Color(theme.headerBGColor);
  3216. this.headerbColor = new $SS.Color(theme.headerbColor);
  3217. this.postHLColor = new $SS.Color(theme.postHLColor);
  3218. this.quotesYouHLColor = new $SS.Color(theme.quotesYouHLColor);
  3219. this.ownPostHLColor = new $SS.Color(theme.ownPostHLColor);
  3220. this.threadHLColor = new $SS.Color(theme.threadHLColor);
  3221. this.replybgHLColor = new $SS.Color(theme.replybgHLColor);
  3222. this.replyslctColor = new $SS.Color(theme.replyslctColor);
  3223. this.checkMark = new $SS.Image(inputImages, "no-repeat center " + (this.inputColor.isLight ? 0 : -8) + "px");
  3224. this.radioCheck = new $SS.Image(inputImages, "no-repeat center " + (this.inputColor.isLight ? -16 : -24) + "px");
  3225. this.codeBackground = (this.bgColor.isLight ? "255, 255, 255, 0.2" : "0, 0, 0, 0.2");
  3226. this.codeBorder = (this.bgColor.isLight ? "204, 204, 204, 1.0" : "204, 204, 204, 0.1");
  3227. this.dIcons = new $SS.Image(theme.dIcons);
  3228. this.icons = {
  3229. imgExpand: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' height='16' width='16' xmlns='http://www.w3.org/2000/svg'>" +
  3230. "<path fill='rgb(" + this.headerColor.rgb + ")' d='M25.545,23.328,17.918,15.623,25.534,8.007,27.391,9.864,29.649,1.436,21.222,3.694,23.058,5.53,15.455,13.134,7.942,5.543,9.809,3.696,1.393,1.394,3.608,9.833,5.456,8.005,12.98,15.608,5.465,23.123,3.609,21.268,1.351,29.695,9.779,27.438,7.941,25.6,15.443,18.098,23.057,25.791,21.19,27.638,29.606,29.939,27.393,21.5z'/></svg>",
  3231. imgContract: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' height='16' width='16' xmlns='http://www.w3.org/2000/svg'>" +
  3232. "<path fill='rgb(" + this.headerColor.rgb + ")' d='M25.083,18.895l-8.428-2.259l2.258,8.428l1.838-1.837l7.053,7.053l2.476-2.476l-7.053-7.053L25.083,18.895zM5.542,11.731l8.428,2.258l-2.258-8.428L9.874,7.398L3.196,0.72L0.72,3.196l6.678,6.678L5.542,11.731zM7.589,20.935l-6.87,6.869l2.476,2.476l6.869-6.869l1.858,1.857l2.258-8.428l-8.428,2.258L7.589,20.935zM23.412,10.064l6.867-6.87l-2.476-2.476l-6.868,6.869l-1.856-1.856l-2.258,8.428l8.428-2.259L23.412,10.064z'/></svg>",
  3233. menuIcon: "<svg viewBox='7 7 20 20' preserveAspectRatio='true' height='14' width='14' xmlns='http://www.w3.org/2000/svg'>" +
  3234. "<path fill='rgb(" + this.headerLColor.rgb + ")' d='M4.083,14H14V4.083H4.083V14zM17,4.083V14h9.917V4.083H17zM17,26.917h9.917v-9.918H17V26.917zM4.083,26.917H14v-9.918H4.083V26.917z'/></svg>",
  3235. star: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' xmlns='http://www.w3.org/2000/svg'>" +
  3236. "<path fill='rgb(" + this.textColor.rgb + ")' d='M14.615,4.928c0.487-0.986,1.284-0.986,1.771,0l2.249,4.554c0.486,0.986,1.775,1.923,2.864,2.081l5.024,0.73c1.089,0.158,1.335,0.916,0.547,1.684l-3.636,3.544c-0.788,0.769-1.28,2.283-1.095,3.368l0.859,5.004c0.186,1.085-0.459,1.553-1.433,1.041l-4.495-2.363c-0.974-0.512-2.567-0.512-3.541,0l-4.495,2.363c-0.974,0.512-1.618,0.044-1.432-1.041l0.858-5.004c0.186-1.085-0.307-2.6-1.094-3.368L3.93,13.977c-0.788-0.768-0.542-1.525,0.547-1.684l5.026-0.73c1.088-0.158,2.377-1.095,2.864-2.081L14.615,4.928z'/></svg>",
  3237. backlink: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' xmlns='http://www.w3.org/2000/svg'>" +
  3238. "<path fill='rgb(" + this.blinkColor.rgb + ")' d='M12.981,9.073V6.817l-12.106,6.99l12.106,6.99v-2.422c3.285-0.002,9.052,0.28,9.052,2.269c0,2.78-6.023,4.263-6.023,4.263v2.132c0,0,13.53,0.463,13.53-9.823C29.54,9.134,17.952,8.831,12.981,9.073z'/></svg>",
  3239. quickReply: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' height='16' width='16' xmlns='http://www.w3.org/2000/svg'>" +
  3240. "<path fill='rgb(" + this.headerColor.rgb + ")' d='M16,5.333c-7.732,0-14,4.701-14,10.5c0,1.982,0.741,3.833,2.016,5.414L2,25.667l5.613-1.441c2.339,1.317,5.237,2.107,8.387,2.107c7.732,0,14-4.701,14-10.5C30,10.034,23.732,5.333,16,5.333z'/></svg>",
  3241. threadWatcher: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' height='20' width='20' xmlns='http://www.w3.org/2000/svg'>" +
  3242. "<path fill='rgb(" + this.headerColor.rgb + ")' d='M16,8.286C8.454,8.286,2.5,16,2.5,16s5.954,7.715,13.5,7.715c5.771,0,13.5-7.715,13.5-7.715S21.771,8.286,16,8.286zM16,20.807c-2.649,0-4.807-2.157-4.807-4.807s2.158-4.807,4.807-4.807s4.807,2.158,4.807,4.807S18.649,20.807,16,20.807zM16,13.194c-1.549,0-2.806,1.256-2.806,2.806c0,1.55,1.256,2.806,2.806,2.806c1.55,0,2.806-1.256,2.806-2.806C18.806,14.451,17.55,13.194,16,13.194z'/></svg>",
  3243. threadClosed: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' height='16' width='16' xmlns='http://www.w3.org/2000/svg'>" +
  3244. "<path fill='rgb(" + this.headerColor.rgb + ")' d='M22.335,12.833V9.999h-0.001C22.333,6.501,19.498,3.666,16,3.666S9.666,6.502,9.666,10h0v2.833H7.375V25h17.25V12.833H22.335zM11.667,10C11.667,10,11.667,10,11.667,10c0-2.39,1.944-4.334,4.333-4.334c2.391,0,4.335,1.944,4.335,4.333c0,0,0,0,0,0v2.834h-8.668V10z'/></svg>",
  3245. threadPinned: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' height='16' width='16' xmlns='http://www.w3.org/2000/svg'>" +
  3246. "<path fill='rgb(" + this.tripColor.rgb + ")' d='M16,3.5c-4.142,0-7.5,3.358-7.5,7.5c0,4.143,7.5,18.121,7.5,18.121S23.5,15.143,23.5,11C23.5,6.858,20.143,3.5,16,3.5z M16,14.584c-1.979,0-3.584-1.604-3.584-3.584S14.021,7.416,16,7.416S19.584,9.021,19.584,11S17.979,14.584,16,14.584z'/></svg>",
  3247. threadArchived: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' height='16' width='16' xmlns='http://www.w3.org/2000/svg'>" +
  3248. "<path fill='rgb(" + this.tripColor.rgb + ")' d='M15.5,3.029l-10.8,6.235L4.7,21.735L15.5,27.971l10.8-6.235V9.265L15.5,3.029zM24.988,10.599L16,15.789v10.378c0,0.275-0.225,0.5-0.5,0.5s-0.5-0.225-0.5-0.5V15.786l-8.987-5.188c-0.239-0.138-0.321-0.444-0.183-0.683c0.138-0.238,0.444-0.321,0.683-0.183l8.988,5.189l8.988-5.189c0.238-0.138,0.545-0.055,0.684,0.184C25.309,10.155,25.227,10.461,24.988,10.599z'/></svg>",
  3249. menuButton: "<svg viewBox='0 0 30 30' preserveAspectRatio='true' height='16' width='16' xmlns='http://www.w3.org/2000/svg'>" +
  3250. "<path fill='rgb(" + this.blinkColor.rgb + ")' d='M10.129,22.186 16.316,15.999 10.129,9.812 13.665,6.276 23.389,15.999 13.665,25.725z'/></svg>",
  3251. downArrow: "<svg viewBox='7 4 29 27' preserveAspectRatio='true' height='16' width='16' xmlns='http://www.w3.org/2000/svg'>" +
  3252. "<path fill='rgb(" + this.tripColor.rgb + ")' d='M8.037,11.166L14.5,22.359c0.825,1.43,2.175,1.43,3,0l6.463-11.194c0.826-1.429,0.15-2.598-1.5-2.598H9.537C7.886,8.568,7.211,9.737,8.037,11.166z'/></svg>"
  3253. };
  3254.  
  3255. if (theme.customCSS) {
  3256. try {
  3257. if (theme.customCSS[0] === "(")
  3258. theme.customCSS = "\"+".concat(theme.customCSS);
  3259. if (theme.customCSS[theme.customCSS.length - 1] === ")")
  3260. theme.customCSS += "+\"";
  3261.  
  3262. this.customCSS = eval($SS.trimLineBreaks(new String('"' + theme.customCSS.replace(/\"/g, "\\\"").replace(/\'/g, "\\\'") + '"')));
  3263. } catch (e) {
  3264. alert("Error evaluating " + this.name + "'s theme.customCSS!\n" + e.message);
  3265. this.customCSS = theme.customCSS;
  3266. }
  3267. } else
  3268. this.customCSS = "";
  3269.  
  3270. this.preview = function() {
  3271. var div = $("<div " + (this.hidden ? "hidden=true " : "") +
  3272. " id=theme" + this.index + " class=\'theme-preview " + (($SS.conf["Selected Theme"] == $SS.conf["NSFW Theme"]) && ($SS.conf["Selected Theme"] == this.index) ? "selected nsfw" : ($SS.conf["Selected Theme"] == this.index ? "selected " : "") + ($SS.conf["NSFW Theme"] == this.index ? "nsfw " : "")) + "\'>").html("<div class=reply " +
  3273. "style='background-color:" + this.mainColor.hex + "!important;border:1px solid " + this.brderColor.hex + "!important;color:" + this.textColor.hex + "!important'>" +
  3274. "<div class=riceCheck style='background-color:" + this.inputColor.hex + "!important;border:1px solid " + this.inputbColor.hex + "!important;box-shadow:rgba(" + this.mainColor.shiftRGB(64) + ",.3) 0 1px;'></div>" +
  3275. "<span style='color:" + this.titleColor.hex + "!important; font-weight: 700 !important'>" + this.name + "</span> " +
  3276. "<span style='color:" + this.nameColor.hex + "!important; font-weight: 700 !important'>" + this.authorName + "</span>" +
  3277. "<span style='color:" + this.tripColor.hex + "!important'> " + this.authorTrip + "</span>" +
  3278. "<time style='color:" + this.textColor.hex + "'> 20XX.01.01 12:00 </time>" +
  3279. "<a href='javascript:;' style='color:" + this.linkColor.hex + "!important' " +
  3280. "onmouseover='this.setAttribute(\"style\",\"color:" + this.linkHColor.hex + "!important\")' " +
  3281. "onmouseout='this.setAttribute(\"style\",\"color:" + this.linkColor.hex + "!important\")'>No.22772469</a>" +
  3282. "<br><blockquote><span style='color:" + this.quoteColor.hex + "'>>implying this isn't a post</span><br>Post content is right here.</blockquote>" +
  3283. "<p class='theme-buttons-container'>" +
  3284. "<a href='javascript:;' title='Sets the SFW theme.' style='background-color:" + this.inputColor.hex + "!important;border:1px solid " + this.inputbColor.hex + "!important;color:" + this.textColor.hex + "!important'>SFW</a>" +
  3285. "<a href='javascript:;' title='Sets the NSFW theme.' style='background-color:" + this.inputColor.hex + "!important;border:1px solid " + this.inputbColor.hex + "!important;color:" + this.textColor.hex + "!important'>NSFW</a>" +
  3286. "<a href='javascript:;' title=Edit style='background-color:" + this.inputColor.hex + "!important;border:1px solid " + this.inputbColor.hex + "!important;color:" + this.textColor.hex + "!important'>Edit</a>" +
  3287. "<a href='javascript:;' title=Delete style='background-color:" + this.inputColor.hex + "!important;border:1px solid " + this.inputbColor.hex + "!important;color:" + this.textColor.hex + "!important'>Delete</a></p>" +
  3288. "<h3 class='sfw-label notsafe'>NSFW</h3>" +
  3289. "<h3 class='sfw-label safe'>SFW</h3>" +
  3290. "<h3 class='sfw-label both'>SFW & NSFW</h3>" +
  3291. "</div>");
  3292.  
  3293. $(div).bind("click", function() {
  3294. var $this = $(this);
  3295.  
  3296. if ($this.hasClass("selected nsfw")) return;
  3297.  
  3298. $this.parent().children(".selected").removeClass("selected");
  3299. $this.parent().children(".nsfw").removeClass("nsfw");
  3300. $this.addClass("selected nsfw");
  3301. $SS.options.save();
  3302. });
  3303.  
  3304. $("a[title='Sets the SFW theme.']", div).bind("click", function(e) {
  3305. e.stopPropagation();
  3306. var $this = $(this);
  3307. if ($this.hasClass("selected")) return;
  3308.  
  3309. $this.parent().parent().parent().parent().children(".selected").removeClass("selected");
  3310. $this.parent().parent().parent().addClass("selected");
  3311. });
  3312.  
  3313. $("a[title='Sets the NSFW theme.']", div).bind("click", function(e) {
  3314. e.stopPropagation();
  3315. var $this = $(this);
  3316. if ($this.hasClass("nsfw")) return;
  3317.  
  3318. $this.parent().parent().parent().parent().children(".nsfw").removeClass("nsfw");
  3319. $this.parent().parent().parent().addClass("nsfw");
  3320. });
  3321. $("a[title=Delete]", div).bind("click", function(e) {
  3322. e.stopPropagation();
  3323. $SS.options.deleteTheme(index);
  3324. });
  3325. $("a[title=Edit]", div).bind("click", function(e) {
  3326. e.stopPropagation();
  3327. $SS.options.showTheme(index);
  3328. });
  3329.  
  3330. return div;
  3331. }
  3332. },
  3333.  
  3334. /* HELPER METHODS */
  3335. formatFont: function(font) {
  3336. if (font === "sans-serif" || font === "monospace")
  3337. return font;
  3338.  
  3339. return "'" + font + "'";
  3340. },
  3341. RGBFromHex: function(hex) {
  3342. var rgb = [];
  3343. hex = parseInt(hex, 16);
  3344.  
  3345. rgb[0] = (hex >> 16) & 0xFF;
  3346. rgb[1] = (hex >> 8) & 0xFF;
  3347. rgb[2] = hex & 0xFF;
  3348.  
  3349. return rgb;
  3350. },
  3351. isLight: function(rgb) {
  3352. return rgb[0] + rgb[1] + rgb[2] >= 400;
  3353. },
  3354. trimLineBreaks: function(str) {
  3355. return str.replace(/(\r\n|\r|\n)/gm, "");
  3356. },
  3357. cleanBase64: function(b64) {
  3358. return b64.replace(/^(data:image\/(?:gif|jpe?g|png);base64,)(\r\n|\r|\n)?/gmi, "");
  3359. },
  3360. typeofBase64: function(b64) {
  3361. switch (b64.substr(0, 8)) {
  3362. case "PD94bWwg":
  3363. return "svg+xml";
  3364. case "R0lGODlh":
  3365. return "gif";
  3366. case "/9j/4AAQ":
  3367. case "/9j/4QAY":
  3368. return "jpeg";
  3369. case "iVBORw0K":
  3370. default:
  3371. return "png";
  3372. }
  3373. },
  3374. validBase64: function(b64) {
  3375. return /^(?:data:image\/(?:gif|jpe?g|png);base64,)?(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=|[A-Za-z0-9+\/]{4})$/i.test(b64);
  3376. },
  3377. validImageURL: function(img) {
  3378. return /^https?:\/\/.+$/i.test(img);
  3379. },
  3380. getLocation: function(url) {
  3381. var obj;
  3382.  
  3383. if (typeof url === "string") {
  3384. obj = document.createElement("a");
  3385. obj.href = location.protocol + "//" + url;
  3386. } else
  3387. obj = window.location;
  3388.  
  3389. var pathname = obj.pathname.substr(1).split("/");
  3390.  
  3391. return {
  3392. sub: obj.hostname.split(".")[0],
  3393. board: pathname[0],
  3394. home: location.hostname === "www.4chan.org",
  3395. nsfw: /^(b|d|e|f|gif|h|hr|r|s|t|u|wg|i|ic|r9k|hm|y|hc|pol|soc|aco|s4s|trash)$/.test(pathname[0]),
  3396. reply: pathname[1] === "thread",
  3397. catalog: pathname[1] === "catalog",
  3398. archive: pathname[1] === "archive"
  3399. };
  3400. }
  3401. };
  3402. /* END STYLE SCRIPT CLASSES */
  3403. $SS.init();
  3404. })();
Add Comment
Please, Sign In to add comment