*/
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 |
20 |
21 |
22 |
23 |
24 |
30 | |
31 |
32 |
33 |
41 |
55 |
68 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |

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 | "" +
633 | (stmt.stored !== null ? this.renderStoredDate(stmt.stored) : "") +
634 | " | ");
635 |
636 | stmtStr.push("");
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(" |
");
702 | allStmtStr.push(stmtStr.join(''));
703 | //this.log("-------------------------------" + stmt.id + "-------------------------------");
704 | }
705 | allStmtStr.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 | });
--------------------------------------------------------------------------------