├── LICENSE ├── README ├── server ├── accounts.txt ├── bot-report-web.js ├── package.json ├── protos │ ├── protos.js │ └── updater.js └── sentry │ ├── README.txt │ ├── package.json │ └── steam_sentry.js └── web ├── banned.php ├── config.php ├── css ├── bootstrap.min.css └── narrow-jumbotron.css ├── header.php ├── img ├── asc.gif ├── bg.gif ├── desc.gif └── sadcat.gif ├── index.php ├── js ├── abs.js ├── ie10-viewport-bug-workaround.js ├── jquery-3.0.0.min.js ├── jquery-latest.js ├── jquery.metadata.js ├── jquery.tablesorter.js └── jquery.tablesorter.min.js ├── list.php ├── mysql.php ├── ow-check.php ├── recaptchalib.php └── report.sql /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | {one line to give the program's name and a brief idea of what it does.} 635 | Copyright (C) {year} {name of author} 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | {project} Copyright (C) {year} {fullname} 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | What is needed? 2 | - A VPS Server with Node installed. Just install the normal Node Report Bot from askwrite and you should be fine. 3 | 4 | How to Setup: 5 | 6 | 1. Put the web path in your var/www folder. 7 | 2. Edit the config file. Fill out the Captcha Data (Google Captcha), MySQL, and Site Password. 8 | 3. Now you see 2 points which are called "script_path" and "script_log_path". 9 | 4. This is pretty easy. Just upload the server stuff to a folder of your choose. For example i upload it to /var/report-bot 10 | 5. So i link to "script_path" = /var/report-bot and "script_log_path" = /var/report-bot/log 11 | 6. Run in the Bot Folder npm install to Install the needed modules. 12 | 7. Import the MySQL Database which i passed to the folder web. 13 | 8. Add some accounts. It works like in askwrites Report Bot Script. But mine supports Steamguard! 14 | 9. To use SteamGuard you need to put in the main folder of the script the sentry file. Like AccountName.sentry 15 | 10. To get the OW/Vac-Check working you need to run a cronjob on ow-check.php 16 | 11. Have Fun with it. Modify it like you want, but don't remove the Credits please. Thanks! 17 | 18 | Credits: 19 | 20 | @askwrite - Main Report Bot Script in Node -------------------------------------------------------------------------------- /server/accounts.txt: -------------------------------------------------------------------------------- 1 | name:password -------------------------------------------------------------------------------- /server/bot-report-web.js: -------------------------------------------------------------------------------- 1 | var fs = require("fs"), 2 | Steam = require("steam"), 3 | SteamID = require("steamid"), 4 | IntervalIntArray = {}, 5 | readlineSync = require("readline-sync"), 6 | Protos = require("./protos/protos.js"), 7 | CountReports = 0, 8 | Long = require("long"), 9 | SteamClients = {}, 10 | SteamUsers = {}, 11 | SteamGCs = {}, 12 | SteamFriends = {}, 13 | process = require("process"), 14 | steamID = process.argv[2], 15 | ClientHello = 4006, 16 | ClientWelcome = 4004; 17 | 18 | var accounts = []; 19 | 20 | var arrayAccountsTxt = fs.readFileSync("accounts.txt").toString().split("\n"); 21 | for (i in arrayAccountsTxt) { 22 | var accInfo = arrayAccountsTxt[i].toString().trim().split(":"); 23 | var username = accInfo[0]; 24 | var password = accInfo[1]; 25 | accounts[i] = []; 26 | accounts[i].push({ 27 | username: username, 28 | password: password 29 | }); 30 | } 31 | 32 | var size = 0; 33 | size = arrayAccountsTxt.length; 34 | 35 | arrayAccountsTxt.forEach(processSteamReport); 36 | 37 | function processSteamReport(element, indexElement, array) { 38 | if (element != "") { 39 | var account = element.toString().trim().split(":"); 40 | var account_name = account[0]; 41 | var password = account[1]; 42 | SteamClients[indexElement] = new Steam.SteamClient(); 43 | SteamUsers[indexElement] = new Steam.SteamUser(SteamClients[indexElement]); 44 | SteamGCs[indexElement] = new Steam.SteamGameCoordinator(SteamClients[indexElement], 730); 45 | SteamFriends[indexElement] = new Steam.SteamFriends(SteamClients[indexElement]); 46 | 47 | SteamClients[indexElement].connect(); 48 | 49 | var sentryfile; 50 | if (fs.existsSync(account_name + '.sentry')) { 51 | sentryfile = fs.readFileSync(account_name + '.sentry'); 52 | } 53 | 54 | SteamClients[indexElement].on("connected", function() { 55 | if (fs.existsSync(account_name + '.sentry')) { 56 | SteamUsers[indexElement].logOn({ 57 | account_name: account_name, 58 | password: password, 59 | sha_sentryfile: sentryfile 60 | }); 61 | } else { 62 | SteamUsers[indexElement].logOn({ 63 | account_name: account_name, 64 | password: password 65 | }); 66 | } 67 | }); 68 | 69 | SteamClients[indexElement].on("logOnResponse", function(res) { 70 | if (res.eresult !== Steam.EResult.OK) { 71 | if (res.eresult == Steam.EResult.ServiceUnavailable) { 72 | console.log("\n[STEAM CLIENT - Login failed - STEAM IS DOWN!"); 73 | SteamClients[indexElement].disconnect(); 74 | process.exit(); 75 | } else { 76 | CountReports++; 77 | if (CountReports == size) { 78 | console.log("\n\n" + CountReports + " Reports for this faggot.\nThanks for using this Service!\nCredits for the Script to askwrite & TROLOLO"); 79 | process.exit(); 80 | } 81 | console.log("\n[STEAM CLIENT (" + account_name.substring(0, 4) + "**) - Login failed!" + res.eresult); 82 | SteamClients[indexElement].disconnect(); 83 | SteamClients.splice(indexElement, 1); 84 | SteamFriends.splice(indexElement, 1); 85 | SteamGCs.splice(indexElement, 1); 86 | SteamUsers.splice(indexElement, 1); 87 | IntervalIntArray.splice(indexElement, 1); 88 | } 89 | } else { 90 | SteamFriends[indexElement].setPersonaState(Steam.EPersonaState.Offline); 91 | 92 | SteamUsers[indexElement].gamesPlayed({ 93 | games_played: [{ 94 | game_id: 730 95 | }] 96 | }); 97 | 98 | if (SteamGCs[indexElement]) { 99 | IntervalIntArray[indexElement] = setInterval(function() { 100 | SteamGCs[indexElement].send({ 101 | msg: ClientHello, 102 | proto: {} 103 | }, new Protos.CMsgClientHello({}).toBuffer()); 104 | }, 2000); 105 | console.log("[GC - " + indexElement + "] Client Hello sent!"); 106 | } else { 107 | SteamClients[indexElement].disconnect(); 108 | SteamClients.splice(indexElement, 1); 109 | SteamFriends.splice(indexElement, 1); 110 | SteamGCs.splice(indexElement, 1); 111 | SteamUsers.splice(indexElement, 1); 112 | IntervalIntArray.splice(indexElement, 1); 113 | } 114 | } 115 | }); 116 | 117 | SteamClients[indexElement].on("error", function(err) { 118 | console.log("[STEAM CLIENT - " + indexElement + "] Account is probably ingame! Logged out!\n" + err); 119 | size = size - 1; 120 | if (CountReports == size) { 121 | console.log("\n\n" + CountReports + " Reports for this faggot.\nThanks for using this Service!\nCredits for the Script to askwrite & TROLOLO"); 122 | process.exit(); 123 | } 124 | SteamClients[indexElement].disconnect(); 125 | SteamClients.splice(indexElement, 1); 126 | SteamFriends.splice(indexElement, 1); 127 | SteamGCs.splice(indexElement, 1); 128 | SteamUsers.splice(indexElement, 1); 129 | IntervalIntArray.splice(indexElement, 1); 130 | }); 131 | 132 | SteamGCs[indexElement].on("message", function(header, buffer, callback) { 133 | switch (header.msg) { 134 | case ClientWelcome: 135 | clearInterval(IntervalIntArray[indexElement]); 136 | console.log("[GC - " + indexElement + "] Client Welcome received!"); 137 | console.log("[GC - " + indexElement + "] Report request sent!"); 138 | IntervalIntArray[indexElement] = setInterval(function() { 139 | sendReport(SteamGCs[indexElement], SteamClients[indexElement], account_name, steamID); 140 | }, 2000); 141 | break; 142 | case Protos.ECsgoGCMsg.k_EMsgGCCStrike15_v2_MatchmakingGC2ClientHello: 143 | console.log("[GC - " + indexElement + "] MM Client Hello sent!"); 144 | break; 145 | case Protos.ECsgoGCMsg.k_EMsgGCCStrike15_v2_ClientReportResponse: 146 | CountReports++; 147 | console.log("[GC - (" + CountReports + ")] Report with confirmation ID: " + Protos.CMsgGCCStrike15_v2_ClientReportResponse.decode(buffer).confirmationId.toString() + " sent!"); 148 | if (CountReports == size) { 149 | console.log("\n\n" + CountReports + " Reports for this faggot.\nThanks for using this Service!\nCredits for the Script to askwrite & TROLOLO"); 150 | } 151 | SteamClients[indexElement].disconnect(); 152 | SteamClients.splice(indexElement, 1); 153 | SteamFriends.splice(indexElement, 1); 154 | SteamGCs.splice(indexElement, 1); 155 | SteamUsers.splice(indexElement, 1); 156 | IntervalIntArray.splice(indexElement, 1); 157 | break; 158 | default: 159 | break; 160 | } 161 | }); 162 | } 163 | } 164 | 165 | function sendReport(GC, Client, account_name) { 166 | var account_id = new SteamID(steamID).accountid; 167 | GC.send({ 168 | msg: Protos.ECsgoGCMsg.k_EMsgGCCStrike15_v2_ClientReportPlayer, 169 | proto: {} 170 | }, new Protos.CMsgGCCStrike15_v2_ClientReportPlayer({ 171 | accountId: account_id, 172 | matchId: 8, 173 | rptAimbot: 2, 174 | rptWallhack: 3, 175 | rptSpeedhack: 4, 176 | rptTeamharm: 5, 177 | rptTextabuse: 6, 178 | rptVoiceabuse: 7 179 | }).toBuffer()); 180 | } 181 | 182 | process.on("uncaughtException", function(err) {}); 183 | 184 | console.log("Reporting SteamID: " + steamID + "\nStarting Accounts..."); 185 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "csgo-reportbot-web", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "bot.js", 6 | "dependencies": { 7 | "long": "^3.1.0", 8 | "protobufjs": "^5.0.1", 9 | "q": "^1.4.1", 10 | "readline-sync": "^1.4.4", 11 | "steam": "^1.4.0", 12 | "steamid": "^1.1.0" 13 | }, 14 | "devDependencies": {}, 15 | "scripts": { 16 | "update": "node ./protos/updater.js", 17 | "install": "npm run update", 18 | "start": "node bot.js" 19 | }, 20 | "repository": { 21 | "type": "git", 22 | "url": "Report-Bot-Web" 23 | }, 24 | "author": "askwrite, Radat.", 25 | "license": "ISC" 26 | } -------------------------------------------------------------------------------- /server/protos/protos.js: -------------------------------------------------------------------------------- 1 | var Protobuf = require("protobufjs"); 2 | 3 | Protobuf.convertFieldsToCamelCase = true; 4 | 5 | var builder = Protobuf.newBuilder(); 6 | Protobuf.loadProtoFile(__dirname + "/base_gcmessages.proto", builder); 7 | Protobuf.loadProtoFile(__dirname + "/cstrike15_gcmessages.proto", builder); 8 | Protobuf.loadProtoFile(__dirname + "/gcsdk_gcmessages.proto", builder); 9 | 10 | module.exports = builder.build(); 11 | -------------------------------------------------------------------------------- /server/protos/updater.js: -------------------------------------------------------------------------------- 1 | var fs = require("fs"); 2 | var https = require("https"); 3 | 4 | var baseUrl = "https://raw.githubusercontent.com/SteamDatabase/Protobufs/master/csgo/"; 5 | var protos = [ 6 | "base_gcmessages.proto", 7 | "steammessages.proto", 8 | "cstrike15_gcmessages.proto", 9 | "gcsdk_gcmessages.proto", 10 | "engine_gcmessages.proto" 11 | ]; 12 | 13 | fs.readdir(__dirname, function(err, filenames) { 14 | if (err) { 15 | return err; 16 | } 17 | 18 | filenames.forEach(function(filename) { 19 | if (filename != "protos.js" && filename != "updater.js") { 20 | fs.unlinkSync(__dirname + "/" + filename); 21 | } 22 | }); 23 | 24 | protos.forEach(function(proto) { 25 | var file = fs.createWriteStream(__dirname + "/" + proto); 26 | https.get(baseUrl + proto, function(response) { 27 | response.pipe(file); 28 | }); 29 | }); 30 | }); 31 | -------------------------------------------------------------------------------- /server/sentry/README.txt: -------------------------------------------------------------------------------- 1 | How to use Sentrys? 2 | 3 | Steps: 4 | 5 | 1. 6 | npm install . | To install the related stuff. 7 | 8 | 2. 9 | node steam_sentry.js | Login and put the Steam Guard Code in and youre good to go 10 | 11 | 3. Copy the ACCOUNT_NAME.sentry in the folder above. So where the bot-report-web.js is. 12 | 13 | Done. Have Fun. 14 | -------------------------------------------------------------------------------- /server/sentry/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "csgo-reportbot-web", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "bot.js", 6 | "dependencies": { 7 | "long": "^3.1.0", 8 | "protobufjs": "^5.0.1", 9 | "q": "^1.4.1", 10 | "readline-sync": "^1.4.4", 11 | "steam": "0.6.8", 12 | "steamid": "^1.1.0" 13 | }, 14 | "devDependencies": {}, 15 | "repository": { 16 | "type": "git", 17 | "url": "Report-Bot-Web" 18 | }, 19 | "author": "askwrite, Radat.", 20 | "license": "ISC" 21 | } -------------------------------------------------------------------------------- /server/sentry/steam_sentry.js: -------------------------------------------------------------------------------- 1 | // Credits to @sstokic-tgm for Sentry fix 2 | var username; 3 | var password; 4 | var steamCode; 5 | 6 | var Steam = require("steam"); 7 | var fs = require("fs"); 8 | var readline = require("readline"); 9 | 10 | var steam = new Steam.SteamClient(); 11 | 12 | var rl = readline.createInterface({ 13 | input: process.stdin, 14 | output: process.stdout 15 | }); 16 | 17 | rl.question("Username: ", function(answer) { 18 | username = answer; 19 | rl.question("Password: ", function(answer2) { 20 | password = answer2; 21 | rl.pause(); 22 | steam.logOn({ 23 | accountName: username, 24 | password: password 25 | }); 26 | }); 27 | }); 28 | 29 | steam.on("loggedOn", function(result) { 30 | console.log("Logged in"); 31 | steam.setPersonaState(Steam.EPersonaState.Online); 32 | setTimeout (function() { 33 | process.exit(); 34 | }, 10000); 35 | }); 36 | 37 | steam.on("error", function(error) { 38 | if (error.cause == "logonFail") { 39 | if (error.eresult == 63) { 40 | rl.resume(); 41 | rl.question("Steam guard code: ", function(answer) { 42 | steamCode = answer; 43 | rl.close(); 44 | steam.logOn({ 45 | accountName: username, 46 | password: password, 47 | authCode: steamCode 48 | }); 49 | }); 50 | } else { 51 | console.log("Logon fail: " + error.eresult); 52 | }; 53 | }; 54 | }); 55 | 56 | steam.on('sentry', function(data) { 57 | var format = username + ".sentry"; 58 | fs.writeFileSync(format, data); 59 | console.log("Sentry file successfully saved!"); 60 | }); 61 | -------------------------------------------------------------------------------- /web/banned.php: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Report Cheaters in CSGO. 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 |
25 | 38 |

