├── .gitignore ├── .gitmodules ├── LICENSE ├── NOTICE ├── README.md ├── config.js.template ├── css ├── TinCanViewer.css ├── base.css ├── layout.css ├── skeleton.css └── smoothness │ ├── images │ ├── ui-bg_flat_0_aaaaaa_40x100.png │ ├── ui-bg_flat_75_ffffff_40x100.png │ ├── ui-bg_glass_55_fbf9ee_1x400.png │ ├── ui-bg_glass_65_ffffff_1x400.png │ ├── ui-bg_glass_75_dadada_1x400.png │ ├── ui-bg_glass_75_e6e6e6_1x400.png │ ├── ui-bg_glass_95_fef1ec_1x400.png │ ├── ui-bg_highlight-soft_75_cccccc_1x100.png │ ├── ui-icons_222222_256x240.png │ ├── ui-icons_2e83ff_256x240.png │ ├── ui-icons_454545_256x240.png │ ├── ui-icons_888888_256x240.png │ └── ui-icons_cd0a0a_256x240.png │ └── jquery-ui-1.8.17.custom.css ├── img └── loading.gif ├── index.html └── scripts ├── TinCanQueryUtils.js ├── TinCanViewer.js ├── base64.js ├── jquery-3.5.1.min.js ├── jquery-ui-1.8.17.custom.min.js └── tabs.js /.gitignore: -------------------------------------------------------------------------------- 1 | config.js 2 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "scripts/TinCanJS"] 2 | path = scripts/TinCanJS 3 | url = https://github.com/RusticiSoftware/TinCanJS.git 4 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | TinCanStatementViewer 2 | Copyright 2012 Rustici Software 3 | 4 | This product includes software developed at 5 | Rustici Software (http://www.scorm.com/). 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ###Overview 2 | 3 | This repo contains a statement viewing page for Tin Can API statement streams. 4 | 5 | * Copy the file `config.js.template` to `config.js` and set `Config.endpoint` to the LRS endpoint, including a trailing slash (ex: https://cloud.scorm.com/tc/public/) 6 | * Set the endpoint credentials in `Config.authUser` and `Config.authPassword` as provided by the LRS 7 | * Load: index.html in a browser 8 | 9 | ###Contact: 10 | info@tincanapi.com
11 | http://tincanapi.com 12 | -------------------------------------------------------------------------------- /config.js.template: -------------------------------------------------------------------------------- 1 | //globals: equal, responseText, statement, ok, deepEqual, QUnit, module, asyncTest, Util, start, golfStatements, console 2 | /*jslint bitwise: true, browser: true, plusplus: true, maxerr: 50, indent: 4 */ 3 | function Config() { 4 | "use strict"; 5 | } 6 | Config.endpoint = ""; 7 | Config.authUser = ""; 8 | Config.authPassword = ""; 9 | Config.actor = { "mbox":[""], "name":[""] }; 10 | -------------------------------------------------------------------------------- /css/TinCanViewer.css: -------------------------------------------------------------------------------- 1 | 2 | 3 | .container { padding-bottom: 40px; } 4 | 5 | #theStatements table { width: 100%; } 6 | 7 | .statement {margin:3px 0;} 8 | 9 | .statement table {width:100%;} 10 | .statementRow td {vertical-align:top;padding:2px;} 11 | .statementRow td.date{width:140px;} 12 | 13 | 14 | .statementRow .date {font-size:.7em;color:#666666;} 15 | .statement .actor {color:#222222;} 16 | .statement .verb {font-weight:bold;} 17 | .statement .object {color:#222222;} 18 | .statement .score {font-weight:bold;} 19 | 20 | .statement {cursor:pointer;} 21 | .tc_rawdata{display:none; font-size:.8em; width:800px; word-wrap:break-word;} 22 | 23 | #showAllStatements, #refreshHighScores {margin-top:20px;} 24 | 25 | #tetrisHighScores {float:left;width:45%;margin-top:20px;} 26 | #tetrisGamesScores {float:right;} 27 | 28 | .heading {font-size:1.1em;font-weight:bold;color:#000000;margin-bottom:10px;} 29 | 30 | .lrsUtils a {color:#888888;} 31 | 32 | .highScoreRow .scoreRank{width:25px;} 33 | .highScoreRow .actor{padding:0 5px;} 34 | .highScoreRow .score{padding:0 5px;font-weight:bold;} 35 | .highScoreRow .date{font-size:.7em;color:#666666;width:120px;text-align:right;} 36 | 37 | #golfCourseData table {width:300px;} 38 | #golfCourseData tr.labels td {font-size:.8em;text-decoration:underline;} 39 | #golfCourseData td {padding:3px 0;} 40 | #golfCourseData td.name {} 41 | #golfCourseData td.completion {text-align:right;} 42 | #golfCourseData td.completion.complete {color:green;} 43 | #golfCourseData td.completion.incomplete {color:red;} 44 | #golfCourseData td.score {text-align:right;} 45 | 46 | table#golfQuestions {} 47 | table#golfQuestions tr.labels td {font-size:.8em;text-decoration:underline;} 48 | table#golfQuestions td {padding:3px;text-align:right;} 49 | table#golfQuestions td.question {text-align:left;} 50 | table#golfQuestions td.correctAnswer {} 51 | table#golfQuestions td.metric {} 52 | 53 | #locationCourseData table {width:300px;} 54 | #locationCourseData tr.labels td {font-size:.8em;text-decoration:underline;} 55 | #locationCourseData td {padding:3px 0;} 56 | #locationCourseData td.name {} 57 | #locationCourseData td.completion {text-align:right;} 58 | #locationCourseData td.completion.complete {color:green;} 59 | #locationCourseData td.completion.incomplete {color:red;} 60 | 61 | table#courseLocations {} 62 | table#courseLocations tr.labels td {font-size:.8em;text-decoration:underline;} 63 | table#courseLocations td {padding:3px;text-align:right;} 64 | table#courseLocations td.location {text-align:left;width:80%;} 65 | table#courseLocations td.location .description {font-size:.8em;color:#888888;} 66 | table#courseLocations td.metric {} 67 | 68 | #searchBox { padding-bottom: 20px; } 69 | .searchBoxTable td { padding-right:14px; } 70 | 71 | #TCAPIQueryText { width: 80%; height:10px; } 72 | 73 | #statementsLoading { padding-left:20px; padding-top:10px; display:none; } 74 | #showAllStatements { display:none; } 75 | -------------------------------------------------------------------------------- /css/base.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V1.1 3 | * Copyright 2011, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 8/17/2011 8 | */ 9 | 10 | 11 | /* Table of Content 12 | ================================================== 13 | #Reset & Basics 14 | #Basic Styles 15 | #Site Styles 16 | #Typography 17 | #Links 18 | #Lists 19 | #Images 20 | #Buttons 21 | #Tabs 22 | #Forms 23 | #Misc */ 24 | 25 | 26 | /* #Reset & Basics (Inspired by E. Meyers) 27 | ================================================== */ 28 | html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { 29 | margin: 0; 30 | padding: 0; 31 | border: 0; 32 | font-size: 100%; 33 | font: inherit; 34 | vertical-align: baseline; } 35 | article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { 36 | display: block; } 37 | body { 38 | line-height: 1; } 39 | ol, ul { 40 | list-style: none; } 41 | blockquote, q { 42 | quotes: none; } 43 | blockquote:before, blockquote:after, 44 | q:before, q:after { 45 | content: ''; 46 | content: none; } 47 | table { 48 | border-collapse: collapse; 49 | border-spacing: 0; } 50 | 51 | 52 | /* #Basic Styles 53 | ================================================== */ 54 | body { 55 | background: #fff; 56 | font: 14px/21px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; 57 | color: #444; 58 | -webkit-font-smoothing: antialiased; /* Fix for webkit rendering */ 59 | -webkit-text-size-adjust: 100%; 60 | } 61 | 62 | 63 | /* #Typography 64 | ================================================== */ 65 | h1, h2, h3, h4, h5, h6 { 66 | color: #181818; 67 | font-family: "Georgia", "Times New Roman", Helvetica, Arial, sans-serif; 68 | font-weight: normal; } 69 | h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { font-weight: inherit; } 70 | h1 { font-size: 46px; line-height: 50px; margin-bottom: 14px;} 71 | h2 { font-size: 35px; line-height: 40px; margin-bottom: 10px; } 72 | h3 { font-size: 28px; line-height: 34px; margin-bottom: 8px; } 73 | h4 { font-size: 21px; line-height: 30px; margin-bottom: 4px; } 74 | h5 { font-size: 17px; line-height: 24px; } 75 | h6 { font-size: 14px; line-height: 21px; } 76 | .subheader { color: #777; } 77 | 78 | p { margin: 0 0 20px 0; } 79 | p img { margin: 0; } 80 | p.lead { font-size: 21px; line-height: 27px; color: #777; } 81 | 82 | em { font-style: italic; } 83 | strong { font-weight: bold; color: #333; } 84 | small { font-size: 80%; } 85 | 86 | /* Blockquotes */ 87 | blockquote, blockquote p { font-size: 17px; line-height: 24px; color: #777; font-style: italic; } 88 | blockquote { margin: 0 0 20px; padding: 9px 20px 0 19px; border-left: 1px solid #ddd; } 89 | blockquote cite { display: block; font-size: 12px; color: #555; } 90 | blockquote cite:before { content: "\2014 \0020"; } 91 | blockquote cite a, blockquote cite a:visited, blockquote cite a:visited { color: #555; } 92 | 93 | hr { border: solid #ddd; border-width: 1px 0 0; clear: both; margin: 10px 0 30px; height: 0; } 94 | 95 | 96 | /* #Links 97 | ================================================== */ 98 | a, a:visited { color: #333; text-decoration: underline; outline: 0; } 99 | a:hover, a:focus { color: #000; } 100 | p a, p a:visited { line-height: inherit; } 101 | 102 | 103 | /* #Lists 104 | ================================================== */ 105 | ul, ol { margin-bottom: 20px; } 106 | ul { list-style: none outside; } 107 | ol { list-style: decimal; } 108 | ol, ul.square, ul.circle, ul.disc { margin-left: 30px; } 109 | ul.square { list-style: square outside; } 110 | ul.circle { list-style: circle outside; } 111 | ul.disc { list-style: disc outside; } 112 | ul ul, ul ol, 113 | ol ol, ol ul { margin: 4px 0 5px 30px; font-size: 90%; } 114 | ul ul li, ul ol li, 115 | ol ol li, ol ul li { margin-bottom: 6px; } 116 | li { line-height: 18px; margin-bottom: 12px; } 117 | ul.large li { line-height: 21px; } 118 | li p { line-height: 21px; } 119 | 120 | /* #Images 121 | ================================================== */ 122 | 123 | img.scale-with-grid { 124 | max-width: 100%; 125 | height: auto; } 126 | 127 | 128 | /* #Buttons 129 | ================================================== */ 130 | 131 | a.button, 132 | button, 133 | input[type="submit"], 134 | input[type="reset"], 135 | input[type="button"] { 136 | background: #eee; /* Old browsers */ 137 | background: #eee -moz-linear-gradient(top, rgba(255,255,255,.2) 0%, rgba(0,0,0,.2) 100%); /* FF3.6+ */ 138 | background: #eee -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.2)), color-stop(100%,rgba(0,0,0,.2))); /* Chrome,Safari4+ */ 139 | background: #eee -webkit-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Chrome10+,Safari5.1+ */ 140 | background: #eee -o-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Opera11.10+ */ 141 | background: #eee -ms-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* IE10+ */ 142 | background: #eee linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* W3C */ 143 | border: 1px solid #aaa; 144 | border-top: 1px solid #ccc; 145 | border-left: 1px solid #ccc; 146 | padding: 4px 12px; 147 | -moz-border-radius: 3px; 148 | -webkit-border-radius: 3px; 149 | border-radius: 3px; 150 | color: #444; 151 | display: inline-block; 152 | font-size: 11px; 153 | font-weight: bold; 154 | text-decoration: none; 155 | text-shadow: 0 1px rgba(255, 255, 255, .75); 156 | cursor: pointer; 157 | margin-bottom: 20px; 158 | line-height: 21px; 159 | font-family: "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; } 160 | 161 | a.button:hover, 162 | button:hover, 163 | input[type="submit"]:hover, 164 | input[type="reset"]:hover, 165 | input[type="button"]:hover { 166 | color: #222; 167 | background: #ddd; /* Old browsers */ 168 | background: #ddd -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); /* FF3.6+ */ 169 | background: #ddd -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.3)), color-stop(100%,rgba(0,0,0,.3))); /* Chrome,Safari4+ */ 170 | background: #ddd -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Chrome10+,Safari5.1+ */ 171 | background: #ddd -o-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* Opera11.10+ */ 172 | background: #ddd -ms-linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* IE10+ */ 173 | background: #ddd linear-gradient(top, rgba(255,255,255,.3) 0%,rgba(0,0,0,.3) 100%); /* W3C */ 174 | border: 1px solid #888; 175 | border-top: 1px solid #aaa; 176 | border-left: 1px solid #aaa; } 177 | 178 | a.button:active, 179 | button:active, 180 | input[type="submit"]:active, 181 | input[type="reset"]:active, 182 | input[type="button"]:active { 183 | border: 1px solid #666; 184 | background: #ccc; /* Old browsers */ 185 | background: #ccc -moz-linear-gradient(top, rgba(255,255,255,.35) 0%, rgba(10,10,10,.4) 100%); /* FF3.6+ */ 186 | background: #ccc -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,.35)), color-stop(100%,rgba(10,10,10,.4))); /* Chrome,Safari4+ */ 187 | background: #ccc -webkit-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Chrome10+,Safari5.1+ */ 188 | background: #ccc -o-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* Opera11.10+ */ 189 | background: #ccc -ms-linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* IE10+ */ 190 | background: #ccc linear-gradient(top, rgba(255,255,255,.35) 0%,rgba(10,10,10,.4) 100%); /* W3C */ } 191 | 192 | .button.full-width, 193 | button.full-width, 194 | input[type="submit"].full-width, 195 | input[type="reset"].full-width, 196 | input[type="button"].full-width { 197 | width: 100%; 198 | padding-left: 0 !important; 199 | padding-right: 0 !important; 200 | text-align: center; } 201 | 202 | 203 | /* #Tabs (activate in tabs.js) 204 | ================================================== */ 205 | ul.tabs { 206 | display: block; 207 | margin: 0 0 20px 0; 208 | padding: 0; 209 | border-bottom: solid 1px #ddd; } 210 | ul.tabs li { 211 | display: block; 212 | width: auto; 213 | height: 30px; 214 | padding: 0; 215 | float: left; 216 | margin-bottom: 0; } 217 | ul.tabs li a { 218 | display: block; 219 | text-decoration: none; 220 | width: auto; 221 | height: 29px; 222 | padding: 0px 20px; 223 | line-height: 30px; 224 | border: solid 1px #ddd; 225 | border-width: 1px 1px 0 0; 226 | margin: 0; 227 | background: #f5f5f5; 228 | font-size: 13px; } 229 | ul.tabs li a.active { 230 | background: #fff; 231 | height: 30px; 232 | position: relative; 233 | top: -4px; 234 | padding-top: 4px; 235 | border-left-width: 1px; 236 | margin: 0 0 0 -1px; 237 | color: #111; 238 | -moz-border-radius-topleft: 2px; 239 | -webkit-border-top-left-radius: 2px; 240 | border-top-left-radius: 2px; 241 | -moz-border-radius-topright: 2px; 242 | -webkit-border-top-right-radius: 2px; 243 | border-top-right-radius: 2px; } 244 | ul.tabs li:first-child a.active { 245 | margin-left: 0; } 246 | ul.tabs li:first-child a { 247 | border-width: 1px 1px 0 1px; 248 | -moz-border-radius-topleft: 2px; 249 | -webkit-border-top-left-radius: 2px; 250 | border-top-left-radius: 2px; } 251 | ul.tabs li:last-child a { 252 | -moz-border-radius-topright: 2px; 253 | -webkit-border-top-right-radius: 2px; 254 | border-top-right-radius: 2px; } 255 | 256 | ul.tabs-content { margin: 0; display: block; } 257 | ul.tabs-content > li { display:none; } 258 | ul.tabs-content > li.active { display: block; } 259 | 260 | /* Clearfixing tabs for beautiful stacking */ 261 | ul.tabs:before, 262 | ul.tabs:after { 263 | content: '\0020'; 264 | display: block; 265 | overflow: hidden; 266 | visibility: hidden; 267 | width: 0; 268 | height: 0; } 269 | ul.tabs:after { 270 | clear: both; } 271 | ul.tabs { 272 | zoom: 1; } 273 | 274 | 275 | /* #Forms 276 | ================================================== */ 277 | 278 | form { 279 | margin-bottom: 20px; } 280 | fieldset { 281 | margin-bottom: 20px; } 282 | input[type="text"], 283 | input[type="password"], 284 | input[type="email"], 285 | textarea, 286 | select { 287 | border: 1px solid #ccc; 288 | padding: 6px 4px; 289 | outline: none; 290 | -moz-border-radius: 2px; 291 | -webkit-border-radius: 2px; 292 | border-radius: 2px; 293 | font: 13px "HelveticaNeue", "Helvetica Neue", Helvetica, Arial, sans-serif; 294 | color: #777; 295 | margin: 0; 296 | width: 210px; 297 | max-width: 100%; 298 | display: block; 299 | margin-bottom: 20px; 300 | background: #fff; } 301 | select { 302 | padding: 0; } 303 | input[type="text"]:focus, 304 | input[type="password"]:focus, 305 | input[type="email"]:focus, 306 | textarea:focus { 307 | border: 1px solid #aaa; 308 | color: #444; 309 | -moz-box-shadow: 0 0 3px rgba(0,0,0,.2); 310 | -webkit-box-shadow: 0 0 3px rgba(0,0,0,.2); 311 | box-shadow: 0 0 3px rgba(0,0,0,.2); } 312 | textarea { 313 | min-height: 60px; } 314 | label, 315 | legend { 316 | display: block; 317 | font-weight: bold; 318 | font-size: 13px; } 319 | select { 320 | width: 220px; } 321 | input[type="checkbox"] { 322 | display: inline; } 323 | label span, 324 | legend span { 325 | font-weight: normal; 326 | font-size: 13px; 327 | color: #444; } 328 | 329 | /* #Misc 330 | ================================================== */ 331 | .remove-bottom { margin-bottom: 0 !important; } 332 | .half-bottom { margin-bottom: 10px !important; } 333 | .add-bottom { margin-bottom: 20px !important; } 334 | 335 | 336 | -------------------------------------------------------------------------------- /css/layout.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V1.1 3 | * Copyright 2011, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 8/17/2011 8 | */ 9 | 10 | /* Table of Content 11 | ================================================== 12 | #Site Styles 13 | #Page Styles 14 | #Media Queries 15 | #Font-Face */ 16 | 17 | /* #Site Styles 18 | ================================================== */ 19 | 20 | /* #Page Styles 21 | ================================================== */ 22 | 23 | /* #Media Queries 24 | ================================================== */ 25 | 26 | /* Smaller than standard 960 (devices and browsers) */ 27 | @media only screen and (max-width: 959px) {} 28 | 29 | /* Tablet Portrait size to standard 960 (devices and browsers) */ 30 | @media only screen and (min-width: 768px) and (max-width: 959px) {} 31 | 32 | /* All Mobile Sizes (devices and browser) */ 33 | @media only screen and (max-width: 767px) {} 34 | 35 | /* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ 36 | @media only screen and (min-width: 480px) and (max-width: 767px) {} 37 | 38 | /* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ 39 | @media only screen and (max-width: 479px) {} 40 | 41 | 42 | /* #Font-Face 43 | ================================================== */ 44 | /* This is the proper syntax for an @font-face file 45 | Just create a "fonts" folder at the root, 46 | copy your FontName into code below and remove 47 | comment brackets */ 48 | 49 | /* @font-face { 50 | font-family: 'FontName'; 51 | src: url('../fonts/FontName.eot'); 52 | src: url('../fonts/FontName.eot?iefix') format('eot'), 53 | url('../fonts/FontName.woff') format('woff'), 54 | url('../fonts/FontName.ttf') format('truetype'), 55 | url('../fonts/FontName.svg#webfontZam02nTh') format('svg'); 56 | font-weight: normal; 57 | font-style: normal; } 58 | */ -------------------------------------------------------------------------------- /css/skeleton.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Skeleton V1.1 3 | * Copyright 2011, Dave Gamache 4 | * www.getskeleton.com 5 | * Free to use under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 8/17/2011 8 | */ 9 | 10 | 11 | /* Table of Contents 12 | ================================================== 13 | #Base 960 Grid 14 | #Tablet (Portrait) 15 | #Mobile (Portrait) 16 | #Mobile (Landscape) 17 | #Clearing */ 18 | 19 | 20 | 21 | /* #Base 960 Grid 22 | ================================================== */ 23 | 24 | .container { position: relative; width: 960px; margin: 0 auto; padding: 0; } 25 | .column, .columns { float: left; display: inline; margin-left: 10px; margin-right: 10px; } 26 | .row { margin-bottom: 20px; } 27 | 28 | /* Nested Column Classes */ 29 | .column.alpha, .columns.alpha { margin-left: 0; } 30 | .column.omega, .columns.omega { margin-right: 0; } 31 | 32 | /* Base Grid */ 33 | .container .one.column { width: 40px; } 34 | .container .two.columns { width: 100px; } 35 | .container .three.columns { width: 160px; } 36 | .container .four.columns { width: 220px; } 37 | .container .five.columns { width: 280px; } 38 | .container .six.columns { width: 340px; } 39 | .container .seven.columns { width: 400px; } 40 | .container .eight.columns { width: 460px; } 41 | .container .nine.columns { width: 520px; } 42 | .container .ten.columns { width: 580px; } 43 | .container .eleven.columns { width: 640px; } 44 | .container .twelve.columns { width: 700px; } 45 | .container .thirteen.columns { width: 760px; } 46 | .container .fourteen.columns { width: 820px; } 47 | .container .fifteen.columns { width: 880px; } 48 | .container .sixteen.columns { width: 940px; } 49 | 50 | .container .one-third.column { width: 300px; } 51 | .container .two-thirds.column { width: 620px; } 52 | 53 | /* Offsets */ 54 | .container .offset-by-one { padding-left: 60px; } 55 | .container .offset-by-two { padding-left: 120px; } 56 | .container .offset-by-three { padding-left: 180px; } 57 | .container .offset-by-four { padding-left: 240px; } 58 | .container .offset-by-five { padding-left: 300px; } 59 | .container .offset-by-six { padding-left: 360px; } 60 | .container .offset-by-seven { padding-left: 420px; } 61 | .container .offset-by-eight { padding-left: 480px; } 62 | .container .offset-by-nine { padding-left: 540px; } 63 | .container .offset-by-ten { padding-left: 600px; } 64 | .container .offset-by-eleven { padding-left: 660px; } 65 | .container .offset-by-twelve { padding-left: 720px; } 66 | .container .offset-by-thirteen { padding-left: 780px; } 67 | .container .offset-by-fourteen { padding-left: 840px; } 68 | .container .offset-by-fifteen { padding-left: 900px; } 69 | 70 | 71 | 72 | /* #Tablet (Portrait) 73 | ================================================== */ 74 | 75 | /* Note: Design for a width of 768px */ 76 | 77 | @media only screen and (min-width: 768px) and (max-width: 959px) { 78 | .container { width: 768px; } 79 | .container .column, 80 | .container .columns { margin-left: 10px; margin-right: 10px; } 81 | .column.alpha, .columns.alpha { margin-left: 0; margin-right: 10px; } 82 | .column.omega, .columns.omega { margin-right: 0; margin-left: 10px; } 83 | 84 | .container .one.column { width: 28px; } 85 | .container .two.columns { width: 76px; } 86 | .container .three.columns { width: 124px; } 87 | .container .four.columns { width: 172px; } 88 | .container .five.columns { width: 220px; } 89 | .container .six.columns { width: 268px; } 90 | .container .seven.columns { width: 316px; } 91 | .container .eight.columns { width: 364px; } 92 | .container .nine.columns { width: 412px; } 93 | .container .ten.columns { width: 460px; } 94 | .container .eleven.columns { width: 508px; } 95 | .container .twelve.columns { width: 556px; } 96 | .container .thirteen.columns { width: 604px; } 97 | .container .fourteen.columns { width: 652px; } 98 | .container .fifteen.columns { width: 700px; } 99 | .container .sixteen.columns { width: 748px; } 100 | 101 | .container .one-third.column { width: 236px; } 102 | .container .two-thirds.column { width: 492px; } 103 | 104 | /* Offsets */ 105 | .container .offset-by-one { padding-left: 48px; } 106 | .container .offset-by-two { padding-left: 96px; } 107 | .container .offset-by-three { padding-left: 144px; } 108 | .container .offset-by-four { padding-left: 192px; } 109 | .container .offset-by-five { padding-left: 240px; } 110 | .container .offset-by-six { padding-left: 288px; } 111 | .container .offset-by-seven { padding-left: 336px; } 112 | .container .offset-by-eight { padding-left: 348px; } 113 | .container .offset-by-nine { padding-left: 432px; } 114 | .container .offset-by-ten { padding-left: 480px; } 115 | .container .offset-by-eleven { padding-left: 528px; } 116 | .container .offset-by-twelve { padding-left: 576px; } 117 | .container .offset-by-thirteen { padding-left: 624px; } 118 | .container .offset-by-fourteen { padding-left: 672px; } 119 | .container .offset-by-fifteen { padding-left: 720px; } 120 | } 121 | 122 | 123 | /* #Mobile (Portrait) 124 | ================================================== */ 125 | 126 | /* Note: Design for a width of 320px */ 127 | 128 | @media only screen and (max-width: 767px) { 129 | .container { width: 300px; } 130 | .columns, .column { margin: 0; } 131 | 132 | .container .one.column, 133 | .container .two.columns, 134 | .container .three.columns, 135 | .container .four.columns, 136 | .container .five.columns, 137 | .container .six.columns, 138 | .container .seven.columns, 139 | .container .eight.columns, 140 | .container .nine.columns, 141 | .container .ten.columns, 142 | .container .eleven.columns, 143 | .container .twelve.columns, 144 | .container .thirteen.columns, 145 | .container .fourteen.columns, 146 | .container .fifteen.columns, 147 | .container .sixteen.columns, 148 | .container .one-third.column, 149 | .container .two-thirds.column { width: 300px; } 150 | 151 | /* Offsets */ 152 | .container .offset-by-one, 153 | .container .offset-by-two, 154 | .container .offset-by-three, 155 | .container .offset-by-four, 156 | .container .offset-by-five, 157 | .container .offset-by-six, 158 | .container .offset-by-seven, 159 | .container .offset-by-eight, 160 | .container .offset-by-nine, 161 | .container .offset-by-ten, 162 | .container .offset-by-eleven, 163 | .container .offset-by-twelve, 164 | .container .offset-by-thirteen, 165 | .container .offset-by-fourteen, 166 | .container .offset-by-fifteen { padding-left: 0; } 167 | 168 | } 169 | 170 | 171 | /* #Mobile (Landscape) 172 | ================================================== */ 173 | 174 | /* Note: Design for a width of 480px */ 175 | 176 | @media only screen and (min-width: 480px) and (max-width: 767px) { 177 | .container { width: 420px; } 178 | .columns, .column { margin: 0; } 179 | 180 | .container .one.column, 181 | .container .two.columns, 182 | .container .three.columns, 183 | .container .four.columns, 184 | .container .five.columns, 185 | .container .six.columns, 186 | .container .seven.columns, 187 | .container .eight.columns, 188 | .container .nine.columns, 189 | .container .ten.columns, 190 | .container .eleven.columns, 191 | .container .twelve.columns, 192 | .container .thirteen.columns, 193 | .container .fourteen.columns, 194 | .container .fifteen.columns, 195 | .container .sixteen.columns, 196 | .container .one-third.column, 197 | .container .two-thirds.column { width: 420px; } 198 | } 199 | 200 | 201 | /* #Clearing 202 | ================================================== */ 203 | 204 | /* Self Clearing Goodness */ 205 | .container:after { content: "\0020"; display: block; height: 0; clear: both; visibility: hidden; } 206 | 207 | /* Use clearfix class on parent to clear nested columns, 208 | or wrap each row of columns in a
*/ 209 | .clearfix:before, 210 | .clearfix:after, 211 | .row:before, 212 | .row:after { 213 | content: '\0020'; 214 | display: block; 215 | overflow: hidden; 216 | visibility: hidden; 217 | width: 0; 218 | height: 0; } 219 | .row:after, 220 | .clearfix:after { 221 | clear: both; } 222 | .row, 223 | .clearfix { 224 | zoom: 1; } 225 | 226 | /* You can also use a
to clear columns */ 227 | .clear { 228 | clear: both; 229 | display: block; 230 | overflow: hidden; 231 | visibility: hidden; 232 | width: 0; 233 | height: 0; 234 | } 235 | 236 | 237 | -------------------------------------------------------------------------------- /css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-bg_flat_75_ffffff_40x100.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-bg_glass_75_dadada_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-bg_glass_75_dadada_1x400.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-icons_2e83ff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-icons_2e83ff_256x240.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-icons_454545_256x240.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-icons_888888_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-icons_888888_256x240.png -------------------------------------------------------------------------------- /css/smoothness/images/ui-icons_cd0a0a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/css/smoothness/images/ui-icons_cd0a0a_256x240.png -------------------------------------------------------------------------------- /css/smoothness/jquery-ui-1.8.17.custom.css: -------------------------------------------------------------------------------- 1 | /* 2 | * jQuery UI CSS Framework 1.8.17 3 | * 4 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 5 | * Dual licensed under the MIT or GPL Version 2 licenses. 6 | * http://jquery.org/license 7 | * 8 | * http://docs.jquery.com/UI/Theming/API 9 | */ 10 | 11 | /* Layout helpers 12 | ----------------------------------*/ 13 | .ui-helper-hidden { display: none; } 14 | .ui-helper-hidden-accessible { position: absolute !important; clip: rect(1px 1px 1px 1px); clip: rect(1px,1px,1px,1px); } 15 | .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; } 16 | .ui-helper-clearfix:before, .ui-helper-clearfix:after { content: ""; display: table; } 17 | .ui-helper-clearfix:after { clear: both; } 18 | .ui-helper-clearfix { zoom: 1; } 19 | .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); } 20 | 21 | 22 | /* Interaction Cues 23 | ----------------------------------*/ 24 | .ui-state-disabled { cursor: default !important; } 25 | 26 | 27 | /* Icons 28 | ----------------------------------*/ 29 | 30 | /* states and images */ 31 | .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; } 32 | 33 | 34 | /* Misc visuals 35 | ----------------------------------*/ 36 | 37 | /* Overlays */ 38 | .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } 39 | 40 | 41 | /* 42 | * jQuery UI CSS Framework 1.8.17 43 | * 44 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 45 | * Dual licensed under the MIT or GPL Version 2 licenses. 46 | * http://jquery.org/license 47 | * 48 | * http://docs.jquery.com/UI/Theming/API 49 | * 50 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px 51 | */ 52 | 53 | 54 | /* Component containers 55 | ----------------------------------*/ 56 | .ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; } 57 | .ui-widget .ui-widget { font-size: 1em; } 58 | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; } 59 | .ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; } 60 | .ui-widget-content a { color: #222222; } 61 | .ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; } 62 | .ui-widget-header a { color: #222222; } 63 | 64 | /* Interaction states 65 | ----------------------------------*/ 66 | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; } 67 | .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; } 68 | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } 69 | .ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; } 70 | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; } 71 | .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; } 72 | .ui-widget :active { outline: none; } 73 | 74 | /* Interaction Cues 75 | ----------------------------------*/ 76 | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; } 77 | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; } 78 | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; } 79 | .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; } 80 | .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; } 81 | .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } 82 | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } 83 | .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } 84 | 85 | /* Icons 86 | ----------------------------------*/ 87 | 88 | /* states and images */ 89 | .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); } 90 | .ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } 91 | .ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); } 92 | .ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); } 93 | .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } 94 | .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); } 95 | .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); } 96 | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); } 97 | 98 | /* positioning */ 99 | .ui-icon-carat-1-n { background-position: 0 0; } 100 | .ui-icon-carat-1-ne { background-position: -16px 0; } 101 | .ui-icon-carat-1-e { background-position: -32px 0; } 102 | .ui-icon-carat-1-se { background-position: -48px 0; } 103 | .ui-icon-carat-1-s { background-position: -64px 0; } 104 | .ui-icon-carat-1-sw { background-position: -80px 0; } 105 | .ui-icon-carat-1-w { background-position: -96px 0; } 106 | .ui-icon-carat-1-nw { background-position: -112px 0; } 107 | .ui-icon-carat-2-n-s { background-position: -128px 0; } 108 | .ui-icon-carat-2-e-w { background-position: -144px 0; } 109 | .ui-icon-triangle-1-n { background-position: 0 -16px; } 110 | .ui-icon-triangle-1-ne { background-position: -16px -16px; } 111 | .ui-icon-triangle-1-e { background-position: -32px -16px; } 112 | .ui-icon-triangle-1-se { background-position: -48px -16px; } 113 | .ui-icon-triangle-1-s { background-position: -64px -16px; } 114 | .ui-icon-triangle-1-sw { background-position: -80px -16px; } 115 | .ui-icon-triangle-1-w { background-position: -96px -16px; } 116 | .ui-icon-triangle-1-nw { background-position: -112px -16px; } 117 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; } 118 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; } 119 | .ui-icon-arrow-1-n { background-position: 0 -32px; } 120 | .ui-icon-arrow-1-ne { background-position: -16px -32px; } 121 | .ui-icon-arrow-1-e { background-position: -32px -32px; } 122 | .ui-icon-arrow-1-se { background-position: -48px -32px; } 123 | .ui-icon-arrow-1-s { background-position: -64px -32px; } 124 | .ui-icon-arrow-1-sw { background-position: -80px -32px; } 125 | .ui-icon-arrow-1-w { background-position: -96px -32px; } 126 | .ui-icon-arrow-1-nw { background-position: -112px -32px; } 127 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; } 128 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } 129 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; } 130 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; } 131 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; } 132 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; } 133 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; } 134 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; } 135 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; } 136 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; } 137 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; } 138 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; } 139 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; } 140 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; } 141 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; } 142 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; } 143 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } 144 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } 145 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } 146 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } 147 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } 148 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } 149 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } 150 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } 151 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } 152 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } 153 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } 154 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } 155 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; } 156 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; } 157 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; } 158 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; } 159 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } 160 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } 161 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } 162 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } 163 | .ui-icon-arrow-4 { background-position: 0 -80px; } 164 | .ui-icon-arrow-4-diag { background-position: -16px -80px; } 165 | .ui-icon-extlink { background-position: -32px -80px; } 166 | .ui-icon-newwin { background-position: -48px -80px; } 167 | .ui-icon-refresh { background-position: -64px -80px; } 168 | .ui-icon-shuffle { background-position: -80px -80px; } 169 | .ui-icon-transfer-e-w { background-position: -96px -80px; } 170 | .ui-icon-transferthick-e-w { background-position: -112px -80px; } 171 | .ui-icon-folder-collapsed { background-position: 0 -96px; } 172 | .ui-icon-folder-open { background-position: -16px -96px; } 173 | .ui-icon-document { background-position: -32px -96px; } 174 | .ui-icon-document-b { background-position: -48px -96px; } 175 | .ui-icon-note { background-position: -64px -96px; } 176 | .ui-icon-mail-closed { background-position: -80px -96px; } 177 | .ui-icon-mail-open { background-position: -96px -96px; } 178 | .ui-icon-suitcase { background-position: -112px -96px; } 179 | .ui-icon-comment { background-position: -128px -96px; } 180 | .ui-icon-person { background-position: -144px -96px; } 181 | .ui-icon-print { background-position: -160px -96px; } 182 | .ui-icon-trash { background-position: -176px -96px; } 183 | .ui-icon-locked { background-position: -192px -96px; } 184 | .ui-icon-unlocked { background-position: -208px -96px; } 185 | .ui-icon-bookmark { background-position: -224px -96px; } 186 | .ui-icon-tag { background-position: -240px -96px; } 187 | .ui-icon-home { background-position: 0 -112px; } 188 | .ui-icon-flag { background-position: -16px -112px; } 189 | .ui-icon-calendar { background-position: -32px -112px; } 190 | .ui-icon-cart { background-position: -48px -112px; } 191 | .ui-icon-pencil { background-position: -64px -112px; } 192 | .ui-icon-clock { background-position: -80px -112px; } 193 | .ui-icon-disk { background-position: -96px -112px; } 194 | .ui-icon-calculator { background-position: -112px -112px; } 195 | .ui-icon-zoomin { background-position: -128px -112px; } 196 | .ui-icon-zoomout { background-position: -144px -112px; } 197 | .ui-icon-search { background-position: -160px -112px; } 198 | .ui-icon-wrench { background-position: -176px -112px; } 199 | .ui-icon-gear { background-position: -192px -112px; } 200 | .ui-icon-heart { background-position: -208px -112px; } 201 | .ui-icon-star { background-position: -224px -112px; } 202 | .ui-icon-link { background-position: -240px -112px; } 203 | .ui-icon-cancel { background-position: 0 -128px; } 204 | .ui-icon-plus { background-position: -16px -128px; } 205 | .ui-icon-plusthick { background-position: -32px -128px; } 206 | .ui-icon-minus { background-position: -48px -128px; } 207 | .ui-icon-minusthick { background-position: -64px -128px; } 208 | .ui-icon-close { background-position: -80px -128px; } 209 | .ui-icon-closethick { background-position: -96px -128px; } 210 | .ui-icon-key { background-position: -112px -128px; } 211 | .ui-icon-lightbulb { background-position: -128px -128px; } 212 | .ui-icon-scissors { background-position: -144px -128px; } 213 | .ui-icon-clipboard { background-position: -160px -128px; } 214 | .ui-icon-copy { background-position: -176px -128px; } 215 | .ui-icon-contact { background-position: -192px -128px; } 216 | .ui-icon-image { background-position: -208px -128px; } 217 | .ui-icon-video { background-position: -224px -128px; } 218 | .ui-icon-script { background-position: -240px -128px; } 219 | .ui-icon-alert { background-position: 0 -144px; } 220 | .ui-icon-info { background-position: -16px -144px; } 221 | .ui-icon-notice { background-position: -32px -144px; } 222 | .ui-icon-help { background-position: -48px -144px; } 223 | .ui-icon-check { background-position: -64px -144px; } 224 | .ui-icon-bullet { background-position: -80px -144px; } 225 | .ui-icon-radio-off { background-position: -96px -144px; } 226 | .ui-icon-radio-on { background-position: -112px -144px; } 227 | .ui-icon-pin-w { background-position: -128px -144px; } 228 | .ui-icon-pin-s { background-position: -144px -144px; } 229 | .ui-icon-play { background-position: 0 -160px; } 230 | .ui-icon-pause { background-position: -16px -160px; } 231 | .ui-icon-seek-next { background-position: -32px -160px; } 232 | .ui-icon-seek-prev { background-position: -48px -160px; } 233 | .ui-icon-seek-end { background-position: -64px -160px; } 234 | .ui-icon-seek-start { background-position: -80px -160px; } 235 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ 236 | .ui-icon-seek-first { background-position: -80px -160px; } 237 | .ui-icon-stop { background-position: -96px -160px; } 238 | .ui-icon-eject { background-position: -112px -160px; } 239 | .ui-icon-volume-off { background-position: -128px -160px; } 240 | .ui-icon-volume-on { background-position: -144px -160px; } 241 | .ui-icon-power { background-position: 0 -176px; } 242 | .ui-icon-signal-diag { background-position: -16px -176px; } 243 | .ui-icon-signal { background-position: -32px -176px; } 244 | .ui-icon-battery-0 { background-position: -48px -176px; } 245 | .ui-icon-battery-1 { background-position: -64px -176px; } 246 | .ui-icon-battery-2 { background-position: -80px -176px; } 247 | .ui-icon-battery-3 { background-position: -96px -176px; } 248 | .ui-icon-circle-plus { background-position: 0 -192px; } 249 | .ui-icon-circle-minus { background-position: -16px -192px; } 250 | .ui-icon-circle-close { background-position: -32px -192px; } 251 | .ui-icon-circle-triangle-e { background-position: -48px -192px; } 252 | .ui-icon-circle-triangle-s { background-position: -64px -192px; } 253 | .ui-icon-circle-triangle-w { background-position: -80px -192px; } 254 | .ui-icon-circle-triangle-n { background-position: -96px -192px; } 255 | .ui-icon-circle-arrow-e { background-position: -112px -192px; } 256 | .ui-icon-circle-arrow-s { background-position: -128px -192px; } 257 | .ui-icon-circle-arrow-w { background-position: -144px -192px; } 258 | .ui-icon-circle-arrow-n { background-position: -160px -192px; } 259 | .ui-icon-circle-zoomin { background-position: -176px -192px; } 260 | .ui-icon-circle-zoomout { background-position: -192px -192px; } 261 | .ui-icon-circle-check { background-position: -208px -192px; } 262 | .ui-icon-circlesmall-plus { background-position: 0 -208px; } 263 | .ui-icon-circlesmall-minus { background-position: -16px -208px; } 264 | .ui-icon-circlesmall-close { background-position: -32px -208px; } 265 | .ui-icon-squaresmall-plus { background-position: -48px -208px; } 266 | .ui-icon-squaresmall-minus { background-position: -64px -208px; } 267 | .ui-icon-squaresmall-close { background-position: -80px -208px; } 268 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; } 269 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } 270 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; } 271 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; } 272 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } 273 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; } 274 | 275 | 276 | /* Misc visuals 277 | ----------------------------------*/ 278 | 279 | /* Corner radius */ 280 | .ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; } 281 | .ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; } 282 | .ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; } 283 | .ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; } 284 | 285 | /* Overlays */ 286 | .ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } 287 | .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -khtml-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* 288 | * jQuery UI Autocomplete 1.8.17 289 | * 290 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 291 | * Dual licensed under the MIT or GPL Version 2 licenses. 292 | * http://jquery.org/license 293 | * 294 | * http://docs.jquery.com/UI/Autocomplete#theming 295 | */ 296 | .ui-autocomplete { position: absolute; cursor: default; } 297 | 298 | /* workarounds */ 299 | * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */ 300 | 301 | /* 302 | * jQuery UI Menu 1.8.17 303 | * 304 | * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) 305 | * Dual licensed under the MIT or GPL Version 2 licenses. 306 | * http://jquery.org/license 307 | * 308 | * http://docs.jquery.com/UI/Menu#theming 309 | */ 310 | .ui-menu { 311 | list-style:none; 312 | padding: 2px; 313 | margin: 0; 314 | display:block; 315 | float: left; 316 | } 317 | .ui-menu .ui-menu { 318 | margin-top: -3px; 319 | } 320 | .ui-menu .ui-menu-item { 321 | margin:0; 322 | padding: 0; 323 | zoom: 1; 324 | float: left; 325 | clear: left; 326 | width: 100%; 327 | } 328 | .ui-menu .ui-menu-item a { 329 | text-decoration:none; 330 | display:block; 331 | padding:.2em .4em; 332 | line-height:1.5; 333 | zoom:1; 334 | } 335 | .ui-menu .ui-menu-item a.ui-state-hover, 336 | .ui-menu .ui-menu-item a.ui-state-active { 337 | font-weight: normal; 338 | margin: -1px; 339 | } 340 | /* 341 | * jQuery UI Button 1.8.17 342 | * 343 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 344 | * Dual licensed under the MIT or GPL Version 2 licenses. 345 | * http://jquery.org/license 346 | * 347 | * http://docs.jquery.com/UI/Button#theming 348 | */ 349 | .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */ 350 | .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */ 351 | button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */ 352 | .ui-button-icons-only { width: 3.4em; } 353 | button.ui-button-icons-only { width: 3.7em; } 354 | 355 | /*button text element */ 356 | .ui-button .ui-button-text { display: block; line-height: 1.4; } 357 | .ui-button-text-only .ui-button-text { padding: .4em 1em; } 358 | .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; } 359 | .ui-button-text-icon-primary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; } 360 | .ui-button-text-icon-secondary .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 2.1em .4em 1em; } 361 | .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; } 362 | /* no icon support for input elements, provide padding by default */ 363 | input.ui-button { padding: .4em 1em; } 364 | 365 | /*button icon element(s) */ 366 | .ui-button-icon-only .ui-icon, .ui-button-text-icon-primary .ui-icon, .ui-button-text-icon-secondary .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; } 367 | .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; } 368 | .ui-button-text-icon-primary .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; } 369 | .ui-button-text-icon-secondary .ui-button-icon-secondary, .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } 370 | .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; } 371 | 372 | /*button sets*/ 373 | .ui-buttonset { margin-right: 7px; } 374 | .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; } 375 | 376 | /* workarounds */ 377 | button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */ 378 | /* 379 | * jQuery UI Dialog 1.8.17 380 | * 381 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 382 | * Dual licensed under the MIT or GPL Version 2 licenses. 383 | * http://jquery.org/license 384 | * 385 | * http://docs.jquery.com/UI/Dialog#theming 386 | */ 387 | .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; } 388 | .ui-dialog .ui-dialog-titlebar { padding: .4em 1em; position: relative; } 389 | .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .1em 0; } 390 | .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; } 391 | .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; } 392 | .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; } 393 | .ui-dialog .ui-dialog-content { position: relative; border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; } 394 | .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; } 395 | .ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { float: right; } 396 | .ui-dialog .ui-dialog-buttonpane button { margin: .5em .4em .5em 0; cursor: pointer; } 397 | .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; } 398 | .ui-draggable .ui-dialog-titlebar { cursor: move; } 399 | /* 400 | * jQuery UI Datepicker 1.8.17 401 | * 402 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 403 | * Dual licensed under the MIT or GPL Version 2 licenses. 404 | * http://jquery.org/license 405 | * 406 | * http://docs.jquery.com/UI/Datepicker#theming 407 | */ 408 | .ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } 409 | .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } 410 | .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } 411 | .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } 412 | .ui-datepicker .ui-datepicker-prev { left:2px; } 413 | .ui-datepicker .ui-datepicker-next { right:2px; } 414 | .ui-datepicker .ui-datepicker-prev-hover { left:1px; } 415 | .ui-datepicker .ui-datepicker-next-hover { right:1px; } 416 | .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } 417 | .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } 418 | .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } 419 | .ui-datepicker select.ui-datepicker-month-year {width: 100%;} 420 | .ui-datepicker select.ui-datepicker-month, 421 | .ui-datepicker select.ui-datepicker-year { width: 49%;} 422 | .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } 423 | .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } 424 | .ui-datepicker td { border: 0; padding: 1px; } 425 | .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } 426 | .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } 427 | .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } 428 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } 429 | 430 | /* with multiple calendars */ 431 | .ui-datepicker.ui-datepicker-multi { width:auto; } 432 | .ui-datepicker-multi .ui-datepicker-group { float:left; } 433 | .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } 434 | .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } 435 | .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } 436 | .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } 437 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } 438 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } 439 | .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } 440 | .ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } 441 | 442 | /* RTL support */ 443 | .ui-datepicker-rtl { direction: rtl; } 444 | .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } 445 | .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } 446 | .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } 447 | .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } 448 | .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } 449 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } 450 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } 451 | .ui-datepicker-rtl .ui-datepicker-group { float:right; } 452 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 453 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } 454 | 455 | /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ 456 | .ui-datepicker-cover { 457 | display: none; /*sorry for IE5*/ 458 | display/**/: block; /*sorry for IE5*/ 459 | position: absolute; /*must have*/ 460 | z-index: -1; /*must have*/ 461 | filter: mask(); /*must have*/ 462 | top: -4px; /*must have*/ 463 | left: -4px; /*must have*/ 464 | width: 200px; /*must have*/ 465 | height: 200px; /*must have*/ 466 | }/* 467 | * jQuery UI Progressbar 1.8.17 468 | * 469 | * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) 470 | * Dual licensed under the MIT or GPL Version 2 licenses. 471 | * http://jquery.org/license 472 | * 473 | * http://docs.jquery.com/UI/Progressbar#theming 474 | */ 475 | .ui-progressbar { height:2em; text-align: left; overflow: hidden; } 476 | .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; } -------------------------------------------------------------------------------- /img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RusticiSoftware/TinCanStatementViewer/6b66bdbf7488c9ab0bb9b9b20c7a22dcb1cce5ce/img/loading.gif -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Tin Can Viewer 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |

Tin Can Statement Viewer

17 | Click on a statement to see the raw statement data. 18 |

19 | 90 |
91 |
92 | Loading 93 |
94 | 95 |
96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 113 | 114 | 115 | -------------------------------------------------------------------------------- /scripts/TinCanQueryUtils.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012 Rustici Software, LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | var TINCAN = (TINCAN || {}); 18 | 19 | // 20 | // Using the given lrsList, this object will fetch from many LRSs 21 | // and allow consumers to process those statements by descending stored 22 | // date, respecting order across the many LRSs 23 | // 24 | TINCAN.MultiLRSStatementStream = function (lrsList) { 25 | this.lrsList = lrsList; 26 | this.state = {}; 27 | 28 | this.initializeState(); 29 | }; 30 | TINCAN.MultiLRSStatementStream.prototype = { 31 | getLrsId: function (lrs) { 32 | return lrs.endpoint + lrs.auth + lrs.version; 33 | }, 34 | 35 | initializeState: function () { 36 | var i, lrs; 37 | for (i = 0; i < this.lrsList.length; i += 1) { 38 | lrs = this.lrsList[i]; 39 | this.state[this.getLrsId(lrs)] = { 40 | lrs: lrs, 41 | statements: [], 42 | moreUrl: null 43 | }; 44 | } 45 | }, 46 | 47 | getIdMap: function () { 48 | var k, ids = {}; 49 | for (k in this.state) { 50 | if (this.state.hasOwnProperty(k)) { 51 | ids[k] = true; 52 | } 53 | } 54 | return ids; 55 | }, 56 | 57 | // Returns the next statement from the given statement streams based 58 | // on most recent stored date. 59 | getNextStatement: function () { 60 | var lrsId, lrsState, recentStatement, maxDate = "0", nextLrsId = null; 61 | 62 | for (lrsId in this.getIdMap()) { 63 | lrsState = this.state[lrsId]; 64 | 65 | // We have to stop giving statements here because the most recent 66 | // statement could be one we haven't yet fetched 67 | if (lrsState.statements.length === 0 && lrsState.moreUrl !== null) { 68 | return null; 69 | } 70 | if (lrsState.statements.length > 0) { 71 | recentStatement = lrsState.statements[0]; 72 | if (recentStatement.stored === null || recentStatement.stored.localeCompare(maxDate) > 0) { 73 | if (recentStatement.stored !== null) { 74 | maxDate = recentStatement.stored; 75 | } 76 | nextLrsId = lrsId; 77 | } 78 | } 79 | } 80 | return (nextLrsId === null) ? null : this.state[nextLrsId].statements.shift(); 81 | }, 82 | 83 | // Use getNextStatement to get all loaded statements that can be 84 | // guaranteed to be in order 85 | getAllStatements: function () { 86 | var stmt, statements = []; 87 | stmt = this.getNextStatement(); 88 | while (stmt !== null) { 89 | statements.push(stmt); 90 | stmt = this.getNextStatement(); 91 | } 92 | return statements; 93 | }, 94 | 95 | // Load statements from multiple LRSs, and call the given callback when 96 | // those statements are ready passing in this multi stream object as the argument 97 | loadStatements: function (queryObj, callback) { 98 | var multiStream = this, 99 | isMoreQuery = (queryObj === "more"), 100 | lrsListToUse = this.lrsList, 101 | lrsId, 102 | lrsState, 103 | i, 104 | callbackCount, 105 | createCallback, 106 | url, 107 | versionHeader, 108 | _requestCfg, 109 | requestCfg = null; 110 | 111 | if (isMoreQuery) { 112 | // If we're continuing some query, only query lrs's that have more statements 113 | lrsListToUse = []; 114 | for (lrsId in this.getIdMap()) { 115 | lrsState = this.state[lrsId]; 116 | if (lrsState.statements.length <= 10 && lrsState.moreUrl !== null) { 117 | lrsListToUse.push(this.state[lrsId].lrs); 118 | } 119 | } 120 | } else { 121 | // If this is not a continuation query, make sure to reset moreUrls 122 | this.initializeState(); 123 | } 124 | 125 | // Capture total count of lrs's to help w/ multiple callbacks below 126 | callbackCount = lrsListToUse.length; 127 | 128 | // Setup a function which will create a callback for this lrs fetch 129 | createCallback = function (lrsId) { 130 | return function (err, stResult) { 131 | var streamState = multiStream.state[lrsId]; 132 | callbackCount--; 133 | 134 | if (err === null) { 135 | // Capture this lrs's statements into state, note more url 136 | Array.prototype.push.apply(streamState.statements, stResult.statements); 137 | // The spec stipulates that an empty string should be 138 | // returned if there are no more results to fetch... but 139 | // all the code here checks for null explicitly. So "cast" 140 | // empty string results as null. 141 | streamState.moreUrl = stResult.more === "" ? null : stResult.more; 142 | } 143 | 144 | // Only do handed in callback after all versions done 145 | if (callbackCount === 0) { 146 | callback(multiStream); 147 | } 148 | }; 149 | }; 150 | 151 | // Loop through the lrs's, setting up callbacks and fetching statements 152 | for (i = 0; i < lrsListToUse.length; i += 1) { 153 | // Get reference to lrs we're using 154 | lrs = lrsListToUse[i]; 155 | lrsId = this.getLrsId(lrs); 156 | 157 | if (!isMoreQuery) { 158 | _requestCfg = lrs.queryStatements( 159 | { 160 | params: queryObj, 161 | callback: createCallback(lrsId) 162 | } 163 | ); 164 | if (requestCfg === null) { 165 | requestCfg = _requestCfg; 166 | } 167 | } else { 168 | lrs.moreStatements( 169 | { 170 | url: this.state[lrsId].moreUrl, 171 | callback: createCallback(lrsId) 172 | } 173 | ); 174 | } 175 | } 176 | 177 | return requestCfg; 178 | }, 179 | 180 | // Load more statements from the saved multiple LRSs and current query 181 | // started with loadStatements. Call callback when statements are ready, 182 | // passing in this multi stream object as the argument 183 | loadMoreStatements: function (callback) { 184 | this.loadStatements("more", callback); 185 | }, 186 | 187 | // Returns true if there are no more statements available, whether fetched 188 | // or potentially available through a continuation query (i.e. "more" url) 189 | exhausted: function () { 190 | var lrsId, lrsState; 191 | for (lrsId in this.getIdMap()) { 192 | lrsState = this.state[lrsId]; 193 | if (lrsState.statements.length > 0 || lrsState.moreUrl !== null) { 194 | return false; 195 | } 196 | } 197 | return true; 198 | } 199 | }; 200 | -------------------------------------------------------------------------------- /scripts/TinCanViewer.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright 2012 Rustici Software, LLC 3 | 4 | Licensed under the Apache License, Version 2.0 (the "License"); 5 | you may not use this file except in compliance with the License. 6 | You may obtain a copy of the License at 7 | 8 | http://www.apache.org/licenses/LICENSE-2.0 9 | 10 | Unless required by applicable law or agreed to in writing, software 11 | distributed under the License is distributed on an "AS IS" BASIS, 12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | See the License for the specific language governing permissions and 14 | limitations under the License. 15 | */ 16 | 17 | //TinCan.enableDebug(); 18 | 19 | var TINCAN = (TINCAN || {}); 20 | 21 | TINCAN.Viewer = function () { 22 | this.log("TINCAN.Viewer constructor"); 23 | var i, 24 | lrs; 25 | 26 | this.includeRawData = true; 27 | this.allVersions = ["1.0.0", "0.95", "0.9"]; 28 | this.multiVersionStream = null; 29 | this.lrses = {}; 30 | 31 | if (typeof Config !== "undefined") { 32 | for (i = 0; i < this.allVersions.length; i += 1) { 33 | this.log("TINCAN.Viewer version: " + this.allVersions[i]); 34 | this.lrses[this.allVersions[i]] = new TinCan.LRS ( 35 | { 36 | endpoint: Config.endpoint, 37 | username: Config.authUser, 38 | password: Config.authPassword, 39 | version: this.allVersions[i] 40 | } 41 | ); 42 | } 43 | } 44 | }; 45 | 46 | if (typeof console !== "undefined") { 47 | TINCAN.Viewer.prototype.log = function (str) { 48 | console.log(str); 49 | }; 50 | } 51 | else { 52 | TINCAN.Viewer.prototype.log = function (str) {}; 53 | } 54 | 55 | TINCAN.Viewer.prototype.getCallback = function (callback) { 56 | var tcViewer = this; 57 | return function () { callback.apply(tcViewer, arguments); }; 58 | }; 59 | 60 | TINCAN.Viewer.prototype.getMultiVersionStream = function (versionList) { 61 | var lrsList = [], 62 | i; 63 | 64 | for (i = 0; i < versionList.length; i += 1) { 65 | lrsList.push(this.lrses[versionList[i]]); 66 | } 67 | 68 | return new TINCAN.MultiLRSStatementStream(lrsList); 69 | }; 70 | 71 | TINCAN.Viewer.prototype.TinCanSearchHelper = function () { 72 | this.getVersion = function () { 73 | return this.getSearchVar("version") || "latest"; 74 | }; 75 | 76 | this.getVerb = function () { 77 | var verbStr = this.getSearchVar( 78 | this.getVersion().indexOf("0.9") === -1 ? "verb1" : "verb" 79 | ), 80 | verb = null 81 | ; 82 | if (verbStr !== null && verbStr.length > 0) { 83 | verb = new TinCan.Verb (verbStr); 84 | } 85 | return verb; 86 | }; 87 | 88 | this.getRegistration = function () { 89 | return this.getSearchVar(this.getVersion().indexOf("0.9") === -1 ? "registration1" : "registration"); 90 | }; 91 | 92 | this.getSince = function () { 93 | var since = this.getSearchVar(this.getVersion().indexOf("0.9") === -1 ? "since1" : "since"); 94 | if (since !== null && this.dateStrIsDateOnly(since)) { 95 | since = this.appendDefaultTime(since); 96 | } 97 | if (since !== null && !this.dateStrIncludesTimeZone(since)) { 98 | since = since + "Z"; 99 | } 100 | return since; 101 | }; 102 | 103 | this.getUntil = function () { 104 | var until = this.getSearchVar(this.getVersion().indexOf("0.9") === -1 ? "until1" : "until"); 105 | if (until !== null && this.dateStrIsDateOnly(until)) { 106 | until = this.appendDefaultTime(until); 107 | } 108 | if (until !== null && !this.dateStrIncludesTimeZone(until)) { 109 | until = until + "Z"; 110 | } 111 | return until; 112 | }; 113 | 114 | this.getAgent = function () { 115 | var agent = null, 116 | agentCfg = {}, 117 | agentProperty = this.getSearchVar("agentProperty"), 118 | agentValue = this.getSearchVar("agentValue"); 119 | 120 | if (agentProperty !== null && agentValue !== null) { 121 | agentCfg[agentProperty] = agentValue; 122 | 123 | agent = new TinCan.Agent(agentCfg); 124 | } 125 | 126 | return agent; 127 | }; 128 | 129 | this.getActor = function () { 130 | var actor = null, 131 | actorJson = this.getSearchVar("actorJson"), 132 | actorEmail = this.getSearchVar("actorEmail"); 133 | 134 | if (actorJson !== null && actorJson.length > 0) { 135 | actor = TinCan.Agent.fromJSON(actorJson); 136 | } 137 | else if (actorEmail !== null) { 138 | actor = new TinCan.Agent( 139 | { 140 | mbox: actorEmail 141 | } 142 | ); 143 | } 144 | 145 | return actor; 146 | }; 147 | 148 | this.getActivity = function () { 149 | var activityId = this.getSearchVar("activityId1"), 150 | activity = null 151 | ; 152 | if (activityId !== null && activityId.length > 0) { 153 | activity = new TinCan.Activity ( { id: activityId } ); 154 | } 155 | return activity; 156 | }; 157 | 158 | this.getTarget = function () { 159 | var obj = null, 160 | objectJson = this.getSearchVar("objectJson"), 161 | activityId; 162 | 163 | if (objectJson !== null) { 164 | // TODO: protect JSON.parse 165 | obj = JSON.parse(objectJson); 166 | if (typeof obj.objectType === "undefined") { 167 | // assumed to be activity 168 | obj.objectType = "Activity"; 169 | } 170 | 171 | if (obj.objectType === "Activity") { 172 | obj = new TinCan.Activity (obj); 173 | } 174 | else if (obj.objectType === "Agent") { 175 | obj = new TinCan.Agent (obj); 176 | } 177 | else if (obj.objectType === "SubStatement") { 178 | obj = new TinCan.SubStatement (obj); 179 | } 180 | else if (obj.objectType === "StatementRef") { 181 | obj = new TinCan.StatementRef (obj); 182 | } 183 | } else { 184 | activityId = this.getSearchVar("activityId"); 185 | if (activityId !== null) { 186 | obj = new TinCan.Activity ( 187 | { 188 | id: activityId 189 | } 190 | ); 191 | } 192 | } 193 | 194 | return obj; 195 | }; 196 | 197 | this.getInstructor = function () { 198 | var instructorJson = this.getSearchVar("instructorJson"), 199 | instructor = null; 200 | if (instructorJson !== null && instructorJson.length > 0) { 201 | instructor = TinCan.Agent.fromJSON(instructorJson); 202 | } 203 | return instructor; 204 | }; 205 | 206 | this.getContext = function () { 207 | return this.getSearchVarAsBoolean("context", "false"); 208 | }; 209 | 210 | this.getAuthoritative = function () { 211 | return this.getSearchVarAsBoolean("authoritative", "true"); 212 | }; 213 | 214 | this.getSparse = function () { 215 | return this.getSearchVarAsBoolean("sparse", "false"); 216 | }; 217 | 218 | this.getFormat = function () { 219 | return this.getSearchVar("format"); 220 | }; 221 | 222 | this.getRelatedAgents = function () { 223 | return this.getSearchVarAsBoolean("relatedAgents"); 224 | }; 225 | this.getRelatedActivities = function () { 226 | return this.getSearchVarAsBoolean("relatedActivities"); 227 | }; 228 | this.getAttachments = function () { 229 | return this.getSearchVarAsBoolean("attachments"); 230 | }; 231 | 232 | this.dateStrIncludesTimeZone = function (str) { 233 | return typeof str !== "undefined" && (str.indexOf("+") >= 0 || str.indexOf("Z") >= 0); 234 | }; 235 | 236 | this.dateStrIsDateOnly = function (str) { 237 | // yyyy-mm-dd 238 | var dateRegex = /^\d{4}-\d{2}-\d{2}$/; 239 | return typeof str !== "undefined" && (dateRegex.test(str)); 240 | }; 241 | 242 | this.appendDefaultTime = function (str) { 243 | return str + "T00:00:00.000Z"; 244 | }; 245 | 246 | this.getSearchVar = function (searchVarName, defaultVal) { 247 | var myVar = $("#"+searchVarName).val(); 248 | if (myVar === null || myVar.length < 1) { 249 | if (typeof defaultVal !== "undefined") { 250 | return defaultVal; 251 | } 252 | return null; 253 | } 254 | return myVar; 255 | }; 256 | 257 | this.getSearchVarAsBoolean = function (searchVarName, defaultVal) { 258 | return $("#"+searchVarName).is(":checked"); 259 | }; 260 | }; 261 | 262 | TINCAN.Viewer.prototype.TinCanFormHelper = function () { 263 | this.copyQueryStringToForm = function () { 264 | var booleanVals = ["context", "authoritative", "sparse", "relatedActivities", "relatedAgents"]; 265 | var qsMap = this.getQueryStringMap(); 266 | for (var key in qsMap) { 267 | var inputType = ($.inArray(key, booleanVals) >= 0) ? "checkbox" : "text"; 268 | this.setInputFromQueryString(key, qsMap[key], inputType); 269 | this.setInputFromQueryString(key+"1", qsMap[key], inputType); //For 1.0.0 form fields 270 | } 271 | }; 272 | 273 | this.setInputFromQueryString = function (name, val, inputType) { 274 | if (inputType === null) { 275 | inputType = "text"; 276 | } 277 | if (val !== null) { 278 | if (inputType === "text") { 279 | $("#"+name).val(val); 280 | } 281 | else if (inputType === "checkbox"){ 282 | if (val === "true") { 283 | $("#"+name).attr('checked', 'checked'); 284 | } else { 285 | $("#"+name).removeAttr('checked'); 286 | } 287 | } 288 | } 289 | }; 290 | 291 | this.getQueryStringMap = function () { 292 | var qs = window.location.search, 293 | nameVals, 294 | qsMap, 295 | i, 296 | keyVal; 297 | if (qs === null || qs.length < 1){ 298 | return []; 299 | } 300 | if (qs.indexOf("#") > 0){ 301 | qs = qs.substring(0, qs.indexOf("#")); 302 | } 303 | qs = qs.substring(1, qs.length); 304 | nameVals = qs.split("&"); 305 | qsMap = {}; 306 | for (i = 0; i < nameVals.length; i += 1) { 307 | keyVal = nameVals[i].split("="); 308 | qsMap[keyVal[0]] = decodeURIComponent(keyVal[1].replace(/\+/g, " ")); 309 | } 310 | return qsMap; 311 | }; 312 | }; 313 | 314 | TINCAN.Viewer.prototype.commonQueryObj = function (helper) { 315 | var queryObj = {}, 316 | verb = helper.getVerb(), 317 | registration = helper.getRegistration(), 318 | since = helper.getSince(), 319 | until = helper.getUntil(); 320 | 321 | if (verb !== null) { 322 | queryObj.verb = verb; 323 | } 324 | if (registration !== null) { 325 | queryObj.registration = registration; 326 | } 327 | if (since !== null) { 328 | queryObj.since = since; 329 | } 330 | if (until !== null) { 331 | queryObj.until = until; 332 | } 333 | 334 | return queryObj; 335 | }; 336 | 337 | TINCAN.Viewer.prototype.pre1QueryObj = function (helper) { 338 | var queryObj = this.commonQueryObj(helper), 339 | actor = helper.getActor(), 340 | target = helper.getTarget(), 341 | instructor = helper.getInstructor(), 342 | context = helper.getContext(), 343 | sparse = helper.getSparse(), 344 | authoritative = helper.getAuthoritative(); 345 | 346 | if (actor !== null) { 347 | queryObj.actor = actor; 348 | } 349 | if (target !== null) { 350 | queryObj.target = target; 351 | } 352 | if (instructor !== null) { 353 | queryObj.instructor = instructor; 354 | } 355 | if (context !== null) { 356 | queryObj.context = context; 357 | } 358 | if (sparse !== null) { 359 | queryObj.sparse = sparse; 360 | } 361 | if (authoritative !== null) { 362 | queryObj.authoritative = authoritative; 363 | } 364 | 365 | return queryObj; 366 | }; 367 | 368 | TINCAN.Viewer.prototype.v1QueryObj = function (helper) { 369 | var queryObj = this.commonQueryObj(helper), 370 | agent = helper.getAgent(), 371 | activity = helper.getActivity(), 372 | format = helper.getFormat(), 373 | relatedAgents = helper.getRelatedAgents(), 374 | relatedActivities = helper.getRelatedActivities(), 375 | attachments = helper.getAttachments(); 376 | 377 | if (agent !== null) { 378 | queryObj.agent = agent; 379 | } 380 | if (activity !== null) { 381 | queryObj.activity = activity; 382 | } 383 | if (format !== null) { 384 | queryObj.format = format; 385 | } 386 | if (relatedAgents !== null) { 387 | queryObj.related_agents = relatedAgents; 388 | } 389 | if (relatedActivities !== null) { 390 | queryObj.related_activities = relatedActivities; 391 | } 392 | // TODO: TinCanJS doesn't yet parse multipart 393 | //if (attachments !== null) { 394 | //queryObj.attachments = attachments; 395 | //} 396 | 397 | return queryObj; 398 | }; 399 | 400 | TINCAN.Viewer.prototype.searchStatements = function () { 401 | var selectVersion, 402 | versionsToUse, 403 | helper = new this.TinCanSearchHelper(), 404 | queryObj, 405 | requestResult, 406 | prop, 407 | url, 408 | urlPairs = []; 409 | 410 | selectVersion = helper.getVersion(); 411 | 412 | if (selectVersion === "0.9" || selectVersion === "0.95" || selectVersion === "0.95 + 0.9") { 413 | queryObj = this.pre1QueryObj(helper); 414 | } 415 | else { 416 | queryObj = this.v1QueryObj(helper); 417 | } 418 | 419 | queryObj.limit = 25; 420 | 421 | // Figure out the versions to use 422 | if (selectVersion === "latest") { 423 | versionsToUse = [ this.allVersions[0] ]; 424 | } else if (selectVersion === "0.95 + 0.9") { 425 | versionsToUse = [ "0.95", "0.9" ]; 426 | } else { 427 | versionsToUse = [ selectVersion ]; 428 | } 429 | 430 | this.multiVersionStream = this.getMultiVersionStream(versionsToUse); 431 | requestResult = this.multiVersionStream.loadStatements(queryObj, this.getCallback(this.statementsFetched)); 432 | 433 | if (requestResult.config && requestResult.config.params) { 434 | // Set the TCAPI query text 435 | for (prop in requestResult.config.params) { 436 | urlPairs.push(prop + "=" + encodeURIComponent(requestResult.config.params[prop])); 437 | } 438 | url = this.lrses[versionsToUse[0]].endpoint + requestResult.config.url + "?" + urlPairs.join("&"); 439 | } 440 | else { 441 | url = "Invalid URL: " + requestResult.err; 442 | } 443 | $("#TCAPIQueryText").text(url); 444 | }; 445 | 446 | TINCAN.Viewer.prototype.getMoreStatements = function (callback) { 447 | this.multiVersionStream.loadStatements("more", this.getCallback(this.statementsFetched)); 448 | }; 449 | 450 | TINCAN.Viewer.prototype.statementsFetched = function (multiStream) { 451 | var unwiredDivs; 452 | 453 | // If this query led no where, show no statements available method 454 | if (multiStream.exhausted()) { 455 | $("#statementsLoading").hide(); 456 | $("#noStatementsMessage").show(); 457 | } 458 | 459 | // Alright, render all available statements 460 | $("#statementsLoading").hide(); 461 | $("#theStatements").append( 462 | this.renderStatements( 463 | multiStream.getAllStatements() 464 | ) 465 | ); 466 | 467 | // Hook up the "show raw data" links 468 | unwiredDivs = $('div[tcid].unwired'); 469 | unwiredDivs.click(function () { 470 | $('[tcid_data="' + $(this).attr('tcid') + '"]').toggle(); 471 | }); 472 | unwiredDivs.removeClass('unwired'); 473 | 474 | // Show more button? 475 | $("#showAllStatements").toggle(!multiStream.exhausted()); 476 | }; 477 | 478 | TINCAN.Viewer.prototype.escapeHTML = function (text) { 479 | var html = text + ""; 480 | return html.replace(/&/g,'&').replace(//g,'>'); 481 | }; 482 | 483 | TINCAN.Viewer.prototype.renderActor = function (actor) { 484 | return this.escapeHTML(actor); 485 | }; 486 | 487 | TINCAN.Viewer.prototype.renderStoredDate = function (storedDateStr) { 488 | return storedDateStr.replace('Z','') 489 | }; 490 | 491 | TINCAN.Viewer.prototype.renderStatements = function (statements) { 492 | var allStmtStr, 493 | i, 494 | dt, 495 | aDate, 496 | stmtStr, 497 | stmt, 498 | verb, 499 | objDesc, 500 | answer, 501 | activityType; 502 | 503 | 504 | function truncateString (str, length) { 505 | if (str === null || str.length < 4 || str.length <= length) { 506 | return str; 507 | } 508 | return str.substr(0, length - 3) + '...'; 509 | } 510 | 511 | function getResponseText (stmt) { 512 | var response, 513 | objDef, 514 | componentName = null, 515 | components, 516 | responses, 517 | responseStr = [], 518 | first = true, 519 | responseId, 520 | i, 521 | j, 522 | source, 523 | target, 524 | responseParts; 525 | 526 | if (stmt.result === null || stmt.result.response === null) { 527 | return ""; 528 | } 529 | response = stmt.result.response; 530 | 531 | if (stmt.target === null || 532 | stmt.target.objectType !== "Activity" || 533 | stmt.target.definition === null || 534 | stmt.target.definition.type !== "cmi.interaction" || 535 | stmt.target.definition.interactionType === null 536 | ) { 537 | return response; 538 | } 539 | objDef = stmt.target.definition; 540 | 541 | // TODO: move the splitting on [,] of the values into TinCanJS 542 | if (objDef.interactionType === "matching") { 543 | if (objDef.source !== null && 544 | objDef.source.length > 0 && 545 | objDef.target !== null && 546 | objDef.target.length > 0 547 | ) { 548 | source = objDef.source; 549 | target = objDef.target; 550 | 551 | responses = response.split("[,]"); 552 | 553 | for (i = 0; i < responses.length; i += 1) { 554 | responseParts = responses[i].split("[.]"); 555 | 556 | for (j = 0; j < source.length; j += 1) { 557 | if (responseParts[0] === source[j].id) { 558 | if (!first) { 559 | responseStr.push(", "); 560 | } 561 | responseStr.push(source[j].getLangDictionaryValue("description")); 562 | first = false; 563 | } 564 | } 565 | for (j = 0; j < target.length; j += 1) { 566 | if (responseParts[1] === target[j].id) { 567 | responseStr.push(" -> "); 568 | responseStr.push(target[j].getLangDictionaryValue("description")); 569 | } 570 | } 571 | } 572 | } 573 | } else { 574 | if (objDef.interactionType === "choice" || objDef.interactionType === "sequencing") { 575 | componentName = "choices"; 576 | } 577 | else if (objDef.interactionType === "likert") { 578 | componentName = "scale"; 579 | } 580 | else if (objDef.interactionType === "performance") { 581 | componentName = "steps"; 582 | } 583 | 584 | if (componentName !== null) { 585 | components = objDef[componentName]; 586 | 587 | if (components !== null && components.length > 0){ 588 | responses = response.split("[,]"); 589 | 590 | for (i = 0; i < responses.length; i += 1) { 591 | for (j = 0; j < components.length; j += 1) { 592 | responseId = responses[i]; 593 | if (objDef.interactionType === "performance"){ 594 | responseId = responses[i].split("[.]")[0]; 595 | } 596 | if (responseId === components[j].id) { 597 | if (!first) { 598 | responseStr.push(", "); 599 | } 600 | responseStr.push(components[j].getLangDictionaryValue("description")); 601 | 602 | if (objDef.interactionType === "performance") { 603 | responseStr.push(" -> "); 604 | responseStr.push(responses[i].split("[.]")[1]); 605 | } 606 | first = false; 607 | } 608 | } 609 | } 610 | } 611 | } 612 | } 613 | 614 | if (responseStr.length > 0) { 615 | return responseStr.join(""); 616 | } 617 | 618 | return response; 619 | } 620 | 621 | allStmtStr = []; 622 | allStmtStr.push(""); 623 | 624 | for (i = 0; i < statements.length; i += 1) { 625 | stmtStr = []; 626 | stmt = statements[i]; 627 | //this.log("-------------------------------" + stmt.id + "-------------------------------"); 628 | 629 | stmtStr.push(""); 630 | 631 | stmtStr.push( 632 | ""); 635 | 636 | stmtStr.push(""); 702 | allStmtStr.push(stmtStr.join('')); 703 | //this.log("-------------------------------" + stmt.id + "-------------------------------"); 704 | } 705 | allStmtStr.push("
" + 633 | (stmt.stored !== null ? this.renderStoredDate(stmt.stored) : "") + 634 | "
"); 637 | stmtStr.push("
"); 638 | 639 | try { 640 | stmtStr.push( 641 | "" + 642 | (stmt.actor !== null ? this.renderActor(stmt.actor) : "No Actor") + 643 | " "); 644 | 645 | if (stmt.context !== null && 646 | stmt.context.extensions !== null && 647 | typeof stmt.context.extensions.verb !== "undefined" 648 | ) { 649 | verb = stmt.context.extensions.verb; 650 | } else { 651 | verb = stmt.verb + ""; 652 | } 653 | 654 | if (verb === "interacted") { 655 | verb = "interacted with"; 656 | } else if (stmt.inProgress === true) { 657 | verb = verb + " (in progress)"; 658 | } 659 | 660 | answer = null; 661 | 662 | if (typeof stmt.target.definition !== "undefined" && stmt.target.definition !== null) { 663 | activityType = stmt.target.definition.type; 664 | if (activityType !== null && (activityType === "question" || activityType.indexOf("interaction") >= 0)) { 665 | if (stmt.result !== null) { 666 | if (stmt.result.success !== null) { 667 | verb = (stmt.result.success ? "correctly " : "incorrectly ") + verb; 668 | } 669 | if (stmt.result.response !== null) { 670 | answer = " with response '" + this.escapeHTML(truncateString(getResponseText(stmt), 30)) + "' "; 671 | } 672 | } 673 | } 674 | } 675 | 676 | stmtStr.push(" " + this.escapeHTML(verb) + " "); 677 | stmtStr.push(" '" + this.escapeHTML(stmt.target) + "' "); 678 | stmtStr.push(answer !== null ? answer : ""); 679 | 680 | if (stmt.result !== null && stmt.result.score !== null) { 681 | if (stmt.result.score.scaled !== null) { 682 | stmtStr.push(" with score " + Math.round((stmt.result.score.scaled * 100.0)) + "%"); 683 | } else if (stmt.result.score.raw !== null) { 684 | stmtStr.push(" with score " + stmt.result.score.raw + ""); 685 | } 686 | } 687 | } 688 | catch (error) { 689 | this.log("Error occurred while trying to display statement with id " + stmt.id + ": " + error.message); 690 | //this.log("-------------------------------" + stmt.id + "-------------------------------"); 691 | stmtStr.push("" + stmt.id + ""); 692 | } 693 | stmtStr.push("
"); 694 | 695 | if (this.includeRawData) { 696 | stmtStr.push("
"); 697 | stmtStr.push("
" + stmt.originalJSON + "
"); 698 | stmtStr.push("
"); 699 | } 700 | 701 | stmtStr.push("
"); 706 | 707 | return allStmtStr.join(''); 708 | }; 709 | 710 | TINCAN.Viewer.prototype.pageInitialize = function () { 711 | var tcViewer = this, 712 | doRefresh = function () { 713 | $("#statementsLoading").show(); 714 | $("#showAllStatements").hide(); 715 | $("#noStatementsMessage").hide(); 716 | $("#theStatements").empty(); 717 | tcViewer.searchStatements(); 718 | }; 719 | 720 | $.datepicker.setDefaults( 721 | { 722 | dateFormat: "yy-mm-dd", 723 | constrainInput: false 724 | } 725 | ); 726 | $("#since").datepicker(); 727 | $("#until").datepicker(); 728 | $("#since1").datepicker(); 729 | $("#until1").datepicker(); 730 | 731 | $("#statementsLoading").show(); 732 | $("#showAllStatements").hide(); 733 | $("#noStatementsMessage").hide(); 734 | 735 | $("#refreshStatements").click(doRefresh); 736 | 737 | $("#showAllStatements").click( 738 | function () { 739 | $("#statementsLoading").show(); 740 | tcViewer.getMoreStatements(); 741 | } 742 | ); 743 | 744 | $("#version").change( 745 | function (e) { 746 | var version = $(e.target.options[e.target.selectedIndex]).val(), 747 | searchBoxTable = $("#searchBoxTable"), 748 | advancedSearchTable = $("#advancedSearchTable"), 749 | searchBoxTable1 = $("#searchBoxTable1"), 750 | advancedSearchTable1 = $("#advancedSearchTable1"); 751 | 752 | if (version === "0.9" || version === "0.95" || version === "0.95 + 0.9") { 753 | if (searchBoxTable1.is(":visible")) { 754 | searchBoxTable1.toggle("slow"); 755 | searchBoxTable.toggle("slow"); 756 | 757 | if (advancedSearchTable1.is(":visible")) { 758 | advancedSearchTable1.toggle("slow"); 759 | advancedSearchTable.toggle("slow"); 760 | } 761 | } 762 | } 763 | else { 764 | if (searchBoxTable.is(":visible")) { 765 | searchBoxTable.toggle("slow"); 766 | searchBoxTable1.toggle("slow"); 767 | 768 | if (advancedSearchTable.is(":visible")) { 769 | advancedSearchTable.toggle("slow"); 770 | advancedSearchTable1.toggle("slow"); 771 | } 772 | } 773 | } 774 | 775 | doRefresh(); 776 | } 777 | ); 778 | 779 | $("#showAdvancedOptions").click( 780 | function () { 781 | var version = $("#version").val(), 782 | node; 783 | 784 | if (version === "0.9" || version === "0.95" || version === "0.95 + 0.9") { 785 | node = $("#advancedSearchTable"); 786 | } 787 | else { 788 | node = $("#advancedSearchTable1"); 789 | } 790 | 791 | node.toggle( 792 | 'slow', 793 | function () { 794 | var visible = node.is(":visible"), 795 | text = (visible ? "Hide" : "Show") + " Advanced Options"; 796 | 797 | $("#showAdvancedOptions").html(text); 798 | } 799 | ); 800 | } 801 | ); 802 | 803 | $("#showQuery").click( 804 | function () { 805 | $("#TCAPIQuery").toggle( 806 | 'slow', 807 | function () { 808 | var visible = $("#TCAPIQuery").is(":visible"), 809 | text = (visible ? "Hide" : "Show") + " TCAPI Query"; 810 | $("#showQuery").html(text); 811 | } 812 | ); 813 | } 814 | ); 815 | 816 | (new this.TinCanFormHelper()).copyQueryStringToForm(); 817 | }; 818 | -------------------------------------------------------------------------------- /scripts/base64.js: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2008 Fred Palmer fred.palmer_at_gmail.com 3 | 4 | Permission is hereby granted, free of charge, to any person 5 | obtaining a copy of this software and associated documentation 6 | files (the "Software"), to deal in the Software without 7 | restriction, including without limitation the rights to use, 8 | copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | OTHER DEALINGS IN THE SOFTWARE. 24 | */ 25 | function StringBuffer() 26 | { 27 | this.buffer = []; 28 | } 29 | 30 | StringBuffer.prototype.append = function append(string) 31 | { 32 | this.buffer.push(string); 33 | return this; 34 | }; 35 | 36 | StringBuffer.prototype.toString = function toString() 37 | { 38 | return this.buffer.join(""); 39 | }; 40 | 41 | var Base64 = 42 | { 43 | codex : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", 44 | 45 | encode : function (input) 46 | { 47 | var output = new StringBuffer(); 48 | 49 | var enumerator = new Utf8EncodeEnumerator(input); 50 | while (enumerator.moveNext()) 51 | { 52 | var chr1 = enumerator.current; 53 | 54 | enumerator.moveNext(); 55 | var chr2 = enumerator.current; 56 | 57 | enumerator.moveNext(); 58 | var chr3 = enumerator.current; 59 | 60 | var enc1 = chr1 >> 2; 61 | var enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 62 | var enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 63 | var enc4 = chr3 & 63; 64 | 65 | if (isNaN(chr2)) 66 | { 67 | enc3 = enc4 = 64; 68 | } 69 | else if (isNaN(chr3)) 70 | { 71 | enc4 = 64; 72 | } 73 | 74 | output.append(this.codex.charAt(enc1) + this.codex.charAt(enc2) + this.codex.charAt(enc3) + this.codex.charAt(enc4)); 75 | } 76 | 77 | return output.toString(); 78 | }, 79 | 80 | decode : function (input) 81 | { 82 | var output = new StringBuffer(); 83 | 84 | var enumerator = new Base64DecodeEnumerator(input); 85 | while (enumerator.moveNext()) 86 | { 87 | var charCode = enumerator.current; 88 | 89 | if (charCode < 128) 90 | output.append(String.fromCharCode(charCode)); 91 | else if ((charCode > 191) && (charCode < 224)) 92 | { 93 | enumerator.moveNext(); 94 | var charCode2 = enumerator.current; 95 | 96 | output.append(String.fromCharCode(((charCode & 31) << 6) | (charCode2 & 63))); 97 | } 98 | else 99 | { 100 | enumerator.moveNext(); 101 | var charCode2 = enumerator.current; 102 | 103 | enumerator.moveNext(); 104 | var charCode3 = enumerator.current; 105 | 106 | output.append(String.fromCharCode(((charCode & 15) << 12) | ((charCode2 & 63) << 6) | (charCode3 & 63))); 107 | } 108 | } 109 | 110 | return output.toString(); 111 | } 112 | } 113 | 114 | 115 | function Utf8EncodeEnumerator(input) 116 | { 117 | this._input = input; 118 | this._index = -1; 119 | this._buffer = []; 120 | } 121 | 122 | Utf8EncodeEnumerator.prototype = 123 | { 124 | current: Number.NaN, 125 | 126 | moveNext: function() 127 | { 128 | if (this._buffer.length > 0) 129 | { 130 | this.current = this._buffer.shift(); 131 | return true; 132 | } 133 | else if (this._index >= (this._input.length - 1)) 134 | { 135 | this.current = Number.NaN; 136 | return false; 137 | } 138 | else 139 | { 140 | var charCode = this._input.charCodeAt(++this._index); 141 | 142 | // "\r\n" -> "\n" 143 | // 144 | if ((charCode == 13) && (this._input.charCodeAt(this._index + 1) == 10)) 145 | { 146 | charCode = 10; 147 | this._index += 2; 148 | } 149 | 150 | if (charCode < 128) 151 | { 152 | this.current = charCode; 153 | } 154 | else if ((charCode > 127) && (charCode < 2048)) 155 | { 156 | this.current = (charCode >> 6) | 192; 157 | this._buffer.push((charCode & 63) | 128); 158 | } 159 | else 160 | { 161 | this.current = (charCode >> 12) | 224; 162 | this._buffer.push(((charCode >> 6) & 63) | 128); 163 | this._buffer.push((charCode & 63) | 128); 164 | } 165 | 166 | return true; 167 | } 168 | } 169 | } 170 | 171 | function Base64DecodeEnumerator(input) 172 | { 173 | this._input = input; 174 | this._index = -1; 175 | this._buffer = []; 176 | } 177 | 178 | Base64DecodeEnumerator.prototype = 179 | { 180 | current: 64, 181 | 182 | moveNext: function() 183 | { 184 | if (this._buffer.length > 0) 185 | { 186 | this.current = this._buffer.shift(); 187 | return true; 188 | } 189 | else if (this._index >= (this._input.length - 1)) 190 | { 191 | this.current = 64; 192 | return false; 193 | } 194 | else 195 | { 196 | var enc1 = Base64.codex.indexOf(this._input.charAt(++this._index)); 197 | var enc2 = Base64.codex.indexOf(this._input.charAt(++this._index)); 198 | var enc3 = Base64.codex.indexOf(this._input.charAt(++this._index)); 199 | var enc4 = Base64.codex.indexOf(this._input.charAt(++this._index)); 200 | 201 | var chr1 = (enc1 << 2) | (enc2 >> 4); 202 | var chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 203 | var chr3 = ((enc3 & 3) << 6) | enc4; 204 | 205 | this.current = chr1; 206 | 207 | if (enc3 != 64) 208 | this._buffer.push(chr2); 209 | 210 | if (enc4 != 64) 211 | this._buffer.push(chr3); 212 | 213 | return true; 214 | } 215 | } 216 | }; 217 | -------------------------------------------------------------------------------- /scripts/jquery-3.5.1.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ 2 | !function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 li > a'); 22 | tab.click(function(e) { 23 | 24 | //Get Location of tab's content 25 | var contentLocation = $(this).attr('href'); 26 | 27 | //Let go if not a hashed one 28 | if(contentLocation.charAt(0)=="#") { 29 | 30 | e.preventDefault(); 31 | 32 | //Make Tab Active 33 | tab.removeClass('active'); 34 | $(this).addClass('active'); 35 | 36 | //Show Tab Content & add active class 37 | $(contentLocation).show().addClass('active').siblings().hide().removeClass('active'); 38 | 39 | } 40 | }); 41 | }); 42 | }); --------------------------------------------------------------------------------