Report Cheaters in CSGO.

39 |
40 |
41 |
42 |

Ban Info:
Last Check: '.$row['lastcheck'].' | OW Banned: '.$row['ow'].' | VAC Banned: '.$row['vac'].' | Checked Accounts: '.$row['checked'].'

';?> 46 | 50 | 51 | 52 | ID 53 | Ban Date 54 | Report Date 55 | SteamID 56 | Log 57 | OW-Ban 58 | VAC-Ban 59 | 60 | '; 61 | 62 | echo ''; 63 | while($row = mysqli_fetch_array($result)) 64 | { 65 | echo ''; 66 | echo '' . $row['id'] . ''; 67 | echo '' . $row['datum'] . ''; 68 | echo '' . $row['datum-report'] . ''; 69 | echo '' . $row['steamid'] . ''; 70 | echo 'Log'; 71 | if ($row['ow'] == 'false') 72 | { 73 | echo 'No'; 74 | } else { 75 | echo 'Yes'; 76 | } 77 | if ($row['vac'] == 'false') 78 | { 79 | echo 'No'; 80 | } else { 81 | echo 'Yes'; 82 | } 83 | echo ''; 84 | } 85 | echo ''; 86 | mysqli_close($conn); 87 | ?> 88 |
89 | 90 |
91 |

Script by © Radat. @High-Minded.net 2016

92 |
93 | 94 | 95 | 96 | 97 | 98 | 106 | 107 | -------------------------------------------------------------------------------- /web/config.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/css/narrow-jumbotron.css: -------------------------------------------------------------------------------- 1 | /* Space out content a bit */ 2 | body { 3 | padding-top: 1.5rem; 4 | padding-bottom: 1.5rem; 5 | } 6 | 7 | /* Everything but the jumbotron gets side spacing for mobile first views */ 8 | .header, 9 | .marketing, 10 | .footer { 11 | padding-right: 1rem; 12 | padding-left: 1rem; 13 | } 14 | 15 | /* Custom page header */ 16 | .header { 17 | padding-bottom: 1rem; 18 | border-bottom: .05rem solid #e5e5e5; 19 | } 20 | /* Make the masthead heading the same height as the navigation */ 21 | .header h3 { 22 | margin-top: 0; 23 | margin-bottom: 0; 24 | line-height: 3rem; 25 | } 26 | 27 | /* Custom page footer */ 28 | .footer { 29 | padding-top: 1.5rem; 30 | color: #777; 31 | border-top: .05rem solid #e5e5e5; 32 | } 33 | 34 | /* Customize container */ 35 | @media (min-width: 48em) { 36 | .container { 37 | max-width: 60rem; 38 | } 39 | } 40 | .container-narrow > hr { 41 | margin: 2rem 0; 42 | } 43 | 44 | /* Main marketing message and sign up button */ 45 | .jumbotron { 46 | text-align: center; 47 | border-bottom: .02rem solid; 48 | } 49 | .jumbotron .btn { 50 | padding: .75rem 1.5rem; 51 | font-size: 1.5rem; 52 | } 53 | 54 | /* Supporting marketing content */ 55 | .marketing { 56 | margin: 3rem 0; 57 | } 58 | .marketing p + h4 { 59 | margin-top: 1.5rem; 60 | } 61 | /* tables */ 62 | table.tablesorter thead tr .header { 63 | background-image: url(../img/bg.gif); 64 | background-repeat: no-repeat; 65 | background-position: center right; 66 | cursor: pointer; 67 | } 68 | table.tablesorter thead tr .headerSortUp { 69 | background-image: url(../img/asc.gif); 70 | } 71 | table.tablesorter thead tr .headerSortDown { 72 | background-image: url(../img/desc.gif); 73 | } 74 | /* Responsive: Portrait tablets and up */ 75 | @media screen and (min-width: 48em) { 76 | /* Remove the padding we set earlier */ 77 | .header, 78 | .marketing, 79 | .footer { 80 | padding-right: 0; 81 | padding-left: 0; 82 | } 83 | /* Space out the masthead */ 84 | .header { 85 | margin-bottom: 2rem; 86 | } 87 | /* Remove the bottom border on the jumbotron for visual effect */ 88 | .jumbotron { 89 | border-bottom: 0; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /web/header.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/img/asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ar1i/Report-Bot-Web/109acf4d3c597336476c4c4d4f7b5a8934567357/web/img/asc.gif -------------------------------------------------------------------------------- /web/img/bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ar1i/Report-Bot-Web/109acf4d3c597336476c4c4d4f7b5a8934567357/web/img/bg.gif -------------------------------------------------------------------------------- /web/img/desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ar1i/Report-Bot-Web/109acf4d3c597336476c4c4d4f7b5a8934567357/web/img/desc.gif -------------------------------------------------------------------------------- /web/img/sadcat.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Ar1i/Report-Bot-Web/109acf4d3c597336476c4c4d4f7b5a8934567357/web/img/sadcat.gif -------------------------------------------------------------------------------- /web/index.php: -------------------------------------------------------------------------------- 1 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | Private Report Bot. 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 |
32 |
33 | 46 |

Report Cheaters in CSGO.

47 |
48 | 49 |
50 | 51 |
52 | verifyResponse( 64 | $_SERVER["REMOTE_ADDR"], 65 | $_POST["g-recaptcha-response"] 66 | ); 67 | } 68 | 69 | if ($response != null && $response->success) { 70 | 71 | if (!empty($_POST['steamid'])) { 72 | $steamid = $_POST['steamid']; 73 | if (strlen($steamid) != 17) { 74 | echo '
Error: SteamID not Valid?'; 75 | } else { 76 | if (!ctype_digit($steamid)) { 77 | echo '
Error: SteamID not Valid?'; 78 | } else { 79 | if ((strpos($steamid, "765") !== false)) { 80 | $result = mysqli_query($conn,"SELECT * FROM whitelist WHERE steamid = '".$steamid."'"); 81 | $row = mysqli_fetch_array($result); 82 | if (!in_array($steamid, $row)) { 83 | $link = 'http://steamcommunity.com/profiles/'.$steamid.'?xml=1'; 84 | $xml = simplexml_load_file(rawurlencode($link)); 85 | $error = $xml->error; 86 | if ($error == 'The specified profile could not be found.') 87 | { 88 | echo '
Error: Cant find this Steam Account?'; 89 | } else { 90 | $sql = "INSERT INTO `list` (`id`, `datum`, `steamid`, `ow`, `vac`, `ip`) VALUES (NULL, CURRENT_TIMESTAMP, '".$steamid."', 'false', 'false', '".$_SERVER['REMOTE_ADDR']."');"; 91 | $conn->query($sql); 92 | mysqli_close($conn); 93 | exec('cd '.$script_path.' && node bot-report-web.js '.$steamid.' > '.$script_log_path.''.$steamid.'.txt &'); 94 | header('Location: ?l='.$steamid); 95 | } 96 | } else { 97 | 98 | echo '
Error: Account probably on the Whitelist.'; 99 | } 100 | } else { 101 | echo '
Error: SteamID not Valid?'; 102 | } 103 | } 104 | } 105 | } 106 | } else { 107 | echo '
Error: Captcha?'; 108 | } 109 | } else { 110 | echo '
Error: Password wrong?'; 111 | } 112 | } 113 | if (!empty($_GET['l'])) { 114 | $steamid = $_GET['l']; 115 | if (strlen($steamid) != 17) { 116 | echo '
Error: SteamID not Valid?'; 117 | } else { 118 | if (!ctype_digit($steamid)) { 119 | echo '
Error: SteamID not Valid?'; 120 | } else { 121 | echo '

Output of "'.$steamid.'"


'; 122 | $filename = $script_log_path.$steamid.'.txt'; 123 | if (file_exists($filename)) { 124 | if (is_readable($filename)) { 125 | $handle = fopen($filename, 'r'); 126 | if (filesize($filename) > 0) { 127 | $contents = fread($handle, filesize($filename)); 128 | fclose($handle); 129 | $contents = str_replace('\r\n', "\r\n", $contents); 130 | echo ' '; 131 | } else { 132 | echo ' '; 133 | } 134 | } 135 | } else { 136 | echo '
Cant get any Logs for SteamID: "'.$steamid.'"'; 137 | } 138 | } 139 | } 140 | } else { 141 | ?> 142 |

Report:

143 |

144 |

145 | SteamID 64: 146 |

147 | MatchID (Not needed): 148 |

149 | I understand that the Player needs to be in my game.

150 | Password: 151 |

152 |

153 | 154 |
155 |
156 |

157 | 158 | 161 |
162 | 163 |
164 | 165 | 166 | 167 | 168 | 176 | 177 |
178 |

Script by © Radat. @High-Minded.net 2016

179 |
180 | 181 |
182 | 183 | 184 | -------------------------------------------------------------------------------- /web/js/abs.js: -------------------------------------------------------------------------------- 1 | function ad_block_test(callback, testad_id) { 2 | if(typeof document.body == 'undefined') { 3 | // right now just silently fail if the body element isn't there 4 | return; 5 | } 6 | var version = "0.1.2-dev"; 7 | var testad_id = testad_id ? testad_id : "sponsorText"; 8 | var testad = document.createElement("DIV"); 9 | testad.id = testad_id; 10 | testad.style.position = "absolute"; 11 | testad.style.left = "-999px"; 12 | testad.appendChild(document.createTextNode(" ")); 13 | document.body.appendChild(testad); // add test ad to body 14 | 15 | // wait a bit and then check its height 16 | setTimeout(function() { 17 | if (testad) { 18 | var blocked = (testad.clientHeight == 0); 19 | try { 20 | // AdBlock Plus or AdBlock Edge in FFox uses -moz-binding property to hide elements 21 | // They also usually collapse the element, depending on settings. Value looks like: 22 | // url("about:abp-elemhidehit?668798490716#dummy") 23 | // blocked = blocked || (getComputedStyle(testad).getPropertyValue('-moz-binding').indexOf('about:') !== -1); 24 | } catch (err) { 25 | // log errors 26 | if(console && console.log) { console.log("ad-block-test error",err); } 27 | } 28 | callback(blocked, version); 29 | document.body.removeChild(testad); 30 | // Should testad disappearing entirely count as an ad block? 31 | // Currently it does not fire callback at all in this case 32 | } 33 | }, 175); 34 | } -------------------------------------------------------------------------------- /web/js/ie10-viewport-bug-workaround.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * IE10 viewport hack for Surface/desktop Windows 8 bug 3 | * Copyright 2014-2015 Twitter, Inc. 4 | * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 5 | */ 6 | 7 | // See the Getting Started docs for more information: 8 | // http://getbootstrap.com/getting-started/#support-ie10-width 9 | 10 | (function () { 11 | 'use strict'; 12 | 13 | if (navigator.userAgent.match(/IEMobile\/10\.0/)) { 14 | var msViewportStyle = document.createElement('style') 15 | msViewportStyle.appendChild( 16 | document.createTextNode( 17 | '@-ms-viewport{width:auto!important}' 18 | ) 19 | ) 20 | document.head.appendChild(msViewportStyle) 21 | } 22 | 23 | })(); -------------------------------------------------------------------------------- /web/js/jquery-latest.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery JavaScript Library v1.4.2 3 | * http://jquery.com/ 4 | * 5 | * Copyright 2010, John Resig 6 | * Dual licensed under the MIT or GPL Version 2 licenses. 7 | * http://jquery.org/license 8 | * 9 | * Includes Sizzle.js 10 | * http://sizzlejs.com/ 11 | * Copyright 2010, The Dojo Foundation 12 | * Released under the MIT, BSD, and GPL Licenses. 13 | * 14 | * Date: Sat Feb 13 22:33:48 2010 -0500 15 | */ 16 | (function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, 21 | Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& 22 | (d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, 23 | a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== 24 | "find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, 25 | function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
a"; 34 | var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, 35 | parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= 36 | false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= 37 | s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, 38 | applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; 39 | else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, 40 | a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== 41 | w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, 42 | cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= 47 | c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); 48 | a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, 49 | function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); 50 | k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), 51 | C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type= 53 | e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& 54 | f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; 55 | if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", 63 | e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, 64 | "_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, 65 | d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, 71 | e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); 72 | t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| 73 | g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, 80 | CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, 81 | g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, 82 | text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, 83 | setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= 84 | h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== 86 | "="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, 87 | h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& 90 | q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=""; 91 | if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="

";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); 92 | (function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: 93 | function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= 96 | {},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== 97 | "string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", 98 | d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? 99 | a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== 100 | 1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"},F={option:[1,""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= 102 | c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, 103 | wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, 104 | prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, 105 | this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); 106 | return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, 107 | ""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); 111 | return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", 112 | ""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= 113 | c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? 114 | c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= 115 | function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= 116 | Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, 117 | "border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= 118 | a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= 119 | a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== 120 | "string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, 121 | serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), 122 | function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, 123 | global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& 124 | e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? 125 | "&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== 126 | false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= 127 | false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", 128 | c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| 129 | d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); 130 | g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== 131 | 1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== 132 | "json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; 133 | if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== 139 | "number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| 140 | c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; 141 | this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= 142 | this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, 143 | e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; 149 | a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); 150 | c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, 151 | d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- 152 | f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": 153 | "pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in 154 | e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); 155 | -------------------------------------------------------------------------------- /web/js/jquery.metadata.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Metadata - jQuery plugin for parsing metadata from elements 3 | * 4 | * Copyright (c) 2006 John Resig, Yehuda Katz, J�örn Zaefferer, Paul McLanahan 5 | * 6 | * Dual licensed under the MIT and GPL licenses: 7 | * http://www.opensource.org/licenses/mit-license.php 8 | * http://www.gnu.org/licenses/gpl.html 9 | * 10 | * Revision: $Id$ 11 | * 12 | */ 13 | 14 | /** 15 | * Sets the type of metadata to use. Metadata is encoded in JSON, and each property 16 | * in the JSON will become a property of the element itself. 17 | * 18 | * There are three supported types of metadata storage: 19 | * 20 | * attr: Inside an attribute. The name parameter indicates *which* attribute. 21 | * 22 | * class: Inside the class attribute, wrapped in curly braces: { } 23 | * 24 | * elem: Inside a child element (e.g. a script tag). The 25 | * name parameter indicates *which* element. 26 | * 27 | * The metadata for an element is loaded the first time the element is accessed via jQuery. 28 | * 29 | * As a result, you can define the metadata type, use $(expr) to load the metadata into the elements 30 | * matched by expr, then redefine the metadata type and run another $(expr) for other elements. 31 | * 32 | * @name $.metadata.setType 33 | * 34 | * @example

This is a p

35 | * @before $.metadata.setType("class") 36 | * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 37 | * @desc Reads metadata from the class attribute 38 | * 39 | * @example

This is a p

40 | * @before $.metadata.setType("attr", "data") 41 | * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 42 | * @desc Reads metadata from a "data" attribute 43 | * 44 | * @example

This is a p

45 | * @before $.metadata.setType("elem", "script") 46 | * @after $("#one").metadata().item_id == 1; $("#one").metadata().item_label == "Label" 47 | * @desc Reads metadata from a nested script element 48 | * 49 | * @param String type The encoding type 50 | * @param String name The name of the attribute to be used to get metadata (optional) 51 | * @cat Plugins/Metadata 52 | * @descr Sets the type of encoding to be used when loading metadata for the first time 53 | * @type undefined 54 | * @see metadata() 55 | */ 56 | 57 | (function($) { 58 | 59 | $.extend({ 60 | metadata : { 61 | defaults : { 62 | type: 'class', 63 | name: 'metadata', 64 | cre: /({.*})/, 65 | single: 'metadata' 66 | }, 67 | setType: function( type, name ){ 68 | this.defaults.type = type; 69 | this.defaults.name = name; 70 | }, 71 | get: function( elem, opts ){ 72 | var settings = $.extend({},this.defaults,opts); 73 | // check for empty string in single property 74 | if ( !settings.single.length ) settings.single = 'metadata'; 75 | 76 | var data = $.data(elem, settings.single); 77 | // returned cached data if it already exists 78 | if ( data ) return data; 79 | 80 | data = "{}"; 81 | 82 | if ( settings.type == "class" ) { 83 | var m = settings.cre.exec( elem.className ); 84 | if ( m ) 85 | data = m[1]; 86 | } else if ( settings.type == "elem" ) { 87 | if( !elem.getElementsByTagName ) 88 | return undefined; 89 | var e = elem.getElementsByTagName(settings.name); 90 | if ( e.length ) 91 | data = $.trim(e[0].innerHTML); 92 | } else if ( elem.getAttribute != undefined ) { 93 | var attr = elem.getAttribute( settings.name ); 94 | if ( attr ) 95 | data = attr; 96 | } 97 | 98 | if ( data.indexOf( '{' ) <0 ) 99 | data = "{" + data + "}"; 100 | 101 | data = eval("(" + data + ")"); 102 | 103 | $.data( elem, settings.single, data ); 104 | return data; 105 | } 106 | } 107 | }); 108 | 109 | /** 110 | * Returns the metadata object for the first member of the jQuery object. 111 | * 112 | * @name metadata 113 | * @descr Returns element's metadata object 114 | * @param Object opts An object contianing settings to override the defaults 115 | * @type jQuery 116 | * @cat Plugins/Metadata 117 | */ 118 | $.fn.metadata = function( opts ){ 119 | return $.metadata.get( this[0], opts ); 120 | }; 121 | 122 | })(jQuery); -------------------------------------------------------------------------------- /web/js/jquery.tablesorter.js: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * TableSorter 2.0 - Client-side table sorting with ease! 4 | * Version 2.0.5b 5 | * @requires jQuery v1.2.3 6 | * 7 | * Copyright (c) 2007 Christian Bach 8 | * Examples and docs at: http://tablesorter.com 9 | * Dual licensed under the MIT and GPL licenses: 10 | * http://www.opensource.org/licenses/mit-license.php 11 | * http://www.gnu.org/licenses/gpl.html 12 | * 13 | */ 14 | /** 15 | * 16 | * @description Create a sortable table with multi-column sorting capabilitys 17 | * 18 | * @example $('table').tablesorter(); 19 | * @desc Create a simple tablesorter interface. 20 | * 21 | * @example $('table').tablesorter({ sortList:[[0,0],[1,0]] }); 22 | * @desc Create a tablesorter interface and sort on the first and secound column column headers. 23 | * 24 | * @example $('table').tablesorter({ headers: { 0: { sorter: false}, 1: {sorter: false} } }); 25 | * 26 | * @desc Create a tablesorter interface and disableing the first and second column headers. 27 | * 28 | * 29 | * @example $('table').tablesorter({ headers: { 0: {sorter:"integer"}, 1: {sorter:"currency"} } }); 30 | * 31 | * @desc Create a tablesorter interface and set a column parser for the first 32 | * and second column. 33 | * 34 | * 35 | * @param Object 36 | * settings An object literal containing key/value pairs to provide 37 | * optional settings. 38 | * 39 | * 40 | * @option String cssHeader (optional) A string of the class name to be appended 41 | * to sortable tr elements in the thead of the table. Default value: 42 | * "header" 43 | * 44 | * @option String cssAsc (optional) A string of the class name to be appended to 45 | * sortable tr elements in the thead on a ascending sort. Default value: 46 | * "headerSortUp" 47 | * 48 | * @option String cssDesc (optional) A string of the class name to be appended 49 | * to sortable tr elements in the thead on a descending sort. Default 50 | * value: "headerSortDown" 51 | * 52 | * @option String sortInitialOrder (optional) A string of the inital sorting 53 | * order can be asc or desc. Default value: "asc" 54 | * 55 | * @option String sortMultisortKey (optional) A string of the multi-column sort 56 | * key. Default value: "shiftKey" 57 | * 58 | * @option String textExtraction (optional) A string of the text-extraction 59 | * method to use. For complex html structures inside td cell set this 60 | * option to "complex", on large tables the complex option can be slow. 61 | * Default value: "simple" 62 | * 63 | * @option Object headers (optional) An array containing the forces sorting 64 | * rules. This option let's you specify a default sorting rule. Default 65 | * value: null 66 | * 67 | * @option Array sortList (optional) An array containing the forces sorting 68 | * rules. This option let's you specify a default sorting rule. Default 69 | * value: null 70 | * 71 | * @option Array sortForce (optional) An array containing forced sorting rules. 72 | * This option let's you specify a default sorting rule, which is 73 | * prepended to user-selected rules. Default value: null 74 | * 75 | * @option Boolean sortLocaleCompare (optional) Boolean flag indicating whatever 76 | * to use String.localeCampare method or not. Default set to true. 77 | * 78 | * 79 | * @option Array sortAppend (optional) An array containing forced sorting rules. 80 | * This option let's you specify a default sorting rule, which is 81 | * appended to user-selected rules. Default value: null 82 | * 83 | * @option Boolean widthFixed (optional) Boolean flag indicating if tablesorter 84 | * should apply fixed widths to the table columns. This is usefull when 85 | * using the pager companion plugin. This options requires the dimension 86 | * jquery plugin. Default value: false 87 | * 88 | * @option Boolean cancelSelection (optional) Boolean flag indicating if 89 | * tablesorter should cancel selection of the table headers text. 90 | * Default value: true 91 | * 92 | * @option Boolean debug (optional) Boolean flag indicating if tablesorter 93 | * should display debuging information usefull for development. 94 | * 95 | * @type jQuery 96 | * 97 | * @name tablesorter 98 | * 99 | * @cat Plugins/Tablesorter 100 | * 101 | * @author Christian Bach/christian.bach@polyester.se 102 | */ 103 | 104 | (function ($) { 105 | $.extend({ 106 | tablesorter: new 107 | function () { 108 | 109 | var parsers = [], 110 | widgets = []; 111 | 112 | this.defaults = { 113 | cssHeader: "header", 114 | cssAsc: "headerSortUp", 115 | cssDesc: "headerSortDown", 116 | cssChildRow: "expand-child", 117 | sortInitialOrder: "asc", 118 | sortMultiSortKey: "shiftKey", 119 | sortForce: null, 120 | sortAppend: null, 121 | sortLocaleCompare: true, 122 | textExtraction: "simple", 123 | parsers: {}, widgets: [], 124 | widgetZebra: { 125 | css: ["even", "odd"] 126 | }, headers: {}, widthFixed: false, 127 | cancelSelection: true, 128 | sortList: [], 129 | headerList: [], 130 | dateFormat: "us", 131 | decimal: '/\.|\,/g', 132 | onRenderHeader: null, 133 | selectorHeaders: 'thead th', 134 | debug: false 135 | }; 136 | 137 | /* debuging utils */ 138 | 139 | function benchmark(s, d) { 140 | log(s + "," + (new Date().getTime() - d.getTime()) + "ms"); 141 | } 142 | 143 | this.benchmark = benchmark; 144 | 145 | function log(s) { 146 | if (typeof console != "undefined" && typeof console.debug != "undefined") { 147 | console.log(s); 148 | } else { 149 | alert(s); 150 | } 151 | } 152 | 153 | /* parsers utils */ 154 | 155 | function buildParserCache(table, $headers) { 156 | 157 | if (table.config.debug) { 158 | var parsersDebug = ""; 159 | } 160 | 161 | if (table.tBodies.length == 0) return; // In the case of empty tables 162 | var rows = table.tBodies[0].rows; 163 | 164 | if (rows[0]) { 165 | 166 | var list = [], 167 | cells = rows[0].cells, 168 | l = cells.length; 169 | 170 | for (var i = 0; i < l; i++) { 171 | 172 | var p = false; 173 | 174 | if ($.metadata && ($($headers[i]).metadata() && $($headers[i]).metadata().sorter)) { 175 | 176 | p = getParserById($($headers[i]).metadata().sorter); 177 | 178 | } else if ((table.config.headers[i] && table.config.headers[i].sorter)) { 179 | 180 | p = getParserById(table.config.headers[i].sorter); 181 | } 182 | if (!p) { 183 | 184 | p = detectParserForColumn(table, rows, -1, i); 185 | } 186 | 187 | if (table.config.debug) { 188 | parsersDebug += "column:" + i + " parser:" + p.id + "\n"; 189 | } 190 | 191 | list.push(p); 192 | } 193 | } 194 | 195 | if (table.config.debug) { 196 | log(parsersDebug); 197 | } 198 | 199 | return list; 200 | }; 201 | 202 | function detectParserForColumn(table, rows, rowIndex, cellIndex) { 203 | var l = parsers.length, 204 | node = false, 205 | nodeValue = false, 206 | keepLooking = true; 207 | while (nodeValue == '' && keepLooking) { 208 | rowIndex++; 209 | if (rows[rowIndex]) { 210 | node = getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex); 211 | nodeValue = trimAndGetNodeText(table.config, node); 212 | if (table.config.debug) { 213 | log('Checking if value was empty on row:' + rowIndex); 214 | } 215 | } else { 216 | keepLooking = false; 217 | } 218 | } 219 | for (var i = 1; i < l; i++) { 220 | if (parsers[i].is(nodeValue, table, node)) { 221 | return parsers[i]; 222 | } 223 | } 224 | // 0 is always the generic parser (text) 225 | return parsers[0]; 226 | } 227 | 228 | function getNodeFromRowAndCellIndex(rows, rowIndex, cellIndex) { 229 | return rows[rowIndex].cells[cellIndex]; 230 | } 231 | 232 | function trimAndGetNodeText(config, node) { 233 | return $.trim(getElementText(config, node)); 234 | } 235 | 236 | function getParserById(name) { 237 | var l = parsers.length; 238 | for (var i = 0; i < l; i++) { 239 | if (parsers[i].id.toLowerCase() == name.toLowerCase()) { 240 | return parsers[i]; 241 | } 242 | } 243 | return false; 244 | } 245 | 246 | /* utils */ 247 | 248 | function buildCache(table) { 249 | 250 | if (table.config.debug) { 251 | var cacheTime = new Date(); 252 | } 253 | 254 | var totalRows = (table.tBodies[0] && table.tBodies[0].rows.length) || 0, 255 | totalCells = (table.tBodies[0].rows[0] && table.tBodies[0].rows[0].cells.length) || 0, 256 | parsers = table.config.parsers, 257 | cache = { 258 | row: [], 259 | normalized: [] 260 | }; 261 | 262 | for (var i = 0; i < totalRows; ++i) { 263 | 264 | /** Add the table data to main data array */ 265 | var c = $(table.tBodies[0].rows[i]), 266 | cols = []; 267 | 268 | // if this is a child row, add it to the last row's children and 269 | // continue to the next row 270 | if (c.hasClass(table.config.cssChildRow)) { 271 | cache.row[cache.row.length - 1] = cache.row[cache.row.length - 1].add(c); 272 | // go to the next for loop 273 | continue; 274 | } 275 | 276 | cache.row.push(c); 277 | 278 | for (var j = 0; j < totalCells; ++j) { 279 | cols.push(parsers[j].format(getElementText(table.config, c[0].cells[j]), table, c[0].cells[j])); 280 | } 281 | 282 | cols.push(cache.normalized.length); // add position for rowCache 283 | cache.normalized.push(cols); 284 | cols = null; 285 | }; 286 | 287 | if (table.config.debug) { 288 | benchmark("Building cache for " + totalRows + " rows:", cacheTime); 289 | } 290 | 291 | return cache; 292 | }; 293 | 294 | function getElementText(config, node) { 295 | 296 | var text = ""; 297 | 298 | if (!node) return ""; 299 | 300 | if (!config.supportsTextContent) config.supportsTextContent = node.textContent || false; 301 | 302 | if (config.textExtraction == "simple") { 303 | if (config.supportsTextContent) { 304 | text = node.textContent; 305 | } else { 306 | if (node.childNodes[0] && node.childNodes[0].hasChildNodes()) { 307 | text = node.childNodes[0].innerHTML; 308 | } else { 309 | text = node.innerHTML; 310 | } 311 | } 312 | } else { 313 | if (typeof(config.textExtraction) == "function") { 314 | text = config.textExtraction(node); 315 | } else { 316 | text = $(node).text(); 317 | } 318 | } 319 | return text; 320 | } 321 | 322 | function appendToTable(table, cache) { 323 | 324 | if (table.config.debug) { 325 | var appendTime = new Date() 326 | } 327 | 328 | var c = cache, 329 | r = c.row, 330 | n = c.normalized, 331 | totalRows = n.length, 332 | checkCell = (n[0].length - 1), 333 | tableBody = $(table.tBodies[0]), 334 | rows = []; 335 | 336 | 337 | for (var i = 0; i < totalRows; i++) { 338 | var pos = n[i][checkCell]; 339 | 340 | rows.push(r[pos]); 341 | 342 | if (!table.config.appender) { 343 | 344 | //var o = ; 345 | var l = r[pos].length; 346 | for (var j = 0; j < l; j++) { 347 | tableBody[0].appendChild(r[pos][j]); 348 | } 349 | 350 | // 351 | } 352 | } 353 | 354 | 355 | 356 | if (table.config.appender) { 357 | 358 | table.config.appender(table, rows); 359 | } 360 | 361 | rows = null; 362 | 363 | if (table.config.debug) { 364 | benchmark("Rebuilt table:", appendTime); 365 | } 366 | 367 | // apply table widgets 368 | applyWidget(table); 369 | 370 | // trigger sortend 371 | setTimeout(function () { 372 | $(table).trigger("sortEnd"); 373 | }, 0); 374 | 375 | }; 376 | 377 | function buildHeaders(table) { 378 | 379 | if (table.config.debug) { 380 | var time = new Date(); 381 | } 382 | 383 | var meta = ($.metadata) ? true : false; 384 | 385 | var header_index = computeTableHeaderCellIndexes(table); 386 | 387 | $tableHeaders = $(table.config.selectorHeaders, table).each(function (index) { 388 | 389 | this.column = header_index[this.parentNode.rowIndex + "-" + this.cellIndex]; 390 | // this.column = index; 391 | this.order = formatSortingOrder(table.config.sortInitialOrder); 392 | 393 | 394 | this.count = this.order; 395 | 396 | if (checkHeaderMetadata(this) || checkHeaderOptions(table, index)) this.sortDisabled = true; 397 | if (checkHeaderOptionsSortingLocked(table, index)) this.order = this.lockedOrder = checkHeaderOptionsSortingLocked(table, index); 398 | 399 | if (!this.sortDisabled) { 400 | var $th = $(this).addClass(table.config.cssHeader); 401 | if (table.config.onRenderHeader) table.config.onRenderHeader.apply($th); 402 | } 403 | 404 | // add cell to headerList 405 | table.config.headerList[index] = this; 406 | }); 407 | 408 | if (table.config.debug) { 409 | benchmark("Built headers:", time); 410 | log($tableHeaders); 411 | } 412 | 413 | return $tableHeaders; 414 | 415 | }; 416 | 417 | // from: 418 | // http://www.javascripttoolbox.com/lib/table/examples.php 419 | // http://www.javascripttoolbox.com/temp/table_cellindex.html 420 | 421 | 422 | function computeTableHeaderCellIndexes(t) { 423 | var matrix = []; 424 | var lookup = {}; 425 | var thead = t.getElementsByTagName('THEAD')[0]; 426 | var trs = thead.getElementsByTagName('TR'); 427 | 428 | for (var i = 0; i < trs.length; i++) { 429 | var cells = trs[i].cells; 430 | for (var j = 0; j < cells.length; j++) { 431 | var c = cells[j]; 432 | 433 | var rowIndex = c.parentNode.rowIndex; 434 | var cellId = rowIndex + "-" + c.cellIndex; 435 | var rowSpan = c.rowSpan || 1; 436 | var colSpan = c.colSpan || 1 437 | var firstAvailCol; 438 | if (typeof(matrix[rowIndex]) == "undefined") { 439 | matrix[rowIndex] = []; 440 | } 441 | // Find first available column in the first row 442 | for (var k = 0; k < matrix[rowIndex].length + 1; k++) { 443 | if (typeof(matrix[rowIndex][k]) == "undefined") { 444 | firstAvailCol = k; 445 | break; 446 | } 447 | } 448 | lookup[cellId] = firstAvailCol; 449 | for (var k = rowIndex; k < rowIndex + rowSpan; k++) { 450 | if (typeof(matrix[k]) == "undefined") { 451 | matrix[k] = []; 452 | } 453 | var matrixrow = matrix[k]; 454 | for (var l = firstAvailCol; l < firstAvailCol + colSpan; l++) { 455 | matrixrow[l] = "x"; 456 | } 457 | } 458 | } 459 | } 460 | return lookup; 461 | } 462 | 463 | function checkCellColSpan(table, rows, row) { 464 | var arr = [], 465 | r = table.tHead.rows, 466 | c = r[row].cells; 467 | 468 | for (var i = 0; i < c.length; i++) { 469 | var cell = c[i]; 470 | 471 | if (cell.colSpan > 1) { 472 | arr = arr.concat(checkCellColSpan(table, headerArr, row++)); 473 | } else { 474 | if (table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row + 1])) { 475 | arr.push(cell); 476 | } 477 | // headerArr[row] = (i+row); 478 | } 479 | } 480 | return arr; 481 | }; 482 | 483 | function checkHeaderMetadata(cell) { 484 | if (($.metadata) && ($(cell).metadata().sorter === false)) { 485 | return true; 486 | }; 487 | return false; 488 | } 489 | 490 | function checkHeaderOptions(table, i) { 491 | if ((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { 492 | return true; 493 | }; 494 | return false; 495 | } 496 | 497 | function checkHeaderOptionsSortingLocked(table, i) { 498 | if ((table.config.headers[i]) && (table.config.headers[i].lockedOrder)) return table.config.headers[i].lockedOrder; 499 | return false; 500 | } 501 | 502 | function applyWidget(table) { 503 | var c = table.config.widgets; 504 | var l = c.length; 505 | for (var i = 0; i < l; i++) { 506 | 507 | getWidgetById(c[i]).format(table); 508 | } 509 | 510 | } 511 | 512 | function getWidgetById(name) { 513 | var l = widgets.length; 514 | for (var i = 0; i < l; i++) { 515 | if (widgets[i].id.toLowerCase() == name.toLowerCase()) { 516 | return widgets[i]; 517 | } 518 | } 519 | }; 520 | 521 | function formatSortingOrder(v) { 522 | if (typeof(v) != "Number") { 523 | return (v.toLowerCase() == "desc") ? 1 : 0; 524 | } else { 525 | return (v == 1) ? 1 : 0; 526 | } 527 | } 528 | 529 | function isValueInArray(v, a) { 530 | var l = a.length; 531 | for (var i = 0; i < l; i++) { 532 | if (a[i][0] == v) { 533 | return true; 534 | } 535 | } 536 | return false; 537 | } 538 | 539 | function setHeadersCss(table, $headers, list, css) { 540 | // remove all header information 541 | $headers.removeClass(css[0]).removeClass(css[1]); 542 | 543 | var h = []; 544 | $headers.each(function (offset) { 545 | if (!this.sortDisabled) { 546 | h[this.column] = $(this); 547 | } 548 | }); 549 | 550 | var l = list.length; 551 | for (var i = 0; i < l; i++) { 552 | h[list[i][0]].addClass(css[list[i][1]]); 553 | } 554 | } 555 | 556 | function fixColumnWidth(table, $headers) { 557 | var c = table.config; 558 | if (c.widthFixed) { 559 | var colgroup = $(''); 560 | $("tr:first td", table.tBodies[0]).each(function () { 561 | colgroup.append($('').css('width', $(this).width())); 562 | }); 563 | $(table).prepend(colgroup); 564 | }; 565 | } 566 | 567 | function updateHeaderSortCount(table, sortList) { 568 | var c = table.config, 569 | l = sortList.length; 570 | for (var i = 0; i < l; i++) { 571 | var s = sortList[i], 572 | o = c.headerList[s[0]]; 573 | o.count = s[1]; 574 | o.count++; 575 | } 576 | } 577 | 578 | /* sorting methods */ 579 | 580 | function multisort(table, sortList, cache) { 581 | 582 | if (table.config.debug) { 583 | var sortTime = new Date(); 584 | } 585 | 586 | var dynamicExp = "var sortWrapper = function(a,b) {", 587 | l = sortList.length; 588 | 589 | // TODO: inline functions. 590 | for (var i = 0; i < l; i++) { 591 | 592 | var c = sortList[i][0]; 593 | var order = sortList[i][1]; 594 | // var s = (getCachedSortType(table.config.parsers,c) == "text") ? 595 | // ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? 596 | // "sortNumeric" : "sortNumericDesc"); 597 | // var s = (table.config.parsers[c].type == "text") ? ((order == 0) 598 | // ? makeSortText(c) : makeSortTextDesc(c)) : ((order == 0) ? 599 | // makeSortNumeric(c) : makeSortNumericDesc(c)); 600 | var s = (table.config.parsers[c].type == "text") ? ((order == 0) ? makeSortFunction("text", "asc", c) : makeSortFunction("text", "desc", c)) : ((order == 0) ? makeSortFunction("numeric", "asc", c) : makeSortFunction("numeric", "desc", c)); 601 | var e = "e" + i; 602 | 603 | dynamicExp += "var " + e + " = " + s; // + "(a[" + c + "],b[" + c 604 | // + "]); "; 605 | dynamicExp += "if(" + e + ") { return " + e + "; } "; 606 | dynamicExp += "else { "; 607 | 608 | } 609 | 610 | // if value is the same keep orignal order 611 | var orgOrderCol = cache.normalized[0].length - 1; 612 | dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];"; 613 | 614 | for (var i = 0; i < l; i++) { 615 | dynamicExp += "}; "; 616 | } 617 | 618 | dynamicExp += "return 0; "; 619 | dynamicExp += "}; "; 620 | 621 | if (table.config.debug) { 622 | benchmark("Evaling expression:" + dynamicExp, new Date()); 623 | } 624 | 625 | eval(dynamicExp); 626 | 627 | cache.normalized.sort(sortWrapper); 628 | 629 | if (table.config.debug) { 630 | benchmark("Sorting on " + sortList.toString() + " and dir " + order + " time:", sortTime); 631 | } 632 | 633 | return cache; 634 | }; 635 | 636 | function makeSortFunction(type, direction, index) { 637 | var a = "a[" + index + "]", 638 | b = "b[" + index + "]"; 639 | if (type == 'text' && direction == 'asc') { 640 | return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + a + " < " + b + ") ? -1 : 1 )));"; 641 | } else if (type == 'text' && direction == 'desc') { 642 | return "(" + a + " == " + b + " ? 0 : (" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : (" + b + " < " + a + ") ? -1 : 1 )));"; 643 | } else if (type == 'numeric' && direction == 'asc') { 644 | return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + a + " - " + b + "));"; 645 | } else if (type == 'numeric' && direction == 'desc') { 646 | return "(" + a + " === null && " + b + " === null) ? 0 :(" + a + " === null ? Number.POSITIVE_INFINITY : (" + b + " === null ? Number.NEGATIVE_INFINITY : " + b + " - " + a + "));"; 647 | } 648 | }; 649 | 650 | function makeSortText(i) { 651 | return "((a[" + i + "] < b[" + i + "]) ? -1 : ((a[" + i + "] > b[" + i + "]) ? 1 : 0));"; 652 | }; 653 | 654 | function makeSortTextDesc(i) { 655 | return "((b[" + i + "] < a[" + i + "]) ? -1 : ((b[" + i + "] > a[" + i + "]) ? 1 : 0));"; 656 | }; 657 | 658 | function makeSortNumeric(i) { 659 | return "a[" + i + "]-b[" + i + "];"; 660 | }; 661 | 662 | function makeSortNumericDesc(i) { 663 | return "b[" + i + "]-a[" + i + "];"; 664 | }; 665 | 666 | function sortText(a, b) { 667 | if (table.config.sortLocaleCompare) return a.localeCompare(b); 668 | return ((a < b) ? -1 : ((a > b) ? 1 : 0)); 669 | }; 670 | 671 | function sortTextDesc(a, b) { 672 | if (table.config.sortLocaleCompare) return b.localeCompare(a); 673 | return ((b < a) ? -1 : ((b > a) ? 1 : 0)); 674 | }; 675 | 676 | function sortNumeric(a, b) { 677 | return a - b; 678 | }; 679 | 680 | function sortNumericDesc(a, b) { 681 | return b - a; 682 | }; 683 | 684 | function getCachedSortType(parsers, i) { 685 | return parsers[i].type; 686 | }; /* public methods */ 687 | this.construct = function (settings) { 688 | return this.each(function () { 689 | // if no thead or tbody quit. 690 | if (!this.tHead || !this.tBodies) return; 691 | // declare 692 | var $this, $document, $headers, cache, config, shiftDown = 0, 693 | sortOrder; 694 | // new blank config object 695 | this.config = {}; 696 | // merge and extend. 697 | config = $.extend(this.config, $.tablesorter.defaults, settings); 698 | // store common expression for speed 699 | $this = $(this); 700 | // save the settings where they read 701 | $.data(this, "tablesorter", config); 702 | // build headers 703 | $headers = buildHeaders(this); 704 | // try to auto detect column type, and store in tables config 705 | this.config.parsers = buildParserCache(this, $headers); 706 | // build the cache for the tbody cells 707 | cache = buildCache(this); 708 | // get the css class names, could be done else where. 709 | var sortCSS = [config.cssDesc, config.cssAsc]; 710 | // fixate columns if the users supplies the fixedWidth option 711 | fixColumnWidth(this); 712 | // apply event handling to headers 713 | // this is to big, perhaps break it out? 714 | $headers.click( 715 | 716 | function (e) { 717 | var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0; 718 | if (!this.sortDisabled && totalRows > 0) { 719 | // Only call sortStart if sorting is 720 | // enabled. 721 | $this.trigger("sortStart"); 722 | // store exp, for speed 723 | var $cell = $(this); 724 | // get current column index 725 | var i = this.column; 726 | // get current column sort order 727 | this.order = this.count++ % 2; 728 | // always sort on the locked order. 729 | if(this.lockedOrder) this.order = this.lockedOrder; 730 | 731 | // user only whants to sort on one 732 | // column 733 | if (!e[config.sortMultiSortKey]) { 734 | // flush the sort list 735 | config.sortList = []; 736 | if (config.sortForce != null) { 737 | var a = config.sortForce; 738 | for (var j = 0; j < a.length; j++) { 739 | if (a[j][0] != i) { 740 | config.sortList.push(a[j]); 741 | } 742 | } 743 | } 744 | // add column to sort list 745 | config.sortList.push([i, this.order]); 746 | // multi column sorting 747 | } else { 748 | // the user has clicked on an all 749 | // ready sortet column. 750 | if (isValueInArray(i, config.sortList)) { 751 | // revers the sorting direction 752 | // for all tables. 753 | for (var j = 0; j < config.sortList.length; j++) { 754 | var s = config.sortList[j], 755 | o = config.headerList[s[0]]; 756 | if (s[0] == i) { 757 | o.count = s[1]; 758 | o.count++; 759 | s[1] = o.count % 2; 760 | } 761 | } 762 | } else { 763 | // add column to sort list array 764 | config.sortList.push([i, this.order]); 765 | } 766 | }; 767 | setTimeout(function () { 768 | // set css for headers 769 | setHeadersCss($this[0], $headers, config.sortList, sortCSS); 770 | appendToTable( 771 | $this[0], multisort( 772 | $this[0], config.sortList, cache) 773 | ); 774 | }, 1); 775 | // stop normal event by returning false 776 | return false; 777 | } 778 | // cancel selection 779 | }).mousedown(function () { 780 | if (config.cancelSelection) { 781 | this.onselectstart = function () { 782 | return false 783 | }; 784 | return false; 785 | } 786 | }); 787 | // apply easy methods that trigger binded events 788 | $this.bind("update", function () { 789 | var me = this; 790 | setTimeout(function () { 791 | // rebuild parsers. 792 | me.config.parsers = buildParserCache( 793 | me, $headers); 794 | // rebuild the cache map 795 | cache = buildCache(me); 796 | }, 1); 797 | }).bind("updateCell", function (e, cell) { 798 | var config = this.config; 799 | // get position from the dom. 800 | var pos = [(cell.parentNode.rowIndex - 1), cell.cellIndex]; 801 | // update cache 802 | cache.normalized[pos[0]][pos[1]] = config.parsers[pos[1]].format( 803 | getElementText(config, cell), cell); 804 | }).bind("sorton", function (e, list) { 805 | $(this).trigger("sortStart"); 806 | config.sortList = list; 807 | // update and store the sortlist 808 | var sortList = config.sortList; 809 | // update header count index 810 | updateHeaderSortCount(this, sortList); 811 | // set css for headers 812 | setHeadersCss(this, $headers, sortList, sortCSS); 813 | // sort the table and append it to the dom 814 | appendToTable(this, multisort(this, sortList, cache)); 815 | }).bind("appendCache", function () { 816 | appendToTable(this, cache); 817 | }).bind("applyWidgetId", function (e, id) { 818 | getWidgetById(id).format(this); 819 | }).bind("applyWidgets", function () { 820 | // apply widgets 821 | applyWidget(this); 822 | }); 823 | if ($.metadata && ($(this).metadata() && $(this).metadata().sortlist)) { 824 | config.sortList = $(this).metadata().sortlist; 825 | } 826 | // if user has supplied a sort list to constructor. 827 | if (config.sortList.length > 0) { 828 | $this.trigger("sorton", [config.sortList]); 829 | } 830 | // apply widgets 831 | applyWidget(this); 832 | }); 833 | }; 834 | this.addParser = function (parser) { 835 | var l = parsers.length, 836 | a = true; 837 | for (var i = 0; i < l; i++) { 838 | if (parsers[i].id.toLowerCase() == parser.id.toLowerCase()) { 839 | a = false; 840 | } 841 | } 842 | if (a) { 843 | parsers.push(parser); 844 | }; 845 | }; 846 | this.addWidget = function (widget) { 847 | widgets.push(widget); 848 | }; 849 | this.formatFloat = function (s) { 850 | var i = parseFloat(s); 851 | return (isNaN(i)) ? 0 : i; 852 | }; 853 | this.formatInt = function (s) { 854 | var i = parseInt(s); 855 | return (isNaN(i)) ? 0 : i; 856 | }; 857 | this.isDigit = function (s, config) { 858 | // replace all an wanted chars and match. 859 | return /^[-+]?\d*$/.test($.trim(s.replace(/[,.']/g, ''))); 860 | }; 861 | this.clearTableBody = function (table) { 862 | if ($.browser.msie) { 863 | function empty() { 864 | while (this.firstChild) 865 | this.removeChild(this.firstChild); 866 | } 867 | empty.apply(table.tBodies[0]); 868 | } else { 869 | table.tBodies[0].innerHTML = ""; 870 | } 871 | }; 872 | } 873 | }); 874 | 875 | // extend plugin scope 876 | $.fn.extend({ 877 | tablesorter: $.tablesorter.construct 878 | }); 879 | 880 | // make shortcut 881 | var ts = $.tablesorter; 882 | 883 | // add default parsers 884 | ts.addParser({ 885 | id: "text", 886 | is: function (s) { 887 | return true; 888 | }, format: function (s) { 889 | return $.trim(s.toLocaleLowerCase()); 890 | }, type: "text" 891 | }); 892 | 893 | ts.addParser({ 894 | id: "digit", 895 | is: function (s, table) { 896 | var c = table.config; 897 | return $.tablesorter.isDigit(s, c); 898 | }, format: function (s) { 899 | return $.tablesorter.formatFloat(s); 900 | }, type: "numeric" 901 | }); 902 | 903 | ts.addParser({ 904 | id: "currency", 905 | is: function (s) { 906 | return /^[£$€?.]/.test(s); 907 | }, format: function (s) { 908 | return $.tablesorter.formatFloat(s.replace(new RegExp(/[£$€]/g), "")); 909 | }, type: "numeric" 910 | }); 911 | 912 | ts.addParser({ 913 | id: "ipAddress", 914 | is: function (s) { 915 | return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s); 916 | }, format: function (s) { 917 | var a = s.split("."), 918 | r = "", 919 | l = a.length; 920 | for (var i = 0; i < l; i++) { 921 | var item = a[i]; 922 | if (item.length == 2) { 923 | r += "0" + item; 924 | } else { 925 | r += item; 926 | } 927 | } 928 | return $.tablesorter.formatFloat(r); 929 | }, type: "numeric" 930 | }); 931 | 932 | ts.addParser({ 933 | id: "url", 934 | is: function (s) { 935 | return /^(https?|ftp|file):\/\/$/.test(s); 936 | }, format: function (s) { 937 | return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//), '')); 938 | }, type: "text" 939 | }); 940 | 941 | ts.addParser({ 942 | id: "isoDate", 943 | is: function (s) { 944 | return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s); 945 | }, format: function (s) { 946 | return $.tablesorter.formatFloat((s != "") ? new Date(s.replace( 947 | new RegExp(/-/g), "/")).getTime() : "0"); 948 | }, type: "numeric" 949 | }); 950 | 951 | ts.addParser({ 952 | id: "percent", 953 | is: function (s) { 954 | return /\%$/.test($.trim(s)); 955 | }, format: function (s) { 956 | return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g), "")); 957 | }, type: "numeric" 958 | }); 959 | 960 | ts.addParser({ 961 | id: "usLongDate", 962 | is: function (s) { 963 | return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)); 964 | }, format: function (s) { 965 | return $.tablesorter.formatFloat(new Date(s).getTime()); 966 | }, type: "numeric" 967 | }); 968 | 969 | ts.addParser({ 970 | id: "shortDate", 971 | is: function (s) { 972 | return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s); 973 | }, format: function (s, table) { 974 | var c = table.config; 975 | s = s.replace(/\-/g, "/"); 976 | if (c.dateFormat == "us") { 977 | // reformat the string in ISO format 978 | s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2"); 979 | } else if (c.dateFormat == "uk") { 980 | // reformat the string in ISO format 981 | s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1"); 982 | } else if (c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") { 983 | s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3"); 984 | } 985 | return $.tablesorter.formatFloat(new Date(s).getTime()); 986 | }, type: "numeric" 987 | }); 988 | ts.addParser({ 989 | id: "time", 990 | is: function (s) { 991 | return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s); 992 | }, format: function (s) { 993 | return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime()); 994 | }, type: "numeric" 995 | }); 996 | ts.addParser({ 997 | id: "metadata", 998 | is: function (s) { 999 | return false; 1000 | }, format: function (s, table, cell) { 1001 | var c = table.config, 1002 | p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName; 1003 | return $(cell).metadata()[p]; 1004 | }, type: "numeric" 1005 | }); 1006 | // add default widgets 1007 | ts.addWidget({ 1008 | id: "zebra", 1009 | format: function (table) { 1010 | if (table.config.debug) { 1011 | var time = new Date(); 1012 | } 1013 | var $tr, row = -1, 1014 | odd; 1015 | // loop through the visible rows 1016 | $("tr:visible", table.tBodies[0]).each(function (i) { 1017 | $tr = $(this); 1018 | // style children rows the same way the parent 1019 | // row was styled 1020 | if (!$tr.hasClass(table.config.cssChildRow)) row++; 1021 | odd = (row % 2 == 0); 1022 | $tr.removeClass( 1023 | table.config.widgetZebra.css[odd ? 0 : 1]).addClass( 1024 | table.config.widgetZebra.css[odd ? 1 : 0]) 1025 | }); 1026 | if (table.config.debug) { 1027 | $.tablesorter.benchmark("Applying Zebra widget", time); 1028 | } 1029 | } 1030 | }); 1031 | })(jQuery); -------------------------------------------------------------------------------- /web/js/jquery.tablesorter.min.js: -------------------------------------------------------------------------------- 1 | 2 | (function($){$.extend({tablesorter:new 3 | function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((ab)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((ba)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Report Cheaters in CSGO. 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 |
29 | 42 |

Report Cheaters in CSGO.

43 |
44 | 45 |
46 |
47 | This site is limited by the last 2000 entrys. Current entrys: '.$r[0].'

'; 51 | $result = mysqli_query($conn,"SELECT * FROM `info`;"); 52 | $row = mysqli_fetch_array($result); 53 | echo '

Ban Info:
Last Check: '.$row['lastcheck'].' | OW Banned: '.$row['ow'].' | VAC Banned: '.$row['vac'].' | Checked Accounts: '.$row['checked'].'

'; 54 | 55 | ?> 56 | 60 | 61 | 62 | ID 63 | Date 64 | SteamID 65 | Report Log 66 | 67 | '; 68 | 69 | echo ''; 70 | while($row = mysqli_fetch_array($result)) 71 | { 72 | echo ''; 73 | echo '' . $row['id'] . ''; 74 | echo '' . $row['datum'] . ''; 75 | echo '' . $row['steamid'] . ''; 76 | echo 'Report Log'; 77 | echo ''; 78 | } 79 | echo ''; 80 | mysqli_close($conn); 81 | ?> 82 |
83 |
84 |
85 |

Script by © Radat. @High-Minded.net 2016

86 |
87 | 88 |
89 | 90 | 91 | 92 | 100 | 101 | 102 | -------------------------------------------------------------------------------- /web/mysql.php: -------------------------------------------------------------------------------- 1 | connect_error) { 8 | die("MySQL Connection Error: " . $conn->connect_error); 9 | } 10 | ?> -------------------------------------------------------------------------------- /web/ow-check.php: -------------------------------------------------------------------------------- 1 | fetch_array()) { 13 | $rows[] = $row; 14 | } 15 | 16 | $s = sizeof($rows); 17 | 18 | foreach ($rows as $row) { 19 | 20 | $steamid = $row['steamid']; 21 | if ($count == 0) { 22 | $ids = $steamid; 23 | $count = $count + 1; 24 | } else { 25 | 26 | if (strpos($ids, $steamid) !== false) { 27 | $s = $s - 1; 28 | } else { 29 | $counter = $counter + 1; 30 | $ids = $ids . ',' . $steamid; 31 | $count = $count + 1; 32 | } 33 | } 34 | // Abfrage 35 | if ($count > 10 || $counter == $s) { 36 | $key = $steam_web_key; 37 | $link = file_get_contents('http://api.steampowered.com/ISteamUser/GetPlayerBans/v1/?key=' . $key . '&steamids=' . $ids . '&format=json'); 38 | echo $link; 39 | $myarray = json_decode($link, true); 40 | 41 | 42 | 43 | for ($i = 0; $i < $count; $i++) { 44 | echo '+\n'; 45 | if (!empty($myarray['players'][$i]['NumberOfGameBans'])) { 46 | $ow = $myarray['players'][$i]['NumberOfGameBans']; 47 | $vac = $myarray['players'][$i]['VACBanned']; 48 | $steamid = $myarray['players'][$i]['SteamId']; 49 | $daylastban = $myarray['players'][$i]['DaysSinceLastBan']; 50 | if ($ow >= 1) { 51 | if ($daylastban < 10) { 52 | $result = mysqli_query($conn, "SELECT * FROM `banned` WHERE INSTR(`steamid`, '" . $steamid . "') > 0"); 53 | 54 | $reportdate = mysqli_query($conn, "SELECT datum FROM list WHERE steamid='" . $steamid . "' LIMIT 1"); 55 | $reportdate = mysqli_fetch_assoc($reportdate); 56 | 57 | if (mysqli_num_rows($result) == 0) { 58 | mysqli_query($conn, "INSERT INTO `banned` (`id`, `datum`, `steamid`, `ow`, `vac`, `datum-report`) VALUES (NULL, CURRENT_TIMESTAMP, '" . $steamid . "', 'No', 'No', '" . $reportdate['datum'] . "');"); 59 | } else { 60 | mysqli_query($conn, "UPDATE `banned` SET `ow` = 'true' WHERE `steamid` = " . $steamid . ";"); 61 | } 62 | } 63 | mysqli_query($conn, "UPDATE `list` SET `ow` = 'true' WHERE `steamid` = " . $steamid . ";"); 64 | } else { 65 | mysqli_query($conn, "UPDATE `banned` SET `ow` = 'false' WHERE `steamid` = " . $steamid . ";"); 66 | mysqli_query($conn, "UPDATE `list` SET `ow` = 'false' WHERE `steamid` = " . $steamid . ";"); 67 | } 68 | if ($vac == true) { 69 | if ($daylastban < 10) { 70 | $result = mysqli_query($conn, "SELECT * FROM `banned` WHERE INSTR(`steamid`, '" . $steamid . "') > 0"); 71 | 72 | $reportdate = mysqli_query($conn, "SELECT datum FROM list WHERE steamid='" . $steamid . "' LIMIT 1"); 73 | $reportdate = mysqli_fetch_assoc($reportdate); 74 | 75 | if (mysqli_num_rows($result) == 0) { 76 | mysqli_query($conn, "INSERT INTO `banned` (`id`, `datum`, `steamid`, `ow`, `vac`, `datum-report`) VALUES (NULL, CURRENT_TIMESTAMP, '" . $steamid . "', 'No', 'No', '" . $reportdate['datum'] . "');"); 77 | } else { 78 | mysqli_query($conn, "UPDATE `banned` SET `vac` = 'true' WHERE `steamid` = " . $steamid . ";"); 79 | } 80 | } 81 | mysqli_query($conn, "UPDATE `list` SET `vac` = 'true' WHERE `steamid` = " . $steamid . ";"); 82 | } else { 83 | mysqli_query($conn, "UPDATE `banned` SET `vac` = 'false' WHERE `steamid` = " . $steamid . ";"); 84 | mysqli_query($conn, "UPDATE `list` SET `vac` = 'false' WHERE `steamid` = " . $steamid . ";"); 85 | } 86 | } 87 | } 88 | $count = 0; 89 | $ids = ''; 90 | } 91 | $ow = mysqli_query($conn, "SELECT COUNT(*) FROM banned WHERE ow='true';"); 92 | $ow = mysqli_fetch_array($ow); 93 | $vac = mysqli_query($conn, "SELECT COUNT(*) FROM banned WHERE vac='true';"); 94 | $vac = mysqli_fetch_array($vac); 95 | $c = mysqli_query($conn, "SELECT COUNT(*) FROM list;"); 96 | $c = mysqli_fetch_array($c); 97 | mysqli_query($conn, "UPDATE info SET ow=" . $ow[0]); 98 | mysqli_query($conn, "UPDATE info SET vac=" . $vac[0]); 99 | mysqli_query($conn, "UPDATE info SET checked=" . $c[0]); 100 | } 101 | 102 | echo $counter; 103 | echo $s; 104 | 105 | $d = date('d/m/Y H:i'); 106 | mysqli_query($conn, "UPDATE info SET lastcheck='" . $d . "'"); 107 | mysqli_close($conn); 108 | ?> 109 | -------------------------------------------------------------------------------- /web/recaptchalib.php: -------------------------------------------------------------------------------- 1 | " . self::$_signupUrl . ""); 60 | } 61 | $this->_secret=$secret; 62 | } 63 | 64 | /** 65 | * Encodes the given data into a query string format. 66 | * 67 | * @param array $data array of string elements to be encoded. 68 | * 69 | * @return string - encoded request. 70 | */ 71 | private function _encodeQS($data) 72 | { 73 | $req = ""; 74 | foreach ($data as $key => $value) { 75 | $req .= $key . '=' . urlencode(stripslashes($value)) . '&'; 76 | } 77 | 78 | // Cut the last '&' 79 | $req=substr($req, 0, strlen($req)-1); 80 | return $req; 81 | } 82 | 83 | /** 84 | * Submits an HTTP GET to a reCAPTCHA server. 85 | * 86 | * @param string $path url path to recaptcha server. 87 | * @param array $data array of parameters to be sent. 88 | * 89 | * @return array response 90 | */ 91 | private function _submitHTTPGet($path, $data) 92 | { 93 | $req = $this->_encodeQS($data); 94 | $response = file_get_contents($path . $req); 95 | return $response; 96 | } 97 | 98 | /** 99 | * Calls the reCAPTCHA siteverify API to verify whether the user passes 100 | * CAPTCHA test. 101 | * 102 | * @param string $remoteIp IP address of end user. 103 | * @param string $response response string from recaptcha verification. 104 | * 105 | * @return ReCaptchaResponse 106 | */ 107 | public function verifyResponse($remoteIp, $response) 108 | { 109 | // Discard empty solution submissions 110 | if ($response == null || strlen($response) == 0) { 111 | $recaptchaResponse = new ReCaptchaResponse(); 112 | $recaptchaResponse->success = false; 113 | $recaptchaResponse->errorCodes = 'missing-input'; 114 | return $recaptchaResponse; 115 | } 116 | 117 | $getResponse = $this->_submitHttpGet( 118 | self::$_siteVerifyUrl, 119 | array ( 120 | 'secret' => $this->_secret, 121 | 'remoteip' => $remoteIp, 122 | 'v' => self::$_version, 123 | 'response' => $response 124 | ) 125 | ); 126 | $answers = json_decode($getResponse, true); 127 | $recaptchaResponse = new ReCaptchaResponse(); 128 | 129 | if (trim($answers ['success']) == true) { 130 | $recaptchaResponse->success = true; 131 | } else { 132 | $recaptchaResponse->success = false; 133 | $recaptchaResponse->errorCodes = $answers [error-codes]; 134 | } 135 | 136 | return $recaptchaResponse; 137 | } 138 | } 139 | 140 | ?> -------------------------------------------------------------------------------- /web/report.sql: -------------------------------------------------------------------------------- 1 | -- phpMyAdmin SQL Dump 2 | -- version 4.4.6 3 | -- http://www.phpmyadmin.net 4 | -- 5 | -- Host: localhost 6 | -- Erstellungszeit: 07. Dez 2016 um 22:30 7 | -- Server-Version: 5.5.53-0+deb8u1 8 | -- PHP-Version: 5.6.27-0+deb8u1 9 | 10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 11 | SET time_zone = "+00:00"; 12 | 13 | 14 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 15 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 16 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 17 | /*!40101 SET NAMES utf8 */; 18 | 19 | -- 20 | -- Datenbank: `report` 21 | -- 22 | 23 | -- -------------------------------------------------------- 24 | 25 | -- 26 | -- Tabellenstruktur für Tabelle `banned` 27 | -- 28 | 29 | CREATE TABLE IF NOT EXISTS `banned` ( 30 | `id` int(11) NOT NULL, 31 | `datum` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 32 | `datum-report` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 33 | `steamid` varchar(255) NOT NULL, 34 | `ow` varchar(255) NOT NULL, 35 | `vac` varchar(255) NOT NULL 36 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 37 | 38 | -- -------------------------------------------------------- 39 | 40 | -- 41 | -- Tabellenstruktur für Tabelle `info` 42 | -- 43 | 44 | CREATE TABLE IF NOT EXISTS `info` ( 45 | `lastcheck` varchar(255) NOT NULL, 46 | `ow` int(255) NOT NULL, 47 | `vac` int(255) NOT NULL, 48 | `checked` int(11) NOT NULL 49 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 50 | 51 | -- -------------------------------------------------------- 52 | -- 53 | -- Daten für Tabelle `info` 54 | -- 55 | 56 | INSERT INTO `info` (lastcheck, ow, vac, checked) 57 | VALUES ('29/11/2016 15:11', 0, 0, 0); 58 | -- 59 | -- Tabellenstruktur für Tabelle `list` 60 | -- 61 | 62 | CREATE TABLE IF NOT EXISTS `list` ( 63 | `id` int(11) NOT NULL, 64 | `datum` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 65 | `steamid` varchar(255) NOT NULL, 66 | `ow` varchar(255) NOT NULL DEFAULT 'false', 67 | `vac` varchar(255) NOT NULL DEFAULT 'false', 68 | `ip` varchar(255) NOT NULL 69 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 70 | 71 | -- -------------------------------------------------------- 72 | 73 | -- 74 | -- Tabellenstruktur für Tabelle `whitelist` 75 | -- 76 | 77 | CREATE TABLE IF NOT EXISTS `whitelist` ( 78 | `steamid` varchar(255) NOT NULL, 79 | `name` varchar(255) NOT NULL, 80 | `accounts` varchar(255) NOT NULL, 81 | `description` varchar(255) NOT NULL, 82 | `mail` varchar(255) NOT NULL 83 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 84 | 85 | -- 86 | -- Indizes der exportierten Tabellen 87 | -- 88 | 89 | -- 90 | -- Indizes für die Tabelle `banned` 91 | -- 92 | ALTER TABLE `banned` 93 | ADD PRIMARY KEY (`id`); 94 | 95 | -- 96 | -- Indizes für die Tabelle `info` 97 | -- 98 | ALTER TABLE `info` 99 | ADD PRIMARY KEY (`lastcheck`); 100 | 101 | -- 102 | -- Indizes für die Tabelle `list` 103 | -- 104 | ALTER TABLE `list` 105 | ADD PRIMARY KEY (`id`); 106 | 107 | -- 108 | -- Indizes für die Tabelle `whitelist` 109 | -- 110 | ALTER TABLE `whitelist` 111 | ADD UNIQUE KEY `steamid` (`steamid`); 112 | 113 | -- 114 | -- AUTO_INCREMENT für exportierte Tabellen 115 | -- 116 | 117 | -- 118 | -- AUTO_INCREMENT für Tabelle `banned` 119 | -- 120 | ALTER TABLE `banned` 121 | MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 122 | -- 123 | -- AUTO_INCREMENT für Tabelle `list` 124 | -- 125 | ALTER TABLE `list` 126 | MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; 127 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 128 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 129 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 130 | --------------------------------------------------------------------------------